~f-ddlmZddlZddlZddlZddlZddlZddlZddlm Z ddl m Z ddl m Z ddlmZmZddlZddlZddlZddlZddlZddlmZddlmZmZdd lmZdd lmZd d l m!Z!m"Z"d d l#m$Z$d dl%m&Z&m'Z'd dl(m)Z)m*Z*d dl+m,Z,d dl-m.Z.d dl-m/Z/d dl-m0Z0d dl-m1Z2d dl3m4Z4d dl5m6Z6m7Z7d dl8m9Z9d dl:m;Z;d dlZ>dgZ?e@eAfZBdZCdZDdZEdZFdZGd ZHd!ZId"ZJd#ZKd$ZLd%ZMd&ZNd'ZOd(ZPerejjZSne;ejjZSGd)deSZRGd*d+e>ZTy),) annotationsN)suppress)iglob)Path) TYPE_CHECKINGMutableMapping)DEBUG)DistutilsOptionErrorDistutilsSetupError)translate_longopt) strtobool) partitionunique_everseen) OrderedSet) InvalidMarkerMarker)InvalidSpecifier SpecifierSet)Version) _entry_points)_normalization)_reqs)command)metadata)setupcfg pyprojecttoml)ConfigDiscovery) get_unpatched)InformationOnlySetuptoolsDeprecationWarning Distributionc tj|dd}|jrJy#ttt t f$r}t|d|d|d}~wwxYw)N)valuenamegroupz/ must be importable 'module:attrs' string (got ))r EntryPointextras TypeError ValueErrorAttributeErrorAssertionErrorr )distattrr$epes X/var/lib/jenkins/workspace/mettalog/venv/lib/python3.12/site-packages/setuptools/dist.pycheck_importabler3-sZ  u4t D99}9 z>> B!FJE R  s&)AAAc t|ttfsJdj||k7sJy#tt t tf$r}t|d|d|d}~wwxYw)z"Verify that value is a string listz must be a list of strings (got r'N) isinstancelisttuplejoinr*r+r,r-r r.r/r$r1s r2assert_string_listr;7sd %$///wwu~&&& z>> B!7;U C  s.1A! AA!c|}t||||D]x}|j|stdd|zz|jd\}}}|r%||vr!tj j d||tjdddzy ) z(Verify that namespace packages are validz1Distribution contains no modules or packages for znamespace package %r.z^WARNING: %r is declared as a package namespace, but %r is not: please correct this in setup.pyz/The namespace_packages parameter is deprecated.z 2! &   s14A AAc|jd\}}} t|t t j |y#t$rd|d|d}t|dwxYw)N:zInvalid environment marker: z (r')r _check_markerrr r7rparse)extrareqsr%rHmarkermsgs r2rOrOnsi,D#v1f T  1,VHBuiqA!#&D01s AA c@|syt|}|jyN)revaluate)rXms r2rTrTxs vAJJLrKc\t||k7rd}t|j||y)z)Verify that value is True, False, 0, or 1z0{attr!r} must be a boolean value (got {value!r}))r/r$N)boolr format)r.r/r$tmpls r2 assert_boolrbs0 E{eA!$++4u+"EFFrKcT|stj|dyt|d)Nz is ignored.z is invalid.)DistDeprecationWarningrDr r.r/r$s r2invalid_unless_falserfs/ ##tfL$9: l3 44rKc ttj|t|tt fr t dy#t tf$r$}d}t|j|||d}~wwxYw)z9Verify that install_requires is a valid requirements listzUnordered types are not allowedzm{attr!r} must be a string or list of strings containing valid project/version requirement specifiers; {error}r/errorN) r7rrUr6dictsetr*r+r r`r.r/r$riras r2check_requirementsrmsv R U[[  edC[ )=> > * z "R O "$++4u+"EFEQ Rs?AA5A00A5c t|y#ttf$r$}d}t|j |||d}~wwxYw)z.Verify that value is a valid version specifierzF{attr!r} must be a string containing valid version specifiers; {error}rhN)rrr,r r`rls r2check_specifierrosFRU n -RW!$++4u+"EFEQRs A<Acj tj|y#t$r}t||d}~wwxYw)z)Verify that entry_points map is parseableN)rload Exceptionr r:s r2check_entry_pointsrss2,5! ,!!$!+,s 2 -2c:t|ts tdy)Nztest_suite must be a string)r6strr res r2check_test_suitervs eS !!"?@@ "rKct|tstdj||j D]L\}}t|t stdj||t |dj||Ny)z@Verify that value is a dictionary of package names to glob listszT{!r} must be a dictionary mapping package names to lists of string wildcard patternsz,keys of {!r} dict must be strings (got {!r})zvalues of {!r} dictN)r6rjr r`rPrur;)r.r/r$kvs r2check_package_datarzs~ eT "! ''-vd|   1!S!%>EEdAN  4!6!=!=d!CQG rKc|D]9}tjd|rtjj d|;y)Nz \w+(\.\w+)*z[WARNING: %r not a valid package name; please use only .-separated package names in setup.py)rematchrArBrC)r.r/r$pkgnames r2check_packagesrs4xx0 MM  8 rKcNeZdZUdZdeeddeedZdZde d<d Z d.d/d Z d Z d Z ed ZdZdZd0dZedZd.dZdZdZdZd.dZdZd1dZdZdZedZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+d*Z,d+Z-d,Z.fd-Z/xZ0S)2r"aG Distribution with support for tests and package data This is an enhanced version of 'distutils.dist.Distribution' that effectively adds the following new optional keyword arguments to 'setup()': 'install_requires' -- a string or sequence of strings specifying project versions that the distribution requires when installed, in the format used by 'pkg_resources.require()'. They will be installed automatically when the package is installed. If you wish to use packages that are not available in PyPI, or want to give your users an alternate download location, you can add a 'find_links' option to the '[easy_install]' section of your project's 'setup.cfg' file, and then setuptools will scan the listed web pages for links that satisfy the requirements. 'extras_require' -- a dictionary mapping names of optional "extras" to the additional requirement(s) that using those extras incurs. For example, this:: extras_require = dict(reST = ["docutils>=0.3", "reSTedit"]) indicates that the distribution can optionally provide an extra capability called "reST", but it can only be used if docutils and reSTedit are installed. If the user installs your package using EasyInstall and requests one of your extras, the corresponding additional requirements will be installed if needed. 'test_suite' -- the name of a test suite to run for the 'test' command. If the user runs 'python setup.py test', the package will be installed, and the named test suite will be run. The format is the same as would be used on a 'unittest.py' command line. That is, it is the dotted name of an object to import and call to generate a test suite. 'package_data' -- a dictionary mapping package names to lists of filenames or globs to use to find data files contained in the named packages. If the dictionary has filenames or globs listed under '""' (the empty string), those names will be searched for in every package, in addition to any names for the specific package. Data files found using these names/globs will be installed along with the package, in the same location as the package. Note that globs are allowed to reference the contents of non-package subdirectories, as long as you use '/' as a path separator. (Globs are automatically converted to platform-specific paths at runtime.) In addition to these new keywords, this class also has several new methods for manipulating the distribution's contents. For example, the 'include()' and 'exclude()' methods can be thought of as in-place add and subtract commands that add or remove packages, modules, extensions, and so on from the distribution. cyr[rrKr2zDistribution.srKcyr[rrrKr2rzDistribution. srKcyr[rrrKr2rzDistribution. srK)long_description_content_type project_urlsprovides_extras license_file license_filesinstall_requiresextras_requireNz list[str]namespace_packagesc~|rd|vsd|vrytjt|dj}t t j 5t j|}|>|jds-tjt|d|_ ||_ dddy#1swYyxYw)Nr%versionzPKG-INFO) r safe_namerulowerrrPackageNotFoundError distribution read_text safe_version_version _patched_dist)selfattrsr%r.s r2patch_missing_pkg_infoz#Distribution.patch_missing_pkg_infos e+y/E ''E&M(:;AAC h33 4 *((.Dz(B . ; ;Ci@P?? ',{{}Otq!8NadO OtZ0 ,/5+D1 ##E* $ 7 7 8M8M N  !Ps ( F5Fcdh}t|jDchc]}t|j|d|}}||z }|rd|}t|ycc}w)Nr%z&Required package metadata is missing: )rrgetattrr )rrequiredkeyprovidedmissingrYs r2_validate_metadatazDistribution._validate_metadataAst8DMM* t}}c40<   X% :7)DC%c* *  s Ac |jjD]?\}}t|jj ||j ||Ay)z Fill-in missing metadata fields not supported by distutils. Some fields may have been set by other tools (e.g. pbr). Those fields (vars(self.metadata)) take precedence to supplied attrs. N)rrPrrrget)rroptiondefaults r2rz#Distribution._set_metadata_defaultsNsH $CCIIKOFG   * *6599VWY3O P LrKcddlm}t|tjr t |}nt||s||St t |}||k7rtjd|d|d|S|S)Nr)sicz Normalizing 'z' to '') r5rr6numbersNumberrurr rD)rr normalizeds r2rzDistribution._normalize_versionXsn gw~~ .'lG  %N)* j  =  |1!M N rKct|ddr|j|j_|j|j|j_|j |j_|j r\|j j D]>}|jdd}|s|jjj|@yy)z Set `metadata.python_requires` and fix environment markers in `install_requires` and `extras_require`. python_requiresNrSr) rrr_normalize_requiresrrkeyssplitradd)rrVs r2rzDistribution._finalize_requireshs 4*D 1,0,@,@DMM )   ")-)>)> &'+':': $   ,,113 C(+MM1155e< 4 rKcdt|ddxsg}t|ddxsi}tttt j ||_|jDcic]6\}}|tttt j |xsg8c}}|_ycc}}w)zAMake sure requirement-related attributes exist and are normalizedrNr) rr7maprurrUrrPr)rrrrxrys r2rz Distribution._normalize_requires{s"4);TBHb '7>D" $Sekk:J.K%L M@N@T@T@V 8<1AtCU[[b123 3  s';B,c |jj}|r|ng}|jj}|r||vr|j|||gd}t t |j ||j_y)z>> list(Distribution._expand_patterns(['LICENSE'])) ['LICENSE'] >>> list(Distribution._expand_patterns(['pyproject.toml', 'LIC*'])) ['pyproject.toml', 'LICENSE'] c3K|]O}tt|D]6}|jds#tjj |r|8Qyw)~N)sortedrendswithospathisfile).0patternrs r2 z0Distribution._expand_patterns..sQ uW~. ==%"''..*>   sAAr)rs r2rzDistribution._expand_patternss #  rKc &ddlm}tjtjk(rgngd}t |}||j }tr|jd|}t|_ |D]}t|d5}tr)|jdjd it|j|ddd|jD]r}|j!|}|j#|} |D]I} | d k(s| |vr |j%|| } |j'| |} |j)| |} || f| | <Kt|j+d |j,vry|j,d j/D]S\} \} } |j0j%| } | r t3|  } n| d vr t3| } t5|| xs| | Uy#1swY$xYw#t6$r}t9||d}~wwxYw) z Adapted from distutils.dist.Distribution.parse_config_files, this method provides the same functionality in subtly-improved ways. r) ConfigParser) z install-basezinstall-platbasez install-libzinstall-platlibzinstall-purelibzinstall-headerszinstall-scriptsz install-dataprefixz exec-prefixhomeuserrootNz"Distribution.parse_config_files():utf-8encodingz reading {filename}__name__global)verbosedry_runr) configparserrsysr base_prefix frozensetfind_config_filesr announceru optionxformopenr`locals read_filesectionsoptionsget_option_dictrwarn_dash_deprecationmake_option_lowercasercommand_optionsrP negative_optr setattrr+r )r filenamesrignore_optionsparserfilenamereadersectionropt_dictoptvalsrcaliasr1s r2_parse_config_filesz Distribution._parse_config_filess . zzS__,  (#>2  ..0I  MM> ? !Hh1 )VMM"?"8"?"?"K&("KL  ( )"??, ..1//8"Cj(C>,A  **Wc2C44S'BC44S'BC%-sOHSM# - OO )", 4// /  $33H=CCEOC#s%%))#.E#C.(..n 5elsC0 F7 ) )H 5*1-14 5s%AG)G6)G3 6 H? H  Hc@|dvr|S|jdd}ttjtj j |j}|jds |dk7r||vr|Sd|vr tjdd|d|d d d |S) N)zoptions.extras_requirezoptions.data_files-_rrzInvalid dash-separated optionsz) Usage of dash-separated zZ will not be supported in future versions. Please use the underscore name z instead. !userguide/declarative_config.htmli r>due_date) replacer7rMchainrAr__all___setuptools_commands startswithr!rD)rrrunderscore_optcommandss r2rz"Distribution.warn_dash_deprecations   JS#. OO!!))))+  ""9-:%x'! ! #: ( - -0)),0::H9KL=& rKc tjdj}|Dchc]}|jc}Scc}w#tj$rgcYSwxYw)N setuptools)rrrr%r)rrr0s r2rz!Distribution._setuptools_commandssO #00>KKL&23BGG3 33,, I s#A;AAAAc |dk7s|jr|S|j}tjdd|d|d|ddd |S) NrzInvalid uppercase configurationz$ Usage of uppercase key z in zL will not be supported in future versions. Please use lowercase z instead. r r r)islowerrr!rD)rrr lowercase_opts r2rz"Distribution.make_option_lowercase si j CKKMJ $)) -$$'7$wk:33@2CD  9" rKc |j}||j|}tr|jd|z|j D]\}\}}tr|jd|d|d|d |j Dcgc] }t |}} |j} t|t} || vr| rt|| |t| nL||vr| rt||t|n/t||rt|||ntd|d|d |d ycc}w#t$rg}YwxYw#t$ri} YwxYw#t$r} t| | d} ~ wwxYw) a Set the options for 'command_obj' from 'option_dict'. Basically this means copying elements of a dictionary ('option_dict') to attributes of an instance ('command'). 'command_obj' must be a Command instance. If 'option_dict' is not supplied, uses the standard option dictionary for this command (from 'self.command_options'). (Adopted from distutils.dist.Distribution._set_command_options) Nz# setting options for '%s' command:z z = z (from r'z error in z : command 'z' has no such option 'r)get_command_namerr rrPboolean_optionsr r,rr6rurr rr r+) r command_obj option_dict command_namersourcer$o bool_optsneg_opt is_stringr1s r2_set_command_optionsz!Distribution._set_command_options2sn#335  ..|N:NOy(YK51AB[&1K7.!<9+(;X!   "    5*1-14 5sO9D.D)D. D?)A=E)D.. D<;D<? E  E  E* E%%E*cg}t|jxstjd}|-t d|}t |d}t |d}||fS|j r|g}||fS)z/Add default file and split between INI and TOMLzpyproject.tomlc2t|jdk(S)Nz.toml)rsuffix)fs r2rz8Distribution._get_project_config_files..esQ'(ArKrr)rrrcurdirrr7exists)rr tomlfilesstandard_project_metadatapartss r2_get_project_config_filesz&Distribution._get_project_config_files`s} $()C"))EU$V!  A9MEU1XIU1XI)##' - - /23I)##rKc|j|\}}|j|tj||j||D]}t j ||||j|jy)zXParses configuration files from various levels and loads configuration. )r)ignore_option_errorsN) r1rrparse_configurationrrapply_configurationrr)rrr3inifilesr.rs r2parse_config_fileszDistribution.parse_config_filesls#<R S" ! $$&rKc ddlm}|||S)zResolve pre-setup requirementsr)_fetch_build_eggs) installerr9)rrequiresr9s r2fetch_build_eggszDistribution.fetch_build_eggs}s0 x00rKcd}d}tj|}tj|j|}t d|}t ||D] }|| y)z Allow plugins to apply arbitrary operations to the distribution. Each hook may optionally define a 'order' to influence the order of execution. Smaller numbers go first and the default is 0. z(setuptools.finalize_distribution_optionsct|ddS)Norderr)r)hooks r2by_orderz/Distribution.finalize_options..by_orders4!, ,rKrc"|jSr[)rq)r1s r2rz/Distribution.finalize_options..s qvvxrK)rN)rrrM filterfalse_removedrr)rr&rAdefinedfilteredloadedr0s r2finalize_optionszDistribution.finalize_optionss[; -''e4((@'2X.B tH/rKc$dh}|j|vS)z When removing an entry point, if metadata is loaded from an older version of Setuptools, that removed entry point will attempt to be loaded and will fail. See #2765 for more details. 2to3_doctests)r%)r0removeds r2rDzDistribution._removeds  ww'!!rKctjdD]>}t||jd}||j ||j|@y)Nrr)rrrr%rq)rr0r$s r2_finalize_setup_keywordsz%Distribution._finalize_setup_keywordssI''.HIBD"''40E  $/JrKcddlm}tjj tj d}tjj |stj||j|tjj |d}t|dd5}|jd|jd |jd ddd|S|S#1swY|SxYw) Nr)windows_supportz.eggsz README.txtwrrzcThis directory contains eggs that were downloaded by setuptools to build, test, and run plug-ins. zAThis directory caches those eggs to prevent repeated downloads. z/However, it is safe to delete this directory. ) r5rOrrr9r,r-mkdir hide_filerwrite)rrO egg_cache_dirreadme_txt_filenamer+s r2get_egg_cache_dirzDistribution.get_egg_cache_dirs% RYY8 ww~~m, HH] #  % %m 4"$'',,}l"K )3A MQJ.KL M} Ms (4C((C2c ddlm}|||S)z Fetch an egg needed for buildingr)fetch_build_egg)r:rX)rreqrXs r2rXzDistribution.fetch_build_eggs.tS))rKc||jvr|j|S|dk(rddlm}|Stjd|}|D]$}|j x|j|<}|cSt j||S)z(Pluggable version of get_command_class() bdist_wheelr)r[distutils.commands)r&r%)cmdclasscommand.bdist_wheelr[rrrqrget_command_class)rrr[epsr0r]s r2r_zDistribution.get_command_classs dmm #==) ) m # 8 ##*>WMB02 9DMM' "XO!224A ArKctjdD]D}|j|jvs|j }||j|j<Ft j |SNr\r)rrr%r]rqrprint_commandsrr0r]s r2rczDistribution.print_commandssY''.BCBwwdmm+779)1 bgg&D++D11rKctjdD]D}|j|jvs|j }||j|j<Ft j |Srb)rrr%r]rqrget_command_listrds r2rfzDistribution.get_command_listsY''.BCBwwdmm+779)1 bgg&D--d33rKc |jD]2\}}t|d|zd}|r ||!|j||4y)aAdd items to distribution that are named in keyword arguments For example, 'dist.include(py_modules=["x"])' would add 'x' to the distribution's 'py_modules' attribute, if it was not already there. Currently, this method only supports inclusion for attributes that are lists or tuples. If you need to add support for adding to other attributes in this or a subclass, you can add an '_include_X' method, where 'X' is the name of the attribute. The method will be called with the value passed to 'include()'. So, 'dist.include(foo={"bar":"baz"})' will try to call 'dist._include_foo({"bar":"baz"})', which can then handle whatever special inclusion logic is needed. _include_N)rPr _include_misc)rrrxryincludes r2rjzDistribution.includesDKKMDAqdK!OT:G ""1a( "rKc|dz}|jr7|jDcgc]}||k7s |j|r|c}|_|jr7|jDcgc]}||k7s |j|r|c}|_|jrJ|jDcgc].}|j|k7r|jj|s|0c}|_yycc}wcc}wcc}w)z9Remove packages, modules, and extensions in named packager=N)packagesr py_modules ext_modulesr%rpackagepfxps r2exclude_packagezDistribution.exclude_packagesm ====ALcARDM ????a7l1<->s-C D     s' C#C#C## C(.C(C(&3C-ch|dz}|jD]}||k(s|j|syy)zBEJ  X$%C ?:c8#<%MM  D$# K$U9J K L  X%&H4&OPVW W X!Ls# A3 B &B 3 B<B  BcNt|tst|d|d t||}|t |||yt|tst|dz|Dcgc] }||vs| }}t ||||zy#t$r}td|z|d}~wwxYwcc}w)zAHandle 'include()' for list/tuple attrs without a special handlerz: setting must be a list (r'rwNrxry)rr%r$r{r1r|news r2rizDistribution._include_misc+s%*%4QV&WX X X$%C ; D$ &C*%MM %*=DT_4=C= D$c * X%&H4&OPVW W X>s# B! B"+B" B BBc |jD]2\}}t|d|zd}|r ||!|j||4y)aRemove items from distribution that are named in keyword arguments For example, 'dist.exclude(py_modules=["x"])' would remove 'x' from the distribution's 'py_modules' attribute. Excluding packages uses the 'exclude_package()' method, so all of the package's contained packages, modules, and extensions are also excluded. Currently, this method only supports exclusion from attributes that are lists or tuples. If you need to add support for excluding from other attributes in this or a subclass, you can add an '_exclude_X' method, where 'X' is the name of the attribute. The method will be called with the value passed to 'exclude()'. So, 'dist.exclude(foo={"bar":"baz"})' will try to call 'dist._exclude_foo({"bar":"baz"})', which can then handle whatever special exclusion logic is needed. _exclude_N)rPrr})rrrxryexcludes r2rzDistribution.exclude>sD KKMDAqdK!OT:G ""1a( "rKct|tstd|dtt |j |y)Nz+packages: setting must be a list or tuple (r')r6rzr r7rrs)rrls r2_exclude_packageszDistribution._exclude_packagesUs6(H-%DLN  S%%x 01rKc|jj|_|jj|_|d}|jd}||vr.||\}}||=ddl}|j |d|dd|d}||vr.t j|||}|j|} t| ddrd|f|j|d<|gS|S)NraliasesTrcommand_consumes_arguments command lineargs) __class__global_optionsrrshlexrr_parse_command_optsr_r) rrrrrrrrnargs cmd_classs r2rz Distribution._parse_command_opts\s"nn;; NN77q'&&y1  )JC {{5$/D!H1gG  11$E**73 9:D A5CU4KD  )& 1   rKc i}|jjD]\}}|jD]\}\}}|dk7r|jdd}|dk(ru|j|}|jj }|j t|di|jD]\} } | |k(s | }d}ntd|dk(rd}||j|i|<|S) ahReturn a '{cmd: {opt:val}}' map of all command-line options Option names are all long, but do not include the leading '--', and contain dashes rather than underscores. If the option doesn't take an argument (e.g. '--quiet'), the 'val' is 'None'. Note that options provided by config files are intentionally excluded. rr rrrNzShouldn't be able to get herer) rrPrget_command_objrcopyupdaterr-r) rdcmdoptsrrrcmdobjr%negposs r2get_cmdline_optionsz Distribution.get_cmdline_optionsws --335IC#'::<Zc3.(kk#s+!8!11#6F"//446GNN76>2#FG$+MMOS#:"%C"&C! %4 --LMMAXC-0 S"%c*+$060rKc#K|jxsdEd{|jxsdEd{|jxsdD]>}t|tr|\}}n |j }|j dr|dd}|@y7n7Xw)z@Yield all packages, modules, and extension names in distributionrNmodulei)rlrmrnr6r8r%r)rextr% buildinfos r2ruz$Distribution.iter_distribution_namess==&B&&??(b((##)r)C#u%"%ixx}}X&CRyJ* '(s B BB BAB B cFddl}|jrtj||St |j t jstj||S|j jjdvrtj||S|j j}|j jd tj|||j j|S#|j j|wxYw)zIf there were any non-global "display-only" options (--help-commands or the metadata display options) on the command line, display the requested info and return true; else return false. rN)rutf8rr) r help_commandsrhandle_display_optionsr6stdoutio TextIOWrapperrr reconfigure)r option_orderrrs r2rz#Distribution.handle_display_optionss     77lK K#**b&6&67 77lK K ::   $ $ &*; ; 77lK K::&& 0 6 77lK JJ " "H " 5CJJ " "H " 5s DD cD|jt| |yr[)rsuper run_command)rrrs r2rzDistribution.run_commands  G$rKr[)rzMutableMapping | NonereturnNone)rr)NF)1r __module__ __qualname____doc__rjrr7rr__annotations__rrrr staticmethodrrrrrrrrrr'r1r7r<rHrDrMrVrXr_rcrfrjrsr?r}rirrrrrurr __classcell__)rs@r2r"r"s(1h*6%$% '#M!! *"> +Q  =&  &    M5^ D$,5\ $'"1 $ " "0 ** B$24),* M"+&).26$L 68%%rKceZdZdZy)rdzrClass for warning about deprecations in dist in setuptools. Not ignored by default, unlike DeprecationWarning.N)rrrrrrKr2rdrdsFrKrd)U __future__rrrMrrr|r contextlibrglobrpathlibrtypingrr distutils.cmdrAdistutils.commanddistutils.coredistutils.dist distutils.logdistutils.debugr distutils.errorsr r distutils.fancy_getoptr distutils.utilr extern.more_itertoolsrrextern.ordered_setrextern.packaging.markersrrextern.packaging.specifiersrrextern.packaging.versionrr5rrrrr  _importlibrconfigrr discoveryrmonkeyrwarningsr r!rr8r7rzr3r;rJrQrOrTrbrfrmrorsrvrzrcorer"rrdrrKr2rs "  0!F4$=*;G- +&!C   $;  : G5 RR,A HNN//M!).."="=>M| %=| %~F9FrK