mergeron 2025.739439.10__py3-none-any.whl → 2025.739439.12__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mergeron might be problematic. Click here for more details.

mergeron/gen/upp_tests.py CHANGED
@@ -17,7 +17,7 @@ from .. import ( # noqa
17
17
  UPPAggrSelector,
18
18
  )
19
19
  from ..core import guidelines_boundaries as gbl # noqa: TID252
20
- from . import INVResolution, MarketSampleData, UPPTestRegime, UPPTestsCounts
20
+ from . import INVResolution, MarketsData, UPPTestRegime, UPPTestsCounts
21
21
  from . import enforcement_stats as esl
22
22
 
23
23
  __version__ = VERSION
@@ -32,7 +32,7 @@ class INVRESCntsArgs(TypedDict, total=False):
32
32
 
33
33
 
34
34
  def compute_upp_test_counts(
35
- _market_data_sample: MarketSampleData,
35
+ _market_data_sample: MarketsData,
36
36
  _upp_test_parms: gbl.HMGThresholds,
37
37
  _upp_test_regime: UPPTestRegime,
38
38
  /,
@@ -70,7 +70,7 @@ def compute_upp_test_counts(
70
70
 
71
71
  np.einsum(
72
72
  "ij,ij,ij->ij",
73
- _market_data_sample.divr_array,
73
+ _market_data_sample.divratio_array,
74
74
  _market_data_sample.pcm_array[:, ::-1],
75
75
  _market_data_sample.price_array[:, ::-1] / _market_data_sample.price_array,
76
76
  out=guppi_array,
@@ -78,16 +78,16 @@ def compute_upp_test_counts(
78
78
 
79
79
  np.divide(
80
80
  np.einsum(
81
- "ij,ij->ij", _market_data_sample.pcm_array, _market_data_sample.divr_array
81
+ "ij,ij->ij", _market_data_sample.pcm_array, _market_data_sample.divratio_array
82
82
  ),
83
- 1 - _market_data_sample.divr_array,
83
+ 1 - _market_data_sample.divratio_array,
84
84
  out=ipr_array,
85
85
  )
86
86
 
87
87
  np.divide(ipr_array, 1 - _market_data_sample.pcm_array, out=cmcr_array)
88
88
 
89
89
  (divr_test_vector,) = _compute_test_array_seq(
90
- (_market_data_sample.divr_array,),
90
+ (_market_data_sample.divratio_array,),
91
91
  _market_data_sample.frmshr_array,
92
92
  _upp_test_regime.divr_aggregator,
93
93
  )
@@ -155,78 +155,42 @@ def compute_upp_test_counts(
155
155
 
156
156
  def _compute_test_array_seq(
157
157
  _test_measure_seq: tuple[ArrayDouble, ...],
158
- _wt_array: ArrayDouble,
158
+ _weights: ArrayDouble,
159
159
  _aggregator: UPPAggrSelector,
160
160
  ) -> tuple[ArrayDouble, ...]:
161
- _wt_array = (
162
- _wt_array / np.einsum("ij->i", _wt_array)[:, None]
163
- if _aggregator
164
- in {
165
- UPPAggrSelector.CPA,
166
- UPPAggrSelector.CPD,
167
- UPPAggrSelector.OSA,
168
- UPPAggrSelector.OSD,
169
- }
170
- else np.array([0.5, 0.5], float)
171
- )
172
-
173
- match _aggregator:
174
- case UPPAggrSelector.AVG:
175
- test_array_seq = (
176
- 1 / 2 * np.einsum("ij->i", _g)[:, None] for _g in _test_measure_seq
177
- )
178
- case UPPAggrSelector.CPA:
179
- test_array_seq = (
180
- np.einsum("ij,ij->i", _wt_array[:, ::-1], _g)[:, None]
181
- for _g in _test_measure_seq
182
- )
183
- case UPPAggrSelector.CPD:
184
- test_array_seq = (
185
- np.sqrt(np.einsum("ij,ij,ij->i", _wt_array[:, ::-1], _g, _g))[:, None]
186
- for _g in _test_measure_seq
187
- )
188
- case UPPAggrSelector.CPG:
189
- test_array_seq = (
190
- np.expm1(
191
- np.einsum("ij,ij->i", _wt_array[:, ::-1], np.log1p(_g))[:, None]
192
- )
193
- for _g in _test_measure_seq
194
- )
195
- case UPPAggrSelector.DIS:
196
- test_array_seq = (
197
- np.sqrt(1 / 2 * np.einsum("ij,ij->i", _g, _g))[:, None]
198
- for _g in _test_measure_seq
199
- )
200
- case UPPAggrSelector.GMN:
201
- test_array_seq = (
202
- np.expm1(np.einsum("ij->i", np.log1p(_g))[:, None] / _g.shape[1])
203
- for _g in _test_measure_seq
204
- )
205
- case UPPAggrSelector.MAX:
206
- test_array_seq = (_g.max(axis=1, keepdims=True) for _g in _test_measure_seq)
207
- case UPPAggrSelector.MIN:
208
- test_array_seq = (_g.min(axis=1, keepdims=True) for _g in _test_measure_seq)
209
- case UPPAggrSelector.OSA:
210
- test_array_seq = (
211
- np.einsum("ij,ij->i", _wt_array, _g)[:, None]
212
- for _g in _test_measure_seq
213
- )
214
- case UPPAggrSelector.OSD:
215
- test_array_seq = (
216
- np.sqrt(np.einsum("ij,ij,ij->i", _wt_array, _g, _g)[:, None])
217
- for _g in _test_measure_seq
218
- )
219
- case UPPAggrSelector.OSG:
220
- test_array_seq = (
221
- np.expm1(np.einsum("ij,ij->i", _wt_array, np.log1p(_g))[:, None])
222
- for _g in _test_measure_seq
223
- )
224
- case _:
225
- raise ValueError("GUPPI/diversion ratio aggregation method is invalid.")
161
+ if _aggregator in {UPPAggrSelector.CPA, UPPAggrSelector.CPD}:
162
+ _weights = _weights[:, ::-1] / np.einsum("ij->i", _weights)[:, None]
163
+ elif _aggregator in {UPPAggrSelector.OSA, UPPAggrSelector.OSD}:
164
+ _weights = _weights / np.einsum("ij->i", _weights)[:, None]
165
+ else:
166
+ _weights = np.array([0.5, 0.5], float)
167
+
168
+ # Use weights calculated above to compute average, distance, and geometric mean:
169
+ if _aggregator in {UPPAggrSelector.AVG, UPPAggrSelector.CPA, UPPAggrSelector.OSA}:
170
+ test_array_seq = (
171
+ np.einsum("ij,ij->i", _weights, _g)[:, None] for _g in _test_measure_seq
172
+ )
173
+ elif _aggregator in {UPPAggrSelector.DIS, UPPAggrSelector.CPD, UPPAggrSelector.OSD}:
174
+ test_array_seq = (
175
+ np.sqrt(np.einsum("ij,ij,ij->i", _weights, _g, _g))[:, None]
176
+ for _g in _test_measure_seq
177
+ )
178
+ elif _aggregator in {UPPAggrSelector.CPG, UPPAggrSelector.GMN, UPPAggrSelector.OSG}:
179
+ test_array_seq = (
180
+ np.expm1(np.einsum("ij,ij->i", _weights[:, ::-1], np.log1p(_g)))[:, None]
181
+ for _g in _test_measure_seq
182
+ )
183
+ elif _aggregator == UPPAggrSelector.MAX:
184
+ test_array_seq = (_g.max(axis=1, keepdims=True) for _g in _test_measure_seq)
185
+ elif _aggregator == UPPAggrSelector.MIN:
186
+ test_array_seq = (_g.min(axis=1, keepdims=True) for _g in _test_measure_seq)
187
+ else:
188
+ raise ValueError("GUPPI/diversion ratio aggregation method is invalid.")
226
189
  return tuple(test_array_seq)
227
190
 
228
191
 
229
192
  if __name__ == "__main__":
230
193
  print(
231
- "This module defines classes with methods for generating UPP test arrays and UPP test-counts arrays on given data."
194
+ "This module defines functionsfor generating UPP test arrays "
195
+ "and UPP test-counts arrays on given data."
232
196
  )
@@ -15,7 +15,7 @@ from mpmath import mp, mpf # type: ignore
15
15
  from scipy.spatial.distance import minkowski # type: ignore
16
16
  from sympy import lambdify, simplify, solve, symbols # type: ignore
17
17
 
18
- from .. import DEFAULT_REC_RATIO, VERSION # noqa: TID252
18
+ from .. import DEFAULT_REC, VERSION # noqa: TID252
19
19
  from ..core import GuidelinesBoundary, MPFloat # noqa: TID252
20
20
  from ..core import guidelines_boundary_functions as gbf # noqa: TID252
21
21
  from . import GuidelinesBoundaryCallable
@@ -98,11 +98,11 @@ def hhi_delta_boundary_qdtr(_dh_val: float = 0.01, /) -> GuidelinesBoundaryCalla
98
98
 
99
99
  def diversion_share_boundary_qdtr_wtd_avg(
100
100
  _delta_star: float = 0.075,
101
- _r_val: float = DEFAULT_REC_RATIO,
101
+ _r_val: float = DEFAULT_REC,
102
102
  /,
103
103
  *,
104
104
  weighting: Literal["own-share", "cross-product-share"] | None = "own-share",
105
- recapture_form: Literal["inside-out", "proportional"] = "inside-out",
105
+ recapture_form: Literal["inside-out", "fixed"] = "inside-out",
106
106
  ) -> GuidelinesBoundaryCallable:
107
107
  R"""
108
108
  Share combinations for the share-weighted average share-ratio boundary.
@@ -112,12 +112,12 @@ def diversion_share_boundary_qdtr_wtd_avg(
112
112
  _delta_star
113
113
  Diversion share, :math:`\overline{d} / \overline{r}` or :math:`\overline{g} / (m^* \cdot \overline{r})`.
114
114
  _r_val
115
- Recapture ratio.
115
+ Recapture rate.
116
116
  weighting
117
117
  Whether "own-share" or "cross-product-share" (or None for simple, unweighted average)
118
118
  recapture_form
119
- Whether recapture-ratio is MNL-consistent ("inside-out") or has fixed
120
- value for both merging firms ("proportional").
119
+ Whether recapture rate is share-proportional ("inside-out") or has fixed
120
+ value for both merging firms ("fixed").
121
121
 
122
122
  Returns
123
123
  -------
@@ -211,12 +211,12 @@ def diversion_share_boundary_qdtr_wtd_avg(
211
211
 
212
212
  def diversion_share_boundary_distance(
213
213
  _delta_star: float = 0.075,
214
- _r_val: float = DEFAULT_REC_RATIO,
214
+ _r_val: float = DEFAULT_REC,
215
215
  /,
216
216
  *,
217
217
  agg_method: Literal["arithmetic mean", "distance"] = "arithmetic mean",
218
218
  weighting: Literal["own-share", "cross-product-share"] | None = "own-share",
219
- recapture_form: Literal["inside-out", "proportional"] = "inside-out",
219
+ recapture_form: Literal["inside-out", "fixed"] = "inside-out",
220
220
  dps: int = 5,
221
221
  ) -> GuidelinesBoundary:
222
222
  R"""
@@ -233,14 +233,14 @@ def diversion_share_boundary_distance(
233
233
  _delta_star
234
234
  Diversion share, :math:`\overline{d} / \overline{r}` or :math:`\overline{g} / (m^* \cdot \overline{r})`.
235
235
  _r_val
236
- Recapture ratio.
236
+ Recapture rate.
237
237
  agg_method
238
238
  Whether "arithmetic mean" or "distance".
239
239
  weighting
240
240
  Whether "own-share" or "cross-product-share".
241
241
  recapture_form
242
- Whether recapture-ratio is MNL-consistent ("inside-out") or has fixed
243
- value for both merging firms ("proportional").
242
+ Whether recapture rate is share-proportional ("inside-out") or has fixed
243
+ value for both merging firms ("fixed").
244
244
  dps
245
245
  Number of decimal places for rounding returned shares and area.
246
246
 
@@ -366,10 +366,10 @@ def diversion_share_boundary_distance(
366
366
 
367
367
  def diversion_share_boundary_xact_avg_mp(
368
368
  _delta_star: float = 0.075,
369
- _r_val: float = DEFAULT_REC_RATIO,
369
+ _r_val: float = DEFAULT_REC,
370
370
  /,
371
371
  *,
372
- recapture_form: Literal["inside-out", "proportional"] = "inside-out",
372
+ recapture_form: Literal["inside-out", "fixed"] = "inside-out",
373
373
  dps: int = 5,
374
374
  ) -> GuidelinesBoundary:
375
375
  R"""
@@ -400,7 +400,7 @@ def diversion_share_boundary_xact_avg_mp(
400
400
  ylabel=s_2
401
401
  )
402
402
 
403
- # recapture_form = "proportional"
403
+ # recapture_form = "fixed"
404
404
  sag = solve((s_2/(1 - s_1)) + (s_1/(1 - s_2)) - 2 * d_hat, s_2)[0]
405
405
  symplot(
406
406
  sag,
@@ -413,10 +413,10 @@ def diversion_share_boundary_xact_avg_mp(
413
413
  _delta_star
414
414
  Diversion share, :math:`\overline{d} / \overline{r}` or :math:`\overline{g} / (m^* \cdot \overline{r})`.
415
415
  _r_val
416
- Recapture ratio.
416
+ Recapture rate.
417
417
  recapture_form
418
- Whether recapture-ratio is MNL-consistent ("inside-out") or has fixed
419
- value for both merging firms ("proportional").
418
+ Whether recapture rate is share-proportional ("inside-out") or has fixed
419
+ value for both merging firms ("fixed").
420
420
  dps
421
421
  Number of decimal places for rounding returned shares.
422
422
 
@@ -520,14 +520,14 @@ def diversion_share_boundary_xact_avg_mp(
520
520
  # this function is about half as fast as the manual one! ... and a touch less precise
521
521
  def _diversion_share_boundary_wtd_avg_autoroot(
522
522
  _delta_star: float = 0.075,
523
- _r_val: float = DEFAULT_REC_RATIO,
523
+ _r_val: float = DEFAULT_REC,
524
524
  /,
525
525
  *,
526
526
  agg_method: Literal[
527
527
  "arithmetic mean", "geometric mean", "distance"
528
528
  ] = "arithmetic mean",
529
529
  weighting: Literal["own-share", "cross-product-share", None] = "own-share",
530
- recapture_form: Literal["inside-out", "proportional"] = "inside-out",
530
+ recapture_form: Literal["inside-out", "fixed"] = "inside-out",
531
531
  dps: int = 5,
532
532
  ) -> GuidelinesBoundary:
533
533
  R"""
@@ -538,14 +538,14 @@ def _diversion_share_boundary_wtd_avg_autoroot(
538
538
  _delta_star
539
539
  Diversion share, :math:`\overline{d} / \overline{r}` or :math:`\overline{g} / (m^* \cdot \overline{r})`.
540
540
  _r_val
541
- Recapture ratio.
541
+ Recapture rate.
542
542
  agg_method
543
543
  Whether "arithmetic mean", "geometric mean", or "distance".
544
544
  weighting
545
545
  Whether "own-share" or "cross-product-share" (or None for simple, unweighted average).
546
546
  recapture_form
547
- Whether recapture-ratio is MNL-consistent ("inside-out") or has fixed
548
- value for both merging firms ("proportional").
547
+ Whether recapture rate is share-proportional ("inside-out") or has fixed
548
+ value for both merging firms ("fixed").
549
549
  dps
550
550
  Number of decimal places for rounding returned shares and area.
551
551
 
@@ -588,7 +588,7 @@ def _diversion_share_boundary_wtd_avg_autoroot(
588
588
  (s_1, 0.0, d_hat / (1 + d_hat)), ylabel=s_2
589
589
  )
590
590
 
591
- # recapture_form == "proportional"
591
+ # recapture_form == "fixed"
592
592
  oswag = solve(
593
593
  s_1 * s_2 / (1 - s_1)
594
594
  + s_2 * s_1 / (1 - s_2)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: mergeron
3
- Version: 2025.739439.10
3
+ Version: 2025.739439.12
4
4
  Summary: Python for analyzing merger enforcement policy
5
5
  License: MIT
6
6
  Keywords: merger enforcement policy,merger guidelines,merger screening,enforcement presumptions,concentration standards,diversion ratio,upward pricing pressure,GUPPI
@@ -26,7 +26,6 @@ Requires-Dist: joblib (>=1.5.1)
26
26
  Requires-Dist: lxml (>=6.0.0)
27
27
  Requires-Dist: matplotlib (>=3.10.3)
28
28
  Requires-Dist: mpmath (>=1.3.0)
29
- Requires-Dist: numexpr (>=2.11.0,<3.0.0)
30
29
  Requires-Dist: python-calamine (>=0.4.0)
31
30
  Requires-Dist: ruamel-yaml (>=0.18.14)
32
31
  Requires-Dist: scipy (>=1.16.0)
@@ -73,8 +72,7 @@ mergeron: Python for analyzing merger enforcement policy
73
72
 
74
73
 
75
74
  *Visualize* the sets of mergers falling within specified concentration and diversion-ratio thresholds. *Analyze* merger investigations data published by the U.S. Federal Trade Commission in various reports on extended merger investigations (Second Requests) during 1996 to 2011.
76
- *Generate* data under specified distributions of firm counts, market shares, price-cost margins, and prices, optionally imposing equilibrium conditions for Bertrand oligopoly with MNL demand and or restrictions implied by statutory filing thresholds. *Compute* intrinsic enforcement rates or
77
- intrinsic clearance rates using the generated data, given thresholds for
75
+ *Generate* data under specified distributions of firm counts, market shares, price-cost margins, and prices, optionally imposing equilibrium conditions for Bertrand oligopoly with MNL demand and restrictions implied by statutory filing thresholds. *Compute* intrinsic enforcement rates or intrinsic clearance rates using generated data, with bounds for
78
76
  concentration;
79
77
  diversion ratio;
80
78
  gross upward pricing pressure (GUPPI);
@@ -0,0 +1,21 @@
1
+ mergeron/__init__.py,sha256=Ou_biclMlp0dqd1uU9FHSIH_7RMfY4G4stoB5TYjU3U,6736
2
+ mergeron/core/__init__.py,sha256=zJcc50CAwm0oNKwk4p-P7oRwVfB_Fp4u0Do5dUeUXfI,3027
3
+ mergeron/core/empirical_margin_distribution.py,sha256=61U-KLB563BPWM5zWyWp82c4PhcsAG-IKI0WWYGjBKg,11740
4
+ mergeron/core/ftc_merger_investigations_data.py,sha256=oM4cs2PnyeSwyV1LOE_EYCUEzCKPm7lnCGxLIc6JQY8,28820
5
+ mergeron/core/guidelines_boundaries.py,sha256=qcb8QrpRQSgT3EfSelV5nNapXPm7H0xPZZxF8qIYxHQ,15551
6
+ mergeron/core/guidelines_boundary_functions.py,sha256=Cz1TKXdoL9S4EhuvbRkSGb1SulZFafRNmhOsHTwfhVw,30753
7
+ mergeron/core/pseudorandom_numbers.py,sha256=CFp-8eu0q2g-81LA0k2oCFltmp6Er7EkrAkoG19G7Os,10138
8
+ mergeron/data/__init__.py,sha256=SAFkR23RBM0zwGam2TeWmw08oHAKmU2YF-Nygj73ies,1845
9
+ mergeron/data/damodaran_margin_data_serialized.zip,sha256=Wc1v9buSrYTWWAravG8W9nPbgsU07zMtSAR2RvMQU5s,623482
10
+ mergeron/data/ftc_merger_investigations_data.zip,sha256=tiB2TLFyS9LMSFIv8DBA_oEEx12DU4MyjHni4NlsRMU,24002
11
+ mergeron/gen/__init__.py,sha256=sAVbyNyePlbUNPe-G4incMARqIYX4TOoDvJwERuCMKM,23874
12
+ mergeron/gen/data_generation.py,sha256=DsNiCNdYi597qF08addnYMVLuSXYQZRi7XaSvFl6CcU,17638
13
+ mergeron/gen/data_generation_functions.py,sha256=EcAakMw5qH8LZp2DImPvcnja2ug3QUBpdjEQOf2otFU,26146
14
+ mergeron/gen/enforcement_stats.py,sha256=V3ZeVv-iLFUuKPeM503cMKiVVaYeGVrA_6lInAdXA5w,14387
15
+ mergeron/gen/upp_tests.py,sha256=xd038HzO-FTqNPQCnKjtW5OKoAc4u4tRGveTGSRQgUY,6439
16
+ mergeron/perks/__init__.py,sha256=gGRIuRc7I6OuWLzwSiSZSIE0PEoxAy2DRFWg0VVLlbE,484
17
+ mergeron/perks/guidelines_boundary_functions_extra.py,sha256=zzpUn8VEd9ciRznXbd-qem4cjKsO-x-wuraI6mA3oGo,22204
18
+ mergeron/py.typed,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
19
+ mergeron-2025.739439.12.dist-info/METADATA,sha256=KTvpzolzGE5hzPVbg7tTEscU0PB43_oSyiGjf_9uTbM,4167
20
+ mergeron-2025.739439.12.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
21
+ mergeron-2025.739439.12.dist-info/RECORD,,
@@ -1,21 +0,0 @@
1
- mergeron/__init__.py,sha256=jahrWTN0aWOMRUBEyN_oKVK7d4LQeYWnK40rglYErN4,6752
2
- mergeron/core/__init__.py,sha256=zJcc50CAwm0oNKwk4p-P7oRwVfB_Fp4u0Do5dUeUXfI,3027
3
- mergeron/core/empirical_margin_distribution.py,sha256=61U-KLB563BPWM5zWyWp82c4PhcsAG-IKI0WWYGjBKg,11740
4
- mergeron/core/ftc_merger_investigations_data.py,sha256=oM4cs2PnyeSwyV1LOE_EYCUEzCKPm7lnCGxLIc6JQY8,28820
5
- mergeron/core/guidelines_boundaries.py,sha256=PvSOLB6KlXu9KX6NdpStuRluP6nrZqUzSHT6usa5600,15630
6
- mergeron/core/guidelines_boundary_functions.py,sha256=mW5jW7qgn1Z4wMY3P_l86jtJoSke_Wcnd-JKxoWmYKI,30838
7
- mergeron/core/pseudorandom_numbers.py,sha256=-mPveXjJJ446NrBMAmWIa2jI6j0Px0xcCJTGEEsn3bo,10149
8
- mergeron/data/__init__.py,sha256=SAFkR23RBM0zwGam2TeWmw08oHAKmU2YF-Nygj73ies,1845
9
- mergeron/data/damodaran_margin_data_serialized.zip,sha256=Wc1v9buSrYTWWAravG8W9nPbgsU07zMtSAR2RvMQU5s,623482
10
- mergeron/data/ftc_merger_investigations_data.zip,sha256=tiB2TLFyS9LMSFIv8DBA_oEEx12DU4MyjHni4NlsRMU,24002
11
- mergeron/gen/__init__.py,sha256=apcCVC29yVjIM1yLM-wVpwrIwfi3BvJp_fPThe0Bgoc,23864
12
- mergeron/gen/data_generation.py,sha256=pdQl_uBENCjVt2aPtAcus2md4Qx-j5rOWGJJAzdnlO0,17617
13
- mergeron/gen/data_generation_functions.py,sha256=hXUq5D2CIUkM4_NdGXiOb4XATYwIUeUcCGadzQGDqLw,26126
14
- mergeron/gen/enforcement_stats.py,sha256=etTax-sBSn8DveF-IxuBJDdX0XSBD6oFU9vaZe6cYks,14387
15
- mergeron/gen/upp_tests.py,sha256=gRJISQ2jGmIDmFOvaTIkvYooI4mK-QbgkfgL46RrRio,7445
16
- mergeron/perks/__init__.py,sha256=gGRIuRc7I6OuWLzwSiSZSIE0PEoxAy2DRFWg0VVLlbE,484
17
- mergeron/perks/guidelines_boundary_functions_extra.py,sha256=lbqjmeLjrqXBm7dEmhiMcqzlv89cDlmyrG3TDzUFSEY,22296
18
- mergeron/py.typed,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
19
- mergeron-2025.739439.10.dist-info/METADATA,sha256=0n-5o-IYKF3E8dgB7h-hZwvlpq0iK-WY9Oh2YoTRTQI,4220
20
- mergeron-2025.739439.10.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
21
- mergeron-2025.739439.10.dist-info/RECORD,,