wracell commited on
Commit
184519a
·
1 Parent(s): 1b4d1fd

first commit

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .venv/Lib/site-packages/pip-24.3.1.dist-info/AUTHORS.txt +799 -0
  2. .venv/Lib/site-packages/pip-24.3.1.dist-info/INSTALLER +1 -0
  3. .venv/Lib/site-packages/pip-24.3.1.dist-info/LICENSE.txt +20 -0
  4. .venv/Lib/site-packages/pip-24.3.1.dist-info/METADATA +90 -0
  5. .venv/Lib/site-packages/pip-24.3.1.dist-info/RECORD +853 -0
  6. .venv/Lib/site-packages/pip-24.3.1.dist-info/REQUESTED +0 -0
  7. .venv/Lib/site-packages/pip-24.3.1.dist-info/WHEEL +5 -0
  8. .venv/Lib/site-packages/pip-24.3.1.dist-info/entry_points.txt +3 -0
  9. .venv/Lib/site-packages/pip-24.3.1.dist-info/top_level.txt +1 -0
  10. .venv/Lib/site-packages/pip/__init__.py +13 -0
  11. .venv/Lib/site-packages/pip/__main__.py +24 -0
  12. .venv/Lib/site-packages/pip/__pip-runner__.py +50 -0
  13. .venv/Lib/site-packages/pip/__pycache__/__init__.cpython-312.pyc +0 -0
  14. .venv/Lib/site-packages/pip/__pycache__/__main__.cpython-312.pyc +0 -0
  15. .venv/Lib/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc +0 -0
  16. .venv/Lib/site-packages/pip/_internal/__init__.py +18 -0
  17. .venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc +0 -0
  18. .venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc +0 -0
  19. .venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc +0 -0
  20. .venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc +0 -0
  21. .venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc +0 -0
  22. .venv/Lib/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc +0 -0
  23. .venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc +0 -0
  24. .venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc +0 -0
  25. .venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc +0 -0
  26. .venv/Lib/site-packages/pip/_internal/build_env.py +319 -0
  27. .venv/Lib/site-packages/pip/_internal/cache.py +290 -0
  28. .venv/Lib/site-packages/pip/_internal/cli/__init__.py +4 -0
  29. .venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc +0 -0
  30. .venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc +0 -0
  31. .venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc +0 -0
  32. .venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc +0 -0
  33. .venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc +0 -0
  34. .venv/Lib/site-packages/pip/_internal/cli/__pycache__/index_command.cpython-312.pyc +0 -0
  35. .venv/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc +0 -0
  36. .venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc +0 -0
  37. .venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc +0 -0
  38. .venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc +0 -0
  39. .venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc +0 -0
  40. .venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc +0 -0
  41. .venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc +0 -0
  42. .venv/Lib/site-packages/pip/_internal/cli/autocompletion.py +176 -0
  43. .venv/Lib/site-packages/pip/_internal/cli/base_command.py +231 -0
  44. .venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py +1075 -0
  45. .venv/Lib/site-packages/pip/_internal/cli/command_context.py +27 -0
  46. .venv/Lib/site-packages/pip/_internal/cli/index_command.py +170 -0
  47. .venv/Lib/site-packages/pip/_internal/cli/main.py +80 -0
  48. .venv/Lib/site-packages/pip/_internal/cli/main_parser.py +134 -0
  49. .venv/Lib/site-packages/pip/_internal/cli/parser.py +294 -0
  50. .venv/Lib/site-packages/pip/_internal/cli/progress_bars.py +94 -0
.venv/Lib/site-packages/pip-24.3.1.dist-info/AUTHORS.txt ADDED
@@ -0,0 +1,799 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @Switch01
2
+ A_Rog
3
+ Aakanksha Agrawal
4
+ Abhinav Sagar
5
+ ABHYUDAY PRATAP SINGH
6
+ abs51295
7
+ AceGentile
8
+ Adam Chainz
9
+ Adam Tse
10
+ Adam Wentz
11
+ admin
12
+ Adolfo Ochagavía
13
+ Adrien Morison
14
+ Agus
15
+ ahayrapetyan
16
+ Ahilya
17
+ AinsworthK
18
+ Akash Srivastava
19
+ Alan Yee
20
+ Albert Tugushev
21
+ Albert-Guan
22
+ albertg
23
+ Alberto Sottile
24
+ Aleks Bunin
25
+ Ales Erjavec
26
+ Alethea Flowers
27
+ Alex Gaynor
28
+ Alex Grönholm
29
+ Alex Hedges
30
+ Alex Loosley
31
+ Alex Morega
32
+ Alex Stachowiak
33
+ Alexander Shtyrov
34
+ Alexandre Conrad
35
+ Alexey Popravka
36
+ Aleš Erjavec
37
+ Alli
38
+ Ami Fischman
39
+ Ananya Maiti
40
+ Anatoly Techtonik
41
+ Anders Kaseorg
42
+ Andre Aguiar
43
+ Andreas Lutro
44
+ Andrei Geacar
45
+ Andrew Gaul
46
+ Andrew Shymanel
47
+ Andrey Bienkowski
48
+ Andrey Bulgakov
49
+ Andrés Delfino
50
+ Andy Freeland
51
+ Andy Kluger
52
+ Ani Hayrapetyan
53
+ Aniruddha Basak
54
+ Anish Tambe
55
+ Anrs Hu
56
+ Anthony Sottile
57
+ Antoine Musso
58
+ Anton Ovchinnikov
59
+ Anton Patrushev
60
+ Anton Zelenov
61
+ Antonio Alvarado Hernandez
62
+ Antony Lee
63
+ Antti Kaihola
64
+ Anubhav Patel
65
+ Anudit Nagar
66
+ Anuj Godase
67
+ AQNOUCH Mohammed
68
+ AraHaan
69
+ arena
70
+ arenasys
71
+ Arindam Choudhury
72
+ Armin Ronacher
73
+ Arnon Yaari
74
+ Artem
75
+ Arun Babu Neelicattu
76
+ Ashley Manton
77
+ Ashwin Ramaswami
78
+ atse
79
+ Atsushi Odagiri
80
+ Avinash Karhana
81
+ Avner Cohen
82
+ Awit (Ah-Wit) Ghirmai
83
+ Baptiste Mispelon
84
+ Barney Gale
85
+ barneygale
86
+ Bartek Ogryczak
87
+ Bastian Venthur
88
+ Ben Bodenmiller
89
+ Ben Darnell
90
+ Ben Hoyt
91
+ Ben Mares
92
+ Ben Rosser
93
+ Bence Nagy
94
+ Benjamin Peterson
95
+ Benjamin VanEvery
96
+ Benoit Pierre
97
+ Berker Peksag
98
+ Bernard
99
+ Bernard Tyers
100
+ Bernardo B. Marques
101
+ Bernhard M. Wiedemann
102
+ Bertil Hatt
103
+ Bhavam Vidyarthi
104
+ Blazej Michalik
105
+ Bogdan Opanchuk
106
+ BorisZZZ
107
+ Brad Erickson
108
+ Bradley Ayers
109
+ Branch Vincent
110
+ Brandon L. Reiss
111
+ Brandt Bucher
112
+ Brannon Dorsey
113
+ Brett Randall
114
+ Brett Rosen
115
+ Brian Cristante
116
+ Brian Rosner
117
+ briantracy
118
+ BrownTruck
119
+ Bruno Oliveira
120
+ Bruno Renié
121
+ Bruno S
122
+ Bstrdsmkr
123
+ Buck Golemon
124
+ burrows
125
+ Bussonnier Matthias
126
+ bwoodsend
127
+ c22
128
+ Caleb Martinez
129
+ Calvin Smith
130
+ Carl Meyer
131
+ Carlos Liam
132
+ Carol Willing
133
+ Carter Thayer
134
+ Cass
135
+ Chandrasekhar Atina
136
+ Charlie Marsh
137
+ Chih-Hsuan Yen
138
+ Chris Brinker
139
+ Chris Hunt
140
+ Chris Jerdonek
141
+ Chris Kuehl
142
+ Chris Markiewicz
143
+ Chris McDonough
144
+ Chris Pawley
145
+ Chris Pryer
146
+ Chris Wolfe
147
+ Christian Clauss
148
+ Christian Heimes
149
+ Christian Oudard
150
+ Christoph Reiter
151
+ Christopher Hunt
152
+ Christopher Snyder
153
+ chrysle
154
+ cjc7373
155
+ Clark Boylan
156
+ Claudio Jolowicz
157
+ Clay McClure
158
+ Cody
159
+ Cody Soyland
160
+ Colin Watson
161
+ Collin Anderson
162
+ Connor Osborn
163
+ Cooper Lees
164
+ Cooper Ry Lees
165
+ Cory Benfield
166
+ Cory Wright
167
+ Craig Kerstiens
168
+ Cristian Sorinel
169
+ Cristina
170
+ Cristina Muñoz
171
+ ctg123
172
+ Curtis Doty
173
+ cytolentino
174
+ Daan De Meyer
175
+ Dale
176
+ Damian
177
+ Damian Quiroga
178
+ Damian Shaw
179
+ Dan Black
180
+ Dan Savilonis
181
+ Dan Sully
182
+ Dane Hillard
183
+ daniel
184
+ Daniel Collins
185
+ Daniel Hahler
186
+ Daniel Holth
187
+ Daniel Jost
188
+ Daniel Katz
189
+ Daniel Shaulov
190
+ Daniele Esposti
191
+ Daniele Nicolodi
192
+ Daniele Procida
193
+ Daniil Konovalenko
194
+ Danny Hermes
195
+ Danny McClanahan
196
+ Darren Kavanagh
197
+ Dav Clark
198
+ Dave Abrahams
199
+ Dave Jones
200
+ David Aguilar
201
+ David Black
202
+ David Bordeynik
203
+ David Caro
204
+ David D Lowe
205
+ David Evans
206
+ David Hewitt
207
+ David Linke
208
+ David Poggi
209
+ David Poznik
210
+ David Pursehouse
211
+ David Runge
212
+ David Tucker
213
+ David Wales
214
+ Davidovich
215
+ ddelange
216
+ Deepak Sharma
217
+ Deepyaman Datta
218
+ Denise Yu
219
+ dependabot[bot]
220
+ derwolfe
221
+ Desetude
222
+ Devesh Kumar Singh
223
+ devsagul
224
+ Diego Caraballo
225
+ Diego Ramirez
226
+ DiegoCaraballo
227
+ Dimitri Merejkowsky
228
+ Dimitri Papadopoulos
229
+ Dimitri Papadopoulos Orfanos
230
+ Dirk Stolle
231
+ Dmitry Gladkov
232
+ Dmitry Volodin
233
+ Domen Kožar
234
+ Dominic Davis-Foster
235
+ Donald Stufft
236
+ Dongweiming
237
+ doron zarhi
238
+ Dos Moonen
239
+ Douglas Thor
240
+ DrFeathers
241
+ Dustin Ingram
242
+ Dustin Rodrigues
243
+ Dwayne Bailey
244
+ Ed Morley
245
+ Edgar Ramírez
246
+ Edgar Ramírez Mondragón
247
+ Ee Durbin
248
+ Efflam Lemaillet
249
+ efflamlemaillet
250
+ Eitan Adler
251
+ ekristina
252
+ elainechan
253
+ Eli Schwartz
254
+ Elisha Hollander
255
+ Ellen Marie Dash
256
+ Emil Burzo
257
+ Emil Styrke
258
+ Emmanuel Arias
259
+ Endoh Takanao
260
+ enoch
261
+ Erdinc Mutlu
262
+ Eric Cousineau
263
+ Eric Gillingham
264
+ Eric Hanchrow
265
+ Eric Hopper
266
+ Erik M. Bray
267
+ Erik Rose
268
+ Erwin Janssen
269
+ Eugene Vereshchagin
270
+ everdimension
271
+ Federico
272
+ Felipe Peter
273
+ Felix Yan
274
+ fiber-space
275
+ Filip Kokosiński
276
+ Filipe Laíns
277
+ Finn Womack
278
+ finnagin
279
+ Flavio Amurrio
280
+ Florian Briand
281
+ Florian Rathgeber
282
+ Francesco
283
+ Francesco Montesano
284
+ Fredrik Orderud
285
+ Frost Ming
286
+ Gabriel Curio
287
+ Gabriel de Perthuis
288
+ Garry Polley
289
+ gavin
290
+ gdanielson
291
+ Geoffrey Sneddon
292
+ George Song
293
+ Georgi Valkov
294
+ Georgy Pchelkin
295
+ ghost
296
+ Giftlin Rajaiah
297
+ gizmoguy1
298
+ gkdoc
299
+ Godefroid Chapelle
300
+ Gopinath M
301
+ GOTO Hayato
302
+ gousaiyang
303
+ gpiks
304
+ Greg Roodt
305
+ Greg Ward
306
+ Guilherme Espada
307
+ Guillaume Seguin
308
+ gutsytechster
309
+ Guy Rozendorn
310
+ Guy Tuval
311
+ gzpan123
312
+ Hanjun Kim
313
+ Hari Charan
314
+ Harsh Vardhan
315
+ harupy
316
+ Harutaka Kawamura
317
+ hauntsaninja
318
+ Henrich Hartzer
319
+ Henry Schreiner
320
+ Herbert Pfennig
321
+ Holly Stotelmyer
322
+ Honnix
323
+ Hsiaoming Yang
324
+ Hugo Lopes Tavares
325
+ Hugo van Kemenade
326
+ Hugues Bruant
327
+ Hynek Schlawack
328
+ Ian Bicking
329
+ Ian Cordasco
330
+ Ian Lee
331
+ Ian Stapleton Cordasco
332
+ Ian Wienand
333
+ Igor Kuzmitshov
334
+ Igor Sobreira
335
+ Ikko Ashimine
336
+ Ilan Schnell
337
+ Illia Volochii
338
+ Ilya Baryshev
339
+ Inada Naoki
340
+ Ionel Cristian Mărieș
341
+ Ionel Maries Cristian
342
+ Itamar Turner-Trauring
343
+ Ivan Pozdeev
344
+ J. Nick Koston
345
+ Jacob Kim
346
+ Jacob Walls
347
+ Jaime Sanz
348
+ jakirkham
349
+ Jakub Kuczys
350
+ Jakub Stasiak
351
+ Jakub Vysoky
352
+ Jakub Wilk
353
+ James Cleveland
354
+ James Curtin
355
+ James Firth
356
+ James Gerity
357
+ James Polley
358
+ Jan Pokorný
359
+ Jannis Leidel
360
+ Jarek Potiuk
361
+ jarondl
362
+ Jason Curtis
363
+ Jason R. Coombs
364
+ JasonMo
365
+ JasonMo1
366
+ Jay Graves
367
+ Jean Abou Samra
368
+ Jean-Christophe Fillion-Robin
369
+ Jeff Barber
370
+ Jeff Dairiki
371
+ Jeff Widman
372
+ Jelmer Vernooij
373
+ jenix21
374
+ Jeremy Fleischman
375
+ Jeremy Stanley
376
+ Jeremy Zafran
377
+ Jesse Rittner
378
+ Jiashuo Li
379
+ Jim Fisher
380
+ Jim Garrison
381
+ Jinzhe Zeng
382
+ Jiun Bae
383
+ Jivan Amara
384
+ Joe Bylund
385
+ Joe Michelini
386
+ John Paton
387
+ John Sirois
388
+ John T. Wodder II
389
+ John-Scott Atlakson
390
+ johnthagen
391
+ Jon Banafato
392
+ Jon Dufresne
393
+ Jon Parise
394
+ Jonas Nockert
395
+ Jonathan Herbert
396
+ Joonatan Partanen
397
+ Joost Molenaar
398
+ Jorge Niedbalski
399
+ Joseph Bylund
400
+ Joseph Long
401
+ Josh Bronson
402
+ Josh Cannon
403
+ Josh Hansen
404
+ Josh Schneier
405
+ Joshua
406
+ Juan Luis Cano Rodríguez
407
+ Juanjo Bazán
408
+ Judah Rand
409
+ Julian Berman
410
+ Julian Gethmann
411
+ Julien Demoor
412
+ Jussi Kukkonen
413
+ jwg4
414
+ Jyrki Pulliainen
415
+ Kai Chen
416
+ Kai Mueller
417
+ Kamal Bin Mustafa
418
+ kasium
419
+ kaustav haldar
420
+ keanemind
421
+ Keith Maxwell
422
+ Kelsey Hightower
423
+ Kenneth Belitzky
424
+ Kenneth Reitz
425
+ Kevin Burke
426
+ Kevin Carter
427
+ Kevin Frommelt
428
+ Kevin R Patterson
429
+ Kexuan Sun
430
+ Kit Randel
431
+ Klaas van Schelven
432
+ KOLANICH
433
+ konstin
434
+ kpinc
435
+ Krishna Oza
436
+ Kumar McMillan
437
+ Kuntal Majumder
438
+ Kurt McKee
439
+ Kyle Persohn
440
+ lakshmanaram
441
+ Laszlo Kiss-Kollar
442
+ Laurent Bristiel
443
+ Laurent LAPORTE
444
+ Laurie O
445
+ Laurie Opperman
446
+ layday
447
+ Leon Sasson
448
+ Lev Givon
449
+ Lincoln de Sousa
450
+ Lipis
451
+ lorddavidiii
452
+ Loren Carvalho
453
+ Lucas Cimon
454
+ Ludovic Gasc
455
+ Luis Medel
456
+ Lukas Geiger
457
+ Lukas Juhrich
458
+ Luke Macken
459
+ Luo Jiebin
460
+ luojiebin
461
+ luz.paz
462
+ László Kiss Kollár
463
+ M00nL1ght
464
+ Marc Abramowitz
465
+ Marc Tamlyn
466
+ Marcus Smith
467
+ Mariatta
468
+ Mark Kohler
469
+ Mark McLoughlin
470
+ Mark Williams
471
+ Markus Hametner
472
+ Martey Dodoo
473
+ Martin Fischer
474
+ Martin Häcker
475
+ Martin Pavlasek
476
+ Masaki
477
+ Masklinn
478
+ Matej Stuchlik
479
+ Mathew Jennings
480
+ Mathieu Bridon
481
+ Mathieu Kniewallner
482
+ Matt Bacchi
483
+ Matt Good
484
+ Matt Maker
485
+ Matt Robenolt
486
+ Matt Wozniski
487
+ matthew
488
+ Matthew Einhorn
489
+ Matthew Feickert
490
+ Matthew Gilliard
491
+ Matthew Hughes
492
+ Matthew Iversen
493
+ Matthew Treinish
494
+ Matthew Trumbell
495
+ Matthew Willson
496
+ Matthias Bussonnier
497
+ mattip
498
+ Maurits van Rees
499
+ Max W Chase
500
+ Maxim Kurnikov
501
+ Maxime Rouyrre
502
+ mayeut
503
+ mbaluna
504
+ mdebi
505
+ memoselyk
506
+ meowmeowcat
507
+ Michael
508
+ Michael Aquilina
509
+ Michael E. Karpeles
510
+ Michael Klich
511
+ Michael Mintz
512
+ Michael Williamson
513
+ michaelpacer
514
+ Michał Górny
515
+ Mickaël Schoentgen
516
+ Miguel Araujo Perez
517
+ Mihir Singh
518
+ Mike
519
+ Mike Hendricks
520
+ Min RK
521
+ MinRK
522
+ Miro Hrončok
523
+ Monica Baluna
524
+ montefra
525
+ Monty Taylor
526
+ morotti
527
+ mrKazzila
528
+ Muha Ajjan
529
+ Nadav Wexler
530
+ Nahuel Ambrosini
531
+ Nate Coraor
532
+ Nate Prewitt
533
+ Nathan Houghton
534
+ Nathaniel J. Smith
535
+ Nehal J Wani
536
+ Neil Botelho
537
+ Nguyễn Gia Phong
538
+ Nicholas Serra
539
+ Nick Coghlan
540
+ Nick Stenning
541
+ Nick Timkovich
542
+ Nicolas Bock
543
+ Nicole Harris
544
+ Nikhil Benesch
545
+ Nikhil Ladha
546
+ Nikita Chepanov
547
+ Nikolay Korolev
548
+ Nipunn Koorapati
549
+ Nitesh Sharma
550
+ Niyas Sait
551
+ Noah
552
+ Noah Gorny
553
+ Nowell Strite
554
+ NtaleGrey
555
+ nvdv
556
+ OBITORASU
557
+ Ofek Lev
558
+ ofrinevo
559
+ Oliver Freund
560
+ Oliver Jeeves
561
+ Oliver Mannion
562
+ Oliver Tonnhofer
563
+ Olivier Girardot
564
+ Olivier Grisel
565
+ Ollie Rutherfurd
566
+ OMOTO Kenji
567
+ Omry Yadan
568
+ onlinejudge95
569
+ Oren Held
570
+ Oscar Benjamin
571
+ Oz N Tiram
572
+ Pachwenko
573
+ Patrick Dubroy
574
+ Patrick Jenkins
575
+ Patrick Lawson
576
+ patricktokeeffe
577
+ Patrik Kopkan
578
+ Paul Ganssle
579
+ Paul Kehrer
580
+ Paul Moore
581
+ Paul Nasrat
582
+ Paul Oswald
583
+ Paul van der Linden
584
+ Paulus Schoutsen
585
+ Pavel Safronov
586
+ Pavithra Eswaramoorthy
587
+ Pawel Jasinski
588
+ Paweł Szramowski
589
+ Pekka Klärck
590
+ Peter Gessler
591
+ Peter Lisák
592
+ Peter Shen
593
+ Peter Waller
594
+ Petr Viktorin
595
+ petr-tik
596
+ Phaneendra Chiruvella
597
+ Phil Elson
598
+ Phil Freo
599
+ Phil Pennock
600
+ Phil Whelan
601
+ Philip Jägenstedt
602
+ Philip Molloy
603
+ Philippe Ombredanne
604
+ Pi Delport
605
+ Pierre-Yves Rofes
606
+ Pieter Degroote
607
+ pip
608
+ Prabakaran Kumaresshan
609
+ Prabhjyotsing Surjit Singh Sodhi
610
+ Prabhu Marappan
611
+ Pradyun Gedam
612
+ Prashant Sharma
613
+ Pratik Mallya
614
+ pre-commit-ci[bot]
615
+ Preet Thakkar
616
+ Preston Holmes
617
+ Przemek Wrzos
618
+ Pulkit Goyal
619
+ q0w
620
+ Qiangning Hong
621
+ Qiming Xu
622
+ Quentin Lee
623
+ Quentin Pradet
624
+ R. David Murray
625
+ Rafael Caricio
626
+ Ralf Schmitt
627
+ Ran Benita
628
+ Razzi Abuissa
629
+ rdb
630
+ Reece Dunham
631
+ Remi Rampin
632
+ Rene Dudfield
633
+ Riccardo Magliocchetti
634
+ Riccardo Schirone
635
+ Richard Jones
636
+ Richard Si
637
+ Ricky Ng-Adam
638
+ Rishi
639
+ rmorotti
640
+ RobberPhex
641
+ Robert Collins
642
+ Robert McGibbon
643
+ Robert Pollak
644
+ Robert T. McGibbon
645
+ robin elisha robinson
646
+ Roey Berman
647
+ Rohan Jain
648
+ Roman Bogorodskiy
649
+ Roman Donchenko
650
+ Romuald Brunet
651
+ ronaudinho
652
+ Ronny Pfannschmidt
653
+ Rory McCann
654
+ Ross Brattain
655
+ Roy Wellington Ⅳ
656
+ Ruairidh MacLeod
657
+ Russell Keith-Magee
658
+ Ryan Shepherd
659
+ Ryan Wooden
660
+ ryneeverett
661
+ S. Guliaev
662
+ Sachi King
663
+ Salvatore Rinchiera
664
+ sandeepkiran-js
665
+ Sander Van Balen
666
+ Savio Jomton
667
+ schlamar
668
+ Scott Kitterman
669
+ Sean
670
+ seanj
671
+ Sebastian Jordan
672
+ Sebastian Schaetz
673
+ Segev Finer
674
+ SeongSoo Cho
675
+ Sergey Vasilyev
676
+ Seth Michael Larson
677
+ Seth Woodworth
678
+ Shahar Epstein
679
+ Shantanu
680
+ shenxianpeng
681
+ shireenrao
682
+ Shivansh-007
683
+ Shixian Sheng
684
+ Shlomi Fish
685
+ Shovan Maity
686
+ Simeon Visser
687
+ Simon Cross
688
+ Simon Pichugin
689
+ sinoroc
690
+ sinscary
691
+ snook92
692
+ socketubs
693
+ Sorin Sbarnea
694
+ Srinivas Nyayapati
695
+ Srishti Hegde
696
+ Stavros Korokithakis
697
+ Stefan Scherfke
698
+ Stefano Rivera
699
+ Stephan Erb
700
+ Stephen Rosen
701
+ stepshal
702
+ Steve (Gadget) Barnes
703
+ Steve Barnes
704
+ Steve Dower
705
+ Steve Kowalik
706
+ Steven Myint
707
+ Steven Silvester
708
+ stonebig
709
+ studioj
710
+ Stéphane Bidoul
711
+ Stéphane Bidoul (ACSONE)
712
+ Stéphane Klein
713
+ Sumana Harihareswara
714
+ Surbhi Sharma
715
+ Sviatoslav Sydorenko
716
+ Sviatoslav Sydorenko (Святослав Сидоренко)
717
+ Swat009
718
+ Sylvain
719
+ Takayuki SHIMIZUKAWA
720
+ Taneli Hukkinen
721
+ tbeswick
722
+ Thiago
723
+ Thijs Triemstra
724
+ Thomas Fenzl
725
+ Thomas Grainger
726
+ Thomas Guettler
727
+ Thomas Johansson
728
+ Thomas Kluyver
729
+ Thomas Smith
730
+ Thomas VINCENT
731
+ Tim D. Smith
732
+ Tim Gates
733
+ Tim Harder
734
+ Tim Heap
735
+ tim smith
736
+ tinruufu
737
+ Tobias Hermann
738
+ Tom Forbes
739
+ Tom Freudenheim
740
+ Tom V
741
+ Tomas Hrnciar
742
+ Tomas Orsava
743
+ Tomer Chachamu
744
+ Tommi Enenkel | AnB
745
+ Tomáš Hrnčiar
746
+ Tony Beswick
747
+ Tony Narlock
748
+ Tony Zhaocheng Tan
749
+ TonyBeswick
750
+ toonarmycaptain
751
+ Toshio Kuratomi
752
+ toxinu
753
+ Travis Swicegood
754
+ Tushar Sadhwani
755
+ Tzu-ping Chung
756
+ Valentin Haenel
757
+ Victor Stinner
758
+ victorvpaulo
759
+ Vikram - Google
760
+ Viktor Szépe
761
+ Ville Skyttä
762
+ Vinay Sajip
763
+ Vincent Philippon
764
+ Vinicyus Macedo
765
+ Vipul Kumar
766
+ Vitaly Babiy
767
+ Vladimir Fokow
768
+ Vladimir Rutsky
769
+ W. Trevor King
770
+ Wil Tan
771
+ Wilfred Hughes
772
+ William Edwards
773
+ William ML Leslie
774
+ William T Olson
775
+ William Woodruff
776
+ Wilson Mo
777
+ wim glenn
778
+ Winson Luk
779
+ Wolfgang Maier
780
+ Wu Zhenyu
781
+ XAMES3
782
+ Xavier Fernandez
783
+ Xianpeng Shen
784
+ xoviat
785
+ xtreak
786
+ YAMAMOTO Takashi
787
+ Yen Chi Hsuan
788
+ Yeray Diaz Diaz
789
+ Yoval P
790
+ Yu Jian
791
+ Yuan Jing Vincent Yan
792
+ Yusuke Hayashi
793
+ Zearin
794
+ Zhiping Deng
795
+ ziebam
796
+ Zvezdan Petkovic
797
+ Łukasz Langa
798
+ Роман Донченко
799
+ Семён Марьясин
.venv/Lib/site-packages/pip-24.3.1.dist-info/INSTALLER ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
.venv/Lib/site-packages/pip-24.3.1.dist-info/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2008-present The pip developers (see AUTHORS.txt file)
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
.venv/Lib/site-packages/pip-24.3.1.dist-info/METADATA ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Metadata-Version: 2.1
2
+ Name: pip
3
+ Version: 24.3.1
4
+ Summary: The PyPA recommended tool for installing Python packages.
5
+ Author-email: The pip developers <[email protected]>
6
+ License: MIT
7
+ Project-URL: Homepage, https://pip.pypa.io/
8
+ Project-URL: Documentation, https://pip.pypa.io
9
+ Project-URL: Source, https://github.com/pypa/pip
10
+ Project-URL: Changelog, https://pip.pypa.io/en/stable/news/
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Topic :: Software Development :: Build Tools
15
+ Classifier: Programming Language :: Python
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3 :: Only
18
+ Classifier: Programming Language :: Python :: 3.8
19
+ Classifier: Programming Language :: Python :: 3.9
20
+ Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
24
+ Classifier: Programming Language :: Python :: Implementation :: CPython
25
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
26
+ Requires-Python: >=3.8
27
+ Description-Content-Type: text/x-rst
28
+ License-File: LICENSE.txt
29
+ License-File: AUTHORS.txt
30
+
31
+ pip - The Python Package Installer
32
+ ==================================
33
+
34
+ .. |pypi-version| image:: https://img.shields.io/pypi/v/pip.svg
35
+ :target: https://pypi.org/project/pip/
36
+ :alt: PyPI
37
+
38
+ .. |python-versions| image:: https://img.shields.io/pypi/pyversions/pip
39
+ :target: https://pypi.org/project/pip
40
+ :alt: PyPI - Python Version
41
+
42
+ .. |docs-badge| image:: https://readthedocs.org/projects/pip/badge/?version=latest
43
+ :target: https://pip.pypa.io/en/latest
44
+ :alt: Documentation
45
+
46
+ |pypi-version| |python-versions| |docs-badge|
47
+
48
+ pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes.
49
+
50
+ Please take a look at our documentation for how to install and use pip:
51
+
52
+ * `Installation`_
53
+ * `Usage`_
54
+
55
+ We release updates regularly, with a new version every 3 months. Find more details in our documentation:
56
+
57
+ * `Release notes`_
58
+ * `Release process`_
59
+
60
+ If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms:
61
+
62
+ * `Issue tracking`_
63
+ * `Discourse channel`_
64
+ * `User IRC`_
65
+
66
+ If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms:
67
+
68
+ * `GitHub page`_
69
+ * `Development documentation`_
70
+ * `Development IRC`_
71
+
72
+ Code of Conduct
73
+ ---------------
74
+
75
+ Everyone interacting in the pip project's codebases, issue trackers, chat
76
+ rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_.
77
+
78
+ .. _package installer: https://packaging.python.org/guides/tool-recommendations/
79
+ .. _Python Package Index: https://pypi.org
80
+ .. _Installation: https://pip.pypa.io/en/stable/installation/
81
+ .. _Usage: https://pip.pypa.io/en/stable/
82
+ .. _Release notes: https://pip.pypa.io/en/stable/news.html
83
+ .. _Release process: https://pip.pypa.io/en/latest/development/release-process/
84
+ .. _GitHub page: https://github.com/pypa/pip
85
+ .. _Development documentation: https://pip.pypa.io/en/latest/development
86
+ .. _Issue tracking: https://github.com/pypa/pip/issues
87
+ .. _Discourse channel: https://discuss.python.org/c/packaging
88
+ .. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa
89
+ .. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev
90
+ .. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
.venv/Lib/site-packages/pip-24.3.1.dist-info/RECORD ADDED
@@ -0,0 +1,853 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ../../Scripts/pip.exe,sha256=-WghkgwM_5JKRi5gEpM16H34fVnFCwt48IG0f36DXVY,108420
2
+ ../../Scripts/pip3.12.exe,sha256=-WghkgwM_5JKRi5gEpM16H34fVnFCwt48IG0f36DXVY,108420
3
+ ../../Scripts/pip3.exe,sha256=-WghkgwM_5JKRi5gEpM16H34fVnFCwt48IG0f36DXVY,108420
4
+ pip-24.3.1.dist-info/AUTHORS.txt,sha256=Cbb630k8EL9FkBzX9Vpi6hpYWrLSlh08eXodL5u0eLI,10925
5
+ pip-24.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
6
+ pip-24.3.1.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093
7
+ pip-24.3.1.dist-info/METADATA,sha256=V8iCNK1GYbC82PWsLMsASDh9AO4veocRlM4Pn9q2KFI,3677
8
+ pip-24.3.1.dist-info/RECORD,,
9
+ pip-24.3.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ pip-24.3.1.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
11
+ pip-24.3.1.dist-info/entry_points.txt,sha256=eeIjuzfnfR2PrhbjnbzFU6MnSS70kZLxwaHHq6M-bD0,87
12
+ pip-24.3.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
13
+ pip/__init__.py,sha256=faXY_neeYrA_88plEhkyhwAaYeds7wu5U1iGwP24J0s,357
14
+ pip/__main__.py,sha256=WzbhHXTbSE6gBY19mNN9m4s5o_365LOvTYSgqgbdBhE,854
15
+ pip/__pip-runner__.py,sha256=cPPWuJ6NK_k-GzfvlejLFgwzmYUROmpAR6QC3Q-vkXQ,1450
16
+ pip/__pycache__/__init__.cpython-312.pyc,,
17
+ pip/__pycache__/__main__.cpython-312.pyc,,
18
+ pip/__pycache__/__pip-runner__.cpython-312.pyc,,
19
+ pip/_internal/__init__.py,sha256=MfcoOluDZ8QMCFYal04IqOJ9q6m2V7a0aOsnI-WOxUo,513
20
+ pip/_internal/__pycache__/__init__.cpython-312.pyc,,
21
+ pip/_internal/__pycache__/build_env.cpython-312.pyc,,
22
+ pip/_internal/__pycache__/cache.cpython-312.pyc,,
23
+ pip/_internal/__pycache__/configuration.cpython-312.pyc,,
24
+ pip/_internal/__pycache__/exceptions.cpython-312.pyc,,
25
+ pip/_internal/__pycache__/main.cpython-312.pyc,,
26
+ pip/_internal/__pycache__/pyproject.cpython-312.pyc,,
27
+ pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc,,
28
+ pip/_internal/__pycache__/wheel_builder.cpython-312.pyc,,
29
+ pip/_internal/build_env.py,sha256=wsTPOWyPTKvUREUcO585OU01kbQufpdigY8fVHv3WIw,10584
30
+ pip/_internal/cache.py,sha256=Jb698p5PNigRtpW5o26wQNkkUv4MnQ94mc471wL63A0,10369
31
+ pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132
32
+ pip/_internal/cli/__pycache__/__init__.cpython-312.pyc,,
33
+ pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc,,
34
+ pip/_internal/cli/__pycache__/base_command.cpython-312.pyc,,
35
+ pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc,,
36
+ pip/_internal/cli/__pycache__/command_context.cpython-312.pyc,,
37
+ pip/_internal/cli/__pycache__/index_command.cpython-312.pyc,,
38
+ pip/_internal/cli/__pycache__/main.cpython-312.pyc,,
39
+ pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc,,
40
+ pip/_internal/cli/__pycache__/parser.cpython-312.pyc,,
41
+ pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc,,
42
+ pip/_internal/cli/__pycache__/req_command.cpython-312.pyc,,
43
+ pip/_internal/cli/__pycache__/spinners.cpython-312.pyc,,
44
+ pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc,,
45
+ pip/_internal/cli/autocompletion.py,sha256=Lli3Mr6aDNu7ZkJJFFvwD2-hFxNI6Avz8OwMyS5TVrs,6865
46
+ pip/_internal/cli/base_command.py,sha256=F8nUcSM-Y-MQljJUe724-yxmc5viFXHyM_zH70NmIh4,8289
47
+ pip/_internal/cli/cmdoptions.py,sha256=mDqBr0d0hoztbRJs-PWtcKpqNAc7khU6ZpoesZKocT8,30110
48
+ pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774
49
+ pip/_internal/cli/index_command.py,sha256=-0oPTruZGkLSMrWDleZ6UtcKP3G-SImRRuhH0RfVE3o,5631
50
+ pip/_internal/cli/main.py,sha256=BDZef-bWe9g9Jpr4OVs4dDf-845HJsKw835T7AqEnAc,2817
51
+ pip/_internal/cli/main_parser.py,sha256=laDpsuBDl6kyfywp9eMMA9s84jfH2TJJn-vmL0GG90w,4338
52
+ pip/_internal/cli/parser.py,sha256=VCMtduzECUV87KaHNu-xJ-wLNL82yT3x16V4XBxOAqI,10825
53
+ pip/_internal/cli/progress_bars.py,sha256=VgydyqjZvfhqpuNcFDn00QNuA9GxRe9CKrRG8jhPuKU,2723
54
+ pip/_internal/cli/req_command.py,sha256=DqeFhmUMs6o6Ev8qawAcOoYNdAZsfyKS0MZI5jsJYwQ,12250
55
+ pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118
56
+ pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116
57
+ pip/_internal/commands/__init__.py,sha256=5oRO9O3dM2vGuh0bFw4HOVletryrz5HHMmmPWwJrH9U,3882
58
+ pip/_internal/commands/__pycache__/__init__.cpython-312.pyc,,
59
+ pip/_internal/commands/__pycache__/cache.cpython-312.pyc,,
60
+ pip/_internal/commands/__pycache__/check.cpython-312.pyc,,
61
+ pip/_internal/commands/__pycache__/completion.cpython-312.pyc,,
62
+ pip/_internal/commands/__pycache__/configuration.cpython-312.pyc,,
63
+ pip/_internal/commands/__pycache__/debug.cpython-312.pyc,,
64
+ pip/_internal/commands/__pycache__/download.cpython-312.pyc,,
65
+ pip/_internal/commands/__pycache__/freeze.cpython-312.pyc,,
66
+ pip/_internal/commands/__pycache__/hash.cpython-312.pyc,,
67
+ pip/_internal/commands/__pycache__/help.cpython-312.pyc,,
68
+ pip/_internal/commands/__pycache__/index.cpython-312.pyc,,
69
+ pip/_internal/commands/__pycache__/inspect.cpython-312.pyc,,
70
+ pip/_internal/commands/__pycache__/install.cpython-312.pyc,,
71
+ pip/_internal/commands/__pycache__/list.cpython-312.pyc,,
72
+ pip/_internal/commands/__pycache__/search.cpython-312.pyc,,
73
+ pip/_internal/commands/__pycache__/show.cpython-312.pyc,,
74
+ pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc,,
75
+ pip/_internal/commands/__pycache__/wheel.cpython-312.pyc,,
76
+ pip/_internal/commands/cache.py,sha256=xg76_ZFEBC6zoQ3gXLRfMZJft4z2a0RwH4GEFZC6nnU,7944
77
+ pip/_internal/commands/check.py,sha256=Hr_4eiMd9cgVDgEvjtIdw915NmL7ROIWW8enkr8slPQ,2268
78
+ pip/_internal/commands/completion.py,sha256=HT4lD0bgsflHq2IDgYfiEdp7IGGtE7s6MgI3xn0VQEw,4287
79
+ pip/_internal/commands/configuration.py,sha256=n98enwp6y0b5G6fiRQjaZo43FlJKYve_daMhN-4BRNc,9766
80
+ pip/_internal/commands/debug.py,sha256=DNDRgE9YsKrbYzU0s3VKi8rHtKF4X13CJ_br_8PUXO0,6797
81
+ pip/_internal/commands/download.py,sha256=0qB0nys6ZEPsog451lDsjL5Bx7Z97t-B80oFZKhpzKM,5273
82
+ pip/_internal/commands/freeze.py,sha256=2Vt72BYTSm9rzue6d8dNzt8idxWK4Db6Hd-anq7GQ80,3203
83
+ pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703
84
+ pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132
85
+ pip/_internal/commands/index.py,sha256=RAXxmJwFhVb5S1BYzb5ifX3sn9Na8v2CCVYwSMP8pao,4731
86
+ pip/_internal/commands/inspect.py,sha256=PGrY9TRTRCM3y5Ml8Bdk8DEOXquWRfscr4DRo1LOTPc,3189
87
+ pip/_internal/commands/install.py,sha256=iqesiLIZc6Op9uihMQFYRhAA2DQRZUxbM4z1BwXoFls,29428
88
+ pip/_internal/commands/list.py,sha256=oiIzSjLP6__d7dIS3q0Xb5ywsaOThBWRqMyjjKzkPdM,12769
89
+ pip/_internal/commands/search.py,sha256=fWkUQVx_gm8ebbFAlCgqtxKXT9rNahpJ-BI__3HNZpg,5626
90
+ pip/_internal/commands/show.py,sha256=IG9L5uo8w6UA4tI_IlmaxLCoNKPa5JNJCljj3NWs0OE,7507
91
+ pip/_internal/commands/uninstall.py,sha256=7pOR7enK76gimyxQbzxcG1OsyLXL3DvX939xmM8Fvtg,3892
92
+ pip/_internal/commands/wheel.py,sha256=eJRhr_qoNNxWAkkdJCNiQM7CXd4E1_YyQhsqJnBPGGg,6414
93
+ pip/_internal/configuration.py,sha256=XkAiBS0hpzsM-LF0Qu5hvPWO_Bs67-oQKRYFBuMbESs,14006
94
+ pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858
95
+ pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc,,
96
+ pip/_internal/distributions/__pycache__/base.cpython-312.pyc,,
97
+ pip/_internal/distributions/__pycache__/installed.cpython-312.pyc,,
98
+ pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc,,
99
+ pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc,,
100
+ pip/_internal/distributions/base.py,sha256=QeB9qvKXDIjLdPBDE5fMgpfGqMMCr-govnuoQnGuiF8,1783
101
+ pip/_internal/distributions/installed.py,sha256=QinHFbWAQ8oE0pbD8MFZWkwlnfU1QYTccA1vnhrlYOU,842
102
+ pip/_internal/distributions/sdist.py,sha256=PlcP4a6-R6c98XnOM-b6Lkb3rsvh9iG4ok8shaanrzs,6751
103
+ pip/_internal/distributions/wheel.py,sha256=THBYfnv7VVt8mYhMYUtH13S1E7FDwtDyDfmUcl8ai0E,1317
104
+ pip/_internal/exceptions.py,sha256=2_byISIv3kSnI_9T-Esfxrt0LnTRgcUHyxu0twsHjQY,26481
105
+ pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30
106
+ pip/_internal/index/__pycache__/__init__.cpython-312.pyc,,
107
+ pip/_internal/index/__pycache__/collector.cpython-312.pyc,,
108
+ pip/_internal/index/__pycache__/package_finder.cpython-312.pyc,,
109
+ pip/_internal/index/__pycache__/sources.cpython-312.pyc,,
110
+ pip/_internal/index/collector.py,sha256=RdPO0JLAlmyBWPAWYHPyRoGjz3GNAeTngCNkbGey_mE,16265
111
+ pip/_internal/index/package_finder.py,sha256=yRC4xsyudwKnNoU6IXvNoyqYo5ScT7lB6Wa-z2eh7cs,37666
112
+ pip/_internal/index/sources.py,sha256=lPBLK5Xiy8Q6IQMio26Wl7ocfZOKkgGklIBNyUJ23fI,8632
113
+ pip/_internal/locations/__init__.py,sha256=UaAxeZ_f93FyouuFf4p7SXYF-4WstXuEvd3LbmPCAno,14925
114
+ pip/_internal/locations/__pycache__/__init__.cpython-312.pyc,,
115
+ pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc,,
116
+ pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc,,
117
+ pip/_internal/locations/__pycache__/base.cpython-312.pyc,,
118
+ pip/_internal/locations/_distutils.py,sha256=x6nyVLj7X11Y4khIdf-mFlxMl2FWadtVEgeb8upc_WI,6013
119
+ pip/_internal/locations/_sysconfig.py,sha256=IGzds60qsFneRogC-oeBaY7bEh3lPt_v47kMJChQXsU,7724
120
+ pip/_internal/locations/base.py,sha256=RQiPi1d4FVM2Bxk04dQhXZ2PqkeljEL2fZZ9SYqIQ78,2556
121
+ pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340
122
+ pip/_internal/metadata/__init__.py,sha256=9pU3W3s-6HtjFuYhWcLTYVmSaziklPv7k2x8p7X1GmA,4339
123
+ pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc,,
124
+ pip/_internal/metadata/__pycache__/_json.cpython-312.pyc,,
125
+ pip/_internal/metadata/__pycache__/base.cpython-312.pyc,,
126
+ pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc,,
127
+ pip/_internal/metadata/_json.py,sha256=P0cAJrH_mtmMZvlZ16ZXm_-izA4lpr5wy08laICuiaA,2644
128
+ pip/_internal/metadata/base.py,sha256=ft0K5XNgI4ETqZnRv2-CtvgYiMOMAeGMAzxT-f6VLJA,25298
129
+ pip/_internal/metadata/importlib/__init__.py,sha256=jUUidoxnHcfITHHaAWG1G2i5fdBYklv_uJcjo2x7VYE,135
130
+ pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc,,
131
+ pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc,,
132
+ pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc,,
133
+ pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc,,
134
+ pip/_internal/metadata/importlib/_compat.py,sha256=c6av8sP8BBjAZuFSJow1iWfygUXNM3xRTCn5nqw6B9M,2796
135
+ pip/_internal/metadata/importlib/_dists.py,sha256=anh0mLI-FYRPUhAdipd0Va3YJJc6HelCKQ0bFhY10a0,8017
136
+ pip/_internal/metadata/importlib/_envs.py,sha256=UUB980XSrDWrMpQ1_G45i0r8Hqlg_tg3IPQ63mEqbNc,7431
137
+ pip/_internal/metadata/pkg_resources.py,sha256=U07ETAINSGeSRBfWUG93E4tZZbaW_f7PGzEqZN0hulc,10542
138
+ pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63
139
+ pip/_internal/models/__pycache__/__init__.cpython-312.pyc,,
140
+ pip/_internal/models/__pycache__/candidate.cpython-312.pyc,,
141
+ pip/_internal/models/__pycache__/direct_url.cpython-312.pyc,,
142
+ pip/_internal/models/__pycache__/format_control.cpython-312.pyc,,
143
+ pip/_internal/models/__pycache__/index.cpython-312.pyc,,
144
+ pip/_internal/models/__pycache__/installation_report.cpython-312.pyc,,
145
+ pip/_internal/models/__pycache__/link.cpython-312.pyc,,
146
+ pip/_internal/models/__pycache__/scheme.cpython-312.pyc,,
147
+ pip/_internal/models/__pycache__/search_scope.cpython-312.pyc,,
148
+ pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc,,
149
+ pip/_internal/models/__pycache__/target_python.cpython-312.pyc,,
150
+ pip/_internal/models/__pycache__/wheel.cpython-312.pyc,,
151
+ pip/_internal/models/candidate.py,sha256=zzgFRuw_kWPjKpGw7LC0ZUMD2CQ2EberUIYs8izjdCA,753
152
+ pip/_internal/models/direct_url.py,sha256=uBtY2HHd3TO9cKQJWh0ThvE5FRr-MWRYChRU4IG9HZE,6578
153
+ pip/_internal/models/format_control.py,sha256=wtsQqSK9HaUiNxQEuB-C62eVimw6G4_VQFxV9-_KDBE,2486
154
+ pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030
155
+ pip/_internal/models/installation_report.py,sha256=zRVZoaz-2vsrezj_H3hLOhMZCK9c7TbzWgC-jOalD00,2818
156
+ pip/_internal/models/link.py,sha256=jHax9O-9zlSzEwjBCDkx0OXjKXwBDwOuPwn-PsR8dCs,21034
157
+ pip/_internal/models/scheme.py,sha256=PakmHJM3e8OOWSZFtfz1Az7f1meONJnkGuQxFlt3wBE,575
158
+ pip/_internal/models/search_scope.py,sha256=67NEnsYY84784S-MM7ekQuo9KXLH-7MzFntXjapvAo0,4531
159
+ pip/_internal/models/selection_prefs.py,sha256=qaFfDs3ciqoXPg6xx45N1jPLqccLJw4N0s4P0PyHTQ8,2015
160
+ pip/_internal/models/target_python.py,sha256=2XaH2rZ5ZF-K5wcJbEMGEl7SqrTToDDNkrtQ2v_v_-Q,4271
161
+ pip/_internal/models/wheel.py,sha256=G7dND_s4ebPkEL7RJ1qCY0QhUUWIIK6AnjWgRATF5no,4539
162
+ pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50
163
+ pip/_internal/network/__pycache__/__init__.cpython-312.pyc,,
164
+ pip/_internal/network/__pycache__/auth.cpython-312.pyc,,
165
+ pip/_internal/network/__pycache__/cache.cpython-312.pyc,,
166
+ pip/_internal/network/__pycache__/download.cpython-312.pyc,,
167
+ pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc,,
168
+ pip/_internal/network/__pycache__/session.cpython-312.pyc,,
169
+ pip/_internal/network/__pycache__/utils.cpython-312.pyc,,
170
+ pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc,,
171
+ pip/_internal/network/auth.py,sha256=D4gASjUrqoDFlSt6gQ767KAAjv6PUyJU0puDlhXNVRE,20809
172
+ pip/_internal/network/cache.py,sha256=48A971qCzKNFvkb57uGEk7-0xaqPS0HWj2711QNTxkU,3935
173
+ pip/_internal/network/download.py,sha256=FLOP29dPYECBiAi7eEjvAbNkyzaKNqbyjOT2m8HPW8U,6048
174
+ pip/_internal/network/lazy_wheel.py,sha256=PBdoMoNQQIA84Fhgne38jWF52W4x_KtsHjxgv4dkRKA,7622
175
+ pip/_internal/network/session.py,sha256=XmanBKjVwPFmh1iJ58q6TDh9xabH37gREuQJ_feuZGA,18741
176
+ pip/_internal/network/utils.py,sha256=Inaxel-NxBu4PQWkjyErdnfewsFCcgHph7dzR1-FboY,4088
177
+ pip/_internal/network/xmlrpc.py,sha256=sAxzOacJ-N1NXGPvap9jC3zuYWSnnv3GXtgR2-E2APA,1838
178
+ pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
179
+ pip/_internal/operations/__pycache__/__init__.cpython-312.pyc,,
180
+ pip/_internal/operations/__pycache__/check.cpython-312.pyc,,
181
+ pip/_internal/operations/__pycache__/freeze.cpython-312.pyc,,
182
+ pip/_internal/operations/__pycache__/prepare.cpython-312.pyc,,
183
+ pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
184
+ pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc,,
185
+ pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc,,
186
+ pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc,,
187
+ pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc,,
188
+ pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc,,
189
+ pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc,,
190
+ pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc,,
191
+ pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc,,
192
+ pip/_internal/operations/build/build_tracker.py,sha256=-ARW_TcjHCOX7D2NUOGntB4Fgc6b4aolsXkAK6BWL7w,4774
193
+ pip/_internal/operations/build/metadata.py,sha256=9S0CUD8U3QqZeXp-Zyt8HxwU90lE4QrnYDgrqZDzBnc,1422
194
+ pip/_internal/operations/build/metadata_editable.py,sha256=VLL7LvntKE8qxdhUdEJhcotFzUsOSI8NNS043xULKew,1474
195
+ pip/_internal/operations/build/metadata_legacy.py,sha256=8i6i1QZX9m_lKPStEFsHKM0MT4a-CD408JOw99daLmo,2190
196
+ pip/_internal/operations/build/wheel.py,sha256=sT12FBLAxDC6wyrDorh8kvcZ1jG5qInCRWzzP-UkJiQ,1075
197
+ pip/_internal/operations/build/wheel_editable.py,sha256=yOtoH6zpAkoKYEUtr8FhzrYnkNHQaQBjWQ2HYae1MQg,1417
198
+ pip/_internal/operations/build/wheel_legacy.py,sha256=K-6kNhmj-1xDF45ny1yheMerF0ui4EoQCLzEoHh6-tc,3045
199
+ pip/_internal/operations/check.py,sha256=L24vRL8VWbyywdoeAhM89WCd8zLTnjIbULlKelUgIec,5912
200
+ pip/_internal/operations/freeze.py,sha256=V59yEyCSz_YhZuhH09-6aV_zvYBMrS_IxFFNqn2QzlA,9864
201
+ pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51
202
+ pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc,,
203
+ pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc,,
204
+ pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc,,
205
+ pip/_internal/operations/install/editable_legacy.py,sha256=PoEsNEPGbIZ2yQphPsmYTKLOCMs4gv5OcCdzW124NcA,1283
206
+ pip/_internal/operations/install/wheel.py,sha256=X5Iz9yUg5LlK5VNQ9g2ikc6dcRu8EPi_SUi5iuEDRgo,27615
207
+ pip/_internal/operations/prepare.py,sha256=joWJwPkuqGscQgVNImLK71e9hRapwKvRCM8HclysmvU,28118
208
+ pip/_internal/pyproject.py,sha256=rw4fwlptDp1hZgYoplwbAGwWA32sWQkp7ysf8Ju6iXc,7287
209
+ pip/_internal/req/__init__.py,sha256=HxBFtZy_BbCclLgr26waMtpzYdO5T3vxePvpGAXSt5s,2653
210
+ pip/_internal/req/__pycache__/__init__.cpython-312.pyc,,
211
+ pip/_internal/req/__pycache__/constructors.cpython-312.pyc,,
212
+ pip/_internal/req/__pycache__/req_file.cpython-312.pyc,,
213
+ pip/_internal/req/__pycache__/req_install.cpython-312.pyc,,
214
+ pip/_internal/req/__pycache__/req_set.cpython-312.pyc,,
215
+ pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc,,
216
+ pip/_internal/req/constructors.py,sha256=v1qzCN1mIldwx-nCrPc8JO4lxkm3Fv8M5RWvt8LISjc,18430
217
+ pip/_internal/req/req_file.py,sha256=gOOJTzL-mDRPcQhjwqjDrjn4V-3rK9TnEFnU3v8RA4Q,18752
218
+ pip/_internal/req/req_install.py,sha256=yhT98NGDoAEk03jznTJnYCznzhiMEEA2ocgsUG_dcNU,35788
219
+ pip/_internal/req/req_set.py,sha256=j3esG0s6SzoVReX9rWn4rpYNtyET_fwxbwJPRimvRxo,2858
220
+ pip/_internal/req/req_uninstall.py,sha256=qzDIxJo-OETWqGais7tSMCDcWbATYABT-Tid3ityF0s,23853
221
+ pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
222
+ pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc,,
223
+ pip/_internal/resolution/__pycache__/base.cpython-312.pyc,,
224
+ pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtKsLA,583
225
+ pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
226
+ pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc,,
227
+ pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc,,
228
+ pip/_internal/resolution/legacy/resolver.py,sha256=3HZiJBRd1FTN6jQpI4qRO8-TbLYeIbUTS6PFvXnXs2w,24068
229
+ pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
230
+ pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc,,
231
+ pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc,,
232
+ pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc,,
233
+ pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc,,
234
+ pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc,,
235
+ pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc,,
236
+ pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc,,
237
+ pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc,,
238
+ pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc,,
239
+ pip/_internal/resolution/resolvelib/base.py,sha256=DCf669FsqyQY5uqXeePDHQY1e4QO-pBzWH8O0s9-K94,5023
240
+ pip/_internal/resolution/resolvelib/candidates.py,sha256=5UZ1upNnmqsP-nmEZaDYxaBgCoejw_e2WVGmmAvBxXc,20001
241
+ pip/_internal/resolution/resolvelib/factory.py,sha256=511CaUR41LqjALuFafLVfx15WRvMhxYTdjQCoSvp4gw,32661
242
+ pip/_internal/resolution/resolvelib/found_candidates.py,sha256=9hrTyQqFvl9I7Tji79F1AxHv39Qh1rkJ_7deSHSMfQc,6383
243
+ pip/_internal/resolution/resolvelib/provider.py,sha256=bcsFnYvlmtB80cwVdW1fIwgol8ZNr1f1VHyRTkz47SM,9935
244
+ pip/_internal/resolution/resolvelib/reporter.py,sha256=00JtoXEkTlw0-rl_sl54d71avwOsJHt9GGHcrj5Sza0,3168
245
+ pip/_internal/resolution/resolvelib/requirements.py,sha256=7JG4Z72e5Yk4vU0S5ulGvbqTy4FMQGYhY5zQhX9zTtY,8065
246
+ pip/_internal/resolution/resolvelib/resolver.py,sha256=nLJOsVMEVi2gQUVJoUFKMZAeu2f7GRMjGMvNSWyz0Bc,12592
247
+ pip/_internal/self_outdated_check.py,sha256=pkjQixuWyQ1vrVxZAaYD6SSHgXuFUnHZybXEWTkh0S0,8145
248
+ pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
249
+ pip/_internal/utils/__pycache__/__init__.cpython-312.pyc,,
250
+ pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc,,
251
+ pip/_internal/utils/__pycache__/_log.cpython-312.pyc,,
252
+ pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc,,
253
+ pip/_internal/utils/__pycache__/compat.cpython-312.pyc,,
254
+ pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc,,
255
+ pip/_internal/utils/__pycache__/datetime.cpython-312.pyc,,
256
+ pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc,,
257
+ pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc,,
258
+ pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc,,
259
+ pip/_internal/utils/__pycache__/encoding.cpython-312.pyc,,
260
+ pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc,,
261
+ pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc,,
262
+ pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc,,
263
+ pip/_internal/utils/__pycache__/glibc.cpython-312.pyc,,
264
+ pip/_internal/utils/__pycache__/hashes.cpython-312.pyc,,
265
+ pip/_internal/utils/__pycache__/logging.cpython-312.pyc,,
266
+ pip/_internal/utils/__pycache__/misc.cpython-312.pyc,,
267
+ pip/_internal/utils/__pycache__/packaging.cpython-312.pyc,,
268
+ pip/_internal/utils/__pycache__/retry.cpython-312.pyc,,
269
+ pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc,,
270
+ pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc,,
271
+ pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc,,
272
+ pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc,,
273
+ pip/_internal/utils/__pycache__/urls.cpython-312.pyc,,
274
+ pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc,,
275
+ pip/_internal/utils/__pycache__/wheel.cpython-312.pyc,,
276
+ pip/_internal/utils/_jaraco_text.py,sha256=M15uUPIh5NpP1tdUGBxRau6q1ZAEtI8-XyLEETscFfE,3350
277
+ pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015
278
+ pip/_internal/utils/appdirs.py,sha256=swgcTKOm3daLeXTW6v5BUS2Ti2RvEnGRQYH_yDXklAo,1665
279
+ pip/_internal/utils/compat.py,sha256=ckkFveBiYQjRWjkNsajt_oWPS57tJvE8XxoC4OIYgCY,2399
280
+ pip/_internal/utils/compatibility_tags.py,sha256=OWq5axHpW-MEEPztGdvgADrgJPAcV9a88Rxm4Z8VBs8,6272
281
+ pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242
282
+ pip/_internal/utils/deprecation.py,sha256=k7Qg_UBAaaTdyq82YVARA6D7RmcGTXGv7fnfcgigj4Q,3707
283
+ pip/_internal/utils/direct_url_helpers.py,sha256=r2MRtkVDACv9AGqYODBUC9CjwgtsUU1s68hmgfCJMtA,3196
284
+ pip/_internal/utils/egg_link.py,sha256=0FePZoUYKv4RGQ2t6x7w5Z427wbA_Uo3WZnAkrgsuqo,2463
285
+ pip/_internal/utils/encoding.py,sha256=qqsXDtiwMIjXMEiIVSaOjwH5YmirCaK-dIzb6-XJsL0,1169
286
+ pip/_internal/utils/entrypoints.py,sha256=YlhLTRl2oHBAuqhc-zmL7USS67TPWVHImjeAQHreZTQ,3064
287
+ pip/_internal/utils/filesystem.py,sha256=ajvA-q4ocliW9kPp8Yquh-4vssXbu-UKbo5FV9V4X64,4950
288
+ pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716
289
+ pip/_internal/utils/glibc.py,sha256=vUkWq_1pJuzcYNcGKLlQmABoUiisK8noYY1yc8Wq4w4,3734
290
+ pip/_internal/utils/hashes.py,sha256=XGGLL0AG8-RhWnyz87xF6MFZ--BKadHU35D47eApCKI,4972
291
+ pip/_internal/utils/logging.py,sha256=7BFKB1uFjdxD5crM-GtwA5T2qjbQ2LPD-gJDuJeDNTg,11606
292
+ pip/_internal/utils/misc.py,sha256=NRV0_2fFhzy1jhvInSBv4dqCmTwct8PV7Kp0m-BPRGM,23530
293
+ pip/_internal/utils/packaging.py,sha256=iI3LH43lVNR4hWBOqF6lFsZq4aycb2j0UcHlmDmcqUg,2109
294
+ pip/_internal/utils/retry.py,sha256=mhFbykXjhTnZfgzeuy-vl9c8nECnYn_CMtwNJX2tYzQ,1392
295
+ pip/_internal/utils/setuptools_build.py,sha256=ouXpud-jeS8xPyTPsXJ-m34NPvK5os45otAzdSV_IJE,4435
296
+ pip/_internal/utils/subprocess.py,sha256=EsvqSRiSMHF98T8Txmu6NLU3U--MpTTQjtNgKP0P--M,8988
297
+ pip/_internal/utils/temp_dir.py,sha256=5qOXe8M4JeY6vaFQM867d5zkp1bSwMZ-KT5jymmP0Zg,9310
298
+ pip/_internal/utils/unpacking.py,sha256=eyDkSsk4nW8ZfiSjNzJduCznpHyaGHVv3ak_LMGsiEM,11951
299
+ pip/_internal/utils/urls.py,sha256=qceSOZb5lbNDrHNsv7_S4L4Ytszja5NwPKUMnZHbYnM,1599
300
+ pip/_internal/utils/virtualenv.py,sha256=S6f7csYorRpiD6cvn3jISZYc3I8PJC43H5iMFpRAEDU,3456
301
+ pip/_internal/utils/wheel.py,sha256=b442jkydFHjXzDy6cMR7MpzWBJ1Q82hR5F33cmcHV3g,4494
302
+ pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596
303
+ pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc,,
304
+ pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc,,
305
+ pip/_internal/vcs/__pycache__/git.cpython-312.pyc,,
306
+ pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc,,
307
+ pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc,,
308
+ pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc,,
309
+ pip/_internal/vcs/bazaar.py,sha256=EKStcQaKpNu0NK4p5Q10Oc4xb3DUxFw024XrJy40bFQ,3528
310
+ pip/_internal/vcs/git.py,sha256=3tpc9LQA_J4IVW5r5NvWaaSeDzcmJOrSFZN0J8vIKfU,18177
311
+ pip/_internal/vcs/mercurial.py,sha256=oULOhzJ2Uie-06d1omkL-_Gc6meGaUkyogvqG9ZCyPs,5249
312
+ pip/_internal/vcs/subversion.py,sha256=ddTugHBqHzV3ebKlU5QXHPN4gUqlyXbOx8q8NgXKvs8,11735
313
+ pip/_internal/vcs/versioncontrol.py,sha256=cvf_-hnTAjQLXJ3d17FMNhQfcO1AcKWUF10tfrYyP-c,22440
314
+ pip/_internal/wheel_builder.py,sha256=DL3A8LKeRj_ACp11WS5wSgASgPFqeyAeXJKdXfmaWXU,11799
315
+ pip/_vendor/__init__.py,sha256=JYuAXvClhInxIrA2FTp5p-uuWVL7WV6-vEpTs46-Qh4,4873
316
+ pip/_vendor/__pycache__/__init__.cpython-312.pyc,,
317
+ pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc,,
318
+ pip/_vendor/cachecontrol/__init__.py,sha256=GiYoagwPEiJ_xR_lbwWGaoCiPtF_rz4isjfjdDAgHU4,676
319
+ pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc,,
320
+ pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc,,
321
+ pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc,,
322
+ pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc,,
323
+ pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc,,
324
+ pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc,,
325
+ pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc,,
326
+ pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc,,
327
+ pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc,,
328
+ pip/_vendor/cachecontrol/_cmd.py,sha256=iist2EpzJvDVIhMAxXq8iFnTBsiZAd6iplxfmNboNyk,1737
329
+ pip/_vendor/cachecontrol/adapter.py,sha256=fByO_Pd_EOemjWbuocvBWdN85xT0q_TBm2lxS6vD4fk,6355
330
+ pip/_vendor/cachecontrol/cache.py,sha256=OTQj72tUf8C1uEgczdl3Gc8vkldSzsTITKtDGKMx4z8,1952
331
+ pip/_vendor/cachecontrol/caches/__init__.py,sha256=dtrrroK5BnADR1GWjCZ19aZ0tFsMfvFBtLQQU1sp_ag,303
332
+ pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc,,
333
+ pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc,,
334
+ pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc,,
335
+ pip/_vendor/cachecontrol/caches/file_cache.py,sha256=9AlmmTJc6cslb6k5z_6q0sGPHVrMj8zv-uWy-simmfE,5406
336
+ pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=9rmqwtYu_ljVkW6_oLqbC7EaX_a8YT_yLuna-eS0dgo,1386
337
+ pip/_vendor/cachecontrol/controller.py,sha256=o-ejGJlBmpKK8QQLyTPJj0t7siU8XVHXuV8MCybCxQ8,18575
338
+ pip/_vendor/cachecontrol/filewrapper.py,sha256=STttGmIPBvZzt2b51dUOwoWX5crcMCpKZOisM3f5BNc,4292
339
+ pip/_vendor/cachecontrol/heuristics.py,sha256=IYe4QmHERWsMvtxNrp920WeaIsaTTyqLB14DSheSbtY,4834
340
+ pip/_vendor/cachecontrol/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
341
+ pip/_vendor/cachecontrol/serialize.py,sha256=HQd2IllQ05HzPkVLMXTF2uX5mjEQjDBkxCqUJUODpZk,5163
342
+ pip/_vendor/cachecontrol/wrapper.py,sha256=hsGc7g8QGQTT-4f8tgz3AM5qwScg6FO0BSdLSRdEvpU,1417
343
+ pip/_vendor/certifi/__init__.py,sha256=p_GYZrjUwPBUhpLlCZoGb0miKBKSqDAyZC5DvIuqbHQ,94
344
+ pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255
345
+ pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc,,
346
+ pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc,,
347
+ pip/_vendor/certifi/__pycache__/core.cpython-312.pyc,,
348
+ pip/_vendor/certifi/cacert.pem,sha256=lO3rZukXdPyuk6BWUJFOKQliWaXH6HGh9l1GGrUgG0c,299427
349
+ pip/_vendor/certifi/core.py,sha256=2SRT5rIcQChFDbe37BQa-kULxAgJ8qN6l1jfqTp4HIs,4486
350
+ pip/_vendor/certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
351
+ pip/_vendor/distlib/__init__.py,sha256=dcwgYGYGQqAEawBXPDtIx80DO_3cOmFv8HTc8JMzknQ,625
352
+ pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc,,
353
+ pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc,,
354
+ pip/_vendor/distlib/__pycache__/database.cpython-312.pyc,,
355
+ pip/_vendor/distlib/__pycache__/index.cpython-312.pyc,,
356
+ pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc,,
357
+ pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc,,
358
+ pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc,,
359
+ pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc,,
360
+ pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc,,
361
+ pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc,,
362
+ pip/_vendor/distlib/__pycache__/util.cpython-312.pyc,,
363
+ pip/_vendor/distlib/__pycache__/version.cpython-312.pyc,,
364
+ pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc,,
365
+ pip/_vendor/distlib/compat.py,sha256=2jRSjRI4o-vlXeTK2BCGIUhkc6e9ZGhSsacRM5oseTw,41467
366
+ pip/_vendor/distlib/database.py,sha256=mHy_LxiXIsIVRb-T0-idBrVLw3Ffij5teHCpbjmJ9YU,51160
367
+ pip/_vendor/distlib/index.py,sha256=lTbw268rRhj8dw1sib3VZ_0EhSGgoJO3FKJzSFMOaeA,20797
368
+ pip/_vendor/distlib/locators.py,sha256=oBeAZpFuPQSY09MgNnLfQGGAXXvVO96BFpZyKMuK4tM,51026
369
+ pip/_vendor/distlib/manifest.py,sha256=3qfmAmVwxRqU1o23AlfXrQGZzh6g_GGzTAP_Hb9C5zQ,14168
370
+ pip/_vendor/distlib/markers.py,sha256=X6sDvkFGcYS8gUW8hfsWuKEKAqhQZAJ7iXOMLxRYjYk,5164
371
+ pip/_vendor/distlib/metadata.py,sha256=zil3sg2EUfLXVigljY2d_03IJt-JSs7nX-73fECMX2s,38724
372
+ pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820
373
+ pip/_vendor/distlib/scripts.py,sha256=BJliaDAZaVB7WAkwokgC3HXwLD2iWiHaVI50H7C6eG8,18608
374
+ pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792
375
+ pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784
376
+ pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032
377
+ pip/_vendor/distlib/util.py,sha256=vMPGvsS4j9hF6Y9k3Tyom1aaHLb0rFmZAEyzeAdel9w,66682
378
+ pip/_vendor/distlib/version.py,sha256=s5VIs8wBn0fxzGxWM_aA2ZZyx525HcZbMvcTlTyZ3Rg,23727
379
+ pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648
380
+ pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448
381
+ pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888
382
+ pip/_vendor/distlib/wheel.py,sha256=DFIVguEQHCdxnSdAO0dfFsgMcvVZitg7bCOuLwZ7A_s,43979
383
+ pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981
384
+ pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64
385
+ pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc,,
386
+ pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc,,
387
+ pip/_vendor/distro/__pycache__/distro.cpython-312.pyc,,
388
+ pip/_vendor/distro/distro.py,sha256=XqbefacAhDT4zr_trnbA15eY8vdK4GTghgmvUGrEM_4,49430
389
+ pip/_vendor/distro/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
390
+ pip/_vendor/idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849
391
+ pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc,,
392
+ pip/_vendor/idna/__pycache__/codec.cpython-312.pyc,,
393
+ pip/_vendor/idna/__pycache__/compat.cpython-312.pyc,,
394
+ pip/_vendor/idna/__pycache__/core.cpython-312.pyc,,
395
+ pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc,,
396
+ pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc,,
397
+ pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc,,
398
+ pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc,,
399
+ pip/_vendor/idna/codec.py,sha256=PS6m-XmdST7Wj7J7ulRMakPDt5EBJyYrT3CPtjh-7t4,3426
400
+ pip/_vendor/idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321
401
+ pip/_vendor/idna/core.py,sha256=lyhpoe2vulEaB_65xhXmoKgO-xUqFDvcwxu5hpNNO4E,12663
402
+ pip/_vendor/idna/idnadata.py,sha256=dqRwytzkjIHMBa2R1lYvHDwACenZPt8eGVu1Y8UBE-E,78320
403
+ pip/_vendor/idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881
404
+ pip/_vendor/idna/package_data.py,sha256=Tkt0KnIeyIlnHddOaz9WSkkislNgokJAuE-p5GorMqo,21
405
+ pip/_vendor/idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
406
+ pip/_vendor/idna/uts46data.py,sha256=1KuksWqLuccPXm2uyRVkhfiFLNIhM_H2m4azCcnOqEU,206503
407
+ pip/_vendor/msgpack/__init__.py,sha256=gsMP7JTECZNUSjvOyIbdhNOkpB9Z8BcGwabVGY2UcdQ,1077
408
+ pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc,,
409
+ pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc,,
410
+ pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc,,
411
+ pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc,,
412
+ pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081
413
+ pip/_vendor/msgpack/ext.py,sha256=fKp00BqDLjUtZnPd70Llr138zk8JsCuSpJkkZ5S4dt8,5629
414
+ pip/_vendor/msgpack/fallback.py,sha256=wdUWJkWX2gzfRW9BBCTOuIE1Wvrf5PtBtR8ZtY7G_EE,33175
415
+ pip/_vendor/packaging/__init__.py,sha256=dtw2bNmWCQ9WnMoK3bk_elL1svSlikXtLpZhCFIB9SE,496
416
+ pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc,,
417
+ pip/_vendor/packaging/__pycache__/_elffile.cpython-312.pyc,,
418
+ pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc,,
419
+ pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc,,
420
+ pip/_vendor/packaging/__pycache__/_parser.cpython-312.pyc,,
421
+ pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc,,
422
+ pip/_vendor/packaging/__pycache__/_tokenizer.cpython-312.pyc,,
423
+ pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc,,
424
+ pip/_vendor/packaging/__pycache__/metadata.cpython-312.pyc,,
425
+ pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc,,
426
+ pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc,,
427
+ pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc,,
428
+ pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc,,
429
+ pip/_vendor/packaging/__pycache__/version.cpython-312.pyc,,
430
+ pip/_vendor/packaging/_elffile.py,sha256=_LcJW4YNKywYsl4169B2ukKRqwxjxst_8H0FRVQKlz8,3282
431
+ pip/_vendor/packaging/_manylinux.py,sha256=Xo4V0PZz8sbuVCbTni0t1CR0AHeir_7ib4lTmV8scD4,9586
432
+ pip/_vendor/packaging/_musllinux.py,sha256=p9ZqNYiOItGee8KcZFeHF_YcdhVwGHdK6r-8lgixvGQ,2694
433
+ pip/_vendor/packaging/_parser.py,sha256=s_TvTvDNK0NrM2QB3VKThdWFM4Nc0P6JnkObkl3MjpM,10236
434
+ pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431
435
+ pip/_vendor/packaging/_tokenizer.py,sha256=J6v5H7Jzvb-g81xp_2QACKwO7LxHQA6ikryMU7zXwN8,5273
436
+ pip/_vendor/packaging/markers.py,sha256=dWKSqn5Sp-jDmOG-W3GfLHKjwhf1IsznbT71VlBoB5M,10671
437
+ pip/_vendor/packaging/metadata.py,sha256=KINuSkJ12u-SyoKNTy_pHNGAfMUtxNvZ53qA1zAKcKI,32349
438
+ pip/_vendor/packaging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
439
+ pip/_vendor/packaging/requirements.py,sha256=gYyRSAdbrIyKDY66ugIDUQjRMvxkH2ALioTmX3tnL6o,2947
440
+ pip/_vendor/packaging/specifiers.py,sha256=HfGgfNJRvrzC759gnnoojHyiWs_DYmcw5PEh5jHH-YE,39738
441
+ pip/_vendor/packaging/tags.py,sha256=Fo6_cit95-7QfcMb16XtI7AUiSMgdwA_hCO_9lV2pz4,21388
442
+ pip/_vendor/packaging/utils.py,sha256=NAdYUwnlAOpkat_RthavX8a07YuVxgGL_vwrx73GSDM,5287
443
+ pip/_vendor/packaging/version.py,sha256=wE4sSVlF-d1H6HFC1vszEe35CwTig_fh4HHIFg95hFE,16210
444
+ pip/_vendor/pkg_resources/__init__.py,sha256=jrhDRbOubP74QuPXxd7U7Po42PH2l-LZ2XfcO7llpZ4,124463
445
+ pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc,,
446
+ pip/_vendor/platformdirs/__init__.py,sha256=FTA6LGNm40GwNZt3gG3uLAacWvf2E_2HTmH0rAALGR8,22285
447
+ pip/_vendor/platformdirs/__main__.py,sha256=jBJ8zb7Mpx5ebcqF83xrpO94MaeCpNGHVf9cvDN2JLg,1505
448
+ pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc,,
449
+ pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc,,
450
+ pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc,,
451
+ pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc,,
452
+ pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc,,
453
+ pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc,,
454
+ pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc,,
455
+ pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc,,
456
+ pip/_vendor/platformdirs/android.py,sha256=xZXY9Jd46WOsxT2U6-5HsNtDZ-IQqxcEUrBLl3hYk4o,9016
457
+ pip/_vendor/platformdirs/api.py,sha256=QBYdUac2eC521ek_y53uD1Dcq-lJX8IgSRVd4InC6uc,8996
458
+ pip/_vendor/platformdirs/macos.py,sha256=wftsbsvq6nZ0WORXSiCrZNkRHz_WKuktl0a6mC7MFkI,5580
459
+ pip/_vendor/platformdirs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
460
+ pip/_vendor/platformdirs/unix.py,sha256=Cci9Wqt35dAMsg6HT9nRGHSBW5obb0pR3AE1JJnsCXg,10643
461
+ pip/_vendor/platformdirs/version.py,sha256=r7F76tZRjgQKzrpx_I0_ZMQOMU-PS7eGnHD7zEK3KB0,411
462
+ pip/_vendor/platformdirs/windows.py,sha256=IFpiohUBwxPtCzlyKwNtxyW4Jk8haa6W8o59mfrDXVo,10125
463
+ pip/_vendor/pygments/__init__.py,sha256=7N1oiaWulw_nCsTY4EEixYLz15pWY5u4uPAFFi-ielU,2983
464
+ pip/_vendor/pygments/__main__.py,sha256=isIhBxLg65nLlXukG4VkMuPfNdd7gFzTZ_R_z3Q8diY,353
465
+ pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc,,
466
+ pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc,,
467
+ pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc,,
468
+ pip/_vendor/pygments/__pycache__/console.cpython-312.pyc,,
469
+ pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc,,
470
+ pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc,,
471
+ pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc,,
472
+ pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc,,
473
+ pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc,,
474
+ pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc,,
475
+ pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc,,
476
+ pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc,,
477
+ pip/_vendor/pygments/__pycache__/style.cpython-312.pyc,,
478
+ pip/_vendor/pygments/__pycache__/token.cpython-312.pyc,,
479
+ pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc,,
480
+ pip/_vendor/pygments/__pycache__/util.cpython-312.pyc,,
481
+ pip/_vendor/pygments/cmdline.py,sha256=LIVzmAunlk9sRJJp54O4KRy9GDIN4Wu13v9p9QzfGPM,23656
482
+ pip/_vendor/pygments/console.py,sha256=yhP9UsLAVmWKVQf2446JJewkA7AiXeeTf4Ieg3Oi2fU,1718
483
+ pip/_vendor/pygments/filter.py,sha256=_ADNPCskD8_GmodHi6_LoVgPU3Zh336aBCT5cOeTMs0,1910
484
+ pip/_vendor/pygments/filters/__init__.py,sha256=RdedK2KWKXlKwR7cvkfr3NUj9YiZQgMgilRMFUg2jPA,40392
485
+ pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc,,
486
+ pip/_vendor/pygments/formatter.py,sha256=jDWBTndlBH2Z5IYZFVDnP0qn1CaTQjTWt7iAGtCnJEg,4390
487
+ pip/_vendor/pygments/formatters/__init__.py,sha256=8No-NUs8rBTSSBJIv4hSEQt2M0cFB4hwAT0snVc2QGE,5385
488
+ pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc,,
489
+ pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc,,
490
+ pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc,,
491
+ pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc,,
492
+ pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc,,
493
+ pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc,,
494
+ pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc,,
495
+ pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc,,
496
+ pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc,,
497
+ pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc,,
498
+ pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc,,
499
+ pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc,,
500
+ pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc,,
501
+ pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc,,
502
+ pip/_vendor/pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176
503
+ pip/_vendor/pygments/formatters/bbcode.py,sha256=3JQLI45tcrQ_kRUMjuab6C7Hb0XUsbVWqqbSn9cMjkI,3320
504
+ pip/_vendor/pygments/formatters/groff.py,sha256=M39k0PaSSZRnxWjqBSVPkF0mu1-Vr7bm6RsFvs-CNN4,5106
505
+ pip/_vendor/pygments/formatters/html.py,sha256=SE2jc3YCqbMS3rZW9EAmDlAUhdVxJ52gA4dileEvCGU,35669
506
+ pip/_vendor/pygments/formatters/img.py,sha256=MwA4xWPLOwh6j7Yc6oHzjuqSPt0M1fh5r-5BTIIUfsU,23287
507
+ pip/_vendor/pygments/formatters/irc.py,sha256=dp1Z0l_ObJ5NFh9MhqLGg5ptG5hgJqedT2Vkutt9v0M,4981
508
+ pip/_vendor/pygments/formatters/latex.py,sha256=XMmhOCqUKDBQtG5mGJNAFYxApqaC5puo5cMmPfK3944,19306
509
+ pip/_vendor/pygments/formatters/other.py,sha256=56PMJOliin-rAUdnRM0i1wsV1GdUPd_dvQq0_UPfF9c,5034
510
+ pip/_vendor/pygments/formatters/pangomarkup.py,sha256=y16U00aVYYEFpeCfGXlYBSMacG425CbfoG8oKbKegIg,2218
511
+ pip/_vendor/pygments/formatters/rtf.py,sha256=ZT90dmcKyJboIB0mArhL7IhE467GXRN0G7QAUgG03To,11957
512
+ pip/_vendor/pygments/formatters/svg.py,sha256=KKsiophPupHuxm0So-MsbQEWOT54IAiSF7hZPmxtKXE,7174
513
+ pip/_vendor/pygments/formatters/terminal.py,sha256=AojNG4MlKq2L6IsC_VnXHu4AbHCBn9Otog6u45XvxeI,4674
514
+ pip/_vendor/pygments/formatters/terminal256.py,sha256=kGkNUVo3FpwjytIDS0if79EuUoroAprcWt3igrcIqT0,11753
515
+ pip/_vendor/pygments/lexer.py,sha256=TYHDt___gNW4axTl2zvPZff-VQi8fPaIh5OKRcVSjUM,35349
516
+ pip/_vendor/pygments/lexers/__init__.py,sha256=pIlxyQJuu_syh9lE080cq8ceVbEVcKp0osAFU5fawJU,12115
517
+ pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc,,
518
+ pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc,,
519
+ pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc,,
520
+ pip/_vendor/pygments/lexers/_mapping.py,sha256=61-h3zr103m01OS5BUq_AfUiL9YI06Ves9ipQ7k4vr4,76097
521
+ pip/_vendor/pygments/lexers/python.py,sha256=2J_YJrPTr_A6fJY_qKiKv0GpgPwHMrlMSeo59qN3fe4,53687
522
+ pip/_vendor/pygments/modeline.py,sha256=gtRYZBS-CKOCDXHhGZqApboHBaZwGH8gznN3O6nuxj4,1005
523
+ pip/_vendor/pygments/plugin.py,sha256=ioeJ3QeoJ-UQhZpY9JL7vbxsTVuwwM7BCu-Jb8nN0AU,1891
524
+ pip/_vendor/pygments/regexopt.py,sha256=Hky4EB13rIXEHQUNkwmCrYqtIlnXDehNR3MztafZ43w,3072
525
+ pip/_vendor/pygments/scanner.py,sha256=NDy3ofK_fHRFK4hIDvxpamG871aewqcsIb6sgTi7Fhk,3092
526
+ pip/_vendor/pygments/sphinxext.py,sha256=iOptJBcqOGPwMEJ2p70PvwpZPIGdvdZ8dxvq6kzxDgA,7981
527
+ pip/_vendor/pygments/style.py,sha256=rSCZWFpg1_DwFMXDU0nEVmAcBHpuQGf9RxvOPPQvKLQ,6420
528
+ pip/_vendor/pygments/styles/__init__.py,sha256=qUk6_1z5KmT8EdJFZYgESmG6P_HJF_2vVrDD7HSCGYY,2042
529
+ pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc,,
530
+ pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-312.pyc,,
531
+ pip/_vendor/pygments/styles/_mapping.py,sha256=6lovFUE29tz6EsV3XYY4hgozJ7q1JL7cfO3UOlgnS8w,3312
532
+ pip/_vendor/pygments/token.py,sha256=qZwT7LSPy5YBY3JgDjut642CCy7JdQzAfmqD9NmT5j0,6226
533
+ pip/_vendor/pygments/unistring.py,sha256=p5c1i-HhoIhWemy9CUsaN9o39oomYHNxXll0Xfw6tEA,63208
534
+ pip/_vendor/pygments/util.py,sha256=2tj2nS1X9_OpcuSjf8dOET2bDVZhs8cEKd_uT6-Fgg8,10031
535
+ pip/_vendor/pyproject_hooks/__init__.py,sha256=kCehmy0UaBa9oVMD7ZIZrnswfnP3LXZ5lvnNJAL5JBM,491
536
+ pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc,,
537
+ pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc,,
538
+ pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc,,
539
+ pip/_vendor/pyproject_hooks/_compat.py,sha256=by6evrYnqkisiM-MQcvOKs5bgDMzlOSgZqRHNqf04zE,138
540
+ pip/_vendor/pyproject_hooks/_impl.py,sha256=61GJxzQip0IInhuO69ZI5GbNQ82XEDUB_1Gg5_KtUoc,11920
541
+ pip/_vendor/pyproject_hooks/_in_process/__init__.py,sha256=9gQATptbFkelkIy0OfWFEACzqxXJMQDWCH9rBOAZVwQ,546
542
+ pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc,,
543
+ pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc,,
544
+ pip/_vendor/pyproject_hooks/_in_process/_in_process.py,sha256=m2b34c917IW5o-Q_6TYIHlsK9lSUlNiyrITTUH_zwew,10927
545
+ pip/_vendor/requests/__init__.py,sha256=HlB_HzhrzGtfD_aaYUwUh1zWXLZ75_YCLyit75d0Vz8,5057
546
+ pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc,,
547
+ pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc,,
548
+ pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc,,
549
+ pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc,,
550
+ pip/_vendor/requests/__pycache__/api.cpython-312.pyc,,
551
+ pip/_vendor/requests/__pycache__/auth.cpython-312.pyc,,
552
+ pip/_vendor/requests/__pycache__/certs.cpython-312.pyc,,
553
+ pip/_vendor/requests/__pycache__/compat.cpython-312.pyc,,
554
+ pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc,,
555
+ pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc,,
556
+ pip/_vendor/requests/__pycache__/help.cpython-312.pyc,,
557
+ pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc,,
558
+ pip/_vendor/requests/__pycache__/models.cpython-312.pyc,,
559
+ pip/_vendor/requests/__pycache__/packages.cpython-312.pyc,,
560
+ pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc,,
561
+ pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc,,
562
+ pip/_vendor/requests/__pycache__/structures.cpython-312.pyc,,
563
+ pip/_vendor/requests/__pycache__/utils.cpython-312.pyc,,
564
+ pip/_vendor/requests/__version__.py,sha256=FVfglgZmNQnmYPXpOohDU58F5EUb_-VnSTaAesS187g,435
565
+ pip/_vendor/requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495
566
+ pip/_vendor/requests/adapters.py,sha256=J7VeVxKBvawbtlX2DERVo05J9BXTcWYLMHNd1Baa-bk,27607
567
+ pip/_vendor/requests/api.py,sha256=_Zb9Oa7tzVIizTKwFrPjDEY9ejtm_OnSRERnADxGsQs,6449
568
+ pip/_vendor/requests/auth.py,sha256=kF75tqnLctZ9Mf_hm9TZIj4cQWnN5uxRz8oWsx5wmR0,10186
569
+ pip/_vendor/requests/certs.py,sha256=PVPooB0jP5hkZEULSCwC074532UFbR2Ptgu0I5zwmCs,575
570
+ pip/_vendor/requests/compat.py,sha256=Mo9f9xZpefod8Zm-n9_StJcVTmwSukXR2p3IQyyVXvU,1485
571
+ pip/_vendor/requests/cookies.py,sha256=bNi-iqEj4NPZ00-ob-rHvzkvObzN3lEpgw3g6paS3Xw,18590
572
+ pip/_vendor/requests/exceptions.py,sha256=D1wqzYWne1mS2rU43tP9CeN1G7QAy7eqL9o1god6Ejw,4272
573
+ pip/_vendor/requests/help.py,sha256=hRKaf9u0G7fdwrqMHtF3oG16RKktRf6KiwtSq2Fo1_0,3813
574
+ pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733
575
+ pip/_vendor/requests/models.py,sha256=x4K4CmH-lC0l2Kb-iPfMN4dRXxHEcbOaEWBL_i09AwI,35483
576
+ pip/_vendor/requests/packages.py,sha256=_ZQDCJTJ8SP3kVWunSqBsRZNPzj2c1WFVqbdr08pz3U,1057
577
+ pip/_vendor/requests/sessions.py,sha256=ykTI8UWGSltOfH07HKollH7kTBGw4WhiBVaQGmckTw4,30495
578
+ pip/_vendor/requests/status_codes.py,sha256=iJUAeA25baTdw-6PfD0eF4qhpINDJRJI-yaMqxs4LEI,4322
579
+ pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912
580
+ pip/_vendor/requests/utils.py,sha256=L79vnFbzJ3SFLKtJwpoWe41Tozi3RlZv94pY1TFIyow,33631
581
+ pip/_vendor/resolvelib/__init__.py,sha256=h509TdEcpb5-44JonaU3ex2TM15GVBLjM9CNCPwnTTs,537
582
+ pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc,,
583
+ pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc,,
584
+ pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc,,
585
+ pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc,,
586
+ pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc,,
587
+ pip/_vendor/resolvelib/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
588
+ pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc,,
589
+ pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc,,
590
+ pip/_vendor/resolvelib/compat/collections_abc.py,sha256=uy8xUZ-NDEw916tugUXm8HgwCGiMO0f-RcdnpkfXfOs,156
591
+ pip/_vendor/resolvelib/providers.py,sha256=fuuvVrCetu5gsxPB43ERyjfO8aReS3rFQHpDgiItbs4,5871
592
+ pip/_vendor/resolvelib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
593
+ pip/_vendor/resolvelib/reporters.py,sha256=TSbRmWzTc26w0ggsV1bxVpeWDB8QNIre6twYl7GIZBE,1601
594
+ pip/_vendor/resolvelib/resolvers.py,sha256=G8rsLZSq64g5VmIq-lB7UcIJ1gjAxIQJmTF4REZleQ0,20511
595
+ pip/_vendor/resolvelib/structs.py,sha256=0_1_XO8z_CLhegP3Vpf9VJ3zJcfLm0NOHRM-i0Ykz3o,4963
596
+ pip/_vendor/rich/__init__.py,sha256=dRxjIL-SbFVY0q3IjSMrfgBTHrm1LZDgLOygVBwiYZc,6090
597
+ pip/_vendor/rich/__main__.py,sha256=eO7Cq8JnrgG8zVoeImiAs92q3hXNMIfp0w5lMsO7Q2Y,8477
598
+ pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc,,
599
+ pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc,,
600
+ pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc,,
601
+ pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc,,
602
+ pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc,,
603
+ pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc,,
604
+ pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc,,
605
+ pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc,,
606
+ pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc,,
607
+ pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc,,
608
+ pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc,,
609
+ pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc,,
610
+ pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc,,
611
+ pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc,,
612
+ pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc,,
613
+ pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc,,
614
+ pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc,,
615
+ pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc,,
616
+ pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc,,
617
+ pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc,,
618
+ pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc,,
619
+ pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc,,
620
+ pip/_vendor/rich/__pycache__/abc.cpython-312.pyc,,
621
+ pip/_vendor/rich/__pycache__/align.cpython-312.pyc,,
622
+ pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc,,
623
+ pip/_vendor/rich/__pycache__/bar.cpython-312.pyc,,
624
+ pip/_vendor/rich/__pycache__/box.cpython-312.pyc,,
625
+ pip/_vendor/rich/__pycache__/cells.cpython-312.pyc,,
626
+ pip/_vendor/rich/__pycache__/color.cpython-312.pyc,,
627
+ pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc,,
628
+ pip/_vendor/rich/__pycache__/columns.cpython-312.pyc,,
629
+ pip/_vendor/rich/__pycache__/console.cpython-312.pyc,,
630
+ pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc,,
631
+ pip/_vendor/rich/__pycache__/containers.cpython-312.pyc,,
632
+ pip/_vendor/rich/__pycache__/control.cpython-312.pyc,,
633
+ pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc,,
634
+ pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc,,
635
+ pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc,,
636
+ pip/_vendor/rich/__pycache__/errors.cpython-312.pyc,,
637
+ pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc,,
638
+ pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc,,
639
+ pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc,,
640
+ pip/_vendor/rich/__pycache__/json.cpython-312.pyc,,
641
+ pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc,,
642
+ pip/_vendor/rich/__pycache__/layout.cpython-312.pyc,,
643
+ pip/_vendor/rich/__pycache__/live.cpython-312.pyc,,
644
+ pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc,,
645
+ pip/_vendor/rich/__pycache__/logging.cpython-312.pyc,,
646
+ pip/_vendor/rich/__pycache__/markup.cpython-312.pyc,,
647
+ pip/_vendor/rich/__pycache__/measure.cpython-312.pyc,,
648
+ pip/_vendor/rich/__pycache__/padding.cpython-312.pyc,,
649
+ pip/_vendor/rich/__pycache__/pager.cpython-312.pyc,,
650
+ pip/_vendor/rich/__pycache__/palette.cpython-312.pyc,,
651
+ pip/_vendor/rich/__pycache__/panel.cpython-312.pyc,,
652
+ pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc,,
653
+ pip/_vendor/rich/__pycache__/progress.cpython-312.pyc,,
654
+ pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc,,
655
+ pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc,,
656
+ pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc,,
657
+ pip/_vendor/rich/__pycache__/region.cpython-312.pyc,,
658
+ pip/_vendor/rich/__pycache__/repr.cpython-312.pyc,,
659
+ pip/_vendor/rich/__pycache__/rule.cpython-312.pyc,,
660
+ pip/_vendor/rich/__pycache__/scope.cpython-312.pyc,,
661
+ pip/_vendor/rich/__pycache__/screen.cpython-312.pyc,,
662
+ pip/_vendor/rich/__pycache__/segment.cpython-312.pyc,,
663
+ pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc,,
664
+ pip/_vendor/rich/__pycache__/status.cpython-312.pyc,,
665
+ pip/_vendor/rich/__pycache__/style.cpython-312.pyc,,
666
+ pip/_vendor/rich/__pycache__/styled.cpython-312.pyc,,
667
+ pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc,,
668
+ pip/_vendor/rich/__pycache__/table.cpython-312.pyc,,
669
+ pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc,,
670
+ pip/_vendor/rich/__pycache__/text.cpython-312.pyc,,
671
+ pip/_vendor/rich/__pycache__/theme.cpython-312.pyc,,
672
+ pip/_vendor/rich/__pycache__/themes.cpython-312.pyc,,
673
+ pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc,,
674
+ pip/_vendor/rich/__pycache__/tree.cpython-312.pyc,,
675
+ pip/_vendor/rich/_cell_widths.py,sha256=fbmeyetEdHjzE_Vx2l1uK7tnPOhMs2X1lJfO3vsKDpA,10209
676
+ pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235
677
+ pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064
678
+ pip/_vendor/rich/_export_format.py,sha256=RI08pSrm5tBSzPMvnbTqbD9WIalaOoN5d4M1RTmLq1Y,2128
679
+ pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265
680
+ pip/_vendor/rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799
681
+ pip/_vendor/rich/_inspect.py,sha256=oZJGw31e64dwXSCmrDnvZbwVb1ZKhWfU8wI3VWohjJk,9695
682
+ pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225
683
+ pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236
684
+ pip/_vendor/rich/_null_file.py,sha256=tGSXk_v-IZmbj1GAzHit8A3kYIQMiCpVsCFfsC-_KJ4,1387
685
+ pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063
686
+ pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423
687
+ pip/_vendor/rich/_ratio.py,sha256=Zt58apszI6hAAcXPpgdWKpu3c31UBWebOeR4mbyptvU,5471
688
+ pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919
689
+ pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351
690
+ pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417
691
+ pip/_vendor/rich/_win32_console.py,sha256=P0vxI2fcndym1UU1S37XAzQzQnkyY7YqAKmxm24_gug,22820
692
+ pip/_vendor/rich/_windows.py,sha256=aBwaD_S56SbgopIvayVmpk0Y28uwY2C5Bab1wl3Bp-I,1925
693
+ pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783
694
+ pip/_vendor/rich/_wrap.py,sha256=FlSsom5EX0LVkA3KWy34yHnCfLtqX-ZIepXKh-70rpc,3404
695
+ pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890
696
+ pip/_vendor/rich/align.py,sha256=sCUkisXkQfoq-IQPyBELfJ8l7LihZJX3HbH8K7Cie-M,10368
697
+ pip/_vendor/rich/ansi.py,sha256=iD6532QYqnBm6hADulKjrV8l8kFJ-9fEVooHJHH3hMg,6906
698
+ pip/_vendor/rich/bar.py,sha256=ldbVHOzKJOnflVNuv1xS7g6dLX2E3wMnXkdPbpzJTcs,3263
699
+ pip/_vendor/rich/box.py,sha256=nr5fYIUghB_iUCEq6y0Z3LlCT8gFPDrzN9u2kn7tJl4,10831
700
+ pip/_vendor/rich/cells.py,sha256=aMmGK4BjXhgE6_JF1ZEGmW3O7mKkE8g84vUnj4Et4To,4780
701
+ pip/_vendor/rich/color.py,sha256=bCRATVdRe5IClJ6Hl62de2PKQ_U4i2MZ4ugjUEg7Tao,18223
702
+ pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054
703
+ pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131
704
+ pip/_vendor/rich/console.py,sha256=deFZIubq2M9A2MCsKFAsFQlWDvcOMsGuUA07QkOaHIw,99173
705
+ pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288
706
+ pip/_vendor/rich/containers.py,sha256=c_56TxcedGYqDepHBMTuZdUIijitAQgnox-Qde0Z1qo,5502
707
+ pip/_vendor/rich/control.py,sha256=DSkHTUQLorfSERAKE_oTAEUFefZnZp4bQb4q8rHbKws,6630
708
+ pip/_vendor/rich/default_styles.py,sha256=-Fe318kMVI_IwciK5POpThcO0-9DYJ67TZAN6DlmlmM,8082
709
+ pip/_vendor/rich/diagnose.py,sha256=an6uouwhKPAlvQhYpNNpGq9EJysfMIOvvCbO3oSoR24,972
710
+ pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501
711
+ pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642
712
+ pip/_vendor/rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683
713
+ pip/_vendor/rich/filesize.py,sha256=9fTLAPCAwHmBXdRv7KZU194jSgNrRb6Wx7RIoBgqeKY,2508
714
+ pip/_vendor/rich/highlighter.py,sha256=6ZAjUcNhBRajBCo9umFUclyi2xL0-55JL7S0vYGUJu4,9585
715
+ pip/_vendor/rich/json.py,sha256=vVEoKdawoJRjAFayPwXkMBPLy7RSTs-f44wSQDR2nJ0,5031
716
+ pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252
717
+ pip/_vendor/rich/layout.py,sha256=ajkSFAtEVv9EFTcFs-w4uZfft7nEXhNzL7ZVdgrT5rI,14004
718
+ pip/_vendor/rich/live.py,sha256=vUcnJV2LMSK3sQNaILbm0-_B8BpAeiHfcQMAMLfpRe0,14271
719
+ pip/_vendor/rich/live_render.py,sha256=zJtB471jGziBtEwxc54x12wEQtH4BuQr1SA8v9kU82w,3666
720
+ pip/_vendor/rich/logging.py,sha256=uB-cB-3Q4bmXDLLpbOWkmFviw-Fde39zyMV6tKJ2WHQ,11903
721
+ pip/_vendor/rich/markup.py,sha256=3euGKP5s41NCQwaSjTnJxus5iZMHjxpIM0W6fCxra38,8451
722
+ pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305
723
+ pip/_vendor/rich/padding.py,sha256=kTFGsdGe0os7tXLnHKpwTI90CXEvrceeZGCshmJy5zw,4970
724
+ pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828
725
+ pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396
726
+ pip/_vendor/rich/panel.py,sha256=2Fd1V7e1kHxlPFIusoHY5T7-Cs0RpkrihgVG9ZVqJ4g,10705
727
+ pip/_vendor/rich/pretty.py,sha256=5oIHP_CGWnHEnD0zMdW5qfGC5kHqIKn7zH_eC4crULE,35848
728
+ pip/_vendor/rich/progress.py,sha256=P02xi7T2Ua3qq17o83bkshe4c0v_45cg8VyTj6US6Vg,59715
729
+ pip/_vendor/rich/progress_bar.py,sha256=L4jw8E6Qb_x-jhOrLVhkuMaPmiAhFIl8jHQbWFrKuR8,8164
730
+ pip/_vendor/rich/prompt.py,sha256=wdOn2X8XTJKnLnlw6PoMY7xG4iUPp3ezt4O5gqvpV-E,11304
731
+ pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391
732
+ pip/_vendor/rich/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
733
+ pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166
734
+ pip/_vendor/rich/repr.py,sha256=5MZJZmONgC6kud-QW-_m1okXwL2aR6u6y-pUcUCJz28,4431
735
+ pip/_vendor/rich/rule.py,sha256=0fNaS_aERa3UMRc3T5WMpN_sumtDxfaor2y3of1ftBk,4602
736
+ pip/_vendor/rich/scope.py,sha256=TMUU8qo17thyqQCPqjDLYpg_UU1k5qVd-WwiJvnJVas,2843
737
+ pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591
738
+ pip/_vendor/rich/segment.py,sha256=hU1ueeXqI6YeFa08K9DAjlF2QLxcJY9pwZx7RsXavlk,24246
739
+ pip/_vendor/rich/spinner.py,sha256=15koCmF0DQeD8-k28Lpt6X_zJQUlzEhgo_6A6uy47lc,4339
740
+ pip/_vendor/rich/status.py,sha256=kkPph3YeAZBo-X-4wPp8gTqZyU466NLwZBA4PZTTewo,4424
741
+ pip/_vendor/rich/style.py,sha256=3hiocH_4N8vwRm3-8yFWzM7tSwjjEven69XqWasSQwM,27073
742
+ pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258
743
+ pip/_vendor/rich/syntax.py,sha256=TnZDuOD4DeHFbkaVEAji1gf8qgAlMU9Boe_GksMGCkk,35475
744
+ pip/_vendor/rich/table.py,sha256=nGEvAZHF4dy1vT9h9Gj9O5qhSQO3ODAxJv0RY1vnIB8,39680
745
+ pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370
746
+ pip/_vendor/rich/text.py,sha256=5rQ3zvNrg5UZKNLecbh7fiw9v3HeFulNVtRY_CBDjjE,47312
747
+ pip/_vendor/rich/theme.py,sha256=belFJogzA0W0HysQabKaHOc3RWH2ko3fQAJhoN-AFdo,3777
748
+ pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102
749
+ pip/_vendor/rich/traceback.py,sha256=CUpxYLjQWIb6vQQ6O72X0hvDV6caryGqU6UweHgOyCY,29601
750
+ pip/_vendor/rich/tree.py,sha256=meAOUU6sYnoBEOX2ILrPLY9k5bWrWNQKkaiEFvHinXM,9167
751
+ pip/_vendor/tomli/__init__.py,sha256=JhUwV66DB1g4Hvt1UQCVMdfCu-IgAV8FXmvDU9onxd4,396
752
+ pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc,,
753
+ pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc,,
754
+ pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc,,
755
+ pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc,,
756
+ pip/_vendor/tomli/_parser.py,sha256=g9-ENaALS-B8dokYpCuzUFalWlog7T-SIYMjLZSWrtM,22633
757
+ pip/_vendor/tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943
758
+ pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254
759
+ pip/_vendor/tomli/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
760
+ pip/_vendor/truststore/__init__.py,sha256=WIDeyzWm7EVX44g354M25vpRXbeY1lsPH6EmUJUcq4o,1264
761
+ pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc,,
762
+ pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc,,
763
+ pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc,,
764
+ pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc,,
765
+ pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc,,
766
+ pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc,,
767
+ pip/_vendor/truststore/_api.py,sha256=GeXRNTlxPZ3kif4kNoh6JY0oE4QRzTGcgXr6l_X_Gk0,10555
768
+ pip/_vendor/truststore/_macos.py,sha256=nZlLkOmszUE0g6ryRwBVGY5COzPyudcsiJtDWarM5LQ,20503
769
+ pip/_vendor/truststore/_openssl.py,sha256=LLUZ7ZGaio-i5dpKKjKCSeSufmn6T8pi9lDcFnvSyq0,2324
770
+ pip/_vendor/truststore/_ssl_constants.py,sha256=NUD4fVKdSD02ri7-db0tnO0VqLP9aHuzmStcW7tAl08,1130
771
+ pip/_vendor/truststore/_windows.py,sha256=rAHyKYD8M7t-bXfG8VgOVa3TpfhVhbt4rZQlO45YuP8,17993
772
+ pip/_vendor/truststore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
773
+ pip/_vendor/typing_extensions.py,sha256=78hFl0HpDY-ylHUVCnWdU5nTHxUP2-S-3wEZk6CQmLk,134499
774
+ pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333
775
+ pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc,,
776
+ pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc,,
777
+ pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc,,
778
+ pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc,,
779
+ pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc,,
780
+ pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc,,
781
+ pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc,,
782
+ pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc,,
783
+ pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc,,
784
+ pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc,,
785
+ pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc,,
786
+ pip/_vendor/urllib3/_collections.py,sha256=pyASJJhW7wdOpqJj9QJA8FyGRfr8E8uUUhqUvhF0728,11372
787
+ pip/_vendor/urllib3/_version.py,sha256=t9wGB6ooOTXXgiY66K1m6BZS1CJyXHAU8EoWDTe6Shk,64
788
+ pip/_vendor/urllib3/connection.py,sha256=ttIA909BrbTUzwkqEe_TzZVh4JOOj7g61Ysei2mrwGg,20314
789
+ pip/_vendor/urllib3/connectionpool.py,sha256=e2eiAwNbFNCKxj4bwDKNK-w7HIdSz3OmMxU_TIt-evQ,40408
790
+ pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
791
+ pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc,,
792
+ pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc,,
793
+ pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc,,
794
+ pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc,,
795
+ pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc,,
796
+ pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc,,
797
+ pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc,,
798
+ pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957
799
+ pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
800
+ pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc,,
801
+ pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc,,
802
+ pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc,,
803
+ pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632
804
+ pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922
805
+ pip/_vendor/urllib3/contrib/appengine.py,sha256=VR68eAVE137lxTgjBDwCna5UiBZTOKa01Aj_-5BaCz4,11036
806
+ pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=NlfkW7WMdW8ziqudopjHoW299og1BTWi0IeIibquFwk,4528
807
+ pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=hDJh4MhyY_p-oKlFcYcQaVQRDv6GMmBGuW9yjxyeejM,17081
808
+ pip/_vendor/urllib3/contrib/securetransport.py,sha256=Fef1IIUUFHqpevzXiDPbIGkDKchY2FVKeVeLGR1Qq3g,34446
809
+ pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097
810
+ pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217
811
+ pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579
812
+ pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440
813
+ pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
814
+ pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc,,
815
+ pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc,,
816
+ pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
817
+ pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc,,
818
+ pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc,,
819
+ pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc,,
820
+ pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417
821
+ pip/_vendor/urllib3/packages/backports/weakref_finalize.py,sha256=tRCal5OAhNSRyb0DhHp-38AtIlCsRP8BxF3NX-6rqIA,5343
822
+ pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665
823
+ pip/_vendor/urllib3/poolmanager.py,sha256=aWyhXRtNO4JUnCSVVqKTKQd8EXTvUm1VN9pgs2bcONo,19990
824
+ pip/_vendor/urllib3/request.py,sha256=YTWFNr7QIwh7E1W9dde9LM77v2VWTJ5V78XuTTw7D1A,6691
825
+ pip/_vendor/urllib3/response.py,sha256=fmDJAFkG71uFTn-sVSTh2Iw0WmcXQYqkbRjihvwBjU8,30641
826
+ pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155
827
+ pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc,,
828
+ pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc,,
829
+ pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc,,
830
+ pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc,,
831
+ pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc,,
832
+ pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc,,
833
+ pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc,,
834
+ pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc,,
835
+ pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc,,
836
+ pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc,,
837
+ pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc,,
838
+ pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc,,
839
+ pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc,,
840
+ pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901
841
+ pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605
842
+ pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498
843
+ pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997
844
+ pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510
845
+ pip/_vendor/urllib3/util/retry.py,sha256=6ENvOZ8PBDzh8kgixpql9lIrb2dxH-k7ZmBanJF2Ng4,22050
846
+ pip/_vendor/urllib3/util/ssl_.py,sha256=QDuuTxPSCj1rYtZ4xpD7Ux-r20TD50aHyqKyhQ7Bq4A,17460
847
+ pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758
848
+ pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895
849
+ pip/_vendor/urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168
850
+ pip/_vendor/urllib3/util/url.py,sha256=lCAE7M5myA8EDdW0sJuyyZhVB9K_j38ljWhHAnFaWoE,14296
851
+ pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403
852
+ pip/_vendor/vendor.txt,sha256=43152uDtpsunEE29vmLqqKZUosdrbvzIFkzscLB55Cg,332
853
+ pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286
.venv/Lib/site-packages/pip-24.3.1.dist-info/REQUESTED ADDED
File without changes
.venv/Lib/site-packages/pip-24.3.1.dist-info/WHEEL ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (75.2.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
.venv/Lib/site-packages/pip-24.3.1.dist-info/entry_points.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ [console_scripts]
2
+ pip = pip._internal.cli.main:main
3
+ pip3 = pip._internal.cli.main:main
.venv/Lib/site-packages/pip-24.3.1.dist-info/top_level.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
.venv/Lib/site-packages/pip/__init__.py ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import List, Optional
2
+
3
+ __version__ = "24.3.1"
4
+
5
+
6
+ def main(args: Optional[List[str]] = None) -> int:
7
+ """This is an internal API only meant for use by pip's own console scripts.
8
+
9
+ For additional details, see https://github.com/pypa/pip/issues/7498.
10
+ """
11
+ from pip._internal.utils.entrypoints import _wrapper
12
+
13
+ return _wrapper(args)
.venv/Lib/site-packages/pip/__main__.py ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import sys
3
+
4
+ # Remove '' and current working directory from the first entry
5
+ # of sys.path, if present to avoid using current directory
6
+ # in pip commands check, freeze, install, list and show,
7
+ # when invoked as python -m pip <command>
8
+ if sys.path[0] in ("", os.getcwd()):
9
+ sys.path.pop(0)
10
+
11
+ # If we are running from a wheel, add the wheel to sys.path
12
+ # This allows the usage python pip-*.whl/pip install pip-*.whl
13
+ if __package__ == "":
14
+ # __file__ is pip-*.whl/pip/__main__.py
15
+ # first dirname call strips of '/__main__.py', second strips off '/pip'
16
+ # Resulting path is the name of the wheel itself
17
+ # Add that to sys.path so we can import pip
18
+ path = os.path.dirname(os.path.dirname(__file__))
19
+ sys.path.insert(0, path)
20
+
21
+ if __name__ == "__main__":
22
+ from pip._internal.cli.main import main as _main
23
+
24
+ sys.exit(_main())
.venv/Lib/site-packages/pip/__pip-runner__.py ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Execute exactly this copy of pip, within a different environment.
2
+
3
+ This file is named as it is, to ensure that this module can't be imported via
4
+ an import statement.
5
+ """
6
+
7
+ # /!\ This version compatibility check section must be Python 2 compatible. /!\
8
+
9
+ import sys
10
+
11
+ # Copied from pyproject.toml
12
+ PYTHON_REQUIRES = (3, 8)
13
+
14
+
15
+ def version_str(version): # type: ignore
16
+ return ".".join(str(v) for v in version)
17
+
18
+
19
+ if sys.version_info[:2] < PYTHON_REQUIRES:
20
+ raise SystemExit(
21
+ "This version of pip does not support python {} (requires >={}).".format(
22
+ version_str(sys.version_info[:2]), version_str(PYTHON_REQUIRES)
23
+ )
24
+ )
25
+
26
+ # From here on, we can use Python 3 features, but the syntax must remain
27
+ # Python 2 compatible.
28
+
29
+ import runpy # noqa: E402
30
+ from importlib.machinery import PathFinder # noqa: E402
31
+ from os.path import dirname # noqa: E402
32
+
33
+ PIP_SOURCES_ROOT = dirname(dirname(__file__))
34
+
35
+
36
+ class PipImportRedirectingFinder:
37
+ @classmethod
38
+ def find_spec(self, fullname, path=None, target=None): # type: ignore
39
+ if fullname != "pip":
40
+ return None
41
+
42
+ spec = PathFinder.find_spec(fullname, [PIP_SOURCES_ROOT], target)
43
+ assert spec, (PIP_SOURCES_ROOT, fullname)
44
+ return spec
45
+
46
+
47
+ sys.meta_path.insert(0, PipImportRedirectingFinder())
48
+
49
+ assert __name__ == "__main__", "Cannot run __pip-runner__.py as a non-main module"
50
+ runpy.run_module("pip", run_name="__main__", alter_sys=True)
.venv/Lib/site-packages/pip/__pycache__/__init__.cpython-312.pyc ADDED
Binary file (686 Bytes). View file
 
.venv/Lib/site-packages/pip/__pycache__/__main__.cpython-312.pyc ADDED
Binary file (840 Bytes). View file
 
.venv/Lib/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc ADDED
Binary file (2.2 kB). View file
 
.venv/Lib/site-packages/pip/_internal/__init__.py ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import List, Optional
2
+
3
+ from pip._internal.utils import _log
4
+
5
+ # init_logging() must be called before any call to logging.getLogger()
6
+ # which happens at import of most modules.
7
+ _log.init_logging()
8
+
9
+
10
+ def main(args: Optional[List[str]] = None) -> int:
11
+ """This is preserved for old console scripts that may still be referencing
12
+ it.
13
+
14
+ For additional details, see https://github.com/pypa/pip/issues/7498.
15
+ """
16
+ from pip._internal.utils.entrypoints import _wrapper
17
+
18
+ return _wrapper(args)
.venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc ADDED
Binary file (786 Bytes). View file
 
.venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc ADDED
Binary file (14.5 kB). View file
 
.venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc ADDED
Binary file (12.7 kB). View file
 
.venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc ADDED
Binary file (17.6 kB). View file
 
.venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc ADDED
Binary file (36.8 kB). View file
 
.venv/Lib/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc ADDED
Binary file (669 Bytes). View file
 
.venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc ADDED
Binary file (5.12 kB). View file
 
.venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc ADDED
Binary file (10.2 kB). View file
 
.venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc ADDED
Binary file (13.6 kB). View file
 
.venv/Lib/site-packages/pip/_internal/build_env.py ADDED
@@ -0,0 +1,319 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Build Environment used for isolation during sdist building
2
+ """
3
+
4
+ import logging
5
+ import os
6
+ import pathlib
7
+ import site
8
+ import sys
9
+ import textwrap
10
+ from collections import OrderedDict
11
+ from types import TracebackType
12
+ from typing import TYPE_CHECKING, Iterable, List, Optional, Set, Tuple, Type, Union
13
+
14
+ from pip._vendor.certifi import where
15
+ from pip._vendor.packaging.version import Version
16
+
17
+ from pip import __file__ as pip_location
18
+ from pip._internal.cli.spinners import open_spinner
19
+ from pip._internal.locations import get_platlib, get_purelib, get_scheme
20
+ from pip._internal.metadata import get_default_environment, get_environment
21
+ from pip._internal.utils.logging import VERBOSE
22
+ from pip._internal.utils.packaging import get_requirement
23
+ from pip._internal.utils.subprocess import call_subprocess
24
+ from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
25
+
26
+ if TYPE_CHECKING:
27
+ from pip._internal.index.package_finder import PackageFinder
28
+
29
+ logger = logging.getLogger(__name__)
30
+
31
+
32
+ def _dedup(a: str, b: str) -> Union[Tuple[str], Tuple[str, str]]:
33
+ return (a, b) if a != b else (a,)
34
+
35
+
36
+ class _Prefix:
37
+ def __init__(self, path: str) -> None:
38
+ self.path = path
39
+ self.setup = False
40
+ scheme = get_scheme("", prefix=path)
41
+ self.bin_dir = scheme.scripts
42
+ self.lib_dirs = _dedup(scheme.purelib, scheme.platlib)
43
+
44
+
45
+ def get_runnable_pip() -> str:
46
+ """Get a file to pass to a Python executable, to run the currently-running pip.
47
+
48
+ This is used to run a pip subprocess, for installing requirements into the build
49
+ environment.
50
+ """
51
+ source = pathlib.Path(pip_location).resolve().parent
52
+
53
+ if not source.is_dir():
54
+ # This would happen if someone is using pip from inside a zip file. In that
55
+ # case, we can use that directly.
56
+ return str(source)
57
+
58
+ return os.fsdecode(source / "__pip-runner__.py")
59
+
60
+
61
+ def _get_system_sitepackages() -> Set[str]:
62
+ """Get system site packages
63
+
64
+ Usually from site.getsitepackages,
65
+ but fallback on `get_purelib()/get_platlib()` if unavailable
66
+ (e.g. in a virtualenv created by virtualenv<20)
67
+
68
+ Returns normalized set of strings.
69
+ """
70
+ if hasattr(site, "getsitepackages"):
71
+ system_sites = site.getsitepackages()
72
+ else:
73
+ # virtualenv < 20 overwrites site.py without getsitepackages
74
+ # fallback on get_purelib/get_platlib.
75
+ # this is known to miss things, but shouldn't in the cases
76
+ # where getsitepackages() has been removed (inside a virtualenv)
77
+ system_sites = [get_purelib(), get_platlib()]
78
+ return {os.path.normcase(path) for path in system_sites}
79
+
80
+
81
+ class BuildEnvironment:
82
+ """Creates and manages an isolated environment to install build deps"""
83
+
84
+ def __init__(self) -> None:
85
+ temp_dir = TempDirectory(kind=tempdir_kinds.BUILD_ENV, globally_managed=True)
86
+
87
+ self._prefixes = OrderedDict(
88
+ (name, _Prefix(os.path.join(temp_dir.path, name)))
89
+ for name in ("normal", "overlay")
90
+ )
91
+
92
+ self._bin_dirs: List[str] = []
93
+ self._lib_dirs: List[str] = []
94
+ for prefix in reversed(list(self._prefixes.values())):
95
+ self._bin_dirs.append(prefix.bin_dir)
96
+ self._lib_dirs.extend(prefix.lib_dirs)
97
+
98
+ # Customize site to:
99
+ # - ensure .pth files are honored
100
+ # - prevent access to system site packages
101
+ system_sites = _get_system_sitepackages()
102
+
103
+ self._site_dir = os.path.join(temp_dir.path, "site")
104
+ if not os.path.exists(self._site_dir):
105
+ os.mkdir(self._site_dir)
106
+ with open(
107
+ os.path.join(self._site_dir, "sitecustomize.py"), "w", encoding="utf-8"
108
+ ) as fp:
109
+ fp.write(
110
+ textwrap.dedent(
111
+ """
112
+ import os, site, sys
113
+
114
+ # First, drop system-sites related paths.
115
+ original_sys_path = sys.path[:]
116
+ known_paths = set()
117
+ for path in {system_sites!r}:
118
+ site.addsitedir(path, known_paths=known_paths)
119
+ system_paths = set(
120
+ os.path.normcase(path)
121
+ for path in sys.path[len(original_sys_path):]
122
+ )
123
+ original_sys_path = [
124
+ path for path in original_sys_path
125
+ if os.path.normcase(path) not in system_paths
126
+ ]
127
+ sys.path = original_sys_path
128
+
129
+ # Second, add lib directories.
130
+ # ensuring .pth file are processed.
131
+ for path in {lib_dirs!r}:
132
+ assert not path in sys.path
133
+ site.addsitedir(path)
134
+ """
135
+ ).format(system_sites=system_sites, lib_dirs=self._lib_dirs)
136
+ )
137
+
138
+ def __enter__(self) -> None:
139
+ self._save_env = {
140
+ name: os.environ.get(name, None)
141
+ for name in ("PATH", "PYTHONNOUSERSITE", "PYTHONPATH")
142
+ }
143
+
144
+ path = self._bin_dirs[:]
145
+ old_path = self._save_env["PATH"]
146
+ if old_path:
147
+ path.extend(old_path.split(os.pathsep))
148
+
149
+ pythonpath = [self._site_dir]
150
+
151
+ os.environ.update(
152
+ {
153
+ "PATH": os.pathsep.join(path),
154
+ "PYTHONNOUSERSITE": "1",
155
+ "PYTHONPATH": os.pathsep.join(pythonpath),
156
+ }
157
+ )
158
+
159
+ def __exit__(
160
+ self,
161
+ exc_type: Optional[Type[BaseException]],
162
+ exc_val: Optional[BaseException],
163
+ exc_tb: Optional[TracebackType],
164
+ ) -> None:
165
+ for varname, old_value in self._save_env.items():
166
+ if old_value is None:
167
+ os.environ.pop(varname, None)
168
+ else:
169
+ os.environ[varname] = old_value
170
+
171
+ def check_requirements(
172
+ self, reqs: Iterable[str]
173
+ ) -> Tuple[Set[Tuple[str, str]], Set[str]]:
174
+ """Return 2 sets:
175
+ - conflicting requirements: set of (installed, wanted) reqs tuples
176
+ - missing requirements: set of reqs
177
+ """
178
+ missing = set()
179
+ conflicting = set()
180
+ if reqs:
181
+ env = (
182
+ get_environment(self._lib_dirs)
183
+ if hasattr(self, "_lib_dirs")
184
+ else get_default_environment()
185
+ )
186
+ for req_str in reqs:
187
+ req = get_requirement(req_str)
188
+ # We're explicitly evaluating with an empty extra value, since build
189
+ # environments are not provided any mechanism to select specific extras.
190
+ if req.marker is not None and not req.marker.evaluate({"extra": ""}):
191
+ continue
192
+ dist = env.get_distribution(req.name)
193
+ if not dist:
194
+ missing.add(req_str)
195
+ continue
196
+ if isinstance(dist.version, Version):
197
+ installed_req_str = f"{req.name}=={dist.version}"
198
+ else:
199
+ installed_req_str = f"{req.name}==={dist.version}"
200
+ if not req.specifier.contains(dist.version, prereleases=True):
201
+ conflicting.add((installed_req_str, req_str))
202
+ # FIXME: Consider direct URL?
203
+ return conflicting, missing
204
+
205
+ def install_requirements(
206
+ self,
207
+ finder: "PackageFinder",
208
+ requirements: Iterable[str],
209
+ prefix_as_string: str,
210
+ *,
211
+ kind: str,
212
+ ) -> None:
213
+ prefix = self._prefixes[prefix_as_string]
214
+ assert not prefix.setup
215
+ prefix.setup = True
216
+ if not requirements:
217
+ return
218
+ self._install_requirements(
219
+ get_runnable_pip(),
220
+ finder,
221
+ requirements,
222
+ prefix,
223
+ kind=kind,
224
+ )
225
+
226
+ @staticmethod
227
+ def _install_requirements(
228
+ pip_runnable: str,
229
+ finder: "PackageFinder",
230
+ requirements: Iterable[str],
231
+ prefix: _Prefix,
232
+ *,
233
+ kind: str,
234
+ ) -> None:
235
+ args: List[str] = [
236
+ sys.executable,
237
+ pip_runnable,
238
+ "install",
239
+ "--ignore-installed",
240
+ "--no-user",
241
+ "--prefix",
242
+ prefix.path,
243
+ "--no-warn-script-location",
244
+ "--disable-pip-version-check",
245
+ # The prefix specified two lines above, thus
246
+ # target from config file or env var should be ignored
247
+ "--target",
248
+ "",
249
+ ]
250
+ if logger.getEffectiveLevel() <= logging.DEBUG:
251
+ args.append("-vv")
252
+ elif logger.getEffectiveLevel() <= VERBOSE:
253
+ args.append("-v")
254
+ for format_control in ("no_binary", "only_binary"):
255
+ formats = getattr(finder.format_control, format_control)
256
+ args.extend(
257
+ (
258
+ "--" + format_control.replace("_", "-"),
259
+ ",".join(sorted(formats or {":none:"})),
260
+ )
261
+ )
262
+
263
+ index_urls = finder.index_urls
264
+ if index_urls:
265
+ args.extend(["-i", index_urls[0]])
266
+ for extra_index in index_urls[1:]:
267
+ args.extend(["--extra-index-url", extra_index])
268
+ else:
269
+ args.append("--no-index")
270
+ for link in finder.find_links:
271
+ args.extend(["--find-links", link])
272
+
273
+ for host in finder.trusted_hosts:
274
+ args.extend(["--trusted-host", host])
275
+ if finder.allow_all_prereleases:
276
+ args.append("--pre")
277
+ if finder.prefer_binary:
278
+ args.append("--prefer-binary")
279
+ args.append("--")
280
+ args.extend(requirements)
281
+ extra_environ = {"_PIP_STANDALONE_CERT": where()}
282
+ with open_spinner(f"Installing {kind}") as spinner:
283
+ call_subprocess(
284
+ args,
285
+ command_desc=f"pip subprocess to install {kind}",
286
+ spinner=spinner,
287
+ extra_environ=extra_environ,
288
+ )
289
+
290
+
291
+ class NoOpBuildEnvironment(BuildEnvironment):
292
+ """A no-op drop-in replacement for BuildEnvironment"""
293
+
294
+ def __init__(self) -> None:
295
+ pass
296
+
297
+ def __enter__(self) -> None:
298
+ pass
299
+
300
+ def __exit__(
301
+ self,
302
+ exc_type: Optional[Type[BaseException]],
303
+ exc_val: Optional[BaseException],
304
+ exc_tb: Optional[TracebackType],
305
+ ) -> None:
306
+ pass
307
+
308
+ def cleanup(self) -> None:
309
+ pass
310
+
311
+ def install_requirements(
312
+ self,
313
+ finder: "PackageFinder",
314
+ requirements: Iterable[str],
315
+ prefix_as_string: str,
316
+ *,
317
+ kind: str,
318
+ ) -> None:
319
+ raise NotImplementedError()
.venv/Lib/site-packages/pip/_internal/cache.py ADDED
@@ -0,0 +1,290 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Cache Management
2
+ """
3
+
4
+ import hashlib
5
+ import json
6
+ import logging
7
+ import os
8
+ from pathlib import Path
9
+ from typing import Any, Dict, List, Optional
10
+
11
+ from pip._vendor.packaging.tags import Tag, interpreter_name, interpreter_version
12
+ from pip._vendor.packaging.utils import canonicalize_name
13
+
14
+ from pip._internal.exceptions import InvalidWheelFilename
15
+ from pip._internal.models.direct_url import DirectUrl
16
+ from pip._internal.models.link import Link
17
+ from pip._internal.models.wheel import Wheel
18
+ from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
19
+ from pip._internal.utils.urls import path_to_url
20
+
21
+ logger = logging.getLogger(__name__)
22
+
23
+ ORIGIN_JSON_NAME = "origin.json"
24
+
25
+
26
+ def _hash_dict(d: Dict[str, str]) -> str:
27
+ """Return a stable sha224 of a dictionary."""
28
+ s = json.dumps(d, sort_keys=True, separators=(",", ":"), ensure_ascii=True)
29
+ return hashlib.sha224(s.encode("ascii")).hexdigest()
30
+
31
+
32
+ class Cache:
33
+ """An abstract class - provides cache directories for data from links
34
+
35
+ :param cache_dir: The root of the cache.
36
+ """
37
+
38
+ def __init__(self, cache_dir: str) -> None:
39
+ super().__init__()
40
+ assert not cache_dir or os.path.isabs(cache_dir)
41
+ self.cache_dir = cache_dir or None
42
+
43
+ def _get_cache_path_parts(self, link: Link) -> List[str]:
44
+ """Get parts of part that must be os.path.joined with cache_dir"""
45
+
46
+ # We want to generate an url to use as our cache key, we don't want to
47
+ # just reuse the URL because it might have other items in the fragment
48
+ # and we don't care about those.
49
+ key_parts = {"url": link.url_without_fragment}
50
+ if link.hash_name is not None and link.hash is not None:
51
+ key_parts[link.hash_name] = link.hash
52
+ if link.subdirectory_fragment:
53
+ key_parts["subdirectory"] = link.subdirectory_fragment
54
+
55
+ # Include interpreter name, major and minor version in cache key
56
+ # to cope with ill-behaved sdists that build a different wheel
57
+ # depending on the python version their setup.py is being run on,
58
+ # and don't encode the difference in compatibility tags.
59
+ # https://github.com/pypa/pip/issues/7296
60
+ key_parts["interpreter_name"] = interpreter_name()
61
+ key_parts["interpreter_version"] = interpreter_version()
62
+
63
+ # Encode our key url with sha224, we'll use this because it has similar
64
+ # security properties to sha256, but with a shorter total output (and
65
+ # thus less secure). However the differences don't make a lot of
66
+ # difference for our use case here.
67
+ hashed = _hash_dict(key_parts)
68
+
69
+ # We want to nest the directories some to prevent having a ton of top
70
+ # level directories where we might run out of sub directories on some
71
+ # FS.
72
+ parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]]
73
+
74
+ return parts
75
+
76
+ def _get_candidates(self, link: Link, canonical_package_name: str) -> List[Any]:
77
+ can_not_cache = not self.cache_dir or not canonical_package_name or not link
78
+ if can_not_cache:
79
+ return []
80
+
81
+ path = self.get_path_for_link(link)
82
+ if os.path.isdir(path):
83
+ return [(candidate, path) for candidate in os.listdir(path)]
84
+ return []
85
+
86
+ def get_path_for_link(self, link: Link) -> str:
87
+ """Return a directory to store cached items in for link."""
88
+ raise NotImplementedError()
89
+
90
+ def get(
91
+ self,
92
+ link: Link,
93
+ package_name: Optional[str],
94
+ supported_tags: List[Tag],
95
+ ) -> Link:
96
+ """Returns a link to a cached item if it exists, otherwise returns the
97
+ passed link.
98
+ """
99
+ raise NotImplementedError()
100
+
101
+
102
+ class SimpleWheelCache(Cache):
103
+ """A cache of wheels for future installs."""
104
+
105
+ def __init__(self, cache_dir: str) -> None:
106
+ super().__init__(cache_dir)
107
+
108
+ def get_path_for_link(self, link: Link) -> str:
109
+ """Return a directory to store cached wheels for link
110
+
111
+ Because there are M wheels for any one sdist, we provide a directory
112
+ to cache them in, and then consult that directory when looking up
113
+ cache hits.
114
+
115
+ We only insert things into the cache if they have plausible version
116
+ numbers, so that we don't contaminate the cache with things that were
117
+ not unique. E.g. ./package might have dozens of installs done for it
118
+ and build a version of 0.0...and if we built and cached a wheel, we'd
119
+ end up using the same wheel even if the source has been edited.
120
+
121
+ :param link: The link of the sdist for which this will cache wheels.
122
+ """
123
+ parts = self._get_cache_path_parts(link)
124
+ assert self.cache_dir
125
+ # Store wheels within the root cache_dir
126
+ return os.path.join(self.cache_dir, "wheels", *parts)
127
+
128
+ def get(
129
+ self,
130
+ link: Link,
131
+ package_name: Optional[str],
132
+ supported_tags: List[Tag],
133
+ ) -> Link:
134
+ candidates = []
135
+
136
+ if not package_name:
137
+ return link
138
+
139
+ canonical_package_name = canonicalize_name(package_name)
140
+ for wheel_name, wheel_dir in self._get_candidates(link, canonical_package_name):
141
+ try:
142
+ wheel = Wheel(wheel_name)
143
+ except InvalidWheelFilename:
144
+ continue
145
+ if canonicalize_name(wheel.name) != canonical_package_name:
146
+ logger.debug(
147
+ "Ignoring cached wheel %s for %s as it "
148
+ "does not match the expected distribution name %s.",
149
+ wheel_name,
150
+ link,
151
+ package_name,
152
+ )
153
+ continue
154
+ if not wheel.supported(supported_tags):
155
+ # Built for a different python/arch/etc
156
+ continue
157
+ candidates.append(
158
+ (
159
+ wheel.support_index_min(supported_tags),
160
+ wheel_name,
161
+ wheel_dir,
162
+ )
163
+ )
164
+
165
+ if not candidates:
166
+ return link
167
+
168
+ _, wheel_name, wheel_dir = min(candidates)
169
+ return Link(path_to_url(os.path.join(wheel_dir, wheel_name)))
170
+
171
+
172
+ class EphemWheelCache(SimpleWheelCache):
173
+ """A SimpleWheelCache that creates it's own temporary cache directory"""
174
+
175
+ def __init__(self) -> None:
176
+ self._temp_dir = TempDirectory(
177
+ kind=tempdir_kinds.EPHEM_WHEEL_CACHE,
178
+ globally_managed=True,
179
+ )
180
+
181
+ super().__init__(self._temp_dir.path)
182
+
183
+
184
+ class CacheEntry:
185
+ def __init__(
186
+ self,
187
+ link: Link,
188
+ persistent: bool,
189
+ ):
190
+ self.link = link
191
+ self.persistent = persistent
192
+ self.origin: Optional[DirectUrl] = None
193
+ origin_direct_url_path = Path(self.link.file_path).parent / ORIGIN_JSON_NAME
194
+ if origin_direct_url_path.exists():
195
+ try:
196
+ self.origin = DirectUrl.from_json(
197
+ origin_direct_url_path.read_text(encoding="utf-8")
198
+ )
199
+ except Exception as e:
200
+ logger.warning(
201
+ "Ignoring invalid cache entry origin file %s for %s (%s)",
202
+ origin_direct_url_path,
203
+ link.filename,
204
+ e,
205
+ )
206
+
207
+
208
+ class WheelCache(Cache):
209
+ """Wraps EphemWheelCache and SimpleWheelCache into a single Cache
210
+
211
+ This Cache allows for gracefully degradation, using the ephem wheel cache
212
+ when a certain link is not found in the simple wheel cache first.
213
+ """
214
+
215
+ def __init__(self, cache_dir: str) -> None:
216
+ super().__init__(cache_dir)
217
+ self._wheel_cache = SimpleWheelCache(cache_dir)
218
+ self._ephem_cache = EphemWheelCache()
219
+
220
+ def get_path_for_link(self, link: Link) -> str:
221
+ return self._wheel_cache.get_path_for_link(link)
222
+
223
+ def get_ephem_path_for_link(self, link: Link) -> str:
224
+ return self._ephem_cache.get_path_for_link(link)
225
+
226
+ def get(
227
+ self,
228
+ link: Link,
229
+ package_name: Optional[str],
230
+ supported_tags: List[Tag],
231
+ ) -> Link:
232
+ cache_entry = self.get_cache_entry(link, package_name, supported_tags)
233
+ if cache_entry is None:
234
+ return link
235
+ return cache_entry.link
236
+
237
+ def get_cache_entry(
238
+ self,
239
+ link: Link,
240
+ package_name: Optional[str],
241
+ supported_tags: List[Tag],
242
+ ) -> Optional[CacheEntry]:
243
+ """Returns a CacheEntry with a link to a cached item if it exists or
244
+ None. The cache entry indicates if the item was found in the persistent
245
+ or ephemeral cache.
246
+ """
247
+ retval = self._wheel_cache.get(
248
+ link=link,
249
+ package_name=package_name,
250
+ supported_tags=supported_tags,
251
+ )
252
+ if retval is not link:
253
+ return CacheEntry(retval, persistent=True)
254
+
255
+ retval = self._ephem_cache.get(
256
+ link=link,
257
+ package_name=package_name,
258
+ supported_tags=supported_tags,
259
+ )
260
+ if retval is not link:
261
+ return CacheEntry(retval, persistent=False)
262
+
263
+ return None
264
+
265
+ @staticmethod
266
+ def record_download_origin(cache_dir: str, download_info: DirectUrl) -> None:
267
+ origin_path = Path(cache_dir) / ORIGIN_JSON_NAME
268
+ if origin_path.exists():
269
+ try:
270
+ origin = DirectUrl.from_json(origin_path.read_text(encoding="utf-8"))
271
+ except Exception as e:
272
+ logger.warning(
273
+ "Could not read origin file %s in cache entry (%s). "
274
+ "Will attempt to overwrite it.",
275
+ origin_path,
276
+ e,
277
+ )
278
+ else:
279
+ # TODO: use DirectUrl.equivalent when
280
+ # https://github.com/pypa/pip/pull/10564 is merged.
281
+ if origin.url != download_info.url:
282
+ logger.warning(
283
+ "Origin URL %s in cache entry %s does not match download URL "
284
+ "%s. This is likely a pip bug or a cache corruption issue. "
285
+ "Will overwrite it with the new value.",
286
+ origin.url,
287
+ cache_dir,
288
+ download_info.url,
289
+ )
290
+ origin_path.write_text(download_info.to_json(), encoding="utf-8")
.venv/Lib/site-packages/pip/_internal/cli/__init__.py ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ """Subpackage containing all of pip's command line interface related code
2
+ """
3
+
4
+ # This file intentionally does not import submodules
.venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc ADDED
Binary file (277 Bytes). View file
 
.venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc ADDED
Binary file (8.61 kB). View file
 
.venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc ADDED
Binary file (10.2 kB). View file
 
.venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc ADDED
Binary file (30.4 kB). View file
 
.venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc ADDED
Binary file (1.77 kB). View file
 
.venv/Lib/site-packages/pip/_internal/cli/__pycache__/index_command.cpython-312.pyc ADDED
Binary file (7.12 kB). View file
 
.venv/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc ADDED
Binary file (2.3 kB). View file
 
.venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc ADDED
Binary file (4.91 kB). View file
 
.venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc ADDED
Binary file (15 kB). View file
 
.venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc ADDED
Binary file (3.84 kB). View file
 
.venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc ADDED
Binary file (12.2 kB). View file
 
.venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc ADDED
Binary file (7.83 kB). View file
 
.venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc ADDED
Binary file (374 Bytes). View file
 
.venv/Lib/site-packages/pip/_internal/cli/autocompletion.py ADDED
@@ -0,0 +1,176 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Logic that powers autocompletion installed by ``pip completion``.
2
+ """
3
+
4
+ import optparse
5
+ import os
6
+ import sys
7
+ from itertools import chain
8
+ from typing import Any, Iterable, List, Optional
9
+
10
+ from pip._internal.cli.main_parser import create_main_parser
11
+ from pip._internal.commands import commands_dict, create_command
12
+ from pip._internal.metadata import get_default_environment
13
+
14
+
15
+ def autocomplete() -> None:
16
+ """Entry Point for completion of main and subcommand options."""
17
+ # Don't complete if user hasn't sourced bash_completion file.
18
+ if "PIP_AUTO_COMPLETE" not in os.environ:
19
+ return
20
+ # Don't complete if autocompletion environment variables
21
+ # are not present
22
+ if not os.environ.get("COMP_WORDS") or not os.environ.get("COMP_CWORD"):
23
+ return
24
+ cwords = os.environ["COMP_WORDS"].split()[1:]
25
+ cword = int(os.environ["COMP_CWORD"])
26
+ try:
27
+ current = cwords[cword - 1]
28
+ except IndexError:
29
+ current = ""
30
+
31
+ parser = create_main_parser()
32
+ subcommands = list(commands_dict)
33
+ options = []
34
+
35
+ # subcommand
36
+ subcommand_name: Optional[str] = None
37
+ for word in cwords:
38
+ if word in subcommands:
39
+ subcommand_name = word
40
+ break
41
+ # subcommand options
42
+ if subcommand_name is not None:
43
+ # special case: 'help' subcommand has no options
44
+ if subcommand_name == "help":
45
+ sys.exit(1)
46
+ # special case: list locally installed dists for show and uninstall
47
+ should_list_installed = not current.startswith("-") and subcommand_name in [
48
+ "show",
49
+ "uninstall",
50
+ ]
51
+ if should_list_installed:
52
+ env = get_default_environment()
53
+ lc = current.lower()
54
+ installed = [
55
+ dist.canonical_name
56
+ for dist in env.iter_installed_distributions(local_only=True)
57
+ if dist.canonical_name.startswith(lc)
58
+ and dist.canonical_name not in cwords[1:]
59
+ ]
60
+ # if there are no dists installed, fall back to option completion
61
+ if installed:
62
+ for dist in installed:
63
+ print(dist)
64
+ sys.exit(1)
65
+
66
+ should_list_installables = (
67
+ not current.startswith("-") and subcommand_name == "install"
68
+ )
69
+ if should_list_installables:
70
+ for path in auto_complete_paths(current, "path"):
71
+ print(path)
72
+ sys.exit(1)
73
+
74
+ subcommand = create_command(subcommand_name)
75
+
76
+ for opt in subcommand.parser.option_list_all:
77
+ if opt.help != optparse.SUPPRESS_HELP:
78
+ options += [
79
+ (opt_str, opt.nargs) for opt_str in opt._long_opts + opt._short_opts
80
+ ]
81
+
82
+ # filter out previously specified options from available options
83
+ prev_opts = [x.split("=")[0] for x in cwords[1 : cword - 1]]
84
+ options = [(x, v) for (x, v) in options if x not in prev_opts]
85
+ # filter options by current input
86
+ options = [(k, v) for k, v in options if k.startswith(current)]
87
+ # get completion type given cwords and available subcommand options
88
+ completion_type = get_path_completion_type(
89
+ cwords,
90
+ cword,
91
+ subcommand.parser.option_list_all,
92
+ )
93
+ # get completion files and directories if ``completion_type`` is
94
+ # ``<file>``, ``<dir>`` or ``<path>``
95
+ if completion_type:
96
+ paths = auto_complete_paths(current, completion_type)
97
+ options = [(path, 0) for path in paths]
98
+ for option in options:
99
+ opt_label = option[0]
100
+ # append '=' to options which require args
101
+ if option[1] and option[0][:2] == "--":
102
+ opt_label += "="
103
+ print(opt_label)
104
+ else:
105
+ # show main parser options only when necessary
106
+
107
+ opts = [i.option_list for i in parser.option_groups]
108
+ opts.append(parser.option_list)
109
+ flattened_opts = chain.from_iterable(opts)
110
+ if current.startswith("-"):
111
+ for opt in flattened_opts:
112
+ if opt.help != optparse.SUPPRESS_HELP:
113
+ subcommands += opt._long_opts + opt._short_opts
114
+ else:
115
+ # get completion type given cwords and all available options
116
+ completion_type = get_path_completion_type(cwords, cword, flattened_opts)
117
+ if completion_type:
118
+ subcommands = list(auto_complete_paths(current, completion_type))
119
+
120
+ print(" ".join([x for x in subcommands if x.startswith(current)]))
121
+ sys.exit(1)
122
+
123
+
124
+ def get_path_completion_type(
125
+ cwords: List[str], cword: int, opts: Iterable[Any]
126
+ ) -> Optional[str]:
127
+ """Get the type of path completion (``file``, ``dir``, ``path`` or None)
128
+
129
+ :param cwords: same as the environmental variable ``COMP_WORDS``
130
+ :param cword: same as the environmental variable ``COMP_CWORD``
131
+ :param opts: The available options to check
132
+ :return: path completion type (``file``, ``dir``, ``path`` or None)
133
+ """
134
+ if cword < 2 or not cwords[cword - 2].startswith("-"):
135
+ return None
136
+ for opt in opts:
137
+ if opt.help == optparse.SUPPRESS_HELP:
138
+ continue
139
+ for o in str(opt).split("/"):
140
+ if cwords[cword - 2].split("=")[0] == o:
141
+ if not opt.metavar or any(
142
+ x in ("path", "file", "dir") for x in opt.metavar.split("/")
143
+ ):
144
+ return opt.metavar
145
+ return None
146
+
147
+
148
+ def auto_complete_paths(current: str, completion_type: str) -> Iterable[str]:
149
+ """If ``completion_type`` is ``file`` or ``path``, list all regular files
150
+ and directories starting with ``current``; otherwise only list directories
151
+ starting with ``current``.
152
+
153
+ :param current: The word to be completed
154
+ :param completion_type: path completion type(``file``, ``path`` or ``dir``)
155
+ :return: A generator of regular files and/or directories
156
+ """
157
+ directory, filename = os.path.split(current)
158
+ current_path = os.path.abspath(directory)
159
+ # Don't complete paths if they can't be accessed
160
+ if not os.access(current_path, os.R_OK):
161
+ return
162
+ filename = os.path.normcase(filename)
163
+ # list all files that start with ``filename``
164
+ file_list = (
165
+ x for x in os.listdir(current_path) if os.path.normcase(x).startswith(filename)
166
+ )
167
+ for f in file_list:
168
+ opt = os.path.join(current_path, f)
169
+ comp_file = os.path.normcase(os.path.join(directory, f))
170
+ # complete regular files when there is not ``<dir>`` after option
171
+ # complete directories when there is ``<file>``, ``<path>`` or
172
+ # ``<dir>``after option
173
+ if completion_type != "dir" and os.path.isfile(opt):
174
+ yield comp_file
175
+ elif os.path.isdir(opt):
176
+ yield os.path.join(comp_file, "")
.venv/Lib/site-packages/pip/_internal/cli/base_command.py ADDED
@@ -0,0 +1,231 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Base Command class, and related routines"""
2
+
3
+ import logging
4
+ import logging.config
5
+ import optparse
6
+ import os
7
+ import sys
8
+ import traceback
9
+ from optparse import Values
10
+ from typing import List, Optional, Tuple
11
+
12
+ from pip._vendor.rich import reconfigure
13
+ from pip._vendor.rich import traceback as rich_traceback
14
+
15
+ from pip._internal.cli import cmdoptions
16
+ from pip._internal.cli.command_context import CommandContextMixIn
17
+ from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter
18
+ from pip._internal.cli.status_codes import (
19
+ ERROR,
20
+ PREVIOUS_BUILD_DIR_ERROR,
21
+ UNKNOWN_ERROR,
22
+ VIRTUALENV_NOT_FOUND,
23
+ )
24
+ from pip._internal.exceptions import (
25
+ BadCommand,
26
+ CommandError,
27
+ DiagnosticPipError,
28
+ InstallationError,
29
+ NetworkConnectionError,
30
+ PreviousBuildDirError,
31
+ )
32
+ from pip._internal.utils.filesystem import check_path_owner
33
+ from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging
34
+ from pip._internal.utils.misc import get_prog, normalize_path
35
+ from pip._internal.utils.temp_dir import TempDirectoryTypeRegistry as TempDirRegistry
36
+ from pip._internal.utils.temp_dir import global_tempdir_manager, tempdir_registry
37
+ from pip._internal.utils.virtualenv import running_under_virtualenv
38
+
39
+ __all__ = ["Command"]
40
+
41
+ logger = logging.getLogger(__name__)
42
+
43
+
44
+ class Command(CommandContextMixIn):
45
+ usage: str = ""
46
+ ignore_require_venv: bool = False
47
+
48
+ def __init__(self, name: str, summary: str, isolated: bool = False) -> None:
49
+ super().__init__()
50
+
51
+ self.name = name
52
+ self.summary = summary
53
+ self.parser = ConfigOptionParser(
54
+ usage=self.usage,
55
+ prog=f"{get_prog()} {name}",
56
+ formatter=UpdatingDefaultsHelpFormatter(),
57
+ add_help_option=False,
58
+ name=name,
59
+ description=self.__doc__,
60
+ isolated=isolated,
61
+ )
62
+
63
+ self.tempdir_registry: Optional[TempDirRegistry] = None
64
+
65
+ # Commands should add options to this option group
66
+ optgroup_name = f"{self.name.capitalize()} Options"
67
+ self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name)
68
+
69
+ # Add the general options
70
+ gen_opts = cmdoptions.make_option_group(
71
+ cmdoptions.general_group,
72
+ self.parser,
73
+ )
74
+ self.parser.add_option_group(gen_opts)
75
+
76
+ self.add_options()
77
+
78
+ def add_options(self) -> None:
79
+ pass
80
+
81
+ def handle_pip_version_check(self, options: Values) -> None:
82
+ """
83
+ This is a no-op so that commands by default do not do the pip version
84
+ check.
85
+ """
86
+ # Make sure we do the pip version check if the index_group options
87
+ # are present.
88
+ assert not hasattr(options, "no_index")
89
+
90
+ def run(self, options: Values, args: List[str]) -> int:
91
+ raise NotImplementedError
92
+
93
+ def _run_wrapper(self, level_number: int, options: Values, args: List[str]) -> int:
94
+ def _inner_run() -> int:
95
+ try:
96
+ return self.run(options, args)
97
+ finally:
98
+ self.handle_pip_version_check(options)
99
+
100
+ if options.debug_mode:
101
+ rich_traceback.install(show_locals=True)
102
+ return _inner_run()
103
+
104
+ try:
105
+ status = _inner_run()
106
+ assert isinstance(status, int)
107
+ return status
108
+ except DiagnosticPipError as exc:
109
+ logger.error("%s", exc, extra={"rich": True})
110
+ logger.debug("Exception information:", exc_info=True)
111
+
112
+ return ERROR
113
+ except PreviousBuildDirError as exc:
114
+ logger.critical(str(exc))
115
+ logger.debug("Exception information:", exc_info=True)
116
+
117
+ return PREVIOUS_BUILD_DIR_ERROR
118
+ except (
119
+ InstallationError,
120
+ BadCommand,
121
+ NetworkConnectionError,
122
+ ) as exc:
123
+ logger.critical(str(exc))
124
+ logger.debug("Exception information:", exc_info=True)
125
+
126
+ return ERROR
127
+ except CommandError as exc:
128
+ logger.critical("%s", exc)
129
+ logger.debug("Exception information:", exc_info=True)
130
+
131
+ return ERROR
132
+ except BrokenStdoutLoggingError:
133
+ # Bypass our logger and write any remaining messages to
134
+ # stderr because stdout no longer works.
135
+ print("ERROR: Pipe to stdout was broken", file=sys.stderr)
136
+ if level_number <= logging.DEBUG:
137
+ traceback.print_exc(file=sys.stderr)
138
+
139
+ return ERROR
140
+ except KeyboardInterrupt:
141
+ logger.critical("Operation cancelled by user")
142
+ logger.debug("Exception information:", exc_info=True)
143
+
144
+ return ERROR
145
+ except BaseException:
146
+ logger.critical("Exception:", exc_info=True)
147
+
148
+ return UNKNOWN_ERROR
149
+
150
+ def parse_args(self, args: List[str]) -> Tuple[Values, List[str]]:
151
+ # factored out for testability
152
+ return self.parser.parse_args(args)
153
+
154
+ def main(self, args: List[str]) -> int:
155
+ try:
156
+ with self.main_context():
157
+ return self._main(args)
158
+ finally:
159
+ logging.shutdown()
160
+
161
+ def _main(self, args: List[str]) -> int:
162
+ # We must initialize this before the tempdir manager, otherwise the
163
+ # configuration would not be accessible by the time we clean up the
164
+ # tempdir manager.
165
+ self.tempdir_registry = self.enter_context(tempdir_registry())
166
+ # Intentionally set as early as possible so globally-managed temporary
167
+ # directories are available to the rest of the code.
168
+ self.enter_context(global_tempdir_manager())
169
+
170
+ options, args = self.parse_args(args)
171
+
172
+ # Set verbosity so that it can be used elsewhere.
173
+ self.verbosity = options.verbose - options.quiet
174
+
175
+ reconfigure(no_color=options.no_color)
176
+ level_number = setup_logging(
177
+ verbosity=self.verbosity,
178
+ no_color=options.no_color,
179
+ user_log_file=options.log,
180
+ )
181
+
182
+ always_enabled_features = set(options.features_enabled) & set(
183
+ cmdoptions.ALWAYS_ENABLED_FEATURES
184
+ )
185
+ if always_enabled_features:
186
+ logger.warning(
187
+ "The following features are always enabled: %s. ",
188
+ ", ".join(sorted(always_enabled_features)),
189
+ )
190
+
191
+ # Make sure that the --python argument isn't specified after the
192
+ # subcommand. We can tell, because if --python was specified,
193
+ # we should only reach this point if we're running in the created
194
+ # subprocess, which has the _PIP_RUNNING_IN_SUBPROCESS environment
195
+ # variable set.
196
+ if options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ:
197
+ logger.critical(
198
+ "The --python option must be placed before the pip subcommand name"
199
+ )
200
+ sys.exit(ERROR)
201
+
202
+ # TODO: Try to get these passing down from the command?
203
+ # without resorting to os.environ to hold these.
204
+ # This also affects isolated builds and it should.
205
+
206
+ if options.no_input:
207
+ os.environ["PIP_NO_INPUT"] = "1"
208
+
209
+ if options.exists_action:
210
+ os.environ["PIP_EXISTS_ACTION"] = " ".join(options.exists_action)
211
+
212
+ if options.require_venv and not self.ignore_require_venv:
213
+ # If a venv is required check if it can really be found
214
+ if not running_under_virtualenv():
215
+ logger.critical("Could not find an activated virtualenv (required).")
216
+ sys.exit(VIRTUALENV_NOT_FOUND)
217
+
218
+ if options.cache_dir:
219
+ options.cache_dir = normalize_path(options.cache_dir)
220
+ if not check_path_owner(options.cache_dir):
221
+ logger.warning(
222
+ "The directory '%s' or its parent directory is not owned "
223
+ "or is not writable by the current user. The cache "
224
+ "has been disabled. Check the permissions and owner of "
225
+ "that directory. If executing pip with sudo, you should "
226
+ "use sudo's -H flag.",
227
+ options.cache_dir,
228
+ )
229
+ options.cache_dir = None
230
+
231
+ return self._run_wrapper(level_number, options, args)
.venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py ADDED
@@ -0,0 +1,1075 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ shared options and groups
3
+
4
+ The principle here is to define options once, but *not* instantiate them
5
+ globally. One reason being that options with action='append' can carry state
6
+ between parses. pip parses general options twice internally, and shouldn't
7
+ pass on state. To be consistent, all options will follow this design.
8
+ """
9
+
10
+ # The following comment should be removed at some point in the future.
11
+ # mypy: strict-optional=False
12
+
13
+ import importlib.util
14
+ import logging
15
+ import os
16
+ import textwrap
17
+ from functools import partial
18
+ from optparse import SUPPRESS_HELP, Option, OptionGroup, OptionParser, Values
19
+ from textwrap import dedent
20
+ from typing import Any, Callable, Dict, Optional, Tuple
21
+
22
+ from pip._vendor.packaging.utils import canonicalize_name
23
+
24
+ from pip._internal.cli.parser import ConfigOptionParser
25
+ from pip._internal.exceptions import CommandError
26
+ from pip._internal.locations import USER_CACHE_DIR, get_src_prefix
27
+ from pip._internal.models.format_control import FormatControl
28
+ from pip._internal.models.index import PyPI
29
+ from pip._internal.models.target_python import TargetPython
30
+ from pip._internal.utils.hashes import STRONG_HASHES
31
+ from pip._internal.utils.misc import strtobool
32
+
33
+ logger = logging.getLogger(__name__)
34
+
35
+
36
+ def raise_option_error(parser: OptionParser, option: Option, msg: str) -> None:
37
+ """
38
+ Raise an option parsing error using parser.error().
39
+
40
+ Args:
41
+ parser: an OptionParser instance.
42
+ option: an Option instance.
43
+ msg: the error text.
44
+ """
45
+ msg = f"{option} error: {msg}"
46
+ msg = textwrap.fill(" ".join(msg.split()))
47
+ parser.error(msg)
48
+
49
+
50
+ def make_option_group(group: Dict[str, Any], parser: ConfigOptionParser) -> OptionGroup:
51
+ """
52
+ Return an OptionGroup object
53
+ group -- assumed to be dict with 'name' and 'options' keys
54
+ parser -- an optparse Parser
55
+ """
56
+ option_group = OptionGroup(parser, group["name"])
57
+ for option in group["options"]:
58
+ option_group.add_option(option())
59
+ return option_group
60
+
61
+
62
+ def check_dist_restriction(options: Values, check_target: bool = False) -> None:
63
+ """Function for determining if custom platform options are allowed.
64
+
65
+ :param options: The OptionParser options.
66
+ :param check_target: Whether or not to check if --target is being used.
67
+ """
68
+ dist_restriction_set = any(
69
+ [
70
+ options.python_version,
71
+ options.platforms,
72
+ options.abis,
73
+ options.implementation,
74
+ ]
75
+ )
76
+
77
+ binary_only = FormatControl(set(), {":all:"})
78
+ sdist_dependencies_allowed = (
79
+ options.format_control != binary_only and not options.ignore_dependencies
80
+ )
81
+
82
+ # Installations or downloads using dist restrictions must not combine
83
+ # source distributions and dist-specific wheels, as they are not
84
+ # guaranteed to be locally compatible.
85
+ if dist_restriction_set and sdist_dependencies_allowed:
86
+ raise CommandError(
87
+ "When restricting platform and interpreter constraints using "
88
+ "--python-version, --platform, --abi, or --implementation, "
89
+ "either --no-deps must be set, or --only-binary=:all: must be "
90
+ "set and --no-binary must not be set (or must be set to "
91
+ ":none:)."
92
+ )
93
+
94
+ if check_target:
95
+ if not options.dry_run and dist_restriction_set and not options.target_dir:
96
+ raise CommandError(
97
+ "Can not use any platform or abi specific options unless "
98
+ "installing via '--target' or using '--dry-run'"
99
+ )
100
+
101
+
102
+ def _path_option_check(option: Option, opt: str, value: str) -> str:
103
+ return os.path.expanduser(value)
104
+
105
+
106
+ def _package_name_option_check(option: Option, opt: str, value: str) -> str:
107
+ return canonicalize_name(value)
108
+
109
+
110
+ class PipOption(Option):
111
+ TYPES = Option.TYPES + ("path", "package_name")
112
+ TYPE_CHECKER = Option.TYPE_CHECKER.copy()
113
+ TYPE_CHECKER["package_name"] = _package_name_option_check
114
+ TYPE_CHECKER["path"] = _path_option_check
115
+
116
+
117
+ ###########
118
+ # options #
119
+ ###########
120
+
121
+ help_: Callable[..., Option] = partial(
122
+ Option,
123
+ "-h",
124
+ "--help",
125
+ dest="help",
126
+ action="help",
127
+ help="Show help.",
128
+ )
129
+
130
+ debug_mode: Callable[..., Option] = partial(
131
+ Option,
132
+ "--debug",
133
+ dest="debug_mode",
134
+ action="store_true",
135
+ default=False,
136
+ help=(
137
+ "Let unhandled exceptions propagate outside the main subroutine, "
138
+ "instead of logging them to stderr."
139
+ ),
140
+ )
141
+
142
+ isolated_mode: Callable[..., Option] = partial(
143
+ Option,
144
+ "--isolated",
145
+ dest="isolated_mode",
146
+ action="store_true",
147
+ default=False,
148
+ help=(
149
+ "Run pip in an isolated mode, ignoring environment variables and user "
150
+ "configuration."
151
+ ),
152
+ )
153
+
154
+ require_virtualenv: Callable[..., Option] = partial(
155
+ Option,
156
+ "--require-virtualenv",
157
+ "--require-venv",
158
+ dest="require_venv",
159
+ action="store_true",
160
+ default=False,
161
+ help=(
162
+ "Allow pip to only run in a virtual environment; "
163
+ "exit with an error otherwise."
164
+ ),
165
+ )
166
+
167
+ override_externally_managed: Callable[..., Option] = partial(
168
+ Option,
169
+ "--break-system-packages",
170
+ dest="override_externally_managed",
171
+ action="store_true",
172
+ help="Allow pip to modify an EXTERNALLY-MANAGED Python installation",
173
+ )
174
+
175
+ python: Callable[..., Option] = partial(
176
+ Option,
177
+ "--python",
178
+ dest="python",
179
+ help="Run pip with the specified Python interpreter.",
180
+ )
181
+
182
+ verbose: Callable[..., Option] = partial(
183
+ Option,
184
+ "-v",
185
+ "--verbose",
186
+ dest="verbose",
187
+ action="count",
188
+ default=0,
189
+ help="Give more output. Option is additive, and can be used up to 3 times.",
190
+ )
191
+
192
+ no_color: Callable[..., Option] = partial(
193
+ Option,
194
+ "--no-color",
195
+ dest="no_color",
196
+ action="store_true",
197
+ default=False,
198
+ help="Suppress colored output.",
199
+ )
200
+
201
+ version: Callable[..., Option] = partial(
202
+ Option,
203
+ "-V",
204
+ "--version",
205
+ dest="version",
206
+ action="store_true",
207
+ help="Show version and exit.",
208
+ )
209
+
210
+ quiet: Callable[..., Option] = partial(
211
+ Option,
212
+ "-q",
213
+ "--quiet",
214
+ dest="quiet",
215
+ action="count",
216
+ default=0,
217
+ help=(
218
+ "Give less output. Option is additive, and can be used up to 3"
219
+ " times (corresponding to WARNING, ERROR, and CRITICAL logging"
220
+ " levels)."
221
+ ),
222
+ )
223
+
224
+ progress_bar: Callable[..., Option] = partial(
225
+ Option,
226
+ "--progress-bar",
227
+ dest="progress_bar",
228
+ type="choice",
229
+ choices=["on", "off", "raw"],
230
+ default="on",
231
+ help="Specify whether the progress bar should be used [on, off, raw] (default: on)",
232
+ )
233
+
234
+ log: Callable[..., Option] = partial(
235
+ PipOption,
236
+ "--log",
237
+ "--log-file",
238
+ "--local-log",
239
+ dest="log",
240
+ metavar="path",
241
+ type="path",
242
+ help="Path to a verbose appending log.",
243
+ )
244
+
245
+ no_input: Callable[..., Option] = partial(
246
+ Option,
247
+ # Don't ask for input
248
+ "--no-input",
249
+ dest="no_input",
250
+ action="store_true",
251
+ default=False,
252
+ help="Disable prompting for input.",
253
+ )
254
+
255
+ keyring_provider: Callable[..., Option] = partial(
256
+ Option,
257
+ "--keyring-provider",
258
+ dest="keyring_provider",
259
+ choices=["auto", "disabled", "import", "subprocess"],
260
+ default="auto",
261
+ help=(
262
+ "Enable the credential lookup via the keyring library if user input is allowed."
263
+ " Specify which mechanism to use [disabled, import, subprocess]."
264
+ " (default: disabled)"
265
+ ),
266
+ )
267
+
268
+ proxy: Callable[..., Option] = partial(
269
+ Option,
270
+ "--proxy",
271
+ dest="proxy",
272
+ type="str",
273
+ default="",
274
+ help="Specify a proxy in the form scheme://[user:passwd@]proxy.server:port.",
275
+ )
276
+
277
+ retries: Callable[..., Option] = partial(
278
+ Option,
279
+ "--retries",
280
+ dest="retries",
281
+ type="int",
282
+ default=5,
283
+ help="Maximum number of retries each connection should attempt "
284
+ "(default %default times).",
285
+ )
286
+
287
+ timeout: Callable[..., Option] = partial(
288
+ Option,
289
+ "--timeout",
290
+ "--default-timeout",
291
+ metavar="sec",
292
+ dest="timeout",
293
+ type="float",
294
+ default=15,
295
+ help="Set the socket timeout (default %default seconds).",
296
+ )
297
+
298
+
299
+ def exists_action() -> Option:
300
+ return Option(
301
+ # Option when path already exist
302
+ "--exists-action",
303
+ dest="exists_action",
304
+ type="choice",
305
+ choices=["s", "i", "w", "b", "a"],
306
+ default=[],
307
+ action="append",
308
+ metavar="action",
309
+ help="Default action when a path already exists: "
310
+ "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.",
311
+ )
312
+
313
+
314
+ cert: Callable[..., Option] = partial(
315
+ PipOption,
316
+ "--cert",
317
+ dest="cert",
318
+ type="path",
319
+ metavar="path",
320
+ help=(
321
+ "Path to PEM-encoded CA certificate bundle. "
322
+ "If provided, overrides the default. "
323
+ "See 'SSL Certificate Verification' in pip documentation "
324
+ "for more information."
325
+ ),
326
+ )
327
+
328
+ client_cert: Callable[..., Option] = partial(
329
+ PipOption,
330
+ "--client-cert",
331
+ dest="client_cert",
332
+ type="path",
333
+ default=None,
334
+ metavar="path",
335
+ help="Path to SSL client certificate, a single file containing the "
336
+ "private key and the certificate in PEM format.",
337
+ )
338
+
339
+ index_url: Callable[..., Option] = partial(
340
+ Option,
341
+ "-i",
342
+ "--index-url",
343
+ "--pypi-url",
344
+ dest="index_url",
345
+ metavar="URL",
346
+ default=PyPI.simple_url,
347
+ help="Base URL of the Python Package Index (default %default). "
348
+ "This should point to a repository compliant with PEP 503 "
349
+ "(the simple repository API) or a local directory laid out "
350
+ "in the same format.",
351
+ )
352
+
353
+
354
+ def extra_index_url() -> Option:
355
+ return Option(
356
+ "--extra-index-url",
357
+ dest="extra_index_urls",
358
+ metavar="URL",
359
+ action="append",
360
+ default=[],
361
+ help="Extra URLs of package indexes to use in addition to "
362
+ "--index-url. Should follow the same rules as "
363
+ "--index-url.",
364
+ )
365
+
366
+
367
+ no_index: Callable[..., Option] = partial(
368
+ Option,
369
+ "--no-index",
370
+ dest="no_index",
371
+ action="store_true",
372
+ default=False,
373
+ help="Ignore package index (only looking at --find-links URLs instead).",
374
+ )
375
+
376
+
377
+ def find_links() -> Option:
378
+ return Option(
379
+ "-f",
380
+ "--find-links",
381
+ dest="find_links",
382
+ action="append",
383
+ default=[],
384
+ metavar="url",
385
+ help="If a URL or path to an html file, then parse for links to "
386
+ "archives such as sdist (.tar.gz) or wheel (.whl) files. "
387
+ "If a local path or file:// URL that's a directory, "
388
+ "then look for archives in the directory listing. "
389
+ "Links to VCS project URLs are not supported.",
390
+ )
391
+
392
+
393
+ def trusted_host() -> Option:
394
+ return Option(
395
+ "--trusted-host",
396
+ dest="trusted_hosts",
397
+ action="append",
398
+ metavar="HOSTNAME",
399
+ default=[],
400
+ help="Mark this host or host:port pair as trusted, even though it "
401
+ "does not have valid or any HTTPS.",
402
+ )
403
+
404
+
405
+ def constraints() -> Option:
406
+ return Option(
407
+ "-c",
408
+ "--constraint",
409
+ dest="constraints",
410
+ action="append",
411
+ default=[],
412
+ metavar="file",
413
+ help="Constrain versions using the given constraints file. "
414
+ "This option can be used multiple times.",
415
+ )
416
+
417
+
418
+ def requirements() -> Option:
419
+ return Option(
420
+ "-r",
421
+ "--requirement",
422
+ dest="requirements",
423
+ action="append",
424
+ default=[],
425
+ metavar="file",
426
+ help="Install from the given requirements file. "
427
+ "This option can be used multiple times.",
428
+ )
429
+
430
+
431
+ def editable() -> Option:
432
+ return Option(
433
+ "-e",
434
+ "--editable",
435
+ dest="editables",
436
+ action="append",
437
+ default=[],
438
+ metavar="path/url",
439
+ help=(
440
+ "Install a project in editable mode (i.e. setuptools "
441
+ '"develop mode") from a local project path or a VCS url.'
442
+ ),
443
+ )
444
+
445
+
446
+ def _handle_src(option: Option, opt_str: str, value: str, parser: OptionParser) -> None:
447
+ value = os.path.abspath(value)
448
+ setattr(parser.values, option.dest, value)
449
+
450
+
451
+ src: Callable[..., Option] = partial(
452
+ PipOption,
453
+ "--src",
454
+ "--source",
455
+ "--source-dir",
456
+ "--source-directory",
457
+ dest="src_dir",
458
+ type="path",
459
+ metavar="dir",
460
+ default=get_src_prefix(),
461
+ action="callback",
462
+ callback=_handle_src,
463
+ help="Directory to check out editable projects into. "
464
+ 'The default in a virtualenv is "<venv path>/src". '
465
+ 'The default for global installs is "<current dir>/src".',
466
+ )
467
+
468
+
469
+ def _get_format_control(values: Values, option: Option) -> Any:
470
+ """Get a format_control object."""
471
+ return getattr(values, option.dest)
472
+
473
+
474
+ def _handle_no_binary(
475
+ option: Option, opt_str: str, value: str, parser: OptionParser
476
+ ) -> None:
477
+ existing = _get_format_control(parser.values, option)
478
+ FormatControl.handle_mutual_excludes(
479
+ value,
480
+ existing.no_binary,
481
+ existing.only_binary,
482
+ )
483
+
484
+
485
+ def _handle_only_binary(
486
+ option: Option, opt_str: str, value: str, parser: OptionParser
487
+ ) -> None:
488
+ existing = _get_format_control(parser.values, option)
489
+ FormatControl.handle_mutual_excludes(
490
+ value,
491
+ existing.only_binary,
492
+ existing.no_binary,
493
+ )
494
+
495
+
496
+ def no_binary() -> Option:
497
+ format_control = FormatControl(set(), set())
498
+ return Option(
499
+ "--no-binary",
500
+ dest="format_control",
501
+ action="callback",
502
+ callback=_handle_no_binary,
503
+ type="str",
504
+ default=format_control,
505
+ help="Do not use binary packages. Can be supplied multiple times, and "
506
+ 'each time adds to the existing value. Accepts either ":all:" to '
507
+ 'disable all binary packages, ":none:" to empty the set (notice '
508
+ "the colons), or one or more package names with commas between "
509
+ "them (no colons). Note that some packages are tricky to compile "
510
+ "and may fail to install when this option is used on them.",
511
+ )
512
+
513
+
514
+ def only_binary() -> Option:
515
+ format_control = FormatControl(set(), set())
516
+ return Option(
517
+ "--only-binary",
518
+ dest="format_control",
519
+ action="callback",
520
+ callback=_handle_only_binary,
521
+ type="str",
522
+ default=format_control,
523
+ help="Do not use source packages. Can be supplied multiple times, and "
524
+ 'each time adds to the existing value. Accepts either ":all:" to '
525
+ 'disable all source packages, ":none:" to empty the set, or one '
526
+ "or more package names with commas between them. Packages "
527
+ "without binary distributions will fail to install when this "
528
+ "option is used on them.",
529
+ )
530
+
531
+
532
+ platforms: Callable[..., Option] = partial(
533
+ Option,
534
+ "--platform",
535
+ dest="platforms",
536
+ metavar="platform",
537
+ action="append",
538
+ default=None,
539
+ help=(
540
+ "Only use wheels compatible with <platform>. Defaults to the "
541
+ "platform of the running system. Use this option multiple times to "
542
+ "specify multiple platforms supported by the target interpreter."
543
+ ),
544
+ )
545
+
546
+
547
+ # This was made a separate function for unit-testing purposes.
548
+ def _convert_python_version(value: str) -> Tuple[Tuple[int, ...], Optional[str]]:
549
+ """
550
+ Convert a version string like "3", "37", or "3.7.3" into a tuple of ints.
551
+
552
+ :return: A 2-tuple (version_info, error_msg), where `error_msg` is
553
+ non-None if and only if there was a parsing error.
554
+ """
555
+ if not value:
556
+ # The empty string is the same as not providing a value.
557
+ return (None, None)
558
+
559
+ parts = value.split(".")
560
+ if len(parts) > 3:
561
+ return ((), "at most three version parts are allowed")
562
+
563
+ if len(parts) == 1:
564
+ # Then we are in the case of "3" or "37".
565
+ value = parts[0]
566
+ if len(value) > 1:
567
+ parts = [value[0], value[1:]]
568
+
569
+ try:
570
+ version_info = tuple(int(part) for part in parts)
571
+ except ValueError:
572
+ return ((), "each version part must be an integer")
573
+
574
+ return (version_info, None)
575
+
576
+
577
+ def _handle_python_version(
578
+ option: Option, opt_str: str, value: str, parser: OptionParser
579
+ ) -> None:
580
+ """
581
+ Handle a provided --python-version value.
582
+ """
583
+ version_info, error_msg = _convert_python_version(value)
584
+ if error_msg is not None:
585
+ msg = f"invalid --python-version value: {value!r}: {error_msg}"
586
+ raise_option_error(parser, option=option, msg=msg)
587
+
588
+ parser.values.python_version = version_info
589
+
590
+
591
+ python_version: Callable[..., Option] = partial(
592
+ Option,
593
+ "--python-version",
594
+ dest="python_version",
595
+ metavar="python_version",
596
+ action="callback",
597
+ callback=_handle_python_version,
598
+ type="str",
599
+ default=None,
600
+ help=dedent(
601
+ """\
602
+ The Python interpreter version to use for wheel and "Requires-Python"
603
+ compatibility checks. Defaults to a version derived from the running
604
+ interpreter. The version can be specified using up to three dot-separated
605
+ integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor
606
+ version can also be given as a string without dots (e.g. "37" for 3.7.0).
607
+ """
608
+ ),
609
+ )
610
+
611
+
612
+ implementation: Callable[..., Option] = partial(
613
+ Option,
614
+ "--implementation",
615
+ dest="implementation",
616
+ metavar="implementation",
617
+ default=None,
618
+ help=(
619
+ "Only use wheels compatible with Python "
620
+ "implementation <implementation>, e.g. 'pp', 'jy', 'cp', "
621
+ " or 'ip'. If not specified, then the current "
622
+ "interpreter implementation is used. Use 'py' to force "
623
+ "implementation-agnostic wheels."
624
+ ),
625
+ )
626
+
627
+
628
+ abis: Callable[..., Option] = partial(
629
+ Option,
630
+ "--abi",
631
+ dest="abis",
632
+ metavar="abi",
633
+ action="append",
634
+ default=None,
635
+ help=(
636
+ "Only use wheels compatible with Python abi <abi>, e.g. 'pypy_41'. "
637
+ "If not specified, then the current interpreter abi tag is used. "
638
+ "Use this option multiple times to specify multiple abis supported "
639
+ "by the target interpreter. Generally you will need to specify "
640
+ "--implementation, --platform, and --python-version when using this "
641
+ "option."
642
+ ),
643
+ )
644
+
645
+
646
+ def add_target_python_options(cmd_opts: OptionGroup) -> None:
647
+ cmd_opts.add_option(platforms())
648
+ cmd_opts.add_option(python_version())
649
+ cmd_opts.add_option(implementation())
650
+ cmd_opts.add_option(abis())
651
+
652
+
653
+ def make_target_python(options: Values) -> TargetPython:
654
+ target_python = TargetPython(
655
+ platforms=options.platforms,
656
+ py_version_info=options.python_version,
657
+ abis=options.abis,
658
+ implementation=options.implementation,
659
+ )
660
+
661
+ return target_python
662
+
663
+
664
+ def prefer_binary() -> Option:
665
+ return Option(
666
+ "--prefer-binary",
667
+ dest="prefer_binary",
668
+ action="store_true",
669
+ default=False,
670
+ help=(
671
+ "Prefer binary packages over source packages, even if the "
672
+ "source packages are newer."
673
+ ),
674
+ )
675
+
676
+
677
+ cache_dir: Callable[..., Option] = partial(
678
+ PipOption,
679
+ "--cache-dir",
680
+ dest="cache_dir",
681
+ default=USER_CACHE_DIR,
682
+ metavar="dir",
683
+ type="path",
684
+ help="Store the cache data in <dir>.",
685
+ )
686
+
687
+
688
+ def _handle_no_cache_dir(
689
+ option: Option, opt: str, value: str, parser: OptionParser
690
+ ) -> None:
691
+ """
692
+ Process a value provided for the --no-cache-dir option.
693
+
694
+ This is an optparse.Option callback for the --no-cache-dir option.
695
+ """
696
+ # The value argument will be None if --no-cache-dir is passed via the
697
+ # command-line, since the option doesn't accept arguments. However,
698
+ # the value can be non-None if the option is triggered e.g. by an
699
+ # environment variable, like PIP_NO_CACHE_DIR=true.
700
+ if value is not None:
701
+ # Then parse the string value to get argument error-checking.
702
+ try:
703
+ strtobool(value)
704
+ except ValueError as exc:
705
+ raise_option_error(parser, option=option, msg=str(exc))
706
+
707
+ # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool()
708
+ # converted to 0 (like "false" or "no") caused cache_dir to be disabled
709
+ # rather than enabled (logic would say the latter). Thus, we disable
710
+ # the cache directory not just on values that parse to True, but (for
711
+ # backwards compatibility reasons) also on values that parse to False.
712
+ # In other words, always set it to False if the option is provided in
713
+ # some (valid) form.
714
+ parser.values.cache_dir = False
715
+
716
+
717
+ no_cache: Callable[..., Option] = partial(
718
+ Option,
719
+ "--no-cache-dir",
720
+ dest="cache_dir",
721
+ action="callback",
722
+ callback=_handle_no_cache_dir,
723
+ help="Disable the cache.",
724
+ )
725
+
726
+ no_deps: Callable[..., Option] = partial(
727
+ Option,
728
+ "--no-deps",
729
+ "--no-dependencies",
730
+ dest="ignore_dependencies",
731
+ action="store_true",
732
+ default=False,
733
+ help="Don't install package dependencies.",
734
+ )
735
+
736
+ ignore_requires_python: Callable[..., Option] = partial(
737
+ Option,
738
+ "--ignore-requires-python",
739
+ dest="ignore_requires_python",
740
+ action="store_true",
741
+ help="Ignore the Requires-Python information.",
742
+ )
743
+
744
+ no_build_isolation: Callable[..., Option] = partial(
745
+ Option,
746
+ "--no-build-isolation",
747
+ dest="build_isolation",
748
+ action="store_false",
749
+ default=True,
750
+ help="Disable isolation when building a modern source distribution. "
751
+ "Build dependencies specified by PEP 518 must be already installed "
752
+ "if this option is used.",
753
+ )
754
+
755
+ check_build_deps: Callable[..., Option] = partial(
756
+ Option,
757
+ "--check-build-dependencies",
758
+ dest="check_build_deps",
759
+ action="store_true",
760
+ default=False,
761
+ help="Check the build dependencies when PEP517 is used.",
762
+ )
763
+
764
+
765
+ def _handle_no_use_pep517(
766
+ option: Option, opt: str, value: str, parser: OptionParser
767
+ ) -> None:
768
+ """
769
+ Process a value provided for the --no-use-pep517 option.
770
+
771
+ This is an optparse.Option callback for the no_use_pep517 option.
772
+ """
773
+ # Since --no-use-pep517 doesn't accept arguments, the value argument
774
+ # will be None if --no-use-pep517 is passed via the command-line.
775
+ # However, the value can be non-None if the option is triggered e.g.
776
+ # by an environment variable, for example "PIP_NO_USE_PEP517=true".
777
+ if value is not None:
778
+ msg = """A value was passed for --no-use-pep517,
779
+ probably using either the PIP_NO_USE_PEP517 environment variable
780
+ or the "no-use-pep517" config file option. Use an appropriate value
781
+ of the PIP_USE_PEP517 environment variable or the "use-pep517"
782
+ config file option instead.
783
+ """
784
+ raise_option_error(parser, option=option, msg=msg)
785
+
786
+ # If user doesn't wish to use pep517, we check if setuptools and wheel are installed
787
+ # and raise error if it is not.
788
+ packages = ("setuptools", "wheel")
789
+ if not all(importlib.util.find_spec(package) for package in packages):
790
+ msg = (
791
+ f"It is not possible to use --no-use-pep517 "
792
+ f"without {' and '.join(packages)} installed."
793
+ )
794
+ raise_option_error(parser, option=option, msg=msg)
795
+
796
+ # Otherwise, --no-use-pep517 was passed via the command-line.
797
+ parser.values.use_pep517 = False
798
+
799
+
800
+ use_pep517: Any = partial(
801
+ Option,
802
+ "--use-pep517",
803
+ dest="use_pep517",
804
+ action="store_true",
805
+ default=None,
806
+ help="Use PEP 517 for building source distributions "
807
+ "(use --no-use-pep517 to force legacy behaviour).",
808
+ )
809
+
810
+ no_use_pep517: Any = partial(
811
+ Option,
812
+ "--no-use-pep517",
813
+ dest="use_pep517",
814
+ action="callback",
815
+ callback=_handle_no_use_pep517,
816
+ default=None,
817
+ help=SUPPRESS_HELP,
818
+ )
819
+
820
+
821
+ def _handle_config_settings(
822
+ option: Option, opt_str: str, value: str, parser: OptionParser
823
+ ) -> None:
824
+ key, sep, val = value.partition("=")
825
+ if sep != "=":
826
+ parser.error(f"Arguments to {opt_str} must be of the form KEY=VAL")
827
+ dest = getattr(parser.values, option.dest)
828
+ if dest is None:
829
+ dest = {}
830
+ setattr(parser.values, option.dest, dest)
831
+ if key in dest:
832
+ if isinstance(dest[key], list):
833
+ dest[key].append(val)
834
+ else:
835
+ dest[key] = [dest[key], val]
836
+ else:
837
+ dest[key] = val
838
+
839
+
840
+ config_settings: Callable[..., Option] = partial(
841
+ Option,
842
+ "-C",
843
+ "--config-settings",
844
+ dest="config_settings",
845
+ type=str,
846
+ action="callback",
847
+ callback=_handle_config_settings,
848
+ metavar="settings",
849
+ help="Configuration settings to be passed to the PEP 517 build backend. "
850
+ "Settings take the form KEY=VALUE. Use multiple --config-settings options "
851
+ "to pass multiple keys to the backend.",
852
+ )
853
+
854
+ build_options: Callable[..., Option] = partial(
855
+ Option,
856
+ "--build-option",
857
+ dest="build_options",
858
+ metavar="options",
859
+ action="append",
860
+ help="Extra arguments to be supplied to 'setup.py bdist_wheel'.",
861
+ )
862
+
863
+ global_options: Callable[..., Option] = partial(
864
+ Option,
865
+ "--global-option",
866
+ dest="global_options",
867
+ action="append",
868
+ metavar="options",
869
+ help="Extra global options to be supplied to the setup.py "
870
+ "call before the install or bdist_wheel command.",
871
+ )
872
+
873
+ no_clean: Callable[..., Option] = partial(
874
+ Option,
875
+ "--no-clean",
876
+ action="store_true",
877
+ default=False,
878
+ help="Don't clean up build directories.",
879
+ )
880
+
881
+ pre: Callable[..., Option] = partial(
882
+ Option,
883
+ "--pre",
884
+ action="store_true",
885
+ default=False,
886
+ help="Include pre-release and development versions. By default, "
887
+ "pip only finds stable versions.",
888
+ )
889
+
890
+ disable_pip_version_check: Callable[..., Option] = partial(
891
+ Option,
892
+ "--disable-pip-version-check",
893
+ dest="disable_pip_version_check",
894
+ action="store_true",
895
+ default=False,
896
+ help="Don't periodically check PyPI to determine whether a new version "
897
+ "of pip is available for download. Implied with --no-index.",
898
+ )
899
+
900
+ root_user_action: Callable[..., Option] = partial(
901
+ Option,
902
+ "--root-user-action",
903
+ dest="root_user_action",
904
+ default="warn",
905
+ choices=["warn", "ignore"],
906
+ help="Action if pip is run as a root user [warn, ignore] (default: warn)",
907
+ )
908
+
909
+
910
+ def _handle_merge_hash(
911
+ option: Option, opt_str: str, value: str, parser: OptionParser
912
+ ) -> None:
913
+ """Given a value spelled "algo:digest", append the digest to a list
914
+ pointed to in a dict by the algo name."""
915
+ if not parser.values.hashes:
916
+ parser.values.hashes = {}
917
+ try:
918
+ algo, digest = value.split(":", 1)
919
+ except ValueError:
920
+ parser.error(
921
+ f"Arguments to {opt_str} must be a hash name "
922
+ "followed by a value, like --hash=sha256:"
923
+ "abcde..."
924
+ )
925
+ if algo not in STRONG_HASHES:
926
+ parser.error(
927
+ "Allowed hash algorithms for {} are {}.".format(
928
+ opt_str, ", ".join(STRONG_HASHES)
929
+ )
930
+ )
931
+ parser.values.hashes.setdefault(algo, []).append(digest)
932
+
933
+
934
+ hash: Callable[..., Option] = partial(
935
+ Option,
936
+ "--hash",
937
+ # Hash values eventually end up in InstallRequirement.hashes due to
938
+ # __dict__ copying in process_line().
939
+ dest="hashes",
940
+ action="callback",
941
+ callback=_handle_merge_hash,
942
+ type="string",
943
+ help="Verify that the package's archive matches this "
944
+ "hash before installing. Example: --hash=sha256:abcdef...",
945
+ )
946
+
947
+
948
+ require_hashes: Callable[..., Option] = partial(
949
+ Option,
950
+ "--require-hashes",
951
+ dest="require_hashes",
952
+ action="store_true",
953
+ default=False,
954
+ help="Require a hash to check each requirement against, for "
955
+ "repeatable installs. This option is implied when any package in a "
956
+ "requirements file has a --hash option.",
957
+ )
958
+
959
+
960
+ list_path: Callable[..., Option] = partial(
961
+ PipOption,
962
+ "--path",
963
+ dest="path",
964
+ type="path",
965
+ action="append",
966
+ help="Restrict to the specified installation path for listing "
967
+ "packages (can be used multiple times).",
968
+ )
969
+
970
+
971
+ def check_list_path_option(options: Values) -> None:
972
+ if options.path and (options.user or options.local):
973
+ raise CommandError("Cannot combine '--path' with '--user' or '--local'")
974
+
975
+
976
+ list_exclude: Callable[..., Option] = partial(
977
+ PipOption,
978
+ "--exclude",
979
+ dest="excludes",
980
+ action="append",
981
+ metavar="package",
982
+ type="package_name",
983
+ help="Exclude specified package from the output",
984
+ )
985
+
986
+
987
+ no_python_version_warning: Callable[..., Option] = partial(
988
+ Option,
989
+ "--no-python-version-warning",
990
+ dest="no_python_version_warning",
991
+ action="store_true",
992
+ default=False,
993
+ help="Silence deprecation warnings for upcoming unsupported Pythons.",
994
+ )
995
+
996
+
997
+ # Features that are now always on. A warning is printed if they are used.
998
+ ALWAYS_ENABLED_FEATURES = [
999
+ "truststore", # always on since 24.2
1000
+ "no-binary-enable-wheel-cache", # always on since 23.1
1001
+ ]
1002
+
1003
+ use_new_feature: Callable[..., Option] = partial(
1004
+ Option,
1005
+ "--use-feature",
1006
+ dest="features_enabled",
1007
+ metavar="feature",
1008
+ action="append",
1009
+ default=[],
1010
+ choices=[
1011
+ "fast-deps",
1012
+ ]
1013
+ + ALWAYS_ENABLED_FEATURES,
1014
+ help="Enable new functionality, that may be backward incompatible.",
1015
+ )
1016
+
1017
+ use_deprecated_feature: Callable[..., Option] = partial(
1018
+ Option,
1019
+ "--use-deprecated",
1020
+ dest="deprecated_features_enabled",
1021
+ metavar="feature",
1022
+ action="append",
1023
+ default=[],
1024
+ choices=[
1025
+ "legacy-resolver",
1026
+ "legacy-certs",
1027
+ ],
1028
+ help=("Enable deprecated functionality, that will be removed in the future."),
1029
+ )
1030
+
1031
+
1032
+ ##########
1033
+ # groups #
1034
+ ##########
1035
+
1036
+ general_group: Dict[str, Any] = {
1037
+ "name": "General Options",
1038
+ "options": [
1039
+ help_,
1040
+ debug_mode,
1041
+ isolated_mode,
1042
+ require_virtualenv,
1043
+ python,
1044
+ verbose,
1045
+ version,
1046
+ quiet,
1047
+ log,
1048
+ no_input,
1049
+ keyring_provider,
1050
+ proxy,
1051
+ retries,
1052
+ timeout,
1053
+ exists_action,
1054
+ trusted_host,
1055
+ cert,
1056
+ client_cert,
1057
+ cache_dir,
1058
+ no_cache,
1059
+ disable_pip_version_check,
1060
+ no_color,
1061
+ no_python_version_warning,
1062
+ use_new_feature,
1063
+ use_deprecated_feature,
1064
+ ],
1065
+ }
1066
+
1067
+ index_group: Dict[str, Any] = {
1068
+ "name": "Package Index Options",
1069
+ "options": [
1070
+ index_url,
1071
+ extra_index_url,
1072
+ no_index,
1073
+ find_links,
1074
+ ],
1075
+ }
.venv/Lib/site-packages/pip/_internal/cli/command_context.py ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from contextlib import ExitStack, contextmanager
2
+ from typing import ContextManager, Generator, TypeVar
3
+
4
+ _T = TypeVar("_T", covariant=True)
5
+
6
+
7
+ class CommandContextMixIn:
8
+ def __init__(self) -> None:
9
+ super().__init__()
10
+ self._in_main_context = False
11
+ self._main_context = ExitStack()
12
+
13
+ @contextmanager
14
+ def main_context(self) -> Generator[None, None, None]:
15
+ assert not self._in_main_context
16
+
17
+ self._in_main_context = True
18
+ try:
19
+ with self._main_context:
20
+ yield
21
+ finally:
22
+ self._in_main_context = False
23
+
24
+ def enter_context(self, context_provider: ContextManager[_T]) -> _T:
25
+ assert self._in_main_context
26
+
27
+ return self._main_context.enter_context(context_provider)
.venv/Lib/site-packages/pip/_internal/cli/index_command.py ADDED
@@ -0,0 +1,170 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Contains command classes which may interact with an index / the network.
3
+
4
+ Unlike its sister module, req_command, this module still uses lazy imports
5
+ so commands which don't always hit the network (e.g. list w/o --outdated or
6
+ --uptodate) don't need waste time importing PipSession and friends.
7
+ """
8
+
9
+ import logging
10
+ import os
11
+ import sys
12
+ from optparse import Values
13
+ from typing import TYPE_CHECKING, List, Optional
14
+
15
+ from pip._vendor import certifi
16
+
17
+ from pip._internal.cli.base_command import Command
18
+ from pip._internal.cli.command_context import CommandContextMixIn
19
+
20
+ if TYPE_CHECKING:
21
+ from ssl import SSLContext
22
+
23
+ from pip._internal.network.session import PipSession
24
+
25
+ logger = logging.getLogger(__name__)
26
+
27
+
28
+ def _create_truststore_ssl_context() -> Optional["SSLContext"]:
29
+ if sys.version_info < (3, 10):
30
+ logger.debug("Disabling truststore because Python version isn't 3.10+")
31
+ return None
32
+
33
+ try:
34
+ import ssl
35
+ except ImportError:
36
+ logger.warning("Disabling truststore since ssl support is missing")
37
+ return None
38
+
39
+ try:
40
+ from pip._vendor import truststore
41
+ except ImportError:
42
+ logger.warning("Disabling truststore because platform isn't supported")
43
+ return None
44
+
45
+ ctx = truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
46
+ ctx.load_verify_locations(certifi.where())
47
+ return ctx
48
+
49
+
50
+ class SessionCommandMixin(CommandContextMixIn):
51
+ """
52
+ A class mixin for command classes needing _build_session().
53
+ """
54
+
55
+ def __init__(self) -> None:
56
+ super().__init__()
57
+ self._session: Optional[PipSession] = None
58
+
59
+ @classmethod
60
+ def _get_index_urls(cls, options: Values) -> Optional[List[str]]:
61
+ """Return a list of index urls from user-provided options."""
62
+ index_urls = []
63
+ if not getattr(options, "no_index", False):
64
+ url = getattr(options, "index_url", None)
65
+ if url:
66
+ index_urls.append(url)
67
+ urls = getattr(options, "extra_index_urls", None)
68
+ if urls:
69
+ index_urls.extend(urls)
70
+ # Return None rather than an empty list
71
+ return index_urls or None
72
+
73
+ def get_default_session(self, options: Values) -> "PipSession":
74
+ """Get a default-managed session."""
75
+ if self._session is None:
76
+ self._session = self.enter_context(self._build_session(options))
77
+ # there's no type annotation on requests.Session, so it's
78
+ # automatically ContextManager[Any] and self._session becomes Any,
79
+ # then https://github.com/python/mypy/issues/7696 kicks in
80
+ assert self._session is not None
81
+ return self._session
82
+
83
+ def _build_session(
84
+ self,
85
+ options: Values,
86
+ retries: Optional[int] = None,
87
+ timeout: Optional[int] = None,
88
+ ) -> "PipSession":
89
+ from pip._internal.network.session import PipSession
90
+
91
+ cache_dir = options.cache_dir
92
+ assert not cache_dir or os.path.isabs(cache_dir)
93
+
94
+ if "legacy-certs" not in options.deprecated_features_enabled:
95
+ ssl_context = _create_truststore_ssl_context()
96
+ else:
97
+ ssl_context = None
98
+
99
+ session = PipSession(
100
+ cache=os.path.join(cache_dir, "http-v2") if cache_dir else None,
101
+ retries=retries if retries is not None else options.retries,
102
+ trusted_hosts=options.trusted_hosts,
103
+ index_urls=self._get_index_urls(options),
104
+ ssl_context=ssl_context,
105
+ )
106
+
107
+ # Handle custom ca-bundles from the user
108
+ if options.cert:
109
+ session.verify = options.cert
110
+
111
+ # Handle SSL client certificate
112
+ if options.client_cert:
113
+ session.cert = options.client_cert
114
+
115
+ # Handle timeouts
116
+ if options.timeout or timeout:
117
+ session.timeout = timeout if timeout is not None else options.timeout
118
+
119
+ # Handle configured proxies
120
+ if options.proxy:
121
+ session.proxies = {
122
+ "http": options.proxy,
123
+ "https": options.proxy,
124
+ }
125
+ session.trust_env = False
126
+
127
+ # Determine if we can prompt the user for authentication or not
128
+ session.auth.prompting = not options.no_input
129
+ session.auth.keyring_provider = options.keyring_provider
130
+
131
+ return session
132
+
133
+
134
+ def _pip_self_version_check(session: "PipSession", options: Values) -> None:
135
+ from pip._internal.self_outdated_check import pip_self_version_check as check
136
+
137
+ check(session, options)
138
+
139
+
140
+ class IndexGroupCommand(Command, SessionCommandMixin):
141
+ """
142
+ Abstract base class for commands with the index_group options.
143
+
144
+ This also corresponds to the commands that permit the pip version check.
145
+ """
146
+
147
+ def handle_pip_version_check(self, options: Values) -> None:
148
+ """
149
+ Do the pip version check if not disabled.
150
+
151
+ This overrides the default behavior of not doing the check.
152
+ """
153
+ # Make sure the index_group options are present.
154
+ assert hasattr(options, "no_index")
155
+
156
+ if options.disable_pip_version_check or options.no_index:
157
+ return
158
+
159
+ try:
160
+ # Otherwise, check if we're using the latest version of pip available.
161
+ session = self._build_session(
162
+ options,
163
+ retries=0,
164
+ timeout=min(5, options.timeout),
165
+ )
166
+ with session:
167
+ _pip_self_version_check(session, options)
168
+ except Exception:
169
+ logger.warning("There was an error checking the latest version of pip.")
170
+ logger.debug("See below for error", exc_info=True)
.venv/Lib/site-packages/pip/_internal/cli/main.py ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Primary application entrypoint.
2
+ """
3
+
4
+ import locale
5
+ import logging
6
+ import os
7
+ import sys
8
+ import warnings
9
+ from typing import List, Optional
10
+
11
+ from pip._internal.cli.autocompletion import autocomplete
12
+ from pip._internal.cli.main_parser import parse_command
13
+ from pip._internal.commands import create_command
14
+ from pip._internal.exceptions import PipError
15
+ from pip._internal.utils import deprecation
16
+
17
+ logger = logging.getLogger(__name__)
18
+
19
+
20
+ # Do not import and use main() directly! Using it directly is actively
21
+ # discouraged by pip's maintainers. The name, location and behavior of
22
+ # this function is subject to change, so calling it directly is not
23
+ # portable across different pip versions.
24
+
25
+ # In addition, running pip in-process is unsupported and unsafe. This is
26
+ # elaborated in detail at
27
+ # https://pip.pypa.io/en/stable/user_guide/#using-pip-from-your-program.
28
+ # That document also provides suggestions that should work for nearly
29
+ # all users that are considering importing and using main() directly.
30
+
31
+ # However, we know that certain users will still want to invoke pip
32
+ # in-process. If you understand and accept the implications of using pip
33
+ # in an unsupported manner, the best approach is to use runpy to avoid
34
+ # depending on the exact location of this entry point.
35
+
36
+ # The following example shows how to use runpy to invoke pip in that
37
+ # case:
38
+ #
39
+ # sys.argv = ["pip", your, args, here]
40
+ # runpy.run_module("pip", run_name="__main__")
41
+ #
42
+ # Note that this will exit the process after running, unlike a direct
43
+ # call to main. As it is not safe to do any processing after calling
44
+ # main, this should not be an issue in practice.
45
+
46
+
47
+ def main(args: Optional[List[str]] = None) -> int:
48
+ if args is None:
49
+ args = sys.argv[1:]
50
+
51
+ # Suppress the pkg_resources deprecation warning
52
+ # Note - we use a module of .*pkg_resources to cover
53
+ # the normal case (pip._vendor.pkg_resources) and the
54
+ # devendored case (a bare pkg_resources)
55
+ warnings.filterwarnings(
56
+ action="ignore", category=DeprecationWarning, module=".*pkg_resources"
57
+ )
58
+
59
+ # Configure our deprecation warnings to be sent through loggers
60
+ deprecation.install_warning_logger()
61
+
62
+ autocomplete()
63
+
64
+ try:
65
+ cmd_name, cmd_args = parse_command(args)
66
+ except PipError as exc:
67
+ sys.stderr.write(f"ERROR: {exc}")
68
+ sys.stderr.write(os.linesep)
69
+ sys.exit(1)
70
+
71
+ # Needed for locale.getpreferredencoding(False) to work
72
+ # in pip._internal.utils.encoding.auto_decode
73
+ try:
74
+ locale.setlocale(locale.LC_ALL, "")
75
+ except locale.Error as e:
76
+ # setlocale can apparently crash if locale are uninitialized
77
+ logger.debug("Ignoring error %s when setting locale", e)
78
+ command = create_command(cmd_name, isolated=("--isolated" in cmd_args))
79
+
80
+ return command.main(cmd_args)
.venv/Lib/site-packages/pip/_internal/cli/main_parser.py ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """A single place for constructing and exposing the main parser
2
+ """
3
+
4
+ import os
5
+ import subprocess
6
+ import sys
7
+ from typing import List, Optional, Tuple
8
+
9
+ from pip._internal.build_env import get_runnable_pip
10
+ from pip._internal.cli import cmdoptions
11
+ from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter
12
+ from pip._internal.commands import commands_dict, get_similar_commands
13
+ from pip._internal.exceptions import CommandError
14
+ from pip._internal.utils.misc import get_pip_version, get_prog
15
+
16
+ __all__ = ["create_main_parser", "parse_command"]
17
+
18
+
19
+ def create_main_parser() -> ConfigOptionParser:
20
+ """Creates and returns the main parser for pip's CLI"""
21
+
22
+ parser = ConfigOptionParser(
23
+ usage="\n%prog <command> [options]",
24
+ add_help_option=False,
25
+ formatter=UpdatingDefaultsHelpFormatter(),
26
+ name="global",
27
+ prog=get_prog(),
28
+ )
29
+ parser.disable_interspersed_args()
30
+
31
+ parser.version = get_pip_version()
32
+
33
+ # add the general options
34
+ gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser)
35
+ parser.add_option_group(gen_opts)
36
+
37
+ # so the help formatter knows
38
+ parser.main = True # type: ignore
39
+
40
+ # create command listing for description
41
+ description = [""] + [
42
+ f"{name:27} {command_info.summary}"
43
+ for name, command_info in commands_dict.items()
44
+ ]
45
+ parser.description = "\n".join(description)
46
+
47
+ return parser
48
+
49
+
50
+ def identify_python_interpreter(python: str) -> Optional[str]:
51
+ # If the named file exists, use it.
52
+ # If it's a directory, assume it's a virtual environment and
53
+ # look for the environment's Python executable.
54
+ if os.path.exists(python):
55
+ if os.path.isdir(python):
56
+ # bin/python for Unix, Scripts/python.exe for Windows
57
+ # Try both in case of odd cases like cygwin.
58
+ for exe in ("bin/python", "Scripts/python.exe"):
59
+ py = os.path.join(python, exe)
60
+ if os.path.exists(py):
61
+ return py
62
+ else:
63
+ return python
64
+
65
+ # Could not find the interpreter specified
66
+ return None
67
+
68
+
69
+ def parse_command(args: List[str]) -> Tuple[str, List[str]]:
70
+ parser = create_main_parser()
71
+
72
+ # Note: parser calls disable_interspersed_args(), so the result of this
73
+ # call is to split the initial args into the general options before the
74
+ # subcommand and everything else.
75
+ # For example:
76
+ # args: ['--timeout=5', 'install', '--user', 'INITools']
77
+ # general_options: ['--timeout==5']
78
+ # args_else: ['install', '--user', 'INITools']
79
+ general_options, args_else = parser.parse_args(args)
80
+
81
+ # --python
82
+ if general_options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ:
83
+ # Re-invoke pip using the specified Python interpreter
84
+ interpreter = identify_python_interpreter(general_options.python)
85
+ if interpreter is None:
86
+ raise CommandError(
87
+ f"Could not locate Python interpreter {general_options.python}"
88
+ )
89
+
90
+ pip_cmd = [
91
+ interpreter,
92
+ get_runnable_pip(),
93
+ ]
94
+ pip_cmd.extend(args)
95
+
96
+ # Set a flag so the child doesn't re-invoke itself, causing
97
+ # an infinite loop.
98
+ os.environ["_PIP_RUNNING_IN_SUBPROCESS"] = "1"
99
+ returncode = 0
100
+ try:
101
+ proc = subprocess.run(pip_cmd)
102
+ returncode = proc.returncode
103
+ except (subprocess.SubprocessError, OSError) as exc:
104
+ raise CommandError(f"Failed to run pip under {interpreter}: {exc}")
105
+ sys.exit(returncode)
106
+
107
+ # --version
108
+ if general_options.version:
109
+ sys.stdout.write(parser.version)
110
+ sys.stdout.write(os.linesep)
111
+ sys.exit()
112
+
113
+ # pip || pip help -> print_help()
114
+ if not args_else or (args_else[0] == "help" and len(args_else) == 1):
115
+ parser.print_help()
116
+ sys.exit()
117
+
118
+ # the subcommand name
119
+ cmd_name = args_else[0]
120
+
121
+ if cmd_name not in commands_dict:
122
+ guess = get_similar_commands(cmd_name)
123
+
124
+ msg = [f'unknown command "{cmd_name}"']
125
+ if guess:
126
+ msg.append(f'maybe you meant "{guess}"')
127
+
128
+ raise CommandError(" - ".join(msg))
129
+
130
+ # all the args without the subcommand
131
+ cmd_args = args[:]
132
+ cmd_args.remove(cmd_name)
133
+
134
+ return cmd_name, cmd_args
.venv/Lib/site-packages/pip/_internal/cli/parser.py ADDED
@@ -0,0 +1,294 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Base option parser setup"""
2
+
3
+ import logging
4
+ import optparse
5
+ import shutil
6
+ import sys
7
+ import textwrap
8
+ from contextlib import suppress
9
+ from typing import Any, Dict, Generator, List, NoReturn, Optional, Tuple
10
+
11
+ from pip._internal.cli.status_codes import UNKNOWN_ERROR
12
+ from pip._internal.configuration import Configuration, ConfigurationError
13
+ from pip._internal.utils.misc import redact_auth_from_url, strtobool
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ class PrettyHelpFormatter(optparse.IndentedHelpFormatter):
19
+ """A prettier/less verbose help formatter for optparse."""
20
+
21
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
22
+ # help position must be aligned with __init__.parseopts.description
23
+ kwargs["max_help_position"] = 30
24
+ kwargs["indent_increment"] = 1
25
+ kwargs["width"] = shutil.get_terminal_size()[0] - 2
26
+ super().__init__(*args, **kwargs)
27
+
28
+ def format_option_strings(self, option: optparse.Option) -> str:
29
+ return self._format_option_strings(option)
30
+
31
+ def _format_option_strings(
32
+ self, option: optparse.Option, mvarfmt: str = " <{}>", optsep: str = ", "
33
+ ) -> str:
34
+ """
35
+ Return a comma-separated list of option strings and metavars.
36
+
37
+ :param option: tuple of (short opt, long opt), e.g: ('-f', '--format')
38
+ :param mvarfmt: metavar format string
39
+ :param optsep: separator
40
+ """
41
+ opts = []
42
+
43
+ if option._short_opts:
44
+ opts.append(option._short_opts[0])
45
+ if option._long_opts:
46
+ opts.append(option._long_opts[0])
47
+ if len(opts) > 1:
48
+ opts.insert(1, optsep)
49
+
50
+ if option.takes_value():
51
+ assert option.dest is not None
52
+ metavar = option.metavar or option.dest.lower()
53
+ opts.append(mvarfmt.format(metavar.lower()))
54
+
55
+ return "".join(opts)
56
+
57
+ def format_heading(self, heading: str) -> str:
58
+ if heading == "Options":
59
+ return ""
60
+ return heading + ":\n"
61
+
62
+ def format_usage(self, usage: str) -> str:
63
+ """
64
+ Ensure there is only one newline between usage and the first heading
65
+ if there is no description.
66
+ """
67
+ msg = "\nUsage: {}\n".format(self.indent_lines(textwrap.dedent(usage), " "))
68
+ return msg
69
+
70
+ def format_description(self, description: Optional[str]) -> str:
71
+ # leave full control over description to us
72
+ if description:
73
+ if hasattr(self.parser, "main"):
74
+ label = "Commands"
75
+ else:
76
+ label = "Description"
77
+ # some doc strings have initial newlines, some don't
78
+ description = description.lstrip("\n")
79
+ # some doc strings have final newlines and spaces, some don't
80
+ description = description.rstrip()
81
+ # dedent, then reindent
82
+ description = self.indent_lines(textwrap.dedent(description), " ")
83
+ description = f"{label}:\n{description}\n"
84
+ return description
85
+ else:
86
+ return ""
87
+
88
+ def format_epilog(self, epilog: Optional[str]) -> str:
89
+ # leave full control over epilog to us
90
+ if epilog:
91
+ return epilog
92
+ else:
93
+ return ""
94
+
95
+ def indent_lines(self, text: str, indent: str) -> str:
96
+ new_lines = [indent + line for line in text.split("\n")]
97
+ return "\n".join(new_lines)
98
+
99
+
100
+ class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter):
101
+ """Custom help formatter for use in ConfigOptionParser.
102
+
103
+ This is updates the defaults before expanding them, allowing
104
+ them to show up correctly in the help listing.
105
+
106
+ Also redact auth from url type options
107
+ """
108
+
109
+ def expand_default(self, option: optparse.Option) -> str:
110
+ default_values = None
111
+ if self.parser is not None:
112
+ assert isinstance(self.parser, ConfigOptionParser)
113
+ self.parser._update_defaults(self.parser.defaults)
114
+ assert option.dest is not None
115
+ default_values = self.parser.defaults.get(option.dest)
116
+ help_text = super().expand_default(option)
117
+
118
+ if default_values and option.metavar == "URL":
119
+ if isinstance(default_values, str):
120
+ default_values = [default_values]
121
+
122
+ # If its not a list, we should abort and just return the help text
123
+ if not isinstance(default_values, list):
124
+ default_values = []
125
+
126
+ for val in default_values:
127
+ help_text = help_text.replace(val, redact_auth_from_url(val))
128
+
129
+ return help_text
130
+
131
+
132
+ class CustomOptionParser(optparse.OptionParser):
133
+ def insert_option_group(
134
+ self, idx: int, *args: Any, **kwargs: Any
135
+ ) -> optparse.OptionGroup:
136
+ """Insert an OptionGroup at a given position."""
137
+ group = self.add_option_group(*args, **kwargs)
138
+
139
+ self.option_groups.pop()
140
+ self.option_groups.insert(idx, group)
141
+
142
+ return group
143
+
144
+ @property
145
+ def option_list_all(self) -> List[optparse.Option]:
146
+ """Get a list of all options, including those in option groups."""
147
+ res = self.option_list[:]
148
+ for i in self.option_groups:
149
+ res.extend(i.option_list)
150
+
151
+ return res
152
+
153
+
154
+ class ConfigOptionParser(CustomOptionParser):
155
+ """Custom option parser which updates its defaults by checking the
156
+ configuration files and environmental variables"""
157
+
158
+ def __init__(
159
+ self,
160
+ *args: Any,
161
+ name: str,
162
+ isolated: bool = False,
163
+ **kwargs: Any,
164
+ ) -> None:
165
+ self.name = name
166
+ self.config = Configuration(isolated)
167
+
168
+ assert self.name
169
+ super().__init__(*args, **kwargs)
170
+
171
+ def check_default(self, option: optparse.Option, key: str, val: Any) -> Any:
172
+ try:
173
+ return option.check_value(key, val)
174
+ except optparse.OptionValueError as exc:
175
+ print(f"An error occurred during configuration: {exc}")
176
+ sys.exit(3)
177
+
178
+ def _get_ordered_configuration_items(
179
+ self,
180
+ ) -> Generator[Tuple[str, Any], None, None]:
181
+ # Configuration gives keys in an unordered manner. Order them.
182
+ override_order = ["global", self.name, ":env:"]
183
+
184
+ # Pool the options into different groups
185
+ section_items: Dict[str, List[Tuple[str, Any]]] = {
186
+ name: [] for name in override_order
187
+ }
188
+ for section_key, val in self.config.items():
189
+ # ignore empty values
190
+ if not val:
191
+ logger.debug(
192
+ "Ignoring configuration key '%s' as it's value is empty.",
193
+ section_key,
194
+ )
195
+ continue
196
+
197
+ section, key = section_key.split(".", 1)
198
+ if section in override_order:
199
+ section_items[section].append((key, val))
200
+
201
+ # Yield each group in their override order
202
+ for section in override_order:
203
+ for key, val in section_items[section]:
204
+ yield key, val
205
+
206
+ def _update_defaults(self, defaults: Dict[str, Any]) -> Dict[str, Any]:
207
+ """Updates the given defaults with values from the config files and
208
+ the environ. Does a little special handling for certain types of
209
+ options (lists)."""
210
+
211
+ # Accumulate complex default state.
212
+ self.values = optparse.Values(self.defaults)
213
+ late_eval = set()
214
+ # Then set the options with those values
215
+ for key, val in self._get_ordered_configuration_items():
216
+ # '--' because configuration supports only long names
217
+ option = self.get_option("--" + key)
218
+
219
+ # Ignore options not present in this parser. E.g. non-globals put
220
+ # in [global] by users that want them to apply to all applicable
221
+ # commands.
222
+ if option is None:
223
+ continue
224
+
225
+ assert option.dest is not None
226
+
227
+ if option.action in ("store_true", "store_false"):
228
+ try:
229
+ val = strtobool(val)
230
+ except ValueError:
231
+ self.error(
232
+ f"{val} is not a valid value for {key} option, "
233
+ "please specify a boolean value like yes/no, "
234
+ "true/false or 1/0 instead."
235
+ )
236
+ elif option.action == "count":
237
+ with suppress(ValueError):
238
+ val = strtobool(val)
239
+ with suppress(ValueError):
240
+ val = int(val)
241
+ if not isinstance(val, int) or val < 0:
242
+ self.error(
243
+ f"{val} is not a valid value for {key} option, "
244
+ "please instead specify either a non-negative integer "
245
+ "or a boolean value like yes/no or false/true "
246
+ "which is equivalent to 1/0."
247
+ )
248
+ elif option.action == "append":
249
+ val = val.split()
250
+ val = [self.check_default(option, key, v) for v in val]
251
+ elif option.action == "callback":
252
+ assert option.callback is not None
253
+ late_eval.add(option.dest)
254
+ opt_str = option.get_opt_string()
255
+ val = option.convert_value(opt_str, val)
256
+ # From take_action
257
+ args = option.callback_args or ()
258
+ kwargs = option.callback_kwargs or {}
259
+ option.callback(option, opt_str, val, self, *args, **kwargs)
260
+ else:
261
+ val = self.check_default(option, key, val)
262
+
263
+ defaults[option.dest] = val
264
+
265
+ for key in late_eval:
266
+ defaults[key] = getattr(self.values, key)
267
+ self.values = None
268
+ return defaults
269
+
270
+ def get_default_values(self) -> optparse.Values:
271
+ """Overriding to make updating the defaults after instantiation of
272
+ the option parser possible, _update_defaults() does the dirty work."""
273
+ if not self.process_default_values:
274
+ # Old, pre-Optik 1.5 behaviour.
275
+ return optparse.Values(self.defaults)
276
+
277
+ # Load the configuration, or error out in case of an error
278
+ try:
279
+ self.config.load()
280
+ except ConfigurationError as err:
281
+ self.exit(UNKNOWN_ERROR, str(err))
282
+
283
+ defaults = self._update_defaults(self.defaults.copy()) # ours
284
+ for option in self._get_all_options():
285
+ assert option.dest is not None
286
+ default = defaults.get(option.dest)
287
+ if isinstance(default, str):
288
+ opt_str = option.get_opt_string()
289
+ defaults[option.dest] = option.check_value(opt_str, default)
290
+ return optparse.Values(defaults)
291
+
292
+ def error(self, msg: str) -> NoReturn:
293
+ self.print_usage(sys.stderr)
294
+ self.exit(UNKNOWN_ERROR, f"{msg}\n")
.venv/Lib/site-packages/pip/_internal/cli/progress_bars.py ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import functools
2
+ import sys
3
+ from typing import Callable, Generator, Iterable, Iterator, Optional, Tuple
4
+
5
+ from pip._vendor.rich.progress import (
6
+ BarColumn,
7
+ DownloadColumn,
8
+ FileSizeColumn,
9
+ Progress,
10
+ ProgressColumn,
11
+ SpinnerColumn,
12
+ TextColumn,
13
+ TimeElapsedColumn,
14
+ TimeRemainingColumn,
15
+ TransferSpeedColumn,
16
+ )
17
+
18
+ from pip._internal.cli.spinners import RateLimiter
19
+ from pip._internal.utils.logging import get_indentation
20
+
21
+ DownloadProgressRenderer = Callable[[Iterable[bytes]], Iterator[bytes]]
22
+
23
+
24
+ def _rich_progress_bar(
25
+ iterable: Iterable[bytes],
26
+ *,
27
+ bar_type: str,
28
+ size: Optional[int],
29
+ ) -> Generator[bytes, None, None]:
30
+ assert bar_type == "on", "This should only be used in the default mode."
31
+
32
+ if not size:
33
+ total = float("inf")
34
+ columns: Tuple[ProgressColumn, ...] = (
35
+ TextColumn("[progress.description]{task.description}"),
36
+ SpinnerColumn("line", speed=1.5),
37
+ FileSizeColumn(),
38
+ TransferSpeedColumn(),
39
+ TimeElapsedColumn(),
40
+ )
41
+ else:
42
+ total = size
43
+ columns = (
44
+ TextColumn("[progress.description]{task.description}"),
45
+ BarColumn(),
46
+ DownloadColumn(),
47
+ TransferSpeedColumn(),
48
+ TextColumn("eta"),
49
+ TimeRemainingColumn(),
50
+ )
51
+
52
+ progress = Progress(*columns, refresh_per_second=5)
53
+ task_id = progress.add_task(" " * (get_indentation() + 2), total=total)
54
+ with progress:
55
+ for chunk in iterable:
56
+ yield chunk
57
+ progress.update(task_id, advance=len(chunk))
58
+
59
+
60
+ def _raw_progress_bar(
61
+ iterable: Iterable[bytes],
62
+ *,
63
+ size: Optional[int],
64
+ ) -> Generator[bytes, None, None]:
65
+ def write_progress(current: int, total: int) -> None:
66
+ sys.stdout.write("Progress %d of %d\n" % (current, total))
67
+ sys.stdout.flush()
68
+
69
+ current = 0
70
+ total = size or 0
71
+ rate_limiter = RateLimiter(0.25)
72
+
73
+ write_progress(current, total)
74
+ for chunk in iterable:
75
+ current += len(chunk)
76
+ if rate_limiter.ready() or current == total:
77
+ write_progress(current, total)
78
+ rate_limiter.reset()
79
+ yield chunk
80
+
81
+
82
+ def get_download_progress_renderer(
83
+ *, bar_type: str, size: Optional[int] = None
84
+ ) -> DownloadProgressRenderer:
85
+ """Get an object that can be used to render the download progress.
86
+
87
+ Returns a callable, that takes an iterable to "wrap".
88
+ """
89
+ if bar_type == "on":
90
+ return functools.partial(_rich_progress_bar, bar_type=bar_type, size=size)
91
+ elif bar_type == "raw":
92
+ return functools.partial(_raw_progress_bar, size=size)
93
+ else:
94
+ return iter # no-op, when passed an iterator