From dd4c0bf485650acf029df5b8844c1498fb0f8469 Mon Sep 17 00:00:00 2001 From: Maurizio Tomasi Date: Wed, 20 Nov 2024 10:58:43 +0100 Subject: [PATCH 1/4] =?UTF-8?q?Reorganize=20the=20User=E2=80=99s=20manual?= =?UTF-8?q?=20(#342)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Use PyData as the default theme for docs and update Sphinx and deps * Rework the structure of the documentation * Merge `Bandpasses` chapter into Detector and split `Scanning` * Remove duplicated material * Add missing reference * Remove spurious comma * Fix the grammar of a few sentences * Fix grammar and broken links, update references where needed * example in the noise page included, argument random in Simulation.add_noise is now optional * removed part of last commit * [skip ci] Update CHANGELOG --------- Co-authored-by: Luca Pagano --- CHANGELOG.md | 2 + docs/source/appendix.rst | 7 + docs/source/bandpasses.rst | 74 -- docs/source/conf.py | 4 +- docs/source/detectors.rst | 70 + docs/source/dipole.rst | 57 +- docs/source/external_modules.rst | 13 - docs/source/gaindrifts.rst | 114 +- docs/source/hwp.rst | 71 ++ docs/source/{external => }/hwp_sys.rst | 135 +- docs/source/imo.rst | 8 +- docs/source/index.rst | 35 +- docs/source/installation.rst | 227 +--- docs/source/map_scanning.rst | 197 +++ docs/source/mapmaking.rst | 22 +- docs/source/{timeordered.rst => noise.rst} | 186 +-- docs/source/non_linearity.rst | 89 +- docs/source/observations.rst | 2 +- docs/source/part1.rst | 8 + docs/source/part2.rst | 16 + docs/source/part3.rst | 13 + docs/source/part4.rst | 9 + docs/source/part5.rst | 7 + docs/source/part6.rst | 7 + docs/source/quaternions.rst | 142 +++ docs/source/random_numbers.rst | 100 +- docs/source/reports.rst | 4 +- docs/source/scanning.rst | 623 +++------ docs/source/simulations.rst | 2 +- docs/source/singularity.rst | 217 ++++ docs/source/sky_maps.rst | 60 +- litebird_sim/hwp_sys/hwp_sys.py | 15 +- poetry.lock | 1335 ++++++++++---------- pyproject.toml | 8 +- singularity/create-singularity-file.sh | 2 +- 35 files changed, 2066 insertions(+), 1815 deletions(-) create mode 100644 docs/source/appendix.rst delete mode 100644 docs/source/bandpasses.rst delete mode 100644 docs/source/external_modules.rst create mode 100644 docs/source/hwp.rst rename docs/source/{external => }/hwp_sys.rst (60%) create mode 100644 docs/source/map_scanning.rst rename docs/source/{timeordered.rst => noise.rst} (51%) create mode 100644 docs/source/part1.rst create mode 100644 docs/source/part2.rst create mode 100644 docs/source/part3.rst create mode 100644 docs/source/part4.rst create mode 100644 docs/source/part5.rst create mode 100644 docs/source/part6.rst create mode 100644 docs/source/quaternions.rst create mode 100644 docs/source/singularity.rst diff --git a/CHANGELOG.md b/CHANGELOG.md index 44987397..55c98b2d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ - **Breaking change**: Redefinition (ωt instead of 2ωt) of the hwp angle returned by `get_pointings()`. Change in the pointing returned by `Observation.get_pointings()`, now behaving as it was before this [commit](https://github.com/litebird/litebird_sim/pull/319/commits/b3bc3bb2049c152cc183d6cfc68f4598f5b93ec0). Documentation updated accordingly. [#340](https://github.com/litebird/litebird_sim/pull/340) +- Restructure the manual and use a new, cleaner style [#342](https://github.com/litebird/litebird_sim/pull/342) + - Module for including nonlinearity in the simulations [#331](https://github.com/litebird/litebird_sim/pull/331) - Improve the documentation of the binner and the destriper [#333](https://github.com/litebird/litebird_sim/pull/333) diff --git a/docs/source/appendix.rst b/docs/source/appendix.rst new file mode 100644 index 00000000..b8e2f2aa --- /dev/null +++ b/docs/source/appendix.rst @@ -0,0 +1,7 @@ +Appendices +========== + +.. toctree:: + :maxdepth: 1 + + bibliography.rst diff --git a/docs/source/bandpasses.rst b/docs/source/bandpasses.rst deleted file mode 100644 index 3ea3b96c..00000000 --- a/docs/source/bandpasses.rst +++ /dev/null @@ -1,74 +0,0 @@ -Bandpasses -========== - -Some theory ------------ - -Any electromagnetic detector is sensitive only to some frequencies of -the spectrum, and it is vital to know what they are. We refer to these -as the «bandpass», i.e., the list of frequencies that can «pass -through the detector» and be detected. A bandpass is a function -:math:`B(\nu)` that associates the frequency :math:`\nu` with a pure -number in the range 0…1, representing the fraction of power that is -actually measured by the instrument. The functional form of -:math:`B(\nu)` is usually called the *bandshape*, and it is usually -nonzero in a limited subset of the real space. - -A widely used analytical model of the bandshape is the top-hat bandpass: - -.. math:: - :name: eq:tophatbandpass - - B(\nu) = \begin{cases} - 1\,\text{ if } \nu_0 - \Delta\nu/2 < \nu < \nu_0 + \Delta\nu/2,\\ - 0\,\text{ otherwise.} - \end{cases} - -Given a bandshape :math:`B(\nu)`, two quantities are usually employed -to synthetically represent it: - -- The *central frequency* :math:`\left<\nu\right>`, which is just the - average value of :math:`\nu` when weighted with :math:`B(\nu)`: - - .. math:: - \left<\nu\right> = \frac{\int_0^\infty \nu B(\nu)\,\mathrm{d}\nu}{\int_0^\infty B(\nu)\,\mathrm{d}\nu} - - which is of course the formula of the weighted average. For the - top-hat band, the central frequency is :math:`\nu_0`. - -- The *bandwidth* :math:`\Delta\nu`, which is the *width* of the band, - i.e., a measurement of how wide is the subrange of the - electromagnetic spectrum sampled by the detector: - - .. math:: - - \Delta\nu^2 = \frac{\left(\int_0^\infty B(\nu)\,\mathrm{d}\nu\right)^2}{\int_0^\infty B^2(\nu)\,\mathrm{d}\nu}, - - which is again inspired by the formula of the standard square - deviation. For the top-hat bandshape, the value of :math:`\Delta\nu` - in :math:numref:`eq:tophatbandpass` is exactly the bandwidth. - - -Modeling bandshapes -------------------- - -In the LiteBIRD Simulation Framework, bandpasses are encoded in the -class :class:`.BandPassInfo`, which can be used either to load -bandpasses from the IMO or to generate them on scratch. In the latter -case, you must specify the central frequency and the bandwidth, -alongside with other parameter that introduce a random component meant -to make the band more realistic. Here is a simple example, which shows -how to create a bandpass and then how to add «noise» to make it more -realistic: - -.. plot:: pyplots/bandpass_demo.py - :include-source: - - -API reference -------------- - -.. automodule:: litebird_sim.bandpasses - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/source/conf.py b/docs/source/conf.py index 59282f60..d238be0e 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -17,7 +17,7 @@ # -- Project information ----------------------------------------------------- -project = "LiteBIRD simulation pipeline" +project = "LBS" copyright = "2020, The LiteBIRD Simulation Team" author = "The LiteBIRD Simulation Team" @@ -58,7 +58,7 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = "alabaster" +html_theme = "pydata_sphinx_theme" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, diff --git a/docs/source/detectors.rst b/docs/source/detectors.rst index 1a496468..39916f6c 100644 --- a/docs/source/detectors.rst +++ b/docs/source/detectors.rst @@ -286,6 +286,71 @@ each stage of the simulation: - 000_000_004_QB_040_T +Bandpasses +---------- + +Any electromagnetic detector is sensitive only to some frequencies of +the spectrum, and it is vital to know what they are. We refer to these +as the «bandpass», i.e., the list of frequencies that can «pass +through the detector» and be detected. A bandpass is a function +:math:`B(\nu)` that associates the frequency :math:`\nu` with a pure +number in the range 0…1, representing the fraction of power that is +actually measured by the instrument. The functional form of +:math:`B(\nu)` is usually called the *bandshape*, and it is usually +nonzero in a limited subset of the real space. + +A widely used analytical model of the bandshape is the top-hat bandpass: + +.. math:: + :name: eq:tophatbandpass + + B(\nu) = \begin{cases} + 1\,\text{ if } \nu_0 - \Delta\nu/2 < \nu < \nu_0 + \Delta\nu/2,\\ + 0\,\text{ otherwise.} + \end{cases} + +Given a bandshape :math:`B(\nu)`, two quantities are usually employed +to synthetically represent it: + +- The *central frequency* :math:`\left<\nu\right>`, which is just the + average value of :math:`\nu` when weighted with :math:`B(\nu)`: + + .. math:: + \left<\nu\right> = \frac{\int_0^\infty \nu B(\nu)\,\mathrm{d}\nu}{\int_0^\infty B(\nu)\,\mathrm{d}\nu} + + which is of course the formula of the weighted average. For the + top-hat band, the central frequency is :math:`\nu_0`. + +- The *bandwidth* :math:`\Delta\nu`, which is the *width* of the band, + i.e., a measurement of how wide is the subrange of the + electromagnetic spectrum sampled by the detector: + + .. math:: + + \Delta\nu^2 = \frac{\left(\int_0^\infty B(\nu)\,\mathrm{d}\nu\right)^2}{\int_0^\infty B^2(\nu)\,\mathrm{d}\nu}, + + which is again inspired by the formula of the standard square + deviation. For the top-hat bandshape, the value of :math:`\Delta\nu` + in :math:numref:`eq:tophatbandpass` is exactly the bandwidth. + + +Modeling bandshapes +~~~~~~~~~~~~~~~~~~~ + +In the LiteBIRD Simulation Framework, bandpasses are encoded in the +class :class:`.BandPassInfo`, which can be used either to load +bandpasses from the IMO or to generate them on scratch. In the latter +case, you must specify the central frequency and the bandwidth, +alongside with other parameter that introduce a random component meant +to make the band more realistic. Here is a simple example, which shows +how to create a bandpass and then how to add «noise» to make it more +realistic: + +.. plot:: pyplots/bandpass_demo.py + :include-source: + + + API reference ------------- @@ -293,3 +358,8 @@ API reference :members: :undoc-members: :show-inheritance: + +.. automodule:: litebird_sim.bandpasses + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/dipole.rst b/docs/source/dipole.rst index 4b6bc56d..5c1f2bfa 100644 --- a/docs/source/dipole.rst +++ b/docs/source/dipole.rst @@ -4,19 +4,22 @@ Dipole anisotropy ================= The LiteBIRD Simulation Framework provides tools to simulate the -signal associated with the relative velocity between the spacecraft's -rest frame with respect to the CMB. The motion of the spacecraft in -the rest frame of the CMB is the composition of several components: +signal associated with the relative velocity between the rest frame of +the spacecraft with respect to the CMB. The motion of the spacecraft +in the rest frame of the CMB is the composition of several components: 1. The motion of the spacecraft around L2; + 2. The motion of the L2 point in the Ecliptic plane; + 3. The motion of the Solar System around the Galactic Centre; + 4. The motion of the Milky Way. Components 1 and 2 are simulated by the LiteBIRD Simulation Framework -using appropriate models for the motions, while components 3 and 4 are -included using the Sun velocity derived by the solar dipole measured -by the Planck satellite. +using appropriate motion models, while components 3 and 4 are included +using the Sun velocity derived by the solar dipole measured by the +Planck satellite. The motion of the spacecraft around L2 is modelled using a Lissajous orbit similar to what was used for the WMAP experiment @@ -28,21 +31,21 @@ Position and velocity of the spacecraft The class :class:`.SpacecraftOrbit` describes the orbit of the LiteBIRD spacecraft with respect to the Barycentric Ecliptic Reference -Frame and the motion of Barycentric Ecliptic Reference Frame with respect -to the CMB; this class is necessary because the class +Frame and the motion of the Barycentric Ecliptic Reference Frame with +respect to the CMB; this class is necessary because the class :class:`.ScanningStrategy` (see the chapter :ref:`scanning-strategy`) only models the *direction* each instrument is looking at but knows nothing about the velocity of the spacecraft itself. -The class :class:`.SpacecraftOrbit` is a dataclass that is able to -initialize its members to sensible default values, which are taken -from the literature. As the LiteBIRD orbit around L2 is not fixed yet, -the code assumes a WMAP-like Lissajous orbit, :cite:`2008:wmap:cavaluzzi`. -For the Sun velocity it assumes Planck 2018 solar dipole +The class :class:`.SpacecraftOrbit` is a dataclass that can initialize +its members to sensible default values taken from the literature. As +the LiteBIRD orbit around L2 is not fixed yet, the code assumes a +WMAP-like Lissajous orbit, :cite:`2008:wmap:cavaluzzi`. For the Sun +velocity it assumes Planck 2018 solar dipole :cite:`2020:planck:hfi_data_processing`. To compute the position/velocity of the spacecraft, you call -:func:`.spacecraft_pos_and_vel`; it requires either a time span or an +:func:`.spacecraft_pos_and_vel`; it requires either a period or an :class:`.Observation` object, and it returns an instance of the class :class:`.SpacecraftPositionAndVelocity`: @@ -75,9 +78,9 @@ the table with the positions and the velocities in the fields arrays of shape ``(nsamples, 3)``. Here is a slightly more complex example that shows how to plot the -distance between the spacecraft and the Sun as a function of time, as -well as its speed. The latter quantity is of course most relevant when -computing the CMB dipole. +distance between the spacecraft and the Sun as a function of time and +speed. The latter quantity is, of course, most relevant when computing +the CMB dipole. .. plot:: pyplots/spacecraft_demo.py :include-source: @@ -118,13 +121,13 @@ and :math:`\mathrm{BB}(\nu, T)` is the spectral radiance of a black-body according to Planck's law: .. math:: \mathrm{BB}(\nu, T) = \frac{2h\nu^3}{c^2} \frac1{e^{h\nu/k_B T} - 1} = \frac{2h\nu^3}{c^2} \frac1{e^x - 1}. - -There is no numerical issue in computing the full formula, but often -models use some simplifications, to make the math easier to work on -the blackboard. The LiteBIRD Simulation Framework implements several -simplifications of the formula, which are based on a series expansion -of :eq:`dipole`; the caller must pass an object of type -:class:`.DipoleType` (an `enum class + +There is no numerical issue in computing the complete formula, but +often, models use some simplifications to make the math more +manageable to work on the blackboard. The LiteBIRD Simulation +Framework implements several simplifications of the formula, which are +based on a series expansion of :eq:`dipole`; the caller must pass an +object of type :class:`.DipoleType` (an `enum class `_), whose value signals which kind of approximation to use: @@ -184,8 +187,8 @@ Methods of class simulation --------------------------- The class :class:`.Simulation` provides two simple functions that compute -poisition and velocity of the spacescraft :func:`.Simulation.compute_pos_and_vel`, -and add the solar and orbital dipole to all the observations of a given +poisition and velocity of the spacescraft :func:`.Simulation.compute_pos_and_vel`, +and add the solar and orbital dipole to all the observations of a given simulation :func:`.Simulation.add_dipole`. .. testcode:: @@ -253,7 +256,7 @@ simulation :func:`.Simulation.add_dipole`. 3.45712e-03 Note that even if :func:`Simulation.compute_pos_and_vel` is not explicitly -invoked, :func:`Simulation.add_dipole` takes care of that internally initializing +invoked, :func:`Simulation.add_dipole` takes care of that internally initializing :class:`SpacecraftOrbit` and computing positions and velocities. API reference diff --git a/docs/source/external_modules.rst b/docs/source/external_modules.rst deleted file mode 100644 index 29221ed3..00000000 --- a/docs/source/external_modules.rst +++ /dev/null @@ -1,13 +0,0 @@ -.. _external_modules: - -External modules -================= - -This section contains a list of external modules implemented within litebird_sim. - - -.. toctree:: - :maxdepth: 1 - :caption: Modules: - - external/hwp_sys diff --git a/docs/source/gaindrifts.rst b/docs/source/gaindrifts.rst index 0a6c53df..fe51bf93 100644 --- a/docs/source/gaindrifts.rst +++ b/docs/source/gaindrifts.rst @@ -1,12 +1,24 @@ Gain drift injection ==================== -Gain drift is the systematic that is multiplicative to time-ordered data. The LiteBIRD Simulation Framework provides a gain drift simulation module that is based on the implementation of the same in ``toast3``. Though the exact nature of the gain drift depends on the specifics of the electronics, the gain drift module provides the functions to simulate two kinds of gain drifts: +Gain drift is the systematic that is multiplicative to time-ordered +data. The LiteBIRD Simulation Framework provides a gain drift +simulation module based on the same module in ``toast3``. Though the +exact nature of the gain drift depends on the specifics of the +electronics, the gain drift module provides the functions to simulate +two kinds of gain drifts: -1. Linear gain drift -2. Thermal gain drift +1. Linear gain drifts; -For any kind of gain drift, one can use either the method of :class:`.Simulation` class :meth:`.Simulation.apply_gaindrift()`, or any of the low level functions: :func:`.apply_gaindrift_to_observations()`, :func:`.apply_gaindrift_to_tod()`, :func:`.apply_gaindrift_for_one_detector()`. The following example shows the typical usage of the method and low level functions: +2. Thermal gain drifts. + +For any gain drift, one can use either the method of +:class:`.Simulation` class :meth:`.Simulation.apply_gaindrift()`, or +any of the low-level functions: +:func:`.apply_gaindrift_to_observations()`, +:func:`.apply_gaindrift_to_tod()`, +:func:`.apply_gaindrift_for_one_detector()`. The following example +shows the typical usage of the method and low-level functions: .. code-block:: python @@ -92,12 +104,20 @@ For any kind of gain drift, one can use either the method of :class:`.Simulation det_name=sim1.observations[0].name[idx], drift_params=drift_params, ) - + # The four TODs we obtain this way are equal to each other. -One has to specify the gain drift simulation parameters as an instance of the :class:`.GainDriftParams` class. The type of the gain drift can be specified using the enum class :class:`.GainDriftType`. The :class:`.GainDriftParams` class also offers the facility to specify the distribution of the slope for the linear gain and the distribution of the detector mismatch for the thermal gain, which can be specified with the help of another enum class :class:`.SamplingDist`. +One has to specify the gain drift simulation parameters as an instance +of the :class:`.GainDriftParams` class. The type of the gain drift can +be selected using the enum class :class:`.GainDriftType`. The +:class:`.GainDriftParams` class also offers the facility to specify +the distribution of the slope for the linear gain and the distribution +of the detector mismatch for the thermal gain, which can be specified +with the help of the enum class :class:`.SamplingDist`. -Following is an example of linear gain drift simulation parameters where the slope of gain for different detectors follow Gaussian distribution with mean 0.8 and standard deviation 0.2: +Following is an example of linear gain drift simulation parameters +where the slope of gain for different detectors follows Gaussian +distribution with a mean of 0.8 and a standard deviation of 0.2: .. code-block:: python @@ -110,7 +130,9 @@ Following is an example of linear gain drift simulation parameters where the slo sampling_gaussian_scale = 0.2, ) -The following example show the thermal gain drift simulation parameters where the detector mismatch within a detector group has uniform distribution varying between the factors 0.2 to 0.8: +The following example shows the thermal gain drift simulation +parameters where the detector mismatch within a detector group has a +uniform distribution varying between the factors 0.2 to 0.8: .. code-block:: python @@ -128,45 +150,97 @@ Refer to the :ref:`gd-api-reference` for the full list of gain drift simulation Linear gain drift ----------------- -Linear gain drift is the linearly increasing factor to the TODs. The :mod:`.gaindrifts` module provides method and functions to simulate the linear gain drift with the possibility of periodic calibration. The calibration event resets the gain factor to one periodically after every calibration period interval. The calibration period can be specified with the attribute :attr:`.GainDriftParams.calibration_period_sec`. The following example shows the time evolution of the linear gain drift factor over four days with calibration period of 24 hours: +Linear gain drift is the linearly increasing factor for TODs. The +:mod:`.gaindrifts` module provides methods and functions to simulate +the linear gain drift with the possibility of periodic calibration. +The calibration event resets the gain factor to one periodically after +every calibration period interval. You can specify the calibration +period with the attribute +:attr:`.GainDriftParams.calibration_period_sec`. The following example +shows the time evolution of the linear gain drift factor over four +days with a calibration period of 24 hours: .. plot:: pyplots/lingain_demo.py :include-source: -Note that the figure above shows only the nature of linear gain drift factor that is to be multiplied with the sky TOD, to obtain the sky TOD with linear gain. +Note that the figure above shows only the nature of the linear gain +drift factor to be multiplied by the sky TOD. -The module is written in a way to generate different gain slopes for different detectors. The slope (or the peak amplitude) of the linear gain is determined by the factor :math:`\sigma_{drift}\times\delta`, where :math:`\sigma_{drift}` is a dimensionless parameter specified by :attr:`.GainDriftParams.sigma_drift` and :math:`\delta` is the random factor generated uniquely for each detector. The distribution of :math:`\delta` or conversely, the distribution of the gain slopes over all the detectors can be specified with attributes of :class:`.SamplingDist` enum class and the associated parameters listed in :class:`.GainDriftParams`. +The module generates different gain slopes for different detectors. +The factor :math:`\sigma_{drift}\times\delta` determines the slope (or +the peak amplitude) of the linear gain, where :math:`\sigma_{drift}` +is a dimensionless parameter specified by +:attr:`.GainDriftParams.sigma_drift` and :math:`\delta` is the random +factor generated uniquely for each detector. The distribution of +:math:`\delta` or, conversely, the distribution of the gain slopes +over all the detectors can be specified with attributes of +:class:`.SamplingDist` enum class and the associated parameters listed +in :class:`.GainDriftParams`. Thermal gain drift ------------------ -The thermal gain drift is modelled as the gain drift due to :math:`1/f` fluctuation in focalplane temperature. In the first step, the :math:`1/f` noise timestream is generated from oversampled power spectral density given by +The thermal gain drift is modelled as the gain drift due to +:math:`1/f` fluctuation in focalplane temperature. In the first step, +the :math:`1/f` noise timestream is generated from oversampled power +spectral density given by .. math:: S(f) = \sigma_{drift}^2\left(\frac{f_{knee}}{f}\right)^{\alpha_{drift}} -The noise timestream is considered to be same for all the detectors belonging to a given detector group. One may specify which detector parameter to be used to make detector group, using the attribute :attr:`.GainDriftParams.focalplane_group`. It can be set to `"wafer"`, `"pixtype"` or even `"channel"`. For example, if :attr:`.GainDriftParams.focalplane_group = "wafer"`, all the detectors with same wafer name will be considered in one group and will have same noise timestream. - -Once the noise timestreams are obtained for all focalplane groups, a mismatch for the detectors within a group is introduced by a random factor and the detector mismatch factor. The noise timestream with detector mismatch can be given as following +The noise timestream is considered to be the same for all the +detectors belonging to a given detector group. One may specify which +detector parameter to use to make a detector group, using the +attribute :attr:`.GainDriftParams.focalplane_group`. Valid values are +`"wafer"`, `"pixtype"`, or `"channel"`. For example, if +:attr:`.GainDriftParams.focalplane_group = "wafer"`, all the detectors +with the same wafer name will be considered in one group and have the +same noise timestream. + +Once the noise timestreams are obtained for all the groups in the +focal plane, the code inserts a mismatch for the detectors within a +group by a random factor and the detector mismatch factor. We can +express the noise timestream with detector mismatch using the +following expression: .. math:: t^{(mis)}_{stream} = (1 + \delta\times\alpha_{mis})t_{stream} -where :math:`\alpha_{mis}` is the detector mismatch factor specified using the attribute :attr:`.GainDriftParams.detector_mismatch` and :math:`\delta` is the random factor generated uniquely for each detector. The distribution of :math:`\delta` or conversely, the distribution of noise timestream mismatch can be specified with attributes of :class:`.SamplingDist` enum class and the associated parameters listed in :class:`.GainDriftParams`. +where :math:`\alpha_{mis}` is the detector mismatch factor specified +using the attribute :attr:`.GainDriftParams.detector_mismatch` and +:math:`\delta` is the random factor generated uniquely for each +detector. The distribution of :math:`\delta` or, conversely, the +distribution of noise timestream mismatch can be specified with +attributes of :class:`.SamplingDist` enum class and the associated +parameters listed in :class:`.GainDriftParams`. -The mismatched timestream is then scaled and passed through a responsivity function to finally obtain the thermal gain factor (:math:`\sigma`): +The mismatched timestream is then scaled and passed through a +responsivity function to obtain the thermal gain factor +(:math:`\sigma`): .. math:: \sigma = \text{responsivity_function}\left(1+\frac{ t^{(mis)}_{stream} \times \delta_T }{T_{bath}}\right) -where :math:`\delta_T` is the amplitude of the thermal gain fluctuation in Kelvin unit, specified with attribute :attr:`.GainDriftParams.thermal_fluctuation_amplitude_K`, and :math:`T_{bath}` is the temperature of the focalplane in Kelvin unit specified with the attribute :attr:`.GainDriftParams.focalplane_Tbath_K`. +where :math:`\delta_T` is the amplitude of the thermal gain +fluctuation in Kelvin unit, specified with attribute +:attr:`.GainDriftParams.thermal_fluctuation_amplitude_K`, and +:math:`T_{bath}` is the temperature of the focalplane in Kelvin unit +specified with the attribute +:attr:`.GainDriftParams.focalplane_Tbath_K`. -The following example shows the comparison of thermal gain drift factor with or without detector mismatch over 100 seconds. +The following example shows the comparison of thermal gain drift +factor with or without detector mismatch over 100 seconds. .. plot:: pyplots/thermalgain_demo.py :include-source: -In the plots above, when there is no detector mismatch, ``det_A_wafer_1`` and ``det_B_wafer_1`` have same gain drift factor as they belong to the same focalplane group (grouped by wafer name). But when the detector mismatch is enabled, the two gain drift factors have same shape due to the same underlying noise timestream, but differ slightly in amplitude due to an additional random mismatch factor. +In the plots above, when there is no detector mismatch, +``det_A_wafer_1`` and ``det_B_wafer_1`` have the same gain drift +factor as they belong to the same focal plane group (grouped by wafer +name). However, when the detector mismatch is enabled, the two gain +drift factors have the same shape due to the same underlying noise +timestream but differ slightly in amplitude due to an additional +random mismatch factor. .. _gd-api-reference: diff --git a/docs/source/hwp.rst b/docs/source/hwp.rst new file mode 100644 index 00000000..1f1a4256 --- /dev/null +++ b/docs/source/hwp.rst @@ -0,0 +1,71 @@ +Ideal Half Wave Plate +===================== + +The rotation of the polarization angle induced by a HWP can be +included in the returned pointing information by passing an instance +of a descendant of the class :class:`.HWP` to the method +:meth:`.Simulation.set_hwp`. Here is an example:: + + import litebird_sim as lbs + + sim = lbs.Simulation( + start_time=0, + duration_s=100.0, + random_seed=12345, + ) + + sim.set_scanning_strategy( + lbs.SpinningScanningStrategy( + spin_sun_angle_rad=0.785_398_163_397_448_3, + precession_rate_hz=8.664_850_513_998_931e-05, + spin_rate_hz=0.000_833_333_333_333_333_4, + start_time=sim.start_time, + ), + delta_time_s=60, + ) + + sim.set_instrument( + instrument = lbs.InstrumentInfo( + boresight_rotangle_rad=0.0, + spin_boresight_angle_rad=0.872_664_625_997_164_8, + spin_rotangle_rad=3.141_592_653_589_793, + ) + ) + + sim.set_hwp( + lbs.IdealHWP(ang_speed_radpsec=4.084_070_449_666_731), + ) + + det = lbs.DetectorInfo( + name="Boresight_detector", + sampling_rate_hz=1.0, + quat=[0.0, 0.0, 0.0, 1.0], + ) + obs, = sim.create_observations(detectors=[det]) + + sim.prepare_pointings() + + pointing, hwp_angle = sim.observations[0].get_pointings() + +This example uses the :class:`.IdealHWP`, which represents an ideal +spinning HWP. The method :func:`.get_pointings` returns both pointing +and hwp angle on the fly. As shown before a similar syntax allow to +precompute the pointing and the hwp angle:: + + sim.prepare_pointings() + sim.precompute_pointings() + + sim.observations[0].pointing_matrix.shape + sim.observations[0].hwp_angle.shape + +This fills the fields `pointing_matrix` and `hwp_angle` for all the +observations in the current simulation. + + +API reference +------------- + +.. automodule:: litebird_sim.hwp + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/external/hwp_sys.rst b/docs/source/hwp_sys.rst similarity index 60% rename from docs/source/external/hwp_sys.rst rename to docs/source/hwp_sys.rst index 28db86cb..09745d00 100644 --- a/docs/source/external/hwp_sys.rst +++ b/docs/source/hwp_sys.rst @@ -1,30 +1,32 @@ .. _hwp_sys: -HWP_sys -======= - +HWP systematics +=============== -This module implements HWP non-idealities both using Jones formalism (as -described in `Giardiello et al. 2021 `_) and the Mueller one. In -the Jones formalism, a non-ideal HWP is described by +This module implements HWP non-idealities both using Jones’ formalism +(as described in `Giardiello et al. 2021 +`_) and Mueller’s. In Jones’ +formalism, a non-ideal HWP is described by .. math:: :label: non_ideal_hwp_jones - J_{HWP} = \begin{pmatrix} 1+h_{1} & \zeta_{1} e^{i \chi_1}\\ \zeta_{2} e^{i \chi_2}& -(1+h_{2}) e^{i \beta} \\ \end{pmatrix} + J_{\text{HWP}} = \begin{pmatrix} 1+h_{1} & \zeta_{1} e^{i \chi_1}\\ \zeta_{2} e^{i \chi_2}& -(1+h_{2}) e^{i \beta} \\ \end{pmatrix} where: * :math:`h_1` and :math:`h_2` are the efficiencies, describing the deviation from the unitary - transmission of light components :math:`E_x`, :math:`E_y`. In the ideal case, + transmission of light components :math:`E_x`, :math:`E_y`. In the ideal case, :math:`h_1 = h_2 = 0`; -* :math:`\beta=\phi-\pi`, where :math:`\phi` is the phase shift between the two + +* :math:`\beta=\phi-\pi`, where :math:`\phi` is the phase shift between the two directions. It accounts for variations of the phase difference between :math:`E_x` and :math:`E_y` with respect to the nominal value of :math:`\pi` for an ideal HWP. In the ideal case, :math:`\beta=0`; -* :math:`\zeta_{1,2}` and :math:`\chi_{1,2}` are amplitudes and phases of the + +* :math:`\zeta_{1,2}` and :math:`\chi_{1,2}` are amplitudes and phases of the off-diagonal terms, coupling :math:`E_x` and :math:`E_y`. In practice, if the - incoming wave is fully polarized along x(y), a spurious y(x) component would + incoming wave is fully polarized along x(y), a spurious y(x) component would show up in the outgoing wave. In the ideal case, :math:`\zeta_{1,2}=\chi_{1,2}=0`. In the Mueller formalism, we have a general matrix @@ -32,60 +34,73 @@ In the Mueller formalism, we have a general matrix .. math:: :label: non_ideal_hwp_mueller - J_{HWP} = \begin{pmatrix} M^{TT} & M^{TQ} & M^{TU} \\ M^{QT} & M^{QQ} & M^{QU} \\ M^{UT} & M^{UQ} & M^{UU} \\ \end{pmatrix} + J_{\text{HWP}} = \begin{pmatrix} M^{TT} & M^{TQ} & M^{TU} \\ M^{QT} & M^{QQ} & M^{QU} \\ M^{UT} & M^{UQ} & M^{UU} \\ \end{pmatrix} which, in the ideal case, would be .. math:: :label: ideal_hwp_mueller - J_{HWP} = \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \\ \end{pmatrix} + J_{\text{HWP}} = \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \\ \end{pmatrix} In the most general case, the Jones non-ideal parameters and the Mueller matrix elements can vary inside a bandpass. -The class :class:`.hwp_sys.HwpSys` is a contanier for the parameters of the HWP systematics. -It defines three methods: - -* :meth:`.hwp_sys.HwpSys.set_parameters` which sets the defaults and handles the interface with - the parameter file of the simulation. The relevant section is tagged by ``[hwp_sys]``. The HWP - parameters can be passed both in the Jones and Mueller formalism. This choice is regulated by - the flag ``mueller_or_jones``, which has to be set to either ``"mueller"`` or ``"jones"``. In - case the Jones formalism is chosen, it is converted automatically into the Mueller one through - the function ``.hwp_sys.JonesToMueller``. There is also the possibility to pass precomputed input - maps (as a numpy array) through the ``maps`` argument. Otherwise, input maps are internally - computed through the litebird_sim map based simulator (mbs). - The argument ``integrate_in_band`` sets whether band integration is performed in the TOD - computation; if ``built_map_on_the_fly = True``, the map-making can be performed internally - (instead of using the litebird_sim binner); ``correct_in_solver`` sets whether non-ideal - parameters can be used in the map-making (map-making assuming a non-ideal HWP, generally using - different HWP non-ideal parameters than the one used in the TOD, representing our estimate of - their true value); ``integrate_in_band_solver`` regulates whether band integration is performed - in the map-making (to compute the :math:`B^T B` and :math:`B^T d` terms, see below). - - -* :meth:`.hwp_sys.HwpSys.fill_tod` which fills the tod in a given Observation. The ``pointings`` - angles passed have to include no rotating HWP, since the effect of the rotating HWP to the +The class :class:`.hwp_sys.HwpSys` is a container for the parameters +of the HWP systematics. It defines three methods: + +* :meth:`.hwp_sys.HwpSys.set_parameters`, which sets the defaults and + handles the interface with the parameter file of the simulation. The + relevant section is tagged by ``[hwp_sys]``. The HWP parameters can + be passed both in the Jones' and Mueller's formalism. This choice is + regulated by the flag ``mueller_or_jones``, which can have the + values ``"mueller"`` or ``"jones"``. In case the Jones formalism is + chosen, it is converted automatically into the Mueller one through + the function ``.hwp_sys.JonesToMueller``. There is also the + possibility of passing precomputed input maps (as a NumPy array) + through the ``maps`` argument. Otherwise, the code computes input + maps through the module Mbs (see :ref:`Mbs`). The argument + ``integrate_in_band`` sets whether to perform band integration in + the TOD computation; if ``built_map_on_the_fly = True``, the + map-making can be performed internally (instead of using the + litebird_sim binner); ``correct_in_solver`` sets whether non-ideal + parameters can be used in the map-making (map-making assuming a + non-ideal HWP, generally using different HWP non-ideal parameters + than the one used in the TOD, representing our estimate of their + true value); ``integrate_in_band_solver`` regulates whether band + integration is performed in the map-making (to compute the + :math:`B^T B` and :math:`B^T d` terms, see below). + +* :meth:`.hwp_sys.HwpSys.fill_tod` which fills the tod in a given Observation. The ``pointings`` + angles passed have to include no rotating HWP, since the effect of the rotating HWP to the polarization angle is included in the TOD computation. The TOD is computed performing this operation: - :math:`d_{obs}\left(t_{i}\right)\,=\,\frac{\int d\nu\,\frac{\partial BB(\nu,T)}{\partial T_{CMB}}\,\tau\left(\nu\right)\,M_{i}^{TX}(\nu)\left(m_{CMB}+m_{FG}\left(\nu\right)\right)}{\int d\nu \frac{\partial BB(\nu,T)}{\partial T_{CMB}}\,\tau \left(\nu\right)}`, - - where :math:`\tau(\nu)` is the bandpass, - :math:`\frac{\partial BB(\nu,T)}{\partial T_{CMB}}` converts from CMB thermodynamic temperature - to differential source intensity (see eq.8 of https://arxiv.org/abs/1303.5070) and + .. math:: + + d_{\text{obs}}\left(t_{i}\right)\,=\,\frac{\int d\nu\,\frac{\partial BB(\nu,T)}{\partial T_{\text{CMB}}}\,\tau\left(\nu\right)\,M_{i}^{TX}(\nu)\left(m_{\text{CMB}}+m_{\text{FG}}\left(\nu\right)\right)}{\int d\nu \frac{\partial BB(\nu,T)}{\partial T_{\text{CMB}}}\,\tau \left(\nu\right)}, + + where :math:`\tau(\nu)` is the bandpass, + :math:`\frac{\partial BB(\nu,T)}{\partial T_{\text{CMB}}}` converts from CMB thermodynamic temperature + to differential source intensity (see eq.8 of https://arxiv.org/abs/1303.5070) and :math:`M_{i}^{TX}(\nu)` is the Mueller matrix element including the non-ideal HWP. - If ``built_map_on_the_fly = True``, the code computes also - - :math:`m_{out} = {\,\left(\sum_{i} B_{i}^{T} B_{i} \right)^{-1} \left( \sum_{i} B_{i}^{T} d_{obs}(t_{i}) \right)}`, - - where the map-making matrix :math:`B^X = \left(\frac{\int d\nu \,\frac{\partial BB(\nu,T)}{\partial T_{CMB}}\,\tau_{s}\left(\nu\right)\,M_{i,s}^{TX}(\nu)}{\int d\nu \frac{\partial BB(\nu,T)}{\partial T_{CMB}}\,\tau_{s}\left(\nu\right)}\,\right)`. - + If ``built_map_on_the_fly = True``, the code computes also + + .. math:: + + m_{\text{out}} = {\,\left(\sum_{i} B_{i}^{T} B_{i} \right)^{-1} \left( \sum_{i} B_{i}^{T} d_{\text{obs}}(t_{i}) \right)}, + + where the map-making matrix is + + .. math:: + + B^X = \left(\frac{\int d\nu \,\frac{\partial BB(\nu,T)}{\partial T_{\text{CMB}}}\,\tau_{s}\left(\nu\right)\,M_{i,s}^{TX}(\nu)}{\int d\nu \frac{\partial BB(\nu,T)}{\partial T_{\text{CMB}}}\,\tau_{s}\left(\nu\right)}\,\right). + :math:`\tau_s(\nu)` and :math:`M_{i,s}^{TX}(\nu)` are the estimate of the bandpass and Mueller matrix elements used in the map-making. * :meth:`.hwp_sys.HwpSys.make_map` which can bin the observations in a map. This is available only - if ``built_map_on_the_fly`` variable is set to ``True``. With this method, it is possible to + if ``built_map_on_the_fly`` variable is set to ``True``. With this method, it is possible to include non-ideal HWP knowledge in the map-making procedure, so use that instead of the general ``litebird_sim`` binner if you want to do so. @@ -102,12 +117,12 @@ file (a toml file) assigned to the simulation: sim = lbs.Simulation( parameter_file=toml_filename, random_seed=0, - ) - -The dictionary under the key "hwp_sys" will also contain the paths to the files from which the HWP -parameters are read in the multifrequency case (under the keys "band_filename/band_filename_solver"), or their values in the single frequency one. See the notebook ``hwp_sys/examples/simple_scan`` + ) + +The dictionary under the key "hwp_sys" will also contain the paths to the files from which the HWP +parameters are read in the multifrequency case (under the keys "band_filename/band_filename_solver"), or their values in the single frequency one. See the notebook ``hwp_sys/examples/simple_scan`` for more details. -To define the bandpasses to use, you need to have a dictionary with key "bandpass" +To define the bandpasses to use, you need to have a dictionary with key "bandpass" (for :math:`\tau`) or "bandpass_solver" (for :math:`\tau_s`) under "hwp_sys": .. code-block:: python @@ -126,18 +141,18 @@ To define the bandpasses to use, you need to have a dictionary with key "bandpas ...}} The above example is for a bandpass with Chebyshev filter, but there are other parameters to define -different bandpass profile. It is important to define the "band_type", which can be "top-hat", -"top-hat-exp", "top-hat-cosine" and "cheby" (see the ``bandpass`` module for more details) -and the band edges, which define the frequency range over which the bandpass transmission -is close or equal to 1. If not assigned, the "band_type" is automatically set to "top-hat" +different bandpass profile. It is important to define the "band_type", which can be "top-hat", +"top-hat-exp", "top-hat-cosine" and "cheby" (see the ``bandpass`` module for more details) +and the band edges, which define the frequency range over which the bandpass transmission +is close or equal to 1. If not assigned, the "band_type" is automatically set to "top-hat" and the band edges will correspond to the limits of the frequency array used (which, in the -``hwp_sys`` module, is read from the HWP parameter files). There are default values also for -the parameters defining the specific bandpass profiles (see the +``hwp_sys`` module, is read from the HWP parameter files). There are default values also for +the parameters defining the specific bandpass profiles (see the ``hwp_sys/hwp_sys/bandpass_template_module`` code). There is also the possibility to read the bandpass profile from an external file, which has to be a .txt file with two columns, the frequency and the bandpass transmission. It is important that the -frequency array used for "bandpass/bandpass_solver" coincides with the ones passed in the +frequency array used for "bandpass/bandpass_solver" coincides with the ones passed in the "band_filename/band_filename_solver" file. Here is how to pass the bandpass file: .. code-block:: python @@ -151,7 +166,7 @@ frequency array used for "bandpass/bandpass_solver" coincides with the ones pass ...}} You can find more examples for the bandpass construction in the ``hwp_sys/examples/simple_scan`` notebook. - + API reference ------------- diff --git a/docs/source/imo.rst b/docs/source/imo.rst index 220eb9b1..3c01e2e7 100644 --- a/docs/source/imo.rst +++ b/docs/source/imo.rst @@ -1,12 +1,12 @@ .. _imo: -The Instrument Model Database (IMO) -=================================== +The IMo +======= To run a realistic simulation of an instrument, one needs to known its details: the noise level of the detectors, the angular resolution of -the beams, etc. This kind of information is stored in an «instrument -model database», called IMO, and the LiteBIRD Simulation Framework +the beams, etc. This kind of information is stored in an «Instrument +Model database», called IMo, and the LiteBIRD Simulation Framework provides a few facilities to access it. The code makes use of the library `Libinsdb `_; please refer to its `User's manual `_ diff --git a/docs/source/index.rst b/docs/source/index.rst index bca4dc4c..eecfc6f6 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -3,36 +3,23 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Welcome to litebird_sim's documentation! +LBS User’s Manual ======================================== +This is the User’s Manual of the LiteBIRD Simulation Framework. + .. toctree:: :maxdepth: 2 - :caption: Contents: + :caption: Parts + part1.rst + part2.rst + part3.rst + part4.rst + part5.rst + part6.rst + appendix.rst installation - tutorial - simulations - imo - detectors - observations - data_layout - scanning - sky_maps - timeordered - dipole - mapmaking - bandpasses - random_numbers - mpi - reports - gaindrifts - non_linearity - external_modules - profiling - integrating - bibliography - Indices and tables ================== diff --git a/docs/source/installation.rst b/docs/source/installation.rst index 1c568385..4c3139f9 100644 --- a/docs/source/installation.rst +++ b/docs/source/installation.rst @@ -1,7 +1,7 @@ .. _installation_procedure: -Installing the framework -======================== +Installation +============ The framework is `registered on PyPI `_, it can be installed with the following procedure: @@ -15,12 +15,12 @@ it can be installed with the following procedure: # Create a virtual environment with virtualenv lbs_env # or with - python3 -m venv lbs_env + python3 -m venv lbs_env # Activate the environment . lbs_env/bin/activate - # Finally install litebird_sim with pip + # Finally install litebird_sim with pip pip install litebird_sim When the command is completed, check that everything works by issuing @@ -40,28 +40,28 @@ A similar procedure can be used with conda: # Activate the environment conda activate lbs_env - # Finally install litebird_sim with pip + # Finally install litebird_sim with pip pip install litebird_sim Hacking litebird_sim -------------------- -To develop ``litebird_sim``, you can create an enviroment, as described -above, then checkout and install a local copy of the framework. +To develop ``litebird_sim``, you can create an enviroment, as described +above, then checkout and install a local copy of the framework. .. code-block:: text # Create a virtual environment and activate it virtualenv my_venv && . my_venv/bin/activate - + # First clone the code git clone https://github.com/litebird/litebird_sim litebird_sim - + # Then install it with pip cd litebird_sim && pip install . - + Run code validators ~~~~~~~~~~~~~~~~~~~ @@ -102,210 +102,3 @@ If you have created a virtual environment to work with That's it: the next time you run a script that uses ``litebird_sim``, MPI functions will be automatically enabled in the framework. See the chapter :ref:`using_mpi` for more details. - - -Using Singularity ------------------ - -`Singularity `_ is a container platform that -helps user in creating isolated environments where programs can be ran -without interfering with other libraries installed on the system. You -can consider a container as a zipped file containing a Linux -distribution (Ubuntu), a Python distribution, and the LiteBIRD -Simulation Framework, already installed and ready to be used. It might -looks similar to a virtual machine, but it is way faster to start (no -boot time delay) and easier to use. - -Let's first state what are the *drawbacks* of running the framework in -a container: - -- It is not meant to be a tool used by people developing the LiteBIRD - Simulation Framework, only by users, because the source code for - ``litebird_sim`` is stored in a read-only directory. (You could - however use it to develop some new module in your home directory, - with the purpose of merging it later in the framework's codebase.) -- It only runs under Linux. -- You must run a recent version of the Linux kernel (at least 3.18, - which was released in 2015). -- The container is huge (~0.5 GB) and could be a waste of disk space - if you already have a working Python distribution. -- You cannot install it system-wide and call it within other Python - programs you are already using on your system. For instance, if you - have installed library XYZ in your system, you cannot call XYZ *and* - functions/classes in ``litebird_sim`` from the same Python script. - (It's a *container*, after all.) -- Despite the fact that it is a container, it is *still* possible to - have conflicts with other programs installed on your machine - (although there are simple workarounds); - -However, the reason why we are providing this solution is because of -some significant advantages: - -- You do not need to install/upgrade Python; -- No need to mess with virtual environments; -- Existing Python versions won't conflict with Singularity's - containers (but see below for some caveats); -- All the framework, its dependencies, and the Python compiler itself - are bundled in **one** file, which you can keep in your home - directory or move around; -- It supports MPI, and thus it can be used on HPC clusters. - -Typically, you might want to use our Singularity container if you just -want to run a Python script that calls ``litebird_sim``, but you do -not want/cannot install the framework because of conflicts on your -system. - -To use the Singularity container, you must follow these steps: - -1. Build a ``Singularity`` file; using the scripts provided by the - LiteBIRD Simulation Framework, it is a matter of an instant; - -2. Build the container; this requires a working internet connection - and will take a few minutes; - -3. Once the container is built, a new huge executable file is ready to - be used: with it, you can start IPython, JupyterLab, or run Python - programs calling the LiteBIRD Simulation Framework. - -Let's see the details of each step. - -Build a ``Singularity`` file -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -To build a file for Singularity, you must first clone the -``litebird_sim`` repository: - -.. code-block:: text - - git clone https://github.com/litebird/litebird_sim litebird_sim - -Enter the directory ``litebird_sim/singularity`` and run the script -``create-singularity-file.sh``. It takes the following arguments: - -- The version number of the Ubuntu Linux distribution to use. Valid - choices are ``18.04`` and ``20.04``; you should use the most - recent LTS release, which is currently ``20.04``. - -- A flag telling which version of MPI to install. Possible choices - are: - - - ``openmpi``; - - ``mpich``; - - ``none`` (no MPI support). - - You should choose the same MPI implementation you are running on - your system. - -Here are a few usage examples; each of them creates a ``Singularity`` -file in the current directory (i.e., ``litebird_sim/singularity``): - -.. code-block:: text - - # Use Ubuntu Linux 20.04 and OpenMPI - $ ./create-singularity-file.sh 20.04 openmpi - - # Use Ubuntu Linux 20.04 and MPICH - $ ./create-singularity-file.sh 20.04 mpich - - # Use Ubuntu Linux 18.04 without MPI - $ ./create-singularity-file.sh 18.04 none - -Build the container -~~~~~~~~~~~~~~~~~~~ - -Once you have executed ``create-singularity-file.sh``, you will have a -``Singularity`` file. It's time to run ``singularity`` and create the -container: - -.. code-block:: text - - singularity build --fakeroot litebird_sim.img Singularity - -(The file name ``litebird_sim.img`` is the container to create. Of -course, you can pick the name you want; for example, if you are -creating several containers, you might name them -``litebird_sim_20.04_openmpi.img`` and so on.) The flag ``--fakeroot`` -allows you to create an image even if you do not have superuser -powers. - -If everything works as expected, in a few minutes you will have a -working container in file ``litebird_sim.img`` (which should be about -~0.5 GB in size). - -To check that the container works correctly, run a self-test on it: - -.. code-block:: text - - singularity test litebird_sim.img - - -Running the container -~~~~~~~~~~~~~~~~~~~~~ - -Once the container has been created, you can run it directly: the -IPython prompt will appear, and you can use ``litebird_sim`` -immediately. - -.. asciinema:: singularity_demo1.cast - :preload: 1 - -You can use it to run scripts as well: - -.. asciinema:: singularity_demo2.cast - :preload: 1 - -.. note:: - - You might wonder how could the container run the script - ``test.py``, if the file was create *outside* the container. The - reason is because Singularity by default mounts the home directory - and the current directory in the container, so that you can always - access whatever you have in these directories while running stuff - from the container. - - This might lead to undesired effects, though. Suppose you have - installed Anaconda/Miniconda under your home directory: in this - case, clashes between the Python packages installed within the - container and Anaconda might happen! - - In this case, you can run the container using the syntax - ``singularity run -H /tmp/$USER``: this will mount the home - directory on a directory under ``/tmp``. (You can specify another - directory, of course.) - -To use MPI, you must call ``mpirun`` *outside* the container: - -.. asciinema:: singularity_demo3.cast - :preload: 1 - -To obtain a short help about how to use the container, you can use the -command ``singularity run-help``: - -.. asciinema:: singularity_help.cast - :preload: 1 - -Finally, the following demo shows how to test the correctness of the -LiteBIRD Simulation Framework and to browse a local copy of the -documentation. The key feature shown here is the fact that running -``singularity shell litebird_sim.img`` starts a shell within the -container; you can then move to ``/opt/litebird_sim`` (the directory -where the framework has been installed) and run commands from there. - -.. asciinema:: singularity_shell.cast - :preload: 1 - -Running ``python3 -m http.server`` starts an HTTP server connected to -http://0.0.0.0:8000/: browsing to that URL will open your own local -copy of the User's manual for the LiteBIRD Simulation Framework. - - -Accessing the IMO from the container -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If you are exporting your home directory (the default), you should -have no problem accessing the IMO, provided that one of these -conditions apply: - -- You are accessing a remote copy of the IMO; -- You are accessing a local copy of the IMO that resides within your - home directory. diff --git a/docs/source/map_scanning.rst b/docs/source/map_scanning.rst new file mode 100644 index 00000000..8f7424ab --- /dev/null +++ b/docs/source/map_scanning.rst @@ -0,0 +1,197 @@ +.. _mapscanning: + +Scanning a map to fill a TOD +============================ + +The framework provides :func:`.scan_map`, a routine which scans an +input map accordingly to the scanning strategy and fills the detector +timestreams. You can fill with signal an existing TOD by using the +function :func:`.scan_map_in_observations`, as the following example +shows: + +.. testcode:: + + import litebird_sim as lbs + import numpy as np + + hwp_radpsec = np.pi / 8 + start_time_s = 0 + time_span_s = 1 + + nside = 256 + npix = 12 * nside * nside + + # Create a simulation + sim = lbs.Simulation( + base_path="./output", + start_time=start_time_s, + duration_s=time_span_s, + random_seed=12345, + ) + + # Define the scanning strategy + sim.set_scanning_strategy( + lbs.SpinningScanningStrategy( + spin_sun_angle_rad=0.785_398_163_397_448_3, + precession_rate_hz=8.664_850_513_998_931e-05, + spin_rate_hz=0.000_833_333_333_333_333_4, + start_time=start_time_s, + ), + delta_time_s=7200, + ) + + sim.set_instrument( + lbs.InstrumentInfo( + boresight_rotangle_rad=0.0, + spin_boresight_angle_rad=0.872_664_625_997_164_8, + spin_rotangle_rad=3.141_592_653_589_793, + ), + ) + + # Create a detector object + det = lbs.DetectorInfo( + name="Detector", + sampling_rate_hz=10, + quat=[0.0, 0.0, 0.0, 1.0], + ) + + # Initialize the observation + (obs,) = sim.create_observations(detectors=[det]) + + # Prepare the quaternions used to compute the pointings + sim.prepare_pointings() + + # Create a map to scan (in realistic simulations, + # use the MBS module provided by litebird_sim) + maps = np.ones((3, npix)) + in_map = {"Detector": maps, "Coordinates": lbs.CoordinateSystem.Ecliptic} + + # Here scan the map and fill tod + lbs.scan_map_in_observations( + obs, + in_map, + input_map_in_galactic = False, + ) + + for i in range(obs.n_samples): + # + 0. removes leading minus from negative zero + value = np.round(obs.tod[0][i], 5) + 0. + print(f"{value:.5f}") + +.. testoutput:: + + 0.00000 + -0.00075 + -0.00151 + -0.00226 + -0.00301 + -0.00376 + -0.00451 + -0.00526 + -0.00601 + -0.00676 + + +The input maps to scan can be either included in a dictionary with the name of +the channel or the name of the dectector as keyword (the routines described in +:ref:`Mbs` already provied the inputs in the correct format), or a numpy array +with shape (3, n_pixels). + +The pointing information can be included in the observation or passed through +`pointings`. If both `observations` and `pointings` are provided, they must be +coherent, so either a single Observation and a single numpy array, or same +lenght list of Observations and numpy arrays. +If the input map is ecliptic coordinates set `input_map_in_galactic` to `False`. +The effect of a possible HWP is included in the pointing information, see +:ref:`scanning-strategy`. + +The routine provides an on-the-fly interpolation of the input maps. This option +is available through the argument `interpolation` which specifies the type of TOD +interpolation ("" for no interpolation, "linear" for linear interpolation). +Default: no interpolation. + + +Methods of the Simulation class +------------------------------- + +The class :class:`.Simulation` provides the function +:func:`.Simulation.fill_tods`, which takes a map and scans it. Using this with +:func:`.Simulation.add_noise`, the generation of a simulation becomes quite +transparent: + +.. testcode:: + + import litebird_sim as lbs + from astropy.time import Time + import numpy as np + + start_time = 0 + time_span_s = 1000.0 + sampling_hz = 10.0 + nside = 128 + + sim = lbs.Simulation( + start_time=start_time, + duration_s=time_span_s, + random_seed=12345, + ) + + # We pick a simple scanning strategy where the spin axis is aligned + # with the Sun-Earth axis, and the spacecraft spins once every minute + sim.set_scanning_strategy( + lbs.SpinningScanningStrategy( + spin_sun_angle_rad=np.deg2rad(0), + precession_rate_hz=0, + spin_rate_hz=1 / 60, + start_time=start_time, + ), + delta_time_s=5.0, + ) + + # We simulate an instrument whose boresight is perpendicular to + # the spin axis. + sim.set_instrument( + lbs.InstrumentInfo( + boresight_rotangle_rad=0.0, + spin_boresight_angle_rad=np.deg2rad(90), + spin_rotangle_rad=np.deg2rad(75), + ) + ) + + # A simple detector looking along the boresight direction + det = lbs.DetectorInfo( + name="Boresight_detector", + sampling_rate_hz=sampling_hz, + bandcenter_ghz=100.0, + net_ukrts=50.0, + ) + + sim.create_observations(detectors=det) + + sim.prepare_pointings() + + sky_signal = np.ones((3,12*nside*nside))*1e-4 + + sim.fill_tods(sky_signal) + + sim.add_noise(noise_type='white', random=sim.random) + + for i in range(5): + print(f"{sim.observations[0].tod[0][i]:.5e}") + +.. testoutput:: + + 4.14241e-04 + 5.46700e-05 + 3.03378e-04 + 6.13975e-05 + 4.72613e-05 + + +API reference +------------- + +.. automodule:: litebird_sim.scan_map + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/mapmaking.rst b/docs/source/mapmaking.rst index 973f1552..e234d3a2 100644 --- a/docs/source/mapmaking.rst +++ b/docs/source/mapmaking.rst @@ -43,9 +43,9 @@ detectors:: import numpy as np import astropy.units as u from numpy.random import MT19937, RandomState, SeedSequence - + import litebird_sim as lbs - + sim = lbs.Simulation( base_path="destriper_output", start_time=0, @@ -66,7 +66,7 @@ detectors:: name="core", spin_boresight_angle_rad=np.deg2rad(65), ) - + # We create two detectors, whose polarization angles are separated by π/2 sim.create_observations( detectors=[ @@ -85,7 +85,7 @@ detectors:: for curobs in sim.observations: curobs.tod *= 0.0 curobs.tod += rs.randn(*curobs.tod.shape) - + The paper :cite:`2009:kurkisuonio:destriping` explains the theory of binners and destripers. Our implementation @@ -98,13 +98,13 @@ Binner ------ Once you have generated a set of observations, either on a single -process or distributed over several mpi processes, you can create a +process or distributed over several mpi processes, you can create a simple binned map with the function :func:`.make_binned_map`. This function takes one or more :class:`.Observation` objects and the Healpix resolution of the output map (``nside``), and it produces a coadded map. The algorithm assumes white noise and each detector gets weighted by :math:`1 / \text{NET}^2`. If the pointing information is not provided in the -observation, it can be passed through the optional argument `pointings`, +observation, it can be passed through the optional argument `pointings`, with a syntax similar to :func:`.scan_map_in_observations`. The output map is in Galactic coordinates, but you can specify the coordinate system you want via the parameter `output_coordinates`. @@ -335,7 +335,7 @@ There are three supported options for the detector split: - ``"waferXXX"``: use the detectors in the wafer XXX. The XXX part must specify the wafer (e.g. "L00", "M01", or "H02"). -The final data split will correspond to the combination of the two splits. +The final data split will correspond to the combination of the two splits. The function :func:`.check_valid_splits` will check whether the requested split is part of the list above. If the split is not valid, the function @@ -377,7 +377,7 @@ The result is an instance of the class :class:`.DestriperResult`, which is similar to :class:`.BinnerResult` but it contains much more information. Function :func:`.make_destriped_map` has a high level interface in the class -:class:`.Simulation` that applies the destriper algorithm to all the +:class:`.Simulation` that applies the destriper algorithm to all the observations in the simulation. The syntax is identical to :func:`.make_destriped_map`:: @@ -712,14 +712,14 @@ The procedure to use the TOAST2 destriper is similar to the steps required to call the internal destriper: you must create a :class:`.ExternalDestriperParameters` object that specifies which input parameters (apart from the timelines) should be used:: - + params = lbs.ExternalDestriperParameters( nside=16, return_hit_map=True, return_binned_map=True, return_destriped_map=True, ) - + The parameters we use here are the resolution of the output map (``nside=16``), and the kind of results that must be returned: specifically, we are looking here for the *hit map* (i.e., a map that @@ -744,7 +744,7 @@ To run the TOAST2 destriper, you simply call result = lbs.destripe_with_toast2(sim, params) The result is an instance of the class :class:`.Toast2DestriperResult` and -contains the three maps we have asked above (hit map, binned map, +contains the three maps we have asked above (hit map, binned map, destriped map). .. note:: diff --git a/docs/source/timeordered.rst b/docs/source/noise.rst similarity index 51% rename from docs/source/timeordered.rst rename to docs/source/noise.rst index 20c4d9f0..5cc86214 100644 --- a/docs/source/timeordered.rst +++ b/docs/source/noise.rst @@ -1,131 +1,7 @@ -.. _timeordered: +.. _noise: -Time Ordered Simulations -======================== - -The LiteBIRD simulation framework intends to offer the capability to -simulate many effects in detector timestreams. This page will detail -these simulated effects as they become available. The timestreams are -stored in the ``tod`` field of :class:`.Observation` objects. These -arrays have shape ``(n_detectors, n_samples)``, where detectors are -indexed in the same order as the ``Observation.detector_global_info`` -array. All the time streams inside the framework use Kelvin as the -default unit. - - -Filling TOD with signal ------------------------ - -The framework provides :func:`.scan_map`, a routine which scans an -input map accordingly to the scanning strategy and fills the detector -timestreams. You can fill with signal an existing TOD by using the -function :func:`.scan_map_in_observations`, as the following example -shows: - -.. testcode:: - - import litebird_sim as lbs - import numpy as np - - hwp_radpsec = np.pi / 8 - start_time_s = 0 - time_span_s = 1 - - nside = 256 - npix = 12 * nside * nside - - # Create a simulation - sim = lbs.Simulation( - base_path="./output", - start_time=start_time_s, - duration_s=time_span_s, - random_seed=12345, - ) - - # Define the scanning strategy - sim.set_scanning_strategy( - lbs.SpinningScanningStrategy( - spin_sun_angle_rad=0.785_398_163_397_448_3, - precession_rate_hz=8.664_850_513_998_931e-05, - spin_rate_hz=0.000_833_333_333_333_333_4, - start_time=start_time_s, - ), - delta_time_s=7200, - ) - - sim.set_instrument( - lbs.InstrumentInfo( - boresight_rotangle_rad=0.0, - spin_boresight_angle_rad=0.872_664_625_997_164_8, - spin_rotangle_rad=3.141_592_653_589_793, - ), - ) - - # Create a detector object - det = lbs.DetectorInfo( - name="Detector", - sampling_rate_hz=10, - quat=[0.0, 0.0, 0.0, 1.0], - ) - - # Initialize the observation - (obs,) = sim.create_observations(detectors=[det]) - - # Prepare the quaternions used to compute the pointings - sim.prepare_pointings() - - # Create a map to scan (in realistic simulations, - # use the MBS module provided by litebird_sim) - maps = np.ones((3, npix)) - in_map = {"Detector": maps, "Coordinates": lbs.CoordinateSystem.Ecliptic} - - # Here scan the map and fill tod - lbs.scan_map_in_observations( - obs, - in_map, - input_map_in_galactic = False, - ) - - for i in range(obs.n_samples): - # + 0. removes leading minus from negative zero - value = np.round(obs.tod[0][i], 5) + 0. - print(f"{value:.5f}") - -.. testoutput:: - - 0.00000 - -0.00075 - -0.00151 - -0.00226 - -0.00301 - -0.00376 - -0.00451 - -0.00526 - -0.00601 - -0.00676 - - -The input maps to scan can be either included in a dictionary with the name of -the channel or the name of the dectector as keyword (the routines described in -:ref:`Mbs` already provied the inputs in the correct format), or a numpy array -with shape (3, n_pixels). - -The pointing information can be included in the observation or passed through -`pointings`. If both `observations` and `pointings` are provided, they must be -coherent, so either a single Observation and a single numpy array, or same -lenght list of Observations and numpy arrays. -If the input map is ecliptic coordinates set `input_map_in_galactic` to `False`. -The effect of a possible HWP is included in the pointing information, see -:ref:`scanning-strategy`. - -The routine provides an on-the-fly interpolation of the input maps. This option -is available through the argument `interpolation` which specifies the type of TOD -interpolation ("" for no interpolation, "linear" for linear interpolation). -Default: no interpolation. - - -Adding Noise ------------- +Instrumental noise +================== The ability to add noise to your detector timestreams is supported through the function :func:`.add_noise_to_observations` and the low-level versions @@ -292,27 +168,29 @@ Again, to generate noise with custom parameters, we can either use the low-level .. warning:: - Be sure you understand the difference between the noise level in a - timestream and the noise level in a map. Although of course the - latter depends on the former, the conversion depends on several factors. + It's crucial to grasp the distinction between the noise level in a + timestream and the noise level in a map. While the latter is + dependent on the former, the conversion is influenced by several + factors. This understanding will empower you in your data analysis + tasks. - A common mistake is use the mission time divided by the number of pixels in - the map in a call to :func:`.add_white_noise`. This is **wrong**, as the noise - level per pixel depends on the overall integration time, which is always - less than the mission time because of cosmic ray loss, repointing maneuvers, etc. - These effects reduce the number of samples in the timeline that can be used to - estimate the map, but they do not affect the noise of the timeline. + A common mistake is to use the mission time divided by the number + of pixels in the map in a call to func:`.add_white_noise`. This is + **wrong**, as the noise level per pixel depends on the overall + integration time, which is always less than the mission time + because of cosmic ray loss, repointing maneuvers, etc. These + effects reduce the number of samples in the timeline that can be + used to estimate the map, but they do not affect the noise of the + timeline. Methods of the Simulation class ------------------------------- -The class :class:`.Simulation` provides two simple functions that fill -with sky signal and noise all the observations of a given simulation. -The function :func:`.Simulation.fill_tods` takes a map and scans it, while -the function :func:`.Simulation.add_noise` adds noise to the timelines. -Thanks to these functions the generation of a simulation becomes quite -transparent: +The class :class:`.Simulation` provides the function +:func:`.Simulation.add_noise` which adds noise to the timelines. +All the details of the noise are provided in the class observation and +the interface is simplified. .. testcode:: @@ -363,34 +241,22 @@ transparent: sim.create_observations(detectors=det) - sim.prepare_pointings() - - sky_signal = np.ones((3,12*nside*nside))*1e-4 - - sim.fill_tods(sky_signal) - - sim.add_noise(noise_type='white', random=sim.random) + sim.add_noise(noise_type='one_over_f', random=sim.random) for i in range(5): print(f"{sim.observations[0].tod[0][i]:.5e}") .. testoutput:: - 4.14241e-04 - 5.46700e-05 - 3.03378e-04 - 6.13975e-05 - 4.72613e-05 - + 2.83998e-04 + -7.58942e-05 + 1.72505e-04 + -6.97704e-05 + -8.41885e-05 API reference ------------- -.. automodule:: litebird_sim.scan_map - :members: - :undoc-members: - :show-inheritance: - .. automodule:: litebird_sim.noise :members: :undoc-members: diff --git a/docs/source/non_linearity.rst b/docs/source/non_linearity.rst index 9dd9ad7e..e78bf2bb 100644 --- a/docs/source/non_linearity.rst +++ b/docs/source/non_linearity.rst @@ -1,23 +1,32 @@ Non-linearity injection ======================= -Non-linearity is the effect of a non-ideal TES detectors' response. This means that the responsivity :math:`S` is not constant as the optical power varies. -The LiteBIRD Simulation Framework provides a non-linearity simulation module to simulate the effect of non-linearity on TODs. +Non-linearity is the effect of a non-ideal TES detector response, +where the responsivity :math:`S` is not constant as the optical power +varies. The LiteBIRD Simulation Framework provides a non-linearity +simulation module to simulate the effect of non-linearity on TODs. -The framework provides the simplest case, which is a quadratic non-linearity. -This case is described in `Micheli+2024 `_, where the effect of non-linearity is propagated to the estimation of the tensor-to-scalar ratio. +The framework provides the simplest case, which is quadratic +non-linearity. This case is described in `Micheli+2024 +`_, where the effect of +non-linearity is propagated to the estimation of the tensor-to-scalar +ratio. -Considering a first order correction of the usual linear gain, a TOD :math:`d(t)` is modified according to: +Considering a first order correction of the usual linear gain, a TOD +:math:`d(t)` is modified according to: .. math:: d(t) = [1+g_1 d(t)] d(t) -where :math:`g_1` is the detector non-linearity factor in units of :math:`K^{-1}`. - -To simulate a quadratic non-linearity, one can use the method of :class:`.Simulation` class :meth:`.Simulation.apply_quadratic_nonlin()`, -or any of the low level functions: :func:`.apply_quadratic_nonlin_to_observations()`, :func:`.apply_quadratic_nonlin_for_one_detector()`. -The following example shows the typical usage of the method and low level functions: +where :math:`g_1` is the detector non-linearity factor in units of +:math:`K^{-1}`. +To simulate a quadratic non-linearity, one can use the method of +:class:`.Simulation` class +:meth:`.Simulation.apply_quadratic_nonlin()`, or any of the low-level +functions: :func:`.apply_quadratic_nonlin_to_observations()`, +:func:`.apply_quadratic_nonlin_for_one_detector()`. The following +example shows the typical usage of the method and low-level functions: .. code-block:: python @@ -49,23 +58,27 @@ The following example shows the typical usage of the method and low level functi detectors=dets, split_list_over_processes=False, ) - + # Creating fiducial TODs sim.observations[0].nl_2_self = np.ones_like(sim.observations[0].tod) sim.observations[0].nl_2_obs = np.ones_like(sim.observations[0].tod) sim.observations[0].nl_2_det = np.ones_like(sim.observations[0].tod) -If the non-linearity parameter is not read from the IMo, one has to specify :math:`g_1` using the ``g_one_over_k`` argument as in the following example: +If the non-linearity parameter is not read from the IMo, one has to +specify :math:`g_1` using the ``g_one_over_k`` argument as in the +following example: .. code-block:: python - # Define non-linear parameters for the detectors. We choose the same value for both detectors in this example, but it is not necessary. + # Define non-linear parameters for the detectors. We choose the same + # value for both detectors in this example, but it is not necessary. sim.observations[0].g_one_over_k = np.ones(len(dets)) * 1e-3 - + # Applying non-linearity using the `Simulation` class method sim.apply_quadratic_nonlin(component = "nl_2_self",) - # Applying non-linearity on the given TOD component of an `Observation` object + # Applying non-linearity on the given TOD component of an `Observation` + # object lbs.non_linearity.apply_quadratic_nonlin_to_observations( observations=sim.observations, component="nl_2_obs", @@ -78,20 +91,36 @@ If the non-linearity parameter is not read from the IMo, one has to specify :mat g_one_over_k=sim.observations[0].g_one_over_k[idx], ) -In particular, the effect of detector non-linearity needs to be included to assess its impact when coupled to other systematic effects. As described in `Micheli+2024 `_, a typical case is the coupling with HWP synchronous signal (HWPSS) appearing at twice the rotation frequency of the HWP. -This kind of signal can be produced by non-idealities of the HWP, such as its differential transmission and emission. +In particular, the effect of detector non-linearity must be included +to assess its impact when coupled with other systematic effects. As +described in `Micheli+2024 `_, a +typical case is the coupling with HWP synchronous signal (HWPSS) +appearing at twice the rotation frequency of the HWP. This kind of +signal can be produced by non-idealities of the HWP, such as its +differential transmission and emission. -In that case, the usual TOD :math:`d(t)` will contain an additional term, and can be written as: +In that case, the usual TOD :math:`d(t)` will contain an additional +term, and can be written as: .. math:: d(t) = d(t) = I + \mathrm{Re}[\epsilon_{\mathrm{pol}}e^{4i\chi}(Q+iU)]+A_2 \cos(2 \omega_{HWP} t) + N - -where :math:`A_2` is the amplitude of the HWPSS and :math:`\omega_{HWP}` is the rotation speed of the HWP. In presence of detector non-linearity, the 2f signal is up-modulated to 4f, affecting the science band. -The framework provides an independent module to introduce this signal in the simulation, adding it to the TODs. To simulate the 2f signal from a rotating, non-ideal HWP, one can use the method of :class:`.Simulation` class :meth:`.Simulation.add_2f()`, -or any of the low level functions: :func:`.add_2f_to_observations()`, :func:`.add_2f_for_one_detector()`. +where :math:`A_2` is the amplitude of the HWPSS and +:math:`\omega_{HWP}` is the rotation speed of the HWP. In presence of +detector non-linearity, the 2f signal is up-modulated to 4f, affecting +the science band. -If the 2f amplitude is not read from the IMo, one has to specify :math:`A_2` using the ``amplitude_2f_k`` argument. The argument ``optical_power_k`` allows to include the integrated nominal optical power expected for each channel as in the following example: +The framework provides an independent module to introduce this signal +in the simulation, adding it to the TODs. To simulate the 2f signal +from a rotating, non-ideal HWP, one can use the method of +:class:`.Simulation` class :meth:`.Simulation.add_2f()`, or any of the +low-level functions: :func:`.add_2f_to_observations()`, +:func:`.add_2f_for_one_detector()`. + +If the 2f amplitude is not read from the IMo, one has to specify +:math:`A_2` using the ``amplitude_2f_k`` argument. The argument +``optical_power_k`` enables the inclusion of the integrated nominal +optical power expected for each channel. See the following example: .. code-block:: python @@ -100,7 +129,7 @@ If the 2f amplitude is not read from the IMo, one has to specify :math:`A_2` usi from astropy.time import Time from litebird_sim.pointings import get_hwp_angle - + telescope = "LFT" channel = "L4-140" detlist = ["000_001_017_QB_140_T", "000_001_017_QB_140_B"] @@ -118,8 +147,8 @@ If the 2f amplitude is not read from the IMo, one has to specify :math:`A_2` usi duration_s=mission_time_days * 24 * 3600.0, random_seed=12345, ) - - # Load the definition of the instrument + + # Load the definition of the instrument sim.set_instrument( lbs.InstrumentInfo.from_imo( imo, @@ -127,7 +156,7 @@ If the 2f amplitude is not read from the IMo, one has to specify :math:`A_2` usi ) ) - dets = [] + dets = [] for n_det in detlist: det = lbs.DetectorInfo.from_imo( url=f"/releases/{imo_version}/satellite/{telescope}/{channel}/{n_det}/detector_info", @@ -139,13 +168,13 @@ If the 2f amplitude is not read from the IMo, one has to specify :math:`A_2` usi detectors=dets, split_list_over_processes=False, ) - + sim.set_scanning_strategy(imo_url=f"/releases/{imo_version}/satellite/scanning_parameters/") - + sim.set_hwp( lbs.IdealHWP(sim.instrument.hwp_rpm * 2 * np.pi / 60,), ) - + sim.prepare_pointings() sim.precompute_pointings() diff --git a/docs/source/observations.rst b/docs/source/observations.rst index 9afe6798..5489f78c 100644 --- a/docs/source/observations.rst +++ b/docs/source/observations.rst @@ -3,7 +3,7 @@ Observations ============ -The :class:`.Observation` class, is the container for the data acquired by the +The :class:`.Observation` class is the container for the data acquired by the telescope during a scanning period (and the relevant information about it). Serial applications diff --git a/docs/source/part1.rst b/docs/source/part1.rst new file mode 100644 index 00000000..2dee4393 --- /dev/null +++ b/docs/source/part1.rst @@ -0,0 +1,8 @@ +Introduction +============ + +.. toctree:: + :maxdepth: 1 + + installation.rst + singularity.rst diff --git a/docs/source/part2.rst b/docs/source/part2.rst new file mode 100644 index 00000000..de346164 --- /dev/null +++ b/docs/source/part2.rst @@ -0,0 +1,16 @@ +Structure of the framework +========================== + +.. toctree:: + :maxdepth: 1 + + simulations.rst + imo.rst + detectors.rst + observations.rst + data_layout.rst + profiling.rst + reports.rst + random_numbers.rst + mpi.rst + integrating.rst diff --git a/docs/source/part3.rst b/docs/source/part3.rst new file mode 100644 index 00000000..7ef244f2 --- /dev/null +++ b/docs/source/part3.rst @@ -0,0 +1,13 @@ +Basic simulation modules +======================== + +.. toctree:: + :maxdepth: 1 + + scanning.rst + quaternions.rst + hwp.rst + noise.rst + sky_maps.rst + dipole.rst + map_scanning.rst diff --git a/docs/source/part4.rst b/docs/source/part4.rst new file mode 100644 index 00000000..31f01768 --- /dev/null +++ b/docs/source/part4.rst @@ -0,0 +1,9 @@ +Systematic effects +================== + +.. toctree:: + :maxdepth: 1 + + gaindrifts.rst + non_linearity.rst + hwp_sys.rst diff --git a/docs/source/part5.rst b/docs/source/part5.rst new file mode 100644 index 00000000..d55fc66d --- /dev/null +++ b/docs/source/part5.rst @@ -0,0 +1,7 @@ +Data-reduction modules +====================== + +.. toctree:: + :maxdepth: 1 + + mapmaking.rst diff --git a/docs/source/part6.rst b/docs/source/part6.rst new file mode 100644 index 00000000..f8526797 --- /dev/null +++ b/docs/source/part6.rst @@ -0,0 +1,7 @@ +Tutorials +========= + +.. toctree:: + :maxdepth: 1 + + tutorial.rst diff --git a/docs/source/quaternions.rst b/docs/source/quaternions.rst new file mode 100644 index 00000000..21cf5142 --- /dev/null +++ b/docs/source/quaternions.rst @@ -0,0 +1,142 @@ +.. _quaternions-chapter: + +Quaternions +=========== + +Rotations are important in defining a scanning strategy. Here, we +present a short tutorial on quaternions and explain the facilities +provided by LBS. + +There are several choices to describe a rotation in 3D space: `Euler +angles `_, `rotation +matrices `_, +`quaternions `_, etc. Each +of these systems has its share of advantages and disadvantages. For +instance, rotation matrices are handy when you have a vector and want +to rotate it, as it is just a matter of doing a matrix-vector +multiplication. Quaternions are more complicated in this regard, but +they offer a mathematical operation called *slerp* (shorthand for +*spherical linear interpolation*) that is not available with other +representations, like rotation matrices. We assume that the reader +knows what quaternions are and their mathematical properties; if you +are not, be sure to read the book *Visualizing quaternions*, by +Andrew J. Hanson (Elsevier, 2006, ISBN-0080474772) and the provocative +essay by Marc ten Bosch, `Let’s remove Quaternions from every 3D +engine `_. + +The LiteBIRD simulation framework models quaternions using the +convention :math:`(v_x, v_y, v_z, w)`; be aware that some textbooks +use the order :math:`(w, v_x, v_y, v_z)`. As the framework uses +quaternions only to model rotations, they all must obey the relation +:math:`v_x^2 + v_y^2 + v_z^2 + w^2 = 1` (*normalized* quaternions), +which is a property satisfied by rotation quaternions. + +The class :class:`.RotQuaternion` can model time-varying quaternions. +It is enough to provide a list of quaternions, a starting time, and a +sampling frequency, which is assumed to be constant:: + + import litebird_sim as lbs + + time_varying_quaternion = lbs.RotQuaternion( + # Three rotation quaternions + quats=np.array( + [ + [0.5, 0.0, 0.0, 0.8660254], + [0.0, -0.38268343, 0.0, 0.92387953], + [0.0, 0.0, 0.30901699, 0.95105652], + ] + ), + start_time=0.0, + sampling_rate_hz=1.0, + ) + + +This example assumes that ``time_varying_quaternion`` describes a +rotation that evolves with time, starting from ``t = 0`` and lasting +3 seconds, as the sampling frequency is 1 Hz. + +Rotation quaternions can be multiplied together; however, they must refer +to the same starting time and have the same sampling frequency. + + +Python functions for quaternions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The LiteBIRD Simulation Framework provides three functions, +:func:`.quat_rotation_x`, :func:`.quat_rotation_y`, :func:`.quat_rotation_z` to +compute simple rotation quaternions; they return plain the normalized +quaternion representing a rotation by an angle :math:`\theta` around +one of the three axis `x`, `y`, and `z`. These quaternions are plain +NumPy arrays and can be passed to the parameter ``quats`` of the +constructor for :class:`.RotQuaternion`: + +.. testcode:: + + import litebird_sim as lbs + import numpy as np + + def print_quaternion(q): + print("{:.3f} {:.3f} {:.3f} {:.3f}".format(*q)) + + print("Rotation by π/3 around x:") + print_quaternion(lbs.quat_rotation_x(theta_rad=np.pi/3)) + print("Rotation by π/3 around y:") + print_quaternion(lbs.quat_rotation_y(theta_rad=np.pi/3)) + print("Rotation by π/3 around z:") + print_quaternion(lbs.quat_rotation_z(theta_rad=np.pi/3)) + +.. testoutput:: + + Rotation by π/3 around x: + 0.500 0.000 0.000 0.866 + Rotation by π/3 around y: + 0.000 0.500 0.000 0.866 + Rotation by π/3 around z: + 0.000 0.000 0.500 0.866 + + +There are two functions that implement in-place multiplication of +quaternions: :func:`.quat_right_multiply` performs the calculation +:math:`r \leftarrow r \times q`, and :func:`.quat_left_multiply` +performs the calculation :math:`r \leftarrow q \times r` (where +:math:`\leftarrow` indicates the assignment operation): + +.. testcode:: + + quat = np.array(lbs.quat_rotation_x(np.pi / 3)) + lbs.quat_left_multiply(quat, *lbs.quat_rotation_z(np.pi / 2)) + print("Rotation by π/3 around x and then by π/2 around z:") + print_quaternion(quat) + +.. testoutput:: + + Rotation by π/3 around x and then by π/2 around z: + 0.354 0.354 0.612 0.612 + +Note the syntax for :func:`.quat_left_multiply`: you are supposed to +pass the four components of the quaternion :math:`q` as separate +arguments, and thus we need to prepend the call to +``lbs.quat_rotation_z`` with ``*`` to expand the result (a 4-element +tuple) into the four parameters required by +:func:`.quat_left_multiply`. The reason for this weird syntax is +efficiency, as Numba (which is used extensively in the code) can +easily optimize this kind of function call. + +Finally, the framework provides the function :func:`.rotate_vector`, +which applies the rotation described by a normalized quaternion to a +vector. There are faster versions in :func:`.rotate_x_vector`, +:func:`.rotate_y_vector`, and :func:`.rotate_z_vector` that rotate the +three basis vectors ``(1, 0, 0)``, ``(0, 1, 0)``, and ``(0, 0, 1)``. +The functions :func:`.all_rotate_vectors`, +:func:`.all_rotate_x_vectors`, :func:`.all_rotate_y_vectors`, and +:func:`.all_rotate_z_vectors` can be applied to arrays of quaternions +and vectors. + + +API reference +------------- + +.. automodule:: litebird_sim.quaternions + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/random_numbers.rst b/docs/source/random_numbers.rst index 191f6aea..f5df839e 100644 --- a/docs/source/random_numbers.rst +++ b/docs/source/random_numbers.rst @@ -1,7 +1,7 @@ .. _random-numbers: -Random numbers in ``litebird_sim`` -================================== +Random numbers +============== The LiteBIRD Simulation Framework can be used to generate random numbers, used for example for producing noise timelines. In order to do so, @@ -10,48 +10,48 @@ a seed and a Random Number Generator (RNG) are used. Seed ---- -The ``random_seed`` is used to control the behaviour of the RNG. The seed -can be ``None`` or an integer number. -If you are **not** interested in the reproducibility of your results, you can -set ``random_seed`` to ``None``. However, this is not recommended. -In fact, this means that if you run multiple times a function or method where -a RNG is used, e.g. for producing noise timelines, then -the outputs will be **different** and you will not be able to re-obtain these -results again. -If instead you are interested in the reproducibility of your results, you can -set ``random_seed`` to an integer number. -With this choice, if you run multiple times a function or method where -a RNG is used, then the outputs will be **the same** and -you will re-obtain these results by re-running your script, as the random -numbers produced by the generator will be exactly the same. - -How should you set the ``random_seed``? This parameter **must** be passed to -the constructor of a :class:`.Simulation` class. -If a :class:`.Simulation` instance is created without passing the seed, an -error will be raised and your script will fail. This feature has been -introduced on purpose in order to avoid automatic settings of the seed and -unclear behaviour of the generation of random numbers. -If you are running a parallel script using MPI, you do not have to -worry about setting a different seed for different MPI ranks: by passing -the same seed, the random numbers generated by the different ranks will be -different. This is ensured by the random number generator. We want this -behaviour as we do not want repetitions of, e.g., the same noise TOD if -we split their computation on different MPI ranks. For example, in this -way, if you split the TOD matrix of an :class:`.Observation` class by the -time, you will not encounter the same noise after the samples generated -by a certain rank; if you split the TOD matrix of an :class:`.Observation` -class by the detectors, each one will have a different noise timestream. - -Regarding the reproducibility of the results in a parallel code, there is -an **important thing** to bear in mind: if you set the seed to an integer -number but run your script with a different number of MPI ranks, the -outputs will be **different**! Think about a noise time stream of 4 samples. -If you use 2 MPI ranks, then the first 2 samples will be generated by -one RNG (the one of rank 0), while the last 2 samples will be generated -by a different RNG (the one of rank 1). If you then run the same script -with the same seed but with 4 MPI ranks, each of the samples will be -generated by a different RNG and only the first sample will be the same -for the two runs, as it is always the first one generated by rank 0's RNG. +The ``random_seed`` is used to control the behavior of the RNG. The +seed can be ``None`` or an integer number. If you are **not** +interested in the reproducibility of your results, you can set +``random_seed`` to ``None``. However, this is not recommended, as if +you run many times a function or method that uses an RNG, e.g., for +producing noise timelines, then the outputs will be **different**, and +you will not be able to re-obtain these results again. If, instead, +you are interested in the reproducibility of your results, you can set +``random_seed`` to an integer number. With this choice, if you run a +function or method multiple times using an RNG, then the outputs will +be **the same**, and you will obtain these results again by re-running +your script, as the random numbers produced by the generator will be +the same. + +How should you set the ``random_seed``? This parameter **must** be +passed to the constructor of a :class:`.Simulation` class. If you +create a :class:`.Simulation` instance without passing the seed, the +constructor will raise an error, and your script will fail. We +implemented this feature to avoid automatic settings of the seed and +unclear behavior of the generation of random numbers. If you run a +parallel script using MPI, you do not have to worry about setting a +different seed for different MPI ranks. The random number generator +ensures that the random numbers generated by the ranks will produce +orthogonal sequences. We want this behavior as we do not want +repetitions of, e.g., the same noise TOD if we split their computation +on different MPI ranks. For example, in this way, if you split the TOD +matrix of an :class:`.Observation` class by the time, you will not +encounter the same noise after the samples generated by a certain +rank; if you split the TOD matrix of an :class:`.Observation` class by +the detectors, each one will have a different noise timestream. + +Regarding the reproducibility of the results in a parallel code, there +is an **important thing** to bear in mind. If you set the seed to an +integer number but run your script with a different number of MPI +ranks, the outputs will be **different**! Think about a noise time +stream of 4 samples. If you use 2 MPI ranks, then the first two +samples will be generated by one RNG (rank 0), while the last two +samples will be generated by a different RNG (rank 1). If you then run +the same script with the same seed but with 4 MPI ranks, each of the +samples will be generated by a different RNG, and only the first +sample will be the same for the two runs, as it is always the first +one generated by rank 0’s RNG. The setting of the ``random_seed`` is as simple as this:: @@ -64,12 +64,12 @@ The setting of the ``random_seed`` is as simple as this:: random_seed=12345, # Here the seed for the random number generator is set ) -During the execution of the :class:`.Simulation` constructor, the -:meth:`.Simulation.init_random` method is run. There, the RNG is -built and seeded with ``random_seed``. You can then use this RNG -by calling ``sim.random``. There is also the possibility to -change the random seed after creatinga :class:`.Simulation` instance. -This is achieved by calling :meth:`.Simulation.init_random`:: +The :class:`.Simulation` constructor runs the +:meth:`.Simulation.init_random` method, which builds the RNG and seeds +it with ``random_seed``. You can then use this RNG by calling +``sim.random``. There is also the possibility to change the random +seed after creating a :class:`.Simulation` instance. You can achieve +this by calling :meth:`.Simulation.init_random`:: sim = lbs.Simulation(random_seed=12345) [...] diff --git a/docs/source/reports.rst b/docs/source/reports.rst index 06c34608..fc2ba5b7 100644 --- a/docs/source/reports.rst +++ b/docs/source/reports.rst @@ -1,7 +1,7 @@ .. _reporting: -Creating reports with litebird_sim -================================== +Creating reports +================ The LiteBIRD simulation framework has the ability to automatically produce reports in the output directory specified during the creation diff --git a/docs/source/scanning.rst b/docs/source/scanning.rst index 2e6a26eb..ad0a0ef4 100644 --- a/docs/source/scanning.rst +++ b/docs/source/scanning.rst @@ -4,29 +4,29 @@ Scanning strategy ================= The LiteBIRD Simulation Framework provides a set of tools to simulate -the orbit of the spacecraft and to compute the directions where each -detector is looking at the sky, as a function of time. The time stream +the orbit of the spacecraft and compute the directions where each +detector is looking at the sky as a function of time. The time stream of directions and orientations of each detector is usually called -*pointing information*, and we'll consistently use this jargon in the -documentation. +*pointing information*, and we will consistently use this jargon in +the documentation. -Note that this chapter only deals with the *direction* some detector -is looking at, but the actual position/velocity of the spacecraft is -not needed to do this calculation. The framework provide other -facilities to compute this information, and they are described in -:ref:`dipole-anisotropy`. +Note that this chapter only deals with the *direction* along which +some detector is looking, but the actual position/velocity of the +spacecraft is optional when doing this calculation. The framework +provides other facilities to compute this information, and they are +described in :ref:`dipole-anisotropy`. -This chapter provides an in-depth explanation about how to use the +This chapter provides an in-depth explanation of how to use the facilities provided by the framework to compute the pointing information for any detector in one of the focal planes. -The spacecraft's motion ------------------------ +The motion of the spacecraft +---------------------------- In the case of a space mission like LiteBIRD, the motion of the spacecraft and its structure decide where each detector is looking at -each time. The following video shows qualitatively which kind of -motion is simulated by our framework: +each time. The following video depicts the kind of motion simulated by +our framework: .. raw:: html @@ -47,30 +47,29 @@ You can see that there are *two* rotations in the animation: the spacecraft spins quickly around its spin axis (grey axis), but this axis does not stand still: it performs a precession around the blue axis, which represents the Sun-Earth direction. (You should imagine -the Earth on the left, and the Sun on the very far left.) +the Earth on the left and the Sun on the far left.) Note that the detectors are not necessarily aligned with the spin axis; in fact, the animation shows the actual direction of observation for two different detectors as two red and green lines: you can see -that they are looking quite at two opposite sides of the spin axis. -Every detector looks along its own direction, but detectors belonging -to the same instrument (e.g., LFT) look not far away from each other; -it is customary to express their pointing directions relative to an +that they are looking at two opposite sides of the spin axis. Every +detector looks along its direction, but detectors belonging to the +same instrument (e.g., LFT) look not far away from each other; it is +customary to express their pointing directions relative to an «average» direction, called the *boresight direction*, which is the -main optical axis of the instrument. Since in LiteBIRD there are -*three* instruments (LFT, MFT, HFT), there should be *three* boresight -directions; however, MFT and HFT share the same telescope, and thus -it's customary to show only one boresight for both. This is the true +main optical axis of the instrument. In LiteBIRD, there are *three* +instruments (LFT, MFT, HFT), so there should be *three* boresight +directions; however, MFT and HFT share the same telescope, and thus it +is customary to show only one boresight for both. This is the true meaning of the red and green axes in the video above: the red axis -represents the «average» direction where LFT detectors are looking at, +represents the «average» direction where LFT detectors are looking, and the green axis is the same for MFT/HFT. The animation does not show a *third* rotation happening, which is the revolution of the spacecraft around the Sun, taking one year to complete. (Including it in the video would have been useless, as it is -*really* slow when compared with the spin and precession!). This means -that the motion of the spacecraft is the composition of *three* -rotations: +*really* slow when compared with the spin and precession!). Thus, the +motion of the spacecraft is the composition of *three* rotations: 1. Rotation of the spacecraft around the spin axis (grey line); @@ -79,14 +78,13 @@ rotations: 3. Yearly rotation of the Sun-Earth axis around the Sun. -If you think about it, you will realize that the kinematics of this -motion can be fully described by the following quantities: +If you think about it, you will realize that the following quantities +can fully describe the kinematics of this motion: - The angle between the spin axis and the boresight direction(s), usually called β; -- The angle between the spin axis and the Sun-Earth axis, usually - called α. +- The angle between the spin and Sun-Earth axes is usually called α. - The speed of the rotation of the boresight direction around the spin axis; @@ -99,15 +97,14 @@ They are sketched in the following diagram: .. image:: images/litebird-scanning-strategy.svg - -These parameters define the so-called *scanning strategy*, i.e., the -way the instruments observe the sky during the mission's lifetime. The +These parameters define the so-called *scanning strategy*, i.e., how +the instruments observe the sky during the mission lifetime. The LiteBIRD Simulation Framework provides all the tools necessary to simulate the composition of these rotations, and it can produce pointing information from the synthetic description of the scanning -strategy. Here is a full example, using the scanning strategy proposed -for CORE (:cite:`2018:core:delabrouille`), which is qualitatively -similar to what is going to be used for LiteBIRD: +strategy. Here is a complete example using the scanning strategy +proposed for CORE (:cite:`2018:core:delabrouille`), which is +qualitatively similar to what is going to be used for LiteBIRD: .. testcode:: @@ -178,89 +175,87 @@ similar to what is going to be used for LiteBIRD: [ 0.088 -3.021 -1.687] [ 0.087 -3.075 -1.635]] -All the details in this code are explained in the next sections, so -for now just keep in mind the overall shape of the code: +We explain all the details of this code in the following sections, so +for now, keep in mind the overall shape of the code: -1. Once the duration of the simulation (one minute in the example - above) is set, we call the method +1. Once we set the duration of the simulation (one minute in the + example above), we call the method :meth:`.Simulation.set_scanning_strategy`, which forces the framework to compute how the orientation of the spacecraft with respect to the sky sphere evolves with time. This method produces a - set of `quaternions `_, - which encode the result of the composition of all the rotations - (spin, precession, revolution around the Sun) described above; - these quaternions are saved in the ``spin2ecliptic_quats`` field of - the ``sim`` class. + set of quaternions, which encode the result of the composition of + all the rotations (spin, precession, revolution around the Sun) + described above; LBS saves these quaternions in the + ``spin2ecliptic_quats`` field of the ``sim`` class. For more + information about quaternions, see :ref:`quaternions-chapter` . 2. When the simulation code needs to determine where a detector is - pointing to (the detector ``det`` in our example), the quaternions - are used to retrieve (1) the coordinates on the Sky sphere, and (2) - the orientation angle (ψ). Both quantities are computed in the - Ecliptic reference frame using the sampling rate of the detector, - which in our example is 10 Hz (i.e., ten samples per second). In - the example above, this is done by the function + pointing to (the detector ``det`` in our example), it uses the + quaternions to retrieve (1) the coordinates on the Sky sphere, + and (2) the orientation angle (ψ). LBS computes both quantities in + the Ecliptic reference frame using the sampling rate of the + detector, which in our example is 10 Hz (i.e., ten samples per + second). In the example above, this is done by the function :func:`.get_pointings`. 3. The method :meth:`.Observation.get_pointings` returns an array with either 2 or 3 fields depending on the argument passed: - - if an integer is passed, this is interpreted as the index of the - detector in the observation, and a ``(N, 3)`` matrix is returned - where the first column contains the colatitude :math:`\theta`, - the second column the longitude :math:`\phi`, and the third column - the orientation angle :math:`\psi`, all expressed in radians. + - if the caller passes an integer, LBS interprets this as the index + of the detector in the observation and returns a ``(N, 3)`` + matrix where the first column contains the colatitude + :math:`\theta`, the second column the longitude :math:`\phi`, and + the third column the orientation angle :math:`\psi`. All the + angles are expressed in radians. - - if a list containing indices is passed, this is interpreted as - a list of detectors in the observation for which we want to compute - the pointing. It returns a ``(D, N, 3)`` matrix where D represents - the detector index, N the index of the sample and the three final - columns are the same described in the first case. + - if the caller passes a list of indices, LBS interprets it as a + list of detectors in the observation for which the caller wants + to compute the pointing. It returns a ``(D, N, 3)`` matrix where + D represents the detector index, N the index of the sample, and + the three final columns are the same described in the first case. - - if the string "all" is passed then a ``(D, N, 3)`` matrix is returned - containig the pointing information for all the detectors in the - observation. + - if the caller passes the string "all", LBS returns a ``(D, N, + 3)`` matrix containing the pointing information for all the + detectors in the observation. - These angles are expressed in the Ecliptic Coordinate - System, where the Equator is aligned with the Ecliptic Plane of - the Solar System. + These angles are expressed in the Ecliptic Coordinate System, where + the Equator is aligned with the Ecliptic Plane of the Solar System. -Computing the spacecraft's orientation --------------------------------------- +Computing the orientation of the spacecraft +------------------------------------------- To compute where a detector is looking at the sky sphere, there is a number of transformations that need to be carried out: .. image:: images/coordinate-systems.svg -We start from the detector's reference frame, which assumes that the -main beam of the radiation pattern is aligned with the `z` axis, and -that the beam of the detector is oriented using the `x` axis as the -reference axis. (In other words, the `x` axis provides a reference frame -for asymmetric beams.) +We start from the detector reference frame, where the main beam of the +radiation pattern is aligned with the `z` axis and is oriented using +the `x` axis as the reference axis. (In other words, the `x` axis +provides a reference frame for asymmetric beams.) The next reference frame is the *boresight*, and to convert from the -detector's reference frame to the boresight there is a rotation, which -is encoded in a rotation quaternion that is saved in the IMO. The framework -implements the class :class:`.RotQuaternion` to encode a rotation -quaternion; this class can model time-varying rotations as well, which -can be useful to simulate vibrations and wobbles in the optical structure -of the instruments. +detector reference frame to the boresight there is a rotation, which +is encoded in a rotation quaternion that is saved in the IMO. The +framework implements the class :class:`.RotQuaternion` to encode a +rotation quaternion; this class can also model time-varying rotations, +which can be useful to simulate vibrations and wobbles in the optical +structure of the instruments. Next, we move from the reference frame of the boresight to that of the -spacecraft. The information about the placement of the boresight with -respect to the spin axis is encoded in the class -:class:`.InstrumentInfo`. After this transformation, the spin axis is -aligned with the `z` axis. +spacecraft. The class :class:`.InstrumentInfo` encodes the information +about the placement of the boresight with respect to the spin axis. +After this transformation, the spin axis is aligned with the `z` axis. -The next transformation goes from the spacecraft's to the Ecliptic +The next transformation goes from the spacecraft to the Ecliptic reference frame; the Ecliptic is on the `xy` plane, and the `z` axis points towards the Ecliptic North Pole. In this case, the framework provides two ways to compute the transformation: -1. The revolution of the Earth around the Sun is modelled using a - plain circular motion, and the starting position is arbitrary; this - mode is triggered whenever the time is tracked using floating-point +1. The revolution of the Earth around the Sun is modeled using a plain + circular motion, and the starting position is arbitrary; this mode + is triggered whenever the time is tracked using floating-point numbers (i.e., the parameter `start_time` in the constructor of :class:`.Simulation` is a ``float``). @@ -270,13 +265,13 @@ provides two ways to compute the transformation: the Solar System, like planets or asteroids. In this case, the parameter `start_time` must be an instance of the class ``astropy.time.Time``. In the example above, we would enable the - computation of proper Earth's motion with the following small - change:: + computation of the proper motion of the Earth with the following + minor change:: import astropy.time sim = lbs.Simulation( - # Turn on full computation of the Earth's orbit around the Sun + # Turn on full computation of the Earth orbit around the Sun start_time=astropy.time.Time("2020-01-01"), duration_s=60.0, description="Simple simulation", @@ -284,20 +279,19 @@ provides two ways to compute the transformation: ) You should compute the proper motion of the Earth around the Sun only -if you absolutely need to, as the computation can be 10÷100 times -slower. +if you need to, as it makes the computation of the pointing +information 10÷100 times slower. From quaternions to detector pointings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To compute the pointing information for a detector, the quaternions -computed through the call to -:meth:`.Simulation.set_scanning_strategy` are not enough, as -they only tell how to convert a vector from the *spin axis* reference -frame to the Ecliptic reference frame. We need two more quaternions -that tell how to convert from the reference frame of the detector to -that of the spin axis: +computed through the call to :meth:`.Simulation.set_scanning_strategy` +are not enough, as they only tell how to convert a vector from the +*spin axis* reference frame to the Ecliptic reference frame. We need +two more quaternions that tell how to convert from the reference frame +of the detector to that of the spin axis: 1. The first quaternion describes how the detector reference frame (with the `z` axis aligned with the main axis of the radiation @@ -306,10 +300,10 @@ that of the spin axis: included in the IMO and is properly initialized if you call :meth:`.DetectorInfo.from_imo`. If you do not specify any quaternion, the constructor for :class:`.DetectorInfo` will assume - that the detector is looking at the boresight, and it will thus create + that the detector is looking at the boresight. It will thus create a default :class:`.RotQuaternion` object, which corresponds to the - identity quaternion :math:`(0 0 0 1)`; this is the case of the simple - example we presented above. + identity quaternion :math:`(0 0 0 1)`; this is the case of the + simple example we presented above. 2. The second quaternion describes how to convert the reference frame of the focal plane (with the `z` axis aligned with the boresight) @@ -337,14 +331,14 @@ figure: To be sure to include an additional quaternion *after* the last sample, like in the figure above, the framework provides the static method :meth:`.ScanningStrategy.optimal_num_of_quaternions`, which -computes how many quaternions need to be calculated to cover some time -span with a given interval between quaternions. For instance, if our -simulation lasts 100 s and we want one quaternion every minute, then -the expected number of quaternions to be computed is 3: one at -:math:`t = 0`, one at :math:`t = 60\,\mathrm{s}`, and one at :math:`t -= 120\,\mathrm{s}`, so that the latter two can be interpolated for the -samples in the range :math:`60\,\mathrm{s} \leq t \leq -100\,\mathrm{s}`. Here is how the function works: +computes how many quaternions are needed to cover some period with a +given interval between quaternions. For instance, if our simulation +lasts 100 s and we want one quaternion every minute, then the number +of quaternions needed is 3: one at :math:`t = 0`, one at :math:`t = +60\,\mathrm{s}`, and one at :math:`t = 120\,\mathrm{s}`, so that the +latter two can be interpolated for the samples in the range +:math:`60\,\mathrm{s} \leq t \leq 100\,\mathrm{s}`. Here is how the +function works: .. testcode:: @@ -366,24 +360,24 @@ split in several blocks inside the :class:`.Observation` class. .. note:: Slerp assumes a rotation with constant angular speed and axis - between consecutive quaternions, and thus it only approximates the - true composition of all the rotations (spin, precession, revolution - around the Sun) that we have discussed above. However, don't forget - that the *real* spacecraft will follow a scanning strategy that - will be more complex than the one described by our geometrical - model, because of many non-idealities that are unavoidable in a + between consecutive quaternions. Thus, it only approximates the + proper composition of all the rotations (spin, precession, + revolution around the Sun) that we discussed above. However, + remember that the *actual* spacecraft will follow a scanning + strategy that will be more complex than the one described by our + geometrical model because of many unavoidable non-idealities in a spacecraft. The approximation of the «slerp» operation is thus unlikely to be relevant. -Once all the quaternions have been computed at the proper sampling -rate, the direction of the detector on the sky and its orientation -angle can be computed via a call to :meth:`.Observation.get_pointings`. -The calculation works as follows: +Once LBS has all the quaternions sampled at the proper sampling rate, +it can compute the direction of the detector on the sky and its +orientation angle through :meth:`.Observation.get_pointings`. The +calculation works as follows: - The direction is the vector :math:`\vec d = R \hat e_z`, where - :math:`R` is the overall rotation from the detector's reference - frame to the Ecliptic reference frame, and :math:`\hat e_z = (0, 0, - 1)` is the one-length vector aligned with the `z` axis. + :math:`R` is the overall rotation from the detector reference frame + to the Ecliptic reference frame, and :math:`\hat e_z = (0, 0, 1)` is + the one-length vector aligned with the `z` axis. - The orientation angle is given by the angle between the North direction passing through the vector :math:`\vec d` (i.e., along the @@ -391,29 +385,30 @@ The calculation works as follows: e_x`, where :math:`R` is the same as above and :math:`\hat e_x = (1, 0, 0)`, as shown in the following figure (note that :math:`\hat e_x` has been drawn twice because the one in the upper side represents - the orientation direction in the detector's reference frame): + the orientation direction in the detector reference frame): .. image:: images/orientation-direction.svg The purpose of the method :meth:`.Simulation.prepare_pointings`, used in the example at the beginning of this chapter, is to combine the quaternions that model the transformations between the many reference -frames used in the framework. These quaternions are then used by -the method :meth:`.Observation.get_pointings` to compute the -actual pointing directions and the HWP angle on the fly. +frames used in the framework. The method +:meth:`.Observation.get_pointings` uses these quaternions to compute +the actual pointing directions and the HWP angle on the fly. To save memory,:meth:`.Observation.get_pointings` does *not* save the -pointings in a variable once they are calculated, and so they must be -recomputed every time you need them. However, in some applications, -pointings need to be accessed several times during a simulation and these -repeated computations can introduce a noticeable slowdown in the code. - -If you want to trade speed with memory occupation, you can use the function -:func:`.precompute_pointings` to compute all the pointings at once and save -them into every :class:`.Observation` objects. This function fills the fields -`pointing_matrix` and `hwp_angle`. The datatype for the pointings is -specified by ``pointings_dtype``. This can be done either with the low level -functions :: +pointings in a variable once it has calculated their value, and so +they must be recomputed every time you need them. However, in some +applications, pointings need to be accessed several times during a +simulation, and these repeated computations can introduce a noticeable +slowdown in the code. + +If you want to trade speed with memory occupation, you can use the +function :func:`.precompute_pointings` to compute all the pointings at +once and save them into every :class:`.Observation` objects. This +function fills the fields `pointing_matrix` and `hwp_angle`. The +datatype for the pointings is specified by ``pointings_dtype``. This +can be done either with the low level functions :: obs = sim.create_observations(detectors=[det]) lbs.prepare_pointings(obs,sim.instrument,sim.spin2ecliptic_quats) @@ -436,18 +431,18 @@ boresight direction is encoded using just one number, the angle between the boresight and the spin axis. However, both papers deal with spacecrafts hosting only *one* focal plane. -The full orientation of the boresight direction is specified using -three angles: +The orientation of the boresight direction is specified using three +angles: 1. The ψ angle encodes the rotation of the focal plane with respect to the boresight direction itself, and it is ideally 0°; 2. The angle between the boresight direction and the spin axis is usually notated with the symbol β (among the three, this is the - most important number: it's 65° for CORE, 69° for PICO); + most crucial number: it is 65° for CORE, 69° for PICO); 3. Finally, the boresight can be rotated by an angle φ around the spin - axis: this is important only when you have more than one focal + axis; this is important only when you have more than one focal plane. For LiteBIRD, :math:`\phi_\text{LFT} - \phi_\text{MHFT} \approx 180^\circ`. @@ -465,23 +460,23 @@ three angles: Interpretation of pointings --------------------------- -With «pointing», we refer to two different concept: +With «pointing», we refer to two different concepts: 1. The direction where the detector is looking at; -2. The orientation of the detector while it's looking at the sky. +2. The orientation of the detector while looking at the sky. -The direction can be encoded either as a one-length vector ``(x, y, -z)`` or as a couple of angles; the LiteBIRD simulation framework -adopts the second option to save memory, and it encodes directions -using the colatitude (i.e., 90° minus the latitude) and the longitude, -commonly indicated with the letters θ (colatitude) and φ (longitude). +Theoretically, one can encode the direction as a one-length vector +``(x, y, z)`` or as a couple of angles. LBS adopts the second option +to save memory, and it encodes directions using the colatitude (i.e., +90° minus the latitude) and the longitude, commonly indicated with the +letters θ (colatitude) and φ (longitude). The orientation of the detector (second point above) can be expressed -either as a vector that is tangent to the sky sphere, or as an angle -calculated with respect to the meridian/parallel going through the -point the detector is looking at. Again, to reduce memory usage, our -framework only encodes the angle. +either as a vector tangent to the sky sphere or as an angle calculated +with respect to the meridian/parallel going through the point the +detector is looking at. Again, to reduce memory usage, our framework +only encodes the angle. The method :meth:`.Observation.get_pointings` returns two matrices: a “pointing matrix”, laid in memory as a :math:`(N, 3)` matrix, where @@ -505,155 +500,25 @@ visualize the position of these pointings on a Healpix map:: Custom scanning strategies -------------------------- -In this section we explain how scanning strategies different from the -nominal, «spinning» strategy can be modelled. You will need to -understand the functions provided by the framework to deal with -quaternions. +This section explains how LBS can model scanning strategies other than +the nominal «spinning» one. You will need to understand the functions +provided by the framework to deal with quaternions. The framework uses a right-handed coordinate system, like the one shown in figure: .. image:: images/right-handed-coordinates.svg -where the grey arrows indicate the verse of *positive* rotations (they -follow the usual right-hand rule: point your thumb along the axis, and -the other fingers will point towards the positive direction of the -rotation). - - -A few words about quaternions -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -To describe a rotation in 3D space, there are several choices: `Euler -angles `_, `rotation -matrices `_, -`quaternions `_, etc. Each -of these systems has its own share of advantages and disadvantages: -for instance, rotation matrices are handy when you have a vector and -want to rotate it, as it's just a matter of doing a matrix-vector -multiplication. Quaternions are more complicated on this regard, but -they offer a mathematical operation called *slerp* (shorthand for -*spherical linear interpolation*), which is incredibly useful and not -available with other representations, like rotation matrices. We -assume that the reader knows what quaternion are and their -mathematical properties; if you are not, be sure to read the book -*Visualizing quaternions*, by Andrew J. Hanson (Elsevier, 2006, -ISBN-0080474772) and the provocative essay by Marc ten Bosch, `Let's -remove Quaternions from every 3D engine -`_. - -The LiteBIRD simulation framework models quaternions using the -convention :math:`(v_x, v_y, v_z, w)`; be aware that some textbooks -use the order :math:`(w, v_x, v_y, v_z)`. As the framework uses -quaternions only to model rotations, they all must obey the relation -:math:`v_x^2 + v_y^2 + v_z^2 + w^2 = 1` (*normalized* quaternions), -which is a property satisfied by rotation quaternions. - -The class :class:`.RotQuaternion` can model time-varying quaternions. -It is enough to provide a list of quaternions, a starting time, and -a sampling frequency, which is assumed to be constant:: - - import litebird_sim as lbs - - time_varying_quaternion = lbs.RotQuaternion( - # Three rotation quaternions - quats=np.array( - [ - [0.5, 0.0, 0.0, 0.8660254], - [0.0, -0.38268343, 0.0, 0.92387953], - [0.0, 0.0, 0.30901699, 0.95105652], - ] - ), - start_time=0.0, - sampling_rate_hz=1.0, - ) - - -This example assumes that ``time_varying_quaternion`` describes a -rotation that evolves with time, starting from ``t = 0`` and lasting -3 seconds, as the sampling frequency is 1 Hz. - -Rotation quaternions can be multiplied together; however, they must refer -to the same starting time and have the same sampling frequency. - - -Python functions for quaternions -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The LiteBIRD Simulation Framework provides three functions, -:func:`.quat_rotation_x`, :func:`.quat_rotation_y`, :func:`.quat_rotation_z` to -compute simple rotation quaternions; they return plain the normalized -quaternion representing a rotation by an angle :math:`\theta` around -one of the three axis `x`, `y`, and `z`. These quaternions are plain -NumPy arrays and can be passed to the parameter ``quats`` of the -constructor for :class:`.RotQuaternion`: - -.. testcode:: - - import litebird_sim as lbs - import numpy as np - - def print_quaternion(q): - print("{:.3f} {:.3f} {:.3f} {:.3f}".format(*q)) - - print("Rotation by π/3 around x:") - print_quaternion(lbs.quat_rotation_x(theta_rad=np.pi/3)) - print("Rotation by π/3 around y:") - print_quaternion(lbs.quat_rotation_y(theta_rad=np.pi/3)) - print("Rotation by π/3 around z:") - print_quaternion(lbs.quat_rotation_z(theta_rad=np.pi/3)) - -.. testoutput:: - - Rotation by π/3 around x: - 0.500 0.000 0.000 0.866 - Rotation by π/3 around y: - 0.000 0.500 0.000 0.866 - Rotation by π/3 around z: - 0.000 0.000 0.500 0.866 - - -There are two functions that implement in-place multiplication of -quaternions: :func:`.quat_right_multiply` performs the calculation -:math:`r \leftarrow r \times q`, and :func:`.quat_left_multiply` -performs the calculation :math:`r \leftarrow q \times r` (where -:math:`\leftarrow` indicates the assignment operation): - -.. testcode:: - - quat = np.array(lbs.quat_rotation_x(np.pi / 3)) - lbs.quat_left_multiply(quat, *lbs.quat_rotation_z(np.pi / 2)) - print("Rotation by π/3 around x and then by π/2 around z:") - print_quaternion(quat) - -.. testoutput:: - - Rotation by π/3 around x and then by π/2 around z: - 0.354 0.354 0.612 0.612 - -Note the syntax for :func:`.quat_left_multiply`: you are supposed to -pass the four components of the quaternion :math:`q` as separate -arguments, and thus we need to prepend the call to ``lbs.quat_rotation_z`` -with ``*`` to expand the result (a 4-element tuple) into the four -parameters required by :func:`.quat_left_multiply`. The reason for -this weird syntax is efficiency, as this kind of function call can be -easily optimized by Numba (which is used extensively in the code). - -Finally, the framework provides the function :func:`.rotate_vector`, -which applies the rotation described by a normalized quaternion to a -vector. There are faster versions in :func:`.rotate_x_vector`, -:func:`.rotate_y_vector`, and :func:`.rotate_z_vector` that rotate the -three basis vectors ``(1, 0, 0)``, ``(0, 1, 0)``, and ``(0, 0, 1)``. -The functions :func:`.all_rotate_vectors`, -:func:`.all_rotate_x_vectors`, :func:`.all_rotate_y_vectors`, and -:func:`.all_rotate_z_vectors` can be applied to arrays of quaternions -and vectors. +where the grey arrows indicate the verse of *positive* rotations. +(They follow the usual right-hand rule: point your thumb along the +axis and the other fingers will point towards the positive direction +of the rotation.) A simple scanning strategy ~~~~~~~~~~~~~~~~~~~~~~~~~~ -We are now ready to discuss how to implement other types of scanning +We are now ready to discuss implementing other types of scanning strategies. There are plenty of reasons why one would like to go beyond the class :class:`.SpinningScanningStrategy`: @@ -663,31 +528,31 @@ beyond the class :class:`.SpinningScanningStrategy`: axis and the boresight vary with time. 2. You are thinking about how to make dedicated observations of some - celestial source (e.g., the Crab Nebula) for the purpose of - calibrating the instruments. + celestial source (e.g., the Crab Nebula) to calibrate the + instruments. -To define a new scanning strategy, we define a descendeant of the +To define a new scanning strategy, we define a descendant of the :class:`.ScanningStrategy` class, an `Abstract Base Class (ABC) -`_; the only method that -must be defined is -:meth:`.ScanningStrategy.generate_spin2ecl_quaternions`, which takes -as inputs the start time, the length of the simulation, and the time -interval to be used between consecutive quaternions. The method must -return an instance of the :class:`.RotQuaternion`, containing the -computed sequence of quaternions. - -We'll code here a very simple scanning strategy, which does not -involve anything fancy: the spacecraft will just spin around the -Sun-Earth axis, and the boresight direction will be along the same -spin axis. Thus, the boresight detector is going to see only the -points along the Ecliptic plane. This scanning strategy is -scientifically useless, but it's simple enough to be implemented in a -few lines of code: +`_; the only mandatory +method is :meth:`.ScanningStrategy.generate_spin2ecl_quaternions`, +which takes as inputs the start time, the length of the simulation, +and the time interval to be used between consecutive quaternions. The +method must return an instance of the :class:`.RotQuaternion`, +containing the computed sequence of quaternions. + +We will code here a straightforward scanning strategy, which does not +involve anything fancy: the spacecraft will spin around the Sun-Earth +axis, and the boresight direction will be along the same spin axis. +Thus, the boresight detector will see only the points along the +Ecliptic plane. This scanning strategy is scientifically useless, but +it is simple enough to be implemented in a few lines of code: 1. The transformation from boresight to the spin axis reference frame is the identity; + 2. There is no precession of the spin axis; therefore, the latter stays on the Ecliptic axis; + 3. The only rotation is caused by the revolution of the Sun-Earth axis around the Sun, which is implemented as a rotation on the `xy` plane, i.e., around the `z` axis. @@ -757,18 +622,17 @@ The following code implements our mock scanning strategy:: quats=spin2ecliptic_quats, ) - -To test the class ``SimpleScanningStrategy``, we write some code very +To test the class ``SimpleScanningStrategy``, we write some code similar to the example presented at the beginning of this section. -However, we cannot run the simulation for just one hour, as it would -be not enough to see any change in the pointing direction: the only -things that changes as time passes is the position of the Earth on the -Ecliptic plane, and it takes 365 days to do one revolution. Therefore, -we extend the length of the simulation to 365 days. Of course, there -is no need to use an high sampling frequency in our example, so we use -here just one sample per day; for the same reason, instead of -computing one quaternion every minute, we compute one quaternion every -30 days:: +However, we cannot simulate for just one hour, as it would not be +enough to see any change in the pointing direction: the only thing +that changes as time passes is the position of the Earth on the +Ecliptic plane, and it takes 365 days to make one revolution. +Therefore, we extend the length of the simulation to 365 days. Of +course, there is no need to use a high sampling frequency in our +example, so we use here just one sample per day; for the same reason, +instead of computing one quaternion every minute, we compute one +quaternion every 30 days:: import astropy.units as u import healpy @@ -800,112 +664,45 @@ computing one quaternion every minute, we compute one quaternion every m[pixidx] = 1 healpy.mollview(m) -Here is the result: we're indeed scanning the Ecliptic plane! +Here is the result: we are indeed scanning the Ecliptic plane! .. image:: images/simple-scanning-strategy.png -Half Wave Plate ---------------- - -The rotation of the polarization angle induced by a HWP can be -included in the returned pointing information by passing an instance -of a descendant of the class :class:`.HWP` to the method -:meth:`.Simulation.set_hwp`. Here is an example:: - - import litebird_sim as lbs - - sim = lbs.Simulation( - start_time=0, - duration_s=100.0, - random_seed=12345, - ) - - sim.set_scanning_strategy( - lbs.SpinningScanningStrategy( - spin_sun_angle_rad=0.785_398_163_397_448_3, - precession_rate_hz=8.664_850_513_998_931e-05, - spin_rate_hz=0.000_833_333_333_333_333_4, - start_time=sim.start_time, - ), - delta_time_s=60, - ) - - sim.set_instrument( - instrument = lbs.InstrumentInfo( - boresight_rotangle_rad=0.0, - spin_boresight_angle_rad=0.872_664_625_997_164_8, - spin_rotangle_rad=3.141_592_653_589_793, - ) - ) - - sim.set_hwp( - lbs.IdealHWP(ang_speed_radpsec=4.084_070_449_666_731), - ) - - det = lbs.DetectorInfo( - name="Boresight_detector", - sampling_rate_hz=1.0, - quat=[0.0, 0.0, 0.0, 1.0], - ) - obs, = sim.create_observations(detectors=[det]) - - sim.prepare_pointings() - - pointing, hwp_angle = sim.observations[0].get_pointings() - -This example uses the :class:`.IdealHWP`, which represents an ideal -spinning HWP. -The method :func:`.get_pointings` returns both pointing and hwp angle -on the fly. -As shown before a similar syntax allow to precompute the pointing and the -hwp angle:: - - sim.prepare_pointings() - sim.precompute_pointings() - - sim.observations[0].pointing_matrix.shape - sim.observations[0].hwp_angle.shape - -This fills the fields `pointing_matrix` and `hwp_angle` for all the -observations in the current simulation. - - Observing point sources in the sky ---------------------------------- -It is useful to simulate the observation of point sources in the sky, -both for a scientific purpose or for instrument calibration. For -instance, an important task in the calibration of a CMB space +It is helpful to simulate the observation of point sources in the sky, +both for a scientific purpose and for instrument calibration. For +instance, an essential task in the calibration of a CMB space experiment is the estimation of the radiation pattern :math:`\gamma(\theta, \phi)` for each detector (sometimes -:math:`\gamma` is called the *beam function*). This task can be done +:math:`\gamma` is called the *beam function*). One can do this task through the observation of a bright point source, like one of the outer planets (Mars, Jupiter, Saturn, etc.): assuming that the source -is really pointlike and neglecting every other emission from the sky, -the response measured by a detector is proportional to the radiation +is pointlike and neglecting every other emission from the sky, the +response measured by a detector is proportional to the radiation pattern :math:`\gamma(\theta, \phi)`, where the angles :math:`\theta, \phi` identify the position of the planet *in the reference frame of the detector*, i.e., where :math:`\theta = 0` is the direction of the main beam axis. -The functions described in this chapter can be used to analyze how -detectors are going to observe point sources in the sky, properly -taking into account proper motions of the sources (this applies to -Solar System objects, like planets and comets). The library -provides the functions +You can use the functions described in this chapter to analyze how +detectors will observe point sources in the sky, properly taking into +account proper motions of the sources (this applies to Solar System +objects, like planets and comets). The library provides the functions :func:`.get_ecl2det_quaternions`, which has the same syntax as :func:`.get_pointings` but returns a matrix with shape ``(N, 4)`` containing the ``N`` quaternions that transform from the Ecliptic -reference frame to the detector's. Thus, this method can be used to -estimate how far from the main beam axis a celestial object is, and -its orientation with respect to the orientation of the detector. +reference frame to the detector. Thus, you can use this method to +estimate how far from the main beam axis a celestial object is and its +orientation with respect to the orientation of the detector. Here we show a simple example; the first part is identical to the -examples shown above (using the same scanning strategy as CORE's), but -here we employ AstroPy to compute the Ecliptic coordinates of Jupiter -during the simulation and convert them in the reference frame of the -boresight detector using :func:`.get_ecl2det_quaternions`: +examples shown above (using the same scanning strategy as for CORE), +but here we employ AstroPy to compute the Ecliptic coordinates of +Jupiter during the simulation and convert them in the reference frame +of the boresight detector using :func:`.get_ecl2det_quaternions`: .. testcode:: @@ -976,7 +773,7 @@ boresight detector using :func:`.get_ecl2det_quaternions`: ecl_vec = ecl_vec.transpose() # Calculate the quaternions that convert the Ecliptic - # reference system into the detector's reference system + # reference system into the detector reference system quats = lbs.get_ecl2det_quaternions( obs, sim.spin2ecliptic_quats, @@ -984,7 +781,7 @@ boresight detector using :func:`.get_ecl2det_quaternions`: detector_quats=[det.quat], ) - # Make room for the xyz vectors in the detector's reference frame + # Make room for the xyz vectors in the detector reference frame det_vec = np.empty_like(ecl_vec) # Do the rotation! @@ -1043,13 +840,3 @@ API reference :members: :undoc-members: :show-inheritance: - -.. automodule:: litebird_sim.hwp - :members: - :undoc-members: - :show-inheritance: - -.. automodule:: litebird_sim.quaternions - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/source/simulations.rst b/docs/source/simulations.rst index e2245d70..3af70cbe 100644 --- a/docs/source/simulations.rst +++ b/docs/source/simulations.rst @@ -517,7 +517,7 @@ straightforward:: sim.read_observations(...) See the documentation in :ref:`observations`, :ref:`scanning-strategy` -:ref:`dipole-anisotropy`, :ref:`timeordered`, :ref:`mapmaking` for +:ref:`dipole-anisotropy`, :ref:`noise`, :ref:`mapscanning`, :ref:`mapmaking` for details of the single functions. diff --git a/docs/source/singularity.rst b/docs/source/singularity.rst new file mode 100644 index 00000000..dee4b1f5 --- /dev/null +++ b/docs/source/singularity.rst @@ -0,0 +1,217 @@ +Using Singularity +================= + +`Singularity `_ is a container platform that +helps users create isolated environments where programs can be run +without interfering with other libraries installed on the system. You +can consider a container as a zipped file containing a Linux +distribution (Ubuntu), a Python distribution, and the LiteBIRD +Simulation Framework, which is already installed and ready to be used. +It might look similar to a virtual machine but is way faster to start +(no boot time delay) and easier to use. + +Let’s first state what are the *drawbacks* of running the framework in +a container: + +- It is not meant to be a tool used by people developing the LiteBIRD + Simulation Framework; it is only used by users because the source + code for ``litebird_sim`` is stored in a read-only directory. (You + could, however, use it to develop some new module in your home + directory and merge it later.) + +- It only runs under Linux. + +- You must run a recent version of the Linux kernel (at least 3.18, + released in 2015). + +- The container takes considerable space (~0.5 GB) and could be a + waste of disk space if you already have a working Python + distribution. + +- You cannot install it system-wide and call it within other Python + programs you already use on your system. For instance, if you have + installed library XYZ in your system, you cannot call XYZ *and* + functions/classes in ``litebird_sim`` from the same Python script. + (It's a *container*, after all.) + +- Although it is a container, it is *still* possible to have conflicts + with other programs installed on your machine (although there are + simple workarounds); + +However, the reason why we are providing this solution is because of +some significant advantages: + +- You do not need to install/upgrade Python; + +- No need to mess with virtual environments; + +- Existing Python versions won’t conflict with Singularity containers + (but see below for some caveats); + +- All the framework, its dependencies, and the Python compiler itself + are bundled in **one** file, which you can keep in your home + directory or move around; + +- It supports MPI, and thus it can be used on HPC clusters. + +Typically, you might want to use our Singularity container if you just +want to run a Python script that calls ``litebird_sim`` but do not +want/cannot install the framework because of conflicts on your system. + +To use the Singularity container, you must follow these steps: + +1. Build a ``Singularity`` file; using the scripts provided by the + LiteBIRD Simulation Framework is a matter of an instant; + +2. Build the container; this requires a working internet connection + and will take a few minutes; + +3. Once the container is built, a new executable file is ready. With + it, you can start IPython and JupyterLab or run Python programs + calling the LiteBIRD Simulation Framework. + +Let’s see the details of each step. + +Build a ``Singularity`` file +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To build a file for Singularity, you must first clone the +``litebird_sim`` repository: + +.. code-block:: text + + git clone https://github.com/litebird/litebird_sim litebird_sim + +Enter the directory ``litebird_sim/singularity`` and run the script +``create-singularity-file.sh``. It takes the following arguments: + +- The version number of the Ubuntu Linux distribution to use. Some + possible choices are ``22.04``, ``24.04``, …; you should use the + most recent LTS release, which is currently ``24.04``. + +- A flag telling which version of MPI to install. Possible choices + are: + + - ``openmpi``; + + - ``mpich``; + + - ``none`` (no MPI support). + + You should choose the same MPI implementation you are running on + your system. + +Here are a few usage examples; each of them creates a ``Singularity`` +file in the current directory (i.e., ``litebird_sim/singularity``): + +.. code-block:: text + + # Use Ubuntu Linux 24.04 and OpenMPI + $ ./create-singularity-file.sh 24.04 openmpi + + # Use Ubuntu Linux 22.04 and MPICH + $ ./create-singularity-file.sh 22.04 mpich + + # Use Ubuntu Linux 20.04 without MPI + $ ./create-singularity-file.sh 20.04 none + +Build the container +~~~~~~~~~~~~~~~~~~~ + +Once you have executed ``create-singularity-file.sh``, you will have a +``Singularity`` file. It's time to run ``singularity`` and create the +container: + +.. code-block:: text + + singularity build --fakeroot litebird_sim.img Singularity + +(The file name ``litebird_sim.img`` is the container to create. Of +course, you can pick the name you want; for example, if you are +creating several containers, you might name them +``litebird_sim_20.04_openmpi.img`` and so on.) The flag ``--fakeroot`` +allows you to create an image even if you do not have superuser +powers. + +If everything works as expected, in a few minutes you will have a +working container in file ``litebird_sim.img`` (which should be about +~0.5 GB in size). + +To check that the container works correctly, run a self-test on it: + +.. code-block:: text + + singularity test litebird_sim.img + + +Running the container +~~~~~~~~~~~~~~~~~~~~~ + +Once the container has been created, you can run it directly: the +IPython prompt will appear, and you can use ``litebird_sim`` +immediately. + +.. asciinema:: singularity_demo1.cast + :preload: 1 + +You can use it to run scripts as well: + +.. asciinema:: singularity_demo2.cast + :preload: 1 + +.. note:: + + You might wonder how the container could run the script + ``test.py`` if the file was created outside the container. The + reason is that Singularity, by default, mounts the home directory + and the current directory in the container, so you can always + access whatever you have in these directories while running stuff + from the container. + + This might lead to undesired effects, though. Suppose you have + installed Anaconda/Miniconda under your home directory: in this + case, clashes between the Python packages installed within the + container and Anaconda might happen! + + In this case, you can run the container using the syntax + ``singularity run -H /tmp/$USER``: this will mount the home + directory on a directory under ``/tmp``. (You can specify another + directory, of course.) + +To use MPI, you must call ``mpirun`` *outside* the container: + +.. asciinema:: singularity_demo3.cast + :preload: 1 + +To obtain a short help about how to use the container, you can use the +command ``singularity run-help``: + +.. asciinema:: singularity_help.cast + :preload: 1 + +Finally, the following demo shows how to test the correctness of the +LiteBIRD Simulation Framework and browse a local copy of the +documentation. The key feature shown here is that running +``singularity shell litebird_sim.img`` starts a shell within the +container; you can then move to ``/opt/litebird_sim`` (the directory +where the framework has been installed) and run commands from there. + +.. asciinema:: singularity_shell.cast + :preload: 1 + +Running ``python3 -m http.server`` starts an HTTP server connected to +http://0.0.0.0:8000/: browsing to that URL will open your own local +copy of the User's manual for the LiteBIRD Simulation Framework. + + +Accessing the IMO from the container +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If you are exporting your home directory (the default), you should +have no problem accessing the IMO, provided that one of these +conditions apply: + +- You are accessing a remote copy of the IMO; + +- You are accessing a local copy of the IMO that resides within your + home directory. diff --git a/docs/source/sky_maps.rst b/docs/source/sky_maps.rst index cc3d00e5..6e2cf0dd 100644 --- a/docs/source/sky_maps.rst +++ b/docs/source/sky_maps.rst @@ -4,19 +4,20 @@ Synthetic sky maps ================== The LiteBIRD Simulation Framework provides the tools necessary to -produce synthetic maps of the sky. These maps are useful for a number -of applications: +produce synthetic maps of the sky. These maps are handy for several +applications: -1. The framework can synthetize realistic detector measurements and +1. The framework can synthesize realistic detector measurements and assemble them in Time Ordered Data (TOD). -2. One can run map-based simulations without the need to generate - timelines: although less accurate than a full end-to-end - simulation, this approach has the advantage of being much faster - and requiring less resources. -The LiteBIRD Simulation Framework uses the PySM3 library to generate -these sky maps; it is advisable that you keep the PySM3 manual at hand -when you use the modules described in this chapter. +2. Map-based simulations can be run without the need to generate + timelines. Although less accurate than a full end-to-end + simulation, this approach is much faster and requires fewer + resources. + +The LiteBIRD Simulation Framework utilizes the PySM3 library to +generate these sky maps. To fully understand and utilize the modules +described in this chapter, refer to the PySM3 manual. Here is an example showing how to use the facilities provided by the framework to generate a CMB map:: @@ -45,15 +46,18 @@ framework to generate a CMB map:: .. image:: images/mbs_i.png -In the dictionary containing the maps Mbs returns also two useful variables: +In the dictionary containing the maps, Mbs returns also two variables: - The coordinates of the generated maps, in the key `Coordinates` -- The parameters used for the syntetic map generation, in the key `Mbs_parameters` -If ``store_alms`` in :class:`.MbsParameters` is True, ``run_all`` returns alms -instead of pixel space maps. The user can set the maximum multipole of these alms with -``lmax_alms``, the default value is :math:`4\times N_{side}`. If ``gaussian_smooth`` is -False, umbeamed maps or alms are returned. + - The parameters used for the synthetic map generation, in the key + `Mbs_parameters` + +If ``store_alms`` in :class:`.MbsParameters` is True, ``run_all`` +returns alms instead of pixel space maps. The user can set the maximum +multipole of these alms with ``lmax_alms``, the default value is +:math:`4\times N_{side}`. If ``gaussian_smooth`` is False, Mbs returns +the umbeamed maps or alms. Available emission models ------------------------- @@ -63,31 +67,31 @@ The list of foreground models currently available for the following: - Anomalous emission: - + - ``pysm_ame_1`` - + - Dust: - + - ``pysm_dust_0`` - + - ``pysm_dust_1`` - + - ``pysm_dust_4`` - + - ``pysm_dust_5`` - + - ``pysm_dust_7`` - + - ``pysm_dust_8`` - Free-free: - + - ``pysm_freefree_1`` - Synchrotron: - + - ``pysm_synch_0`` - + - ``pysm_synch_1`` @@ -95,7 +99,7 @@ Monte Carlo simulations ----------------------- To be written! - + API reference ------------- diff --git a/litebird_sim/hwp_sys/hwp_sys.py b/litebird_sim/hwp_sys/hwp_sys.py index 0b6034e3..dcb71db6 100644 --- a/litebird_sim/hwp_sys/hwp_sys.py +++ b/litebird_sim/hwp_sys/hwp_sys.py @@ -1130,21 +1130,21 @@ def fill_tod( save_tod: bool = False, dtype_pointings=np.float32, ): - r"""It fills tod and/or :math:`A^T A` and :math:`A^T d` for the + r"""Fill a TOD and/or :math:`A^T A` and :math:`A^T d` for the "on the fly" map production Args: observations (:class:`Observation`): container for tod. If the tod is - not required, you can avoid allocating ``observations.tod`` - i.e. in ``lbs.Observation`` use ``allocate_tod=False``. + not required, you can avoid allocating ``observations.tod`` + i.e. in ``lbs.Observation`` use ``allocate_tod=False``. pointings (optional): if not passed, it is either computed on the fly (generated by :func:`lbs.get_pointings` per detector), or read from ``observations.pointing_matrix`` (if present). If ``observations`` is not a list, ``pointings`` must be a np.array - of dimensions (N_det, N_samples, 3). + of dimensions (N_det, N_samples, 3). If ``observations`` is a list, ``pointings`` must be a list of same length. @@ -1153,7 +1153,7 @@ def fill_tod( If not passed, it is computed on the fly (generated by :func:`lbs.get_pointings` per detector). If ``observations`` is not a list, ``hwp_angle`` must be a np.array - of dimensions (N_samples). + of dimensions (N_samples). If ``observations`` is a list, ``hwp_angle`` must be a list of same length. @@ -1161,10 +1161,11 @@ def fill_tod( are rotated from ecliptic to galactic and output map will also be in galactic. save_tod (bool): if True, ``tod`` is saved in ``observations.tod``; if False, - ``tod`` gets deleted. + ``tod`` gets deleted. dtype_pointings: if ``pointings`` is None and is computed within ``fill_tod``, this - is the dtype for pointings and tod (default: np.float32). + is the dtype for pointings and tod (default: np.float32). + """ if pointings is None: diff --git a/poetry.lock b/poetry.lock index 20c3dd2c..ed23a15c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,22 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. + +[[package]] +name = "accessible-pygments" +version = "0.0.5" +description = "A collection of accessible pygments styles" +optional = false +python-versions = ">=3.9" +files = [ + {file = "accessible_pygments-0.0.5-py3-none-any.whl", hash = "sha256:88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7"}, + {file = "accessible_pygments-0.0.5.tar.gz", hash = "sha256:40918d3e6a2b619ad424cb91e556bd3bd8865443d9f22f1dcdf79e33c8046872"}, +] + +[package.dependencies] +pygments = ">=1.5" + +[package.extras] +dev = ["pillow", "pkginfo (>=1.10)", "playwright", "pre-commit", "setuptools", "twine (>=5.0)"] +tests = ["hypothesis", "pytest"] [[package]] name = "aiofiles" @@ -42,13 +60,13 @@ files = [ [[package]] name = "anyio" -version = "4.6.0" +version = "4.6.2.post1" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = true python-versions = ">=3.9" files = [ - {file = "anyio-4.6.0-py3-none-any.whl", hash = "sha256:c7d2e9d63e31599eeb636c8c5c03a7e108d73b345f064f1c19fdc87b79036a9a"}, - {file = "anyio-4.6.0.tar.gz", hash = "sha256:137b4559cbb034c477165047febb6ff83f390fc3b20bf181c1fc0a728cb8beeb"}, + {file = "anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d"}, + {file = "anyio-4.6.2.post1.tar.gz", hash = "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c"}, ] [package.dependencies] @@ -59,7 +77,7 @@ typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.21.0b1)"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"] trio = ["trio (>=0.26.1)"] [[package]] @@ -272,7 +290,7 @@ dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] name = "beautifulsoup4" version = "4.12.3" description = "Screen-scraping library" -optional = true +optional = false python-versions = ">=3.6.0" files = [ {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, @@ -291,21 +309,20 @@ lxml = ["lxml"] [[package]] name = "bleach" -version = "6.1.0" +version = "6.2.0" description = "An easy safelist-based HTML-sanitizing tool." optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, - {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"}, + {file = "bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e"}, + {file = "bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f"}, ] [package.dependencies] -six = ">=1.9.0" webencodings = "*" [package.extras] -css = ["tinycss2 (>=1.1.0,<1.3)"] +css = ["tinycss2 (>=1.1.0,<1.5)"] [[package]] name = "certifi" @@ -410,101 +427,116 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" 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.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] [[package]] @@ -621,83 +653,73 @@ test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist" [[package]] name = "coverage" -version = "7.6.1" +version = "7.6.4" description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, - {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, - {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, - {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, - {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, - {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, - {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, - {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, - {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, - {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, - {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, - {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, - {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, - {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, - {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, - {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, - {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, - {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, - {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, - {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, - {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, - {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, - {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, - {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, - {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, - {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, - {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, - {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, - {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, - {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, + {file = "coverage-7.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07"}, + {file = "coverage-7.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a"}, + {file = "coverage-7.6.4-cp310-cp310-win32.whl", hash = "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa"}, + {file = "coverage-7.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172"}, + {file = "coverage-7.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b"}, + {file = "coverage-7.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522"}, + {file = "coverage-7.6.4-cp311-cp311-win32.whl", hash = "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf"}, + {file = "coverage-7.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19"}, + {file = "coverage-7.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2"}, + {file = "coverage-7.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5"}, + {file = "coverage-7.6.4-cp312-cp312-win32.whl", hash = "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17"}, + {file = "coverage-7.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08"}, + {file = "coverage-7.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9"}, + {file = "coverage-7.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a"}, + {file = "coverage-7.6.4-cp313-cp313-win32.whl", hash = "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e"}, + {file = "coverage-7.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963"}, + {file = "coverage-7.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f"}, + {file = "coverage-7.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef"}, + {file = "coverage-7.6.4-cp313-cp313t-win32.whl", hash = "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e"}, + {file = "coverage-7.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1"}, + {file = "coverage-7.6.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9cb7fa111d21a6b55cbf633039f7bc2749e74932e3aa7cb7333f675a58a58bf3"}, + {file = "coverage-7.6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11a223a14e91a4693d2d0755c7a043db43d96a7450b4f356d506c2562c48642c"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a413a096c4cbac202433c850ee43fa326d2e871b24554da8327b01632673a076"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00a1d69c112ff5149cabe60d2e2ee948752c975d95f1e1096742e6077affd376"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f76846299ba5c54d12c91d776d9605ae33f8ae2b9d1d3c3703cf2db1a67f2c0"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fe439416eb6380de434886b00c859304338f8b19f6f54811984f3420a2e03858"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0294ca37f1ba500667b1aef631e48d875ced93ad5e06fa665a3295bdd1d95111"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6f01ba56b1c0e9d149f9ac85a2f999724895229eb36bd997b61e62999e9b0901"}, + {file = "coverage-7.6.4-cp39-cp39-win32.whl", hash = "sha256:bc66f0bf1d7730a17430a50163bb264ba9ded56739112368ba985ddaa9c3bd09"}, + {file = "coverage-7.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:c481b47f6b5845064c65a7bc78bc0860e635a9b055af0df46fdf1c58cebf8e8f"}, + {file = "coverage-7.6.4-pp39.pp310-none-any.whl", hash = "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e"}, + {file = "coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73"}, ] [package.extras] @@ -705,38 +727,38 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "43.0.1" +version = "43.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-43.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8385d98f6a3bf8bb2d65a73e17ed87a3ba84f6991c155691c51112075f9ffc5d"}, - {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27e613d7077ac613e399270253259d9d53872aaf657471473ebfc9a52935c062"}, - {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68aaecc4178e90719e95298515979814bda0cbada1256a4485414860bd7ab962"}, - {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:de41fd81a41e53267cb020bb3a7212861da53a7d39f863585d13ea11049cf277"}, - {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f98bf604c82c416bc829e490c700ca1553eafdf2912a91e23a79d97d9801372a"}, - {file = "cryptography-43.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:61ec41068b7b74268fa86e3e9e12b9f0c21fcf65434571dbb13d954bceb08042"}, - {file = "cryptography-43.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:014f58110f53237ace6a408b5beb6c427b64e084eb451ef25a28308270086494"}, - {file = "cryptography-43.0.1-cp37-abi3-win32.whl", hash = "sha256:2bd51274dcd59f09dd952afb696bf9c61a7a49dfc764c04dd33ef7a6b502a1e2"}, - {file = "cryptography-43.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:666ae11966643886c2987b3b721899d250855718d6d9ce41b521252a17985f4d"}, - {file = "cryptography-43.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac119bb76b9faa00f48128b7f5679e1d8d437365c5d26f1c2c3f0da4ce1b553d"}, - {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bbcce1a551e262dfbafb6e6252f1ae36a248e615ca44ba302df077a846a8806"}, - {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58d4e9129985185a06d849aa6df265bdd5a74ca6e1b736a77959b498e0505b85"}, - {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d03a475165f3134f773d1388aeb19c2d25ba88b6a9733c5c590b9ff7bbfa2e0c"}, - {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:511f4273808ab590912a93ddb4e3914dfd8a388fed883361b02dea3791f292e1"}, - {file = "cryptography-43.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:80eda8b3e173f0f247f711eef62be51b599b5d425c429b5d4ca6a05e9e856baa"}, - {file = "cryptography-43.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38926c50cff6f533f8a2dae3d7f19541432610d114a70808f0926d5aaa7121e4"}, - {file = "cryptography-43.0.1-cp39-abi3-win32.whl", hash = "sha256:a575913fb06e05e6b4b814d7f7468c2c660e8bb16d8d5a1faf9b33ccc569dd47"}, - {file = "cryptography-43.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:d75601ad10b059ec832e78823b348bfa1a59f6b8d545db3a24fd44362a1564cb"}, - {file = "cryptography-43.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ea25acb556320250756e53f9e20a4177515f012c9eaea17eb7587a8c4d8ae034"}, - {file = "cryptography-43.0.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c1332724be35d23a854994ff0b66530119500b6053d0bd3363265f7e5e77288d"}, - {file = "cryptography-43.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fba1007b3ef89946dbbb515aeeb41e30203b004f0b4b00e5e16078b518563289"}, - {file = "cryptography-43.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5b43d1ea6b378b54a1dc99dd8a2b5be47658fe9a7ce0a58ff0b55f4b43ef2b84"}, - {file = "cryptography-43.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:88cce104c36870d70c49c7c8fd22885875d950d9ee6ab54df2745f83ba0dc365"}, - {file = "cryptography-43.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d3cdb25fa98afdd3d0892d132b8d7139e2c087da1712041f6b762e4f807cc96"}, - {file = "cryptography-43.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e710bf40870f4db63c3d7d929aa9e09e4e7ee219e703f949ec4073b4294f6172"}, - {file = "cryptography-43.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7c05650fe8023c5ed0d46793d4b7d7e6cd9c04e68eabe5b0aeea836e37bdcec2"}, - {file = "cryptography-43.0.1.tar.gz", hash = "sha256:203e92a75716d8cfb491dc47c79e17d0d9207ccffcbcb35f598fbe463ae3444d"}, + {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, + {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, + {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, + {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, + {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, + {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, + {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] [package.dependencies] @@ -749,7 +771,7 @@ nox = ["nox"] pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "cryptography-vectors (==43.0.1)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] @@ -769,33 +791,37 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "debugpy" -version = "1.8.6" +version = "1.8.8" description = "An implementation of the Debug Adapter Protocol for Python" optional = true python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:30f467c5345d9dfdcc0afdb10e018e47f092e383447500f125b4e013236bf14b"}, - {file = "debugpy-1.8.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d73d8c52614432f4215d0fe79a7e595d0dd162b5c15233762565be2f014803b"}, - {file = "debugpy-1.8.6-cp310-cp310-win32.whl", hash = "sha256:e3e182cd98eac20ee23a00653503315085b29ab44ed66269482349d307b08df9"}, - {file = "debugpy-1.8.6-cp310-cp310-win_amd64.whl", hash = "sha256:e3a82da039cfe717b6fb1886cbbe5c4a3f15d7df4765af857f4307585121c2dd"}, - {file = "debugpy-1.8.6-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:67479a94cf5fd2c2d88f9615e087fcb4fec169ec780464a3f2ba4a9a2bb79955"}, - {file = "debugpy-1.8.6-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb8653f6cbf1dd0a305ac1aa66ec246002145074ea57933978346ea5afdf70b"}, - {file = "debugpy-1.8.6-cp311-cp311-win32.whl", hash = "sha256:cdaf0b9691879da2d13fa39b61c01887c34558d1ff6e5c30e2eb698f5384cd43"}, - {file = "debugpy-1.8.6-cp311-cp311-win_amd64.whl", hash = "sha256:43996632bee7435583952155c06881074b9a742a86cee74e701d87ca532fe833"}, - {file = "debugpy-1.8.6-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:db891b141fc6ee4b5fc6d1cc8035ec329cabc64bdd2ae672b4550c87d4ecb128"}, - {file = "debugpy-1.8.6-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:567419081ff67da766c898ccf21e79f1adad0e321381b0dfc7a9c8f7a9347972"}, - {file = "debugpy-1.8.6-cp312-cp312-win32.whl", hash = "sha256:c9834dfd701a1f6bf0f7f0b8b1573970ae99ebbeee68314116e0ccc5c78eea3c"}, - {file = "debugpy-1.8.6-cp312-cp312-win_amd64.whl", hash = "sha256:e4ce0570aa4aca87137890d23b86faeadf184924ad892d20c54237bcaab75d8f"}, - {file = "debugpy-1.8.6-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:df5dc9eb4ca050273b8e374a4cd967c43be1327eeb42bfe2f58b3cdfe7c68dcb"}, - {file = "debugpy-1.8.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a85707c6a84b0c5b3db92a2df685b5230dd8fb8c108298ba4f11dba157a615a"}, - {file = "debugpy-1.8.6-cp38-cp38-win32.whl", hash = "sha256:538c6cdcdcdad310bbefd96d7850be1cd46e703079cc9e67d42a9ca776cdc8a8"}, - {file = "debugpy-1.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:22140bc02c66cda6053b6eb56dfe01bbe22a4447846581ba1dd6df2c9f97982d"}, - {file = "debugpy-1.8.6-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:c1cef65cffbc96e7b392d9178dbfd524ab0750da6c0023c027ddcac968fd1caa"}, - {file = "debugpy-1.8.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e60bd06bb3cc5c0e957df748d1fab501e01416c43a7bdc756d2a992ea1b881"}, - {file = "debugpy-1.8.6-cp39-cp39-win32.whl", hash = "sha256:f7158252803d0752ed5398d291dee4c553bb12d14547c0e1843ab74ee9c31123"}, - {file = "debugpy-1.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:3358aa619a073b620cd0d51d8a6176590af24abcc3fe2e479929a154bf591b51"}, - {file = "debugpy-1.8.6-py2.py3-none-any.whl", hash = "sha256:b48892df4d810eff21d3ef37274f4c60d32cdcafc462ad5647239036b0f0649f"}, - {file = "debugpy-1.8.6.zip", hash = "sha256:c931a9371a86784cee25dec8d65bc2dc7a21f3f1552e3833d9ef8f919d22280a"}, + {file = "debugpy-1.8.8-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:e59b1607c51b71545cb3496876544f7186a7a27c00b436a62f285603cc68d1c6"}, + {file = "debugpy-1.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6531d952b565b7cb2fbd1ef5df3d333cf160b44f37547a4e7cf73666aca5d8d"}, + {file = "debugpy-1.8.8-cp310-cp310-win32.whl", hash = "sha256:b01f4a5e5c5fb1d34f4ccba99a20ed01eabc45a4684f4948b5db17a319dfb23f"}, + {file = "debugpy-1.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:535f4fb1c024ddca5913bb0eb17880c8f24ba28aa2c225059db145ee557035e9"}, + {file = "debugpy-1.8.8-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:c399023146e40ae373753a58d1be0a98bf6397fadc737b97ad612886b53df318"}, + {file = "debugpy-1.8.8-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09cc7b162586ea2171eea055985da2702b0723f6f907a423c9b2da5996ad67ba"}, + {file = "debugpy-1.8.8-cp311-cp311-win32.whl", hash = "sha256:eea8821d998ebeb02f0625dd0d76839ddde8cbf8152ebbe289dd7acf2cdc6b98"}, + {file = "debugpy-1.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:d4483836da2a533f4b1454dffc9f668096ac0433de855f0c22cdce8c9f7e10c4"}, + {file = "debugpy-1.8.8-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:0cc94186340be87b9ac5a707184ec8f36547fb66636d1029ff4f1cc020e53996"}, + {file = "debugpy-1.8.8-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64674e95916e53c2e9540a056e5f489e0ad4872645399d778f7c598eacb7b7f9"}, + {file = "debugpy-1.8.8-cp312-cp312-win32.whl", hash = "sha256:5c6e885dbf12015aed73770f29dec7023cb310d0dc2ba8bfbeb5c8e43f80edc9"}, + {file = "debugpy-1.8.8-cp312-cp312-win_amd64.whl", hash = "sha256:19ffbd84e757a6ca0113574d1bf5a2298b3947320a3e9d7d8dc3377f02d9f864"}, + {file = "debugpy-1.8.8-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:705cd123a773d184860ed8dae99becd879dfec361098edbefb5fc0d3683eb804"}, + {file = "debugpy-1.8.8-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:890fd16803f50aa9cb1a9b9b25b5ec321656dd6b78157c74283de241993d086f"}, + {file = "debugpy-1.8.8-cp313-cp313-win32.whl", hash = "sha256:90244598214bbe704aa47556ec591d2f9869ff9e042e301a2859c57106649add"}, + {file = "debugpy-1.8.8-cp313-cp313-win_amd64.whl", hash = "sha256:4b93e4832fd4a759a0c465c967214ed0c8a6e8914bced63a28ddb0dd8c5f078b"}, + {file = "debugpy-1.8.8-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:143ef07940aeb8e7316de48f5ed9447644da5203726fca378f3a6952a50a9eae"}, + {file = "debugpy-1.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f95651bdcbfd3b27a408869a53fbefcc2bcae13b694daee5f1365b1b83a00113"}, + {file = "debugpy-1.8.8-cp38-cp38-win32.whl", hash = "sha256:26b461123a030e82602a750fb24d7801776aa81cd78404e54ab60e8b5fecdad5"}, + {file = "debugpy-1.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:f3cbf1833e644a3100eadb6120f25be8a532035e8245584c4f7532937edc652a"}, + {file = "debugpy-1.8.8-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:53709d4ec586b525724819dc6af1a7703502f7e06f34ded7157f7b1f963bb854"}, + {file = "debugpy-1.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a9c013077a3a0000e83d97cf9cc9328d2b0bbb31f56b0e99ea3662d29d7a6a2"}, + {file = "debugpy-1.8.8-cp39-cp39-win32.whl", hash = "sha256:ffe94dd5e9a6739a75f0b85316dc185560db3e97afa6b215628d1b6a17561cb2"}, + {file = "debugpy-1.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5c0e5a38c7f9b481bf31277d2f74d2109292179081f11108e668195ef926c0f9"}, + {file = "debugpy-1.8.8-py2.py3-none-any.whl", hash = "sha256:ec684553aba5b4066d4de510859922419febc710df7bba04fe9e7ef3de15d34f"}, + {file = "debugpy-1.8.8.zip", hash = "sha256:e6355385db85cbd666be703a96ab7351bc9e6c61d694893206f8001e22aee091"}, ] [[package]] @@ -853,24 +879,24 @@ packaging = "*" [[package]] name = "distlib" -version = "0.3.8" +version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" 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.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, + {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, ] [[package]] name = "docutils" -version = "0.18.1" +version = "0.21.2" description = "Docutils -- Python Documentation Utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.9" files = [ - {file = "docutils-0.18.1-py2.py3-none-any.whl", hash = "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c"}, - {file = "docutils-0.18.1.tar.gz", hash = "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06"}, + {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, + {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, ] [[package]] @@ -1447,13 +1473,13 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "jsonschema-specifications" -version = "2023.12.1" +version = "2024.10.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, - {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, + {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, + {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, ] [package.dependencies] @@ -1916,32 +1942,32 @@ types-pyyaml = ">=6.0.12.12,<7.0.0.0" [[package]] name = "llvmlite" -version = "0.43.0" +version = "0.42.0" description = "lightweight wrapper around basic LLVM functionality" optional = false python-versions = ">=3.9" files = [ - {file = "llvmlite-0.43.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a289af9a1687c6cf463478f0fa8e8aa3b6fb813317b0d70bf1ed0759eab6f761"}, - {file = "llvmlite-0.43.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d4fd101f571a31acb1559ae1af30f30b1dc4b3186669f92ad780e17c81e91bc"}, - {file = "llvmlite-0.43.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d434ec7e2ce3cc8f452d1cd9a28591745de022f931d67be688a737320dfcead"}, - {file = "llvmlite-0.43.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6912a87782acdff6eb8bf01675ed01d60ca1f2551f8176a300a886f09e836a6a"}, - {file = "llvmlite-0.43.0-cp310-cp310-win_amd64.whl", hash = "sha256:14f0e4bf2fd2d9a75a3534111e8ebeb08eda2f33e9bdd6dfa13282afacdde0ed"}, - {file = "llvmlite-0.43.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8d0618cb9bfe40ac38a9633f2493d4d4e9fcc2f438d39a4e854f39cc0f5f98"}, - {file = "llvmlite-0.43.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0a9a1a39d4bf3517f2af9d23d479b4175ead205c592ceeb8b89af48a327ea57"}, - {file = "llvmlite-0.43.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1da416ab53e4f7f3bc8d4eeba36d801cc1894b9fbfbf2022b29b6bad34a7df2"}, - {file = "llvmlite-0.43.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977525a1e5f4059316b183fb4fd34fa858c9eade31f165427a3977c95e3ee749"}, - {file = "llvmlite-0.43.0-cp311-cp311-win_amd64.whl", hash = "sha256:d5bd550001d26450bd90777736c69d68c487d17bf371438f975229b2b8241a91"}, - {file = "llvmlite-0.43.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f99b600aa7f65235a5a05d0b9a9f31150c390f31261f2a0ba678e26823ec38f7"}, - {file = "llvmlite-0.43.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:35d80d61d0cda2d767f72de99450766250560399edc309da16937b93d3b676e7"}, - {file = "llvmlite-0.43.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eccce86bba940bae0d8d48ed925f21dbb813519169246e2ab292b5092aba121f"}, - {file = "llvmlite-0.43.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df6509e1507ca0760787a199d19439cc887bfd82226f5af746d6977bd9f66844"}, - {file = "llvmlite-0.43.0-cp312-cp312-win_amd64.whl", hash = "sha256:7a2872ee80dcf6b5dbdc838763d26554c2a18aa833d31a2635bff16aafefb9c9"}, - {file = "llvmlite-0.43.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9cd2a7376f7b3367019b664c21f0c61766219faa3b03731113ead75107f3b66c"}, - {file = "llvmlite-0.43.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18e9953c748b105668487b7c81a3e97b046d8abf95c4ddc0cd3c94f4e4651ae8"}, - {file = "llvmlite-0.43.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74937acd22dc11b33946b67dca7680e6d103d6e90eeaaaf932603bec6fe7b03a"}, - {file = "llvmlite-0.43.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc9efc739cc6ed760f795806f67889923f7274276f0eb45092a1473e40d9b867"}, - {file = "llvmlite-0.43.0-cp39-cp39-win_amd64.whl", hash = "sha256:47e147cdda9037f94b399bf03bfd8a6b6b1f2f90be94a454e3386f006455a9b4"}, - {file = "llvmlite-0.43.0.tar.gz", hash = "sha256:ae2b5b5c3ef67354824fb75517c8db5fbe93bc02cd9671f3c62271626bc041d5"}, + {file = "llvmlite-0.42.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3366938e1bf63d26c34fbfb4c8e8d2ded57d11e0567d5bb243d89aab1eb56098"}, + {file = "llvmlite-0.42.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c35da49666a21185d21b551fc3caf46a935d54d66969d32d72af109b5e7d2b6f"}, + {file = "llvmlite-0.42.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70f44ccc3c6220bd23e0ba698a63ec2a7d3205da0d848804807f37fc243e3f77"}, + {file = "llvmlite-0.42.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763f8d8717a9073b9e0246998de89929071d15b47f254c10eef2310b9aac033d"}, + {file = "llvmlite-0.42.0-cp310-cp310-win_amd64.whl", hash = "sha256:8d90edf400b4ceb3a0e776b6c6e4656d05c7187c439587e06f86afceb66d2be5"}, + {file = "llvmlite-0.42.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ae511caed28beaf1252dbaf5f40e663f533b79ceb408c874c01754cafabb9cbf"}, + {file = "llvmlite-0.42.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81e674c2fe85576e6c4474e8c7e7aba7901ac0196e864fe7985492b737dbab65"}, + {file = "llvmlite-0.42.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb3975787f13eb97629052edb5017f6c170eebc1c14a0433e8089e5db43bcce6"}, + {file = "llvmlite-0.42.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5bece0cdf77f22379f19b1959ccd7aee518afa4afbd3656c6365865f84903f9"}, + {file = "llvmlite-0.42.0-cp311-cp311-win_amd64.whl", hash = "sha256:7e0c4c11c8c2aa9b0701f91b799cb9134a6a6de51444eff5a9087fc7c1384275"}, + {file = "llvmlite-0.42.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:08fa9ab02b0d0179c688a4216b8939138266519aaa0aa94f1195a8542faedb56"}, + {file = "llvmlite-0.42.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b2fce7d355068494d1e42202c7aff25d50c462584233013eb4470c33b995e3ee"}, + {file = "llvmlite-0.42.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebe66a86dc44634b59a3bc860c7b20d26d9aaffcd30364ebe8ba79161a9121f4"}, + {file = "llvmlite-0.42.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d47494552559e00d81bfb836cf1c4d5a5062e54102cc5767d5aa1e77ccd2505c"}, + {file = "llvmlite-0.42.0-cp312-cp312-win_amd64.whl", hash = "sha256:05cb7e9b6ce69165ce4d1b994fbdedca0c62492e537b0cc86141b6e2c78d5888"}, + {file = "llvmlite-0.42.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bdd3888544538a94d7ec99e7c62a0cdd8833609c85f0c23fcb6c5c591aec60ad"}, + {file = "llvmlite-0.42.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d0936c2067a67fb8816c908d5457d63eba3e2b17e515c5fe00e5ee2bace06040"}, + {file = "llvmlite-0.42.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a78ab89f1924fc11482209f6799a7a3fc74ddc80425a7a3e0e8174af0e9e2301"}, + {file = "llvmlite-0.42.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7599b65c7af7abbc978dbf345712c60fd596aa5670496561cc10e8a71cebfb2"}, + {file = "llvmlite-0.42.0-cp39-cp39-win_amd64.whl", hash = "sha256:43d65cc4e206c2e902c1004dd5418417c4efa6c1d04df05c6c5675a27e8ca90e"}, + {file = "llvmlite-0.42.0.tar.gz", hash = "sha256:f92b09243c0cc3f457da8b983f67bd8e1295d0f5b3746c7a1861d7a99403854a"}, ] [[package]] @@ -2003,71 +2029,72 @@ setuptools = "*" [[package]] name = "markupsafe" -version = "2.1.5" +version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, + {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]] @@ -2376,37 +2403,37 @@ test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync" [[package]] name = "numba" -version = "0.60.0" +version = "0.59.1" description = "compiling Python code using LLVM" optional = false python-versions = ">=3.9" files = [ - {file = "numba-0.60.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d761de835cd38fb400d2c26bb103a2726f548dc30368853121d66201672e651"}, - {file = "numba-0.60.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:159e618ef213fba758837f9837fb402bbe65326e60ba0633dbe6c7f274d42c1b"}, - {file = "numba-0.60.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1527dc578b95c7c4ff248792ec33d097ba6bef9eda466c948b68dfc995c25781"}, - {file = "numba-0.60.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe0b28abb8d70f8160798f4de9d486143200f34458d34c4a214114e445d7124e"}, - {file = "numba-0.60.0-cp310-cp310-win_amd64.whl", hash = "sha256:19407ced081d7e2e4b8d8c36aa57b7452e0283871c296e12d798852bc7d7f198"}, - {file = "numba-0.60.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a17b70fc9e380ee29c42717e8cc0bfaa5556c416d94f9aa96ba13acb41bdece8"}, - {file = "numba-0.60.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3fb02b344a2a80efa6f677aa5c40cd5dd452e1b35f8d1c2af0dfd9ada9978e4b"}, - {file = "numba-0.60.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5f4fde652ea604ea3c86508a3fb31556a6157b2c76c8b51b1d45eb40c8598703"}, - {file = "numba-0.60.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4142d7ac0210cc86432b818338a2bc368dc773a2f5cf1e32ff7c5b378bd63ee8"}, - {file = "numba-0.60.0-cp311-cp311-win_amd64.whl", hash = "sha256:cac02c041e9b5bc8cf8f2034ff6f0dbafccd1ae9590dc146b3a02a45e53af4e2"}, - {file = "numba-0.60.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d7da4098db31182fc5ffe4bc42c6f24cd7d1cb8a14b59fd755bfee32e34b8404"}, - {file = "numba-0.60.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:38d6ea4c1f56417076ecf8fc327c831ae793282e0ff51080c5094cb726507b1c"}, - {file = "numba-0.60.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:62908d29fb6a3229c242e981ca27e32a6e606cc253fc9e8faeb0e48760de241e"}, - {file = "numba-0.60.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0ebaa91538e996f708f1ab30ef4d3ddc344b64b5227b67a57aa74f401bb68b9d"}, - {file = "numba-0.60.0-cp312-cp312-win_amd64.whl", hash = "sha256:f75262e8fe7fa96db1dca93d53a194a38c46da28b112b8a4aca168f0df860347"}, - {file = "numba-0.60.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:01ef4cd7d83abe087d644eaa3d95831b777aa21d441a23703d649e06b8e06b74"}, - {file = "numba-0.60.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:819a3dfd4630d95fd574036f99e47212a1af41cbcb019bf8afac63ff56834449"}, - {file = "numba-0.60.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b983bd6ad82fe868493012487f34eae8bf7dd94654951404114f23c3466d34b"}, - {file = "numba-0.60.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c151748cd269ddeab66334bd754817ffc0cabd9433acb0f551697e5151917d25"}, - {file = "numba-0.60.0-cp39-cp39-win_amd64.whl", hash = "sha256:3031547a015710140e8c87226b4cfe927cac199835e5bf7d4fe5cb64e814e3ab"}, - {file = "numba-0.60.0.tar.gz", hash = "sha256:5df6158e5584eece5fc83294b949fd30b9f1125df7708862205217e068aabf16"}, + {file = "numba-0.59.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:97385a7f12212c4f4bc28f648720a92514bee79d7063e40ef66c2d30600fd18e"}, + {file = "numba-0.59.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0b77aecf52040de2a1eb1d7e314497b9e56fba17466c80b457b971a25bb1576d"}, + {file = "numba-0.59.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3476a4f641bfd58f35ead42f4dcaf5f132569c4647c6f1360ccf18ee4cda3990"}, + {file = "numba-0.59.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:525ef3f820931bdae95ee5379c670d5c97289c6520726bc6937a4a7d4230ba24"}, + {file = "numba-0.59.1-cp310-cp310-win_amd64.whl", hash = "sha256:990e395e44d192a12105eca3083b61307db7da10e093972ca285c85bef0963d6"}, + {file = "numba-0.59.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:43727e7ad20b3ec23ee4fc642f5b61845c71f75dd2825b3c234390c6d8d64051"}, + {file = "numba-0.59.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:411df625372c77959570050e861981e9d196cc1da9aa62c3d6a836b5cc338966"}, + {file = "numba-0.59.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2801003caa263d1e8497fb84829a7ecfb61738a95f62bc05693fcf1733e978e4"}, + {file = "numba-0.59.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dd2842fac03be4e5324ebbbd4d2d0c8c0fc6e0df75c09477dd45b288a0777389"}, + {file = "numba-0.59.1-cp311-cp311-win_amd64.whl", hash = "sha256:0594b3dfb369fada1f8bb2e3045cd6c61a564c62e50cf1f86b4666bc721b3450"}, + {file = "numba-0.59.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1cce206a3b92836cdf26ef39d3a3242fec25e07f020cc4feec4c4a865e340569"}, + {file = "numba-0.59.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8c8b4477763cb1fbd86a3be7050500229417bf60867c93e131fd2626edb02238"}, + {file = "numba-0.59.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d80bce4ef7e65bf895c29e3889ca75a29ee01da80266a01d34815918e365835"}, + {file = "numba-0.59.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f7ad1d217773e89a9845886401eaaab0a156a90aa2f179fdc125261fd1105096"}, + {file = "numba-0.59.1-cp312-cp312-win_amd64.whl", hash = "sha256:5bf68f4d69dd3a9f26a9b23548fa23e3bcb9042e2935257b471d2a8d3c424b7f"}, + {file = "numba-0.59.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4e0318ae729de6e5dbe64c75ead1a95eb01fabfe0e2ebed81ebf0344d32db0ae"}, + {file = "numba-0.59.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0f68589740a8c38bb7dc1b938b55d1145244c8353078eea23895d4f82c8b9ec1"}, + {file = "numba-0.59.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:649913a3758891c77c32e2d2a3bcbedf4a69f5fea276d11f9119677c45a422e8"}, + {file = "numba-0.59.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9712808e4545270291d76b9a264839ac878c5eb7d8b6e02c970dc0ac29bc8187"}, + {file = "numba-0.59.1-cp39-cp39-win_amd64.whl", hash = "sha256:8d51ccd7008a83105ad6a0082b6a2b70f1142dc7cfd76deb8c5a862367eb8c86"}, + {file = "numba-0.59.1.tar.gz", hash = "sha256:76f69132b96028d2774ed20415e8c528a34e3299a40581bae178f0994a2f370b"}, ] [package.dependencies] -llvmlite = "==0.43.*" -numpy = ">=1.22,<2.1" +llvmlite = "==0.42.*" +numpy = ">=1.22,<1.27" [[package]] name = "numpy" @@ -2466,13 +2493,13 @@ files = [ [[package]] name = "packaging" -version = "24.1" +version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] [[package]] @@ -2517,95 +2544,90 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "10.4.0" +version = "11.0.0" description = "Python Imaging Library (Fork)" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, - {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, - {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, - {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, - {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, - {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, - {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, - {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, - {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, - {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, - {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, - {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, - {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, - {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, - {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, - {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, - {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, - {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, - {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, - {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, - {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, - {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, - {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, - {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, - {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, - {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, - {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, - {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, - {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, - {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, - {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, - {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, - {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, - {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, - {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, - {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, - {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, - {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, - {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, - {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, - {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, - {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, + {file = "pillow-11.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6619654954dc4936fcff82db8eb6401d3159ec6be81e33c6000dfd76ae189947"}, + {file = "pillow-11.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3c5ac4bed7519088103d9450a1107f76308ecf91d6dabc8a33a2fcfb18d0fba"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a65149d8ada1055029fcb665452b2814fe7d7082fcb0c5bed6db851cb69b2086"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88a58d8ac0cc0e7f3a014509f0455248a76629ca9b604eca7dc5927cc593c5e9"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c26845094b1af3c91852745ae78e3ea47abf3dbcd1cf962f16b9a5fbe3ee8488"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:1a61b54f87ab5786b8479f81c4b11f4d61702830354520837f8cc791ebba0f5f"}, + {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:674629ff60030d144b7bca2b8330225a9b11c482ed408813924619c6f302fdbb"}, + {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:598b4e238f13276e0008299bd2482003f48158e2b11826862b1eb2ad7c768b97"}, + {file = "pillow-11.0.0-cp310-cp310-win32.whl", hash = "sha256:9a0f748eaa434a41fccf8e1ee7a3eed68af1b690e75328fd7a60af123c193b50"}, + {file = "pillow-11.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:a5629742881bcbc1f42e840af185fd4d83a5edeb96475a575f4da50d6ede337c"}, + {file = "pillow-11.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:ee217c198f2e41f184f3869f3e485557296d505b5195c513b2bfe0062dc537f1"}, + {file = "pillow-11.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc"}, + {file = "pillow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8b2351c85d855293a299038e1f89db92a2f35e8d2f783489c6f0b2b5f3fe8a3"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f4dba50cfa56f910241eb7f883c20f1e7b1d8f7d91c750cd0b318bad443f4d5"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa"}, + {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b4fd7bd29610a83a8c9b564d457cf5bd92b4e11e79a4ee4716a63c959699b306"}, + {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cb929ca942d0ec4fac404cbf520ee6cac37bf35be479b970c4ffadf2b6a1cad9"}, + {file = "pillow-11.0.0-cp311-cp311-win32.whl", hash = "sha256:006bcdd307cc47ba43e924099a038cbf9591062e6c50e570819743f5607404f5"}, + {file = "pillow-11.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291"}, + {file = "pillow-11.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:16095692a253047fe3ec028e951fa4221a1f3ed3d80c397e83541a3037ff67c9"}, + {file = "pillow-11.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923"}, + {file = "pillow-11.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7"}, + {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6"}, + {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc"}, + {file = "pillow-11.0.0-cp312-cp312-win32.whl", hash = "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6"}, + {file = "pillow-11.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47"}, + {file = "pillow-11.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25"}, + {file = "pillow-11.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699"}, + {file = "pillow-11.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa"}, + {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f"}, + {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb"}, + {file = "pillow-11.0.0-cp313-cp313-win32.whl", hash = "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798"}, + {file = "pillow-11.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de"}, + {file = "pillow-11.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84"}, + {file = "pillow-11.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b"}, + {file = "pillow-11.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003"}, + {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2"}, + {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a"}, + {file = "pillow-11.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8"}, + {file = "pillow-11.0.0-cp313-cp313t-win32.whl", hash = "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8"}, + {file = "pillow-11.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904"}, + {file = "pillow-11.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3"}, + {file = "pillow-11.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2e46773dc9f35a1dd28bd6981332fd7f27bec001a918a72a79b4133cf5291dba"}, + {file = "pillow-11.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2679d2258b7f1192b378e2893a8a0a0ca472234d4c2c0e6bdd3380e8dfa21b6a"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda2616eb2313cbb3eebbe51f19362eb434b18e3bb599466a1ffa76a033fb916"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ec184af98a121fb2da42642dea8a29ec80fc3efbaefb86d8fdd2606619045d"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:8594f42df584e5b4bb9281799698403f7af489fba84c34d53d1c4bfb71b7c4e7"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:c12b5ae868897c7338519c03049a806af85b9b8c237b7d675b8c5e089e4a618e"}, + {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:70fbbdacd1d271b77b7721fe3cdd2d537bbbd75d29e6300c672ec6bb38d9672f"}, + {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5178952973e588b3f1360868847334e9e3bf49d19e169bbbdfaf8398002419ae"}, + {file = "pillow-11.0.0-cp39-cp39-win32.whl", hash = "sha256:8c676b587da5673d3c75bd67dd2a8cdfeb282ca38a30f37950511766b26858c4"}, + {file = "pillow-11.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:94f3e1780abb45062287b4614a5bc0874519c86a777d4a7ad34978e86428b8dd"}, + {file = "pillow-11.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:290f2cc809f9da7d6d622550bbf4c1e57518212da51b6a30fe8e0a270a5b78bd"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1187739620f2b365de756ce086fdb3604573337cc28a0d3ac4a01ab6b2d2a6d2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fbbcb7b57dc9c794843e3d1258c0fbf0f48656d46ffe9e09b63bbd6e8cd5d0a2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d203af30149ae339ad1b4f710d9844ed8796e97fda23ffbc4cc472968a47d0b"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21a0d3b115009ebb8ac3d2ebec5c2982cc693da935f4ab7bb5c8ebe2f47d36f2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:73853108f56df97baf2bb8b522f3578221e56f646ba345a372c78326710d3830"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e58876c91f97b0952eb766123bfef372792ab3f4e3e1f1a2267834c2ab131734"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:224aaa38177597bb179f3ec87eeefcce8e4f85e608025e9cfac60de237ba6316"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5bd2d3bdb846d757055910f0a59792d33b555800813c3b39ada1829c372ccb06"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:375b8dd15a1f5d2feafff536d47e22f69625c1aa92f12b339ec0b2ca40263273"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:daffdf51ee5db69a82dd127eabecce20729e21f7a3680cf7cbb23f0829189790"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7326a1787e3c7b0429659e0a944725e1b03eeaa10edd945a86dead1913383944"}, + {file = "pillow-11.0.0.tar.gz", hash = "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739"}, ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] @@ -2691,32 +2713,33 @@ wcwidth = "*" [[package]] name = "psutil" -version = "6.0.0" +version = "6.1.0" description = "Cross-platform lib for process and system monitoring in Python." optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"}, - {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"}, - {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"}, - {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"}, - {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"}, - {file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"}, - {file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"}, - {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, - {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, - {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"}, - {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"}, - {file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"}, - {file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"}, - {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"}, - {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"}, - {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"}, - {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"}, + {file = "psutil-6.1.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:000d1d1ebd634b4efb383f4034437384e44a6d455260aaee2eca1e9c1b55f047"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5cd2bcdc75b452ba2e10f0e8ecc0b57b827dd5d7aaffbc6821b2a9a242823a76"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:045f00a43c737f960d273a83973b2511430d61f283a44c96bf13a6e829ba8fdc"}, + {file = "psutil-6.1.0-cp27-none-win32.whl", hash = "sha256:9118f27452b70bb1d9ab3198c1f626c2499384935aaf55388211ad982611407e"}, + {file = "psutil-6.1.0-cp27-none-win_amd64.whl", hash = "sha256:a8506f6119cff7015678e2bce904a4da21025cc70ad283a53b099e7620061d85"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a"}, + {file = "psutil-6.1.0-cp36-cp36m-win32.whl", hash = "sha256:6d3fbbc8d23fcdcb500d2c9f94e07b1342df8ed71b948a2649b5cb060a7c94ca"}, + {file = "psutil-6.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1209036fbd0421afde505a4879dee3b2fd7b1e14fee81c0069807adcbbcca747"}, + {file = "psutil-6.1.0-cp37-abi3-win32.whl", hash = "sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e"}, + {file = "psutil-6.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be"}, + {file = "psutil-6.1.0.tar.gz", hash = "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a"}, ] [package.extras] -test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] +dev = ["black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "wheel"] +test = ["pytest", "pytest-xdist", "setuptools"] [[package]] name = "ptyprocess" @@ -2802,6 +2825,33 @@ files = [ {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] +[[package]] +name = "pydata-sphinx-theme" +version = "0.16.0" +description = "Bootstrap-based Sphinx theme from the PyData community" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pydata_sphinx_theme-0.16.0-py3-none-any.whl", hash = "sha256:18c810ee4e67e05281e371e156c1fb5bb0fa1f2747240461b225272f7d8d57d8"}, + {file = "pydata_sphinx_theme-0.16.0.tar.gz", hash = "sha256:721dd26e05fa8b992d66ef545536e6cbe0110afb9865820a08894af1ad6f7707"}, +] + +[package.dependencies] +accessible-pygments = "*" +Babel = "*" +beautifulsoup4 = "*" +docutils = "!=0.17.0" +pygments = ">=2.7" +sphinx = ">=6.1" +typing-extensions = "*" + +[package.extras] +a11y = ["pytest-playwright"] +dev = ["pandoc", "pre-commit", "pydata-sphinx-theme[doc,test]", "pyyaml", "sphinx-theme-builder[cli]", "tox"] +doc = ["ablog (>=0.11.8)", "colorama", "graphviz", "ipykernel", "ipyleaflet", "ipywidgets", "jupyter_sphinx", "jupyterlite-sphinx", "linkify-it-py", "matplotlib", "myst-parser", "nbsphinx", "numpy", "numpydoc", "pandas", "plotly", "rich", "sphinx-autoapi (>=3.0.0)", "sphinx-copybutton", "sphinx-design", "sphinx-favicon (>=1.0.1)", "sphinx-sitemap", "sphinx-togglebutton", "sphinxcontrib-youtube (>=1.4.1)", "sphinxext-rediraffe", "xarray"] +i18n = ["Babel", "jinja2"] +test = ["pytest", "pytest-cov", "pytest-regressions", "sphinx[test]"] + [[package]] name = "pyerfa" version = "2.0.1.4" @@ -2842,13 +2892,13 @@ files = [ [[package]] name = "pygithub" -version = "2.4.0" +version = "2.5.0" description = "Use the full Github API v3" optional = false python-versions = ">=3.8" files = [ - {file = "PyGithub-2.4.0-py3-none-any.whl", hash = "sha256:81935aa4bdc939fba98fee1cb47422c09157c56a27966476ff92775602b9ee24"}, - {file = "pygithub-2.4.0.tar.gz", hash = "sha256:6601e22627e87bac192f1e2e39c6e6f69a43152cfb8f307cee575879320b3051"}, + {file = "PyGithub-2.5.0-py3-none-any.whl", hash = "sha256:b0b635999a658ab8e08720bdd3318893ff20e2275f6446fcf35bf3f44f2c0fd2"}, + {file = "pygithub-2.5.0.tar.gz", hash = "sha256:e1613ac508a9be710920d26eb18b1905ebd9926aa49398e88151c1b526aad3cf"}, ] [package.dependencies] @@ -2921,13 +2971,13 @@ tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] [[package]] name = "pyparsing" -version = "3.1.4" +version = "3.2.0" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false -python-versions = ">=3.6.8" +python-versions = ">=3.9" files = [ - {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, - {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, + {file = "pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84"}, + {file = "pyparsing-3.2.0.tar.gz", hash = "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"}, ] [package.extras] @@ -3014,40 +3064,44 @@ files = [ [[package]] name = "pywin32" -version = "306" +version = "308" description = "Python for Window Extensions" optional = false python-versions = "*" files = [ - {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, - {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, - {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, - {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, - {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, - {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, - {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, - {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, - {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, - {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, - {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, - {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, - {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, - {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, + {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, + {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, + {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"}, + {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"}, + {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"}, + {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"}, + {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"}, + {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"}, + {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"}, + {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"}, + {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"}, + {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"}, + {file = "pywin32-308-cp37-cp37m-win32.whl", hash = "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff"}, + {file = "pywin32-308-cp37-cp37m-win_amd64.whl", hash = "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6"}, + {file = "pywin32-308-cp38-cp38-win32.whl", hash = "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0"}, + {file = "pywin32-308-cp38-cp38-win_amd64.whl", hash = "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de"}, + {file = "pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341"}, + {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"}, ] [[package]] name = "pywinpty" -version = "2.0.13" +version = "2.0.14" description = "Pseudo terminal support for Windows from Python." optional = true python-versions = ">=3.8" files = [ - {file = "pywinpty-2.0.13-cp310-none-win_amd64.whl", hash = "sha256:697bff211fb5a6508fee2dc6ff174ce03f34a9a233df9d8b5fe9c8ce4d5eaf56"}, - {file = "pywinpty-2.0.13-cp311-none-win_amd64.whl", hash = "sha256:b96fb14698db1284db84ca38c79f15b4cfdc3172065b5137383910567591fa99"}, - {file = "pywinpty-2.0.13-cp312-none-win_amd64.whl", hash = "sha256:2fd876b82ca750bb1333236ce98488c1be96b08f4f7647cfdf4129dfad83c2d4"}, - {file = "pywinpty-2.0.13-cp38-none-win_amd64.whl", hash = "sha256:61d420c2116c0212808d31625611b51caf621fe67f8a6377e2e8b617ea1c1f7d"}, - {file = "pywinpty-2.0.13-cp39-none-win_amd64.whl", hash = "sha256:71cb613a9ee24174730ac7ae439fd179ca34ccb8c5349e8d7b72ab5dea2c6f4b"}, - {file = "pywinpty-2.0.13.tar.gz", hash = "sha256:c34e32351a3313ddd0d7da23d27f835c860d32fe4ac814d372a3ea9594f41dde"}, + {file = "pywinpty-2.0.14-cp310-none-win_amd64.whl", hash = "sha256:0b149c2918c7974f575ba79f5a4aad58bd859a52fa9eb1296cc22aa412aa411f"}, + {file = "pywinpty-2.0.14-cp311-none-win_amd64.whl", hash = "sha256:cf2a43ac7065b3e0dc8510f8c1f13a75fb8fde805efa3b8cff7599a1ef497bc7"}, + {file = "pywinpty-2.0.14-cp312-none-win_amd64.whl", hash = "sha256:55dad362ef3e9408ade68fd173e4f9032b3ce08f68cfe7eacb2c263ea1179737"}, + {file = "pywinpty-2.0.14-cp313-none-win_amd64.whl", hash = "sha256:074fb988a56ec79ca90ed03a896d40707131897cefb8f76f926e3834227f2819"}, + {file = "pywinpty-2.0.14-cp39-none-win_amd64.whl", hash = "sha256:5725fd56f73c0531ec218663bd8c8ff5acc43c78962fab28564871b5fce053fd"}, + {file = "pywinpty-2.0.14.tar.gz", hash = "sha256:18bd9529e4a5daf2d9719aa17788ba6013e594ae94c5a0c27e83df3278b0660e"}, ] [[package]] @@ -3313,13 +3367,13 @@ files = [ [[package]] name = "rich" -version = "13.9.1" +version = "13.9.4" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.8.0" files = [ - {file = "rich-13.9.1-py3-none-any.whl", hash = "sha256:b340e739f30aa58921dc477b8adaa9ecdb7cecc217be01d93730ee1bc8aa83be"}, - {file = "rich-13.9.1.tar.gz", hash = "sha256:097cffdf85db1babe30cc7deba5ab3a29e1b9885047dab24c57e9a7f8a9c1466"}, + {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"}, + {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"}, ] [package.dependencies] @@ -3332,114 +3386,101 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.20.0" +version = "0.21.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "rpds_py-0.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2"}, - {file = "rpds_py-0.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f"}, - {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150"}, - {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e"}, - {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2"}, - {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3"}, - {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf"}, - {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140"}, - {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f"}, - {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce"}, - {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94"}, - {file = "rpds_py-0.20.0-cp310-none-win32.whl", hash = "sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee"}, - {file = "rpds_py-0.20.0-cp310-none-win_amd64.whl", hash = "sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399"}, - {file = "rpds_py-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489"}, - {file = "rpds_py-0.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3"}, - {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272"}, - {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad"}, - {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58"}, - {file = "rpds_py-0.20.0-cp311-none-win32.whl", hash = "sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0"}, - {file = "rpds_py-0.20.0-cp311-none-win_amd64.whl", hash = "sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c"}, - {file = "rpds_py-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6"}, - {file = "rpds_py-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef"}, - {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821"}, - {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940"}, - {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174"}, - {file = "rpds_py-0.20.0-cp312-none-win32.whl", hash = "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139"}, - {file = "rpds_py-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585"}, - {file = "rpds_py-0.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29"}, - {file = "rpds_py-0.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f"}, - {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c"}, - {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2"}, - {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57"}, - {file = "rpds_py-0.20.0-cp313-none-win32.whl", hash = "sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a"}, - {file = "rpds_py-0.20.0-cp313-none-win_amd64.whl", hash = "sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2"}, - {file = "rpds_py-0.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24"}, - {file = "rpds_py-0.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29"}, - {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965"}, - {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1"}, - {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752"}, - {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c"}, - {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751"}, - {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8"}, - {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e"}, - {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253"}, - {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a"}, - {file = "rpds_py-0.20.0-cp38-none-win32.whl", hash = "sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5"}, - {file = "rpds_py-0.20.0-cp38-none-win_amd64.whl", hash = "sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232"}, - {file = "rpds_py-0.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22"}, - {file = "rpds_py-0.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789"}, - {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5"}, - {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2"}, - {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c"}, - {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de"}, - {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda"}, - {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580"}, - {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b"}, - {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420"}, - {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b"}, - {file = "rpds_py-0.20.0-cp39-none-win32.whl", hash = "sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7"}, - {file = "rpds_py-0.20.0-cp39-none-win_amd64.whl", hash = "sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8"}, - {file = "rpds_py-0.20.0.tar.gz", hash = "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121"}, + {file = "rpds_py-0.21.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a017f813f24b9df929674d0332a374d40d7f0162b326562daae8066b502d0590"}, + {file = "rpds_py-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:20cc1ed0bcc86d8e1a7e968cce15be45178fd16e2ff656a243145e0b439bd250"}, + {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad116dda078d0bc4886cb7840e19811562acdc7a8e296ea6ec37e70326c1b41c"}, + {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:808f1ac7cf3b44f81c9475475ceb221f982ef548e44e024ad5f9e7060649540e"}, + {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de552f4a1916e520f2703ec474d2b4d3f86d41f353e7680b597512ffe7eac5d0"}, + {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:efec946f331349dfc4ae9d0e034c263ddde19414fe5128580f512619abed05f1"}, + {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b80b4690bbff51a034bfde9c9f6bf9357f0a8c61f548942b80f7b66356508bf5"}, + {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:085ed25baac88953d4283e5b5bd094b155075bb40d07c29c4f073e10623f9f2e"}, + {file = "rpds_py-0.21.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:daa8efac2a1273eed2354397a51216ae1e198ecbce9036fba4e7610b308b6153"}, + {file = "rpds_py-0.21.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:95a5bad1ac8a5c77b4e658671642e4af3707f095d2b78a1fdd08af0dfb647624"}, + {file = "rpds_py-0.21.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3e53861b29a13d5b70116ea4230b5f0f3547b2c222c5daa090eb7c9c82d7f664"}, + {file = "rpds_py-0.21.0-cp310-none-win32.whl", hash = "sha256:ea3a6ac4d74820c98fcc9da4a57847ad2cc36475a8bd9683f32ab6d47a2bd682"}, + {file = "rpds_py-0.21.0-cp310-none-win_amd64.whl", hash = "sha256:b8f107395f2f1d151181880b69a2869c69e87ec079c49c0016ab96860b6acbe5"}, + {file = "rpds_py-0.21.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5555db3e618a77034954b9dc547eae94166391a98eb867905ec8fcbce1308d95"}, + {file = "rpds_py-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:97ef67d9bbc3e15584c2f3c74bcf064af36336c10d2e21a2131e123ce0f924c9"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ab2c2a26d2f69cdf833174f4d9d86118edc781ad9a8fa13970b527bf8236027"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4e8921a259f54bfbc755c5bbd60c82bb2339ae0324163f32868f63f0ebb873d9"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a7ff941004d74d55a47f916afc38494bd1cfd4b53c482b77c03147c91ac0ac3"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5145282a7cd2ac16ea0dc46b82167754d5e103a05614b724457cffe614f25bd8"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de609a6f1b682f70bb7163da745ee815d8f230d97276db049ab447767466a09d"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40c91c6e34cf016fa8e6b59d75e3dbe354830777fcfd74c58b279dceb7975b75"}, + {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d2132377f9deef0c4db89e65e8bb28644ff75a18df5293e132a8d67748397b9f"}, + {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0a9e0759e7be10109645a9fddaaad0619d58c9bf30a3f248a2ea57a7c417173a"}, + {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e20da3957bdf7824afdd4b6eeb29510e83e026473e04952dca565170cd1ecc8"}, + {file = "rpds_py-0.21.0-cp311-none-win32.whl", hash = "sha256:f71009b0d5e94c0e86533c0b27ed7cacc1239cb51c178fd239c3cfefefb0400a"}, + {file = "rpds_py-0.21.0-cp311-none-win_amd64.whl", hash = "sha256:e168afe6bf6ab7ab46c8c375606298784ecbe3ba31c0980b7dcbb9631dcba97e"}, + {file = "rpds_py-0.21.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:30b912c965b2aa76ba5168fd610087bad7fcde47f0a8367ee8f1876086ee6d1d"}, + {file = "rpds_py-0.21.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca9989d5d9b1b300bc18e1801c67b9f6d2c66b8fd9621b36072ed1df2c977f72"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f54e7106f0001244a5f4cf810ba8d3f9c542e2730821b16e969d6887b664266"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fed5dfefdf384d6fe975cc026886aece4f292feaf69d0eeb716cfd3c5a4dd8be"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:590ef88db231c9c1eece44dcfefd7515d8bf0d986d64d0caf06a81998a9e8cab"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f983e4c2f603c95dde63df633eec42955508eefd8d0f0e6d236d31a044c882d7"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b229ce052ddf1a01c67d68166c19cb004fb3612424921b81c46e7ea7ccf7c3bf"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ebf64e281a06c904a7636781d2e973d1f0926a5b8b480ac658dc0f556e7779f4"}, + {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:998a8080c4495e4f72132f3d66ff91f5997d799e86cec6ee05342f8f3cda7dca"}, + {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:98486337f7b4f3c324ab402e83453e25bb844f44418c066623db88e4c56b7c7b"}, + {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a78d8b634c9df7f8d175451cfeac3810a702ccb85f98ec95797fa98b942cea11"}, + {file = "rpds_py-0.21.0-cp312-none-win32.whl", hash = "sha256:a58ce66847711c4aa2ecfcfaff04cb0327f907fead8945ffc47d9407f41ff952"}, + {file = "rpds_py-0.21.0-cp312-none-win_amd64.whl", hash = "sha256:e860f065cc4ea6f256d6f411aba4b1251255366e48e972f8a347cf88077b24fd"}, + {file = "rpds_py-0.21.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ee4eafd77cc98d355a0d02f263efc0d3ae3ce4a7c24740010a8b4012bbb24937"}, + {file = "rpds_py-0.21.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:688c93b77e468d72579351a84b95f976bd7b3e84aa6686be6497045ba84be560"}, + {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c38dbf31c57032667dd5a2f0568ccde66e868e8f78d5a0d27dcc56d70f3fcd3b"}, + {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2d6129137f43f7fa02d41542ffff4871d4aefa724a5fe38e2c31a4e0fd343fb0"}, + {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:520ed8b99b0bf86a176271f6fe23024323862ac674b1ce5b02a72bfeff3fff44"}, + {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaeb25ccfb9b9014a10eaf70904ebf3f79faaa8e60e99e19eef9f478651b9b74"}, + {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af04ac89c738e0f0f1b913918024c3eab6e3ace989518ea838807177d38a2e94"}, + {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9b76e2afd585803c53c5b29e992ecd183f68285b62fe2668383a18e74abe7a3"}, + {file = "rpds_py-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5afb5efde74c54724e1a01118c6e5c15e54e642c42a1ba588ab1f03544ac8c7a"}, + {file = "rpds_py-0.21.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:52c041802a6efa625ea18027a0723676a778869481d16803481ef6cc02ea8cb3"}, + {file = "rpds_py-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee1e4fc267b437bb89990b2f2abf6c25765b89b72dd4a11e21934df449e0c976"}, + {file = "rpds_py-0.21.0-cp313-none-win32.whl", hash = "sha256:0c025820b78817db6a76413fff6866790786c38f95ea3f3d3c93dbb73b632202"}, + {file = "rpds_py-0.21.0-cp313-none-win_amd64.whl", hash = "sha256:320c808df533695326610a1b6a0a6e98f033e49de55d7dc36a13c8a30cfa756e"}, + {file = "rpds_py-0.21.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:2c51d99c30091f72a3c5d126fad26236c3f75716b8b5e5cf8effb18889ced928"}, + {file = "rpds_py-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cbd7504a10b0955ea287114f003b7ad62330c9e65ba012c6223dba646f6ffd05"}, + {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dcc4949be728ede49e6244eabd04064336012b37f5c2200e8ec8eb2988b209c"}, + {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f414da5c51bf350e4b7960644617c130140423882305f7574b6cf65a3081cecb"}, + {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9afe42102b40007f588666bc7de82451e10c6788f6f70984629db193849dced1"}, + {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b929c2bb6e29ab31f12a1117c39f7e6d6450419ab7464a4ea9b0b417174f044"}, + {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8404b3717da03cbf773a1d275d01fec84ea007754ed380f63dfc24fb76ce4592"}, + {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e12bb09678f38b7597b8346983d2323a6482dcd59e423d9448108c1be37cac9d"}, + {file = "rpds_py-0.21.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:58a0e345be4b18e6b8501d3b0aa540dad90caeed814c515e5206bb2ec26736fd"}, + {file = "rpds_py-0.21.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c3761f62fcfccf0864cc4665b6e7c3f0c626f0380b41b8bd1ce322103fa3ef87"}, + {file = "rpds_py-0.21.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c2b2f71c6ad6c2e4fc9ed9401080badd1469fa9889657ec3abea42a3d6b2e1ed"}, + {file = "rpds_py-0.21.0-cp39-none-win32.whl", hash = "sha256:b21747f79f360e790525e6f6438c7569ddbfb1b3197b9e65043f25c3c9b489d8"}, + {file = "rpds_py-0.21.0-cp39-none-win_amd64.whl", hash = "sha256:0626238a43152918f9e72ede9a3b6ccc9e299adc8ade0d67c5e142d564c9a83d"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6b4ef7725386dc0762857097f6b7266a6cdd62bfd209664da6712cb26acef035"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6bc0e697d4d79ab1aacbf20ee5f0df80359ecf55db33ff41481cf3e24f206919"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da52d62a96e61c1c444f3998c434e8b263c384f6d68aca8274d2e08d1906325c"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:98e4fe5db40db87ce1c65031463a760ec7906ab230ad2249b4572c2fc3ef1f9f"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30bdc973f10d28e0337f71d202ff29345320f8bc49a31c90e6c257e1ccef4333"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:faa5e8496c530f9c71f2b4e1c49758b06e5f4055e17144906245c99fa6d45356"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32eb88c30b6a4f0605508023b7141d043a79b14acb3b969aa0b4f99b25bc7d4a"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a89a8ce9e4e75aeb7fa5d8ad0f3fecdee813802592f4f46a15754dcb2fd6b061"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:241e6c125568493f553c3d0fdbb38c74babf54b45cef86439d4cd97ff8feb34d"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:3b766a9f57663396e4f34f5140b3595b233a7b146e94777b97a8413a1da1be18"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:af4a644bf890f56e41e74be7d34e9511e4954894d544ec6b8efe1e21a1a8da6c"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3e30a69a706e8ea20444b98a49f386c17b26f860aa9245329bab0851ed100677"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:031819f906bb146561af051c7cef4ba2003d28cff07efacef59da973ff7969ba"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b876f2bc27ab5954e2fd88890c071bd0ed18b9c50f6ec3de3c50a5ece612f7a6"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc5695c321e518d9f03b7ea6abb5ea3af4567766f9852ad1560f501b17588c7b"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b4de1da871b5c0fd5537b26a6fc6814c3cc05cabe0c941db6e9044ffbb12f04a"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:878f6fea96621fda5303a2867887686d7a198d9e0f8a40be100a63f5d60c88c9"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8eeec67590e94189f434c6d11c426892e396ae59e4801d17a93ac96b8c02a6c"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff2eba7f6c0cb523d7e9cff0903f2fe1feff8f0b2ceb6bd71c0e20a4dcee271"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a429b99337062877d7875e4ff1a51fe788424d522bd64a8c0a20ef3021fdb6ed"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d167e4dbbdac48bd58893c7e446684ad5d425b407f9336e04ab52e8b9194e2ed"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:4eb2de8a147ffe0626bfdc275fc6563aa7bf4b6db59cf0d44f0ccd6ca625a24e"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e78868e98f34f34a88e23ee9ccaeeec460e4eaf6db16d51d7a9b883e5e785a5e"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4991ca61656e3160cdaca4851151fd3f4a92e9eba5c7a530ab030d6aee96ec89"}, + {file = "rpds_py-0.21.0.tar.gz", hash = "sha256:ed6378c9d66d0de903763e7706383d60c33829581f0adff47b6535f1802fa6db"}, ] [[package]] @@ -3528,23 +3569,23 @@ win32 = ["pywin32"] [[package]] name = "setuptools" -version = "75.1.0" +version = "75.3.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-75.1.0-py3-none-any.whl", hash = "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2"}, - {file = "setuptools-75.1.0.tar.gz", hash = "sha256:d59a21b17a275fb872a9c3dae73963160ae079f1049ed956880cd7c09b120538"}, + {file = "setuptools-75.3.0-py3-none-any.whl", hash = "sha256:f2504966861356aa38616760c0f66568e535562374995367b4e69c7143cf6bcd"}, + {file = "setuptools-75.3.0.tar.gz", hash = "sha256:fba5dd4d766e97be1b1681d98712680ae8f2f26d7881245f2ce9e40714f1a686"}, ] [package.extras] check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.11.*)", "pytest-mypy"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.12.*)", "pytest-mypy"] [[package]] name = "six" @@ -3583,7 +3624,7 @@ files = [ name = "soupsieve" version = "2.6" description = "A modern CSS selector implementation for Beautiful Soup." -optional = true +optional = false python-versions = ">=3.8" files = [ {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, @@ -3592,57 +3633,39 @@ files = [ [[package]] name = "sphinx" -version = "6.2.1" +version = "7.4.7" description = "Python documentation generator" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "Sphinx-6.2.1.tar.gz", hash = "sha256:6d56a34697bb749ffa0152feafc4b19836c755d90a7c59b72bc7dfd371b9cc6b"}, - {file = "sphinx-6.2.1-py3-none-any.whl", hash = "sha256:97787ff1fa3256a3eef9eda523a63dbf299f7b47e053cfcf684a1c2a8380c912"}, + {file = "sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239"}, + {file = "sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe"}, ] [package.dependencies] -alabaster = ">=0.7,<0.8" -babel = ">=2.9" -colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.18.1,<0.20" +alabaster = ">=0.7.14,<0.8.0" +babel = ">=2.13" +colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""} +docutils = ">=0.20,<0.22" imagesize = ">=1.3" -importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} -Jinja2 = ">=3.0" -packaging = ">=21.0" -Pygments = ">=2.13" -requests = ">=2.25.0" -snowballstemmer = ">=2.0" +importlib-metadata = {version = ">=6.0", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.1" +packaging = ">=23.0" +Pygments = ">=2.17" +requests = ">=2.30.0" +snowballstemmer = ">=2.2" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" sphinxcontrib-htmlhelp = ">=2.0.0" sphinxcontrib-jsmath = "*" sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" +sphinxcontrib-serializinghtml = ">=1.1.9" +tomli = {version = ">=2", markers = "python_version < \"3.11\""} [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] -test = ["cython", "filelock", "html5lib", "pytest (>=4.6)"] - -[[package]] -name = "sphinx-rtd-theme" -version = "1.3.0" -description = "Read the Docs theme for Sphinx" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -files = [ - {file = "sphinx_rtd_theme-1.3.0-py2.py3-none-any.whl", hash = "sha256:46ddef89cc2416a81ecfbeaceab1881948c014b1b6e4450b815311a89fb977b0"}, - {file = "sphinx_rtd_theme-1.3.0.tar.gz", hash = "sha256:590b030c7abb9cf038ec053b95e5380b5c70d61591eb0b552063fbe7c41f0931"}, -] - -[package.dependencies] -docutils = "<0.19" -sphinx = ">=1.6,<8" -sphinxcontrib-jquery = ">=4,<5" - -[package.extras] -dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"] +lint = ["flake8 (>=6.0)", "importlib-metadata (>=6.0)", "mypy (==1.10.1)", "pytest (>=6.0)", "ruff (==0.5.2)", "sphinx-lint (>=0.9)", "tomli (>=2)", "types-docutils (==0.21.0.20240711)", "types-requests (>=2.30.0)"] +test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "setuptools (>=70.0)", "typing_extensions (>=4.9)"] [[package]] name = "sphinxcontrib-applehelp" @@ -3675,21 +3698,25 @@ sphinx = "*" [[package]] name = "sphinxcontrib-bibtex" -version = "2.5.0" +version = "2.6.3" description = "Sphinx extension for BibTeX style citations." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "sphinxcontrib-bibtex-2.5.0.tar.gz", hash = "sha256:71b42e5db0e2e284f243875326bf9936aa9a763282277d75048826fef5b00eaa"}, - {file = "sphinxcontrib_bibtex-2.5.0-py3-none-any.whl", hash = "sha256:748f726eaca6efff7731012103417ef130ecdcc09501b4d0c54283bf5f059f76"}, + {file = "sphinxcontrib_bibtex-2.6.3-py3-none-any.whl", hash = "sha256:ff016b738fcc867df0f75c29e139b3b2158d26a2c802db27963cb128be3b75fb"}, + {file = "sphinxcontrib_bibtex-2.6.3.tar.gz", hash = "sha256:7c790347ef1cb0edf30de55fc324d9782d085e89c52c2b8faafa082e08e23946"}, ] [package.dependencies] -docutils = ">=0.8" +docutils = ">=0.8,<0.18.dev0 || >=0.20.dev0" importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} pybtex = ">=0.24" pybtex-docutils = ">=1.0.0" -Sphinx = ">=2.1" +setuptools = {version = "*", markers = "python_version >= \"3.12\""} +Sphinx = ">=3.5" + +[package.extras] +test = ["pytest", "pytest-cov"] [[package]] name = "sphinxcontrib-contentui" @@ -3736,20 +3763,6 @@ lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] test = ["html5lib", "pytest"] -[[package]] -name = "sphinxcontrib-jquery" -version = "4.1" -description = "Extension to include jQuery on newer Sphinx releases" -optional = false -python-versions = ">=2.7" -files = [ - {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"}, - {file = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae"}, -] - -[package.dependencies] -Sphinx = ">=1.8" - [[package]] name = "sphinxcontrib-jsmath" version = "1.0.1" @@ -3838,13 +3851,13 @@ typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] [[package]] name = "tinycss2" -version = "1.3.0" +version = "1.4.0" description = "A tiny CSS parser" optional = true python-versions = ">=3.8" files = [ - {file = "tinycss2-1.3.0-py3-none-any.whl", hash = "sha256:54a8dbdffb334d536851be0226030e9505965bb2f30f21a4a82c55fb2a80fae7"}, - {file = "tinycss2-1.3.0.tar.gz", hash = "sha256:152f9acabd296a8375fbca5b84c961ff95971fcfc32e79550c8df8e29118c54d"}, + {file = "tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289"}, + {file = "tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7"}, ] [package.dependencies] @@ -3988,13 +4001,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.26.6" +version = "20.27.1" description = "Virtual Python Environment builder" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" 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.27.1-py3-none-any.whl", hash = "sha256:f11f1b8a29525562925f745563bfd48b189450f61fb34c4f9cc79dd5aa32a1f4"}, + {file = "virtualenv-20.27.1.tar.gz", hash = "sha256:142c6be10212543b32c6c45d3d3893dff89112cc588b7d0879ae5a1ec03a47ba"}, ] [package.dependencies] @@ -4277,4 +4290,4 @@ mpi = ["mpi4py"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "9a69d145dd3434b3a8c19de8bfbf80b429dad9c32a4ec8a15b040742ddd7f61c" +content-hash = "f73126947b5b309be2c6ca3363e1df044d2f2e08dbb4b98741770b3af3923c72" diff --git a/pyproject.toml b/pyproject.toml index 03414b85..e1795340 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,15 +30,14 @@ include = [ [tool.poetry.dependencies] python = ">=3.9,<3.13" -numba = "^0.57.1" -numpy = "^1.24" +numba = "^0.59.1" +numpy = "^1.26" astropy = "5.3.4" tomlkit = "^0.12.1" mpi4py = {version = "^3.1", optional = true} -sphinx = "^6.2.1" -sphinx_rtd_theme = "^1.2.2" +sphinx = "^7.4" sphinxcontrib-bibtex = "^2.5.0" sphinxcontrib-contentui = "^0.2.5" "sphinxcontrib.asciinema" = "^0.3.7" @@ -67,6 +66,7 @@ deprecation = "^2.1.0" scipy = "^1.11.3" ruff = "^0.1.7" libinsdb = "^0.7.4" +pydata-sphinx-theme = "^0.16.0" [tool.poetry.extras] mpi = ["mpi4py"] diff --git a/singularity/create-singularity-file.sh b/singularity/create-singularity-file.sh index 03cc153f..64049497 100755 --- a/singularity/create-singularity-file.sh +++ b/singularity/create-singularity-file.sh @@ -14,7 +14,7 @@ Usage: $(basename $0) UBUNTU_VERSION MPI_LIBRARY [BRANCH] where: - UBUNTU_VERSION is the number of the Ubuntu distribution to use (e.g., 20.04) + UBUNTU_VERSION is the number of the Ubuntu distribution to use (e.g., 24.04) MPI_LIBRARY is either "openmpi", "mpich", or "none" BRANCH specifies the branch to clone, or "master" if nothing is provided EOF From e7b14ea1591bec67c60940e1a205cf50959ec99d Mon Sep 17 00:00:00 2001 From: Yusuke Takase <83496454+yusuke-takase@users.noreply.github.com> Date: Thu, 21 Nov 2024 02:16:47 +0900 Subject: [PATCH 2/4] Focal plane visualizer and detector file generator (#345) * add plot_fp.py * ask duration_yr * CHANGELOG.md: Add entry for plot_fp.py implementation and its functionality * update README * add plot.fp.rst in docs * docs: Improve formatting and clarity in plot_fp.rst * Fix the formatting to make ruff happy --------- Co-authored-by: Yusuke Takase Co-authored-by: Maurizio Tomasi --- CHANGELOG.md | 4 + README.md | 14 ++ docs/source/part2.rst | 1 + docs/source/plot_fp.rst | 44 +++++ litebird_sim/plot_fp.py | 353 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 416 insertions(+) create mode 100644 docs/source/plot_fp.rst create mode 100644 litebird_sim/plot_fp.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 55c98b2d..f1356e5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,10 @@ - Make the code compatible with Python 3.12 [#332](https://github.com/litebird/litebird_sim/pull/332) +- plot_fp.py which visualizes focal plane and `DetectorInfo` is implemented. +Also it can generate a dector list file by clicking visualized detectors. +The function is executable by: `python -m litebird_sim.plot_fp` [#345](https://github.com/litebird/litebird_sim/pull/345) + # Version 0.13.0 - **Breaking change**: new API for pointing computation [#319](https://github.com/litebird/litebird_sim/pull/319). Here is a in-depth list of all the breaking changes in this PR: diff --git a/README.md b/README.md index 33ce83c4..c5306812 100644 --- a/README.md +++ b/README.md @@ -112,6 +112,20 @@ command: make.bat html ``` +### Focal plane visualizer + +We can visualize detectors in the focal plane by: +``` +python -m litebird_sim.plot_fp +``` +This software loads the IMo which is installed in the machine you are using. +As the conversation unfolds, an interactive Matplotlib window will appear. +Detectors corresponding to the specified channels are represented as blue dots. +Clicking on a dot reveals the `DetectorInfo` for that detector in real time, highlighted with a red star. +Additionally, if you agree during the conversation to generate a detector file, +a list of starred detectors will be saved into a text file at the designated location after you closed the plot. + +![plot_fp_usage](https://private-user-images.githubusercontent.com/83496454/388083441-93876c66-8b61-40c0-b23f-79a6998e5e33.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzIxMDQ2MDcsIm5iZiI6MTczMjEwNDMwNywicGF0aCI6Ii84MzQ5NjQ1NC8zODgwODM0NDEtOTM4NzZjNjYtOGI2MS00MGMwLWIyM2YtNzlhNjk5OGU1ZTMzLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDExMjAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQxMTIwVDEyMDUwN1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTZlOTk2M2M3NDgyZjUyY2M4NjFiOGE3ZjliM2RhMWU1YWU2NjFkNmM1ZGQxYzAzM2Y3ZDVmOGI3ZTdhMTAwNjEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.MoAArSYcXhQgVYaer_O72XHIamO_Ex6B5ITuyVgB8_g) ## Roadmap diff --git a/docs/source/part2.rst b/docs/source/part2.rst index de346164..cb897652 100644 --- a/docs/source/part2.rst +++ b/docs/source/part2.rst @@ -7,6 +7,7 @@ Structure of the framework simulations.rst imo.rst detectors.rst + plot_fp.rst observations.rst data_layout.rst profiling.rst diff --git a/docs/source/plot_fp.rst b/docs/source/plot_fp.rst new file mode 100644 index 00000000..54a49212 --- /dev/null +++ b/docs/source/plot_fp.rst @@ -0,0 +1,44 @@ +.. _plot_fp: + +Focal plane visualization +=========== + +We can visualize detectors in the focal plane by: + +.. code-block:: text + + python -m litebird_sim.plot_fp + +This software loads the IMo, which is installed on the machine you are using. +As the conversation unfolds, an interactive Matplotlib window will appear. + +Detectors corresponding to the specified channels are represented as blue dots. +Clicking on a dot reveals the `DetectorInfo` for that detector in real time, highlighted with a red star. + +Additionally, if you agree during the conversation to generate a detector file, +a list of starred detectors will be saved into a text file at the designated location after you close the plot. + +The format of the detector file is as follows: + ++------------+---------+---------+------------+------------+-----------------------+ +| Telescope | Channel | IMO_NET | Number_det | Scaled_NET | Detector_name | ++------------+---------+---------+------------+------------+-----------------------+ +| LFT | L1-040 | 114.63 | 2/48 | 13.51 | `000_003_003_UB_040_T`| ++------------+---------+---------+------------+------------+-----------------------+ +| LFT | L1-040 | 114.63 | 2/48 | 13.51 | `000_003_003_UB_040_B`| ++------------+---------+---------+------------+------------+-----------------------+ + +The description of each column is as follows: + +- `Telescope`: The telescope name. +- `Channel`: The channel name. +- `IMO_NET`: The NET of the detector in IMo. +- `Number_det`: :math:`N_{\text{selected}}/N_{\text{total}}` where :math:`N_{\text{selected}}` is the number of selected detectors by clicking and :math:`N_{\text{total}}` is the total number of detectors in the channel. +- `Scaled_NET`: The scaled NET of the detectors is given by the following equation: + + .. math:: + + \text{Scaled NET} = \text{NET}_{\text{IMO}} \sqrt{\frac{t_{\text{obs}}}{3} \frac{N_{\text{selected}}}{N_{\text{total}}}} + + where :math:`t_{\text{obs}}` is the observation time in years that you can specify in the conversation. The factor of 3 is the nominal observation time in years. +- `Detector_name`: The detector name. diff --git a/litebird_sim/plot_fp.py b/litebird_sim/plot_fp.py new file mode 100644 index 00000000..cf265560 --- /dev/null +++ b/litebird_sim/plot_fp.py @@ -0,0 +1,353 @@ +# -*- encoding: utf-8 -*- + +import numpy as np +import healpy as hp +import matplotlib.pyplot as plt +import os +from pathlib import Path +import toml +from rich import print +from .quaternions import ( + quat_left_multiply, + quat_right_multiply, + quat_rotation_z, +) +from .simulations import Simulation +from .imo import Imo +from .detectors import DetectorInfo, FreqChannelInfo + +CONFIG_FILE_PATH = Path.home() / ".config" / "litebird_imo" / "imo.toml" + + +class DetectorInfoViewer: + def __init__(self): + self.selected_detector_list = [] + self.scatter = [] + self.fig = None + self.ax1 = None + self.ax2 = None + self.info_box = None + self.x_tot = None + self.y_tot = None + self.x_ch = None + self.y_ch = None + self.ndets_in_channel = None + self.channel_dets_list = [] + self.total_dets_list = [] + self.base_path = None + self.telescope = None + self.channel = None + self.imo_version = None + + def get_det_xy(self, det_info, telescope): + """Get the x, y coordinates of the detector on the focal plane. + + Args: + det_info (DetectorInfo): Detector information. + + Returns: + x (float): The x coordinate of the detector on the focal plane. + y (float): The y coordinate of the detector on the focal plane. + """ + q = det_info.quat.quats[0] + r = np.array([0.0, 0.0, 1.0, 0.0]) + if telescope == "LFT": + # Rotate the FPU 180 degrees for projection if LFT is selected + q_z = quat_rotation_z(np.deg2rad(180)) + for q_val in [q, q_z]: + q_conj = np.array([-q_val[0], -q_val[1], -q_val[2], q_val[3]]) + quat_left_multiply(r, *q_val) + quat_right_multiply(r, *q_conj) + else: + q_conj = np.array([-q[0], -q[1], -q[2], q[3]]) + quat_left_multiply(r, *q) + quat_right_multiply(r, *q_conj) + theta, phi = hp.vec2ang(r[:3]) + x = np.rad2deg(theta) * np.cos(phi) + y = np.rad2deg(theta) * np.sin(phi) + return x, y + + def gen_info_text(self, detector): + """Generate the information text of the detector. + + Args: + detector (DetectorInfo): Detector information. + """ + info_text = rf""" + Detector info. + $\cdot~$name: {detector.name} + $\cdot~$wafer: {detector.wafer} + $\cdot~$pixel: {detector.pixel} + $\cdot~$pixtype: {detector.pixtype} + $\cdot~$channel: {detector.channel} + $\cdot~$sampling_rate_hz: {detector.sampling_rate_hz} + $\cdot~$fwhm_arcmin: {detector.fwhm_arcmin} + $\cdot~$ellipticity: {detector.ellipticity} + $\cdot~$bandcenter_ghz: {detector.bandcenter_ghz} + $\cdot~$net_ukrts: {detector.net_ukrts} + $\cdot~$pol_sensitivity_ukarcmin: {detector.pol_sensitivity_ukarcmin} + $\cdot~$fknee_mhz: {detector.fknee_mhz} + $\cdot~$fmin_hz: {detector.fmin_hz} + $\cdot~$alpha: {detector.alpha} + $\cdot~$pol: {detector.pol} + $\cdot~$orient: {detector.orient} + $\cdot~$quat: {detector.quat.quats[0]} + """ + return info_text + + def gen_detsinfo_text(self, det1, det2): + """Generate the information text of the detector. + + Args: + detector (DetectorInfo): Detector information. + """ + info_text = rf""" +Detector info. + name: {det1.name}, {det2.name} + pol: {det1.pol}, {det2.pol} + quat: {det1.quat.quats[0]} + : {det2.quat.quats[0]} + orient: {det1.orient} + wafer: {det1.wafer} + pixel: {det1.pixel} + pixtype: {det1.pixtype} + channel: {det1.channel} + sampling_rate_hz: {det1.sampling_rate_hz} + fwhm_arcmin: {det1.fwhm_arcmin} + ellipticity: {det1.ellipticity} + bandcenter_ghz: {det1.bandcenter_ghz} + net_ukrts: {det1.net_ukrts} + pol_sensitivity_ukarcmin: {det1.pol_sensitivity_ukarcmin} + fknee_mhz: {det1.fknee_mhz} + fmin_hz: {det1.fmin_hz} + alpha: {det1.alpha} + """ + return info_text + + def generate_dets_list_file( + self, filename, selected_detector_list, duration_yr=1.0 + ): + """Generate a text file with the selected detector list. + The NET on detector is scaled by the`scaling_factor`: + :math:`\sqrt{\frac{duration_yr}{3} \times \frac{N_{\rm dets}^{\rm e2e}}{N_{\rm dets}^{\rm ch}}}` + + Args: + filename (str): The name of the file to be created. + selected_detector_list (list): A list of selected detectors. + duration_yr (float): The duration of the end-to-end simulation in years. + """ + header = "# Telescope Channel IMO_NET Number_det Scaled_NET Detector_name\n" + selected_number_of_dets = len(selected_detector_list) + scaling_factor = np.sqrt( + duration_yr / 3.0 * selected_number_of_dets / self.ndets_in_channel + ) + with open(os.path.join(self.base_path, filename), "w") as file: + file.write(header) + for detector in selected_detector_list: + scaled_net = np.round(detector.net_ukrts * scaling_factor, 2) + line = f"{self.telescope}\t\t{self.channel}\t\t{detector.net_ukrts}\t\t{selected_number_of_dets}/{self.ndets_in_channel}\t\t{scaled_net}\t\t{detector.name}\n" + file.write(line) + print(f"[green]The {filename} is generated.[/green]") + print(f"[green]Location:[/green] [cyan]{self.base_path}/{filename}[/cyan]") + + def on_plot_click(self, event): + """Select the detector by clicking on the plot. + + Args: + event (matplotlib.backend_bases.MouseEvent): The mouse event. + """ + if not event.inaxes: + return + else: + blue = "#1f77b4" + red = "#b41f44" + # distance between the clicked point and the detector + distance = ( + (self.x_ch - event.xdata) ** 2 + (self.y_ch - event.ydata) ** 2 + ) ** 0.5 + if np.min(distance) < 0.3: + sorted_indices = np.argsort(distance) + indices = [sorted_indices[0], sorted_indices[1]] + dets_list = [] + for idx in indices: + detector = self.channel_dets_list[idx] + dets_list.append(detector) + if self.scatter[idx].get_markerfacecolor() == blue: + self.scatter[idx].set_markerfacecolor(red) + self.scatter[idx].set_markeredgecolor(red) + self.scatter[idx].set_marker("*") + self.scatter[idx].set_markersize(12) + self.selected_detector_list.append(detector) + elif self.scatter[idx].get_markerfacecolor() == red: + self.scatter[idx].set_markerfacecolor(blue) + self.scatter[idx].set_markeredgecolor(blue) + self.scatter[idx].set_marker("o") + self.scatter[idx].set_markersize(8) + if detector in self.selected_detector_list: + self.selected_detector_list.remove(detector) + info_text = self.gen_detsinfo_text(dets_list[0], dets_list[1]) + self.info_box.set_text(info_text) + self.fig.canvas.draw() + + def ask_yes_or_no(self): + while True: + ans = input().lower() + if ans == "y": + print("[green]Create a detector list file.[/green]") + break + elif ans == "n": + print("[green]No detector list file will be created.[/green]") + break + else: + print("[ref]Invalid input. Please enter 'y' or 'n'.[/red]") + print("[green]Do you want to make a detector list file? [y/n][/green]") + return ans + + def extract_location_from_toml(self, file_path): + """Extract the location of IMo from the toml file. + + Args: + file_path (str): The path to the toml file. + """ + with open(file_path, "r") as file: + data = toml.load(file) + loc = data["repositories"][0]["location"] + return loc + + def main(self): + if not CONFIG_FILE_PATH.exists(): + imo = Imo() + self.imo_version = "vPTEP" + else: + IMO_ROOT_PATH = self.extract_location_from_toml(CONFIG_FILE_PATH) + imo = Imo(flatfile_location=os.path.join(IMO_ROOT_PATH, "schema.json")) + versions = list(imo.imoobject.releases.keys()) + versions_with_idx = [f"({i+1}). {ver}" for i, ver in enumerate(versions)] + print( + f"[green]Available IMO versions:[/green] [cyan]{versions_with_idx}[/cyan]" + ) + print("[green]Input IMO version's number: [/green]") + version_idx = input() + self.imo_version = versions[int(version_idx) - 1] + + sim = Simulation(random_seed=None, imo=imo) + + print( + "[green]Input telescope's number:[/green] [cyan]['(1). LFT', '(2). MFT', '(3). HFT'][/cyan]" + ) + telescope_id = input() + + if telescope_id == "1": + self.telescope = "LFT" + elif telescope_id == "2": + self.telescope = "MFT" + elif telescope_id == "3": + self.telescope = "HFT" + else: + raise ValueError("Invalid telescope number. Please input 1, 2 or 3.") + + inst_info = sim.imo.query( + f"/releases/{self.imo_version}/satellite/{self.telescope}/instrument_info" + ) + channel_list = inst_info.metadata["channel_names"] + # add index to the channel list + channel_list_with_idx = [ + f"({i+1}). {channel}" for i, channel in enumerate(channel_list) + ] + + print( + f"[green]The availavle channels are:[/green] [cyan]{channel_list_with_idx}[/cyan]" + ) + print("[green]Input the channel's number:[/green]") + channel_idx = input() + self.channel = channel_list[int(channel_idx) - 1] + + print("[green]Do you want to make a detector list file? (y/n) [/green]") + ans = self.ask_yes_or_no() + if ans == "y": + print( + "[green]Input mission duration to define a scaling factor for NET (unit: yr):[/green]" + ) + duration_yr = float(input()) + print("[green]Specify the directory to save:[/green]") + self.base_path = input() + if self.base_path == "": + self.base_path = "./" + print("[green]The file will be saved in the current directory.[/green]") + if self.base_path.endswith("/"): + self.base_path = self.base_path[:-1] + + for ch in channel_list: + channel_info = FreqChannelInfo.from_imo( + imo=imo, + url=f"/releases/{self.imo_version}/satellite/{self.telescope}/{ch}/channel_info", + ) + for detector_name in channel_info.detector_names: + det = DetectorInfo.from_imo( + imo=imo, + url=f"/releases/{self.imo_version}/satellite/{self.telescope}/{ch}/{detector_name}/detector_info", + ) + if self.channel == ch: + self.channel_dets_list.append(det) + else: + self.total_dets_list.append(det) + + self.x_tot = np.zeros(len(self.total_dets_list)) + self.y_tot = np.zeros(len(self.total_dets_list)) + self.x_ch = np.zeros(len(self.channel_dets_list)) + self.y_ch = np.zeros(len(self.channel_dets_list)) + self.ndets_in_channel = len(self.channel_dets_list) + + # Make a figure + self.fig = plt.figure(figsize=(10, 8)) + self.ax1 = self.fig.add_subplot(1, 2, 1, aspect="equal") + self.ax1.set_title(self.channel) + self.ax1.plot() + self.scatter = [] + + for i, det in enumerate(self.total_dets_list): + self.x_tot[i], self.y_tot[i] = self.get_det_xy(det, self.telescope) + self.ax1.scatter(self.x_tot, self.y_tot, marker="x", s=25, color="black") + + for i, det in enumerate(self.channel_dets_list): + self.x_ch[i], self.y_ch[i] = self.get_det_xy(det, self.telescope) + self.scatter.append( + self.ax1.plot( + self.x_ch[i], self.y_ch[i], "o", markersize=8, color="#1f77b4" + )[0] + ) + + self.ax1.set_xlabel(r"$\theta\cos(\phi)$ [degrees]") + self.ax1.set_ylabel(r"$\theta\sin(\phi)$ [degrees]") + + self.ax2 = self.fig.add_subplot(1, 2, 2, aspect="equal") + self.info_box = self.ax2.text( + 0.02, + 0.98, + "", + transform=self.ax2.transAxes, + va="top", + ha="left", + bbox=dict(boxstyle="round", facecolor="wheat", alpha=0.5), + ) + self.ax2.set_axis_off() + + print("[blue]Click is available...[/blue]") + self.fig.canvas.mpl_connect("button_press_event", self.on_plot_click) + plt.tight_layout() + plt.show() + + # Save the detector list file. + if ans == "y": + filename = "detectors_" + self.telescope + "_" + self.channel + "_T+B.txt" + self.selected_detector_list = sorted( + self.selected_detector_list, key=lambda detector: detector.name + ) + self.generate_dets_list_file( + filename, self.selected_detector_list, duration_yr + ) + + +if __name__ == "__main__": + viewer = DetectorInfoViewer() + viewer.main() From 210cd827ae4cc0022bad1a38f4c115223b348b34 Mon Sep 17 00:00:00 2001 From: Luca Pagano Date: Thu, 21 Nov 2024 10:35:59 +0100 Subject: [PATCH 3/4] Change the default behavior of Simulation.add_noise() (#349) * Simulation.add_noise uses self.random as default * CHANGELOG updated --- CHANGELOG.md | 4 +++- docs/source/map_scanning.rst | 2 +- docs/source/noise.rst | 2 +- litebird_sim/simulations.py | 11 +++++++---- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1356e5c..4b2ce304 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,10 +10,12 @@ - Make the code compatible with Python 3.12 [#332](https://github.com/litebird/litebird_sim/pull/332) -- plot_fp.py which visualizes focal plane and `DetectorInfo` is implemented. +- plot_fp.py which visualizes focal plane and `DetectorInfo` is implemented. Also it can generate a dector list file by clicking visualized detectors. The function is executable by: `python -m litebird_sim.plot_fp` [#345](https://github.com/litebird/litebird_sim/pull/345) +- Simulation.add_noise() uses self.random as default random number generator [#349](https://github.com/litebird/litebird_sim/pull/349) + # Version 0.13.0 - **Breaking change**: new API for pointing computation [#319](https://github.com/litebird/litebird_sim/pull/319). Here is a in-depth list of all the breaking changes in this PR: diff --git a/docs/source/map_scanning.rst b/docs/source/map_scanning.rst index 8f7424ab..d82cdb58 100644 --- a/docs/source/map_scanning.rst +++ b/docs/source/map_scanning.rst @@ -174,7 +174,7 @@ transparent: sim.fill_tods(sky_signal) - sim.add_noise(noise_type='white', random=sim.random) + sim.add_noise(noise_type='white') for i in range(5): print(f"{sim.observations[0].tod[0][i]:.5e}") diff --git a/docs/source/noise.rst b/docs/source/noise.rst index 5cc86214..0b7c376f 100644 --- a/docs/source/noise.rst +++ b/docs/source/noise.rst @@ -241,7 +241,7 @@ the interface is simplified. sim.create_observations(detectors=det) - sim.add_noise(noise_type='one_over_f', random=sim.random) + sim.add_noise(noise_type='one_over_f') for i in range(5): print(f"{sim.observations[0].tod[0][i]:.5e}") diff --git a/litebird_sim/simulations.py b/litebird_sim/simulations.py index 5085cac1..883c50c2 100644 --- a/litebird_sim/simulations.py +++ b/litebird_sim/simulations.py @@ -1548,7 +1548,7 @@ def apply_quadratic_nonlin( @_profile def add_noise( self, - random: np.random.Generator, + random: Union[np.random.Generator, None] = None, noise_type: str = "one_over_f", component: str = "tod", append_to_report: bool = True, @@ -1558,11 +1558,14 @@ def add_noise( This method must be called after having set the instrument, the list of detectors to simulate through calls to :meth:`.set_instrument` and :meth:`.add_detector`. - The parameter `random` must be specified and must be a random number - generator thatimplements the ``normal`` method. You should typically - use the `random` field of a :class:`.Simulation` object for this. + The parameter `random` can be specified as a random number + generator that implements the ``normal`` method. As default it uses + the `random` field of a :class:`.Simulation` object for this. """ + if random is None: + random = self.random + add_noise_to_observations( observations=self.observations, noise_type=noise_type, From bbc4f7d66bbe80347f4adc6af6a01ab9e185057a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 12:53:49 +0100 Subject: [PATCH 4/4] Bump tornado from 6.4.1 to 6.4.2 (#350) Bumps [tornado](https://github.com/tornadoweb/tornado) from 6.4.1 to 6.4.2. - [Changelog](https://github.com/tornadoweb/tornado/blob/v6.4.2/docs/releases.rst) - [Commits](https://github.com/tornadoweb/tornado/compare/v6.4.1...v6.4.2) --- updated-dependencies: - dependency-name: tornado dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/poetry.lock b/poetry.lock index ed23a15c..6652a029 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "accessible-pygments" @@ -3902,22 +3902,22 @@ files = [ [[package]] name = "tornado" -version = "6.4.1" +version = "6.4.2" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -optional = true +optional = false python-versions = ">=3.8" files = [ - {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, - {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, - {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"}, - {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"}, - {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"}, - {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"}, - {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"}, - {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"}, - {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"}, - {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"}, - {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, + {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1"}, + {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c"}, + {file = "tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482"}, + {file = "tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38"}, + {file = "tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b"}, ] [[package]]