diff --git a/Makefile b/Makefile index 34126eb9..98783557 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,7 @@ .PHONY: install -install: ## Install the poetry environment and install the pre-commit hooks +install: ## Install the poetry environment @echo "🚀 Creating virtual environment using pyenv and poetry" @poetry install - @poetry shell .PHONY: check check: ## Run code quality tools. @@ -20,7 +19,7 @@ test: generation ## Test the code with pytest @echo "🚀 Testing code: Running pytest" @poetry run pytest -generation: submission-generation participant-data track-data division-track-data results-generation ## Files generation for the website +generation: submission-generation participant-data track-data division-track-data results-generation charts-generation ## Files generation for the website .PHONY: build build: clean-build ## Build wheel file using poetry @@ -31,6 +30,12 @@ build: clean-build ## Build wheel file using poetry clean-build: ## clean build artifacts @rm -rf dist +.PHONY: clean-web-results +clean-web-results: ## clean web results + @rm -rf web/content/results + @rm -rf web/public/results + + .PHONY: help help: @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' @@ -76,8 +81,23 @@ results-generation: @poetry run smtcomp export-results-pages data Incremental # @echo "🚀 Generating results to web/content/results for Cloud" # @poetry run smtcomp export-results-pages data Cloud - # @echo "🚀 Generating results to web/content/results for Parallel" - # @poetry run smtcomp export-results-pages data Parallel + @echo "🚀 Generating results to web/content/results for Parallel" + @poetry run smtcomp export-results-pages data Parallel + +charts-generation: + @echo "🚀 Generating results to web/content/results for SingleQuery" + @poetry run smtcomp generate-website-graphics data SingleQuery + @echo "🚀 Generating results to web/content/results for ModelValidation" + @poetry run smtcomp generate-website-graphics data ModelValidation + @echo "🚀 Generating results to web/content/results for UnsatCore" + @poetry run smtcomp generate-website-graphics data UnsatCore + @echo "🚀 Generating results to web/content/results for Incremental" + @poetry run smtcomp generate-website-graphics data Incremental + # @echo "🚀 Generating results to web/content/results for Cloud" + # @poetry run smtcomp generate-website-graphics data Cloud + @echo "🚀 Generating results to web/content/results for Parallel" + @poetry run smtcomp generate-website-graphics data Parallel + cache: @echo "🚀 Generating cache" diff --git a/README.md b/README.md index 1c58e2ad..8aec0c28 100644 --- a/README.md +++ b/README.md @@ -257,7 +257,7 @@ The step from Single Query can be followed with the model validation results whe Tasks for unsat core validation can be generated by: ``` -smtcomp generate-unsatcore-validation-files ../tmp/execution SCRAMBLER_EXECUTABLE UNSAT_CORE_RESULT_DIR/*/* +smtcomp generate-unsatcore-validation-files ../tmp/execution SCRAMBLER_EXECUTABLE UNSAT_CORE_RESULT_DIR ``` --- diff --git a/data/2025/slides/future/1280px-Amazon_Web_Services_Logo.svg.png b/data/2025/slides/future/1280px-Amazon_Web_Services_Logo.svg.png new file mode 100644 index 00000000..aa9e753c Binary files /dev/null and b/data/2025/slides/future/1280px-Amazon_Web_Services_Logo.svg.png differ diff --git a/data/2025/slides/future/512px-OOjs_UI_icon_laptop-progressive.svg.png b/data/2025/slides/future/512px-OOjs_UI_icon_laptop-progressive.svg.png new file mode 100644 index 00000000..360c7203 Binary files /dev/null and b/data/2025/slides/future/512px-OOjs_UI_icon_laptop-progressive.svg.png differ diff --git a/data/2025/slides/future/Google-Cloud-Emblem.png b/data/2025/slides/future/Google-Cloud-Emblem.png new file mode 100644 index 00000000..84294711 Binary files /dev/null and b/data/2025/slides/future/Google-Cloud-Emblem.png differ diff --git a/data/2025/slides/future/Google__G__Logo.svg.png b/data/2025/slides/future/Google__G__Logo.svg.png new file mode 100644 index 00000000..aa2cc166 Binary files /dev/null and b/data/2025/slides/future/Google__G__Logo.svg.png differ diff --git a/data/2025/slides/future/Microsoft-Azure.png b/data/2025/slides/future/Microsoft-Azure.png new file mode 100644 index 00000000..c4cf8839 Binary files /dev/null and b/data/2025/slides/future/Microsoft-Azure.png differ diff --git a/data/2025/slides/future/You've_got_mail.png b/data/2025/slides/future/You've_got_mail.png new file mode 100644 index 00000000..062d8d4c Binary files /dev/null and b/data/2025/slides/future/You've_got_mail.png differ diff --git a/data/2025/slides/future/free-github-163-761603.png b/data/2025/slides/future/free-github-163-761603.png new file mode 100644 index 00000000..bf66cd79 Binary files /dev/null and b/data/2025/slides/future/free-github-163-761603.png differ diff --git a/data/2025/slides/future/iowa_university.png b/data/2025/slides/future/iowa_university.png new file mode 100644 index 00000000..e1153383 Binary files /dev/null and b/data/2025/slides/future/iowa_university.png differ diff --git a/data/2025/slides/future/prover.json b/data/2025/slides/future/prover.json new file mode 100644 index 00000000..48842ad7 --- /dev/null +++ b/data/2025/slides/future/prover.json @@ -0,0 +1,30 @@ +{ + "name": "bub4", + "authors": ["you"], + "logics": { + "sq": ["UF"], + "uc": "^QF_(LRA)?(UF)?$", + "mv": { + "theories": ["QF", "+-UF", "+-BV", "+-A"], + "except": ["QF_UFBVA"], + "logics": ["QF_LRA"] + } + }, + "versions": [ + { + "name": "10/05/24", + "url": "http://...", + "sha256": "123434ac", + "competing": true, + "cmd": { + "mv": ["bub4", "--model"] + } + }, + { + "name": "fixed", + "url": "http://...", + "sha256": "123434ac", + "competing": false + } + ] +} diff --git a/data/2025/slides/future/smtcomp_futur.tex b/data/2025/slides/future/smtcomp_futur.tex new file mode 100644 index 00000000..d16300cb --- /dev/null +++ b/data/2025/slides/future/smtcomp_futur.tex @@ -0,0 +1,341 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SMT-COMP 2023 - Futur of SMTCOMP without starexec +% +% 1 hour +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\documentclass[table]{beamer} +\usepackage[utf8]{inputenc} +\usepackage{xcolor} +\usepackage{tikz} +\usetikzlibrary{shapes,shapes.callouts,automata,trees} +\usetikzlibrary{decorations.pathmorphing,external,fit} +\usetikzlibrary{calc} +\usetikzlibrary{backgrounds} %used for the CEGAR figure +\usepackage{amssymb} +\usepackage{clrscode} +\usepackage{pifont} +\usepackage{pdfpages} +\usepackage{graphicx} +\usepackage{listings} +\geometry{papersize={16cm,9cm}} +%\tikzexternalize + +\colorlet{MYred}{red!70!black} +\definecolor{MYgreen}{rgb}{.1,.5,0} +\definecolor{MYblue}{rgb}{0,.42,.714} +\colorlet{MYgray}{white!95!MYblue} +\colorlet{MYorange}{orange!80!black} +\definecolor{gold}{rgb}{.8,.6,0} +\colorlet{silver}{white!55!black} +\colorlet{bronze}{brown!70!black} +\def\tick{\ding{52}} +\def\cross{\ding{54}} + +%%%%%%%%%%%%%%%%%%%% +%%% Beamer stuff %%% +%%%%%%%%%%%%%%%%%%%% +\usetheme{default} +\useinnertheme{rounded} +\setbeamertemplate{frametitle}[default][center] +\setbeamertemplate{footline}{\quad\hfill\footnotesize\insertframenumber\strut\kern1em\vskip2pt} +\setbeamertemplate{navigation symbols}{} +\setbeamertemplate{itemize/enumerate subbody begin}{\normalsize} +\usefonttheme[onlymath]{serif} % Nicer formulas +\setbeamercolor{block body}{bg=black!10} +\setbeamercolor{block title}{bg=black!20} + +\AtBeginSection[]{ + \begin{frame} + \vfill + \centering + \begin{beamercolorbox}[sep=8pt,center,shadow=true,rounded=true]{title} + \usebeamerfont{title}\insertsectionhead\par% + \end{beamercolorbox} + \vfill + \end{frame} +} + +\def\emph#1{\textcolor{MYblue}{#1}} + +%%% Titel, Autor und Datum des Vortrags: +\title{Discussion on Future of SMT-COMP} +\author{Martin Bromberger \and Jochen Hoenicke \and \emph{Fran\c{c}ois Bobot}} +\date{July 5, 2023} + +%% Institut +\institute{ +CEA List, France \and +MPI für Informatik, Germany \and +Certora, Israel +} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% MACROS + +% database symbol (from stackexchange) + +\makeatletter +\tikzset{ + database/.style={ + path picture={ + \draw (0, 1.5*\database@segmentheight) circle [x radius=\database@radius,y radius=\database@aspectratio*\database@radius]; + \draw (-\database@radius, 0.5*\database@segmentheight) arc [start angle=180,end angle=360,x radius=\database@radius, y radius=\database@aspectratio*\database@radius]; + \draw (-\database@radius,-0.5*\database@segmentheight) arc [start angle=180,end angle=360,x radius=\database@radius, y radius=\database@aspectratio*\database@radius]; + \draw (-\database@radius,1.5*\database@segmentheight) -- ++(0,-3*\database@segmentheight) arc [start angle=180,end angle=360,x radius=\database@radius, y radius=\database@aspectratio*\database@radius] -- ++(0,3*\database@segmentheight); + }, + minimum width=2*\database@radius + \pgflinewidth, + minimum height=3*\database@segmentheight + 2*\database@aspectratio*\database@radius + \pgflinewidth, + }, + database segment height/.store in=\database@segmentheight, + database radius/.store in=\database@radius, + database aspect ratio/.store in=\database@aspectratio, + database segment height=0.1cm, + database radius=0.25cm, + database aspect ratio=0.35, +} +\makeatother + +%%%%% json lstlisting %%%%%%%%% + +\definecolor{eclipseStrings}{RGB}{42,0.0,255} +\definecolor{eclipseKeywords}{RGB}{127,0,85} +\colorlet{numb}{magenta!60!black} + +\lstdefinelanguage{json}{ + basicstyle=\normalfont\ttfamily, + commentstyle=\color{eclipseStrings}, % style of comment + stringstyle=\color{eclipseKeywords}, % style of strings + % numbers=left, + numberstyle=\scriptsize, + stepnumber=1, + numbersep=8pt, + showstringspaces=false, + breaklines=true, + frame=lines, +% backgroundcolor=\color{gray}, %only if you like + string=[s]{"}{"}, + comment=[l]{:\ "}, + morecomment=[l]{:"}, + literate= + *{0}{{{\color{numb}0}}}{1} + {1}{{{\color{numb}1}}}{1} + {2}{{{\color{numb}2}}}{1} + {3}{{{\color{numb}3}}}{1} + {4}{{{\color{numb}4}}}{1} + {5}{{{\color{numb}5}}}{1} + {6}{{{\color{numb}6}}}{1} + {7}{{{\color{numb}7}}}{1} + {8}{{{\color{numb}8}}}{1} + {9}{{{\color{numb}9}}}{1} +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newcommand\vitem{\vfill\item} + +\begin{document} + +\begin{frame} + \titlepage +\end{frame} + +\newcommand{\mylogo}[1]{\includegraphics[height=1.5em]{#1}} + +\newbox{\logostarexec} +\savebox{\logostarexec}{\mylogo{starlogo.png}} + +\newcommand{\logolaptop}{\mylogo{512px-OOjs_UI_icon_laptop-progressive.svg.png}} + +\begin{frame} + \frametitle{Current infrastructure} + \pause + \begin{tabular}{cl} + \mylogo{iowa_university.png}\usebox{\logostarexec} & Benchmark uploaded to StarExec from Iowa Gitlab \\\pause + \mylogo{Google__G__Logo.svg.png} & Applications through Google form \\\pause + \usebox{\logostarexec} & Solvers are uploaded to StarExec \\\pause + \mylogo{You've_got_mail.png} & Modification of the applications handled by mail \\\pause + \logolaptop & Solvers downloaded, wrapped locally, uploaded to StarExec \\\pause + \logolaptop & Benchmark selection and job created locally \\\pause + \usebox{\logostarexec} & Jobs sent to StarExec and run \\\pause + \usebox{\logostarexec} & Download results from StarExec \\\pause + \logolaptop \usebox{\logostarexec} & Fix benchmark selection, add fixed + version of the solvers, run jobs on Starexec \\\pause + \logolaptop & Score the results, generate data for the website \\ + \end{tabular} +\end{frame} + +\newcommand{\onlystarexec}{\only<1>{\usebox{\logostarexec}}} +\newcommand{\onlylaptop}{\only<1-4>{\logolaptop}} +\newcommand{\logocloud}{\mylogo{1280px-Amazon_Web_Services_Logo.svg.png} +\mylogo{Google-Cloud-Emblem.png} +\mylogo{Microsoft-Azure.png}} +\newcommand{\onlycloudfirst}{\only<4->{\logocloud}} +\newcommand{\onlycloudsecond}{\only<5->{\logocloud}} +\newcommand{\logogithub}{\mylogo{free-github-163-761603.png}} +\newcommand{\logozenodo}{\mylogo{zenodo.png}} + +\frame<1>[label=summary]{ + \frametitle{Needed infrastructure} + \begin{itemize} + \item Store benchmark : \mylogo{iowa_university.png}\onlystarexec %iowa and starexec + \item Participants registration : \only<-4>{\mylogo{Google__G__Logo.svg.png}\mylogo{You've_got_mail.png}} + \only<5->{\logogithub} + %google and starexec + \item Select the benchmarks: \onlylaptop\onlycloudsecond + \item Run the jobs : \onlystarexec\onlycloudfirst%starexec + \item Store the datas : \onlystarexec\onlycloudfirst%starexec + \item Archive the datas : \onlystarexec\only<3->{\logozenodo}%starexec +% \item Store the raw results (sq csv 148Mo, 16Mo compressed) : \usebox{\logostarexec}%starexec +% \item Store the artifacts (mv Go proof Go) : \usebox{\logostarexec} %starexec + \item Run scoring script and generate website : \onlylaptop\onlycloudsecond\logogithub%localy and github + \end{itemize} +} + +\begin{frame} + \frametitle{StarExec} + Since 2013, StarExec has run 80 competitions and events across its 16 registered communities(SAT, TPTP, Termination,...). + StarExec is supported by a \$1.85 million USD grant (NSF) + +%Several people have contributed in various capacities to the StarExec project +%so far. +\vfill +Shepherded by Aaron Stump +\vfill +Involved in the development: {\small Eric Burns, Todd Elvers, +Albert Giegerich, Pat Hawks, Tyler Jensen, Wyatt Kaiser, Ben McCune, Muhammad +Nassar, CJ Palmer, Vivek Sardeshmukh, Skylar Stark, and Ruoyu Zhang.} +\vfill +Computer system support and assistance: {\small Hugh Brown, Dan Holstad, Jamie +Tisdale, and JJ Ulrich} + +%In addition to the members of the Advisory Board, the following people have +%provided useful feedback and input: Clark Barrett, Christoph Benzmüller, Armin +%Biere, David Cok, Morgan Deters, Jürgen Giesl, Alberto Griggio, Thomas +%Krennwallner, Jens Otten, Andrei Paskevich, Olivier Roussel, Martina Seidl, +%Stephan Schulz, Michael Tautschnig, Christoph Wintersteiger, and Harald Zankl. +\end{frame} + +\begin{frame} + \frametitle{StarExec: job pairs} +\begin{center} + \includegraphics[width=\textwidth,height=\textheight,keepaspectratio]{statistics_starexec.png} +\end{center} + +\end{frame} +\begin{frame} + \frametitle{StarExec is closing} + + \begin{center} + + \huge{Decommissioned starting August 2024} + \end{center} + +\end{frame} + +\againframe<2>{summary} + +\begin{frame} + \frametitle{Archive: Past results and Artifacts} + + \begin{itemize} + \item Solvers + \item Raw results + \item Solver output + \end{itemize} + \vfill + \pause + \logozenodo: EC funded research. Leveraging CERN developed tools for Big Data management and extended Digital Library capabilities for Open Data + \begin{itemize} + \item Open + \item Max 50 GB per dataset + \item DOI + \end{itemize} +\vfill + NB: StarExec should do the upload (because downloading from StarExec is very slow) + +\end{frame} + +\againframe<3>{summary} + + +% \begin{frame} +% \frametitle{Future competition} + +% \begin{itemize} +% \item CPU +% \item Intermediate Data-storage +% \item Permanent Data-storage (like past competition) +% \end{itemize} + +% \end{frame} + + + +\begin{frame} + \frametitle{Future competitions: Cloud? \logocloud} +\begin{columns} + \column{0.5\textwidth} + Slurm (open-source job scheduler): + \begin{itemize} + \item Available in cloud providers + \item Could be available in academic clusters + \item Allows to do the selection in the cloud + \end{itemize} + \column{0.5\textwidth} + Batch + \begin{itemize} + \item Each provider as its own API + \item Simpler + \item e.g. \url{https://github.com/Z3Prover/PerformanceTest} + \end{itemize} +\end{columns} + \pause + \vfill + \begin{center} + \large + Who already used cloud for benchmarking? + \end{center} +\end{frame} + + +\againframe<4>{summary} + +\begin{frame} + \frametitle{Participant registration} + Github Merge Request with \lstinline{bub4.json}: + + \lstinputlisting[language=json]{prover.json} +\end{frame} + +\againframe<5>{summary} + +\begin{frame} + \frametitle{Other simplifications} + \begin{itemize} + \item Currently 3 repositories $\implies$ 1 repository + \item Bash, sed, awk, python $\implies$ python + \item Tests? + \end{itemize} +\pause +\vfill + \begin{center} + {\large Is the secrecy of the result important to keep?} + \end{center} +\end{frame} + +\begin{frame} + \frametitle{Questions?} + + \begin{itemize} + \item Zenodo? For longterm archive + \item Reproducibility of the result? + \item Experience with cloud computing? + \item Need for sponsorship + \end{itemize} +\end{frame} + +\end{document} diff --git a/data/2025/slides/future/starlogo.png b/data/2025/slides/future/starlogo.png new file mode 100644 index 00000000..c88c5e15 Binary files /dev/null and b/data/2025/slides/future/starlogo.png differ diff --git a/data/2025/slides/future/statistics_starexec.png b/data/2025/slides/future/statistics_starexec.png new file mode 100644 index 00000000..c9732b12 Binary files /dev/null and b/data/2025/slides/future/statistics_starexec.png differ diff --git a/data/2025/slides/future/zenodo.png b/data/2025/slides/future/zenodo.png new file mode 100644 index 00000000..c3743606 Binary files /dev/null and b/data/2025/slides/future/zenodo.png differ diff --git a/data/2025/slides/presresults/input_for_certificates.tex b/data/2025/slides/presresults/input_for_certificates.tex new file mode 100644 index 00000000..e293670e --- /dev/null +++ b/data/2025/slides/presresults/input_for_certificates.tex @@ -0,0 +1,26 @@ +\MakeOnePage{Bitwuzla}{\withtrack{Biggest Lead}{\inc}}{\withtrack{Bitvec}{\sat,\fast}, \withtrack{Equality+MachineArith}{\inc}, \withtrack{FPArith}{\seq,\paral,\sat,\unsat,\fast,\inc,\uc}, \withtrack{QF\_ADT+BitVec}{\mv}, \withtrack{QF\_Bitvec}{\inc}, \withtrack{QF\_Equality+Bitvec}{\seq,\paral,\sat,\unsat,\fast,\inc,\mv}, \withtrack{QF\_FPArith}{\seq,\paral,\sat,\unsat,\fast,\inc,\mv}}{\withtrack{ABVFP}{\sat,\fast}, \withtrack{ABVFPLRA}{\fast}, \withtrack{AUFBV}{\seq,\paral,\sat,\unsat,\fast}, \withtrack{AUFBVFP}{\seq,\paral,\sat,\unsat,\fast}, \withtrack{QF\_ABVFP}{\uc}, \withtrack{QF\_ABVFPLRA}{\uc}, \withtrack{QF\_BVFP}{\uc}, \withtrack{QF\_BVFPLRA}{\uc}, \withtrack{UFBV}{\seq,\paral,\sat,\unsat,\fast}, \withtrack{UFBVFP}{\seq,\paral,\unsat}}{s}{s} +\newpage +\MakeOnePage{COLIBRI}{}{}{\withtrack{QF\_ABVFPLRA}{\seq,\paral,\unsat,\fast}, \withtrack{QF\_FP}{\unsat,\fast}, \withtrack{QF\_FPLRA}{\unsat,\fast}}{}{s} +\newpage +\MakeOnePage{cvc5}{\withtrack{Biggest Lead}{\seq,\paral,\sat,\unsat,\uc}, \withtrack{Largest Contribution}{\seq,\paral,\sat,\unsat,\fast,\inc,\uc}}{\withtrack{Arith}{\seq,\paral,\unsat,\inc,\uc}, \withtrack{Bitvec}{\seq,\paral,\unsat,\inc,\uc}, \withtrack{Equality}{\seq,\paral,\sat,\unsat,\inc,\uc,\cloud}, \withtrack{Equality+LinearArith}{\seq,\paral,\sat,\unsat,\fast,\inc,\uc,\cloud}, \withtrack{Equality+MachineArith}{\seq,\paral,\sat,\unsat,\fast,\uc}, \withtrack{Equality+NonLinearArith}{\seq,\paral,\sat,\unsat,\fast,\inc,\uc}, \withtrack{QF\_Datatypes}{\seq,\paral,\sat,\unsat,\uc\textsuperscript\seq}, \withtrack{QF\_Equality}{\inc}, \withtrack{QF\_Equality+Bitvec+Arith}{\inc}, \withtrack{QF\_Equality+NonLinearArith}{\seq,\paral,\unsat,\fast,\inc,\uc,\mv}, \withtrack{QF\_FPArith}{\uc}, \withtrack{QF\_LinearIntArith}{\unsat}, \withtrack{QF\_LinearRealArith}{\unsat}, \withtrack{QF\_NonLinearRealArith}{\unsat,\fast}, \withtrack{QF\_Strings}{\seq,\paral,\sat,\unsat}}{\withtrack{LIA}{\sat,\fast}, \withtrack{NIA}{\sat,\fast}, \withtrack{QF\_ALIA}{\inc}, \withtrack{QF\_AUFLIA}{\uc,\mv}, \withtrack{QF\_AX}{\mv}, \withtrack{QF\_BVFPLRA}{\inc}, \withtrack{QF\_FP}{\sat,\mv}, \withtrack{QF\_IDL}{\uc}, \withtrack{QF\_NIRA}{\seq,\paral,\unsat}, \withtrack{QF\_UFBVDT}{\seq,\paral,\sat,\unsat,\fast}, \withtrack{QF\_UFDTLIRA}{\seq,\paral,\sat,\unsat,\fast,\uc}, \withtrack{QF\_UFLRA}{\uc}, \withtrack{QF\_UFNIA}{\sat}, \withtrack{UFDT}{\fast}, \withtrack{UFNIA}{\cloud}}{s}{s} +\newpage +\MakeOnePage{iProver}{}{\withtrack{Equality}{\paralTrack}, \withtrack{Equality+LinearArith}{\paralTrack}}{\withtrack{ANIA}{\unsat}}{s}{} +\newpage +\MakeOnePage{OpenSMT}{}{\withtrack{QF\_Equality+LinearArith}{\unsat}, \withtrack{QF\_LinearRealArith}{\sat,\inc,\mv}}{\withtrack{QF\_LIA}{\seq,\paral}, \withtrack{QF\_LRA}{\seq,\paral,\unsat,\fast}, \withtrack{QF\_UFIDL}{\seq,\paral,\sat,\mv}}{s}{s} +\newpage +\MakeOnePage{OSTRICH}{}{}{\withtrack{QF\_S}{\seq,\paral,\unsat}}{}{} +\newpage +\MakeOnePage{SMTInterpol}{\withtrack{Biggest Lead}{\fast}}{\withtrack{QF\_ADT+LinArith}{\mv}, \withtrack{QF\_Datatypes}{\fast,\uc\textsuperscript\paral,\mv}, \withtrack{QF\_Equality+LinearArith}{\seq,\paral,\sat,\inc,\mv}, \withtrack{QF\_NonLinearIntArith}{\inc}}{\withtrack{ALIA}{\sat,\uc}, \withtrack{AUFDTLIA}{\uc}, \withtrack{QF\_ALIA}{\uc}, \withtrack{QF\_ANIA}{\seq,\paral,\sat,\unsat,\fast,\inc,\uc}, \withtrack{QF\_AUFNIA}{\seq,\paral,\sat,\unsat,\fast,\uc}, \withtrack{QF\_LIA}{\unsat}, \withtrack{QF\_UF}{\uc\textsuperscript\paral}, \withtrack{QF\_UFDT}{\uc\textsuperscript\seq}, \withtrack{QF\_UFDTLIA}{\unsat,\fast,\uc}, \withtrack{UFIDL}{\sat}, \withtrack{UFLIA}{\sat}}{s}{s} +\newpage +\MakeOnePage{STP}{}{\withtrack{QF\_Bitvec}{\seq,\paral,\sat,\unsat,\fast,\mv}}{}{}{} +\newpage +\MakeOnePage{Vampire}{\withtrack{Biggest Lead}{\cloud,\paralTrack}}{\withtrack{Arith}{\cloud,\paralTrack}, \withtrack{Equality}{\fast}, \withtrack{Equality+NonLinearArith}{\cloud,\paralTrack}}{\withtrack{ALIA}{\seq,\paral,\unsat,\fast}, \withtrack{AUFLIA}{\unsat,\fast,\cloud,\paralTrack}, \withtrack{AUFLIRA}{\fast}, \withtrack{AUFNIRA}{\paral,\unsat,\fast}, \withtrack{UF}{\seq,\paral,\sat}, \withtrack{UFDTLIA}{\fast,\uc}, \withtrack{UFDTNIA}{\seq,\paral,\unsat,\fast,\uc}, \withtrack{UFLIA}{\cloud,\paralTrack}}{s}{s} +\newpage +\MakeOnePage{Yices2}{}{\withtrack{QF\_Bitvec}{\uc}, \withtrack{QF\_Equality}{\seq,\paral,\sat,\unsat,\fast,\uc,\mv}, \withtrack{QF\_Equality+Bitvec}{\uc}, \withtrack{QF\_Equality+LinearArith}{\fast,\uc}, \withtrack{QF\_Equality+NonLinearArith}{\sat}, \withtrack{QF\_LinearIntArith}{\fast,\inc,\uc}, \withtrack{QF\_LinearRealArith}{\seq,\paral,\fast,\uc}}{\withtrack{QF\_ALIA}{\unsat}, \withtrack{QF\_AUFBV}{\fast}, \withtrack{QF\_AUFBVLIA}{\inc}, \withtrack{QF\_AUFLIA}{\seq,\paral,\sat,\unsat}, \withtrack{QF\_LIRA}{\seq,\paral,\sat,\unsat,\mv}, \withtrack{QF\_RDL}{\sat,\unsat,\mv}, \withtrack{QF\_UFBVLIA}{\inc}, \withtrack{QF\_UFLIA}{\unsat,\inc}, \withtrack{QF\_UFLRA}{\seq,\paral,\sat,\unsat,\inc,\mv}, \withtrack{QF\_UFNRA}{\seq,\paral,\unsat,\fast,\inc,\mv}}{s}{s} +\newpage +\MakeOnePage{YicesQS}{}{\withtrack{Arith}{\sat,\fast}}{\withtrack{LRA}{\seq,\paral,\unsat}, \withtrack{NRA}{\seq,\paral,\unsat}}{}{s} +\newpage +\MakeOnePage{Z3-Z3++}{\withtrack{Biggest Lead}{\mv}, \withtrack{Largest Contribution}{\mv}}{\withtrack{QF\_LinearIntArith}{\seq,\paral,\sat,\mv}, \withtrack{QF\_NonLinearIntArith}{\seq,\paral,\sat,\unsat,\fast,\mv}, \withtrack{QF\_NonLinearRealArith}{\seq,\paral,\sat,\mv}}{\withtrack{QF\_IDL}{\unsat}}{s}{} +\newpage +\MakeOnePage{z3-alpha}{}{\withtrack{QF\_Strings}{\fast}}{\withtrack{QF\_S}{\sat}, \withtrack{QF\_SNIA}{\seq,\paral,\sat}}{}{s} +\newpage diff --git a/data/2025/slides/presresults/plan.txt b/data/2025/slides/presresults/plan.txt new file mode 100644 index 00000000..88a05145 --- /dev/null +++ b/data/2025/slides/presresults/plan.txt @@ -0,0 +1,21 @@ +[x] slide1: change authors and affiliations +[ ] slide2: OK +[ ] slide3: 3 -> change numbers + delta to 2024 +[ ] slide4-5: OK +[ ] slide6: update; proof exhibition track; as last year comment: +does it apply? +[ ] slide7: update +[ ] slide8-10: update +[ ] -- solver presentations: unknown at this point +[x] slide 11: update +[x] slide 12 +[x] slide 13: OK? +[x] slide 14: add best overall metric +[ ] slide 15: OK +[ ] slide 16-28 change/import according to certificates +[ ] slide 29: update +[ ] slide 30: remove?   +[ ] slide 31: update +[x] slide 32: update +[x] slide 33: update name (rm Amazon)  +[x] slide 34: update   diff --git a/data/2025/slides/presresults/powered-by-aws.png b/data/2025/slides/presresults/powered-by-aws.png new file mode 100644 index 00000000..234fd60d Binary files /dev/null and b/data/2025/slides/presresults/powered-by-aws.png differ diff --git a/data/2025/slides/presresults/slides-Yices-2023.pdf b/data/2025/slides/presresults/slides-Yices-2023.pdf new file mode 100644 index 00000000..f2882fd7 Binary files /dev/null and b/data/2025/slides/presresults/slides-Yices-2023.pdf differ diff --git a/data/2025/slides/presresults/slides-YicesQS-2023.pdf b/data/2025/slides/presresults/slides-YicesQS-2023.pdf new file mode 100644 index 00000000..3598155d Binary files /dev/null and b/data/2025/slides/presresults/slides-YicesQS-2023.pdf differ diff --git a/data/2025/slides/presresults/slides-bitwuzla.pdf b/data/2025/slides/presresults/slides-bitwuzla.pdf new file mode 100644 index 00000000..714177fe Binary files /dev/null and b/data/2025/slides/presresults/slides-bitwuzla.pdf differ diff --git a/data/2025/slides/presresults/slides-colibri.pdf b/data/2025/slides/presresults/slides-colibri.pdf new file mode 100644 index 00000000..3cf9c0b9 Binary files /dev/null and b/data/2025/slides/presresults/slides-colibri.pdf differ diff --git a/data/2025/slides/presresults/slides-ismt-ppt.pdf b/data/2025/slides/presresults/slides-ismt-ppt.pdf new file mode 100644 index 00000000..e46d6763 Binary files /dev/null and b/data/2025/slides/presresults/slides-ismt-ppt.pdf differ diff --git a/data/2025/slides/presresults/slides-opensmt.pdf b/data/2025/slides/presresults/slides-opensmt.pdf new file mode 100644 index 00000000..d3d9ae8f Binary files /dev/null and b/data/2025/slides/presresults/slides-opensmt.pdf differ diff --git a/data/2025/slides/presresults/slides-smtinterpol.pdf b/data/2025/slides/presresults/slides-smtinterpol.pdf new file mode 100644 index 00000000..6a844050 Binary files /dev/null and b/data/2025/slides/presresults/slides-smtinterpol.pdf differ diff --git a/data/2025/slides/presresults/slides-smtrat.pdf b/data/2025/slides/presresults/slides-smtrat.pdf new file mode 100644 index 00000000..5b6f9778 Binary files /dev/null and b/data/2025/slides/presresults/slides-smtrat.pdf differ diff --git a/data/2025/slides/presresults/slides-vampire.pdf b/data/2025/slides/presresults/slides-vampire.pdf new file mode 100644 index 00000000..c93c3033 Binary files /dev/null and b/data/2025/slides/presresults/slides-vampire.pdf differ diff --git a/data/2025/slides/presresults/slides-yaga.pdf b/data/2025/slides/presresults/slides-yaga.pdf new file mode 100644 index 00000000..1c24dc5b Binary files /dev/null and b/data/2025/slides/presresults/slides-yaga.pdf differ diff --git a/data/2025/slides/presresults/slides.tex b/data/2025/slides/presresults/slides.tex new file mode 100644 index 00000000..e2a95144 --- /dev/null +++ b/data/2025/slides/presresults/slides.tex @@ -0,0 +1,1024 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SMT-COMP 2025 - +% +% 1 hour +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\documentclass[table]{beamer} +\usepackage[utf8]{inputenc} +\usepackage{xcolor} +\usepackage{tikz} +\usetikzlibrary{shapes,shapes.callouts,automata,trees} +\usetikzlibrary{decorations.pathmorphing,external,fit} +\usetikzlibrary{calc} +\usetikzlibrary{backgrounds} %used for the CEGAR figure +\usepackage{amssymb} +\usepackage{clrscode} +\usepackage{pifont} +\usepackage{pdfpages} +\usepackage{booktabs} +\geometry{papersize={16cm,9cm}} +%\tikzexternalize +\usepackage{multicol} +\usepackage{wasysym} + +\colorlet{MYred}{red!70!black} +\definecolor{MYgreen}{rgb}{.1,.5,0} +\definecolor{MYblue}{rgb}{0,.42,.714} +\colorlet{MYgray}{white!95!MYblue} +\colorlet{MYorange}{orange!80!black} +\definecolor{gold}{rgb}{.8,.6,0} +\colorlet{silver}{white!55!black} +\colorlet{bronze}{brown!70!black} +\def\tick{\ding{52}} +\def\cross{\ding{54}} + +%%%%%%%%%%%%%%%%%%%% +%%% Beamer stuff %%% +%%%%%%%%%%%%%%%%%%%% +\usetheme{default} +\useinnertheme{rounded} +\setbeamertemplate{frametitle}[default][center] +\setbeamertemplate{footline}{\quad\hfill\footnotesize\insertframenumber\strut\kern1em\vskip2pt} +\setbeamertemplate{navigation symbols}{} +\setbeamertemplate{itemize/enumerate subbody begin}{\normalsize} +\usefonttheme[onlymath]{serif} % Nicer formulas +\setbeamercolor{block body}{bg=black!10} +\setbeamercolor{block title}{bg=black!20} + +\AtBeginSection[]{ + \begin{frame} + \vfill + \centering + \begin{beamercolorbox}[sep=8pt,center,shadow=true,rounded=true]{title} + \usebeamerfont{title}\insertsectionhead\par% + \end{beamercolorbox} + \vfill + \end{frame} +} + +\def\emph#1{\textcolor{MYblue}{#1}} + +%%% Titel, Autor und Datum des Vortrags: +\title{SMT-COMP 2025\\ +20th International Satisfiability Modulo Theory Competition} +\author{Martin Jonáš \and \emph{Fran\c{c}ois Bobot} \and David Déharbe \and Dominik Winterer} +\date{August 11, 2025} + +%% Institut +\institute{ +Masaryk University, Czechia \and +CEA List, France \and +CLEARSY, France \and +ETH Zurich, Switzerland +} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% MACROS + +% database symbol (from stackexchange) + +\makeatletter +\tikzset{ + database/.style={ + path picture={ + \draw (0, 1.5*\database@segmentheight) circle [x radius=\database@radius,y radius=\database@aspectratio*\database@radius]; + \draw (-\database@radius, 0.5*\database@segmentheight) arc [start angle=180,end angle=360,x radius=\database@radius, y radius=\database@aspectratio*\database@radius]; + \draw (-\database@radius,-0.5*\database@segmentheight) arc [start angle=180,end angle=360,x radius=\database@radius, y radius=\database@aspectratio*\database@radius]; + \draw (-\database@radius,1.5*\database@segmentheight) -- ++(0,-3*\database@segmentheight) arc [start angle=180,end angle=360,x radius=\database@radius, y radius=\database@aspectratio*\database@radius] -- ++(0,3*\database@segmentheight); + }, + minimum width=2*\database@radius + \pgflinewidth, + minimum height=3*\database@segmentheight + 2*\database@aspectratio*\database@radius + \pgflinewidth, + }, + database segment height/.store in=\database@segmentheight, + database radius/.store in=\database@radius, + database aspect ratio/.store in=\database@aspectratio, + database segment height=0.1cm, + database radius=0.25cm, + database aspect ratio=0.35, +} +\makeatother + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newcommand\vitem{\vfill\item} + +\begin{document} + +\begin{frame} + \titlepage +\end{frame} + + +\begin{frame} + \frametitle{SMT-COMP} + + \begin{minipage}[b]{.5\textwidth} + Annual competition for \emph{SMT solvers}\\ + on (a selection of) benchmarks from \\ \emph{SMT-LIB} + \end{minipage}% + \begin{minipage}{.5\textwidth} + \begin{block}{History} + \begin{tabular}{rp{5cm}} + \textbf{2005} & first competition \\ + \textbf{2013} & evaluation instead of competition\\ + \textbf{2014} & hosted by \emph{StarExec} \\ + \textbf{2024} & hosted by \emph{LMU Munich} BenchCloud Cluster \\ + \end{tabular} + \end{block} + \end{minipage} + + \textbf{Goals} + \begin{itemize} + \item spur development of SMT solver implementations + \item promote SMT solvers and their usage + \item support the SMT-LIB project + \begin{itemize} + \item to promote and develop the SMT-LIB format (e.g., model validation) + \item to collect relevant benchmarks + \end{itemize} + \item engage and include new members + \end{itemize} + +\end{frame} + +\begin{frame} + \frametitle{SMT Solvers and SMT-LIB} + \textbf{SMT Solver} + \begin{itemize} + \item checks formulas + in \emph{SMT-LIB} format + for \emph{satisfiability modulo theories} + \end{itemize} + \bigskip + + \textbf{SMT-LIB} + \begin{enumerate} + \item a \emph{language} in which benchmarks are written + \item a community effort to \emph{collect benchmarks} + \end{enumerate} + \medskip + + \begin{columns} + \begin{column}{0.4\textwidth} + \begin{block}{Non-incremental} + 450\,474 instances \\ + with 1 query each \\ + in 90 logics + \end{block} + \end{column} + \begin{column}{0.4\textwidth} + \begin{block}{Incremental} + 44\,708 instances \\ + with 34\,163\,848 total queries \\ + in 42 logics + \end{block} + \end{column} + \begin{column}{0.08\textwidth} + \end{column} + \end{columns} + \pause + \begin{columns} + \begin{column}{0.4\textwidth} + \begin{block}{Selected Non-incremental} + 260\,089 instances (4 tracks) + \end{block} + \end{column} + \begin{column}{0.4\textwidth} + \begin{block}{Selected Incremental} + 22\,942 instances (1 track) + \end{block} + \end{column} + \begin{column}{0.08\textwidth} + \end{column} + \end{columns} + +\end{frame} + +\begin{frame} + \frametitle{Competition Overview} + + \begin{tikzpicture} + \node at (0,6) {SMT-LIB}; + \node at (3,6) {Tracks}; + \node[anchor=west] at (5,6) {Divisions}; + \node[anchor=west] at (9,6) {Logics}; + + \node[database,label=below:{\begin{tabular}{c}non-\\incremental\end{tabular}}] (nonincbench) at (0,2) {}; + \node[database,label=below:{incremental}] (incbench) at (0,0) {}; + + \node[draw,text width=1.8cm,align=center](sq) at (3,5) {single que.}; + \node[draw,text width=1.8cm,align=center](uc) at (3,4) {unsat core}; + \node[draw,text width=1.8cm,align=center](mv) at (3,3) {model val.}; + \node[draw,text width=1.8cm,align=center](par) at (3,2) {parallel}; + %\node[draw,text width=1.8cm,align=center](cloud) at (3,1) {cloud}; + \node[draw,text width=1.8cm,align=center](inc) at (3,0) {incremental}; + + \node[anchor=west] (div1) at (5,5) {Arith}; + \node[anchor=west] at (9,5) {\small LIA}; + \node[anchor=west] at (9,4.6) {\small LRA}; + \node[anchor=west] at (10,5) {\small NIA}; + \node[anchor=west] at (10,4.6) {\small NRA}; + \node[anchor=west] (div2) at (5,4) {Bitvec}; + \node[anchor=west] at (9,4) {\small BV}; + \node[anchor=west] (div3) at (5,3.4) {Equality}; + \node[anchor=west] at (9,3.4) {\small UF}; + \node[anchor=west] at (9,3) {\small UFDT}; + \node[anchor=west] (div4) at (5,2.4) {Equality+LinearArith}; + \node[anchor=west] at (9,2.4) {\small UFIDL}; + \node[anchor=west] at (9,2) {\small UFLIA}; + \node[anchor=west] at (9,1.6) {\small UFLRA}; + \node[anchor=west] at (10.5,2.4) {\small ALIA}; + \node[anchor=west] at (10.5,2) {\small AUFLIA}; + \node[anchor=west] at (10.5,1.6) {\small AUFLIRA}; + \node[anchor=west] at (12.5,2) {$\hdots$}; + \node[anchor=west] (div5) at (5,1) {Equality+MachineArith}; + \node[anchor=west] at (9,1) {\small ABV}; + \node[anchor=west] at (9,.6) {\small ABVFP}; + \node[anchor=west] at (9,.2) {\small AUFBV}; + \node[anchor=west] at (10.5,1) {\small AUFBVFP}; + \node[anchor=west] at (10.5,.6) {\small AUFBVDTLIA}; + \node[anchor=west] at (10.5,.2) {\small AUFBVDTNIA}; + \node[anchor=west] at (12.5,1) {$\hdots$}; + \node[anchor=west] (div6) at (5,-.2) {$\vdots$}; + + \draw[->,shorten <=.3em] (nonincbench) to[bend left=15] (sq.west); + \draw[->,shorten <=.3em] (nonincbench) to[bend left=7] (uc.west); + \draw[->,shorten <=.3em] (nonincbench) to[bend left=5] (mv.west); + \draw[->,shorten <=.3em] (nonincbench) to (par.west); + %\draw[->,shorten <=.3em] (nonincbench) to[bend right=4] (cloud.west); + \draw[->,shorten <=.3em] (incbench) to (inc.west); + + \draw (sq.east) to (div1.west); + \draw (sq.east) to (div2.west); + \draw (sq.east) to (div3.west); + \draw (sq.east) to (div4.west); + \draw (sq.east) to (div5.west); + \draw (sq.east) to (div6.west); + + \draw (uc.east) to (div1.west); + \draw (uc.east) to (div2.west); + \draw (uc.east) to (div3.west); + \draw (uc.east) to (div4.west); + \draw (uc.east) to (div5.west); + \draw (uc.east) to (div6.west); + + \draw (mv.east) to (div1.west); + \draw (mv.east) to (div2.west); + \draw (mv.east) to (div3.west); + \draw (mv.east) to (div4.west); + \draw (mv.east) to (div5.west); + \draw (mv.east) to (div6.west); + + %\draw (cloud.east) to (div1.west); + %\draw (cloud.east) to (div2.west); + %\draw (cloud.east) to (div3.west); + %\draw (cloud.east) to (div4.west); + %\draw (cloud.east) to (div5.west); + %\draw (cloud.east) to (div6.west); + + \draw (par.east) to (div1.west); + \draw (par.east) to (div2.west); + \draw (par.east) to (div3.west); + \draw (par.east) to (div4.west); + \draw (par.east) to (div5.west); + \draw (par.east) to (div6.west); + + \draw (inc.east) to (div1.west); + \draw (inc.east) to (div2.west); + \draw (inc.east) to (div3.west); + \draw (inc.east) to (div4.west); + \draw (inc.east) to (div5.west); + \draw (inc.east) to (div6.west); + \end{tikzpicture} + +\end{frame} + +\begin{frame}[fragile]{SMT-COMP Tracks} + \emph{Single Query (SQ) Track} + \begin{itemize} + \item determine satisfiability of one problem + \item solver answers \emph{sat/unsat/unknown} + \end{itemize} + \medskip + + \emph{Unsat Core Track} + \begin{itemize} + \item find small unsatisfiable subset of input + \item solver answers \emph{unsat + list of formulas} + \end{itemize} + \medskip + + \emph{Model Validation Track} + \begin{itemize} + \item find a model for a satisfiable problem + \item solver answers \emph{sat + value} for each toplevel symbol + \end{itemize} + \medskip + + \emph{Incremental Track} + \begin{itemize} + \item solve many small problems interactively + \item solver reads commands and answers \emph{sat/unsat} for each check + \end{itemize} + + \emph{Parallel Track} + \begin{itemize} + \item solve a complicated problem on a parallel machine (128 cores) + \item solver answers \emph{sat/unsat/unknown} + \end{itemize} +\end{frame} + +%\begin{frame}[fragile]{SMT-COMP Tracks} + +%% \emph{Model Validation} + %%\begin{itemize} + %%\item Division with quantifier-free floating-point logics + %%\item Model validation with Dolmen (thanks to Gillaume Bury and Fran\c{c}ois + %%Bobot) + %%\end{itemize} + %%\bigskip + +%% \emph{Cloud and Parallel Track} (sponsored by AWS, led by Mike Whalen) + %%\begin{itemize} + %%\item Solve a large problem over the cloud (or a big computer) + %%\begin{itemize} + %%\item 100 machines, 1600 cores, 6400 GB of memory (cloud) + %%\item 64 cores, 256 GB of memory (parallel) + %%\end{itemize} + %%\item Solver answers sat/unsat/unknown + %%\end{itemize} + + %%\pause\bigskip + + %\emph{Proof Exhibition Track} + %\begin{itemize} + %\item Solver submitted together with a checker for unsatisfiability proofs + %\item No predefined format or checker + %\item No ranking + %\item Qualitative assessment +%\end{itemize} + +%\medskip +%\pause + %\emph{As last year} the sat/unsat results from sound solvers in SQ were used to + %include benchmarks on the MV, UC and PE tracks. + +%\end{frame} + +\begin{frame}{Tracks, Solvers, Divisions, and Benchmarks} + Solvers: 26 (+6) %2022 20 + \bigskip + + \begin{center} + \begin{tabular}{lr@{}lr@{}rr} + \toprule + Track & \multicolumn{2}{c}{Solvers} & \multicolumn{2}{c}{Divisions} & Benchmarks \\ + \midrule + Single Query & 21&(+4) & &19 & 129\,361 \\ + Incremental & 7& & & 17 & 22\,942 \\ + Unsat Core & 7&(+1) && 19 & 70\,578 \\ + Model Validation & 6&(-2) & & 13 & 59\,750 \\ + Parallel & 6&(+3) & & 19 & 400 \\ + \bottomrule + \end{tabular} + \end{center} + \bigskip + + Number in parenthesis shows changes from 2024 +\end{frame} + +\begin{frame}{Infrastructure} + \textbf{Hardware} + \begin{itemize} + \item everything executed on LMU Munich machines (thanks to Dirk Beyer!) + \item cluster of 168 machines with Intel Xeon E3-1230 v5 @ 3.40 GHz CPU and 32 GiB of RAM (SQ, Incremental, UC, MV) + \item parallel machine with AMD EPYC 7713 processor -- \emph{128 virtual cores} -- and 1 TiB of RAM + \end{itemize} + + \bigskip + + \textbf{Software} + \begin{itemize} + \item everything (benchmark selection, job generation, result processing, $\ldots$) orchestrated by a Python tool \texttt{smtcomp} + \item Dolmen for model validation + \item SMT-COMP scrambler for benchmark scrambling + \item Benchexec+BenchCloud for benchmark definition and execution + \item solver submission via GitHub pull requests with JSON files + \end{itemize} +\end{frame} + +\begin{frame}{New in SMT-COMP 2025} + \begin{itemize} + \item best overall ranking + \item mandatory submission of a base solver for each derived solver + \item parallel track executed on LMU Munich machine + \item no cloud track + \item changes in resource limits + \item charts on website and comparison in results with base solver + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Participants} + + \textbf{Multiple reasoning frameworks} + \begin{itemize} + \item CDCL(T), Saturation, MCSAT, CP + \item automata + \item finite domain + \item local search + \item besides wrappers extending the scope of existing solvers + \end{itemize} + + \bigskip + \textbf{Seven new solvers} + \begin{itemize} +%\item iProver {\footnotesize (Korovin et al.)} +%\item SMT-RAT-MCSAT {\footnotesize (Jasper Nalbach et al.)} +%\item UltimateIntBlastingWrapper+SMTInterpol {\footnotesize (Max Barth et al.)} +%\item Yaga {\footnotesize (Hanák et al.)} +%\item Z3-alpha {\footnotesize (Lu et al.)} +%\item Z3-Noodler {\footnotesize (Havlena et al.)} +%\item Z3-Owl {\footnotesize (Ma et al.)} +\item Bitwuzla-MachBV {\footnotesize (Zhang et al.)} +\item UltimateEliminator+MathSAT {\footnotesize (Barth et al.)} +\item Z3-Inc-Z3++ {\footnotesize (Li et al.)} +\item Z3-Noodler-Mocha {\footnotesize (Cui et al.)} +\item Z3-Owl {\footnotesize (Zuo et al.)} +\item bv\_decide {\footnotesize (Böving et al.)} +\item z3siri {\footnotesize (Zhou et al.)} +\item colibri2 {\footnotesize (Bobot et al.)} +\end{itemize} + +\end{frame} + +\section{Solver Presentation} + +\newcommand{\myincludepdf}[1]{ +\begin{frame} + \vspace*{-1pt}% + \noindent\makebox[\textwidth]{% + \includegraphics[height=\paperheight]{#1}} +\end{frame} +} + +\newcommand{\myvideopdf}[2]{ +\begin{frame} + \frametitle{#1} + \begin{center} + video: \texttt{#2} + \end{center} +\end{frame} +} + +\myincludepdf{solver/Bitwuzla.pdf} +%\myincludepdf{slides-colibri.pdf} + +\begin{frame} + \frametitle{COLIBRI} + + \begin{itemize} + \item CP/SMT solver, propagation, no learning + \item QF\_FParith: propagation at the floating point or bitvector level (no bot-blsting) + \item 2025: More propagations for transcendental functions (Could we create a category for them?) + \end{itemize} + \vfill + \includegraphics[height=1cm]{logo_cea.png} +\end{frame} + + + +\begin{frame} + \frametitle{colibri2} + + \begin{itemize} + \item First year participation + \item CP/SMT solver, propagation, no learning + \item Uses Dolmen as parser, so parse all standardized SMT-LIB theories + \item For 2025: participation only in QF\_FParith, many propagators from COLIBRI but nearly no propagators for BV + \item For 2026: add BV propagators ;), participation in quantified theory? + \end{itemize} + \vfill + \includegraphics[height=1cm]{logo_cea.png} +\end{frame} + +\myincludepdf{solver/cvc5.pdf} + +\myincludepdf{solver/opensmt.pdf} + +\myincludepdf{solver/ostrich-smt-comp-2025.pdf} + +\myincludepdf{solver/smtinterpol.pdf} + +% \begin{frame} +% \textcolor{red}{TODO: Add solver slides received through the call} +% \end{frame} + +\begin{frame} + \frametitle{Other participants} + + \begin{center} + \begin{minipage}{0.49\textwidth} % Adjust 0.8 to control how wide the content is + \begin{itemize} + \item Amaya + \item Bitwuzla + \item Bitwuzla-MachBV + \item bv\_decide + \item bv\_decide-nokernel + \item COLIBRI + \item colibri2 + \item cvc5 + \item iProver v3.9.3 + \item OpenSMT + \item OpenSMT (min-ucore) + \item OSTRICH + \item SMT-RAT + \end{itemize} + \end{minipage} + \begin{minipage}{0.49\textwidth} % Adjust 0.8 to control how wide the content is + \begin{itemize} + \item SMTInterpol + \item SMTS + \item STP-Parti-Bitwuzla + \item UltimateEliminator+MathSAT + \item Yices2 + \item YicesQS + \item Z3-alpha + \item Z3-Inc-Z3++ + \item Z3-Noodler + \item Z3-Noodler-Mocha + \item Z3-Owl + \item Z3-Parti-Z3pp + \item z3siri + \end{itemize} + \end{minipage} + \end{center} + +\end{frame} + + + +\begin{frame} + \frametitle{Non-Competitive Solvers} + + Mandatory submission by solver authors + \begin{itemize} + \item base solver for each \emph{derived} solvers (Bitwuzla, Z3, Z3-Noodler) + \item new rule this year + \end{itemize} + + \bigskip + + Voluntary submission to show parallel speedup + \begin{itemize} + \item parallel track solvers with varied number of cores (e.g, 64, 32, 16, 8) + \end{itemize} + + \bigskip + +% Submitted by participants + %\begin{itemize} + %\item Fixed solvers (OSTRICH, Z3-Owl, Bitwuzla, Yices2, Z3-Noodler, iProver) + %\end{itemize} +\end{frame} + +\begin{frame}{Scoring} + \textbf{Computing scores} + \begin{itemize} + \item \emph{Single Query/Parallel}: number of solved \emph{instances} + \item \emph{Incremental}: number of solved \emph{queries} + \item \emph{Unsat Core}: number of top-level assertions \emph{removed} + \item \emph{Model Validation}: number of solved instances with correct \emph{models} + \end{itemize} + + \bigskip + + \textbf{Error scores} + \begin{itemize} + \item \emph{All Tracks}: given for sat reply for unsat instance, or vice versa + \item \emph{Unsat Core}: given if returned core is satisfiable. + \item \emph{Model Validation}: given if given model evaluates formula to \emph{false} + \end{itemize} + + \bigskip + Error scores are \textbf{draconian}. +\end{frame} + +\begin{frame}{Score and Ranking} + In each track we collect different scores: + \begin{itemize} + \item \emph{Sequential score} (SQ, UC, MV): all time limits apply to CPU time + \item \emph{Parallel score} (all): all time limits apply to wallclock time + \item \emph{SAT score} (SQ): parallel score for \emph{satisfiable} instances + \item \emph{UNSAT score} (SQ): parallel score for \emph{unsatisfiable} instances + \item \emph{24s} (SQ): parallel score with time limit of \emph{24s} + \end{itemize} + \bigskip + + Division ranking (for each score) + \begin{itemize} + \item For each division, one winner is declared + \end{itemize} + + \bigskip + + Competition-wide rankings (for each score) + \begin{itemize} + \item \emph{Best overall ranking}: select solver that is most universal + \item \emph{Largest contribution}: improvement each solver provided to a virtual best solver + \item \emph{Biggest lead}: division winner with most score difference to second place + \end{itemize} + +\end{frame} + +\newcommand{\seq}{\texttt{;}} +\newcommand{\paral}{\textbardbl} +\newcommand{\sat}{$\top$} +\newcommand{\unsat}{$\bot$} +\newcommand{\fast}{\texttt{24}} +\newcommand{\inc}{inc} +\newcommand{\uc}{uc} +\newcommand{\mv}{mv} +\newcommand{\cloud}{cloud} +\newcommand{\paralTrack}{parallel} + +\begin{frame} + \frametitle{Results} + + \begin{center} + \begin{tabular}{|cl|cl|} + \hline + \sat & satisfiable & \unsat & unsatisfiable \\ + \seq & sequential & \paral & parallel \\ + \fast & less than 24s & \inc & incremental \\ + \uc & unsat core & \mv & model validation \\ + \hline +\end{tabular} +\end{center} +%\vfill +%Experimental track are added in the slides but are not present +%in the certificates +\end{frame} + +{ + %\newcommand{\all}{{\footnotesize (\seq,\paral,\sat,\unsat,\fast,\inc,\uc\seq,\uc\paral,\mv)}} + \newcommand{\withtrack}[2]{\textsc{#1}{{\footnotesize (#2)}}} + +\def\newpage{} + +\newcommand{\MakeOnePage}[6]{ + \begin{frame} + \frametitle{#1} + + \medskip + \ifstrempty{#2}{}{ + \textcolor{red!30!black!90} + {\textit{Overall Winner}} + + + \textcolor{black}{\large #2} + + \medskip + } + + \ifstrempty{#3}{}{ + \textcolor{red!30!black!90} {\textit{Winner of the Division#5}} + + \textcolor{black}{\large#3} + + \medskip + } + + \ifstrempty{#4}{}{ + \textcolor{red!30!black!90} {\textit{Winner of the Logic#6 + \ifstrempty{#3}{}{(where it did not win the corresponding division)}}} + + \textcolor{black}{\large #4} + } + \vspace{2mm} + \end{frame} +} + + +\input{../../../latex-certificates/input_for_certificates.tex} + +} + +% \begin{frame}{Division Winners} +% \pause +% \emph{Single Query, sequential score} +% \begin{itemize} +% \item \emph{Bitwuzla}: {\small FPArith, QF\_Bitvec, QF\_Equality+Bitvec, QF\_FPArith} + +% \item \emph{cvc5}: \begin{minipage}{.8\textwidth}\raggedright \tiny Arith, +% Bitvec, Equality, Equality+LinearArith, Equality+MachineArith, +% Equality+NonLinearArith, QF\_Datatypes, QF\_Equality+NonLinearArith, QF\_NonLinearIntArith, QF\_NonLinearRealArith, QF\_Strings\end{minipage} + +% \item \emph{OpenSMT}: {\small QF\_LinearIntArith} + +% \item \emph{SMTInterpol}: {\small QF\_Equality+LinearArith} + +% \item \emph{Yices2}: {\small QF\_Equality, QF\_LinearRealArith} +% \end{itemize} + +% \medskip + +% \pause +% \emph{Unsat Core} +% \begin{itemize} +% \item \emph{cvc5}: Arith, Bitvec, Equality+LinearArith, Equality+MachineArith,Equality+NonLinearArith,Equality(Seq), QF\_Datatypes +% \item \emph{Vampire}: Equality(Par) +% \item \emph{Bitwuzla}: QF\_EqualityBitvec, QF\_FPArith +% \item \emph{Yices2}: QF\_Bitvec, QF\_Equality+LinearArith, QF\_Equality, QF\_LinearIntArith, QF\_LinearRealArith +% \item \emph{SMTInterpol}: QF\_Equality+NonLinearArith +% \item \emph{UltimateEliminator+MathSAT}: FPArith + +% \end{itemize} + +% \end{frame} + +% \begin{frame}{Division Winners} +% \emph{Incremental} +% \begin{itemize} +% \item \emph{cvc5}: Arith, Bitvec, Equality+LinearArith,EqualityNonLinearArith,Equality +% \item \emph{UltimateEliminator+MathSAT}: Equality+MachineArith +% \item \emph{Bitwuzla}: FPArith, QF\_FPArith +% \item \emph{Yices2}: QF\_Bitvec, QF\_Equality+Bitvec, QF\_Equality, QF\_LinearIntArith +% \item \emph{SMTInterpol}: QF\_Equality+LinearArith, QF\_Equality+NonLinearArith, QF\_NonLinearIntArith +% \item \emph{OpenSMT}: QF\_LinearRealArith +% \end{itemize} +% \medskip + +% \pause +% \emph{Model Validation (competitive only)} +% \begin{itemize} +% \item \emph{Bitwuzla}: QF\_Bitvec, QF\_Equality+Bitvec, +% \item \emph{smtinterpol}: QF\_Equality+LinearArith +% \item \emph{Yices2}: QF\_Equality +% \item \emph{Z3++}: QF\_LinearIntArith +% \item \emph{OpenSMT}: QF\_LinearRealArith + +% \item experimental: QF\_FPArith : Bitwuzla, cvc5 + +% \end{itemize} +% \end{frame} + +% \begin{frame}{Largest contribution} +% \begin{tabular}{r|c@{}lc@{}lc@{}l} +% &\textcolor{gold}{\textbf{1st Place}} && +% \textcolor{silver}{\textbf{2nd Place}} && +% \textcolor{bronze}{\textbf{3rd Place}}\\ +% \hline +% \emph{Single Query}\\ +% seq & cvc5&{\tiny(Eq+MA)} & YicesQS&{\tiny(Arith)} & Bitwuzla&{\tiny(FPArith)} \\ +% par & cvc5&{\tiny(Eq+MA)} & YicesQS&{\tiny(Arith)} & Bitwuzla&{\tiny(FPArith)} \\ +% sat & cvc5&{\tiny(Eq+LA)} & YicesQS&{\tiny(Arith)} & Bitwuzla&{\tiny(FPArith)} \\ +% unsat & cvc5&{\tiny(Eq+MA)} & Z3++&{\tiny(QF\_NonLIA)} & OSTRICH&{\tiny(QF\_Strings)}\\ +% 24 & Vampire&{\tiny(Eq+NA)} & Vampire&{\tiny(Equality)} & Yices2&{\tiny(QF\_LinIA)}\\[3pt] +% \pause +% \emph{Incremental}\\ +% par & cvc5&{\tiny(Eq+NA)} &Yices2&{\tiny(QF\_Eq+LA)} +% &SMTInterpol&{\tiny(QF\_Eq+NA)}\\[3pt] +% \pause + +% \emph{Unsat Core}\\ +% seq & cvc5&{\tiny(Eq+LA)} & +% Bitwuzla&{\tiny(QF\_Eq+Bitvec)}\\ + +% par & cvc5&{\tiny(Eq+NA)}& +% Bitwuzla&{\tiny(QF\_Eq+Bitvec)}\\ +% \\[3pt] +% \pause +% \emph{Model Validation}\\ +% seq & Z3++&{\tiny(QF\_LinIA)} & Bitwuzla&{\tiny(QF\_Bitvec)} +% & smtinterpol&{\tiny(QF\_Eq+LIA)}\\ +% par & Z3++&{\tiny(QF\_LinIA)} & Bitwuzla&{\tiny(QF\_Bitvec)} +% & smtinterpol&{\tiny(QF\_Eq+LIA)}\\ +% \end{tabular} +% \end{frame} + + +% \begin{frame}{Biggest Lead} +% \begin{tabular}{r|c@{}lc@{}lc@{}l} +% &\textcolor{gold}{\textbf{1st Place}} && +% \textcolor{silver}{\textbf{2nd Place}} && +% \textcolor{bronze}{\textbf{3rd Place}}\\ +% \hline +% \emph{Single Query}\\ +% seq & cvc5&{\tiny(QF\_DT)} & Bitwuzla&{\tiny(FPArith)} & Yices2&{\tiny(QF\_LinRA)} \\ +% par & cvc5&{\tiny(QF\_DT)} & Bitwuzla&{\tiny(FPArith)} & Yices2&{\tiny(QF\_LinRA)} \\ +% sat & cvc5&{\tiny(QF\_DT)} & Bitwuzla&{\tiny(FPArith)} & Z3++&{\tiny(QF\_NonRA)} \\ +% unsat & cvc5&{\tiny(QF\_DT)} & Z3++&{\tiny(QF\_NonIA)} & Bitwuzla&{\tiny(FPArith)} \\ +% 24 & cvc5&{\tiny(Eq+MA)} & smtinterpol&{\tiny(QF\_DT)} & Vampire&{\tiny(Equality)}\\[3pt] +% \pause +% \emph{Incremental}\\ +% par & SMTInterpol&{\tiny(QF\_NIA)} +% &Yices2&{\tiny(QF\_LinIA)} & cvc5&{\tiny(Eq+NonLA)} \\[3pt] +% \pause +% \emph{Unsat Core}\\ +% seq & cvc5&{\tiny(Eq+MA)} & Yices2&{\tiny(QF\_Eq+LA)} & smtinterpol&{\tiny(QF\_Eq+NA)} \\ +% par & cvc5&{\tiny(Eq+MA)} & Yices2&{\tiny(QF\_Eq+LA)} & smtinterpol&{\tiny(QF\_Eq+NA)} \\ +% \pause +% \emph{Model Validation}\\ +% seq & Z3++&{\tiny(QF\_LinIA)} & smtinterpol&{\tiny(QF\_LinA)} & OpenSMT&{\tiny(QF\_LinRA)} \\ +% par & Z3++&{\tiny(QF\_LinIA)} & smtinterpol&{\tiny(QF\_LinA)} & OpenSMT&{\tiny(QF\_LinRA)} \\ +% \end{tabular} +% \end{frame} + +\begin{frame}{Checking Disagreements} + + \begin{itemize} + \item 50\,978 of selected 129\,361 single query benchmarks have no known status + + \vitem 59 benchmarks with disagreements (% + NIA, + QF\_ABVFP, + QF\_S, + UFDTLIRA) + + \vitem We had 7 solvers with soundness issues: + \begin{columns} + \column{0.42\textwidth} + \begin{itemize} + \item Amaya + \item SMTInterpol + \item COLIBRI + \item UltimateEliminator+MathSAT (invalid unsat cores) + \end{itemize} + \column{0.40\textwidth} + \begin{itemize} + \item OpenSMT (invalid unsat cores) + \item OpenSMT (min-ucore) \\ (invalid unsat cores) + \item Yices2 (unsatisfiable models) + \end{itemize} +\end{columns} + + \end{itemize} + \end{frame} + +%\begin{frame}[fragile] + %\frametitle{Plans for SMT-COMP 2026} + %\begin{itemize} + %\item "Revelations are found in clouds” --- Serge King + %\item MV: Algebraic number $\implies$ non experimental +%\begin{verbatim} +%(root-of-with-ordering (coeffs p_0 p_1 ... p_n) i) + +%(root-of-with-interval (coeffs p_0 p_1 ... p_n) min max) +%(root-of-with-enclosure (coeffs p_0 p_1 ... p_n) min max) +%\end{verbatim} + %Thanks for the solvers that implemented one of them! + %\item MV: partial function more discussion needed + %\item MV: array theory more discussion needed + %\end{itemize} +%\end{frame} + +\begin{frame}{Plans for SMT-COMP 2026?} + \textbf{Resource requirements} + \begin{itemize} + \item This year: around 1 million of solver-benchmark pairs + \item Number of benchmarks and solvers steadily growing + \item How to make this sustainable? + \item Modify benchmark selection rules? + \item Reduce RAM to allow more parallel runs? + \end{itemize} + + \bigskip + \textbf{Derived Solvers} + \begin{itemize} + \item Should we allow derived solvers? + \item Should they compete in the same divisions? + \end{itemize} + + \bigskip + + \textbf{Instability track} + \begin{itemize} + \item Previous presentation \smiley + \end{itemize} +\end{frame} + +%http://localhost:1313/2025/results/qf_fparith-single-query-chart/ +%http://localhost:1313/2025/results/lia-single-query-chart/ +%http://localhost:1313/2025/results/qf_bitvec-single-query/ +%http://localhost:1313/2025/results/qf_strings-single-query/ + + +\begin{frame}{Derived Solver: like any solver?} + + Derived Tool: A derived tool is defined as any solver that is based on and \textbf{extends another SMT +solver} (the base solver) \textbf{from a different group of authors}. In contrast to a wrapper tool, a derived +tool solving a benchmark of \textbf{logic A} is allowed to call an SMT solver to solve a problem for \textbf{logic +A}. +\end{frame} + +\begin{frame} +\frametitle{Derived Solver: like any solver?} +\begin{itemize} + \item Some derived solver are very different from the base solver + \item Some derived solver had only a small increment +\end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Derived Solver: like any solver?} + \begin{itemize}[<+->] + \item The comparison with the base solver should help see the improvement + \item "Best Family of solver"? Give credit to the base solver + \item Different podium? but we have derived of derived solver + \item What means different enough? + \end{itemize} +\end{frame} + +%\begin{frame}{SMT-COMP organizing committee} + %Three people organize the SMT-COMP. In 2026: + %\begin{itemize} + %\item Martin Jonáš + %\item David Déharbe + %\item Fran\c{c}ois Bobot + %\item Dominik Winterer + %\item AWS contact + %\end{itemize} + %%Fran\c{c}ois has been organizer for four-years! He can rest happy. + %\bigskip + %%We need a successor for next year's competition. + %%Contact us if you would like to volunteer! +%\end{frame} + + +\begin{frame}{Acknowledgements} + \begin{itemize} + %\item \emph{Andrea Micheli}: pysmt + %\item \emph{Guillaume Bury, FB.}: Model Validator + \item \emph{Clark Barrett, Pascal Fontaine, Aina Niemetz, Mathias Preiner, Hans-Jörg Schurr}: SMT-LIB benchmarks + %\item \emph{Aaron Stump}: StarExec support + %\item \emph{Mike Whalen and team}: Cloud/Parallel Track + \item \emph{Dirk Beyer, Philipp Wendler, and team}: BenchCloud instance at LMU + \end{itemize} + \bigskip + + \begin{columns} + \begin{column}{.3\textwidth} + \includegraphics[width=0.8\textwidth]{sosylogo.png} + \end{column} +% \begin{column}{.17\textwidth} + %\includegraphics[width=\textwidth]{powered-by-aws} + %\end{column} + \end{columns} +\end{frame} + +\begin{frame}[shrink=0.95]{Benchmark contributors} + In 2025 \emph{new benchmarks} were contributed by: + + \small + \begin{itemize} +% \item Alex Coffin + %\item Alex Ozdemir + %\item Ali Uncu, James Davenport and Matthew England + %\item Bohan Li + %\item Elizabeth Polgreen + %\item Fuqi Jia + %\item Johann-Tobias Aaron and Raphael Schäg + %\item Matthew England and Miguel Del Rio Almajano + %\item Nicolas Amat + %\item Yannick Moy + %\item Yoni Zohar + \item Johannes Bauer + \item Shaoke Cui + \item Michal Hečko + \item Hongjian Jiang + \item Bohan Li + \item Oliver Markgraf + \item Hernan Ponce de Leon + \item Hans-Jörg Schurr + \item Amar Shah + \item Yoni Zohar + \end{itemize} +\end{frame} + +\begin{frame} + + \begin{center} + \Large\emph{Thanks} + \end{center} + + \begin{center} + to all participants + \end{center} + + \bigskip + \pause + + + \begin{center} + and to you for listening + \end{center} + +\end{frame} + +\end{document} diff --git a/data/2025/slides/presresults/sosylogo.png b/data/2025/slides/presresults/sosylogo.png new file mode 100644 index 00000000..380b042a Binary files /dev/null and b/data/2025/slides/presresults/sosylogo.png differ diff --git a/data/2025/slides/presresults/starlogo.png b/data/2025/slides/presresults/starlogo.png new file mode 100644 index 00000000..b62b3575 Binary files /dev/null and b/data/2025/slides/presresults/starlogo.png differ diff --git a/data/benchmarks-2025.json.gz b/data/benchmarks-2025.json.gz new file mode 100644 index 00000000..186cb57c Binary files /dev/null and b/data/benchmarks-2025.json.gz differ diff --git a/data/latex-certificates/background_upscaled.png b/data/latex-certificates/background_upscaled.png new file mode 100644 index 00000000..dbce497c Binary files /dev/null and b/data/latex-certificates/background_upscaled.png differ diff --git a/data/latex-certificates/gen_certificates_ornament.tex b/data/latex-certificates/gen_certificates_ornament.tex index 28800078..f57c8852 100644 --- a/data/latex-certificates/gen_certificates_ornament.tex +++ b/data/latex-certificates/gen_certificates_ornament.tex @@ -28,61 +28,6 @@ fill=orange,fill opacity=.5,thick}}% \pgfornament[scale=0.50]{32}} -\newbox{\myfancyhead} -\AtBeginDocument{ -\savebox{\myfancyhead}{ -\newpgfornamentfamily{pgfhan} -\begin{tikzpicture}[overlay,remember picture] - \tikzset{every node/.append style={inner sep=0pt,color=MidnightBlue!50}} - \tikzset{pgfornamentstyle/.style={draw=green!20!black, - fill=orange,fill opacity=.5,thick}}% - \node[anchor=north west,shift={(14.5pt,-14.5pt)}] at (current page.north west) - (nw) {\pgfornament[scale=0.5]{12}}; - \node[anchor=north east,shift={(-14.5pt,-14.5pt)}] at (current page.north east) - (ne) {\pgfornament[scale=0.5,symmetry=v]{12}}; - \node[anchor=south west,shift={(14.5pt,14.5pt)}] at (current page.south west) - (sw) {\pgfornament[scale=0.5,symmetry=h]{12}}; - \node[anchor=south east,shift={(-14.5pt,14.5pt)}] at (current page.south east) - (se) {\pgfornament[scale=0.5,symmetry=c]{12}}; -% \pgfornamentline[scale=0.25,shift={(0pt,-14.5pt)}]{nw.north west}{ne}{20}{32}; -% \begin{scope}[start chain,node distance=-1pt] -% \node[anchor=north west,on chain] at (nw.north east) -% {\usebox{\fortyseven}}; -% \foreach \i in {1,...,9} {\node[on chain]{\usebox{\fortyseven}};} -% \end{scope} -\foreach \i in {0,...,6} - \node[anchor=north west,shift={($\i*(100bp,0)-(50bp,0)$)}] at (nw.north east) - {\usebox{\fortyseven}}; -\foreach \i in {0,...,3} - \node[anchor=south east,shift={($\i*(0,-100bp)+(0,25bp)$)},rotate=90] at (ne.south east) - {\usebox{\fortyseven}}; -\foreach \i in {0,...,6} - \node[anchor=south west,shift={($\i*(100bp,0)-(50bp,0)$)}] at (sw.south east) - {\usebox{\fortyseven}}; -\foreach \i in {0,...,3} - \node[anchor=south west,shift={($\i*(0,-100bp)+(0,25bp)$)},rotate=-90] at (nw.south west) - {\usebox{\fortyseven}}; - % \foreach \i in {0,...,22} -% \node[anchor=south west,rotate=-90, -% shift={($\i*(31bp,0)$)}] at (nw.south west) -% {\usebox{\fortyseven}}; - % \node[anchor=north west] at (nw.north east) {\pgfornament[scale=0.25]{32}}; -% \draw [scale=0.25] (nw) to [ornament=12] (ne); -% \node[anchor=north west] at (nw.north east)% -% {\pgfornament[scale=0.25]{32}}; -% \node[anchor=south west] at (sw.south east)% -% {\pgfornament[scale=0.25]{32}}; -% \node[anchor=south west,rotate=-90] at (nw.south west) -% {\pgfornament[scale=0.25]{32}}; -% \node[anchor=south east,rotate=90] at (ne.south east) -% {\pgfornament[scale=0.25]{32}}; -% \node[anchor=center,shift={(25bp,-25bp)}] at (nw.south east) -% {\pgfornament[scale=0.5]{57}}; -\end{tikzpicture} -}} - - -\fancyhead[L]{\usebox{\myfancyhead}} % \node[anchor=north west,shift={(14.5pt,-14.5pt)}] at (current page.north west) % (nw) {\pgfornamenthan[scale=0.2]{25}}; @@ -96,19 +41,11 @@ \newpgfornamentfamily{vectorian} \begin{tikzpicture}[color=Maroon, every node/.style={inner sep=0pt}] - \node[minimum size=12cm](vecbox){% + \node[minimum size=11cm](vecbox){% \begin{minipage}{\textwidth} \centering \BODY \end{minipage}}; - \node[anchor=north west] at (vecbox.north west) - {\pgfornament[width=2.5cm,symmetry=h]{3}}; - \node[anchor=north east] at (vecbox.north east) - {\pgfornament[width=2.5cm,symmetry=c]{3}}; - \node[anchor=south west] at (vecbox.south west) - {\pgfornament[width=2.5cm,symmetry=none]{3}}; - \node[anchor=south east] at (vecbox.south east) - {\pgfornament[width=2.5cm,symmetry=v]{3}}; \end{tikzpicture} } @@ -126,27 +63,27 @@ \newcommand{\withtrack}[2]{\textsc{#1}{{\footnotesize (#2)}}} \newcommand{\MakeOnePage}[6]{ + \tikz[remember picture,overlay] \node[opacity=0.3,inner sep=0pt] at (current page.center){\includegraphics[width=\paperwidth,height=\paperheight]{background_upscaled.png}}; {\centering { \begin{minipage}{\textwidth} \centering + \vspace{1cm} \begin{tikzpicture} - \node [circular drop shadow={shadow scale=1.05}, - decorate, decoration=zigzag, - fill=blue!20,draw,thick,circle,text width=3.5cm,align=center,xshift=2cm] - {\large\textbf{SMT-COMP\\ 2024}}; + \node [align=center] + {\resizebox{10cm}{!}{\Huge\textsc{SMT-COMP 2025}}}; \end{tikzpicture} \end{minipage} + \vspace{1.55cm} \begin{myframe} \textcolor{red!10!black!90} - {\Huge #1}\\ + {\Huge \textsc{#1}}\\ - \textcolor{green!10!black!90}{ - \large In honor of the results achieved in the SMT-competition} + \vspace{1.55cm} \medskip \ifstrempty{#2}{}{ @@ -156,7 +93,7 @@ \textcolor{black}{\large #2} - \medskip + \bigskip } \ifstrempty{#3}{}{ @@ -164,7 +101,7 @@ \textcolor{black}{\large#3} - \medskip + \bigskip } \ifstrempty{#4}{}{ @@ -176,21 +113,23 @@ \vspace{2mm} - \vspace{1cm} + \vspace{1.5cm} {\color{blue!40!black} % \scalebox{.7}{ {\tiny - \begin{tabular}{ccccc} + \begin{tabular}{ccccccc} \includegraphics[scale=0.25,trim=1.5cm 2.75cm 0pt 0pt]{FB-signature.png} && - \includegraphics[trim=0pt 0.20cm 0pt 0pt]{MB-Signature.png} && - \includegraphics[scale=0.4,trim=1.5pt 2.75cm 0pt 0pt]{MJ-Signature.png} \\ + \includegraphics[scale=0.06,trim=0pt 0.20cm 0pt 0pt]{DD-Signature.png} && + \includegraphics[scale=0.4,trim=1.5pt 2.75cm 0pt 0pt]{MJ-Signature.png} && + \includegraphics[scale=0.4,trim=0pt 23pt 0pt 0pt]{DW-Signature.png}\\ \cline{1-1} \cline{3-3} \cline{5-5} + \cline{7-7} \\ \ - François Bobot & & Martin Bromberger & & Martin Jon\'{a}\v{s} \\ - Organizer & & Chair & & Organizer \\ + François Bobot & & David Déharbe & & Martin Jon\'{a}\v{s} & & Dominik Winterer \\ + Organizer & & Organizer & & Chair & & Organizer \\ \end{tabular} }} \end{myframe} @@ -200,8 +139,6 @@ \begin{document} -\TileWallPaper{4cm}{2cm}{tiling.png} - \input{input_for_certificates.tex} \end{document} diff --git a/data/latex-certificates/input_for_certificates.tex b/data/latex-certificates/input_for_certificates.tex index f6673630..8c958d5c 100644 --- a/data/latex-certificates/input_for_certificates.tex +++ b/data/latex-certificates/input_for_certificates.tex @@ -1,28 +1,32 @@ -\MakeOnePage{Algaroba}{}{\withtrack{QF\_Datatypes}{\seq,\paral,\fast}}{\withtrack{QF\_DT}{\sat}}{}{} +\MakeOnePage{Bitwuzla}{\withtrack{Biggest Lead}{\inc}}{\withtrack{Bitvec}{\sat}, \withtrack{Equality\_MachineArith}{\inc}, \withtrack{FPArith}{\seq,\paral,\sat,\unsat,\fast,\inc,\uc}, \withtrack{QF\_ADT\_BitVec}{\mv}, \withtrack{QF\_Bitvec}{\sat,\uc,\mv}, \withtrack{QF\_Equality\_Bitvec}{\seq,\paral,\sat,\unsat,\fast,\inc,\uc,\mv}, \withtrack{QF\_FPArith}{\seq,\paral,\sat,\unsat,\fast,\inc,\uc}}{\withtrack{AUFBV}{\seq,\paral,\sat,\unsat,\fast,\uc}, \withtrack{AUFBVFP}{\seq,\paral,\sat,\unsat,\fast}, \withtrack{QF\_ABVFP}{\mv}, \withtrack{QF\_ABVFPLRA}{\mv}, \withtrack{QF\_AUFBVFP}{\mv}, \withtrack{QF\_BVFP}{\mv}, \withtrack{QF\_BVFPLRA}{\mv}, \withtrack{QF\_FPLRA}{\mv}, \withtrack{UFBV}{\seq,\paral,\sat,\fast}, \withtrack{UFBVFP}{\seq,\paral,\unsat}}{s}{s} \newpage -\MakeOnePage{Amaya}{}{}{\withtrack{NIA}{\fast}}{}{} +\MakeOnePage{Bitwuzla-MachBV}{}{\withtrack{QF\_Bitvec}{\seq,\paral,\unsat,\fast}}{}{}{} \newpage -\MakeOnePage{Bitwuzla}{\withtrack{Biggest Lead}{\inc}}{\withtrack{Bitvec}{\sat}, \withtrack{Equality\_MachineArith}{\inc}, \withtrack{FPArith}{\seq,\paral,\sat,\unsat,\fast,\inc,\uc}, \withtrack{QF\_ADT\_BitVec}{\mv}, \withtrack{QF\_Bitvec}{\seq,\paral,\unsat,\fast,\inc,\uc}, \withtrack{QF\_Equality\_Bitvec}{\seq,\paral,\sat,\unsat,\inc}, \withtrack{QF\_FPArith}{\seq,\paral,\sat,\unsat,\fast,\inc,\uc}}{\withtrack{ABVFP}{\sat}, \withtrack{AUFBV}{\seq,\paral,\sat,\unsat,\fast,\uc}, \withtrack{AUFBVFP}{\seq,\paral,\sat,\unsat,\fast}, \withtrack{QF\_ABV}{\uc}, \withtrack{QF\_ABVFP}{\mv}, \withtrack{QF\_BVFPLRA}{\mv}, \withtrack{QF\_FPLRA}{\mv}, \withtrack{QF\_UFBV}{\fast}, \withtrack{UFBV}{\fast}}{s}{s} +\MakeOnePage{COLIBRI}{}{}{\withtrack{QF\_FP}{\fast}, \withtrack{QF\_FPLRA}{\unsat,\fast}}{}{s} \newpage -\MakeOnePage{COLIBRI}{}{}{\withtrack{QF\_ABVFPLRA}{\unsat}, \withtrack{QF\_FP}{\fast}, \withtrack{QF\_FPLRA}{\unsat,\fast}}{}{s} +\MakeOnePage{cvc5}{\withtrack{Best Overall}{\seq,\paral,\sat,\unsat,\fast,\inc,\uc,\mv}, \withtrack{Biggest Lead}{\seq,\paral,\sat,\unsat,\fast,\uc}, \withtrack{Largest Contribution}{\seq,\paral,\sat,\fast,\inc,\uc}}{\withtrack{Arith}{\inc,\uc}, \withtrack{Bitvec}{\seq,\paral,\unsat,\inc,\uc}, \withtrack{Equality}{\seq,\paral,\sat,\unsat,\fast,\inc,\uc}, \withtrack{Equality\_LinearArith}{\seq,\paral,\sat,\unsat,\fast,\inc,\uc}, \withtrack{Equality\_MachineArith}{\seq,\paral,\sat,\unsat,\fast,\uc}, \withtrack{Equality\_NonLinearArith}{\seq,\paral,\sat,\unsat,\fast,\inc,\uc}, \withtrack{QF\_Datatypes}{\seq,\paral,\sat,\unsat,\uc}, \withtrack{QF\_Equality\_NonLinearArith}{\unsat,\uc,\mv}, \withtrack{QF\_FPArith}{\mv}}{\withtrack{BVFPLRA}{\unsat}, \withtrack{FP}{\unsat,\fast}, \withtrack{LIA}{\unsat}, \withtrack{QF\_AUFLIA}{\uc,\mv}, \withtrack{QF\_AX}{\mv}, \withtrack{QF\_IDL}{\unsat,\uc}, \withtrack{QF\_SNIA}{\seq,\paral,\sat,\fast}, \withtrack{QF\_UFBVDT}{\seq,\paral,\sat,\unsat,\fast,\mv}, \withtrack{QF\_UFDT}{\fast,\mv}, \withtrack{QF\_UFDTLIRA}{\seq,\paral,\sat,\unsat,\fast,\uc,\mv}, \withtrack{QF\_UFDTNIA}{\seq,\paral,\sat,\fast}, \withtrack{QF\_UFFPDTNIRA}{\seq,\paral,\sat,\unsat,\fast}, \withtrack{QF\_UFLRA}{\inc,\uc}, \withtrack{QF\_UFNIA}{\inc}}{s}{s} \newpage -\MakeOnePage{cvc5}{\withtrack{Biggest Lead}{\seq,\paral,\sat,\unsat,\fast,\uc}, \withtrack{Largest Contribution}{\seq,\paral,\sat,\unsat,\fast}}{\withtrack{Arith}{\seq,\paral,\unsat,\inc,\uc}, \withtrack{Bitvec}{\seq,\paral,\unsat,\inc,\uc}, \withtrack{Equality}{\seq,\paral,\sat,\unsat,\fast,\inc,\uc}, \withtrack{Equality\_LinearArith}{\seq,\paral,\sat,\unsat,\fast,\inc,\uc}, \withtrack{Equality\_MachineArith}{\seq,\paral,\sat,\unsat,\fast,\uc}, \withtrack{Equality\_NonLinearArith}{\seq,\paral,\sat,\unsat,\fast,\inc,\uc}, \withtrack{QF\_Datatypes}{\sat,\uc}, \withtrack{QF\_Equality\_Bitvec}{\uc}, \withtrack{QF\_Equality\_NonLinearArith}{\unsat,\inc,\uc,\mv}, \withtrack{QF\_FPArith}{\mv}, \withtrack{QF\_LinearIntArith}{\unsat}, \withtrack{QF\_LinearRealArith}{\unsat}, \withtrack{QF\_NonLinearIntArith}{\uc}, \withtrack{QF\_NonLinearRealArith}{\unsat,\uc}, \withtrack{QF\_Strings}{\uc}}{\withtrack{BVFPLRA}{\unsat}, \withtrack{FP}{\fast}, \withtrack{LIA}{\sat,\fast}, \withtrack{NIA}{\sat}, \withtrack{QF\_AUFLIA}{\inc,\uc}, \withtrack{QF\_AX}{\mv}, \withtrack{QF\_BVFP}{\inc}, \withtrack{QF\_FP}{\sat,\uc}, \withtrack{QF\_IDL}{\uc}, \withtrack{QF\_LIA}{\mv}, \withtrack{QF\_SNIA}{\seq,\paral,\sat,\fast}, \withtrack{QF\_UFBVDT}{\seq,\paral,\unsat,\fast,\mv}, \withtrack{QF\_UFDT}{\seq,\paral,\mv}, \withtrack{QF\_UFDTLIRA}{\seq,\paral,\sat,\unsat,\fast,\uc,\mv}, \withtrack{QF\_UFDTNIA}{\seq,\paral,\sat,\fast}, \withtrack{QF\_UFFPDTNIRA}{\seq,\paral,\sat,\unsat,\fast}, \withtrack{QF\_UFLRA}{\inc}}{s}{s} +\MakeOnePage{iProver v3.9.3}{}{}{\withtrack{ALIA}{\unsat}, \withtrack{UFNIRA}{\paral,\unsat}}{}{s} \newpage -\MakeOnePage{iProver v3.9}{}{}{\withtrack{ALIA}{\paral,\unsat}, \withtrack{UF}{\fast}, \withtrack{UFNIRA}{\seq,\unsat}}{}{s} -\newpage -\MakeOnePage{OpenSMT}{}{\withtrack{QF\_Equality}{\mv}, \withtrack{QF\_Equality\_LinearArith}{\unsat,\mv}, \withtrack{QF\_LinearIntArith}{\seq,\paral,\mv}, \withtrack{QF\_LinearRealArith}{\seq,\paral,\sat,\inc,\uc,\mv}}{\withtrack{QF\_LIA}{\sat}, \withtrack{QF\_LRA}{\unsat,\fast}, \withtrack{QF\_UF}{\uc\textsuperscript\seq}, \withtrack{QF\_UFIDL}{\seq,\paral,\sat}, \withtrack{QF\_UFLRA}{\uc}}{s}{s} +\MakeOnePage{OpenSMT}{}{\withtrack{QF\_Equality}{\mv}, \withtrack{QF\_Equality\_LinearArith}{\unsat,\mv}, \withtrack{QF\_LinearIntArith}{\seq,\paral,\unsat,\mv}, \withtrack{QF\_LinearRealArith}{\sat,\inc,\uc}}{\withtrack{QF\_LIA}{\sat}, \withtrack{QF\_LRA}{\seq,\paral,\unsat,\fast,\mv}, \withtrack{QF\_UFIDL}{\seq,\paral,\sat,\fast}}{s}{s} \newpage \MakeOnePage{SMT-RAT}{}{\withtrack{QF\_NonLinearRealArith}{\mv}}{\withtrack{NRA}{\seq,\paral,\unsat,\fast}}{}{} \newpage -\MakeOnePage{SMTInterpol}{\withtrack{Biggest Lead}{\mv}}{\withtrack{QF\_ADT\_LinArith}{\mv}, \withtrack{QF\_Datatypes}{\mv}, \withtrack{QF\_Equality\_LinearArith}{\seq,\paral,\sat,\inc}, \withtrack{QF\_LinearIntArith}{\uc}, \withtrack{QF\_NonLinearIntArith}{\inc}}{\withtrack{ALIA}{\sat,\uc}, \withtrack{ANIA}{\seq,\paral,\sat,\unsat,\fast,\uc}, \withtrack{AUFDTLIA}{\uc}, \withtrack{QF\_ALIA}{\uc}, \withtrack{QF\_ANIA}{\unsat,\fast,\inc,\uc,\mv}, \withtrack{QF\_AUFNIA}{\sat,\uc,\mv}, \withtrack{QF\_LIA}{\unsat}, \withtrack{QF\_NIRA}{\uc}, \withtrack{QF\_UF}{\uc\textsuperscript\paral}, \withtrack{QF\_UFBVDT}{\sat}, \withtrack{QF\_UFDT}{\uc\textsuperscript\paral}, \withtrack{QF\_UFDTLIA}{\unsat,\fast,\uc}, \withtrack{QF\_UFDTNIA}{\uc,\mv}, \withtrack{QF\_UFLIA}{\unsat,\mv}, \withtrack{UFIDL}{\sat}, \withtrack{UFLIA}{\sat}}{s}{s} +\MakeOnePage{SMTInterpol}{\withtrack{Biggest Lead}{\mv}}{\withtrack{QF\_ADT\_LinArith}{\mv}, \withtrack{QF\_Datatypes}{\fast,\mv}, \withtrack{QF\_Equality\_LinearArith}{\seq,\paral,\sat,\fast,\inc}, \withtrack{QF\_Equality\_NonLinearArith}{\inc}}{\withtrack{ABV}{\uc}, \withtrack{ANIA}{\seq,\paral,\sat,\unsat,\fast,\uc}, \withtrack{AUFBVDTLIA}{\uc}, \withtrack{QF\_ANIA}{\seq,\paral,\sat,\unsat,\fast,\mv}, \withtrack{QF\_AUFNIA}{\sat,\uc,\mv}, \withtrack{QF\_DT}{\unsat}, \withtrack{QF\_UFBV}{\unsat,\fast}, \withtrack{QF\_UFBVDT}{\uc}, \withtrack{QF\_UFDTLIA}{\unsat,\uc}, \withtrack{QF\_UFDTNIA}{\unsat,\uc,\mv}, \withtrack{QF\_UFLIA}{\uc,\mv}, \withtrack{UFIDL}{\sat}, \withtrack{UFLIA}{\sat}}{s}{s} +\newpage +\MakeOnePage{UltimateEliminator+MathSAT}{}{}{\withtrack{ALIA}{\sat}, \withtrack{LIA}{\uc}}{}{s} +\newpage +\MakeOnePage{Yices2}{\withtrack{Largest Contribution}{\mv}}{\withtrack{QF\_Bitvec}{\inc}, \withtrack{QF\_Equality}{\seq,\paral,\sat,\unsat,\fast,\inc,\uc}, \withtrack{QF\_Equality\_Bitvec\_Arith}{\inc}, \withtrack{QF\_Equality\_LinearArith}{\uc}, \withtrack{QF\_Equality\_NonLinearArith}{\seq,\paral,\sat,\fast}, \withtrack{QF\_LinearIntArith}{\fast,\inc,\uc}, \withtrack{QF\_LinearRealArith}{\seq,\paral,\unsat,\fast,\mv}, \withtrack{QF\_NonLinearIntArith}{\uc,\mv}, \withtrack{QF\_NonLinearRealArith}{\uc}}{\withtrack{QF\_ALIA}{\unsat,\inc}, \withtrack{QF\_ANIA}{\uc}, \withtrack{QF\_AUFBV}{\unsat,\fast}, \withtrack{QF\_AUFLIA}{\seq,\paral,\sat,\unsat,\fast}, \withtrack{QF\_AUFNIA}{\unsat}, \withtrack{QF\_IDL}{\seq,\mv}, \withtrack{QF\_LIRA}{\sat,\mv}, \withtrack{QF\_RDL}{\sat}, \withtrack{QF\_UFLIA}{\unsat,\fast,\inc}, \withtrack{QF\_UFLRA}{\seq,\paral,\sat,\unsat,\fast,\mv}, \withtrack{QF\_UFNRA}{\unsat,\inc}}{s}{s} +\newpage +\MakeOnePage{YicesQS}{}{\withtrack{Bitvec}{\fast}}{\withtrack{LRA}{\seq,\paral,\sat,\unsat,\fast}, \withtrack{NRA}{\sat}}{}{s} \newpage -\MakeOnePage{STP}{}{\withtrack{QF\_Bitvec}{\sat,\mv}}{}{}{} +\MakeOnePage{Z3-alpha}{}{\withtrack{Arith}{\seq,\paral,\sat,\unsat,\fast}, \withtrack{QF\_LinearIntArith}{\sat}, \withtrack{QF\_NonLinearIntArith}{\seq,\paral,\sat,\fast}, \withtrack{QF\_NonLinearRealArith}{\seq,\paral,\sat,\unsat,\fast}}{\withtrack{QF\_IDL}{\paral}, \withtrack{QF\_LIRA}{\seq,\paral,\unsat}, \withtrack{QF\_NIRA}{\unsat}}{s}{s} \newpage -\MakeOnePage{Yices2}{\withtrack{Largest Contribution}{\inc,\uc,\mv}}{\withtrack{QF\_Equality}{\seq,\paral,\sat,\unsat,\fast,\inc,\uc}, \withtrack{QF\_Equality\_Bitvec}{\fast,\mv}, \withtrack{QF\_Equality\_Bitvec\_Arith}{\inc}, \withtrack{QF\_Equality\_LinearArith}{\fast,\uc}, \withtrack{QF\_Equality\_NonLinearArith}{\seq,\paral,\sat,\fast}, \withtrack{QF\_LinearIntArith}{\fast,\inc}, \withtrack{QF\_LinearRealArith}{\fast}, \withtrack{QF\_NonLinearIntArith}{\fast,\mv}, \withtrack{QF\_NonLinearRealArith}{\fast}}{\withtrack{QF\_ALIA}{\unsat}, \withtrack{QF\_AUFBV}{\uc}, \withtrack{QF\_AUFLIA}{\seq,\paral,\sat,\unsat}, \withtrack{QF\_AUFNIA}{\unsat}, \withtrack{QF\_IDL}{\mv}, \withtrack{QF\_LIA}{\uc}, \withtrack{QF\_LIRA}{\sat,\mv}, \withtrack{QF\_RDL}{\seq,\paral,\sat,\unsat,\mv}, \withtrack{QF\_UFLIA}{\inc}, \withtrack{QF\_UFLRA}{\seq,\paral,\sat,\unsat,\mv}, \withtrack{QF\_UFNRA}{\unsat}}{s}{s} +\MakeOnePage{Z3-Inc-Z3++}{}{\withtrack{QF\_NonLinearIntArith}{\inc}}{}{}{} \newpage -\MakeOnePage{YicesQS}{}{\withtrack{Arith}{\sat,\fast}, \withtrack{Bitvec}{\fast}}{\withtrack{LRA}{\seq,\paral,\unsat}}{s}{} +\MakeOnePage{Z3-Noodler}{}{}{\withtrack{QF\_SLIA}{\unsat}}{}{} \newpage -\MakeOnePage{Z3-alpha}{}{\withtrack{QF\_Datatypes}{\unsat}, \withtrack{QF\_LinearIntArith}{\sat}, \withtrack{QF\_NonLinearIntArith}{\seq,\paral,\sat,\unsat}, \withtrack{QF\_NonLinearRealArith}{\seq,\paral,\sat}}{\withtrack{QF\_AUFBV}{\unsat}, \withtrack{QF\_IDL}{\seq,\paral,\unsat}, \withtrack{QF\_LIRA}{\seq,\paral,\unsat}, \withtrack{QF\_NIRA}{\fast}}{s}{s} +\MakeOnePage{Z3-Noodler-Mocha}{\withtrack{Largest Contribution}{\unsat}}{\withtrack{QF\_Strings}{\seq,\paral,\sat,\unsat,\fast}}{}{}{} \newpage -\MakeOnePage{Z3-Noodler}{}{\withtrack{QF\_Strings}{\seq,\paral,\sat,\unsat,\fast}}{}{}{} +\MakeOnePage{z3siri}{}{\withtrack{QF\_NonLinearIntArith}{\unsat}}{}{}{} \newpage diff --git a/data/latex-certificates/solvers_pretty_name.csv b/data/latex-certificates/solvers_pretty_name.csv deleted file mode 100644 index 1725a325..00000000 --- a/data/latex-certificates/solvers_pretty_name.csv +++ /dev/null @@ -1,20 +0,0 @@ -Solver Name,Members -Algaroba,3 -Amaya,4 -Bitwuzla,2 -COLIBRI,3 -cvc5,15 -cvc5-cloud,5 -iProver v3.9,8 -OpenSMT,2 -OSTRICH,6 -plat-smt,1 -SMTInterpol,5 -SMT-RAT,3 -SMTS,3 -STP,6 -Yices2,7 -YicesQS,1 -Z3-Noodler,5 -Z3-alpha,5 -Z3-Parti-Z3++,2 diff --git a/data/results-inc-2025.json.gz b/data/results-inc-2025.json.gz new file mode 100644 index 00000000..e3391c51 Binary files /dev/null and b/data/results-inc-2025.json.gz differ diff --git a/data/results-mv-2025.json.gz b/data/results-mv-2025.json.gz new file mode 100644 index 00000000..a0abfd08 Binary files /dev/null and b/data/results-mv-2025.json.gz differ diff --git a/data/results-parallel-2025.json.gz b/data/results-parallel-2025.json.gz new file mode 100644 index 00000000..640454e8 Binary files /dev/null and b/data/results-parallel-2025.json.gz differ diff --git a/data/results-sq-2025.json.gz b/data/results-sq-2025.json.gz new file mode 100644 index 00000000..f06df7b3 Binary files /dev/null and b/data/results-sq-2025.json.gz differ diff --git a/data/results-uc-2025.json.gz b/data/results-uc-2025.json.gz new file mode 100644 index 00000000..994813e1 Binary files /dev/null and b/data/results-uc-2025.json.gz differ diff --git a/poetry.lock b/poetry.lock index 6e99d9ac..98f75e13 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,29 @@ -# This file is automatically @generated by Poetry 2.1.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.4 and should not be changed by hand. + +[[package]] +name = "altair" +version = "5.5.0" +description = "Vega-Altair: A declarative statistical visualization library for Python." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "altair-5.5.0-py3-none-any.whl", hash = "sha256:91a310b926508d560fe0148d02a194f38b824122641ef528113d029fcd129f8c"}, + {file = "altair-5.5.0.tar.gz", hash = "sha256:d960ebe6178c56de3855a68c47b516be38640b73fb3b5111c2a9ca90546dd73d"}, +] + +[package.dependencies] +jinja2 = "*" +jsonschema = ">=3.0" +narwhals = ">=1.14.2" +packaging = "*" +typing-extensions = {version = ">=4.10.0", markers = "python_version < \"3.14\""} + +[package.extras] +all = ["altair-tiles (>=0.3.0)", "anywidget (>=0.9.0)", "numpy", "pandas (>=1.1.3)", "pyarrow (>=11)", "vega-datasets (>=0.9.0)", "vegafusion[embed] (>=1.6.6)", "vl-convert-python (>=1.7.0)"] +dev = ["duckdb (>=1.0)", "geopandas", "hatch (>=1.13.0)", "ipython[kernel]", "mistune", "mypy", "pandas (>=1.1.3)", "pandas-stubs", "polars (>=0.20.3)", "pyarrow-stubs", "pytest", "pytest-cov", "pytest-xdist[psutil] (>=3.5,<4.0)", "ruff (>=0.6.0)", "types-jsonschema", "types-setuptools"] +doc = ["docutils", "jinja2", "myst-parser", "numpydoc", "pillow (>=9,<10)", "pydata-sphinx-theme (>=0.14.1)", "scipy", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinxext-altair"] +save = ["vl-convert-python (>=1.7.0)"] [[package]] name = "annotated-types" @@ -13,145 +38,143 @@ files = [ ] [[package]] -name = "beautifulsoup4" -version = "4.12.3" -description = "Screen-scraping library" +name = "attrs" +version = "25.3.0" +description = "Classes Without Boilerplate" optional = false -python-versions = ">=3.6.0" +python-versions = ">=3.8" groups = ["main"] files = [ - {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, - {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, + {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, + {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, ] -[package.dependencies] -soupsieve = ">1.2" - [package.extras] -cchardet = ["cchardet"] -chardet = ["chardet"] -charset-normalizer = ["charset-normalizer"] -html5lib = ["html5lib"] -lxml = ["lxml"] +benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] +tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] [[package]] name = "benchexec" -version = "3.21" +version = "3.30" description = "A Framework for Reliable Benchmarking and Resource Measurement." optional = false -python-versions = "*" +python-versions = ">=3.8" groups = ["main"] files = [ - {file = "BenchExec-3.21-py3-none-any.whl", hash = "sha256:d986e02b0877919c5f7d605bc1ba3687225e0090c3527ec76557bfef2f3d2d80"}, - {file = "BenchExec-3.21.tar.gz", hash = "sha256:60b5e5a512be4c9977a753a98935dd662c7a748f4360d1d18427154f339a063c"}, + {file = "benchexec-3.30-py3-none-any.whl", hash = "sha256:b9168715600fcc7e8034656fa021577a48cc6dcfa491f02535be30c132d1bc3a"}, + {file = "benchexec-3.30.tar.gz", hash = "sha256:1fc7f735cbe9eb0ba12c9b65f71f7b5cfdfcaa72af53678b7f8ca6e25cdfe9c3"}, ] [package.dependencies] PyYAML = ">=3.12" [package.extras] -dev = ["lxml", "nose (>=1.0)"] -systemd = ["pystemd (>=0.7.0)"] - -[[package]] -name = "bs4" -version = "0.0.2" -description = "Dummy package for Beautiful Soup (beautifulsoup4)" -optional = false -python-versions = "*" -groups = ["main"] -files = [ - {file = "bs4-0.0.2-py2.py3-none-any.whl", hash = "sha256:abf8742c0805ef7f662dce4b51cca104cffe52b835238afc169142ab9b3fbccc"}, - {file = "bs4-0.0.2.tar.gz", hash = "sha256:a48685c58f50fe127722417bae83fe6badf500d54b55f7e39ffe43b798653925"}, -] - -[package.dependencies] -beautifulsoup4 = "*" +dev = ["lxml", "pystemd (>=0.7.0) ; platform_system != \"Windows\"", "pytest"] +systemd = ["pystemd (>=0.7.0) ; platform_system != \"Windows\""] [[package]] name = "cachetools" -version = "5.3.3" +version = "6.1.0" description = "Extensible memoizing collections and decorators" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, - {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, + {file = "cachetools-6.1.0-py3-none-any.whl", hash = "sha256:1c7bb3cf9193deaf3508b7c5f2a79986c13ea38965c5adcff1f84519cf39163e"}, + {file = "cachetools-6.1.0.tar.gz", hash = "sha256:b4c4f404392848db3ce7aac34950d17be4d864da4b8b66911008e430bc544587"}, ] [[package]] name = "certifi" -version = "2024.7.4" +version = "2025.8.3" description = "Python package for providing Mozilla's CA Bundle." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" groups = ["main"] files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5"}, + {file = "certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407"}, ] [[package]] name = "cffi" -version = "1.16.0" +version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] [package.dependencies] @@ -183,114 +206,116 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.7" groups = ["main"] files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-win32.whl", hash = "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-win32.whl", hash = "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e"}, + {file = "charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0"}, + {file = "charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63"}, ] [[package]] name = "click" -version = "8.1.7" +version = "8.2.1" description = "Composable command line interface toolkit" optional = false -python-versions = ">=3.7" +python-versions = ">=3.10" groups = ["main", "dev"] files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, + {file = "click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b"}, + {file = "click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202"}, ] [package.dependencies] @@ -311,64 +336,100 @@ markers = {main = "platform_system == \"Windows\""} [[package]] name = "coverage" -version = "7.5.3" +version = "7.10.2" description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "coverage-7.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a6519d917abb15e12380406d721e37613e2a67d166f9fb7e5a8ce0375744cd45"}, - {file = "coverage-7.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aea7da970f1feccf48be7335f8b2ca64baf9b589d79e05b9397a06696ce1a1ec"}, - {file = "coverage-7.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:923b7b1c717bd0f0f92d862d1ff51d9b2b55dbbd133e05680204465f454bb286"}, - {file = "coverage-7.5.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62bda40da1e68898186f274f832ef3e759ce929da9a9fd9fcf265956de269dbc"}, - {file = "coverage-7.5.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8b7339180d00de83e930358223c617cc343dd08e1aa5ec7b06c3a121aec4e1d"}, - {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:25a5caf742c6195e08002d3b6c2dd6947e50efc5fc2c2205f61ecb47592d2d83"}, - {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:05ac5f60faa0c704c0f7e6a5cbfd6f02101ed05e0aee4d2822637a9e672c998d"}, - {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:239a4e75e09c2b12ea478d28815acf83334d32e722e7433471fbf641c606344c"}, - {file = "coverage-7.5.3-cp310-cp310-win32.whl", hash = "sha256:a5812840d1d00eafae6585aba38021f90a705a25b8216ec7f66aebe5b619fb84"}, - {file = "coverage-7.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:33ca90a0eb29225f195e30684ba4a6db05dbef03c2ccd50b9077714c48153cac"}, - {file = "coverage-7.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f81bc26d609bf0fbc622c7122ba6307993c83c795d2d6f6f6fd8c000a770d974"}, - {file = "coverage-7.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7cec2af81f9e7569280822be68bd57e51b86d42e59ea30d10ebdbb22d2cb7232"}, - {file = "coverage-7.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55f689f846661e3f26efa535071775d0483388a1ccfab899df72924805e9e7cd"}, - {file = "coverage-7.5.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50084d3516aa263791198913a17354bd1dc627d3c1639209640b9cac3fef5807"}, - {file = "coverage-7.5.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:341dd8f61c26337c37988345ca5c8ccabeff33093a26953a1ac72e7d0103c4fb"}, - {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ab0b028165eea880af12f66086694768f2c3139b2c31ad5e032c8edbafca6ffc"}, - {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5bc5a8c87714b0c67cfeb4c7caa82b2d71e8864d1a46aa990b5588fa953673b8"}, - {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:38a3b98dae8a7c9057bd91fbf3415c05e700a5114c5f1b5b0ea5f8f429ba6614"}, - {file = "coverage-7.5.3-cp311-cp311-win32.whl", hash = "sha256:fcf7d1d6f5da887ca04302db8e0e0cf56ce9a5e05f202720e49b3e8157ddb9a9"}, - {file = "coverage-7.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:8c836309931839cca658a78a888dab9676b5c988d0dd34ca247f5f3e679f4e7a"}, - {file = "coverage-7.5.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:296a7d9bbc598e8744c00f7a6cecf1da9b30ae9ad51c566291ff1314e6cbbed8"}, - {file = "coverage-7.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:34d6d21d8795a97b14d503dcaf74226ae51eb1f2bd41015d3ef332a24d0a17b3"}, - {file = "coverage-7.5.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e317953bb4c074c06c798a11dbdd2cf9979dbcaa8ccc0fa4701d80042d4ebf1"}, - {file = "coverage-7.5.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:705f3d7c2b098c40f5b81790a5fedb274113373d4d1a69e65f8b68b0cc26f6db"}, - {file = "coverage-7.5.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1196e13c45e327d6cd0b6e471530a1882f1017eb83c6229fc613cd1a11b53cd"}, - {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:015eddc5ccd5364dcb902eaecf9515636806fa1e0d5bef5769d06d0f31b54523"}, - {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fd27d8b49e574e50caa65196d908f80e4dff64d7e592d0c59788b45aad7e8b35"}, - {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:33fc65740267222fc02975c061eb7167185fef4cc8f2770267ee8bf7d6a42f84"}, - {file = "coverage-7.5.3-cp312-cp312-win32.whl", hash = "sha256:7b2a19e13dfb5c8e145c7a6ea959485ee8e2204699903c88c7d25283584bfc08"}, - {file = "coverage-7.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:0bbddc54bbacfc09b3edaec644d4ac90c08ee8ed4844b0f86227dcda2d428fcb"}, - {file = "coverage-7.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f78300789a708ac1f17e134593f577407d52d0417305435b134805c4fb135adb"}, - {file = "coverage-7.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b368e1aee1b9b75757942d44d7598dcd22a9dbb126affcbba82d15917f0cc155"}, - {file = "coverage-7.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f836c174c3a7f639bded48ec913f348c4761cbf49de4a20a956d3431a7c9cb24"}, - {file = "coverage-7.5.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:244f509f126dc71369393ce5fea17c0592c40ee44e607b6d855e9c4ac57aac98"}, - {file = "coverage-7.5.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4c2872b3c91f9baa836147ca33650dc5c172e9273c808c3c3199c75490e709d"}, - {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dd4b3355b01273a56b20c219e74e7549e14370b31a4ffe42706a8cda91f19f6d"}, - {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f542287b1489c7a860d43a7d8883e27ca62ab84ca53c965d11dac1d3a1fab7ce"}, - {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:75e3f4e86804023e991096b29e147e635f5e2568f77883a1e6eed74512659ab0"}, - {file = "coverage-7.5.3-cp38-cp38-win32.whl", hash = "sha256:c59d2ad092dc0551d9f79d9d44d005c945ba95832a6798f98f9216ede3d5f485"}, - {file = "coverage-7.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:fa21a04112c59ad54f69d80e376f7f9d0f5f9123ab87ecd18fbb9ec3a2beed56"}, - {file = "coverage-7.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5102a92855d518b0996eb197772f5ac2a527c0ec617124ad5242a3af5e25f85"}, - {file = "coverage-7.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d1da0a2e3b37b745a2b2a678a4c796462cf753aebf94edcc87dcc6b8641eae31"}, - {file = "coverage-7.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8383a6c8cefba1b7cecc0149415046b6fc38836295bc4c84e820872eb5478b3d"}, - {file = "coverage-7.5.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9aad68c3f2566dfae84bf46295a79e79d904e1c21ccfc66de88cd446f8686341"}, - {file = "coverage-7.5.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e079c9ec772fedbade9d7ebc36202a1d9ef7291bc9b3a024ca395c4d52853d7"}, - {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bde997cac85fcac227b27d4fb2c7608a2c5f6558469b0eb704c5726ae49e1c52"}, - {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:990fb20b32990b2ce2c5f974c3e738c9358b2735bc05075d50a6f36721b8f303"}, - {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3d5a67f0da401e105753d474369ab034c7bae51a4c31c77d94030d59e41df5bd"}, - {file = "coverage-7.5.3-cp39-cp39-win32.whl", hash = "sha256:e08c470c2eb01977d221fd87495b44867a56d4d594f43739a8028f8646a51e0d"}, - {file = "coverage-7.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:1d2a830ade66d3563bb61d1e3c77c8def97b30ed91e166c67d0632c018f380f0"}, - {file = "coverage-7.5.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:3538d8fb1ee9bdd2e2692b3b18c22bb1c19ffbefd06880f5ac496e42d7bb3884"}, - {file = "coverage-7.5.3.tar.gz", hash = "sha256:04aefca5190d1dc7a53a4c1a5a7f8568811306d7a8ee231c42fb69215571944f"}, + {file = "coverage-7.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:79f0283ab5e6499fd5fe382ca3d62afa40fb50ff227676a3125d18af70eabf65"}, + {file = "coverage-7.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4545e906f595ee8ab8e03e21be20d899bfc06647925bc5b224ad7e8c40e08b8"}, + {file = "coverage-7.10.2-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ae385e1d58fbc6a9b1c315e5510ac52281e271478b45f92ca9b5ad42cf39643f"}, + {file = "coverage-7.10.2-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6f0cbe5f7dd19f3a32bac2251b95d51c3b89621ac88a2648096ce40f9a5aa1e7"}, + {file = "coverage-7.10.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fd17f427f041f6b116dc90b4049c6f3e1230524407d00daa2d8c7915037b5947"}, + {file = "coverage-7.10.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7f10ca4cde7b466405cce0a0e9971a13eb22e57a5ecc8b5f93a81090cc9c7eb9"}, + {file = "coverage-7.10.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3b990df23dd51dccce26d18fb09fd85a77ebe46368f387b0ffba7a74e470b31b"}, + {file = "coverage-7.10.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc3902584d25c7eef57fb38f440aa849a26a3a9f761a029a72b69acfca4e31f8"}, + {file = "coverage-7.10.2-cp310-cp310-win32.whl", hash = "sha256:9dd37e9ac00d5eb72f38ed93e3cdf2280b1dbda3bb9b48c6941805f265ad8d87"}, + {file = "coverage-7.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:99d16f15cb5baf0729354c5bd3080ae53847a4072b9ba1e10957522fb290417f"}, + {file = "coverage-7.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c3b210d79925a476dfc8d74c7d53224888421edebf3a611f3adae923e212b27"}, + {file = "coverage-7.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf67d1787cd317c3f8b2e4c6ed1ae93497be7e30605a0d32237ac37a37a8a322"}, + {file = "coverage-7.10.2-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:069b779d03d458602bc0e27189876e7d8bdf6b24ac0f12900de22dd2154e6ad7"}, + {file = "coverage-7.10.2-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4c2de4cb80b9990e71c62c2d3e9f3ec71b804b1f9ca4784ec7e74127e0f42468"}, + {file = "coverage-7.10.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:75bf7ab2374a7eb107602f1e07310cda164016cd60968abf817b7a0b5703e288"}, + {file = "coverage-7.10.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3f37516458ec1550815134937f73d6d15b434059cd10f64678a2068f65c62406"}, + {file = "coverage-7.10.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:de3c6271c482c250d3303fb5c6bdb8ca025fff20a67245e1425df04dc990ece9"}, + {file = "coverage-7.10.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:98a838101321ac3089c9bb1d4bfa967e8afed58021fda72d7880dc1997f20ae1"}, + {file = "coverage-7.10.2-cp311-cp311-win32.whl", hash = "sha256:f2a79145a531a0e42df32d37be5af069b4a914845b6f686590739b786f2f7bce"}, + {file = "coverage-7.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:e4f5f1320f8ee0d7cfa421ceb257bef9d39fd614dd3ddcfcacd284d4824ed2c2"}, + {file = "coverage-7.10.2-cp311-cp311-win_arm64.whl", hash = "sha256:d8f2d83118f25328552c728b8e91babf93217db259ca5c2cd4dd4220b8926293"}, + {file = "coverage-7.10.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:890ad3a26da9ec7bf69255b9371800e2a8da9bc223ae5d86daeb940b42247c83"}, + {file = "coverage-7.10.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:38fd1ccfca7838c031d7a7874d4353e2f1b98eb5d2a80a2fe5732d542ae25e9c"}, + {file = "coverage-7.10.2-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:76c1ffaaf4f6f0f6e8e9ca06f24bb6454a7a5d4ced97a1bc466f0d6baf4bd518"}, + {file = "coverage-7.10.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:86da8a3a84b79ead5c7d0e960c34f580bc3b231bb546627773a3f53c532c2f21"}, + {file = "coverage-7.10.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99cef9731c8a39801830a604cc53c93c9e57ea8b44953d26589499eded9576e0"}, + {file = "coverage-7.10.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ea58b112f2966a8b91eb13f5d3b1f8bb43c180d624cd3283fb33b1cedcc2dd75"}, + {file = "coverage-7.10.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:20f405188d28da9522b7232e51154e1b884fc18d0b3a10f382d54784715bbe01"}, + {file = "coverage-7.10.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:64586ce42bbe0da4d9f76f97235c545d1abb9b25985a8791857690f96e23dc3b"}, + {file = "coverage-7.10.2-cp312-cp312-win32.whl", hash = "sha256:bc2e69b795d97ee6d126e7e22e78a509438b46be6ff44f4dccbb5230f550d340"}, + {file = "coverage-7.10.2-cp312-cp312-win_amd64.whl", hash = "sha256:adda2268b8cf0d11f160fad3743b4dfe9813cd6ecf02c1d6397eceaa5b45b388"}, + {file = "coverage-7.10.2-cp312-cp312-win_arm64.whl", hash = "sha256:164429decd0d6b39a0582eaa30c67bf482612c0330572343042d0ed9e7f15c20"}, + {file = "coverage-7.10.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:aca7b5645afa688de6d4f8e89d30c577f62956fefb1bad021490d63173874186"}, + {file = "coverage-7.10.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:96e5921342574a14303dfdb73de0019e1ac041c863743c8fe1aa6c2b4a257226"}, + {file = "coverage-7.10.2-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:11333094c1bff621aa811b67ed794865cbcaa99984dedea4bd9cf780ad64ecba"}, + {file = "coverage-7.10.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6eb586fa7d2aee8d65d5ae1dd71414020b2f447435c57ee8de8abea0a77d5074"}, + {file = "coverage-7.10.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d358f259d8019d4ef25d8c5b78aca4c7af25e28bd4231312911c22a0e824a57"}, + {file = "coverage-7.10.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5250bda76e30382e0a2dcd68d961afcab92c3a7613606e6269855c6979a1b0bb"}, + {file = "coverage-7.10.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a91e027d66eff214d88d9afbe528e21c9ef1ecdf4956c46e366c50f3094696d0"}, + {file = "coverage-7.10.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:228946da741558904e2c03ce870ba5efd9cd6e48cbc004d9a27abee08100a15a"}, + {file = "coverage-7.10.2-cp313-cp313-win32.whl", hash = "sha256:95e23987b52d02e7c413bf2d6dc6288bd5721beb518052109a13bfdc62c8033b"}, + {file = "coverage-7.10.2-cp313-cp313-win_amd64.whl", hash = "sha256:f35481d42c6d146d48ec92d4e239c23f97b53a3f1fbd2302e7c64336f28641fe"}, + {file = "coverage-7.10.2-cp313-cp313-win_arm64.whl", hash = "sha256:65b451949cb789c346f9f9002441fc934d8ccedcc9ec09daabc2139ad13853f7"}, + {file = "coverage-7.10.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:e8415918856a3e7d57a4e0ad94651b761317de459eb74d34cc1bb51aad80f07e"}, + {file = "coverage-7.10.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f287a25a8ca53901c613498e4a40885b19361a2fe8fbfdbb7f8ef2cad2a23f03"}, + {file = "coverage-7.10.2-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:75cc1a3f8c88c69bf16a871dab1fe5a7303fdb1e9f285f204b60f1ee539b8fc0"}, + {file = "coverage-7.10.2-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ca07fa78cc9d26bc8c4740de1abd3489cf9c47cc06d9a8ab3d552ff5101af4c0"}, + {file = "coverage-7.10.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c2e117e64c26300032755d4520cd769f2623cde1a1d1c3515b05a3b8add0ade1"}, + {file = "coverage-7.10.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:daaf98009977f577b71f8800208f4d40d4dcf5c2db53d4d822787cdc198d76e1"}, + {file = "coverage-7.10.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:ea8d8fe546c528535c761ba424410bbeb36ba8a0f24be653e94b70c93fd8a8ca"}, + {file = "coverage-7.10.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:fe024d40ac31eb8d5aae70215b41dafa264676caa4404ae155f77d2fa95c37bb"}, + {file = "coverage-7.10.2-cp313-cp313t-win32.whl", hash = "sha256:8f34b09f68bdadec122ffad312154eda965ade433559cc1eadd96cca3de5c824"}, + {file = "coverage-7.10.2-cp313-cp313t-win_amd64.whl", hash = "sha256:71d40b3ac0f26fa9ffa6ee16219a714fed5c6ec197cdcd2018904ab5e75bcfa3"}, + {file = "coverage-7.10.2-cp313-cp313t-win_arm64.whl", hash = "sha256:abb57fdd38bf6f7dcc66b38dafb7af7c5fdc31ac6029ce373a6f7f5331d6f60f"}, + {file = "coverage-7.10.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:a3e853cc04987c85ec410905667eed4bf08b1d84d80dfab2684bb250ac8da4f6"}, + {file = "coverage-7.10.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0100b19f230df72c90fdb36db59d3f39232391e8d89616a7de30f677da4f532b"}, + {file = "coverage-7.10.2-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9c1cd71483ea78331bdfadb8dcec4f4edfb73c7002c1206d8e0af6797853f5be"}, + {file = "coverage-7.10.2-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9f75dbf4899e29a37d74f48342f29279391668ef625fdac6d2f67363518056a1"}, + {file = "coverage-7.10.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a7df481e7508de1c38b9b8043da48d94931aefa3e32b47dd20277e4978ed5b95"}, + {file = "coverage-7.10.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:835f39e618099325e7612b3406f57af30ab0a0af350490eff6421e2e5f608e46"}, + {file = "coverage-7.10.2-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:12e52b5aa00aa720097d6947d2eb9e404e7c1101ad775f9661ba165ed0a28303"}, + {file = "coverage-7.10.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:718044729bf1fe3e9eb9f31b52e44ddae07e434ec050c8c628bf5adc56fe4bdd"}, + {file = "coverage-7.10.2-cp314-cp314-win32.whl", hash = "sha256:f256173b48cc68486299d510a3e729a96e62c889703807482dbf56946befb5c8"}, + {file = "coverage-7.10.2-cp314-cp314-win_amd64.whl", hash = "sha256:2e980e4179f33d9b65ac4acb86c9c0dde904098853f27f289766657ed16e07b3"}, + {file = "coverage-7.10.2-cp314-cp314-win_arm64.whl", hash = "sha256:14fb5b6641ab5b3c4161572579f0f2ea8834f9d3af2f7dd8fbaecd58ef9175cc"}, + {file = "coverage-7.10.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:e96649ac34a3d0e6491e82a2af71098e43be2874b619547c3282fc11d3840a4b"}, + {file = "coverage-7.10.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1a2e934e9da26341d342d30bfe91422bbfdb3f1f069ec87f19b2909d10d8dcc4"}, + {file = "coverage-7.10.2-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:651015dcd5fd9b5a51ca79ece60d353cacc5beaf304db750407b29c89f72fe2b"}, + {file = "coverage-7.10.2-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:81bf6a32212f9f66da03d63ecb9cd9bd48e662050a937db7199dbf47d19831de"}, + {file = "coverage-7.10.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d800705f6951f75a905ea6feb03fff8f3ea3468b81e7563373ddc29aa3e5d1ca"}, + {file = "coverage-7.10.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:248b5394718e10d067354448dc406d651709c6765669679311170da18e0e9af8"}, + {file = "coverage-7.10.2-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:5c61675a922b569137cf943770d7ad3edd0202d992ce53ac328c5ff68213ccf4"}, + {file = "coverage-7.10.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:52d708b5fd65589461381fa442d9905f5903d76c086c6a4108e8e9efdca7a7ed"}, + {file = "coverage-7.10.2-cp314-cp314t-win32.whl", hash = "sha256:916369b3b914186b2c5e5ad2f7264b02cff5df96cdd7cdad65dccd39aa5fd9f0"}, + {file = "coverage-7.10.2-cp314-cp314t-win_amd64.whl", hash = "sha256:5b9d538e8e04916a5df63052d698b30c74eb0174f2ca9cd942c981f274a18eaf"}, + {file = "coverage-7.10.2-cp314-cp314t-win_arm64.whl", hash = "sha256:04c74f9ef1f925456a9fd23a7eef1103126186d0500ef9a0acb0bd2514bdc7cc"}, + {file = "coverage-7.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:765b13b164685a2f8b2abef867ad07aebedc0e090c757958a186f64e39d63dbd"}, + {file = "coverage-7.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a219b70100500d0c7fd3ebb824a3302efb6b1a122baa9d4eb3f43df8f0b3d899"}, + {file = "coverage-7.10.2-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e33e79a219105aa315439ee051bd50b6caa705dc4164a5aba6932c8ac3ce2d98"}, + {file = "coverage-7.10.2-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bc3945b7bad33957a9eca16e9e5eae4b17cb03173ef594fdaad228f4fc7da53b"}, + {file = "coverage-7.10.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9bdff88e858ee608a924acfad32a180d2bf6e13e059d6a7174abbae075f30436"}, + {file = "coverage-7.10.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:44329cbed24966c0b49acb386352c9722219af1f0c80db7f218af7793d251902"}, + {file = "coverage-7.10.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:be127f292496d0fbe20d8025f73221b36117b3587f890346e80a13b310712982"}, + {file = "coverage-7.10.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6c031da749a05f7a01447dd7f47beedb498edd293e31e1878c0d52db18787df0"}, + {file = "coverage-7.10.2-cp39-cp39-win32.whl", hash = "sha256:22aca3e691c7709c5999ccf48b7a8ff5cf5a8bd6fe9b36efbd4993f5a36b2fcf"}, + {file = "coverage-7.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:c7195444b932356055a8e287fa910bf9753a84a1bc33aeb3770e8fca521e032e"}, + {file = "coverage-7.10.2-py3-none-any.whl", hash = "sha256:95db3750dd2e6e93d99fa2498f3a1580581e49c494bddccc6f85c5c21604921f"}, + {file = "coverage-7.10.2.tar.gz", hash = "sha256:5d6e6d84e6dd31a8ded64759626627247d676a23c1b892e1326f7c55c8d61055"}, ] [package.extras] @@ -376,76 +437,64 @@ toml = ["tomli ; python_full_version <= \"3.11.0a6\""] [[package]] name = "cryptography" -version = "44.0.1" +version = "45.0.6" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = "!=3.9.0,!=3.9.1,>=3.7" groups = ["main"] files = [ - {file = "cryptography-44.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf688f615c29bfe9dfc44312ca470989279f0e94bb9f631f85e3459af8efc009"}, - {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd7c7e2d71d908dc0f8d2027e1604102140d84b155e658c20e8ad1304317691f"}, - {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887143b9ff6bad2b7570da75a7fe8bbf5f65276365ac259a5d2d5147a73775f2"}, - {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:322eb03ecc62784536bc173f1483e76747aafeb69c8728df48537eb431cd1911"}, - {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:21377472ca4ada2906bc313168c9dc7b1d7ca417b63c1c3011d0c74b7de9ae69"}, - {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:df978682c1504fc93b3209de21aeabf2375cb1571d4e61907b3e7a2540e83026"}, - {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:eb3889330f2a4a148abead555399ec9a32b13b7c8ba969b72d8e500eb7ef84cd"}, - {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:8e6a85a93d0642bd774460a86513c5d9d80b5c002ca9693e63f6e540f1815ed0"}, - {file = "cryptography-44.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6f76fdd6fd048576a04c5210d53aa04ca34d2ed63336d4abd306d0cbe298fddf"}, - {file = "cryptography-44.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6c8acf6f3d1f47acb2248ec3ea261171a671f3d9428e34ad0357148d492c7864"}, - {file = "cryptography-44.0.1-cp37-abi3-win32.whl", hash = "sha256:24979e9f2040c953a94bf3c6782e67795a4c260734e5264dceea65c8f4bae64a"}, - {file = "cryptography-44.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:fd0ee90072861e276b0ff08bd627abec29e32a53b2be44e41dbcdf87cbee2b00"}, - {file = "cryptography-44.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a2d8a7045e1ab9b9f803f0d9531ead85f90c5f2859e653b61497228b18452008"}, - {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8272f257cf1cbd3f2e120f14c68bff2b6bdfcc157fafdee84a1b795efd72862"}, - {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e8d181e90a777b63f3f0caa836844a1182f1f265687fac2115fcf245f5fbec3"}, - {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:436df4f203482f41aad60ed1813811ac4ab102765ecae7a2bbb1dbb66dcff5a7"}, - {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4f422e8c6a28cf8b7f883eb790695d6d45b0c385a2583073f3cec434cc705e1a"}, - {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:72198e2b5925155497a5a3e8c216c7fb3e64c16ccee11f0e7da272fa93b35c4c"}, - {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:2a46a89ad3e6176223b632056f321bc7de36b9f9b93b2cc1cccf935a3849dc62"}, - {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:53f23339864b617a3dfc2b0ac8d5c432625c80014c25caac9082314e9de56f41"}, - {file = "cryptography-44.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:888fcc3fce0c888785a4876ca55f9f43787f4c5c1cc1e2e0da71ad481ff82c5b"}, - {file = "cryptography-44.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:00918d859aa4e57db8299607086f793fa7813ae2ff5a4637e318a25ef82730f7"}, - {file = "cryptography-44.0.1-cp39-abi3-win32.whl", hash = "sha256:9b336599e2cb77b1008cb2ac264b290803ec5e8e89d618a5e978ff5eb6f715d9"}, - {file = "cryptography-44.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:e403f7f766ded778ecdb790da786b418a9f2394f36e8cc8b796cc056ab05f44f"}, - {file = "cryptography-44.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1f9a92144fa0c877117e9748c74501bea842f93d21ee00b0cf922846d9d0b183"}, - {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:610a83540765a8d8ce0f351ce42e26e53e1f774a6efb71eb1b41eb01d01c3d12"}, - {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5fed5cd6102bb4eb843e3315d2bf25fede494509bddadb81e03a859c1bc17b83"}, - {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:f4daefc971c2d1f82f03097dc6f216744a6cd2ac0f04c68fb935ea2ba2a0d420"}, - {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94f99f2b943b354a5b6307d7e8d19f5c423a794462bde2bf310c770ba052b1c4"}, - {file = "cryptography-44.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d9c5b9f698a83c8bd71e0f4d3f9f839ef244798e5ffe96febfa9714717db7af7"}, - {file = "cryptography-44.0.1.tar.gz", hash = "sha256:f51f5705ab27898afda1aaa430f34ad90dc117421057782022edf0600bec5f14"}, + {file = "cryptography-45.0.6-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:048e7ad9e08cf4c0ab07ff7f36cc3115924e22e2266e034450a890d9e312dd74"}, + {file = "cryptography-45.0.6-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:44647c5d796f5fc042bbc6d61307d04bf29bccb74d188f18051b635f20a9c75f"}, + {file = "cryptography-45.0.6-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e40b80ecf35ec265c452eea0ba94c9587ca763e739b8e559c128d23bff7ebbbf"}, + {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:00e8724bdad672d75e6f069b27970883179bd472cd24a63f6e620ca7e41cc0c5"}, + {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a3085d1b319d35296176af31c90338eeb2ddac8104661df79f80e1d9787b8b2"}, + {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1b7fa6a1c1188c7ee32e47590d16a5a0646270921f8020efc9a511648e1b2e08"}, + {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:275ba5cc0d9e320cd70f8e7b96d9e59903c815ca579ab96c1e37278d231fc402"}, + {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f4028f29a9f38a2025abedb2e409973709c660d44319c61762202206ed577c42"}, + {file = "cryptography-45.0.6-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ee411a1b977f40bd075392c80c10b58025ee5c6b47a822a33c1198598a7a5f05"}, + {file = "cryptography-45.0.6-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e2a21a8eda2d86bb604934b6b37691585bd095c1f788530c1fcefc53a82b3453"}, + {file = "cryptography-45.0.6-cp311-abi3-win32.whl", hash = "sha256:d063341378d7ee9c91f9d23b431a3502fc8bfacd54ef0a27baa72a0843b29159"}, + {file = "cryptography-45.0.6-cp311-abi3-win_amd64.whl", hash = "sha256:833dc32dfc1e39b7376a87b9a6a4288a10aae234631268486558920029b086ec"}, + {file = "cryptography-45.0.6-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:3436128a60a5e5490603ab2adbabc8763613f638513ffa7d311c900a8349a2a0"}, + {file = "cryptography-45.0.6-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0d9ef57b6768d9fa58e92f4947cea96ade1233c0e236db22ba44748ffedca394"}, + {file = "cryptography-45.0.6-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea3c42f2016a5bbf71825537c2ad753f2870191134933196bee408aac397b3d9"}, + {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:20ae4906a13716139d6d762ceb3e0e7e110f7955f3bc3876e3a07f5daadec5f3"}, + {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dac5ec199038b8e131365e2324c03d20e97fe214af051d20c49db129844e8b3"}, + {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:18f878a34b90d688982e43f4b700408b478102dd58b3e39de21b5ebf6509c301"}, + {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5bd6020c80c5b2b2242d6c48487d7b85700f5e0038e67b29d706f98440d66eb5"}, + {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:eccddbd986e43014263eda489abbddfbc287af5cddfd690477993dbb31e31016"}, + {file = "cryptography-45.0.6-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:550ae02148206beb722cfe4ef0933f9352bab26b087af00e48fdfb9ade35c5b3"}, + {file = "cryptography-45.0.6-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5b64e668fc3528e77efa51ca70fadcd6610e8ab231e3e06ae2bab3b31c2b8ed9"}, + {file = "cryptography-45.0.6-cp37-abi3-win32.whl", hash = "sha256:780c40fb751c7d2b0c6786ceee6b6f871e86e8718a8ff4bc35073ac353c7cd02"}, + {file = "cryptography-45.0.6-cp37-abi3-win_amd64.whl", hash = "sha256:20d15aed3ee522faac1a39fbfdfee25d17b1284bafd808e1640a74846d7c4d1b"}, + {file = "cryptography-45.0.6-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:705bb7c7ecc3d79a50f236adda12ca331c8e7ecfbea51edd931ce5a7a7c4f012"}, + {file = "cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:826b46dae41a1155a0c0e66fafba43d0ede1dc16570b95e40c4d83bfcf0a451d"}, + {file = "cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:cc4d66f5dc4dc37b89cfef1bd5044387f7a1f6f0abb490815628501909332d5d"}, + {file = "cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:f68f833a9d445cc49f01097d95c83a850795921b3f7cc6488731e69bde3288da"}, + {file = "cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:3b5bf5267e98661b9b888a9250d05b063220dfa917a8203744454573c7eb79db"}, + {file = "cryptography-45.0.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2384f2ab18d9be88a6e4f8972923405e2dbb8d3e16c6b43f15ca491d7831bd18"}, + {file = "cryptography-45.0.6-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fc022c1fa5acff6def2fc6d7819bbbd31ccddfe67d075331a65d9cfb28a20983"}, + {file = "cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3de77e4df42ac8d4e4d6cdb342d989803ad37707cf8f3fbf7b088c9cbdd46427"}, + {file = "cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:599c8d7df950aa68baa7e98f7b73f4f414c9f02d0e8104a30c0182a07732638b"}, + {file = "cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:31a2b9a10530a1cb04ffd6aa1cd4d3be9ed49f7d77a4dafe198f3b382f41545c"}, + {file = "cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:e5b3dda1b00fb41da3af4c5ef3f922a200e33ee5ba0f0bc9ecf0b0c173958385"}, + {file = "cryptography-45.0.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:629127cfdcdc6806dfe234734d7cb8ac54edaf572148274fa377a7d3405b0043"}, + {file = "cryptography-45.0.6.tar.gz", hash = "sha256:5c966c732cf6e4a276ce83b6e4c729edda2df6929083a952cc7da973c539c719"}, ] [package.dependencies] -cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} +cffi = {version = ">=1.14", markers = "platform_python_implementation != \"PyPy\""} [package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0) ; python_version >= \"3.8\""] +docs = ["sphinx (>=5.3.0)", "sphinx-inline-tabs ; python_full_version >= \"3.8.0\"", "sphinx-rtd-theme (>=3.0.0) ; python_full_version >= \"3.8.0\""] docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] -nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_version >= \"3.8\""] -pep8test = ["check-sdist ; python_version >= \"3.8\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] +nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_full_version >= \"3.8.0\""] +pep8test = ["check-sdist ; python_full_version >= \"3.8.0\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi (>=2024)", "cryptography-vectors (==44.0.1)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] +test = ["certifi (>=2024)", "cryptography-vectors (==45.0.6)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] test-randomorder = ["pytest-randomly"] -[[package]] -name = "deprecated" -version = "1.2.14" -description = "Python @deprecated decorator to deprecate old python classes, functions or methods." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -groups = ["main"] -files = [ - {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, - {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, -] - -[package.dependencies] -wrapt = ">=1.10,<2" - -[package.extras] -dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] - [[package]] name = "deptry" version = "0.12.0" @@ -466,47 +515,47 @@ pathspec = ">=0.9.0" [[package]] name = "distlib" -version = "0.3.8" +version = "0.4.0" description = "Distribution utilities" optional = false python-versions = "*" groups = ["dev"] files = [ - {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, - {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, + {file = "distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16"}, + {file = "distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d"}, ] [[package]] name = "dnspython" -version = "2.6.1" +version = "2.7.0" description = "DNS toolkit" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, - {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, + {file = "dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86"}, + {file = "dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1"}, ] [package.extras] -dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "sphinx (>=7.2.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] -dnssec = ["cryptography (>=41)"] +dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "hypercorn (>=0.16.0)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "quart-trio (>=0.11.0)", "sphinx (>=7.2.0)", "sphinx-rtd-theme (>=2.0.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] +dnssec = ["cryptography (>=43)"] doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] -doq = ["aioquic (>=0.9.25)"] -idna = ["idna (>=3.6)"] +doq = ["aioquic (>=1.0.0)"] +idna = ["idna (>=3.7)"] trio = ["trio (>=0.23)"] wmi = ["wmi (>=1.5.1)"] [[package]] name = "email-validator" -version = "2.1.1" +version = "2.2.0" description = "A robust email address syntax and deliverability validation library." optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "email_validator-2.1.1-py3-none-any.whl", hash = "sha256:97d882d174e2a65732fb43bfce81a3a834cbc1bde8bf419e30ef5ea976370a05"}, - {file = "email_validator-2.1.1.tar.gz", hash = "sha256:200a70680ba08904be6d1eef729205cc0d687634399a5924d842533efb824b84"}, + {file = "email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631"}, + {file = "email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7"}, ] [package.dependencies] @@ -515,31 +564,31 @@ idna = ">=2.0.0" [[package]] name = "filelock" -version = "3.14.0" +version = "3.18.0" description = "A platform independent file lock." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "filelock-3.14.0-py3-none-any.whl", hash = "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f"}, - {file = "filelock-3.14.0.tar.gz", hash = "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a"}, + {file = "filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de"}, + {file = "filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] -typing = ["typing-extensions (>=4.8) ; python_version < \"3.11\""] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)", "pytest (>=8.3.4)", "pytest-asyncio (>=0.25.2)", "pytest-cov (>=6)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.28.1)"] +typing = ["typing-extensions (>=4.12.2) ; python_version < \"3.11\""] [[package]] name = "gitdb" -version = "4.0.11" +version = "4.0.12" description = "Git Object Database" optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, - {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, + {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, + {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, ] [package.dependencies] @@ -547,33 +596,33 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.43" +version = "3.1.45" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, - {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"}, + {file = "gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77"}, + {file = "gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c"}, ] [package.dependencies] gitdb = ">=4.0.1,<5" [package.extras] -doc = ["sphinx (==4.3.2)", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "sphinxcontrib-applehelp (>=1.0.2,<=1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.0,<=2.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)"] +doc = ["sphinx (>=7.1.2,<7.2)", "sphinx-autodoc-typehints", "sphinx_rtd_theme"] test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3.8\"", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions ; python_version < \"3.11\""] [[package]] name = "identify" -version = "2.5.36" +version = "2.6.12" description = "File identification library for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "identify-2.5.36-py2.py3-none-any.whl", hash = "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa"}, - {file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"}, + {file = "identify-2.6.12-py2.py3-none-any.whl", hash = "sha256:ad9672d5a72e0d2ff7c5c8809b62dfa60458626352fb0eb7b55e69bdc45334a2"}, + {file = "identify-2.6.12.tar.gz", hash = "sha256:d8de45749f1efb108badef65ee8386f0f7bb19a7f26185f74de6367bffbaf0e6"}, ] [package.extras] @@ -581,28 +630,86 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.7" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" groups = ["main"] files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "iniconfig" -version = "2.0.0" +version = "2.1.0" description = "brain-dead simple config-ini parsing" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, + {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, + {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, + {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, ] +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jsonschema" +version = "4.25.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "jsonschema-4.25.0-py3-none-any.whl", hash = "sha256:24c2e8da302de79c8b9382fee3e76b355e44d2a4364bb207159ce10b517bd716"}, + {file = "jsonschema-4.25.0.tar.gz", hash = "sha256:e63acf5c11762c0e6672ffb61482bdf57f0876684d8d249c0fe2d730d48bc55f"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "rfc3987-syntax (>=1.1.0)", "uri-template", "webcolors (>=24.6.0)"] + +[[package]] +name = "jsonschema-specifications" +version = "2025.4.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af"}, + {file = "jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + [[package]] name = "markdown-it-py" version = "3.0.0" @@ -628,6 +735,77 @@ profiling = ["gprof2dot"] rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] +[[package]] +name = "markupsafe" +version = "3.0.2" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +] + [[package]] name = "mdurl" version = "0.1.2" @@ -642,97 +820,123 @@ files = [ [[package]] name = "mypy" -version = "1.10.0" +version = "1.17.1" description = "Optional static typing for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "mypy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da1cbf08fb3b851ab3b9523a884c232774008267b1f83371ace57f412fe308c2"}, - {file = "mypy-1.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:12b6bfc1b1a66095ab413160a6e520e1dc076a28f3e22f7fb25ba3b000b4ef99"}, - {file = "mypy-1.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e36fb078cce9904c7989b9693e41cb9711e0600139ce3970c6ef814b6ebc2b2"}, - {file = "mypy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b0695d605ddcd3eb2f736cd8b4e388288c21e7de85001e9f85df9187f2b50f9"}, - {file = "mypy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:cd777b780312ddb135bceb9bc8722a73ec95e042f911cc279e2ec3c667076051"}, - {file = "mypy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3be66771aa5c97602f382230165b856c231d1277c511c9a8dd058be4784472e1"}, - {file = "mypy-1.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8b2cbaca148d0754a54d44121b5825ae71868c7592a53b7292eeb0f3fdae95ee"}, - {file = "mypy-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ec404a7cbe9fc0e92cb0e67f55ce0c025014e26d33e54d9e506a0f2d07fe5de"}, - {file = "mypy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e22e1527dc3d4aa94311d246b59e47f6455b8729f4968765ac1eacf9a4760bc7"}, - {file = "mypy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:a87dbfa85971e8d59c9cc1fcf534efe664d8949e4c0b6b44e8ca548e746a8d53"}, - {file = "mypy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a781f6ad4bab20eef8b65174a57e5203f4be627b46291f4589879bf4e257b97b"}, - {file = "mypy-1.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b808e12113505b97d9023b0b5e0c0705a90571c6feefc6f215c1df9381256e30"}, - {file = "mypy-1.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f55583b12156c399dce2df7d16f8a5095291354f1e839c252ec6c0611e86e2e"}, - {file = "mypy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cf18f9d0efa1b16478c4c129eabec36148032575391095f73cae2e722fcf9d5"}, - {file = "mypy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc6ac273b23c6b82da3bb25f4136c4fd42665f17f2cd850771cb600bdd2ebeda"}, - {file = "mypy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9fd50226364cd2737351c79807775136b0abe084433b55b2e29181a4c3c878c0"}, - {file = "mypy-1.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f90cff89eea89273727d8783fef5d4a934be2fdca11b47def50cf5d311aff727"}, - {file = "mypy-1.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fcfc70599efde5c67862a07a1aaf50e55bce629ace26bb19dc17cece5dd31ca4"}, - {file = "mypy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:075cbf81f3e134eadaf247de187bd604748171d6b79736fa9b6c9685b4083061"}, - {file = "mypy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:3f298531bca95ff615b6e9f2fc0333aae27fa48052903a0ac90215021cdcfa4f"}, - {file = "mypy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa7ef5244615a2523b56c034becde4e9e3f9b034854c93639adb667ec9ec2976"}, - {file = "mypy-1.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3236a4c8f535a0631f85f5fcdffba71c7feeef76a6002fcba7c1a8e57c8be1ec"}, - {file = "mypy-1.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a2b5cdbb5dd35aa08ea9114436e0d79aceb2f38e32c21684dcf8e24e1e92821"}, - {file = "mypy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92f93b21c0fe73dc00abf91022234c79d793318b8a96faac147cd579c1671746"}, - {file = "mypy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:28d0e038361b45f099cc086d9dd99c15ff14d0188f44ac883010e172ce86c38a"}, - {file = "mypy-1.10.0-py3-none-any.whl", hash = "sha256:f8c083976eb530019175aabadb60921e73b4f45736760826aa1689dda8208aee"}, - {file = "mypy-1.10.0.tar.gz", hash = "sha256:3d087fcbec056c4ee34974da493a826ce316947485cef3901f511848e687c131"}, + {file = "mypy-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3fbe6d5555bf608c47203baa3e72dbc6ec9965b3d7c318aa9a4ca76f465bd972"}, + {file = "mypy-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80ef5c058b7bce08c83cac668158cb7edea692e458d21098c7d3bce35a5d43e7"}, + {file = "mypy-1.17.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4a580f8a70c69e4a75587bd925d298434057fe2a428faaf927ffe6e4b9a98df"}, + {file = "mypy-1.17.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd86bb649299f09d987a2eebb4d52d10603224500792e1bee18303bbcc1ce390"}, + {file = "mypy-1.17.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a76906f26bd8d51ea9504966a9c25419f2e668f012e0bdf3da4ea1526c534d94"}, + {file = "mypy-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:e79311f2d904ccb59787477b7bd5d26f3347789c06fcd7656fa500875290264b"}, + {file = "mypy-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad37544be07c5d7fba814eb370e006df58fed8ad1ef33ed1649cb1889ba6ff58"}, + {file = "mypy-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:064e2ff508e5464b4bd807a7c1625bc5047c5022b85c70f030680e18f37273a5"}, + {file = "mypy-1.17.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70401bbabd2fa1aa7c43bb358f54037baf0586f41e83b0ae67dd0534fc64edfd"}, + {file = "mypy-1.17.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e92bdc656b7757c438660f775f872a669b8ff374edc4d18277d86b63edba6b8b"}, + {file = "mypy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c1fdf4abb29ed1cb091cf432979e162c208a5ac676ce35010373ff29247bcad5"}, + {file = "mypy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:ff2933428516ab63f961644bc49bc4cbe42bbffb2cd3b71cc7277c07d16b1a8b"}, + {file = "mypy-1.17.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:69e83ea6553a3ba79c08c6e15dbd9bfa912ec1e493bf75489ef93beb65209aeb"}, + {file = "mypy-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b16708a66d38abb1e6b5702f5c2c87e133289da36f6a1d15f6a5221085c6403"}, + {file = "mypy-1.17.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:89e972c0035e9e05823907ad5398c5a73b9f47a002b22359b177d40bdaee7056"}, + {file = "mypy-1.17.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03b6d0ed2b188e35ee6d5c36b5580cffd6da23319991c49ab5556c023ccf1341"}, + {file = "mypy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c837b896b37cd103570d776bda106eabb8737aa6dd4f248451aecf53030cdbeb"}, + {file = "mypy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:665afab0963a4b39dff7c1fa563cc8b11ecff7910206db4b2e64dd1ba25aed19"}, + {file = "mypy-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93378d3203a5c0800c6b6d850ad2f19f7a3cdf1a3701d3416dbf128805c6a6a7"}, + {file = "mypy-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:15d54056f7fe7a826d897789f53dd6377ec2ea8ba6f776dc83c2902b899fee81"}, + {file = "mypy-1.17.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:209a58fed9987eccc20f2ca94afe7257a8f46eb5df1fb69958650973230f91e6"}, + {file = "mypy-1.17.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:099b9a5da47de9e2cb5165e581f158e854d9e19d2e96b6698c0d64de911dd849"}, + {file = "mypy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ffadfbe6994d724c5a1bb6123a7d27dd68fc9c059561cd33b664a79578e14"}, + {file = "mypy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:9a2b7d9180aed171f033c9f2fc6c204c1245cf60b0cb61cf2e7acc24eea78e0a"}, + {file = "mypy-1.17.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:15a83369400454c41ed3a118e0cc58bd8123921a602f385cb6d6ea5df050c733"}, + {file = "mypy-1.17.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:55b918670f692fc9fba55c3298d8a3beae295c5cded0a55dccdc5bbead814acd"}, + {file = "mypy-1.17.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:62761474061feef6f720149d7ba876122007ddc64adff5ba6f374fda35a018a0"}, + {file = "mypy-1.17.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c49562d3d908fd49ed0938e5423daed8d407774a479b595b143a3d7f87cdae6a"}, + {file = "mypy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:397fba5d7616a5bc60b45c7ed204717eaddc38f826e3645402c426057ead9a91"}, + {file = "mypy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:9d6b20b97d373f41617bd0708fd46aa656059af57f2ef72aa8c7d6a2b73b74ed"}, + {file = "mypy-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5d1092694f166a7e56c805caaf794e0585cabdbf1df36911c414e4e9abb62ae9"}, + {file = "mypy-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:79d44f9bfb004941ebb0abe8eff6504223a9c1ac51ef967d1263c6572bbebc99"}, + {file = "mypy-1.17.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b01586eed696ec905e61bd2568f48740f7ac4a45b3a468e6423a03d3788a51a8"}, + {file = "mypy-1.17.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43808d9476c36b927fbcd0b0255ce75efe1b68a080154a38ae68a7e62de8f0f8"}, + {file = "mypy-1.17.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:feb8cc32d319edd5859da2cc084493b3e2ce5e49a946377663cc90f6c15fb259"}, + {file = "mypy-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d7598cf74c3e16539d4e2f0b8d8c318e00041553d83d4861f87c7a72e95ac24d"}, + {file = "mypy-1.17.1-py3-none-any.whl", hash = "sha256:a9f52c0351c21fe24c21d8c0eb1f62967b262d6729393397b6f443c3b773c3b9"}, + {file = "mypy-1.17.1.tar.gz", hash = "sha256:25e01ec741ab5bb3eec8ba9cdb0f769230368a22c959c4937360efb89b7e9f01"}, ] [package.dependencies] -mypy-extensions = ">=1.0.0" -typing-extensions = ">=4.1.0" +mypy_extensions = ">=1.0.0" +pathspec = ">=0.9.0" +typing_extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] +faster-cache = ["orjson"] install-types = ["pip"] mypyc = ["setuptools (>=50)"] reports = ["lxml"] [[package]] name = "mypy-extensions" -version = "1.0.0" +version = "1.1.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, + {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"}, + {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, ] [[package]] -name = "nodeenv" -version = "1.9.0" -description = "Node.js virtual environment builder" +name = "narwhals" +version = "2.0.1" +description = "Extremely lightweight compatibility layer between dataframe libraries" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["dev"] +python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "nodeenv-1.9.0-py2.py3-none-any.whl", hash = "sha256:508ecec98f9f3330b636d4448c0f1a56fc68017c68f1e7857ebc52acf0eb879a"}, - {file = "nodeenv-1.9.0.tar.gz", hash = "sha256:07f144e90dae547bf0d4ee8da0ee42664a42a04e02ed68e06324348dafe4bdb1"}, + {file = "narwhals-2.0.1-py3-none-any.whl", hash = "sha256:837457e36a2ba1710c881fb69e1f79ce44fb81728c92ac378f70892a53af8ddb"}, + {file = "narwhals-2.0.1.tar.gz", hash = "sha256:235e61ca807bc21110ca36a4d53888ecc22c42dcdf50a7c886e10dde3fd7f38c"}, ] +[package.extras] +cudf = ["cudf (>=24.10.0)"] +dask = ["dask[dataframe] (>=2024.8)"] +duckdb = ["duckdb (>=1.0)"] +ibis = ["ibis-framework (>=6.0.0)", "packaging", "pyarrow-hotfix", "rich"] +modin = ["modin"] +pandas = ["pandas (>=1.1.3)"] +polars = ["polars (>=0.20.4)"] +pyarrow = ["pyarrow (>=13.0.0)"] +pyspark = ["pyspark (>=3.5.0)"] +pyspark-connect = ["pyspark[connect] (>=3.5.0)"] +sqlframe = ["sqlframe (>=3.22.0)"] + [[package]] -name = "option" -version = "2.1.0" -description = "Rust like Option and Result types in Python" +name = "nodeenv" +version = "1.9.1" +description = "Node.js virtual environment builder" optional = false -python-versions = ">=3.7,<4" -groups = ["main"] +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] files = [ - {file = "option-2.1.0-py3-none-any.whl", hash = "sha256:21ccd9a437dbee0341700367efb68e82065fd7a7dba09f8c3263cf2dc1a2b0e0"}, - {file = "option-2.1.0.tar.gz", hash = "sha256:9fe95a231e54724d2382a5124b55cd84b82339edf1d4e88d6977cedffbfeadf1"}, + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, ] [[package]] name = "packaging" -version = "24.0" +version = "25.0" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" -groups = ["dev"] +python-versions = ">=3.8" +groups = ["main", "dev"] files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, + {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, ] [[package]] @@ -749,87 +953,91 @@ files = [ [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.3.8" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, + {file = "platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"}, + {file = "platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.4)", "pytest-cov (>=6)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.14.1)"] [[package]] name = "pluggy" -version = "1.5.0" +version = "1.6.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, - {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, + {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, + {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, ] [package.extras] dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] +testing = ["coverage", "pytest", "pytest-benchmark"] [[package]] name = "polars" -version = "0.20.30" +version = "1.32.0" description = "Blazingly fast DataFrame library" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "polars-0.20.30-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:7802cb8a6d3fa0fadf446bf19b61ef8450b81229766f1817980bc6e0b2488c03"}, - {file = "polars-0.20.30-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:0d7278f6e12e6623c8ee6e637d866b96b69f960b358125c955ac76abeb942192"}, - {file = "polars-0.20.30-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:510f708332a0e0d563a5bac266c11ccd12932606c7331bf28f7173cf669d0c69"}, - {file = "polars-0.20.30-cp38-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:70d58b89cf9902fb5c3506afef76c5c2b247581d0991b082bcdc6d73d983aa2b"}, - {file = "polars-0.20.30-cp38-abi3-win_amd64.whl", hash = "sha256:039c84f7a294aa71438048e14899d59ce005f213872e27fe6bf6ce3ae8730d7d"}, - {file = "polars-0.20.30.tar.gz", hash = "sha256:b9fd2c6b5100caa7c26496ce17ec289cae23c2db6c41713bc52c54c76d4451ae"}, + {file = "polars-1.32.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:94f7c6a3b30bc99bc6b682ea42bb1ae983e33a302ca21aacbac50ae19e34fcf2"}, + {file = "polars-1.32.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:8bf14c16164839e62c741a863942a94a9a463db21e797452fca996c8afaf8827"}, + {file = "polars-1.32.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4c15adb97d44766d30c759f5cebbdb64d361e8349ef10b5afc7413f71bf4b72"}, + {file = "polars-1.32.0-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:13af55890734f89b76016a395fb2e7460e7d9feecf50ed2f55cf0f05a1c0c991"}, + {file = "polars-1.32.0-cp39-abi3-win_amd64.whl", hash = "sha256:0397fc2501a5d5f1bb3fe8d27e0c26c7a5349b4110157c0fb7833cd3f5921c9e"}, + {file = "polars-1.32.0-cp39-abi3-win_arm64.whl", hash = "sha256:dd84e24422509e1ec9be46f67f758d0bd9944d1ae4eacecee4f53adaa8ecd822"}, + {file = "polars-1.32.0.tar.gz", hash = "sha256:b01045981c0f23eeccfbfc870b782f93e73b74b29212fdfc8aae0be9024bc1fb"}, ] [package.extras] -adbc = ["adbc-driver-manager", "adbc-driver-sqlite"] -all = ["polars[adbc,async,cloudpickle,connectorx,deltalake,fastexcel,fsspec,gevent,iceberg,numpy,pandas,plot,pyarrow,pydantic,sqlalchemy,timezone,xlsx2csv,xlsxwriter]"] -async = ["nest-asyncio"] +adbc = ["adbc-driver-manager[dbapi]", "adbc-driver-sqlite[dbapi]"] +all = ["polars[async,cloudpickle,database,deltalake,excel,fsspec,graph,iceberg,numpy,pandas,plot,pyarrow,pydantic,style,timezone]"] +async = ["gevent"] +calamine = ["fastexcel (>=0.9)"] cloudpickle = ["cloudpickle"] connectorx = ["connectorx (>=0.3.2)"] -deltalake = ["deltalake (>=0.15.0)"] -fastexcel = ["fastexcel (>=0.9)"] +database = ["polars[adbc,connectorx,sqlalchemy]"] +deltalake = ["deltalake (>=1.0.0)"] +excel = ["polars[calamine,openpyxl,xlsx2csv,xlsxwriter]"] fsspec = ["fsspec"] -gevent = ["gevent"] -iceberg = ["pyiceberg (>=0.5.0)"] -matplotlib = ["matplotlib"] +gpu = ["cudf-polars-cu12"] +graph = ["matplotlib"] +iceberg = ["pyiceberg (>=0.7.1)"] numpy = ["numpy (>=1.16.0)"] openpyxl = ["openpyxl (>=3.0.0)"] -pandas = ["pandas", "pyarrow (>=7.0.0)"] -plot = ["hvplot (>=0.9.1)"] +pandas = ["pandas", "polars[pyarrow]"] +plot = ["altair (>=5.4.0)"] +polars-cloud = ["polars-cloud (>=0.0.1a1)"] pyarrow = ["pyarrow (>=7.0.0)"] pydantic = ["pydantic"] -pyxlsb = ["pyxlsb (>=1.0)"] -sqlalchemy = ["pandas", "sqlalchemy"] -timezone = ["backports-zoneinfo ; python_version < \"3.9\"", "tzdata ; platform_system == \"Windows\""] +sqlalchemy = ["polars[pandas]", "sqlalchemy"] +style = ["great-tables (>=0.8.0)"] +timezone = ["tzdata ; platform_system == \"Windows\""] xlsx2csv = ["xlsx2csv (>=0.8.0)"] xlsxwriter = ["xlsxwriter"] [[package]] name = "pre-commit" -version = "3.7.1" +version = "3.8.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pre_commit-3.7.1-py2.py3-none-any.whl", hash = "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5"}, - {file = "pre_commit-3.7.1.tar.gz", hash = "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a"}, + {file = "pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f"}, + {file = "pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af"}, ] [package.dependencies] @@ -853,111 +1061,133 @@ files = [ [[package]] name = "pydantic" -version = "2.7.2" +version = "2.11.7" description = "Data validation using Python type hints" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "pydantic-2.7.2-py3-none-any.whl", hash = "sha256:834ab954175f94e6e68258537dc49402c4a5e9d0409b9f1b86b7e934a8372de7"}, - {file = "pydantic-2.7.2.tar.gz", hash = "sha256:71b2945998f9c9b7919a45bde9a50397b289937d215ae141c1d0903ba7149fd7"}, + {file = "pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b"}, + {file = "pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db"}, ] [package.dependencies] -annotated-types = ">=0.4.0" -pydantic-core = "2.18.3" -typing-extensions = ">=4.6.1" +annotated-types = ">=0.6.0" +pydantic-core = "2.33.2" +typing-extensions = ">=4.12.2" +typing-inspection = ">=0.4.0" [package.extras] email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] [[package]] name = "pydantic-core" -version = "2.18.3" +version = "2.33.2" description = "Core functionality for Pydantic validation and serialization" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "pydantic_core-2.18.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:744697428fcdec6be5670460b578161d1ffe34743a5c15656be7ea82b008197c"}, - {file = "pydantic_core-2.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b40c05ced1ba4218b14986fe6f283d22e1ae2ff4c8e28881a70fb81fbfcda7"}, - {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:544a9a75622357076efb6b311983ff190fbfb3c12fc3a853122b34d3d358126c"}, - {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e2e253af04ceaebde8eb201eb3f3e3e7e390f2d275a88300d6a1959d710539e2"}, - {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:855ec66589c68aa367d989da5c4755bb74ee92ccad4fdb6af942c3612c067e34"}, - {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d3e42bb54e7e9d72c13ce112e02eb1b3b55681ee948d748842171201a03a98a"}, - {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6ac9ffccc9d2e69d9fba841441d4259cb668ac180e51b30d3632cd7abca2b9b"}, - {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c56eca1686539fa0c9bda992e7bd6a37583f20083c37590413381acfc5f192d6"}, - {file = "pydantic_core-2.18.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:17954d784bf8abfc0ec2a633108207ebc4fa2df1a0e4c0c3ccbaa9bb01d2c426"}, - {file = "pydantic_core-2.18.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:98ed737567d8f2ecd54f7c8d4f8572ca7c7921ede93a2e52939416170d357812"}, - {file = "pydantic_core-2.18.3-cp310-none-win32.whl", hash = "sha256:9f9e04afebd3ed8c15d67a564ed0a34b54e52136c6d40d14c5547b238390e779"}, - {file = "pydantic_core-2.18.3-cp310-none-win_amd64.whl", hash = "sha256:45e4ffbae34f7ae30d0047697e724e534a7ec0a82ef9994b7913a412c21462a0"}, - {file = "pydantic_core-2.18.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b9ebe8231726c49518b16b237b9fe0d7d361dd221302af511a83d4ada01183ab"}, - {file = "pydantic_core-2.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b8e20e15d18bf7dbb453be78a2d858f946f5cdf06c5072453dace00ab652e2b2"}, - {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0d9ff283cd3459fa0bf9b0256a2b6f01ac1ff9ffb034e24457b9035f75587cb"}, - {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f7ef5f0ebb77ba24c9970da18b771711edc5feaf00c10b18461e0f5f5949231"}, - {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73038d66614d2e5cde30435b5afdced2b473b4c77d4ca3a8624dd3e41a9c19be"}, - {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6afd5c867a74c4d314c557b5ea9520183fadfbd1df4c2d6e09fd0d990ce412cd"}, - {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd7df92f28d351bb9f12470f4c533cf03d1b52ec5a6e5c58c65b183055a60106"}, - {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:80aea0ffeb1049336043d07799eace1c9602519fb3192916ff525b0287b2b1e4"}, - {file = "pydantic_core-2.18.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaee40f25bba38132e655ffa3d1998a6d576ba7cf81deff8bfa189fb43fd2bbe"}, - {file = "pydantic_core-2.18.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9128089da8f4fe73f7a91973895ebf2502539d627891a14034e45fb9e707e26d"}, - {file = "pydantic_core-2.18.3-cp311-none-win32.whl", hash = "sha256:fec02527e1e03257aa25b1a4dcbe697b40a22f1229f5d026503e8b7ff6d2eda7"}, - {file = "pydantic_core-2.18.3-cp311-none-win_amd64.whl", hash = "sha256:58ff8631dbab6c7c982e6425da8347108449321f61fe427c52ddfadd66642af7"}, - {file = "pydantic_core-2.18.3-cp311-none-win_arm64.whl", hash = "sha256:3fc1c7f67f34c6c2ef9c213e0f2a351797cda98249d9ca56a70ce4ebcaba45f4"}, - {file = "pydantic_core-2.18.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f0928cde2ae416a2d1ebe6dee324709c6f73e93494d8c7aea92df99aab1fc40f"}, - {file = "pydantic_core-2.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0bee9bb305a562f8b9271855afb6ce00223f545de3d68560b3c1649c7c5295e9"}, - {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e862823be114387257dacbfa7d78547165a85d7add33b446ca4f4fae92c7ff5c"}, - {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6a36f78674cbddc165abab0df961b5f96b14461d05feec5e1f78da58808b97e7"}, - {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba905d184f62e7ddbb7a5a751d8a5c805463511c7b08d1aca4a3e8c11f2e5048"}, - {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fdd362f6a586e681ff86550b2379e532fee63c52def1c666887956748eaa326"}, - {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24b214b7ee3bd3b865e963dbed0f8bc5375f49449d70e8d407b567af3222aae4"}, - {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:691018785779766127f531674fa82bb368df5b36b461622b12e176c18e119022"}, - {file = "pydantic_core-2.18.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:60e4c625e6f7155d7d0dcac151edf5858102bc61bf959d04469ca6ee4e8381bd"}, - {file = "pydantic_core-2.18.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4e651e47d981c1b701dcc74ab8fec5a60a5b004650416b4abbef13db23bc7be"}, - {file = "pydantic_core-2.18.3-cp312-none-win32.whl", hash = "sha256:ffecbb5edb7f5ffae13599aec33b735e9e4c7676ca1633c60f2c606beb17efc5"}, - {file = "pydantic_core-2.18.3-cp312-none-win_amd64.whl", hash = "sha256:2c8333f6e934733483c7eddffdb094c143b9463d2af7e6bd85ebcb2d4a1b82c6"}, - {file = "pydantic_core-2.18.3-cp312-none-win_arm64.whl", hash = "sha256:7a20dded653e516a4655f4c98e97ccafb13753987434fe7cf044aa25f5b7d417"}, - {file = "pydantic_core-2.18.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:eecf63195be644b0396f972c82598cd15693550f0ff236dcf7ab92e2eb6d3522"}, - {file = "pydantic_core-2.18.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c44efdd3b6125419c28821590d7ec891c9cb0dff33a7a78d9d5c8b6f66b9702"}, - {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e59fca51ffbdd1638b3856779342ed69bcecb8484c1d4b8bdb237d0eb5a45e2"}, - {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:70cf099197d6b98953468461d753563b28e73cf1eade2ffe069675d2657ed1d5"}, - {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63081a49dddc6124754b32a3774331467bfc3d2bd5ff8f10df36a95602560361"}, - {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:370059b7883485c9edb9655355ff46d912f4b03b009d929220d9294c7fd9fd60"}, - {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a64faeedfd8254f05f5cf6fc755023a7e1606af3959cfc1a9285744cc711044"}, - {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19d2e725de0f90d8671f89e420d36c3dd97639b98145e42fcc0e1f6d492a46dc"}, - {file = "pydantic_core-2.18.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:67bc078025d70ec5aefe6200ef094576c9d86bd36982df1301c758a9fff7d7f4"}, - {file = "pydantic_core-2.18.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:adf952c3f4100e203cbaf8e0c907c835d3e28f9041474e52b651761dc248a3c0"}, - {file = "pydantic_core-2.18.3-cp38-none-win32.whl", hash = "sha256:9a46795b1f3beb167eaee91736d5d17ac3a994bf2215a996aed825a45f897558"}, - {file = "pydantic_core-2.18.3-cp38-none-win_amd64.whl", hash = "sha256:200ad4e3133cb99ed82342a101a5abf3d924722e71cd581cc113fe828f727fbc"}, - {file = "pydantic_core-2.18.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:304378b7bf92206036c8ddd83a2ba7b7d1a5b425acafff637172a3aa72ad7083"}, - {file = "pydantic_core-2.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c826870b277143e701c9ccf34ebc33ddb4d072612683a044e7cce2d52f6c3fef"}, - {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e201935d282707394f3668380e41ccf25b5794d1b131cdd96b07f615a33ca4b1"}, - {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5560dda746c44b48bf82b3d191d74fe8efc5686a9ef18e69bdabccbbb9ad9442"}, - {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b32c2a1f8032570842257e4c19288eba9a2bba4712af542327de9a1204faff8"}, - {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:929c24e9dea3990bc8bcd27c5f2d3916c0c86f5511d2caa69e0d5290115344a9"}, - {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a8376fef60790152564b0eab376b3e23dd6e54f29d84aad46f7b264ecca943"}, - {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dccf3ef1400390ddd1fb55bf0632209d39140552d068ee5ac45553b556780e06"}, - {file = "pydantic_core-2.18.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:41dbdcb0c7252b58fa931fec47937edb422c9cb22528f41cb8963665c372caf6"}, - {file = "pydantic_core-2.18.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:666e45cf071669fde468886654742fa10b0e74cd0fa0430a46ba6056b24fb0af"}, - {file = "pydantic_core-2.18.3-cp39-none-win32.whl", hash = "sha256:f9c08cabff68704a1b4667d33f534d544b8a07b8e5d039c37067fceb18789e78"}, - {file = "pydantic_core-2.18.3-cp39-none-win_amd64.whl", hash = "sha256:4afa5f5973e8572b5c0dcb4e2d4fda7890e7cd63329bd5cc3263a25c92ef0026"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:77319771a026f7c7d29c6ebc623de889e9563b7087911b46fd06c044a12aa5e9"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:df11fa992e9f576473038510d66dd305bcd51d7dd508c163a8c8fe148454e059"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d531076bdfb65af593326ffd567e6ab3da145020dafb9187a1d131064a55f97c"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d33ce258e4e6e6038f2b9e8b8a631d17d017567db43483314993b3ca345dcbbb"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1f9cd7f5635b719939019be9bda47ecb56e165e51dd26c9a217a433e3d0d59a9"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cd4a032bb65cc132cae1fe3e52877daecc2097965cd3914e44fbd12b00dae7c5"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f2718430098bcdf60402136c845e4126a189959d103900ebabb6774a5d9fdb"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c0037a92cf0c580ed14e10953cdd26528e8796307bb8bb312dc65f71547df04d"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b95a0972fac2b1ff3c94629fc9081b16371dad870959f1408cc33b2f78ad347a"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a62e437d687cc148381bdd5f51e3e81f5b20a735c55f690c5be94e05da2b0d5c"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b367a73a414bbb08507da102dc2cde0fa7afe57d09b3240ce82a16d608a7679c"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ecce4b2360aa3f008da3327d652e74a0e743908eac306198b47e1c58b03dd2b"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bd4435b8d83f0c9561a2a9585b1de78f1abb17cb0cef5f39bf6a4b47d19bafe3"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:616221a6d473c5b9aa83fa8982745441f6a4a62a66436be9445c65f241b86c94"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7e6382ce89a92bc1d0c0c5edd51e931432202b9080dc921d8d003e616402efd1"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff58f379345603d940e461eae474b6bbb6dab66ed9a851ecd3cb3709bf4dcf6a"}, - {file = "pydantic_core-2.18.3.tar.gz", hash = "sha256:432e999088d85c8f36b9a3f769a8e2b57aabd817bbb729a90d1fe7f18f6f1f39"}, + {file = "pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8"}, + {file = "pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b"}, + {file = "pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22"}, + {file = "pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640"}, + {file = "pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7"}, + {file = "pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65"}, + {file = "pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc"}, + {file = "pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab"}, + {file = "pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f"}, + {file = "pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d"}, + {file = "pydantic_core-2.33.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e"}, + {file = "pydantic_core-2.33.2-cp39-cp39-win32.whl", hash = "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-win_amd64.whl", hash = "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27"}, + {file = "pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc"}, ] [package.dependencies] @@ -965,34 +1195,33 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pygithub" -version = "2.3.0" +version = "2.7.0" description = "Use the full Github API v3" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" groups = ["main"] files = [ - {file = "PyGithub-2.3.0-py3-none-any.whl", hash = "sha256:65b499728be3ce7b0cd2cd760da3b32f0f4d7bc55e5e0677617f90f6564e793e"}, - {file = "PyGithub-2.3.0.tar.gz", hash = "sha256:0148d7347a1cdeed99af905077010aef81a4dad988b0ba51d4108bf66b443f7e"}, + {file = "pygithub-2.7.0-py3-none-any.whl", hash = "sha256:40ecbfe26dc55cc34ab4b0ffa1d455e6f816ef9a2bc8d6f5ad18ce572f163700"}, + {file = "pygithub-2.7.0.tar.gz", hash = "sha256:7cd6eafabb09b5369afba3586d86b1f1ad6f1326d2ff01bc47bb26615dce4cbb"}, ] [package.dependencies] -Deprecated = "*" pyjwt = {version = ">=2.4.0", extras = ["crypto"]} pynacl = ">=1.4.0" requests = ">=2.14.0" -typing-extensions = ">=4.0.0" +typing-extensions = ">=4.5.0" urllib3 = ">=1.26.0" [[package]] name = "pygments" -version = "2.18.0" +version = "2.19.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, - {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, + {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, + {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, ] [package.extras] @@ -1000,14 +1229,14 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyjwt" -version = "2.8.0" +version = "2.10.1" description = "JSON Web Token implementation in Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, - {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, + {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, + {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, ] [package.dependencies] @@ -1015,8 +1244,8 @@ cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"cryp [package.extras] crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] @@ -1048,22 +1277,22 @@ tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] [[package]] name = "pyproject-api" -version = "1.6.1" +version = "1.9.1" description = "API to interact with the python pyproject.toml based projects" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pyproject_api-1.6.1-py3-none-any.whl", hash = "sha256:4c0116d60476b0786c88692cf4e325a9814965e2469c5998b830bba16b183675"}, - {file = "pyproject_api-1.6.1.tar.gz", hash = "sha256:1817dc018adc0d1ff9ca1ed8c60e1623d5aaca40814b953af14a9cf9a5cae538"}, + {file = "pyproject_api-1.9.1-py3-none-any.whl", hash = "sha256:7d6238d92f8962773dd75b5f0c4a6a27cce092a14b623b811dba656f3b628948"}, + {file = "pyproject_api-1.9.1.tar.gz", hash = "sha256:43c9918f49daab37e302038fc1aed54a8c7a91a9fa935d00b9a485f37e0f5335"}, ] [package.dependencies] -packaging = ">=23.1" +packaging = ">=25" [package.extras] -docs = ["furo (>=2023.8.19)", "sphinx (<7.2)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "setuptools (>=68.1.2)", "wheel (>=0.41.2)"] +docs = ["furo (>=2024.8.6)", "sphinx-autodoc-typehints (>=3.2)"] +testing = ["covdefaults (>=2.3)", "pytest (>=8.3.5)", "pytest-cov (>=6.1.1)", "pytest-mock (>=3.14)", "setuptools (>=80.3.1)"] [[package]] name = "pytest" @@ -1105,16 +1334,35 @@ pytest = ">=4.6" [package.extras] testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] +[[package]] +name = "python-frontmatter" +version = "1.1.0" +description = "Parse and manage posts with YAML (or other) frontmatter" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "python-frontmatter-1.1.0.tar.gz", hash = "sha256:7118d2bd56af9149625745c58c9b51fb67e8d1294a0c76796dafdc72c36e5f6d"}, + {file = "python_frontmatter-1.1.0-py3-none-any.whl", hash = "sha256:335465556358d9d0e6c98bbeb69b1c969f2a4a21360587b9873bfc3b213407c1"}, +] + +[package.dependencies] +PyYAML = "*" + +[package.extras] +docs = ["sphinx"] +test = ["mypy", "pyaml", "pytest", "toml", "types-PyYAML", "types-toml"] + [[package]] name = "python-gitlab" -version = "4.6.0" -description = "A python wrapper for the GitLab API" +version = "6.2.0" +description = "The python wrapper for the GitLab REST and GraphQL APIs." optional = false -python-versions = ">=3.8.0" +python-versions = ">=3.9.0" groups = ["main"] files = [ - {file = "python_gitlab-4.6.0-py3-none-any.whl", hash = "sha256:b22e54344706851815ae5395f5f8f6503f9d3ef180e99ac9fc2ea66f59912a56"}, - {file = "python_gitlab-4.6.0.tar.gz", hash = "sha256:b56ae363890374caede853ef552e92c41551d605800de1c64ba61bcf25f237b0"}, + {file = "python_gitlab-6.2.0-py3-none-any.whl", hash = "sha256:8adf2bbf1ac8a5224ee04a456d318da0d15128606711e8c8e1a2ff050968432b"}, + {file = "python_gitlab-6.2.0.tar.gz", hash = "sha256:b88c79cea65dd2425922c829730ea95827ed7132d869b8532b90a8c7199cc1a6"}, ] [package.dependencies] @@ -1123,83 +1371,104 @@ requests-toolbelt = ">=1.0.0" [package.extras] autocompletion = ["argcomplete (>=1.10.0,<3)"] +graphql = ["gql[httpx] (>=3.5.0,<4)"] yaml = ["PyYaml (>=6.0.1)"] [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" groups = ["main", "dev"] files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "referencing" +version = "0.36.2" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, + {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, ] +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" +typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""} + [[package]] name = "requests" -version = "2.32.3" +version = "2.32.4" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, + {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, + {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, ] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" +charset_normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<3" @@ -1224,14 +1493,14 @@ requests = ">=2.0.1,<3.0.0" [[package]] name = "rich" -version = "13.7.1" +version = "14.1.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.8.0" groups = ["main"] files = [ - {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, - {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, + {file = "rich-14.1.0-py3-none-any.whl", hash = "sha256:536f5f1785986d6dbdea3c75205c473f970777b4a0d6c6dd1b696aa05a3fa04f"}, + {file = "rich-14.1.0.tar.gz", hash = "sha256:e497a48b844b0320d45007cdebfeaeed8db2a4f4bcf49f15e455cfc4af11eaa8"}, ] [package.dependencies] @@ -1242,88 +1511,245 @@ pygments = ">=2.13.0,<3.0.0" jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] -name = "smmap" -version = "5.0.1" -description = "A pure Python implementation of a sliding window memory map manager" +name = "rpds-py" +version = "0.27.0" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "rpds_py-0.27.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:130c1ffa5039a333f5926b09e346ab335f0d4ec393b030a18549a7c7e7c2cea4"}, + {file = "rpds_py-0.27.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a4cf32a26fa744101b67bfd28c55d992cd19438aff611a46cac7f066afca8fd4"}, + {file = "rpds_py-0.27.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64a0fe3f334a40b989812de70160de6b0ec7e3c9e4a04c0bbc48d97c5d3600ae"}, + {file = "rpds_py-0.27.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a0ff7ee28583ab30a52f371b40f54e7138c52ca67f8ca17ccb7ccf0b383cb5f"}, + {file = "rpds_py-0.27.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:15ea4d2e182345dd1b4286593601d766411b43f868924afe297570658c31a62b"}, + {file = "rpds_py-0.27.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36184b44bf60a480863e51021c26aca3dfe8dd2f5eeabb33622b132b9d8b8b54"}, + {file = "rpds_py-0.27.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b78430703cfcf5f5e86eb74027a1ed03a93509273d7c705babb547f03e60016"}, + {file = "rpds_py-0.27.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:dbd749cff1defbde270ca346b69b3baf5f1297213ef322254bf2a28537f0b046"}, + {file = "rpds_py-0.27.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bde37765564cd22a676dd8101b657839a1854cfaa9c382c5abf6ff7accfd4ae"}, + {file = "rpds_py-0.27.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1d66f45b9399036e890fb9c04e9f70c33857fd8f58ac8db9f3278cfa835440c3"}, + {file = "rpds_py-0.27.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d85d784c619370d9329bbd670f41ff5f2ae62ea4519761b679d0f57f0f0ee267"}, + {file = "rpds_py-0.27.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5df559e9e7644d9042f626f2c3997b555f347d7a855a15f170b253f6c5bfe358"}, + {file = "rpds_py-0.27.0-cp310-cp310-win32.whl", hash = "sha256:b8a4131698b6992b2a56015f51646711ec5d893a0b314a4b985477868e240c87"}, + {file = "rpds_py-0.27.0-cp310-cp310-win_amd64.whl", hash = "sha256:cbc619e84a5e3ab2d452de831c88bdcad824414e9c2d28cd101f94dbdf26329c"}, + {file = "rpds_py-0.27.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:dbc2ab5d10544eb485baa76c63c501303b716a5c405ff2469a1d8ceffaabf622"}, + {file = "rpds_py-0.27.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7ec85994f96a58cf7ed288caa344b7fe31fd1d503bdf13d7331ead5f70ab60d5"}, + {file = "rpds_py-0.27.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:190d7285cd3bb6d31d37a0534d7359c1ee191eb194c511c301f32a4afa5a1dd4"}, + {file = "rpds_py-0.27.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c10d92fb6d7fd827e44055fcd932ad93dac6a11e832d51534d77b97d1d85400f"}, + {file = "rpds_py-0.27.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd2c1d27ebfe6a015cfa2005b7fe8c52d5019f7bbdd801bc6f7499aab9ae739e"}, + {file = "rpds_py-0.27.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4790c9d5dd565ddb3e9f656092f57268951398cef52e364c405ed3112dc7c7c1"}, + {file = "rpds_py-0.27.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4300e15e7d03660f04be84a125d1bdd0e6b2f674bc0723bc0fd0122f1a4585dc"}, + {file = "rpds_py-0.27.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:59195dc244fc183209cf8a93406889cadde47dfd2f0a6b137783aa9c56d67c85"}, + {file = "rpds_py-0.27.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fae4a01ef8c4cb2bbe92ef2063149596907dc4a881a8d26743b3f6b304713171"}, + {file = "rpds_py-0.27.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e3dc8d4ede2dbae6c0fc2b6c958bf51ce9fd7e9b40c0f5b8835c3fde44f5807d"}, + {file = "rpds_py-0.27.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c3782fb753aa825b4ccabc04292e07897e2fd941448eabf666856c5530277626"}, + {file = "rpds_py-0.27.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:887ab1f12b0d227e9260558a4a2320024b20102207ada65c43e1ffc4546df72e"}, + {file = "rpds_py-0.27.0-cp311-cp311-win32.whl", hash = "sha256:5d6790ff400254137b81b8053b34417e2c46921e302d655181d55ea46df58cf7"}, + {file = "rpds_py-0.27.0-cp311-cp311-win_amd64.whl", hash = "sha256:e24d8031a2c62f34853756d9208eeafa6b940a1efcbfe36e8f57d99d52bb7261"}, + {file = "rpds_py-0.27.0-cp311-cp311-win_arm64.whl", hash = "sha256:08680820d23df1df0a0260f714d12966bc6c42d02e8055a91d61e03f0c47dda0"}, + {file = "rpds_py-0.27.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:19c990fdf5acecbf0623e906ae2e09ce1c58947197f9bced6bbd7482662231c4"}, + {file = "rpds_py-0.27.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6c27a7054b5224710fcfb1a626ec3ff4f28bcb89b899148c72873b18210e446b"}, + {file = "rpds_py-0.27.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09965b314091829b378b60607022048953e25f0b396c2b70e7c4c81bcecf932e"}, + {file = "rpds_py-0.27.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:14f028eb47f59e9169bfdf9f7ceafd29dd64902141840633683d0bad5b04ff34"}, + {file = "rpds_py-0.27.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6168af0be75bba990a39f9431cdfae5f0ad501f4af32ae62e8856307200517b8"}, + {file = "rpds_py-0.27.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab47fe727c13c09d0e6f508e3a49e545008e23bf762a245b020391b621f5b726"}, + {file = "rpds_py-0.27.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa01b3d5e3b7d97efab65bd3d88f164e289ec323a8c033c5c38e53ee25c007e"}, + {file = "rpds_py-0.27.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:6c135708e987f46053e0a1246a206f53717f9fadfba27174a9769ad4befba5c3"}, + {file = "rpds_py-0.27.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc327f4497b7087d06204235199daf208fd01c82d80465dc5efa4ec9df1c5b4e"}, + {file = "rpds_py-0.27.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7e57906e38583a2cba67046a09c2637e23297618dc1f3caddbc493f2be97c93f"}, + {file = "rpds_py-0.27.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f4f69d7a4300fbf91efb1fb4916421bd57804c01ab938ab50ac9c4aa2212f03"}, + {file = "rpds_py-0.27.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b4c4fbbcff474e1e5f38be1bf04511c03d492d42eec0babda5d03af3b5589374"}, + {file = "rpds_py-0.27.0-cp312-cp312-win32.whl", hash = "sha256:27bac29bbbf39601b2aab474daf99dbc8e7176ca3389237a23944b17f8913d97"}, + {file = "rpds_py-0.27.0-cp312-cp312-win_amd64.whl", hash = "sha256:8a06aa1197ec0281eb1d7daf6073e199eb832fe591ffa329b88bae28f25f5fe5"}, + {file = "rpds_py-0.27.0-cp312-cp312-win_arm64.whl", hash = "sha256:e14aab02258cb776a108107bd15f5b5e4a1bbaa61ef33b36693dfab6f89d54f9"}, + {file = "rpds_py-0.27.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:443d239d02d9ae55b74015234f2cd8eb09e59fbba30bf60baeb3123ad4c6d5ff"}, + {file = "rpds_py-0.27.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b8a7acf04fda1f30f1007f3cc96d29d8cf0a53e626e4e1655fdf4eabc082d367"}, + {file = "rpds_py-0.27.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d0f92b78cfc3b74a42239fdd8c1266f4715b573204c234d2f9fc3fc7a24f185"}, + {file = "rpds_py-0.27.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ce4ed8e0c7dbc5b19352b9c2c6131dd23b95fa8698b5cdd076307a33626b72dc"}, + {file = "rpds_py-0.27.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fde355b02934cc6b07200cc3b27ab0c15870a757d1a72fd401aa92e2ea3c6bfe"}, + {file = "rpds_py-0.27.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13bbc4846ae4c993f07c93feb21a24d8ec637573d567a924b1001e81c8ae80f9"}, + {file = "rpds_py-0.27.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be0744661afbc4099fef7f4e604e7f1ea1be1dd7284f357924af12a705cc7d5c"}, + {file = "rpds_py-0.27.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:069e0384a54f427bd65d7fda83b68a90606a3835901aaff42185fcd94f5a9295"}, + {file = "rpds_py-0.27.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4bc262ace5a1a7dc3e2eac2fa97b8257ae795389f688b5adf22c5db1e2431c43"}, + {file = "rpds_py-0.27.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2fe6e18e5c8581f0361b35ae575043c7029d0a92cb3429e6e596c2cdde251432"}, + {file = "rpds_py-0.27.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d93ebdb82363d2e7bec64eecdc3632b59e84bd270d74fe5be1659f7787052f9b"}, + {file = "rpds_py-0.27.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0954e3a92e1d62e83a54ea7b3fdc9efa5d61acef8488a8a3d31fdafbfb00460d"}, + {file = "rpds_py-0.27.0-cp313-cp313-win32.whl", hash = "sha256:2cff9bdd6c7b906cc562a505c04a57d92e82d37200027e8d362518df427f96cd"}, + {file = "rpds_py-0.27.0-cp313-cp313-win_amd64.whl", hash = "sha256:dc79d192fb76fc0c84f2c58672c17bbbc383fd26c3cdc29daae16ce3d927e8b2"}, + {file = "rpds_py-0.27.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b3a5c8089eed498a3af23ce87a80805ff98f6ef8f7bdb70bd1b7dae5105f6ac"}, + {file = "rpds_py-0.27.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:90fb790138c1a89a2e58c9282fe1089638401f2f3b8dddd758499041bc6e0774"}, + {file = "rpds_py-0.27.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:010c4843a3b92b54373e3d2291a7447d6c3fc29f591772cc2ea0e9f5c1da434b"}, + {file = "rpds_py-0.27.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9ce7a9e967afc0a2af7caa0d15a3e9c1054815f73d6a8cb9225b61921b419bd"}, + {file = "rpds_py-0.27.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aa0bf113d15e8abdfee92aa4db86761b709a09954083afcb5bf0f952d6065fdb"}, + {file = "rpds_py-0.27.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb91d252b35004a84670dfeafadb042528b19842a0080d8b53e5ec1128e8f433"}, + {file = "rpds_py-0.27.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db8a6313dbac934193fc17fe7610f70cd8181c542a91382531bef5ed785e5615"}, + {file = "rpds_py-0.27.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce96ab0bdfcef1b8c371ada2100767ace6804ea35aacce0aef3aeb4f3f499ca8"}, + {file = "rpds_py-0.27.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:7451ede3560086abe1aa27dcdcf55cd15c96b56f543fb12e5826eee6f721f858"}, + {file = "rpds_py-0.27.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:32196b5a99821476537b3f7732432d64d93a58d680a52c5e12a190ee0135d8b5"}, + {file = "rpds_py-0.27.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a029be818059870664157194e46ce0e995082ac49926f1423c1f058534d2aaa9"}, + {file = "rpds_py-0.27.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3841f66c1ffdc6cebce8aed64e36db71466f1dc23c0d9a5592e2a782a3042c79"}, + {file = "rpds_py-0.27.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:42894616da0fc0dcb2ec08a77896c3f56e9cb2f4b66acd76fc8992c3557ceb1c"}, + {file = "rpds_py-0.27.0-cp313-cp313t-win32.whl", hash = "sha256:b1fef1f13c842a39a03409e30ca0bf87b39a1e2a305a9924deadb75a43105d23"}, + {file = "rpds_py-0.27.0-cp313-cp313t-win_amd64.whl", hash = "sha256:183f5e221ba3e283cd36fdfbe311d95cd87699a083330b4f792543987167eff1"}, + {file = "rpds_py-0.27.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:f3cd110e02c5bf17d8fb562f6c9df5c20e73029d587cf8602a2da6c5ef1e32cb"}, + {file = "rpds_py-0.27.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8d0e09cf4863c74106b5265c2c310f36146e2b445ff7b3018a56799f28f39f6f"}, + {file = "rpds_py-0.27.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f689ab822f9b5eb6dfc69893b4b9366db1d2420f7db1f6a2adf2a9ca15ad64"}, + {file = "rpds_py-0.27.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e36c80c49853b3ffda7aa1831bf175c13356b210c73128c861f3aa93c3cc4015"}, + {file = "rpds_py-0.27.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6de6a7f622860af0146cb9ee148682ff4d0cea0b8fd3ad51ce4d40efb2f061d0"}, + {file = "rpds_py-0.27.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4045e2fc4b37ec4b48e8907a5819bdd3380708c139d7cc358f03a3653abedb89"}, + {file = "rpds_py-0.27.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9da162b718b12c4219eeeeb68a5b7552fbc7aadedf2efee440f88b9c0e54b45d"}, + {file = "rpds_py-0.27.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:0665be515767dc727ffa5f74bd2ef60b0ff85dad6bb8f50d91eaa6b5fb226f51"}, + {file = "rpds_py-0.27.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:203f581accef67300a942e49a37d74c12ceeef4514874c7cede21b012613ca2c"}, + {file = "rpds_py-0.27.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7873b65686a6471c0037139aa000d23fe94628e0daaa27b6e40607c90e3f5ec4"}, + {file = "rpds_py-0.27.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:249ab91ceaa6b41abc5f19513cb95b45c6f956f6b89f1fe3d99c81255a849f9e"}, + {file = "rpds_py-0.27.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d2f184336bc1d6abfaaa1262ed42739c3789b1e3a65a29916a615307d22ffd2e"}, + {file = "rpds_py-0.27.0-cp314-cp314-win32.whl", hash = "sha256:d3c622c39f04d5751408f5b801ecb527e6e0a471b367f420a877f7a660d583f6"}, + {file = "rpds_py-0.27.0-cp314-cp314-win_amd64.whl", hash = "sha256:cf824aceaeffff029ccfba0da637d432ca71ab21f13e7f6f5179cd88ebc77a8a"}, + {file = "rpds_py-0.27.0-cp314-cp314-win_arm64.whl", hash = "sha256:86aca1616922b40d8ac1b3073a1ead4255a2f13405e5700c01f7c8d29a03972d"}, + {file = "rpds_py-0.27.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:341d8acb6724c0c17bdf714319c393bb27f6d23d39bc74f94221b3e59fc31828"}, + {file = "rpds_py-0.27.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6b96b0b784fe5fd03beffff2b1533dc0d85e92bab8d1b2c24ef3a5dc8fac5669"}, + {file = "rpds_py-0.27.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c431bfb91478d7cbe368d0a699978050d3b112d7f1d440a41e90faa325557fd"}, + {file = "rpds_py-0.27.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20e222a44ae9f507d0f2678ee3dd0c45ec1e930f6875d99b8459631c24058aec"}, + {file = "rpds_py-0.27.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:184f0d7b342967f6cda94a07d0e1fae177d11d0b8f17d73e06e36ac02889f303"}, + {file = "rpds_py-0.27.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a00c91104c173c9043bc46f7b30ee5e6d2f6b1149f11f545580f5d6fdff42c0b"}, + {file = "rpds_py-0.27.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7a37dd208f0d658e0487522078b1ed68cd6bce20ef4b5a915d2809b9094b410"}, + {file = "rpds_py-0.27.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:92f3b3ec3e6008a1fe00b7c0946a170f161ac00645cde35e3c9a68c2475e8156"}, + {file = "rpds_py-0.27.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a1b3db5fae5cbce2131b7420a3f83553d4d89514c03d67804ced36161fe8b6b2"}, + {file = "rpds_py-0.27.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5355527adaa713ab693cbce7c1e0ec71682f599f61b128cf19d07e5c13c9b1f1"}, + {file = "rpds_py-0.27.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:fcc01c57ce6e70b728af02b2401c5bc853a9e14eb07deda30624374f0aebfe42"}, + {file = "rpds_py-0.27.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3001013dae10f806380ba739d40dee11db1ecb91684febb8406a87c2ded23dae"}, + {file = "rpds_py-0.27.0-cp314-cp314t-win32.whl", hash = "sha256:0f401c369186a5743694dd9fc08cba66cf70908757552e1f714bfc5219c655b5"}, + {file = "rpds_py-0.27.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8a1dca5507fa1337f75dcd5070218b20bc68cf8844271c923c1b79dfcbc20391"}, + {file = "rpds_py-0.27.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e0d7151a1bd5d0a203a5008fc4ae51a159a610cb82ab0a9b2c4d80241745582e"}, + {file = "rpds_py-0.27.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:42ccc57ff99166a55a59d8c7d14f1a357b7749f9ed3584df74053fd098243451"}, + {file = "rpds_py-0.27.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e377e4cf8795cdbdff75b8f0223d7b6c68ff4fef36799d88ccf3a995a91c0112"}, + {file = "rpds_py-0.27.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:79af163a4b40bbd8cfd7ca86ec8b54b81121d3b213b4435ea27d6568bcba3e9d"}, + {file = "rpds_py-0.27.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2eff8ee57c5996b0d2a07c3601fb4ce5fbc37547344a26945dd9e5cbd1ed27a"}, + {file = "rpds_py-0.27.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7cf9bc4508efb18d8dff6934b602324eb9f8c6644749627ce001d6f38a490889"}, + {file = "rpds_py-0.27.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05284439ebe7d9f5f5a668d4d8a0a1d851d16f7d47c78e1fab968c8ad30cab04"}, + {file = "rpds_py-0.27.0-cp39-cp39-manylinux_2_31_riscv64.whl", hash = "sha256:1321bce595ad70e80f97f998db37356b2e22cf98094eba6fe91782e626da2f71"}, + {file = "rpds_py-0.27.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:737005088449ddd3b3df5a95476ee1c2c5c669f5c30eed909548a92939c0e12d"}, + {file = "rpds_py-0.27.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9b2a4e17bfd68536c3b801800941c95a1d4a06e3cada11c146093ba939d9638d"}, + {file = "rpds_py-0.27.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:dc6b0d5a1ea0318ef2def2b6a55dccf1dcaf77d605672347271ed7b829860765"}, + {file = "rpds_py-0.27.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4c3f8a0d4802df34fcdbeb3dfe3a4d8c9a530baea8fafdf80816fcaac5379d83"}, + {file = "rpds_py-0.27.0-cp39-cp39-win32.whl", hash = "sha256:699c346abc73993962cac7bb4f02f58e438840fa5458a048d3a178a7a670ba86"}, + {file = "rpds_py-0.27.0-cp39-cp39-win_amd64.whl", hash = "sha256:be806e2961cd390a89d6c3ce8c2ae34271cfcd05660f716257838bb560f1c3b6"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:46f48482c1a4748ab2773f75fffbdd1951eb59794e32788834b945da857c47a8"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:419dd9c98bcc9fb0242be89e0c6e922df333b975d4268faa90d58499fd9c9ebe"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d42a0ef2bdf6bc81e1cc2d49d12460f63c6ae1423c4f4851b828e454ccf6f1"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2e39169ac6aae06dd79c07c8a69d9da867cef6a6d7883a0186b46bb46ccfb0c3"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:935afcdea4751b0ac918047a2df3f720212892347767aea28f5b3bf7be4f27c0"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8de567dec6d451649a781633d36f5c7501711adee329d76c095be2178855b042"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:555ed147cbe8c8f76e72a4c6cd3b7b761cbf9987891b9448808148204aed74a5"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:d2cc2b34f9e1d31ce255174da82902ad75bd7c0d88a33df54a77a22f2ef421ee"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cb0702c12983be3b2fab98ead349ac63a98216d28dda6f518f52da5498a27a1b"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:ba783541be46f27c8faea5a6645e193943c17ea2f0ffe593639d906a327a9bcc"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:2406d034635d1497c596c40c85f86ecf2bf9611c1df73d14078af8444fe48031"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:dea0808153f1fbbad772669d906cddd92100277533a03845de6893cadeffc8be"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d2a81bdcfde4245468f7030a75a37d50400ac2455c3a4819d9d550c937f90ab5"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e6491658dd2569f05860bad645569145c8626ac231877b0fb2d5f9bcb7054089"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:bec77545d188f8bdd29d42bccb9191682a46fb2e655e3d1fb446d47c55ac3b8d"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a4aebf8ca02bbb90a9b3e7a463bbf3bee02ab1c446840ca07b1695a68ce424"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:44524b96481a4c9b8e6c46d6afe43fa1fb485c261e359fbe32b63ff60e3884d8"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45d04a73c54b6a5fd2bab91a4b5bc8b426949586e61340e212a8484919183859"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:343cf24de9ed6c728abefc5d5c851d5de06497caa7ac37e5e65dd572921ed1b5"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aed8118ae20515974650d08eb724150dc2e20c2814bcc307089569995e88a14"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:af9d4fd79ee1cc8e7caf693ee02737daabfc0fcf2773ca0a4735b356c8ad6f7c"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f0396e894bd1e66c74ecbc08b4f6a03dc331140942c4b1d345dd131b68574a60"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:59714ab0a5af25d723d8e9816638faf7f4254234decb7d212715c1aa71eee7be"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:88051c3b7d5325409f433c5a40328fcb0685fc04e5db49ff936e910901d10114"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:181bc29e59e5e5e6e9d63b143ff4d5191224d355e246b5a48c88ce6b35c4e466"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9ad08547995a57e74fea6abaf5940d399447935faebbd2612b3b0ca6f987946b"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:61490d57e82e23b45c66f96184237994bfafa914433b8cd1a9bb57fecfced59d"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7cf5e726b6fa977e428a61880fb108a62f28b6d0c7ef675b117eaff7076df49"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dc662bc9375a6a394b62dfd331874c434819f10ee3902123200dbcf116963f89"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:299a245537e697f28a7511d01038c310ac74e8ea213c0019e1fc65f52c0dcb23"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:be3964f7312ea05ed283b20f87cb533fdc555b2e428cc7be64612c0b2124f08c"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33ba649a6e55ae3808e4c39e01580dc9a9b0d5b02e77b66bb86ef117922b1264"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:81f81bbd7cdb4bdc418c09a73809abeda8f263a6bf8f9c7f93ed98b5597af39d"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11e8e28c0ba0373d052818b600474cfee2fafa6c9f36c8587d217b13ee28ca7d"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e3acb9c16530362aeaef4e84d57db357002dc5cbfac9a23414c3e73c08301ab2"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:2e307cb5f66c59ede95c00e93cd84190a5b7f3533d7953690b2036780622ba81"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:f09c9d4c26fa79c1bad927efb05aca2391350b8e61c38cbc0d7d3c814e463124"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:af22763a0a1eff106426a6e1f13c4582e0d0ad89c1493ab6c058236174cd6c6a"}, + {file = "rpds_py-0.27.0.tar.gz", hash = "sha256:8b23cf252f180cda89220b378d917180f29d313cd6a07b2431c0d3b776aae86f"}, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +description = "Tool to Detect Surrounding Shell" optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, - {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, + {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, + {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, ] [[package]] -name = "soupsieve" -version = "2.5" -description = "A modern CSS selector implementation for Beautiful Soup." +name = "smmap" +version = "5.0.2" +description = "A pure Python implementation of a sliding window memory map manager" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" groups = ["main"] files = [ - {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, - {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, + {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, + {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, ] [[package]] name = "tox" -version = "4.15.0" +version = "4.28.4" description = "tox is a generic virtualenv management and test command line tool" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "tox-4.15.0-py3-none-any.whl", hash = "sha256:300055f335d855b2ab1b12c5802de7f62a36d4fd53f30bd2835f6a201dda46ea"}, - {file = "tox-4.15.0.tar.gz", hash = "sha256:7a0beeef166fbe566f54f795b4906c31b428eddafc0102ac00d20998dd1933f6"}, + {file = "tox-4.28.4-py3-none-any.whl", hash = "sha256:8d4ad9ee916ebbb59272bb045e154a10fa12e3bbdcf94cc5185cbdaf9b241f99"}, + {file = "tox-4.28.4.tar.gz", hash = "sha256:b5b14c6307bd8994ff1eba5074275826620325ee1a4f61316959d562bfd70b9d"}, ] [package.dependencies] -cachetools = ">=5.3.2" +cachetools = ">=6.1" chardet = ">=5.2" colorama = ">=0.4.6" -filelock = ">=3.13.1" -packaging = ">=23.2" -platformdirs = ">=4.1" -pluggy = ">=1.3" -pyproject-api = ">=1.6.1" -virtualenv = ">=20.25" - -[package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-argparse-cli (>=1.11.1)", "sphinx-autodoc-typehints (>=1.25.2)", "sphinx-copybutton (>=0.5.2)", "sphinx-inline-tabs (>=2023.4.21)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.11)"] -testing = ["build[virtualenv] (>=1.0.3)", "covdefaults (>=2.3)", "detect-test-pollution (>=1.2)", "devpi-process (>=1)", "diff-cover (>=8.0.2)", "distlib (>=0.3.8)", "flaky (>=3.7)", "hatch-vcs (>=0.4)", "hatchling (>=1.21)", "psutil (>=5.9.7)", "pytest (>=7.4.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-xdist (>=3.5)", "re-assert (>=1.1)", "time-machine (>=2.13) ; implementation_name != \"pypy\"", "wheel (>=0.42)"] +filelock = ">=3.18" +packaging = ">=25" +platformdirs = ">=4.3.8" +pluggy = ">=1.6" +pyproject-api = ">=1.9.1" +virtualenv = ">=20.31.2" [[package]] name = "typer" -version = "0.9.4" +version = "0.16.0" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" groups = ["main"] files = [ - {file = "typer-0.9.4-py3-none-any.whl", hash = "sha256:aa6c4a4e2329d868b80ecbaf16f807f2b54e192209d7ac9dd42691d63f7a54eb"}, - {file = "typer-0.9.4.tar.gz", hash = "sha256:f714c2d90afae3a7929fcd72a3abb08df305e1ff61719381384211c4070af57f"}, + {file = "typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855"}, + {file = "typer-0.16.0.tar.gz", hash = "sha256:af377ffaee1dbe37ae9440cb4e8f11686ea5ce4e9bae01b84ae7c63b87f1dd3b"}, ] [package.dependencies] -click = ">=7.1.1,<9.0.0" +click = ">=8.0.0" +rich = ">=10.11.0" +shellingham = ">=1.3.0" typing-extensions = ">=3.7.4.3" -[package.extras] -all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] -dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] -doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"] -test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.971)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] - [[package]] name = "types-requests" -version = "2.32.0.20240523" +version = "2.32.4.20250611" description = "Typing stubs for requests" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "types-requests-2.32.0.20240523.tar.gz", hash = "sha256:26b8a6de32d9f561192b9942b41c0ab2d8010df5677ca8aa146289d11d505f57"}, - {file = "types_requests-2.32.0.20240523-py3-none-any.whl", hash = "sha256:f19ed0e2daa74302069bbbbf9e82902854ffa780bc790742a810a9aaa52f65ec"}, + {file = "types_requests-2.32.4.20250611-py3-none-any.whl", hash = "sha256:ad2fe5d3b0cb3c2c902c8815a70e7fb2302c4b8c1f77bdcd738192cdb3878072"}, + {file = "types_requests-2.32.4.20250611.tar.gz", hash = "sha256:741c8777ed6425830bf51e54d6abe245f79b4dcb9019f1622b773463946bf826"}, ] [package.dependencies] @@ -1331,26 +1757,41 @@ urllib3 = ">=2" [[package]] name = "typing-extensions" -version = "4.12.0" -description = "Backported and Experimental Type Hints for Python 3.8+" +version = "4.14.1" +description = "Backported and Experimental Type Hints for Python 3.9+" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "typing_extensions-4.12.0-py3-none-any.whl", hash = "sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594"}, - {file = "typing_extensions-4.12.0.tar.gz", hash = "sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8"}, + {file = "typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76"}, + {file = "typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36"}, ] +[[package]] +name = "typing-inspection" +version = "0.4.1" +description = "Runtime typing introspection tools" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51"}, + {file = "typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28"}, +] + +[package.dependencies] +typing-extensions = ">=4.12.0" + [[package]] name = "urllib3" -version = "2.2.2" +version = "2.5.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, + {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, ] [package.extras] @@ -1361,14 +1802,14 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.26.6" +version = "20.33.1" description = "Virtual Python Environment builder" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "virtualenv-20.26.6-py3-none-any.whl", hash = "sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2"}, - {file = "virtualenv-20.26.6.tar.gz", hash = "sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48"}, + {file = "virtualenv-20.33.1-py3-none-any.whl", hash = "sha256:07c19bc66c11acab6a5958b815cbcee30891cd1c2ccf53785a28651a0d8d8a67"}, + {file = "virtualenv-20.33.1.tar.gz", hash = "sha256:1b44478d9e261b3fb8baa5e74a0ca3bc0e05f21aa36167bf9cbf850e542765b8"}, ] [package.dependencies] @@ -1378,7 +1819,7 @@ platformdirs = ">=3.9.1,<5" [package.extras] 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)"] -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) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""] +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) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"GraalVM\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""] [[package]] name = "wget" @@ -1391,98 +1832,18 @@ files = [ {file = "wget-3.2.zip", hash = "sha256:35e630eca2aa50ce998b9b1a127bb26b30dfee573702782aa982f875e3f16061"}, ] -[[package]] -name = "wrapt" -version = "1.16.0" -description = "Module for decorators, wrappers and monkey patching." -optional = false -python-versions = ">=3.6" -groups = ["main"] -files = [ - {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, - {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, - {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, - {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, - {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, - {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, - {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, - {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, - {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, - {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, - {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, - {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, - {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, - {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, - {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, - {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, - {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, - {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, -] - [[package]] name = "yattag" -version = "1.15.2" +version = "1.16.1" description = "Generate HTML or XML in a pythonic way. Pure python alternative to web template engines.Can fill HTML forms with default values and error messages." optional = false python-versions = "*" groups = ["main"] files = [ - {file = "yattag-1.15.2.tar.gz", hash = "sha256:aad9f540bd22dc503e5b5506cc47856facf081aa71fd35f727371b63e1e402bf"}, + {file = "yattag-1.16.1.tar.gz", hash = "sha256:baa8f254e7ea5d3e0618281ad2ff5610e0e5360b3608e695c29bfb3b29d051f4"}, ] [metadata] lock-version = "2.1" python-versions = ">=3.11,<4.0" -content-hash = "43ec60dc6e3694d9e57f5d33bee9fcbc596509d74c8568cbee4857dbcee2aad4" +content-hash = "aa0ccbc648ef5759cf2767e91da20418765227503efed7d2cb7a63ca99658569" diff --git a/pyproject.toml b/pyproject.toml index 03ae78a3..0ed5cf86 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,12 +17,11 @@ dependencies = [ "gitpython", "yattag", "wget", -"option", -"requests", -"bs4", "benchexec", "polars", -"PyGithub" +"PyGithub", +"altair", +"python-frontmatter", ] #pystemd is not set as dependency because it is not in the CI @@ -72,11 +71,10 @@ module = [ "benchexec","benchexec.util", "benchexec.result","benchexec.tools.template", "benchexec.runexecutor", - "bs4","wget" + "bs4","wget","frontmatter" ] ignore_missing_imports = true - [tool.ruff] target-version = "py37" line-length = 120 diff --git a/smtcomp/benchexec.py b/smtcomp/benchexec.py index 0799060f..f346969c 100644 --- a/smtcomp/benchexec.py +++ b/smtcomp/benchexec.py @@ -24,8 +24,12 @@ def get_suffix(track: defs.Track) -> str: return "_unsatcorevalidation" case defs.Track.SingleQuery: return "" - case _: - raise ValueError("No Cloud or Parallel") + case defs.Track.Parallel: + return "_parallel" + case defs.Track.Cloud: + return "_cloud" + case defs.Track.ProofExhibition: + return "_proof" def get_xml_name(s: defs.Submission, track: defs.Track, division: defs.Division) -> str: @@ -44,8 +48,9 @@ class CmdTask(BaseModel): taskdirs: List[str] -def generate_benchmark_yml(benchmark: Path, expected_result: Optional[bool], orig_file: Optional[Path]) -> None: - ymlfile = benchmark.with_suffix(".yml") +def generate_benchmark_yml( + ymlfile: Path, benchmark: Path, expected_result: Optional[bool], orig_file: Optional[Path] = None +) -> None: with ymlfile.open("w") as f: f.write("format_version: '2.0'\n\n") @@ -103,7 +108,9 @@ def generate_tool_modules(s: defs.Submission, cachedir: Path) -> None: generate_tool_module(s, cachedir, False) -def generate_xml(config: defs.Config, cmdtasks: List[CmdTask], file: Path, tool_module_name: str) -> None: +def generate_xml( + config: defs.Config, cmdtasks: List[CmdTask], file: Path, tool_module_name: str, track: defs.Track, test: bool +) -> None: doc, tag, text = Doc().tagtext() doc.asis('') @@ -111,16 +118,28 @@ def generate_xml(config: defs.Config, cmdtasks: List[CmdTask], file: Path, tool_ '' ) + + timelimit = config.timelimit_s_test if test else config.timelimit_s + cpuCores = config.cpuCores_parallel if track == defs.Track.Parallel else config.cpuCores + memlimit = config.memlimit_M_parallel if track == defs.Track.Parallel else config.memlimit_M + + if test: + cpuCores = config.cpuCores_parallel_test if track == defs.Track.Parallel else config.cpuCores_test + memlimit = config.memlimit_M_parallel_test if track == defs.Track.Parallel else config.memlimit_M_test with tag( "benchmark", tool=f"tools.{tool_module_name}", - timelimit=f"{config.timelimit_s * config.cpuCores}s", - walltimelimit=f"{config.timelimit_s}s", - memlimit=f"{config.memlimit_M} MB", - cpuCores=f"{config.cpuCores}", + timelimit=f"{timelimit * cpuCores}s", + walltimelimit=f"{timelimit}s", + memlimit=f"{memlimit} MB", + cpuCores=f"{cpuCores}", ): - with tag("require", cpuModel="Intel Xeon E3-1230 v5 @ 3.40 GHz"): - text() + + if track != defs.Track.Parallel: + # we run the test jobs on different machines (main machines are used) + used_cpuModel = "Intel Core i7" if test else "Intel Xeon E3-1230 v5 @ 3.40 GHz" + with tag("require", cpuModel=used_cpuModel): + text() with tag("resultfiles"): text("**/error.log") @@ -222,7 +241,7 @@ def cmdtask_for_submission( return res -def generate(s: defs.Submission, cachedir: Path, config: defs.Config) -> None: +def generate(s: defs.Submission, cachedir: Path, config: defs.Config, test: bool) -> None: generate_tool_modules(s, cachedir) dst = cachedir / "benchmarks" @@ -241,7 +260,6 @@ def generate(s: defs.Submission, cachedir: Path, config: defs.Config) -> None: # cloud and parallel tracks are not executed via benchexec if target_track in ( defs.Track.Cloud, - defs.Track.Parallel, defs.Track.UnsatCoreValidation, defs.Track.ProofExhibition, ): @@ -258,6 +276,8 @@ def generate(s: defs.Submission, cachedir: Path, config: defs.Config) -> None: cmdtasks=res, file=file, tool_module_name=tool_module_name(s, target_track == defs.Track.Incremental), + track=target_track, + test=test, ) generated_divisions.append(division) @@ -273,9 +293,11 @@ def generate(s: defs.Submission, cachedir: Path, config: defs.Config) -> None: out("set -x") out(f"for DIVISION in {division_list}") out(" do\n") - out(f' TARGET="../final_results{track_suffix}/$DIVISION/{tool}"') + out(f' TARGET="../results/results{track_suffix}/$DIVISION/{tool}"') out(" rm -rf $TARGET") out(" mkdir -p $TARGET") + + extra_args = "" out( f" PYTHONPATH=$(pwd) benchexec/contrib/vcloud-benchmark.py run_definitions/{tool}{track_suffix}_$DIVISION.xml --read-only-dir / --overlay-dir . --overlay-dir /home --vcloudClientHeap 500 --vcloudPriority URGENT --cgroupAccess -o $TARGET" ) @@ -319,6 +341,6 @@ def generate_unsatcore_validation(s: defs.Submission, cachedir: Path, config: de out(" rm -rf $TARGET") out(" mkdir -p $TARGET") out( - f" PYTHONPATH=$(pwd) benchexec/contrib/vcloud-benchmark.py run_definitions/{tool}_unsatcorevalidation_$DIVISION.xml --read-only-dir / --overlay-dir . --overlay-dir /home --vcloudClientHeap 500 --vcloudPriority URGENT --cgroupAccess --tryLessMemory -o $TARGET" + f" PYTHONPATH=$(pwd) benchexec/contrib/vcloud-benchmark.py run_definitions/{tool}_unsatcorevalidation_$DIVISION.xml --read-only-dir / --overlay-dir . --overlay-dir /home --vcloudClientHeap 500 --vcloudPriority URGENT --cgroupAccess -o $TARGET" ) out("done") diff --git a/smtcomp/certificates.py b/smtcomp/certificates.py index 590732ab..346b84ba 100755 --- a/smtcomp/certificates.py +++ b/smtcomp/certificates.py @@ -10,6 +10,7 @@ import smtcomp.defs as defs import smtcomp.results as results import smtcomp.generate_website_page as page +import smtcomp.submission as submission show_experimental = False @@ -70,11 +71,13 @@ def withtrack(l: list[str], name: str, category: category) -> None: class overall: def __init__(self) -> None: + self.best = category() self.biggest = category() self.largest = category() def latex(self) -> str: l: list[str] = [] + withtrack(l, "Best Overall", self.best) withtrack(l, "Biggest Lead", self.biggest) withtrack(l, "Largest Contribution", self.largest) return ", ".join(l) @@ -83,7 +86,7 @@ def __str__(self) -> str: return self.latex() def isNotEmpty(self) -> bool: - return self.biggest.isNotEmpty() and self.largest.isNotEmpty() + return self.best.isNotEmpty() or self.biggest.isNotEmpty() or self.largest.isNotEmpty() class info: @@ -132,7 +135,7 @@ def __repr__(self) -> str: def update( solvers: defaultdict[str, info], select: Callable[[info, str], None], - podium: page.PodiumDivision | page.PodiumBiggestLead | page.PodiumLargestContribution, + podium: page.PodiumDivision | page.PodiumBestOverall | page.PodiumBiggestLead | page.PodiumLargestContribution, ) -> None: if podium.track == defs.Track.SingleQuery: select(solvers[podium.winner_seq], "sq_seq") @@ -173,12 +176,10 @@ def add_logic(logics: dict[Tuple[str, defs.Track], bool], list: dict[str, int], logics[v, track] = True -def parse_pretty_names(solvers: defaultdict[str, info], pretty_names: Path) -> None: - with open(pretty_names, newline="") as input: - input = csv.DictReader(input) # type: ignore - - for row in input: - solvers[row["Solver Name"]].members = int(row["Members"]) # type: ignore +def process_submissions(solvers: defaultdict[str, info], submissions: list[defs.Submission]) -> None: + for s in submissions: + if s.competitive: + solvers[s.name].members = len(s.contributors) def parse_experimental_division(solvers: Any, experimental_division: Path) -> dict[str, bool]: @@ -192,11 +193,13 @@ def parse_experimental_division(solvers: Any, experimental_division: Path) -> di def generate_certificates( - website_results: Path, input_for_certificates: Path, pretty_names: Path, experimental_division: Path + website_results: Path, input_for_certificates: Path, submission_dir: Path, experimental_division: Path ) -> None: solvers: defaultdict[str, info] = defaultdict(info) - parse_pretty_names(solvers, pretty_names) + submissions = [submission.read_submission_or_exit(f) for f in submission_dir.glob("*.json")] + + process_submissions(solvers, submissions) solvers["-"].members = 0 # Remove experimental division @@ -223,6 +226,8 @@ def generate_certificates( continue case page.PodiumCrossDivision(): match result.root: + case page.PodiumBestOverall(): + update(solvers, (lambda x, k: x.overall.best.update(k, True)), result.root) case page.PodiumBiggestLead(): update(solvers, (lambda x, k: x.overall.biggest.update(k, True)), result.root) case page.PodiumLargestContribution(): diff --git a/smtcomp/convert_csv.py b/smtcomp/convert_csv.py deleted file mode 100644 index 77c8af24..00000000 --- a/smtcomp/convert_csv.py +++ /dev/null @@ -1,213 +0,0 @@ -import csv as csv -import re -from enum import Enum -from pathlib import Path -from typing import Dict, List, Optional, Tuple - -import requests -from bs4 import BeautifulSoup -from pydantic.networks import HttpUrl -from option import Option, Some -from rich.progress import track - -import smtcomp.defs as defs -from smtcomp.list_benchmarks import get_smt2_file - - -class CsvColumn(str, Enum): - name = "Solver Name" - homepage = "Solver homepage" - system_description = "System description URL" - title_system_description = "System description name" - starexec_id = "Solver ID" - wrapped_tool = "Wrapper Tool" - derived_tool = "Derived Tool" - track_single_query = "Single Query Regex" - track_incremental = "Incremental Regex" - track_unsat_core = "Unsat Core Regex" - track_model_validation = "Model Validation Regex" - track_proof = "Proof Exhibition Regex" - track_parallel = "Parallel Regex" - track_cloud = "Cloud Regex" - contact = "Contact" - contributors = "Team Members" - - -# cache for tests/solvers_divisions_final.csv -cache = { - 44384: ["default"], - 44702: ["default"], - 44703: ["default"], - 44765: ["default"], - 44767: ["def"], - 44672: ["default"], - 44713: ["default"], - 44741: ["default"], - 44742: ["default"], - 44715: ["default"], - 44759: ["default", "incremental", "proof"], - 44756: ["default"], - 44484: ["vampire_smtcomp"], - 44479: ["default"], - 44751: ["default"], - 44755: ["default"], - 39111: ["default"], - 41385: ["default"], - 44761: ["default", "incremental"], - 44707: ["default"], - 44716: ["default"], - 44737: ["proof", "sq", "mv", "uc"], - 44738: ["default"], - 44736: ["proof"], - 44790: ["default", "incremental"], - 44678: ["default"], - 44764: ["default"], - 44768: ["iprover_SMT"], - 44760: ["default"], -} - - -def configurations_on_starexec(id: int) -> list[str]: - if id in cache: - return cache[id] - - URL = "https://www.starexec.org/starexec/secure/details/solver.jsp?id=" + str(id) - page = requests.get(URL) - soup = BeautifulSoup(page.content, "html.parser") - - cache[id] = [i.a.text.strip() for i in soup.find_all(name="td", id="configItem")] - return cache[id] - - -def convert_row(row: Dict[str, str], dstdir: Path) -> defs.Submission: - # print(row[CsvColumn.name]) - - def archive_of_solver_id(solver_id: int) -> defs.Archive: - return defs.Archive( - url=HttpUrl(f"https://www.starexec.org/starexec/secure/download?type=solver&id={solver_id}"), - h=None, - ) - - solver_ids = row[CsvColumn.starexec_id].split(";") - - def find_archive_id(track_id: Option[str]) -> Option[int]: - r = ( - re.compile(" *([0-9]+)+\\(" + track_id.unwrap() + "\\) *") - if track_id.is_some - else re.compile(" *([0-9]+) *") - ) - for solver_id in solver_ids: - g = r.fullmatch(solver_id) - if g: - return Some(int(g.group(1))) - return Option.NONE() - - def has_configuration(id: int, track_id: str) -> bool: - return track_id in configurations_on_starexec(id) - - def mk_cmd(conf: str) -> defs.Command: - return defs.Command(binary="bin/starexec_run_" + conf, compa_starexec=True) - - def find_archive(track_id: Option[str]) -> Tuple[Option[defs.Archive], Option[defs.Command]]: - main_id = find_archive_id(track_id) - archive = main_id.map(archive_of_solver_id) - - id = main_id if main_id else find_archive_id(Option.NONE()) - track_id2 = track_id.unwrap_or("default") - if id: - if has_configuration(id.unwrap(), track_id2): - command = Some(mk_cmd(track_id2)) - elif has_configuration(id.unwrap(), "default"): - command = Some(mk_cmd("default")) - elif track_id2 == "default" and len(configurations_on_starexec(id.unwrap())) == 1: - # Seems that if there is only one configuration it is accepted - # as the default - command = Some(mk_cmd(configurations_on_starexec(id.unwrap())[0])) - else: - command = Option.NONE() - - else: - command = Option.NONE() - return archive, command - - archive, command = find_archive(Option.NONE()) - contributors = [ - defs.Contributor(name=name) for line in row[CsvColumn.contributors].splitlines() for name in line.split(",") - ] - participations: List[defs.Participation] = [] - - def add_track(col: CsvColumn, track: defs.Track, shortcut: str) -> None: - if row[col] != "" and row[col] != "-": - archive, command = find_archive(Some(shortcut)) - participations.append( - defs.Participation( - tracks=[track], - logics=defs.Logics.from_regexp(row[col].strip()), - archive=archive.unwrap_or(None), - command=command.unwrap_or(None), - ) - ) - - add_track(CsvColumn.track_single_query, defs.Track.SingleQuery, "sq") - add_track(CsvColumn.track_unsat_core, defs.Track.UnsatCore, "uc") - add_track(CsvColumn.track_incremental, defs.Track.Incremental, "inc") - add_track(CsvColumn.track_model_validation, defs.Track.ModelValidation, "mv") - add_track(CsvColumn.track_proof, defs.Track.ProofExhibition, "proof") - add_track(CsvColumn.track_parallel, defs.Track.Parallel, "par") - add_track(CsvColumn.track_cloud, defs.Track.Cloud, "cloud") - return defs.Submission( - name=row[CsvColumn.name], - contributors=contributors, - contacts=[defs.NameEmail(name="", email=row[CsvColumn.contact])], - archive=archive.unwrap_or(None), - website=HttpUrl(row[CsvColumn.homepage]), - system_description=HttpUrl(row[CsvColumn.system_description]), - command=command.unwrap_or(None), - solver_type=defs.SolverType.standalone, - participations=defs.Participations(root=participations), - ) - - -def convert_csv(file: Path, dstdir: Path) -> None: - with open(file) as dcsv: - registrations = csv.DictReader(dcsv) - for row in track(list(registrations), description="Asking StarExec for prover configurations"): - if row[CsvColumn.starexec_id] != "-1": - submission = convert_row(row, dstdir) - with open(Path.joinpath(dstdir, submission.name + ".json"), "w") as f: - f.write(submission.model_dump_json()) - - -def convert_csv_result(file: Path, track: defs.Track) -> defs.Results: - # Some csv benchmark name start with track_.../QF.. - with open(file) as dcsv: - results = csv.DictReader(dcsv) - compatibility = next(results)["benchmark"].startswith("track_") - - with open(file) as dcsv: - results = csv.DictReader(dcsv) - l: list[defs.Result] = [] - for row in results: - if row["result"] == "starexec-unknown": - row["result"] = "unknown" - elif row["result"] == "--": - row["result"] = "unknown" - row["benchmark"] = row["benchmark"].replace("UFFPDTLIRA", "UFFPDTNIRA") - - smt2file = get_smt2_file( - src=None, file=Path(row["benchmark"].strip()), incremental=track is defs.Track.Incremental - ) - - l.append( - defs.Result( - track=track, - file=smt2file, - solver="{}_{}".format(row["solver"].strip(), row["configuration"].strip()), - cpu_time=float(row["cpu time"]), - wallclock_time=float(row["wallclock time"]), - memory_usage=float(row["memory usage"]), - result=defs.Answer(row["result"]), - ) - ) - - return defs.Results(results=l) diff --git a/smtcomp/defs.py b/smtcomp/defs.py index ebc3cc08..8193dcf5 100644 --- a/smtcomp/defs.py +++ b/smtcomp/defs.py @@ -135,7 +135,7 @@ def name_is_default_field(cls, data: Any) -> Any: class SolverType(EnumAutoInt): wrapped = "wrapped" - derived = "derived" + derived = "derived" # TODO: put a datatype information on base solver standalone = "Standalone" portfolio = "Portfolio" @@ -1317,6 +1317,7 @@ class Submission(BaseModel, extra="forbid"): website: HttpUrl system_description: HttpUrl solver_type: SolverType + # TODO add field base_solver? participations: Participations seed: int | None = None competitive: bool = True @@ -1325,6 +1326,7 @@ class Submission(BaseModel, extra="forbid"): description="Must be set for the final version of the submission. An archive on zenodo is needed in this case.", ) + # TODO: model validator to check the sanity of the new base_solver field @model_validator(mode="after") def check_archive(self) -> Submission: if self.archive is None and not all(p.archive for p in self.participations.root): @@ -1446,13 +1448,20 @@ class Results(BaseModel): ## Parameters that can change each year class Config: __next_id__: ClassVar[int] = 0 - current_year = 2024 + current_year = 2025 oldest_previous_results = 2018 timelimit_s = 60 * 20 + timelimit_s_test = 60 # time limit for test runs memlimit_M = 1024 * 30 + memlimit_M_test = 1024 * 8 # memory limit for test runs + memlimit_M_parallel = 1024 * 1000 + memlimit_M_parallel_test = 1024 * 8 cpuCores = 4 - unsatcore_validation_timelimit_s = 60 * 5 - unsatcore_validation_memlimit_M = 1024 * 30 + cpuCores_test = 2 + cpuCores_parallel = 128 + cpuCores_parallel_test = 8 + unsatcore_validation_timelimit_s = 60 * 20 + unsatcore_validation_memlimit_M = 1024 * 15 unsatcore_validation_cpuCores = 4 min_used_benchmarks = 300 ratio_of_used_benchmarks = 0.5 @@ -1486,34 +1495,43 @@ class Config: """ Commit of the model validator dolmen (branch smtcomp-2023) """ - dolmen_force_logic_ALL = False - """ - Some benchmarks are not accepted by dolmen in their current logic. - During model validation we can rerun by forcing logic ALL to accept more models - """ removed_benchmarks = [ { - "logic": int(Logic.QF_LIA), - "family": "20210219-Dartagnan/ConcurrencySafety-Main", - "name": "39_rand_lock_p0_vs-O0.smt2", - } # scrambler segfault (perhaps stack limit) + "logic": int(Logic.UFDTNIA), + "family": "20241211-verus/verismo", + "name": "tspec__math__nonlinearverismo_tspec.math.nonlinear.proof_mul_pos_neg_rel._01.smt2", + }, # reported by Mathias Preiner as syntactically invalid + { + "logic": int(Logic.UFDTNIA), + "family": "20241211-verus/verismo", + "name": "tspec__math__nonlinearverismo_tspec.math.nonlinear.proof_div_pos_neg_rel._01.smt2", + }, # reported by Mathias Preiner as syntactically invalid ] """ - Benchmarks to remove before selection (currently just for aws) + Benchmarks to remove before selection """ - removed_results = [ - { - "logic": int(Logic.QF_BV), - "family": "20230221-oisc-gurtner", - "name": "SLL-NESTED-8-32-sp-not-excluded.smt2", - } # wrong status in SMTLIB - ] + removed_results: list[Any] = [] + """ Benchmarks to remove after running the solvers. Can be used when the selection has already been done. """ + """ + Solver -> Base solver map for 2025 + TODO: refactor this into Submission + """ + baseSolverMap2025 = { + "Bitwuzla-MachBV": "Bitwuzla-MachBV-base", + "Z3-Inc-Z3++": "Z3-Inc-Z3++-base", + "Z3-Noodler-Mocha": "Z3-Noodler-Mocha-base", + "Z3-Owl": "Z3-Owl-base", + "Z3-Noodler": "Z3-Noodler-base", + "z3siri": "z3siri-base", + "Z3-alpha": "Z3-alpha-base", + } + def __init__(self, data: Path | None) -> None: self.id = self.__class__.__next_id__ self.__class__.__next_id__ += 1 @@ -1537,7 +1555,7 @@ def data(self) -> Path: @functools.cached_property def previous_years(self) -> list[int]: - return list(range(self.oldest_previous_results, self.current_year)) + return list(range(self.oldest_previous_results, self.current_year - 1)) @functools.cached_property def previous_results(self) -> list[tuple[int, Path]]: @@ -1577,6 +1595,10 @@ def submissions(self) -> list[Submission]: Submission.model_validate_json(Path(file).read_text()) for file in self.data.glob("../submissions/*.json") ] + @functools.cached_property + def competitive_solvers(self) -> list[str]: + return [s.name for s in self.submissions if s.competitive] + @functools.cached_property def web_results(self) -> Path: return self.data / ".." / "web" / "content" / "results" diff --git a/smtcomp/generate_benchmarks.py b/smtcomp/generate_benchmarks.py index 60603d32..2bb20138 100644 --- a/smtcomp/generate_benchmarks.py +++ b/smtcomp/generate_benchmarks.py @@ -81,5 +81,5 @@ def generate_trivial_benchmarks(dst: Path) -> None: file_sat.write_text(f"(set-logic {logic.value})(check-sat)") file_unsat.write_text(f"(set-logic {logic.value})(assert false)(check-sat)") - generate_benchmark_yml(file_sat, True, None) - generate_benchmark_yml(file_unsat, False, None) + generate_benchmark_yml(file_sat.with_suffix(".yml"), file_sat, True, None) + generate_benchmark_yml(file_unsat.with_suffix(".yml"), file_unsat, False, None) diff --git a/smtcomp/generate_graphics.py b/smtcomp/generate_graphics.py new file mode 100644 index 00000000..3caf7149 --- /dev/null +++ b/smtcomp/generate_graphics.py @@ -0,0 +1,294 @@ +import math +import functools, itertools +from collections import defaultdict +from typing import Set, Dict, Optional, cast, List, DefaultDict, Tuple +from pathlib import Path, PurePath +from smtcomp import defs +from rich.progress import track as rich_track + +import polars as pl +import altair as alt +import altair.utils.html +import altair.vegalite.display +from smtcomp.utils import * +import smtcomp.generate_website_page +import frontmatter +from random import Random +import math + +c_file = pl.col("file") +c_logic = pl.col("logic") +c_division = pl.col("division") +c_solver = pl.col("solver") +c_solver2 = pl.col("solver2") +c_answer = pl.col("answer") +c_answer2 = pl.col("answer2") +c_cputime_s = pl.col("cputime_s") +c_cputime_s2 = pl.col("cputime_s2") +c_run = pl.col("run") +c_bucket = pl.col("bucket") +c_bucket2 = pl.col("bucket2") + + +def correlation_sorting(solvers: List[U], corrs: Mapping[Tuple[U, U], float], nb_iteration: int) -> None: + """ + Strangely I can't find easy to use lib creating a well clustered correlation matrix. block modelling. + + We use simulated annealing + """ + if len(solvers) <= 2: + return + + r = Random(0) + + def neighbor(i: int) -> float: + s = 0.0 + n = 0 + if 0 < i: + s += 1 - corrs[solvers[i - 1], solvers[i]] + n += 1 + if i < len(solvers) - 1: + s += 1 - corrs[solvers[i], solvers[i + 1]] + n += 1 + # At the bounds there is only one neighbor + return s / n + + def swap(i: int, j: int) -> None: + tmp = solvers[i] + solvers[i] = solvers[j] + solvers[j] = tmp + + for i in range(0, nb_iteration): + a = r.randint(0, len(solvers) - 1) + b = r.randint(0, len(solvers) - 2) + if a <= b: + b += 1 + s1 = neighbor(a) + neighbor(b) + swap(a, b) + s2 = neighbor(a) + neighbor(b) + swap(a, b) + t = 1 - (i / (nb_iteration + 1)) + if s2 < s1 or math.exp((s1 - s2) / t) > r.uniform(0.0, 1.0): + swap(a, b) + + +def create_output( + config: defs.Config, + results: pl.LazyFrame, + logics: list[defs.Logic] = [], + divisions: list[defs.Division] = [], +) -> alt.api.ChartType: + + # We are computing the buckets offline because we have too much data + results = results.filter(c_logic.is_in(set(map(int, logics))) | c_division.is_in(set(map(int, divisions)))).select( + c_file, + c_logic, + c_division, + c_solver, + c_answer, + c_cputime_s, + bucket=pl.lit(10.0).pow(c_cputime_s.log(10).floor()), + # bucket=c_cputime_s.log(10).floor(), + ) + + results_with = results.select(c_file, solver2=c_solver, bucket2=c_bucket, cputime_s2=c_cputime_s, answer2=c_answer) + + results = results.join(results_with, on=c_file, how="left") + + corr = ( + results.group_by(c_solver, c_solver2) + .agg(corr=pl.corr(c_cputime_s, c_cputime_s2, method="pearson")) + .sort(c_solver, c_solver2) + .select(c_solver, c_solver2, "corr") + ) + + results = ( + results.group_by(c_solver, c_solver2, c_answer, c_answer2, c_bucket, c_bucket2, c_logic, c_division) + .len() + .sort(c_solver, c_solver2) + ) + + # Replace integer by names + # It should be possible to do it later in altair; the html file would be smaller + if True: + for lookup, replaced in [ + (defs.Answer, "answer"), + (defs.Answer, "answer2"), + (defs.Logic, "logic"), + (defs.Division, "division"), + ]: + lf_lookup = pl.DataFrame( + data=((int(n), str(n)) for n in lookup), schema=[(replaced, pl.Int8), ("pretty", pl.String)] + ).lazy() + results = results.join(lf_lookup, how="left", on=replaced).drop(replaced).rename({"pretty": replaced}) + + df_corr, df_results, df_buckets, df_answers, df_solvers = pl.collect_all( + [ + corr, + results, + results.select(c_bucket.unique()), + results.select(c_answer.unique()), + results.select(c_solver.unique()), + ] + ) + + bucket_domain: list[float] = list(df_buckets["bucket"]) + answer_domain: list[str] = list(df_answers["answer"]) + answer_domain.sort(key=lambda x: defs.Answer(x).id) + + solver_domain: list[str] = list(df_solvers["solver"]) + solver_domain.sort(key=lambda x: x.lower()) + + if True: + # Two provers can have no benchmars in common, their pairs is not in df_corrs + corrs: DefaultDict[Tuple[str, str], float] = defaultdict(lambda: 0.0) + for row in df_corr.rows(named=False): + corrs[row[0], row[1]] = row[2] + correlation_sorting(solver_domain, corrs, 1000) + + # Create heatmap with selection + solvers = alt.selection_point( + fields=["solver", "solver2"], + name="solvers", + value=[{"solver": solver_domain[0], "solver2": solver_domain[min(1, len(solver_domain) - 1)]}], + toggle=False, + ) + answer_xy = alt.selection_point(fields=["answer", "answer2"], name="answer") + logic = alt.selection_point(fields=["logic"], name="logic") + division = alt.selection_point(fields=["division"], name="division") + g_select_provers = ( + alt.Chart(df_corr, title="Click a tile to compare solvers", height=250, width=250) + .mark_rect() + .encode( + alt.X("solver", title="solver1").scale(domain=solver_domain), + alt.Y("solver2", title="solver2").scale(domain=list(reversed(solver_domain))), + alt.Color("corr", scale=alt.Scale(domain=[-1, 1], scheme="blueorange")), + stroke=alt.when(solvers).then(alt.value("lightgreen")), + strokeWidth=alt.value(3), + opacity=alt.value(0.8), + ) + .add_params(solvers) + ) + + # Number of results by time + title = alt.Title( + alt.expr(f'{solvers.name}.solver + " vs " + {solvers.name}.solver2'), subtitle="comparison of cpu time" + ) + g_results_base = ( + alt.Chart(df_results, title=title, height=250, width=250) + .transform_filter(solvers, answer_xy, logic, division) + .transform_aggregate(benchs="sum(len)", groupby=["bucket", "bucket2"]) + .encode( + alt.X("bucket:O").axis(title="solver1", bandPosition=0.5) + # align should move the center of the cell, it does not + .scale(type="band", align=0, domain=bucket_domain), + alt.Y("bucket2:O") + .axis(title="solver2", bandPosition=0.5) + .scale(type="band", align=0, domain=list(reversed(bucket_domain))), + text="benchs:Q", + ) + ) + + g_results_rect = g_results_base.mark_rect().encode(alt.Color("benchs:Q", scale=alt.Scale(scheme="yellowgreenblue"))) + + g_results_text = g_results_base.mark_text(baseline="middle") + + g_results = g_results_rect + g_results_text + + opacity = alt.when(solvers, answer_xy, logic, division).then(alt.value(1)).otherwise(alt.value(0.01)) + + opacity_answer = alt.when(answer_xy).then(alt.value(1)).otherwise(alt.value(0.5)) + + # Number of results by answers + g_answer_base = ( + alt.Chart(df_results, title="Comparison of the answers", height=250, width=250) + .transform_filter(solvers, logic, division) + .transform_aggregate(benchs="sum(len)", groupby=["answer", "answer2"]) + .add_params(answer_xy) + .encode( + alt.X("answer:N").axis(title="solver1", bandPosition=0.5) + # align should move the center of the cell, it does not + .scale(type="band", align=0, domain=answer_domain), + alt.Y("answer2:N") + .axis(title="solver2", bandPosition=0.5) + .scale(type="band", align=0, domain=list(reversed(answer_domain))), + text="benchs:Q", + opacity=opacity_answer, + ) + ) + + g_answer_rect = g_answer_base.mark_rect().encode(alt.Color("benchs:Q", scale=alt.Scale(scheme="yellowgreenblue"))) + + g_answer_text = g_answer_base.mark_text(baseline="middle") + + g_answer = g_answer_rect + g_answer_text + + legend_logic = ( + alt.Chart(df_results, title="Logic") + .mark_point() + .encode(alt.Y("logic:N").axis(title="", orient="right"), opacity=opacity) + .add_params(logic) + ) + + legend_division = ( + alt.Chart(df_results, title="Division") + .mark_point() + .encode(alt.Y("division:N").axis(title="", orient="right"), opacity=opacity) + .add_params(division) + ) + + graph: alt.api.ChartType = (g_select_provers | g_results).resolve_scale(color="independent") + + graph = alt.vconcat(graph, (g_answer | (legend_logic | legend_division)).resolve_scale(color="independent")) + + graph = graph.resolve_scale(color="independent") + + return graph + + +def save_output( + config: defs.Config, + results: pl.LazyFrame, + output: Path, + logics: list[defs.Logic] = [], + divisions: list[defs.Division] = [], +) -> None: + + create_output(config, results, logics, divisions).save(output) + + +def save_hugo_output(chart: alt.api.ChartType, output: Path, title: str) -> None: + + with alt.data_transformers.disable_max_rows(): + content = chart.to_html( + fullhtml=False, + ) + post = frontmatter.Post(content=content, title=title, layout="chart") + output.write_text(frontmatter.dumps(post)) + + +def generate_pages(config: defs.Config, results: pl.LazyFrame, track: defs.Track) -> None: + page_suffix = smtcomp.generate_website_page.page_track_suffix(track) + dst = config.web_results + dst.mkdir(parents=True, exist_ok=True) + + df_results = results.filter(c_answer != -1).collect() + results = df_results.lazy() + + divisions = list(df_results["division"].unique()) + for div in rich_track(list(map(defs.Division.of_int, divisions)), description="Generating chart for divisions"): + chart = create_output(config, results, divisions=[div]) + save_hugo_output( + chart, + output=dst / f"{div.name.lower()}-{page_suffix}-chart.html", + title=f"Chart for division {div.name}", + ) + + logics = list(df_results["logic"].unique()) + for logic in rich_track(list(map(defs.Logic.of_int, logics)), description="Generating chart for logics"): + chart = create_output(config, results, logics=[logic]) + save_hugo_output( + chart, + output=dst / f"{logic.name.lower()}-{page_suffix}-chart.html", + title=f"Chart for logic {logic.name}", + ) diff --git a/smtcomp/generate_website_page.py b/smtcomp/generate_website_page.py index ce3a5b0c..86228aa9 100644 --- a/smtcomp/generate_website_page.py +++ b/smtcomp/generate_website_page.py @@ -94,6 +94,8 @@ def page_track_suffix(track: defs.Track) -> str: class PodiumStep(BaseModel): name: str + baseSolver: str + deltaBaseSolver: int competing: str # yes or no errorScore: int correctScore: int @@ -115,6 +117,7 @@ class PodiumDivision(BaseModel): participants: str # participants_2023 disagreements: str # disagreements_2023 division: str # Arith + is_competitive: bool # true = least 2 subst. different solvers were submitted track: track_name n_benchmarks: int time_limit: int @@ -230,21 +233,34 @@ class PodiumLargestContribution(BaseModel): class PodiumCrossDivision(RootModel): - root: PodiumLargestContribution | PodiumBiggestLead = Field(..., discriminator="recognition") + root: PodiumBestOverall | PodiumLargestContribution | PodiumBiggestLead = Field(..., discriminator="recognition") class Podium(RootModel): root: PodiumDivision | PodiumCrossDivision | PodiumSummaryResults = Field(..., discriminator="layout") -def podium_steps(podium: List[dict[str, Any]] | None) -> List[PodiumStep]: +def podium_steps(config: defs.Config, podium: List[dict[str, Any]] | None) -> List[PodiumStep]: if podium is None: return [] else: - return [ - PodiumStep( + podiums = [] + non_competitive = [] + for s in podium: + cscore = s["correctly_solved_score"] + delta = 0 + derived_solver = defs.Config.baseSolverMap2025.get(s["solver"], "") + if derived_solver != "": + for sprime in podium: + if sprime["solver"] == defs.Config.baseSolverMap2025.get(s["solver"], ""): + delta = cscore - sprime["correctly_solved_score"] + break + + ps = PodiumStep( name=s["solver"], - competing="yes", # TODO + baseSolver=derived_solver, + deltaBaseSolver=delta, + competing="yes" if s["solver"] in config.competitive_solvers else "no", errorScore=s["error_score"], correctScore=s["correctly_solved_score"], CPUScore=s["cpu_time_score"], @@ -257,23 +273,56 @@ def podium_steps(podium: List[dict[str, Any]] | None) -> List[PodiumStep]: timeout=s["timeout"], memout=s["memout"], ) - for s in podium - ] + + if not s["solver"] in config.competitive_solvers: + non_competitive.append(ps) + else: + podiums.append(ps) + + return podiums + non_competitive -def make_podium(config: defs.Config, d: dict[str, Any], for_division: bool, track: defs.Track) -> PodiumDivision: +def make_podium( + config: defs.Config, d: dict[str, Any], for_division: bool, track: defs.Track, results: pl.LazyFrame +) -> PodiumDivision: def get_winner(l: List[dict[str, str]] | None) -> str: - # TODO select only participating + if l is None or not l: + return "-" + + l = [e for e in l if e["solver"] in config.competitive_solvers] + if l is None or not l or l[0]["correctly_solved_score"] == 0: return "-" else: return l[0]["solver"] + def is_competitive_division(results: pl.LazyFrame, division: int, for_division: bool) -> bool: + """ + A division in a track is competitive if at least two substantially different + solvers (i.e., solvers from two different teams) were submitted. + """ + + solvers = ( + results.filter(pl.col("division" if for_division else "logic") == division) + .select("solver") + .unique() + .collect() + .get_column("solver") + .to_list() + ) + + # Avoid solvers of the same solver family under the assumption + # of the following format: - (holds for SMT-COMP 2025) + # TODO: improve this criterion in the future + return len(set([sol.split("-")[0].lower() for sol in solvers])) >= 2 + if for_division: + competitive_division = is_competitive_division(results, d["division"], for_division) division = defs.Division.name_of_int(d["division"]) logics = dict((defs.Logic.name_of_int(d2["logic"]), d2["n"]) for d2 in d["logics"]) else: division = defs.Logic.name_of_int(d["logic"]) + competitive_division = is_competitive_division(results, d["logic"], for_division) logics = dict() if (track == defs.Track.Cloud) | (track == defs.Track.Parallel): @@ -281,12 +330,13 @@ def get_winner(l: List[dict[str, str]] | None) -> str: steps_seq = [] else: winner_seq = get_winner(d[smtcomp.scoring.Kind.seq.name]) - steps_seq = podium_steps(d[smtcomp.scoring.Kind.seq.name]) + steps_seq = podium_steps(config, d[smtcomp.scoring.Kind.seq.name]) return PodiumDivision( - resultdate="2024-07-08", + resultdate="2025-08-11", year=config.current_year, divisions=f"divisions_{config.current_year}", + is_competitive=competitive_division, participants=f"participants_{config.current_year}", disagreements=f"disagreements_{config.current_year}", division=division, @@ -301,15 +351,15 @@ def get_winner(l: List[dict[str, str]] | None) -> str: winner_unsat=get_winner(d[smtcomp.scoring.Kind.unsat.name]), winner_24s=get_winner(d[smtcomp.scoring.Kind.twentyfour.name]), sequential=steps_seq, - parallel=podium_steps(d[smtcomp.scoring.Kind.par.name]), - sat=podium_steps(d[smtcomp.scoring.Kind.sat.name]), - unsat=podium_steps(d[smtcomp.scoring.Kind.unsat.name]), - twentyfour=podium_steps(d[smtcomp.scoring.Kind.twentyfour.name]), + parallel=podium_steps(config, d[smtcomp.scoring.Kind.par.name]), + sat=podium_steps(config, d[smtcomp.scoring.Kind.sat.name]), + unsat=podium_steps(config, d[smtcomp.scoring.Kind.unsat.name]), + twentyfour=podium_steps(config, d[smtcomp.scoring.Kind.twentyfour.name]), ) def sq_generate_datas( - config: defs.Config, selection: pl.LazyFrame, results: pl.LazyFrame, for_division: bool, track: defs.Track + config: defs.Config, results: pl.LazyFrame, for_division: bool, track: defs.Track ) -> dict[str, PodiumDivision]: """ Generate datas for divisions or for logics @@ -322,13 +372,12 @@ def sq_generate_datas( group_by = "logic" name_of_int = defs.Logic.name_of_int - selection = selection.filter(selected=True) - # TODO it should be done after filter_for - len_by_division = selection.group_by(group_by).agg(total=pl.len()) + len_by_division = results.group_by(group_by).agg(total=pl.col("file").n_unique()) def info_for_podium_step(kind: smtcomp.scoring.Kind, config: defs.Config, results: pl.LazyFrame) -> pl.LazyFrame: results = smtcomp.scoring.filter_for(kind, config, results) + return ( sort( intersect(results, len_by_division, on=[group_by]) @@ -369,8 +418,8 @@ def info_for_podium_step(kind: smtcomp.scoring.Kind, config: defs.Config, result if for_division: lf_logics = [ - selection.group_by("division", "logic") - .agg(n=pl.len()) + results.group_by("division", "logic") + .agg(n=pl.col("file").n_unique()) .group_by("division") .agg(logics=pl.struct("logic", "n")) ] @@ -383,7 +432,7 @@ def info_for_podium_step(kind: smtcomp.scoring.Kind, config: defs.Config, result df = r.collect() - return dict((name_of_int(d[group_by]), make_podium(config, d, for_division, track)) for d in df.to_dicts()) + return dict((name_of_int(d[group_by]), make_podium(config, d, for_division, track, results)) for d in df.to_dicts()) def get_kind(a: PodiumDivision, k: smtcomp.scoring.Kind) -> list[PodiumStep]: @@ -472,7 +521,7 @@ def get_winner(l: List[PodiumStepBiggestLead] | None) -> str: winner_seq = get_winner(sequential) return PodiumBiggestLead( - resultdate="2024-07-08", + resultdate="2025-08-11", year=config.current_year, track=track, results=f"results_{config.current_year}", @@ -590,7 +639,7 @@ def get_winner( winner_seq = get_winner(sequential, scores, data, track) return PodiumBestOverall( - resultdate="2024-07-08", + resultdate="2025-08-11", year=config.current_year, track=track, results=f"results_{config.current_year}", @@ -631,7 +680,10 @@ def get_winner(l: List[PodiumStepLargestContribution] | None) -> str: def aux(k: smtcomp.scoring.Kind, div: str) -> List[PodiumStepLargestContribution]: v_steps = get_kind(virtual_datas[div], k) - vws_steps = get_kind(virtual_without_solver_datas[div], k) + if div in virtual_without_solver_datas: + vws_steps = get_kind(virtual_without_solver_datas[div], k) + else: + vws_steps = [] if not v_steps: assert not vws_steps return [] @@ -685,7 +737,7 @@ def timeScore(vws_step: PodiumStep) -> float: steps_seq = ld[smtcomp.scoring.Kind.seq] return PodiumLargestContribution( - resultdate="2024-07-08", + resultdate="2025-08-11", year=config.current_year, track=track, results=f"results_{config.current_year}", @@ -703,9 +755,7 @@ def timeScore(vws_step: PodiumStep) -> float: ) -def largest_contribution( - config: defs.Config, selection: pl.LazyFrame, scores: pl.LazyFrame, track: defs.Track -) -> PodiumLargestContribution: +def largest_contribution(config: defs.Config, scores: pl.LazyFrame, track: defs.Track) -> PodiumLargestContribution: for_division = True # For each solver compute its corresponding best solver # TODO: check what is competitive solver (unsound?) @@ -721,7 +771,7 @@ def largest_contribution( # Virtual solver virtual_scores = ( - scores.group_by("division", "file") + scores.group_by("division", "logic", "file") .agg( pl.max("correctly_solved_score"), pl.min("walltime_s"), @@ -733,7 +783,7 @@ def largest_contribution( ) .with_columns(solver=pl.lit("virtual"), error_score=0) ) - virtual_datas = sq_generate_datas(config, selection, virtual_scores, for_division, track) + virtual_datas = sq_generate_datas(config, virtual_scores, for_division, track) # For each solver Compute virtual solver without the solver solvers = scores.select("division", "solver").unique() @@ -741,7 +791,7 @@ def largest_contribution( intersect(scores.rename({"solver": "other_solver"}), solvers, on=["division"]) .filter(pl.col("solver") != pl.col("other_solver")) .drop("other_solver") - .group_by("division", "solver", "file") + .group_by("division", "logic", "solver", "file") .agg( pl.max("correctly_solved_score"), pl.min("walltime_s"), @@ -753,9 +803,7 @@ def largest_contribution( answer=pl.col("answer").first(), ) ) - virtual_without_solver_datas = sq_generate_datas( - config, selection, virtual_without_solver_scores, for_division, track - ) + virtual_without_solver_datas = sq_generate_datas(config, virtual_without_solver_scores, for_division, track) large = largest_contribution_ranking(config, virtual_datas, virtual_without_solver_datas, ratio_by_division, track) @@ -767,8 +815,7 @@ def largest_contribution( return large -def export_results(config: defs.Config, selection: pl.LazyFrame, results: pl.LazyFrame, track: defs.Track) -> None: - +def export_results(config: defs.Config, results: pl.LazyFrame, track: defs.Track) -> None: page_suffix = page_track_suffix(track) dst = config.web_results @@ -783,7 +830,7 @@ def export_results(config: defs.Config, selection: pl.LazyFrame, results: pl.Laz all_divisions: list[PodiumDivision] = [] for for_division in [True, False]: - datas = sq_generate_datas(config, selection, scores, for_division, track) + datas = sq_generate_datas(config, scores, for_division, track) for name, data in datas.items(): (dst / f"{name.lower()}-{page_suffix}.md").write_text(data.model_dump_json(indent=1)) @@ -798,7 +845,7 @@ def export_results(config: defs.Config, selection: pl.LazyFrame, results: pl.Laz bigdata = biggest_lead_ranking(config, datas, track) (dst / f"biggest-lead-{page_suffix}.md").write_text(bigdata.model_dump_json(indent=1)) - largedata = largest_contribution(config, selection, scores, track) + largedata = largest_contribution(config, scores, track) (dst / f"largest-contribution-{page_suffix}.md").write_text(largedata.model_dump_json(indent=1)) all_divisions.sort(key=lambda x: x.division) diff --git a/smtcomp/incremental_tool.py b/smtcomp/incremental_tool.py index 40de13a5..911a7b14 100644 --- a/smtcomp/incremental_tool.py +++ b/smtcomp/incremental_tool.py @@ -30,21 +30,24 @@ def determine_result(self, run: BaseTool2.Run) -> Any: # type: ignore line = line.strip() if line in ("sat", "unsat"): correct += 1 + if "error" in line.lower(): + status = "ERROR" if line.startswith("WRONG"): return "WRONG" - if returnsignal is None: - status = "DONE" - elif ((returnsignal == 9) or (returnsignal == 15)) and isTimeout: - status = "TIMEOUT" - elif returnsignal == 9: - status = "KILLED BY SIGNAL 9" - elif returnsignal == 6: - status = "ABORTED" - elif returnsignal == 15: - status = "KILLED" - else: - status = "ERROR" + if status is None: + if returnsignal is None: + status = "DONE" + elif ((returnsignal == 9) or (returnsignal == 15)) and isTimeout: + status = "TIMEOUT" + elif returnsignal == 9: + status = "KILLED BY SIGNAL 9" + elif returnsignal == 6: + status = "ABORTED" + elif returnsignal == 15: + status = "KILLED" + else: + status = "ERROR" return f"{status} ({correct} correct)" @@ -69,10 +72,10 @@ def cmdline( # type: ignore assert len(tasks) <= 1, "only one inputfile supported" if options: # executable and options were overridden by the task definition - return [TRACE_EXECUTOR, *options, *tasks] + return [TRACE_EXECUTOR, "--continue-after-unknown", *options, *tasks] else: # using default executable - return [TRACE_EXECUTOR, executable, *tasks] + return [TRACE_EXECUTOR, "--continue-after-unknown", executable, *tasks] def program_files(self, executable: str) -> Any: files = [TRACE_EXECUTOR, executable] + self._program_files_from_executable(executable, self.REQUIRED_PATHS) diff --git a/smtcomp/main.py b/smtcomp/main.py index 3f2e07bd..cb45d62a 100644 --- a/smtcomp/main.py +++ b/smtcomp/main.py @@ -27,11 +27,11 @@ import smtcomp.unsat_core_validation as unsat_core_validation import smtcomp.results as results from smtcomp.benchmarks import clone_group -import smtcomp.convert_csv import smtcomp.generate_benchmarks import smtcomp.list_benchmarks import smtcomp.selection import smtcomp.generate_website_page +import smtcomp.generate_graphics as smtcomp_generate_graphics from smtcomp.unpack import write_cin, read_cin import smtcomp.scramble_benchmarks from rich.console import Console @@ -103,7 +103,7 @@ def get_contacts(files: list[Path] = typer.Argument(None)) -> None: Find contact from submissions given as arguments """ l = list(map(submission.read_submission_or_exit, files)) - contacts = list(str(c) for c in itertools.chain.from_iterable([s.contacts for s in l])) + contacts = list(set((str(c) for c in itertools.chain.from_iterable([s.contacts for s in l if s.competitive])))) contacts.sort() print("\n".join(contacts)) @@ -131,15 +131,6 @@ def validate(file: str) -> None: exit(1) -@app.command(rich_help_panel=conversion_panel) -def convert_csv(file: str, dstdir: Path) -> None: - """ - Convert a csv (old submission format) to json files (new format) - """ - dstdir.mkdir(parents=True, exist_ok=True) - smtcomp.convert_csv.convert_csv(Path(file), Path(dstdir)) - - @app.command(rich_help_panel=submissions_panel) def dump_json_schema(dst: Path) -> None: """ @@ -166,6 +157,7 @@ def generate_benchexec( timelimit_s: int = defs.Config.timelimit_s, memlimit_M: int = defs.Config.memlimit_M, cpuCores: int = defs.Config.cpuCores, + test: bool = False, ) -> None: """ Generate the benchexec file for the given submissions @@ -180,31 +172,17 @@ def generate_benchexec( (cachedir / "tools").mkdir(parents=True, exist_ok=True) for file in track(files): s = submission.read(str(file)) - smtcomp.benchexec.generate(s, cachedir, config) + smtcomp.benchexec.generate(s, cachedir, config, test) smtcomp.benchexec.generate_unsatcore_validation(s, cachedir, config) @app.command(rich_help_panel=benchexec_panel) -def convert_benchexec_results( - results: Path, -) -> None: +def convert_benchexec_results(results: Path, no_cache: bool = False) -> None: """ Load benchexec results and aggregates results in feather format """ - lf = smtcomp.results.parse_dir(results) - lf.collect().write_ipc(results / "parsed.feather") - - -@app.command(rich_help_panel=benchexec_panel) -def convert_aws_results( - results: Path, -) -> None: - """ - Load aws results in cvs format and aggregates results in feather format - """ - - lf = smtcomp.results.parse_aws_csv(results) + lf = smtcomp.results.parse_dir(results, no_cache) lf.collect().write_ipc(results / "parsed.feather") @@ -252,9 +230,8 @@ def store_results( on=["file"], defaults={"logic": -1, "family": "", "name": ""}, ) - .join(removed_results, on=["logic", "family", "name"], how="anti") - .sort("file", "solver") - .collect() + # .join(removed_results, on=["logic", "family", "name"], how="anti") + .sort("file", "solver").collect() ) if len(df) > 0: results_track = defs.Results( @@ -297,7 +274,7 @@ def stats_of_benchexec_results( """ config = defs.Config(data) - selected, _ = smtcomp.results.helper_get_results(config, results, track) + selected = smtcomp.results.helper_get_results(config, results, track) sum_answer = (pl.col("answer") == -1).sum() waiting = (pl.col("answer") == -1).all() @@ -379,7 +356,7 @@ def find_disagreement_results( """ config = defs.Config(data) config.use_previous_results_for_status = use_previous_year_results - selected, _ = smtcomp.results.helper_get_results(config, results, track) + selected = smtcomp.results.helper_get_results(config, results, track) df = ( selected.filter(pl.col("answer").is_in([int(defs.Answer.Sat), int(defs.Answer.Unsat)])) @@ -436,7 +413,7 @@ def scoring_removed_benchmarks( ) -> None: config = defs.Config(data) config.use_previous_results_for_status = use_previous_year_results - results, _ = smtcomp.results.helper_get_results(config, src, track) + results = smtcomp.results.helper_get_results(config, src, track) results = smtcomp.scoring.add_disagreements_info(results, track) @@ -468,7 +445,7 @@ def show_scores( If src is empty use results in data """ config = defs.Config(data) - results, _ = smtcomp.results.helper_get_results(config, src, track) + results = smtcomp.results.helper_get_results(config, src, track) smtcomp.scoring.sanity_check(config, results) @@ -613,12 +590,6 @@ def tree_info(tree: Tree, l: List[defs.InfoIncremental] | List[defs.InfoNonIncre print(tree) -@app.command(rich_help_panel=conversion_panel) -def convert_csv_result(src: Path, dst: Path, track: defs.Track) -> None: - results = smtcomp.convert_csv.convert_csv_result(src, track) - write_cin(dst, results.model_dump_json(indent=1)) - - def merge_results_aux(files: list[Path]) -> defs.Results: results: list[defs.Result] = [] for file in track(files, description="load results"): @@ -814,11 +785,14 @@ def scramble_aws( dstdir: Path, scrambler: Path, max_workers: int = 8, + test: bool = False, ) -> None: """ Show statistics on the benchmarks selected for aws tracks """ config = defs.Config(data) + if test: + config.seed = 1 smtcomp.scramble_benchmarks.select_and_scramble_aws(config, srcdir, dstdir, scrambler, max_workers) @@ -1035,7 +1009,7 @@ def keyfunc( t2 = t.add(solver) for rid, r, result in rs: stderr = result.stderr.strip().replace("\n", ", ") - basename = smtcomp.scramble_benchmarks.scramble_basename(r.scramble_id) + basename = r.benchmark_yml match result.status: case defs.Answer.Unsat: status = "[red]unsat[/red]" @@ -1060,8 +1034,8 @@ def keyfunc( dst = outdir / f"{rid.solver}.{rid.participation}" dst.mkdir(parents=True, exist_ok=True) filedir = benchmark_files_dir(cachedir, rid.track) - basename = smtcomp.scramble_benchmarks.scramble_basename(r.scramble_id) - basename_model = smtcomp.scramble_benchmarks.scramble_basename(r.scramble_id, suffix="rsmt2") + basename = r.benchmark_yml + basename_model = r.benchmark_yml.replace(".smt2", ".rsmt2") smt2_file = filedir / str(r.logic) / basename (dst / basename).unlink(missing_ok=True) (dst / basename).symlink_to(smt2_file.absolute()) @@ -1070,10 +1044,9 @@ def keyfunc( @app.command() -def generate_unsatcore_validation_files( - cachedir: Path, scrambler: Path, resultdirs: list[Path], max_workers: int = 8 -) -> None: - unsat_core_validation.generate_validation_files(cachedir, resultdirs, scrambler) +def generate_unsatcore_validation_files(cachedir: Path, scrambler: Path, resultdir: Path) -> None: + + unsat_core_validation.generate_validation_files(cachedir, resultdir, scrambler) @app.command() @@ -1083,8 +1056,8 @@ def export_results_pages(data: Path, track: defs.Track, results: list[Path] = ty Generate page for results pages in web directory """ config = defs.Config(data) - lf, selection = smtcomp.results.helper_get_results(config, results, track) - smtcomp.generate_website_page.export_results(config, selection, lf, track) + lf = smtcomp.results.helper_get_results(config, results, track) + smtcomp.generate_website_page.export_results(config, lf, track) @app.command() @@ -1144,12 +1117,57 @@ def build_dolmen(data: Path) -> None: def generate_certificates( website_results: Path = Path("web/content/results"), input_for_certificates: Path = Path("data/latex-certificates/input_for_certificates.tex"), - pretty_names: Path = Path("data/latex-certificates/solvers_pretty_name.csv"), + submission_dir: Path = Path("submissions"), experimental_division: Path = Path("data/latex-certificates/experimental.csv"), ) -> None: """ generates the input data for the tex certificate generator. """ smtcomp.certificates.generate_certificates( - website_results, input_for_certificates, pretty_names, experimental_division + website_results, input_for_certificates, submission_dir, experimental_division ) + + +@app.command() +def generate_graphics( + data: Path, + output: Path, + logic: list[defs.Logic] = [], + division: list[defs.Division] = [], + track: defs.Track = defs.Track.SingleQuery, + src: List[Path] = typer.Argument(None), +) -> None: + """ + Generate graphics in html format + + If src is empty use results in data + """ + config = defs.Config(data) + results = smtcomp.results.helper_get_results(config, src, track) + + smtcomp.scoring.sanity_check(config, results) + + results = smtcomp.scoring.add_disagreements_info(results, track).filter(disagreements=False).drop("disagreements") + + smtcomp_generate_graphics.save_output(config, results, output, logic, division) + + +@app.command() +def generate_website_graphics( + data: Path, + track: defs.Track, + src: List[Path] = typer.Argument(None), +) -> None: + """ + Generate graphics for hugo website + + If src is empty use results in data + """ + config = defs.Config(data) + results = smtcomp.results.helper_get_results(config, src, track) + + smtcomp.scoring.sanity_check(config, results) + + results = smtcomp.scoring.add_disagreements_info(results, track).filter(disagreements=False).drop("disagreements") + + smtcomp_generate_graphics.generate_pages(config, results, track) diff --git a/smtcomp/model_validation.py b/smtcomp/model_validation.py index aec99638..a315f9a6 100644 --- a/smtcomp/model_validation.py +++ b/smtcomp/model_validation.py @@ -10,6 +10,7 @@ from rich.progress import Progress, TaskID from pydantic import BaseModel, RootModel, Field from typing import Union +import polars as pl import pydantic from smtcomp.unpack import write_cin, read_cin @@ -28,7 +29,7 @@ def raise_stack_limit() -> None: resource.setrlimit(resource.RLIMIT_STACK, (soft, hard)) -def check_locally(config: defs.Config, smt2_file: Path, model: str) -> defs.Validation: +def check_locally(config: defs.Config, smt2_file: Path, model: str, force_logic_all: bool) -> defs.Validation: opts: list[str | Path] = [] opts.append(config.dolmen_binary) opts.extend( @@ -41,7 +42,7 @@ def check_locally(config: defs.Config, smt2_file: Path, model: str) -> defs.Vali "--warn=-all", ] ) - if config.dolmen_force_logic_ALL: + if force_logic_all: opts.append("--force-smtlib2-logic=ALL") opts.append(smt2_file) @@ -69,6 +70,7 @@ def check_locally(config: defs.Config, smt2_file: Path, model: str) -> defs.Vali elif ( r.stderr.endswith(b"E:id-def-conflict\n") or r.stderr.endswith(b"E:parsing-error\n") + or r.stderr.endswith(b"E:lexing-error\n") or r.stderr.endswith(b"E:unbound-id\n") or r.stderr.endswith(b"E:undefined-constant\n") ): @@ -87,24 +89,33 @@ def check_result_locally( rid: results.RunId, r: results.Run, model: str, + scramble_mapping: dict[int, int], ) -> defs.Validation: d = resultdir / "model_validation_results" - file_cache = d / f"{str(r.scramble_id)}.json.gz" + file_cache = d / f"{str(r.file)}.json.gz" + scramble_id = scramble_mapping[r.file] + force_logic_all = False + if file_cache.is_file(): - return defs.ValidationResult.model_validate_json(read_cin(file_cache)).root - else: - match r.answer: - case defs.Answer.Sat: - filedir = smtcomp.scramble_benchmarks.benchmark_files_dir(cachedir, rid.track) - basename = smtcomp.scramble_benchmarks.scramble_basename(r.scramble_id) - smt2_file = filedir / str(r.logic) / basename - val = check_locally(config, smt2_file, model) + result = defs.ValidationResult.model_validate_json(read_cin(file_cache)).root + match result: + case defs.ValidationError(stderr="E:forbidden-array-sort\n"): + force_logic_all = True case _: - val = defs.noValidation - d.mkdir(parents=True, exist_ok=True) - s = defs.ValidationResult(val).model_dump_json(indent=1) - write_cin(file_cache, s) - return val + return result + + match r.answer: + case defs.Answer.Sat: + filedir = smtcomp.scramble_benchmarks.benchmark_files_dir(cachedir, rid.track) + basename = smtcomp.scramble_benchmarks.scramble_basename(scramble_id) + smt2_file = filedir / str(r.logic) / basename + val = check_locally(config, smt2_file, model, force_logic_all) + case _: + val = defs.noValidation + d.mkdir(parents=True, exist_ok=True) + s = defs.ValidationResult(val).model_dump_json(indent=1) + write_cin(file_cache, s) + return val def prepare_model_validation_tasks( @@ -115,9 +126,7 @@ def prepare_model_validation_tasks( ( r.runid, b, - logfiles.get_output( - r.runid, smtcomp.scramble_benchmarks.scramble_basename(b.scramble_id, suffix="yml") - ), + logfiles.get_output(r.runid, b.benchmark_yml), resultdir, ) for r in results.parse_results(resultdir) @@ -130,6 +139,11 @@ def prepare_model_validation_tasks( def check_all_results_locally( config: defs.Config, cachedir: Path, resultdir: Path, executor: ThreadPool, progress: Progress ) -> list[tuple[results.RunId, results.Run, defs.Validation]]: + benchmark_dir = smtcomp.scramble_benchmarks.benchmark_files_dir(cachedir, defs.Track.ModelValidation) + mapping_csv = benchmark_dir / smtcomp.scramble_benchmarks.csv_original_id_name + assert mapping_csv.exists() + scramble_mapping = dict(pl.read_csv(mapping_csv).select("file", "scramble_id").iter_rows()) + raise_stack_limit() l = list( itertools.chain.from_iterable( @@ -143,7 +157,14 @@ def check_all_results_locally( return list( progress.track( executor.imap_unordered( - (lambda v: (v[0], v[1], check_result_locally(config, v[3], cachedir, v[0], v[1], v[2]))), l + ( + lambda v: ( + v[0], + v[1], + check_result_locally(config, v[3], cachedir, v[0], v[1], v[2], scramble_mapping), + ) + ), + l, ), description="Model validation", total=len(l), diff --git a/smtcomp/results.py b/smtcomp/results.py index 14b2444b..5de43d5b 100644 --- a/smtcomp/results.py +++ b/smtcomp/results.py @@ -30,7 +30,7 @@ def mangle(self) -> str: class Run(BaseModel): - scramble_id: int + file: int logic: defs.Logic cputime_s: float """ example: 0.211880968s""" @@ -40,6 +40,8 @@ class Run(BaseModel): """ example: true""" walltime_s: float """ example: 0.21279739192686975s""" + benchmark_yml: str + """ example: 467234_QF_ABVFP_20210211-Vector__RTOS_C_73c22d8f.yml""" # host: str # """ example: pontos07""" @@ -103,25 +105,26 @@ def parse_result(s: str) -> defs.Answer: return defs.Answer.Timeout if s.startswith("DONE"): return defs.Answer.Incremental - if s.startswith("OUT OF MEMORY"): + if s.startswith("OUT OF MEMORY") or s.startswith("KILLED BY SIGNAL 9"): return defs.Answer.OOM match s: case "false": return defs.Answer.Unsat case "true": return defs.Answer.Sat - case "unknown": + case "unknown" | "ERROR": return defs.Answer.Unknown - case "OUT OF MEMORY" | "OUT OF JAVA MEMORY": + case "OUT OF MEMORY" | "OUT OF JAVA MEMORY" | "KILLED BY SIGNAL 9": return defs.Answer.OOM case _: raise ValueError(f"Unknown result value {s}") -def convert_run(r: ET.Element) -> Run: +def convert_run(r: ET.Element) -> Run | None: parts = r.attrib["name"].split("/") logic = defs.Logic(parts[-2]) - scramble_id = smtcomp.scramble_benchmarks.unscramble_yml_basename(parts[-1]) + benchmark_yml = parts[-1] + benchmark_file = smtcomp.scramble_benchmarks.unscramble_yml_basename(benchmark_yml) cputime_s: Optional[float] = None memory_B: Optional[int] = None answer: Optional[defs.Answer] = None @@ -140,21 +143,23 @@ def convert_run(r: ET.Element) -> Run: walltime_s = parse_time(value) if cputime_s is None or memory_B is None or answer is None or walltime_s is None: - raise ValueError("xml of results doesn't contains some expected column") + print(f"xml of results doesn't contains some expected column for {r.attrib['name']}") + return None return Run( - scramble_id=scramble_id, + file=benchmark_file, logic=logic, cputime_s=cputime_s, memory_B=memory_B, answer=answer, walltime_s=walltime_s, + benchmark_yml=benchmark_yml, ) def parse_xml(file: Path) -> Results: result = ET.fromstring(read_cin(file)) - runs = list(map(convert_run, result.iterfind("run"))) + runs = list(filter_map(convert_run, result.iterfind("run"))) return Results(runid=RunId.unmangle(result.attrib["name"]), options=result.attrib["options"], runs=runs) @@ -223,17 +228,17 @@ def get_output(self: "LogFile", r: RunId, basename: str) -> str: return s[index:] -def mv_get_cached_results(resultdir: Path, scramble_id: int) -> defs.Validation | None: +def mv_get_cached_results(resultdir: Path, benchmark_id: int) -> defs.Validation | None: d = resultdir / "model_validation_results" - file_cache = d / f"{str(scramble_id)}.json.gz" + file_cache = d / f"{str(benchmark_id)}.json.gz" if file_cache.is_file(): return defs.ValidationResult.model_validate_json(read_cin(file_cache)).root else: return None -def mv_get_cached_answer(resultdir: Path, scramble_id: int) -> defs.Answer: - val = mv_get_cached_results(resultdir, scramble_id) +def mv_get_cached_answer(resultdir: Path, benchmark_id: int) -> defs.Answer: + val = mv_get_cached_results(resultdir, benchmark_id) if val is None: return defs.Answer.ModelNotValidated else: @@ -251,8 +256,8 @@ def mv_get_cached_answer(resultdir: Path, scramble_id: int) -> defs.Answer: re_inc_time = re.compile(r"^time ([0-9.]*)$", flags=re.MULTILINE) -def inc_get_nb_answers(logfiles: LogFile, runid: RunId, scramble_id: int) -> Tuple[defs.Answer, int, float | None]: - output = logfiles.get_output(runid, smtcomp.scramble_benchmarks.scramble_basename(scramble_id, suffix="yml")) +def inc_get_nb_answers(logfiles: LogFile, runid: RunId, yml_name: str) -> Tuple[defs.Answer, int, float | None]: + output = logfiles.get_output(runid, yml_name) if re_inc_trace_executor_wrong_output.search(output): return (defs.Answer.IncrementalError, 0, None) @@ -291,8 +296,8 @@ def get_unsat_core(output: str) -> UnsatCore | None: return items -def uc_get_uc(logfiles: LogFile, runid: RunId, scramble_id: int) -> UnsatCore | None: - output = logfiles.get_output(runid, smtcomp.scramble_benchmarks.scramble_basename(scramble_id, suffix="yml")) +def uc_get_uc(logfiles: LogFile, runid: RunId, yml_name: str) -> UnsatCore | None: + output = logfiles.get_output(runid, yml_name) return get_unsat_core(output) @@ -301,10 +306,10 @@ def to_pl(resultdir: Path, logfiles: LogFile, r: Results) -> pl.LazyFrame: def convert(a: Run) -> Dict[str, Any]: d = dict(a) if r.runid.track == defs.Track.ModelValidation and a.answer == defs.Answer.Sat: - a.answer = mv_get_cached_answer(resultdir, a.scramble_id) + d["answer"] = mv_get_cached_answer(resultdir, a.file) if r.runid.track == defs.Track.Incremental: - answer, nb_answers, last_time = inc_get_nb_answers(logfiles, r.runid, a.scramble_id) + answer, nb_answers, last_time = inc_get_nb_answers(logfiles, r.runid, a.benchmark_yml) a.answer = answer d["nb_answers"] = nb_answers # TODO: Since we forgot to readd timestamp for some answer @@ -313,10 +318,12 @@ def convert(a: Run) -> Dict[str, Any]: if last_time is not None: d["walltime_s"] = last_time d["cputime_s"] = last_time + else: + d["nb_answers"] = -1 if r.runid.track == defs.Track.UnsatCore: if d["answer"] == defs.Answer.Unsat: - uc = uc_get_uc(logfiles, r.runid, a.scramble_id) + uc = uc_get_uc(logfiles, r.runid, a.benchmark_yml) if uc is None: d["answer"] = defs.Answer.Unknown d["unsat_core"] = [] @@ -330,18 +337,21 @@ def convert(a: Run) -> Dict[str, Any]: # TODO: Since we forgot to readd timestamp for each answer # we don't have the time of the last answer for now # So we take the total for now + else: + d["unsat_core"] = [] d["answer"] = int(d["answer"]) d["logic"] = int(d["logic"]) return d - lf = pl.LazyFrame(map(convert, r.runs)) + # compute the list eagerly to avoid problems with 'infer_schema_length' + lf = pl.LazyFrame(list(map(convert, r.runs))) return lf.with_columns(solver=pl.lit(r.runid.solver), participation=r.runid.participation, track=int(r.runid.track)) -def parse_to_pl(file: Path) -> pl.LazyFrame: +def parse_to_pl(file: Path, no_cache: bool) -> pl.LazyFrame: feather = file.with_suffix(".feather") - if feather.exists(): + if not no_cache and feather.exists(): return pl.read_ipc(feather).lazy() with LogFile(file.parent) as logfiles: @@ -357,17 +367,17 @@ def parse_mapping(p: Path) -> pl.LazyFrame: return pl.LazyFrame( ( ( - smtcomp.scramble_benchmarks.unscramble_yml_basename(Path(k).name), + int(file), sorted(v["core"]), smtcomp.scramble_benchmarks.unscramble_yml_basename(Path(v["file"]).name), ) - for k, l in d.items() - for v in l + for file, cores in d.items() + for v in cores ), { - "scramble_id_orig": pl.Int64, + "orig_file": pl.Int64, "unsat_core": pl.List(pl.Int64), - "scramble_id": pl.Int64, + "file": pl.Int64, }, ) @@ -375,9 +385,9 @@ def parse_mapping(p: Path) -> pl.LazyFrame: json_mapping_name = "mapping.json" -def parse_dir(dir: Path) -> pl.LazyFrame: +def parse_dir(dir: Path, no_cache: bool) -> pl.LazyFrame: """ - output columns: solver, participation, track, basename, cputime_s, memory_B, status, walltime_s, scramble_id, file + output columns: solver, participation, track, basename, cputime_s, memory_B, status, walltime_s, file The track stored in the results is *not* used for some decisions: - if a file mapping.json is present it used and the original_id.csv is not needed @@ -386,48 +396,50 @@ def parse_dir(dir: Path) -> pl.LazyFrame: TODO: streamline the results directory hierarchy """ - csv = dir / smtcomp.scramble_benchmarks.csv_original_id_name - json = dir / json_mapping_name - if not csv.exists() and not json.exists(): - raise (ValueError(f"No file {csv!s} or {json!s} in the directory")) - - if csv.exists(): - lf = pl.read_csv(csv).lazy() - defaults: dict[str, Any] = {"file": -1} - else: - lf = parse_mapping(json) - defaults = {"unsat_core": [], "scramble_id_orig": -1} - l = list(dir.glob("**/*.xml.bz2")) if len(l) == 0: raise (ValueError(f"No results in the directory {dir!s}")) - l_parsed = list(track(map(parse_to_pl, l), total=len(l))) + l_parsed = list(track((parse_to_pl(f, no_cache) for f in l), total=len(l))) results = pl.concat(l_parsed) - results = add_columns(results, lf, on=["scramble_id"], defaults=defaults) - ucvr = dir / "../unsat_core_validation_results" / "parsed.feather" + uc_validation_results = dir / "../unsat_core_validation_results" / "parsed.feather" + + json = dir / json_mapping_name + if json.exists(): + # add information about the original benchmark to each UC validation run + lf = parse_mapping(json) + results = add_columns(results.drop("unsat_core"), lf, on=["file"], defaults={"unsat_core": [], "orig_file": -1}) + if (dir.name).endswith("unsatcore"): - if ucvr.is_file(): - vr = pl.read_ipc(ucvr).lazy() + if uc_validation_results.is_file(): + # compute stats of validated and refuted cores + vr = pl.read_ipc(uc_validation_results).lazy() vr = ( - vr.select("answer", "unsat_core", scramble_id="scramble_id_orig") - .group_by("scramble_id", "unsat_core") + vr.select("answer", "unsat_core", file="orig_file") + .group_by("file", "unsat_core") .agg( - sat=(pl.col("answer") == int(defs.Answer.Sat)).count(), - unsat=(pl.col("answer") == int(defs.Answer.Unsat)).count(), + sat=(pl.col("answer") == int(defs.Answer.Sat)).sum(), + unsat=(pl.col("answer") == int(defs.Answer.Unsat)).sum(), validation_attempted=True, ) ) + results = add_columns( results, vr, - on=["scramble_id", "unsat_core"], + on=["file", "unsat_core"], defaults={"sat": 0, "unsat": 0, "validation_attempted": False}, ) + + # change answer according to the validity of the core results = results.with_columns( - answer=pl.when((pl.col("answer") == int(defs.Answer.Unsat)) & (pl.col("sat") > pl.col("unsat"))) - .then(int(defs.Answer.UnsatCoreInvalidated)) - .otherwise("answer") + answer=pl.when((pl.col("answer") == int(defs.Answer.Unsat)) & (pl.col("sat") >= pl.col("unsat"))) + .then( + pl.when(pl.col("sat") == 0) + .then(int(defs.Answer.Unknown)) # sat == unsat == 0 + .otherwise(int(defs.Answer.UnsatCoreInvalidated)) + ) + .otherwise("answer") # sat < unsat ).drop("sat", "unsat", "unsat_core") else: results = results.with_columns(validation_attempted=False) @@ -435,9 +447,7 @@ def parse_dir(dir: Path) -> pl.LazyFrame: return results -def helper_get_results( - config: defs.Config, results: List[Path], track: defs.Track -) -> Tuple[pl.LazyFrame, pl.LazyFrame]: +def helper_get_results(config: defs.Config, results: List[Path], track: defs.Track) -> pl.LazyFrame: """ If results is empty use the one in data @@ -449,7 +459,7 @@ def helper_get_results( The second value returned is the selection """ - if len(results) == 0: + if results is None or len(results) == 0: lf = ( pl.read_ipc(config.cached_current_results[track]) .lazy() @@ -466,9 +476,19 @@ def helper_get_results( ) else: lf = pl.concat(pl.read_ipc(p / "parsed.feather").lazy() for p in results) - lf = lf.filter(track=int(track)).drop("scramble_id") + lf = lf.drop("logic", "participation") # Hack for participation 0 bug move "participation" to on= for 2025, + lf = lf.drop("benchmark_yml", "unsat_core") + + if False: + selection = smtcomp.selection.helper(config, track).drop("result") + else: + if track == defs.Track.Incremental: + selection = pl.read_ipc(config.cached_incremental_benchmarks).lazy() + else: + selection = pl.read_ipc(config.cached_non_incremental_benchmarks).lazy() + selection = intersect(selection, lf.select("file").unique(), on=["file"]).with_columns(selected=True) - selection = smtcomp.selection.helper(config, track).filter(selected=True).with_columns(track=int(track)) + selection = selection.with_columns(track=int(track)) selection = ( selection.unique() @@ -480,65 +500,53 @@ def helper_get_results( .lazy() ) + # defaults = { + # "division": -1, + # "family": -1, + # "logic": -1, + # "name": "", + # "participation": -1, + # "selected": True, + # } + + defaults = {} + + if track == defs.Track.Incremental: + # defaults["check_sats"] = -1 + pass + else: + # defaults["status"] = -1 + # defaults["asserts"] = -1 + pass + + if track == defs.Track.Parallel: + # defaults["hard"] = True + # defaults["unsolved"] = False + pass + else: + # defaults["current_result"] = -1 + # defaults["new"] = False + # defaults["run"] = True + # defaults["trivial"] = False + # defaults["file_right"] = "" + pass + + defaults["cputime_s"] = 0 + defaults["nb_answers"] = 0 + defaults["memory_B"] = 0 + defaults["walltime_s"] = 0 + defaults["answer"] = -1 + selected = intersect(selection, smtcomp.selection.solver_competing_logics(config), on=["logic", "track"]) selected = add_columns( selected, - lf.drop("logic", "participation"), # Hack for participation 0 bug move "participation" to on= for 2025 + lf, on=["file", "solver", "track"], - defaults={ - "answer": -1, - "cputime_s": 0, - "memory_B": 0, - "walltime_s": 0, - "nb_answers": 0, - }, + defaults=defaults, ) - return selected, selection + if track == defs.Track.Parallel: + selected = selected.with_columns(run=True) - -def parse_aws_csv(dir: Path) -> pl.LazyFrame: - """ - output columns: solver, participation, track, cputime_s, memory_B, status, walltime_s, scramble_id, file, answer - - Assumes that there is a file results.csv in the directory dir. The file - must contain columns: solver, scramble_id, logic, solver_time, file, track, solver_result - """ - - def aws_logic(logic: str) -> int: - return int(defs.Logic(logic)) - - def aws_track(track: str) -> int: - return int(defs.Track(track)) - - def aws_result(res: str) -> int: - match res: - case "unsat": - return int(defs.Answer.Unsat) - case "sat": - return int(defs.Answer.Sat) - case _: - return int(defs.Answer.Unknown) - - csv = dir / "results.csv" - if not csv.exists(): - raise (ValueError(f"results.csv missing in the directory")) - lf = pl.scan_csv(csv).select( - pl.col("solver"), - pl.col("scramble_id"), - pl.col("logic").apply(aws_logic, return_dtype=pl.Int64).alias("logic"), - pl.col("solver_time").alias("walltime_s"), - pl.col("file"), - pl.col("track").apply(aws_track, return_dtype=pl.Int32).alias("track"), - pl.col("solver_result").map_elements(aws_result, return_dtype=pl.Int64).alias("answer"), - ) - - results = lf.with_columns( - participation=pl.lit(0, dtype=pl.Int64), - memory_B=pl.lit(0, dtype=pl.Int64), - nb_answers=pl.lit(0, dtype=pl.Int64), - cputime_s=pl.lit(0, dtype=pl.Int64), - ) - - return results + return selected diff --git a/smtcomp/scramble_benchmarks.py b/smtcomp/scramble_benchmarks.py index 302e0cb7..b0caec34 100644 --- a/smtcomp/scramble_benchmarks.py +++ b/smtcomp/scramble_benchmarks.py @@ -12,7 +12,6 @@ import re from rich import print - csv_original_id_name = "original_id.csv" @@ -21,19 +20,18 @@ def scramble_basename(id: int, suffix: str = "smt2") -> str: def unscramble_yml_basename(basename: str) -> int: - # We are unscrabling scrambled%i.yml - assert basename[0:9] == "scrambled" - # assert basename[-4:] == ".yml" + # We are unscrabling {i}.yml or scrambled{i}_{core}.smt2 if basename[-4:] == ".yml": - return int(basename[9:-4]) + parts = basename.split("_") + file_id = parts[0] + return int(file_id) else: + assert basename[0:9] == "scrambled" assert basename[-5:] == ".smt2" s = basename[9:-5] - l = list(map(int, s.split("_"))) - i = l[0] - if len(l) > 1: - i += l[1] * 10_000_000 # Hack for unsat_core_verification - return i + file_id_int, core = list(map(int, s.split("_"))) + file_id_int += core * 10_000_000 # Hack for unsat_core_verification + return file_id_int def benchmark_files_dir(cachedir: Path, track: defs.Track) -> Path: @@ -58,34 +56,40 @@ def scramble_file(fdict: dict, incremental: bool, srcdir: Path, dstdir: Path, ar i = "incremental" else: i = "non-incremental" - fsrc = ( + orig_path = ( srcdir.joinpath(i) .joinpath(str(defs.Logic.of_int(fdict["logic"]))) .joinpath(Path(fdict["family"])) .joinpath(fdict["name"]) ) dstdir = dstdir.joinpath(str(defs.Logic.of_int(fdict["logic"]))) - fdst = dstdir.joinpath(scramble_basename(fdict["scramble_id"])) + scrambled_path = dstdir.joinpath(scramble_basename(fdict["scramble_id"])) dstdir.mkdir(parents=True, exist_ok=True) if incremental: subprocess.run( ["grep", "-o", "(set-info :status \\(sat\\|unsat\\|unknown\\))"], - stdin=fsrc.open("r"), - stdout=fdst.open("w"), + stdin=orig_path.open("r"), + stdout=scrambled_path.open("w"), ) - subprocess.run(["sed", "-i", "s/(set-info :status \\(.*\\))/\\1/", str(fdst)]) - with fdst.open("a") as dstfile: + subprocess.run(["sed", "-i", "s/(set-info :status \\(.*\\))/\\1/", str(scrambled_path)]) + with scrambled_path.open("a") as dstfile: dstfile.write("--- BENCHMARK BEGINS HERE ---\n") - subprocess.run(args, stdin=fsrc.open("r"), stdout=fdst.open("a")) + subprocess.run(args, stdin=orig_path.open("r"), stdout=scrambled_path.open("a")) else: try: - subprocess.run(args, stdin=fsrc.open("r"), stdout=fdst.open("w"), check=True) + subprocess.run(args, stdin=orig_path.open("r"), stdout=scrambled_path.open("w"), check=True) except subprocess.CalledProcessError as e: - print(f"[red]Warning[/red] scrambler crashed on {fsrc}") + print(f"[red]Warning[/red] scrambler crashed on {orig_path}") + + expected = get_expected_result(orig_path) if not incremental else None + + mangled_name = "_".join( + [str(fdict["file"]), str(defs.Logic.of_int(fdict["logic"])), fdict["family"].replace("/", "__"), fdict["name"]] + ) + yaml_dst = dstdir.joinpath(mangled_name).with_suffix(".yml") - expected = get_expected_result(fsrc) if not incremental else None - generate_benchmark_yml(fdst, expected, fsrc.relative_to(srcdir)) + generate_benchmark_yml(yaml_dst, scrambled_path, expected, orig_path.relative_to(srcdir)) def create_scramble_id(benchmarks: pl.LazyFrame, config: defs.Config) -> pl.LazyFrame: @@ -177,7 +181,7 @@ def select_and_scramble_aws( all = intersect(solvers, selected, on=["track", "logic"]).collect().lazy() for name, track in [("cloud", defs.Track.Cloud), ("parallel", defs.Track.Parallel)]: - dst = dstdir / name / "non-incremental" + dst = benchmark_files_dir(dstdir, track) dst.mkdir(parents=True, exist_ok=True) scramble_lazyframe( diff --git a/smtcomp/selection.py b/smtcomp/selection.py index 252f439a..af2917fa 100644 --- a/smtcomp/selection.py +++ b/smtcomp/selection.py @@ -89,7 +89,7 @@ def add_trivial_run_info(benchmarks: pl.LazyFrame, previous_results: pl.LazyFram "result": int(defs.Status.Unknown), "current_result": int(defs.Status.Unknown), }, - ).with_columns(new=pl.col("family").str.starts_with(str(config.current_year))) + ).with_columns(new=pl.col("family").str.starts_with(str(config.current_year - 1))) if config.use_previous_results_for_status: with_info = with_info.with_columns( @@ -174,6 +174,8 @@ def helper_compute_non_incremental(config: defs.Config, track: SimpleNonIncremen Returned columns: file (uniq id), logic, family,name, status, asserts nunmber, trivial, run (in previous year), new (benchmarks), selected """ benchmarks = pl.read_ipc(config.cached_non_incremental_benchmarks).lazy() + benchmarks = benchmarks.join(removed_benchmarks(config), on=["logic", "family", "name"], how="anti") + results = pl.read_ipc(config.cached_previous_results).lazy() match track: @@ -198,7 +200,9 @@ def helper_compute_incremental(config: defs.Config) -> pl.LazyFrame: """ Returned columns: file (uniq id), logic, family,name, status, asserts nunmber, trivial, run (in previous year), new (benchmarks), selected """ - benchmarks = pl.read_ipc(config.cached_incremental_benchmarks) + benchmarks = pl.read_ipc(config.cached_incremental_benchmarks).lazy() + benchmarks = benchmarks.join(removed_benchmarks(config), on=["logic", "family", "name"], how="anti") + results = pl.read_ipc(config.cached_previous_results) benchmarks_with_info = add_trivial_run_info(benchmarks.lazy(), results.lazy(), config) if config.invert_triviality: diff --git a/smtcomp/test_generation.py b/smtcomp/test_generation.py index 540a9533..fcba4baa 100644 --- a/smtcomp/test_generation.py +++ b/smtcomp/test_generation.py @@ -165,12 +165,12 @@ def write_test_files(data: Path) -> None: def compute_results_read_podium_division( config: defs.Config, track: defs.Track, check_sound_solvers: list[str] = [] ) -> smtcomp.generate_website_page.PodiumDivision: - results, selection = smtcomp.results.helper_get_results(config, [], track) + results = smtcomp.results.helper_get_results(config, [], track) if check_sound_solvers: scores = smtcomp.scoring.add_disagreements_info(results, track) sound_solvers = scores.filter(sound_solver=True).select("solver").unique().collect()["solver"].sort().to_list() assert sound_solvers == check_sound_solvers - smtcomp.generate_website_page.export_results(config, selection, results, track) + smtcomp.generate_website_page.export_results(config, results, track) page_suffix = smtcomp.generate_website_page.page_track_suffix(track) podium = smtcomp.generate_website_page.PodiumDivision.model_validate_json( (config.web_results / f"{logic.name.lower()}-{page_suffix}.md").read_text() @@ -182,12 +182,12 @@ def compute_results_read_podium_best_overall( config: defs.Config, track: defs.Track, check_sound_solvers: list[str] = [] ) -> smtcomp.generate_website_page.PodiumBestOverall: - results, selection = smtcomp.results.helper_get_results(config, [], track) + results = smtcomp.results.helper_get_results(config, [], track) if check_sound_solvers: scores = smtcomp.scoring.add_disagreements_info(results, track) sound_solvers = scores.filter(sound_solver=True).select("solver").unique().collect()["solver"].sort().to_list() assert sound_solvers == check_sound_solvers - smtcomp.generate_website_page.export_results(config, selection, results, track) + smtcomp.generate_website_page.export_results(config, results, track) page_suffix = smtcomp.generate_website_page.page_track_suffix(track) podium = smtcomp.generate_website_page.PodiumBestOverall.model_validate_json( (config.web_results / f"best-overall-{page_suffix}.md").read_text() diff --git a/smtcomp/tool.py b/smtcomp/tool.py index 723cba42..60b43753 100644 --- a/smtcomp/tool.py +++ b/smtcomp/tool.py @@ -47,6 +47,8 @@ def determine_result(self, run: BaseTool2.Run) -> Any: # type: ignore return result.RESULT_FALSE_PROP elif line == "sat": return result.RESULT_TRUE_PROP + elif "error" in line.lower(): + return result.RESULT_ERROR elif line == "TIMEOUT": return result.RESULT_TIMEOUT else: diff --git a/smtcomp/unsat_core_validation.py b/smtcomp/unsat_core_validation.py index bfe8ffa3..9c60fabb 100644 --- a/smtcomp/unsat_core_validation.py +++ b/smtcomp/unsat_core_validation.py @@ -6,6 +6,7 @@ import smtcomp.scramble_benchmarks from rich.progress import track import rich +import polars as pl import re from tempfile import NamedTemporaryFile from os.path import splitext @@ -24,7 +25,6 @@ def get_unsat_core(output: str) -> UnsatCore | None: assert len(answers) <= 1, "Multiple unsat cores!" if not answers: - print("No unsat core") return None core = answers[0][0] @@ -50,51 +50,64 @@ def generate_validation_file( rid: results.RunId, r: results.Run, scrambler: Path, - generated_files: defaultdict[Path, dict[FrozenUnsatCore, Path]], + scramble_mapping: dict[int, int], + generated_files: defaultdict[int, dict[FrozenUnsatCore, Path]], + target_dir: Path, ) -> None: assert r.answer == defs.Answer.Unsat filedir = smtcomp.scramble_benchmarks.benchmark_files_dir(cachedir, rid.track) - basename = smtcomp.scramble_benchmarks.scramble_basename(r.scramble_id) + + scramble_id = scramble_mapping[r.file] + basename = smtcomp.scramble_benchmarks.scramble_basename(scramble_id) benchmark_name = Path(str(r.logic)) / basename smt2_file = filedir / benchmark_name - solver_output = logfiles.get_output(rid, smtcomp.scramble_benchmarks.scramble_basename(r.scramble_id, suffix="yml")) + solver_output = logfiles.get_output(rid, r.benchmark_yml) core = get_unsat_core(solver_output) if core is None: + print(f"No unsat core for {r.benchmark_yml}") return - basename_file, basename_ext = splitext(basename) - (cachedir / "benchmarks" / "files_unsatcorevalidation" / str(r.logic)).mkdir(parents=True, exist_ok=True) - outdir = cachedir / "benchmarks" / "files_unsatcorevalidation" + (target_dir / str(r.logic)).mkdir(parents=True, exist_ok=True) frozen_core = tuple(core) - if frozen_core in generated_files[benchmark_name]: + if frozen_core in generated_files[r.file]: return - core_id = len(generated_files[benchmark_name]) + basename_file, basename_ext = splitext(basename) + core_id = len(generated_files[r.file]) validation_file = Path(str(r.logic)) / f"{basename_file}_{core_id}{basename_ext}" - validation_filepath = outdir / validation_file + validation_filepath = target_dir / validation_file create_validation_file(smt2_file, core, scrambler, validation_filepath) - generated_files[benchmark_name][frozen_core] = validation_file + generated_files[r.file][frozen_core] = validation_file -def generate_validation_files(cachedir: Path, resultdirs: list[Path], scrambler: Path) -> None: +def generate_validation_files(cachedir: Path, resultdir: Path, scrambler: Path) -> None: + benchmark_dir = smtcomp.scramble_benchmarks.benchmark_files_dir(cachedir, defs.Track.UnsatCore) target_dir = cachedir / "benchmarks" / "files_unsatcorevalidation" target_dir.mkdir(parents=True, exist_ok=True) - generated_files: defaultdict[Path, dict[FrozenUnsatCore, Path]] = defaultdict(dict) + mapping_csv = benchmark_dir / smtcomp.scramble_benchmarks.csv_original_id_name + assert mapping_csv.exists() + scramble_mapping = dict(pl.read_csv(mapping_csv).select("file", "scramble_id").iter_rows()) + + generated_files: defaultdict[int, dict[FrozenUnsatCore, Path]] = defaultdict(dict) - for resultdir in resultdirs: - rich.print(f"[green]Processing[/green] {resultdir}") - with results.LogFile(resultdir) as logfiles: + logfiles = list(resultdir.glob("**/*.logfiles.zip")) + for logfile in logfiles: + resultdir = logfile.parent + rich.print(f"[green]Processing[/green] {logfile}") + with results.LogFile(resultdir) as f: l = [ (r.runid, b) for r in results.parse_results(resultdir) for b in r.runs if b.answer == defs.Answer.Unsat ] - for r in track(l): - generate_validation_file(cachedir, logfiles, r[0], r[1], scrambler, generated_files) + for runid, run in track(l): + generate_validation_file( + cachedir, f, runid, run, scrambler, scramble_mapping, generated_files, target_dir + ) with open(target_dir / "mapping.json", "w") as f: - data = {str(k): [{"core": c, "file": str(f)} for (c, f) in v.items()] for (k, v) in generated_files.items()} + data = {k: [{"core": c, "file": str(f)} for (c, f) in v.items()] for (k, v) in generated_files.items()} json.dump(data, f) diff --git a/smtcomp/utils.py b/smtcomp/utils.py index 6ac6bf94..858e6d9f 100644 --- a/smtcomp/utils.py +++ b/smtcomp/utils.py @@ -28,12 +28,15 @@ def g(x: Tuple[W1, W2, U]) -> Tuple[W1, W2, V] | None: def add_columns(dst: pl.LazyFrame, from_: pl.LazyFrame, on: list[str], defaults: Dict[str, Any]) -> pl.LazyFrame: - dst_cols = set(dst.columns) - from_cols = set(from_.columns) + dst_cols = set(dst.collect_schema().names()) + from_cols = set(from_.collect_schema().names()) on_cols = set(on) assert on_cols.issubset(dst_cols) assert on_cols.issubset(from_cols) assert dst_cols.isdisjoint(from_cols.difference(on_cols)) + if from_cols.difference(on_cols) != defaults.keys(): + print(set(defaults.keys()).difference(from_cols.difference(on_cols))) + print(from_cols.difference(on_cols).difference(defaults.keys())) assert from_cols.difference(on_cols) == defaults.keys() fill_nulls = [pl.col(k).fill_null(value=v) for k, v in defaults.items()] return dst.join(from_, how="left", on=on, coalesce=True).with_columns(*fill_nulls) @@ -43,8 +46,8 @@ def intersect(dst: pl.LazyFrame, from_: pl.LazyFrame, on: list[str]) -> pl.LazyF """ All the possible matches in the two given tables """ - dst_cols = set(dst.columns) - from_cols = set(from_.columns) + dst_cols = set(dst.collect_schema().names()) + from_cols = set(from_.collect_schema().names()) on_cols = set(on) assert on_cols.issubset(dst_cols) assert on_cols.issubset(from_cols) diff --git a/submissions/STP-Parti-Bitwuzla-p16.json b/submissions/STP-Parti-Bitwuzla-p16.json index e343e55e..eb5a13b4 100644 --- a/submissions/STP-Parti-Bitwuzla-p16.json +++ b/submissions/STP-Parti-Bitwuzla-p16.json @@ -1,5 +1,5 @@ { - "name": "STP-Parti-Bitwuzla", + "name": "STP-Parti-Bitwuzla-32core", "contributors": [ "Mengyu Zhao", "Zhenghang Xu", diff --git a/submissions/STP-Parti-Bitwuzla-p32.json b/submissions/STP-Parti-Bitwuzla-p32.json index e72bf73b..e806cc64 100644 --- a/submissions/STP-Parti-Bitwuzla-p32.json +++ b/submissions/STP-Parti-Bitwuzla-p32.json @@ -1,5 +1,5 @@ { - "name": "STP-Parti-Bitwuzla", + "name": "STP-Parti-Bitwuzla-64core", "contributors": [ "Mengyu Zhao", "Zhenghang Xu", diff --git a/submissions/STP-Parti-Bitwuzla-p8.json b/submissions/STP-Parti-Bitwuzla-p8.json index f314ddfe..a123e462 100644 --- a/submissions/STP-Parti-Bitwuzla-p8.json +++ b/submissions/STP-Parti-Bitwuzla-p8.json @@ -1,5 +1,5 @@ { - "name": "STP-Parti-Bitwuzla", + "name": "STP-Parti-Bitwuzla-16core", "contributors": [ "Mengyu Zhao", "Zhenghang Xu", diff --git a/submissions/Z3-Parti-Z3pp-p16.json b/submissions/Z3-Parti-Z3pp-p16.json index 306bbfb8..03ea07d9 100644 --- a/submissions/Z3-Parti-Z3pp-p16.json +++ b/submissions/Z3-Parti-Z3pp-p16.json @@ -1,5 +1,5 @@ { - "name": "Z3-Parti-Z3pp", + "name": "Z3-Parti-Z3pp-32core", "contributors": [ "Mengyu Zhao", "Shaowei Cai" diff --git a/submissions/Z3-Parti-Z3pp-p32.json b/submissions/Z3-Parti-Z3pp-p32.json index 2779c767..8cc45168 100644 --- a/submissions/Z3-Parti-Z3pp-p32.json +++ b/submissions/Z3-Parti-Z3pp-p32.json @@ -1,5 +1,5 @@ { - "name": "Z3-Parti-Z3pp", + "name": "Z3-Parti-Z3pp-64core", "contributors": [ "Mengyu Zhao", "Shaowei Cai" diff --git a/submissions/Z3-Parti-Z3pp-p8.json b/submissions/Z3-Parti-Z3pp-p8.json index b347c9f1..2e24e12c 100644 --- a/submissions/Z3-Parti-Z3pp-p8.json +++ b/submissions/Z3-Parti-Z3pp-p8.json @@ -1,5 +1,5 @@ { - "name": "Z3-Parti-Z3pp", + "name": "Z3-Parti-Z3pp-16core", "contributors": [ "Mengyu Zhao", "Shaowei Cai" diff --git a/submissions/bitwuzla_parallel_16.json b/submissions/bitwuzla_parallel_16.json index 02a0abdb..9e8bfd03 100644 --- a/submissions/bitwuzla_parallel_16.json +++ b/submissions/bitwuzla_parallel_16.json @@ -1,5 +1,5 @@ { - "name": "Bitwuzla", + "name": "Bitwuzla-32core", "contributors": ["Aina Niemetz", "Mathias Preiner"], "contacts": ["Mathias Preiner "], "final" : true, diff --git a/submissions/bitwuzla_parallel_32.json b/submissions/bitwuzla_parallel_32.json index 06113d44..7e50a7f5 100644 --- a/submissions/bitwuzla_parallel_32.json +++ b/submissions/bitwuzla_parallel_32.json @@ -1,5 +1,5 @@ { - "name": "Bitwuzla", + "name": "Bitwuzla-64core", "contributors": ["Aina Niemetz", "Mathias Preiner"], "contacts": ["Mathias Preiner "], "final" : true, diff --git a/submissions/z3alpha-base.json b/submissions/z3alpha-base.json index d7a879a2..42f99e04 100644 --- a/submissions/z3alpha-base.json +++ b/submissions/z3alpha-base.json @@ -16,7 +16,6 @@ "tracks": ["SingleQuery"], "divisions": [ "Arith", - "Bitvec", "QF_Bitvec", "QF_LinearIntArith", "QF_LinearRealArith", diff --git a/tests/test_validate.py b/tests/test_validate.py index b320c07e..6289fa8b 100644 --- a/tests/test_validate.py +++ b/tests/test_validate.py @@ -4,7 +4,6 @@ import pytest from typer.testing import CliRunner -from smtcomp.convert_csv import convert_csv from smtcomp.main import app import smtcomp.defs as defs from smtcomp.submission import read diff --git a/web/content/news/2025-08-11-results.md b/web/content/news/2025-08-11-results.md new file mode 100644 index 00000000..299953c4 --- /dev/null +++ b/web/content/news/2025-08-11-results.md @@ -0,0 +1,10 @@ +--- +layout: single +author: +title: Results are available! +date: 2025-08-11T00:00:00+01:00 +--- + +The [results](/2025/results) of SMT-COMP 2025 are available on the website. Congratulations to all the winners! + +Processed data for each benchmark and solver are available in the [GitHub repository](https://github.com/SMT-COMP/smt-comp.github.io/tree/master/data). The raw execution data and the scrambled benchmarks will be uploaded to Zenodo in a few days. Stay tuned. diff --git a/web/content/solver_submission/template.json b/web/content/solver_submission/template.json deleted file mode 120000 index 4f276398..00000000 --- a/web/content/solver_submission/template.json +++ /dev/null @@ -1 +0,0 @@ -../../../submissions/template/template.json \ No newline at end of file diff --git a/web/content/solver_submission/template.json b/web/content/solver_submission/template.json new file mode 100644 index 00000000..14045240 --- /dev/null +++ b/web/content/solver_submission/template.json @@ -0,0 +1,31 @@ +{ + "name": "", + "contributors": [ + "First Smith", + { "name": "Second Baker", "website": "http://baker.com/" } + ], + "contacts": ["contact name "], + "archive": { + "url": "http://example.com/solver.tar.gz", + "h": { "sha256": "012345" } + }, + "website": "http://example.com/", + "system_description": "http://example.com/system.pdf", + "command": ["relative_cmd", "default_command_line"], + "solver_type": "Standalone", + "seed": "42", + "participations": [ + { "tracks": ["SingleQuery"], "divisions": ["Equality"] }, + { + "tracks": ["SingleQuery"], + "logics": "QF_.*LRA.*", + "command": ["relative_cmd", "other_option"] + }, + { + "tracks": ["SingleQuery"], + "logics": ["LIA"], + "archive": { "url": "http://example.com/solver_lia.tar.gz" }, + "command": ["relative_cmd", "--super-lia"] + } + ] +} diff --git a/web/data/results.json b/web/data/results.json index 4aa023a9..e4bce8ae 100644 --- a/web/data/results.json +++ b/web/data/results.json @@ -1,4 +1,3 @@ { - "processed": "https://github.com/SMT-COMP/smt-comp.github.io/tree/master/data", - "raw": "https://zenodo.org/records/14792281" + "processed": "https://github.com/SMT-COMP/smt-comp.github.io/tree/master/data" } diff --git a/web/hugo.toml b/web/hugo.toml index ad75f7eb..6e2cdf9e 100644 --- a/web/hugo.toml +++ b/web/hugo.toml @@ -35,10 +35,10 @@ theme = 'smtcomp' pageRef = 'previous' weight = 30 -#[[menu.year]] - #name = 'Results' - #pageRef = 'results' - #weight = 10 +[[menu.year]] + name = 'Results' + pageRef = 'results' + weight = 10 [[menu.year]] name = 'Rules' diff --git a/web/themes/smtcomp/assets/css/main.css b/web/themes/smtcomp/assets/css/main.css index 6d9216c3..8203b2d2 100644 --- a/web/themes/smtcomp/assets/css/main.css +++ b/web/themes/smtcomp/assets/css/main.css @@ -593,7 +593,7 @@ td.left { } td.non-competing-grey { - color: #707070; + color: gray; a { color: #808080; } diff --git a/web/themes/smtcomp/layouts/_default/result.html b/web/themes/smtcomp/layouts/_default/result.html index 8e1e5a4f..819b64c8 100644 --- a/web/themes/smtcomp/layouts/_default/result.html +++ b/web/themes/smtcomp/layouts/_default/result.html @@ -6,20 +6,31 @@ {{ $trueDivision := and (isset .Params "logics") (.Params.logics | len | ne 0) }} {{ $prettyTrack := index .Site.Data.pretty_names.track .Params.track }} + {{ $hasBaseSolvers := false }} + {{ $hasNoncompetingSolvers := false }} + + +{{ if .Params.is_competitive }}

{{ .Params.division }} ({{ $prettyTrack }})

-

- Competition results for the {{ .Params.division }} - {{ if $trueDivision }} division {{ else }} logic {{ end }} - in the {{ $prettyTrack }}. -

+

+ Competition results for the {{ .Params.division }} + {{ if $trueDivision }} division {{ else }} logic {{ end }} + in the {{ $prettyTrack }}. Chart

+

Results were generated on {{ .Params.resultdate }}

+

+ Benchmarks: {{ .Params.n_benchmarks }}
+ Time Limit: {{ .Params.time_limit }} seconds
+ Memory Limit: {{ .Params.mem_limit }} GB +

+{{ else }} +

{{ .Params.division }} ({{ $prettyTrack }})
non-competitive

+

+ Benchmarks: {{ .Params.n_benchmarks }}
+

+{{ end }} + -

Results were generated on {{ .Params.resultdate }}

-

- Benchmarks: {{ .Params.n_benchmarks }}
- Time Limit: {{ .Params.time_limit }} seconds
- Memory Limit: {{ .Params.mem_limit }} GB -

{{ if $trueDivision }} Logics:
    @@ -40,6 +51,7 @@

    {{ .Params.division }} ({{ $prettyTrack }})

    {{ $winner_category_names := .Site.Data.pretty_names.winner_performance }} {{ $category_names := .Site.Data.pretty_names.performance }} +{{ if .Params.is_competitive }}

    Winners

    @@ -65,6 +77,7 @@

    Winners

    {{ end }}
    +{{ end }} {{ range $cat := $categories }} {{ with index $.Params $cat }} @@ -79,8 +92,12 @@

    {{ index $category_names $cat }} Performance

    Wall Time Score Solved - Solved SAT - Solved UNSAT + {{ if in (slice "track_single_query" "track_model_validation" "track_parallel") $.Params.track }} + Solved SAT + {{ end }} + {{ if in (slice "track_single_query" "track_unsat_core" "track_parallel") $.Params.track }} + Solved UNSAT + {{ end }} Unsolved Abstained Timeout @@ -88,30 +105,65 @@

    {{ index $category_names $cat }} Performance

    {{ range $solver := . }} - - + +{{ if eq $solver.competing "no" }} + {{ $.Scratch.Set "hasNonCompetingSolvers" true }} +{{ end }} + + + + {{ $solver.name }} {{ if eq $solver.competing "no" }}n{{ end }} - {{ $solver.errorScore }} + {{ $solver.errorScore }} {{ if $solver.errorFootnote }} * {{ end }} - {{ $solver.correctScore }} - {{ $solver.CPUScore }} - {{ $solver.WallScore }} - - {{ $solver.solved }} - {{ $solver.solved_sat }} - {{ $solver.solved_unsat }} - {{ $solver.unsolved }} - {{ $solver.abstained }} - - {{ $solver.timeout }} - {{ $solver.memout }} + + {{ lang.FormatNumberCustom 0 $solver.correctScore "- ." }} + {{ if not (eq $solver.baseSolver "") }} + {{ $.Scratch.Set "hasBaseSolvers" true }} + {{ if not (lt $solver.deltaBaseSolver 0) }} +
    (base +{{ $solver.deltaBaseSolver }}) + {{ else }} +
    (base {{ $solver.deltaBaseSolver }}) + {{ end }} + {{ end }} + + {{ lang.FormatNumberCustom 2 $solver.CPUScore "- ." }} + {{ lang.FormatNumberCustom 2 $solver.WallScore "- ." }} + + {{ $solver.solved }} + {{ if in (slice "track_single_query" "track_model_validation" "track_parallel") $.Params.track }} + {{ $solver.solved_sat }} + {{ end }} + {{ if in (slice "track_single_query" "track_unsat_core" "track_parallel") $.Params.track }} + {{ $solver.solved_unsat }} + {{ end }} + {{ $solver.unsolved }} + {{ $solver.abstained }} + + {{ $solver.timeout }} + {{ $solver.memout }} {{ end }} + +{{ if ($.Scratch.Get "hasBaseSolvers") }} + + (base +/- n): for derived solvers: increment over base solver
    +
    +{{ end }} + +{{ if ($.Scratch.Get "hasNonCompetingSolvers") }} + + n: non-competing solver + +{{ end }} + + + {{ end }} {{ end }} diff --git a/web/themes/smtcomp/layouts/_default/result_comp.html b/web/themes/smtcomp/layouts/_default/result_comp.html index dce9e91f..5fd7a800 100644 --- a/web/themes/smtcomp/layouts/_default/result_comp.html +++ b/web/themes/smtcomp/layouts/_default/result_comp.html @@ -107,7 +107,9 @@

    {{ index $category_names $cat }}

    {{ $solver.division }} - {{ $solver.name }}{{ if eq $solver.competing "no" }}n{{ end }} + + {{ $solver.name }}{{ if eq $solver.competing "no" }}n{{ end }} + {{ $solver.contribution}} diff --git a/web/themes/smtcomp/layouts/_default/results.html b/web/themes/smtcomp/layouts/_default/results.html index cfbd8812..33ac64b4 100644 --- a/web/themes/smtcomp/layouts/_default/results.html +++ b/web/themes/smtcomp/layouts/_default/results.html @@ -15,7 +15,7 @@ "UnsatCore" "unsat-core" }} -

    SMT-COMP 2024 Results

    +

    SMT-COMP 2025 Results

    {{ if isset $data "processed" }} The processed data are available in the GitHub repository. diff --git a/web/themes/smtcomp/layouts/_default/results_summary.html b/web/themes/smtcomp/layouts/_default/results_summary.html index 0718a9ff..7766f147 100644 --- a/web/themes/smtcomp/layouts/_default/results_summary.html +++ b/web/themes/smtcomp/layouts/_default/results_summary.html @@ -25,7 +25,7 @@ {{ $categories_pretty := .Site.Data.pretty_names.performance }} -

    SMT-COMP 2024 Results - {{ $prettyTrack }}

    +

    SMT-COMP 2025 Results - {{ $prettyTrack }}

    Summary of all competition results for the {{ $prettyTrack }}. @@ -38,6 +38,8 @@

    SMT-COMP 2024 Results - {{ $prettyTrack }}

    {{ range $division := (sort .Params.divisions "division" "asc") }} {{ $divisionUrl := printf "../%s-%s" ($division.division | lower) $trackUrl }} + +{{ if $division.is_competitive }}

    {{ $division.division }}

    @@ -59,6 +61,7 @@

    {{ $division.division }}

    {{ end }}
    +{{ end }} {{ end }}