1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
U
H=®dÅéã@s¸ddlZddlmZddlZddlZddlmZddlZddl    Z    ddl
Z
ddl Z ddl Z ddl Z ddlZz ddlZWnek
rŒdZYnXddlZddlZddlZddlZddlZz ddlZWnek
rÞddlZYnXddlZddlmZddlmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0e
 1e2¡Z3e  4d¡Z5e  4d¡Z6e  4d    ¡Z7e  4d
¡Z8e  4d ¡Z9e  4d ¡Z:e  4d ¡Z;e  4d¡Z<dd„Z=dd„Z>dd„Z?dd„Z@dd„ZAdˆdd„ZBdd„ZCdd„ZDdd „ZEejFd!d"„ƒZGejFd#d$„ƒZHejFd‰d&d'„ƒZIGd(d)„d)eJƒZKd*d+„ZLGd,d-„d-eJƒZMd.d/„ZNGd0d1„d1eJƒZOe  4d2e jP¡ZQd3d4„ZRdŠd5d6„ZSd7d8„ZTd9d:„ZUd;d<„ZVd=d>„ZWd?d@„ZXe  4dAe jY¡ZZe  4dB¡Z[d‹dCdD„Z\e  4dE¡Z]dFdG„Z^dHdI„Z_dJdK„Z`dLZadMdN„ZbdOdP„ZcGdQdR„dReJƒZdGdSdT„dTeJƒZeGdUdV„dVeJƒZfdWZgdŒdYdZ„Zhd[d\„Zid]ZjGd^d_„d_eJƒZke  4d`¡Zle  4da¡Zme  4db¡Zndcdd„Zdedf„ZoerÖddglmpZqmrZrmsZsGdhdi„die$jtƒZtGdjdk„dkeqƒZpGdldm„dmepe'ƒZuejvddn…ZwewdokrGdpdq„dqe$jxƒZxerGdrds„dse$jyƒZyGdtdu„due%jzƒZzerBGdvdw„dwe%j{ƒZ{Gdxdy„dye%j|ƒZ|dzd{„Z}Gd|d}„d}eJƒZ~Gd~d„de~ƒZGd€d„de~ƒZ€Gd‚dƒ„dƒe(ƒZGd„d…„d…eJƒZ‚d†d‡„ZƒdS)éN)Údeque)Úiglobé)ÚDistlibException)Ú string_typesÚ    text_typeÚshutilÚ    raw_inputÚStringIOÚcache_from_sourceÚurlopenÚurljoinÚhttplibÚ    xmlrpclibÚ    splittypeÚ HTTPHandlerÚBaseConfiguratorÚ valid_identÚ    ContainerÚ configparserÚURLErrorÚZipFileÚfsdecodeÚunquoteÚurlparsez^([\w\.-]+)\s*z^([\w\.*+-]+)\s*z^(<=?|>=?|={2,3}|[~!]=)\s*z*^((<=?)|(>=?)|={2,3}|[~!]=|in|not\s+in)\s*z^or\b\s*z    ^and\b\s*z(\S+)\s*z(([\s\w\.{}()*+#:;,/?!~`@$%^&=|<>\[\]-]+)cs6dd„‰‡‡fdd„‰‡fdd„‰‡fdd„‰ˆ|ƒS)    ae
    Parse a marker string and return a dictionary containing a marker expression.
 
    The dictionary will contain keys "op", "lhs" and "rhs" for non-terminals in
    the expression grammar, or strings. A string contained in quotes is to be
    interpreted as a literal string, and a string not contained in quotes is a
    variable (such as os_name).
    cSs.t |¡}|r,| ¡d}|| ¡d…}nú|s:tdƒ‚nì|d}|dkrVtd|ƒ‚d |d¡}|dd…}|g}|rì|d|krАqqt|d|kr®| |¡|dd…}qtt |¡}|sÈtd|ƒ‚| | ¡d¡|| ¡d…}qtd |¡}td|ƒ‚| |¡d |¡}|dd…     ¡}||fS)    Nrzunexpected end of inputz'"zinvalid expression: %sÚrzerror in string literal: %szunterminated string: %s)
Ú
IDENTIFIERÚmatchÚgroupsÚendÚ SyntaxErrorÚreplaceÚappendÚ STRING_CHUNKÚjoinÚlstrip)Ú    remainingÚmÚresultÚqÚoqÚpartsÚs©r-úOD:\z\workplace\VsCode\pyvenv\venv\Lib\site-packages\pip/_vendor/distlib/util.pyÚ
marker_varAs:
 
 
 
 
 
 
z parse_marker.<locals>.marker_varcs´|rR|ddkrRˆ|dd… ¡ƒ\}}|ddkr@td|ƒ‚|dd… ¡}nZˆ|ƒ\}}|r¨t |¡}|srq¨| ¡d}|| ¡d…}ˆ|ƒ\}}|||dœ}q^|}||fS)Nrú(rú)úunterminated parenthesis: %s©ÚopÚlhsÚrhs)r%r Ú    MARKER_OPrrr)r&r(r5r'r4r6)Úmarkerr/r-r.Ú marker_expres    
  z!parse_marker.<locals>.marker_exprcsRˆ|ƒ\}}|rJt |¡}|s qJ|| ¡d…}ˆ|ƒ\}}d||dœ}q ||fS)NÚandr3)ÚANDrr©r&r5r'r6)r9r-r.Ú
marker_andxs 
 z parse_marker.<locals>.marker_andcsRˆ|ƒ\}}|rJt |¡}|s qJ|| ¡d…}ˆ|ƒ\}}d||dœ}q ||fS)NÚorr3)ÚORrrr<)r=r-r.r8ƒs 
 zparse_marker.<locals>.markerr-)Ú marker_stringr-)r8r=r9r/r.Ú parse_marker8s
    $ rAcCs0| ¡}|r| d¡rdSt |¡}|s4td|ƒ‚| ¡d}|| ¡d…}d}}}}|r:|ddkr:| dd¡}|dkr”td|ƒ‚|d|…}    ||dd… ¡}g}|    r0t |    ¡}|sØtd    |    ƒ‚|     | ¡d¡|    | ¡d…}    |    sq0|    dd
krtd |    ƒ‚|    dd… ¡}    q¸|s:d}|r˜|dd krÀ|dd… ¡}t
 |¡}|sztd |ƒ‚| ¡d}t |ƒ}
|
j rž|
j sªtd|ƒ‚|| ¡d… ¡}nØdd„} |ddkrä| |ƒ\}}n´| dd¡}|dkrtd|ƒ‚|d|…}    ||dd… ¡}t |    ¡r@| |    ƒ\}} nXt |    ¡}|s\td|    ƒ‚| ¡d} |    | ¡d… ¡}    |    rŽtd|    ƒ‚d| fg}|rÔ|ddkr¸td|ƒ‚|dd… ¡}t|ƒ\}}|rô|ddkrôtd|ƒ‚|s|}nd|d dd„|Dƒ¡f}t||||||dS)zŠ
    Parse a requirement passed in as a string. Return a Container
    whose attributes contain the various parts of the requirement.
    ú#Nzname expected: %srú[ú]rzunterminated extra: %szmalformed extra: %sú,zcomma expected in extras: %sú@zinvalid URI: %szInvalid URL: %scSsÄt |¡}d}|r¼g}| ¡d}|| ¡d…}t |¡}|sLtd|ƒ‚| ¡d}| ||f¡|| ¡d…}|r´|ddkrˆq´|dd… ¡}t |¡}|std|ƒ‚q|s¼d}||fS)z|
                Return a list of operator, version tuples if any are
                specified, else None.
                Nrzinvalid version: %srErúinvalid constraint: %s)Ú
COMPARE_OPrrrÚVERSION_IDENTIFIERr r"r%)Ú ver_remainingr'Úversionsr4Úvr-r-r.Ú get_versionsÅs*
 
 
z'parse_requirement.<locals>.get_versionsr0r1r2rGz~=ú;zinvalid requirement: %szunexpected trailing data: %sú%s %sú, cSsg|] }d|‘qS)rOr-)Ú.0Úconr-r-r.Ú
<listcomp>sz%parse_requirement.<locals>.<listcomp>)ÚnameÚextrasÚ constraintsr8ÚurlÚ requirement)ÚstripÚ
startswithrrr rrÚfindr%r"Ú    NON_SPACErÚschemeÚnetlocrHrIrAr$r)Úreqr&r'ÚdistnamerUÚ    mark_exprrKÚuriÚir,ÚtrMÚ_rLÚrsr-r-r.Úparse_requirement‘s’
 
 
 
 
 
   ÿrgcCs¨dd„}i}|D]’\}}}tj ||¡}t|ƒD]p}tj ||¡}    t|    ƒD]T}
|||
ƒ} |dkrn| | d¡qJ|||
ƒ} | tjjd¡ d¡} | d| || <qJq0q|S)z%Find destinations for resources filescSsD| tjjd¡}| tjjd¡}| |¡s.t‚|t|ƒd… d¡S©Nú/)r!ÚosÚpathÚseprZÚAssertionErrorÚlenr%)Úrootrkr-r-r.Ú get_rel_path sz)get_resources_dests.<locals>.get_rel_pathNri)rjrkr$rÚpopr!rlÚrstrip)Úresources_rootÚrulesrpÚ destinationsÚbaseÚsuffixÚdestÚprefixÚabs_baseÚabs_globÚabs_pathÚ resource_fileÚrel_pathÚrel_destr-r-r.Úget_resources_dests
s  
 
r€cCs(ttdƒrd}ntjttdtjƒk}|S)NÚ real_prefixTÚ base_prefix)ÚhasattrÚsysryÚgetattr©r(r-r-r.Úin_venv$s
r‡cCs$tj tj¡}t|tƒs t|ƒ}|S©N)rjrkÚnormcaser„Ú
executableÚ
isinstancerrr†r-r-r.Úget_executable.s
 
rŒcCsN|}t|ƒ}|}|s|r|}|r|d ¡}||kr6qJ|rd|||f}q|S)Nrz    %c: %s
%s)r    Úlower)ÚpromptÚ allowed_charsÚ error_promptÚdefaultÚpr,Úcr-r-r.Úproceed>s r”cCs8t|tƒr| ¡}i}|D]}||kr||||<q|Srˆ)r‹rÚsplit)ÚdÚkeysr(Úkeyr-r-r.Úextract_by_keyNs
r™cCsztjddkrt d¡|ƒ}| ¡}t|ƒ}zlt |¡}|ddd}| ¡D]B\}}| ¡D]0\}}d||f}t    |ƒ}    |    dk    sˆt
‚|    ||<q`qP|WSt k
r¸|  dd¡YnXdd    „}
t  ¡} z|
| |ƒWn<t jk
r| ¡t |¡}t|ƒ}|
| |ƒYnXi}|  ¡D]R} i|| <}|  | ¡D]4\} }d| |f}t    |ƒ}    |    dk    sft
‚|    || <q<q"|S)
Nréúutf-8Ú
extensionszpython.exportsÚexportsz%s = %scSs$t|dƒr| |¡n
| |¡dS)NÚ    read_file)rƒržÚreadfp)ÚcpÚstreamr-r-r.Ú read_streamks
 z!read_exports.<locals>.read_stream)r„Ú version_infoÚcodecsÚ    getreaderÚreadr
ÚjsonÚloadÚitemsÚget_export_entryrmÚ    ExceptionÚseekrÚ ConfigParserÚMissingSectionHeaderErrorÚcloseÚtextwrapÚdedentÚsections)r¡ÚdataÚjdatar(ÚgroupÚentriesÚkrLr,Úentryr¢r r˜rTÚvaluer-r-r.Ú read_exportsWsD
 
   rºcCs¨tjddkrt d¡|ƒ}t ¡}| ¡D]l\}}| |¡| ¡D]P}|j    dkr\|j
}nd|j
|j    f}|j r†d|d  |j ¡f}|  ||j|¡qFq,| |¡dS)Nrršr›z%s:%sz%s [%s]rP)r„r£r¤Ú    getwriterrr­r©Ú add_sectionÚvaluesrwryÚflagsr$ÚsetrTÚwrite)rr¡r r·rLr¸r,r-r-r.Ú write_exports†s
 
rÁc    cs$t ¡}z
|VW5t |¡XdSrˆ)ÚtempfileÚmkdtemprÚrmtree)Útdr-r-r.Útempdir™s
rÆc    cs.t ¡}zt |¡dVW5t |¡XdSrˆ)rjÚgetcwdÚchdir)r–Úcwdr-r-r.rÈ¡s
 
 
rÈéc    cs.t ¡}zt |¡dVW5t |¡XdSrˆ)ÚsocketÚgetdefaulttimeoutÚsetdefaulttimeout)ÚsecondsÚctor-r-r.Úsocket_timeout«s
 
 
rÐc@seZdZdd„Zddd„ZdS)Úcached_propertycCs
||_dSrˆ)Úfunc)ÚselfrÒr-r-r.Ú__init__¶szcached_property.__init__NcCs,|dkr |S| |¡}t ||jj|¡|Srˆ)rÒÚobjectÚ __setattr__Ú__name__)rÓÚobjÚclsr¹r-r-r.Ú__get__»s
 
zcached_property.__get__)N)r×Ú
__module__Ú __qualname__rÔrÚr-r-r-r.rѵsrÑcCs~tjdkr|S|s|S|ddkr.td|ƒ‚|ddkrFtd|ƒ‚| d¡}tj|krh| tj¡qP|srtjStjj|ŽS)aÐReturn 'pathname' as a name that will work on the native filesystem.
 
    The path is split on '/' and put back together again using the current
    directory separator.  Needed because filenames in the setup script are
    always supplied in Unix style, and have to be converted to the local
    convention before we can actually use them in the filesystem.  Raises
    ValueError on non-Unix-ish systems if 'pathname' either starts or
    ends with a slash.
    rirzpath '%s' cannot be absoluteéÿÿÿÿzpath '%s' cannot end with '/')rjrlÚ
ValueErrorr•ÚcurdirÚremoverkr$)ÚpathnameÚpathsr-r-r.Ú convert_pathÃs
 
 
 
rãc@s”eZdZd$dd„Zdd„Zdd„Zdd    „Zd%d d „Zd&dd„Zdd„Z    dd„Z
dd„Z dd„Z dd„Z d'dd„Zdd„Zdd„Zd d!„Zd"d#„Zd S)(Ú FileOperatorFcCs||_tƒ|_| ¡dSrˆ)Údry_runr¿ÚensuredÚ _init_record)rÓrår-r-r.rÔßszFileOperator.__init__cCsd|_tƒ|_tƒ|_dS©NF)Úrecordr¿Ú files_writtenÚ dirs_created©rÓr-r-r.rçäszFileOperator._init_recordcCs|jr|j |¡dSrˆ)rérêÚadd)rÓrkr-r-r.Úrecord_as_writtenészFileOperator.record_as_writtencCsHtj |¡s tdtj |¡ƒ‚tj |¡s0dSt |¡jt |¡jkS)aÎTell if the target is newer than the source.
 
        Returns true if 'source' exists and is more recently modified than
        'target', or if 'source' exists and 'target' doesn't.
 
        Returns false if both exist and 'target' is the same age or younger
        than 'source'. Raise PackagingFileError if 'source' does not exist.
 
        Note that this test is not very accurate: files created in the same
        second will have the same "age".
        zfile '%r' does not existT)rjrkÚexistsrÚabspathÚstatÚst_mtime)rÓÚsourceÚtargetr-r-r.Únewerís 
ÿ zFileOperator.newerTcCsŽ| tj |¡¡t d||¡|js€d}|rdtj |¡rDd|}n tj |¡rdtj     |¡sdd|}|rtt
|dƒ‚t   ||¡|  |¡dS)z8Copy a file respecting dry-run and force flags.
        zCopying %s to %sNz%s is a symlinkz%s is a non-regular filez which would be overwritten)Ú
ensure_dirrjrkÚdirnameÚloggerÚinforåÚislinkrïÚisfilerÞrÚcopyfilerî)rÓÚinfileÚoutfileÚcheckÚmsgr-r-r.Ú    copy_files 
  zFileOperator.copy_fileNcCs„tj |¡rt‚| tj |¡¡t d||¡|jsv|dkrJt    |dƒ}nt
j    |d|d}zt   ||¡W5|  ¡X| |¡dS)NzCopying stream %s to %sÚwbÚw©Úencoding)rjrkÚisdirrmrör÷rørùråÚopenr¤r¯rÚ copyfileobjrî)rÓÚinstreamrþrÚ    outstreamr-r-r.Ú copy_streams 
zFileOperator.copy_streamc    Cs\| tj |¡¡|jsNtj |¡r.t |¡t|dƒ}| |¡W5QRX|     |¡dS)Nr)
rörjrkr÷rårïràrrÀrî)rÓrkr³Úfr-r-r.Úwrite_binary_file!s 
 zFileOperator.write_binary_filecCs| || |¡¡dSrˆ)r Úencode)rÓrkr³rr-r-r.Úwrite_text_file*szFileOperator.write_text_filecCsntjdkstjdkrjtjdkrj|D]F}|jr:t d|¡q"t |¡j|B|@}t d||¡t ||¡q"dS)NÚposixÚjavazchanging mode of %szchanging mode of %s to %o)    rjrTÚ_namerårørùrñÚst_modeÚchmod)rÓÚbitsÚmaskÚfilesr Úmoder-r-r.Úset_mode-szFileOperator.set_modecCs| dd|¡S)Nimiÿ)r)r,r r-r-r.Ú<lambda>9ózFileOperator.<lambda>cCs|tj |¡}||jkrxtj |¡sx|j |¡tj |¡\}}| |¡t     d|¡|j
sft  |¡|j rx|j  |¡dS)Nz Creating %s)rjrkrðrærïrír•rörørùråÚmkdirrérë)rÓrkr–r r-r-r.rö;s  
 
zFileOperator.ensure_dirc    Cs˜t|| ƒ}t d||¡|jsŠ|s0| ||¡rX|s:d}n| |¡sHt‚|t|ƒd…}i}|rvtt    dƒrvt    j
j |d<t    j |||df|Ž|  |¡|S)NzByte-compiling %s to %sÚPycInvalidationModeÚinvalidation_modeT)r rørùrårõrZrmrnrƒÚ
py_compilerÚ CHECKED_HASHÚcompilerî)    rÓrkÚoptimizeÚforceryÚhashed_invalidationÚdpathÚdiagpathÚcompile_kwargsr-r-r.Ú byte_compileGs  
zFileOperator.byte_compilecCs²tj |¡r®tj |¡r^tj |¡s^t d|¡|js@t     |¡|j
r®||j kr®|j   |¡nPtj |¡rpd}nd}t d||¡|js’t  |¡|j
r®||j kr®|j   |¡dS)NzRemoving directory tree at %sÚlinkÚfilezRemoving %s %s)rjrkrïrrúrøÚdebugrårrÄrérëràrê)rÓrkr,r-r-r.Úensure_removedXs"  
 
 
 
zFileOperator.ensure_removedcCsDd}|s@tj |¡r$t |tj¡}q@tj |¡}||kr:q@|}q|Srè)rjrkrïÚaccessÚW_OKr÷)rÓrkr(Úparentr-r-r.Ú is_writablems  zFileOperator.is_writablecCs"|js
t‚|j|jf}| ¡|S)zV
        Commit recorded changes, turn off recording, return
        changes.
        )rérmrêrërç)rÓr(r-r-r.Úcommitys
 zFileOperator.commitcCs’|js†t|jƒD]}tj |¡rt |¡qt|jdd}|D]F}t     |¡}|rz|dgks^t
‚tj  ||d¡}t  |¡t  |¡q>|  ¡dS)NT)ÚreverseÚ __pycache__r)råÚlistrêrjrkrïràÚsortedrëÚlistdirrmr$Úrmdirrç)rÓr Údirsr–ÚflistÚsdr-r-r.Úrollbackƒs  
 
 zFileOperator.rollback)F)T)N)FFNF)r×rÛrÜrÔrçrîrõrr r rrÚset_executable_moderör(r,r0r1r;r-r-r-r.räÞs 
 
 
     
 
räcCs^|tjkrtj|}nt|ƒ}|dkr,|}n.| d¡}t|| d¡ƒ}|D]}t||ƒ}qJ|S)NÚ.r)r„ÚmodulesÚ
__import__r•r…rq)Ú module_nameÚ dotted_pathÚmodr(r+r’r-r-r.Úresolve•s
 
 rCc@s6eZdZdd„Zedd„ƒZdd„Zdd„Zej    Z    d    S)
Ú ExportEntrycCs||_||_||_||_dSrˆ©rTryrwr¾)rÓrTryrwr¾r-r-r.rÔ¥szExportEntry.__init__cCst|j|jƒSrˆ)rCryrwrìr-r-r.r¹«szExportEntry.valuecCsd|j|j|j|jfS)Nz<ExportEntry %s = %s:%s %s>rErìr-r-r.Ú__repr__¯s
ÿzExportEntry.__repr__cCsDt|tƒsd}n0|j|jko>|j|jko>|j|jko>|j|jk}|Srè)r‹rDrTryrwr¾)rÓÚotherr(r-r-r.Ú__eq__³s
 
ÿ
þ
ýzExportEntry.__eq__N)
r×rÛrÜrÔrÑr¹rFrHrÕÚ__hash__r-r-r-r.rD¤s 
 
rDz¸(?P<name>(\w|[-.+])+)
                      \s*=\s*(?P<callable>(\w+)([:\.]\w+)*)
                      \s*(\[\s*(?P<flags>[\w-]+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])?
                      c
Csàt |¡}|s0d}d|ks"d|krÜtd|ƒ‚n¬| ¡}|d}|d}| d¡}|dkrf|d}}n"|dkrztd|ƒ‚| d¡\}}|d    }    |    dkrºd|ks¨d|kr´td|ƒ‚g}    nd
d „|     d ¡Dƒ}    t||||    ƒ}|S) NrCrDzInvalid specification '%s'rTÚcallableú:rrr¾cSsg|] }| ¡‘qSr-)rY)rQr r-r-r.rSßsz$get_export_entry.<locals>.<listcomp>rE)ÚENTRY_REÚsearchrÚ    groupdictÚcountr•rD)
Ú specificationr'r(r–rTrkÚcolonsryrwr¾r-r-r.rªÅs8
ÿ
 ÿÿrªcCsÈ|dkr d}tjdkr.dtjkr.tj d¡}n tj d¡}tj |¡rft |tj¡}|s¢t     
d|¡n<zt  |¡d}Wn(t k
r t    j
d    |dd
d }YnX|sºt  ¡}t     
d |¡tj ||¡S) a¦
    Return the default base location for distlib caches. If the directory does
    not exist, it is created. Use the suffix provided for the base directory,
    and default to '.distlib' if it isn't provided.
 
    On Windows, if LOCALAPPDATA is defined in the environment, then it is
    assumed to be a directory, and will be the parent directory of the result.
    On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home
    directory - using os.expanduser('~') - will be the parent directory of
    the result.
 
    The result is just the directory '.distlib' in the parent directory as
    determined above, or with the name specified with ``suffix``.
    Nz.distlibÚntÚ LOCALAPPDATAz $localappdataú~z(Directory exists but is not writable: %sTzUnable to create %s)Úexc_infoFz#Default location unusable, using %s)rjrTÚenvironrkÚ
expandvarsÚ
expanduserrr-r.røÚwarningÚmakedirsÚOSErrorrÂrÃr$)rwr(Úusabler-r-r.Úget_cache_baseäs&  
 
 r]cCsBtj tj |¡¡\}}|r(| dd¡}| tjd¡}||dS)a
    Convert an absolute path to a directory name for use in a cache.
 
    The algorithm used is:
 
    #. On Windows, any ``':'`` in the drive is replaced with ``'---'``.
    #. Any occurrence of ``os.sep`` is replaced with ``'--'``.
    #. ``'.cache'`` is appended.
    rKz---z--z.cache)rjrkÚ
splitdriverðr!rl)rkr–r’r-r-r.Úpath_to_cache_dir s
 
 r_cCs| d¡s|dS|Srh)Úendswith)r,r-r-r.Ú ensure_slashs
racCs`d}}d|kr>| dd¡\}}d|kr.|}n| dd¡\}}|rJt|ƒ}|rVt|ƒ}|||fS)NrFrrK)Úrsplitr•r)r^ÚusernameÚpasswordryr-r-r.Úparse_credentials$srecCst d¡}t |¡|S)Né)rjÚumaskr†r-r-r.Úget_process_umask3s
 
rhcCs<d}d}t|ƒD]\}}t|tƒsd}q,q|dk    s8t‚|S)NTF)Ú    enumerater‹rrm)Úseqr(rcr,r-r-r.Úis_string_sequence8s
 rkz3([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-([a-z0-9_.+-]+)z -py(\d\.?\d?)cCsÈd}d}t|ƒ dd¡}t |¡}|r@| d¡}|d| ¡…}|r˜t|ƒt|ƒdkr˜t t     |¡d|¡}|r˜| 
¡}|d|…||dd…|f}|dkrÄt  |¡}|rÄ| d¡| d¡|f}|S)zw
    Extract name, version, python version from a filename (no extension)
 
    Return name, version, pyver or None
    Nú ú-rz\brš) rr!ÚPYTHON_VERSIONrMrµÚstartrnÚrerÚescaperÚPROJECT_NAME_AND_VERSION)ÚfilenameÚ project_namer(Úpyverr'Únr-r-r.Úsplit_filenameGs"
 
 
rwz-(?P<name>[\w .-]+)\s*\(\s*(?P<ver>[^\s)]+)\)$cCs:t |¡}|std|ƒ‚| ¡}|d ¡ ¡|dfS)zÇ
    A utility method used to get name and version from a string.
 
    From e.g. a Provides-Dist value.
 
    :param p: A value in a form 'foo (1.0)'
    :return: The name and version as a tuple.
    z$Ill-formed name/version string: '%s'rTÚver)ÚNAME_VERSION_RErrrNrYr)r’r'r–r-r-r.Úparse_name_and_versioncs
    
 rzcCsºtƒ}t|pgƒ}t|pgƒ}d|kr8| d¡||O}|D]x}|dkrT| |¡q<| d¡r”|dd…}||kr€t d|¡||kr´| |¡q<||krªt d|¡| |¡q<|S)NÚ*rmrzundeclared extra: %s)r¿ràrírZrørY)Ú    requestedÚ    availabler(ÚrÚunwantedr-r-r.Ú
get_extrasrs&  
 
   r€c
Csˆi}zNt|ƒ}| ¡}| d¡}| d¡s8t d|¡nt d¡|ƒ}t     |¡}Wn0t
k
r‚}zt  d||¡W5d}~XYnX|S)Nz Content-Typezapplication/jsonz(Unexpected response for JSON request: %sr›z&Failed to get external data for %s: %s) r rùÚgetrZrør+r¤r¥r§r¨r«Ú    exception)rWr(ÚrespÚheadersÚctÚreaderÚer-r-r.Ú_get_external_data‹s
 
 rˆz'https://www.red-dove.com/pypi/projects/cCs*d|d ¡|f}tt|ƒ}t|ƒ}|S)Nz%s/%s/project.jsonr©Úupperr Ú_external_data_base_urlrˆ)rTrWr(r-r-r.Úget_project_data¡s
rŒcCs(d|d ¡||f}tt|ƒ}t|ƒS)Nz%s/%s/package-%s.jsonrr‰)rTÚversionrWr-r-r.Úget_package_data§s
rŽc@s(eZdZdZdd„Zdd„Zdd„ZdS)    ÚCachezæ
    A class implementing a cache for resources that need to live in the file system
    e.g. shared libraries. This class was moved from resources to here because it
    could be used by other modules, e.g. the wheel module.
    cCsPtj |¡st |¡t |¡jd@dkr6t d|¡tj tj     |¡¡|_
dS)zu
        Initialise an instance.
 
        :param base: The base directory where the cache should be located.
        é?rzDirectory '%s' is not privateN) rjrkrrZrñrrørYrðÚnormpathrv)rÓrvr-r-r.rÔ´s
 
 zCache.__init__cCst|ƒS)zN
        Converts a resource prefix to a directory name in the cache.
        )r_)rÓryr-r-r.Ú prefix_to_dirÂszCache.prefix_to_dirc    Csˆg}t |j¡D]r}tj |j|¡}z>tj |¡s>tj |¡rJt |¡ntj |¡r`t     
|¡Wqt k
r€|  |¡YqXq|S)z"
        Clear the cache.
        ) rjr6rvrkr$rúrûràrrrÄr«r")rÓÚ not_removedÚfnr-r-r.ÚclearÈs  z Cache.clearN)r×rÛrÜÚ__doc__rÔr’r•r-r-r-r.r­src@s:eZdZdZdd„Zddd„Zdd„Zd    d
„Zd d „Zd S)Ú
EventMixinz1
    A very simple publish/subscribe system.
    cCs
i|_dSrˆ)Ú _subscribersrìr-r-r.rÔÝszEventMixin.__init__TcCsD|j}||krt|gƒ||<n"||}|r6| |¡n
| |¡dS)a`
        Add a subscriber for an event.
 
        :param event: The name of an event.
        :param subscriber: The subscriber to be added (and called when the
                           event is published).
        :param append: Whether to append or prepend the subscriber to an
                       existing subscriber list for the event.
        N)r˜rr"Ú
appendleft)rÓÚeventÚ
subscriberr"ÚsubsÚsqr-r-r.ríàs
 zEventMixin.addcCs,|j}||krtd|ƒ‚|| |¡dS)z™
        Remove a subscriber for an event.
 
        :param event: The name of an event.
        :param subscriber: The subscriber to be removed.
        zNo subscribers: %rN)r˜rÞrà)rÓršr›rœr-r-r.ràôs zEventMixin.removecCst|j |d¡ƒS)z
        Return an iterator for the subscribers for an event.
        :param event: The event to return subscribers for.
        r-)Úiterr˜r)rÓršr-r-r.Úget_subscribersszEventMixin.get_subscribersc    Oslg}| |¡D]F}z||f|ž|Ž}Wn"tk
rHt d¡d}YnX| |¡qt d||||¡|S)a^
        Publish a event and return a list of values returned by its
        subscribers.
 
        :param event: The event to publish.
        :param args: The positional arguments to pass to the event's
                     subscribers.
        :param kwargs: The keyword arguments to pass to the event's
                       subscribers.
        z"Exception during event publicationNz/publish %s: args = %s, kwargs = %s, result = %s)rŸr«rør‚r"r+)rÓršÚargsÚkwargsr(r›r¹r-r-r.Úpublishs 
 
 ÿzEventMixin.publishN)T)    r×rÛrÜr–rÔríràrŸr¢r-r-r-r.r—Ùs 
 r—c@s^eZdZdd„Zdd„Zddd„Zdd    „Zd
d „Zd d „Zdd„Z    e
dd„ƒZ e
dd„ƒZ dS)Ú    SequencercCsi|_i|_tƒ|_dSrˆ)Ú_predsÚ_succsr¿Ú_nodesrìr-r-r.rÔ"szSequencer.__init__cCs|j |¡dSrˆ)r¦rí©rÓÚnoder-r-r.Úadd_node'szSequencer.add_nodeFcCs®||jkr|j |¡|rªt|j |d¡ƒD]}| ||¡q,t|j |d¡ƒD]}| ||¡qPt|j ¡ƒD]\}}|sp|j|=qpt|j ¡ƒD]\}}|s”|j|=q”dS)Nr-)r¦ràr¿r¤rr¥r4r©)rÓr¨Úedgesr’r,r·rLr-r-r.Ú remove_node*s
 
zSequencer.remove_nodecCs<||ks t‚|j |tƒ¡ |¡|j |tƒ¡ |¡dSrˆ)rmr¤Ú
setdefaultr¿rír¥)rÓÚpredÚsuccr-r-r.rí:s z Sequencer.addcCsˆ||ks t‚z|j|}|j|}Wn tk
rDtd|ƒ‚YnXz| |¡| |¡Wn$tk
r‚td||fƒ‚YnXdS)Nz%r not a successor of anythingz%r not a successor of %r)rmr¤r¥ÚKeyErrorrÞrà)rÓr­r®ÚpredsÚsuccsr-r-r.rà?s 
 
zSequencer.removecCs||jkp||jkp||jkSrˆ)r¤r¥r¦)rÓÚstepr-r-r.Úis_stepLsÿzSequencer.is_stepcCs˜| |¡std|ƒ‚g}g}tƒ}| |¡|r| d¡}||krb||krŽ| |¡| |¡q.| |¡| |¡|j |d¡}|     |¡q.t
|ƒS)Nz Unknown: %rrr-) r³rÞr¿r"rqràrír¤rÚextendÚreversed)rÓÚfinalr(ÚtodoÚseenr²r°r-r-r.Ú    get_stepsPs"
 
 
 
 
 
 zSequencer.get_stepscsRdg‰g‰i‰i‰g‰|j‰‡‡‡‡‡‡‡fdd„‰ˆD]}|ˆkr8ˆ|ƒq8ˆS)Nrcsðˆdˆ|<ˆdˆ|<ˆdd7<ˆ |¡z ˆ|}Wntk
rVg}YnX|D]J}|ˆkrˆˆ|ƒtˆ|ˆ|ƒˆ|<q\|ˆkr\tˆ|ˆ|ƒˆ|<q\ˆ|ˆ|krìg}ˆ ¡}| |¡||kr¼qÚq¼t|ƒ}ˆ |¡dS)Nrr)r"r«ÚminrqÚtuple)r¨Ú
successorsÚ    successorÚconnected_componentÚ    component©ÚgraphÚindexÚ index_counterÚlowlinksr(ÚstackÚ strongconnectr-r.rÆts,  
 
 
z3Sequencer.strong_connections.<locals>.strongconnect)r¥r§r-rÀr.Ústrong_connectionsis"
zSequencer.strong_connectionscCsfdg}|jD]*}|j|}|D]}| d||f¡qq |jD]}| d|¡q>| d¡d |¡S)Nz digraph G {z   %s -> %s;z  %s;Ú}Ú
)r¤r"r¦r$)rÓr(r®r°r­r¨r-r-r.Údotœs
 
 
 
z Sequencer.dotN)F) r×rÛrÜrÔr©r«ríràr³r¹ÚpropertyrÇrÊr-r-r-r.r£!s
 
2r£)ú.tar.gzú.tar.bz2ú.tarú.zipú.tgzú.tbzú.whlTc
sL‡‡fdd„}tj ˆ¡‰tˆƒ‰d}|dkr†| d¡r>d}nH| d¡rRd}d}n4| d¡rfd    }d
}n | d ¡rzd }d }n td|ƒ‚z°|dkrºt|d ƒ}|rä| ¡}|D] }||ƒqªn*t     
||¡}|rä|  ¡}|D] }||ƒqÖ|dkr*t j ddkr*| ¡D]"}    t|    jtƒs|    j d¡|    _q| ˆ¡W5|rF| ¡XdS)NcsRt|tƒs| d¡}tj tj ˆ|¡¡}| ˆ¡rB|ˆtjkrNt    d|ƒ‚dS)Nr›zpath outside destination: %r)
r‹rÚdecoderjrkrðr$rZrlrÞ)rkr’©Údest_dirÚplenr-r.Ú
check_path±s
 
 
zunarchive.<locals>.check_path)rÏrÒÚzip)rÌrÐÚtgzzr:gz)rÍrÑÚtbzzr:bz2rÎÚtarr~zUnknown format for %rrršr›)rjrkrðrnr`rÞr¯rÚnamelistÚtarfilerÚgetnamesr„r£Ú
getmembersr‹rTrrÓÚ
extractall)
Úarchive_filenamerÕÚformatrÿr×ÚarchiverÚnamesrTÚtarinfor-rÔr.Ú    unarchive¯sH 
 
 
 
 
 
 ræc     Cs~t ¡}t|ƒ}t|dƒZ}t |¡D]H\}}}|D]8}tj ||¡}||d…}    tj |    |¡}
| ||
¡q4q&W5QRX|S)z*zip a directory tree into a BytesIO objectrN)    ÚioÚBytesIOrnrrjÚwalkrkr$rÀ) Ú    directoryr(ÚdlenÚzfror8rrTÚfullÚrelrxr-r-r.Úzip_dirås  rï)rÚKÚMÚGÚTÚPc@sreZdZdZddd„Zdd„Zdd    „Zd
d „Zd d „Ze    dd„ƒZ
e    dd„ƒZ dd„Z e    dd„ƒZ e    dd„ƒZdS)ÚProgressÚUNKNOWNrédcCs<|dks||kst‚||_|_||_d|_d|_d|_dS)NrF)rmrºÚcurÚmaxÚstartedÚelapsedÚdone)rÓÚminvalÚmaxvalr-r-r.rÔüs  zProgress.__init__cCsV|j|kst‚|jdks&||jks&t‚||_t ¡}|jdkrF||_n ||j|_dSrˆ)rºrmrùrøÚtimerúrû)rÓÚcurvalÚnowr-r-r.Úupdates
zProgress.updatecCs |dks t‚| |j|¡dS©Nr)rmrrø)rÓÚincrr-r-r.Ú    increments zProgress.incrementcCs| |j¡|Srˆ)rrºrìr-r-r.ros zProgress.startcCs |jdk    r| |j¡d|_dS)NT)rùrrürìr-r-r.Ústops
 z Progress.stopcCs|jdkr|jS|jSrˆ)rùÚunknownrìr-r-r.ÚmaximumszProgress.maximumcCsD|jr d}n4|jdkrd}n$d|j|j|j|j}d|}|S)Nz100 %z ?? %gY@z%3d %%)rürùrørº)rÓr(rLr-r-r.Ú
percentages
zProgress.percentagecCs:|dkr|jdks|j|jkr$d}nt dt |¡¡}|S)Nrz??:??:??z%H:%M:%S)rùrørºrÿÚstrftimeÚgmtime)rÓÚdurationr(r-r-r.Úformat_duration*szProgress.format_durationcCs‚|jrd}|j}n^d}|jdkr&d}nJ|jdks<|j|jkrBd}n.t|j|jƒ}||j|j}|d|j}d|| |¡fS)NÚDonezETA rÝrrz%s: %s)rürûrùrørºÚfloatr )rÓryrdr-r-r.ÚETA3s
z Progress.ETAcCsL|jdkrd}n|j|j|j}tD]}|dkr6q@|d}q&d||fS)Nrgièg@@z%d %sB/s)rûrørºÚUNITS)rÓr(Úunitr-r-r.ÚspeedFs
 
zProgress.speedN)rr÷)r×rÛrÜrrÔrrrorrËrr    r rrr-r-r-r.rõùs
 
 
 
 
    
rõz \{([^}]*)\}z[^/\\,{]\*\*|\*\*[^/\\,}]z^[^{]*\}|\{[^}]*$cCs<t |¡rd}t||ƒ‚t |¡r4d}t||ƒ‚t|ƒS)zAExtended globbing function that supports ** and {opt1,opt2,opt3}.z7invalid glob %r: recursive glob "**" must be used alonez2invalid glob %r: mismatching set marker '{' or '}')Ú_CHECK_RECURSIVE_GLOBrMrÞÚ_CHECK_MISMATCH_SETÚ_iglob)Ú    path_globrr-r-r.r[s
 
 rc cst |d¡}t|ƒdkrht|ƒdks,t|ƒ‚|\}}}| d¡D]$}td |||f¡ƒD]
}|VqXq@nœd|kr†t|ƒD]
}|Vqxn~| dd¡\}}|dkr¢d}|dkr°d}n| d¡}| d    ¡}t     |¡D]4\}}}    tj
  |¡}ttj
 ||¡ƒD]
}
|
VqöqÎdS)
NrršrErz**r=r{riú\) Ú    RICH_GLOBr•rnrmrr$Ú    std_iglobr%rjrérkr‘) rÚrich_path_globryr¿rwÚitemrkÚradicalÚdirrr”r-r-r.rfs*  
 
 
 
 r)Ú HTTPSHandlerÚmatch_hostnameÚCertificateErrorc@seZdZdZdZdd„ZdS)ÚHTTPSConnectionNTcCs\t |j|jf|j¡}t|ddƒr0||_| ¡tt    dƒsp|j
rHt    j }nt    j }t    j ||j|j|t    j|j
d|_n‚t     t    j¡}tt    dƒr–|jt    jO_|jr¬| |j|j¡i}|j
rât    j |_|j|j
dtt    ddƒrâ|j|d<|j |f|Ž|_|j
rX|jrXz$t|j ¡|jƒt d    |j¡Wn0tk
rV|j tj¡|j ¡‚YnXdS)
NÚ _tunnel_hostFÚ
SSLContext)Ú    cert_reqsÚ ssl_versionÚca_certsÚ OP_NO_SSLv2)ÚcafileÚHAS_SNIÚserver_hostnamezHost verified: %s) rËÚcreate_connectionÚhostÚportÚtimeoutr…ÚsockÚ_tunnelrƒÚsslr'Ú CERT_REQUIREDÚ    CERT_NONEÚ wrap_socketÚkey_fileÚ    cert_fileÚPROTOCOL_SSLv23r$Úoptionsr(Úload_cert_chainÚ verify_modeÚload_verify_locationsÚ check_domainr Ú getpeercertrør+r!ÚshutdownÚ    SHUT_RDWRr¯)rÓr0r%Úcontextr¡r-r-r.ÚconnectsB 
ý
 
 
 
zHTTPSConnection.connect)r×rÛrÜr'r=rBr-r-r-r.r"Šsr"c@s&eZdZd    dd„Zdd„Zdd„ZdS)
rTcCst |¡||_||_dSrˆ)ÚBaseHTTPSHandlerrÔr'r=)rÓr'r=r-r-r.rÔ¶s
zHTTPSHandler.__init__cOs$t||Ž}|jr |j|_|j|_|S)a
            This is called to create a connection instance. Normally you'd
            pass a connection class to do_open, but it doesn't actually check for
            a class, and just expects a callable. As long as we behave just as a
            constructor would have, we should be OK. If it ever changes so that
            we *must* pass a class, we'll create an UnsafeHTTPSConnection class
            which just sets check_domain to False in the class definition, and
            choose which one to pass to do_open.
            )r"r'r=)rÓr r¡r(r-r-r.Ú _conn_maker»s
 
 
zHTTPSHandler._conn_makerc
CsXz| |j|¡WStk
rR}z$dt|jƒkr@td|jƒ‚n‚W5d}~XYnXdS)Nzcertificate verify failedz*Unable to verify server certificate for %s)Údo_openrDrÚstrÚreasonr!r-)rÓr_r‡r-r-r.Ú
https_openËsÿzHTTPSHandler.https_openN)T)r×rÛrÜrÔrDrHr-r-r-r.rµs
rc@seZdZdd„ZdS)ÚHTTPSOnlyHandlercCstd|ƒ‚dS)NzAUnexpected HTTP request on what should be a secure connection: %s)r)rÓr_r-r-r.Ú    http_openßsÿzHTTPSOnlyHandler.http_openN)r×rÛrÜrJr-r-r-r.rIÞsrIé©rKéc@seZdZddd„ZdS)ÚHTTPrNcKs&|dkr d}| |j||f|Ž¡dSr©Ú_setupZ_connection_class©rÓr-r.r¡r-r-r.rÔësz HTTP.__init__)rN©r×rÛrÜrÔr-r-r-r.rNêsrNc@seZdZddd„ZdS)ÚHTTPSrNcKs&|dkr d}| |j||f|Ž¡dSrrOrQr-r-r.rÔószHTTPS.__init__)rNrRr-r-r-r.rSòsrSc@seZdZddd„Zdd„ZdS)Ú    TransportrcCs||_tj ||¡dSrˆ)r/rrTrÔ©rÓr/Ú use_datetimer-r-r.rÔúszTransport.__init__cCs`| |¡\}}}tdkr(t||jd}n4|jr<||jdkrR||_|t |¡f|_|jd}|S)NrL)r/rr)Ú get_host_infoÚ    _ver_inforNr/Ú _connectionÚ_extra_headersrÚHTTPConnection)rÓr-ÚhÚehÚx509r(r-r-r.Úmake_connectionþs
zTransport.make_connectionN)r©r×rÛrÜrÔr_r-r-r-r.rTùs
rTc@seZdZddd„Zdd„ZdS)Ú SafeTransportrcCs||_tj ||¡dSrˆ)r/rrarÔrUr-r-r.rÔ szSafeTransport.__init__cCsx| |¡\}}}|si}|j|d<tdkr:t|df|Ž}n:|jrN||jdkrj||_|tj|df|Žf|_|jd}|S)Nr/rLrr)rWr/rXrSrYrZrr")rÓr-r\r]r¡r(r-r-r.r_s
 ÿ
zSafeTransport.make_connectionN)rr`r-r-r-r.ra
s
rac@seZdZdd„ZdS)Ú ServerProxyc    Kst| dd¡|_}|dk    r^t|ƒ\}}| dd¡}|dkr@t}nt}|||d|d<}||_tjj    ||f|ŽdS)Nr/rVrÚhttps)rVÚ    transport)
rqr/rrrarTrdrrbrÔ)    rÓrbr¡r/r]rerVÚtclsrdr-r-r.rÔ s  zServerProxy.__init__NrRr-r-r-r.rbsrbcKs6tjddkr|d7}nd|d<d|d<t||f|ŽS)NrršÚbrÚnewliner›r)r„r£r)r”rr¡r-r-r.Ú    _csv_open4s
 
rhc@s4eZdZedƒedƒedƒdœZdd„Zdd„Zd    S)
ÚCSVBaserEú"rÉ)Ú    delimiterÚ    quotecharÚlineterminatorcCs|Srˆr-rìr-r-r.Ú    __enter__FszCSVBase.__enter__cGs|j ¡dSrˆ)r¡r¯)rÓrUr-r-r.Ú__exit__IszCSVBase.__exit__N)r×rÛrÜrFÚdefaultsrnror-r-r-r.ri?s ýric@s(eZdZdd„Zdd„Zdd„ZeZdS)Ú    CSVReadercKs\d|kr4|d}tjddkr,t d¡|ƒ}||_nt|ddƒ|_tj|jf|jŽ|_dS)Nr¡rršr›rkr~)    r„r£r¤r¥r¡rhÚcsvr†rp)rÓr¡r¡r-r-r.rÔNszCSVReader.__init__cCs|Srˆr-rìr-r-r.Ú__iter__YszCSVReader.__iter__cCsFt|jƒ}tjddkrBt|ƒD] \}}t|tƒs | d¡||<q |S©Nrršr›)Únextr†r„r£rir‹rrÓ)rÓr(rcrr-r-r.ru\s 
 
zCSVReader.nextN)r×rÛrÜrÔrsruÚ__next__r-r-r-r.rqMs rqc@seZdZdd„Zdd„ZdS)Ú    CSVWritercKs$t|dƒ|_tj|jf|jŽ|_dS)Nr)rhr¡rrÚwriterrp)rÓr”r¡r-r-r.rÔgs zCSVWriter.__init__cCsNtjddkr>g}|D]"}t|tƒr.| d¡}| |¡q|}|j |¡dSrt)r„r£r‹rrr"rxÚwriterow)rÓÚrowr~rr-r-r.ryks
 
 zCSVWriter.writerowN)r×rÛrÜrÔryr-r-r-r.rwfsrwcsHeZdZeejƒZded<d ‡fdd„    Zdd„Zdd    „Zd
d „Z    ‡Z
S) Ú ConfiguratorÚ inc_convertÚincNcs"tt|ƒ |¡|pt ¡|_dSrˆ)Úsuperr{rÔrjrÇrv)rÓÚconfigrv©Ú    __class__r-r.rÔ~szConfigurator.__init__c
s¬‡‡fdd„‰ˆ d¡}t|ƒs*ˆ |¡}ˆ dd¡}ˆ dd¡}|r\t‡fdd„|Dƒƒ}‡‡fd    d„ˆDƒ}t|ƒ}|||Ž}|r¨| ¡D]\}}    t||ˆ|    ƒƒqŽ|S)
Ncsvt|ttfƒr*t|ƒ‡fdd„|Dƒƒ}nHt|tƒrhd|krHˆ |¡}qri}|D]}ˆ||ƒ||<qPn
ˆ |¡}|S)Ncsg|] }ˆ|ƒ‘qSr-r-)rQrc©Úconvertr-r.rS…szBConfigurator.configure_custom.<locals>.convert.<locals>.<listcomp>ú())r‹r4r»ÚtypeÚdictÚconfigure_customrƒ)Úor(r·)rƒrÓr-r.rƒƒs
 
z.Configurator.configure_custom.<locals>.convertr„r=z[]r-csg|] }ˆ|ƒ‘qSr-r-)rQrˆr‚r-r.rS˜sz1Configurator.configure_custom.<locals>.<listcomp>cs$g|]}t|ƒr|ˆˆ|ƒf‘qSr-)r)rQr·)rrƒr-r.rS™s)rqrJrCr»r†r©Úsetattr)
rÓrr“Úpropsr r©r¡r(rvrLr-)rrƒrÓr.r‡‚s
 
 
zConfigurator.configure_customcCs4|j|}t|tƒr0d|kr0| |¡|j|<}|S)Nr„)rr‹r†r‡)rÓr˜r(r-r-r.Ú __getitem__¡s
zConfigurator.__getitem__c    CsFtj |¡stj |j|¡}tj|ddd}t |¡}W5QRX|S)z*Default converter for the inc:// protocol.r~r›r)    rjrkÚisabsr$rvr¤rr§r¨)rÓr¹r r(r-r-r.r|§s
 zConfigurator.inc_convert)N) r×rÛrÜr†rÚvalue_convertersrÔr‡r‹r|Ú __classcell__r-r-r€r.r{ys 
r{c@s*eZdZdZd
dd„Zdd„Zdd    „ZdS) ÚSubprocessMixinzC
    Mixin for running subprocesses and capturing their output
    FNcCs||_||_dSrˆ)ÚverboseÚprogress)rÓrr‘r-r-r.rÔ´szSubprocessMixin.__init__cCsj|j}|j}| ¡}|sq^|dk    r.|||ƒq |s@tj d¡ntj | d¡¡tj ¡q | ¡dS)z¨
        Read lines from a subprocess' output stream and either pass to a progress
        callable (if specified) or write progress information to sys.stderr.
        Nr=r›)    r‘rÚreadliner„ÚstderrrÀrÓÚflushr¯)rÓr¡rAr‘rr,r-r-r.r†¸s  zSubprocessMixin.readercKsžtj|ftjtjdœ|—Ž}tj|j|jdfd}| ¡tj|j|jdfd}| ¡|     ¡| 
¡| 
¡|j dk    rˆ|  dd¡n|j ršt j d¡|S)N)Ústdoutr“r•)rôr r“zdone.Úmainzdone.
)Ú
subprocessÚPopenÚPIPEÚ    threadingÚThreadr†r•ror“Úwaitr$r‘rr„rÀ)rÓÚcmdr¡r’Út1Út2r-r-r.Ú run_commandÍs" ÿÿ
 zSubprocessMixin.run_command)FN)r×rÛrÜr–rÔr†r r-r-r-r.r°s
rcCst dd|¡ ¡S)z,Normalize a python package name a la PEP 503z[-_.]+rm)rpÚsubr)rTr-r-r.Únormalize_nameÞsr¢)NN)rÊ)N)N)NT)„r¤Ú collectionsrÚ
contextlibrrÚglobrrrçr§ÚloggingrjrrprËr2Ú ImportErrorr—r„rÝrÂr°ršZdummy_threadingrÿrrÚcompatrrrr    r
r r r rrrrrrrrrrrrrÚ    getLoggerr×rør!rrIrHr7r?r;r\r#rArgr€r‡rŒr”r™rºrÁÚcontextmanagerrÆrÈrÐrÕrÑrãrärCrDÚVERBOSErLrªr]r_rarerhrkÚIrrrnrwryrzr€rˆr‹rŒrŽrr—r£ÚARCHIVE_EXTENSIONSrærïrrõrrrrrrCr r!r"rIr£rXrNrSrTrarbrhrirqrwr{rr¢r-r-r-r.Ú<module>sä   
  \
 
 
 
 
 
 
 
 
Yy
 
    /
 
         8ý
)
ÿ
 
 
,H 
6]
 
 
 +)    
 7.