U Qab@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z ddlmZmZmZmZddlZddlmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!ddlm"Z"ddl#m$Z$dd l%m&Z&dd l'm(Z(dd l)m*Z*dd l+m,Z,dd l-m.Z.e/Z0e1dZ2e1dej3Z4e1dZ5e1dej3j6Z7d8Z9ddddgZ:dZ;dZedZ?ddZ@ddZAddZBdGd dZCdHd!d"ZDdId#d$ZEdedfd%dZFdJd&d'ZGd(d)ZHe1d*ej3ZIeHd+d,ZJGd-d.d.ZKGd/d0d0eKZLGd1ddeZMe1d2jNZOd3d4ZPd5d6ZQdKd7d8ZRd9d:ZSGd;d<d<ZTGd=d>d>ejUZVejWjXfd?d@ZYdAdBZZeRe;eYZYdCdDZ[dEdFZ\dS)Lz#PyPI and direct package downloadingNwraps)six)urllib http_client configparsermap) CHECKOUT_DIST Distribution BINARY_DISTnormalize_path SOURCE_DIST Environmentfind_distributions safe_name safe_version to_filename Requirement DEVELOP_DISTEGG_DIST) ssl_support)log)DistutilsError) translate)get_all_headers)unescape)Wheelz^egg=([-A-Za-z0-9_.+!]+)$zhref\s*=\s*['"]?([^'"> ]+)z([^<]+)\n\s+\(md5\)z([-+.a-z0-9]{2,}):z.tar.gz .tar.bz2 .tar .zip .tgz PackageIndexdistros_for_urlparse_bdist_wininstinterpret_distro_namezrP)filenamerGr&r&r'distros_for_filenames  rTc cs||d}|s,tdd|ddDr,dStdt|dD]8}t||d|d|d||d|||dVq>dS)zGenerate alternative interpretations of a source distro name Note: if `location` is a filesystem filename, you should call ``pkg_resources.normalize_path()`` on it before passing it to this routine! rJcss|]}td|VqdS)z py\d\.\d$N)rerE).0pr&r&r' sz(interpret_distro_name..Nr6) py_versionrBrQ)r9anyrangerOr join)rKrPrGrZrBrQr;rWr&r&r'r s ccsft}|j}|dkr:tj|j|D]}|||Vq$n(|D]"}||}||kr>|||Vq>dS)zHList unique elements, preserving order. Remember all elements ever seen.N)setaddrZmoves filterfalse __contains__)iterablekeyseenZseen_addZelementkr&r&r'unique_everseens rfcstfdd}|S)zs Wrap a function returning an iterable such that the resulting iterable only ever yields unique items. cst||SN)rf)argskwargsfuncr&r'wrapperszunique_values..wrapperr)rkrlr&rjr' unique_valuessrmz(<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>c cst|D]d}|\}}tttj|d}d|ksDd|kr t |D]}t j |t |dVqNq dD]@}||}|dkrtt ||}|rtt j |t |dVqtdS)zEFind rel="homepage" and rel="download" links in `page`, yielding URLs,Zhomepager3r6)z Home PagezDownload URLr2N)RELfinditergroupsr^rstrstripr+r9HREFrr#urljoin htmldecoderFfindsearch)r:pagerEtagZrelZrelsposr&r&r'find_external_linkss   r|c@s(eZdZdZddZddZddZdS) ContentCheckerzP A null content checker that defines the interface for checking content cCsdS)z3 Feed a block of data to the hash. Nr&selfblockr&r&r'feedszContentChecker.feedcCsdS)zC Check the hash. Return False if validation fails. Tr&rr&r&r'is_validszContentChecker.is_validcCsdS)zu Call reporter with information about the checker (hash name) substituted into the template. Nr&)rreportertemplater&r&r'reportszContentChecker.reportN)__name__ __module__ __qualname____doc__rrrr&r&r&r'r}sr}c@sBeZdZedZddZeddZddZ dd Z d d Z d S) HashCheckerzK(?Psha1|sha224|sha384|sha256|sha512|md5)=(?P[a-f0-9]+)cCs||_t||_||_dSrg) hash_namehashlibnewhashexpected)rrrr&r&r'__init__s zHashChecker.__init__cCs>tj|d}|stS|j|}|s0tS|f|S)z5Construct a (possibly null) ContentChecker from a URLr2)rr#r7r}patternrx groupdict)clsr:r@rEr&r&r'from_urls zHashChecker.from_urlcCs|j|dSrg)rupdater~r&r&r'rszHashChecker.feedcCs|j|jkSrg)rZ hexdigestrrr&r&r'r"szHashChecker.is_validcCs||j}||Srg)r)rrrmsgr&r&r'r%s zHashChecker.reportN) rrrrUcompilerr classmethodrrrrr&r&r&r'r s rcs<eZdZdZdJddZdKd d ZdLd d ZdMd dZddZddZ ddZ ddZ dNddZ ddZ dOfdd ZddZdd Zd!d"Zd#d$Zd%d&ZdPd'd(ZdQd)d*Zd+d,Zd-Zd.d/Zd0d1ZdRd2d3Zd4d5Zd6d7Zd8d9Zd:d;Zdd?Z!d@dAZ"dBdCZ#dDdEZ$dFdGZ%dHdIZ&Z'S)Trz;A distribution index that scans web pages for download URLshttps://pypi.org/simple/*NTcOstj|f|||dd|d |_i|_i|_i|_td t t |j |_ g|_|ortjor|prt}|rt||_n tjj|_dS)Nr1|)rrr, index_url scanned_urls fetched_urls package_pagesrUrr]rrrEallowsto_scanrZ is_availableZfind_ca_bundleZ opener_foropenerrrequesturlopen)rrZhostsZ ca_bundleZ verify_sslrhkwZuse_sslr&r&r'r-s zPackageIndex.__init__Fc Cs||jkr|sdSd|j|<t|s2||dStt|}|r\||sPdS|d||sn|rn||jkrtt|j |dS||sd|j|<dS| d|d|j|<d}| |||}|dkrdSd|j|j <d|j ddkr|dS|j }|}t|tsNt|tjjr0d }n|j d p@d }||d }|t|D](} tj|t| d } || q`| |j!rt"|d ddkr|#||}dS)zexistswarnisdirrealpathlistdirrr]rTrrrr_)rfnnestedr>itemrr&r&r'rus    zPackageIndex.process_filenamecCsbt|}|o|ddk}|s8|tj|drentryr&r&r'rXs   z.PackageIndex.scan_egg_links..)filterrRr>rr itertoolsstarmap scan_egg_link)rZ search_pathdirsZ egg_linksr&r&r'scan_egg_linkss zPackageIndex.scan_egg_linksc Csttj||}ttdttj|}W5QRXt |dkrDdS|\}}t tj||D](}tjj|f||_ t |_ ||q^dS)NrY)openrRr>r]rrrrrrsrOrrKr rBr_)rr>rZ raw_lineslinesZegg_pathZ setup_pathrHr&r&r'rs  zPackageIndex.scan_egg_linkc sfdd}t|D]:}z |tj|t|dWqtk rNYqXq||\}}|rt||D]H}t |\}} | dr| s|r|d||f7}n | |qlt dd|SdSd S) z#Process the contents of a PyPI pagecs|jrtttjj|tjdd}t|dkrd|dkrt |d}t |d}dj | i|<t|t|fSdS)Nr1rYr5r6rT)NN)r-rrrrr#r8rOr9rrr setdefaultr+r)rr;pkgverrr&r'scans   z(PackageIndex.process_index..scanr6.pyz #egg=%s-%scSsd|dddS)Nz%sr6rY)rF)mr&r&r'z,PackageIndex.process_index..rN)rtrprr#rurvrFr$r|rAr,need_version_infoscan_urlPYPI_MD5sub) rr:ryrrErrnew_urlr/fragr&rr'rs(      zPackageIndex.process_indexcCs|d|dS)NzPPage at %s links to .py file(s) without version info; an index scan is required.)scan_allrr:r&r&r'rszPackageIndex.need_version_infocGs:|j|jkr*|r |j|f||d||jdS)Nz6Scanning index of all packages (this may take a while))rrrrrrrrhr&r&r'rs zPackageIndex.scan_allcCsz||j|jd|j|js:||j|jd|j|jsR||t|j|jdD]}||qfdS)Nr1r&) rr unsafe_namerrrcrLnot_found_in_indexr)r requirementr:r&r&r' find_packagess zPackageIndex.find_packagescsR|||||jD]"}||kr0|S|d||qtt|||S)Nz%s does not match %s)prescanrrcrsuperrobtain)rrZ installerrH __class__r&r'rs zPackageIndex.obtaincCsL||jd||sH|t|td|jjtj |fdS)z- checker is a ContentChecker zValidating %%s checksum for %sz7%s validation failed for %s; possible download problem?N) rrrrrRunlinkrrr.r>rP)rcheckerrStfpr&r&r' check_hashs zPackageIndex.check_hashcCsN|D]D}|jdks0t|r0|ds0tt|r<||q|j|qdS)z;Add `urls` to the list that will be prescanned for searchesNfile:)rrr-rrrappend)rZurlsr:r&r&r'add_find_linkss  zPackageIndex.add_find_linkscCs"|jrtt|j|jd|_dS)z7Scan urls scheduled for prescanning (e.g. --find-links)N)rrrrrr&r&r'rszPackageIndex.prescancCs<||jr|jd}}n |jd}}|||j|dS)Nz#Couldn't retrieve index page for %rz3Couldn't find index page for %r (maybe misspelled?))rcrrrr)rrZmethrr&r&r'r#s  zPackageIndex.not_found_in_indexcCs~t|tsjt|}|rR||d||}t|\}}|drN||||}|Stj |rb|St |}t | ||ddS)aLocate and/or download `spec` to `tmpdir`, returning a local path `spec` may be a ``Requirement`` object, or a string containing a URL, an existing local filename, or a project/version requirement spec (i.e. the string form of a ``Requirement`` object). If it is the URL of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is automatically created alongside the downloaded file. If `spec` is a ``Requirement`` object or a string containing a project/version requirement spec, this method returns the location of a matching distribution (possibly after downloading it to `tmpdir`). If `spec` is a locally existing file or directory name, it is simply returned unchanged. If `spec` is a URL, it is downloaded to a subpath of `tmpdir`, and the local filename is returned. Various errors may be raised if a problem occurs during downloading. r6rrKN)rrr _download_urlrFrAr, gen_setuprRr>rr(rfetch_distribution)rr%tmpdirr<foundr/r@r&r&r'r3-s    zPackageIndex.downloadc sd|id}d fdd }|rH|||}|s^|dk r^|||}|dkrjdk rx||}|dkr|s|||}|dkrdrdpd|nd||j|jd SdS) a|Obtain a distribution suitable for fulfilling `requirement` `requirement` must be a ``pkg_resources.Requirement`` instance. If necessary, or if the `force_scan` flag is set, the requirement is searched for in the (online) package index as well as the locally installed packages. If a distribution matching `requirement` is found, the returned distribution's ``location`` is the value you would have gotten from calling the ``download()`` method with the matching distribution's URL or filename. If no matching distribution is found, ``None`` is returned. If the `source` flag is set, only source distributions and source checkout links will be considered. Unless the `develop_ok` flag is set, development and system eggs (i.e., those using the ``.egg-info`` format) will be ignored. zSearching for %sNcs|dkr }||jD]v}|jtkrFsF|krd|d|<q||ko\|jtkp\ }|r|j}||_tj |jr|SqdS)Nz&Skipping development or system egg: %sr6) rcrBrrr r3rKdownload_locationrRr>r)ZreqenvrHZtestZloc develop_okrZskippedsourcerr&r'rwgs&z-PackageIndex.fetch_distribution..findz:No local packages or working download links found for %s%sza source distribution of rzBest match: %s)rK)N)rrrrrZcloner) rrr force_scanrrZ local_indexrHrwr&rr'rOs2         zPackageIndex.fetch_distributioncCs"|||||}|dk r|jSdS)a3Obtain a file suitable for fulfilling `requirement` DEPRECATED; use the ``fetch_distribution()`` method now instead. For backward compatibility, this routine is identical but returns the ``location`` of the downloaded distribution instead of a distribution object. N)rrK)rrrrrrHr&r&r'fetchszPackageIndex.fetchc Cst|}|r*ddt||ddDp,g}t|dkrtj|}tj||krtj ||}ddl m }|||st |||}ttj |dd2} | d|dj|djtj|dfW5QRX|S|rtd ||fntd dS) NcSsg|]}|jr|qSr&)rM)rVdr&r&r' sz*PackageIndex.gen_setup..r6r)samefilezsetup.pywzIfrom setuptools import setup setup(name=%r, version=%r, py_modules=[%r]) zCan't unambiguously interpret project/version identifier %r; any dashes in the name or version should be escaped using underscores. %rzpCan't process plain .py files without an '#egg=name-version' suffix to enable automatic setup script generation.)rDrEr rFrOrRr>rPdirnamer]Zsetuptools.command.easy_installr shutilZcopy2rwriterLrMsplitextr) rrSr@rrErrPZdstr rr&r&r'rsB       zPackageIndex.gen_setupi c Cs|d|d}zt|}||}t|tjjrJt d||j |j f|}d}|j }d}d|krt |d} ttt| }||||||t|dV} ||} | r|| | | |d7}||||||qqq|||| W5QRX|WS|r|XdS) NzDownloading %szCan't download %s: %s %srr2zcontent-lengthzContent-Lengthwbr6)rrrrrrrrrrrr dl_blocksizermaxrint reporthookrrrr r) rr:rSfprrblocknumZbssizeZsizesrrr&r&r' _download_tos:        zPackageIndex._download_tocCsdSrgr&)rr:rSrZblksizerr&r&r'rszPackageIndex.reporthookc Cs|drt|Szt||jWSttjfk r}z.z%s %szDownload error for %s: %sz;%s returned a bad status line. The server might be down, %s)r- local_openopen_with_authrr$r InvalidURLr]rhrrrrrZURLErrorreasonZ BadStatusLinelineZ HTTPExceptionsocket)rr:Zwarningvrr&r&r'rs> "zPackageIndex.open_urlcCst|\}}|r0d|kr4|dddd}qnd}|drJ|dd}tj||}|dksj|d rv|||S|d ks|d r|||S|d r| ||S|d krt j t j |dS||d|||SdS)Nz...\_Z__downloaded__rIr*Zsvnzsvn+Zgitzgit+zhg+rrYT)rAreplacer,rRr>r]r- _download_svn _download_git _download_hgrr url2pathnamer#r7r_attempt_download)rr<r:rr.r@rSr&r&r'rs$        zPackageIndex._download_urlcCs||ddS)NT)rrr&r&r'r:szPackageIndex.scan_urlcCs6|||}d|ddkr.||||S|SdS)Nrrr)rrr+_download_html)rr:rSrr&r&r'r)=s zPackageIndex._attempt_downloadcCsnt|}|D]>}|r td|rF|t||||SqLq |t|td|dS)Nz ([^- ]+ - )?Revision \d+:zUnexpected HTML page found at ) r���rs���rU���rx���r���rR���r���r%��r���)r���r:���r���rS���r���r��r&���r&���r'���r*��D��s����   zPackageIndex._download_htmlc�����������������C���s��t�dt�|ddd�}d}|�drd|krtj|\}}}}}} |s|drd |d d��kr|d d��d d\}}t |\} } | rd | kr| d d\} } d | | f�}nd | �}| }|||||| f}tj |}|� d||�t d|||f��|S�)Nz"SVN download support is deprecatedr5���r6���r���r���zsvn:@z//r1���rY���:z --username=%s --password=%sz --username=z'Doing subversion checkout from %s to %szsvn checkout%s -q %s %s)warningsr��� UserWarningr9���r+���r-���r���r#���r7��� _splituser urlunparser���rR���system)r���r:���rS���Zcredsr<���netlocr>���rW���qr���authhostuserZpwr;���r&���r&���r'���r%��S��s&����   zPackageIndex._download_svnc�����������������C���sp���t�j|�\}}}}}|ddd�}|ddd�}d�}d|krR|dd\}}t�j||||df}�|�|fS�)N+r6���r2���r5���r���r+��r���)r���r#���Zurlsplitr9���rsplitZ urlunsplit)r:��� pop_prefixr<���r2��r>���r?���r���revr&���r&���r'���_vcs_split_rev_from_urli��s����z$PackageIndex._vcs_split_rev_from_urlc�����������������C���sl���|�ddd�}|�j|dd\}}|�d||�td||f��|d�k rh|�d|�td ||f��|S�) Nr5���r6���r���Tr9��zDoing git clone from %s to %szgit clone --quiet %s %szChecking out %szgit -C %s checkout --quiet %sr9���r;��r���rR���r1��r���r:���rS���r:��r&���r&���r'���r&��{��s���� zPackageIndex._download_gitc�����������������C���sl���|�ddd�}|�j|dd\}}|�d||�td||f��|d�k rh|�d|�td ||f��|S�) Nr5���r6���r���Tr<��zDoing hg clone from %s to %szhg clone --quiet %s %szUpdating to %szhg --cwd %s up -C -r %s -qr=��r>��r&���r&���r'���r'����s���� zPackageIndex._download_hgc�����������������G���s���t�j|f|��d�S�rg���)r���r���r���r&���r&���r'���r�����s����zPackageIndex.debugc�����������������G���s���t�j|f|��d�S�rg���)r���r���r���r&���r&���r'���r�����s����zPackageIndex.infoc�����������������G���s���t�j|f|��d�S�rg���)r���r���r���r&���r&���r'���r�����s����zPackageIndex.warn)r���r���NT)F)F)F)N)N)FFFN)FF)N)F)(r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r3���r���r��r���r��r��r��r���r���r���r)��r*��r%�� staticmethodr;��r&��r'��r���r���r��� __classcell__r&���r&���r���r'���r���*��sX���������  3   +   #������ L )$ # z!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c�����������������C���s���|��d}t|S�)Nr���)rF���r���)rE���Zwhatr&���r&���r'��� decode_entity��s���� rA��c�����������������C���s ���t�t|�S�)a�� Decode HTML entities in the given text. >>> htmldecode( ... 'https://../package_name-0.1.2.tar.gz' ... '?tokena=A&tokenb=B">package_name-0.1.2.tar.gz') 'https://../package_name-0.1.2.tar.gz?tokena=A&tokenb=B">package_name-0.1.2.tar.gz' ) entity_subrA��)textr&���r&���r'���rv�����s���� rv���c��������������������s����fdd}|S�)Nc��������������������s����fdd}|S�)Nc��������������� ������s2���t��}t��z�|�|W�S�t�|�X�d�S�rg���)r��ZgetdefaulttimeoutZsetdefaulttimeout)rh���ri���Z old_timeout)rk���timeoutr&���r'���_socket_timeout��s ���� z@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeoutr&���)rk���rE��rD��rj���r'���rE����s����z'socket_timeout.<locals>._socket_timeoutr&���)rD��rE��r&���rF��r'���socket_timeout��s���� rG��c�����������������C���s2���t�j|�}|�}t|}|�}|ddS�)aq�� A function compatible with Python 2.3-3.3 that will encode auth from a URL suitable for an HTTP header. >>> str(_encode_auth('username%3Apassword')) 'dXNlcm5hbWU6cGFzc3dvcmQ=' Long auth strings should not cause a newline to be inserted. >>> long_auth = 'username:' + 'password'*10 >>> chr(10) in str(_encode_auth(long_auth)) False  r���)r���r#���r8���encodebase64Z b64encoder���r$��)r4��Zauth_sZ auth_bytesZ encoded_bytesZencodedr&���r&���r'��� _encode_auth��s ����  rK��c�������������������@���s(���e�Zd�ZdZdd�Zdd�Zdd�ZdS�) Credentialz: A username/password pair. Use like a namedtuple. c�����������������C���s���||�_�||�_d�S�rg���usernamepassword)r���rN��rO��r&���r&���r'���r�����s����zCredential.__init__c�����������������c���s���|�j�V��|�jV��d�S�rg���rM��r���r&���r&���r'���__iter__��s����zCredential.__iter__c�����������������C���s ���dt�|��S�)Nz%(username)s:%(password)s)varsr���r&���r&���r'���__str__��s����zCredential.__str__N)r���r���r���r���r���rP��rR��r&���r&���r&���r'���rL����s���rL��c�������������������@���s0���e�Zd�Zdd�Zedd�Zdd�Zdd�Zd S�) PyPIConfigc�����������������C���sP���t�dddgd}tj|�|�tjtjdd}tj |rL|� |�dS�)z% Load from ~/.pypirc rN��rO�� repositoryr���~z.pypircN) dictfromkeysr���RawConfigParserr���rR���r>���r]��� expanduserr���r���)r���defaultsZrcr&���r&���r'���r�����s ���� zPyPIConfig.__init__c��������������������s&����fdd���D�}tt�j|S�)Nc��������������������s ���g�|�]}��|d��r|qS�)rT��)r���rs���)rV���sectionr���r&���r'���r����s���z2PyPIConfig.creds_by_repository.<locals>.<listcomp>)ZsectionsrV��r���_get_repo_cred)r���Zsections_with_repositoriesr&���r���r'���creds_by_repository��s���� zPyPIConfig.creds_by_repositoryc�����������������C���s6���|��|d�}|t|��|d�|��|d�fS�)NrT��rN��rO��)r���rs���rL��)r���r[��Zrepor&���r&���r'���r\����s ����zPyPIConfig._get_repo_credc�����������������C���s*���|�j��D�]\}}||r |��S�q dS�)z If the URL indicated appears to be a repository defined in this config, return the credential for that repository. N)r]��itemsr-���)r���r:���rT��credr&���r&���r'���find_credential ��s���� zPyPIConfig.find_credentialN)r���r���r���r���propertyr]��r\��r`��r&���r&���r&���r'���rS����s ���  rS��c�����������������C���s:��t�j|�}|\}}}}}}|dr0td|dkrFt|\} } nd} | s~t�|�} | r~t | } | j |�f} t j d | ��| rdt | �} || ||||f} t�j| }t�j|}|d| �n t�j|�}|dt�||}| r6t�j|j\}}}}}}||kr6|| kr6||||||f} t�j| |_|S�) z4Open a urllib2 request, handling HTTP authenticationr,��znonnumeric port: '')ZhttpZhttpsN*Authenticating as %s for %s (from .pypirc)zBasic Z Authorizationz User-Agent)rb��)r���r#���r7���r,���r���r��r/��rS��r`��rr���rN��r���r���rK��r0��r���ZRequestZ add_header user_agentr:���)r:���r���Zparsedr<���r2��r>���Zparamsr?���r���r4��Zaddressr_��r���r;���r���r���r��s2Zh2Zpath2Zparam2Zquery2Zfrag2r&���r&���r'���r����s8����          r��c�����������������C���s ���|��d\}}}�|r|nd|�fS�)zJsplituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.r+��N) rpartition)r5��r6��Zdelimr&���r&���r'���r/��F��s����r/��c�����������������C���s���|�S�rg���r&���)r:���r&���r&���r'��� fix_sf_urlP��s����rf��c�������������� ���C���s��t�j|�\}}}}}}t�j|}tj|r<t�j|�S�| drtj |rg�}t |D�]d} tj || } | dkrt | d} | �} W�5�Q�R�X��qntj | r| d7�} |dj| d�q`d} | j|�d |d} d \}}n d \}}} d d i}t| }t�j|�||||S�) z7Read a local path, with special support for directoriesr1���z index.htmlrz<a href="{name}">{name}</a>)r.���zB<html><head><title>{url}{files}rH)r:files)ZOK)rzPath not foundz Not foundrz text/html)rr#r7rr(rRr>isfilerr,rrr]rrrformatrStringIOrr)r:r<r=r>Zparamr?rrSrhrfilepathrZbodyrZstatusmessagerZ body_streamr&r&r'rTs.        r)N)N)N)N)r!)]rsysrRrUr rrJrrr- functoolsrZsetuptools.externrZsetuptools.extern.six.movesrrrrr"Z pkg_resourcesr r r r r rrrrrrrrrZ distutilsrZdistutils.errorsrZfnmatchrZsetuptools.py27compatrZsetuptools.py33compatrZsetuptools.wheelrtypeZ __metaclass__rrDIrtrrErr9rN__all__Z_SOCKET_TIMEOUTZ_tmplrk version_inforcr(rrArrCrTr rfrmror|r}rrrrBrArvrGrKrLrXrSrrrr/rfrr&r&r&r's  <           !  $   !  &/