/home/lnzliplg/public_html/python3.3.tar
site-packages/_markerlib/markers.py000064400000007613151733463470013435 0ustar00# -*- coding: utf-8 -*-
"""Interpret PEP 345 environment markers.

EXPR [in|==|!=|not in] EXPR [or|and] ...

where EXPR belongs to any of those:

    python_version = '%s.%s' % (sys.version_info[0], sys.version_info[1])
    python_full_version = sys.version.split()[0]
    os.name = os.name
    sys.platform = sys.platform
    platform.version = platform.version()
    platform.machine = platform.machine()
    platform.python_implementation = platform.python_implementation()
    a free string, like '2.6', or 'win32'
"""

__all__ = ['default_environment', 'compile', 'interpret']

import ast
import os
import platform
import sys
import weakref

_builtin_compile = compile

try:
    from platform import python_implementation
except ImportError:
    if os.name == "java":
        # Jython 2.5 has ast module, but not platform.python_implementation() function.
        def python_implementation():
            return "Jython"
    else:
        raise


# restricted set of variables
_VARS = {'sys.platform': sys.platform,
         'python_version': '%s.%s' % sys.version_info[:2],
         # FIXME parsing sys.platform is not reliable, but there is no other
         # way to get e.g. 2.7.2+, and the PEP is defined with sys.version
         'python_full_version': sys.version.split(' ', 1)[0],
         'os.name': os.name,
         'platform.version': platform.version(),
         'platform.machine': platform.machine(),
         'platform.python_implementation': python_implementation(),
         'extra': None # wheel extension
        }

for var in list(_VARS.keys()):
    if '.' in var:
        _VARS[var.replace('.', '_')] = _VARS[var]

def default_environment():
    """Return copy of default PEP 385 globals dictionary."""
    return dict(_VARS)

class ASTWhitelist(ast.NodeTransformer):
    def __init__(self, statement):
        self.statement = statement # for error messages

    ALLOWED = (ast.Compare, ast.BoolOp, ast.Attribute, ast.Name, ast.Load, ast.Str)
    # Bool operations
    ALLOWED += (ast.And, ast.Or)
    # Comparison operations
    ALLOWED += (ast.Eq, ast.Gt, ast.GtE, ast.In, ast.Is, ast.IsNot, ast.Lt, ast.LtE, ast.NotEq, ast.NotIn)

    def visit(self, node):
        """Ensure statement only contains allowed nodes."""
        if not isinstance(node, self.ALLOWED):
            raise SyntaxError('Not allowed in environment markers.\n%s\n%s' %
                               (self.statement,
                               (' ' * node.col_offset) + '^'))
        return ast.NodeTransformer.visit(self, node)

    def visit_Attribute(self, node):
        """Flatten one level of attribute access."""
        new_node = ast.Name("%s.%s" % (node.value.id, node.attr), node.ctx)
        return ast.copy_location(new_node, node)

def parse_marker(marker):
    tree = ast.parse(marker, mode='eval')
    new_tree = ASTWhitelist(marker).generic_visit(tree)
    return new_tree

def compile_marker(parsed_marker):
    return _builtin_compile(parsed_marker, '<environment marker>', 'eval',
                   dont_inherit=True)

_cache = weakref.WeakValueDictionary()

def compile(marker):
    """Return compiled marker as a function accepting an environment dict."""
    try:
        return _cache[marker]
    except KeyError:
        pass
    if not marker.strip():
        def marker_fn(environment=None, override=None):
            """"""
            return True
    else:
        compiled_marker = compile_marker(parse_marker(marker))
        def marker_fn(environment=None, override=None):
            """override updates environment"""
            if override is None:
                override = {}
            if environment is None:
                environment = default_environment()
            environment.update(override)
            return eval(compiled_marker, environment)
    marker_fn.__doc__ = marker
    _cache[marker] = marker_fn
    return _cache[marker]

def interpret(marker, environment=None):
    return compile(marker)(environment)
site-packages/_markerlib/__pycache__/__init__.cpython-33.pyc000064400000002412151733463500017773 0ustar00�
�Re(c@s�y,ddlZddlmZmZmZWnQek
rde�krQ�ndd�Zdd�Zdddd	�ZYnXdS(
iN(udefault_environmentucompileu	interpretuastcCsiS(N((((u,/tmp/pip-k8wh6o-build/_markerlib/__init__.pyudefault_environmentsudefault_environmentcs%dd�fdd�}�|_|S(Ncs�j�S(N(ustrip(uenvironmentuoverride(umarker(u,/tmp/pip-k8wh6o-build/_markerlib/__init__.pyu	marker_fn
sucompile.<locals>.marker_fn(uNoneu__doc__(umarkeru	marker_fn((umarkeru,/tmp/pip-k8wh6o-build/_markerlib/__init__.pyucompile	s	ucompilecCs
t|��S(N(ucompile(umarkeruenvironmentuoverride((u,/tmp/pip-k8wh6o-build/_markerlib/__init__.pyu	interpretsu	interpret(uastu_markerlib.markersudefault_environmentucompileu	interpretuImportErroruglobalsuNone(((u,/tmp/pip-k8wh6o-build/_markerlib/__init__.pyu<module>s 
site-packages/_markerlib/__pycache__/markers.cpython-33.pyc000064400000013114151733463500017701 0ustar00�
�Re�c@s�dZdddgZddlZddlZddlZddlZddlZeZyddlm	Z	Wn3e
k
r�ejdkr�dd	�Z	n�YnXiejd
6dejdd�d
6ej
jdd�dd6ejd6ej
�d6ej�d6e	�d6dd6ZxCeej��D]/Zdekr+eeeejdd�<q+q+Wdd�ZGdd�dej�Zdd�Zdd�Zej�Zdd�Zdd d�ZdS(!u�Interpret PEP 345 environment markers.

EXPR [in|==|!=|not in] EXPR [or|and] ...

where EXPR belongs to any of those:

    python_version = '%s.%s' % (sys.version_info[0], sys.version_info[1])
    python_full_version = sys.version.split()[0]
    os.name = os.name
    sys.platform = sys.platform
    platform.version = platform.version()
    platform.machine = platform.machine()
    platform.python_implementation = platform.python_implementation()
    a free string, like '2.6', or 'win32'
udefault_environmentucompileu	interpretiN(upython_implementationujavacCsdS(NuJython((((u+/tmp/pip-k8wh6o-build/_markerlib/markers.pyupython_implementation!supython_implementationusys.platformu%s.%siupython_versionu iupython_full_versionuos.nameuplatform.versionuplatform.machineuplatform.python_implementationuextrau.u_cCs
tt�S(u2Return copy of default PEP 385 globals dictionary.(udictu_VARS(((u+/tmp/pip-k8wh6o-build/_markerlib/markers.pyudefault_environment8scBs�|EeZdZdd�Zejejejejej	ej
fZeejej
f7Zeejejejejejejejejejejf
7Zdd�Zdd�ZdS(uASTWhitelistcCs
||_dS(N(u	statement(uselfu	statement((u+/tmp/pip-k8wh6o-build/_markerlib/markers.pyu__init__=suASTWhitelist.__init__cCsLt||j�s9td|jd|jdf��ntjj||�S(u-Ensure statement only contains allowed nodes.u)Not allowed in environment markers.
%s
%su u^(u
isinstanceuALLOWEDuSyntaxErroru	statementu
col_offsetuastuNodeTransformeruvisit(uselfunode((u+/tmp/pip-k8wh6o-build/_markerlib/markers.pyuvisitFs
uASTWhitelist.visitcCs8tjd|jj|jf|j�}tj||�S(u&Flatten one level of attribute access.u%s.%s(uastuNameuvalueuiduattructxu
copy_location(uselfunodeunew_node((u+/tmp/pip-k8wh6o-build/_markerlib/markers.pyuvisit_AttributeNs(uASTWhitelist.visit_AttributeN(u__name__u
__module__u__qualname__u__init__uastuCompareuBoolOpu	AttributeuNameuLoaduStruALLOWEDuAnduOruEquGtuGtEuInuIsuIsNotuLtuLtEuNotEquNotInuvisituvisit_Attribute(u
__locals__((u+/tmp/pip-k8wh6o-build/_markerlib/markers.pyuASTWhitelist<s*FuASTWhitelistcCs.tj|dd�}t|�j|�}|S(Numodeueval(uastuparseuASTWhitelistu
generic_visit(umarkerutreeunew_tree((u+/tmp/pip-k8wh6o-build/_markerlib/markers.pyuparse_markerSsuparse_markercCst|dddd�S(Nu<environment marker>uevaludont_inheritT(u_builtin_compileuTrue(u
parsed_marker((u+/tmp/pip-k8wh6o-build/_markerlib/markers.pyucompile_markerXsucompile_markerc
s�yt|SWntk
r YnX|j�sBdddd�}n*tt|���dd�fdd�}||_|t|<t|S(uCReturn compiled marker as a function accepting an environment dict.cSsdS(uT(uTrue(uenvironmentuoverride((u+/tmp/pip-k8wh6o-build/_markerlib/markers.pyu	marker_fnesucompile.<locals>.marker_fncsG|dkri}n|dkr-t�}n|j|�t�|�S(uoverride updates environmentN(uNoneudefault_environmentuupdateueval(uenvironmentuoverride(ucompiled_marker(u+/tmp/pip-k8wh6o-build/_markerlib/markers.pyu	marker_fnjs	
N(u_cacheuKeyErrorustripuNoneucompile_markeruparse_markeru__doc__(umarkeru	marker_fn((ucompiled_markeru+/tmp/pip-k8wh6o-build/_markerlib/markers.pyucompile^s
	
cCst|�|�S(N(ucompile(umarkeruenvironment((u+/tmp/pip-k8wh6o-build/_markerlib/markers.pyu	interpretvs(u__doc__u__all__uastuosuplatformusysuweakrefucompileu_builtin_compileupython_implementationuImportErrorunameuversion_infouversionusplitumachineuNoneu_VARSulistukeysuvarureplaceudefault_environmentuNodeTransformeruASTWhitelistuparse_markerucompile_markeruWeakValueDictionaryu_cacheu	interpret(((u+/tmp/pip-k8wh6o-build/_markerlib/markers.pyu<module>s>






!site-packages/_markerlib/__init__.py000064400000001050151733463500013507 0ustar00try:
    import ast
    from _markerlib.markers import default_environment, compile, interpret
except ImportError:
    if 'ast' in globals():
        raise
    def default_environment():
        return {}
    def compile(marker):
        def marker_fn(environment=None, override=None):
            # 'empty markers are True' heuristic won't install extra deps.
            return not marker.strip()
        marker_fn.__doc__ = marker
        return marker_fn
    def interpret(marker, environment=None, override=None):
        return compile(marker)()
site-packages/__pycache__/easy_install.cpython-33.pyc000064400000000474151733463500016622 0ustar00�
�Re~c@s0dZedkr,ddlmZe�ndS(uRun the EasyInstall commandu__main__i(umainN(u__doc__u__name__usetuptools.command.easy_installumain(((u%/tmp/pip-k8wh6o-build/easy_install.pyu<module>ssite-packages/__pycache__/pkg_resources.cpython-33.pyc000064400000377111151733463500017013 0ustar00�
�Re_�cn@s�dZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZyddl
m
Z
mZWn(ek
r�ddlm
Z
mZYnXyeWn"ek
rddlmZYnXy$edd�ZddlmZWn:ek
rleZdd	lmZeed
d�ZYnXddlmZy&dd
lmZm Z m!Z!e"Z#Wnek
r�e$Z#YnXddlm%Z&ddl'm(Z(m)Z)ej*ddfkoej+j,dkrddl-j.Z/neZ/yddl0Z0Wnek
rGYnXddd�Z1iZ2dd�Z3dd�Z4dd�Z5dd�Z6dd�Z7dd �Z8d!d"�Z9d#d�Z:Z;d$d%�Z<d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjgEZ=GdkdA�dAe>�Z?GdldB�dBe?�Z@GdmdC�dCe?�ZAGdndD�dDe?�ZBiZCejDdd�ZEdZFdoZGdpZHdZIdpZJdqdf�ZKdrd(�ZLgdsdt�ZMdudv�ZNdwdx�ZOejPdy�ZQejPdz�ZReOZSd{dK�ZTd|d'�ZUeUZVd}d)�ZWd~d*�ZXedd+�ZYd�d,�ZZGd�dY�dY�Z[Gd�dZ�dZe[�Z\Gd�d<�d<e]�Z^Gd�d;�d;e]�Z_e_Z`Gd�dE�dEea�ZbGd�d=�d=�Zcd�d:�Zdd�dH�Zed�dI�Zfd�dN�Zgd�dO�Zhid�gd�6d�gd�6d�d�d�gd�6gd�6gd�6gd�6Ziid�d�d�6d�d�d�6d�d�d�6d�d�d�6d�d�d�6d�d�d�6d�d�d�6Zjd�d��Zkd�d��Zld�d��Zmd�dP�Zneid�dQ�Zod�d��Zpd�eq�kr�epZonGd�d`�d`�ZreKe]er�Gd�da�daer�ZsGd�db�dbes�ZteKeue�et�e/ek	r*eKe/jvet�nGd�d^�d^er�Zwew�Zxd�d��ZyGd�dc�dces�ZzeKej{ez�Gd�d[�d[ew�Z|Gd�d\�d\et�Z}Gd�d]�d]ez�Z~e3d�d�i�d�dd�Ze$d�d7�Z�e$d�d��Z�eej{e��e$d�d��Z�ee]e��e$d�d��Z�eej�e��e/ek	raee/j�e��ne3d�d�i�e3d�d�i�d�de�Z�d�d��Z�d�d4�Z�ed�dg�Z�d�d��Z�e�ej�e��e�ej{e��e/ek	r�e�e/j�e��nd�d��Z�e�e]e��d�dS�Z�id�d��Z�d�d��Z�d�dL�Z�ejPd��j�Z�ejPd��j�Z�ejPd��j�Z�ejPd��j�Z�ejPd��j�Z�ejPd��j�Z�ejPd��j�Z�ejPd��j�Z�ejPd�ej�ej�B�j�Z�ejPd�ej��Z�id�d�6d�d�6d�d�6d�d�6d�d�6j�Z�d�d��Z�d�dG�Z�Gd�d@�d@e]�Z�d�d��Z�Gd�d>�d>e]�Z�Gd�d��d�e��Z�ie�d�6e�d�6e�d�6Z�d�d��Z�d�dF�Z�d�d��Z�Gd�d?�d?�Z�id�d�6d�d�6d�d�6d�d�6d�d�6d�d6Z�dd�Z�dd�Z�ddR�Z�ddM�Z�dd�Z�ec�Z�d	d
�Z�e�eq��e3dd5e^��yddl�m�Z�Wnek
r�Yn�Xye�j�e��Wn�e@k
rje^g�Z�x0e�j�e�e��e_��D]Z�e�j�e��qWx0ej�D]%Z�e�e�j�krLe�j�e��nq'We�j�ej�dd�<YnXe�j�Z�e�j�Z�e�j�Z�e�jUZUeUZVe�d
d��ge�_�e�e�e�j�ej���dS(uYPackage resource API
--------------------

A resource is a logical file contained within a package, or a logical
subdirectory thereof.  The package resource API expects resource names
to have their path parts separated with ``/``, *not* whatever the local
path separator is.  Do not use os.path operations to manipulate resource
names being passed into the API.

The package resource API is designed to work with normal filesystem packages,
.egg files, and unpacked .egg files.  It can also work in a limited way with
.zip files and with custom PEP 302 loaders that support the ``get_data()``
method.
iN(uget_importer(uurlparseu
urlunparse(uImmutableSetcCs
|j�S(N(unext(uo((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu<lambda>(su<lambda>(uStringIO(uBytesIOcCsY|dkrt�}n|dkr-|}nttt|�j�|d�||�dS(Nuexec(uNoneuglobalsuexecucompileuopenuread(ufnuglobsulocs((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuexecfile-s
	uexecfile(uutime(umkdirurenameuunlink(uopen(uisdirusplitiucpythoni�cCs^tstd��nt|�\}}|rZ|rZt|�rZt|�t||�ndS(Nu*"os.mkdir" not supported on this platform.(u
WRITE_SUPPORTuIOErrorusplituisdiru_bypass_ensure_directoryumkdir(unameumodeudirnameufilename((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_bypass_ensure_directoryKs
u_bypass_ensure_directorycKs>t�}x.|j�D] \}}|||<|t|<qWdS(N(uglobalsuitemsu_state_vars(uvartypeukwugunameuval((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_declare_stateWs	
u_declare_statecCsLi}t�}x6tj�D](\}}|d|||�||<qW|S(Nu_sget_(uglobalsu_state_varsuitems(ustateugukuv((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__getstate__]s
	 u__getstate__cCsJt�}x:|j�D],\}}|dt|||||�qW|S(Nu_sset_(uglobalsuitemsu_state_vars(ustateugukuv((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__setstate__ds	$u__setstate__cCs
|j�S(N(ucopy(uval((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
_sget_dictjsu
_sget_dictcCs|j�|j|�dS(N(uclearuupdate(ukeyuobustate((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
_sset_dictms
u
_sset_dictcCs
|j�S(N(u__getstate__(uval((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_sget_objectqsu_sget_objectcCs|j|�dS(N(u__setstate__(ukeyuobustate((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_sset_objecttsu_sset_objectcGsdS(N(uNone(uargs((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu<lambda>wscCs�t�}tj|�}|dk	r~tjdkr~y3ddjt�dd��|jd�f}Wq~t	k
rzYq~Xn|S(uZReturn this platform's maximum compatible version.

    distutils.util.get_platform() normally reports the minimum version
    of Mac OS X that would be required to *use* extensions produced by
    distutils.  But what we want when checking compatibility is to know the
    version of Mac OS X that we are *running*.  To allow usage of packages that
    explicitly require a newer version of Mac OS X, we must also know the
    current version of the OS.

    If this condition occurs for any other platform with a version in its
    platform strings, this function should be extended accordingly.
    udarwinumacosx-%s-%su.Nii(
uget_build_platformumacosVersionStringumatchuNoneusysuplatformujoinu_macosx_versugroupu
ValueError(uplatum((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_supported_platformzs
	3
uget_supported_platformurequireu
run_scriptuget_provideruget_distributionuload_entry_pointu
get_entry_mapuget_entry_infouiter_entry_pointsuresource_stringuresource_streamuresource_filenameuresource_listdiruresource_existsuresource_isdirudeclare_namespaceuworking_setuadd_activation_listenerufind_distributionsuset_extraction_pathucleanup_resourcesuget_default_cacheuEnvironmentu
WorkingSetuResourceManageruDistributionuRequirementu
EntryPointuResolutionErroruVersionConflictuDistributionNotFounduUnknownExtrauExtractionErroruparse_requirementsu
parse_versionu	safe_nameusafe_versionuget_platformucompatible_platformsuyield_linesusplit_sectionsu
safe_extrauto_filenameuinvalid_markeruevaluate_markeruensure_directoryunormalize_pathuEGG_DISTuBINARY_DISTuSOURCE_DISTu
CHECKOUT_DISTuDEVELOP_DISTuIMetadataProvideruIResourceProvideruFileMetadatauPathMetadatauEggMetadatau
EmptyProvideruempty_provideruNullProvideruEggProvideruDefaultProvideruZipProvideruregister_finderuregister_namespace_handleruregister_loader_typeufixup_namespace_packagesuget_importerurun_mainuAvailableDistributionscBs&|EeZdZdZdd�ZdS(uResolutionErroru.Abstract base for dependency resolution errorscCs|jjt|j�S(N(u	__class__u__name__urepruargs(uself((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__repr__�suResolutionError.__repr__N(u__name__u
__module__u__qualname__u__doc__u__repr__(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuResolutionError�scBs|EeZdZdZdS(uVersionConflictuAAn already-installed version conflicts with the requested versionN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuVersionConflict�scBs|EeZdZdZdS(uDistributionNotFoundu&A requested distribution was not foundN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuDistributionNotFound�scBs|EeZdZdZdS(uUnknownExtrau>Distribution doesn't have an "extra feature" of the given nameN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuUnknownExtra�siicCs|t|<dS(uRegister `provider_factory` to make providers for `loader_type`

    `loader_type` is the type or class of a PEP 302 ``module.__loader__``,
    and `provider_factory` is a function that, passed a *module* object,
    returns an ``IResourceProvider`` for that module.
    N(u_provider_factories(uloader_typeuprovider_factory((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuregister_loader_type�sc
Cs�t|t�r2tj|�p1tt|��dSytj|}Wn)tk
rnt	|�tj|}YnXt
|dd�}tt
|�|�S(u?Return an IResourceProvider for the named module or requirementiu
__loader__N(u
isinstanceuRequirementuworking_setufindurequireustrusysumodulesuKeyErroru
__import__ugetattruNoneu
_find_adapteru_provider_factories(umoduleOrRequmoduleuloader((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_provider�s#

cCs�|s�ddl}|j�d}|dkr�ddl}d}tjj|�r�t|d�r�|j|�}d|kr�|d}q�q�q�n|j|j	d��n|dS(Niuu0/System/Library/CoreServices/SystemVersion.plistu	readPlistuProductVersionu.(
uplatformumac_veruplistlibuosupathuexistsuhasattru	readPlistuappendusplit(u_cacheuplatformuversionuplistlibuplistu
plist_content((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_macosx_vers�su_macosx_verscCsidd6dd6j||�S(NuppcuPowerPCuPower_Macintosh(uget(umachine((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_macosx_arch�su_macosx_archcCs�yddlm}Wn"tk
r8ddlm}YnX|�}tjdkr�|jd�r�yTt�}tj	�dj
dd�}dt|d�t|d	�t|�fSWq�t
k
r�Yq�Xn|S(
u�Return this platform's string for platform-specific distributions

    XXX Currently this is the same as ``distutils.util.get_platform()``, but it
    needs some hacks for Linux and Mac OS X.
    i(uget_platformudarwinumacosx-iu u_umacosx-%d.%d-%si(u	sysconfiguget_platformuImportErrorudistutils.utilusysuplatformu
startswithu_macosx_versuosuunameureplaceuintu_macosx_archu
ValueError(uget_platformuplatuversionumachine((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_build_platform�s
		
uget_build_platformumacosx-(\d+)\.(\d+)-(.*)udarwin-(\d+)\.(\d+)\.(\d+)-(.*)c
CsO|d	ks$|d	ks$||kr(d
Stj|�}|rKtj|�}|s�tj|�}|r�t|jd��}d|jd�|jd�f}|dkr�|dks�|dkr�|dkr�d
SndS|jd�|jd�ks|jd�|jd�krdSt|jd��t|jd��krGdSd
SdS(u�Can code for the `provided` platform run on the `required` platform?

    Returns true if either platform is ``None``, or the platforms are equal.

    XXX Needs compatibility checks for Linux and other unixy OSes.
    iu%s.%siiu10.3iu10.4iNTF(uNoneuTrueumacosVersionStringumatchudarwinVersionStringuintugroupuFalse(uprovidedurequiredureqMacuprovMacu
provDarwinudversionumacosversion((u&/tmp/pip-k8wh6o-build/pkg_resources.pyucompatible_platformss*$"*cCsNtjd�j}|d}|j�||d<t|�dj||�dS(u@Locate distribution `dist_spec` and run its `script_name` scriptiu__name__iN(usysu	_getframeu	f_globalsuclearurequireu
run_script(u	dist_specuscript_nameunsuname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
run_scriptHs



cCsdt|t�r!tj|�}nt|t�r?t|�}nt|t�s`td|��n|S(u@Return a current distribution object for a Requirement or stringu-Expected string, Requirement, or Distribution(u
isinstanceu
basestringuRequirementuparseuget_provideruDistributionu	TypeError(udist((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_distributionRscCst|�j||�S(uDReturn `name` entry point of `group` for `dist` or raise ImportError(uget_distributionuload_entry_point(udistugroupuname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuload_entry_pointZscCst|�j|�S(u=Return the entry point map for `group`, or the full entry map(uget_distributionu
get_entry_map(udistugroup((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
get_entry_map^scCst|�j||�S(u<Return the EntryPoint object for `group`+`name`, or ``None``(uget_distributionuget_entry_info(udistugroupuname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_entry_infobscBs\|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S(uIMetadataProvidercCsdS(u;Does the package's distribution contain the named metadata?N((uname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuhas_metadataisuIMetadataProvider.has_metadatacCsdS(u'The named metadata resource as a stringN((uname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_metadatalsuIMetadataProvider.get_metadatacCsdS(u�Yield named metadata resource as list of non-blank non-comment lines

       Leading and trailing whitespace is stripped from each line, and lines
       with ``#`` as the first non-blank character are omitted.N((uname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_metadata_linesosu$IMetadataProvider.get_metadata_linescCsdS(u>Is the named metadata a directory?  (like ``os.path.isdir()``)N((uname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyumetadata_isdirusu IMetadataProvider.metadata_isdircCsdS(u?List of metadata names in the directory (like ``os.listdir()``)N((uname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyumetadata_listdirxsu"IMetadataProvider.metadata_listdircCsdS(u=Execute the named script in the supplied namespace dictionaryN((uscript_nameu	namespace((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
run_script{suIMetadataProvider.run_scriptN(	u__name__u
__module__u__qualname__uhas_metadatauget_metadatauget_metadata_linesumetadata_isdirumetadata_listdiru
run_script(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuIMetadataProvidergscBsb|EeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dS(uIResourceProvideru3An object that provides access to package resourcescCsdS(udReturn a true filesystem path for `resource_name`

        `manager` must be an ``IResourceManager``N((umanageru
resource_name((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_resource_filename�su'IResourceProvider.get_resource_filenamecCsdS(uiReturn a readable file-like object for `resource_name`

        `manager` must be an ``IResourceManager``N((umanageru
resource_name((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_resource_stream�su%IResourceProvider.get_resource_streamcCsdS(umReturn a string containing the contents of `resource_name`

        `manager` must be an ``IResourceManager``N((umanageru
resource_name((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_resource_string�su%IResourceProvider.get_resource_stringcCsdS(u,Does the package contain the named resource?N((u
resource_name((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuhas_resource�suIResourceProvider.has_resourcecCsdS(u>Is the named resource a directory?  (like ``os.path.isdir()``)N((u
resource_name((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuresource_isdir�su IResourceProvider.resource_isdircCsdS(u?List of resource names in the directory (like ``os.listdir()``)N((u
resource_name((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuresource_listdir�su"IResourceProvider.resource_listdirN(
u__name__u
__module__u__qualname__u__doc__uget_resource_filenameuget_resource_streamuget_resource_stringuhas_resourceuresource_isdiruresource_listdir(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuIResourceProviderscBs�|EeZdZdZd dd�Zdd�Zdd�Zdd	�Zd d
d�Z	dd
�Z
dd�Zd d!dd�Z
d d dd�Zd d d!dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd S("u
WorkingSetuDA collection of active distributions on sys.path (or a similar list)cCs^g|_i|_i|_g|_|dkr<tj}nx|D]}|j|�qCWdS(u?Create working set from list of path entries (default=sys.path)N(uentriesu
entry_keysuby_keyu	callbacksuNoneusysupathu	add_entry(uselfuentriesuentry((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__init__�s				
uWorkingSet.__init__cCsT|jj|g�|jj|�x*t|d�D]}|j||d�q3WdS(u�Add a path item to ``.entries``, finding any distributions on it

        ``find_distributions(entry, True)`` is used to find distributions
        corresponding to the path entry, and they are added.  `entry` is
        always appended to ``.entries``, even if it is already present.
        (This is because ``sys.path`` can contain the same value more than
        once, and the ``.entries`` of the ``sys.path`` WorkingSet should always
        equal ``sys.path``.)
        NTF(u
entry_keysu
setdefaultuentriesuappendufind_distributionsuTrueuadduFalse(uselfuentryudist((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu	add_entry�s
uWorkingSet.add_entrycCs|jj|j�|kS(u9True if `dist` is the active distribution for its project(uby_keyugetukey(uselfudist((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__contains__�suWorkingSet.__contains__cCsG|jj|j�}|dk	r?||kr?t||��n|SdS(u�Find a distribution matching requirement `req`

        If there is an active distribution for the requested project, this
        returns it as long as it meets the version requirement specified by
        `req`.  But, if there is an active distribution for the project and it
        does *not* meet the `req` requirement, ``VersionConflict`` is raised.
        If there is no active distribution for the requested project, ``None``
        is returned.
        N(uby_keyugetukeyuNoneuVersionConflict(uselfurequdist((u&/tmp/pip-k8wh6o-build/pkg_resources.pyufind�s
uWorkingSet.findccsgx`|D]X}|j|�}|dkrGx4|j�D]}|Vq5Wq||kr||VqqWdS(uYield entry point objects from `group` matching `name`

        If `name` is None, yields all entry points in `group` from all
        distributions in the working set, otherwise only ones matching
        both `group` and `name` are yielded (in distribution order).
        N(u
get_entry_mapuNoneuvalues(uselfugroupunameudistuentriesuep((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuiter_entry_points�s
uWorkingSet.iter_entry_pointscCsQtjd�j}|d}|j�||d<|j|�dj||�dS(u?Locate distribution for `requires` and run `script_name` scriptiu__name__iN(usysu	_getframeu	f_globalsuclearurequireu
run_script(uselfurequiresuscript_nameunsuname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
run_script�s



uWorkingSet.run_scriptccspi}xc|jD]X}||jkr+qnx:|j|D]+}||kr9d||<|j|Vq9q9WqWdS(u�Yield distributions for non-duplicate projects in the working set

        The yield order is the order in which the items' path entries were
        added to the working set.
        iN(uentriesu
entry_keysuby_key(uselfuseenuitemukey((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__iter__�s
uWorkingSet.__iter__cCs�|r|j|j|�n|dkr4|j}n|jj|g�}|jj|jg�}|j|jkrwdS||j|j<|j|kr�|j|j�n|j|kr�|j|j�n|j	|�dS(u�Add `dist` to working set, associated with `entry`

        If `entry` is unspecified, it defaults to the ``.location`` of `dist`.
        On exit from this routine, `entry` is added to the end of the working
        set's ``.entries`` (if it wasn't already present).

        `dist` is only added to the working set if it's for a project that
        doesn't already have a distribution in the set.  If it's added, any
        callbacks registered with the ``subscribe()`` method will be called.
        N(
u	insert_onuentriesuNoneulocationu
entry_keysu
setdefaultukeyuby_keyuappendu
_added_new(uselfudistuentryuinsertukeysukeys2((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuadd�suWorkingSet.addc	CsVt|�ddd�}i}i}g}x$|rQ|jd�}||krUq.n|j|j�}|dkr|jj|j�}|dkr�|dkr�t|j�}n|j|||�}||j<|dkr�t	|��q�n|j
|�n||krt||��n|j|j
|j�ddd��d||<q.W|S(uList all distributions needed to (recursively) meet `requirements`

        `requirements` must be a sequence of ``Requirement`` objects.  `env`,
        if supplied, should be an ``Environment`` instance.  If
        not supplied, it defaults to all distributions available within any
        entry or distribution in the working set.  `installer`, if supplied,
        will be invoked with each requirement that cannot be met by an
        already-installed distribution; it should return a ``Distribution`` or
        ``None``.
        Niii����i����T(ulistupopugetukeyuNoneuby_keyuEnvironmentuentriesu
best_matchuDistributionNotFounduappenduVersionConflictuextendurequiresuextrasuTrue(	uselfurequirementsuenvu	installeru	processedubestuto_activateurequdist((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuresolves.	 &uWorkingSet.resolvecCsPt|�}|j�i}i}|dkrJt|j�}||7}n
||}|jg�}	tt|	j|��x�|D]�}
x�||
D]�}|j�g}y|	j	|||�}
Wn9t
k
r�tj�d}|||<|r�w�nPYq�Xtt|	j|
��|j
tj|
��Pq�Wq�Wt|�}|j�||fS(ubFind all activatable distributions in `plugin_env`

        Example usage::

            distributions, errors = working_set.find_plugins(
                Environment(plugin_dirlist)
            )
            map(working_set.add, distributions)  # add plugins+libs to sys.path
            print 'Could not load', errors        # display errors

        The `plugin_env` should be an ``Environment`` instance that contains
        only distributions that are in the project's "plugin directory" or
        directories. The `full_env`, if supplied, should be an ``Environment``
        contains all currently-available distributions.  If `full_env` is not
        supplied, one is created automatically from the ``WorkingSet`` this
        method is called on, which will typically mean that every directory on
        ``sys.path`` will be scanned for distributions.

        `installer` is a standard installer callback as used by the
        ``resolve()`` method. The `fallback` flag indicates whether we should
        attempt to resolve older versions of a plugin if the newest version
        cannot be resolved.

        This method returns a 2-tuple: (`distributions`, `error_info`), where
        `distributions` is a list of the distributions found in `plugin_env`
        that were loadable, along with any other distributions that are needed
        to resolve their dependencies.  `error_info` is a dictionary mapping
        unloadable plugin distributions to an exception instance describing the
        error that occurred. Usually this will be a ``DistributionNotFound`` or
        ``VersionConflict`` instance.
        iN(ulistusortuNoneuEnvironmentuentriesu	__class__umapuadduas_requirementuresolveuResolutionErrorusysuexc_infouupdateudictufromkeys(uselfu
plugin_envufull_envu	installerufallbackuplugin_projectsu
error_infou
distributionsuenvu
shadow_setuproject_nameudisturequ	resolveesuv((u&/tmp/pip-k8wh6o-build/pkg_resources.pyufind_pluginsAs6"





	
uWorkingSet.find_pluginscGs7|jt|��}x|D]}|j|�qW|S(u�Ensure that distributions matching `requirements` are activated

        `requirements` must be a string or a (possibly-nested) sequence
        thereof, specifying the distributions and versions required.  The
        return value is a sequence of the distributions that needed to be
        activated to fulfill the requirements; all relevant distributions are
        included, even if they were already activated in this working set.
        (uresolveuparse_requirementsuadd(uselfurequirementsuneededudist((u&/tmp/pip-k8wh6o-build/pkg_resources.pyurequire�s	
uWorkingSet.requirecCsB||jkrdS|jj|�x|D]}||�q*WdS(uAInvoke `callback` for all distributions (including existing ones)N(u	callbacksuappend(uselfucallbackudist((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu	subscribe�s

uWorkingSet.subscribecCs"x|jD]}||�q
WdS(N(u	callbacks(uselfudistucallback((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
_added_new�suWorkingSet._added_newcCs<|jdd�|jj�|jj�|jdd�fS(N(uentriesu
entry_keysucopyuby_keyu	callbacks(uself((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__getstate__�s(uWorkingSet.__getstate__cCsZ|\}}}}|dd�|_|j�|_|j�|_|dd�|_dS(N(uentriesucopyu
entry_keysuby_keyu	callbacks(uselfue_k_b_cuentriesukeysuby_keyu	callbacks((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__setstate__�s
uWorkingSet.__setstate__NT(u__name__u
__module__u__qualname__u__doc__uNoneu__init__u	add_entryu__contains__ufinduiter_entry_pointsu
run_scriptu__iter__uTrueuadduresolveufind_pluginsurequireu	subscribeu
_added_newu__getstate__u__setstate__(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
WorkingSet�s"
/McBs�|EeZdZdZde�edd�Zdd�Zdd�Z	ddd	�Z
d
d�Zdd
�Zddd�Z
ddd�Zdd�Zdd�Zdd�ZdS(uEnvironmentu5Searchable snapshot of distributions on a search pathcCs5i|_i|_||_||_|j|�dS(u!Snapshot distributions available on a search path

        Any distributions found on `search_path` are added to the environment.
        `search_path` should be a sequence of ``sys.path`` items.  If not
        supplied, ``sys.path`` is used.

        `platform` is an optional string specifying the name of the platform
        that platform-specific distributions must be compatible with.  If
        unspecified, it defaults to the current platform.  `python` is an
        optional string naming the desired version of Python (e.g. ``'3.3'``);
        it defaults to the current version.

        You may explicitly set `platform` (and/or `python`) to ``None`` if you
        wish to map *all* distributions, not just those compatible with the
        running platform or Python version.
        N(u_distmapu_cacheuplatformupythonuscan(uselfusearch_pathuplatformupython((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__init__�s
				uEnvironment.__init__cCsC|jdks0|jdks0|j|jkoBt|j|j�S(u�Is distribution `dist` acceptable for this environment?

        The distribution must match the platform and python version
        requirements specified when this environment was created, or False
        is returned.
        N(upythonuNoneu
py_versionucompatible_platformsuplatform(uselfudist((u&/tmp/pip-k8wh6o-build/pkg_resources.pyucan_add�suEnvironment.can_addcCs|j|jj|�dS(u"Remove `dist` from the environmentN(u_distmapukeyuremove(uselfudist((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuremove�suEnvironment.removecCsQ|dkrtj}nx2|D]*}x!t|�D]}|j|�q2WqWdS(udScan `search_path` for distributions usable in this environment

        Any distributions found are added to the environment.
        `search_path` should be a sequence of ``sys.path`` items.  If not
        supplied, ``sys.path`` is used.  Only distributions conforming to
        the platform/python version defined at initialization are added.
        N(uNoneusysupathufind_distributionsuadd(uselfusearch_pathuitemudist((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuscan�s

uEnvironment.scancCs�y|j|SWn1tk
rB|j�}||jkr>gSYnX||jkrw|j|}|j|<t|�n|j|S(uKReturn a newest-to-oldest list of distributions for `project_name`
        (u_cacheuKeyErroruloweru_distmapu_sort_dists(uselfuproject_nameudists((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__getitem__�s
	
uEnvironment.__getitem__cCs|j|�r{|j�r{|jj|jg�}||kr{|j|�|j|jkrxt|j|j�qxq{ndS(u<Add `dist` if we ``can_add()`` it and it isn't already addedN(ucan_adduhas_versionu_distmapu
setdefaultukeyuappendu_cacheu_sort_dists(uselfudistudists((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuadds
uEnvironment.addcCsW|j|�}|dk	r|Sx%||jD]}||kr-|Sq-W|j||�S(u�Find distribution best matching `req` and usable on `working_set`

        This calls the ``find(req)`` method of the `working_set` to see if a
        suitable distribution is already active.  (This may raise
        ``VersionConflict`` if an unsuitable version of the project is already
        active in the specified `working_set`.)  If a suitable distribution
        isn't active, this method returns the newest distribution in the
        environment that meets the ``Requirement`` in `req`.  If no suitable
        distribution is found, and `installer` is supplied, then the result of
        calling the environment's ``obtain(req, installer)`` method will be
        returned.
        N(ufinduNoneukeyuobtain(uselfurequworking_setu	installerudist((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
best_match
s
uEnvironment.best_matchcCs|dk	r||�SdS(u�Obtain a distribution matching `requirement` (e.g. via download)

        Obtain a distro that matches requirement (e.g. via download).  In the
        base ``Environment`` class, this routine just returns
        ``installer(requirement)``, unless `installer` is None, in which case
        None is returned instead.  This method is a hook that allows subclasses
        to attempt other ways of obtaining a distribution before falling back
        to the `installer` argument.N(uNone(uselfurequirementu	installer((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuobtains	uEnvironment.obtainccs0x)|jj�D]}||r|VqqWdS(u=Yield the unique project names of the available distributionsN(u_distmapukeys(uselfukey((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__iter__+s
uEnvironment.__iter__cCs{t|t�r|j|�nXt|t�rdxF|D](}x||D]}|j|�qFWq5Wntd|f��|S(u2In-place addition of a distribution or environmentuCan't add %r to environment(u
isinstanceuDistributionuadduEnvironmentu	TypeError(uselfuotheruprojectudist((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__iadd__0s
uEnvironment.__iadd__cCs@|jgdddd�}x||fD]}||7}q(W|S(u4Add an environment or distribution to an environmentuplatformupythonN(u	__class__uNone(uselfuotherunewuenv((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__add__<suEnvironment.__add__N(u__name__u
__module__u__qualname__u__doc__uNoneuget_supported_platformuPY_MAJORu__init__ucan_adduremoveuscanu__getitem__uaddu
best_matchuobtainu__iter__u__iadd__u__add__(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuEnvironment�s	cBs|EeZdZdZdS(uExtractionErroruTAn error occurred extracting a resource

    The following attributes are available from instances of this exception:

    manager
        The resource manager that raised this exception

    cache_path
        The base directory for resource extraction

    original_error
        The exception instance that caused extraction to fail
    N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuExtractionErrorGs
cBs�|EeZdZdZdZdd�Zdd�Zdd�Zdd	�Z	d
d�Z
dd
�Zdd�Zdd�Z
fdd�Zedd��Zdd�Zdd�Zddd�ZdS(uResourceManageru'Manage resource extraction and packagescCs
i|_dS(N(ucached_files(uself((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__init__[suResourceManager.__init__cCst|�j|�S(uDoes the named resource exist?(uget_provideruhas_resource(uselfupackage_or_requirementu
resource_name((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuresource_exists^suResourceManager.resource_existscCst|�j|�S(u,Is the named resource an existing directory?(uget_provideruresource_isdir(uselfupackage_or_requirementu
resource_name((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuresource_isdirbsuResourceManager.resource_isdircCst|�j||�S(u4Return a true filesystem path for specified resource(uget_provideruget_resource_filename(uselfupackage_or_requirementu
resource_name((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuresource_filenamehsu!ResourceManager.resource_filenamecCst|�j||�S(u9Return a readable file-like object for specified resource(uget_provideruget_resource_stream(uselfupackage_or_requirementu
resource_name((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuresource_streamnsuResourceManager.resource_streamcCst|�j||�S(u%Return specified resource as a string(uget_provideruget_resource_string(uselfupackage_or_requirementu
resource_name((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuresource_stringtsuResourceManager.resource_stringcCst|�j|�S(u1List the contents of the named resource directory(uget_provideruresource_listdir(uselfupackage_or_requirementu
resource_name((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuresource_listdirzsu ResourceManager.resource_listdircCs]tj�d}|jpt�}td||f�}||_||_||_|�dS(u5Give an error message for problems extracting file(s)iu}Can't extract file(s) to egg cache

The following error occurred while trying to extract file(s) to the Python egg
cache:

  %s

The Python egg cache directory is currently set to:

  %s

Perhaps your account does not have write access to this directory?  You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.
N(usysuexc_infouextraction_pathuget_default_cacheuExtractionErrorumanageru
cache_pathuoriginal_error(uselfuold_excu
cache_pathuerr((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuextraction_error�s			u ResourceManager.extraction_errorc
Cso|jpt�}tjj||d|�}yt|�Wn|j�YnX|j|�d|j|<|S(u�Return absolute location in cache for `archive_name` and `names`

        The parent directory of the resulting path will be created if it does
        not already exist.  `archive_name` should be the base filename of the
        enclosing egg (which may not be the name of the enclosing zipfile!),
        including its ".egg" extension.  `names`, if provided, should be a
        sequence of path name parts "under" the egg's extraction location.

        This method should only be called by resource providers that need to
        obtain an extraction location, and only for names they intend to
        extract, as it tracks the generated names for possible cleanup later.
        u-tmpi(	uextraction_pathuget_default_cacheuosupathujoinu_bypass_ensure_directoryuextraction_erroru_warn_unsafe_extraction_pathucached_files(uselfuarchive_nameunamesuextract_pathutarget_path((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_cache_path�s


uResourceManager.get_cache_pathcCswtjdkr*|jtjd�r*dStj|�j}|tj@sV|tj@rsd|}tj	|t
�ndS(uN
        If the default extraction path is overridden and set to an insecure
        location, such as /tmp, it opens up an opportunity for an attacker to
        replace an extracted file with an unauthorized payload. Warn the user
        if a known insecure location is used.

        See Distribute #375 for more details.
        untuwindirNu�%s is writable by group/others and vulnerable to attack when used with get_resource_filename. Consider a more secure location (set with .set_extraction_path or the PYTHON_EGG_CACHE environment variable).(uosunameu
startswithuenvironustatust_modeuS_IWOTHuS_IWGRPuwarningsuwarnuUserWarning(upathumodeumsg((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_warn_unsafe_extraction_path�s
&u,ResourceManager._warn_unsafe_extraction_pathcCs@tjdkr<tj|�jdBd@}tj||�ndS(u4Perform any platform-specific postprocessing of `tempname`

        This is where Mac header rewrites should be done; other platforms don't
        have anything special they should do.

        Resource providers should call this method ONLY after successfully
        extracting a compressed resource.  They must NOT call it on resources
        that are already in the filesystem.

        `tempname` is the current (temporary) name of the file, and `filename`
        is the name it will be renamed to by the caller after this routine
        returns.
        uposiximi�N(uosunameustatust_modeuchmod(uselfutempnameufilenameumode((u&/tmp/pip-k8wh6o-build/pkg_resources.pyupostprocess�suResourceManager.postprocesscCs%|jrtd��n||_dS(u�Set the base path where resources will be extracted to, if needed.

        If you do not call this routine before any extractions take place, the
        path defaults to the return value of ``get_default_cache()``.  (Which
        is based on the ``PYTHON_EGG_CACHE`` environment variable, with various
        platform-specific fallbacks.  See that routine's documentation for more
        details.)

        Resources are extracted to subdirectories of this path based upon
        information given by the ``IResourceProvider``.  You may set this to a
        temporary directory, but then you must call ``cleanup_resources()`` to
        delete the extracted files when done.  There is no guarantee that
        ``cleanup_resources()`` will be able to remove all extracted files.

        (Note: you may not change the extraction path for a given resource
        manager once resources have been extracted, unless you first call
        ``cleanup_resources()``.)
        u5Can't change extraction path, files already extractedN(ucached_filesu
ValueErroruextraction_path(uselfupath((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuset_extraction_path�s	u#ResourceManager.set_extraction_pathcCsdS(uB
        Delete all extracted resource files and directories, returning a list
        of the file and directory names that could not be successfully removed.
        This function does not have any concurrency protection, so it should
        generally only be called when the extraction path is a temporary
        directory exclusive to a single process.  This method is not
        automatically called; you must call it explicitly or register it as an
        ``atexit`` function if you wish to ensure cleanup of a temporary
        directory used for extractions.
        N((uselfuforce((u&/tmp/pip-k8wh6o-build/pkg_resources.pyucleanup_resources�su!ResourceManager.cleanup_resourcesNF(u__name__u
__module__u__qualname__u__doc__uNoneuextraction_pathu__init__uresource_existsuresource_isdiruresource_filenameuresource_streamuresource_stringuresource_listdiruextraction_erroruget_cache_pathustaticmethodu_warn_unsafe_extraction_pathupostprocessuset_extraction_pathuFalseucleanup_resources(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuResourceManagerWscCsytjdSWntk
r#YnXtjdkrCtjjd�Sd}dd|fd|fd|fdd|fg}x�|D]�\}}d}xn|D]5}|tjkr�tjj|tj|�}q�Pq�W|r�tjj||�}ntjj|d�Sq�Wtd
��dS(uDetermine the default cache location

    This returns the ``PYTHON_EGG_CACHE`` environment variable, if set.
    Otherwise, on Windows, it returns a "Python-Eggs" subdirectory of the
    "Application Data" directory.  On all other systems, it's "~/.python-eggs".
    uPYTHON_EGG_CACHEuntu~/.python-eggsuApplication DatauAPPDATAuUSERPROFILEu	HOMEDRIVEuHOMEPATHuHOMEuWINDIRuuPython-Eggsu3Please set the PYTHON_EGG_CACHE enviroment variableN(uAPPDATA((uAPPDATAN(uUSERPROFILE(u	HOMEDRIVEuHOMEPATH(uHOMEPATH(uHOME((uHOMEN(uWINDIR(	uosuenvironuKeyErrorunameupathu
expanduseruNoneujoinuRuntimeError(uapp_datau	app_homesukeysusubdirudirnameukey((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_default_caches0
			
cCstjdd|�S(u�Convert an arbitrary string to a standard distribution name

    Any runs of non-alphanumeric/. characters are replaced with a single '-'.
    u[^A-Za-z0-9.]+u-(ureusub(uname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu	safe_name0scCs%|jdd�}tjdd|�S(u�Convert an arbitrary string to a standard version string

    Spaces become dots, and all other non-alphanumeric characters become
    dashes, with runs of multiple dashes condensed to a single dash.
    u u.u[^A-Za-z0-9.]+u-(ureplaceureusub(uversion((u&/tmp/pip-k8wh6o-build/pkg_resources.pyusafe_version8scCstjdd|�j�S(u�Convert an arbitrary string to a standard 'extra' name

    Any runs of non-alphanumeric characters are replaced with a single '_',
    and the result is always lowercased.
    u[^A-Za-z0-9.]+u_(ureusubulower(uextra((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
safe_extraBscCs|jdd�S(u|Convert a project or version name to its filename-escaped form

    Any '-' characters are currently replaced with '_'.
    u-u_(ureplace(uname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuto_filenameKsunameuosuplatformusysuversionumachineupython_implementationupython_versionupython_full_versionuextracCstjS(N(uosuname(((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu<lambda>Ysuos_namecCstjS(N(usysuplatform(((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu<lambda>Zsusys_platformcCstjj�dS(Ni(usysuversionusplit(((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu<lambda>[scCsdtjdtjdfS(Nu%s.%sii(usysuversion_info(((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu<lambda>\scCs
td�S(Nuversion(u	_platinfo(((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu<lambda>]suplatform_versioncCs
td�S(Numachine(u	_platinfo(((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu<lambda>^suplatform_machinecCstd�pt�S(Nupython_implementation(u	_platinfou_pyimp(((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu<lambda>_sc
CsByddl}Wntk
r(dSYnXt||dd���S(NiucSsdS(Nu((((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu<lambda>gsu_platinfo.<locals>.<lambda>(uplatformuImportErrorugetattr(uattruplatform((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu	_platinfobs

	u	_platinfocCsDtjdkrdStjjd�r)dSdtjkr<dSdSdS(Nucliu
IronPythonujavauJythonu__pypy__uPyPyuCPython(usysuplatformu
startswithubuiltin_module_names(((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_pyimpisu_pyimpcCsEidd6dd6}d|_d|_|j|j|j�|_|S(u�
    Given a SyntaxError from a marker evaluation, normalize the error message:
     - Remove indications of filename and line number.
     - Replace platform-specific error messages with standard error messages.
    uinvalid syntaxuunexpected EOF while parsinguparenthesis is never closedN(uNoneufilenameulinenougetumsg(uexcusubs((u&/tmp/pip-k8wh6o-build/pkg_resources.pyunormalize_exceptionss
		unormalize_exceptioncCs;yt|�Wn&tk
r6ttj�d�SYnXdS(uHValidate text as a PEP 426 environment marker; return exception or FalseiF(uevaluate_markeruSyntaxErrorunormalize_exceptionusysuexc_infouFalse(utext((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuinvalid_marker�s

csf�sddlm�m�ddl�ddl�ddl���fdd�}��fdd�}��fdd	�}���fd
d�}�ji|�j6|�j6|�j6|�j	6dd
�d6dd
�d6�j
d6�jd6�t�d�r|��j
<qn��fdd����fdd���tj|�jd�d�S(uV
    Evaluate a PEP 426 environment marker on CPython 2.4+.
    Return a boolean indicating the marker result in this environment.
    Raise SyntaxError if marker is invalid.

    This implementation uses the 'parser' module, which is not implemented on
    Jython and has been superseded by the 'ast' module in Python 2.6 and
    later.
    i(uNAMEuSTRINGNcs;tj�j��fdd�tdt��d�D��S(Ncs g|]}��|��qS(((u.0ui(u	interpretunodelist(u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
<listcomp>�s	u5evaluate_marker.<locals>.and_test.<locals>.<listcomp>ii(u	functoolsureduceuand_urangeulen(unodelist(u	interpretuoperator(unodelistu&/tmp/pip-k8wh6o-build/pkg_resources.pyuand_test�su!evaluate_marker.<locals>.and_testcs;tj�j��fdd�tdt��d�D��S(Ncs g|]}��|��qS(((u.0ui(u	interpretunodelist(u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
<listcomp>�s	u1evaluate_marker.<locals>.test.<locals>.<listcomp>ii(u	functoolsureduceuor_urangeulen(unodelist(u	interpretuoperator(unodelistu&/tmp/pip-k8wh6o-build/pkg_resources.pyutest�suevaluate_marker.<locals>.testcsa|dd}|�jkrQ|dd�jkrCtd��n�|d�Std��dS(NiiiuEmpty parenthesesu5Language feature not supported in environment markers(uLPARuRPARuSyntaxError(unodelistut(u	interpretutoken(u&/tmp/pip-k8wh6o-build/pkg_resources.pyuatom�suevaluate_marker.<locals>.atomc
s�t|�dkr!td��n|dd}|d}|d�kr�t|d�dkr�|dkrtd}q}d	}q�ny�|}Wn(tk
r�tt|�d
��YnX|�|d��|d��S(Niu5Chained comparison not allowed in environment markersiiiiunotunot inuis notu, operator not allowed in environment markers(ulenuSyntaxErroruKeyErrorurepr(unodelistucompucop(uNAMEu_opsuevaluate(u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
comparison�s
	
u#evaluate_marker.<locals>.comparisoncSs
||kS(N((uxuy((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu<lambda>�su!evaluate_marker.<locals>.<lambda>unot incSs
||kS(N((uxuy((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu<lambda>�suinu==u!=uor_testcs{x t|�dkr"|d}qWy�|d}Wn9tk
rptd��td�j|d��YnX||�S(Niiiu)Comparison or logical expression expectedu7Language feature not supported in environment markers: (ulenuKeyErroruSyntaxErrorusym_name(unodelistuop(u_opsusymbol(u&/tmp/pip-k8wh6o-build/pkg_resources.pyu	interpret�s
 u"evaluate_marker.<locals>.interpretcsx t|�dkr"|d}qW|d}|d}|�kr}yt|}Wn"tk
rutd|��YnX|�S|�kr�|d}|dd�dks�|jd�s�|jd�s�d|kr�td	��n|dd�Std
��dS(NiiiuUnknown name %ru'"u"""u'''u\u1Only plain strings allowed in environment markersu5Language feature not supported in environment markersi����(ulenu_marker_valuesuKeyErroruSyntaxErroru
startswith(unodelistukindunameuopus(uNAMEuSTRING(u&/tmp/pip-k8wh6o-build/pkg_resources.pyuevaluate�s$



4u!evaluate_marker.<locals>.evaluatei(utokenuNAMEuSTRINGusymboluoperatoruupdateutestuand_testuatomu
comparisonuequneuhasattruor_testuparseruexprutotuple(utextuextrau_opsuand_testutestuatomu
comparison((uNAMEuSTRINGu_opsuevaluateu	interpretuoperatorusymbolutokenu&/tmp/pip-k8wh6o-build/pkg_resources.pyuevaluate_marker�s$	%	cCs�ddl}|j�}x9|j�D]+}|jdd�}|j|�||<q%Wy|j||�}Wn5tk
r�tj�d}t	|j
d��YnX|S(u�
    Evaluate a PEP 426 environment marker using markerlib.
    Return a boolean indicating the marker result in this environment.
    Raise SyntaxError if marker is invalid.
    iNu.u_i(u
_markerlibudefault_environmentukeysureplaceupopu	interpretu	NameErrorusysuexc_infouSyntaxErroruargs(utextu
_markerlibuenvukeyunew_keyuresultue((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_markerlib_evaluate�s
u_markerlib_evaluateuparsercBs"|EeZdZdZd(Zd(Zd(Zdd�Zdd�Z	dd�Z
dd	�Zd
d�Zdd
�Z
ejd)kr�dd�Zndd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(S(*uNullProvideruETry to implement resources and metadata for arbitrary PEP 302 loaderscCs:t|dd�|_tjjt|dd��|_dS(Nu
__loader__u__file__u(ugetattruNoneuloaderuosupathudirnameumodule_path(uselfumodule((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__init__suNullProvider.__init__cCs|j|j|�S(N(u_fnumodule_path(uselfumanageru
resource_name((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_resource_filename	su"NullProvider.get_resource_filenamecCst|j||��S(N(uBytesIOuget_resource_string(uselfumanageru
resource_name((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_resource_streamsu NullProvider.get_resource_streamcCs|j|j|j|��S(N(u_getu_fnumodule_path(uselfumanageru
resource_name((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_resource_stringsu NullProvider.get_resource_stringcCs|j|j|j|��S(N(u_hasu_fnumodule_path(uselfu
resource_name((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuhas_resourcesuNullProvider.has_resourcecCs%|jo$|j|j|j|��S(N(uegg_infou_hasu_fn(uselfuname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuhas_metadatasuNullProvider.has_metadataicCs)|js
dS|j|j|j|��S(Nu(uegg_infou_getu_fn(uselfuname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_metadatas	uNullProvider.get_metadatacCs2|js
dS|j|j|j|��jd�S(Nuuutf-8(uegg_infou_getu_fnudecode(uselfuname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_metadatas	cCst|j|��S(N(uyield_linesuget_metadata(uselfuname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_metadata_lines#suNullProvider.get_metadata_linescCs|j|j|j|��S(N(u_isdiru_fnumodule_path(uselfu
resource_name((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuresource_isdir&suNullProvider.resource_isdircCs%|jo$|j|j|j|��S(N(uegg_infou_isdiru_fn(uselfuname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyumetadata_isdir)suNullProvider.metadata_isdircCs|j|j|j|��S(N(u_listdiru_fnumodule_path(uselfu
resource_name((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuresource_listdir,suNullProvider.resource_listdircCs)|jr%|j|j|j|��SgS(N(uegg_infou_listdiru_fn(uselfuname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyumetadata_listdir/s	uNullProvider.metadata_listdircCs�d|}|j|�s,td|��n|j|�jdd�}|jdd�}|j|j|�}||d<tjj|�r�t	|||�nWddl
m}t|�d|j
d�|f||<t||d	�}t|||�dS(
Nuscripts/uNo script named %ru
u
u
u__file__i(ucacheuexec(uhas_metadatauResolutionErroruget_metadataureplaceu_fnuegg_infouosupathuexistsuexecfileu	linecacheucacheulenusplitucompileuexec(uselfuscript_nameu	namespaceuscriptuscript_textuscript_filenameucacheuscript_code((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
run_script4s

%uNullProvider.run_scriptcCstd��dS(Nu9Can't perform this operation for unregistered loader type(uNotImplementedError(uselfupath((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_hasFsuNullProvider._hascCstd��dS(Nu9Can't perform this operation for unregistered loader type(uNotImplementedError(uselfupath((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_isdirKsuNullProvider._isdircCstd��dS(Nu9Can't perform this operation for unregistered loader type(uNotImplementedError(uselfupath((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_listdirPsuNullProvider._listdircCs&|r"tjj||jd��S|S(Nu/(uosupathujoinusplit(uselfubaseu
resource_name((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_fnUsuNullProvider._fncCs2t|jd�r"|jj|�Std��dS(Nuget_datau=Can't perform this operation for loaders without 'get_data()'(uhasattruloaderuget_datauNotImplementedError(uselfupath((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_getZsuNullProvider._getN(i(u__name__u
__module__u__qualname__u__doc__uNoneuegg_nameuegg_infouloaderu__init__uget_resource_filenameuget_resource_streamuget_resource_stringuhas_resourceuhas_metadatausysuversion_infouget_metadatauget_metadata_linesuresource_isdirumetadata_isdiruresource_listdirumetadata_listdiru
run_scriptu_hasu_isdiru_listdiru_fnu_get(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuNullProvider�s0cBs2|EeZdZdZdd�Zdd�ZdS(uEggProvideru&Provider based on a virtual filesystemcCstj||�|j�dS(N(uNullProvideru__init__u
_setup_prefix(uselfumodule((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__init__gsuEggProvider.__init__cCs�|j}d}x}||kr�|j�jd�rmtjj|�|_tjj|d�|_	||_
Pn|}tjj|�\}}qWdS(Nu.egguEGG-INFO(umodule_pathuNoneuloweruendswithuosupathubasenameuegg_nameujoinuegg_infouegg_rootusplit(uselfupathuoldubase((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
_setup_prefixks		uEggProvider._setup_prefixN(u__name__u
__module__u__qualname__u__doc__u__init__u
_setup_prefix(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuEggProviderdscBsV|EeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�ZdS(
uDefaultProvideru6Provides access to package resources in the filesystemcCstjj|�S(N(uosupathuexists(uselfupath((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_has|suDefaultProvider._hascCstjj|�S(N(uosupathuisdir(uselfupath((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_isdirsuDefaultProvider._isdircCs
tj|�S(N(uosulistdir(uselfupath((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_listdir�suDefaultProvider._listdircCst|j|j|�d�S(Nurb(uopenu_fnumodule_path(uselfumanageru
resource_name((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_resource_stream�su#DefaultProvider.get_resource_streamc
Cs/t|d�}z|j�SWd|j�XdS(Nurb(uopenureaduclose(uselfupathustream((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_get�suDefaultProvider._getN(	u__name__u
__module__u__qualname__u__doc__u_hasu_isdiru_listdiruget_resource_streamu_get(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuDefaultProvideryscBsT|EeZdZdZdd�ZZdd�Zdd�ZdZ	dd�Z
dS(	u
EmptyProvideru.Provider that returns nothing for all requestscCsdS(NF(uFalse(uselfupath((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu<lambda>�suEmptyProvider.<lambda>cCsdS(Nu((uselfupath((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu<lambda>�scCsgS(N((uselfupath((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu<lambda>�scCsdS(N((uself((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__init__�suEmptyProvider.__init__N(u__name__u
__module__u__qualname__u__doc__u_isdiru_hasu_getu_listdiruNoneumodule_pathu__init__(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
EmptyProvider�sc
Cs�t�}tj|�}zYxR|j�D]D}|jdtj�}|j|�||<||dk	s(t	�q(WWd|j
�X|S(uf
    This builds a similar dictionary to the zipimport directory
    caches.  However instead of tuples, ZipInfo objects are stored.

    The translation of the tuple is as follows:
      * [0] - zipinfo.filename on stock pythons this needs "/" --> os.sep
              on pypy it is the same (one reason why distribute did work
              in some cases on pypy and win32).
      * [1] - zipinfo.compress_type
      * [2] - zipinfo.compress_size
      * [3] - zipinfo.file_size
      * [4] - len(utf-8 encoding of filename) if zipinfo & 0x800
              len(ascii encoding of filename) otherwise
      * [5] - (zipinfo.date_time[0] - 1980) << 9 |
               zipinfo.date_time[1] << 5 | zipinfo.date_time[2]
      * [6] - (zipinfo.date_time[3] - 1980) << 11 |
               zipinfo.date_time[4] << 5 | (zipinfo.date_time[5] // 2)
      * [7] - zipinfo.CRC
    u/N(udictuzipfileuZipFileunamelistureplaceuosusepugetinfouNoneuAssertionErroruclose(upathuzipinfouzfileuzitemuzpath((u&/tmp/pip-k8wh6o-build/pkg_resources.pyubuild_zipmanifest�s	ubuild_zipmanifestcBs�|EeZdZdZdZdd�Zdd�Zdd�Zdd	�Z	e
d
d��Zdd
�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�ZdS(uZipProvideru"Resource support for zips and eggscCs?tj||�t|jj�|_|jjtj|_dS(N(	uEggProvideru__init__ubuild_zipmanifestuloaderuarchiveuzipinfouosusepuzip_pre(uselfumodule((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__init__�suZipProvider.__init__cCsF|j|j�r)|t|j�d�Std||jf��dS(Nu%s is not a subpath of %s(u
startswithuzip_preulenuAssertionError(uselfufspath((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
_zipinfo_name�suZipProvider._zipinfo_namecCsj|j|}|j|jtj�rM|t|j�dd�jtj�Std||jf��dS(Niu%s is not a subpath of %s(uzip_preu
startswithuegg_rootuosusepulenusplituAssertionError(uselfuzip_pathufspath((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_parts�s

'uZipProvider._partscCs�|jstd��n|j|�}|j�}dj|j|��|kr~x*|D]}|j||j|��qXWn|j||�S(Nu5resource_filename() only supported for .egg, not .zipu/(uegg_nameuNotImplementedErroru_resource_to_zipu_get_eager_resourcesujoinu_partsu_extract_resourceu
_eager_to_zip(uselfumanageru
resource_nameuzip_pathueagersuname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_resource_filename�s	
 u!ZipProvider.get_resource_filenamecCs/|j}|jd}tj|�}||fS(Niii����(iii����(u	file_sizeu	date_timeutimeumktime(uzip_statusizeu	date_timeu	timestamp((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_get_date_and_size�s	
uZipProvider._get_date_and_sizec
Cs�||j�kr^x9|j�|D]'}|j|tjj||��}q#Wtjj|�S|j|j|�\}}ts�t	d��ny)|j
|j|j|��}|j
||�r�|Stddtjj|��\}}	tj||jj|��tj|�t|	||f�|j|	|�yt|	|�Wnmtjk
r�tjj|�r�|j
||�r�|Stjdkr�t|�t|	|�|Sn�YnXWntjk
r�|j�YnX|S(Nu>"os.rename" and "os.unlink" are not supported on this platformu	.$extractudirunt(u_indexu_extract_resourceuosupathujoinudirnameu_get_date_and_sizeuzipinfou
WRITE_SUPPORTuIOErroruget_cache_pathuegg_nameu_partsu_is_currentu_mkstempuwriteuloaderuget_dataucloseuutimeupostprocessurenameuerroruisfileunameuunlinkuextraction_error(
uselfumanageruzip_pathunameulastu	timestampusizeu	real_pathuoutfutmpnam((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_extract_resource�s@$


uZipProvider._extract_resourcec	Cs�|j|j|�\}}tjj|�s2dStj|�}|j|ks_|j|krcdS|j	j
|�}t|d�}|j�}|j
�||kS(uK
        Return True if the file_path is current for this zip_path
        urbF(u_get_date_and_sizeuzipinfouosupathuisfileuFalseustatust_sizeust_mtimeuloaderuget_datauopenureaduclose(	uselfu	file_pathuzip_pathu	timestampusizeustatuzip_contentsufu
file_contents((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_is_current&s
uZipProvider._is_currentcCsa|jdkrZg}x6dD].}|j|�r|j|j|��qqW||_n|jS(Nunative_libs.txtueager_resources.txt(unative_libs.txtueager_resources.txt(ueagersuNoneuhas_metadatauextenduget_metadata_lines(uselfueagersuname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_get_eager_resources7s
u ZipProvider._get_eager_resourcescCs�y|jSWn�tk
r�i}x�|jD]y}|jtj�}x^|r�tjj|dd��}||kr�||j|d�PqF|j�g||<qFWq+W||_|SYnXdS(Nii����i����(	u	_dirindexuAttributeErroruzipinfousplituosusepujoinuappendupop(uselfuindupathupartsuparent((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_index@s
		uZipProvider._indexcCs.|j|�}||jkp-||j�kS(N(u
_zipinfo_nameuzipinfou_index(uselfufspathuzip_path((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_hasQsuZipProvider._hascCs|j|�|j�kS(N(u
_zipinfo_nameu_index(uselfufspath((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_isdirUsuZipProvider._isdircCs%t|j�j|j|�f��S(N(ulistu_indexugetu
_zipinfo_name(uselfufspath((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_listdirXsuZipProvider._listdircCs|j|j|j|��S(N(u
_zipinfo_nameu_fnuegg_root(uselfu
resource_name((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
_eager_to_zip[suZipProvider._eager_to_zipcCs|j|j|j|��S(N(u
_zipinfo_nameu_fnumodule_path(uselfu
resource_name((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_resource_to_zip^suZipProvider._resource_to_zipN(u__name__u
__module__u__qualname__u__doc__uNoneueagersu__init__u
_zipinfo_nameu_partsuget_resource_filenameustaticmethodu_get_date_and_sizeu_extract_resourceu_is_currentu_get_eager_resourcesu_indexu_hasu_isdiru_listdiru
_eager_to_zipu_resource_to_zip(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuZipProvider�s 		
1	cBsJ|EeZdZdZdd�Zdd�Zdd�Zdd	�Zd
S(uFileMetadatau*Metadata handler for standalone PKG-INFO files

    Usage::

        metadata = FileMetadata("/path/to/PKG-INFO")

    This provider rejects all data and metadata requests except for PKG-INFO,
    which is treated as existing, and will be the contents of the file at
    the provided location.
    cCs
||_dS(N(upath(uselfupath((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__init__psuFileMetadata.__init__cCs
|dkS(NuPKG-INFO((uselfuname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuhas_metadatassuFileMetadata.has_metadatacCsH|dkr8t|jd�}|j�}|j�|Std��dS(NuPKG-INFOurUu(No metadata except PKG-INFO is available(uopenupathureaducloseuKeyError(uselfunameufumetadata((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_metadatavs
uFileMetadata.get_metadatacCst|j|��S(N(uyield_linesuget_metadata(uselfuname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_metadata_lines~suFileMetadata.get_metadata_linesN(u__name__u
__module__u__qualname__u__doc__u__init__uhas_metadatauget_metadatauget_metadata_lines(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuFileMetadatads

cBs&|EeZdZdZdd�ZdS(uPathMetadatauqMetadata provider for egg directories

    Usage::

        # Development eggs:

        egg_info = "/path/to/PackageName.egg-info"
        base_dir = os.path.dirname(egg_info)
        metadata = PathMetadata(base_dir, egg_info)
        dist_name = os.path.splitext(os.path.basename(egg_info))[0]
        dist = Distribution(basedir,project_name=dist_name,metadata=metadata)

        # Unpacked egg directories:

        egg_path = "/path/to/PackageName-ver-pyver-etc.egg"
        metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO'))
        dist = Distribution.from_filename(egg_path, metadata=metadata)
    cCs||_||_dS(N(umodule_pathuegg_info(uselfupathuegg_info((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__init__�s	uPathMetadata.__init__N(u__name__u
__module__u__qualname__u__doc__u__init__(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuPathMetadata�scBs&|EeZdZdZdd�ZdS(uEggMetadatau Metadata provider for .egg filescCsrt|j�|_|jtj|_||_|jrXtjj	|j|j�|_
n|j|_
|j�dS(u-Create a metadata provider from a zipimporterN(ubuild_zipmanifestuarchiveuzipinfouosusepuzip_preuloaderuprefixupathujoinumodule_pathu
_setup_prefix(uselfuimporter((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__init__�s		!uEggMetadata.__init__N(u__name__u
__module__u__qualname__u__doc__u__init__(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuEggMetadata�sudictu_distribution_finderscCs|t|<dS(uxRegister `distribution_finder` to find distributions in sys.path items

    `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
    handler), and `distribution_finder` is a callable that, passed a path
    item and the importer instance, yields ``Distribution`` instances found on
    that path item.  See ``pkg_resources.find_on_path`` for an example.N(u_distribution_finders(u
importer_typeudistribution_finder((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuregister_finder�scCs+t|�}tt|�}||||�S(u.Yield distributions accessible via `path_item`(uget_importeru
_find_adapteru_distribution_finders(u	path_itemuonlyuimporterufinder((u&/tmp/pip-k8wh6o-build/pkg_resources.pyufind_distributions�sccs�t|�}|jd�r2tj|d|�Vn|r<dSxf|jd�D]U}|jd�rLtjj||�}x(t	t
j|�|�D]}|Vq�WqLqLWdS(NuPKG-INFOumetadatau/u.egg(uEggMetadatauhas_metadatauDistributionu
from_filenameuresource_listdiruendswithuosupathujoinufind_in_zipu	zipimportuzipimporter(uimporteru	path_itemuonlyumetadatausubitemusubpathudist((u&/tmp/pip-k8wh6o-build/pkg_resources.pyufind_in_zip�sufind_in_zipcCsfS(N((uimporteru	path_itemuonly((u&/tmp/pip-k8wh6o-build/pkg_resources.pyufind_nothing�sufind_nothingccst|�}tjj|�rtj|tj�r|j�jd�rwtj	|dt
|tjj|d���Vqx�tj|�D]}}|j�}|jd�s�|jd�rtjj||�}tjj|�r�t
||�}nt
|�}tj|||dt�Vq�|r]|jd�r]x�ttjj||��D]}|VqKWq�|r�|jd�r�ttjj||��}z|j�}	Wd|j�XxU|	D]J}
|
j�s�q�nx.ttjj||
j���D]}|Vq�WPq�Wq�q�WndS(	u6Yield distributions accessible on a sys.path directoryu.eggumetadatauEGG-INFOu	.egg-infou
.dist-infou
precedenceu	.egg-linkN(u_normalize_cacheduosupathuisdiruaccessuR_OKuloweruendswithuDistributionu
from_filenameuPathMetadataujoinulistdiruFileMetadatau
from_locationuDEVELOP_DISTufind_distributionsuopenu	readlinesucloseustripurstrip(uimporteru	path_itemuonlyuentryulowerufullpathumetadataudistu
entry_fileuentry_linesulineuitem((u&/tmp/pip-k8wh6o-build/pkg_resources.pyufind_on_path�s:'	 "
(	ufind_on_pathu_namespace_handlersu_namespace_packagescCs|t|<dS(u�Register `namespace_handler` to declare namespace packages

    `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
    handler), and `namespace_handler` is a callable like this::

        def namespace_handler(importer,path_entry,moduleName,module):
            # return a path_entry to use for child packages

    Namespace handlers are only called if the importer object has already
    agreed that it can handle the relevant path item, and they should only
    return a subpath if the module __path__ does not already contain an
    equivalent subpath.  For an example namespace handler, see
    ``pkg_resources.file_ns_handler``.
    N(u_namespace_handlers(u
importer_typeunamespace_handler((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuregister_namespace_handler�scCs
t|�}|dkrdS|j|�}|dkr;dStjj|�}|dkr�tj|�}tj|<g|_t	|�n!t
|d�s�td|��ntt
|�}|||||�}|dk	r	|j}|j|�|j|�||_n|S(uEEnsure that named package includes a subpath of path_item (if needed)u__path__uNot a package:N(uget_importeruNoneufind_moduleusysumodulesugetuimpu
new_moduleu__path__u_set_parent_nsuhasattru	TypeErroru
_find_adapteru_namespace_handlersuappenduload_module(upackageNameu	path_itemuimporteruloaderumoduleuhandlerusubpathupath((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
_handle_nss*	
	

u
_handle_nscCstj�z�|tkrdStjd}}d|kr�dj|jd�dd��}t|�|tkr~t	|�nytj
|j}Wq�tk
r�t
d|��Yq�Xntj|g�j|�tj|g�x|D]}t||�q�WWdtj�XdS(u9Declare that package 'packageName' is a namespace packageNu.iuNot a package:i����(uimpuacquire_locku_namespace_packagesusysupathuNoneujoinusplitudeclare_namespaceu
__import__umodulesu__path__uAttributeErroru	TypeErroru
setdefaultuappendu
_handle_nsurelease_lock(upackageNameupathuparentu	path_item((u&/tmp/pip-k8wh6o-build/pkg_resources.pyudeclare_namespace(s&
"



c
Csbtj�zFx?tj|f�D]+}t||�}|r t||�q q WWdtj�XdS(uDEnsure that previously-declared namespace packages include path_itemN(uimpuacquire_locku_namespace_packagesugetu
_handle_nsufixup_namespace_packagesurelease_lock(u	path_itemuparentupackageusubpath((u&/tmp/pip-k8wh6o-build/pkg_resources.pyufixup_namespace_packagesHs
cCs`tjj||jd�d�}t|�}x+|jD]}t|�|kr8Pq8q8W|SdS(uBCompute an ns-package subpath for a filesystem or zipfile importeru.iNi����(uosupathujoinusplitu_normalize_cachedu__path__(uimporteru	path_itemupackageNameumoduleusubpathu
normalizeduitem((u&/tmp/pip-k8wh6o-build/pkg_resources.pyufile_ns_handlerRs"ufile_ns_handlercCsdS(N(uNone(uimporteru	path_itemupackageNameumodule((u&/tmp/pip-k8wh6o-build/pkg_resources.pyunull_ns_handleresunull_ns_handlercCstjjtjj|��S(u1Normalize a file/dir name for comparison purposes(uosupathunormcaseurealpath(ufilename((u&/tmp/pip-k8wh6o-build/pkg_resources.pyunormalize_pathkscCs=y||SWn*tk
r8t|�||<}|SYnXdS(N(uKeyErrorunormalize_path(ufilenameu_cacheuresult((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_normalize_cachedos

u_normalize_cachedcCsU|jd�}|j�}|rQdj|�}ttj||tj|�ndS(Nu.(usplitupopujoinusetattrusysumodules(upackageNameupartsunameuparent((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_set_parent_nsvs
u_set_parent_nsccs�t|t�rSxn|j�D]0}|j�}|r|jd�r|VqqWn-x*|D]"}xt|�D]}|VqmWqZWdS(uAYield non-empty/non-comment lines of a ``basestring`` or sequenceu#N(u
isinstanceu
basestringu
splitlinesustripu
startswithuyield_lines(ustrsususs((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuyield_lines~s
u
\s*(#.*)?$u\s*\\\s*(#.*)?$u\s*((\w|[-.])+)u!\s*(<=?|>=?|==|!=)\s*((\w|[-.])+)u\s*,u\s*\[u\s*\]u\w+(\.\w+)*$uL(?P<name>[^-]+)( -(?P<ver>[^-]+) (-py(?P<pyver>[^-]+) (-(?P<plat>.+))? )? )?u(\d+ | [a-z]+ | \.| -)ucupreupreviewufinal-u-urcu@udevccs{xotj|�D]^}t||�}|s|dkr>qn|dd�dkre|jd�Vqd|VqWdVdS(Nu.iu
0123456789iu*u*final(ucomponent_reusplitureplaceuzfill(usupart((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_parse_version_parts�s
u_parse_version_partscCs�g}x�t|j��D]�}|jd�r�|dkrdx'|r`|ddkr`|j�q=Wnx'|r�|ddkr�|j�qgWn|j|�qWt|�S(u�Convert a version string to a chronologically-sortable key

    This is a rough cross between distutils' StrictVersion and LooseVersion;
    if you give it versions that would work with StrictVersion, then it behaves
    the same; otherwise it acts like a slightly-smarter LooseVersion. It is
    *possible* to create pathological version coding schemes that will fool
    this parser, but they should be very rare in practice.

    The returned value will be a tuple of strings.  Numeric portions of the
    version are padded to 8 digits so they will compare numerically, but
    without relying on how numbers compare relative to strings.  Dots are
    dropped, but dashes are retained.  Trailing zeros between alpha segments
    or dashes are suppressed, so that e.g. "2.4.0" is considered the same as
    "2.4". Alphanumeric parts are lower-cased.

    The algorithm assumes that strings like "-" and any alpha string that
    alphabetically follows "final"  represents a "patch level".  So, "2.4-1"
    is assumed to be a branch or patch of "2.4", and therefore "2.4.1" is
    considered newer than "2.4-1", which in turn is newer than "2.4".

    Strings like "a", "b", "c", "alpha", "beta", "candidate" and so on (that
    come before "final" alphabetically) are assumed to be pre-release versions,
    so that the version "2.4" is considered newer than "2.4a1".

    Finally, to handle miscellaneous cases, the strings "pre", "preview", and
    "rc" are treated as if they were "c", i.e. as though they were release
    candidates, and therefore are not as new as a version string that does not
    contain them, and "dev" is replaced with an '@' so that it sorts lower than
    than any other pre-release tag.
    u*u*finaliu*final-u00000000i����i����(u_parse_version_partsuloweru
startswithupopuappendutuple(usupartsupart((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
parse_version�scBs�|EeZdZdZffddd�Zdd�Zdd�Zddddd	�Z	ddd
d�Z
ddd
�Zee�Zddd�Z
ee
�Z
ddd�Zee�ZdS(u
EntryPointu3Object representing an advertised importable objectcCsnt|�std|��n||_||_t|�|_tjddj|��j	|_	||_
dS(NuInvalid module nameux[%s]u,(uMODULEu
ValueErrorunameumodule_nameutupleuattrsuRequirementuparseujoinuextrasudist(uselfunameumodule_nameuattrsuextrasudist((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__init__�s		"uEntryPoint.__init__cCsfd|j|jf}|jr<|ddj|j�7}n|jrb|ddj|j�7}n|S(Nu%s = %su:u.u [%s]u,(unameumodule_nameuattrsujoinuextras(uselfus((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__str__�s		uEntryPoint.__str__cCsdt|�S(NuEntryPoint.parse(%r)(ustr(uself((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__repr__�suEntryPoint.__repr__cCs�|r|j||�nt|jt�t�dg�}xO|jD]D}yt||�}WqDtk
r�td||f��YqDXqDW|S(Nu__name__u%r has no %r attribute(urequireu
__import__umodule_nameuglobalsuattrsugetattruAttributeErroruImportError(uselfurequireuenvu	installeruentryuattr((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuload�s!
uEntryPoint.loadcCs]|jr%|jr%td|��ntttjtj|jj|j�||���dS(Nu&Can't require() without a distribution(	uextrasudistuUnknownExtraulistumapuworking_setuadduresolveurequires(uselfuenvu	installer((u&/tmp/pip-k8wh6o-build/pkg_resources.pyurequire�suEntryPoint.requirecCsy�f}}|jdd�\}}d|krz|jdd�\}}tjd|�}|jrnt�n|j}nd|kr�|jdd�\}}t|j��s�t�n|j�jd�}nWn!tk
r�td|��Yn#X||j�|j�|||�SdS(	uParse a single entry point from string `src`

        Entry point syntax follows the form::

            name = some.module:some.attr [extra1,extra2]

        The entry name and module name are required, but the ``:attrs`` and
        ``[extras]`` parts are optional
        u=iu[ux[u:u.u9EntryPoint must be in 'name=module:attrs [extras]' formatN(	usplituRequirementuparseuspecsu
ValueErroruextrasuMODULEurstripustrip(uclsusrcudistuattrsuextrasunameuvalueureq((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuparse�s&

			
uEntryPoint.parsecCs�t|�std|��ni}xZt|�D]L}|j||�}|j|krptd||j��n|||j<q1W|S(uParse an entry point groupuInvalid group nameuDuplicate entry point(uMODULEu
ValueErroruyield_linesuparseuname(uclsugroupulinesudistuthisulineuep((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuparse_groupsuEntryPoint.parse_groupcCs�t|t�r|j�}nt|�}i}x~|D]v\}}|dkrj|s[q7ntd��n|j�}||kr�td|��n|j|||�||<q7W|S(u!Parse a map of entry point groupsu%Entry points must be listed in groupsuDuplicate group nameN(u
isinstanceudictuitemsusplit_sectionsuNoneu
ValueErrorustripuparse_group(uclsudataudistumapsugroupulines((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu	parse_map)suEntryPoint.parse_mapNT(u__name__u
__module__u__qualname__u__doc__uNoneu__init__u__str__u__repr__uTrueuloadurequireuparseuclassmethoduparse_groupu	parse_map(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
EntryPoint�s	
cCsE|s
dSt|�}|djd�rAt|dd�d�S|S(Nuiumd5=i����i����(u(uurlparseu
startswithu
urlunparse(ulocationuparsed((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_remove_md5_fragment>su_remove_md5_fragmentc	Bs|EeZdZdZdZdAdAdAdAedAedd�ZdAdd�Z	e
e	�Z	edd��Zd	d
�Z
dd�Zd
d�Zdd�Zdd�Zdd�Zdd�Zdd�Zee�Zdd�Zee�Zdd�Zee�Zdd�Zee�Zfdd �Zd!d"�ZdAd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�ZdAd-d.�Ze
e�Zd/d0�Z d1d2�Z!dAd3d4�Z"d5d6�Z#dAd7d8�Z$d9d:�Z%d;d<�Z&d=d>�Z'd?d@�Z(ee(�Z(dAS(BuDistributionu5Wrap an actual or potential sys.path entry w/metadatauPKG-INFOcCsjt|pd�|_|dk	r3t|�|_n||_||_||_||_|p`t	|_
dS(NuUnknown(u	safe_nameuproject_nameuNoneusafe_versionu_versionu
py_versionuplatformulocationu
precedenceuempty_provideru	_provider(uselfulocationumetadatauproject_nameuversionu
py_versionuplatformu
precedence((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__init__Ks				uDistribution.__init__cKs�dgd\}}}}tjj|�\}}	|	j�tkr�t|�}
|
r||
jdddd�\}}}}nt|	j�}n|||d|d|d|d	||�S(
Niunameuverupyveruplatuproject_nameuversionu
py_versionuplatform(uNoneuosupathusplitextuloweru_distributionImpluEGG_NAMEugroup(uclsulocationubasenameumetadataukwuproject_nameuversionu
py_versionuplatformuextumatch((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
from_locationXs!uDistribution.from_locationcCs7t|df�|j|jt|j�|j|jfS(Nuparsed_version(ugetattru
precedenceukeyu_remove_md5_fragmentulocationu
py_versionuplatform(uself((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu<lambda>jsuDistribution.<lambda>cCs
t|j�S(N(uhashuhashcmp(uself((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__hash__ssuDistribution.__hash__cCs|j|jkS(N(uhashcmp(uselfuother((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__lt__tsuDistribution.__lt__cCs|j|jkS(N(uhashcmp(uselfuother((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__le__vsuDistribution.__le__cCs|j|jkS(N(uhashcmp(uselfuother((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__gt__xsuDistribution.__gt__cCs|j|jkS(N(uhashcmp(uselfuother((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__ge__zsuDistribution.__ge__cCs&t||j�sdS|j|jkS(NF(u
isinstanceu	__class__uFalseuhashcmp(uselfuother((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__eq__|suDistribution.__eq__cCs||kS(N((uselfuother((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__ne__�suDistribution.__ne__cCs>y|jSWn,tk
r9|jj�|_}|SYnXdS(N(u_keyuAttributeErroruproject_nameulower(uselfukey((u&/tmp/pip-k8wh6o-build/pkg_resources.pyukey�s

uDistribution.keycCs>y|jSWn,tk
r9t|j�|_}|SYnXdS(N(u_parsed_versionuAttributeErroru
parse_versionuversion(uselfupv((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuparsed_version�s

uDistribution.parsed_versioncCs�y|jSWn�tk
r�xq|j|j�D]G}|j�jd�r.t|jdd�dj��|_|jSq.Wt	d|j|��YnXdS(Nuversion:u:iu(Missing 'Version:' header and/or %s file(
u_versionuAttributeErroru
_get_metadatauPKG_INFOuloweru
startswithusafe_versionusplitustripu
ValueError(uselfuline((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuversion�s
%uDistribution.versioncCs�y|jSWn�tk
r�igd6}|_x�dD]�}x�t|j|��D]�\}}|r�d|kr�|jdd�\}}t|�r�g}q�t|�s�g}q�nt|�p�d}n|j	|g�j
t|��qRWq6W|SYnXdS(Nurequires.txtudepends.txtu:i(urequires.txtudepends.txt(u_Distribution__dep_mapuAttributeErroruNoneusplit_sectionsu
_get_metadatausplituinvalid_markeruevaluate_markeru
safe_extrau
setdefaultuextenduparse_requirements(uselfudmunameuextraureqsumarker((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_dep_map�s 

"	'uDistribution._dep_mapcCs�|j}g}|j|jdf��xT|D]L}y|j|t|��Wq/tk
rztd||f��Yq/Xq/W|S(u@List of Requirements needed for this distro if `extras` are usedu%s has no such extra feature %rN(u_dep_mapuextendugetuNoneu
safe_extrauKeyErroruUnknownExtra(uselfuextrasudmudepsuext((u&/tmp/pip-k8wh6o-build/pkg_resources.pyurequires�s	

uDistribution.requiresccs5|j|�r1x|j|�D]}|VqWndS(N(uhas_metadatauget_metadata_lines(uselfunameuline((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
_get_metadata�suDistribution._get_metadatacCsd|dkrtj}n|j|�|tjkr`t|j�ttt|j	d���ndS(u>Ensure distribution is importable on `path` (default=sys.path)unamespace_packages.txtN(
uNoneusysupathu	insert_onufixup_namespace_packagesulocationulistumapudeclare_namespaceu
_get_metadata(uselfupath((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuactivate�s

uDistribution.activatecCsOdt|j�t|j�|jp'tf}|jrK|d|j7}n|S(u@Return what this distribution's standard .egg filename should beu
%s-%s-py%su-(uto_filenameuproject_nameuversionu
py_versionuPY_MAJORuplatform(uselfufilename((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuegg_name�s	uDistribution.egg_namecCs(|jrd||jfSt|�SdS(Nu%s (%s)(ulocationustr(uself((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__repr__�s	uDistribution.__repr__cCsNyt|dd�}Wntk
r0d}YnX|p:d}d|j|fS(Nuversionu[unknown version]u%s %s(ugetattruNoneu
ValueErroruproject_name(uselfuversion((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__str__�s
uDistribution.__str__cCs.|jd�rt|��nt|j|�S(uADelegate all unrecognized public attributes to .metadata provideru_(u
startswithuAttributeErrorugetattru	_provider(uselfuattr((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__getattr__�suDistribution.__getattr__cKs(|jt|�tjj|�||�S(N(u
from_locationu_normalize_cacheduosupathubasename(uclsufilenameumetadataukw((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
from_filename�suDistribution.from_filenamecCstjd|j|jf�S(u?Return a ``Requirement`` that matches this distribution exactlyu%s==%s(uRequirementuparseuproject_nameuversion(uself((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuas_requirement�suDistribution.as_requirementcCsD|j||�}|dkr:td||ff��n|j�S(u=Return the `name` entry point of `group` or raise ImportErroruEntry point %r not foundN(uget_entry_infouNoneuImportErroruload(uselfugroupunameuep((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuload_entry_point	suDistribution.load_entry_pointcCsdy
|j}Wn4tk
rCtj|jd�|�}|_YnX|dk	r`|j|i�S|S(u=Return the entry point map for `group`, or the full entry mapuentry_points.txtN(u_ep_mapuAttributeErroru
EntryPointu	parse_mapu
_get_metadatauNoneuget(uselfugroupuep_map((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
get_entry_map		s

!uDistribution.get_entry_mapcCs|j|�j|�S(u<Return the EntryPoint object for `group`+`name`, or ``None``(u
get_entry_mapuget(uselfugroupuname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuget_entry_info	suDistribution.get_entry_infoc	CsM|p|j}|sdSt|�}tjj|�}dd�|D�}x�t|�D]w\}}||krsPqW||krW|jtkrW|tjkr�|j	�n|j
||�|j
||�PqWqWW|tjkr�|j	�n|j|�dSxGy|j||d�}Wnt
k
r1PYqX||=||=|}qdS(u@Insert self.location in path before its nearest parent directoryNcSs(g|]}|rt|�p!|�qS((u_normalize_cached(u.0up((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
<listcomp>"	s	u*Distribution.insert_on.<locals>.<listcomp>i(ulocationu_normalize_cacheduosupathudirnameu	enumerateu
precedenceuEGG_DISTusysucheck_version_conflictuinsertuappenduindexu
ValueError(	uselfupathulocunlocubdirunpathupuitemunp((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu	insert_on	s6



	uDistribution.insert_onc
Cs�|jdkrdStj|jd��}t|j�}x�|jd�D]�}|tjksJ||ksJ|tkr}qJn|dkr�qJnt	tj|dd�}|r�t|�j|�sJ|j|j�r�qJntd|||jf�qJWdS(	Nu
setuptoolsunamespace_packages.txtu
top_level.txtu
pkg_resourcesusiteu__file__uIModule %s was already imported from %s, but %s is being added to sys.path(u
pkg_resourcesu
setuptoolsusite(
ukeyudictufromkeysu
_get_metadataunormalize_pathulocationusysumodulesu_namespace_packagesugetattruNoneu
startswithu
issue_warning(uselfunspulocumodnameufn((u&/tmp/pip-k8wh6o-build/pkg_resources.pyucheck_version_conflict@	s"u#Distribution.check_version_conflictcCs<y|jWn*tk
r7tdt|��dSYnXdS(NuUnbuilt egg for FT(uversionu
ValueErroru
issue_warningurepruFalseuTrue(uself((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuhas_versionU	s
	uDistribution.has_versioncKsMx*dD]"}|j|t||d	��qW|jd|j�|j|�S(
u@Copy this distribution, substituting in any changed keyword argsuproject_nameuversionu
py_versionuplatformulocationu
precedenceumetadata(uproject_nameuversionu
py_versionuplatformulocationu
precedenceN(u
setdefaultugetattruNoneu	_provideru	__class__(uselfukwuattr((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuclone]	s
 uDistribution.clonecCsdd�|jD�S(NcSsg|]}|r|�qS(((u.0udep((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
<listcomp>i	s	u'Distribution.extras.<locals>.<listcomp>(u_dep_map(uself((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuextrash	suDistribution.extrasN()u__name__u
__module__u__qualname__u__doc__uPKG_INFOuNoneuPY_MAJORuEGG_DISTu__init__u
from_locationuclassmethodupropertyuhashcmpu__hash__u__lt__u__le__u__gt__u__ge__u__eq__u__ne__ukeyuparsed_versionuversionu_dep_mapurequiresu
_get_metadatauactivateuegg_nameu__repr__u__str__u__getattr__u
from_filenameuas_requirementuload_entry_pointu
get_entry_mapuget_entry_infou	insert_onucheck_version_conflictuhas_versionucloneuextras(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuDistributionGsV			'cBsk|EeZdZdZdZejd�Zedd��Z	edd��Z
dd	�Zd
d�ZdS(
uDistInfoDistributionuGWrap an actual or potential sys.path entry w/metadata, .dist-info styleuMETADATAu([\(,])\s*(\d.*?)\s*([,\)])cCs\y|jSWnJtk
rWddlm}|�j|j|j��|_|jSYnXdS(uParse and cache metadatai(uParserN(u	_pkg_infouAttributeErroruemail.parseruParseruparsestruget_metadatauPKG_INFO(uselfuParser((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_parsed_pkg_infor	s
!u%DistInfoDistribution._parsed_pkg_infocCs:y|jSWn(tk
r5|j�|_|jSYnXdS(N(u_DistInfoDistribution__dep_mapuAttributeErroru_compute_dependencies(uself((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_dep_map|	s

uDistInfoDistribution._dep_mapcCsy|jdd�dg}|dj�}|dj�}tj|jd|�}|jdd�jdd�}||fS(u�Convert 'Foobar (1); baz' to ('Foobar ==1', 'baz')
        Split environment marker, add == prefix to version specifiers as
        necessary, and remove parenthesis.
        u;iuiu\1==\2\3u(u)(usplitustripureusubuEQEQureplace(uselfu
requires_distupartsudistversumark((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_preparse_requirement�	su*DistInfoDistribution._preparse_requirementc
sddlm}igd6}|_g�xc|jjd�pBgD]I}|j|�\}}tt|��}||�|_	�j
|�qCW�fdd�}t|d��}|dj|�xR|jjd�p�gD]8}	t
|	j��}	tt||	��|�||	<q�W|S(u+Recompute this distribution's dependencies.i(ucompileu
Requires-Distc3s6x/�D]'}|jdi|d6�r|VqqWdS(Nuoverrideuextra(u	marker_fn(uextraureq(ureqs(u&/tmp/pip-k8wh6o-build/pkg_resources.pyureqs_for_extra�	s
uBDistInfoDistribution._compute_dependencies.<locals>.reqs_for_extrauProvides-ExtraN(u
_markerlibucompileuNoneu_DistInfoDistribution__dep_mapu_parsed_pkg_infouget_allu_preparse_requirementunextuparse_requirementsu	marker_fnuappendu	frozensetuextendu
safe_extraustripulist(
uselfucompile_markerudmurequdistversumarkuparsedureqs_for_extraucommonuextra((ureqsu&/tmp/pip-k8wh6o-build/pkg_resources.pyu_compute_dependencies�	s$u*DistInfoDistribution._compute_dependenciesN(
u__name__u
__module__u__qualname__u__doc__uPKG_INFOureucompileuEQEQupropertyu_parsed_pkg_infou_dep_mapu_preparse_requirementu_compute_dependencies(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuDistInfoDistributionm	s
uDistInfoDistributionu.eggu	.egg-infou
.dist-infoc
Os|d}t�}y-x&tj|�j|kr:|d7}qWWntk
rPYnXddlm}|d|d||�dS(Nii(uwarnu
stacklevel(uglobalsusysu	_getframeu	f_globalsu
ValueErroruwarningsuwarn(uargsukwuleveluguwarn((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
issue_warning�	s	
u
issue_warningc#stt|����fdd�}x��D]�}t|�}|sUtd|��n|jd�}|j�}g}t||�}|r�|j�}|tt||dd�\}}}n|tt	||dd�\}}}dd	�|D�}t
|||�Vq+Wd
S(
u�Yield ``Requirement`` objects for each specification in `strs`

    `strs` must be an instance of ``basestring``, or a (possibly-nested)
    iterable thereof.
    csLg}x|||�st||�rayt��}d}Wqatk
r]td��YqaXn|||�}|s�td|d|d||d���n|j|j|��|j�}t||�}|r�|j�}q	|||�s	td|d||d���q	q	W|||�}|r?|j�}n|||fS(Niu+\ must not appear on the last nonblank lineu	Expected u inuatuExpected ',' or end-of-list in(uCONTINUEunextu
StopIterationu
ValueErroruappendugroupuenduCOMMA(uITEMu
TERMINATORulineupugroupsu	item_nameuitemsumatch(ulines(u&/tmp/pip-k8wh6o-build/pkg_resources.pyu	scan_list�	s0

*#u%parse_requirements.<locals>.scan_listuMissing distribution speciu'extra' nameiuversion speccSs(g|]\}}|t|�f�qS((usafe_version(u.0uopuval((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
<listcomp>�	s	u&parse_requirements.<locals>.<listcomp>N(i(ii(uiteruyield_linesuDISTROu
ValueErrorugroupuenduOBRACKETuCBRACKETuVERSIONuLINE_ENDuRequirement(ustrsu	scan_listulineumatchuproject_nameupuextrasuspecs((ulinesu&/tmp/pip-k8wh6o-build/pkg_resources.pyuparse_requirements�	s"!
$$cCsAdd�|D�}|j�dd�|D�|ddd�<dS(NcSsg|]}|j|f�qS((uhashcmp(u.0udist((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
<listcomp>
s	u_sort_dists.<locals>.<listcomp>cSsg|]\}}|�qS(((u.0uhcud((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
<listcomp>
s	ii����(usort(udistsutmp((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_sort_dists�	s
u_sort_distscBst|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	e
e	�Z	dS(uRequirementcCs�|t|�|_}||j�|_|_dd�|D�}|j�dd�|D�|_|ttt	|��|_
|_|jtdd�|D��t|j�f|_
t|j
�|_dS(u>DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!cSs2g|](\}}t|�t|||f�qS((u
parse_versionu
state_machine(u.0uopuv((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
<listcomp>

s	u(Requirement.__init__.<locals>.<listcomp>cSs(g|]\}}}}||f�qS(((u.0uparsedutransuopuver((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
<listcomp>
s	cSs(g|]\}}}}||f�qS(((u.0uparsedutransuopuver((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
<listcomp>
s	N(u	safe_nameuunsafe_nameuloweruproject_nameukeyusortuspecsutupleumapu
safe_extrauindexuextrasu	frozensetuhashCmpuhashu_Requirement__hash(uselfuproject_nameuspecsuextrasuindex((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__init__
s
"uRequirement.__init__cCsXdjdd�|jD��}dj|j�}|rDd|}nd|j||fS(Nu,cSsg|]}dj|��qS(u(ujoin(u.0us((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
<listcomp>
s	u'Requirement.__str__.<locals>.<listcomp>u[%s]u%s%s%s(ujoinuspecsuextrasuproject_name(uselfuspecsuextras((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__str__
s

uRequirement.__str__cCst|t�o|j|jkS(N(u
isinstanceuRequirementuhashCmp(uselfuother((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__eq__
suRequirement.__eq__c	Cst|t�r=|j|jkr%dS|jr[|j}q[nt|t�r[t|�}nd}dd�}x�|jD]{\}}}}||||�}|dkr�dS|dkr�dS|dkr�d}qw|dks�|dkrwd}qwqwW|dkrd}n|S(	NcSs||k||kS(N((uaub((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu<lambda>$
su*Requirement.__contains__.<locals>.<lambda>uFuTu+u-FT(
u
isinstanceuDistributionukeyuFalseuindexuparsed_versionu
basestringu
parse_versionuNoneuTrue(	uselfuitemulastucompareuparsedutransuopuveruaction((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__contains__
s,		
	uRequirement.__contains__cCs|jS(N(u_Requirement__hash(uself((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__hash__1
suRequirement.__hash__cCsdt|�S(NuRequirement.parse(%r)(ustr(uself((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu__repr__4
suRequirement.__repr__cCsWtt|��}|rDt|�dkr2|dStd|��ntd|��dS(NiiuExpected only one requirementuNo requirements found(ulistuparse_requirementsulenu
ValueError(usureqs((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuparse7
suRequirement.parseN(u__name__u
__module__u__qualname__u__init__u__str__u__eq__u__contains__u__hash__u__repr__uparseustaticmethod(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuRequirement
su--Tu<uT-Tu<=uF+Fu>uT+Fu>=uT..u==uF++u!=cCs@t|t�s9Gdd�d|t�}|jdd�S|jS(u&Get an mro for a type or classic classcBs|EeZdZdS(u_get_mro.<locals>.clsN(u__name__u
__module__u__qualname__(u
__locals__((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuclsO
suclsiN(u
isinstanceutypeuobjectu__mro__(ucls((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_get_mroL
su_get_mrocCsAx:tt|dt|���D]}||kr||SqWdS(u2Return an adapter factory for `ob` from `registry`u	__class__N(u_get_mrougetattrutype(uregistryuobut((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu
_find_adapterS
s%u
_find_adaptercCs8tjj|�}tjj|�s4tj|�ndS(u1Ensure that the parent directory of `path` existsN(uosupathudirnameuisdirumakedirs(upathudirname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyuensure_directoryZ
sccs�d}g}x�t|�D]|}|jd�r�|jd�rv|sI|rW||fVn|dd�j�}g}q�td|��q|j|�qW||fVdS(urSplit a string or iterable thereof into (section,content) pairs

    Each ``section`` is a stripped version of the section header ("[section]")
    and each ``content`` is a list of stripped lines excluding blank lines and
    comment-only lines.  If there are any such lines before the first section
    header, they're returned in a first ``section`` of ``None``.
    u[u]iuInvalid section headingNi����(uNoneuyield_linesu
startswithuendswithustripu
ValueErroruappend(ususectionucontentuline((u&/tmp/pip-k8wh6o-build/pkg_resources.pyusplit_sections`
s	cOsDddlm}tj}ztt_|||�SWd|t_XdS(Ni(umkstemp(utempfileumkstempuosuopenuos_open(uargsukwumkstempuold_open((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_mkstempy
s		u_mkstempcCs@x9tt�D]+}|jd�s
tt|�||<q
q
WdS(Nu_(udiru_manageru
startswithugetattr(uguname((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu_initialize�
su_initializeuobject(u__requires__cCs
|j�S(N(uactivate(udist((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu<lambda>�
s(�u__doc__usysuosutimeureuimpuzipfileu	zipimportuwarningsustatu	functoolsupkgutiluget_importeruurlparseu
urlunparseuImportErroruurllib.parseu	frozensetu	NameErrorusetsuImmutableSetu
basestringunextu	cStringIOuStringIOuBytesIOustruiouNoneuexecfileuutimeumkdirurenameuunlinkuTrueu
WRITE_SUPPORTuFalseuopenuos_openuos.pathuisdirusplituversion_infouimplementationunameuimportlib._bootstrapu
_bootstrapuimportlib_bootstrapuparseru_bypass_ensure_directoryu_state_varsu_declare_stateu__getstate__u__setstate__u
_sget_dictu
_sset_dictu_sget_objectu_sset_objectu
_sget_noneu
_sset_noneuget_supported_platformu__all__u	ExceptionuResolutionErroruVersionConflictuDistributionNotFounduUnknownExtrau_provider_factoriesuversionuPY_MAJORuEGG_DISTuBINARY_DISTuSOURCE_DISTu
CHECKOUT_DISTuDEVELOP_DISTuregister_loader_typeuget_provideru_macosx_versu_macosx_archuget_build_platformucompileumacosVersionStringudarwinVersionStringuget_platformucompatible_platformsu
run_scripturun_mainuget_distributionuload_entry_pointu
get_entry_mapuget_entry_infouIMetadataProvideruIResourceProvideruobjectu
WorkingSetuEnvironmentuAvailableDistributionsuRuntimeErroruExtractionErroruResourceManageruget_default_cacheu	safe_nameusafe_versionu
safe_extrauto_filenameu
_marker_namesu_marker_valuesu	_platinfou_pyimpunormalize_exceptionuinvalid_markeruevaluate_markeru_markerlib_evaluateuglobalsuNullProvideruEggProvideruDefaultProviderutypeuSourceFileLoaderu
EmptyProvideruempty_providerubuild_zipmanifestuZipProvideruzipimporteruFileMetadatauPathMetadatauEggMetadatauregister_finderufind_distributionsufind_in_zipufind_nothingufind_on_pathuImpImporteru
FileFinderuregister_namespace_handleru
_handle_nsudeclare_namespaceufixup_namespace_packagesufile_ns_handlerunull_ns_handlerunormalize_pathu_normalize_cachedu_set_parent_nsuyield_linesumatchuLINE_ENDuCONTINUEuDISTROuVERSIONuCOMMAuOBRACKETuCBRACKETuMODULEuVERBOSEu
IGNORECASEuEGG_NAMEucomponent_reugetureplaceu_parse_version_partsu
parse_versionu
EntryPointu_remove_md5_fragmentuDistributionuDistInfoDistributionu_distributionImplu
issue_warninguparse_requirementsu_sort_distsuRequirementu
state_machineu_get_mrou
_find_adapteruensure_directoryusplit_sectionsu_mkstempu_manageru_initializeu__main__u__requires__uworking_seturequireuresolveudistuaddupathuentryuentriesu	add_entryuiter_entry_pointsu	subscribeuadd_activation_listenerulistumap(((u&/tmp/pip-k8wh6o-build/pkg_resources.pyu<module>s�




'

									1���)
	






Z	c
	!�

( 

,)n	�'?
><
	


						site-packages/easy_install.py000064400000000176151733463500012340 0ustar00"""Run the EasyInstall command"""

if __name__ == '__main__':
    from setuptools.command.easy_install import main
    main()
site-packages/pip/download.py000064400000054064151733463500012255 0ustar00import cgi
import email.utils
import hashlib
import getpass
import mimetypes
import os
import platform
import re
import shutil
import sys
import tempfile

import pip

from pip.backwardcompat import urllib, urlparse, raw_input
from pip.exceptions import InstallationError, HashMismatch
from pip.util import (splitext, rmtree, format_size, display_path,
                      backup_dir, ask_path_exists, unpack_file,
                      create_download_cache_folder, cache_download)
from pip.vcs import vcs
from pip.log import logger
from pip._vendor import requests, six
from pip._vendor.requests.adapters import BaseAdapter
from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth
from pip._vendor.requests.compat import IncompleteRead
from pip._vendor.requests.exceptions import InvalidURL, ChunkedEncodingError
from pip._vendor.requests.models import Response
from pip._vendor.requests.structures import CaseInsensitiveDict

__all__ = ['get_file_content',
           'is_url', 'url_to_path', 'path_to_url',
           'is_archive_file', 'unpack_vcs_link',
           'unpack_file_url', 'is_vcs_url', 'is_file_url', 'unpack_http_url']


def user_agent():
    """Return a string representing the user agent."""
    _implementation = platform.python_implementation()

    if _implementation == 'CPython':
        _implementation_version = platform.python_version()
    elif _implementation == 'PyPy':
        _implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major,
                                                sys.pypy_version_info.minor,
                                                sys.pypy_version_info.micro)
        if sys.pypy_version_info.releaselevel != 'final':
            _implementation_version = ''.join([
                _implementation_version,
                sys.pypy_version_info.releaselevel,
            ])
    elif _implementation == 'Jython':
        _implementation_version = platform.python_version()  # Complete Guess
    elif _implementation == 'IronPython':
        _implementation_version = platform.python_version()  # Complete Guess
    else:
        _implementation_version = 'Unknown'

    try:
        p_system = platform.system()
        p_release = platform.release()
    except IOError:
        p_system = 'Unknown'
        p_release = 'Unknown'

    return " ".join(['pip/%s' % pip.__version__,
                     '%s/%s' % (_implementation, _implementation_version),
                     '%s/%s' % (p_system, p_release)])


class MultiDomainBasicAuth(AuthBase):

    def __init__(self, prompting=True):
        self.prompting = prompting
        self.passwords = {}

    def __call__(self, req):
        parsed = urlparse.urlparse(req.url)

        # Get the netloc without any embedded credentials
        netloc = parsed.netloc.split("@", 1)[-1]

        # Set the url of the request to the url without any credentials
        req.url = urlparse.urlunparse(parsed[:1] + (netloc,) + parsed[2:])

        # Use any stored credentials that we have for this netloc
        username, password = self.passwords.get(netloc, (None, None))

        # Extract credentials embedded in the url if we have none stored
        if username is None:
            username, password = self.parse_credentials(parsed.netloc)

        if username or password:
            # Store the username and password
            self.passwords[netloc] = (username, password)

            # Send the basic auth with this request
            req = HTTPBasicAuth(username or "", password or "")(req)

        # Attach a hook to handle 401 responses
        req.register_hook("response", self.handle_401)

        return req

    def handle_401(self, resp, **kwargs):
        # We only care about 401 responses, anything else we want to just
        #   pass through the actual response
        if resp.status_code != 401:
            return resp

        # We are not able to prompt the user so simple return the response
        if not self.prompting:
            return resp

        parsed = urlparse.urlparse(resp.url)

        # Prompt the user for a new username and password
        username = raw_input("User for %s: " % parsed.netloc)
        password = getpass.getpass("Password: ")

        # Store the new username and password to use for future requests
        if username or password:
            self.passwords[parsed.netloc] = (username, password)

        # Consume content and release the original connection to allow our new
        #   request to reuse the same one.
        resp.content
        resp.raw.release_conn()

        # Add our new username and password to the request
        req = HTTPBasicAuth(username or "", password or "")(resp.request)

        # Send our new request
        new_resp = resp.connection.send(req, **kwargs)
        new_resp.history.append(resp)

        return new_resp

    def parse_credentials(self, netloc):
        if "@" in netloc:
            userinfo = netloc.rsplit("@", 1)[0]
            if ":" in userinfo:
                return userinfo.split(":", 1)
            return userinfo, None
        return None, None


class LocalFSResponse(object):

    def __init__(self, fileobj):
        self.fileobj = fileobj

    def __getattr__(self, name):
        return getattr(self.fileobj, name)

    def read(self, amt=None, decode_content=None, cache_content=False):
        return self.fileobj.read(amt)

    # Insert Hacks to Make Cookie Jar work w/ Requests
    @property
    def _original_response(self):
        class FakeMessage(object):
            def getheaders(self, header):
                return []

            def get_all(self, header, default):
                return []

        class FakeResponse(object):
            @property
            def msg(self):
                return FakeMessage()

        return FakeResponse()


class LocalFSAdapter(BaseAdapter):

    def send(self, request, stream=None, timeout=None, verify=None, cert=None,
             proxies=None):
        parsed_url = urlparse.urlparse(request.url)

        # We only work for requests with a host of localhost
        if parsed_url.netloc.lower() != "localhost":
            raise InvalidURL("Invalid URL %r: Only localhost is allowed" %
                request.url)

        real_url = urlparse.urlunparse(parsed_url[:1] + ("",) + parsed_url[2:])
        pathname = url_to_path(real_url)

        resp = Response()
        resp.status_code = 200
        resp.url = real_url

        stats = os.stat(pathname)
        modified = email.utils.formatdate(stats.st_mtime, usegmt=True)
        resp.headers = CaseInsensitiveDict({
            "Content-Type": mimetypes.guess_type(pathname)[0] or "text/plain",
            "Content-Length": stats.st_size,
            "Last-Modified": modified,
        })

        resp.raw = LocalFSResponse(open(pathname, "rb"))
        resp.close = resp.raw.close

        return resp

    def close(self):
        pass


class PipSession(requests.Session):

    timeout = None

    def __init__(self, *args, **kwargs):
        super(PipSession, self).__init__(*args, **kwargs)

        # Attach our User Agent to the request
        self.headers["User-Agent"] = user_agent()

        # Attach our Authentication handler to the session
        self.auth = MultiDomainBasicAuth()

        # Enable file:// urls
        self.mount("file://", LocalFSAdapter())

    def request(self, method, url, *args, **kwargs):
        # Make file:// urls not fail due to lack of a hostname
        parsed = urlparse.urlparse(url)
        if parsed.scheme == "file":
            url = urlparse.urlunparse(parsed[:1] + ("localhost",) + parsed[2:])

        # Allow setting a default timeout on a session
        kwargs.setdefault("timeout", self.timeout)

        # Dispatch the actual request
        return super(PipSession, self).request(method, url, *args, **kwargs)


def get_file_content(url, comes_from=None, session=None):
    """Gets the content of a file; it may be a filename, file: URL, or
    http: URL.  Returns (location, content).  Content is unicode."""
    if session is None:
        session = PipSession()

    match = _scheme_re.search(url)
    if match:
        scheme = match.group(1).lower()
        if (scheme == 'file' and comes_from
            and comes_from.startswith('http')):
            raise InstallationError(
                'Requirements file %s references URL %s, which is local'
                % (comes_from, url))
        if scheme == 'file':
            path = url.split(':', 1)[1]
            path = path.replace('\\', '/')
            match = _url_slash_drive_re.match(path)
            if match:
                path = match.group(1) + ':' + path.split('|', 1)[1]
            path = urllib.unquote(path)
            if path.startswith('/'):
                path = '/' + path.lstrip('/')
            url = path
        else:
            ## FIXME: catch some errors
            resp = session.get(url)
            resp.raise_for_status()

            if six.PY3:
                return resp.url, resp.text
            else:
                return resp.url, resp.content
    try:
        f = open(url)
        content = f.read()
    except IOError:
        e = sys.exc_info()[1]
        raise InstallationError('Could not open requirements file: %s' % str(e))
    else:
        f.close()
    return url, content


_scheme_re = re.compile(r'^(http|https|file):', re.I)
_url_slash_drive_re = re.compile(r'/*([a-z])\|', re.I)


def is_url(name):
    """Returns true if the name looks like a URL"""
    if ':' not in name:
        return False
    scheme = name.split(':', 1)[0].lower()
    return scheme in ['http', 'https', 'file', 'ftp'] + vcs.all_schemes


def url_to_path(url):
    """
    Convert a file: URL to a path.
    """
    assert url.startswith('file:'), (
        "You can only turn file: urls into filenames (not %r)" % url)
    path = url[len('file:'):].lstrip('/')
    path = urllib.unquote(path)
    if _url_drive_re.match(path):
        path = path[0] + ':' + path[2:]
    else:
        path = '/' + path
    return path


_drive_re = re.compile('^([a-z]):', re.I)
_url_drive_re = re.compile('^([a-z])[:|]', re.I)


def path_to_url(path):
    """
    Convert a path to a file: URL.  The path will be made absolute and have
    quoted path parts.
    """
    path = os.path.normpath(os.path.abspath(path))
    drive, path = os.path.splitdrive(path)
    filepath = path.split(os.path.sep)
    url = '/'.join([urllib.quote(part) for part in filepath])
    if not drive:
        url = url.lstrip('/')
    return 'file:///' + drive + url


def is_archive_file(name):
    """Return True if `name` is a considered as an archive file."""
    archives = ('.zip', '.tar.gz', '.tar.bz2', '.tgz', '.tar', '.pybundle',
               '.whl')
    ext = splitext(name)[1].lower()
    if ext in archives:
        return True
    return False


def unpack_vcs_link(link, location, only_download=False):
    vcs_backend = _get_used_vcs_backend(link)
    if only_download:
        vcs_backend.export(location)
    else:
        vcs_backend.unpack(location)


def _get_used_vcs_backend(link):
    for backend in vcs.backends:
        if link.scheme in backend.schemes:
            vcs_backend = backend(link.url)
            return vcs_backend


def is_vcs_url(link):
    return bool(_get_used_vcs_backend(link))


def is_file_url(link):
    return link.url.lower().startswith('file:')


def _check_hash(download_hash, link):
    if download_hash.digest_size != hashlib.new(link.hash_name).digest_size:
        logger.fatal("Hash digest size of the package %d (%s) doesn't match the expected hash name %s!"
                    % (download_hash.digest_size, link, link.hash_name))
        raise HashMismatch('Hash name mismatch for package %s' % link)
    if download_hash.hexdigest() != link.hash:
        logger.fatal("Hash of the package %s (%s) doesn't match the expected hash %s!"
                     % (link, download_hash.hexdigest(), link.hash))
        raise HashMismatch('Bad %s hash for package %s' % (link.hash_name, link))


def _get_hash_from_file(target_file, link):
    try:
        download_hash = hashlib.new(link.hash_name)
    except (ValueError, TypeError):
        logger.warn("Unsupported hash name %s for package %s" % (link.hash_name, link))
        return None

    fp = open(target_file, 'rb')
    while True:
        chunk = fp.read(4096)
        if not chunk:
            break
        download_hash.update(chunk)
    fp.close()
    return download_hash


def _download_url(resp, link, temp_location):
    fp = open(temp_location, 'wb')
    download_hash = None
    if link.hash and link.hash_name:
        try:
            download_hash = hashlib.new(link.hash_name)
        except ValueError:
            logger.warn("Unsupported hash name %s for package %s" % (link.hash_name, link))
    try:
        total_length = int(resp.headers['content-length'])
    except (ValueError, KeyError, TypeError):
        total_length = 0
    downloaded = 0
    show_progress = total_length > 40 * 1000 or not total_length
    show_url = link.show_url
    try:
        if show_progress:
            ## FIXME: the URL can get really long in this message:
            if total_length:
                logger.start_progress('Downloading %s (%s): ' % (show_url, format_size(total_length)))
            else:
                logger.start_progress('Downloading %s (unknown size): ' % show_url)
        else:
            logger.notify('Downloading %s' % show_url)
        logger.info('Downloading from URL %s' % link)

        def resp_read(chunk_size):
            try:
                # Special case for urllib3.
                try:
                    for chunk in resp.raw.stream(
                            chunk_size, decode_content=False):
                        yield chunk
                except IncompleteRead as e:
                    raise ChunkedEncodingError(e)
            except AttributeError:
                # Standard file-like object.
                while True:
                    chunk = resp.raw.read(chunk_size)
                    if not chunk:
                        break
                    yield chunk

        for chunk in resp_read(4096):
            downloaded += len(chunk)
            if show_progress:
                if not total_length:
                    logger.show_progress('%s' % format_size(downloaded))
                else:
                    logger.show_progress('%3i%%  %s' % (100 * downloaded / total_length, format_size(downloaded)))
            if download_hash is not None:
                download_hash.update(chunk)
            fp.write(chunk)
        fp.close()
    finally:
        if show_progress:
            logger.end_progress('%s downloaded' % format_size(downloaded))
    return download_hash


def _copy_file(filename, location, content_type, link):
    copy = True
    download_location = os.path.join(location, link.filename)
    if os.path.exists(download_location):
        response = ask_path_exists(
            'The file %s exists. (i)gnore, (w)ipe, (b)ackup ' %
            display_path(download_location), ('i', 'w', 'b'))
        if response == 'i':
            copy = False
        elif response == 'w':
            logger.warn('Deleting %s' % display_path(download_location))
            os.remove(download_location)
        elif response == 'b':
            dest_file = backup_dir(download_location)
            logger.warn('Backing up %s to %s'
                        % (display_path(download_location), display_path(dest_file)))
            shutil.move(download_location, dest_file)
    if copy:
        shutil.copy(filename, download_location)
        logger.notify('Saved %s' % display_path(download_location))


def unpack_http_url(link, location, download_cache, download_dir=None,
                    session=None):
    if session is None:
        session = PipSession()

    temp_dir = tempfile.mkdtemp('-unpack', 'pip-')
    temp_location = None
    target_url = link.url.split('#', 1)[0]
    already_cached = False
    cache_file = None
    cache_content_type_file = None
    download_hash = None

    # If a download cache is specified, is the file cached there?
    if download_cache:
        cache_file = os.path.join(download_cache,
                                   urllib.quote(target_url, ''))
        cache_content_type_file = cache_file + '.content-type'
        already_cached = (
            os.path.exists(cache_file) and
            os.path.exists(cache_content_type_file)
            )
        if not os.path.isdir(download_cache):
            create_download_cache_folder(download_cache)

    # If a download dir is specified, is the file already downloaded there?
    already_downloaded = None
    if download_dir:
        already_downloaded = os.path.join(download_dir, link.filename)
        if not os.path.exists(already_downloaded):
            already_downloaded = None

    # If already downloaded, does it's hash match?
    if already_downloaded:
        temp_location = already_downloaded
        content_type = mimetypes.guess_type(already_downloaded)[0]
        logger.notify('File was already downloaded %s' % already_downloaded)
        if link.hash:
            download_hash = _get_hash_from_file(temp_location, link)
            try:
                _check_hash(download_hash, link)
            except HashMismatch:
                logger.warn(
                    'Previously-downloaded file %s has bad hash, '
                    're-downloading.' % temp_location
                    )
                temp_location = None
                os.unlink(already_downloaded)
                already_downloaded = None

    # If not a valid download, let's confirm the cached file is valid
    if already_cached and not temp_location:
        with open(cache_content_type_file) as fp:
            content_type = fp.read().strip()
        temp_location = cache_file
        logger.notify('Using download cache from %s' % cache_file)
        if link.hash and link.hash_name:
            download_hash = _get_hash_from_file(cache_file, link)
            try:
                _check_hash(download_hash, link)
            except HashMismatch:
                logger.warn(
                    'Cached file %s has bad hash, '
                    're-downloading.' % temp_location
                    )
                temp_location = None
                os.unlink(cache_file)
                os.unlink(cache_content_type_file)
                already_cached = False

    # We don't have either a cached or a downloaded copy
    # let's download to a tmp dir
    if not temp_location:
        try:
            resp = session.get(target_url, stream=True)
            resp.raise_for_status()
        except requests.HTTPError as exc:
            logger.fatal("HTTP error %s while getting %s" %
                         (exc.response.status_code, link))
            raise

        content_type = resp.headers.get('content-type', '')
        filename = link.filename  # fallback
        # Have a look at the Content-Disposition header for a better guess
        content_disposition = resp.headers.get('content-disposition')
        if content_disposition:
            type, params = cgi.parse_header(content_disposition)
            # We use ``or`` here because we don't want to use an "empty" value
            # from the filename param.
            filename = params.get('filename') or filename
        ext = splitext(filename)[1]
        if not ext:
            ext = mimetypes.guess_extension(content_type)
            if ext:
                filename += ext
        if not ext and link.url != resp.url:
            ext = os.path.splitext(resp.url)[1]
            if ext:
                filename += ext
        temp_location = os.path.join(temp_dir, filename)
        download_hash = _download_url(resp, link, temp_location)
        if link.hash and link.hash_name:
            _check_hash(download_hash, link)

    # a download dir is specified; let's copy the archive there
    if download_dir and not already_downloaded:
        _copy_file(temp_location, download_dir, content_type, link)

    # unpack the archive to the build dir location. even when only downloading
    # archives, they have to be unpacked to parse dependencies
    unpack_file(temp_location, location, content_type, link)

    # if using a download cache, cache it, if needed
    if cache_file and not already_cached:
        cache_download(cache_file, temp_location, content_type)

    if not (already_cached or already_downloaded):
        os.unlink(temp_location)

    os.rmdir(temp_dir)


def unpack_file_url(link, location, download_dir=None):

    link_path = url_to_path(link.url_without_fragment)
    already_downloaded = False

    # If it's a url to a local directory
    if os.path.isdir(link_path):
        if os.path.isdir(location):
            rmtree(location)
        shutil.copytree(link_path, location, symlinks=True)
        return

    # if link has a hash, let's confirm it matches
    if link.hash:
        link_path_hash = _get_hash_from_file(link_path, link)
        _check_hash(link_path_hash, link)

    # If a download dir is specified, is the file already there and valid?
    if download_dir:
        download_path = os.path.join(download_dir, link.filename)
        if os.path.exists(download_path):
            content_type = mimetypes.guess_type(download_path)[0]
            logger.notify('File was already downloaded %s' % download_path)
            if link.hash:
                download_hash = _get_hash_from_file(download_path, link)
                try:
                    _check_hash(download_hash, link)
                    already_downloaded = True
                except HashMismatch:
                    logger.warn(
                        'Previously-downloaded file %s has bad hash, '
                        're-downloading.' % link_path
                        )
                    os.unlink(download_path)
            else:
                already_downloaded = True

    if already_downloaded:
        from_path = download_path
    else:
        from_path = link_path

    content_type = mimetypes.guess_type(from_path)[0]

    # unpack the archive to the build dir location. even when only downloading
    # archives, they have to be unpacked to parse dependencies
    unpack_file(from_path, location, content_type, link)

    # a download dir is specified and not already downloaded
    if download_dir and not already_downloaded:
        _copy_file(from_path, download_dir, content_type, link)
site-packages/pip/index.py000064400000116723151733463500011556 0ustar00"""Routines related to PyPI, indexes"""

import sys
import os
import re
import mimetypes
import posixpath

from pip.log import logger
from pip.util import Inf, normalize_name, splitext, is_prerelease
from pip.exceptions import (DistributionNotFound, BestVersionAlreadyInstalled,
                            InstallationError, InvalidWheelFilename, UnsupportedWheel)
from pip.backwardcompat import urlparse, url2pathname
from pip.download import PipSession, url_to_path, path_to_url
from pip.wheel import Wheel, wheel_ext
from pip.pep425tags import supported_tags, supported_tags_noarch, get_platform
from pip._vendor import html5lib, requests, pkg_resources
from pip._vendor.requests.exceptions import SSLError


__all__ = ['PackageFinder']


DEFAULT_MIRROR_HOSTNAME = "last.pypi.python.org"

INSECURE_SCHEMES = {
    "http": ["https"],
}


class PackageFinder(object):
    """This finds packages.

    This is meant to match easy_install's technique for looking for
    packages, by reading pages and looking for appropriate links
    """

    def __init__(self, find_links, index_urls,
            use_wheel=True, allow_external=[], allow_unverified=[],
            allow_all_external=False, allow_all_prereleases=False,
            process_dependency_links=False, session=None):
        self.find_links = find_links
        self.index_urls = index_urls
        self.dependency_links = []
        self.cache = PageCache()
        # These are boring links that have already been logged somehow:
        self.logged_links = set()

        self.use_wheel = use_wheel

        # Do we allow (safe and verifiable) externally hosted files?
        self.allow_external = set(normalize_name(n) for n in allow_external)

        # Which names are allowed to install insecure and unverifiable files?
        self.allow_unverified = set(
            normalize_name(n) for n in allow_unverified
        )

        # Anything that is allowed unverified is also allowed external
        self.allow_external |= self.allow_unverified

        # Do we allow all (safe and verifiable) externally hosted files?
        self.allow_all_external = allow_all_external

        # Stores if we ignored any external links so that we can instruct
        #   end users how to install them if no distributions are available
        self.need_warn_external = False

        # Stores if we ignored any unsafe links so that we can instruct
        #   end users how to install them if no distributions are available
        self.need_warn_unverified = False

        # Do we want to allow _all_ pre-releases?
        self.allow_all_prereleases = allow_all_prereleases

        # Do we process dependency links?
        self.process_dependency_links = process_dependency_links
        self._have_warned_dependency_links = False

        # The Session we'll use to make requests
        self.session = session or PipSession()

    def add_dependency_links(self, links):
        ## FIXME: this shouldn't be global list this, it should only
        ## apply to requirements of the package that specifies the
        ## dependency_links value
        ## FIXME: also, we should track comes_from (i.e., use Link)
        if self.process_dependency_links:
            if not self._have_warned_dependency_links:
                logger.deprecated(
                    "1.6",
                    "Dependency Links processing has been deprecated with an "
                    "accelerated time schedule and will be removed in pip 1.6",
                )
                self._have_warned_dependency_links = True
            self.dependency_links.extend(links)

    def _sort_locations(self, locations):
        """
        Sort locations into "files" (archives) and "urls", and return
        a pair of lists (files,urls)
        """
        files = []
        urls = []

        # puts the url for the given file path into the appropriate list
        def sort_path(path):
            url = path_to_url(path)
            if mimetypes.guess_type(url, strict=False)[0] == 'text/html':
                urls.append(url)
            else:
                files.append(url)

        for url in locations:

            is_local_path = os.path.exists(url)
            is_file_url = url.startswith('file:')
            is_find_link = url in self.find_links

            if is_local_path or is_file_url:
                if is_local_path:
                    path = url
                else:
                    path = url_to_path(url)
                if is_find_link and os.path.isdir(path):
                    path = os.path.realpath(path)
                    for item in os.listdir(path):
                        sort_path(os.path.join(path, item))
                elif is_file_url and os.path.isdir(path):
                    urls.append(url)
                elif os.path.isfile(path):
                    sort_path(path)
            else:
                urls.append(url)

        return files, urls

    def _link_sort_key(self, link_tuple):
        """
        Function used to generate link sort key for link tuples.
        The greater the return value, the more preferred it is.
        If not finding wheels, then sorted by version only.
        If finding wheels, then the sort order is by version, then:
          1. existing installs
          2. wheels ordered via Wheel.support_index_min()
          3. source archives
        Note: it was considered to embed this logic into the Link
              comparison operators, but then different sdist links
              with the same version, would have to be considered equal
        """
        parsed_version, link, _ = link_tuple
        if self.use_wheel:
            support_num = len(supported_tags)
            if link == INSTALLED_VERSION:
                pri = 1
            elif link.ext == wheel_ext:
                wheel = Wheel(link.filename) # can raise InvalidWheelFilename
                if not wheel.supported():
                    raise UnsupportedWheel("%s is not a supported wheel for this platform. It can't be sorted." % wheel.filename)
                pri = -(wheel.support_index_min())
            else: # sdist
                pri = -(support_num)
            return (parsed_version, pri)
        else:
            return parsed_version

    def _sort_versions(self, applicable_versions):
        """
        Bring the latest version (and wheels) to the front, but maintain the existing ordering as secondary.
        See the docstring for `_link_sort_key` for details.
        This function is isolated for easier unit testing.
        """
        return sorted(applicable_versions, key=self._link_sort_key, reverse=True)

    def find_requirement(self, req, upgrade):

        def mkurl_pypi_url(url):
            loc = posixpath.join(url, url_name)
            # For maximum compatibility with easy_install, ensure the path
            # ends in a trailing slash.  Although this isn't in the spec
            # (and PyPI can handle it without the slash) some other index
            # implementations might break if they relied on easy_install's behavior.
            if not loc.endswith('/'):
                loc = loc + '/'
            return loc

        url_name = req.url_name
        # Only check main index if index URL is given:
        main_index_url = None
        if self.index_urls:
            # Check that we have the url_name correctly spelled:
            main_index_url = Link(mkurl_pypi_url(self.index_urls[0]), trusted=True)
            # This will also cache the page, so it's okay that we get it again later:
            page = self._get_page(main_index_url, req)
            if page is None:
                url_name = self._find_url_name(Link(self.index_urls[0], trusted=True), url_name, req) or req.url_name

        if url_name is not None:
            locations = [
                mkurl_pypi_url(url)
                for url in self.index_urls] + self.find_links
        else:
            locations = list(self.find_links)
        for version in req.absolute_versions:
            if url_name is not None and main_index_url is not None:
                locations = [
                    posixpath.join(main_index_url.url, version)] + locations

        file_locations, url_locations = self._sort_locations(locations)
        _flocations, _ulocations = self._sort_locations(self.dependency_links)
        file_locations.extend(_flocations)

        # We trust every url that the user has given us whether it was given
        #   via --index-url or --find-links
        locations = [Link(url, trusted=True) for url in url_locations]

        # We explicitly do not trust links that came from dependency_links
        locations.extend([Link(url) for url in _ulocations])

        logger.debug('URLs to search for versions for %s:' % req)
        for location in locations:
            logger.debug('* %s' % location)

            # Determine if this url used a secure transport mechanism
            parsed = urlparse.urlparse(str(location))
            if parsed.scheme in INSECURE_SCHEMES:
                secure_schemes = INSECURE_SCHEMES[parsed.scheme]

                if len(secure_schemes) == 1:
                    ctx = (location, parsed.scheme, secure_schemes[0],
                           parsed.netloc)
                    logger.warn("%s uses an insecure transport scheme (%s). "
                                "Consider using %s if %s has it available" %
                                ctx)
                elif len(secure_schemes) > 1:
                    ctx = (location, parsed.scheme, ", ".join(secure_schemes),
                                                                parsed.netloc)
                    logger.warn("%s uses an insecure transport scheme (%s). "
                                "Consider using one of %s if %s has any of "
                                "them available" % ctx)
                else:
                    ctx = (location, parsed.scheme)
                    logger.warn("%s uses an insecure transport scheme (%s)." %
                                ctx)

        found_versions = []
        found_versions.extend(
            self._package_versions(
                # We trust every directly linked archive in find_links
                [Link(url, '-f', trusted=True) for url in self.find_links], req.name.lower()))
        page_versions = []
        for page in self._get_pages(locations, req):
            logger.debug('Analyzing links from page %s' % page.url)
            logger.indent += 2
            try:
                page_versions.extend(self._package_versions(page.links, req.name.lower()))
            finally:
                logger.indent -= 2
        dependency_versions = list(self._package_versions(
            [Link(url) for url in self.dependency_links], req.name.lower()))
        if dependency_versions:
            logger.info('dependency_links found: %s' % ', '.join([link.url for parsed, link, version in dependency_versions]))
        file_versions = list(self._package_versions(
                [Link(url) for url in file_locations], req.name.lower()))
        if not found_versions and not page_versions and not dependency_versions and not file_versions:
            logger.fatal('Could not find any downloads that satisfy the requirement %s' % req)

            if self.need_warn_external:
                logger.warn("Some externally hosted files were ignored (use "
                            "--allow-external %s to allow)." % req.name)

            if self.need_warn_unverified:
                logger.warn("Some insecure and unverifiable files were ignored"
                            " (use --allow-unverified %s to allow)." %
                            req.name)

            raise DistributionNotFound('No distributions at all found for %s' % req)
        installed_version = []
        if req.satisfied_by is not None:
            installed_version = [(req.satisfied_by.parsed_version, INSTALLED_VERSION, req.satisfied_by.version)]
        if file_versions:
            file_versions.sort(reverse=True)
            logger.info('Local files found: %s' % ', '.join([url_to_path(link.url) for parsed, link, version in file_versions]))
        #this is an intentional priority ordering
        all_versions = installed_version + file_versions + found_versions + page_versions + dependency_versions
        applicable_versions = []
        for (parsed_version, link, version) in all_versions:
            if version not in req.req:
                logger.info("Ignoring link %s, version %s doesn't match %s"
                            % (link, version, ','.join([''.join(s) for s in req.req.specs])))
                continue
            elif is_prerelease(version) and not (self.allow_all_prereleases or req.prereleases):
                # If this version isn't the already installed one, then
                #   ignore it if it's a pre-release.
                if link is not INSTALLED_VERSION:
                    logger.info("Ignoring link %s, version %s is a pre-release (use --pre to allow)." % (link, version))
                    continue
            applicable_versions.append((parsed_version, link, version))
        applicable_versions = self._sort_versions(applicable_versions)
        existing_applicable = bool([link for parsed_version, link, version in applicable_versions if link is INSTALLED_VERSION])
        if not upgrade and existing_applicable:
            if applicable_versions[0][1] is INSTALLED_VERSION:
                logger.info('Existing installed version (%s) is most up-to-date and satisfies requirement'
                            % req.satisfied_by.version)
            else:
                logger.info('Existing installed version (%s) satisfies requirement (most up-to-date version is %s)'
                            % (req.satisfied_by.version, applicable_versions[0][2]))
            return None
        if not applicable_versions:
            logger.fatal('Could not find a version that satisfies the requirement %s (from versions: %s)'
                         % (req, ', '.join([version for parsed_version, link, version in all_versions])))

            if self.need_warn_external:
                logger.warn("Some externally hosted files were ignored (use "
                            "--allow-external to allow).")

            if self.need_warn_unverified:
                logger.warn("Some insecure and unverifiable files were ignored"
                            " (use --allow-unverified %s to allow)." %
                            req.name)

            raise DistributionNotFound('No distributions matching the version for %s' % req)
        if applicable_versions[0][1] is INSTALLED_VERSION:
            # We have an existing version, and its the best version
            logger.info('Installed version (%s) is most up-to-date (past versions: %s)'
                        % (req.satisfied_by.version, ', '.join([version for parsed_version, link, version in applicable_versions[1:]]) or 'none'))
            raise BestVersionAlreadyInstalled
        if len(applicable_versions) > 1:
            logger.info('Using version %s (newest of versions: %s)' %
                        (applicable_versions[0][2], ', '.join([version for parsed_version, link, version in applicable_versions])))

        selected_version = applicable_versions[0][1]

        if (selected_version.internal is not None
                and not selected_version.internal):
            logger.warn("%s an externally hosted file and may be "
                        "unreliable" % req.name)

        if (selected_version.verifiable is not None
                and not selected_version.verifiable):
            logger.warn("%s is potentially insecure and "
                        "unverifiable." % req.name)

        if selected_version._deprecated_regex:
            logger.deprecated(
                "1.7",
                "%s discovered using a deprecated method of parsing, "
                "in the future it will no longer be discovered" % req.name
            )

        return selected_version


    def _find_url_name(self, index_url, url_name, req):
        """Finds the true URL name of a package, when the given name isn't quite correct.
        This is usually used to implement case-insensitivity."""
        if not index_url.url.endswith('/'):
            # Vaguely part of the PyPI API... weird but true.
            ## FIXME: bad to modify this?
            index_url.url += '/'
        page = self._get_page(index_url, req)
        if page is None:
            logger.fatal('Cannot fetch index base URL %s' % index_url)
            return
        norm_name = normalize_name(req.url_name)
        for link in page.links:
            base = posixpath.basename(link.path.rstrip('/'))
            if norm_name == normalize_name(base):
                logger.notify('Real name of requirement %s is %s' % (url_name, base))
                return base
        return None

    def _get_pages(self, locations, req):
        """
        Yields (page, page_url) from the given locations, skipping
        locations that have errors, and adding download/homepage links
        """
        all_locations = list(locations)
        seen = set()

        while all_locations:
            location = all_locations.pop(0)
            if location in seen:
                continue
            seen.add(location)

            page = self._get_page(location, req)
            if page is None:
                continue

            yield page

            for link in page.rel_links():
                normalized = normalize_name(req.name).lower()

                if (not normalized in self.allow_external
                        and not self.allow_all_external):
                    self.need_warn_external = True
                    logger.debug("Not searching %s for files because external "
                                 "urls are disallowed." % link)
                    continue

                if (link.trusted is not None
                        and not link.trusted
                        and not normalized in self.allow_unverified):
                    logger.debug("Not searching %s for urls, it is an "
                                "untrusted link and cannot produce safe or "
                                "verifiable files." % link)
                    self.need_warn_unverified = True
                    continue

                all_locations.append(link)

    _egg_fragment_re = re.compile(r'#egg=([^&]*)')
    _egg_info_re = re.compile(r'([a-z0-9_.]+)-([a-z0-9_.-]+)', re.I)
    _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$')

    def _sort_links(self, links):
        "Returns elements of links in order, non-egg links first, egg links second, while eliminating duplicates"
        eggs, no_eggs = [], []
        seen = set()
        for link in links:
            if link not in seen:
                seen.add(link)
                if link.egg_fragment:
                    eggs.append(link)
                else:
                    no_eggs.append(link)
        return no_eggs + eggs

    def _package_versions(self, links, search_name):
        for link in self._sort_links(links):
            for v in self._link_package_versions(link, search_name):
                yield v

    def _known_extensions(self):
        extensions = ('.tar.gz', '.tar.bz2', '.tar', '.tgz', '.zip')
        if self.use_wheel:
            return extensions + (wheel_ext,)
        return extensions

    def _link_package_versions(self, link, search_name):
        """
        Return an iterable of triples (pkg_resources_version_key,
        link, python_version) that can be extracted from the given
        link.

        Meant to be overridden by subclasses, not called by clients.
        """
        platform = get_platform()

        version = None
        if link.egg_fragment:
            egg_info = link.egg_fragment
        else:
            egg_info, ext = link.splitext()
            if not ext:
                if link not in self.logged_links:
                    logger.debug('Skipping link %s; not a file' % link)
                    self.logged_links.add(link)
                return []
            if egg_info.endswith('.tar'):
                # Special double-extension case:
                egg_info = egg_info[:-4]
                ext = '.tar' + ext
            if ext not in self._known_extensions():
                if link not in self.logged_links:
                    logger.debug('Skipping link %s; unknown archive format: %s' % (link, ext))
                    self.logged_links.add(link)
                return []
            if "macosx10" in link.path and ext == '.zip':
                if link not in self.logged_links:
                    logger.debug('Skipping link %s; macosx10 one' % (link))
                    self.logged_links.add(link)
                return []
            if ext == wheel_ext:
                try:
                    wheel = Wheel(link.filename)
                except InvalidWheelFilename:
                    logger.debug('Skipping %s because the wheel filename is invalid' % link)
                    return []
                if wheel.name.lower() != search_name.lower():
                    logger.debug('Skipping link %s; wrong project name (not %s)' % (link, search_name))
                    return []
                if not wheel.supported():
                    logger.debug('Skipping %s because it is not compatible with this Python' % link)
                    return []
                # This is a dirty hack to prevent installing Binary Wheels from
                # PyPI unless it is a Windows or Mac Binary Wheel. This is
                # paired with a change to PyPI disabling uploads for the
                # same. Once we have a mechanism for enabling support for binary
                # wheels on linux that deals with the inherent problems of
                # binary distribution this can be removed.
                comes_from = getattr(link, "comes_from", None)
                if ((
                        not platform.startswith('win')
                        and not platform.startswith('macosx')
                        )
                    and comes_from is not None
                    and urlparse.urlparse(comes_from.url).netloc.endswith(
                                                        "pypi.python.org")):
                    if not wheel.supported(tags=supported_tags_noarch):
                        logger.debug(
                            "Skipping %s because it is a pypi-hosted binary "
                            "Wheel on an unsupported platform" % link
                        )
                        return []
                version = wheel.version

        if not version:
            version = self._egg_info_matches(egg_info, search_name, link)
        if version is None:
            logger.debug('Skipping link %s; wrong project name (not %s)' % (link, search_name))
            return []

        if (link.internal is not None
                and not link.internal
                and not normalize_name(search_name).lower() in self.allow_external
                and not self.allow_all_external):
            # We have a link that we are sure is external, so we should skip
            #   it unless we are allowing externals
            logger.debug("Skipping %s because it is externally hosted." % link)
            self.need_warn_external = True
            return []

        if (link.verifiable is not None
                and not link.verifiable
                and not (normalize_name(search_name).lower()
                    in self.allow_unverified)):
            # We have a link that we are sure we cannot verify it's integrity,
            #   so we should skip it unless we are allowing unsafe installs
            #   for this requirement.
            logger.debug("Skipping %s because it is an insecure and "
                         "unverifiable file." % link)
            self.need_warn_unverified = True
            return []

        match = self._py_version_re.search(version)
        if match:
            version = version[:match.start()]
            py_version = match.group(1)
            if py_version != sys.version[:3]:
                logger.debug('Skipping %s because Python version is incorrect' % link)
                return []
        logger.debug('Found link %s, version: %s' % (link, version))
        return [(pkg_resources.parse_version(version),
               link,
               version)]

    def _egg_info_matches(self, egg_info, search_name, link):
        match = self._egg_info_re.search(egg_info)
        if not match:
            logger.debug('Could not parse version from link: %s' % link)
            return None
        name = match.group(0).lower()
        # To match the "safe" name that pkg_resources creates:
        name = name.replace('_', '-')
        # project name and version must be separated by a dash
        look_for = search_name.lower() + "-"
        if name.startswith(look_for):
            return match.group(0)[len(look_for):]
        else:
            return None

    def _get_page(self, link, req):
        return HTMLPage.get_page(link, req,
            cache=self.cache,
            session=self.session,
        )


class PageCache(object):
    """Cache of HTML pages"""

    failure_limit = 3

    def __init__(self):
        self._failures = {}
        self._pages = {}
        self._archives = {}

    def too_many_failures(self, url):
        return self._failures.get(url, 0) >= self.failure_limit

    def get_page(self, url):
        return self._pages.get(url)

    def is_archive(self, url):
        return self._archives.get(url, False)

    def set_is_archive(self, url, value=True):
        self._archives[url] = value

    def add_page_failure(self, url, level):
        self._failures[url] = self._failures.get(url, 0)+level

    def add_page(self, urls, page):
        for url in urls:
            self._pages[url] = page


class HTMLPage(object):
    """Represents one page, along with its URL"""

    ## FIXME: these regexes are horrible hacks:
    _homepage_re = re.compile(r'<th>\s*home\s*page', re.I)
    _download_re = re.compile(r'<th>\s*download\s+url', re.I)
    _href_re = re.compile('href=(?:"([^"]*)"|\'([^\']*)\'|([^>\\s\\n]*))', re.I|re.S)

    def __init__(self, content, url, headers=None, trusted=None):
        self.content = content
        self.parsed = html5lib.parse(self.content, namespaceHTMLElements=False)
        self.url = url
        self.headers = headers
        self.trusted = trusted

    def __str__(self):
        return self.url

    @classmethod
    def get_page(cls, link, req, cache=None, skip_archives=True, session=None):
        if session is None:
            session = PipSession()

        url = link.url
        url = url.split('#', 1)[0]
        if cache.too_many_failures(url):
            return None

        # Check for VCS schemes that do not support lookup as web pages.
        from pip.vcs import VcsSupport
        for scheme in VcsSupport.schemes:
            if url.lower().startswith(scheme) and url[len(scheme)] in '+:':
                logger.debug('Cannot look at %(scheme)s URL %(link)s' % locals())
                return None

        if cache is not None:
            inst = cache.get_page(url)
            if inst is not None:
                return inst
        try:
            if skip_archives:
                if cache is not None:
                    if cache.is_archive(url):
                        return None
                filename = link.filename
                for bad_ext in ['.tar', '.tar.gz', '.tar.bz2', '.tgz', '.zip']:
                    if filename.endswith(bad_ext):
                        content_type = cls._get_content_type(url,
                            session=session,
                        )
                        if content_type.lower().startswith('text/html'):
                            break
                        else:
                            logger.debug('Skipping page %s because of Content-Type: %s' % (link, content_type))
                            if cache is not None:
                                cache.set_is_archive(url)
                            return None
            logger.debug('Getting page %s' % url)

            # Tack index.html onto file:// URLs that point to directories
            (scheme, netloc, path, params, query, fragment) = urlparse.urlparse(url)
            if scheme == 'file' and os.path.isdir(url2pathname(path)):
                # add trailing slash if not present so urljoin doesn't trim final segment
                if not url.endswith('/'):
                    url += '/'
                url = urlparse.urljoin(url, 'index.html')
                logger.debug(' file: URL is directory, getting %s' % url)

            resp = session.get(url, headers={"Accept": "text/html"})
            resp.raise_for_status()

            # The check for archives above only works if the url ends with
            #   something that looks like an archive. However that is not a
            #   requirement. For instance http://sourceforge.net/projects/docutils/files/docutils/0.8.1/docutils-0.8.1.tar.gz/download
            #   redirects to http://superb-dca3.dl.sourceforge.net/project/docutils/docutils/0.8.1/docutils-0.8.1.tar.gz
            #   Unless we issue a HEAD request on every url we cannot know
            #   ahead of time for sure if something is HTML or not. However we
            #   can check after we've downloaded it.
            content_type = resp.headers.get('Content-Type', 'unknown')
            if not content_type.lower().startswith("text/html"):
                logger.debug('Skipping page %s because of Content-Type: %s' %
                                            (link, content_type))
                if cache is not None:
                    cache.set_is_archive(url)
                return None

            inst = cls(resp.text, resp.url, resp.headers, trusted=link.trusted)
        except requests.HTTPError as exc:
            level = 2 if exc.response.status_code == 404 else 1
            cls._handle_fail(req, link, exc, url, cache=cache, level=level)
        except requests.ConnectionError as exc:
            cls._handle_fail(
                req, link, "connection error: %s" % exc, url,
                cache=cache,
            )
        except requests.Timeout:
            cls._handle_fail(req, link, "timed out", url, cache=cache)
        except SSLError as exc:
            reason = ("There was a problem confirming the ssl certificate: "
                      "%s" % exc)
            cls._handle_fail(req, link, reason, url,
                cache=cache,
                level=2,
                meth=logger.notify,
            )
        else:
            if cache is not None:
                cache.add_page([url, resp.url], inst)
            return inst

    @staticmethod
    def _handle_fail(req, link, reason, url, cache=None, level=1, meth=None):
        if meth is None:
            meth = logger.info

        meth("Could not fetch URL %s: %s", link, reason)
        meth("Will skip URL %s when looking for download links for %s" %
             (link.url, req))

        if cache is not None:
            cache.add_page_failure(url, level)

    @staticmethod
    def _get_content_type(url, session=None):
        """Get the Content-Type of the given url, using a HEAD request"""
        if session is None:
            session = PipSession()

        scheme, netloc, path, query, fragment = urlparse.urlsplit(url)
        if not scheme in ('http', 'https', 'ftp', 'ftps'):
            ## FIXME: some warning or something?
            ## assertion error?
            return ''

        resp = session.head(url, allow_redirects=True)
        resp.raise_for_status()

        return resp.headers.get("Content-Type", "")

    @property
    def api_version(self):
        if not hasattr(self, "_api_version"):
            _api_version = None

            metas = [x for x in self.parsed.findall(".//meta")
                        if x.get("name", "").lower() == "api-version"]
            if metas:
                try:
                    _api_version = int(metas[0].get("value", None))
                except (TypeError, ValueError):
                    _api_version = None
            self._api_version = _api_version
        return self._api_version

    @property
    def base_url(self):
        if not hasattr(self, "_base_url"):
            base = self.parsed.find(".//base")
            if base is not None and base.get("href"):
                self._base_url = base.get("href")
            else:
                self._base_url = self.url
        return self._base_url

    @property
    def links(self):
        """Yields all links in the page"""
        for anchor in self.parsed.findall(".//a"):
            if anchor.get("href"):
                href = anchor.get("href")
                url = self.clean_link(urlparse.urljoin(self.base_url, href))

                # Determine if this link is internal. If that distinction
                #   doesn't make sense in this context, then we don't make
                #   any distinction.
                internal = None
                if self.api_version and self.api_version >= 2:
                    # Only api_versions >= 2 have a distinction between
                    #   external and internal links
                    internal = bool(anchor.get("rel")
                                and "internal" in anchor.get("rel").split())

                yield Link(url, self, internal=internal)

    def rel_links(self):
        for url in self.explicit_rel_links():
            yield url
        for url in self.scraped_rel_links():
            yield url

    def explicit_rel_links(self, rels=('homepage', 'download')):
        """Yields all links with the given relations"""
        rels = set(rels)

        for anchor in self.parsed.findall(".//a"):
            if anchor.get("rel") and anchor.get("href"):
                found_rels = set(anchor.get("rel").split())
                # Determine the intersection between what rels were found and
                #   what rels were being looked for
                if found_rels & rels:
                    href = anchor.get("href")
                    url = self.clean_link(urlparse.urljoin(self.base_url, href))
                    yield Link(url, self, trusted=False)

    def scraped_rel_links(self):
        # Can we get rid of this horrible horrible method?
        for regex in (self._homepage_re, self._download_re):
            match = regex.search(self.content)
            if not match:
                continue
            href_match = self._href_re.search(self.content, pos=match.end())
            if not href_match:
                continue
            url = href_match.group(1) or href_match.group(2) or href_match.group(3)
            if not url:
                continue
            url = self.clean_link(urlparse.urljoin(self.base_url, url))
            yield Link(url, self, trusted=False, _deprecated_regex=True)

    _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I)

    def clean_link(self, url):
        """Makes sure a link is fully encoded.  That is, if a ' ' shows up in
        the link, it will be rewritten to %20 (while not over-quoting
        % or other characters)."""
        return self._clean_re.sub(
            lambda match: '%%%2x' % ord(match.group(0)), url)


class Link(object):

    def __init__(self, url, comes_from=None, internal=None, trusted=None,
            _deprecated_regex=False):
        self.url = url
        self.comes_from = comes_from
        self.internal = internal
        self.trusted = trusted
        self._deprecated_regex = _deprecated_regex

    def __str__(self):
        if self.comes_from:
            return '%s (from %s)' % (self.url, self.comes_from)
        else:
            return str(self.url)

    def __repr__(self):
        return '<Link %s>' % self

    def __eq__(self, other):
        return self.url == other.url

    def __ne__(self, other):
        return self.url != other.url

    def __lt__(self, other):
        return self.url < other.url

    def __le__(self, other):
        return self.url <= other.url

    def __gt__(self, other):
        return self.url > other.url

    def __ge__(self, other):
        return self.url >= other.url

    def __hash__(self):
        return hash(self.url)

    @property
    def filename(self):
        _, netloc, path, _, _ = urlparse.urlsplit(self.url)
        name = posixpath.basename(path.rstrip('/')) or netloc
        assert name, ('URL %r produced no filename' % self.url)
        return name

    @property
    def scheme(self):
        return urlparse.urlsplit(self.url)[0]

    @property
    def path(self):
        return urlparse.urlsplit(self.url)[2]

    def splitext(self):
        return splitext(posixpath.basename(self.path.rstrip('/')))

    @property
    def ext(self):
        return self.splitext()[1]

    @property
    def url_without_fragment(self):
        scheme, netloc, path, query, fragment = urlparse.urlsplit(self.url)
        return urlparse.urlunsplit((scheme, netloc, path, query, None))

    _egg_fragment_re = re.compile(r'#egg=([^&]*)')

    @property
    def egg_fragment(self):
        match = self._egg_fragment_re.search(self.url)
        if not match:
            return None
        return match.group(1)

    _hash_re = re.compile(r'(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)')

    @property
    def hash(self):
        match = self._hash_re.search(self.url)
        if match:
            return match.group(2)
        return None

    @property
    def hash_name(self):
        match = self._hash_re.search(self.url)
        if match:
            return match.group(1)
        return None

    @property
    def show_url(self):
        return posixpath.basename(self.url.split('#', 1)[0].split('?', 1)[0])

    @property
    def verifiable(self):
        """
        Returns True if this link can be verified after download, False if it
        cannot, and None if we cannot determine.
        """
        trusted = self.trusted or getattr(self.comes_from, "trusted", None)
        if trusted is not None and trusted:
            # This link came from a trusted source. It *may* be verifiable but
            #   first we need to see if this page is operating under the new
            #   API version.
            try:
                api_version = getattr(self.comes_from, "api_version", None)
                api_version = int(api_version)
            except (ValueError, TypeError):
                api_version = None

            if api_version is None or api_version <= 1:
                # This link is either trusted, or it came from a trusted,
                #   however it is not operating under the API version 2 so
                #   we can't make any claims about if it's safe or not
                return

            if self.hash:
                # This link came from a trusted source and it has a hash, so we
                #   can consider it safe.
                return True
            else:
                # This link came from a trusted source, using the new API
                #   version, and it does not have a hash. It is NOT verifiable
                return False
        elif trusted is not None:
            # This link came from an untrusted source and we cannot trust it
            return False


# An object to represent the "link" for the installed version of a requirement.
# Using Inf as the url makes it sort higher.
INSTALLED_VERSION = Link(Inf)


def get_requirement_from_url(url):
    """Get a requirement from the URL, if possible.  This looks for #egg
    in the URL"""
    link = Link(url)
    egg_info = link.egg_fragment
    if not egg_info:
        egg_info = splitext(link.filename)[0]
    return package_to_requirement(egg_info)


def package_to_requirement(package_name):
    """Translate a name like Foo-1.2 to Foo==1.3"""
    match = re.search(r'^(.*?)-(dev|\d.*)', package_name)
    if match:
        name = match.group(1)
        version = match.group(2)
    else:
        name = package_name
        version = ''
    if version:
        return '%s==%s' % (name, version)
    else:
        return name
site-packages/pip/__pycache__/wheel.cpython-33.pyc000064400000053526151733463500016035 0ustar00�
7�Re@Qc@sZdZddlmZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZddl
mZddlmZmZddlmZmZddlmZdd	lmZdd
lmZddlmZmZmZddlm Z dd
l!m"Z"ddlm Z dZ#d.Z$dd/dd�Z%ye&dd�Z'Wne(k
r�dd�Z'YnXdd�Z)dd�Z*ej+dej,�Z-dd�Z.dd�Z/d0ddd1ddd d!�Z3d"d#�Z4e4d$d%��Z5d&d'�Z6d(d)�Z7Gd*d+�d+e8�Z9Gd,d-�d-e8�Z:dS(2uH
Support for installing and building the "wheel" binary package format.
i(uwith_statementN(uurlsafe_b64encode(uParser(uConfigParseruStringIO(uInvalidWheelFilenameuUnsupportedWheel(udistutils_scheme(ulogger(u
pep425tags(ucall_subprocessunormalize_pathumake_path_relative(u
pkg_resources(uScriptMakeru.whliusha256ic
Cs�tj|�}d}t|d��O}|j|�}x6|rn|t|�7}|j|�|j|�}q9WWdQXdt|j��jd�j	d�}||fS(u6Return (hash, length) for path using hashlib.new(algo)iurbNusha256=ulatin1u=(
uhashlibunewuopenureadulenuupdateuurlsafe_b64encodeudigestudecodeurstrip(upathualgou	blocksizeuhulengthufublockudigest((u"/tmp/pip-zej_zi-build/pip/wheel.pyurehash"s	
(urehashcCs t|t�r|jd�S|S(Nuascii(u
isinstanceuunicodeuencode(us((u"/tmp/pip-zej_zi-build/pip/wheel.pyubinary1s
ubinarycCs t|t�r|jd�SdS(Nuascii(u
isinstanceustruencode(us((u"/tmp/pip-zej_zi-build/pip/wheel.pyubinary6scCsItjddkr"i}d}nidd6}d}t||||�S(Niiubuunewline(usysuversion_infouopen(unameumodeunlubin((u"/tmp/pip-zej_zi-build/pip/wheel.pyuopen_for_csv:s	
uopen_for_csvcCs�tjj|�r�t|d�}zj|j�}|jtd��sIdStj	j
tj��}td�|ttj�}|j
�}Wd|j�Xt|d�}z|j|�|j|�Wd|j�XdSdS(uLReplace #!python with #!/path/to/python
    Return True if file was changed.urbu#!pythonu#!NuwbFT(uosupathuisfileuopenureadlineu
startswithubinaryuFalseusysu
executableuencodeugetfilesystemencodingulinesepureaducloseuwriteuTrue(upathuscriptu	firstlineuexenameurest((u"/tmp/pip-zej_zi-build/pip/wheel.pyu
fix_scriptCs 
u
fix_scriptuZ^(?P<namever>(?P<name>.+?)(-(?P<ver>\d.+?))?)
                                \.dist-info$cCs�|jdd�}x�tj|�D]�}tj|�}|r"|jd�|kr"ttjj||d���:}x0|D](}|j	�j
�}|dkrzdSqzWWdQXq"q"WdS(	uP
    Return True if the extracted wheel in wheeldir should go into purelib.
    u-u_unameuWHEELuroot-is-purelib: trueNTF(
ureplaceuosulistdirudist_info_reumatchugroupuopenupathujoinulowerurstripuTrueuFalse(unameuwheeldiruname_foldeduitemumatchuwheeluline((u"/tmp/pip-zej_zi-build/pip/wheel.pyuroot_is_purelib]s!
uroot_is_purelibc
Cs�tjj|�siifSt|��N}t�}x.|D]&}|j|j��|jd�q;W|jd�WdQXtj	�}|j
|�i}i}|jd�r�t|j
d��}n|jd�r�t|j
d��}n||fS(Nu
iuconsole_scriptsugui_scripts(uosupathuexistsuopenuStringIOuwriteustripuseekuConfigParseruRawConfigParserureadfpuhas_sectionudictuitems(ufilenameufpudataulineucpuconsoleugui((u"/tmp/pip-zej_zi-build/pip/wheel.pyuget_entrypointsms"
	

uget_entrypointsc	$s(|s't|d|d|d|�}nt|��rC|d�n
|d�g�g��jtjj�tjj}	i�t��g}
|r�tj|	dd0dd0�ndd	��d1�����fd
d��	dd���	�
fdd
�}||	�d0��s#td�
��tjj
�dd�}t|�\����fdd�}
x��D]�}d}d}x�tjtjj
�|��D]e}d}|dkr�t}|
}ntjj
�||�}	||}||	|d1d|d|�q�WqjWtd|d��td2��_d0�_�fdd�}|�_d�_�jdd�}|rSdtjkr�d|}|
j�j|��ntjjdd�dkr�dtjdd �|f}|
j�j|��ndtjdd!�|f}|
j�j|��d"d#��D�}x|D]
}�|=q?Wn�jd$d�}|r�dtjkr�d%|}|
j�j|��nd&tjdd!�|f}|
j�j|��d'd#��D�}x|D]
}�|=q�Wnt��dkr<|
j�jd(d#��j�D���nt��dkr�|
j�jd)d#��j�D�id0d*6��ntjj
�dd+�}tjj
�dd,�}t |d-��M}t |d.��5}t!j"|�}t!j#|�}xj|D]b} �j| d| d�| d<| d�krTt$| d�\| d <| d/<n|j%| �q�Wxu|
D]m}!t$|!�\}"}#|r�|!j&|�r�tjj
tjtjj'|!|��}!n|j%|!|"|#f�qlWx(�D] }!|j%�|!ddf�q�WWdQXWdQXt(j)||�dS(3uInstall a wheeluuseruhomeurootupurelibuplatlibuforceuquietcSst||�jtjjd�S(Nu/(umake_path_relativeureplaceuosupathusep(usrcup((u"/tmp/pip-zej_zi-build/pip/wheel.pyunormpath�su"move_wheel_files.<locals>.normpathcsB�|��}�|��}|�|<|r>�j|�ndS(u6Map archive RECORD paths to installation RECORD paths.N(uadd(usrcfileudestfileumodifieduoldpathunewpath(uchangedu	installedulib_dirunormpathuwheeldir(u"/tmp/pip-zej_zi-build/pip/wheel.pyurecord_installed�s

u*move_wheel_files.<locals>.record_installedcs&tjj|�s"tj|�nx�tj|�D]�\}}}|t|�d�jtjj�}tjj||�}	|r�|j	tjjd�dj
d�r�q2nx�|D]�}
tjj|||
�}|r|dkr|j
d�r�j|
�q�q�|r�|
j
d�r�|
j�j
�jjdd�j��r��sWtd���j|�q�q�Wx�|D]�}|r�||�r�qrntjj||�}
tjj|||�}tjj|	�s�tj|	�ntj|
|�d	}|r
||�}n�|
||�qrWq2WdS(
Niiu.datauu
.dist-infou-u_uMultiple .dist-info directoriesF(uosupathuexistsumakedirsuwalkulenulstripusepujoinusplituendswithuappenduloweru
startswithuproject_nameureplaceuAssertionErrorushutilucopy2uFalse(usourceudestuis_baseufixerufilterudirusubdirsufilesubasedirudestdirusu
destsubdirufusrcfileudestfileuchanged(u	data_dirsuinfo_dirurecord_installedureq(u"/tmp/pip-zej_zi-build/pip/wheel.pyuclobber�s:%+
!
*
u!move_wheel_files.<locals>.clobberu!%s .dist-info directory not foundiuentry_points.txtcs�|j�jd�r(|dd�}nV|j�jd�rP|dd�}n.|j�jd�rx|dd�}n|}|�kp�|�kS(	Nu.exeiu
-script.pyi
u.pyai����i����i����(uloweruendswith(unameu	matchname(uconsoleugui(u"/tmp/pip-zej_zi-build/pip/wheel.pyuis_entrypoint_wrapper�su/move_wheel_files.<locals>.is_entrypoint_wrapperuscriptsufixerufilterucs6�ji|jd6|jjd�dd6|jd6S(Numoduleu.iuimport_nameufunc(uscript_templateuprefixusuffixusplit(uentry(umaker(u"/tmp/pip-zej_zi-build/pip/wheel.pyu_get_script_text	s	
u*move_wheel_files.<locals>._get_script_textu�# -*- coding: utf-8 -*-
import re
import sys

from %(module)s import %(import_name)s

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(%(func)s())
upipuENSUREPIP_OPTIONSupip = u
altinstallu
pip%s = %sNiicSs(g|]}tjd|�r|�qS(upip(\d(\.\d)?)?$(ureumatch(u.0uk((u"/tmp/pip-zej_zi-build/pip/wheel.pyu
<listcomp>Js	u$move_wheel_files.<locals>.<listcomp>ueasy_installueasy_install = ueasy_install-%s = %scSs(g|]}tjd|�r|�qS(ueasy_install(-\d\.\d)?$(ureumatch(u.0uk((u"/tmp/pip-zej_zi-build/pip/wheel.pyu
<listcomp>Vs	cSsg|]}d|�qS(u%s = %s((u.0ukv((u"/tmp/pip-zej_zi-build/pip/wheel.pyu
<listcomp>]s	cSsg|]}d|�qS(u%s = %s((u.0ukv((u"/tmp/pip-zej_zi-build/pip/wheel.pyu
<listcomp>_s	uguiuRECORDu
RECORD.pipuruw+iTF(u(*udistutils_schemeuroot_is_pureliburstripuosupathusepusetu
compileallucompile_diruTrueuFalseuNoneuAssertionErrorujoinuget_entrypointsulistdiru
fix_scriptuScriptMakeruvariantsuset_modeu_get_script_textuscript_templateupopuenvironuextendumakeugetusysuversionulenu
make_multipleuitemsuopen_for_csvucsvureaderuwriterurehashuwriterowu
startswithurelpathushutilumove($unameurequwheeldiruuseruhomeurootu	pycompileuschemeustrip_file_prefixusourceu	generateduclobberuep_fileuis_entrypoint_wrapperudatadirufixerufilterusubdirudestu_get_script_textu
pip_scriptuspecupip_epukueasy_install_scriptueasy_install_epurecordutemp_recordu	record_inu
record_outureaderuwriterurowufuhul((uchangeduconsoleu	data_dirsuguiuinfo_diru	installedulib_dirumakerunormpathurecord_installedurequwheeldiru"/tmp/pip-zej_zi-build/pip/wheel.pyumove_wheel_files�s�!

	!!(
%	
$		
	#



,6
!
*
*umove_wheel_filescs%tj���fdd��}|S(Nc?sHt�}x8�||�D]'}||kr|j|�|VqqWdS(N(usetuadd(uargsukwuseenuitem(ufn(u"/tmp/pip-zej_zi-build/pip/wheel.pyuuniquevs
	
u_unique.<locals>.unique(u	functoolsuwraps(ufnuunique((ufnu"/tmp/pip-zej_zi-build/pip/wheel.pyu_uniqueus!u_uniqueccs�ddlm}tj||jd���}x�|D]}tjj|j|d�}|V|j	d�r5tjj
|�\}}|dd�}tjj||d�}|Vq5q5WdS(	u
    Yield all the uninstallation paths for dist based on RECORD-without-.pyc

    Yield paths to all the files in RECORD. For each .py file in RECORD, add
    the .pyc in the same directory.

    UninstallPathSet.add() takes care of the __pycache__ .pyc.
    i(uFakeFileuRECORDu.pyNiu.pyci����(upip.requFakeFileucsvureaderuget_metadata_linesuosupathujoinulocationuendswithusplit(udistuFakeFileururowupathudnufnubase((u"/tmp/pip-zej_zi-build/pip/wheel.pyuuninstallation_paths�s

uuninstallation_pathscCs�yzdd�tjd|�D�d}|jd�}t�j|�}|dj�}ttt	|j
d���}|SWndSYnXdS(	u�
    Return the Wheel-Version of an extracted wheel, if possible.

    Otherwise, return False if we couldn't parse / extract it.
    cSsg|]}|�qS(((u.0ud((u"/tmp/pip-zej_zi-build/pip/wheel.pyu
<listcomp>�s	u!wheel_version.<locals>.<listcomp>iuWHEELu
Wheel-Versionu.NF(u
pkg_resourcesufind_on_pathuNoneuget_metadatauParseruparsestrustriputupleumapuintusplituFalse(u
source_dirudistu
wheel_datauversion((u"/tmp/pip-zej_zi-build/pip/wheel.pyu
wheel_version�s#u
wheel_versioncCs�|std|��n|dtdkrXtd|djtt|��f��n2|tkr�tjddjtt|���ndS(u�
    Raises errors or warns if called with an incompatible Wheel-Version.

    Pip should refuse to install a Wheel-Version that's a major series
    ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when
    installing a version only minor version ahead (e.g 1.2 > 1.1).

    version: a 2-tuple representing a Wheel-Version (Major, Minor)
    name: name of wheel or package to raise exception about

    :raises UnsupportedWheel: when an incompatible Wheel-Version is given
    u(%s is in an unsupported or invalid wheeliuB%s's Wheel-Version (%s) is not compatible with this version of pipu.u*Installing from a newer Wheel-Version (%s)N(uUnsupportedWheeluVERSION_COMPATIBLEujoinumapustruloggeruwarn(uversionuname((u"/tmp/pip-zej_zi-build/pip/wheel.pyucheck_compatibility�s
%	ucheck_compatibilitycBsY|EeZdZdZejdej�Zdd�Zd	dd�Z
d	dd�Zd	S(
uWheeluA wheel fileu�^(?P<namever>(?P<name>.+?)-(?P<ver>\d.*?))
                ((-(?P<build>\d.*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?)
                \.whl|\.dist-info)$cs��jj|�}|s+td|��n|�_|jd�jdd��_|jd�jdd��_|jd�jd��_	|jd�jd��_
|jd	�jd��_t�fd
d��j	D���_
dS(
uX
        :raises InvalidWheelFilename: when the filename is invalid for a wheel
        u!%s is not a valid wheel filename.unameu_u-uverupyveru.uabiuplatc3s>|]4}�jD]$}�jD]}|||fVqqqdS(N(uabisuplats(u.0uxuyuz(uself(u"/tmp/pip-zej_zi-build/pip/wheel.pyu	<genexpr>�su!Wheel.__init__.<locals>.<genexpr>N(u
wheel_file_reumatchuInvalidWheelFilenameufilenameugroupureplaceunameuversionusplitu
pyversionsuabisuplatsusetu	file_tags(uselfufilenameu
wheel_info((uselfu"/tmp/pip-zej_zi-build/pip/wheel.pyu__init__�s	uWheel.__init__csH�dkrtj�n�fdd�|jD�}|rDt|�SdS(u"
        Return the lowest index that one of the wheel's file_tag combinations
        achieves in the supported_tags list e.g. if there are 8 supported tags,
        and one of the file tags is first in the list, then return 0.  Returns
        None is the wheel is not supported.
        cs+g|]!}|�kr�j|��qS((uindex(u.0uc(utags(u"/tmp/pip-zej_zi-build/pip/wheel.pyu
<listcomp>�s	u+Wheel.support_index_min.<locals>.<listcomp>N(uNoneu
pep425tagsusupported_tagsu	file_tagsumin(uselfutagsuindexes((utagsu"/tmp/pip-zej_zi-build/pip/wheel.pyusupport_index_min�suWheel.support_index_mincCs4|dkrtj}ntt|�j|j��S(u'Is this wheel supported on this system?N(uNoneu
pep425tagsusupported_tagsuboolusetuintersectionu	file_tags(uselfutags((u"/tmp/pip-zej_zi-build/pip/wheel.pyu	supported�suWheel.supportedN(u__name__u
__module__u__qualname__u__doc__ureucompileuVERBOSEu
wheel_file_reu__init__uNoneusupport_index_minu	supported(u
__locals__((u"/tmp/pip-zej_zi-build/pip/wheel.pyuWheel�suWheelcBsD|EeZdZdZggdd�Zdd�Zdd�ZdS(	uWheelBuilderu#Build wheels from a RequirementSet.cCs7||_||_t|�|_||_||_dS(N(urequirement_setufinderunormalize_pathu	wheel_diru
build_optionsuglobal_options(uselfurequirement_setufinderu	wheel_diru
build_optionsuglobal_options((u"/tmp/pip-zej_zi-build/pip/wheel.pyu__init__�s
			uWheelBuilder.__init__cCs�tjdd|jgt|j�}tjd|j�tjd|j�|dd|jg|j	}y!t
|d|jdd�dSWn tjd	|j�dSYnXd
S(
uBuild one wheel.u-cujimport setuptools;__file__=%r;exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))u#Running setup.py bdist_wheel for %suDestination directory: %subdist_wheelu-ducwdushow_stdoutuFailed building wheel for %sNFT(usysu
executableusetup_pyulistuglobal_optionsuloggerunotifyunameu	wheel_diru
build_optionsucall_subprocessu
source_diruFalseuTrueuerror(uselfurequ	base_argsu
wheel_args((u"/tmp/pip-zej_zi-build/pip/wheel.pyu
_build_ones	
uWheelBuilder._build_onecCs5|jj|j�|jjj�}dd�|D�}|sBdStjddjdd�|D���tjd7_gg}}x:|D]2}|j	|�r�|j
|�q�|j
|�q�Wtjd8_|rtjdd	jd
d�|D���n|r1tjdd	jdd�|D���ndS(
u
Build wheels.cSsg|]}|js|�qS((uis_wheel(u.0ureq((u"/tmp/pip-zej_zi-build/pip/wheel.pyu
<listcomp>s	u&WheelBuilder.build.<locals>.<listcomp>Nu*Building wheels for collected packages: %su,cSsg|]}|j�qS((uname(u.0ureq((u"/tmp/pip-zej_zi-build/pip/wheel.pyu
<listcomp>#s	iuSuccessfully built %su cSsg|]}|j�qS((uname(u.0ureq((u"/tmp/pip-zej_zi-build/pip/wheel.pyu
<listcomp>0s	uFailed to build %scSsg|]}|j�qS((uname(u.0ureq((u"/tmp/pip-zej_zi-build/pip/wheel.pyu
<listcomp>2s	(urequirement_setu
prepare_filesufinderurequirementsuvaluesuloggerunotifyujoinuindentu
_build_oneuappend(uselfureqsetubuildsetu
build_successu
build_failureureq((u"/tmp/pip-zej_zi-build/pip/wheel.pyubuilds&

*uWheelBuilder.buildN(u__name__u
__module__u__qualname__u__doc__u__init__u
_build_oneubuild(u
__locals__((u"/tmp/pip-zej_zi-build/pip/wheel.pyuWheelBuilder�suWheelBuilder(iiiFT(;u__doc__u
__future__uwith_statementu
compileallucsvu	functoolsuhashlibuosureushutilusysubase64uurlsafe_b64encodeuemail.parseruParserupip.backwardcompatuConfigParseruStringIOupip.exceptionsuInvalidWheelFilenameuUnsupportedWheelu
pip.locationsudistutils_schemeupip.loguloggerupipu
pep425tagsupip.utilucall_subprocessunormalize_pathumake_path_relativeupip._vendoru
pkg_resourcesupip._vendor.distlib.scriptsuScriptMakeru	wheel_extuVERSION_COMPATIBLEurehashuunicodeubinaryu	NameErroruopen_for_csvu
fix_scriptucompileuVERBOSEudist_info_reuroot_is_purelibuget_entrypointsuFalseuNoneuTrueumove_wheel_filesu_uniqueuuninstallation_pathsu
wheel_versionucheck_compatibilityuobjectuWheeluWheelBuilder(((u"/tmp/pip-zej_zi-build/pip/wheel.pyu<module>sT

		�2site-packages/pip/__pycache__/pep425tags.cpython-33.pyc000064400000006526151733463500016625 0ustar00�
7�Re�c@s�dZddlZddlZyddlZWn!ek
rQddljZYnXddlZdd�Zdd�Z	dd�Z
ddd	d
�Z
e
�Ze
dd
�ZdS(u2Generate and work with PEP 425 Compatibility Tags.iNcCsUttd�rd}n9tjjd�r3d}ntjdkrKd}nd}|S(u'Return abbreviated implementation name.upypy_version_infouppujavaujyucliuipucp(uhasattrusysuplatformu
startswith(upyimpl((u'/tmp/pip-zej_zi-build/pip/pep425tags.pyu
get_abbr_impls			u
get_abbr_implcCs#djtttjdd���S(uReturn implementation version.uNi(ujoinumapustrusysuversion_info(((u'/tmp/pip-zej_zi-build/pip/pep425tags.pyuget_impl_versuget_impl_vercCs%tjj�jdd�jdd�S(u0Return our platform name 'win32', 'linux_x86_64'u.u_u-(u	distutilsuutiluget_platformureplace(((u'/tmp/pip-zej_zi-build/pip/pep425tags.pyuget_platform suget_platformcCs�g}|dkrqg}tjd}xIttjddd�D]+}|jdjtt||f���q?Wnt�}g}yt	j
d�}WnDtk
r�}z$tj
dj|�t�d}WYdd}~XnX|r|jd�rd|jd	d�dg|dd�<nt�}	ddl}
xK|
j�D]=}|djd
�r;|	j|djdd�d�q;q;W|jtt|	���|jd
�|s�t�}x5|D]*}
|jd||df|
|f�q�Wnxqt|�D]c\}}|jd||fd
df�|dkr�|jd||ddfd
df�q�q�Wxdt|�D]V\}}|jd|fd
df�|dkrj|jd|dd
df�qjqjW|S(u�Return a list of supported tags for each version specified in
    `versions`.

    :param versions: a list of string versions, of the form ["33", "32"],
        or None. The first version will be assumed to support our ABI.
    iiuuSOABIu{0}Nucpython-ucpu-u.abiu.iunoneu%s%suanyupy%si����i����i����(uNoneusysuversion_infourangeuappendujoinumapustru
get_abbr_implu	sysconfiguget_config_varuIOErroruwarningsuwarnuformatuRuntimeWarningu
startswithusplitusetuimpuget_suffixesuadduextendusortedulistuget_platformu	enumerate(uversionsunoarchu	supportedumajoruminoruimpluabisusoabiueuabi3suimpusuffixuarchuabiuiuversion((u'/tmp/pip-zej_zi-build/pip/pep425tags.pyu
get_supported&sF
 ,	*	(
	
+ /%u
get_supportedunoarchFT(u__doc__usysuwarningsu	sysconfiguImportErrorudistutils.sysconfigudistutils.utilu	distutilsu
get_abbr_impluget_impl_veruget_platformuNoneuFalseu
get_supportedusupported_tagsuTrueusupported_tags_noarch(((u'/tmp/pip-zej_zi-build/pip/pep425tags.pyu<module>s

?	site-packages/pip/__pycache__/log.cpython-33.pyc000064400000026340151733463500015504 0ustar00�
7�Re�$c@s�dZddlZddlZddlZddlmZddlmZmZdd�Z	ej
ejfdd�Zd	d
�Z
Gdd�de�Ze�ZdS(
uLogging
iN(ubackwardcompat(ucoloramau
pkg_resourcescs�fdd�}|S(Ncs#djt��|tjjg�S(Nu(ujoinulistucoloramauStyleu	RESET_ALL(uinp(ucolors(u /tmp/pip-zej_zi-build/pip/log.pyuwrapped
su_color_wrap.<locals>.wrapped((ucolorsuwrapped((ucolorsu /tmp/pip-zej_zi-build/pip/log.pyu_color_wrapsu_color_wrapcCsmt|tj�s|n|j}||kr1dSt|d�rP|j�rPdS|jd�dkridSdS(NuisattyuTERMuANSIFT(	u
isinstanceucoloramauAnsiToWin32uwrappeduFalseuhasattruisattyuTrueuget(uconsumeruenvironustdu
real_consumer((u /tmp/pip-zej_zi-build/pip/log.pyushould_colors	ushould_colorcCs�dj|jd�dd��}dj|jd�dd��}|jd�\}}tt|�d�}dj||g�}tj|�tj|�kS(Nu.ii(ujoinusplitustruintu
pkg_resourcesu
parse_version(ucurrent_versionuremoval_versionumajoruminoruwarn_version((u /tmp/pip-zej_zi-build/pip/log.pyushould_warn&s""ushould_warncBs�|EeZdZdZejdZejZejZejejdZ	ejZZ
ejZejZeeee	eeegZ
ieejj�e6eejj�e6eejj�e6Zdd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zddd�Z d+dd �Z"d!d"�Z#d#d$�Z$d%d&�Z%e&d'd(��Z'd)d*�Z(d+S(,uLoggeru�
    Logging object for use in command-line script.  Allows ranges of
    levels, to avoid some redundancy of displayed information.
    iicCs1g|_d|_d|_d|_d|_dS(NiF(u	consumersuindentuFalseuexplicit_levelsuNoneuin_progressuin_progress_hanging(uself((u /tmp/pip-zej_zi-build/pip/log.pyu__init__Ls
				uLogger.__init__cGs�tjjd�rsxn|D]S\}}t|d�rV|jj|tj|�f�q|jj||f�qWn|jj|�dS(Nuwinuwrite(	usysuplatformu
startswithuhasattru	consumersuappenducoloramauAnsiToWin32uextend(uselfu	consumersuleveluconsumer((u /tmp/pip-zej_zi-build/pip/log.pyu
add_consumersSs	uLogger.add_consumerscOs|j|j|||�dS(N(uloguDEBUG(uselfumsguargsukw((u /tmp/pip-zej_zi-build/pip/log.pyudebug_suLogger.debugcOs|j|j|||�dS(N(uloguINFO(uselfumsguargsukw((u /tmp/pip-zej_zi-build/pip/log.pyuinfobsuLogger.infocOs|j|j|||�dS(N(uloguNOTIFY(uselfumsguargsukw((u /tmp/pip-zej_zi-build/pip/log.pyunotifyesu
Logger.notifycOs|j|j|||�dS(N(uloguWARN(uselfumsguargsukw((u /tmp/pip-zej_zi-build/pip/log.pyuwarnhsuLogger.warncOs|j|j|||�dS(N(uloguERROR(uselfumsguargsukw((u /tmp/pip-zej_zi-build/pip/log.pyuerrorksuLogger.errorcOs|j|j|||�dS(N(uloguFATAL(uselfumsguargsukw((u /tmp/pip-zej_zi-build/pip/log.pyufatalnsuLogger.fatalcOsLddlm}t||�r5|j|||�n|j|||�dS(u�
        Logs deprecation message which is log level WARN if the
        ``removal_version`` is > 1 minor release away and log level ERROR
        otherwise.

        removal_version should be the version that the deprecated feature is
        expected to be removed in, so something that will not exist in
        version 1.7, but will in 1.6 would have a removal_version of 1.7.
        i(u__version__N(upipu__version__ushould_warnuwarnuerror(uselfuremoval_versionumsguargsukwargsu__version__((u /tmp/pip-zej_zi-build/pip/log.pyu
deprecatedqs
uLogger.deprecatedc
Osx|r|rtd��qn|p'|}|r=||}n|}d|j|}|jrpd||f}nx|jD]�\}}|j||�rz|jr�|tjtjfkr�d	|_tjj
d�tjj�nt|d�rc|d}t
|tj�r7|jj|dd��}	|	|�}n|j
|�t|d�rm|j�qmqp||�qzqzWdS(
Nu6You may give positional or keyword arguments, not bothu u%02i %su
uwritecSs|S(N((ux((u /tmp/pip-zej_zi-build/pip/log.pyu<lambda>�suLogger.log.<locals>.<lambda>uflushF(u	TypeErroruindentuexplicit_levelsu	consumersu
level_matchesuin_progress_hangingusysustdoutustderruFalseuwriteuflushuhasattrushould_coloruosuenvironuCOLORSuget(
uselfulevelumsguargsukwurendereduconsumer_leveluconsumeru
write_contentu	colorizer((u /tmp/pip-zej_zi-build/pip/log.pyulog�s6
			

u
Logger.logcCs|j|j�otjj�S(u$Should we display download progress?(ustdout_level_matchesuNOTIFYusysustdoutuisatty(uself((u /tmp/pip-zej_zi-build/pip/log.pyu_show_progress�suLogger._show_progresscCs�|js#td||jf��|j�rctjjd|j|�tjj�d|_	n	d|_	||_d|_dS(Nu0Tried to start_progress(%r) while in_progress %ru TF(
uin_progressuAssertionErroru_show_progressusysustdoutuwriteuindentuflushuTrueuin_progress_hanginguFalseuNoneulast_message(uselfumsg((u /tmp/pip-zej_zi-build/pip/log.pyustart_progress�s

		uLogger.start_progressudone.cCs�|jstd��|j�r�|jsYtjjd|j|d�tjj�q�tj	d�tj	d�tjj|d�tjj�nd|_d|_dS(Nu,Tried to end_progress without start_progressu...u
uF(uin_progressuAssertionErroru_show_progressuin_progress_hangingusysustdoutuwriteuflushuloggeru
show_progressuNoneuFalse(uselfumsg((u /tmp/pip-zej_zi-build/pip/log.pyuend_progress�s		

	uLogger.end_progresscCs�|jr�|dkr5tjjd�tjj�q�|jrgdtdt|j�t|��}nd}tjjdd|j	|j
||f�tjj�||_ndS(uaIf we are in a progress scope, and no log messages have been
        shown, write out another '.'u.u iuu	
%s%s%s%sN(uin_progress_hanginguNoneusysustdoutuwriteuflushulast_messageumaxulenuindentuin_progress(uselfumessageupadding((u /tmp/pip-zej_zi-build/pip/log.pyu
show_progress�s		)
uLogger.show_progresscCs|j||j��S(u9Returns true if a message at this level will go to stdout(u
level_matchesu
_stdout_level(uselfulevel((u /tmp/pip-zej_zi-build/pip/log.pyustdout_level_matches�suLogger.stdout_level_matchescCs4x*|jD]\}}|tjkr
|Sq
W|jS(u%Returns the level that stdout runs at(u	consumersusysustdoutuFATAL(uselfuleveluconsumer((u /tmp/pip-zej_zi-build/pip/log.pyu
_stdout_level�suLogger._stdout_levelcCslt|t�r^|j|j}}|dk	r>||kr>dS|dk	sV||krZdSdS||kSdS(um
        >>> l = Logger()
        >>> l.level_matches(3, 4)
        False
        >>> l.level_matches(3, 2)
        True
        >>> l.level_matches(slice(None, 3), 3)
        False
        >>> l.level_matches(slice(None, 3), 2)
        True
        >>> l.level_matches(slice(1, 3), 1)
        True
        >>> l.level_matches(slice(2, 3), 1)
        False
        NFT(u
isinstanceusliceustartustopuNoneuFalseuTrue(uselfuleveluconsumer_levelustartustop((u /tmp/pip-zej_zi-build/pip/log.pyu
level_matches�suLogger.level_matchescCs?|j}|dkr|dS|t|�kr7|dS||S(Niii����(uLEVELSulen(uclsulevelulevels((u /tmp/pip-zej_zi-build/pip/log.pyulevel_for_integers	uLogger.level_for_integercCs�g}g}xR|jD]G\}}|tjkr|j||f�|j|tjf�qqWx|D]}|jj|�qhW|jj|�dS(N(u	consumersusysustdoutuappendustderruremoveuextend(uselfu	to_removeuto_adduconsumer_leveluconsumeruitem((u /tmp/pip-zej_zi-build/pip/log.pyumove_stdout_to_stderr	s
uLogger.move_stdout_to_stderrN()u__name__u
__module__u__qualname__u__doc__ulogginguDEBUGu
VERBOSE_DEBUGuINFOuWARNuNOTIFYuWARNINGuERRORuFATALuLEVELSu_color_wrapucoloramauForeuYELLOWuREDuCOLORSu__init__u
add_consumersudebuguinfounotifyuwarnuerrorufatalu
deprecatedulogu_show_progressustart_progressuend_progressuNoneu
show_progressustdout_level_matchesu
_stdout_levelu
level_matchesuclassmethodulevel_for_integerumove_stdout_to_stderr(u
__locals__((u /tmp/pip-zej_zi-build/pip/log.pyuLogger7s@
		
		&
	uLogger(u__doc__usysuosuloggingupipubackwardcompatupip._vendorucoloramau
pkg_resourcesu_color_wrapustdoutustderrushould_colorushould_warnuobjectuLoggerulogger(((u /tmp/pip-zej_zi-build/pip/log.pyu<module>s�site-packages/pip/__pycache__/__init__.cpython-33.pyc000064400000027042151733463500016462 0ustar00�
7�Re�$c@shddlZddlZddlZddlZddlmZmZmZddlm	Z	ddl
mZmZddl
mZmZmZmZddlmZmZddlmZmZmZddlZejZdZd	d
�Zdd�Zd
d�Zddd�Z!dd�Z"Gdd�de#�Z$e%dkrde!�Z&e&rdej&e&�qdndS(iN(uInstallationErroruCommandErroruPipError(ulogger(uget_installed_distributionsuget_prog(ugitu	mercurialu
subversionubazaar(uConfigOptionParseruUpdatingDefaultsHelpFormatter(ucommandsu
get_summariesuget_similar_commandsu1.5.6csdtjkrdStjdj�dd�}ttjd�}y||d�Wntk
rod�YnXdd�t�D��g}y!�fd	d�|D�d
}Wntk
r�d}YnXt�}|ri|dkr�tj	d�n|dkr��j
d
�r�g}�j�}xUtdd�D]D}|jj
|�r1|j|dd�kr1|j|j�q1q1W|r�x|D]}t|�q�Wtj	d�q�nt|�}|dd�|jjD�7}dd�|d|d�D���fdd�|D�}�fdd�|D�}x�|D]1}	|	d
}
|	drX|
d7}
nt|
�q1Wn��j
d
�s��j
d�r�dd�|jD�}|j|j�dd�|D�}�dd�|D�7�ntdj�fdd��D���tj	d�dS(u�Command and option completion for the main option parser (and options)
    and its subcommands (and options).

    Enable by sourcing one of the completion shell scripts (bash or zsh).
    uPIP_AUTO_COMPLETENu
COMP_WORDSiu
COMP_CWORDucSsg|]\}}|�qS(((u.0ucmdusummary((u%/tmp/pip-zej_zi-build/pip/__init__.pyu
<listcomp>(s	u autocomplete.<locals>.<listcomp>cs"g|]}|�kr|�qS(((u.0uw(usubcommands(u%/tmp/pip-zej_zi-build/pip/__init__.pyu
<listcomp>,s	iuhelpu	uninstallu-u
local_onlycSs7g|]-}|jtjkr|j�|jf�qS((uhelpuoptparseu
SUPPRESS_HELPuget_opt_stringunargs(u.0uopt((u%/tmp/pip-zej_zi-build/pip/__init__.pyu
<listcomp>Ds	cSs#g|]}|jd�d�qS(u=i(usplit(u.0ux((u%/tmp/pip-zej_zi-build/pip/__init__.pyu
<listcomp>Is	cs.g|]$\}}|�kr||f�qS(((u.0uxuv(u	prev_opts(u%/tmp/pip-zej_zi-build/pip/__init__.pyu
<listcomp>Js	cs1g|]'\}}|j��r||f�qS((u
startswith(u.0ukuv(ucurrent(u%/tmp/pip-zej_zi-build/pip/__init__.pyu
<listcomp>Ls	u=u--cSsg|]}|j�qS((uoption_list(u.0ui((u%/tmp/pip-zej_zi-build/pip/__init__.pyu
<listcomp>Vs	css"|]}|D]}|Vq
qdS(N((u.0uituo((u%/tmp/pip-zej_zi-build/pip/__init__.pyu	<genexpr>Xsuautocomplete.<locals>.<genexpr>cSs.g|]$}|jtjkr|j��qS((uhelpuoptparseu
SUPPRESS_HELPuget_opt_string(u.0ui((u%/tmp/pip-zej_zi-build/pip/__init__.pyu
<listcomp>Zs	u cs%g|]}|j��r|�qS((u
startswith(u.0ux(ucurrent(u%/tmp/pip-zej_zi-build/pip/__init__.pyu
<listcomp>]s	T(uosuenvironusplituintu
IndexErroru
get_summariesuNoneucreate_main_parserusysuexitu
startswithuloweruget_installed_distributionsuTrueukeyuappenduprintucommandsuparseruoption_list_allu
option_groupsuoption_listujoin(ucwordsucworduoptionsusubcommand_nameuparseru	installedulcudistu
subcommanduoptionu	opt_labeluopts((ucurrentu	prev_optsusubcommandsu%/tmp/pip-zej_zi-build/pip/__init__.pyuautocompletes\
!
	+

!



&uautocompletecCs�idd6dd6t�d6dd6t�d6}t|�}|j�tjjtjjtjjt	���}dt
|tjdd	�f|_t
jt
j|�}|j|�d|_t�}d
gdd�|D�}d
j|�|_|S(Nu
%prog <command> [options]uusageuadd_help_optionu	formatteruglobalunameuprogupip %s from %s (python %s)iucSs&g|]\}}d||f�qS(u%-27s %s((u.0uiuj((u%/tmp/pip-zej_zi-build/pip/__init__.pyu
<listcomp>ys	u&create_main_parser.<locals>.<listcomp>u
FT(uFalseuUpdatingDefaultsHelpFormatteruget_proguConfigOptionParserudisable_interspersed_argsuosupathudirnameuabspathu__file__u__version__usysuversionu
cmdoptionsumake_option_groupu
general_groupuadd_option_groupuTrueumainu
get_summariesujoinudescription(u	parser_kwuparserupip_pkg_dirugen_optsucommand_summariesudescription((u%/tmp/pip-zej_zi-build/pip/__init__.pyucreate_main_parseras$


* 
		ucreate_main_parsercCs2t�}|j|�\}}|jrZtjj|j�tjjtj�tj�n|s�|ddkr�t	|�dkr�|j
�tj�n|dj�}|dd�}|j|dj��|t
kr(t|�}d|g}|r|jd|�ntdj|���n||fS(Niuhelpiuunknown command "%s"umaybe you meant "%s"u - (ucreate_main_parseru
parse_argsuversionusysustdoutuwriteuosulinesepuexitulenu
print_helpuloweruremoveucommandsuget_similar_commandsuappenduCommandErrorujoin(uargsuparserugeneral_optionsu	args_elseucmd_nameucmd_argsuguessumsg((u%/tmp/pip-zej_zi-build/pip/__init__.pyu	parseoptss&			
)


u	parseoptscCs�|dkr"tjdd�}nt�yt|�\}}WnVtk
r�tj�d}tjjd|�tjjt	j
�tjd�YnXt|�}|j
|�S(Niu	ERROR: %s(uNoneusysuargvuautocompleteu	parseoptsuPipErroruexc_infoustderruwriteuosulinesepuexitucommandsumain(uinitial_argsucmd_nameucmd_argsueucommand((u%/tmp/pip-zej_zi-build/pip/__init__.pyumain�s

umainc
Cs`dg}yddl}Wntk
r:|jd�YnXtddg|tjdd��S(uI
    Bootstrapping function to be called from install-pip.py script.
    upipiNu
setuptoolsuinstallu	--upgradei(u
setuptoolsuImportErroruappendumainusysuargv(upkgsu
setuptools((u%/tmp/pip-zej_zi-build/pip/__init__.pyu	bootstrap�s	
u	bootstrapcBst|EeZdZfdd�Zejd�Zejd�Zeddd��Z
edd��Zd	d
�Z
dS(
uFrozenRequirementcCs(||_||_||_||_dS(N(unameurequeditableucomments(uselfunameurequeditableucomments((u%/tmp/pip-zej_zi-build/pip/__init__.pyu__init__�s			uFrozenRequirement.__init__u-r(\d+)$u-(20\d\d\d\d\d\d)$c
Cs6tjjtjj|j��}g}ddlm}m}|j|�r�d}y||||�}	Wn9t
k
r�tj�d}
t
jd|
�d}	YnX|	dkr t
jd|�|jd�|j�}	d}q n:d}|j�}	|	j}t|�dkr'|dddks-t�|dd}|jj|�}
|jj|�}|
sk|r |jd�}|r�|�j||�}n|s�t
jd	|	�|jd
�q |jd|	�|
r�|
jd�}nd|jd�}d}d
|||j|�f}	n||j|	||�S(Ni(uvcsuget_src_requirementiuYError when trying to get requirement for VCS system %s, falling back to uneditable formatu-Could not determine repository location of %su-## !! Could not determine repository locationu==usvnu(Warning: cannot find svn location for %suF## FIXME: could not find svn URL in dependency_links for this package:u3# Installing as editable to satisfy requirement %s:u{%s}u%s@%s#egg=%sTF(uosupathunormcaseuabspathulocationupip.vcsuvcsuget_src_requirementuget_backend_nameuTrueuInstallationErrorusysuexc_infouloggeruwarnuNoneuappenduas_requirementuFalseuspecsulenuAssertionErroru_rev_reusearchu_date_reuget_backenduget_locationugroupuegg_nameuproject_name(uclsudistudependency_linksu	find_tagsulocationucommentsuvcsuget_src_requirementueditableurequexuspecsuversionu	ver_matchu
date_matchusvn_backendusvn_locationurev((u%/tmp/pip-zej_zi-build/pip/__init__.pyu	from_dist�sN!

	,	uFrozenRequirement.from_distcCsA|j�}tjd|�}|r=|d|j��}n|S(Nu
-py\d\.\d$(uegg_nameureusearchustart(udistunameumatch((u%/tmp/pip-zej_zi-build/pip/__init__.pyuegg_names
uFrozenRequirement.egg_namecCsF|j}|jrd|}ndjt|j�t|�g�dS(Nu-e %su
(urequeditableujoinulistucommentsustr(uselfureq((u%/tmp/pip-zej_zi-build/pip/__init__.pyu__str__
s		
uFrozenRequirement.__str__NF(u__name__u
__module__u__qualname__u__init__ureucompileu_rev_reu_date_reuclassmethoduFalseu	from_distustaticmethoduegg_nameu__str__(u
__locals__((u%/tmp/pip-zej_zi-build/pip/__init__.pyuFrozenRequirement�s,uFrozenRequirementu__main__('uosuoptparseusysureupip.exceptionsuInstallationErroruCommandErroruPipErrorupip.loguloggerupip.utiluget_installed_distributionsuget_progupip.vcsugitu	mercurialu
subversionubazaarupip.baseparseruConfigOptionParseruUpdatingDefaultsHelpFormatterupip.commandsucommandsu
get_summariesuget_similar_commandsupip.cmdoptionsupipu
cmdoptionsu__version__uautocompleteucreate_main_parseru	parseoptsuNoneumainu	bootstrapuobjectuFrozenRequirementu__name__uexit(((u%/tmp/pip-zej_zi-build/pip/__init__.pyu<module>s,"	I*G	site-packages/pip/__pycache__/req.cpython-33.pyc000064400000227660151733463500015522 0ustar00�
7�Re)Gc@s\ddlmZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZddl
mZmZmZmZmZddlmZmZmZmZmZmZmZddlmZddlmZddlm 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/m0Z0dd	l1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9dd
l:m;Z;ddl
m<Z<ddl=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHddlIZJdd
lImKZKmLZLmMZMddlNmOZOmPZPdd�ZQGdd�deR�ZSGdd�deR�ZTGdd�deR�ZUdd�ZVejWdejX�ZYeZeZeZeZdd�Z[dd�Z\dd�Z]d d!�Z^eZd"d#�Z_Gd$d%�d%eR�Z`Gd&d'�d'eR�ZaGd(d)�d)eR�ZbdS(*i(u
FeedParserN(uchange_root(ubin_pyurunning_under_virtualenvuPIP_DELETE_MARKER_FILENAMEuwrite_delete_marker_fileubin_user(uInstallationErroruUninstallationErroruUnsupportedWheeluBestVersionAlreadyInstalleduInvalidWheelFilenameuDistributionNotFounduPreviousBuildDirError(uvcs(ulogger(udisplay_pathurmtreeuaskuask_path_existsu
backup_diruis_installable_diruis_localu
dist_is_localudist_in_usersiteudist_in_site_packagesurenamesunormalize_pathu
egg_link_pathumake_path_relativeucall_subprocessu
is_prereleaseunormalize_name(uurlparseuurllibuuses_pycacheuConfigParserustring_typesu	HTTPErroruget_python_versionub(uLink(ubuild_prefix(u
PipSessionuget_file_contentuis_urluurl_to_pathupath_to_urluis_archive_fileuunpack_vcs_linku
is_vcs_urluis_file_urluunpack_file_urluunpack_http_url(umove_wheel_filesuWheelu	wheel_ext(u
pkg_resourcesusixcCs�t|d��}|j�}WdQXdtjd�dg}x:|D]2}y|j|�}Wntk
rswCYnXPqCWt|�tks�t	�|S(uQReturn the contents of *filename*.

    Try to decode the file contents with utf-8, the preffered system encoding
    (e.g., cp1252 on some Windows machines) and latin1, in that order. Decoding
    a byte string with latin1 will never raise an error. In the worst case, the
    returned string will contain some garbage characters.

    urbNuutf-8ulatin1F(
uopenureadulocaleugetpreferredencodinguFalseudecodeuUnicodeDecodeErrorutypeubytesuAssertionError(ufilenameufpudatau	encodingsuenc((u /tmp/pip-zej_zi-build/pip/req.pyuread_text_file's	

uread_text_filecBso|EeZdZdMdNdMdNdOdMdMdNdOdd�	ZedMdMdd��ZedMdMdd��Z	dd�Z
d	d
�ZdOdd�Zd
d�Z
edd��Zedd��Zedd��ZdNdd�ZdZdd�Zdd�Zdd�Zdd�Zed d!��Zejd"�Zfd#d$�Zed%d&��Zed'd(��Zd)d*�ZdOd+d,�Z dNd-d.�Z!d/d0�Z"d1d2�Z#d3d4�Z$d5d6�Z%fdMdMd7d8�Z&d9d:�Z'fd;d<�Z(d=d>�Z)d?d@�Z*edAdB��Z+edCdD��Z,dEdF�Z-dGdH�Z.dMdMdIdJ�Z/edKdL��Z0dMS(PuInstallRequirementcCsLf|_t|t�r9tjj|�}|j|_n||_||_||_||_	|	dkrri}	n|	|_||_||_
d|_d|_d|_d|_d|_||_d|_d|_d|_d|_|
|_||_|rd|_n=|jdk	r?tdd�|jjD��|_n	d|_dS(NcSs0g|]&}t|d�o)|ddk�qS(iiu!=(u
is_prerelease(u.0ux((u /tmp/pip-zej_zi-build/pip/req.pyu
<listcomp>ls	u/InstallRequirement.__init__.<locals>.<listcomp>FT(uextrasu
isinstanceustring_typesu
pkg_resourcesuRequirementuparseurequ
comes_fromu
source_dirueditableuNoneueditable_optionsuurluas_eggu_egg_info_pathusatisfied_byuconflicts_withu_temp_build_diru
_is_bundleuupdateuinstall_succeededuuninstalleduFalseu
use_user_siteu
target_dirufrom_bundleu	pycompileuTrueuprereleasesuanyuspecs(uselfurequ
comes_fromu
source_dirueditableuurluas_egguupdateuprereleasesueditable_optionsufrom_bundleu	pycompile((u /tmp/pip-zej_zi-build/pip/req.pyu__init__As<																					%uInstallRequirement.__init__c	
Cs�t||�\}}}|jd�r6t|�}nd}|||d|ddd|d|dd�}|dk	r�||_n|S(Nufile:u
source_dirueditableuurlueditable_optionsuprereleasesT(uparse_editableu
startswithuurl_to_pathuNoneuTrueuextras(	uclsueditable_requ
comes_fromudefault_vcsunameuurluextras_overrideu
source_dirures((u /tmp/pip-zej_zi-build/pip/req.pyu
from_editableps	u InstallRequirement.from_editablec	Cs�d	}|j�}d	}tjjtjj|��}d	}t|�rWt|�}n�tjj|�r�tjj	|ks�|j
d�r�t|�s�td|��ntt
|��}nFt|�rtjj|�s�tjd|�ntt
|��}n|r�|d	kr�|j}|j}|jdkrstjd|�rst
tjjtjj|j���}n|jtkr�t|j�}|j�s�td|j��q�q�n|}|||d|d|�S(
u�Creates an InstallRequirement from a name, which might be a
        requirement, directory containing 'setup.py', filename, or URL.
        u.u;Directory %r is not installable. File 'setup.py' not found.uARequirement %r looks like a filename, but the file does not existufileu\.\./u-%s is not a supported wheel on this platform.uurluprereleasesN(uNoneustripuosupathunormpathuabspathuis_urluLinkuisdirusepu
startswithuis_installable_diruInstallationErrorupath_to_urluis_archive_fileuisfileuloggeruwarnuurl_without_fragmentuegg_fragmentuschemeureusearchuextu	wheel_extuWheelufilenameu	supporteduUnsupportedWheel(	uclsunameu
comes_fromuprereleasesuurlurequpathulinkuwheel((u /tmp/pip-zej_zi-build/pip/req.pyu	from_line�s43		!*uInstallRequirement.from_linecCs�|jr8t|j�}|jrA|d|j7}qAn	|j}|jdk	rm|dt|jj�7}n|jr�t|jt	�r�|j}n|jj
�}|r�|d|7}q�n|S(Nu from %su in %su
 (from %s)(urequstruurlusatisfied_byuNoneudisplay_pathulocationu
comes_fromu
isinstanceustring_typesu	from_path(uselfusu
comes_from((u /tmp/pip-zej_zi-build/pip/req.pyu__str__�s				uInstallRequirement.__str__cCsv|jdkrdSt|j�}|jrrt|jt�rI|j}n|jj�}|rr|d|7}qrn|S(Nu->(urequNoneustru
comes_fromu
isinstanceustring_typesu	from_path(uselfusu
comes_from((u /tmp/pip-zej_zi-build/pip/req.pyu	from_path�s	uInstallRequirement.from_pathcCs�|jdk	r|jS|jdkrJtjdd�|_||_|jS|jre|jj�}n	|j}t	j
j|�s�t|�nt	j
j
||�S(Nu-buildupip-(u_temp_build_diruNoneurequtempfileumkdtempu_ideal_build_dirueditableunameuloweruosupathuexistsu_make_build_dirujoin(uselfu	build_diruunpackuname((u /tmp/pip-zej_zi-build/pip/req.pyubuild_location�s			
u!InstallRequirement.build_locationcCs8|jdk	rdS|jdk	s(t�|js7t�|j}|j}|`|jrj|jj�}n	|j}t	j
j||�}t	j
j|�s�t
jd|�t|�nt	j
j|�r�tdt|���nt
jd|t|�t|�f�tj||�||_||_d|_dS(ukIf the build location was a temporary directory, this will move it
        to a new more permanent locationNuCreating directory %su<A package already exists in %s; please remove it to continueu,Moving package %s from %s to new location %s(u
source_diruNoneurequAssertionErroru_temp_build_diru_ideal_build_dirueditableunameuloweruosupathujoinuexistsuloggerudebugu_make_build_diruInstallationErrorudisplay_pathushutilumoveu_egg_info_path(uselfuold_locationu
new_build_dirunameunew_location((u /tmp/pip-zej_zi-build/pip/req.pyucorrect_build_location�s0				
			u)InstallRequirement.correct_build_locationcCs|jdkrdS|jjS(N(urequNoneuproject_name(uself((u /tmp/pip-zej_zi-build/pip/req.pyuname�suInstallRequirement.namecCs&|jdkrdStj|jj�S(N(urequNoneuurllibuquoteuunsafe_name(uself((u /tmp/pip-zej_zi-build/pip/req.pyuurl_namesuInstallRequirement.url_namec
Cs�yddl}Wntk
r0td��YnXd}|jrtd|jkrttjj|j|jd|�}ntjj|j|�}tj	r�t
|tj�r�|jt
j��}n|S(NiuBsetuptools must be installed to install from a source distributionusetup.pyusubdirectory(u
setuptoolsuImportErroruInstallationErrorueditable_optionsuosupathujoinu
source_dirusixuPY2u
isinstanceu	text_typeuencodeusysugetfilesystemencoding(uselfu
setuptoolsu
setup_fileusetup_py((u /tmp/pip-zej_zi-build/pip/req.pyusetup_pys

uInstallRequirement.setup_pycCs�|jst�|jr8tjd|j|jf�ntjd|j|jf�tjd7_z>|jdkr�tj	j
tj	j|jd��r�ttj	j|jd��n|j
}|jdt|j��}|jdt|j��}tjd	|d
g}|js|r&g}nFtj	j|jd�}tj	j|�s`tj|�nddg}t||d
|jd|jdddtjdd�Wdtjd8_X|js�tjjd|j��|_|j�ndS(Nu2Running setup.py (path:%s) egg_info for package %su7Running setup.py (path:%s) egg_info for package from %siu
distributeu
setuptoolsudistribute.egg-infou__SETUP_PY__u__PKG_NAME__u-cuegg_infoupip-egg-infou
--egg-baseucwdu
filter_stdoutushow_stdoutu
command_levelucommand_descupython setup.py egg_infou%(Name)s==%(Version)sF(u
source_diruAssertionErrorunameuloggerunotifyusetup_pyuurluindentuosupathuisdirujoinurmtreeu
_run_setup_pyureplaceureprusysu
executableueditableuexistsumakedirsucall_subprocessu_filter_installuFalseu
VERBOSE_DEBUGurequ
pkg_resourcesuRequirementuparseupkg_infoucorrect_build_location(uselfuforce_root_egg_infouscriptuegg_info_cmduegg_base_optionuegg_info_dir((u /tmp/pip-zej_zi-build/pip/req.pyurun_egg_info!s8	 	4		
			uInstallRequirement.run_egg_infou}
__file__ = __SETUP_PY__
from setuptools.command import egg_info
import pkg_resources
import os
import tokenize
def replacement_run(self):
    self.mkpath(self.egg_info)
    installer = self.distribution.fetch_build_egg
    for ep in pkg_resources.iter_entry_points('egg_info.writers'):
        # require=False is the change we're making:
        writer = ep.load(require=False)
        if writer:
            writer(self, ep.name, os.path.join(self.egg_info,ep.name))
    self.find_sources()
egg_info.egg_info.run = replacement_run
exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))
cCsy|jdk	r5|jj|�s%dS|jj|�S|jsDt�|j|�}tjj	|�sidSt
|�}|S(N(usatisfied_byuNoneuhas_metadatauget_metadatau
source_diruAssertionErroru
egg_info_pathuosupathuexistsuread_text_file(uselfufilenameudata((u /tmp/pip-zej_zi-build/pip/req.pyu
egg_info_databsu InstallRequirement.egg_info_datac	s|jdkr|jr$|j}ntjj|jd�}tj|�}|jr�g}x
tj|�D]�\�}}x-t	j
D]"}||kr�|j|�q�q�Wx�t|�D]�}tjj
tjj�|dd��s
tjj
tjj�|dd��r|j|�n|dks2|dkr�|j|�q�q�W|j�fdd	�|D��qjWd
d	�|D�}n|s�td||f��n|s�td||f��t|�dkr�|jd
dd��ntjj||d�|_ntjj|j|�S(Nupip-egg-infoubinupythonuScriptsu
Python.exeutestutestscs%g|]}tjj�|��qS((uosupathujoin(u.0udir(uroot(u /tmp/pip-zej_zi-build/pip/req.pyu
<listcomp>�s	u4InstallRequirement.egg_info_path.<locals>.<listcomp>cSs%g|]}|jd�r|�qS(u	.egg-info(uendswith(u.0uf((u /tmp/pip-zej_zi-build/pip/req.pyu
<listcomp>�s	u$No files/directories in %s (from %s)iukeycSs8|jtjj�tjjr3|jtjj�p6dS(Ni(ucountuosupathusepualtsep(ux((u /tmp/pip-zej_zi-build/pip/req.pyu<lambda>�su2InstallRequirement.egg_info_path.<locals>.<lambda>i(u_egg_info_pathuNoneueditableu
source_diruosupathujoinulistdiruwalkuvcsudirnamesuremoveulistuexistsuextenduInstallationErroruAssertionErrorulenusort(uselfufilenameubaseu	filenamesudirsufilesudir((urootu /tmp/pip-zej_zi-build/pip/req.pyu
egg_info_pathns6		''u InstallRequirement.egg_info_pathcCso|j|�}|sgSg}xI|j�D];}|j�}|s,|jd�rZq,n|j|�q,W|S(Nu#(u
egg_info_datau
splitlinesustripu
startswithuappend(uselfufilenameudatauresultuline((u /tmp/pip-zej_zi-build/pip/req.pyuegg_info_lines�su!InstallRequirement.egg_info_linescCs^t�}|jd�}|sAtjdt|jd���n|j|pPd�|j�S(NuPKG-INFOuNo PKG-INFO file found in %su(u
FeedParseru
egg_info_datauloggeruwarnudisplay_pathu
egg_info_pathufeeduclose(uselfupudata((u /tmp/pip-zej_zi-build/pip/req.pyupkg_info�s	#uInstallRequirement.pkg_infocCs
|jd�S(Nudependency_links.txt(uegg_info_lines(uself((u /tmp/pip-zej_zi-build/pip/req.pyudependency_links�su#InstallRequirement.dependency_linksu	\[(.*?)\]ccs�d}xx|jd�D]g}|jj|j��}|rO|jd�}qn|rx||krxtjd|�qn|VqWdS(Nurequires.txtiuskipping extra %s(uNoneuegg_info_linesu_requirements_section_reumatchulowerugroupuloggerudebug(uselfuextrasuin_extraulineumatch((u /tmp/pip-zej_zi-build/pip/req.pyurequirements�suInstallRequirement.requirementsccs5x.|jjD] \}}|dkr
|Vq
q
WdS(Nu==(urequspecs(uselfu	qualifieruversion((u /tmp/pip-zej_zi-build/pip/req.pyuabsolute_versions�su$InstallRequirement.absolute_versionscCs|j�dS(Nuversion(upkg_info(uself((u /tmp/pip-zej_zi-build/pip/req.pyuinstalled_version�su$InstallRequirement.installed_versioncCsk|jst�|j}||jkrDtjd||jf�n#tjdt|j�||f�dS(Nu'Requested %s, but installing version %su;Source in %s has version %s, which satisfies requirement %s(u
source_diruAssertionErroruinstalled_versionurequloggeruwarnudebugudisplay_path(uselfuversion((u /tmp/pip-zej_zi-build/pip/req.pyuassert_source_matches_version�s		u0InstallRequirement.assert_source_matches_versioncCs|js!tjd|j�dS|js0t�|js?t�|jjd�rUdSd|jkswtd|j��|js�dS|jjdd�\}}t	j
|�}|r�||j�}|r�|j|j�q|j|j�ndstd|j|f��dS(Nu>Cannot update repository at %s; repository location is unknownufile:u+ubad url: %riiu+Unexpected version control type (in %s): %s(
uurluloggeruinfou
source_dirueditableuAssertionErroru
startswithuupdateusplituvcsuget_backenduobtainuexport(uselfuobtainuvc_typeuurlubackenduvcs_backend((u /tmp/pip-zej_zi-build/pip/req.pyuupdate_editable�s(	"		u"InstallRequirement.update_editablecsd|j�s%td|jf��n|jp4|j}t|�}tjj|j	|j
��d}tjj|j	dj|j
�jd�dd���d}|jdt
jd�}|j
�d	}t|�}tjj|�}	tjj|�}
tjj|�}|	s|
rR|	r)|}n|}|j|�|jd
�r�x|jd
�j�D]4}
tjjtjj||
��}|j|�qaWq�|jd�r�|jd�r�|jd��ng�xz�fd
d�|jd�j�D�D]M}tjj|j	|�}|j|�|j|d�|j|d�q�Wq�n?|j	j|�r�|j|j	�tjjtjj|j	�d�}|j|d|�n�|r^t|d�}tjj|j�j��}|j�||j	kstd||j|j	f��|j|�tjjtjj|�d�}|j||j	�n3|r�x*tj j!|�D]}|j|�qwWn|jd�r5|j"d�r5x�|j#d�D]o}t$|�r�t%}nt&}|jtjj||��t'j(dkr�|jtjj||�d�q�q�Wn|jd�rJt)j*�}|j+t,|j-d���|j.d�rJx�|j/d�D]�\}}t$|�r�t%}nt&}|jtjj||��t'j(dkr�|jtjj||�d�|jtjj||�d�|jtjj||�d�q�q�WqJn|j0|�||_1dS(u�
        Uninstall the distribution currently satisfying this requirement.

        Prompts before removing or modifying files unless
        ``auto_confirm`` is True.

        Refuses to delete or modify files outside of ``sys.prefix`` -
        thus uninstallation within a virtual environment can only
        modify that virtual environment, even if the virtualenv is
        linked to global site-packages.

        u.Cannot uninstall requirement %s, not installedu	.egg-infou-Niu
.dist-infou-py%suu.egguinstalled-files.txtu
top_level.txtunamespace_packages.txtcs(g|]}|r|�kr|�qS(((u.0up(u
namespaces(u /tmp/pip-zej_zi-build/pip/req.pyu
<listcomp>s	u0InstallRequirement.uninstall.<locals>.<listcomp>u.pyu.pycueasy-install.pthu./uru;Egg-link %s does not match installed location of %s (at %s)uscriptsuwin32u.batuentry_points.txtuconsole_scriptsu.exeu
.exe.manifestu
-script.py(2ucheck_if_existsuUninstallationErrorunameusatisfied_byuconflicts_withuUninstallPathSetuosupathujoinulocationuegg_nameusplitureplaceu
pkg_resourcesuPY_MAJORu
egg_link_pathuexistsuadduhas_metadatauget_metadatau
splitlinesunormpathuendswithudirnameuadd_pthuopenunormcaseureadlineustripucloseuAssertionErrorupipuwheeluuninstallation_pathsumetadata_isdirumetadata_listdirudist_in_usersiteubin_userubin_pyusysuplatformuConfigParseruSafeConfigParserureadfpuFakeFileuget_metadata_linesuhas_sectionuitemsuremoveuuninstalled(uselfuauto_confirmudistupaths_to_removeupip_egg_info_pathudist_info_pathudebian_egg_info_pathueasy_install_eggudevelop_egg_linkupip_egg_info_existsudebian_egg_info_existsudist_info_existsu
egg_info_pathuinstalled_fileupathu
top_level_pkgueasy_install_pthufhulink_pointeruscriptubin_diruconfigunameuvalue((u
namespacesu /tmp/pip-zej_zi-build/pip/req.pyu	uninstall�s�
(	
!
	
.
		*	  -
uInstallRequirement.uninstallcCs4|jr|jj�ntjd|jf�dS(Nu'Can't rollback %s, nothing uninstalled.(uuninstalledurollbackuloggeruerroruproject_name(uself((u /tmp/pip-zej_zi-build/pip/req.pyurollback_uninstallYs		u%InstallRequirement.rollback_uninstallcCs4|jr|jj�ntjd|jf�dS(Nu%Can't commit %s, nothing uninstalled.(uuninstalleducommituloggeruerroruproject_name(uself((u /tmp/pip-zej_zi-build/pip/req.pyucommit_uninstall`s		u#InstallRequirement.commit_uninstallcCs�|jst�d}d|j|jf}tjj||�}tjj|�rt	dt
|�d�}|dkr�d}q|dkr�tj
dt
|��tj|�q|dkrt|�}tj
dt
|�t
|�f�tj||�qn|r�tj|dtj�}tjjtjj|j��}xtj|�D]�\}	}
}d|
kr~|
jd�nxl|
D]d}tjj|	|�}|j||�}
tj|jd	|
d	�}d|_|j|d�q�Wxb|D]Z}|tkrq�ntjj|	|�}|j||�}
|j||jd	|
�q�WqSW|j�tjd
8_tj dt
|��ndS(Nu	%s-%s.zipu/The file %s exists. (i)gnore, (w)ipe, (b)ackup uiuwubuDeleting %suBacking up %s to %supip-egg-infou/i�iuiuSaved %sT(uiuwubFi�(!u
source_diruAssertionErroruTrueunameuinstalled_versionuosupathujoinuexistsuask_path_existsudisplay_pathuFalseuloggeruwarnuremoveu
backup_dirushutilumoveuzipfileuZipFileuZIP_DEFLATEDunormcaseuabspathuwalku_clean_zip_nameuZipInfou
external_attruwritestruPIP_DELETE_MARKER_FILENAMEuwriteucloseuindentunotify(uselfu	build_dirucreate_archiveuarchive_nameuarchive_pathuresponseu	dest_fileuzipudirudirpathudirnamesu	filenamesudirnameunameuzipdirufilename((u /tmp/pip-zej_zi-build/pip/req.pyuarchivegsN		!
	
#
uInstallRequirement.archivecCse|j|tjj�s/td||f��|t|�dd�}|jtjjd�}|S(Nu$name %r doesn't start with prefix %riu/(u
startswithuosupathusepuAssertionErrorulenureplace(uselfunameuprefix((u /tmp/pip-zej_zi-build/pip/req.pyu_clean_zip_name�s
u"InstallRequirement._clean_zip_namecs�|jr|j||�dS|jrztjj|j�}tjj||j�|j	|jd�d|�d|_dStj
dd�}tjj|d�}z�tjg}|jd�|jd|j�|t|�dd	|g7}|js|d
g7}n�dk	r&|d�g7}n|jr?|dg7}n
|d
g7}t�r�|dtjjtjdddt��g7}ntjd|j�tjd7_z*t||d|jd|j dd �Wdtjd8_Xtjj"|�stjd|�dSd|_|jr$dS�fdd�}	t#|�}
xN|
D]1}|j$�}|j%d�rI|	|�}PqIqIWtj&d|�dS|
j'�g}
t#|�}
x[|
D]S}|j$�}tjj(|�r�|tjj)7}n|
jt*|	|�|��q�W|
j'�t#tjj|d�d�}
|
j+dj|
�d�|
j'�Wdtjj"|�rtj,|�ntj-|�XdS(!Nurootustrip_file_prefixu-recordupip-uinstall-record.txtu-cu�import setuptools, tokenize;__file__=%r;exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))uinstallu--recordu#--single-version-externally-managedu--rootu	--compileu--no-compileu--install-headersuincludeusiteupythonuRunning setup.py install for %siucwdu
filter_stdoutushow_stdoutuRecord file %s not foundcs4�dkstjj|�r#|St�|�SdS(N(uNoneuosupathuisabsuchange_root(upath(uroot(u /tmp/pip-zej_zi-build/pip/req.pyuprepend_root�su0InstallRequirement.install.<locals>.prepend_rootu	.egg-infou;Could not find .egg-info directory in install record for %suinstalled-files.txtuwu
TF(.ueditableuinstall_editableuis_wheelupipuwheelu
wheel_versionu
source_dirucheck_compatibilityunameumove_wheel_filesuTrueuinstall_succeededutempfileumkdtempuosupathujoinusysu
executableuappendusetup_pyulistuas_egguNoneu	pycompileurunning_under_virtualenvuprefixuget_python_versionuloggerunotifyuindentucall_subprocessu_filter_installuFalseuexistsuopenustripuendswithuwarnucloseuisdirusepumake_path_relativeuwriteuremoveurmdir(uselfuinstall_optionsuglobal_optionsurootustrip_file_prefixuversionu
temp_locationurecord_filenameuinstall_argsuprepend_rootufulineuegg_info_diru	new_linesufilename((urootu /tmp/pip-zej_zi-build/pip/req.pyuinstall�s�				
		
	
		


 
uInstallRequirement.installcCs�|jstjj|j�rWtjd|j�|jrKt|j�nd|_n|j
r�tjj|j
�r�t|j
�nd|_
dS(uVRemove the source files from this requirement, if they are marked
        for deletionuRemoving source in %sN(u	is_bundleuosupathuexistsudelete_marker_filenameuloggeruinfou
source_dirurmtreeuNoneu_temp_build_dir(uself((u /tmp/pip-zej_zi-build/pip/req.pyuremove_temporary_source�s	u*InstallRequirement.remove_temporary_sourcecCs�tjd|j�tjd7_zWttjdd|jgt|�ddgt|�d|j	d|j
d	d
�Wdtjd8_Xd|_
dS(NuRunning setup.py develop for %siu-cu�import setuptools, tokenize; __file__=%r; exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))udevelopu	--no-depsucwdu
filter_stdoutushow_stdoutFT(uloggerunotifyunameuindentucall_subprocessusysu
executableusetup_pyulistu
source_diru_filter_installuFalseuTrueuinstall_succeeded(uselfuinstall_optionsuglobal_options((u /tmp/pip-zej_zi-build/pip/req.pyuinstall_editables7u#InstallRequirement.install_editablecCsatj}xKddddddddgD]+}tj||j��r(tj}Pq(q(W||fS(	Nu^running .*u^writing .*u^creating .*u^[Cc]opying .*u^reading .*u4^removing .*\.egg-info' \(and everything under it\)$u^byte-compiling u7^warning: manifest_maker: standard file '-c' not found$(uloggeruNOTIFYureusearchustripuINFO(uselfulineuleveluregex((u /tmp/pip-zej_zi-build/pip/req.pyu_filter_installs	
	u"InstallRequirement._filter_installcCs|jdkrdSyJ|jjdkrG|jrG|jjdkrGdStj|j�|_Wn�tj	k
rxdSYn�tj
k
rtj|jj�}|jr�t|�r�||_q�t
�r�t|�r�td|j|jf��q�n	||_YnXdS(u�Find an installed distribution that satisfies or conflicts
        with this requirement, and set self.satisfied_by or
        self.conflicts_with appropriately.u
setuptoolsu
distributeuVWill not install to the user site because it will lack sys.path precedence to %s in %sNFT(urequNoneuFalseuproject_nameuconflicts_withuTrueu
pkg_resourcesuget_distributionusatisfied_byuDistributionNotFounduVersionConflictu
use_user_siteudist_in_usersiteurunning_under_virtualenvudist_in_site_packagesuInstallationErrorulocation(uselfu
existing_dist((u /tmp/pip-zej_zi-build/pip/req.pyucheck_if_existss(		u"InstallRequirement.check_if_existscCs|jod|jkS(Nu.whl(uurl(uself((u /tmp/pip-zej_zi-build/pip/req.pyuis_wheel=suInstallRequirement.is_wheelcCsu|jdk	r|jS|j}|s)dStjjtjj|d��phtjjtjj|d��|_|jS(Nupip-manifest.txtupyinstall-manifest.txtF(u
_is_bundleuNoneu_temp_build_diruFalseuosupathuexistsujoin(uselfubase((u /tmp/pip-zej_zi-build/pip/req.pyu	is_bundleAs	!$uInstallRequirement.is_bundlec
csGx|jD]�}tjj|�}x�tjD]�}d}}tjj||j�}tjj	|�r,|j
}t|�}|j�}	|j
�|�j|	�\}}Pq,q,W|r�d|||f}nd}t||ddd|ddd|dd�Vq
Wx=|jD]2}tjj|�}t||d|dd�Vq
WdS(	Nu%s+%s@%sueditableuurluupdateu
source_dirufrom_bundleTF(u_bundle_editable_dirsuosupathubasenameuvcsubackendsuNoneujoinubundle_fileuexistsunameuopenureaducloseuparse_vcs_bundle_fileuInstallRequirementuTrueuFalseu_bundle_build_dirs(
uselfudest_dirupackageuvcs_backenduurlurevuvcs_bundle_fileuvc_typeufpucontent((u /tmp/pip-zej_zi-build/pip/req.pyubundle_requirementsMs,
		
u&InstallRequirement.bundle_requirementsc
Cs�|j}|st�tjj|d�}tjj|d�}g}g}x#|||f|||fgD]\}}	}
tjj|�rjx�tj|�D]�}tjj|	|�}|
j|�tjj|�r�tj	d|||f�q�ntjj|	�s(tj
d|	�tj|	�ntj
tjj||�|�q�Wtj|�smtj|�qmqjqjWd|_||_||_dS(NusrcubuilduZThe directory %s (containing package %s) already exists; cannot move source from bundle %suCreating directory %s(u_temp_build_diruAssertionErroruosupathujoinuexistsulistdiruappenduloggeruwarnuinfoumakedirsushutilumoveurmdiruNoneu_bundle_build_dirsu_bundle_editable_dirs(
uselfudest_build_dirudest_src_dirubaseusrc_diru	build_dirubundle_build_dirsubundle_editable_dirsu
source_dirudest_dirudir_collectionudirnameudest((u /tmp/pip-zej_zi-build/pip/req.pyumove_bundle_filesgs4	
	#		u$InstallRequirement.move_bundle_filescCsAt|j|j|d|jd|jd|d|jd|�dS(Nuuseruhomeurootu	pycompileustrip_file_prefix(umove_wheel_filesunameurequ
use_user_siteu
target_diru	pycompile(uselfuwheeldirurootustrip_file_prefix((u /tmp/pip-zej_zi-build/pip/req.pyumove_wheel_files�s			u#InstallRequirement.move_wheel_filescCs%|jst�tjj|jt�S(N(u
source_diruAssertionErroruosupathujoinuPIP_DELETE_MARKER_FILENAME(uself((u /tmp/pip-zej_zi-build/pip/req.pyudelete_marker_filename�su)InstallRequirement.delete_marker_filenameNFT(1u__name__u
__module__u__qualname__uNoneuFalseuTrueu__init__uclassmethodu
from_editableu	from_lineu__str__u	from_pathubuild_locationucorrect_build_locationupropertyunameuurl_nameusetup_pyurun_egg_infou
_run_setup_pyu
egg_info_datau
egg_info_pathuegg_info_linesupkg_infoudependency_linksureucompileu_requirements_section_reurequirementsuabsolute_versionsuinstalled_versionuassert_source_matches_versionuupdate_editableu	uninstallurollback_uninstallucommit_uninstalluarchiveu_clean_zip_nameuinstalluremove_temporary_sourceuinstall_editableu_filter_installucheck_if_existsuis_wheelu	is_bundleubundle_requirementsumove_bundle_filesumove_wheel_filesudelete_marker_filename(u
__locals__((u /tmp/pip-zej_zi-build/pip/req.pyuInstallRequirement?sV-*
?*
	n)]!
uInstallRequirementcBsh|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dS(uRequirementscCsg|_i|_dS(N(u_keysu_dict(uself((u /tmp/pip-zej_zi-build/pip/req.pyu__init__�s	uRequirements.__init__cCs|jS(N(u_keys(uself((u /tmp/pip-zej_zi-build/pip/req.pyukeys�suRequirements.keyscs�fdd��jD�S(Ncsg|]}�j|�qS((u_dict(u.0ukey(uself(u /tmp/pip-zej_zi-build/pip/req.pyu
<listcomp>�s	u'Requirements.values.<locals>.<listcomp>(u_keys(uself((uselfu /tmp/pip-zej_zi-build/pip/req.pyuvalues�suRequirements.valuescCs
||jkS(N(u_keys(uselfuitem((u /tmp/pip-zej_zi-build/pip/req.pyu__contains__�suRequirements.__contains__cCs3||jkr"|jj|�n||j|<dS(N(u_keysuappendu_dict(uselfukeyuvalue((u /tmp/pip-zej_zi-build/pip/req.pyu__setitem__�suRequirements.__setitem__cCs|j|S(N(u_dict(uselfukey((u /tmp/pip-zej_zi-build/pip/req.pyu__getitem__�suRequirements.__getitem__cs0�fdd��j�D�}ddj|�S(Ncs0g|]&}dt|�t�|�f�qS(u%s: %s(urepr(u.0uk(uself(u /tmp/pip-zej_zi-build/pip/req.pyu
<listcomp>�s	u)Requirements.__repr__.<locals>.<listcomp>uRequirements({%s})u, (ukeysujoin(uselfuvalues((uselfu /tmp/pip-zej_zi-build/pip/req.pyu__repr__�suRequirements.__repr__N(
u__name__u
__module__u__qualname__u__init__ukeysuvaluesu__contains__u__setitem__u__getitem__u__repr__(u
__locals__((u /tmp/pip-zej_zi-build/pip/req.pyuRequirements�suRequirementsc
BsF|EeZdZd(d)d)d)d(d)d)d)d(d*d(dd�Zdd�Zdd�Zdd�Z	e
d	d
��Ze
dd��Ze
d
d��Z
dd�Zd)dd�Zdd�Zd)d)dd�Zd)dd�Zdd�Zdd�Zd(d)dd�Zfdd �Zd!d"�Zd#Zd$d%�Zd&d'�Zd(S(+uRequirementSetcCs�||_||_||_|r6tjj|�}n||_||_||_|
|_	t
�|_i|_g|_
|	|_g|_g|_g|_||_||_||_|p�t�|_|
|_||_dS(N(u	build_dirusrc_dirudownload_diruosupathu
expanduserudownload_cacheuupgradeuignore_installeduforce_reinstalluRequirementsurequirementsurequirement_aliasesuunnamed_requirementsuignore_dependenciesusuccessfully_downloadedusuccessfully_installedureqs_to_cleanupuas_eggu
use_user_siteu
target_diru
PipSessionusessionu	pycompileuwheel_download_dir(uselfu	build_dirusrc_dirudownload_dirudownload_cacheuupgradeuignore_installeduas_eggu
target_diruignore_dependenciesuforce_reinstallu
use_user_siteusessionu	pycompileuwheel_download_dir((u /tmp/pip-zej_zi-build/pip/req.pyu__init__�s,																	uRequirementSet.__init__cCsLdd�|jj�D�}|jddd��djdd�|D��S(NcSsg|]}|js|�qS((u
comes_from(u.0ureq((u /tmp/pip-zej_zi-build/pip/req.pyu
<listcomp>�s	u*RequirementSet.__str__.<locals>.<listcomp>ukeycSs
|jj�S(N(unameulower(ureq((u /tmp/pip-zej_zi-build/pip/req.pyu<lambda>�su(RequirementSet.__str__.<locals>.<lambda>u cSsg|]}t|j��qS((ustrureq(u.0ureq((u /tmp/pip-zej_zi-build/pip/req.pyu
<listcomp>�s	(urequirementsuvaluesusortujoin(uselfureqs((u /tmp/pip-zej_zi-build/pip/req.pyu__str__�suRequirementSet.__str__cCs�|j}|j|_|j|_|j|_|j|_|sR|jj|�ni|j|�r�td||j	|�|f��n||j
|<|j�|kr�||j|j�<ndS(Nu5Double requirement given: %s (already in %s, name=%r)(
unameuas_eggu
use_user_siteu
target_diru	pycompileuunnamed_requirementsuappenduhas_requirementuInstallationErroruget_requirementurequirementsulowerurequirement_aliases(uselfuinstall_requname((u /tmp/pip-zej_zi-build/pip/req.pyuadd_requirement�s	
uRequirementSet.add_requirementcCsCx<||j�fD](}||jks7||jkrdSqWdS(NTF(ulowerurequirementsurequirement_aliasesuTrueuFalse(uselfuproject_nameuname((u /tmp/pip-zej_zi-build/pip/req.pyuhas_requirement�suRequirementSet.has_requirementcCst|jj��p|jS(N(ulisturequirementsuvaluesuunnamed_requirements(uself((u /tmp/pip-zej_zi-build/pip/req.pyuhas_requirements�suRequirementSet.has_requirementscCsJtdd�|jj�D��r&dStdd�|jD��rFdSdS(Ncss|]}|jVqdS(N(ueditable(u.0ureq((u /tmp/pip-zej_zi-build/pip/req.pyu	<genexpr>�su/RequirementSet.has_editables.<locals>.<genexpr>css|]}|jVqdS(N(ueditable(u.0ureq((u /tmp/pip-zej_zi-build/pip/req.pyu	<genexpr>�sTF(uanyurequirementsuvaluesuTrueuunnamed_requirementsuFalse(uself((u /tmp/pip-zej_zi-build/pip/req.pyu
has_editables�s
"uRequirementSet.has_editablescCsg|jrctjj|j�|_tjj|j�r:dStjd�tdt	|j���ndS(Nu!Could not find download directoryu0Could not find or access download directory '%s'TF(udownload_diruosupathu
expanduseruexistsuTrueuloggerufataluInstallationErrorudisplay_pathuFalse(uself((u /tmp/pip-zej_zi-build/pip/req.pyuis_download�s	
uRequirementSet.is_downloadcCslxU||j�fD]A}||jkr3|j|S||jkr|j|j|SqWtd|��dS(NuNo project with the name %r(ulowerurequirementsurequirement_aliasesuKeyError(uselfuproject_nameuname((u /tmp/pip-zej_zi-build/pip/req.pyuget_requirementsuRequirementSet.get_requirementcCs8x1|jj�D] }|jd|�|j�qWdS(Nuauto_confirm(urequirementsuvaluesu	uninstallucommit_uninstall(uselfuauto_confirmureq((u /tmp/pip-zej_zi-build/pip/req.pyu	uninstallsuRequirementSet.uninstallcCs�t|j�}t|jj��}xc|s3|r�|rK|jd�}n|jd�}d}|jr�|jr�|j�|j	r�|j
r�|jo�t|j	�s�|j	|_
nd|_	q�d}n|j	r�tjd|�q�n|jr |jdkrE|j|j�|_qEn%|rE|j|j|j�|_n|jdk	r'tjj|j�r'td||jf��q'q'WdS(Niu<Requirement already satisfied (use --upgrade to upgrade): %su�Could not install requirement %s because source folder %s does not exist (perhaps --no-download was used without first running an equivalent install with --no-install?)TF(ulistuunnamed_requirementsurequirementsuvaluesupopuTrueuignore_installedueditableucheck_if_existsusatisfied_byuupgradeu
use_user_siteudist_in_usersiteuconflicts_withuNoneuFalseuloggerunotifyu
source_dirubuild_locationusrc_diru	build_diruis_downloaduosupathuisdiruInstallationError(uselfuunnamedureqsureq_to_installuinstall_needed((u /tmp/pip-zej_zi-build/pip/req.pyulocate_filess4
						%uRequirementSet.locate_filesc1Cs�t|j�}t|jj��}x�|s3|r�|rK|jd�}n|jd�}d}d}d}	|jr�|j	r�|j
�|jr`|jrW|j
r|jry|j||j�}
Wn?tk
r�d}d}Yqtk
r
tj�d}	YqX|
j|_n|s]|jo6t|j�sH|j|_nd|_q]q`d}n|jr�|r�tjd|�q�tjd|�q�n|j	r�tjd|�n^|r|jr|jj�jd�rtjdtt|j���qtjd|�ntjd	7_zld}d}|j	r�|jdkri|j|j �}
|
|_n	|j}
t!j"j#|j$�s�t%|j$�n|j&|j'�|j'r�|j(�|j)|j*�q1|j(�nV|r1|j|j$|j'�}
d}d}
|j+rnWt!j"j#t!j"j,|
d
��rUt-t.j/d||
f���n|jdkr�|	rs|	�n|j|d|j�}
nt0|j�}
|
s�t1�|
rcyY|
j2j3t4�r�|j5r�|j5}d}n|j*}|j'}|j6|
|
||�Wqit7k
r_}z5tj8d
||f�t9d|||
f��WYdd}~XqiXnd}|r1|j:}|
o�|
j2j3t4�}|r�|j;|j$|j �x�|j<�D] }|j=|�|j>|�q�Wn�|j'r3|
|_|s|j(�n|
r�|
j?t@jAkr�|j)|j*�q�ny|rQ|
|_|
j|_n[|
|_|j(�|r}|j(dd�n|jB�|r�|jr�|jC|�d}n|js�|j
�n|jr.|js�|jr|jo�t|j�s|j|_nd|_q+tjd|�d}q.q1n|r�ttDjE|
��d}|jFsx|jG�|_F|j>|�n|jHsxd|jI|jJ�D]M}|jK|jL�r�q�ntMtN|�|�}|j=|�|j>|�q�Wqn&|s|jO|jP�|jJr*tjddj,|jJ��n|jHs�x�|j|jJ�D]�}ytDjQjR|�jL}Wn?tSk
r�tj�d}tjTd|||f�wFYnX|jK|�r�qFntM||�}|j=|�|j>|�qFWn|jK|jU�s|j>|�qn|sE|j's/|jVdk	rE|jWj=|�qEn|r�|jXj=|�|r�|jr�|jjd�r�|jC|�q�nWdtjd	8_Xq'WdS(uGPrepare process. Create temp directories, download and/or unpack files.iiu"Requirement already up-to-date: %su<Requirement already satisfied (use --upgrade to upgrade): %suObtaining %sufile:uUnpacking %suDownloading/unpacking %siusetup.pyu�
                          pip can't proceed with requirement '%s' due to a pre-existing build directory.
                           location: %s
                          This is likely due to a previous installation that failed.
                          pip is being responsible and not assuming it can delete this.
                          Please delete it and try again.
                        uupgradeu4Could not install requirement %s because of error %suDCould not install requirement %s because of HTTP error %s for URL %sNuforce_root_egg_infou!Installing extra requirements: %ru,u.Invalid requirement: %r (%s) in requirement %sufile:///TF(Yulistuunnamed_requirementsurequirementsuvaluesupopuTrueuFalseuNoneuignore_installedueditableucheck_if_existsusatisfied_byuupgradeuforce_reinstalluurlufind_requirementuBestVersionAlreadyInstalleduDistributionNotFoundusysuexc_infou
use_user_siteudist_in_usersiteuconflicts_withuloggerunotifyuloweru
startswithudisplay_pathuurl_to_pathuindentu
source_dirubuild_locationusrc_diruosupathuexistsu	build_diru_make_build_diruupdate_editableuis_downloadurun_egg_infouarchiveudownload_dirufrom_bundleujoinuPreviousBuildDirErrorutextwrapudedentuLinkuAssertionErrorufilenameuendswithu	wheel_extuwheel_download_diru
unpack_urlu	HTTPErrorufataluInstallationErroru	is_bundleumove_bundle_filesubundle_requirementsuappenduadd_requirementuschemeuvcsuall_schemesuassert_source_matches_versionucopy_to_build_diru
pkg_resourcesufind_distributionsurequas_requirementuignore_dependenciesurequiresuextrasuhas_requirementuproject_nameuInstallRequirementustruadd_dependency_linksudependency_linksuRequirementuparseu
ValueErroruerrorunameu_temp_build_dirureqs_to_cleanupusuccessfully_downloaded(uselfufinderuforce_root_egg_infoubundleuunnamedureqsureq_to_installuinstallubest_installedu	not_founduurlu	is_bundleuis_wheelulocationuunpackudownload_dirudo_downloaduexcueusubrequdisturequname((u /tmp/pip-zej_zi-build/pip/req.pyu
prepare_files:sV
		


					!#			

	!								)	
		
		


		
					
	 	

	!uRequirementSet.prepare_filescCs�tjd�tjd7_x|jD]}|j�q&Wg}|j�r_|j|j�n|rx|j|j�nx>|D]6}t	j
j|�rtjd|�t
|�qqWtjd8_dS(uClean up files, remove builds.uCleaning up...iuRemoving temporary dir %s...N(uloggerunotifyuindentureqs_to_cleanupuremove_temporary_sourceu_pip_has_created_build_diruappendu	build_dirusrc_diruosupathuexistsuinfourmtree(uselfubundleurequ
remove_dirudir((u /tmp/pip-zej_zi-build/pip/req.pyu
cleanup_files's

uRequirementSet.cleanup_filescCs1|jtko0tjjtjj|jt��S(N(u	build_dirubuild_prefixuosupathuexistsujoinuPIP_DELETE_MARKER_FILENAME(uself((u /tmp/pip-zej_zi-build/pip/req.pyu_pip_has_created_build_dir>su)RequirementSet._pip_has_created_build_dircCs�|jr|jp|j}tjd|j|f�tjj||j�}t	j
|j|�tdd|dgd|dd�dS(NuCopying %s to %supythonu%s/setup.pyucleanucwducommand_descupython setup.py clean(
ueditableusrc_diru	build_diruloggeruinfounameuosupathujoinushutilucopytreeu
source_dirucall_subprocess(uselfureq_to_installu
target_dirudest((u /tmp/pip-zej_zi-build/pip/req.pyucopy_to_build_dirBsu RequirementSet.copy_to_build_dircCs�|dkr|j}nt|�rL|r3|}n|}t|||�nat|�r~t|||�|r�t|�q�n/t|||j||j	�|r�t|�ndS(N(
uNoneudownload_diru
is_vcs_urluunpack_vcs_linkuis_file_urluunpack_file_urluwrite_delete_marker_fileuunpack_http_urludownload_cacheusession(uselfulinkulocationudownload_diru
only_downloaduloc((u /tmp/pip-zej_zi-build/pip/req.pyu
unpack_urlJs&	
uRequirementSet.unpack_urlc"Osdd�|jj�D�}tjjd�}xI|D]A}|jdkr5|j|kr5|j|�|j|�q5q5W|r�t	j
ddjdd�|D���nt	jd7_zCx<|D]4}|jd	kr0y=tjjd
�}	tj
d�}
|
|	kr|
|_nWq0tjk
r,Yq0Xn|jr�t	j
d|j�t	jd7_z|jdd�Wd
t	jd8_Xny|j||||�Wn+|jr�|jr�|j�n�Yn X|jr�|jr�|j�n|j�q�WWd
t	jd8_X||_d
S(uRInstall everything in this set (after having downloaded and unpacked the packages)cSsg|]}|js|�qS((usatisfied_by(u.0ur((u /tmp/pip-zej_zi-build/pip/req.pyu
<listcomp>ks	u*RequirementSet.install.<locals>.<listcomp>udistribute>=0.7u
distributeu!Installing collected packages: %su, cSsg|]}|j�qS((uname(u.0ureq((u /tmp/pip-zej_zi-build/pip/req.pyu
<listcomp>{s	iu
setuptoolsudistribute<0.7uFound existing installation: %suauto_confirmNT(urequirementsuvaluesu
pkg_resourcesuRequirementuparseunameuinstalled_versionuremoveuappenduloggerunotifyujoinuindentuget_distributionuconflicts_withuDistributionNotFoundu	uninstalluTrueuinstalluinstall_succeededurollback_uninstallucommit_uninstalluremove_temporary_sourceusuccessfully_installed(uselfuinstall_optionsuglobal_optionsuargsukwargsu
to_installudistribute_requrequrequirementudistribute_requirementuexisting_distribute((u /tmp/pip-zej_zi-build/pip/req.pyuinstallisJ	

*
		

uRequirementSet.installcCs�tj|dtj�}g}xJ|jdf|jdffD]*\}}tjjtjj|��}x�tj	|�D]�\}}}x�t
jD]�}	|	�}
d}}|
j
|kr�xR|D]}
|j|
�r�Pq�q�W|
jtjj||��\}}|j|�|
j}|
ji|d6|d6}|j|
j
�Pq�q�Wd|kre|jd�nxQ|D]I}tjj||�}|j||�}|j|d|dd�qlWx_|D]W}|tkr�q�ntjj||�}|j||�}|j||d|�q�W|rwtjj||�}|j||�}|j|d||�qwqwWq=W|jd	|j��|j�dS(
Nuwubuildusrcuurlurevupip-egg-infou/uupip-manifest.txt(uzipfileuZipFileuZIP_DEFLATEDu	build_dirusrc_diruosupathunormcaseuabspathuwalkuvcsubackendsuNoneudirnameu
startswithuget_infoujoinuappendubundle_fileuguideuremoveu_clean_zip_nameuwritestruPIP_DELETE_MARKER_FILENAMEuwriteubundle_requirementsuclose(uselfubundle_filenameuzipuvcs_dirsudirubasenameudirpathudirnamesu	filenamesubackenduvcs_backenduvcs_urluvcs_revuvcs_diruvcs_bundle_fileu	vcs_guideudirnameunameufilename((u /tmp/pip-zej_zi-build/pip/req.pyu
create_bundle�sL+	


	
 
#uRequirementSet.create_bundleu�# This is a pip bundle file, that contains many source packages
# that can be installed as a group.  You can install this like:
#     pip this_file.zip
# The rest of the file contains a list of all the packages included:
cCs�|jg}xAdd�|jj�D�D]#}|jd|j|jf�q)W|jd�xAdd�|jj�D�D]#}|jd|j|jf�qzWdj|�S(NcSsg|]}|js|�qS((u
comes_from(u.0ureq((u /tmp/pip-zej_zi-build/pip/req.pyu
<listcomp>�s	u6RequirementSet.bundle_requirements.<locals>.<listcomp>u%s==%s
uC# These packages were installed to satisfy the above requirements:
cSsg|]}|jr|�qS((u
comes_from(u.0ureq((u /tmp/pip-zej_zi-build/pip/req.pyu
<listcomp>�s	u(u
BUNDLE_HEADERurequirementsuvaluesuappendunameuinstalled_versionujoin(uselfupartsureq((u /tmp/pip-zej_zi-build/pip/req.pyubundle_requirements�s#!
#!u"RequirementSet.bundle_requirementscCse|j|tjj�s/td||f��|t|�dd�}|jtjjd�}|S(Nu$name %r doesn't start with prefix %riu/(u
startswithuosupathusepuAssertionErrorulenureplace(uselfunameuprefix((u /tmp/pip-zej_zi-build/pip/req.pyu_clean_zip_name�s
uRequirementSet._clean_zip_nameNFT(u__name__u
__module__u__qualname__uNoneuFalseuTrueu__init__u__str__uadd_requirementuhas_requirementupropertyuhas_requirementsu
has_editablesuis_downloaduget_requirementu	uninstallulocate_filesu
prepare_filesu
cleanup_filesu_pip_has_created_build_dirucopy_to_build_diru
unpack_urluinstallu
create_bundleu
BUNDLE_HEADERubundle_requirementsu_clean_zip_name(u
__locals__((u /tmp/pip-zej_zi-build/pip/req.pyuRequirementSet�s2		
'�E7uRequirementSetcCstj|�t|�dS(N(uosumakedirsuwrite_delete_marker_file(u	build_dir((u /tmp/pip-zej_zi-build/pip/req.pyu_make_build_dir�s
u_make_build_diru^(http|https|file):ccs|dkrt�}nd}|r-|jnd}|rKtj|�}ntjjtjj|��}t	|d|d|�\}}xzt
|j��D]f\}	}
|	d7}	|
j�}
tj
dd|
�}
|
s�|
jd�r�q�n|r|j|
�rq�n|
jd�s&|
jd�r�|
jd�rN|
d	d�j�}n%|
td�d�j�jd
�}tj|�r�tj||�}n3tj|�s�tjjtjj|�|�}nx3t||d|d|d|�D]}|Vq�Wq�|
jd�s|
jd
�rq�|
jd�s=|
jd�r�|
jd�re|
d	d�j�}
n%|
td�d�j�jd
�}
tjj||
�}
tjj|
�r�|
}
n|r|jj|
�qq�|
jd�s�|
jd�rY|
jd�r|
d	d�j�}
n%|
td�d�j�jd
�}
|r|
g|_qq�|
jd�r�|
td�d�j�jd
�}
|r|jj|
�qq�|
jd�r�d!|_q�|
jd�r�g|_q�|
jd�r:|
td�d�j�jd
�}
|jtt|
�j �g�O_q�|
jd�rUd!|_!q�|
jd�rgq�|
jd�ryq�|
jd�r�|
td�d�j�jd
�}
|j"tt|
�j �g�O_"q�|
jd�r/|
td�d�j�jd
�}
|j"tt|
�j �g�O_"q�d||	f}|
jd�s]|
jd�r�|
jd�r�|
d	d�j�}
n%|
td�d�j�jd
�}
t#j$|
d|d|r�|j%nd�}n$t#j&|
|dt'|d d��}|Vq�WdS("Nu
comes_fromusessioniu
(^|\s)#.*$uu#u-ru
--requirementiu=uoptionsu-Zu--always-unzipu-fu--find-linksu-iu--index-urlu--extra-index-urlu--use-wheelu
--no-indexu--allow-externalu--allow-all-externalu--no-allow-externalu--no-allow-insecureu--allow-insecureu--allow-unverifiedu-r %s (line %s)u-eu
--editableudefault_vcsuprereleasesupreT((uNoneu
PipSessionuskip_requirements_regexureucompileuosupathudirnameuabspathuget_file_contentu	enumerateu
splitlinesustripusubu
startswithusearchulenu
_scheme_reuurlparseuurljoinujoinuparse_requirementsulstripuexistsu
find_linksuappendu
index_urlsuTrueu	use_wheeluallow_externalusetunormalize_nameuloweruallow_all_externaluallow_unverifieduInstallRequirementu
from_editableudefault_vcsu	from_lineugetattr(ufilenameufinderu
comes_fromuoptionsusessionu
skip_matchu
skip_regexu
reqs_file_dirucontentuline_numberulineureq_urluitemurelative_to_reqs_fileureq((u /tmp/pip-zej_zi-build/pip/req.pyuparse_requirementss�	
%$(%	%%%'%'%'%'$uparse_requirementscCs.tjd|�}|r*|jd�}n|S(u2
        Strip req postfix ( -dev, 0.2, etc )
    u^(.*?)(?:-dev|-\d.*)$i(ureusearchugroup(urequmatch((u /tmp/pip-zej_zi-build/pip/req.pyu_strip_postfixgsu_strip_postfixcCspdd�|jdd�djd�D�}d}|ddkrO|d}n|dd
krl|d}n|S(NcSsg|]}|r|�qS(((u.0up((u /tmp/pip-zej_zi-build/pip/req.pyu
<listcomp>ts	u'_build_req_from_url.<locals>.<listcomp>u#iiu/iutagsubranchesutagubranchiutrunki����(utagsubranchesutagubranchi����i����i����(usplituNone(uurlupartsureq((u /tmp/pip-zej_zi-build/pip/req.pyu_build_req_from_urlrs,

u_build_req_from_urlcCs{tjd�}|j|�}|rwt�}xC|D];}|\}}||kretd|��n|||<q4W|SdS(uz
        This method generates a dictionary of the query string
        parameters contained in a given editable URL.
    u([\?#&](?P<name>[^&=]+)=(?P<value>[^&=]+)u%s option already definedN(ureucompileufindalludictu	ExceptionuNone(urequregexpumatcheduretuoptionunameuvalue((u /tmp/pip-zej_zi-build/pip/req.pyu_build_editable_options}s	
u_build_editable_optionsc
Csm|}d}tjd|�}|rE|jd�}|jd�}n|}tjj|�r�tjjtjj|d��s�t	d|��nt
|�}n|j�jd�r�|r�d|t
jjd|�jfSd|dfSnx;tD]3}|j�jd|�r�d	||f}Pq�q�Wd
|kr_|rL|d
|}q_t	d|��n|jd
d�dj�}tj|�s�d
|djdd�tjD��d}t	|��nyt|�}	Wn8tk
rtj�d}
t	d||
f��YnX|	s"d|	krJt|�}|sTt	d|��qTn
|	d}t|�}|||	fS(uSParses svn+http://blahblah@rev#egg=Foobar into a requirement
    (Foobar) and a URLu^(.+)(\[[^\]]+\])$iiusetup.pyu;Directory %r is not installable. File 'setup.py' not found.ufile:u__placeholder__u%s:u%s+%su+ub%s should either be a path to a local project or a VCS url beginning with svn+, git+, hg+, or bzr+iuFor --editable=%s only u, cSsg|]}|jd�qS(u+URL(uname(u.0ubackend((u /tmp/pip-zej_zi-build/pip/req.pyu
<listcomp>�s	u"parse_editable.<locals>.<listcomp>u is currently supportedu*--editable=%s error in editable options:%sueggu@--editable=%s is not the right format; it must have #egg=PackageN(uNoneureumatchugroupuosupathuisdiruexistsujoinuInstallationErrorupath_to_urluloweru
startswithu
pkg_resourcesuRequirementuparseuextrasuvcsusplituget_backendubackendsu_build_editable_optionsu	Exceptionusysuexc_infou_build_req_from_urlu_strip_postfix(
ueditable_requdefault_vcsuurluextrasumu
url_no_extrasuversion_controluvc_typeu
error_messageuoptionsumessageurequpackage((u /tmp/pip-zej_zi-build/pip/req.pyuparse_editable�sT! 
$

uparse_editablecBs�|EeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
ddd�Zdd�Z
dd�ZdS(uUninstallPathSetuMA set of file paths to be removed in the uninstallation of a
    requirement.cCs@t�|_t�|_i|_||_d|_g|_dS(N(usetupathsu_refuseupthudistuNoneusave_diru_moved_paths(uselfudist((u /tmp/pip-zej_zi-build/pip/req.pyu__init__�s			uUninstallPathSet.__init__cCs
t|�S(us
        Return True if the given path is one we are permitted to
        remove/modify, False otherwise.

        (uis_local(uselfupath((u /tmp/pip-zej_zi-build/pip/req.pyu
_permitted�suUninstallPathSet._permittedcCsFt|j�sBtjd|jjt|jj�tjf�dSdS(Nu1Not uninstalling %s at %s, outside environment %sFT(u
dist_is_localudistuloggerunotifyuproject_nameunormalize_pathulocationusysuprefixuFalseuTrue(uself((u /tmp/pip-zej_zi-build/pip/req.pyu_can_uninstall�s
	&uUninstallPathSet._can_uninstallcCs�t|�}tjj|�s"dS|j|�rD|jj|�n|jj|�tjj|�ddkr�t	r�|jt
j|��ndS(Niu.py(unormalize_pathuosupathuexistsu
_permittedupathsuaddu_refuseusplitextuuses_pycacheuimpucache_from_source(uselfupath((u /tmp/pip-zej_zi-build/pip/req.pyuadd�s"uUninstallPathSet.addcCskt|�}|j|�rW||jkr@t|�|j|<n|j|j|�n|jj|�dS(N(unormalize_pathu
_permittedupthuUninstallPthEntriesuaddu_refuse(uselfupth_fileuentry((u /tmp/pip-zej_zi-build/pip/req.pyuadd_pth�suUninstallPathSet.add_pthcsYt�}xIt|dt�D]5�t�fdd�|D��s|j��qqW|S(u�Compact a path set to contain the minimal number of paths
        necessary to contain all paths in the set. If /a/path/ and
        /a/path/to/a/file.txt are both in the set, leave only the
        shorter path.ukeycsJg|]@}�j|�oC�t|jtjj��tjjk�qS((u
startswithulenurstripuosupathusep(u.0u	shortpath(upath(u /tmp/pip-zej_zi-build/pip/req.pyu
<listcomp>
s	u,UninstallPathSet.compact.<locals>.<listcomp>(usetusortedulenuanyuadd(uselfupathsushort_paths((upathu /tmp/pip-zej_zi-build/pip/req.pyucompacts	
uUninstallPathSet.compactcCs5tjj|jtjj|�djtjj��S(Ni(uosupathujoinusave_diru
splitdriveulstripusep(uselfupath((u /tmp/pip-zej_zi-build/pip/req.pyu_stashs	uUninstallPathSet._stashcCs�|j�sdS|js4tjd|jj�dStjd|jj�tjd7_t|j|j��}z6|r�d}n-x|D]}tj|�q�Wt	dd�}|j
r�tjd�x*|j|j
�D]}tj|�q�Wn|dkr�tjd	d
dd�|_
xK|D]C}|j|�}tjd
|�|jj|�t||�q"Wx!|jj�D]}|j�qyWtjd|jj�nWdtjd8_XdS(u[Remove paths in ``self.paths`` with confirmation (unless
        ``auto_confirm`` is True).Nu7Can't uninstall '%s'. No files were found to uninstall.uUninstalling %s:iuyuProceed (y/n)? unu.Not removing or modifying (outside of prefix):usuffixu
-uninstalluprefixupip-uRemoving file or directory %suSuccessfully uninstalled %s(uyun(u_can_uninstallupathsuloggerunotifyudistuproject_nameuindentusorteducompactuasku_refuseutempfileumkdtempusave_diru_stashuinfou_moved_pathsuappendurenamesupthuvaluesuremove(uselfuauto_confirmupathsuresponseupathunew_pathupth((u /tmp/pip-zej_zi-build/pip/req.pyuremoves<		
	

uUninstallPathSet.removecCs�|jdkr*tjd|jj�dStjd|jj�x>|jD]3}|j	|�}tj
d|�t||�qKWx|jD]}|j
�q�WdS(u1Rollback the changes previously made by remove().u'Can't roll back %s; was not uninstalleduRolling back uninstall of %suReplacing %sNF(usave_diruNoneuloggeruerrorudistuproject_nameuFalseunotifyu_moved_pathsu_stashuinfourenamesupthurollback(uselfupathutmp_pathupth((u /tmp/pip-zej_zi-build/pip/req.pyurollback9suUninstallPathSet.rollbackcCs5|jdk	r1t|j�d|_g|_ndS(u?Remove temporary save dir: rollback will no longer be possible.N(usave_diruNoneurmtreeu_moved_paths(uself((u /tmp/pip-zej_zi-build/pip/req.pyucommitFs
	uUninstallPathSet.commitNF(u__name__u
__module__u__qualname__u__doc__u__init__u
_permittedu_can_uninstalluadduadd_pthucompactu_stashuFalseuremoveurollbackucommit(u
__locals__((u /tmp/pip-zej_zi-build/pip/req.pyuUninstallPathSet�s	
%
uUninstallPathSetcBsD|EeZdZdd�Zdd�Zdd�Zdd�Zd	S(
uUninstallPthEntriescCsGtjj|�s%td|��n||_t�|_d|_dS(Nu.Cannot remove entries from nonexistent file %s(	uosupathuisfileuUninstallationErrorufileusetuentriesuNoneu_saved_lines(uselfupth_file((u /tmp/pip-zej_zi-build/pip/req.pyu__init__Os
	uUninstallPthEntries.__init__cCsatjj|�}tjdkrMtjj|�drM|jdd�}n|jj|�dS(Nuwin32iu\u/(	uosupathunormcaseusysuplatformu
splitdriveureplaceuentriesuadd(uselfuentry((u /tmp/pip-zej_zi-build/pip/req.pyuaddVs&uUninstallPthEntries.addcCs�tjd|j�t|jd�}|j�}||_|j�tdd�|D��rgd}nd}xR|jD]G}y,tjd|�|j	t
||��Wqwtk
r�YqwXqwWt|jd�}|j|�|j�dS(	NuRemoving pth entries from %s:urbcss!|]}td�|kVqdS(u
N(ub(u.0uline((u /tmp/pip-zej_zi-build/pip/req.pyu	<genexpr>gsu-UninstallPthEntries.remove.<locals>.<genexpr>u
u
uRemoving entry: %suwb(
uloggeruinfoufileuopenu	readlinesu_saved_linesucloseuanyuentriesuremoveubu
ValueErroru
writelines(uselfufhulinesuendlineuentry((u /tmp/pip-zej_zi-build/pip/req.pyuremove`s"	
	
	
uUninstallPthEntries.removecCsk|jdkr'tjd|j�dStjd|j�t|jd�}|j|j�|j	�dS(Nu.Cannot roll back changes to %s, none were madeu!Rolling %s back to previous stateuwbFT(u_saved_linesuNoneuloggeruerrorufileuFalseuinfouopenu
writelinesucloseuTrue(uselfufh((u /tmp/pip-zej_zi-build/pip/req.pyurollbackus
uUninstallPthEntries.rollbackN(u__name__u
__module__u__qualname__u__init__uadduremoveurollback(u
__locals__((u /tmp/pip-zej_zi-build/pip/req.pyuUninstallPthEntriesNs
uUninstallPthEntriescBs>|EeZdZdZdd�Zdd�Zdd�ZdS(	uFakeFileuQWrap a list of lines in an object with readline() to make
    ConfigParser happy.cCsdd�|D�|_dS(Ncss|]}|VqdS(N((u.0ul((u /tmp/pip-zej_zi-build/pip/req.pyu	<genexpr>�su$FakeFile.__init__.<locals>.<genexpr>(u_gen(uselfulines((u /tmp/pip-zej_zi-build/pip/req.pyu__init__�suFakeFile.__init__cCsTy7yt|j�SWntk
r5|jj�SYnXWntk
rOdSYnXdS(Nu(unextu_genu	NameErroru
StopIteration(uself((u /tmp/pip-zej_zi-build/pip/req.pyureadline�s

uFakeFile.readlinecCs|jS(N(u_gen(uself((u /tmp/pip-zej_zi-build/pip/req.pyu__iter__�suFakeFile.__iter__N(u__name__u
__module__u__qualname__u__doc__u__init__ureadlineu__iter__(u
__locals__((u /tmp/pip-zej_zi-build/pip/req.pyuFakeFile�s	uFakeFile(cuemail.parseru
FeedParseruosuimpulocaleureusysushutilutempfileutextwrapuzipfileudistutils.utiluchange_rootu
pip.locationsubin_pyurunning_under_virtualenvuPIP_DELETE_MARKER_FILENAMEuwrite_delete_marker_fileubin_userupip.exceptionsuInstallationErroruUninstallationErroruUnsupportedWheeluBestVersionAlreadyInstalleduInvalidWheelFilenameuDistributionNotFounduPreviousBuildDirErrorupip.vcsuvcsupip.loguloggerupip.utiludisplay_pathurmtreeuaskuask_path_existsu
backup_diruis_installable_diruis_localu
dist_is_localudist_in_usersiteudist_in_site_packagesurenamesunormalize_pathu
egg_link_pathumake_path_relativeucall_subprocessu
is_prereleaseunormalize_nameupip.backwardcompatuurlparseuurllibuuses_pycacheuConfigParserustring_typesu	HTTPErroruget_python_versionubu	pip.indexuLinkubuild_prefixupip.downloadu
PipSessionuget_file_contentuis_urluurl_to_pathupath_to_urluis_archive_fileuunpack_vcs_linku
is_vcs_urluis_file_urluunpack_file_urluunpack_http_urlu	pip.wheelupipumove_wheel_filesuWheelu	wheel_extupip._vendoru
pkg_resourcesusixuread_text_fileuobjectuInstallRequirementuRequirementsuRequirementSetu_make_build_dirucompileuIu
_scheme_reuNoneuparse_requirementsu_strip_postfixu_build_req_from_urlu_build_editable_optionsuparse_editableuUninstallPathSetuUninstallPthEntriesuFakeFile(((u /tmp/pip-zej_zi-build/pip/req.pyu<module>sT(4p:L���W��N	cA|2site-packages/pip/__pycache__/locations.cpython-33.pyc000064400000014047151733463510016720 0ustar00�
7�Re:c@sRdZddlZddlZddlZddlZddlmZmZddlZddl	m
Z
mZmZddl
ZdZdZdd�Zd	d
�Zdd�Zd
d�Zdd�Ze�rejjejd�Zejjejd�ZnJe�Zyejjej�d�ZWnek
rMejd�YnXejjejje��Zejje�Ze
�Z ejj!d�Z"ej#dkrqejjejd�Z$er�ejjed�ndZ&ejj'e$�s/ejjejd�Z$er&ejjed�ndZ&nejje"d�Z(ejje(d�Z)ejje(d�Z*n�ejjejd�Z$er�ejjed�ndZ&ejje"d�Z(ejje(d�Z)ejje(d�Z*ej#dd�dkr9ejdd�d kr9d!Z$ejje"d"�Z*nd%ddd#d$�Z,dS(&u7Locations where we look for configs, install stuff, etciN(uinstalluSCHEME_KEYS(uget_python_libuget_path_uidu	user_siteu�This file is placed here by pip to indicate the source was put
here by pip.

Once this package is successfully installed this source code will be
deleted (unless you remove this file).
upip-delete-this-directory.txtcCs?tjj|t�}t|d�}|jt�|j�dS(u?
    Write the pip delete marker file into this directory.
    uwN(uosupathujoinuPIP_DELETE_MARKER_FILENAMEuopenuwriteuDELETE_MARKER_MESSAGEuclose(u	directoryufilepathu	marker_fp((u&/tmp/pip-zej_zi-build/pip/locations.pyuwrite_delete_marker_files
uwrite_delete_marker_filecCs9ttd�rdStjttdtj�kr5dSdS(uM
    Return True if we're running inside a virtualenv, False otherwise.

    ureal_prefixubase_prefixTF(uhasattrusysuTrueuprefixugetattruFalse(((u&/tmp/pip-zej_zi-build/pip/locations.pyurunning_under_virtualenv s
urunning_under_virtualenvcCsYtjjtjjtj��}tjj|d�}t�rUtjj|�rUdSdS(u?
    Return True if in a venv and no system site packages.
    uno-global-site-packages.txtNT(
uosupathudirnameuabspathusiteu__file__ujoinurunning_under_virtualenvuisfileuTrue(usite_mod_diruno_global_file((u&/tmp/pip-zej_zi-build/pip/locations.pyuvirtualenv_no_global-s!uvirtualenv_no_globalcCs;tjdkrtj�Sddl}|jtj��jS(u8 Returns the effective username of the current process. uwin32iN(	usysuplatformugetpassugetuserupwdugetpwuiduosugeteuidupw_name(upwd((u&/tmp/pip-zej_zi-build/pip/locations.pyu__get_username7s
u__get_usernamecCs�tjjtj�dt��}tjdkr5|Sytj|�t	|�Wn�t
k
r�d}yt|�}Wnt
k
r�d}YnX|tj
�kr�d|}t|�tdd�tjj|��nYnX|S(u Returns a safe build_prefix upip_build_%suwin32uSThe temporary folder for building (%s) is either not owned by you, or is a symlink.u0pip will not work until the temporary folder is uAeither deleted or is a real directory owned by your user account.N(uosupathujoinutempfileu
gettempdiru__get_usernameusysuplatformumkdiruwrite_delete_marker_fileuOSErroruNoneuget_path_uidugeteuiduprintupipu
exceptionsuInstallationError(upathufile_uidumsg((u&/tmp/pip-zej_zi-build/pip/locations.pyu_get_build_prefix>s*




u_get_build_prefixubuildusrcu=The folder you are executing pip from can no longer be found.u~uwin32uScriptsubinupipupip.iniupip.logu.pipupip.confiudarwiniu/System/Library/u/usr/local/binuLibrary/Logs/pip.logc	Cs8ddlm}i}|i|d6�}|j�|jddd�}|pT|j|_|pf|j|_|px|j|_|j�x%t	D]}t
|d|�||<q�Wt�r4tj
jtjddd	tjd
d�|�|d<|d
k	r4tj
j|tj
j|d�d
d
��|d<q4n|S(u+
    Return a distutils install scheme
    i(uDistributionunameuinstallucreateuinstall_uincludeusiteupythonNiuheadersiT(udistutils.distuDistributionuparse_config_filesuget_command_objuTrueuuseruhomeurootufinalize_optionsuSCHEME_KEYSugetattrurunning_under_virtualenvuosupathujoinusysuprefixuversionuNoneuabspath(	u	dist_nameuuseruhomeurootuDistributionuschemeuduiukey((u&/tmp/pip-zej_zi-build/pip/locations.pyudistutils_scheme�s,


	
	-udistutils_schemeF(-u__doc__usysusiteuosutempfileudistutils.command.installuinstalluSCHEME_KEYSugetpassupip.backwardcompatuget_python_libuget_path_uidu	user_siteupip.exceptionsupipuDELETE_MARKER_MESSAGEuPIP_DELETE_MARKER_FILENAMEuwrite_delete_marker_fileurunning_under_virtualenvuvirtualenv_no_globalu__get_usernameu_get_build_prefixupathujoinuprefixubuild_prefixu
src_prefixugetcwduOSErroruexituabspathurealpathu
site_packagesu
expanduseruuser_diruplatformubin_pyuNoneubin_useruexistsudefault_storage_dirudefault_config_fileudefault_log_fileuFalseudistutils_scheme(((u&/tmp/pip-zej_zi-build/pip/locations.pyu<module>sZ	


		
	!$!2site-packages/pip/__pycache__/cmdoptions.cpython-33.pyc000064400000020512151733463510017076 0ustar00�
7�Rer$c@sJdZddlZddlmZmZmZddlmZdd�ZGdd�de	�Z
e
d	d
ddd
ddd�Ze
ddddd
ddd�de�Z
e
ddddd
ddddd�Ze
ddddd
ddd�Ze
ddddd
ddddd �Ze
d!dd"d#d$dd%�Ze
d&dd'd
ddd�de�Ze
d(d)dd*d#d$dedd+�Ze
d,dd-d
ddd�de�Ze
d.dd/d0d1dd2dd3�Ze
d4d5d#d6dd7d0d8dd9dd:�Ze
d;dd<d0d1dd2de�Ze
d=dd>d0d1dd2de�Ze
d?dd@d0dAdBdCdDdEdFgdgd
dGd#d
ddH�Ze
dIddJd0d1dd2d#d$ddK�Ze
dLdMdNddOd#dPddQddR�Ze
dSddTd#dPd
dGdgddU�Ze
dVddWd
ddd�ddX�Ze
dYdZdd[d
dGdgd#d\dd]�Ze
d^d_dd`d
ddd�de�Ze
daddbd#dPd
dGdgde�Z e
dcdddd
dGdgd#deddf�Z!e
dgddhd
ddd�ddi�Z"e
djddhd
dkdd�de�Z#e
dldmddnd
dGdgd#deddo�Z$e
dpddqd
dkdd�de�Z%e
drddsd
ddd�ddt�Z&e
dudvddwd
dGdgd#dxddy�Z'e
dzdd{d
dde�Z(e
d|dd{d
dkdd�dd}�Z*e
d~ddd#d�dddd��Z,e
d�d�dd�d
ddd�dd��Z-e
d�d�d�d�dd�d#d�dd��Z.e
d�dd�d
dGd#d�dd��Z/e
d�dd�d
dGd#d�dd��Z0e
d�d
ddd�dd��Z1id�d�6ee
eeeeeeeeeeeeegd�6Z2id�d�6eeeeee e!e"e#e$e%e&gd�6Z3dS(�uE
shared options and groups

The principle here is to define options once, but *not* instantiate them globally.
One reason being that options with action='append' can carry state between parses.
pip parse's general options twice internally, and shouldn't pass on state.
To be consistent, all options will follow this design.

iN(uOptionGroupu
SUPPRESS_HELPuOption(udefault_log_filecCs?t||d�}x%|dD]}|j|j��qW|S(u�
    Return an OptionGroup object
    group  -- assumed to be dict with 'name' and 'options' keys
    parser -- an optparse Parser
    unameuoptions(uOptionGroupu
add_optionumake(ugroupuparseruoption_groupuoption((u'/tmp/pip-zej_zi-build/pip/cmdoptions.pyumake_option_groupsumake_option_groupcBs2|EeZdZdZdd�Zdd�ZdS(uOptionMakeru�Class that stores the args/kwargs that would be used to make an Option,
    for making them later, and uses deepcopy's to reset state.cOs||_||_dS(N(uargsukwargs(uselfuargsukwargs((u'/tmp/pip-zej_zi-build/pip/cmdoptions.pyu__init__s	uOptionMaker.__init__cCs1tj|j�}tj|j�}t||�S(N(ucopyudeepcopyuargsukwargsuOption(uselfu	args_copyukwargs_copy((u'/tmp/pip-zej_zi-build/pip/cmdoptions.pyumake suOptionMaker.makeN(u__name__u
__module__u__qualname__u__doc__u__init__umake(u
__locals__((u'/tmp/pip-zej_zi-build/pip/cmdoptions.pyuOptionMakersuOptionMakeru-hu--helpudestuhelpuactionu
Show help.u--require-virtualenvu--require-venvurequire_venvu
store_trueudefaultu-vu	--verboseuverboseucountuDGive more output. Option is additive, and can be used up to 3 times.u-Vu	--versionuversionuShow version and exit.u-qu--quietuquietuGive less output.u--logulogumetavarupathuAPath to a verbose appending log. This log is inactive by default.u--log-explicit-levelsulog_explicit_levelsu
--log-fileu--local-logulog_fileuhPath to a verbose non-appending log, that only logs failures. This log is active by default at %default.u
--no-inputuno_inputu--proxyuproxyutypeustruu<Specify a proxy in the form [user:passwd@]proxy.server:port.u	--timeoutu--default-timeoutusecutimeoutufloatiu2Set the socket timeout (default %default seconds).u
--default-vcsudefault_vcsu--skip-requirements-regexuskip_requirements_regexu--exists-actionu
exists_actionuchoiceuchoicesusuiuwubuappenduPDefault action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup.u--certucertuPath to alternate CA bundle.u-iu--index-urlu
--pypi-urlu	index_urluURLuhttps://pypi.python.org/simple/u4Base URL of Python Package Index (default %default).u--extra-index-urluextra_index_urlsu@Extra URLs of package indexes to use in addition to --index-url.u
--no-indexuno_indexuAIgnore package index (only looking at --find-links URLs instead).u-fu--find-linksu
find_linksuurlu�If a url or path to an html file, then parse for links to archives. If a local path or file:// url that's a directory, then look for archives in the directory listing.u-Mu
--use-mirrorsuuse_mirrorsu	--mirrorsumirrorsu--allow-externaluallow_externaluPACKAGEu1Allow the installation of externally hosted filesu--allow-all-externaluallow_all_externalu5Allow the installation of all externally hosted filesu--no-allow-externalustore_falseu--allow-unverifiedu--allow-insecureuallow_unverifiedu9Allow the installation of insecure and unverifiable filesu--no-allow-insecureuallow_all_insecureu--process-dependency-linksuprocess_dependency_linksu*Enable the processing of dependency links.u-ru
--requirementurequirementsufileuQInstall from the given requirements file. This option can be used multiple times.u--use-wheelu	use_wheelu--no-use-wheeluVDo not Find and prefer wheel archives when searching indexes and find-links locations.u--download-cacheudownload_cacheudiru#Cache downloaded packages in <dir>.u	--no-depsu--no-dependenciesuignore_dependenciesu#Don't install package dependencies.u-bu--buildu--build-diru--build-directoryu	build_diru/Directory to unpack packages into and build in.u--install-optionuinstall_optionsuoptionsu"Extra arguments to be supplied to the setup.py install command (use like --install-option="--install-scripts=/usr/local/bin"). Use multiple --install-option options to pass multiple options to setup.py install. If you are using an option with a directory path, be sure to use absolute path.u--global-optionuglobal_optionsuTExtra global options to be supplied to the setup.py call before the install command.u
--no-cleanu!Don't clean up build directories.uGeneral OptionsunameuPackage Index OptionsFT(4u__doc__ucopyuoptparseuOptionGroupu
SUPPRESS_HELPuOptionu
pip.locationsudefault_log_fileumake_option_groupuobjectuOptionMakeruhelp_uFalseurequire_virtualenvuverboseuversionuquietulogulog_explicit_levelsulog_fileuno_inputuproxyutimeoutudefault_vcsuskip_requirements_regexu
exists_actionucertu	index_urluextra_index_urluno_indexu
find_linksuuse_mirrorsumirrorsuallow_externaluallow_all_externaluno_allow_externaluallow_unsafeuno_allow_unsafeuprocess_dependency_linksurequirementsu	use_wheeluTrueuno_use_wheeluNoneudownload_cacheuno_depsu	build_diruinstall_optionsuglobal_optionsuno_cleanu
general_groupuindex_group(((u'/tmp/pip-zej_zi-build/pip/cmdoptions.pyu<module>	s																																																
site-packages/pip/__pycache__/exceptions.cpython-33.pyc000064400000010164151733463510017102 0ustar00�
7�Re>c@s�dZGdd�de�ZGdd�de�ZGdd�de�ZGdd�de�ZGd	d
�d
e�ZGdd�de�ZGd
d�de�ZGdd�de�Z	Gdd�de�Z
Gdd�de�ZGdd�de�ZdS(u"Exceptions used throughout packagecBs|EeZdZdZdS(uPipErroruBase pip exceptionN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u'/tmp/pip-zej_zi-build/pip/exceptions.pyuPipErrorsuPipErrorcBs|EeZdZdZdS(uInstallationErroru%General exception during installationN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u'/tmp/pip-zej_zi-build/pip/exceptions.pyuInstallationErrorsuInstallationErrorcBs|EeZdZdZdS(uUninstallationErroru'General exception during uninstallationN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u'/tmp/pip-zej_zi-build/pip/exceptions.pyuUninstallationErrorsuUninstallationErrorcBs|EeZdZdZdS(uDistributionNotFounduCRaised when a distribution cannot be found to satisfy a requirementN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u'/tmp/pip-zej_zi-build/pip/exceptions.pyuDistributionNotFoundsuDistributionNotFoundcBs|EeZdZdZdS(uBestVersionAlreadyInstalleduPRaised when the most up-to-date version of a package is already
    installed.  N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u'/tmp/pip-zej_zi-build/pip/exceptions.pyuBestVersionAlreadyInstalledsuBestVersionAlreadyInstalledcBs|EeZdZdZdS(u
BadCommandu0Raised when virtualenv or a command is not foundN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u'/tmp/pip-zej_zi-build/pip/exceptions.pyu
BadCommandsu
BadCommandcBs|EeZdZdZdS(uCommandErroru7Raised when there is an error in command-line argumentsN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u'/tmp/pip-zej_zi-build/pip/exceptions.pyuCommandErrorsuCommandErrorcBs|EeZdZdZdS(uPreviousBuildDirErroru:Raised when there's a previous conflicting build directoryN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u'/tmp/pip-zej_zi-build/pip/exceptions.pyuPreviousBuildDirError!suPreviousBuildDirErrorcBs|EeZdZdZdS(uHashMismatchu*Distribution file hash values don't match.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u'/tmp/pip-zej_zi-build/pip/exceptions.pyuHashMismatch%suHashMismatchcBs|EeZdZdZdS(uInvalidWheelFilenameuInvalid wheel filename.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u'/tmp/pip-zej_zi-build/pip/exceptions.pyuInvalidWheelFilename)suInvalidWheelFilenamecBs|EeZdZdZdS(uUnsupportedWheeluUnsupported wheel.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u'/tmp/pip-zej_zi-build/pip/exceptions.pyuUnsupportedWheel-suUnsupportedWheelN(
u__doc__u	ExceptionuPipErroruInstallationErroruUninstallationErroruDistributionNotFounduBestVersionAlreadyInstalledu
BadCommanduCommandErroruPreviousBuildDirErroruHashMismatchuInvalidWheelFilenameuUnsupportedWheel(((u'/tmp/pip-zej_zi-build/pip/exceptions.pyu<module>ssite-packages/pip/__pycache__/status_codes.cpython-33.pyc000064400000000507151733463510017421 0ustar00�
7�Retc@s(dZdZdZdZdZdZdS(iiiiiiN(uSUCCESSuERRORu
UNKNOWN_ERRORuVIRTUALENV_NOT_FOUNDuPREVIOUS_BUILD_DIR_ERRORuNO_MATCHES_FOUND(((u)/tmp/pip-zej_zi-build/pip/status_codes.pyu<module>s
site-packages/pip/__pycache__/runner.cpython-33.pyc000064400000001136151733463520016232 0ustar00�
7�Re�c@sVddlZddlZdd�ZedkrRe�ZerReje�qRndS(iNcCsStjjtjjtjjt���}tjjd|�ddl}|j�S(Ni(	uosupathudirnameuabspathu__file__usysuinsertupipumain(ubaseupip((u#/tmp/pip-zej_zi-build/pip/runner.pyuruns*urunu__main__(usysuosurunu__name__uexit(((u#/tmp/pip-zej_zi-build/pip/runner.pyu<module>s
	site-packages/pip/__pycache__/util.cpython-33.pyc000064400000075364151733463520015714 0ustar00�
7�Re$bc@s�ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZm
Z
mZddlmZmZmZmZmZmZddlmZmZmZddlmZddlmZddlmZdd	d
ddd
ddddddddddddddddddd gZ d!d�Z!d]d"d�Z#d#d$�Z$d%d	�Z%d&d'd
�Z&ddd(d�Z(dd)d*�Z)d+d,�Z*d-d�Z+Gd.d/�d/e,�Z-e-�Z.[-ej/d0ej0�Z1d1d�Z2d2d�Z3d3d�Z4d4d�Z5d5d�Z6d6d�Z7d7d�Z8d8d�Z9d9d�Z:d:d�Z;d;d�Z<d<d=�Z=d>d?�Z>d@dA�Z?dBdC�Z@dDdE�ZAd^d_d^d]dJdK�ZCdLdM�ZDdNdO�ZEdPd�ZFdQdR�ZGd^dSd�ZHdTd�ZIdUd�ZJdVd�ZKdWd�ZLd^ddd^ejMdddXd �ZNdYdZ�ZOGd[d\�d\e,�ZPdS(`iN(uInstallationErroru
BadCommanduPipError(uWindowsErrorustring_typesu	raw_inputuconsole_to_stru	user_siteuPermissionError(u
site_packagesurunning_under_virtualenvuvirtualenv_no_global(ulogger(u
pkg_resources(uversionurmtreeudisplay_pathu
backup_dirufind_commanduaskuInfunormalize_nameusplitextuformat_sizeuis_installable_diruis_svn_pageu
file_contentsusplit_leading_diruhas_leading_dirumake_path_relativeunormalize_pathurenamesuget_terminal_sizeuget_progu
unzip_fileu
untar_fileucreate_download_cache_folderucache_downloaduunpack_fileucall_subprocessc
CsPy.tjjtjd�dkr-dtjSWntttfk
rKYnXdS(Niu__main__.pyu-cu	%s -m pipupip(u__main__.pyu-c(	uosupathubasenameusysuargvu
executableuAttributeErroru	TypeErroru
IndexError(((u!/tmp/pip-zej_zi-build/pip/util.pyuget_prog!scCstj|d|dt�dS(Nu
ignore_errorsuonerror(ushutilurmtreeurmtree_errorhandler(udiru
ignore_errors((u!/tmp/pip-zej_zi-build/pip/util.pyurmtree*scCs�|dd�\}}|tkr5|jddkpp|tkrT|jddkpp|tkop|jddksy�ntj|�jtj@tjkr��ntj|tj	�||�dS(u�On Windows, the files in .svn are read-only, so when rmtree() tries to
    remove them, an exception is thrown.  We catch that here, remove the
    read-only attribute, and hopefully continue without problems.Niiii
i(
uWindowsErroruargsuOSErroruPermissionErroruosustatust_modeuS_IREADuchmoduS_IWRITE(ufuncupathuexc_infouexctypeuvalue((u!/tmp/pip-zej_zi-build/pip/util.pyurmtree_errorhandler/s"urmtree_errorhandlercCsdtjjtjj|��}|jtj�tjj�r`d|ttj��d�}n|S(uTGives the display value for a given path, making it relative to cwd
    if possible.u.N(uosupathunormcaseuabspathu
startswithugetcwdusepulen(upath((u!/tmp/pip-zej_zi-build/pip/util.pyudisplay_pathBs#u.bakcCsKd}|}x4tjj||�rB|d7}|t|�}qW||S(u\Figure out the name of a directory to back up the given dir to
    (adding .bak, .bak2, etc)i(uosupathuexistsustr(udiruextunu	extension((u!/tmp/pip-zej_zi-build/pip/util.pyu
backup_dirKs
cCs7|dkr0tjjdd�jtj�}nt|t�rK|g}n|dkrct�}ndd�|j	�jtj�D�}tj
j|�dj	�|kr�dg}nxj|D]b}tj
j||�}x.|D]&}||}tj
j
|�r�|Sq�Wtj
j
|�r�|Sq�Wtd|��dS(u<Searches the PATH for the given command and returns its pathuPATHucSs"g|]}t|�r|�qS((ulen(u.0uext((u!/tmp/pip-zej_zi-build/pip/util.pyu
<listcomp>_s	u find_command.<locals>.<listcomp>iuCannot find command %rN(uNoneuosuenvironugetusplitupathsepu
isinstanceustring_typesuget_pathextulowerupathusplitextujoinuisfileu
BadCommand(ucmdupathsupathextupathucmd_pathuextucmd_path_ext((u!/tmp/pip-zej_zi-build/pip/util.pyufind_commandVs$$%"


cCsF|dkr-tjjddddg�}ntjjd|�}|S(u9Returns the path extensions from environment or a defaultu.COMu.EXEu.BATu.CMDuPATHEXTN(uNoneuosupathsepujoinuenvironuget(udefault_pathextupathext((u!/tmp/pip-zej_zi-build/pip/util.pyuget_pathextqs!uget_pathextcCsCx3tjjdd�j�D]}||kr|SqWt||�S(NuPIP_EXISTS_ACTIONu(uosuenvironugetusplituask(umessageuoptionsuaction((u!/tmp/pip-zej_zi-build/pip/util.pyuask_path_existsys"uask_path_existscCs}xvtjjd�r(td|��nt|�}|j�j�}||krrtd|dj|�f�q|SqdS(u@Ask the message interactively, with the given possible responsesuPIP_NO_INPUTu7No input was expected ($PIP_NO_INPUT set); question: %su<Your response (%r) was not one of the expected responses: %su, N(	uosuenvironugetu	Exceptionu	raw_inputustripuloweruprintujoin(umessageuoptionsuresponse((u!/tmp/pip-zej_zi-build/pip/util.pyuask�scBsn|EeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dS(u_InfuI am bigger than everything!cCs||krdSdSdS(NTF(uTrueuFalse(uselfuother((u!/tmp/pip-zej_zi-build/pip/util.pyu__eq__�su_Inf.__eq__cCs|j|�S(N(u__eq__(uselfuother((u!/tmp/pip-zej_zi-build/pip/util.pyu__ne__�su_Inf.__ne__cCsdS(NF(uFalse(uselfuother((u!/tmp/pip-zej_zi-build/pip/util.pyu__lt__�su_Inf.__lt__cCsdS(NF(uFalse(uselfuother((u!/tmp/pip-zej_zi-build/pip/util.pyu__le__�su_Inf.__le__cCsdS(NT(uTrue(uselfuother((u!/tmp/pip-zej_zi-build/pip/util.pyu__gt__�su_Inf.__gt__cCsdS(NT(uTrue(uselfuother((u!/tmp/pip-zej_zi-build/pip/util.pyu__ge__�su_Inf.__ge__cCsdS(NuInf((uself((u!/tmp/pip-zej_zi-build/pip/util.pyu__repr__�su
_Inf.__repr__N(u__name__u
__module__u__qualname__u__doc__u__eq__u__ne__u__lt__u__le__u__gt__u__ge__u__repr__(u
__locals__((u!/tmp/pip-zej_zi-build/pip/util.pyu_Inf�su_Infu[^a-z]cCstjd|j��S(Nu-(u
_normalize_reusubulower(uname((u!/tmp/pip-zej_zi-build/pip/util.pyunormalize_name�scCsX|dkrd|ddS|d	kr4d|dS|dkrLd|dSd|SdS(
Ni�u%.1fMBg@�@i
u%ikBu%.1fkBu%ibytesi@Bi'((ubytes((u!/tmp/pip-zej_zi-build/pip/util.pyuformat_size�scCsEtjj|�sdStjj|d�}tjj|�rAdSdS(u@Return True if `path` is a directory containing a setup.py file.usetup.pyFT(uosupathuisdiruFalseujoinuisfileuTrue(upathusetup_py((u!/tmp/pip-zej_zi-build/pip/util.pyuis_installable_dir�scCs(tjd|�o'tjd|tj�S(uJReturns true if the page appears to be the index page of an svn repositoryu<title>[^<]*Revision \d+:u#Powered by (?:<a[^>]*?>)?Subversion(ureusearchuI(uhtml((u!/tmp/pip-zej_zi-build/pip/util.pyuis_svn_page�sc
Cs8t|d�}z|j�jd�SWd|j�XdS(Nurbuutf-8(uopenureadudecodeuclose(ufilenameufp((u!/tmp/pip-zej_zi-build/pip/util.pyu
file_contents�scCs�t|�}|jd�jd�}d|krvd|krZ|jd�|jd�ksfd|krv|jdd�Sd|kr�|jdd�S|dfSdS(Nu/u\iu(ustrulstripufindusplit(upath((u!/tmp/pip-zej_zi-build/pip/util.pyusplit_leading_dir�s6cCs\d}xO|D]G}t|�\}}|s/dS|dkrD|}q
||kr
dSq
WdS(uyReturns true if all the paths have the same leading path name
    (i.e., everything is in one subdirectory in an archive)NFT(uNoneusplit_leading_diruFalseuTrue(upathsu
common_prefixupathuprefixurest((u!/tmp/pip-zej_zi-build/pip/util.pyuhas_leading_dir�s
	cCs7tjj|�}tjj|�}tjjtjj|��}tjjtjj|��}|jtjj�jtjj�}|jtjj�jtjj�}x>|r�|r�|d|dkr�|j	d�|j	d�q�Wdgt
|�||g}|dgkr$dtjjStjjj|�S(u
    Make a filename relative, where the filename path, and it is
    relative to rel_to

        >>> make_relative_path('/usr/share/something/a-file.pth',
        ...                    '/usr/share/another-place/src/Directory')
        '../../../something/a-file.pth'
        >>> make_relative_path('/usr/share/something/a-file.pth',
        ...                    '/home/user/src/Directory')
        '../../../usr/share/something/a-file.pth'
        >>> make_relative_path('/usr/share/a-file.pth', '/usr/share/')
        'a-file.pth'
    iu..uu.(uosupathubasenameudirnameunormpathuabspathustripusepusplitupopulenujoin(upathurel_tou
path_filenameu
path_partsurel_to_partsu
full_parts((u!/tmp/pip-zej_zi-build/pip/util.pyumake_path_relative�s$$#
cCs(tjjtjjtjj|���S(uN
    Convert a path to its canonical, case-normalized, absolute version.

    (uosupathunormcaseurealpathu
expanduser(upath((u!/tmp/pip-zej_zi-build/pip/util.pyunormalize_pathscCs[tj|�\}}|j�jd�rQ|dd�|}|dd�}n||fS(u,Like os.path.splitext, but take off .tar toou.tariNi����i����(u	posixpathusplitextuloweruendswith(upathubaseuext((u!/tmp/pip-zej_zi-build/pip/util.pyusplitexts
cCs�tjj|�\}}|rG|rGtjj|�rGtj|�ntj||�tjj|�\}}|r�|r�ytj|�Wq�tk
r�Yq�XndS(u7Like os.renames(), but handles renaming across devices.N(	uosupathusplituexistsumakedirsushutilumoveu
removedirsuOSError(uoldunewuheadutail((u!/tmp/pip-zej_zi-build/pip/util.pyurenames!s
cCs)t�s
dSt|�jttj��S(u�
    Return True if path is within sys.prefix, if we're running in a virtualenv.

    If we're not in a virtualenv, all paths are considered "local."

    T(urunning_under_virtualenvuTrueunormalize_pathu
startswithusysuprefix(upath((u!/tmp/pip-zej_zi-build/pip/util.pyuis_local2s	uis_localcCstt|��S(u�
    Return True if given Distribution object is installed locally
    (i.e. within current virtualenv).

    Always True if we're not in a virtualenv.

    (uis_localu
dist_location(udist((u!/tmp/pip-zej_zi-build/pip/util.pyu
dist_is_local>su
dist_is_localcCs-tr%tt|��jtt��SdSdS(uF
    Return True if given Distribution is installed in user site.
    NF(u	user_siteunormalize_pathu
dist_locationu
startswithuFalse(udist((u!/tmp/pip-zej_zi-build/pip/util.pyudist_in_usersiteIsudist_in_usersitecCstt|��jtt��S(ua
    Return True if given Distribution is installed in distutils.sysconfig.get_python_lib().
    (unormalize_pathu
dist_locationu
startswithu
site_packages(udist((u!/tmp/pip-zej_zi-build/pip/util.pyudist_in_site_packagesRsudist_in_site_packagescCs)ddlm}|j|g�}|jS(u$Is distribution an editable install?i(uFrozenRequirement(upipuFrozenRequirementu	from_distueditable(udistuFrozenRequirementureq((u!/tmp/pip-zej_zi-build/pip/util.pyudist_is_editableYsudist_is_editableu
setuptoolsupipupythonu
distributecs�|rt�ndd��|r0dd��ndd��|rQdd��ndd������fdd�tjD�S(	u�
    Return a list of installed Distribution objects.

    If ``local_only`` is True (default), only return installations
    local to the current virtualenv, if in a virtualenv.

    ``skip`` argument is an iterable of lower-case project names to
    ignore; defaults to ('setuptools', 'pip', 'python'). [FIXME also
    skip virtualenv?]

    If ``editables`` is False, don't report editables.

    If ``editables_only`` is True , only report editables.

    cSsdS(NT(uTrue(ud((u!/tmp/pip-zej_zi-build/pip/util.pyu<lambda>vsu-get_installed_distributions.<locals>.<lambda>cSsdS(NT(uTrue(ud((u!/tmp/pip-zej_zi-build/pip/util.pyu<lambda>yscSst|�S(N(udist_is_editable(ud((u!/tmp/pip-zej_zi-build/pip/util.pyu<lambda>{scSs
t|�S(N(udist_is_editable(ud((u!/tmp/pip-zej_zi-build/pip/util.pyu<lambda>~scSsdS(NT(uTrue(ud((u!/tmp/pip-zej_zi-build/pip/util.pyu<lambda>�scsIg|]?}�|�r|j�kr�|�r�|�r|�qS((ukey(u.0ud(u
editable_testueditables_only_testu
local_testuskip(u!/tmp/pip-zej_zi-build/pip/util.pyu
<listcomp>�s
	u/get_installed_distributions.<locals>.<listcomp>(u
dist_is_localu
pkg_resourcesuworking_set(u
local_onlyuskipuinclude_editablesueditables_only((u
editable_testueditables_only_testu
local_testuskipu!/tmp/pip-zej_zi-build/pip/util.pyuget_installed_distributions`s	uget_installed_distributionscCs�g}t�rNt�r(|jt�qq|jt�trq|jt�qqn#trd|jt�n|jt�x@|D]8}tjj||j�d}tjj	|�rx|SqxWdS(u
    Return the path for the .egg-link file if it exists, otherwise, None.

    There's 3 scenarios:
    1) not in a virtualenv
       try to find in site.USER_SITE, then site_packages
    2) in a no-global virtualenv
       try to find in site_packages
    3) in a yes-global virtualenv
       try to find in site_packages, then site.USER_SITE  (don't look in global location)

    For #1 and #3, there could be odd cases, where there's an egg-link in 2 locations.
    This method will just return the first one found.
    u	.egg-linkN(
urunning_under_virtualenvuvirtualenv_no_globaluappendu
site_packagesu	user_siteuosupathujoinuproject_nameuisfile(udistusitesusiteuegglink((u!/tmp/pip-zej_zi-build/pip/util.pyu
egg_link_path�s		


u
egg_link_pathcCst|�}|r|S|jS(u�
    Get the site-packages location of this distribution. Generally
    this is dist.location, except in the case of develop-installed
    packages, where dist.location is the source code location, and we
    want to know where the egg-link file is.

    (u
egg_link_pathulocation(udistuegg_link((u!/tmp/pip-zej_zi-build/pip/util.pyu
dist_location�su
dist_locationcCs�dd�}|d�p-|d�p-|d�}|s|y8tjtj�tj�}||�}tj|�Wq|Yq|Xn|s�tjjdd�tjjdd	�f}nt|d�t|d�fS(
ulReturns a tuple (x, y) representing the width(x) and the height(x)
    in characters of the terminal window.cSsyLddl}ddl}ddl}|jd|j||jd��}WndSYnX|dkrkdS|dkr{dS|S(Niuhhu1234(ii(ii(ufcntlutermiosustructuunpackuioctlu
TIOCGWINSZuNone(ufdufcntlutermiosustructucr((u!/tmp/pip-zej_zi-build/pip/util.pyuioctl_GWINSZ�s	u'get_terminal_size.<locals>.ioctl_GWINSZiiiuLINESiuCOLUMNSiP(uosuopenuctermiduO_RDONLYucloseuenvironugetuint(uioctl_GWINSZucrufd((u!/tmp/pip-zej_zi-build/pip/util.pyuget_terminal_size�s$-cCs tjd�}tj|�|S(uBGet the current umask which involves having to set it temporarily.i(uosuumask(umask((u!/tmp/pip-zej_zi-build/pip/util.pyu
current_umask�s
u
current_umaskc
Cs�tjj|�s"tj|�nt|d�}z}tj|�}t|j��oX|}xO|j	�D]A}|j
}|j|�}|}	|r�t|�d}	ntjj
||	�}	tjj|	�}
tjj|
�s�tj|
�n|	jd�s|	jd�r1tjj|	�s�tj|	�q�qht|	d�}z|j|�Wd|j�|jd?}|r�tj|�r�|d@r�tj|	d	t�dB�nXqhWWd|j�XdS(
u�
    Unzip the file (with path `filename`) to the destination `location`.  All
    files are written based on system defaults and umask (i.e. permissions are
    not preserved), except that regular file members with any execute
    permissions (user, group, or world) have "chmod +x" applied after being
    written. Note that for windows, any execute changes using os.chmod are
    no-ops per the python docs.
    urbiu/u\uwbNiiIi�(uosupathuexistsumakedirsuopenuzipfileuZipFileuhas_leading_dirunamelistuinfolistufilenameureadusplit_leading_dirujoinudirnameuendswithuwriteucloseu
external_attrustatuS_ISREGuchmodu
current_umask(
ufilenameulocationuflattenuzipfpuzipuleadinguinfounameudataufnudirufpumode((u!/tmp/pip-zej_zi-build/pip/util.pyu
unzip_file�s6		

'cCs�tjj|�s"tj|�n|j�jd�sL|j�jd�rUd}nh|j�jd�s|j�jd�r�d}n5|j�jd�r�d}ntjd	|�d
}tj	||�}zt
dd�|j�D��}x�|j�D]�}|j}|d
krq�n|r8t
|�d}ntjj||�}|j�r~tjj|�s�tj|�q�q�|j�r�y|j||�Wq�tj�d}tjd||j|f�w�Yq�Xq�y|j|�}	WnHttfk
r9tj�d}tjd||j|f�w�YnXtjjtjj|��sttjtjj|��nt	|d�}
ztj|	|
�Wd|
j�X|	j�|jd@r�tj|dt�dB�q�q�WWd|j�XdS(u�
    Untar the file (with path `filename`) to the destination `location`.
    All files are written based on system defaults and umask (i.e. permissions
    are not preserved), except that regular file members with any execute
    permissions (user, group, or world) have "chmod +x" applied after being
    written.  Note that for windows, any execute changes using os.chmod are
    no-ops per the python docs.
    u.gzu.tgzur:gzu.bz2u.tbzur:bz2u.taruru-Cannot determine compression type for file %sur:*cSs(g|]}|jdkr|j�qS(upax_global_header(uname(u.0umember((u!/tmp/pip-zej_zi-build/pip/util.pyu
<listcomp>$s	uuntar_file.<locals>.<listcomp>upax_global_headeriu/In the tar file %s the member %s is invalid: %suwbNiIi�(uosupathuexistsumakedirsuloweruendswithuloggeruwarnutarfileuopenuhas_leading_diru
getmembersunameusplit_leading_dirujoinuisdiruissymu_extract_memberusysuexc_infouextractfileuKeyErroruAttributeErrorudirnameushutilucopyfileobjucloseumodeuchmodu
current_umask(ufilenameulocationumodeutaruleadingumemberufnupathueufpudestfp((u!/tmp/pip-zej_zi-build/pip/util.pyu
untar_filesf	*	*			

&cCs@tjd8_tjd|�tjd7_tj|�dS(Niu&Creating supposed download cache at %s(uloggeruindentunotifyuosumakedirs(ufolder((u!/tmp/pip-zej_zi-build/pip/util.pyucreate_download_cache_folderXscCsUtjdt|��tj||�t|dd�}|j|�|j�dS(NuStoring download in cache at %su
.content-typeuw(uloggerunotifyudisplay_pathushutilucopyfileuopenuwriteuclose(utarget_fileu
temp_locationucontent_typeufp((u!/tmp/pip-zej_zi-build/pip/util.pyucache_download_s

c
CsCtjj|�}|dksZ|jd�sZ|jd�sZ|jd�sZtj|�rzt||d|jd��n�|dks�tj|�s�t	|�dj
�dkr�t||�n~|r|jd
�rt
t|��rddlm}|d|j�j|�n*tjd|||f�td|��dS(Nuapplication/zipu.zipu	.pybundleu.whluflattenuapplication/x-gzipiu.taru.tar.gzu.tar.bz2u.tgzu.tbzu	text/htmli(u
Subversionusvn+uZCannot unpack file %s (downloaded from %s, content-type: %s); cannot detect archive formatu%Cannot determine archive format of %s(u	.pybundleu.whl(u.taru.tar.gzu.tar.bz2u.tgzu.tbz(uosupathurealpathuendswithuzipfileu
is_zipfileu
unzip_fileutarfileu
is_tarfileusplitextuloweru
untar_fileu
startswithuis_svn_pageu
file_contentsupip.vcs.subversionu
SubversionuurluunpackuloggerufataluInstallationError(ufilenameulocationucontent_typeulinku
Subversion((u!/tmp/pip-zej_zi-build/pip/util.pyuunpack_filegs$ 	cCs�|dkr�g}xd|D]\}	d|	ksOd|	ksOd|	ksOd|	krhd|	jdd�}	n|j|	�qWdj|�}n|r�d}
n	tj}
tj|d|�tj	j
�}|r�|j|�ny4tj|dtj
d	dd
|
d|d|�}Wn<tk
rNtj�d
}
tjd|
|f��YnXg}|
dk	r|j}
x�t|
j��}|s�Pn|j�}|j|d�|r||�}t|t�r�|\}}ntj||�tj|�stj�qqmtj|�qmn!|j�\}}|p3dg}|j�|jr�|r�|r�tjd|�tjdj|�d�ntd||j|f��q�tj d||j|f�n|
dk	r�dj|�SdS(Nu u
u"u'u"%s"u\"uRunning command %sustderrustdinustdoutucwduenviu#Error %s while executing command %suu Complete output from command %s:u)
----------------------------------------u*Command %s failed with error code %s in %su"Command %s had error code %s in %s(!uNoneureplaceuappendujoinu
subprocessuPIPEuloggeruloguosuenvironucopyuupdateuPopenuSTDOUTu	Exceptionusysuexc_infoufatalustdoutuconsole_to_strureadlineurstripu
isinstanceutupleustdout_level_matchesu
show_progressuinfoucommunicateuwaitu
returncodeunotifyuInstallationErroruwarn(ucmdushow_stdoutu
filter_stdoutucwduraise_on_returncodeu
command_levelucommand_descu
extra_environu	cmd_partsupartustdoutuenvuprocueu
all_outputulineulevelureturned_stdoutureturned_stderr((u!/tmp/pip-zej_zi-build/pip/util.pyucall_subprocess�sp
0		
	
	cCsEtj|�}|dkrdStj|�}tdd�|D��S(u�
    Attempt to determine if this is a pre-release using PEP386/PEP426 rules.

    Will return True if it is a pre-release and False if not. Versions are
    assumed to be a pre-release if they cannot be parsed.
    cSs)g|]}tdd�|D���qS(c	Ss1g|]'}|tdddddg�k�qS(uaubucurcudev(uset(u.0uy((u!/tmp/pip-zej_zi-build/pip/util.pyu
<listcomp>�s	u,is_prerelease.<locals>.<listcomp>.<listcomp>(uany(u.0ux((u!/tmp/pip-zej_zi-build/pip/util.pyu
<listcomp>�s	u!is_prerelease.<locals>.<listcomp>NT(uversionu_suggest_normalized_versionuNoneuTrueu_normalized_keyuany(uversu
normalizeduparsed((u!/tmp/pip-zej_zi-build/pip/util.pyu
is_prerelease�s
u
is_prereleasecBsV|EeZdZdddd�Zdd�Zdd�Zdd�Zd	d
�ZdS(uBuildDirectorycCsm|dkr!|dkr!d}n|dkrWtjdd�}|dkrWd}qWn||_||_dS(Nuprefixu
pip-build-T(uNoneuTrueutempfileumkdtempunameudelete(uselfunameudelete((u!/tmp/pip-zej_zi-build/pip/util.pyu__init__�s		uBuildDirectory.__init__cCsdj|jj|j�S(Nu	<{} {!r}>(uformatu	__class__u__name__uname(uself((u!/tmp/pip-zej_zi-build/pip/util.pyu__repr__�suBuildDirectory.__repr__cCs|jS(N(uname(uself((u!/tmp/pip-zej_zi-build/pip/util.pyu	__enter__�suBuildDirectory.__enter__cCs|j�dS(N(ucleanup(uselfuexcuvalueutb((u!/tmp/pip-zej_zi-build/pip/util.pyu__exit__�suBuildDirectory.__exit__cCs|jrt|j�ndS(N(udeleteurmtreeuname(uself((u!/tmp/pip-zej_zi-build/pip/util.pyucleanup�s	uBuildDirectory.cleanupN(	u__name__u
__module__u__qualname__uNoneu__init__u__repr__u	__enter__u__exit__ucleanup(u
__locals__((u!/tmp/pip-zej_zi-build/pip/util.pyuBuildDirectory�s
uBuildDirectoryFT(u
setuptoolsupipupythonu
distribute(Qusysushutiluosustatureu	posixpathuzipfileutarfileu
subprocessutextwraputempfileupip.exceptionsuInstallationErroru
BadCommanduPipErrorupip.backwardcompatuWindowsErrorustring_typesu	raw_inputuconsole_to_stru	user_siteuPermissionErroru
pip.locationsu
site_packagesurunning_under_virtualenvuvirtualenv_no_globalupip.loguloggerupip._vendoru
pkg_resourcesupip._vendor.distlibuversionu__all__uget_proguFalseurmtreeurmtree_errorhandlerudisplay_pathu
backup_diruNoneufind_commanduget_pathextuask_path_existsuaskuobjectu_InfuInfucompileuIu
_normalize_reunormalize_nameuformat_sizeuis_installable_diruis_svn_pageu
file_contentsusplit_leading_diruhas_leading_dirumake_path_relativeunormalize_pathusplitexturenamesuis_localu
dist_is_localudist_in_usersiteudist_in_site_packagesudist_is_editableuTrueuget_installed_distributionsu
egg_link_pathu
dist_locationuget_terminal_sizeu
current_umasku
unzip_fileu
untar_fileucreate_download_cache_folderucache_downloaduunpack_fileuDEBUGucall_subprocessu
is_prereleaseuBuildDirectory(((u!/tmp/pip-zej_zi-build/pip/util.pyu<module>s�.							
		'"-L	?site-packages/pip/__pycache__/download.cpython-33.pyc000064400000060007151733463520016532 0ustar00�
7�Re4Xc
@sMddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
mZmZmZddlmZmZddlmZmZmZmZmZmZmZmZmZddlmZddl m!Z!ddl"m#Z#m$Z$ddl%m&Z&dd	l'm(Z(m)Z)dd
l*m+Z+ddl,m-Z-m.Z.ddl/m0Z0dd
l1m2Z2ddddddddddg
Z3dd�Z4Gdd�de(�Z5Gdd�de6�Z7Gdd�de&�Z8Gd d!�d!e#j9�Z:ddd"d�Z<ej=d#ej>�Z?ej=d$ej>�Z@d%d�ZAd&d�ZBej=d'ej>�ZCej=d(ej>�ZDd)d�ZEd*d�ZFd:d+d�ZHd,d-�ZId.d�ZJd/d�ZKd0d1�ZLd2d3�ZMd4d5�ZNd6d7�ZOddd8d�ZPdd9d�ZQdS(;iN(uurllibuurlparseu	raw_input(uInstallationErroruHashMismatch(	usplitexturmtreeuformat_sizeudisplay_pathu
backup_diruask_path_existsuunpack_fileucreate_download_cache_folderucache_download(uvcs(ulogger(urequestsusix(uBaseAdapter(uAuthBaseu
HTTPBasicAuth(uIncompleteRead(u
InvalidURLuChunkedEncodingError(uResponse(uCaseInsensitiveDictuget_file_contentuis_urluurl_to_pathupath_to_urluis_archive_fileuunpack_vcs_linkuunpack_file_urlu
is_vcs_urluis_file_urluunpack_http_urlcCs5tj�}|dkr'tj�}n�|dkr�dtjjtjjtjjf}tjjdkr�dj	|tjjg�}q�n<|dkr�tj�}n!|dkr�tj�}nd}ytj
�}tj�}Wntk
rd}d}YnXd	j	d
t
jd||fd||fg�S(u,Return a string representing the user agent.uCPythonuPyPyu%s.%s.%sufinaluuJythonu
IronPythonuUnknownu upip/%su%s/%s(uplatformupython_implementationupython_versionusysupypy_version_infoumajoruminorumicroureleaselevelujoinusystemureleaseuIOErrorupipu__version__(u_implementationu_implementation_versionup_systemu	p_release((u%/tmp/pip-zej_zi-build/pip/download.pyu
user_agent$s2	

u
user_agentcBsG|EeZdZd
dd�Zdd�Zdd�Zdd�Zd	S(uMultiDomainBasicAuthcCs||_i|_dS(N(u	promptingu	passwords(uselfu	prompting((u%/tmp/pip-zej_zi-build/pip/download.pyu__init__Hs	uMultiDomainBasicAuth.__init__cCs�tj|j�}|jjdd�d}tj|dd�|f|dd��|_|jj|d�\}}|dkr�|j|j�\}}n|s�|r�||f|j|<t	|p�d|p�d�|�}n|j
d|j�|S(Nu@iiuuresponsei����(NN(uurlparseuurlunetlocusplitu
urlunparseu	passwordsugetuNoneuparse_credentialsu
HTTPBasicAuthu
register_hooku
handle_401(uselfurequparsedunetlocuusernameupassword((u%/tmp/pip-zej_zi-build/pip/download.pyu__call__Ls1$uMultiDomainBasicAuth.__call__cKs�|jdkr|S|js |Stj|j�}td|j�}tjd�}|s`|ry||f|j|j<n|j|j	j
�t|p�d|p�d�|j�}|j
j||�}|jj|�|S(Ni�u
User for %s: u
Password: u(ustatus_codeu	promptinguurlparseuurlu	raw_inputunetlocugetpassu	passwordsucontenturawurelease_connu
HTTPBasicAuthurequestu
connectionusenduhistoryuappend(uselfurespukwargsuparseduusernameupasswordurequnew_resp((u%/tmp/pip-zej_zi-build/pip/download.pyu
handle_401hs	
$uMultiDomainBasicAuth.handle_401cCsLd|krH|jdd�d}d|kr>|jdd�S|dfSdS(Nu@iiu:(NN(ursplitusplituNone(uselfunetlocuuserinfo((u%/tmp/pip-zej_zi-build/pip/download.pyuparse_credentials�s
u&MultiDomainBasicAuth.parse_credentialsNT(u__name__u
__module__u__qualname__uTrueu__init__u__call__u
handle_401uparse_credentials(u
__locals__((u%/tmp/pip-zej_zi-build/pip/download.pyuMultiDomainBasicAuthFs"uMultiDomainBasicAuthcBsS|EeZdZdd�Zdd�Zd	d	d
dd�Zedd��Z	d	S(uLocalFSResponsecCs
||_dS(N(ufileobj(uselfufileobj((u%/tmp/pip-zej_zi-build/pip/download.pyu__init__�suLocalFSResponse.__init__cCst|j|�S(N(ugetattrufileobj(uselfuname((u%/tmp/pip-zej_zi-build/pip/download.pyu__getattr__�suLocalFSResponse.__getattr__cCs|jj|�S(N(ufileobjuread(uselfuamtudecode_contentu
cache_content((u%/tmp/pip-zej_zi-build/pip/download.pyuread�suLocalFSResponse.readcs9Gdd�dt��G�fdd�dt�}|�S(NcBs,|EeZdZdd�Zdd�ZdS(u7LocalFSResponse._original_response.<locals>.FakeMessagecSsgS(N((uselfuheader((u%/tmp/pip-zej_zi-build/pip/download.pyu
getheaders�suBLocalFSResponse._original_response.<locals>.FakeMessage.getheaderscSsgS(N((uselfuheaderudefault((u%/tmp/pip-zej_zi-build/pip/download.pyuget_all�su?LocalFSResponse._original_response.<locals>.FakeMessage.get_allN(u__name__u
__module__u__qualname__u
getheadersuget_all(u
__locals__((u%/tmp/pip-zej_zi-build/pip/download.pyuFakeMessage�suFakeMessagecs,|EeZdZe�fdd��ZdS(u8LocalFSResponse._original_response.<locals>.FakeResponsecs��S(N((uself(uFakeMessage(u%/tmp/pip-zej_zi-build/pip/download.pyumsg�su<LocalFSResponse._original_response.<locals>.FakeResponse.msgN(u__name__u
__module__u__qualname__upropertyumsg(u
__locals__(uFakeMessage(u%/tmp/pip-zej_zi-build/pip/download.pyuFakeResponse�suFakeResponse(uobject(uselfuFakeResponse((uFakeMessageu%/tmp/pip-zej_zi-build/pip/download.pyu_original_response�su"LocalFSResponse._original_responseNF(
u__name__u
__module__u__qualname__u__init__u__getattr__uNoneuFalseureadupropertyu_original_response(u
__locals__((u%/tmp/pip-zej_zi-build/pip/download.pyuLocalFSResponse�suLocalFSResponsecBs;|EeZdZddddddd�Zdd�ZdS(uLocalFSAdapterc
Cstj|j�}|jj�dkr=td|j��ntj|dd�d|dd��}t|�}	t�}
d|
_||
_t	j
|	�}tjj
|jdd�}titj|	�dp�d	d
6|jd6|d6�|
_tt|	d
��|
_|
jj|
_|
S(Nu	localhostu)Invalid URL %r: Only localhost is allowediuii�uusegmtiu
text/plainuContent-TypeuContent-Lengthu
Last-Modifiedurb(uT(uurlparseuurlunetloculoweru
InvalidURLu
urlunparseuurl_to_pathuResponseustatus_codeuosustatuemailuutilsu
formatdateust_mtimeuTrueuCaseInsensitiveDictu	mimetypesu
guess_typeust_sizeuheadersuLocalFSResponseuopenurawuclose(
uselfurequestustreamutimeoutuverifyucertuproxiesu
parsed_urlureal_urlupathnameurespustatsumodified((u%/tmp/pip-zej_zi-build/pip/download.pyusend�s$+			
uLocalFSAdapter.sendcCsdS(N((uself((u%/tmp/pip-zej_zi-build/pip/download.pyuclose�suLocalFSAdapter.closeN(u__name__u
__module__u__qualname__uNoneusenduclose(u
__locals__((u%/tmp/pip-zej_zi-build/pip/download.pyuLocalFSAdapter�suLocalFSAdaptercs>|EeZdZdZ�fdd�Z�fdd�Z�S(u
PipSessioncsLtt|�j||�t�|jd<t�|_|jdt��dS(Nu
User-Agentufile://(	usuperu
PipSessionu__init__u
user_agentuheadersuMultiDomainBasicAuthuauthumountuLocalFSAdapter(uselfuargsukwargs(u	__class__(u%/tmp/pip-zej_zi-build/pip/download.pyu__init__�suPipSession.__init__cs~tj|�}|jdkrLtj|dd�d|dd��}n|jd|j�tt|�j||||�S(Nufileiu	localhostiutimeout(u	localhost(uurlparseuschemeu
urlunparseu
setdefaultutimeoutusuperu
PipSessionurequest(uselfumethoduurluargsukwargsuparsed(u	__class__(u%/tmp/pip-zej_zi-build/pip/download.pyurequest�s
.uPipSession.requestN(u__name__u
__module__u__qualname__uNoneutimeoutu__init__urequest(u
__locals__((u	__class__u%/tmp/pip-zej_zi-build/pip/download.pyu
PipSession�su
PipSessionc

Cs�|d
krt�}ntj|�}|rq|jd�j�}|dkr||r||jd�r|td||f��n|dkr,|jdd�d}|j	dd�}t
j|�}|r�|jd�d|jdd�d}ntj
|�}|jd�r#d|jd�}n|}qq|j|�}|j�tjr^|j|jfS|j|jfSnyt|�}|j�}Wn8tk
r�tj�d}	td	t|	���YnX|j�||fS(u�Gets the content of a file; it may be a filename, file: URL, or
    http: URL.  Returns (location, content).  Content is unicode.iufileuhttpu6Requirements file %s references URL %s, which is localu:u\u/u|u$Could not open requirements file: %sN(uNoneu
PipSessionu
_scheme_reusearchugroupuloweru
startswithuInstallationErrorusplitureplaceu_url_slash_drive_reumatchuurllibuunquoteulstripugeturaise_for_statususixuPY3uurlutextucontentuopenureaduIOErrorusysuexc_infoustruclose(
uurlu
comes_fromusessionumatchuschemeupathurespufucontentue((u%/tmp/pip-zej_zi-build/pip/download.pyuget_file_content�sB*	
	

u^(http|https|file):u/*([a-z])\|cCsId|krdS|jdd�dj�}|ddddgtjkS(	u)Returns true if the name looks like a URLu:iiuhttpuhttpsufileuftpF(uFalseusplituloweruvcsuall_schemes(unameuscheme((u%/tmp/pip-zej_zi-build/pip/download.pyuis_url scCs�|jd�std|��|td�d�jd�}tj|�}tj|�r{|dd|dd�}n
d|}|S(u(
    Convert a file: URL to a path.
    ufile:u4You can only turn file: urls into filenames (not %r)Nu/iu:i(u
startswithuAssertionErrorulenulstripuurllibuunquoteu
_url_drive_reumatch(uurlupath((u%/tmp/pip-zej_zi-build/pip/download.pyuurl_to_path(s

u	^([a-z]):u^([a-z])[:|]cCs�tjjtjj|��}tjj|�\}}|jtjj�}djdd�|D��}|s|jd�}nd||S(uh
    Convert a path to a file: URL.  The path will be made absolute and have
    quoted path parts.
    u/cSsg|]}tj|��qS((uurllibuquote(u.0upart((u%/tmp/pip-zej_zi-build/pip/download.pyu
<listcomp>Cs	upath_to_url.<locals>.<listcomp>ufile:///(	uosupathunormpathuabspathu
splitdriveusplitusepujoinulstrip(upathudriveufilepathuurl((u%/tmp/pip-zej_zi-build/pip/download.pyupath_to_url;scCs0d	}t|�dj�}||kr,d
SdS(u9Return True if `name` is a considered as an archive file.u.zipu.tar.gzu.tar.bz2u.tgzu.taru	.pybundleu.whli(u.zipu.tar.gzu.tar.bz2u.tgzu.taru	.pybundleu.whlTF(usplitextuloweruTrueuFalse(unameuarchivesuext((u%/tmp/pip-zej_zi-build/pip/download.pyuis_archive_fileIscCs3t|�}|r"|j|�n
|j|�dS(N(u_get_used_vcs_backenduexportuunpack(ulinkulocationu
only_downloaduvcs_backend((u%/tmp/pip-zej_zi-build/pip/download.pyuunpack_vcs_linkSscCs=x6tjD]+}|j|jkr
||j�}|Sq
WdS(N(uvcsubackendsuschemeuschemesuurl(ulinkubackenduvcs_backend((u%/tmp/pip-zej_zi-build/pip/download.pyu_get_used_vcs_backend[su_get_used_vcs_backendcCstt|��S(N(uboolu_get_used_vcs_backend(ulink((u%/tmp/pip-zej_zi-build/pip/download.pyu
is_vcs_urlbscCs|jj�jd�S(Nufile:(uurluloweru
startswith(ulink((u%/tmp/pip-zej_zi-build/pip/download.pyuis_file_urlfscCs�|jtj|j�jkrQtjd|j||jf�td|��n|j�|jkr�tjd||j�|jf�td|j|f��ndS(NuPHash digest size of the package %d (%s) doesn't match the expected hash name %s!u!Hash name mismatch for package %su?Hash of the package %s (%s) doesn't match the expected hash %s!uBad %s hash for package %s(	udigest_sizeuhashlibunewu	hash_nameuloggerufataluHashMismatchu	hexdigestuhash(u
download_hashulink((u%/tmp/pip-zej_zi-build/pip/download.pyu_check_hashjs		u_check_hashcCs�ytj|j�}Wn6ttfk
rNtjd|j|f�dSYnXt|d�}x)|j	d�}|szPn|j
|�qa|j�|S(Nu'Unsupported hash name %s for package %surbi(uhashlibunewu	hash_nameu
ValueErroru	TypeErroruloggeruwarnuNoneuopenureaduupdateuclose(utarget_fileulinku
download_hashufpuchunk((u%/tmp/pip-zej_zi-build/pip/download.pyu_get_hash_from_fileus	
u_get_hash_from_filecst|d�}d}|jro|jroytj|j�}Wqotk
rktjd|j|f�YqoXnyt	�j
d�}Wn!tttfk
r�d}YnXd}|dkp�|}|j
}z |r|r�tjd|t|�f�q tjd|�ntjd	|�tjd
|��fdd�}	x�|	d
�D]�}
|t|
�7}|r�|s�tjdt|��q�tjdd||t|�f�n|dk	r�|j|
�n|j|
�qPW|j�Wd|rtjdt|��nX|S(Nuwbu'Unsupported hash name %s for package %sucontent-lengthii(i�uDownloading %s (%s): uDownloading %s (unknown size): uDownloading %suDownloading from URL %sc3s�ydy,x%�jj|dd�D]}|VqWWn1tk
rb}zt|��WYdd}~XnXWn9tk
r�x$�jj|�}|s�Pn|VqwYnXdS(Nudecode_contentF(urawustreamuFalseuIncompleteReaduChunkedEncodingErroruAttributeErroruread(u
chunk_sizeuchunkue(uresp(u%/tmp/pip-zej_zi-build/pip/download.pyu	resp_read�s
#
u _download_url.<locals>.resp_readiu%su	%3i%%  %sidu
%s downloadedi@�(uopenuNoneuhashu	hash_nameuhashlibunewu
ValueErroruloggeruwarnuintuheadersuKeyErroru	TypeErrorushow_urlustart_progressuformat_sizeunotifyuinfoulenu
show_progressuupdateuwriteucloseuend_progress(urespulinku
temp_locationufpu
download_hashutotal_lengthu
downloadedu
show_progressushow_urlu	resp_readuchunk((urespu%/tmp/pip-zej_zi-build/pip/download.pyu
_download_url�sF
"	 (u
_download_urlcCsd}tjj||j�}tjj|�r�tdt|�d	�}|dkr^d
}q�|dkr�t	j
dt|��tj|�q�|dkr�t|�}t	j
dt|�t|�f�t
j||�q�n|rt
j||�t	jdt|��ndS(Nu/The file %s exists. (i)gnore, (w)ipe, (b)ackup uiuwubuDeleting %suBacking up %s to %suSaved %sT(uiuwubF(uTrueuosupathujoinufilenameuexistsuask_path_existsudisplay_pathuFalseuloggeruwarnuremoveu
backup_dirushutilumoveucopyunotify(ufilenameulocationucontent_typeulinkucopyudownload_locationuresponseu	dest_file((u%/tmp/pip-zej_zi-build/pip/download.pyu
_copy_file�s&		u
_copy_filec0Cs�|dkrt�}ntjdd�}d}|jjdd�d}d}d}	d}
d}|r�tjj	|t
j|d��}	|	d}
tjj|	�o�tjj|
�}tjj
|�s�t|�q�nd}|rtjj	||j�}tjj|�sd}qn|r�|}tj|�d}
tjd|�|jr�t||�}yt||�Wq�tk
r�tjd	|�d}tj|�d}Yq�Xq�n|r�|r�t|
��}|j�j�}
WdQX|	}tjd
|	�|jr�|jr�t|	|�}yt||�Wq�tk
r�tjd|�d}tj|	�tj|
�d}Yq�Xq�n|s-y#|j|dd�}|j �WnHt!j"k
r�}z%tj#d
|j$j%|f��WYdd}~XnX|j&jdd�}
|j}|j&jd�}|r^t'j(|�\}}|jd�pX|}nt)|�d}|s�tj*|
�}|r�||7}q�n|r�|j|jkr�tjj)|j�d}|r�||7}q�ntjj	||�}t+|||�}|jr-|jr-t||�q-n|rP|rPt,|||
|�nt-|||
|�|	r�|r�t.|	||
�n|p�|s�tj|�ntj/|�dS(Nu-unpackupip-u#iiuu
.content-typeuFile was already downloaded %su;Previously-downloaded file %s has bad hash, re-downloading.uUsing download cache from %su,Cached file %s has bad hash, re-downloading.ustreamuHTTP error %s while getting %sucontent-typeucontent-dispositionufilenameFT(0uNoneu
PipSessionutempfileumkdtempuurlusplituFalseuosupathujoinuurllibuquoteuexistsuisdirucreate_download_cache_folderufilenameu	mimetypesu
guess_typeuloggerunotifyuhashu_get_hash_from_fileu_check_hashuHashMismatchuwarnuunlinkuopenureadustripu	hash_nameugetuTrueuraise_for_statusurequestsu	HTTPErrorufataluresponseustatus_codeuheadersucgiuparse_headerusplitextuguess_extensionu
_download_urlu
_copy_fileuunpack_fileucache_downloadurmdir(ulinkulocationudownload_cacheudownload_dirusessionutemp_diru
temp_locationu
target_urlualready_cachedu
cache_fileucache_content_type_fileu
download_hashualready_downloadeducontent_typeufpurespuexcufilenameucontent_dispositionutypeuparamsuext((u%/tmp/pip-zej_zi-build/pip/download.pyuunpack_http_url�s�
	





		

c
Cs�t|j�}d}tjj|�r`tjj|�rFt|�ntj||dd�dS|j
r�t||�}t||�n|rMtjj
||j�}tjj|�rMtj|�d}tjd|�|j
rAt||�}yt||�d}WqGtk
r=tjd|�tj|�YqGXqJd}qMn|r\|}	n|}	tj|	�d}t|	|||�|r�|r�t|	|||�ndS(NusymlinksiuFile was already downloaded %su;Previously-downloaded file %s has bad hash, re-downloading.FT(uurl_to_pathuurl_without_fragmentuFalseuosupathuisdirurmtreeushutilucopytreeuTrueuhashu_get_hash_from_fileu_check_hashujoinufilenameuexistsu	mimetypesu
guess_typeuloggerunotifyuHashMismatchuwarnuunlinkuunpack_fileu
_copy_file(
ulinkulocationudownload_diru	link_pathualready_downloadedulink_path_hashu
download_pathucontent_typeu
download_hashu	from_path((u%/tmp/pip-zej_zi-build/pip/download.pyuunpack_file_urlRsB
		


	
F(Rucgiuemail.utilsuemailuhashlibugetpassu	mimetypesuosuplatformureushutilusysutempfileupipupip.backwardcompatuurllibuurlparseu	raw_inputupip.exceptionsuInstallationErroruHashMismatchupip.utilusplitexturmtreeuformat_sizeudisplay_pathu
backup_diruask_path_existsuunpack_fileucreate_download_cache_folderucache_downloadupip.vcsuvcsupip.loguloggerupip._vendorurequestsusixupip._vendor.requests.adaptersuBaseAdapterupip._vendor.requests.authuAuthBaseu
HTTPBasicAuthupip._vendor.requests.compatuIncompleteReadupip._vendor.requests.exceptionsu
InvalidURLuChunkedEncodingErrorupip._vendor.requests.modelsuResponseupip._vendor.requests.structuresuCaseInsensitiveDictu__all__u
user_agentuMultiDomainBasicAuthuobjectuLocalFSResponseuLocalFSAdapteruSessionu
PipSessionuNoneuget_file_contentucompileuIu
_scheme_reu_url_slash_drive_reuis_urluurl_to_pathu	_drive_reu
_url_drive_reupath_to_urluis_archive_fileuFalseuunpack_vcs_linku_get_used_vcs_backendu
is_vcs_urluis_file_urlu_check_hashu_get_hash_from_fileu
_download_urlu
_copy_fileuunpack_http_urluunpack_file_url(((u%/tmp/pip-zej_zi-build/pip/download.pyu<module>sh@	"M#,
<ysite-packages/pip/__pycache__/baseparser.cpython-33.pyc000064400000030500151733463520017045 0ustar00�
7�Re�c@s�dZddlZddlZddlZddlZddlmZddlmZm	Z	ddl
mZddlm
Z
mZddlmZGdd	�d	ej�ZGd
d�de�ZGdd
�d
ej�ZGdd�de�ZdS(uBase option parser setupiN(u	strtobool(uConfigParserustring_types(udefault_config_file(uget_terminal_sizeuget_prog(u
pkg_resourcescBs�|EeZdZdZdd�Zdd�Zdddd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dd�ZdS(uPrettyHelpFormatteru4A prettier/less verbose help formatter for optparse.cOsCd|d<d|d<t�dd|d<tjj|||�dS(Niumax_help_positioniuindent_incrementiiuwidth(uget_terminal_sizeuoptparseuIndentedHelpFormatteru__init__(uselfuargsukwargs((u'/tmp/pip-zej_zi-build/pip/baseparser.pyu__init__s

uPrettyHelpFormatter.__init__cCs|j|dd�S(Nu <%s>u, (u_format_option_strings(uselfuoption((u'/tmp/pip-zej_zi-build/pip/baseparser.pyuformat_option_stringssu)PrettyHelpFormatter.format_option_stringsu <%s>u, cCs�g}|jr&|j|jd�n|jrF|j|jd�nt|�dkrk|jd|�n|j�r�|jp�|jj�}|j||j��ndj	|�S(u
        Return a comma-separated list of option strings and metavars.

        :param option:  tuple of (short opt, long opt), e.g: ('-f', '--format')
        :param mvarfmt: metavar format string - evaluated as mvarfmt % metavar
        :param optsep:  separator
        iiu(
u_short_optsuappendu
_long_optsulenuinsertutakes_valueumetavarudestulowerujoin(uselfuoptionumvarfmtuoptsepuoptsumetavar((u'/tmp/pip-zej_zi-build/pip/baseparser.pyu_format_option_stringss		u*PrettyHelpFormatter._format_option_stringscCs|dkrdS|dS(NuOptionsuu:
((uselfuheading((u'/tmp/pip-zej_zi-build/pip/baseparser.pyuformat_heading3su"PrettyHelpFormatter.format_headingcCs#d|jtj|�d�}|S(uz
        Ensure there is only one newline between usage and the first heading
        if there is no description.
        u
Usage: %s
u  (uindent_linesutextwrapudedent(uselfuusageumsg((u'/tmp/pip-zej_zi-build/pip/baseparser.pyuformat_usage8su PrettyHelpFormatter.format_usagecCsy|rqt|jd�r!d}nd}|jd�}|j�}|jtj|�d�}d||f}|SdSdS(NumainuCommandsuDescriptionu
u  u%s:
%s
u(uhasattruparserulstripurstripuindent_linesutextwrapudedent(uselfudescriptionulabel((u'/tmp/pip-zej_zi-build/pip/baseparser.pyuformat_description@s	u&PrettyHelpFormatter.format_descriptioncCs|r
|SdSdS(Nu((uselfuepilog((u'/tmp/pip-zej_zi-build/pip/baseparser.pyu
format_epilogRsu!PrettyHelpFormatter.format_epilogcs/�fdd�|jd�D�}dj|�S(Ncsg|]}�|�qS(((u.0uline(uindent(u'/tmp/pip-zej_zi-build/pip/baseparser.pyu
<listcomp>Zs	u4PrettyHelpFormatter.indent_lines.<locals>.<listcomp>u
(usplitujoin(uselfutextuindentu	new_lines((uindentu'/tmp/pip-zej_zi-build/pip/baseparser.pyuindent_linesYs"u PrettyHelpFormatter.indent_linesN(u__name__u
__module__u__qualname__u__doc__u__init__uformat_option_stringsu_format_option_stringsuformat_headinguformat_usageuformat_descriptionu
format_epiloguindent_lines(u
__locals__((u'/tmp/pip-zej_zi-build/pip/baseparser.pyuPrettyHelpFormattersuPrettyHelpFormattercBs&|EeZdZdZdd�ZdS(uUpdatingDefaultsHelpFormatteru�Custom help formatter for use in ConfigOptionParser that updates
    the defaults before expanding them, allowing them to show up correctly
    in the help listingcCs;|jdk	r(|jj|jj�ntjj||�S(N(uparseruNoneuupdate_defaultsudefaultsuoptparseuIndentedHelpFormatteruexpand_default(uselfuoption((u'/tmp/pip-zej_zi-build/pip/baseparser.pyuexpand_defaultcsu,UpdatingDefaultsHelpFormatter.expand_defaultN(u__name__u
__module__u__qualname__u__doc__uexpand_default(u
__locals__((u'/tmp/pip-zej_zi-build/pip/baseparser.pyuUpdatingDefaultsHelpFormatter^suUpdatingDefaultsHelpFormattercBs2|EeZdZdd�Zedd��ZdS(uCustomOptionParsercOs6|j||�}|jj�|jj||�|S(u*Insert an OptionGroup at a given position.(uadd_option_groupu
option_groupsupopuinsert(uselfuidxuargsukwargsugroup((u'/tmp/pip-zej_zi-build/pip/baseparser.pyuinsert_option_groupjs
u&CustomOptionParser.insert_option_groupcCs;|jdd�}x!|jD]}|j|j�qW|S(u<Get a list of all options, including those in option groups.N(uoption_listu
option_groupsuextend(uselfuresui((u'/tmp/pip-zej_zi-build/pip/baseparser.pyuoption_list_allssu"CustomOptionParser.option_list_allN(u__name__u
__module__u__qualname__uinsert_option_groupupropertyuoption_list_all(u
__locals__((u'/tmp/pip-zej_zi-build/pip/baseparser.pyuCustomOptionParseris	uCustomOptionParsercBs�|EeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	ddd�Z
dd�Zdd�ZdS(uConfigOptionParserusCustom option parser which updates its defaults by checking the
    configuration files and environmental variablescOsxtj�|_|jd�|_|j�|_|jrO|jj|j�n|js^t�t	j
j|||�dS(Nuname(uConfigParseruRawConfigParseruconfigupopunameuget_config_filesufilesureaduAssertionErroruoptparseuOptionParseru__init__(uselfuargsukwargs((u'/tmp/pip-zej_zi-build/pip/baseparser.pyu__init__�s	uConfigOptionParser.__init__cCsNtjjdd�}|tjkr(gS|rGtjj|�rG|gStgS(NuPIP_CONFIG_FILEF(uosuenvironugetuFalseudevnullupathuexistsudefault_config_file(uselfuconfig_file((u'/tmp/pip-zej_zi-build/pip/baseparser.pyuget_config_files�su#ConfigOptionParser.get_config_filescCs[y|j||�SWn@tjk
rVtj�d}td|�tjd�YnXdS(Niu*An error occurred during configuration: %si(ucheck_valueuoptparseuOptionValueErrorusysuexc_infouprintuexit(uselfuoptionukeyuvalue((u'/tmp/pip-zej_zi-build/pip/baseparser.pyu
check_default�su ConfigOptionParser.check_defaultcs#i}x6d�jfD]%}|j�j�j|���qW|j�j�j���x�|j�D]�\�}�j����dk	rh|s�qhn�jd	kr�t	|�}n�jdkr�|j
�}���fdd�|D�}n�j��|�}||�j<qhqhW|S(
u�Updates the given defaults with values from the config files and
        the environ. Does a little special handling for certain types of
        options (lists).uglobalu
store_trueustore_falseucountuappendcs%g|]}�j��|��qS((u
check_default(u.0uv(ukeyuoptionuself(u'/tmp/pip-zej_zi-build/pip/baseparser.pyu
<listcomp>�s	u6ConfigOptionParser.update_defaults.<locals>.<listcomp>N(u
store_trueustore_falseucount(
unameuupdateunormalize_keysuget_config_sectionuget_environ_varsuitemsu
get_optionuNoneuactionu	strtoboolusplitu
check_defaultudest(uselfudefaultsuconfigusectionuval((ukeyuoptionuselfu'/tmp/pip-zej_zi-build/pip/baseparser.pyuupdate_defaults�s"#"u"ConfigOptionParser.update_defaultscCsYi}xL|D]D\}}|jdd�}|jd�sGd|}n|||<q
W|S(u�Return a config dictionary with normalized keys regardless of
        whether the keys were specified in environment variables or in config
        filesu_u-u--u--%s(ureplaceu
startswith(uselfuitemsu
normalizedukeyuval((u'/tmp/pip-zej_zi-build/pip/baseparser.pyunormalize_keys�s
u!ConfigOptionParser.normalize_keyscCs&|jj|�r"|jj|�SgS(u Get a section of a configuration(uconfiguhas_sectionuitems(uselfuname((u'/tmp/pip-zej_zi-build/pip/baseparser.pyuget_config_section�su%ConfigOptionParser.get_config_sectionuPIP_ccsSxLtjj�D];\}}|j|�r|j|d�j�|fVqqWdS(u@Returns a generator with all environmental vars with prefix PIP_uN(uosuenvironuitemsu
startswithureplaceulower(uselfuprefixukeyuval((u'/tmp/pip-zej_zi-build/pip/baseparser.pyuget_environ_vars�su#ConfigOptionParser.get_environ_varscCs�|jstj|j�S|j|jj��}x]|j�D]O}|j|j�}t	|t
�r>|j�}|j||�||j<q>q>Wtj|�S(u�Overridding to make updating the defaults after instantiation of
        the option parser possible, update_defaults() does the dirty work.(
uprocess_default_valuesuoptparseuValuesudefaultsuupdate_defaultsucopyu_get_all_optionsugetudestu
isinstanceustring_typesuget_opt_stringucheck_value(uselfudefaultsuoptionudefaultuopt_str((u'/tmp/pip-zej_zi-build/pip/baseparser.pyuget_default_values�s	 u%ConfigOptionParser.get_default_valuescCs(|jtj�|jdd|�dS(Niu%s
(uprint_usageusysustderruexit(uselfumsg((u'/tmp/pip-zej_zi-build/pip/baseparser.pyuerror�suConfigOptionParser.errorN(
u__name__u
__module__u__qualname__u__doc__u__init__uget_config_filesu
check_defaultuupdate_defaultsunormalize_keysuget_config_sectionuget_environ_varsuget_default_valuesuerror(u
__locals__((u'/tmp/pip-zej_zi-build/pip/baseparser.pyuConfigOptionParser}s	uConfigOptionParser(u__doc__usysuoptparseuosutextwrapudistutils.utilu	strtoboolupip.backwardcompatuConfigParserustring_typesu
pip.locationsudefault_config_fileupip.utiluget_terminal_sizeuget_progupip._vendoru
pkg_resourcesuIndentedHelpFormatteruPrettyHelpFormatteruUpdatingDefaultsHelpFormatteruOptionParseruCustomOptionParseruConfigOptionParser(((u'/tmp/pip-zej_zi-build/pip/baseparser.pyu<module>sOsite-packages/pip/__pycache__/index.cpython-33.pyc000064400000121622151733463520016033 0ustar00�
7�Reӝc@s�dZddlZddlZddlZddlZddlZddlmZddlm	Z	m
Z
mZmZddl
mZmZmZmZmZddlmZmZddlmZmZmZddlmZmZdd	lmZmZm Z dd
l!m"Z"m#Z#m$Z$ddl%m&Z&dgZ'd
Z(idgd6Z)Gdd�de*�Z+Gdd�de*�Z,Gdd�de*�Z-Gdd�de*�Z.e.e	�Z/dd�Z0dd�Z1dS(u!Routines related to PyPI, indexesiN(ulogger(uInfunormalize_nameusplitextu
is_prerelease(uDistributionNotFounduBestVersionAlreadyInstalleduInstallationErroruInvalidWheelFilenameuUnsupportedWheel(uurlparseuurl2pathname(u
PipSessionuurl_to_pathupath_to_url(uWheelu	wheel_ext(usupported_tagsusupported_tags_noarchuget_platform(uhtml5liburequestsu
pkg_resources(uSSLErroru
PackageFinderulast.pypi.python.orguhttpsuhttpc	Bs
|EeZdZdZd"ggd#d#d#d!dd�Zdd�Zdd�Z	dd	�Z
d
d�Zdd
�Zdd�Z
dd�Zejd�Zejdej�Zejd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!S($u
PackageFinderu�This finds packages.

    This is meant to match easy_install's technique for looking for
    packages, by reading pages and looking for appropriate links
    c

Cs�||_||_g|_t�|_t�|_||_tdd�|D��|_tdd�|D��|_	|j|j	O_||_
d|_d|_
||_||_d|_|	p�t�|_dS(Ncss|]}t|�VqdS(N(unormalize_name(u.0un((u"/tmp/pip-zej_zi-build/pip/index.pyu	<genexpr>4su)PackageFinder.__init__.<locals>.<genexpr>css|]}t|�VqdS(N(unormalize_name(u.0un((u"/tmp/pip-zej_zi-build/pip/index.pyu	<genexpr>8sF(u
find_linksu
index_urlsudependency_linksu	PageCacheucacheusetulogged_linksu	use_wheeluallow_externaluallow_unverifieduallow_all_externaluFalseuneed_warn_externaluneed_warn_unverifieduallow_all_prereleasesuprocess_dependency_linksu_have_warned_dependency_linksu
PipSessionusession(
uselfu
find_linksu
index_urlsu	use_wheeluallow_externaluallow_unverifieduallow_all_externaluallow_all_prereleasesuprocess_dependency_linksusession((u"/tmp/pip-zej_zi-build/pip/index.pyu__init__&s"										uPackageFinder.__init__cCsE|jrA|js.tjdd�d|_n|jj|�ndS(Nu1.6upDependency Links processing has been deprecated with an accelerated time schedule and will be removed in pip 1.6T(uprocess_dependency_linksu_have_warned_dependency_linksuloggeru
deprecateduTrueudependency_linksuextend(uselfulinks((u"/tmp/pip-zej_zi-build/pip/index.pyuadd_dependency_linksSs		u"PackageFinder.add_dependency_linksc	sJg�g���fdd�}x|D]}tjj|�}|jd�}||jk}|sj|r/|ry|}nt|�}|r�tjj|�r�tjj|�}xztj|�D]}|tjj	||��q�Wq<|r
tjj|�r
�j
|�q<tjj|�r<||�q<q(�j
|�q(W��fS(ut
        Sort locations into "files" (archives) and "urls", and return
        a pair of lists (files,urls)
        csLt|�}tj|dd�ddkr;�j|�n
�j|�dS(Nustrictiu	text/htmlF(upath_to_urlu	mimetypesu
guess_typeuFalseuappend(upathuurl(ufilesuurls(u"/tmp/pip-zej_zi-build/pip/index.pyu	sort_pathksu0PackageFinder._sort_locations.<locals>.sort_pathufile:(uosupathuexistsu
startswithu
find_linksuurl_to_pathuisdirurealpathulistdirujoinuappenduisfile(	uselfu	locationsu	sort_pathuurlu
is_local_pathuis_file_urluis_find_linkupathuitem((ufilesuurlsu"/tmp/pip-zej_zi-build/pip/index.pyu_sort_locationsbs*
	 uPackageFinder._sort_locationscCs�|\}}}|jr�tt�}|tkr9d}nW|jtkr�t|j�}|j�syt	d|j��n|j
�}n|}||fS|SdS(uL
        Function used to generate link sort key for link tuples.
        The greater the return value, the more preferred it is.
        If not finding wheels, then sorted by version only.
        If finding wheels, then the sort order is by version, then:
          1. existing installs
          2. wheels ordered via Wheel.support_index_min()
          3. source archives
        Note: it was considered to embed this logic into the Link
              comparison operators, but then different sdist links
              with the same version, would have to be considered equal
        iuB%s is not a supported wheel for this platform. It can't be sorted.N(u	use_wheelulenusupported_tagsuINSTALLED_VERSIONuextu	wheel_extuWheelufilenameu	supporteduUnsupportedWheelusupport_index_min(uselfu
link_tupleuparsed_versionulinku_usupport_numupriuwheel((u"/tmp/pip-zej_zi-build/pip/index.pyu_link_sort_key�s
		
uPackageFinder._link_sort_keycCst|d|jdd�S(u�
        Bring the latest version (and wheels) to the front, but maintain the existing ordering as secondary.
        See the docstring for `_link_sort_key` for details.
        This function is isolated for easier unit testing.
        ukeyureverseT(usortedu_link_sort_keyuTrue(uselfuapplicable_versions((u"/tmp/pip-zej_zi-build/pip/index.pyu_sort_versions�suPackageFinder._sort_versionscs�fdd��|j�d}|jr�t�|jd�dd2�}|j||�}|dkr�|jt|jddd2��|�p�|j�q�n�dk	r��fdd�|jD�|j}nt|j�}xH|j	D]=}�dk	r�|dk	r�t
j|j|�g|}q�q�W|j
|�\}}|j
|j�\}	}
|j|	�dd�|D�}|jdd�|
D��tjd	|�x�|D]�}tjd
|�tjt|��}|jtkr�t|j}
t|
�dkr3||j|
d|jf}tjd|�q�t|
�dkrz||jd
j|
�|jf}tjd|�q�||jf}tjd|�q�q�Wg}|j|jdd�|jD�|jj���g}xy|j||�D]e}tjd|j�tjd7_z)|j|j|j|jj���Wdtjd8_Xq�Wt|jdd�|jD�|jj���}|r�tjdd
jdd�|D���nt|jdd�|D�|jj���}|rj|rj|rj|rjtj d|�|j!r7tjd|j�n|j"rWtjd|j�nt#d|��ng}|j$dk	r�|j$j%t&|j$j'fg}n|r�|j(dd2�tjdd
jdd�|D���n|||||}g}x�|D]�\}}}||j)kr]tjd||djd d�|j)j*D��f�qnKt+|�r�|j,px|j-r�|t&k	r�tjd!||f�qq�n|j.|||f�qW|j/|�}t0d"d�|D��}|rN|rN|ddt&kr%tjd#|j$j'�n%tjd$|j$j'|ddf�dS|s�tj d%|d
jd&d�|D��f�|j!r�tjd'�n|j"r�tjd|j�nt#d(|��n|ddt&kr-tjd)|j$j'd
jd*d�|dd�D��pd+f�t1�nt|�dkrwtjd,|ddd
jd-d�|D��f�n|dd}|j2dk	r�|j2r�tjd.|j�n|j3dk	r�|j3r�tjd/|j�n|j4rtj5d0d1|j�n|S(3Ncs2tj|��}|jd�s.|d}n|S(Nu/(u	posixpathujoinuendswith(uurluloc(uurl_name(u"/tmp/pip-zej_zi-build/pip/index.pyumkurl_pypi_url�s
u6PackageFinder.find_requirement.<locals>.mkurl_pypi_urliutrustedcsg|]}�|��qS(((u.0uurl(umkurl_pypi_url(u"/tmp/pip-zej_zi-build/pip/index.pyu
<listcomp>�s	u2PackageFinder.find_requirement.<locals>.<listcomp>cSs"g|]}t|dd��qS(utrustedT(uLinkuTrue(u.0uurl((u"/tmp/pip-zej_zi-build/pip/index.pyu
<listcomp>�s	cSsg|]}t|��qS((uLink(u.0uurl((u"/tmp/pip-zej_zi-build/pip/index.pyu
<listcomp>�s	u#URLs to search for versions for %s:u* %siuS%s uses an insecure transport scheme (%s). Consider using %s if %s has it availableu, uc%s uses an insecure transport scheme (%s). Consider using one of %s if %s has any of them availableu*%s uses an insecure transport scheme (%s).cSs%g|]}t|ddd��qS(u-futrustedT(uLinkuTrue(u.0uurl((u"/tmp/pip-zej_zi-build/pip/index.pyu
<listcomp>�s	uAnalyzing links from page %sicSsg|]}t|��qS((uLink(u.0uurl((u"/tmp/pip-zej_zi-build/pip/index.pyu
<listcomp>s	udependency_links found: %scSs"g|]\}}}|j�qS((uurl(u.0uparsedulinkuversion((u"/tmp/pip-zej_zi-build/pip/index.pyu
<listcomp>s	cSsg|]}t|��qS((uLink(u.0uurl((u"/tmp/pip-zej_zi-build/pip/index.pyu
<listcomp>s	u<Could not find any downloads that satisfy the requirement %suMSome externally hosted files were ignored (use --allow-external %s to allow).uWSome insecure and unverifiable files were ignored (use --allow-unverified %s to allow).u$No distributions at all found for %sureverseuLocal files found: %scSs(g|]\}}}t|j��qS((uurl_to_pathuurl(u.0uparsedulinkuversion((u"/tmp/pip-zej_zi-build/pip/index.pyu
<listcomp>s	u-Ignoring link %s, version %s doesn't match %su,cSsg|]}dj|��qS(u(ujoin(u.0us((u"/tmp/pip-zej_zi-build/pip/index.pyu
<listcomp>"s	uCIgnoring link %s, version %s is a pre-release (use --pre to allow).cSs+g|]!\}}}|tkr|�qS((uINSTALLED_VERSION(u.0uparsed_versionulinkuversion((u"/tmp/pip-zej_zi-build/pip/index.pyu
<listcomp>,s	uLExisting installed version (%s) is most up-to-date and satisfies requirementuUExisting installed version (%s) satisfies requirement (most up-to-date version is %s)uNCould not find a version that satisfies the requirement %s (from versions: %s)cSsg|]\}}}|�qS(((u.0uparsed_versionulinkuversion((u"/tmp/pip-zej_zi-build/pip/index.pyu
<listcomp>7s	uJSome externally hosted files were ignored (use --allow-external to allow).u,No distributions matching the version for %su=Installed version (%s) is most up-to-date (past versions: %s)cSsg|]\}}}|�qS(((u.0uparsed_versionulinkuversion((u"/tmp/pip-zej_zi-build/pip/index.pyu
<listcomp>Fs	unoneu)Using version %s (newest of versions: %s)cSsg|]\}}}|�qS(((u.0uparsed_versionulinkuversion((u"/tmp/pip-zej_zi-build/pip/index.pyu
<listcomp>Js	u2%s an externally hosted file and may be unreliableu,%s is potentially insecure and unverifiable.u1.7ua%s discovered using a deprecated method of parsing, in the future it will no longer be discoveredT(6uurl_nameuNoneu
index_urlsuLinkuTrueu	_get_pageu_find_url_nameu
find_linksulistuabsolute_versionsu	posixpathujoinuurlu_sort_locationsudependency_linksuextenduloggerudebuguurlparseustruschemeuINSECURE_SCHEMESulenunetlocuwarnu_package_versionsunameuloweru
_get_pagesuindentulinksuinfoufataluneed_warn_externaluneed_warn_unverifieduDistributionNotFoundusatisfied_byuparsed_versionuINSTALLED_VERSIONuversionusorturequspecsu
is_prereleaseuallow_all_prereleasesuprereleasesuappendu_sort_versionsubooluBestVersionAlreadyInstalleduinternalu
verifiableu_deprecated_regexu
deprecated(uselfurequupgradeumain_index_urlupageu	locationsuversionufile_locationsu
url_locationsu_flocationsu_ulocationsulocationuparsedusecure_schemesuctxufound_versionsu
page_versionsudependency_versionsu
file_versionsuinstalled_versionuall_versionsuapplicable_versionsuparsed_versionulinkuexisting_applicableuselected_version((umkurl_pypi_urluurl_nameu"/tmp/pip-zej_zi-build/pip/index.pyufind_requirement�s�
		7#


			&)	(*	%				!*	-	
			$				:		/
	
		uPackageFinder.find_requirementcCs�|jjd�s$|jd7_n|j||�}|dkrWtjd|�dSt|j�}xY|jD]N}t	j
|jjd��}|t|�krptj
d||f�|SqpWdS(u�Finds the true URL name of a package, when the given name isn't quite correct.
        This is usually used to implement case-insensitivity.u/uCannot fetch index base URL %sNu!Real name of requirement %s is %s(uurluendswithu	_get_pageuNoneuloggerufatalunormalize_nameuurl_nameulinksu	posixpathubasenameupathurstripunotify(uselfu	index_urluurl_nameurequpageu	norm_nameulinkubase((u"/tmp/pip-zej_zi-build/pip/index.pyu_find_url_namebsuPackageFinder._find_url_namec	cs7t|�}t�}x|r2|jd�}||kr?qn|j|�|j||�}|dkrpqn|Vx�|j�D]�}t|j�j	�}||j
kr�|jr�d|_
tjd|�q�n|jdk	r|jr||jkrtjd|�d|_q�n|j|�q�WqWdS(u�
        Yields (page, page_url) from the given locations, skipping
        locations that have errors, and adding download/homepage links
        iu@Not searching %s for files because external urls are disallowed.u_Not searching %s for urls, it is an untrusted link and cannot produce safe or verifiable files.NT(ulistusetupopuaddu	_get_pageuNoneu	rel_linksunormalize_nameunameuloweruallow_externaluallow_all_externaluTrueuneed_warn_externaluloggerudebugutrusteduallow_unverifieduneed_warn_unverifieduappend(	uselfu	locationsurequ
all_locationsuseenulocationupageulinku
normalized((u"/tmp/pip-zej_zi-build/pip/index.pyu
_get_pagesus6		

		
		uPackageFinder._get_pagesu#egg=([^&]*)u([a-z0-9_.]+)-([a-z0-9_.-]+)u-py([123]\.?[0-9]?)$cCsqgg}}t�}xP|D]H}||kr|j|�|jrU|j|�qe|j|�qqW||S(ugReturns elements of links in order, non-egg links first, egg links second, while eliminating duplicates(usetuadduegg_fragmentuappend(uselfulinksueggsuno_eggsuseenulink((u"/tmp/pip-zej_zi-build/pip/index.pyu_sort_links�s
	

	uPackageFinder._sort_linksccs@x9|j|�D](}x|j||�D]}|Vq)WqWdS(N(u_sort_linksu_link_package_versions(uselfulinksusearch_nameulinkuv((u"/tmp/pip-zej_zi-build/pip/index.pyu_package_versions�suPackageFinder._package_versionscCsd}|jr|tfS|S(Nu.tar.gzu.tar.bz2u.taru.tgzu.zip(u.tar.gzu.tar.bz2u.taru.tgzu.zip(u	use_wheelu	wheel_ext(uselfu
extensions((u"/tmp/pip-zej_zi-build/pip/index.pyu_known_extensions�s	uPackageFinder._known_extensionscCst�}d}|jr$|j}nN|j�\}}|ss||jkrotjd|�|jj|�ngS|jd�r�|dd�}d|}n||j	�kr�||jkr�tjd||f�|jj|�ngSd|j
kr@|dkr@||jkr<tjd|�|jj|�ngS|tkrryt|j
�}Wn'tk
r�tjd	|�gSYnX|jj�|j�kr�tjd
||f�gS|j�s�tjd|�gSt|dd�}|jd
�rf|jd�rf|dk	rftj|j�jjd�rf|jdt�sftjd|�gSn|j}n|s�|j|||�}n|dkr�tjd
||f�gS|jdk	r|jrt|�j�|jkr|jrtjd|�d|_gS|j dk	re|j ret|�j�|j!kretjd|�d|_"gS|j#j$|�}	|	r�|d|	j%��}|	j&d�}
|
t'jdd�kr�tjd|�gSntjd||f�t(j)|�||fgS(u�
        Return an iterable of triples (pkg_resources_version_key,
        link, python_version) that can be extracted from the given
        link.

        Meant to be overridden by subclasses, not called by clients.
        uSkipping link %s; not a fileu.tarNiu,Skipping link %s; unknown archive format: %sumacosx10u.zipuSkipping link %s; macosx10 oneu1Skipping %s because the wheel filename is invalidu-Skipping link %s; wrong project name (not %s)u9Skipping %s because it is not compatible with this Pythonu
comes_fromuwinumacosxupypi.python.orgutagsuOSkipping %s because it is a pypi-hosted binary Wheel on an unsupported platformu,Skipping %s because it is externally hosted.u<Skipping %s because it is an insecure and unverifiable file.iiu/Skipping %s because Python version is incorrectuFound link %s, version: %si����T(*uget_platformuNoneuegg_fragmentusplitextulogged_linksuloggerudebuguadduendswithu_known_extensionsupathu	wheel_extuWheelufilenameuInvalidWheelFilenameunameuloweru	supportedugetattru
startswithuurlparseuurlunetlocusupported_tags_noarchuversionu_egg_info_matchesuinternalunormalize_nameuallow_externaluallow_all_externaluTrueuneed_warn_externalu
verifiableuallow_unverifieduneed_warn_unverifiedu_py_version_reusearchustartugroupusysu
pkg_resourcesu
parse_version(uselfulinkusearch_nameuplatformuversionuegg_infouextuwheelu
comes_fromumatchu
py_version((u"/tmp/pip-zej_zi-build/pip/index.pyu_link_package_versions�s�		

		

	
		u$PackageFinder._link_package_versionscCs�|jj|�}|s-tjd|�dS|jd�j�}|jdd�}|j�d}|j|�r�|jd�t	|�d�SdSdS(Nu%Could not parse version from link: %siu_u-(
u_egg_info_reusearchuloggerudebuguNoneugroupulowerureplaceu
startswithulen(uselfuegg_infousearch_nameulinkumatchunameulook_for((u"/tmp/pip-zej_zi-build/pip/index.pyu_egg_info_matches&suPackageFinder._egg_info_matchescCs"tj||d|jd|j�S(Nucacheusession(uHTMLPageuget_pageucacheusession(uselfulinkureq((u"/tmp/pip-zej_zi-build/pip/index.pyu	_get_page5s	uPackageFinder._get_pageNTF(u__name__u
__module__u__qualname__u__doc__uTrueuFalseuNoneu__init__uadd_dependency_linksu_sort_locationsu_link_sort_keyu_sort_versionsufind_requirementu_find_url_nameu
_get_pagesureucompileu_egg_fragment_reuIu_egg_info_reu_py_version_reu_sort_linksu_package_versionsu_known_extensionsu_link_package_versionsu_egg_info_matchesu	_get_page(u
__locals__((u"/tmp/pip-zej_zi-build/pip/index.pyu
PackageFinders(	*(�)
lcBsw|EeZdZdZdZdd�Zdd�Zdd�Zd	d
�Zddd�Z
d
d�Zdd�ZdS(u	PageCacheuCache of HTML pagesicCsi|_i|_i|_dS(N(u	_failuresu_pagesu	_archives(uself((u"/tmp/pip-zej_zi-build/pip/index.pyu__init__As		uPageCache.__init__cCs|jj|d�|jkS(Ni(u	_failuresugetu
failure_limit(uselfuurl((u"/tmp/pip-zej_zi-build/pip/index.pyutoo_many_failuresFsuPageCache.too_many_failurescCs|jj|�S(N(u_pagesuget(uselfuurl((u"/tmp/pip-zej_zi-build/pip/index.pyuget_pageIsuPageCache.get_pagecCs|jj|d�S(NF(u	_archivesugetuFalse(uselfuurl((u"/tmp/pip-zej_zi-build/pip/index.pyu
is_archiveLsuPageCache.is_archivecCs||j|<dS(N(u	_archives(uselfuurluvalue((u"/tmp/pip-zej_zi-build/pip/index.pyuset_is_archiveOsuPageCache.set_is_archivecCs$|jj|d�||j|<dS(Ni(u	_failuresuget(uselfuurlulevel((u"/tmp/pip-zej_zi-build/pip/index.pyuadd_page_failureRsuPageCache.add_page_failurecCs"x|D]}||j|<qWdS(N(u_pages(uselfuurlsupageuurl((u"/tmp/pip-zej_zi-build/pip/index.pyuadd_pageUs
uPageCache.add_pageNT(
u__name__u
__module__u__qualname__u__doc__u
failure_limitu__init__utoo_many_failuresuget_pageu
is_archiveuTrueuset_is_archiveuadd_page_failureuadd_page(u
__locals__((u"/tmp/pip-zej_zi-build/pip/index.pyu	PageCache<su	PageCachecBsG|EeZdZdZejdej�Zejdej�Zejdejej	B�Z
d!d!dd�Zdd�Z
ed!d"d!d	d
��Zed!dd!dd
��Zed!dd��Zedd��Zedd��Zedd��Zdd�Zd#dd�Zdd�Zejdej�Zdd �Zd!S($uHTMLPageu'Represents one page, along with its URLu<th>\s*home\s*pageu<th>\s*download\s+urlu(href=(?:"([^"]*)"|'([^']*)'|([^>\s\n]*))cCsC||_tj|jdd�|_||_||_||_dS(NunamespaceHTMLElementsF(ucontentuhtml5libuparseuFalseuparseduurluheadersutrusted(uselfucontentuurluheadersutrusted((u"/tmp/pip-zej_zi-build/pip/index.pyu__init__bs
			uHTMLPage.__init__cCs|jS(N(uurl(uself((u"/tmp/pip-zej_zi-build/pip/index.pyu__str__isuHTMLPage.__str__cCs\|dkrt�}n|j}|jdd�d}|j|�rJdSddlm}xT|jD]I}|j�j	|�rd|t
|�dkrdtjdt
��dSqdW|dk	r�|j|�}	|	dk	r�|	Sny|r�|dk	r
|j|�r
dSn|j}
x�ddd	d
dgD]}}|
j|�r)|j|d|�}|j�j	d
�rlPq�tjd||f�|dk	r�|j|�ndSq)q)Wntjd|�tj|�\}}
}}}}|dkrEtjjt|��rE|jd�s|d7}ntj|d�}tjd|�n|j|did
d6�}|j�|jjdd�}|j�j	d
�s�tjd||f�|dk	r�|j|�ndS||j|j|jd|j�}	Wn8tj k
r[}zE|j!j"dkr!dnd}|j#||||d|d|�WYdd}~Xn�tj$k
r�}z%|j#||d||d|�WYdd}~Xn�tj%k
r�|j#||d|d|�Yn�t&k
r+}z:d|}|j#||||d|ddd tj'�WYdd}~Xn-X|dk	rT|j(||jg|	�n|	SdS(!Nu#ii(u
VcsSupportu+:u&Cannot look at %(scheme)s URL %(link)su.taru.tar.gzu.tar.bz2u.tgzu.zipusessionu	text/htmlu,Skipping page %s because of Content-Type: %suGetting page %sufileu/u
index.htmlu# file: URL is directory, getting %suheadersuAcceptuContent-Typeuunknownutrustedi�iucacheuleveluconnection error: %su	timed outu6There was a problem confirming the ssl certificate: %sumeth()uNoneu
PipSessionuurlusplitutoo_many_failuresupip.vcsu
VcsSupportuschemesuloweru
startswithulenuloggerudebugulocalsuget_pageu
is_archiveufilenameuendswithu_get_content_typeuset_is_archiveuurlparseuosupathuisdiruurl2pathnameuurljoinugeturaise_for_statusuheadersutextutrustedurequestsu	HTTPErroruresponseustatus_codeu_handle_failuConnectionErroruTimeoutuSSLErrorunotifyuadd_page(uclsulinkurequcacheu
skip_archivesusessionuurlu
VcsSupportuschemeuinstufilenameubad_extucontent_typeunetlocupathuparamsuqueryufragmenturespuexculevelureason((u"/tmp/pip-zej_zi-build/pip/index.pyuget_pagels�	+		!$

		(4 uHTMLPage.get_pageicCsb|dkrtj}n|d||�|d|j|f�|dk	r^|j||�ndS(NuCould not fetch URL %s: %su7Will skip URL %s when looking for download links for %s(uNoneuloggeruinfouurluadd_page_failure(urequlinkureasonuurlucacheulevelumeth((u"/tmp/pip-zej_zi-build/pip/index.pyu_handle_fail�suHTMLPage._handle_failcCsx|dkrt�}ntj|�\}}}}}|d	krFdS|j|dd
�}|j�|jjdd�S(u;Get the Content-Type of the given url, using a HEAD requestuhttpuhttpsuftpuftpsuuallow_redirectsuContent-TypeN(uhttpuhttpsuftpuftpsT(	uNoneu
PipSessionuurlparseuurlsplituheaduTrueuraise_for_statusuheadersuget(uurlusessionuschemeunetlocupathuqueryufragmenturesp((u"/tmp/pip-zej_zi-build/pip/index.pyu_get_content_type�s
uHTMLPage._get_content_typecCs�t|d�s�d}dd�|jjd�D�}|r~y t|djdd��}Wq~ttfk
rzd}Yq~Xn||_n|jS(Nu_api_versioncSs4g|]*}|jdd�j�dkr|�qS(unameuuapi-version(ugetulower(u.0ux((u"/tmp/pip-zej_zi-build/pip/index.pyu
<listcomp>�s	u(HTMLPage.api_version.<locals>.<listcomp>u.//metaiuvalue(	uhasattruNoneuparsedufindalluintugetu	TypeErroru
ValueErroru_api_version(uselfu_api_versionumetas((u"/tmp/pip-zej_zi-build/pip/index.pyuapi_version�s uHTMLPage.api_versioncCsgt|d�s`|jjd�}|dk	rQ|jd�rQ|jd�|_q`|j|_n|jS(Nu	_base_urlu.//baseuhref(uhasattruparsedufinduNoneugetu	_base_urluurl(uselfubase((u"/tmp/pip-zej_zi-build/pip/index.pyubase_url�suHTMLPage.base_urlccs�x�|jjd�D]�}|jd�r|jd�}|jtj|j|��}d}|jr�|jdkr�t	|jd�o�d|jd�j
�k�}nt||d|�VqqWdS(uYields all links in the pageu.//auhrefiureluinternalN(uparsedufindallugetu
clean_linkuurlparseuurljoinubase_urluNoneuapi_versionuboolusplituLink(uselfuanchoruhrefuurluinternal((u"/tmp/pip-zej_zi-build/pip/index.pyulinks�s!uHTMLPage.linksccs<x|j�D]}|Vq
Wx|j�D]}|Vq)WdS(N(uexplicit_rel_linksuscraped_rel_links(uselfuurl((u"/tmp/pip-zej_zi-build/pip/index.pyu	rel_linkss	uHTMLPage.rel_linksuhomepageudownloadccs�t|�}x�|jjd�D]�}|jd�r|jd�rt|jd�j��}||@r�|jd�}|jtj|j|��}t	||dd�Vq�qqWdS(u)Yields all links with the given relationsu.//aureluhrefutrustedNF(usetuparsedufindallugetusplitu
clean_linkuurlparseuurljoinubase_urluLinkuFalse(uselfurelsuanchoru
found_relsuhrefuurl((u"/tmp/pip-zej_zi-build/pip/index.pyuexplicit_rel_linkss
uHTMLPage.explicit_rel_linksc
cs�x�|j|jfD]�}|j|j�}|s7qn|jj|jd|j��}|sdqn|jd�p�|jd�p�|jd�}|s�qn|jtj	|j
|��}t||dddd�VqWdS(	Nuposiiiutrustedu_deprecated_regexFT(u_homepage_reu_download_reusearchucontentu_href_reuendugroupu
clean_linkuurlparseuurljoinubase_urluLinkuFalseuTrue(uselfuregexumatchu
href_matchuurl((u"/tmp/pip-zej_zi-build/pip/index.pyuscraped_rel_links&s!-uHTMLPage.scraped_rel_linksu[^a-z0-9$&+,/:;=?@.#%_\\|-]cCs|jjdd�|�S(u�Makes sure a link is fully encoded.  That is, if a ' ' shows up in
        the link, it will be rewritten to %20 (while not over-quoting
        % or other characters).cSsdt|jd��S(Nu%%%2xi(uordugroup(umatch((u"/tmp/pip-zej_zi-build/pip/index.pyu<lambda><su%HTMLPage.clean_link.<locals>.<lambda>(u	_clean_reusub(uselfuurl((u"/tmp/pip-zej_zi-build/pip/index.pyu
clean_link7s	uHTMLPage.clean_linkNT(uhomepageudownload(u__name__u
__module__u__qualname__u__doc__ureucompileuIu_homepage_reu_download_reuSu_href_reuNoneu__init__u__str__uclassmethoduTrueuget_pageustaticmethodu_handle_failu_get_content_typeupropertyuapi_versionubase_urlulinksu	rel_linksuexplicit_rel_linksuscraped_rel_linksu	_clean_reu
clean_link(u
__locals__((u"/tmp/pip-zej_zi-build/pip/index.pyuHTMLPageZs([
uHTMLPagecBsv|EeZdZd-d-d-d.dd�Zdd�Zdd�Zdd�Zd	d
�Z	dd�Z
d
d�Zdd�Zdd�Z
dd�Zedd��Zedd��Zedd��Zdd�Zedd��Zedd ��Zejd!�Zed"d#��Zejd$�Zed%d&��Zed'd(��Zed)d*��Zed+d,��Zd-S(/uLinkcCs1||_||_||_||_||_dS(N(uurlu
comes_fromuinternalutrustedu_deprecated_regex(uselfuurlu
comes_fromuinternalutrustedu_deprecated_regex((u"/tmp/pip-zej_zi-build/pip/index.pyu__init__As
				u
Link.__init__cCs.|jrd|j|jfSt|j�SdS(Nu%s (from %s)(u
comes_fromuurlustr(uself((u"/tmp/pip-zej_zi-build/pip/index.pyu__str__Is	uLink.__str__cCsd|S(Nu	<Link %s>((uself((u"/tmp/pip-zej_zi-build/pip/index.pyu__repr__Osu
Link.__repr__cCs|j|jkS(N(uurl(uselfuother((u"/tmp/pip-zej_zi-build/pip/index.pyu__eq__RsuLink.__eq__cCs|j|jkS(N(uurl(uselfuother((u"/tmp/pip-zej_zi-build/pip/index.pyu__ne__UsuLink.__ne__cCs|j|jkS(N(uurl(uselfuother((u"/tmp/pip-zej_zi-build/pip/index.pyu__lt__XsuLink.__lt__cCs|j|jkS(N(uurl(uselfuother((u"/tmp/pip-zej_zi-build/pip/index.pyu__le__[suLink.__le__cCs|j|jkS(N(uurl(uselfuother((u"/tmp/pip-zej_zi-build/pip/index.pyu__gt__^suLink.__gt__cCs|j|jkS(N(uurl(uselfuother((u"/tmp/pip-zej_zi-build/pip/index.pyu__ge__asuLink.__ge__cCs
t|j�S(N(uhashuurl(uself((u"/tmp/pip-zej_zi-build/pip/index.pyu__hash__dsu
Link.__hash__cCs\tj|j�\}}}}}tj|jd��p<|}|sXtd|j��|S(Nu/uURL %r produced no filename(uurlparseuurlsplituurlu	posixpathubasenameurstripuAssertionError(uselfu_unetlocupathuname((u"/tmp/pip-zej_zi-build/pip/index.pyufilenamegs!u
Link.filenamecCstj|j�dS(Ni(uurlparseuurlsplituurl(uself((u"/tmp/pip-zej_zi-build/pip/index.pyuschemensuLink.schemecCstj|j�dS(Ni(uurlparseuurlsplituurl(uself((u"/tmp/pip-zej_zi-build/pip/index.pyupathrsu	Link.pathcCsttj|jjd���S(Nu/(usplitextu	posixpathubasenameupathurstrip(uself((u"/tmp/pip-zej_zi-build/pip/index.pyusplitextvsu
Link.splitextcCs|j�dS(Ni(usplitext(uself((u"/tmp/pip-zej_zi-build/pip/index.pyuextysuLink.extcCs=tj|j�\}}}}}tj||||df�S(N(uurlparseuurlsplituurlu
urlunsplituNone(uselfuschemeunetlocupathuqueryufragment((u"/tmp/pip-zej_zi-build/pip/index.pyuurl_without_fragment}s!uLink.url_without_fragmentu#egg=([^&]*)cCs,|jj|j�}|sdS|jd�S(Ni(u_egg_fragment_reusearchuurluNoneugroup(uselfumatch((u"/tmp/pip-zej_zi-build/pip/index.pyuegg_fragment�suLink.egg_fragmentu2(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)cCs,|jj|j�}|r(|jd�SdS(Ni(u_hash_reusearchuurlugroupuNone(uselfumatch((u"/tmp/pip-zej_zi-build/pip/index.pyuhash�s
u	Link.hashcCs,|jj|j�}|r(|jd�SdS(Ni(u_hash_reusearchuurlugroupuNone(uselfumatch((u"/tmp/pip-zej_zi-build/pip/index.pyu	hash_name�s
uLink.hash_namecCs0tj|jjdd�djdd�d�S(Nu#iiu?(u	posixpathubasenameuurlusplit(uself((u"/tmp/pip-zej_zi-build/pip/index.pyushow_url�su
Link.show_urlcCs�|jpt|jdd�}|dk	r�|r�y%t|jdd�}t|�}Wnttfk
rud}YnX|dks�|dkr�dS|jr�dSdSn|dk	r�dSdS(u�
        Returns True if this link can be verified after download, False if it
        cannot, and None if we cannot determine.
        utrusteduapi_versioniNTF(
utrustedugetattru
comes_fromuNoneuintu
ValueErroru	TypeErroruhashuTrueuFalse(uselfutrusteduapi_version((u"/tmp/pip-zej_zi-build/pip/index.pyu
verifiable�s	uLink.verifiableNF(u__name__u
__module__u__qualname__uNoneuFalseu__init__u__str__u__repr__u__eq__u__ne__u__lt__u__le__u__gt__u__ge__u__hash__upropertyufilenameuschemeupathusplitextuextuurl_without_fragmentureucompileu_egg_fragment_reuegg_fragmentu_hash_reuhashu	hash_nameushow_urlu
verifiable(u
__locals__((u"/tmp/pip-zej_zi-build/pip/index.pyuLink?s0	uLinkcCs;t|�}|j}|s1t|j�d}nt|�S(uPGet a requirement from the URL, if possible.  This looks for #egg
    in the URLi(uLinkuegg_fragmentusplitextufilenameupackage_to_requirement(uurlulinkuegg_info((u"/tmp/pip-zej_zi-build/pip/index.pyuget_requirement_from_url�s
	uget_requirement_from_urlcCsatjd|�}|r9|jd�}|jd�}n|}d}|rYd||fS|SdS(u)Translate a name like Foo-1.2 to Foo==1.3u^(.*?)-(dev|\d.*)iiuu%s==%sN(ureusearchugroup(upackage_nameumatchunameuversion((u"/tmp/pip-zej_zi-build/pip/index.pyupackage_to_requirement�supackage_to_requirement(2u__doc__usysuosureu	mimetypesu	posixpathupip.loguloggerupip.utiluInfunormalize_nameusplitextu
is_prereleaseupip.exceptionsuDistributionNotFounduBestVersionAlreadyInstalleduInstallationErroruInvalidWheelFilenameuUnsupportedWheelupip.backwardcompatuurlparseuurl2pathnameupip.downloadu
PipSessionuurl_to_pathupath_to_urlu	pip.wheeluWheelu	wheel_extupip.pep425tagsusupported_tagsusupported_tags_noarchuget_platformupip._vendoruhtml5liburequestsu
pkg_resourcesupip._vendor.requests.exceptionsuSSLErroru__all__uDEFAULT_MIRROR_HOSTNAMEuINSECURE_SCHEMESuobjectu
PackageFinderu	PageCacheuHTMLPageuLinkuINSTALLED_VERSIONuget_requirement_from_urlupackage_to_requirement(((u"/tmp/pip-zej_zi-build/pip/index.pyu<module>s6"(	
����
site-packages/pip/__pycache__/basecommand.cpython-33.pyc000064400000016074151733463520017201 0ustar00�
7�Re�c@sUdZddlZddlZddlZddlZddlZddlZddlmZddl	m
Z
ddlmZddl
mZddlmZmZmZmZmZddlmZdd	lmZmZdd
lmZmZmZmZmZddl m!Z!dgZ"Gd
d�de#�Z$ddd�Z&ddd�Z'dS(u(Base Command class, and related routinesiN(u
cmdoptions(urunning_under_virtualenv(ulogger(u
PipSession(u
BadCommanduInstallationErroruUninstallationErroruCommandErroruPreviousBuildDirError(uStringIO(uConfigOptionParseruUpdatingDefaultsHelpFormatter(uSUCCESSuERRORu
UNKNOWN_ERRORuVIRTUALENV_NOT_FOUNDuPREVIOUS_BUILD_DIR_ERROR(uget_proguCommandcBsb|EeZdZdZdZdZdd�Zdd�Z	dd�Z
dd�Zd	d
�ZdS(
uCommandcCs�i|jd6dt�|jfd6t�d6d	d6|jd6|jd6}t|�|_d|jj�}t	j
|j|�|_tj
tj|j�}|jj|�dS(
Nuusageu%s %suprogu	formatteruadd_help_optionunameudescriptionu
%s OptionsF(uusageuget_progunameuUpdatingDefaultsHelpFormatteruFalseu__doc__uConfigOptionParseruparseru
capitalizeuoptparseuOptionGroupucmd_optsu
cmdoptionsumake_option_groupu
general_groupuadd_option_group(uselfu	parser_kwu
optgroup_nameugen_opts((u(/tmp/pip-zej_zi-build/pip/basecommand.pyu__init__s



uCommand.__init__cCsvt�}|jr!|j|_n|jr9|j|_n|jrbi|jd6|jd6|_n|j|j_|S(Nuhttpuhttps(	u
PipSessionucertuverifyutimeoutuproxyuproxiesuno_inputuauthu	prompting(uselfuoptionsusession((u(/tmp/pip-zej_zi-build/pip/basecommand.pyu_build_session3s				
uCommand._build_sessioncCsdS(N((uself((u(/tmp/pip-zej_zi-build/pip/basecommand.pyu
setup_loggingJsuCommand.setup_loggingcCs|jj|�S(N(uparseru
parse_args(uselfuargs((u(/tmp/pip-zej_zi-build/pip/basecommand.pyu
parse_argsMsuCommand.parse_argscCs�|j|�\}}d}||j7}||j8}tjd|�}g}tj|tjftj|j	f�|j
r�dt_n|j
�|jr�dtjd<n|jr�dj|j�tjd<n|jrt�stjd�tjt�qn|jr6t|jd�}tjtj|f�nd}t}d}y.|j||�}t|t�ru|}nWn�t k
r�tj!�d}	tjt"|	��tj#d	t$��d}t%}Yn`t&t'fk
r'tj!�d}	tjt"|	��tj#d	t$��d}t(}Ynt)k
r{tj!�d}	tjt"|	��tj#d	t$��d}t(}Yn�t*k
r�tj!�d}	tjd
|	�tj#d	t$��t(}Ynft+k
rtjd�tj#d	t$��d}t(}Yn(tjdt$��d}t,}YnX|r�|j-}
d
j|�}yt|
d�}Wn<t.k
r�t/j0dd�}
|
j1}
t|
d�}YnXtjd|
�|j2|�|j3�n|dk	r�|j3�n|S(Niiu1uPIP_NO_INPUTu uPIP_EXISTS_ACTIONu2Could not find an activated virtualenv (required).uauException information:
%su	ERROR: %suOperation cancelled by useru
Exception:
%su
uwudeleteu#Storing debug log for failure in %sTF(4u
parse_argsuverboseuquietuloggerulevel_for_integeru
add_consumersusysustdoutuDEBUGuappendulog_explicit_levelsuTrueuexplicit_levelsu
setup_logginguno_inputuosuenvironu
exists_actionujoinurequire_venvurunning_under_virtualenvufataluexituVIRTUALENV_NOT_FOUNDuloguopen_logfileuNoneuSUCCESSuFalseurunu
isinstanceuintuPreviousBuildDirErroruexc_infoustruinfou
format_excuPREVIOUS_BUILD_DIR_ERRORuInstallationErroruUninstallationErroruERRORu
BadCommanduCommandErroruKeyboardInterruptu
UNKNOWN_ERRORulog_fileuIOErrorutempfileuNamedTemporaryFileunameuwriteuclose(uselfuargsuoptionsulevelucomplete_logulog_fpuexitu	store_logustatusueulog_file_fnutextulog_file_fputemp((u(/tmp/pip-zej_zi-build/pip/basecommand.pyumainQs�

	
				
	










	
	


uCommand.mainNF(
u__name__u
__module__u__qualname__uNoneunameuusageuFalseuhiddenu__init__u_build_sessionu
setup_loggingu
parse_argsumain(u
__locals__((u(/tmp/pip-zej_zi-build/pip/basecommand.pyuCommandscCsG|dkrtj�}nt�}tj|td|��|j�S(Nufile(uNoneusysuexc_infouStringIOu	tracebackuprint_exceptionudictugetvalue(uexc_infouout((u(/tmp/pip-zej_zi-build/pip/basecommand.pyu
format_exc�s
	u
format_excuacCs�tjj|�}tjj|�}tjj|�}tjj|�sXtj|�ntjj|�}t||�}|r�|jddd�|jdt	j
dtjd�f�n|S(u�Open the named log file in append mode.

    If the file already exists, a separator will also be printed to
    the file to separate past activity from current activity.
    u%s
u-i<u
%s run on %s
iu%c(
uosupathu
expanduseruabspathudirnameuexistsumakedirsuopenuwriteusysuargvutimeustrftime(ufilenameumodeudirnameuexistsulog_fp((u(/tmp/pip-zej_zi-build/pip/basecommand.pyuopen_logfile�s*uopen_logfile((u__doc__uosusysutempfileu	tracebackutimeuoptparseupipu
cmdoptionsu
pip.locationsurunning_under_virtualenvupip.loguloggerupip.downloadu
PipSessionupip.exceptionsu
BadCommanduInstallationErroruUninstallationErroruCommandErroruPreviousBuildDirErrorupip.backwardcompatuStringIOupip.baseparseruConfigOptionParseruUpdatingDefaultsHelpFormatterupip.status_codesuSUCCESSuERRORu
UNKNOWN_ERRORuVIRTUALENV_NOT_FOUNDuPREVIOUS_BUILD_DIR_ERRORupip.utiluget_progu__all__uobjectuCommanduNoneu
format_excuopen_logfile(((u(/tmp/pip-zej_zi-build/pip/basecommand.pyu<module>s&((	�site-packages/pip/__pycache__/__main__.cpython-33.pyc000064400000000455151733463520016444 0ustar00�
7�Retc@sNddlZddlmZedkrJe�ZerJeje�qJndS(iNi(urunu__main__(usysurunnerurunu__name__uexit(((u%/tmp/pip-zej_zi-build/pip/__main__.pyu<module>s
	site-packages/pip/__main__.py000064400000000164151733463520012160 0ustar00import sys
from .runner import run

if __name__ == '__main__':
    exit = run()
    if exit:
        sys.exit(exit)
site-packages/pip/backwardcompat/__pycache__/__init__.cpython-33.pyc000064400000013501151733463520021441 0ustar00�
7�Re�c@s=dZddlZddlZddlZddlZdgZeed�ZGdd�de�Z	y
e
Z
Wnek
r�e	Z
YnXy
eZWnek
r�e	ZYnXej
jZejd$kr�ddlmZmZdd	lmZdd
lmZmZddlmZmZddlmZmZmZdd
l m!Z"ddl#j$Z%ddlj&Z'ddl(Z)ddl*j+Z,ddl#j$Z-ddl.j+Z/dd�Z0dd�Z1dd�Z2dd�Z3dd�Z4e5Z5e6fZ7e8Z9nddl:mZdd
l'mZmZddlmZmZddl%mZmZmZddl m;Z"ddl%Z%ddl'Z'ddl-Z-ddl)Z)ddl,Z,ddl/Z/dd�Z1dd�Z2dd�Z3dd�Z4e6Z5e<fZ7eZe0Z0e9Z9eZddl=m>Z>m?Z?e@edd�ZBd d!�ZCd"d#�ZDdS(%uKStuff that differs in different Python versions and platform
distributions.iNuWindowsErrorucache_from_sourcecBs|EeZdZdZdS(uNeverUsedExceptionu%this exception should never be raisedN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u4/tmp/pip-zej_zi-build/pip/backwardcompat/__init__.pyuNeverUsedException
suNeverUsedExceptioni(uStringIOuBytesIO(ureduce(uURLErroru	HTTPError(uQueueuEmpty(uurl2pathnameuurlretrieveupathname2url(umessagecCs||k||kS(N((uaub((u4/tmp/pip-zej_zi-build/pip/backwardcompat/__init__.pyucmp+sucmpcCs
|jd�S(Nuutf-8(uencode(us((u4/tmp/pip-zej_zi-build/pip/backwardcompat/__init__.pyub.subcCs
|jd�S(Nuutf-8(udecode(us((u4/tmp/pip-zej_zi-build/pip/backwardcompat/__init__.pyuu1suucCs7y|jt�SWntk
r2|jd�SYnXdS(Nuutf_8(udecodeuconsole_encodinguUnicodeDecodeError(us((u4/tmp/pip-zej_zi-build/pip/backwardcompat/__init__.pyuconsole_to_str4s
uconsole_to_strcCs|j||�S(N(u	get_param(uhttp_messageuparamu
default_value((u4/tmp/pip-zej_zi-build/pip/backwardcompat/__init__.pyuget_http_message_param:suget_http_message_param(uStringIO(uMessagecCs|S(N((us((u4/tmp/pip-zej_zi-build/pip/backwardcompat/__init__.pyubMscCs|S(N((us((u4/tmp/pip-zej_zi-build/pip/backwardcompat/__init__.pyuuPscCs|S(N((us((u4/tmp/pip-zej_zi-build/pip/backwardcompat/__init__.pyuconsole_to_strSscCs|j|�}|p|S(N(ugetparam(uhttp_messageuparamu
default_valueuresult((u4/tmp/pip-zej_zi-build/pip/backwardcompat/__init__.pyuget_http_message_paramVs(uget_python_libuget_python_versionu	USER_SITEc/sxttt|��|jdd�}gg}x'|D]��fdd�|D�}q5Wx|D]}t|�Vq_WdS(Nurepeatics*g|] }�D]}||g�qqS(((u.0uxuy(upool(u4/tmp/pip-zej_zi-build/pip/backwardcompat/__init__.pyu
<listcomp>ns	uproduct.<locals>.<listcomp>(ulistumaputupleuget(uargsukwdsupoolsuresultuprod((upoolu4/tmp/pip-zej_zi-build/pip/backwardcompat/__init__.pyuproducths%	

uproductcCs�ttd�rMtj|tjtjB�}tj|�j}tj|�n7tjj	|�sttj
|�j}ntd|��|S(u)
    Return path's uid.

    Does not follow symlinks: https://github.com/pypa/pip/pull/935#discussion_r5307003

    Placed this function in backwardcompat due to differences on AIX and Jython,
    that should eventually go away.

    :raises OSError: When path is a symlink or can't be read.
    u
O_NOFOLLOWu1%s is a symlink; Will not return uid for symlinks(uhasattruosuopenuO_RDONLYu
O_NOFOLLOWufstatust_uiducloseupathuislinkustatuOSError(upathufdufile_uid((u4/tmp/pip-zej_zi-build/pip/backwardcompat/__init__.pyuget_path_uidssuget_path_uid(i(Eu__doc__uosuimpusysusiteu__all__uhasattruuses_pycacheu	ExceptionuNeverUsedExceptionuWindowsErroru	NameErroruPermissionErroru
__stdout__uencodinguconsole_encodinguversion_infouiouStringIOuBytesIOu	functoolsureduceuurllib.erroruURLErroru	HTTPErroruqueueuQueueuEmptyuurllib.requestuurl2pathnameuurlretrieveupathname2urluemailumessageuemailmessageuurllib.parseuparseuurlliburequestuurllib2uconfigparseruConfigParseru
xmlrpc.clientuclientu	xmlrpclibuurlparseuhttp.clientuhttplibucmpubuuuconsole_to_struget_http_message_paramubytesustrustring_typesuinputu	raw_inputu	cStringIOuMessageu
basestringudistutils.sysconfiguget_python_libuget_python_versionugetattruNoneu	user_siteuproductuget_path_uid(((u4/tmp/pip-zej_zi-build/pip/backwardcompat/__init__.pyu<module>s|	



			site-packages/pip/backwardcompat/__init__.py000064400000007254151733463520015170 0ustar00"""Stuff that differs in different Python versions and platform
distributions."""

import os
import imp
import sys
import site

__all__ = ['WindowsError']

uses_pycache = hasattr(imp, 'cache_from_source')

class NeverUsedException(Exception):
    """this exception should never be raised"""

try:
    WindowsError = WindowsError
except NameError:
    WindowsError = NeverUsedException

try:
    #new in Python 3.3
    PermissionError = PermissionError
except NameError:
    PermissionError = NeverUsedException

console_encoding = sys.__stdout__.encoding

if sys.version_info >= (3,):
    from io import StringIO, BytesIO
    from functools import reduce
    from urllib.error import URLError, HTTPError
    from queue import Queue, Empty
    from urllib.request import url2pathname, urlretrieve, pathname2url
    from email import message as emailmessage
    import urllib.parse as urllib
    import urllib.request as urllib2
    import configparser as ConfigParser
    import xmlrpc.client as xmlrpclib
    import urllib.parse as urlparse
    import http.client as httplib

    def cmp(a, b):
        return (a > b) - (a < b)

    def b(s):
        return s.encode('utf-8')

    def u(s):
        return s.decode('utf-8')

    def console_to_str(s):
        try:
            return s.decode(console_encoding)
        except UnicodeDecodeError:
            return s.decode('utf_8')

    def get_http_message_param(http_message, param, default_value):
        return http_message.get_param(param, default_value)

    bytes = bytes
    string_types = (str,)
    raw_input = input
else:
    from cStringIO import StringIO
    from urllib2 import URLError, HTTPError
    from Queue import Queue, Empty
    from urllib import url2pathname, urlretrieve, pathname2url
    from email import Message as emailmessage
    import urllib
    import urllib2
    import urlparse
    import ConfigParser
    import xmlrpclib
    import httplib

    def b(s):
        return s

    def u(s):
        return s

    def console_to_str(s):
        return s

    def get_http_message_param(http_message, param, default_value):
        result = http_message.getparam(param)
        return result or default_value

    bytes = str
    string_types = (basestring,)
    reduce = reduce
    cmp = cmp
    raw_input = raw_input
    BytesIO = StringIO


from distutils.sysconfig import get_python_lib, get_python_version

#site.USER_SITE was created in py2.6
user_site = getattr(site, 'USER_SITE', None)


def product(*args, **kwds):
    # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
    # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
    pools = list(map(tuple, args)) * kwds.get('repeat', 1)
    result = [[]]
    for pool in pools:
        result = [x + [y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)


def get_path_uid(path):
    """
    Return path's uid.

    Does not follow symlinks: https://github.com/pypa/pip/pull/935#discussion_r5307003

    Placed this function in backwardcompat due to differences on AIX and Jython,
    that should eventually go away.

    :raises OSError: When path is a symlink or can't be read.
    """
    if hasattr(os, 'O_NOFOLLOW'):
        fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW)
        file_uid = os.fstat(fd).st_uid
        os.close(fd)
    else:  # AIX and Jython
        # WARNING: time of check vulnerabity, but best we can do w/o NOFOLLOW
        if not os.path.islink(path):
            # older versions of Jython don't have `os.fstat`
            file_uid = os.stat(path).st_uid
        else:
            # raise OSError for parity with os.O_NOFOLLOW above
            raise OSError("%s is a symlink; Will not return uid for symlinks" % path)
    return file_uid
site-packages/pip/runner.py000064400000000657151733463520011760 0ustar00import sys
import os


def run():
    base = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    ## FIXME: this is kind of crude; if we could create a fake pip
    ## module, then exec into it and update pip.__path__ properly, we
    ## wouldn't have to update sys.path:
    sys.path.insert(0, base)
    import pip
    return pip.main()


if __name__ == '__main__':
    exit = run()
    if exit:
        sys.exit(exit)
site-packages/pip/status_codes.py000064400000000164151733463520013140 0ustar00SUCCESS = 0
ERROR = 1
UNKNOWN_ERROR = 2
VIRTUALENV_NOT_FOUND = 3
PREVIOUS_BUILD_DIR_ERROR = 4
NO_MATCHES_FOUND = 23
site-packages/pip/req.py000064400000243451151733463520011237 0ustar00from email.parser import FeedParser
import os
import imp
import locale
import re
import sys
import shutil
import tempfile
import textwrap
import zipfile

from distutils.util import change_root
from pip.locations import (bin_py, running_under_virtualenv,PIP_DELETE_MARKER_FILENAME,
                           write_delete_marker_file, bin_user)
from pip.exceptions import (InstallationError, UninstallationError, UnsupportedWheel,
                            BestVersionAlreadyInstalled, InvalidWheelFilename,
                            DistributionNotFound, PreviousBuildDirError)
from pip.vcs import vcs
from pip.log import logger
from pip.util import (display_path, rmtree, ask, ask_path_exists, backup_dir,
                      is_installable_dir, is_local, dist_is_local,
                      dist_in_usersite, dist_in_site_packages, renames,
                      normalize_path, egg_link_path, make_path_relative,
                      call_subprocess, is_prerelease, normalize_name)
from pip.backwardcompat import (urlparse, urllib, uses_pycache,
                                ConfigParser, string_types, HTTPError,
                                get_python_version, b)
from pip.index import Link
from pip.locations import build_prefix
from pip.download import (PipSession, get_file_content, is_url, url_to_path,
                          path_to_url, is_archive_file,
                          unpack_vcs_link, is_vcs_url, is_file_url,
                          unpack_file_url, unpack_http_url)
import pip.wheel
from pip.wheel import move_wheel_files, Wheel, wheel_ext
from pip._vendor import pkg_resources, six


def read_text_file(filename):
    """Return the contents of *filename*.

    Try to decode the file contents with utf-8, the preffered system encoding
    (e.g., cp1252 on some Windows machines) and latin1, in that order. Decoding
    a byte string with latin1 will never raise an error. In the worst case, the
    returned string will contain some garbage characters.

    """
    with open(filename, 'rb') as fp:
        data = fp.read()

    encodings = ['utf-8', locale.getpreferredencoding(False), 'latin1']
    for enc in encodings:
        try:
            data = data.decode(enc)
        except UnicodeDecodeError:
            continue
        break

    assert type(data) != bytes  # Latin1 should have worked.
    return data


class InstallRequirement(object):

    def __init__(self, req, comes_from, source_dir=None, editable=False,
                 url=None, as_egg=False, update=True, prereleases=None,
                 editable_options=None, from_bundle=False, pycompile=True):
        self.extras = ()
        if isinstance(req, string_types):
            req = pkg_resources.Requirement.parse(req)
            self.extras = req.extras
        self.req = req
        self.comes_from = comes_from
        self.source_dir = source_dir
        self.editable = editable

        if editable_options is None:
            editable_options = {}

        self.editable_options = editable_options
        self.url = url
        self.as_egg = as_egg
        self._egg_info_path = None
        # This holds the pkg_resources.Distribution object if this requirement
        # is already available:
        self.satisfied_by = None
        # This hold the pkg_resources.Distribution object if this requirement
        # conflicts with another installed distribution:
        self.conflicts_with = None
        self._temp_build_dir = None
        self._is_bundle = None
        # True if the editable should be updated:
        self.update = update
        # Set to True after successful installation
        self.install_succeeded = None
        # UninstallPathSet of uninstalled distribution (for possible rollback)
        self.uninstalled = None
        self.use_user_site = False
        self.target_dir = None
        self.from_bundle = from_bundle

        self.pycompile = pycompile

        # True if pre-releases are acceptable
        if prereleases:
            self.prereleases = True
        elif self.req is not None:
            self.prereleases = any([is_prerelease(x[1]) and x[0] != "!=" for x in self.req.specs])
        else:
            self.prereleases = False

    @classmethod
    def from_editable(cls, editable_req, comes_from=None, default_vcs=None):
        name, url, extras_override = parse_editable(editable_req, default_vcs)
        if url.startswith('file:'):
            source_dir = url_to_path(url)
        else:
            source_dir = None

        res = cls(name, comes_from, source_dir=source_dir,
                  editable=True,
                  url=url,
                  editable_options=extras_override,
                  prereleases=True)

        if extras_override is not None:
            res.extras = extras_override

        return res

    @classmethod
    def from_line(cls, name, comes_from=None, prereleases=None):
        """Creates an InstallRequirement from a name, which might be a
        requirement, directory containing 'setup.py', filename, or URL.
        """
        url = None
        name = name.strip()
        req = None
        path = os.path.normpath(os.path.abspath(name))
        link = None

        if is_url(name):
            link = Link(name)
        elif os.path.isdir(path) and (os.path.sep in name or name.startswith('.')):
            if not is_installable_dir(path):
                raise InstallationError("Directory %r is not installable. File 'setup.py' not found." % name)
            link = Link(path_to_url(name))
        elif is_archive_file(path):
            if not os.path.isfile(path):
                logger.warn('Requirement %r looks like a filename, but the file does not exist', name)
            link = Link(path_to_url(name))

        # If the line has an egg= definition, but isn't editable, pull the requirement out.
        # Otherwise, assume the name is the req for the non URL/path/archive case.
        if link and req is None:
            url = link.url_without_fragment
            req = link.egg_fragment  #when fragment is None, this will become an 'unnamed' requirement

            # Handle relative file URLs
            if link.scheme == 'file' and re.search(r'\.\./', url):
                url = path_to_url(os.path.normpath(os.path.abspath(link.path)))

            # fail early for invalid or unsupported wheels
            if link.ext == wheel_ext:
                wheel = Wheel(link.filename) # can raise InvalidWheelFilename
                if not wheel.supported():
                    raise UnsupportedWheel("%s is not a supported wheel on this platform." % wheel.filename)

        else:
            req = name

        return cls(req, comes_from, url=url, prereleases=prereleases)

    def __str__(self):
        if self.req:
            s = str(self.req)
            if self.url:
                s += ' from %s' % self.url
        else:
            s = self.url
        if self.satisfied_by is not None:
            s += ' in %s' % display_path(self.satisfied_by.location)
        if self.comes_from:
            if isinstance(self.comes_from, string_types):
                comes_from = self.comes_from
            else:
                comes_from = self.comes_from.from_path()
            if comes_from:
                s += ' (from %s)' % comes_from
        return s

    def from_path(self):
        if self.req is None:
            return None
        s = str(self.req)
        if self.comes_from:
            if isinstance(self.comes_from, string_types):
                comes_from = self.comes_from
            else:
                comes_from = self.comes_from.from_path()
            if comes_from:
                s += '->' + comes_from
        return s

    def build_location(self, build_dir, unpack=True):
        if self._temp_build_dir is not None:
            return self._temp_build_dir
        if self.req is None:
            self._temp_build_dir = tempfile.mkdtemp('-build', 'pip-')
            self._ideal_build_dir = build_dir
            return self._temp_build_dir
        if self.editable:
            name = self.name.lower()
        else:
            name = self.name
        # FIXME: Is there a better place to create the build_dir? (hg and bzr need this)
        if not os.path.exists(build_dir):
            _make_build_dir(build_dir)
        return os.path.join(build_dir, name)

    def correct_build_location(self):
        """If the build location was a temporary directory, this will move it
        to a new more permanent location"""
        if self.source_dir is not None:
            return
        assert self.req is not None
        assert self._temp_build_dir
        old_location = self._temp_build_dir
        new_build_dir = self._ideal_build_dir
        del self._ideal_build_dir
        if self.editable:
            name = self.name.lower()
        else:
            name = self.name
        new_location = os.path.join(new_build_dir, name)
        if not os.path.exists(new_build_dir):
            logger.debug('Creating directory %s' % new_build_dir)
            _make_build_dir(new_build_dir)
        if os.path.exists(new_location):
            raise InstallationError(
                'A package already exists in %s; please remove it to continue'
                % display_path(new_location))
        logger.debug('Moving package %s from %s to new location %s'
                     % (self, display_path(old_location), display_path(new_location)))
        shutil.move(old_location, new_location)
        self._temp_build_dir = new_location
        self.source_dir = new_location
        self._egg_info_path = None

    @property
    def name(self):
        if self.req is None:
            return None
        return self.req.project_name

    @property
    def url_name(self):
        if self.req is None:
            return None
        return urllib.quote(self.req.unsafe_name)

    @property
    def setup_py(self):
        try:
            import setuptools
        except ImportError:
            # Setuptools is not available
            raise InstallationError(
                "setuptools must be installed to install from a source "
                "distribution"
            )

        setup_file = 'setup.py'

        if self.editable_options and 'subdirectory' in self.editable_options:
            setup_py = os.path.join(self.source_dir,
                                    self.editable_options['subdirectory'],
                                    setup_file)

        else:
            setup_py = os.path.join(self.source_dir, setup_file)

        # Python2 __file__ should not be unicode
        if six.PY2 and isinstance(setup_py, six.text_type):
            setup_py = setup_py.encode(sys.getfilesystemencoding())

        return setup_py

    def run_egg_info(self, force_root_egg_info=False):
        assert self.source_dir
        if self.name:
            logger.notify('Running setup.py (path:%s) egg_info for package %s' % (self.setup_py, self.name))
        else:
            logger.notify('Running setup.py (path:%s) egg_info for package from %s' % (self.setup_py, self.url))
        logger.indent += 2
        try:

            # if it's distribute>=0.7, it won't contain an importable
            # setuptools, and having an egg-info dir blocks the ability of
            # setup.py to find setuptools plugins, so delete the egg-info dir if
            # no setuptools. it will get recreated by the run of egg_info
            # NOTE: this self.name check only works when installing from a specifier
            #       (not archive path/urls)
            # TODO: take this out later
            if self.name == 'distribute' and not os.path.isdir(os.path.join(self.source_dir, 'setuptools')):
                rmtree(os.path.join(self.source_dir, 'distribute.egg-info'))

            script = self._run_setup_py
            script = script.replace('__SETUP_PY__', repr(self.setup_py))
            script = script.replace('__PKG_NAME__', repr(self.name))
            egg_info_cmd = [sys.executable, '-c', script, 'egg_info']
            # We can't put the .egg-info files at the root, because then the source code will be mistaken
            # for an installed egg, causing problems
            if self.editable or force_root_egg_info:
                egg_base_option = []
            else:
                egg_info_dir = os.path.join(self.source_dir, 'pip-egg-info')
                if not os.path.exists(egg_info_dir):
                    os.makedirs(egg_info_dir)
                egg_base_option = ['--egg-base', 'pip-egg-info']
            call_subprocess(
                egg_info_cmd + egg_base_option,
                cwd=self.source_dir, filter_stdout=self._filter_install, show_stdout=False,
                command_level=logger.VERBOSE_DEBUG,
                command_desc='python setup.py egg_info')
        finally:
            logger.indent -= 2
        if not self.req:
            self.req = pkg_resources.Requirement.parse(
                "%(Name)s==%(Version)s" % self.pkg_info())
            self.correct_build_location()

    ## FIXME: This is a lame hack, entirely for PasteScript which has
    ## a self-provided entry point that causes this awkwardness
    _run_setup_py = """
__file__ = __SETUP_PY__
from setuptools.command import egg_info
import pkg_resources
import os
import tokenize
def replacement_run(self):
    self.mkpath(self.egg_info)
    installer = self.distribution.fetch_build_egg
    for ep in pkg_resources.iter_entry_points('egg_info.writers'):
        # require=False is the change we're making:
        writer = ep.load(require=False)
        if writer:
            writer(self, ep.name, os.path.join(self.egg_info,ep.name))
    self.find_sources()
egg_info.egg_info.run = replacement_run
exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\\r\\n', '\\n'), __file__, 'exec'))
"""

    def egg_info_data(self, filename):
        if self.satisfied_by is not None:
            if not self.satisfied_by.has_metadata(filename):
                return None
            return self.satisfied_by.get_metadata(filename)
        assert self.source_dir
        filename = self.egg_info_path(filename)
        if not os.path.exists(filename):
            return None
        data = read_text_file(filename)
        return data

    def egg_info_path(self, filename):
        if self._egg_info_path is None:
            if self.editable:
                base = self.source_dir
            else:
                base = os.path.join(self.source_dir, 'pip-egg-info')
            filenames = os.listdir(base)
            if self.editable:
                filenames = []
                for root, dirs, files in os.walk(base):
                    for dir in vcs.dirnames:
                        if dir in dirs:
                            dirs.remove(dir)
                    # Iterate over a copy of ``dirs``, since mutating
                    # a list while iterating over it can cause trouble.
                    # (See https://github.com/pypa/pip/pull/462.)
                    for dir in list(dirs):
                        # Don't search in anything that looks like a virtualenv environment
                        if (os.path.exists(os.path.join(root, dir, 'bin', 'python'))
                            or os.path.exists(os.path.join(root, dir, 'Scripts', 'Python.exe'))):
                            dirs.remove(dir)
                        # Also don't search through tests
                        if dir == 'test' or dir == 'tests':
                            dirs.remove(dir)
                    filenames.extend([os.path.join(root, dir)
                                     for dir in dirs])
                filenames = [f for f in filenames if f.endswith('.egg-info')]

            if not filenames:
                raise InstallationError('No files/directories in %s (from %s)' % (base, filename))
            assert filenames, "No files/directories in %s (from %s)" % (base, filename)

            # if we have more than one match, we pick the toplevel one.  This can
            # easily be the case if there is a dist folder which contains an
            # extracted tarball for testing purposes.
            if len(filenames) > 1:
                filenames.sort(key=lambda x: x.count(os.path.sep) +
                                             (os.path.altsep and
                                              x.count(os.path.altsep) or 0))
            self._egg_info_path = os.path.join(base, filenames[0])
        return os.path.join(self._egg_info_path, filename)

    def egg_info_lines(self, filename):
        data = self.egg_info_data(filename)
        if not data:
            return []
        result = []
        for line in data.splitlines():
            line = line.strip()
            if not line or line.startswith('#'):
                continue
            result.append(line)
        return result

    def pkg_info(self):
        p = FeedParser()
        data = self.egg_info_data('PKG-INFO')
        if not data:
            logger.warn('No PKG-INFO file found in %s' % display_path(self.egg_info_path('PKG-INFO')))
        p.feed(data or '')
        return p.close()

    @property
    def dependency_links(self):
        return self.egg_info_lines('dependency_links.txt')

    _requirements_section_re = re.compile(r'\[(.*?)\]')

    def requirements(self, extras=()):
        in_extra = None
        for line in self.egg_info_lines('requires.txt'):
            match = self._requirements_section_re.match(line.lower())
            if match:
                in_extra = match.group(1)
                continue
            if in_extra and in_extra not in extras:
                logger.debug('skipping extra %s' % in_extra)
                # Skip requirement for an extra we aren't requiring
                continue
            yield line

    @property
    def absolute_versions(self):
        for qualifier, version in self.req.specs:
            if qualifier == '==':
                yield version

    @property
    def installed_version(self):
        return self.pkg_info()['version']

    def assert_source_matches_version(self):
        assert self.source_dir
        version = self.installed_version
        if version not in self.req:
            logger.warn('Requested %s, but installing version %s' % (self, self.installed_version))
        else:
            logger.debug('Source in %s has version %s, which satisfies requirement %s'
                         % (display_path(self.source_dir), version, self))

    def update_editable(self, obtain=True):
        if not self.url:
            logger.info("Cannot update repository at %s; repository location is unknown" % self.source_dir)
            return
        assert self.editable
        assert self.source_dir
        if self.url.startswith('file:'):
            # Static paths don't get updated
            return
        assert '+' in self.url, "bad url: %r" % self.url
        if not self.update:
            return
        vc_type, url = self.url.split('+', 1)
        backend = vcs.get_backend(vc_type)
        if backend:
            vcs_backend = backend(self.url)
            if obtain:
                vcs_backend.obtain(self.source_dir)
            else:
                vcs_backend.export(self.source_dir)
        else:
            assert 0, (
                'Unexpected version control type (in %s): %s'
                % (self.url, vc_type))

    def uninstall(self, auto_confirm=False):
        """
        Uninstall the distribution currently satisfying this requirement.

        Prompts before removing or modifying files unless
        ``auto_confirm`` is True.

        Refuses to delete or modify files outside of ``sys.prefix`` -
        thus uninstallation within a virtual environment can only
        modify that virtual environment, even if the virtualenv is
        linked to global site-packages.

        """
        if not self.check_if_exists():
            raise UninstallationError("Cannot uninstall requirement %s, not installed" % (self.name,))
        dist = self.satisfied_by or self.conflicts_with

        paths_to_remove = UninstallPathSet(dist)

        pip_egg_info_path = os.path.join(dist.location,
                                         dist.egg_name()) + '.egg-info'
        dist_info_path = os.path.join(dist.location,
                                      '-'.join(dist.egg_name().split('-')[:2])
                                      ) + '.dist-info'
        # workaround for http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=618367
        debian_egg_info_path = pip_egg_info_path.replace(
            '-py%s' % pkg_resources.PY_MAJOR, '')
        easy_install_egg = dist.egg_name() + '.egg'
        develop_egg_link = egg_link_path(dist)

        pip_egg_info_exists = os.path.exists(pip_egg_info_path)
        debian_egg_info_exists = os.path.exists(debian_egg_info_path)
        dist_info_exists = os.path.exists(dist_info_path)
        if pip_egg_info_exists or debian_egg_info_exists:
            # package installed by pip
            if pip_egg_info_exists:
                egg_info_path = pip_egg_info_path
            else:
                egg_info_path = debian_egg_info_path
            paths_to_remove.add(egg_info_path)
            if dist.has_metadata('installed-files.txt'):
                for installed_file in dist.get_metadata('installed-files.txt').splitlines():
                    path = os.path.normpath(os.path.join(egg_info_path, installed_file))
                    paths_to_remove.add(path)
            #FIXME: need a test for this elif block
            #occurs with --single-version-externally-managed/--record outside of pip
            elif dist.has_metadata('top_level.txt'):
                if dist.has_metadata('namespace_packages.txt'):
                    namespaces = dist.get_metadata('namespace_packages.txt')
                else:
                    namespaces = []
                for top_level_pkg in [p for p
                                      in dist.get_metadata('top_level.txt').splitlines()
                                      if p and p not in namespaces]:
                    path = os.path.join(dist.location, top_level_pkg)
                    paths_to_remove.add(path)
                    paths_to_remove.add(path + '.py')
                    paths_to_remove.add(path + '.pyc')

        elif dist.location.endswith(easy_install_egg):
            # package installed by easy_install
            paths_to_remove.add(dist.location)
            easy_install_pth = os.path.join(os.path.dirname(dist.location),
                                            'easy-install.pth')
            paths_to_remove.add_pth(easy_install_pth, './' + easy_install_egg)

        elif develop_egg_link:
            # develop egg
            fh = open(develop_egg_link, 'r')
            link_pointer = os.path.normcase(fh.readline().strip())
            fh.close()
            assert (link_pointer == dist.location), 'Egg-link %s does not match installed location of %s (at %s)' % (link_pointer, self.name, dist.location)
            paths_to_remove.add(develop_egg_link)
            easy_install_pth = os.path.join(os.path.dirname(develop_egg_link),
                                            'easy-install.pth')
            paths_to_remove.add_pth(easy_install_pth, dist.location)
        elif dist_info_exists:
            for path in pip.wheel.uninstallation_paths(dist):
                paths_to_remove.add(path)

        # find distutils scripts= scripts
        if dist.has_metadata('scripts') and dist.metadata_isdir('scripts'):
            for script in dist.metadata_listdir('scripts'):
                if dist_in_usersite(dist):
                    bin_dir = bin_user
                else:
                    bin_dir = bin_py
                paths_to_remove.add(os.path.join(bin_dir, script))
                if sys.platform == 'win32':
                    paths_to_remove.add(os.path.join(bin_dir, script) + '.bat')

        # find console_scripts
        if dist.has_metadata('entry_points.txt'):
            config = ConfigParser.SafeConfigParser()
            config.readfp(FakeFile(dist.get_metadata_lines('entry_points.txt')))
            if config.has_section('console_scripts'):
                for name, value in config.items('console_scripts'):
                    if dist_in_usersite(dist):
                        bin_dir = bin_user
                    else:
                        bin_dir = bin_py
                    paths_to_remove.add(os.path.join(bin_dir, name))
                    if sys.platform == 'win32':
                        paths_to_remove.add(os.path.join(bin_dir, name) + '.exe')
                        paths_to_remove.add(os.path.join(bin_dir, name) + '.exe.manifest')
                        paths_to_remove.add(os.path.join(bin_dir, name) + '-script.py')

        paths_to_remove.remove(auto_confirm)
        self.uninstalled = paths_to_remove

    def rollback_uninstall(self):
        if self.uninstalled:
            self.uninstalled.rollback()
        else:
            logger.error("Can't rollback %s, nothing uninstalled."
                         % (self.project_name,))

    def commit_uninstall(self):
        if self.uninstalled:
            self.uninstalled.commit()
        else:
            logger.error("Can't commit %s, nothing uninstalled."
                         % (self.project_name,))

    def archive(self, build_dir):
        assert self.source_dir
        create_archive = True
        archive_name = '%s-%s.zip' % (self.name, self.installed_version)
        archive_path = os.path.join(build_dir, archive_name)
        if os.path.exists(archive_path):
            response = ask_path_exists(
                'The file %s exists. (i)gnore, (w)ipe, (b)ackup ' %
                display_path(archive_path), ('i', 'w', 'b'))
            if response == 'i':
                create_archive = False
            elif response == 'w':
                logger.warn('Deleting %s' % display_path(archive_path))
                os.remove(archive_path)
            elif response == 'b':
                dest_file = backup_dir(archive_path)
                logger.warn('Backing up %s to %s'
                            % (display_path(archive_path), display_path(dest_file)))
                shutil.move(archive_path, dest_file)
        if create_archive:
            zip = zipfile.ZipFile(archive_path, 'w', zipfile.ZIP_DEFLATED)
            dir = os.path.normcase(os.path.abspath(self.source_dir))
            for dirpath, dirnames, filenames in os.walk(dir):
                if 'pip-egg-info' in dirnames:
                    dirnames.remove('pip-egg-info')
                for dirname in dirnames:
                    dirname = os.path.join(dirpath, dirname)
                    name = self._clean_zip_name(dirname, dir)
                    zipdir = zipfile.ZipInfo(self.name + '/' + name + '/')
                    zipdir.external_attr = 0x1ED << 16 # 0o755
                    zip.writestr(zipdir, '')
                for filename in filenames:
                    if filename == PIP_DELETE_MARKER_FILENAME:
                        continue
                    filename = os.path.join(dirpath, filename)
                    name = self._clean_zip_name(filename, dir)
                    zip.write(filename, self.name + '/' + name)
            zip.close()
            logger.indent -= 2
            logger.notify('Saved %s' % display_path(archive_path))

    def _clean_zip_name(self, name, prefix):
        assert name.startswith(prefix+os.path.sep), (
            "name %r doesn't start with prefix %r" % (name, prefix))
        name = name[len(prefix)+1:]
        name = name.replace(os.path.sep, '/')
        return name

    def install(self, install_options, global_options=(), root=None, strip_file_prefix=None):
        if self.editable:
            self.install_editable(install_options, global_options)
            return
        if self.is_wheel:
            version = pip.wheel.wheel_version(self.source_dir)
            pip.wheel.check_compatibility(version, self.name)

            self.move_wheel_files(
                self.source_dir,
                root=root,
                strip_file_prefix=strip_file_prefix
            )
            self.install_succeeded = True
            return

        temp_location = tempfile.mkdtemp('-record', 'pip-')
        record_filename = os.path.join(temp_location, 'install-record.txt')
        try:
            install_args = [sys.executable]
            install_args.append('-c')
            install_args.append(
            "import setuptools, tokenize;__file__=%r;"\
            "exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\\r\\n', '\\n'), __file__, 'exec'))" % self.setup_py)
            install_args += list(global_options) + ['install','--record', record_filename]

            if not self.as_egg:
                install_args += ['--single-version-externally-managed']

            if root is not None:
                install_args += ['--root', root]

            if self.pycompile:
                install_args += ["--compile"]
            else:
                install_args += ["--no-compile"]

            if running_under_virtualenv():
                ## FIXME: I'm not sure if this is a reasonable location; probably not
                ## but we can't put it in the default location, as that is a virtualenv symlink that isn't writable
                install_args += ['--install-headers',
                                 os.path.join(sys.prefix, 'include', 'site',
                                              'python' + get_python_version())]
            logger.notify('Running setup.py install for %s' % self.name)
            logger.indent += 2
            try:
                call_subprocess(install_args + install_options,
                    cwd=self.source_dir, filter_stdout=self._filter_install, show_stdout=False)
            finally:
                logger.indent -= 2
            if not os.path.exists(record_filename):
                logger.notify('Record file %s not found' % record_filename)
                return
            self.install_succeeded = True
            if self.as_egg:
                # there's no --always-unzip option we can pass to install command
                # so we unable to save the installed-files.txt
                return

            def prepend_root(path):
                if root is None or not os.path.isabs(path):
                    return path
                else:
                    return change_root(root, path)

            f = open(record_filename)
            for line in f:
                line = line.strip()
                if line.endswith('.egg-info'):
                    egg_info_dir = prepend_root(line)
                    break
            else:
                logger.warn('Could not find .egg-info directory in install record for %s' % self)
                ## FIXME: put the record somewhere
                ## FIXME: should this be an error?
                return
            f.close()
            new_lines = []
            f = open(record_filename)
            for line in f:
                filename = line.strip()
                if os.path.isdir(filename):
                    filename += os.path.sep
                new_lines.append(make_path_relative(prepend_root(filename), egg_info_dir))
            f.close()
            f = open(os.path.join(egg_info_dir, 'installed-files.txt'), 'w')
            f.write('\n'.join(new_lines)+'\n')
            f.close()
        finally:
            if os.path.exists(record_filename):
                os.remove(record_filename)
            os.rmdir(temp_location)

    def remove_temporary_source(self):
        """Remove the source files from this requirement, if they are marked
        for deletion"""
        if self.is_bundle or os.path.exists(self.delete_marker_filename):
            logger.info('Removing source in %s' % self.source_dir)
            if self.source_dir:
                rmtree(self.source_dir)
            self.source_dir = None
        if self._temp_build_dir and os.path.exists(self._temp_build_dir):
            rmtree(self._temp_build_dir)
        self._temp_build_dir = None

    def install_editable(self, install_options, global_options=()):
        logger.notify('Running setup.py develop for %s' % self.name)
        logger.indent += 2
        try:
            ## FIXME: should we do --install-headers here too?
            call_subprocess(
                [sys.executable, '-c',
                 "import setuptools, tokenize; __file__=%r; exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\\r\\n', '\\n'), __file__, 'exec'))" % self.setup_py]
                + list(global_options) + ['develop', '--no-deps'] + list(install_options),

                cwd=self.source_dir, filter_stdout=self._filter_install,
                show_stdout=False)
        finally:
            logger.indent -= 2
        self.install_succeeded = True

    def _filter_install(self, line):
        level = logger.NOTIFY
        for regex in [r'^running .*', r'^writing .*', '^creating .*', '^[Cc]opying .*',
                      r'^reading .*', r"^removing .*\.egg-info' \(and everything under it\)$",
                      r'^byte-compiling ',
                      # Not sure what this warning is, but it seems harmless:
                      r"^warning: manifest_maker: standard file '-c' not found$"]:
            if re.search(regex, line.strip()):
                level = logger.INFO
                break
        return (level, line)

    def check_if_exists(self):
        """Find an installed distribution that satisfies or conflicts
        with this requirement, and set self.satisfied_by or
        self.conflicts_with appropriately."""

        if self.req is None:
            return False
        try:
            # DISTRIBUTE TO SETUPTOOLS UPGRADE HACK (1 of 3 parts)
            # if we've already set distribute as a conflict to setuptools
            # then this check has already run before.  we don't want it to
            # run again, and return False, since it would block the uninstall
            # TODO: remove this later
            if (self.req.project_name == 'setuptools'
                and self.conflicts_with
                and self.conflicts_with.project_name == 'distribute'):
                return True
            else:
                self.satisfied_by = pkg_resources.get_distribution(self.req)
        except pkg_resources.DistributionNotFound:
            return False
        except pkg_resources.VersionConflict:
            existing_dist = pkg_resources.get_distribution(self.req.project_name)
            if self.use_user_site:
                if dist_in_usersite(existing_dist):
                    self.conflicts_with = existing_dist
                elif running_under_virtualenv() and dist_in_site_packages(existing_dist):
                    raise InstallationError("Will not install to the user site because it will lack sys.path precedence to %s in %s"
                                            %(existing_dist.project_name, existing_dist.location))
            else:
                self.conflicts_with = existing_dist
        return True

    @property
    def is_wheel(self):
        return self.url and '.whl' in self.url

    @property
    def is_bundle(self):
        if self._is_bundle is not None:
            return self._is_bundle
        base = self._temp_build_dir
        if not base:
            ## FIXME: this doesn't seem right:
            return False
        self._is_bundle = (os.path.exists(os.path.join(base, 'pip-manifest.txt'))
                           or os.path.exists(os.path.join(base, 'pyinstall-manifest.txt')))
        return self._is_bundle

    def bundle_requirements(self):
        for dest_dir in self._bundle_editable_dirs:
            package = os.path.basename(dest_dir)
            ## FIXME: svnism:
            for vcs_backend in vcs.backends:
                url = rev = None
                vcs_bundle_file = os.path.join(
                    dest_dir, vcs_backend.bundle_file)
                if os.path.exists(vcs_bundle_file):
                    vc_type = vcs_backend.name
                    fp = open(vcs_bundle_file)
                    content = fp.read()
                    fp.close()
                    url, rev = vcs_backend().parse_vcs_bundle_file(content)
                    break
            if url:
                url = '%s+%s@%s' % (vc_type, url, rev)
            else:
                url = None
            yield InstallRequirement(
                package, self, editable=True, url=url,
                update=False, source_dir=dest_dir, from_bundle=True)
        for dest_dir in self._bundle_build_dirs:
            package = os.path.basename(dest_dir)
            yield InstallRequirement(package, self,source_dir=dest_dir, from_bundle=True)

    def move_bundle_files(self, dest_build_dir, dest_src_dir):
        base = self._temp_build_dir
        assert base
        src_dir = os.path.join(base, 'src')
        build_dir = os.path.join(base, 'build')
        bundle_build_dirs = []
        bundle_editable_dirs = []
        for source_dir, dest_dir, dir_collection in [
            (src_dir, dest_src_dir, bundle_editable_dirs),
            (build_dir, dest_build_dir, bundle_build_dirs)]:
            if os.path.exists(source_dir):
                for dirname in os.listdir(source_dir):
                    dest = os.path.join(dest_dir, dirname)
                    dir_collection.append(dest)
                    if os.path.exists(dest):
                        logger.warn('The directory %s (containing package %s) already exists; cannot move source from bundle %s'
                                    % (dest, dirname, self))
                        continue
                    if not os.path.exists(dest_dir):
                        logger.info('Creating directory %s' % dest_dir)
                        os.makedirs(dest_dir)
                    shutil.move(os.path.join(source_dir, dirname), dest)
                if not os.listdir(source_dir):
                    os.rmdir(source_dir)
        self._temp_build_dir = None
        self._bundle_build_dirs = bundle_build_dirs
        self._bundle_editable_dirs = bundle_editable_dirs

    def move_wheel_files(self, wheeldir, root=None, strip_file_prefix=None):
        move_wheel_files(
            self.name, self.req, wheeldir,
            user=self.use_user_site,
            home=self.target_dir,
            root=root,
            pycompile=self.pycompile,
            strip_file_prefix=strip_file_prefix,
        )

    @property
    def delete_marker_filename(self):
        assert self.source_dir
        return os.path.join(self.source_dir, PIP_DELETE_MARKER_FILENAME)


class Requirements(object):

    def __init__(self):
        self._keys = []
        self._dict = {}

    def keys(self):
        return self._keys

    def values(self):
        return [self._dict[key] for key in self._keys]

    def __contains__(self, item):
        return item in self._keys

    def __setitem__(self, key, value):
        if key not in self._keys:
            self._keys.append(key)
        self._dict[key] = value

    def __getitem__(self, key):
        return self._dict[key]

    def __repr__(self):
        values = ['%s: %s' % (repr(k), repr(self[k])) for k in self.keys()]
        return 'Requirements({%s})' % ', '.join(values)


class RequirementSet(object):

    def __init__(self, build_dir, src_dir, download_dir, download_cache=None,
                 upgrade=False, ignore_installed=False, as_egg=False,
                 target_dir=None, ignore_dependencies=False,
                 force_reinstall=False, use_user_site=False, session=None,
                 pycompile=True, wheel_download_dir=None):
        self.build_dir = build_dir
        self.src_dir = src_dir
        self.download_dir = download_dir
        if download_cache:
            download_cache = os.path.expanduser(download_cache)
        self.download_cache = download_cache
        self.upgrade = upgrade
        self.ignore_installed = ignore_installed
        self.force_reinstall = force_reinstall
        self.requirements = Requirements()
        # Mapping of alias: real_name
        self.requirement_aliases = {}
        self.unnamed_requirements = []
        self.ignore_dependencies = ignore_dependencies
        self.successfully_downloaded = []
        self.successfully_installed = []
        self.reqs_to_cleanup = []
        self.as_egg = as_egg
        self.use_user_site = use_user_site
        self.target_dir = target_dir #set from --target option
        self.session = session or PipSession()
        self.pycompile = pycompile
        self.wheel_download_dir = wheel_download_dir

    def __str__(self):
        reqs = [req for req in self.requirements.values()
                if not req.comes_from]
        reqs.sort(key=lambda req: req.name.lower())
        return ' '.join([str(req.req) for req in reqs])

    def add_requirement(self, install_req):
        name = install_req.name
        install_req.as_egg = self.as_egg
        install_req.use_user_site = self.use_user_site
        install_req.target_dir = self.target_dir
        install_req.pycompile = self.pycompile
        if not name:
            #url or path requirement w/o an egg fragment
            self.unnamed_requirements.append(install_req)
        else:
            if self.has_requirement(name):
                raise InstallationError(
                    'Double requirement given: %s (already in %s, name=%r)'
                    % (install_req, self.get_requirement(name), name))
            self.requirements[name] = install_req
            ## FIXME: what about other normalizations?  E.g., _ vs. -?
            if name.lower() != name:
                self.requirement_aliases[name.lower()] = name

    def has_requirement(self, project_name):
        for name in project_name, project_name.lower():
            if name in self.requirements or name in self.requirement_aliases:
                return True
        return False

    @property
    def has_requirements(self):
        return list(self.requirements.values()) or self.unnamed_requirements

    @property
    def has_editables(self):
        if any(req.editable for req in self.requirements.values()):
            return True
        if any(req.editable for req in self.unnamed_requirements):
            return True
        return False

    @property
    def is_download(self):
        if self.download_dir:
            self.download_dir = os.path.expanduser(self.download_dir)
            if os.path.exists(self.download_dir):
                return True
            else:
                logger.fatal('Could not find download directory')
                raise InstallationError(
                    "Could not find or access download directory '%s'"
                    % display_path(self.download_dir))
        return False

    def get_requirement(self, project_name):
        for name in project_name, project_name.lower():
            if name in self.requirements:
                return self.requirements[name]
            if name in self.requirement_aliases:
                return self.requirements[self.requirement_aliases[name]]
        raise KeyError("No project with the name %r" % project_name)

    def uninstall(self, auto_confirm=False):
        for req in self.requirements.values():
            req.uninstall(auto_confirm=auto_confirm)
            req.commit_uninstall()

    def locate_files(self):
        ## FIXME: duplicates code from prepare_files; relevant code should
        ##        probably be factored out into a separate method
        unnamed = list(self.unnamed_requirements)
        reqs = list(self.requirements.values())
        while reqs or unnamed:
            if unnamed:
                req_to_install = unnamed.pop(0)
            else:
                req_to_install = reqs.pop(0)
            install_needed = True
            if not self.ignore_installed and not req_to_install.editable:
                req_to_install.check_if_exists()
                if req_to_install.satisfied_by:
                    if self.upgrade:
                        #don't uninstall conflict if user install and and conflict is not user install
                        if not (self.use_user_site and not dist_in_usersite(req_to_install.satisfied_by)):
                            req_to_install.conflicts_with = req_to_install.satisfied_by
                        req_to_install.satisfied_by = None
                    else:
                        install_needed = False
                if req_to_install.satisfied_by:
                    logger.notify('Requirement already satisfied '
                                  '(use --upgrade to upgrade): %s'
                                  % req_to_install)

            if req_to_install.editable:
                if req_to_install.source_dir is None:
                    req_to_install.source_dir = req_to_install.build_location(self.src_dir)
            elif install_needed:
                req_to_install.source_dir = req_to_install.build_location(self.build_dir, not self.is_download)

            if req_to_install.source_dir is not None and not os.path.isdir(req_to_install.source_dir):
                raise InstallationError('Could not install requirement %s '
                                       'because source folder %s does not exist '
                                       '(perhaps --no-download was used without first running '
                                       'an equivalent install with --no-install?)'
                                       % (req_to_install, req_to_install.source_dir))

    def prepare_files(self, finder, force_root_egg_info=False, bundle=False):
        """Prepare process. Create temp directories, download and/or unpack files."""
        unnamed = list(self.unnamed_requirements)
        reqs = list(self.requirements.values())
        while reqs or unnamed:
            if unnamed:
                req_to_install = unnamed.pop(0)
            else:
                req_to_install = reqs.pop(0)
            install = True
            best_installed = False
            not_found = None
            if not self.ignore_installed and not req_to_install.editable:
                req_to_install.check_if_exists()
                if req_to_install.satisfied_by:
                    if self.upgrade:
                        if not self.force_reinstall and not req_to_install.url:
                            try:
                                url = finder.find_requirement(
                                    req_to_install, self.upgrade)
                            except BestVersionAlreadyInstalled:
                                best_installed = True
                                install = False
                            except DistributionNotFound:
                                not_found = sys.exc_info()[1]
                            else:
                                # Avoid the need to call find_requirement again
                                req_to_install.url = url.url

                        if not best_installed:
                            #don't uninstall conflict if user install and conflict is not user install
                            if not (self.use_user_site and not dist_in_usersite(req_to_install.satisfied_by)):
                                req_to_install.conflicts_with = req_to_install.satisfied_by
                            req_to_install.satisfied_by = None
                    else:
                        install = False
                if req_to_install.satisfied_by:
                    if best_installed:
                        logger.notify('Requirement already up-to-date: %s'
                                      % req_to_install)
                    else:
                        logger.notify('Requirement already satisfied '
                                      '(use --upgrade to upgrade): %s'
                                      % req_to_install)
            if req_to_install.editable:
                logger.notify('Obtaining %s' % req_to_install)
            elif install:
                if req_to_install.url and req_to_install.url.lower().startswith('file:'):
                    logger.notify('Unpacking %s' % display_path(url_to_path(req_to_install.url)))
                else:
                    logger.notify('Downloading/unpacking %s' % req_to_install)
            logger.indent += 2
            try:
                is_bundle = False
                is_wheel = False
                if req_to_install.editable:
                    if req_to_install.source_dir is None:
                        location = req_to_install.build_location(self.src_dir)
                        req_to_install.source_dir = location
                    else:
                        location = req_to_install.source_dir
                    if not os.path.exists(self.build_dir):
                        _make_build_dir(self.build_dir)
                    req_to_install.update_editable(not self.is_download)
                    if self.is_download:
                        req_to_install.run_egg_info()
                        req_to_install.archive(self.download_dir)
                    else:
                        req_to_install.run_egg_info()
                elif install:
                    ##@@ if filesystem packages are not marked
                    ##editable in a req, a non deterministic error
                    ##occurs when the script attempts to unpack the
                    ##build directory

                    # NB: This call can result in the creation of a temporary build directory
                    location = req_to_install.build_location(self.build_dir, not self.is_download)
                    unpack = True
                    url = None

                    # In the case where the req comes from a bundle, we should
                    # assume a build dir exists and move on
                    if req_to_install.from_bundle:
                        pass
                    # If a checkout exists, it's unwise to keep going.  version
                    # inconsistencies are logged later, but do not fail the
                    # installation.
                    elif os.path.exists(os.path.join(location, 'setup.py')):
                        raise PreviousBuildDirError(textwrap.dedent("""
                          pip can't proceed with requirement '%s' due to a pre-existing build directory.
                           location: %s
                          This is likely due to a previous installation that failed.
                          pip is being responsible and not assuming it can delete this.
                          Please delete it and try again.
                        """ % (req_to_install, location)))
                    else:
                        ## FIXME: this won't upgrade when there's an existing package unpacked in `location`
                        if req_to_install.url is None:
                            if not_found:
                                raise not_found
                            url = finder.find_requirement(req_to_install, upgrade=self.upgrade)
                        else:
                            ## FIXME: should req_to_install.url already be a link?
                            url = Link(req_to_install.url)
                            assert url
                        if url:
                            try:

                                if (
                                    url.filename.endswith(wheel_ext)
                                    and self.wheel_download_dir
                                ):
                                    # when doing 'pip wheel`
                                    download_dir = self.wheel_download_dir
                                    do_download = True
                                else:
                                    download_dir = self.download_dir
                                    do_download = self.is_download
                                self.unpack_url(
                                    url, location, download_dir,
                                    do_download,
                                    )
                            except HTTPError as exc:
                                logger.fatal(
                                    'Could not install requirement %s because '
                                    'of error %s' % (req_to_install, exc)
                                )
                                raise InstallationError(
                                    'Could not install requirement %s because of HTTP error %s for URL %s'
                                    % (req_to_install, e, url))
                        else:
                            unpack = False
                    if unpack:
                        is_bundle = req_to_install.is_bundle
                        is_wheel = url and url.filename.endswith(wheel_ext)
                        if is_bundle:
                            req_to_install.move_bundle_files(self.build_dir, self.src_dir)
                            for subreq in req_to_install.bundle_requirements():
                                reqs.append(subreq)
                                self.add_requirement(subreq)
                        elif self.is_download:
                            req_to_install.source_dir = location
                            if not is_wheel:
                                # FIXME: see https://github.com/pypa/pip/issues/1112
                                req_to_install.run_egg_info()
                            if url and url.scheme in vcs.all_schemes:
                                req_to_install.archive(self.download_dir)
                        elif is_wheel:
                            req_to_install.source_dir = location
                            req_to_install.url = url.url
                        else:
                            req_to_install.source_dir = location
                            req_to_install.run_egg_info()
                            if force_root_egg_info:
                                # We need to run this to make sure that the .egg-info/
                                # directory is created for packing in the bundle
                                req_to_install.run_egg_info(force_root_egg_info=True)
                            req_to_install.assert_source_matches_version()
                            #@@ sketchy way of identifying packages not grabbed from an index
                            if bundle and req_to_install.url:
                                self.copy_to_build_dir(req_to_install)
                                install = False
                        # req_to_install.req is only avail after unpack for URL pkgs
                        # repeat check_if_exists to uninstall-on-upgrade (#14)
                        if not self.ignore_installed:
                            req_to_install.check_if_exists()
                        if req_to_install.satisfied_by:
                            if self.upgrade or self.ignore_installed:
                                #don't uninstall conflict if user install and and conflict is not user install
                                if not (self.use_user_site and not dist_in_usersite(req_to_install.satisfied_by)):
                                    req_to_install.conflicts_with = req_to_install.satisfied_by
                                req_to_install.satisfied_by = None
                            else:
                                logger.notify(
                                    'Requirement already satisfied (use '
                                    '--upgrade to upgrade): %s' %
                                    req_to_install
                                )
                                install = False
                if is_wheel:
                    dist = list(
                        pkg_resources.find_distributions(location)
                    )[0]
                    if not req_to_install.req:
                        req_to_install.req = dist.as_requirement()
                        self.add_requirement(req_to_install)
                    if not self.ignore_dependencies:
                        for subreq in dist.requires(
                                req_to_install.extras):
                            if self.has_requirement(
                                    subreq.project_name):
                                continue
                            subreq = InstallRequirement(str(subreq),
                                                        req_to_install)
                            reqs.append(subreq)
                            self.add_requirement(subreq)

                # sdists
                elif not is_bundle:
                    ## FIXME: shouldn't be globally added:
                    finder.add_dependency_links(req_to_install.dependency_links)
                    if (req_to_install.extras):
                        logger.notify("Installing extra requirements: %r" % ','.join(req_to_install.extras))
                    if not self.ignore_dependencies:
                        for req in req_to_install.requirements(req_to_install.extras):
                            try:
                                name = pkg_resources.Requirement.parse(req).project_name
                            except ValueError:
                                e = sys.exc_info()[1]
                                ## FIXME: proper warning
                                logger.error('Invalid requirement: %r (%s) in requirement %s' % (req, e, req_to_install))
                                continue
                            if self.has_requirement(name):
                                ## FIXME: check for conflict
                                continue
                            subreq = InstallRequirement(req, req_to_install)
                            reqs.append(subreq)
                            self.add_requirement(subreq)
                    if not self.has_requirement(req_to_install.name):
                        #'unnamed' requirements will get added here
                        self.add_requirement(req_to_install)

                # cleanup tmp src
                if not is_bundle:
                    if (
                        self.is_download or
                        req_to_install._temp_build_dir is not None
                    ):
                        self.reqs_to_cleanup.append(req_to_install)

                if install:
                    self.successfully_downloaded.append(req_to_install)
                    if bundle and (req_to_install.url and req_to_install.url.startswith('file:///')):
                        self.copy_to_build_dir(req_to_install)
            finally:
                logger.indent -= 2

    def cleanup_files(self, bundle=False):
        """Clean up files, remove builds."""
        logger.notify('Cleaning up...')
        logger.indent += 2
        for req in self.reqs_to_cleanup:
            req.remove_temporary_source()

        remove_dir = []
        if self._pip_has_created_build_dir():
            remove_dir.append(self.build_dir)

        # The source dir of a bundle can always be removed.
        # FIXME: not if it pre-existed the bundle!
        if bundle:
            remove_dir.append(self.src_dir)

        for dir in remove_dir:
            if os.path.exists(dir):
                logger.info('Removing temporary dir %s...' % dir)
                rmtree(dir)

        logger.indent -= 2

    def _pip_has_created_build_dir(self):
        return (self.build_dir == build_prefix and
                os.path.exists(os.path.join(self.build_dir, PIP_DELETE_MARKER_FILENAME)))

    def copy_to_build_dir(self, req_to_install):
        target_dir = req_to_install.editable and self.src_dir or self.build_dir
        logger.info("Copying %s to %s" % (req_to_install.name, target_dir))
        dest = os.path.join(target_dir, req_to_install.name)
        shutil.copytree(req_to_install.source_dir, dest)
        call_subprocess(["python", "%s/setup.py" % dest, "clean"], cwd=dest,
                        command_desc='python setup.py clean')

    def unpack_url(self, link, location, download_dir=None,
                   only_download=False):
        if download_dir is None:
            download_dir = self.download_dir

        # non-editable vcs urls
        if is_vcs_url(link):
            if only_download:
                loc = download_dir
            else:
                loc = location
            unpack_vcs_link(link, loc, only_download)

        # file urls
        elif is_file_url(link):
            unpack_file_url(link, location, download_dir)
            if only_download:
                write_delete_marker_file(location)

        # http urls
        else:
            unpack_http_url(
                link,
                location,
                self.download_cache,
                download_dir,
                self.session,
            )
            if only_download:
                write_delete_marker_file(location)

    def install(self, install_options, global_options=(), *args, **kwargs):
        """Install everything in this set (after having downloaded and unpacked the packages)"""
        to_install = [r for r in self.requirements.values()
                      if not r.satisfied_by]

        # DISTRIBUTE TO SETUPTOOLS UPGRADE HACK (1 of 3 parts)
        # move the distribute-0.7.X wrapper to the end because it does not
        # install a setuptools package. by moving it to the end, we ensure it's
        # setuptools dependency is handled first, which will provide the
        # setuptools package
        # TODO: take this out later
        distribute_req = pkg_resources.Requirement.parse("distribute>=0.7")
        for req in to_install:
            if req.name == 'distribute' and req.installed_version in distribute_req:
                to_install.remove(req)
                to_install.append(req)

        if to_install:
            logger.notify('Installing collected packages: %s' % ', '.join([req.name for req in to_install]))
        logger.indent += 2
        try:
            for requirement in to_install:

                # DISTRIBUTE TO SETUPTOOLS UPGRADE HACK (1 of 3 parts)
                # when upgrading from distribute-0.6.X to the new merged
                # setuptools in py2, we need to force setuptools to uninstall
                # distribute. In py3, which is always using distribute, this
                # conversion is already happening in distribute's pkg_resources.
                # It's ok *not* to check if setuptools>=0.7 because if someone
                # were actually trying to ugrade from distribute to setuptools
                # 0.6.X, then all this could do is actually help, although that
                # upgade path was certainly never "supported"
                # TODO: remove this later
                if requirement.name == 'setuptools':
                    try:
                        # only uninstall distribute<0.7. For >=0.7, setuptools
                        # will also be present, and that's what we need to
                        # uninstall
                        distribute_requirement = pkg_resources.Requirement.parse("distribute<0.7")
                        existing_distribute = pkg_resources.get_distribution("distribute")
                        if existing_distribute in distribute_requirement:
                            requirement.conflicts_with = existing_distribute
                    except pkg_resources.DistributionNotFound:
                        # distribute wasn't installed, so nothing to do
                        pass

                if requirement.conflicts_with:
                    logger.notify('Found existing installation: %s'
                                  % requirement.conflicts_with)
                    logger.indent += 2
                    try:
                        requirement.uninstall(auto_confirm=True)
                    finally:
                        logger.indent -= 2
                try:
                    requirement.install(install_options, global_options, *args, **kwargs)
                except:
                    # if install did not succeed, rollback previous uninstall
                    if requirement.conflicts_with and not requirement.install_succeeded:
                        requirement.rollback_uninstall()
                    raise
                else:
                    if requirement.conflicts_with and requirement.install_succeeded:
                        requirement.commit_uninstall()
                requirement.remove_temporary_source()
        finally:
            logger.indent -= 2
        self.successfully_installed = to_install

    def create_bundle(self, bundle_filename):
        ## FIXME: can't decide which is better; zip is easier to read
        ## random files from, but tar.bz2 is smaller and not as lame a
        ## format.

        ## FIXME: this file should really include a manifest of the
        ## packages, maybe some other metadata files.  It would make
        ## it easier to detect as well.
        zip = zipfile.ZipFile(bundle_filename, 'w', zipfile.ZIP_DEFLATED)
        vcs_dirs = []
        for dir, basename in (self.build_dir, 'build'), (self.src_dir, 'src'):
            dir = os.path.normcase(os.path.abspath(dir))
            for dirpath, dirnames, filenames in os.walk(dir):
                for backend in vcs.backends:
                    vcs_backend = backend()
                    vcs_url = vcs_rev = None
                    if vcs_backend.dirname in dirnames:
                        for vcs_dir in vcs_dirs:
                            if dirpath.startswith(vcs_dir):
                                # vcs bundle file already in parent directory
                                break
                        else:
                            vcs_url, vcs_rev = vcs_backend.get_info(
                                os.path.join(dir, dirpath))
                            vcs_dirs.append(dirpath)
                        vcs_bundle_file = vcs_backend.bundle_file
                        vcs_guide = vcs_backend.guide % {'url': vcs_url,
                                                         'rev': vcs_rev}
                        dirnames.remove(vcs_backend.dirname)
                        break
                if 'pip-egg-info' in dirnames:
                    dirnames.remove('pip-egg-info')
                for dirname in dirnames:
                    dirname = os.path.join(dirpath, dirname)
                    name = self._clean_zip_name(dirname, dir)
                    zip.writestr(basename + '/' + name + '/', '')
                for filename in filenames:
                    if filename == PIP_DELETE_MARKER_FILENAME:
                        continue
                    filename = os.path.join(dirpath, filename)
                    name = self._clean_zip_name(filename, dir)
                    zip.write(filename, basename + '/' + name)
                if vcs_url:
                    name = os.path.join(dirpath, vcs_bundle_file)
                    name = self._clean_zip_name(name, dir)
                    zip.writestr(basename + '/' + name, vcs_guide)

        zip.writestr('pip-manifest.txt', self.bundle_requirements())
        zip.close()

    BUNDLE_HEADER = '''\
# This is a pip bundle file, that contains many source packages
# that can be installed as a group.  You can install this like:
#     pip this_file.zip
# The rest of the file contains a list of all the packages included:
'''

    def bundle_requirements(self):
        parts = [self.BUNDLE_HEADER]
        for req in [req for req in self.requirements.values()
                    if not req.comes_from]:
            parts.append('%s==%s\n' % (req.name, req.installed_version))
        parts.append('# These packages were installed to satisfy the above requirements:\n')
        for req in [req for req in self.requirements.values()
                    if req.comes_from]:
            parts.append('%s==%s\n' % (req.name, req.installed_version))
        ## FIXME: should we do something with self.unnamed_requirements?
        return ''.join(parts)

    def _clean_zip_name(self, name, prefix):
        assert name.startswith(prefix+os.path.sep), (
            "name %r doesn't start with prefix %r" % (name, prefix))
        name = name[len(prefix)+1:]
        name = name.replace(os.path.sep, '/')
        return name


def _make_build_dir(build_dir):
    os.makedirs(build_dir)
    write_delete_marker_file(build_dir)


_scheme_re = re.compile(r'^(http|https|file):', re.I)


def parse_requirements(filename, finder=None, comes_from=None, options=None,
                       session=None):
    if session is None:
        session = PipSession()

    skip_match = None
    skip_regex = options.skip_requirements_regex if options else None
    if skip_regex:
        skip_match = re.compile(skip_regex)
    reqs_file_dir = os.path.dirname(os.path.abspath(filename))
    filename, content = get_file_content(filename,
        comes_from=comes_from,
        session=session,
    )
    for line_number, line in enumerate(content.splitlines()):
        line_number += 1
        line = line.strip()

        # Remove comments from file
        line = re.sub(r"(^|\s)#.*$", "", line)

        if not line or line.startswith('#'):
            continue
        if skip_match and skip_match.search(line):
            continue
        if line.startswith('-r') or line.startswith('--requirement'):
            if line.startswith('-r'):
                req_url = line[2:].strip()
            else:
                req_url = line[len('--requirement'):].strip().strip('=')
            if _scheme_re.search(filename):
                # Relative to a URL
                req_url = urlparse.urljoin(filename, req_url)
            elif not _scheme_re.search(req_url):
                req_url = os.path.join(os.path.dirname(filename), req_url)
            for item in parse_requirements(req_url, finder, comes_from=filename, options=options, session=session):
                yield item
        elif line.startswith('-Z') or line.startswith('--always-unzip'):
            # No longer used, but previously these were used in
            # requirement files, so we'll ignore.
            pass
        elif line.startswith('-f') or line.startswith('--find-links'):
            if line.startswith('-f'):
                line = line[2:].strip()
            else:
                line = line[len('--find-links'):].strip().lstrip('=')
            ## FIXME: it would be nice to keep track of the source of
            ## the find_links:
            # support a find-links local path relative to a requirements file
            relative_to_reqs_file = os.path.join(reqs_file_dir, line)
            if os.path.exists(relative_to_reqs_file):
                line = relative_to_reqs_file
            if finder:
                finder.find_links.append(line)
        elif line.startswith('-i') or line.startswith('--index-url'):
            if line.startswith('-i'):
                line = line[2:].strip()
            else:
                line = line[len('--index-url'):].strip().lstrip('=')
            if finder:
                finder.index_urls = [line]
        elif line.startswith('--extra-index-url'):
            line = line[len('--extra-index-url'):].strip().lstrip('=')
            if finder:
                finder.index_urls.append(line)
        elif line.startswith('--use-wheel'):
            finder.use_wheel = True
        elif line.startswith('--no-index'):
            finder.index_urls = []
        elif line.startswith("--allow-external"):
            line = line[len("--allow-external"):].strip().lstrip("=")
            finder.allow_external |= set([normalize_name(line).lower()])
        elif line.startswith("--allow-all-external"):
            finder.allow_all_external = True
        # Remove in 1.7
        elif line.startswith("--no-allow-external"):
            pass
        # Remove in 1.7
        elif line.startswith("--no-allow-insecure"):
            pass
        # Remove after 1.7
        elif line.startswith("--allow-insecure"):
            line = line[len("--allow-insecure"):].strip().lstrip("=")
            finder.allow_unverified |= set([normalize_name(line).lower()])
        elif line.startswith("--allow-unverified"):
            line = line[len("--allow-unverified"):].strip().lstrip("=")
            finder.allow_unverified |= set([normalize_name(line).lower()])
        else:
            comes_from = '-r %s (line %s)' % (filename, line_number)
            if line.startswith('-e') or line.startswith('--editable'):
                if line.startswith('-e'):
                    line = line[2:].strip()
                else:
                    line = line[len('--editable'):].strip().lstrip('=')
                req = InstallRequirement.from_editable(
                    line, comes_from=comes_from, default_vcs=options.default_vcs if options else None)
            else:
                req = InstallRequirement.from_line(line, comes_from, prereleases=getattr(options, "pre", None))
            yield req

def _strip_postfix(req):
    """
        Strip req postfix ( -dev, 0.2, etc )
    """
    ## FIXME: use package_to_requirement?
    match = re.search(r'^(.*?)(?:-dev|-\d.*)$', req)
    if match:
        # Strip off -dev, -0.2, etc.
        req = match.group(1)
    return req

def _build_req_from_url(url):

    parts = [p for p in url.split('#', 1)[0].split('/') if p]

    req = None
    if parts[-2] in ('tags', 'branches', 'tag', 'branch'):
        req = parts[-3]
    elif parts[-1] == 'trunk':
        req = parts[-2]
    return req

def _build_editable_options(req):

    """
        This method generates a dictionary of the query string
        parameters contained in a given editable URL.
    """
    regexp = re.compile(r"[\?#&](?P<name>[^&=]+)=(?P<value>[^&=]+)")
    matched = regexp.findall(req)

    if matched:
        ret = dict()
        for option in matched:
            (name, value) = option
            if name in ret:
                raise Exception("%s option already defined" % name)
            ret[name] = value
        return ret
    return None


def parse_editable(editable_req, default_vcs=None):
    """Parses svn+http://blahblah@rev#egg=Foobar into a requirement
    (Foobar) and a URL"""

    url = editable_req
    extras = None

    # If a file path is specified with extras, strip off the extras.
    m = re.match(r'^(.+)(\[[^\]]+\])$', url)
    if m:
        url_no_extras = m.group(1)
        extras = m.group(2)
    else:
        url_no_extras = url

    if os.path.isdir(url_no_extras):
        if not os.path.exists(os.path.join(url_no_extras, 'setup.py')):
            raise InstallationError("Directory %r is not installable. File 'setup.py' not found." % url_no_extras)
        # Treating it as code that has already been checked out
        url_no_extras = path_to_url(url_no_extras)

    if url_no_extras.lower().startswith('file:'):
        if extras:
            return None, url_no_extras, pkg_resources.Requirement.parse('__placeholder__' + extras).extras
        else:
            return None, url_no_extras, None

    for version_control in vcs:
        if url.lower().startswith('%s:' % version_control):
            url = '%s+%s' % (version_control, url)
            break

    if '+' not in url:
        if default_vcs:
            url = default_vcs + '+' + url
        else:
            raise InstallationError(
                '%s should either be a path to a local project or a VCS url beginning with svn+, git+, hg+, or bzr+' % editable_req)

    vc_type = url.split('+', 1)[0].lower()

    if not vcs.get_backend(vc_type):
        error_message = 'For --editable=%s only ' % editable_req + \
            ', '.join([backend.name + '+URL' for backend in vcs.backends]) + \
            ' is currently supported'
        raise InstallationError(error_message)

    try:
        options = _build_editable_options(editable_req)
    except Exception:
        message = sys.exc_info()[1]
        raise InstallationError(
            '--editable=%s error in editable options:%s' % (editable_req, message))

    if not options or 'egg' not in options:
        req = _build_req_from_url(editable_req)
        if not req:
            raise InstallationError('--editable=%s is not the right format; it must have #egg=Package' % editable_req)
    else:
        req = options['egg']

    package = _strip_postfix(req)
    return package, url, options


class UninstallPathSet(object):
    """A set of file paths to be removed in the uninstallation of a
    requirement."""
    def __init__(self, dist):
        self.paths = set()
        self._refuse = set()
        self.pth = {}
        self.dist = dist
        self.save_dir = None
        self._moved_paths = []

    def _permitted(self, path):
        """
        Return True if the given path is one we are permitted to
        remove/modify, False otherwise.

        """
        return is_local(path)

    def _can_uninstall(self):
        if not dist_is_local(self.dist):
            logger.notify("Not uninstalling %s at %s, outside environment %s"
                          % (self.dist.project_name, normalize_path(self.dist.location), sys.prefix))
            return False
        return True

    def add(self, path):
        path = normalize_path(path)
        if not os.path.exists(path):
            return
        if self._permitted(path):
            self.paths.add(path)
        else:
            self._refuse.add(path)

        # __pycache__ files can show up after 'installed-files.txt' is created, due to imports
        if os.path.splitext(path)[1] == '.py' and uses_pycache:
            self.add(imp.cache_from_source(path))


    def add_pth(self, pth_file, entry):
        pth_file = normalize_path(pth_file)
        if self._permitted(pth_file):
            if pth_file not in self.pth:
                self.pth[pth_file] = UninstallPthEntries(pth_file)
            self.pth[pth_file].add(entry)
        else:
            self._refuse.add(pth_file)

    def compact(self, paths):
        """Compact a path set to contain the minimal number of paths
        necessary to contain all paths in the set. If /a/path/ and
        /a/path/to/a/file.txt are both in the set, leave only the
        shorter path."""
        short_paths = set()
        for path in sorted(paths, key=len):
            if not any([(path.startswith(shortpath) and
                         path[len(shortpath.rstrip(os.path.sep))] == os.path.sep)
                        for shortpath in short_paths]):
                short_paths.add(path)
        return short_paths

    def _stash(self, path):
        return os.path.join(
            self.save_dir, os.path.splitdrive(path)[1].lstrip(os.path.sep))

    def remove(self, auto_confirm=False):
        """Remove paths in ``self.paths`` with confirmation (unless
        ``auto_confirm`` is True)."""
        if not self._can_uninstall():
            return
        if not self.paths:
            logger.notify("Can't uninstall '%s'. No files were found to uninstall." % self.dist.project_name)
            return
        logger.notify('Uninstalling %s:' % self.dist.project_name)
        logger.indent += 2
        paths = sorted(self.compact(self.paths))
        try:
            if auto_confirm:
                response = 'y'
            else:
                for path in paths:
                    logger.notify(path)
                response = ask('Proceed (y/n)? ', ('y', 'n'))
            if self._refuse:
                logger.notify('Not removing or modifying (outside of prefix):')
                for path in self.compact(self._refuse):
                    logger.notify(path)
            if response == 'y':
                self.save_dir = tempfile.mkdtemp(suffix='-uninstall',
                                                 prefix='pip-')
                for path in paths:
                    new_path = self._stash(path)
                    logger.info('Removing file or directory %s' % path)
                    self._moved_paths.append(path)
                    renames(path, new_path)
                for pth in self.pth.values():
                    pth.remove()
                logger.notify('Successfully uninstalled %s' % self.dist.project_name)

        finally:
            logger.indent -= 2

    def rollback(self):
        """Rollback the changes previously made by remove()."""
        if self.save_dir is None:
            logger.error("Can't roll back %s; was not uninstalled" % self.dist.project_name)
            return False
        logger.notify('Rolling back uninstall of %s' % self.dist.project_name)
        for path in self._moved_paths:
            tmp_path = self._stash(path)
            logger.info('Replacing %s' % path)
            renames(tmp_path, path)
        for pth in self.pth:
            pth.rollback()

    def commit(self):
        """Remove temporary save dir: rollback will no longer be possible."""
        if self.save_dir is not None:
            rmtree(self.save_dir)
            self.save_dir = None
            self._moved_paths = []


class UninstallPthEntries(object):
    def __init__(self, pth_file):
        if not os.path.isfile(pth_file):
            raise UninstallationError("Cannot remove entries from nonexistent file %s" % pth_file)
        self.file = pth_file
        self.entries = set()
        self._saved_lines = None

    def add(self, entry):
        entry = os.path.normcase(entry)
        # On Windows, os.path.normcase converts the entry to use
        # backslashes.  This is correct for entries that describe absolute
        # paths outside of site-packages, but all the others use forward
        # slashes.
        if sys.platform == 'win32' and not os.path.splitdrive(entry)[0]:
            entry = entry.replace('\\', '/')
        self.entries.add(entry)

    def remove(self):
        logger.info('Removing pth entries from %s:' % self.file)
        fh = open(self.file, 'rb')
        # windows uses '\r\n' with py3k, but uses '\n' with py2.x
        lines = fh.readlines()
        self._saved_lines = lines
        fh.close()
        if any(b('\r\n') in line for line in lines):
            endline = '\r\n'
        else:
            endline = '\n'
        for entry in self.entries:
            try:
                logger.info('Removing entry: %s' % entry)
                lines.remove(b(entry + endline))
            except ValueError:
                pass
        fh = open(self.file, 'wb')
        fh.writelines(lines)
        fh.close()

    def rollback(self):
        if self._saved_lines is None:
            logger.error('Cannot roll back changes to %s, none were made' % self.file)
            return False
        logger.info('Rolling %s back to previous state' % self.file)
        fh = open(self.file, 'wb')
        fh.writelines(self._saved_lines)
        fh.close()
        return True


class FakeFile(object):
    """Wrap a list of lines in an object with readline() to make
    ConfigParser happy."""
    def __init__(self, lines):
        self._gen = (l for l in lines)

    def readline(self):
        try:
            try:
                return next(self._gen)
            except NameError:
                return self._gen.next()
        except StopIteration:
            return ''

    def __iter__(self):
        return self._gen
site-packages/pip/basecommand.py000064400000014662151733463530012722 0ustar00"""Base Command class, and related routines"""

import os
import sys
import tempfile
import traceback
import time
import optparse

from pip import cmdoptions
from pip.locations import running_under_virtualenv
from pip.log import logger
from pip.download import PipSession
from pip.exceptions import (BadCommand, InstallationError, UninstallationError,
                            CommandError, PreviousBuildDirError)
from pip.backwardcompat import StringIO
from pip.baseparser import ConfigOptionParser, UpdatingDefaultsHelpFormatter
from pip.status_codes import (SUCCESS, ERROR, UNKNOWN_ERROR, VIRTUALENV_NOT_FOUND,
                              PREVIOUS_BUILD_DIR_ERROR)
from pip.util import get_prog


__all__ = ['Command']


class Command(object):
    name = None
    usage = None
    hidden = False

    def __init__(self):
        parser_kw = {
            'usage': self.usage,
            'prog': '%s %s' % (get_prog(), self.name),
            'formatter': UpdatingDefaultsHelpFormatter(),
            'add_help_option': False,
            'name': self.name,
            'description': self.__doc__,
        }

        self.parser = ConfigOptionParser(**parser_kw)

        # Commands should add options to this option group
        optgroup_name = '%s Options' % self.name.capitalize()
        self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name)

        # Add the general options
        gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, self.parser)
        self.parser.add_option_group(gen_opts)

    def _build_session(self, options):
        session = PipSession()

        # Handle custom ca-bundles from the user
        if options.cert:
            session.verify = options.cert

        # Handle timeouts
        if options.timeout:
            session.timeout = options.timeout

        # Handle configured proxies
        if options.proxy:
            session.proxies = {
                "http": options.proxy,
                "https": options.proxy,
            }

        # Determine if we can prompt the user for authentication or not
        session.auth.prompting = not options.no_input

        return session

    def setup_logging(self):
        pass

    def parse_args(self, args):
        # factored out for testability
        return self.parser.parse_args(args)

    def main(self, args):
        options, args = self.parse_args(args)

        level = 1  # Notify
        level += options.verbose
        level -= options.quiet
        level = logger.level_for_integer(4 - level)
        complete_log = []
        logger.add_consumers(
            (level, sys.stdout),
            (logger.DEBUG, complete_log.append),
        )
        if options.log_explicit_levels:
            logger.explicit_levels = True

        self.setup_logging()

        #TODO: try to get these passing down from the command?
        #      without resorting to os.environ to hold these.

        if options.no_input:
            os.environ['PIP_NO_INPUT'] = '1'

        if options.exists_action:
            os.environ['PIP_EXISTS_ACTION'] = ' '.join(options.exists_action)

        if options.require_venv:
            # If a venv is required check if it can really be found
            if not running_under_virtualenv():
                logger.fatal('Could not find an activated virtualenv (required).')
                sys.exit(VIRTUALENV_NOT_FOUND)

        if options.log:
            log_fp = open_logfile(options.log, 'a')
            logger.add_consumers((logger.DEBUG, log_fp))
        else:
            log_fp = None

        exit = SUCCESS
        store_log = False
        try:
            status = self.run(options, args)
            # FIXME: all commands should return an exit status
            # and when it is done, isinstance is not needed anymore
            if isinstance(status, int):
                exit = status
        except PreviousBuildDirError:
            e = sys.exc_info()[1]
            logger.fatal(str(e))
            logger.info('Exception information:\n%s' % format_exc())
            store_log = True
            exit = PREVIOUS_BUILD_DIR_ERROR
        except (InstallationError, UninstallationError):
            e = sys.exc_info()[1]
            logger.fatal(str(e))
            logger.info('Exception information:\n%s' % format_exc())
            store_log = True
            exit = ERROR
        except BadCommand:
            e = sys.exc_info()[1]
            logger.fatal(str(e))
            logger.info('Exception information:\n%s' % format_exc())
            store_log = True
            exit = ERROR
        except CommandError:
            e = sys.exc_info()[1]
            logger.fatal('ERROR: %s' % e)
            logger.info('Exception information:\n%s' % format_exc())
            exit = ERROR
        except KeyboardInterrupt:
            logger.fatal('Operation cancelled by user')
            logger.info('Exception information:\n%s' % format_exc())
            store_log = True
            exit = ERROR
        except:
            logger.fatal('Exception:\n%s' % format_exc())
            store_log = True
            exit = UNKNOWN_ERROR
        if store_log:
            log_file_fn = options.log_file
            text = '\n'.join(complete_log)
            try:
                log_file_fp = open_logfile(log_file_fn, 'w')
            except IOError:
                temp = tempfile.NamedTemporaryFile(delete=False)
                log_file_fn = temp.name
                log_file_fp = open_logfile(log_file_fn, 'w')
            logger.fatal('Storing debug log for failure in %s' % log_file_fn)
            log_file_fp.write(text)
            log_file_fp.close()
        if log_fp is not None:
            log_fp.close()
        return exit


def format_exc(exc_info=None):
    if exc_info is None:
        exc_info = sys.exc_info()
    out = StringIO()
    traceback.print_exception(*exc_info, **dict(file=out))
    return out.getvalue()


def open_logfile(filename, mode='a'):
    """Open the named log file in append mode.

    If the file already exists, a separator will also be printed to
    the file to separate past activity from current activity.
    """
    filename = os.path.expanduser(filename)
    filename = os.path.abspath(filename)
    dirname = os.path.dirname(filename)
    if not os.path.exists(dirname):
        os.makedirs(dirname)
    exists = os.path.exists(filename)

    log_fp = open(filename, mode)
    if exists:
        log_fp.write('%s\n' % ('-' * 60))
        log_fp.write('%s run on %s\n' % (sys.argv[0], time.strftime('%c')))
    return log_fp
site-packages/pip/_vendor/_markerlib/markers.py000064400000007613151733463530015656 0ustar00# -*- coding: utf-8 -*-
"""Interpret PEP 345 environment markers.

EXPR [in|==|!=|not in] EXPR [or|and] ...

where EXPR belongs to any of those:

    python_version = '%s.%s' % (sys.version_info[0], sys.version_info[1])
    python_full_version = sys.version.split()[0]
    os.name = os.name
    sys.platform = sys.platform
    platform.version = platform.version()
    platform.machine = platform.machine()
    platform.python_implementation = platform.python_implementation()
    a free string, like '2.6', or 'win32'
"""

__all__ = ['default_environment', 'compile', 'interpret']

import ast
import os
import platform
import sys
import weakref

_builtin_compile = compile

try:
    from platform import python_implementation
except ImportError:
    if os.name == "java":
        # Jython 2.5 has ast module, but not platform.python_implementation() function.
        def python_implementation():
            return "Jython"
    else:
        raise


# restricted set of variables
_VARS = {'sys.platform': sys.platform,
         'python_version': '%s.%s' % sys.version_info[:2],
         # FIXME parsing sys.platform is not reliable, but there is no other
         # way to get e.g. 2.7.2+, and the PEP is defined with sys.version
         'python_full_version': sys.version.split(' ', 1)[0],
         'os.name': os.name,
         'platform.version': platform.version(),
         'platform.machine': platform.machine(),
         'platform.python_implementation': python_implementation(),
         'extra': None # wheel extension
        }

for var in list(_VARS.keys()):
    if '.' in var:
        _VARS[var.replace('.', '_')] = _VARS[var]

def default_environment():
    """Return copy of default PEP 385 globals dictionary."""
    return dict(_VARS)

class ASTWhitelist(ast.NodeTransformer):
    def __init__(self, statement):
        self.statement = statement # for error messages

    ALLOWED = (ast.Compare, ast.BoolOp, ast.Attribute, ast.Name, ast.Load, ast.Str)
    # Bool operations
    ALLOWED += (ast.And, ast.Or)
    # Comparison operations
    ALLOWED += (ast.Eq, ast.Gt, ast.GtE, ast.In, ast.Is, ast.IsNot, ast.Lt, ast.LtE, ast.NotEq, ast.NotIn)

    def visit(self, node):
        """Ensure statement only contains allowed nodes."""
        if not isinstance(node, self.ALLOWED):
            raise SyntaxError('Not allowed in environment markers.\n%s\n%s' %
                               (self.statement,
                               (' ' * node.col_offset) + '^'))
        return ast.NodeTransformer.visit(self, node)

    def visit_Attribute(self, node):
        """Flatten one level of attribute access."""
        new_node = ast.Name("%s.%s" % (node.value.id, node.attr), node.ctx)
        return ast.copy_location(new_node, node)

def parse_marker(marker):
    tree = ast.parse(marker, mode='eval')
    new_tree = ASTWhitelist(marker).generic_visit(tree)
    return new_tree

def compile_marker(parsed_marker):
    return _builtin_compile(parsed_marker, '<environment marker>', 'eval',
                   dont_inherit=True)

_cache = weakref.WeakValueDictionary()

def compile(marker):
    """Return compiled marker as a function accepting an environment dict."""
    try:
        return _cache[marker]
    except KeyError:
        pass
    if not marker.strip():
        def marker_fn(environment=None, override=None):
            """"""
            return True
    else:
        compiled_marker = compile_marker(parse_marker(marker))
        def marker_fn(environment=None, override=None):
            """override updates environment"""
            if override is None:
                override = {}
            if environment is None:
                environment = default_environment()
            environment.update(override)
            return eval(compiled_marker, environment)
    marker_fn.__doc__ = marker
    _cache[marker] = marker_fn
    return _cache[marker]

def interpret(marker, environment=None):
    return compile(marker)(environment)
site-packages/pip/_vendor/_markerlib/__pycache__/__init__.cpython-33.pyc000064400000002522151733463530022224 0ustar00�
7�Re4c@s�y,ddlZddlmZmZmZWnQek
rde�krQ�ndd�Zdd�Zdddd	�ZYnXdS(
iN(udefault_environmentucompileu	interpretuastcCsiS(N((((u8/tmp/pip-zej_zi-build/pip/_vendor/_markerlib/__init__.pyudefault_environmentsudefault_environmentcs%dd�fdd�}�|_|S(Ncs�j�S(N(ustrip(uenvironmentuoverride(umarker(u8/tmp/pip-zej_zi-build/pip/_vendor/_markerlib/__init__.pyu	marker_fn
sucompile.<locals>.marker_fn(uNoneu__doc__(umarkeru	marker_fn((umarkeru8/tmp/pip-zej_zi-build/pip/_vendor/_markerlib/__init__.pyucompile	s	ucompilecCs
t|��S(N(ucompile(umarkeruenvironmentuoverride((u8/tmp/pip-zej_zi-build/pip/_vendor/_markerlib/__init__.pyu	interpretsu	interpret(uastupip._vendor._markerlib.markersudefault_environmentucompileu	interpretuImportErroruglobalsuNone(((u8/tmp/pip-zej_zi-build/pip/_vendor/_markerlib/__init__.pyu<module>s 
site-packages/pip/_vendor/_markerlib/__pycache__/markers.cpython-33.pyc000064400000013350151733463530022132 0ustar00�
7�Re�c@s�dZdddgZddlZddlZddlZddlZddlZeZyddlm	Z	Wn3e
k
r�ejdkr�dd	�Z	n�YnXiejd
6dejdd�d
6ej
jdd�dd6ejd6ej
�d6ej�d6e	�d6dd6ZxCeej��D]/Zdekr+eeeejdd�<q+q+Wdd�ZGdd�dej�Zdd�Zdd�Zej�Zdd�Zdd d�ZdS(!u�Interpret PEP 345 environment markers.

EXPR [in|==|!=|not in] EXPR [or|and] ...

where EXPR belongs to any of those:

    python_version = '%s.%s' % (sys.version_info[0], sys.version_info[1])
    python_full_version = sys.version.split()[0]
    os.name = os.name
    sys.platform = sys.platform
    platform.version = platform.version()
    platform.machine = platform.machine()
    platform.python_implementation = platform.python_implementation()
    a free string, like '2.6', or 'win32'
udefault_environmentucompileu	interpretiN(upython_implementationujavacCsdS(NuJython((((u7/tmp/pip-zej_zi-build/pip/_vendor/_markerlib/markers.pyupython_implementation!supython_implementationusys.platformu%s.%siupython_versionu iupython_full_versionuos.nameuplatform.versionuplatform.machineuplatform.python_implementationuextrau.u_cCs
tt�S(u2Return copy of default PEP 385 globals dictionary.(udictu_VARS(((u7/tmp/pip-zej_zi-build/pip/_vendor/_markerlib/markers.pyudefault_environment8scBs�|EeZdZdd�Zejejejejej	ej
fZeejej
f7Zeejejejejejejejejejejf
7Zdd�Zdd�ZdS(uASTWhitelistcCs
||_dS(N(u	statement(uselfu	statement((u7/tmp/pip-zej_zi-build/pip/_vendor/_markerlib/markers.pyu__init__=suASTWhitelist.__init__cCsLt||j�s9td|jd|jdf��ntjj||�S(u-Ensure statement only contains allowed nodes.u)Not allowed in environment markers.
%s
%su u^(u
isinstanceuALLOWEDuSyntaxErroru	statementu
col_offsetuastuNodeTransformeruvisit(uselfunode((u7/tmp/pip-zej_zi-build/pip/_vendor/_markerlib/markers.pyuvisitFs
uASTWhitelist.visitcCs8tjd|jj|jf|j�}tj||�S(u&Flatten one level of attribute access.u%s.%s(uastuNameuvalueuiduattructxu
copy_location(uselfunodeunew_node((u7/tmp/pip-zej_zi-build/pip/_vendor/_markerlib/markers.pyuvisit_AttributeNs(uASTWhitelist.visit_AttributeN(u__name__u
__module__u__qualname__u__init__uastuCompareuBoolOpu	AttributeuNameuLoaduStruALLOWEDuAnduOruEquGtuGtEuInuIsuIsNotuLtuLtEuNotEquNotInuvisituvisit_Attribute(u
__locals__((u7/tmp/pip-zej_zi-build/pip/_vendor/_markerlib/markers.pyuASTWhitelist<s*FuASTWhitelistcCs.tj|dd�}t|�j|�}|S(Numodeueval(uastuparseuASTWhitelistu
generic_visit(umarkerutreeunew_tree((u7/tmp/pip-zej_zi-build/pip/_vendor/_markerlib/markers.pyuparse_markerSsuparse_markercCst|dddd�S(Nu<environment marker>uevaludont_inheritT(u_builtin_compileuTrue(u
parsed_marker((u7/tmp/pip-zej_zi-build/pip/_vendor/_markerlib/markers.pyucompile_markerXsucompile_markerc
s�yt|SWntk
r YnX|j�sBdddd�}n*tt|���dd�fdd�}||_|t|<t|S(uCReturn compiled marker as a function accepting an environment dict.cSsdS(uT(uTrue(uenvironmentuoverride((u7/tmp/pip-zej_zi-build/pip/_vendor/_markerlib/markers.pyu	marker_fnesucompile.<locals>.marker_fncsG|dkri}n|dkr-t�}n|j|�t�|�S(uoverride updates environmentN(uNoneudefault_environmentuupdateueval(uenvironmentuoverride(ucompiled_marker(u7/tmp/pip-zej_zi-build/pip/_vendor/_markerlib/markers.pyu	marker_fnjs	
N(u_cacheuKeyErrorustripuNoneucompile_markeruparse_markeru__doc__(umarkeru	marker_fn((ucompiled_markeru7/tmp/pip-zej_zi-build/pip/_vendor/_markerlib/markers.pyucompile^s
	
cCst|�|�S(N(ucompile(umarkeruenvironment((u7/tmp/pip-zej_zi-build/pip/_vendor/_markerlib/markers.pyu	interpretvs(u__doc__u__all__uastuosuplatformusysuweakrefucompileu_builtin_compileupython_implementationuImportErrorunameuversion_infouversionusplitumachineuNoneu_VARSulistukeysuvarureplaceudefault_environmentuNodeTransformeruASTWhitelistuparse_markerucompile_markeruWeakValueDictionaryu_cacheu	interpret(((u7/tmp/pip-zej_zi-build/pip/_vendor/_markerlib/markers.pyu<module>s>






!site-packages/pip/_vendor/_markerlib/__init__.py000064400000001064151733463530015743 0ustar00try:
    import ast
    from pip._vendor._markerlib.markers import default_environment, compile, interpret
except ImportError:
    if 'ast' in globals():
        raise
    def default_environment():
        return {}
    def compile(marker):
        def marker_fn(environment=None, override=None):
            # 'empty markers are True' heuristic won't install extra deps.
            return not marker.strip()
        marker_fn.__doc__ = marker
        return marker_fn
    def interpret(marker, environment=None, override=None):
        return compile(marker)()
site-packages/pip/_vendor/distlib/compat.py000064400000113733151733463530015021 0ustar00# -*- coding: utf-8 -*-
#
# Copyright (C) 2013 Vinay Sajip.
# Licensed to the Python Software Foundation under a contributor agreement.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
from __future__ import absolute_import

import os
import re
import sys

if sys.version_info[0] < 3:
    from StringIO import StringIO
    string_types = basestring,
    text_type = unicode
    from types import FileType as file_type
    import __builtin__ as builtins
    import ConfigParser as configparser
    from ._backport import shutil
    from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit
    from urllib import (urlretrieve, quote as _quote, unquote, url2pathname,
                        pathname2url, ContentTooShortError, splittype)

    def quote(s):
        if isinstance(s, unicode):
            s = s.encode('utf-8')
        return _quote(s)

    import urllib2
    from urllib2 import (Request, urlopen, URLError, HTTPError,
                         HTTPBasicAuthHandler, HTTPPasswordMgr,
                         HTTPSHandler, HTTPHandler, HTTPRedirectHandler,
                         build_opener)
    import httplib
    import xmlrpclib
    import Queue as queue
    from HTMLParser import HTMLParser
    import htmlentitydefs
    raw_input = raw_input
    from itertools import ifilter as filter
    from itertools import ifilterfalse as filterfalse

    _userprog = None
    def splituser(host):
        """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'."""
        global _userprog
        if _userprog is None:
            import re
            _userprog = re.compile('^(.*)@(.*)$')

        match = _userprog.match(host)
        if match: return match.group(1, 2)
        return None, host

else:
    from io import StringIO
    string_types = str,
    text_type = str
    from io import TextIOWrapper as file_type
    import builtins
    import configparser
    import shutil
    from urllib.parse import (urlparse, urlunparse, urljoin, splituser, quote,
                              unquote, urlsplit, urlunsplit, splittype)
    from urllib.request import (urlopen, urlretrieve, Request, url2pathname,
                                pathname2url,
                                HTTPBasicAuthHandler, HTTPPasswordMgr,
                                HTTPSHandler, HTTPHandler, HTTPRedirectHandler,
                                build_opener)
    from urllib.error import HTTPError, URLError, ContentTooShortError
    import http.client as httplib
    import urllib.request as urllib2
    import xmlrpc.client as xmlrpclib
    import queue
    from html.parser import HTMLParser
    import html.entities as htmlentitydefs
    raw_input = input
    from itertools import filterfalse
    filter = filter

try:
    from ssl import match_hostname, CertificateError
except ImportError:
    class CertificateError(ValueError):
        pass


    def _dnsname_to_pat(dn):
        pats = []
        for frag in dn.split(r'.'):
            if frag == '*':
                # When '*' is a fragment by itself, it matches a non-empty
                # dotless fragment.
                pats.append('[^.]+')
            else:
                # Otherwise, '*' matches any dotless fragment.
                frag = re.escape(frag)
                pats.append(frag.replace(r'\*', '[^.]*'))
        return re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)


    def match_hostname(cert, hostname):
        """Verify that *cert* (in decoded format as returned by
        SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 rules
        are mostly followed, but IP addresses are not accepted for *hostname*.

        CertificateError is raised on failure. On success, the function
        returns nothing.
        """
        if not cert:
            raise ValueError("empty or no certificate")
        dnsnames = []
        san = cert.get('subjectAltName', ())
        for key, value in san:
            if key == 'DNS':
                if _dnsname_to_pat(value).match(hostname):
                    return
                dnsnames.append(value)
        if not dnsnames:
            # The subject is only checked when there is no dNSName entry
            # in subjectAltName
            for sub in cert.get('subject', ()):
                for key, value in sub:
                    # XXX according to RFC 2818, the most specific Common Name
                    # must be used.
                    if key == 'commonName':
                        if _dnsname_to_pat(value).match(hostname):
                            return
                        dnsnames.append(value)
        if len(dnsnames) > 1:
            raise CertificateError("hostname %r "
                "doesn't match either of %s"
                % (hostname, ', '.join(map(repr, dnsnames))))
        elif len(dnsnames) == 1:
            raise CertificateError("hostname %r "
                "doesn't match %r"
                % (hostname, dnsnames[0]))
        else:
            raise CertificateError("no appropriate commonName or "
                "subjectAltName fields were found")


try:
    from types import SimpleNamespace as Container
except ImportError:
    class Container(object):
        """
        A generic container for when multiple values need to be returned
        """
        def __init__(self, **kwargs):
            self.__dict__.update(kwargs)


try:
    from shutil import which
except ImportError:
    # Implementation from Python 3.3
    def which(cmd, mode=os.F_OK | os.X_OK, path=None):
        """Given a command, mode, and a PATH string, return the path which
        conforms to the given mode on the PATH, or None if there is no such
        file.

        `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result
        of os.environ.get("PATH"), or can be overridden with a custom search
        path.

        """
        # Check that a given file can be accessed with the correct mode.
        # Additionally check that `file` is not a directory, as on Windows
        # directories pass the os.access check.
        def _access_check(fn, mode):
            return (os.path.exists(fn) and os.access(fn, mode)
                    and not os.path.isdir(fn))

        # If we're given a path with a directory part, look it up directly rather
        # than referring to PATH directories. This includes checking relative to the
        # current directory, e.g. ./script
        if os.path.dirname(cmd):
            if _access_check(cmd, mode):
                return cmd
            return None

        if path is None:
            path = os.environ.get("PATH", os.defpath)
        if not path:
            return None
        path = path.split(os.pathsep)

        if sys.platform == "win32":
            # The current directory takes precedence on Windows.
            if not os.curdir in path:
                path.insert(0, os.curdir)

            # PATHEXT is necessary to check on Windows.
            pathext = os.environ.get("PATHEXT", "").split(os.pathsep)
            # See if the given file matches any of the expected path extensions.
            # This will allow us to short circuit when given "python.exe".
            # If it does match, only test that one, otherwise we have to try
            # others.
            if any(cmd.lower().endswith(ext.lower()) for ext in pathext):
                files = [cmd]
            else:
                files = [cmd + ext for ext in pathext]
        else:
            # On other platforms you don't have things like PATHEXT to tell you
            # what file suffixes are executable, so just pass on cmd as-is.
            files = [cmd]

        seen = set()
        for dir in path:
            normdir = os.path.normcase(dir)
            if not normdir in seen:
                seen.add(normdir)
                for thefile in files:
                    name = os.path.join(dir, thefile)
                    if _access_check(name, mode):
                        return name
        return None


# ZipFile is a context manager in 2.7, but not in 2.6

from zipfile import ZipFile as BaseZipFile

if hasattr(BaseZipFile, '__enter__'):
    ZipFile = BaseZipFile
else:
    from zipfile import ZipExtFile as BaseZipExtFile

    class ZipExtFile(BaseZipExtFile):
        def __init__(self, base):
            self.__dict__.update(base.__dict__)

        def __enter__(self):
            return self

        def __exit__(self, *exc_info):
            self.close()
            # return None, so if an exception occurred, it will propagate

    class ZipFile(BaseZipFile):
        def __enter__(self):
            return self

        def __exit__(self, *exc_info):
            self.close()
            # return None, so if an exception occurred, it will propagate

        def open(self, *args, **kwargs):
            base = BaseZipFile.open(self, *args, **kwargs)
            return ZipExtFile(base)

try:
    from platform import python_implementation
except ImportError: # pragma: no cover
    def python_implementation():
        """Return a string identifying the Python implementation."""
        if 'PyPy' in sys.version:
            return 'PyPy'
        if os.name == 'java':
            return 'Jython'
        if sys.version.startswith('IronPython'):
            return 'IronPython'
        return 'CPython'

try:
    import sysconfig
except ImportError: # pragma: no cover
    from ._backport import sysconfig

try:
    callable = callable
except NameError:   # pragma: no cover
    from collections import Callable

    def callable(obj):
        return isinstance(obj, Callable)


try:
    fsencode = os.fsencode
    fsdecode = os.fsdecode
except AttributeError:  # pragma: no cover
    _fsencoding = sys.getfilesystemencoding()
    if _fsencoding == 'mbcs':
        _fserrors = 'strict'
    else:
        _fserrors = 'surrogateescape'

    def fsencode(filename):
        if isinstance(filename, bytes):
            return filename
        elif isinstance(filename, text_type):
            return filename.encode(_fsencoding, _fserrors)
        else:
            raise TypeError("expect bytes or str, not %s" %
                            type(filename).__name__)

    def fsdecode(filename):
        if isinstance(filename, text_type):
            return filename
        elif isinstance(filename, bytes):
            return filename.decode(_fsencoding, _fserrors)
        else:
            raise TypeError("expect bytes or str, not %s" %
                            type(filename).__name__)

try:
    from tokenize import detect_encoding
except ImportError: # pragma: no cover
    from codecs import BOM_UTF8, lookup
    import re

    cookie_re = re.compile("coding[:=]\s*([-\w.]+)")

    def _get_normal_name(orig_enc):
        """Imitates get_normal_name in tokenizer.c."""
        # Only care about the first 12 characters.
        enc = orig_enc[:12].lower().replace("_", "-")
        if enc == "utf-8" or enc.startswith("utf-8-"):
            return "utf-8"
        if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \
           enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")):
            return "iso-8859-1"
        return orig_enc

    def detect_encoding(readline):
        """
        The detect_encoding() function is used to detect the encoding that should
        be used to decode a Python source file.  It requires one argment, readline,
        in the same way as the tokenize() generator.

        It will call readline a maximum of twice, and return the encoding used
        (as a string) and a list of any lines (left as bytes) it has read in.

        It detects the encoding from the presence of a utf-8 bom or an encoding
        cookie as specified in pep-0263.  If both a bom and a cookie are present,
        but disagree, a SyntaxError will be raised.  If the encoding cookie is an
        invalid charset, raise a SyntaxError.  Note that if a utf-8 bom is found,
        'utf-8-sig' is returned.

        If no encoding is specified, then the default of 'utf-8' will be returned.
        """
        try:
            filename = readline.__self__.name
        except AttributeError:
            filename = None
        bom_found = False
        encoding = None
        default = 'utf-8'
        def read_or_stop():
            try:
                return readline()
            except StopIteration:
                return b''

        def find_cookie(line):
            try:
                # Decode as UTF-8. Either the line is an encoding declaration,
                # in which case it should be pure ASCII, or it must be UTF-8
                # per default encoding.
                line_string = line.decode('utf-8')
            except UnicodeDecodeError:
                msg = "invalid or missing encoding declaration"
                if filename is not None:
                    msg = '{} for {!r}'.format(msg, filename)
                raise SyntaxError(msg)

            matches = cookie_re.findall(line_string)
            if not matches:
                return None
            encoding = _get_normal_name(matches[0])
            try:
                codec = lookup(encoding)
            except LookupError:
                # This behaviour mimics the Python interpreter
                if filename is None:
                    msg = "unknown encoding: " + encoding
                else:
                    msg = "unknown encoding for {!r}: {}".format(filename,
                            encoding)
                raise SyntaxError(msg)

            if bom_found:
                if codec.name != 'utf-8':
                    # This behaviour mimics the Python interpreter
                    if filename is None:
                        msg = 'encoding problem: utf-8'
                    else:
                        msg = 'encoding problem for {!r}: utf-8'.format(filename)
                    raise SyntaxError(msg)
                encoding += '-sig'
            return encoding

        first = read_or_stop()
        if first.startswith(BOM_UTF8):
            bom_found = True
            first = first[3:]
            default = 'utf-8-sig'
        if not first:
            return default, []

        encoding = find_cookie(first)
        if encoding:
            return encoding, [first]

        second = read_or_stop()
        if not second:
            return default, [first]

        encoding = find_cookie(second)
        if encoding:
            return encoding, [first, second]

        return default, [first, second]

# For converting & <-> &amp; etc.
try:
    from html import escape
except ImportError:
    from cgi import escape
if sys.version_info[:2] < (3, 4):
    unescape = HTMLParser().unescape
else:
    from html import unescape

try:
    from collections import ChainMap
except ImportError: # pragma: no cover
    from collections import MutableMapping

    try:
        from reprlib import recursive_repr as _recursive_repr
    except ImportError:
        def _recursive_repr(fillvalue='...'):
            '''
            Decorator to make a repr function return fillvalue for a recursive
            call
            '''

            def decorating_function(user_function):
                repr_running = set()

                def wrapper(self):
                    key = id(self), get_ident()
                    if key in repr_running:
                        return fillvalue
                    repr_running.add(key)
                    try:
                        result = user_function(self)
                    finally:
                        repr_running.discard(key)
                    return result

                # Can't use functools.wraps() here because of bootstrap issues
                wrapper.__module__ = getattr(user_function, '__module__')
                wrapper.__doc__ = getattr(user_function, '__doc__')
                wrapper.__name__ = getattr(user_function, '__name__')
                wrapper.__annotations__ = getattr(user_function, '__annotations__', {})
                return wrapper

            return decorating_function

    class ChainMap(MutableMapping):
        ''' A ChainMap groups multiple dicts (or other mappings) together
        to create a single, updateable view.

        The underlying mappings are stored in a list.  That list is public and can
        accessed or updated using the *maps* attribute.  There is no other state.

        Lookups search the underlying mappings successively until a key is found.
        In contrast, writes, updates, and deletions only operate on the first
        mapping.

        '''

        def __init__(self, *maps):
            '''Initialize a ChainMap by setting *maps* to the given mappings.
            If no mappings are provided, a single empty dictionary is used.

            '''
            self.maps = list(maps) or [{}]          # always at least one map

        def __missing__(self, key):
            raise KeyError(key)

        def __getitem__(self, key):
            for mapping in self.maps:
                try:
                    return mapping[key]             # can't use 'key in mapping' with defaultdict
                except KeyError:
                    pass
            return self.__missing__(key)            # support subclasses that define __missing__

        def get(self, key, default=None):
            return self[key] if key in self else default

        def __len__(self):
            return len(set().union(*self.maps))     # reuses stored hash values if possible

        def __iter__(self):
            return iter(set().union(*self.maps))

        def __contains__(self, key):
            return any(key in m for m in self.maps)

        def __bool__(self):
            return any(self.maps)

        @_recursive_repr()
        def __repr__(self):
            return '{0.__class__.__name__}({1})'.format(
                self, ', '.join(map(repr, self.maps)))

        @classmethod
        def fromkeys(cls, iterable, *args):
            'Create a ChainMap with a single dict created from the iterable.'
            return cls(dict.fromkeys(iterable, *args))

        def copy(self):
            'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]'
            return self.__class__(self.maps[0].copy(), *self.maps[1:])

        __copy__ = copy

        def new_child(self):                        # like Django's Context.push()
            'New ChainMap with a new dict followed by all previous maps.'
            return self.__class__({}, *self.maps)

        @property
        def parents(self):                          # like Django's Context.pop()
            'New ChainMap from maps[1:].'
            return self.__class__(*self.maps[1:])

        def __setitem__(self, key, value):
            self.maps[0][key] = value

        def __delitem__(self, key):
            try:
                del self.maps[0][key]
            except KeyError:
                raise KeyError('Key not found in the first mapping: {!r}'.format(key))

        def popitem(self):
            'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.'
            try:
                return self.maps[0].popitem()
            except KeyError:
                raise KeyError('No keys found in the first mapping.')

        def pop(self, key, *args):
            'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].'
            try:
                return self.maps[0].pop(key, *args)
            except KeyError:
                raise KeyError('Key not found in the first mapping: {!r}'.format(key))

        def clear(self):
            'Clear maps[0], leaving maps[1:] intact.'
            self.maps[0].clear()

try:
    from imp import cache_from_source
except ImportError: # pragma: no cover
    def cache_from_source(path, debug_override=None):
        assert path.endswith('.py')
        if debug_override is None:
            debug_override = __debug__
        if debug_override:
            suffix = 'c'
        else:
            suffix = 'o'
        return path + suffix

try:
    from collections import OrderedDict
except ImportError: # pragma: no cover
## {{{ http://code.activestate.com/recipes/576693/ (r9)
# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy.
# Passes Python2.7's test suite and incorporates all the latest updates.
    try:
        from thread import get_ident as _get_ident
    except ImportError:
        from dummy_thread import get_ident as _get_ident

    try:
        from _abcoll import KeysView, ValuesView, ItemsView
    except ImportError:
        pass


    class OrderedDict(dict):
        'Dictionary that remembers insertion order'
        # An inherited dict maps keys to values.
        # The inherited dict provides __getitem__, __len__, __contains__, and get.
        # The remaining methods are order-aware.
        # Big-O running times for all methods are the same as for regular dictionaries.

        # The internal self.__map dictionary maps keys to links in a doubly linked list.
        # The circular doubly linked list starts and ends with a sentinel element.
        # The sentinel element never gets deleted (this simplifies the algorithm).
        # Each link is stored as a list of length three:  [PREV, NEXT, KEY].

        def __init__(self, *args, **kwds):
            '''Initialize an ordered dictionary.  Signature is the same as for
            regular dictionaries, but keyword arguments are not recommended
            because their insertion order is arbitrary.

            '''
            if len(args) > 1:
                raise TypeError('expected at most 1 arguments, got %d' % len(args))
            try:
                self.__root
            except AttributeError:
                self.__root = root = []                     # sentinel node
                root[:] = [root, root, None]
                self.__map = {}
            self.__update(*args, **kwds)

        def __setitem__(self, key, value, dict_setitem=dict.__setitem__):
            'od.__setitem__(i, y) <==> od[i]=y'
            # Setting a new item creates a new link which goes at the end of the linked
            # list, and the inherited dictionary is updated with the new key/value pair.
            if key not in self:
                root = self.__root
                last = root[0]
                last[1] = root[0] = self.__map[key] = [last, root, key]
            dict_setitem(self, key, value)

        def __delitem__(self, key, dict_delitem=dict.__delitem__):
            'od.__delitem__(y) <==> del od[y]'
            # Deleting an existing item uses self.__map to find the link which is
            # then removed by updating the links in the predecessor and successor nodes.
            dict_delitem(self, key)
            link_prev, link_next, key = self.__map.pop(key)
            link_prev[1] = link_next
            link_next[0] = link_prev

        def __iter__(self):
            'od.__iter__() <==> iter(od)'
            root = self.__root
            curr = root[1]
            while curr is not root:
                yield curr[2]
                curr = curr[1]

        def __reversed__(self):
            'od.__reversed__() <==> reversed(od)'
            root = self.__root
            curr = root[0]
            while curr is not root:
                yield curr[2]
                curr = curr[0]

        def clear(self):
            'od.clear() -> None.  Remove all items from od.'
            try:
                for node in self.__map.itervalues():
                    del node[:]
                root = self.__root
                root[:] = [root, root, None]
                self.__map.clear()
            except AttributeError:
                pass
            dict.clear(self)

        def popitem(self, last=True):
            '''od.popitem() -> (k, v), return and remove a (key, value) pair.
            Pairs are returned in LIFO order if last is true or FIFO order if false.

            '''
            if not self:
                raise KeyError('dictionary is empty')
            root = self.__root
            if last:
                link = root[0]
                link_prev = link[0]
                link_prev[1] = root
                root[0] = link_prev
            else:
                link = root[1]
                link_next = link[1]
                root[1] = link_next
                link_next[0] = root
            key = link[2]
            del self.__map[key]
            value = dict.pop(self, key)
            return key, value

        # -- the following methods do not depend on the internal structure --

        def keys(self):
            'od.keys() -> list of keys in od'
            return list(self)

        def values(self):
            'od.values() -> list of values in od'
            return [self[key] for key in self]

        def items(self):
            'od.items() -> list of (key, value) pairs in od'
            return [(key, self[key]) for key in self]

        def iterkeys(self):
            'od.iterkeys() -> an iterator over the keys in od'
            return iter(self)

        def itervalues(self):
            'od.itervalues -> an iterator over the values in od'
            for k in self:
                yield self[k]

        def iteritems(self):
            'od.iteritems -> an iterator over the (key, value) items in od'
            for k in self:
                yield (k, self[k])

        def update(*args, **kwds):
            '''od.update(E, **F) -> None.  Update od from dict/iterable E and F.

            If E is a dict instance, does:           for k in E: od[k] = E[k]
            If E has a .keys() method, does:         for k in E.keys(): od[k] = E[k]
            Or if E is an iterable of items, does:   for k, v in E: od[k] = v
            In either case, this is followed by:     for k, v in F.items(): od[k] = v

            '''
            if len(args) > 2:
                raise TypeError('update() takes at most 2 positional '
                                'arguments (%d given)' % (len(args),))
            elif not args:
                raise TypeError('update() takes at least 1 argument (0 given)')
            self = args[0]
            # Make progressively weaker assumptions about "other"
            other = ()
            if len(args) == 2:
                other = args[1]
            if isinstance(other, dict):
                for key in other:
                    self[key] = other[key]
            elif hasattr(other, 'keys'):
                for key in other.keys():
                    self[key] = other[key]
            else:
                for key, value in other:
                    self[key] = value
            for key, value in kwds.items():
                self[key] = value

        __update = update  # let subclasses override update without breaking __init__

        __marker = object()

        def pop(self, key, default=__marker):
            '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value.
            If key is not found, d is returned if given, otherwise KeyError is raised.

            '''
            if key in self:
                result = self[key]
                del self[key]
                return result
            if default is self.__marker:
                raise KeyError(key)
            return default

        def setdefault(self, key, default=None):
            'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od'
            if key in self:
                return self[key]
            self[key] = default
            return default

        def __repr__(self, _repr_running=None):
            'od.__repr__() <==> repr(od)'
            if not _repr_running: _repr_running = {}
            call_key = id(self), _get_ident()
            if call_key in _repr_running:
                return '...'
            _repr_running[call_key] = 1
            try:
                if not self:
                    return '%s()' % (self.__class__.__name__,)
                return '%s(%r)' % (self.__class__.__name__, self.items())
            finally:
                del _repr_running[call_key]

        def __reduce__(self):
            'Return state information for pickling'
            items = [[k, self[k]] for k in self]
            inst_dict = vars(self).copy()
            for k in vars(OrderedDict()):
                inst_dict.pop(k, None)
            if inst_dict:
                return (self.__class__, (items,), inst_dict)
            return self.__class__, (items,)

        def copy(self):
            'od.copy() -> a shallow copy of od'
            return self.__class__(self)

        @classmethod
        def fromkeys(cls, iterable, value=None):
            '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S
            and values equal to v (which defaults to None).

            '''
            d = cls()
            for key in iterable:
                d[key] = value
            return d

        def __eq__(self, other):
            '''od.__eq__(y) <==> od==y.  Comparison to another OD is order-sensitive
            while comparison to a regular mapping is order-insensitive.

            '''
            if isinstance(other, OrderedDict):
                return len(self)==len(other) and self.items() == other.items()
            return dict.__eq__(self, other)

        def __ne__(self, other):
            return not self == other

        # -- the following methods are only used in Python 2.7 --

        def viewkeys(self):
            "od.viewkeys() -> a set-like object providing a view on od's keys"
            return KeysView(self)

        def viewvalues(self):
            "od.viewvalues() -> an object providing a view on od's values"
            return ValuesView(self)

        def viewitems(self):
            "od.viewitems() -> a set-like object providing a view on od's items"
            return ItemsView(self)

try:
    from logging.config import BaseConfigurator, valid_ident
except ImportError: # pragma: no cover
    IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I)


    def valid_ident(s):
        m = IDENTIFIER.match(s)
        if not m:
            raise ValueError('Not a valid Python identifier: %r' % s)
        return True


    # The ConvertingXXX classes are wrappers around standard Python containers,
    # and they serve to convert any suitable values in the container. The
    # conversion converts base dicts, lists and tuples to their wrapped
    # equivalents, whereas strings which match a conversion format are converted
    # appropriately.
    #
    # Each wrapper should have a configurator attribute holding the actual
    # configurator to use for conversion.

    class ConvertingDict(dict):
        """A converting dictionary wrapper."""

        def __getitem__(self, key):
            value = dict.__getitem__(self, key)
            result = self.configurator.convert(value)
            #If the converted value is different, save for next time
            if value is not result:
                self[key] = result
                if type(result) in (ConvertingDict, ConvertingList,
                                    ConvertingTuple):
                    result.parent = self
                    result.key = key
            return result

        def get(self, key, default=None):
            value = dict.get(self, key, default)
            result = self.configurator.convert(value)
            #If the converted value is different, save for next time
            if value is not result:
                self[key] = result
                if type(result) in (ConvertingDict, ConvertingList,
                                    ConvertingTuple):
                    result.parent = self
                    result.key = key
            return result

    def pop(self, key, default=None):
        value = dict.pop(self, key, default)
        result = self.configurator.convert(value)
        if value is not result:
            if type(result) in (ConvertingDict, ConvertingList,
                                ConvertingTuple):
                result.parent = self
                result.key = key
        return result

    class ConvertingList(list):
        """A converting list wrapper."""
        def __getitem__(self, key):
            value = list.__getitem__(self, key)
            result = self.configurator.convert(value)
            #If the converted value is different, save for next time
            if value is not result:
                self[key] = result
                if type(result) in (ConvertingDict, ConvertingList,
                                    ConvertingTuple):
                    result.parent = self
                    result.key = key
            return result

        def pop(self, idx=-1):
            value = list.pop(self, idx)
            result = self.configurator.convert(value)
            if value is not result:
                if type(result) in (ConvertingDict, ConvertingList,
                                    ConvertingTuple):
                    result.parent = self
            return result

    class ConvertingTuple(tuple):
        """A converting tuple wrapper."""
        def __getitem__(self, key):
            value = tuple.__getitem__(self, key)
            result = self.configurator.convert(value)
            if value is not result:
                if type(result) in (ConvertingDict, ConvertingList,
                                    ConvertingTuple):
                    result.parent = self
                    result.key = key
            return result

    class BaseConfigurator(object):
        """
        The configurator base class which defines some useful defaults.
        """

        CONVERT_PATTERN = re.compile(r'^(?P<prefix>[a-z]+)://(?P<suffix>.*)$')

        WORD_PATTERN = re.compile(r'^\s*(\w+)\s*')
        DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*')
        INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*')
        DIGIT_PATTERN = re.compile(r'^\d+$')

        value_converters = {
            'ext' : 'ext_convert',
            'cfg' : 'cfg_convert',
        }

        # We might want to use a different one, e.g. importlib
        importer = staticmethod(__import__)

        def __init__(self, config):
            self.config = ConvertingDict(config)
            self.config.configurator = self

        def resolve(self, s):
            """
            Resolve strings to objects using standard import and attribute
            syntax.
            """
            name = s.split('.')
            used = name.pop(0)
            try:
                found = self.importer(used)
                for frag in name:
                    used += '.' + frag
                    try:
                        found = getattr(found, frag)
                    except AttributeError:
                        self.importer(used)
                        found = getattr(found, frag)
                return found
            except ImportError:
                e, tb = sys.exc_info()[1:]
                v = ValueError('Cannot resolve %r: %s' % (s, e))
                v.__cause__, v.__traceback__ = e, tb
                raise v

        def ext_convert(self, value):
            """Default converter for the ext:// protocol."""
            return self.resolve(value)

        def cfg_convert(self, value):
            """Default converter for the cfg:// protocol."""
            rest = value
            m = self.WORD_PATTERN.match(rest)
            if m is None:
                raise ValueError("Unable to convert %r" % value)
            else:
                rest = rest[m.end():]
                d = self.config[m.groups()[0]]
                #print d, rest
                while rest:
                    m = self.DOT_PATTERN.match(rest)
                    if m:
                        d = d[m.groups()[0]]
                    else:
                        m = self.INDEX_PATTERN.match(rest)
                        if m:
                            idx = m.groups()[0]
                            if not self.DIGIT_PATTERN.match(idx):
                                d = d[idx]
                            else:
                                try:
                                    n = int(idx) # try as number first (most likely)
                                    d = d[n]
                                except TypeError:
                                    d = d[idx]
                    if m:
                        rest = rest[m.end():]
                    else:
                        raise ValueError('Unable to convert '
                                         '%r at %r' % (value, rest))
            #rest should be empty
            return d

        def convert(self, value):
            """
            Convert values to an appropriate type. dicts, lists and tuples are
            replaced by their converting alternatives. Strings are checked to
            see if they have a conversion format and are converted if they do.
            """
            if not isinstance(value, ConvertingDict) and isinstance(value, dict):
                value = ConvertingDict(value)
                value.configurator = self
            elif not isinstance(value, ConvertingList) and isinstance(value, list):
                value = ConvertingList(value)
                value.configurator = self
            elif not isinstance(value, ConvertingTuple) and\
                     isinstance(value, tuple):
                value = ConvertingTuple(value)
                value.configurator = self
            elif isinstance(value, string_types):
                m = self.CONVERT_PATTERN.match(value)
                if m:
                    d = m.groupdict()
                    prefix = d['prefix']
                    converter = self.value_converters.get(prefix, None)
                    if converter:
                        suffix = d['suffix']
                        converter = getattr(self, converter)
                        value = converter(suffix)
            return value

        def configure_custom(self, config):
            """Configure an object with a user-supplied factory."""
            c = config.pop('()')
            if not callable(c):
                c = self.resolve(c)
            props = config.pop('.', None)
            # Check for valid identifiers
            kwargs = dict([(k, config[k]) for k in config if valid_ident(k)])
            result = c(**kwargs)
            if props:
                for name, value in props.items():
                    setattr(result, name, value)
            return result

        def as_tuple(self, value):
            """Utility function which converts lists to tuples."""
            if isinstance(value, list):
                value = tuple(value)
            return value
site-packages/pip/_vendor/distlib/version.py000064400000054724151733463530015227 0ustar00# -*- coding: utf-8 -*-
#
# Copyright (C) 2012-2013 The Python Software Foundation.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
"""
Implementation of a flexible versioning scheme providing support for PEP-386,
distribute-compatible and semantic versioning.
"""

import logging
import re

from .compat import string_types

__all__ = ['NormalizedVersion', 'NormalizedMatcher',
           'LegacyVersion', 'LegacyMatcher',
           'SemanticVersion', 'SemanticMatcher',
           'UnsupportedVersionError', 'get_scheme']

logger = logging.getLogger(__name__)


class UnsupportedVersionError(ValueError):
    """This is an unsupported version."""
    pass


class Version(object):
    def __init__(self, s):
        self._string = s = s.strip()
        self._parts = parts = self.parse(s)
        assert isinstance(parts, tuple)
        assert len(parts) > 0

    def parse(self, s):
        raise NotImplementedError('please implement in a subclass')

    def _check_compatible(self, other):
        if type(self) != type(other):
            raise TypeError('cannot compare %r and %r' % (self, other))

    def __eq__(self, other):
        self._check_compatible(other)
        return self._parts == other._parts

    def __ne__(self, other):
        return not self.__eq__(other)

    def __lt__(self, other):
        self._check_compatible(other)
        return self._parts < other._parts

    def __gt__(self, other):
        return not (self.__lt__(other) or self.__eq__(other))

    def __le__(self, other):
        return self.__lt__(other) or self.__eq__(other)

    def __ge__(self, other):
        return self.__gt__(other) or self.__eq__(other)

    # See http://docs.python.org/reference/datamodel#object.__hash__
    def __hash__(self):
        return hash(self._parts)

    def __repr__(self):
        return "%s('%s')" % (self.__class__.__name__, self._string)

    def __str__(self):
        return self._string

    @property
    def is_prerelease(self):
        raise NotImplementedError('Please implement in subclasses.')


class Matcher(object):
    version_class = None

    dist_re = re.compile(r"^(\w[\s\w'.-]*)(\((.*)\))?")
    comp_re = re.compile(r'^(<=|>=|<|>|!=|==|~=)?\s*([^\s,]+)$')
    num_re = re.compile(r'^\d+(\.\d+)*$')

    # value is either a callable or the name of a method
    _operators = {
        '<': lambda v, c, p: v < c,
        '>': lambda v, c, p: v > c,
        '<=': lambda v, c, p: v == c or v < c,
        '>=': lambda v, c, p: v == c or v > c,
        '==': lambda v, c, p: v == c,
        # by default, compatible => >=.
        '~=': lambda v, c, p: v == c or v > c,
        '!=': lambda v, c, p: v != c,
    }

    def __init__(self, s):
        if self.version_class is None:
            raise ValueError('Please specify a version class')
        self._string = s = s.strip()
        m = self.dist_re.match(s)
        if not m:
            raise ValueError('Not valid: %r' % s)
        groups = m.groups('')
        self.name = groups[0].strip()
        self.key = self.name.lower()    # for case-insensitive comparisons
        clist = []
        if groups[2]:
            constraints = [c.strip() for c in groups[2].split(',')]
            for c in constraints:
                m = self.comp_re.match(c)
                if not m:
                    raise ValueError('Invalid %r in %r' % (c, s))
                groups = m.groups()
                op = groups[0] or '~='
                s = groups[1]
                if s.endswith('.*'):
                    if op not in ('==', '!='):
                        raise ValueError('\'.*\' not allowed for '
                                         '%r constraints' % op)
                    # Could be a partial version (e.g. for '2.*') which
                    # won't parse as a version, so keep it as a string
                    vn, prefix = s[:-2], True
                    if not self.num_re.match(vn):
                        # Just to check that vn is a valid version
                        self.version_class(vn)
                else:
                    # Should parse as a version, so we can create an
                    # instance for the comparison
                    vn, prefix = self.version_class(s), False
                clist.append((op, vn, prefix))
        self._parts = tuple(clist)

    def match(self, version):
        """
        Check if the provided version matches the constraints.

        :param version: The version to match against this instance.
        :type version: Strring or :class:`Version` instance.
        """
        if isinstance(version, string_types):
            version = self.version_class(version)
        for operator, constraint, prefix in self._parts:
            f = self._operators.get(operator)
            if isinstance(f, string_types):
                f = getattr(self, f)
            if not f:
                msg = ('%r not implemented '
                       'for %s' % (operator, self.__class__.__name__))
                raise NotImplementedError(msg)
            if not f(version, constraint, prefix):
                return False
        return True

    @property
    def exact_version(self):
        result = None
        if len(self._parts) == 1 and self._parts[0][0] == '==':
            result = self._parts[0][1]
        return result

    def _check_compatible(self, other):
        if type(self) != type(other) or self.name != other.name:
            raise TypeError('cannot compare %s and %s' % (self, other))

    def __eq__(self, other):
        self._check_compatible(other)
        return self.key == other.key and self._parts == other._parts

    def __ne__(self, other):
        return not self.__eq__(other)

    # See http://docs.python.org/reference/datamodel#object.__hash__
    def __hash__(self):
        return hash(self.key) + hash(self._parts)

    def __repr__(self):
        return "%s(%r)" % (self.__class__.__name__, self._string)

    def __str__(self):
        return self._string


PEP426_VERSION_RE = re.compile(r'^(\d+(\.\d+)*)((a|b|c|rc)(\d+))?'
                               r'(\.(post)(\d+))?(\.(dev)(\d+))?'
                               r'(-(\d+(\.\d+)?))?$')


def _pep426_key(s):
    s = s.strip()
    m = PEP426_VERSION_RE.match(s)
    if not m:
        raise UnsupportedVersionError('Not a valid version: %s' % s)
    groups = m.groups()
    nums = tuple(int(v) for v in groups[0].split('.'))
    while len(nums) > 1 and nums[-1] == 0:
        nums = nums[:-1]

    pre = groups[3:5]
    post = groups[6:8]
    dev = groups[9:11]
    local = groups[12]
    if pre == (None, None):
        pre = ()
    else:
        pre = pre[0], int(pre[1])
    if post == (None, None):
        post = ()
    else:
        post = post[0], int(post[1])
    if dev == (None, None):
        dev = ()
    else:
        dev = dev[0], int(dev[1])
    if local is None:
        local = ()
    else:
        local = tuple([int(s) for s in local.split('.')])
    if not pre:
        # either before pre-release, or final release and after
        if not post and dev:
            # before pre-release
            pre = ('a', -1)     # to sort before a0
        else:
            pre = ('z',)        # to sort after all pre-releases
    # now look at the state of post and dev.
    if not post:
        post = ('_',)   # sort before 'a'
    if not dev:
        dev = ('final',)

    #print('%s -> %s' % (s, m.groups()))
    return nums, pre, post, dev, local


_normalized_key = _pep426_key


class NormalizedVersion(Version):
    """A rational version.

    Good:
        1.2         # equivalent to "1.2.0"
        1.2.0
        1.2a1
        1.2.3a2
        1.2.3b1
        1.2.3c1
        1.2.3.4
        TODO: fill this out

    Bad:
        1           # mininum two numbers
        1.2a        # release level must have a release serial
        1.2.3b
    """
    def parse(self, s):
        result = _normalized_key(s)
        # _normalized_key loses trailing zeroes in the release
        # clause, since that's needed to ensure that X.Y == X.Y.0 == X.Y.0.0
        # However, PEP 440 prefix matching needs it: for example,
        # (~= 1.4.5.0) matches differently to (~= 1.4.5.0.0).
        m = PEP426_VERSION_RE.match(s)      # must succeed
        groups = m.groups()
        self._release_clause = tuple(int(v) for v in groups[0].split('.'))
        return result

    PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev'])

    @property
    def is_prerelease(self):
        return any(t[0] in self.PREREL_TAGS for t in self._parts if t)


def _match_prefix(x, y):
    x = str(x)
    y = str(y)
    if x == y:
        return True
    if not x.startswith(y):
        return False
    n = len(y)
    return x[n] == '.'


class NormalizedMatcher(Matcher):
    version_class = NormalizedVersion

    # value is either a callable or the name of a method
    _operators = {
        '~=': '_match_compatible',
        '<': '_match_lt',
        '>': '_match_gt',
        '<=': '_match_le',
        '>=': '_match_ge',
        '==': '_match_eq',
        '!=': '_match_ne',
    }

    def _adjust_local(self, version, constraint, prefix):
        if prefix:
            strip_local = '-' not in constraint and version._parts[-1]
        else:
            # both constraint and version are
            # NormalizedVersion instances.
            # If constraint does not have a local component,
            # ensure the version doesn't, either.
            strip_local = not constraint._parts[-1] and version._parts[-1]
        if strip_local:
            s = version._string.split('-', 1)[0]
            version = self.version_class(s)
        return version, constraint

    def _match_lt(self, version, constraint, prefix):
        version, constraint = self._adjust_local(version, constraint, prefix)
        if version >= constraint:
            return False
        release_clause = constraint._release_clause
        pfx = '.'.join([str(i) for i in release_clause])
        return not _match_prefix(version, pfx)

    def _match_gt(self, version, constraint, prefix):
        version, constraint = self._adjust_local(version, constraint, prefix)
        if version <= constraint:
            return False
        release_clause = constraint._release_clause
        pfx = '.'.join([str(i) for i in release_clause])
        return not _match_prefix(version, pfx)

    def _match_le(self, version, constraint, prefix):
        version, constraint = self._adjust_local(version, constraint, prefix)
        return version <= constraint

    def _match_ge(self, version, constraint, prefix):
        version, constraint = self._adjust_local(version, constraint, prefix)
        return version >= constraint

    def _match_eq(self, version, constraint, prefix):
        version, constraint = self._adjust_local(version, constraint, prefix)
        if not prefix:
            result = (version == constraint)
        else:
            result = _match_prefix(version, constraint)
        return result

    def _match_ne(self, version, constraint, prefix):
        version, constraint = self._adjust_local(version, constraint, prefix)
        if not prefix:
            result = (version != constraint)
        else:
            result = not _match_prefix(version, constraint)
        return result

    def _match_compatible(self, version, constraint, prefix):
        version, constraint = self._adjust_local(version, constraint, prefix)
        if version == constraint:
            return True
        if version < constraint:
            return False
        release_clause = constraint._release_clause
        if len(release_clause) > 1:
            release_clause = release_clause[:-1]
        pfx = '.'.join([str(i) for i in release_clause])
        return _match_prefix(version, pfx)

_REPLACEMENTS = (
    (re.compile('[.+-]$'), ''),                     # remove trailing puncts
    (re.compile(r'^[.](\d)'), r'0.\1'),             # .N -> 0.N at start
    (re.compile('^[.-]'), ''),                      # remove leading puncts
    (re.compile(r'^\((.*)\)$'), r'\1'),             # remove parentheses
    (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'),    # remove leading v(ersion)
    (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'),        # remove leading v(ersion)
    (re.compile('[.]{2,}'), '.'),                   # multiple runs of '.'
    (re.compile(r'\b(alfa|apha)\b'), 'alpha'),      # misspelt alpha
    (re.compile(r'\b(pre-alpha|prealpha)\b'),
                'pre.alpha'),                       # standardise
    (re.compile(r'\(beta\)$'), 'beta'),             # remove parentheses
)

_SUFFIX_REPLACEMENTS = (
    (re.compile('^[:~._+-]+'), ''),                   # remove leading puncts
    (re.compile('[,*")([\]]'), ''),                   # remove unwanted chars
    (re.compile('[~:+_ -]'), '.'),                    # replace illegal chars
    (re.compile('[.]{2,}'), '.'),                   # multiple runs of '.'
    (re.compile(r'\.$'), ''),                       # trailing '.'
)

_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)')


def _suggest_semantic_version(s):
    """
    Try to suggest a semantic form for a version for which
    _suggest_normalized_version couldn't come up with anything.
    """
    result = s.strip().lower()
    for pat, repl in _REPLACEMENTS:
        result = pat.sub(repl, result)
    if not result:
        result = '0.0.0'

    # Now look for numeric prefix, and separate it out from
    # the rest.
    #import pdb; pdb.set_trace()
    m = _NUMERIC_PREFIX.match(result)
    if not m:
        prefix = '0.0.0'
        suffix = result
    else:
        prefix = m.groups()[0].split('.')
        prefix = [int(i) for i in prefix]
        while len(prefix) < 3:
            prefix.append(0)
        if len(prefix) == 3:
            suffix = result[m.end():]
        else:
            suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():]
            prefix = prefix[:3]
        prefix = '.'.join([str(i) for i in prefix])
        suffix = suffix.strip()
    if suffix:
        #import pdb; pdb.set_trace()
        # massage the suffix.
        for pat, repl in _SUFFIX_REPLACEMENTS:
            suffix = pat.sub(repl, suffix)

    if not suffix:
        result = prefix
    else:
        sep = '-' if 'dev' in suffix else '+'
        result = prefix + sep + suffix
    if not is_semver(result):
        result = None
    return result


def _suggest_normalized_version(s):
    """Suggest a normalized version close to the given version string.

    If you have a version string that isn't rational (i.e. NormalizedVersion
    doesn't like it) then you might be able to get an equivalent (or close)
    rational version from this function.

    This does a number of simple normalizations to the given string, based
    on observation of versions currently in use on PyPI. Given a dump of
    those version during PyCon 2009, 4287 of them:
    - 2312 (53.93%) match NormalizedVersion without change
      with the automatic suggestion
    - 3474 (81.04%) match when using this suggestion method

    @param s {str} An irrational version string.
    @returns A rational version string, or None, if couldn't determine one.
    """
    try:
        _normalized_key(s)
        return s   # already rational
    except UnsupportedVersionError:
        pass

    rs = s.lower()

    # part of this could use maketrans
    for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'),
                       ('beta', 'b'), ('rc', 'c'), ('-final', ''),
                       ('-pre', 'c'),
                       ('-release', ''), ('.release', ''), ('-stable', ''),
                       ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''),
                       ('final', '')):
        rs = rs.replace(orig, repl)

    # if something ends with dev or pre, we add a 0
    rs = re.sub(r"pre$", r"pre0", rs)
    rs = re.sub(r"dev$", r"dev0", rs)

    # if we have something like "b-2" or "a.2" at the end of the
    # version, that is pobably beta, alpha, etc
    # let's remove the dash or dot
    rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs)

    # 1.0-dev-r371 -> 1.0.dev371
    # 0.1-dev-r79 -> 0.1.dev79
    rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs)

    # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1
    rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs)

    # Clean: v0.3, v1.0
    if rs.startswith('v'):
        rs = rs[1:]

    # Clean leading '0's on numbers.
    #TODO: unintended side-effect on, e.g., "2003.05.09"
    # PyPI stats: 77 (~2%) better
    rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs)

    # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers
    # zero.
    # PyPI stats: 245 (7.56%) better
    rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs)

    # the 'dev-rNNN' tag is a dev tag
    rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs)

    # clean the - when used as a pre delimiter
    rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs)

    # a terminal "dev" or "devel" can be changed into ".dev0"
    rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs)

    # a terminal "dev" can be changed into ".dev0"
    rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs)

    # a terminal "final" or "stable" can be removed
    rs = re.sub(r"(final|stable)$", "", rs)

    # The 'r' and the '-' tags are post release tags
    #   0.4a1.r10       ->  0.4a1.post10
    #   0.9.33-17222    ->  0.9.33.post17222
    #   0.9.33-r17222   ->  0.9.33.post17222
    rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs)

    # Clean 'r' instead of 'dev' usage:
    #   0.9.33+r17222   ->  0.9.33.dev17222
    #   1.0dev123       ->  1.0.dev123
    #   1.0.git123      ->  1.0.dev123
    #   1.0.bzr123      ->  1.0.dev123
    #   0.1a0dev.123    ->  0.1a0.dev123
    # PyPI stats:  ~150 (~4%) better
    rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs)

    # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage:
    #   0.2.pre1        ->  0.2c1
    #   0.2-c1         ->  0.2c1
    #   1.0preview123   ->  1.0c123
    # PyPI stats: ~21 (0.62%) better
    rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs)

    # Tcl/Tk uses "px" for their post release markers
    rs = re.sub(r"p(\d+)$", r".post\1", rs)

    try:
        _normalized_key(rs)
    except UnsupportedVersionError:
        rs = None
    return rs

#
#   Legacy version processing (distribute-compatible)
#

_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I)
_VERSION_REPLACE = {
    'pre': 'c',
    'preview': 'c',
    '-': 'final-',
    'rc': 'c',
    'dev': '@',
    '': None,
    '.': None,
}


def _legacy_key(s):
    def get_parts(s):
        result = []
        for p in _VERSION_PART.split(s.lower()):
            p = _VERSION_REPLACE.get(p, p)
            if p:
                if '0' <= p[:1] <= '9':
                    p = p.zfill(8)
                else:
                    p = '*' + p
                result.append(p)
        result.append('*final')
        return result

    result = []
    for p in get_parts(s):
        if p.startswith('*'):
            if p < '*final':
                while result and result[-1] == '*final-':
                    result.pop()
            while result and result[-1] == '00000000':
                result.pop()
        result.append(p)
    return tuple(result)


class LegacyVersion(Version):
    def parse(self, s):
        return _legacy_key(s)

    @property
    def is_prerelease(self):
        result = False
        for x in self._parts:
            if (isinstance(x, string_types) and x.startswith('*') and
                x < '*final'):
                result = True
                break
        return result


class LegacyMatcher(Matcher):
    version_class = LegacyVersion

    _operators = dict(Matcher._operators)
    _operators['~='] = '_match_compatible'

    numeric_re = re.compile('^(\d+(\.\d+)*)')

    def _match_compatible(self, version, constraint, prefix):
        if version < constraint:
            return False
        m = self.numeric_re.match(str(constraint))
        if not m:
            logger.warning('Cannot compute compatible match for version %s '
                           ' and constraint %s', version, constraint)
            return True
        s = m.groups()[0]
        if '.' in s:
            s = s.rsplit('.', 1)[0]
        return _match_prefix(version, s)

#
#   Semantic versioning
#

_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)'
                        r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?'
                        r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I)


def is_semver(s):
    return _SEMVER_RE.match(s)


def _semantic_key(s):
    def make_tuple(s, absent):
        if s is None:
            result = (absent,)
        else:
            parts = s[1:].split('.')
            # We can't compare ints and strings on Python 3, so fudge it
            # by zero-filling numeric values so simulate a numeric comparison
            result = tuple([p.zfill(8) if p.isdigit() else p for p in parts])
        return result

    m = is_semver(s)
    if not m:
        raise UnsupportedVersionError(s)
    groups = m.groups()
    major, minor, patch = [int(i) for i in groups[:3]]
    # choose the '|' and '*' so that versions sort correctly
    pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*')
    return (major, minor, patch), pre, build


class SemanticVersion(Version):
    def parse(self, s):
        return _semantic_key(s)

    @property
    def is_prerelease(self):
        return self._parts[1][0] != '|'


class SemanticMatcher(Matcher):
    version_class = SemanticVersion


class VersionScheme(object):
    def __init__(self, key, matcher, suggester=None):
        self.key = key
        self.matcher = matcher
        self.suggester = suggester

    def is_valid_version(self, s):
        try:
            self.matcher.version_class(s)
            result = True
        except UnsupportedVersionError:
            result = False
        return result

    def is_valid_matcher(self, s):
        try:
            self.matcher(s)
            result = True
        except UnsupportedVersionError:
            result = False
        return result

    def is_valid_constraint_list(self, s):
        """
        Used for processing some metadata fields
        """
        return self.is_valid_matcher('dummy_name (%s)' % s)

    def suggest(self, s):
        if self.suggester is None:
            result = None
        else:
            result = self.suggester(s)
        return result

_SCHEMES = {
    'normalized': VersionScheme(_normalized_key, NormalizedMatcher,
                                _suggest_normalized_version),
    'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s),
    'semantic': VersionScheme(_semantic_key, SemanticMatcher,
                              _suggest_semantic_version),
}

_SCHEMES['default'] = _SCHEMES['normalized']


def get_scheme(name):
    if name not in _SCHEMES:
        raise ValueError('unknown scheme name: %r' % name)
    return _SCHEMES[name]
site-packages/pip/_vendor/distlib/scripts.py000064400000030023151733463530015213 0ustar00# -*- coding: utf-8 -*-
#
# Copyright (C) 2013 Vinay Sajip.
# Licensed to the Python Software Foundation under a contributor agreement.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
from io import BytesIO
import logging
import os
import re
import struct
import sys

from .compat import sysconfig, fsencode, detect_encoding, ZipFile
from .resources import finder
from .util import (FileOperator, get_export_entry, convert_path,
                   get_executable, in_venv)

logger = logging.getLogger(__name__)

_DEFAULT_MANIFEST = '''
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
 <assemblyIdentity version="1.0.0.0"
 processorArchitecture="X86"
 name="%s"
 type="win32"/>

 <!-- Identify the application security requirements. -->
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
 <security>
 <requestedPrivileges>
 <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
 </requestedPrivileges>
 </security>
 </trustInfo>
</assembly>'''.strip()

# check if Python is called on the first line with this expression
FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$')
SCRIPT_TEMPLATE = '''# -*- coding: utf-8 -*-
if __name__ == '__main__':
    import sys, re

    def _resolve(module, func):
        __import__(module)
        mod = sys.modules[module]
        parts = func.split('.')
        result = getattr(mod, parts.pop(0))
        for p in parts:
            result = getattr(result, p)
        return result

    try:
        sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])

        func = _resolve('%(module)s', '%(func)s')
        rc = func() # None interpreted as 0
    except Exception as e:  # only supporting Python >= 2.6
        sys.stderr.write('%%s\\n' %% e)
        rc = 1
    sys.exit(rc)
'''


class ScriptMaker(object):
    """
    A class to copy or create scripts from source scripts or callable
    specifications.
    """
    script_template = SCRIPT_TEMPLATE

    executable = None  # for shebangs

    def __init__(self, source_dir, target_dir, add_launchers=True,
                 dry_run=False, fileop=None):
        self.source_dir = source_dir
        self.target_dir = target_dir
        self.add_launchers = add_launchers
        self.force = False
        self.clobber = False
        # It only makes sense to set mode bits on POSIX.
        self.set_mode = (os.name == 'posix')
        self.variants = set(('', 'X.Y'))
        self._fileop = fileop or FileOperator(dry_run)

    def _get_alternate_executable(self, executable, options):
        if options.get('gui', False) and os.name == 'nt':
            dn, fn = os.path.split(executable)
            fn = fn.replace('python', 'pythonw')
            executable = os.path.join(dn, fn)
        return executable

    def _get_shebang(self, encoding, post_interp=b'', options=None):
        enquote = True
        if self.executable:
            executable = self.executable
            enquote = False     # assume this will be taken care of
        elif not sysconfig.is_python_build():
            executable = get_executable()
        elif in_venv():
            executable = os.path.join(sysconfig.get_path('scripts'),
                            'python%s' % sysconfig.get_config_var('EXE'))
        else:
            executable = os.path.join(
                sysconfig.get_config_var('BINDIR'),
               'python%s%s' % (sysconfig.get_config_var('VERSION'),
                               sysconfig.get_config_var('EXE')))
        if options:
            executable = self._get_alternate_executable(executable, options)

        # If the user didn't specify an executable, it may be necessary to
        # cater for executable paths with spaces (not uncommon on Windows)
        if enquote and ' ' in executable:
            executable = '"%s"' % executable
        executable = fsencode(executable)
        shebang = b'#!' + executable + post_interp + b'\n'
        # Python parser starts to read a script using UTF-8 until
        # it gets a #coding:xxx cookie. The shebang has to be the
        # first line of a file, the #coding:xxx cookie cannot be
        # written before. So the shebang has to be decodable from
        # UTF-8.
        try:
            shebang.decode('utf-8')
        except UnicodeDecodeError:
            raise ValueError(
                'The shebang (%r) is not decodable from utf-8' % shebang)
        # If the script is encoded to a custom encoding (use a
        # #coding:xxx cookie), the shebang has to be decodable from
        # the script encoding too.
        if encoding != 'utf-8':
            try:
                shebang.decode(encoding)
            except UnicodeDecodeError:
                raise ValueError(
                    'The shebang (%r) is not decodable '
                    'from the script encoding (%r)' % (shebang, encoding))
        return shebang

    def _get_script_text(self, entry):
        return self.script_template % dict(module=entry.prefix,
                                           func=entry.suffix)

    manifest = _DEFAULT_MANIFEST

    def get_manifest(self, exename):
        base = os.path.basename(exename)
        return self.manifest % base

    def _write_script(self, names, shebang, script_bytes, filenames, ext):
        use_launcher = self.add_launchers and os.name == 'nt'
        linesep = os.linesep.encode('utf-8')
        if not use_launcher:
            script_bytes = shebang + linesep + script_bytes
        else:
            if ext == 'py':
                launcher = self._get_launcher('t')
            else:
                launcher = self._get_launcher('w')
            stream = BytesIO()
            with ZipFile(stream, 'w') as zf:
                zf.writestr('__main__.py', script_bytes)
            zip_data = stream.getvalue()
            script_bytes = launcher + shebang + linesep + zip_data
        for name in names:
            outname = os.path.join(self.target_dir, name)
            if use_launcher:
                n, e = os.path.splitext(outname)
                if e.startswith('.py'):
                    outname = n
                outname = '%s.exe' % outname
                try:
                    self._fileop.write_binary_file(outname, script_bytes)
                except Exception:
                    # Failed writing an executable - it might be in use.
                    logger.warning('Failed to write executable - trying to '
                                   'use .deleteme logic')
                    dfname = '%s.deleteme' % outname
                    if os.path.exists(dfname):
                        os.remove(dfname)       # Not allowed to fail here
                    os.rename(outname, dfname)  # nor here
                    self._fileop.write_binary_file(outname, script_bytes)
                    logger.debug('Able to replace executable using '
                                 '.deleteme logic')
                    try:
                        os.remove(dfname)
                    except Exception:
                        pass    # still in use - ignore error
            else:
                if os.name == 'nt' and not outname.endswith('.' + ext):
                    outname = '%s.%s' % (outname, ext)
                if os.path.exists(outname) and not self.clobber:
                    logger.warning('Skipping existing file %s', outname)
                    continue
                self._fileop.write_binary_file(outname, script_bytes)
                if self.set_mode:
                    self._fileop.set_executable_mode([outname])
            filenames.append(outname)

    def _make_script(self, entry, filenames, options=None):
        shebang = self._get_shebang('utf-8', options=options)
        script = self._get_script_text(entry).encode('utf-8')
        name = entry.name
        scriptnames = set()
        if '' in self.variants:
            scriptnames.add(name)
        if 'X' in self.variants:
            scriptnames.add('%s%s' % (name, sys.version[0]))
        if 'X.Y' in self.variants:
            scriptnames.add('%s-%s' % (name, sys.version[:3]))
        if options and options.get('gui', False):
            ext = 'pyw'
        else:
            ext = 'py'
        self._write_script(scriptnames, shebang, script, filenames, ext)

    def _copy_script(self, script, filenames):
        adjust = False
        script = os.path.join(self.source_dir, convert_path(script))
        outname = os.path.join(self.target_dir, os.path.basename(script))
        if not self.force and not self._fileop.newer(script, outname):
            logger.debug('not copying %s (up-to-date)', script)
            return

        # Always open the file, but ignore failures in dry-run mode --
        # that way, we'll get accurate feedback if we can read the
        # script.
        try:
            f = open(script, 'rb')
        except IOError:
            if not self.dry_run:
                raise
            f = None
        else:
            encoding, lines = detect_encoding(f.readline)
            f.seek(0)
            first_line = f.readline()
            if not first_line:
                logger.warning('%s: %s is an empty file (skipping)',
                               self.get_command_name(),  script)
                return

            match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n'))
            if match:
                adjust = True
                post_interp = match.group(1) or b''

        if not adjust:
            if f:
                f.close()
            self._fileop.copy_file(script, outname)
            if self.set_mode:
                self._fileop.set_executable_mode([outname])
            filenames.append(outname)
        else:
            logger.info('copying and adjusting %s -> %s', script,
                        self.target_dir)
            if not self._fileop.dry_run:
                shebang = self._get_shebang(encoding, post_interp)
                if b'pythonw' in first_line:
                    ext = 'pyw'
                else:
                    ext = 'py'
                n = os.path.basename(outname)
                self._write_script([n], shebang, f.read(), filenames, ext)
            if f:
                f.close()

    @property
    def dry_run(self):
        return self._fileop.dry_run

    @dry_run.setter
    def dry_run(self, value):
        self._fileop.dry_run = value

    if os.name == 'nt':
        # Executable launcher support.
        # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/

        def _get_launcher(self, kind):
            if struct.calcsize('P') == 8:   # 64-bit
                bits = '64'
            else:
                bits = '32'
            name = '%s%s.exe' % (kind, bits)
            # Issue 31: don't hardcode an absolute package name, but
            # determine it relative to the current package
            distlib_package = __name__.rsplit('.', 1)[0]
            result = finder(distlib_package).find(name).bytes
            return result

    # Public API follows

    def make(self, specification, options=None):
        """
        Make a script.

        :param specification: The specification, which is either a valid export
                              entry specification (to make a script from a
                              callable) or a filename (to make a script by
                              copying from a source location).
        :param options: A dictionary of options controlling script generation.
        :return: A list of all absolute pathnames written to.
        """
        filenames = []
        entry = get_export_entry(specification)
        if entry is None:
            self._copy_script(specification, filenames)
        else:
            self._make_script(entry, filenames, options=options)
        return filenames

    def make_multiple(self, specifications, options=None):
        """
        Take a list of specifications and make scripts from them,
        :param specifications: A list of specifications.
        :return: A list of all absolute pathnames written to,
        """
        filenames = []
        for specification in specifications:
            filenames.extend(self.make(specification, options))
        return filenames
site-packages/pip/_vendor/distlib/resources.py000064400000022330151733463530015540 0ustar00# -*- coding: utf-8 -*-
#
# Copyright (C) 2013 Vinay Sajip.
# Licensed to the Python Software Foundation under a contributor agreement.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
from __future__ import unicode_literals

import bisect
import io
import logging
import os
import pkgutil
import shutil
import sys
import types
import zipimport

from . import DistlibException
from .util import cached_property, get_cache_base, path_to_cache_dir, Cache

logger = logging.getLogger(__name__)


cache = None    # created when needed


class ResourceCache(Cache):
    def __init__(self, base=None):
        if base is None:
            # Use native string to avoid issues on 2.x: see Python #20140.
            base = os.path.join(get_cache_base(), str('resource-cache'))
        super(ResourceCache, self).__init__(base)

    def is_stale(self, resource, path):
        """
        Is the cache stale for the given resource?

        :param resource: The :class:`Resource` being cached.
        :param path: The path of the resource in the cache.
        :return: True if the cache is stale.
        """
        # Cache invalidation is a hard problem :-)
        return True

    def get(self, resource):
        """
        Get a resource into the cache,

        :param resource: A :class:`Resource` instance.
        :return: The pathname of the resource in the cache.
        """
        prefix, path = resource.finder.get_cache_info(resource)
        if prefix is None:
            result = path
        else:
            result = os.path.join(self.base, self.prefix_to_dir(prefix), path)
            dirname = os.path.dirname(result)
            if not os.path.isdir(dirname):
                os.makedirs(dirname)
            if not os.path.exists(result):
                stale = True
            else:
                stale = self.is_stale(resource, path)
            if stale:
                # write the bytes of the resource to the cache location
                with open(result, 'wb') as f:
                    f.write(resource.bytes)
        return result


class ResourceBase(object):
    def __init__(self, finder, name):
        self.finder = finder
        self.name = name


class Resource(ResourceBase):
    """
    A class representing an in-package resource, such as a data file. This is
    not normally instantiated by user code, but rather by a
    :class:`ResourceFinder` which manages the resource.
    """
    is_container = False        # Backwards compatibility

    def as_stream(self):
        """
        Get the resource as a stream.

        This is not a property to make it obvious that it returns a new stream
        each time.
        """
        return self.finder.get_stream(self)

    @cached_property
    def file_path(self):
        global cache
        if cache is None:
            cache = ResourceCache()
        return cache.get(self)

    @cached_property
    def bytes(self):
        return self.finder.get_bytes(self)

    @cached_property
    def size(self):
        return self.finder.get_size(self)


class ResourceContainer(ResourceBase):
    is_container = True     # Backwards compatibility

    @cached_property
    def resources(self):
        return self.finder.get_resources(self)


class ResourceFinder(object):
    """
    Resource finder for file system resources.
    """
    def __init__(self, module):
        self.module = module
        self.loader = getattr(module, '__loader__', None)
        self.base = os.path.dirname(getattr(module, '__file__', ''))

    def _adjust_path(self, path):
        return os.path.realpath(path)

    def _make_path(self, resource_name):
        parts = resource_name.split('/')
        parts.insert(0, self.base)
        result = os.path.join(*parts)
        return self._adjust_path(result)

    def _find(self, path):
        return os.path.exists(path)

    def get_cache_info(self, resource):
        return None, resource.path

    def find(self, resource_name):
        path = self._make_path(resource_name)
        if not self._find(path):
            result = None
        else:
            if self._is_directory(path):
                result = ResourceContainer(self, resource_name)
            else:
                result = Resource(self, resource_name)
            result.path = path
        return result

    def get_stream(self, resource):
        return open(resource.path, 'rb')

    def get_bytes(self, resource):
        with open(resource.path, 'rb') as f:
            return f.read()

    def get_size(self, resource):
        return os.path.getsize(resource.path)

    def get_resources(self, resource):
        def allowed(f):
            return f != '__pycache__' and not f.endswith(('.pyc', '.pyo'))
        return set([f for f in os.listdir(resource.path) if allowed(f)])

    def is_container(self, resource):
        return self._is_directory(resource.path)

    _is_directory = staticmethod(os.path.isdir)


class ZipResourceFinder(ResourceFinder):
    """
    Resource finder for resources in .zip files.
    """
    def __init__(self, module):
        super(ZipResourceFinder, self).__init__(module)
        archive = self.loader.archive
        self.prefix_len = 1 + len(archive)
        # PyPy doesn't have a _files attr on zipimporter, and you can't set one
        if hasattr(self.loader, '_files'):
            self._files = self.loader._files
        else:
            self._files = zipimport._zip_directory_cache[archive]
        self.index = sorted(self._files)

    def _adjust_path(self, path):
        return path

    def _find(self, path):
        path = path[self.prefix_len:]
        if path in self._files:
            result = True
        else:
            if path and path[-1] != os.sep:
                path = path + os.sep
            i = bisect.bisect(self.index, path)
            try:
                result = self.index[i].startswith(path)
            except IndexError:
                result = False
        if not result:
            logger.debug('_find failed: %r %r', path, self.loader.prefix)
        else:
            logger.debug('_find worked: %r %r', path, self.loader.prefix)
        return result

    def get_cache_info(self, resource):
        prefix = self.loader.archive
        path = resource.path[1 + len(prefix):]
        return prefix, path

    def get_bytes(self, resource):
        return self.loader.get_data(resource.path)

    def get_stream(self, resource):
        return io.BytesIO(self.get_bytes(resource))

    def get_size(self, resource):
        path = resource.path[self.prefix_len:]
        return self._files[path][3]

    def get_resources(self, resource):
        path = resource.path[self.prefix_len:]
        if path and path[-1] != os.sep:
            path += os.sep
        plen = len(path)
        result = set()
        i = bisect.bisect(self.index, path)
        while i < len(self.index):
            if not self.index[i].startswith(path):
                break
            s = self.index[i][plen:]
            result.add(s.split(os.sep, 1)[0])   # only immediate children
            i += 1
        return result

    def _is_directory(self, path):
        path = path[self.prefix_len:]
        if path and path[-1] != os.sep:
            path += os.sep
        i = bisect.bisect(self.index, path)
        try:
            result = self.index[i].startswith(path)
        except IndexError:
            result = False
        return result

_finder_registry = {
    type(None): ResourceFinder,
    zipimport.zipimporter: ZipResourceFinder
}

try:
    import _frozen_importlib
    _finder_registry[_frozen_importlib.SourceFileLoader] = ResourceFinder
    _finder_registry[_frozen_importlib.FileFinder] = ResourceFinder
except (ImportError, AttributeError):
    pass


def register_finder(loader, finder_maker):
    _finder_registry[type(loader)] = finder_maker

_finder_cache = {}


def finder(package):
    """
    Return a resource finder for a package.
    :param package: The name of the package.
    :return: A :class:`ResourceFinder` instance for the package.
    """
    if package in _finder_cache:
        result = _finder_cache[package]
    else:
        if package not in sys.modules:
            __import__(package)
        module = sys.modules[package]
        path = getattr(module, '__path__', None)
        if path is None:
            raise DistlibException('You cannot get a finder for a module, '
                                   'only for a package')
        loader = getattr(module, '__loader__', None)
        finder_maker = _finder_registry.get(type(loader))
        if finder_maker is None:
            raise DistlibException('Unable to locate finder for %r' % package)
        result = finder_maker(module)
        _finder_cache[package] = result
    return result


_dummy_module = types.ModuleType(str('__dummy__'))


def finder_for_path(path):
    """
    Return a resource finder for a path, which should represent a container.

    :param path: The path.
    :return: A :class:`ResourceFinder` instance for the path.
    """
    result = None
    # calls any path hooks, gets importer into cache
    pkgutil.get_importer(path)
    loader = sys.path_importer_cache.get(path)
    finder = _finder_registry.get(type(loader))
    if finder:
        module = _dummy_module
        module.__file__ = os.path.join(path, '')
        module.__loader__ = loader
        result = finder(module)
    return result
site-packages/pip/_vendor/distlib/index.py000064400000046024151733463530014643 0ustar00# -*- coding: utf-8 -*-
#
# Copyright (C) 2013 Vinay Sajip.
# Licensed to the Python Software Foundation under a contributor agreement.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
import hashlib
import logging
import os
import shutil
import subprocess
import tempfile
try:
    from threading import Thread
except ImportError:
    from dummy_threading import Thread

from . import DistlibException
from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr,
                     urlparse, build_opener, string_types)
from .util import cached_property, zip_dir, ServerProxy

logger = logging.getLogger(__name__)

DEFAULT_INDEX = 'https://pypi.python.org/pypi'
DEFAULT_REALM = 'pypi'

class PackageIndex(object):
    """
    This class represents a package index compatible with PyPI, the Python
    Package Index.
    """

    boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$'

    def __init__(self, url=None):
        """
        Initialise an instance.

        :param url: The URL of the index. If not specified, the URL for PyPI is
                    used.
        """
        self.url = url or DEFAULT_INDEX
        self.read_configuration()
        scheme, netloc, path, params, query, frag = urlparse(self.url)
        if params or query or frag or scheme not in ('http', 'https'):
            raise DistlibException('invalid repository: %s' % self.url)
        self.password_handler = None
        self.ssl_verifier = None
        self.gpg = None
        self.gpg_home = None
        self.rpc_proxy = None
        with open(os.devnull, 'w') as sink:
            for s in ('gpg2', 'gpg'):
                try:
                    rc = subprocess.check_call([s, '--version'], stdout=sink,
                                               stderr=sink)
                    if rc == 0:
                        self.gpg = s
                        break
                except OSError:
                    pass

    def _get_pypirc_command(self):
        """
        Get the distutils command for interacting with PyPI configurations.
        :return: the command.
        """
        from distutils.core import Distribution
        from distutils.config import PyPIRCCommand
        d = Distribution()
        return PyPIRCCommand(d)

    def read_configuration(self):
        """
        Read the PyPI access configuration as supported by distutils, getting
        PyPI to do the acutal work. This populates ``username``, ``password``,
        ``realm`` and ``url`` attributes from the configuration.
        """
        # get distutils to do the work
        c = self._get_pypirc_command()
        c.repository = self.url
        cfg = c._read_pypirc()
        self.username = cfg.get('username')
        self.password = cfg.get('password')
        self.realm = cfg.get('realm', 'pypi')
        self.url = cfg.get('repository', self.url)

    def save_configuration(self):
        """
        Save the PyPI access configuration. You must have set ``username`` and
        ``password`` attributes before calling this method.

        Again, distutils is used to do the actual work.
        """
        self.check_credentials()
        # get distutils to do the work
        c = self._get_pypirc_command()
        c._store_pypirc(self.username, self.password)

    def check_credentials(self):
        """
        Check that ``username`` and ``password`` have been set, and raise an
        exception if not.
        """
        if self.username is None or self.password is None:
            raise DistlibException('username and password must be set')
        pm = HTTPPasswordMgr()
        _, netloc, _, _, _, _ = urlparse(self.url)
        pm.add_password(self.realm, netloc, self.username, self.password)
        self.password_handler = HTTPBasicAuthHandler(pm)

    def register(self, metadata):
        """
        Register a distribution on PyPI, using the provided metadata.

        :param metadata: A :class:`Metadata` instance defining at least a name
                         and version number for the distribution to be
                         registered.
        :return: The HTTP response received from PyPI upon submission of the
                request.
        """
        self.check_credentials()
        metadata.validate()
        d = metadata.todict()
        d[':action'] = 'verify'
        request = self.encode_request(d.items(), [])
        response = self.send_request(request)
        d[':action'] = 'submit'
        request = self.encode_request(d.items(), [])
        return self.send_request(request)

    def _reader(self, name, stream, outbuf):
        """
        Thread runner for reading lines of from a subprocess into a buffer.

        :param name: The logical name of the stream (used for logging only).
        :param stream: The stream to read from. This will typically a pipe
                       connected to the output stream of a subprocess.
        :param outbuf: The list to append the read lines to.
        """
        while True:
            s = stream.readline()
            if not s:
                break
            s = s.decode('utf-8').rstrip()
            outbuf.append(s)
            logger.debug('%s: %s' % (name, s))
        stream.close()

    def get_sign_command(self, filename, signer, sign_password):
        """
        Return a suitable command for signing a file.

        :param filename: The pathname to the file to be signed.
        :param signer: The identifier of the signer of the file.
        :param sign_password: The passphrase for the signer's
                              private key used for signing.
        :return: The signing command as a list suitable to be
                 passed to :class:`subprocess.Popen`.
        """
        cmd = [self.gpg, '--status-fd', '2', '--no-tty']
        if self.gpg_home:
            cmd.extend(['--homedir', self.gpg_home])
        if sign_password is not None:
            cmd.extend(['--batch', '--passphrase-fd', '0'])
        td = tempfile.mkdtemp()
        sf = os.path.join(td, os.path.basename(filename) + '.asc')
        cmd.extend(['--detach-sign', '--armor', '--local-user',
                    signer, '--output', sf, filename])
        logger.debug('invoking: %s', ' '.join(cmd))
        return cmd, sf

    def run_command(self, cmd, input_data=None):
        """
        Run a command in a child process , passing it any input data specified.

        :param cmd: The command to run.
        :param input_data: If specified, this must be a byte string containing
                           data to be sent to the child process.
        :return: A tuple consisting of the subprocess' exit code, a list of
                 lines read from the subprocess' ``stdout``, and a list of
                 lines read from the subprocess' ``stderr``.
        """
        kwargs = {
            'stdout': subprocess.PIPE,
            'stderr': subprocess.PIPE,
        }
        if input_data is not None:
            kwargs['stdin'] = subprocess.PIPE
        stdout = []
        stderr = []
        p = subprocess.Popen(cmd, **kwargs)
        # We don't use communicate() here because we may need to
        # get clever with interacting with the command
        t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout))
        t1.start()
        t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr))
        t2.start()
        if input_data is not None:
            p.stdin.write(input_data)
            p.stdin.close()

        p.wait()
        t1.join()
        t2.join()
        return p.returncode, stdout, stderr

    def sign_file(self, filename, signer, sign_password):
        """
        Sign a file.

        :param filename: The pathname to the file to be signed.
        :param signer: The identifier of the signer of the file.
        :param sign_password: The passphrase for the signer's
                              private key used for signing.
        :return: The absolute pathname of the file where the signature is
                 stored.
        """
        cmd, sig_file = self.get_sign_command(filename, signer, sign_password)
        rc, stdout, stderr = self.run_command(cmd,
                                              sign_password.encode('utf-8'))
        if rc != 0:
            raise DistlibException('sign command failed with error '
                                   'code %s' % rc)
        return sig_file

    def upload_file(self, metadata, filename, signer=None, sign_password=None,
                    filetype='sdist', pyversion='source'):
        """
        Upload a release file to the index.

        :param metadata: A :class:`Metadata` instance defining at least a name
                         and version number for the file to be uploaded.
        :param filename: The pathname of the file to be uploaded.
        :param signer: The identifier of the signer of the file.
        :param sign_password: The passphrase for the signer's
                              private key used for signing.
        :param filetype: The type of the file being uploaded. This is the
                        distutils command which produced that file, e.g.
                        ``sdist`` or ``bdist_wheel``.
        :param pyversion: The version of Python which the release relates
                          to. For code compatible with any Python, this would
                          be ``source``, otherwise it would be e.g. ``3.2``.
        :return: The HTTP response received from PyPI upon submission of the
                request.
        """
        self.check_credentials()
        if not os.path.exists(filename):
            raise DistlibException('not found: %s' % filename)
        metadata.validate()
        d = metadata.todict()
        sig_file = None
        if signer:
            if not self.gpg:
                logger.warning('no signing program available - not signed')
            else:
                sig_file = self.sign_file(filename, signer, sign_password)
        with open(filename, 'rb') as f:
            file_data = f.read()
        md5_digest = hashlib.md5(file_data).hexdigest()
        sha256_digest = hashlib.sha256(file_data).hexdigest()
        d.update({
            ':action': 'file_upload',
            'protcol_version': '1',
            'filetype': filetype,
            'pyversion': pyversion,
            'md5_digest': md5_digest,
            'sha256_digest': sha256_digest,
        })
        files = [('content', os.path.basename(filename), file_data)]
        if sig_file:
            with open(sig_file, 'rb') as f:
                sig_data = f.read()
            files.append(('gpg_signature', os.path.basename(sig_file),
                         sig_data))
            shutil.rmtree(os.path.dirname(sig_file))
        request = self.encode_request(d.items(), files)
        return self.send_request(request)

    def upload_documentation(self, metadata, doc_dir):
        """
        Upload documentation to the index.

        :param metadata: A :class:`Metadata` instance defining at least a name
                         and version number for the documentation to be
                         uploaded.
        :param doc_dir: The pathname of the directory which contains the
                        documentation. This should be the directory that
                        contains the ``index.html`` for the documentation.
        :return: The HTTP response received from PyPI upon submission of the
                request.
        """
        self.check_credentials()
        if not os.path.isdir(doc_dir):
            raise DistlibException('not a directory: %r' % doc_dir)
        fn = os.path.join(doc_dir, 'index.html')
        if not os.path.exists(fn):
            raise DistlibException('not found: %r' % fn)
        metadata.validate()
        name, version = metadata.name, metadata.version
        zip_data = zip_dir(doc_dir).getvalue()
        fields = [(':action', 'doc_upload'),
                  ('name', name), ('version', version)]
        files = [('content', name, zip_data)]
        request = self.encode_request(fields, files)
        return self.send_request(request)

    def get_verify_command(self, signature_filename, data_filename):
        """
        Return a suitable command for verifying a file.

        :param signature_filename: The pathname to the file containing the
                                   signature.
        :param data_filename: The pathname to the file containing the
                              signed data.
        :return: The verifying command as a list suitable to be
                 passed to :class:`subprocess.Popen`.
        """
        cmd = [self.gpg, '--status-fd', '2', '--no-tty']
        if self.gpg_home:
            cmd.extend(['--homedir', self.gpg_home])
        cmd.extend(['--verify', signature_filename, data_filename])
        logger.debug('invoking: %s', ' '.join(cmd))
        return cmd

    def verify_signature(self, signature_filename, data_filename):
        """
        Verify a signature for a file.

        :param signature_filename: The pathname to the file containing the
                                   signature.
        :param data_filename: The pathname to the file containing the
                              signed data.
        :return: True if the signature was verified, else False.
        """
        if not self.gpg:
            raise DistlibException('verification unavailable because gpg '
                                   'unavailable')
        cmd = self.get_verify_command(signature_filename, data_filename)
        rc, stdout, stderr = self.run_command(cmd)
        if rc not in (0, 1):
            raise DistlibException('verify command failed with error '
                             'code %s' % rc)
        return rc == 0

    def download_file(self, url, destfile, digest=None, reporthook=None):
        """
        This is a convenience method for downloading a file from an URL.
        Normally, this will be a file from the index, though currently
        no check is made for this (i.e. a file can be downloaded from
        anywhere).

        The method is just like the :func:`urlretrieve` function in the
        standard library, except that it allows digest computation to be
        done during download and checking that the downloaded data
        matched any expected value.

        :param url: The URL of the file to be downloaded (assumed to be
                    available via an HTTP GET request).
        :param destfile: The pathname where the downloaded file is to be
                         saved.
        :param digest: If specified, this must be a (hasher, value)
                       tuple, where hasher is the algorithm used (e.g.
                       ``'md5'``) and ``value`` is the expected value.
        :param reporthook: The same as for :func:`urlretrieve` in the
                           standard library.
        """
        if digest is None:
            digester = None
            logger.debug('No digest specified')
        else:
            if isinstance(digest, (list, tuple)):
                hasher, digest = digest
            else:
                hasher = 'md5'
            digester = getattr(hashlib, hasher)()
            logger.debug('Digest specified: %s' % digest)
        # The following code is equivalent to urlretrieve.
        # We need to do it this way so that we can compute the
        # digest of the file as we go.
        with open(destfile, 'wb') as dfp:
            # addinfourl is not a context manager on 2.x
            # so we have to use try/finally
            sfp = self.send_request(Request(url))
            try:
                headers = sfp.info()
                blocksize = 8192
                size = -1
                read = 0
                blocknum = 0
                if "content-length" in headers:
                    size = int(headers["Content-Length"])
                if reporthook:
                    reporthook(blocknum, blocksize, size)
                while True:
                    block = sfp.read(blocksize)
                    if not block:
                        break
                    read += len(block)
                    dfp.write(block)
                    if digester:
                        digester.update(block)
                    blocknum += 1
                    if reporthook:
                        reporthook(blocknum, blocksize, size)
            finally:
                sfp.close()

        # check that we got the whole file, if we can
        if size >= 0 and read < size:
            raise DistlibException(
                'retrieval incomplete: got only %d out of %d bytes'
                % (read, size))
        # if we have a digest, it must match.
        if digester:
            actual = digester.hexdigest()
            if digest != actual:
                raise DistlibException('%s digest mismatch for %s: expected '
                                       '%s, got %s' % (hasher, destfile,
                                                       digest, actual))
            logger.debug('Digest verified: %s', digest)

    def send_request(self, req):
        """
        Send a standard library :class:`Request` to PyPI and return its
        response.

        :param req: The request to send.
        :return: The HTTP response from PyPI (a standard library HTTPResponse).
        """
        handlers = []
        if self.password_handler:
            handlers.append(self.password_handler)
        if self.ssl_verifier:
            handlers.append(self.ssl_verifier)
        opener = build_opener(*handlers)
        return opener.open(req)

    def encode_request(self, fields, files):
        """
        Encode fields and files for posting to an HTTP server.

        :param fields: The fields to send as a list of (fieldname, value)
                       tuples.
        :param files: The files to send as a list of (fieldname, filename,
                      file_bytes) tuple.
        """
        # Adapted from packaging, which in turn was adapted from
        # http://code.activestate.com/recipes/146306

        parts = []
        boundary = self.boundary
        for k, values in fields:
            if not isinstance(values, (list, tuple)):
                values = [values]

            for v in values:
                parts.extend((
                    b'--' + boundary,
                    ('Content-Disposition: form-data; name="%s"' %
                     k).encode('utf-8'),
                    b'',
                    v.encode('utf-8')))
        for key, filename, value in files:
            parts.extend((
                b'--' + boundary,
                ('Content-Disposition: form-data; name="%s"; filename="%s"' %
                 (key, filename)).encode('utf-8'),
                b'',
                value))

        parts.extend((b'--' + boundary + b'--', b''))

        body = b'\r\n'.join(parts)
        ct = b'multipart/form-data; boundary=' + boundary
        headers = {
            'Content-type': ct,
            'Content-length': str(len(body))
        }
        return Request(self.url, body, headers)

    def search(self, terms, operator=None):
        if isinstance(terms, string_types):
            terms = {'name': terms}
        if self.rpc_proxy is None:
            self.rpc_proxy = ServerProxy(self.url, timeout=3.0)
        return self.rpc_proxy.search(terms, operator or 'and')
site-packages/pip/_vendor/distlib/database.py000064400000137762151733463540015313 0ustar00# -*- coding: utf-8 -*-
#
# Copyright (C) 2012-2013 The Python Software Foundation.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
"""PEP 376 implementation."""

from __future__ import unicode_literals

import base64
import codecs
import contextlib
import hashlib
import logging
import os
import posixpath
import sys
import zipimport

from . import DistlibException, resources
from .compat import StringIO
from .version import get_scheme, UnsupportedVersionError
from .metadata import Metadata, METADATA_FILENAME
from .util import (parse_requirement, cached_property, parse_name_and_version,
                   read_exports, write_exports, CSVReader, CSVWriter)


__all__ = ['Distribution', 'BaseInstalledDistribution',
           'InstalledDistribution', 'EggInfoDistribution',
           'DistributionPath']


logger = logging.getLogger(__name__)

EXPORTS_FILENAME = 'pydist-exports.json'
COMMANDS_FILENAME = 'pydist-commands.json'

DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED',
              'RESOURCES', EXPORTS_FILENAME, 'SHARED')

DISTINFO_EXT = '.dist-info'


class _Cache(object):
    """
    A simple cache mapping names and .dist-info paths to distributions
    """
    def __init__(self):
        """
        Initialise an instance. There is normally one for each DistributionPath.
        """
        self.name = {}
        self.path = {}
        self.generated = False

    def clear(self):
        """
        Clear the cache, setting it to its initial state.
        """
        self.name.clear()
        self.path.clear()
        self.generated = False

    def add(self, dist):
        """
        Add a distribution to the cache.
        :param dist: The distribution to add.
        """
        if dist.path not in self.path:
            self.path[dist.path] = dist
            self.name.setdefault(dist.key, []).append(dist)


class DistributionPath(object):
    """
    Represents a set of distributions installed on a path (typically sys.path).
    """
    def __init__(self, path=None, include_egg=False):
        """
        Create an instance from a path, optionally including legacy (distutils/
        setuptools/distribute) distributions.
        :param path: The path to use, as a list of directories. If not specified,
                     sys.path is used.
        :param include_egg: If True, this instance will look for and return legacy
                            distributions as well as those based on PEP 376.
        """
        if path is None:
            path = sys.path
        self.path = path
        self._include_dist = True
        self._include_egg = include_egg

        self._cache = _Cache()
        self._cache_egg = _Cache()
        self._cache_enabled = True
        self._scheme = get_scheme('default')

    def _get_cache_enabled(self):
        return self._cache_enabled

    def _set_cache_enabled(self, value):
        self._cache_enabled = value

    cache_enabled = property(_get_cache_enabled, _set_cache_enabled)

    def clear_cache(self):
        """
        Clears the internal cache.
        """
        self._cache.clear()
        self._cache_egg.clear()


    def _yield_distributions(self):
        """
        Yield .dist-info and/or .egg(-info) distributions.
        """
        # We need to check if we've seen some resources already, because on
        # some Linux systems (e.g. some Debian/Ubuntu variants) there are
        # symlinks which alias other files in the environment.
        seen = set()
        for path in self.path:
            finder = resources.finder_for_path(path)
            if finder is None:
                continue
            r = finder.find('')
            if not r or not r.is_container:
                continue
            rset = sorted(r.resources)
            for entry in rset:
                r = finder.find(entry)
                if not r or r.path in seen:
                    continue
                if self._include_dist and entry.endswith(DISTINFO_EXT):
                    metadata_path = posixpath.join(entry, METADATA_FILENAME)
                    pydist = finder.find(metadata_path)
                    if not pydist:
                        continue

                    metadata = Metadata(fileobj=pydist.as_stream(),
                                        scheme='legacy')
                    logger.debug('Found %s', r.path)
                    seen.add(r.path)
                    yield new_dist_class(r.path, metadata=metadata,
                                         env=self)
                elif self._include_egg and entry.endswith(('.egg-info',
                                                          '.egg')):
                    logger.debug('Found %s', r.path)
                    seen.add(r.path)
                    yield old_dist_class(r.path, self)

    def _generate_cache(self):
        """
        Scan the path for distributions and populate the cache with
        those that are found.
        """
        gen_dist = not self._cache.generated
        gen_egg = self._include_egg and not self._cache_egg.generated
        if gen_dist or gen_egg:
            for dist in self._yield_distributions():
                if isinstance(dist, InstalledDistribution):
                    self._cache.add(dist)
                else:
                    self._cache_egg.add(dist)

            if gen_dist:
                self._cache.generated = True
            if gen_egg:
                self._cache_egg.generated = True

    @classmethod
    def distinfo_dirname(cls, name, version):
        """
        The *name* and *version* parameters are converted into their
        filename-escaped form, i.e. any ``'-'`` characters are replaced
        with ``'_'`` other than the one in ``'dist-info'`` and the one
        separating the name from the version number.

        :parameter name: is converted to a standard distribution name by replacing
                         any runs of non- alphanumeric characters with a single
                         ``'-'``.
        :type name: string
        :parameter version: is converted to a standard version string. Spaces
                            become dots, and all other non-alphanumeric characters
                            (except dots) become dashes, with runs of multiple
                            dashes condensed to a single dash.
        :type version: string
        :returns: directory name
        :rtype: string"""
        name = name.replace('-', '_')
        return '-'.join([name, version]) + DISTINFO_EXT

    def get_distributions(self):
        """
        Provides an iterator that looks for distributions and returns
        :class:`InstalledDistribution` or
        :class:`EggInfoDistribution` instances for each one of them.

        :rtype: iterator of :class:`InstalledDistribution` and
                :class:`EggInfoDistribution` instances
        """
        if not self._cache_enabled:
            for dist in self._yield_distributions():
                yield dist
        else:
            self._generate_cache()

            for dist in self._cache.path.values():
                yield dist

            if self._include_egg:
                for dist in self._cache_egg.path.values():
                    yield dist

    def get_distribution(self, name):
        """
        Looks for a named distribution on the path.

        This function only returns the first result found, as no more than one
        value is expected. If nothing is found, ``None`` is returned.

        :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution`
                or ``None``
        """
        result = None
        name = name.lower()
        if not self._cache_enabled:
            for dist in self._yield_distributions():
                if dist.key == name:
                    result = dist
                    break
        else:
            self._generate_cache()

            if name in self._cache.name:
                result = self._cache.name[name][0]
            elif self._include_egg and name in self._cache_egg.name:
                result = self._cache_egg.name[name][0]
        return result

    def provides_distribution(self, name, version=None):
        """
        Iterates over all distributions to find which distributions provide *name*.
        If a *version* is provided, it will be used to filter the results.

        This function only returns the first result found, since no more than
        one values are expected. If the directory is not found, returns ``None``.

        :parameter version: a version specifier that indicates the version
                            required, conforming to the format in ``PEP-345``

        :type name: string
        :type version: string
        """
        matcher = None
        if not version is None:
            try:
                matcher = self._scheme.matcher('%s (%s)' % (name, version))
            except ValueError:
                raise DistlibException('invalid name or version: %r, %r' %
                                      (name, version))

        for dist in self.get_distributions():
            provided = dist.provides

            for p in provided:
                p_name, p_ver = parse_name_and_version(p)
                if matcher is None:
                    if p_name == name:
                        yield dist
                        break
                else:
                    if p_name == name and matcher.match(p_ver):
                        yield dist
                        break

    def get_file_path(self, name, relative_path):
        """
        Return the path to a resource file.
        """
        dist = self.get_distribution(name)
        if dist is None:
            raise LookupError('no distribution named %r found' % name)
        return dist.get_resource_path(relative_path)

    def get_exported_entries(self, category, name=None):
        """
        Return all of the exported entries in a particular category.

        :param category: The category to search for entries.
        :param name: If specified, only entries with that name are returned.
        """
        for dist in self.get_distributions():
            r = dist.exports
            if category in r:
                d = r[category]
                if name is not None:
                    if name in d:
                        yield d[name]
                else:
                    for v in d.values():
                        yield v


class Distribution(object):
    """
    A base class for distributions, whether installed or from indexes.
    Either way, it must have some metadata, so that's all that's needed
    for construction.
    """

    build_time_dependency = False
    """
    Set to True if it's known to be only a build-time dependency (i.e.
    not needed after installation).
    """

    requested = False
    """A boolean that indicates whether the ``REQUESTED`` metadata file is
    present (in other words, whether the package was installed by user
    request or it was installed as a dependency)."""

    def __init__(self, metadata):
        """
        Initialise an instance.
        :param metadata: The instance of :class:`Metadata` describing this
        distribution.
        """
        self.metadata = metadata
        self.name = metadata.name
        self.key = self.name.lower()    # for case-insensitive comparisons
        self.version = metadata.version
        self.locator = None
        self.digest = None
        self.extras = None      # additional features requested
        self.context = None     # environment marker overrides

    @property
    def source_url(self):
        """
        The source archive download URL for this distribution.
        """
        return self.metadata.source_url

    download_url = source_url   # Backward compatibility

    @property
    def name_and_version(self):
        """
        A utility property which displays the name and version in parentheses.
        """
        return '%s (%s)' % (self.name, self.version)

    @property
    def provides(self):
        """
        A set of distribution names and versions provided by this distribution.
        :return: A set of "name (version)" strings.
        """
        plist = self.metadata.provides
        s = '%s (%s)' % (self.name, self.version)
        if s not in plist:
            plist.append(s)
        return plist

    def _get_requirements(self, req_attr):
        reqts = getattr(self.metadata, req_attr)
        return set(self.metadata.get_requirements(reqts, extras=self.extras,
                                                  env=self.context))

    @property
    def run_requires(self):
        return self._get_requirements('run_requires')

    @property
    def meta_requires(self):
        return self._get_requirements('meta_requires')

    @property
    def build_requires(self):
        return self._get_requirements('build_requires')

    @property
    def test_requires(self):
        return self._get_requirements('test_requires')

    @property
    def dev_requires(self):
        return self._get_requirements('dev_requires')

    def matches_requirement(self, req):
        """
        Say if this instance matches (fulfills) a requirement.
        :param req: The requirement to match.
        :rtype req: str
        :return: True if it matches, else False.
        """
        # Requirement may contain extras - parse to lose those
        # from what's passed to the matcher
        r = parse_requirement(req)
        scheme = get_scheme(self.metadata.scheme)
        try:
            matcher = scheme.matcher(r.requirement)
        except UnsupportedVersionError:
            # XXX compat-mode if cannot read the version
            logger.warning('could not read version %r - using name only',
                           req)
            name = req.split()[0]
            matcher = scheme.matcher(name)

        name = matcher.key   # case-insensitive

        result = False
        for p in self.provides:
            p_name, p_ver = parse_name_and_version(p)
            if p_name != name:
                continue
            try:
                result = matcher.match(p_ver)
                break
            except UnsupportedVersionError:
                pass
        return result

    def __repr__(self):
        """
        Return a textual representation of this instance,
        """
        if self.source_url:
            suffix = ' [%s]' % self.source_url
        else:
            suffix = ''
        return '<Distribution %s (%s)%s>' % (self.name, self.version, suffix)

    def __eq__(self, other):
        """
        See if this distribution is the same as another.
        :param other: The distribution to compare with. To be equal to one
                      another. distributions must have the same type, name,
                      version and source_url.
        :return: True if it is the same, else False.
        """
        if type(other) is not type(self):
            result = False
        else:
            result = (self.name == other.name and
                      self.version == other.version and
                      self.source_url == other.source_url)
        return result

    def __hash__(self):
        """
        Compute hash in a way which matches the equality test.
        """
        return hash(self.name) + hash(self.version) + hash(self.source_url)


class BaseInstalledDistribution(Distribution):
    """
    This is the base class for installed distributions (whether PEP 376 or
    legacy).
    """

    hasher = None

    def __init__(self, metadata, path, env=None):
        """
        Initialise an instance.
        :param metadata: An instance of :class:`Metadata` which describes the
                         distribution. This will normally have been initialised
                         from a metadata file in the ``path``.
        :param path:     The path of the ``.dist-info`` or ``.egg-info``
                         directory for the distribution.
        :param env:      This is normally the :class:`DistributionPath`
                         instance where this distribution was found.
        """
        super(BaseInstalledDistribution, self).__init__(metadata)
        self.path = path
        self.dist_path = env

    def get_hash(self, data, hasher=None):
        """
        Get the hash of some data, using a particular hash algorithm, if
        specified.

        :param data: The data to be hashed.
        :type data: bytes
        :param hasher: The name of a hash implementation, supported by hashlib,
                       or ``None``. Examples of valid values are ``'sha1'``,
                       ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and
                       ``'sha512'``. If no hasher is specified, the ``hasher``
                       attribute of the :class:`InstalledDistribution` instance
                       is used. If the hasher is determined to be ``None``, MD5
                       is used as the hashing algorithm.
        :returns: The hash of the data. If a hasher was explicitly specified,
                  the returned hash will be prefixed with the specified hasher
                  followed by '='.
        :rtype: str
        """
        if hasher is None:
            hasher = self.hasher
        if hasher is None:
            hasher = hashlib.md5
            prefix = ''
        else:
            hasher = getattr(hashlib, hasher)
            prefix = '%s=' % self.hasher
        digest = hasher(data).digest()
        digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii')
        return '%s%s' % (prefix, digest)


class InstalledDistribution(BaseInstalledDistribution):
    """
    Created with the *path* of the ``.dist-info`` directory provided to the
    constructor. It reads the metadata contained in ``pydist.json`` when it is
    instantiated., or uses a passed in Metadata instance (useful for when
    dry-run mode is being used).
    """

    hasher = 'sha256'

    def __init__(self, path, metadata=None, env=None):
        self.finder = finder = resources.finder_for_path(path)
        if finder is None:
            import pdb; pdb.set_trace ()
        if env and env._cache_enabled and path in env._cache.path:
            metadata = env._cache.path[path].metadata
        elif metadata is None:
            r = finder.find(METADATA_FILENAME)
            # Temporary - for legacy support
            if r is None:
                r = finder.find('METADATA')
            if r is None:
                raise ValueError('no %s found in %s' % (METADATA_FILENAME,
                                                        path))
            with contextlib.closing(r.as_stream()) as stream:
                metadata = Metadata(fileobj=stream, scheme='legacy')

        super(InstalledDistribution, self).__init__(metadata, path, env)

        if env and env._cache_enabled:
            env._cache.add(self)

        try:
            r = finder.find('REQUESTED')
        except AttributeError:
            import pdb; pdb.set_trace ()
        self.requested = r is not None

    def __repr__(self):
        return '<InstalledDistribution %r %s at %r>' % (
            self.name, self.version, self.path)

    def __str__(self):
        return "%s %s" % (self.name, self.version)

    def _get_records(self):
        """
        Get the list of installed files for the distribution
        :return: A list of tuples of path, hash and size. Note that hash and
                 size might be ``None`` for some entries. The path is exactly
                 as stored in the file (which is as in PEP 376).
        """
        results = []
        r = self.get_distinfo_resource('RECORD')
        with contextlib.closing(r.as_stream()) as stream:
            with CSVReader(stream=stream) as record_reader:
                # Base location is parent dir of .dist-info dir
                #base_location = os.path.dirname(self.path)
                #base_location = os.path.abspath(base_location)
                for row in record_reader:
                    missing = [None for i in range(len(row), 3)]
                    path, checksum, size = row + missing
                    #if not os.path.isabs(path):
                    #    path = path.replace('/', os.sep)
                    #    path = os.path.join(base_location, path)
                    results.append((path, checksum, size))
        return results

    @cached_property
    def exports(self):
        """
        Return the information exported by this distribution.
        :return: A dictionary of exports, mapping an export category to a dict
                 of :class:`ExportEntry` instances describing the individual
                 export entries, and keyed by name.
        """
        result = {}
        r = self.get_distinfo_resource(EXPORTS_FILENAME)
        if r:
            result = self.read_exports()
        return result

    def read_exports(self):
        """
        Read exports data from a file in .ini format.

        :return: A dictionary of exports, mapping an export category to a list
                 of :class:`ExportEntry` instances describing the individual
                 export entries.
        """
        result = {}
        r = self.get_distinfo_resource(EXPORTS_FILENAME)
        if r:
            with contextlib.closing(r.as_stream()) as stream:
                result = read_exports(stream)
        return result

    def write_exports(self, exports):
        """
        Write a dictionary of exports to a file in .ini format.
        :param exports: A dictionary of exports, mapping an export category to
                        a list of :class:`ExportEntry` instances describing the
                        individual export entries.
        """
        rf = self.get_distinfo_file(EXPORTS_FILENAME)
        with open(rf, 'w') as f:
            write_exports(exports, f)

    def get_resource_path(self, relative_path):
        """
        NOTE: This API may change in the future.

        Return the absolute path to a resource file with the given relative
        path.

        :param relative_path: The path, relative to .dist-info, of the resource
                              of interest.
        :return: The absolute path where the resource is to be found.
        """
        r = self.get_distinfo_resource('RESOURCES')
        with contextlib.closing(r.as_stream()) as stream:
            with CSVReader(stream=stream) as resources_reader:
                for relative, destination in resources_reader:
                    if relative == relative_path:
                        return destination
        raise KeyError('no resource file with relative path %r '
                       'is installed' % relative_path)

    def list_installed_files(self):
        """
        Iterates over the ``RECORD`` entries and returns a tuple
        ``(path, hash, size)`` for each line.

        :returns: iterator of (path, hash, size)
        """
        for result in self._get_records():
            yield result

    def write_installed_files(self, paths, prefix, dry_run=False):
        """
        Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any
        existing ``RECORD`` file is silently overwritten.

        prefix is used to determine when to write absolute paths.
        """
        prefix = os.path.join(prefix, '')
        base = os.path.dirname(self.path)
        base_under_prefix = base.startswith(prefix)
        base = os.path.join(base, '')
        record_path = self.get_distinfo_file('RECORD')
        logger.info('creating %s', record_path)
        if dry_run:
            return None
        with CSVWriter(record_path) as writer:
            for path in paths:
                if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')):
                    # do not put size and hash, as in PEP-376
                    hash_value = size = ''
                else:
                    size = '%d' % os.path.getsize(path)
                    with open(path, 'rb') as fp:
                        hash_value = self.get_hash(fp.read())
                if path.startswith(base) or (base_under_prefix and
                                             path.startswith(prefix)):
                    path = os.path.relpath(path, base)
                writer.writerow((path, hash_value, size))

            # add the RECORD file itself
            if record_path.startswith(base):
                record_path = os.path.relpath(record_path, base)
            writer.writerow((record_path, '', ''))
        return record_path

    def check_installed_files(self):
        """
        Checks that the hashes and sizes of the files in ``RECORD`` are
        matched by the files themselves. Returns a (possibly empty) list of
        mismatches. Each entry in the mismatch list will be a tuple consisting
        of the path, 'exists', 'size' or 'hash' according to what didn't match
        (existence is checked first, then size, then hash), the expected
        value and the actual value.
        """
        mismatches = []
        base = os.path.dirname(self.path)
        record_path = self.get_distinfo_file('RECORD')
        for path, hash_value, size in self.list_installed_files():
            if not os.path.isabs(path):
                path = os.path.join(base, path)
            if path == record_path:
                continue
            if not os.path.exists(path):
                mismatches.append((path, 'exists', True, False))
            elif os.path.isfile(path):
                actual_size = str(os.path.getsize(path))
                if size and actual_size != size:
                    mismatches.append((path, 'size', size, actual_size))
                elif hash_value:
                    if '=' in hash_value:
                        hasher = hash_value.split('=', 1)[0]
                    else:
                        hasher = None

                    with open(path, 'rb') as f:
                        actual_hash = self.get_hash(f.read(), hasher)
                        if actual_hash != hash_value:
                            mismatches.append((path, 'hash', hash_value, actual_hash))
        return mismatches

    @cached_property
    def shared_locations(self):
        """
        A dictionary of shared locations whose keys are in the set 'prefix',
        'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'.
        The corresponding value is the absolute path of that category for
        this distribution, and takes into account any paths selected by the
        user at installation time (e.g. via command-line arguments). In the
        case of the 'namespace' key, this would be a list of absolute paths
        for the roots of namespace packages in this distribution.

        The first time this property is accessed, the relevant information is
        read from the SHARED file in the .dist-info directory.
        """
        result = {}
        shared_path = os.path.join(self.path, 'SHARED')
        if os.path.isfile(shared_path):
            with codecs.open(shared_path, 'r', encoding='utf-8') as f:
                lines = f.read().splitlines()
            for line in lines:
                key, value = line.split('=', 1)
                if key == 'namespace':
                    result.setdefault(key, []).append(value)
                else:
                    result[key] = value
        return result

    def write_shared_locations(self, paths, dry_run=False):
        """
        Write shared location information to the SHARED file in .dist-info.
        :param paths: A dictionary as described in the documentation for
        :meth:`shared_locations`.
        :param dry_run: If True, the action is logged but no file is actually
                        written.
        :return: The path of the file written to.
        """
        shared_path = os.path.join(self.path, 'SHARED')
        logger.info('creating %s', shared_path)
        if dry_run:
            return None
        lines = []
        for key in ('prefix', 'lib', 'headers', 'scripts', 'data'):
            path = paths[key]
            if os.path.isdir(paths[key]):
                lines.append('%s=%s' % (key,  path))
        for ns in paths.get('namespace', ()):
            lines.append('namespace=%s' % ns)

        with codecs.open(shared_path, 'w', encoding='utf-8') as f:
            f.write('\n'.join(lines))
        return shared_path

    def get_distinfo_resource(self, path):
        if path not in DIST_FILES:
            raise DistlibException('invalid path for a dist-info file: '
                                   '%r at %r' % (path, self.path))
        finder = resources.finder_for_path(self.path)
        if finder is None:
            raise DistlibException('Unable to get a finder for %s' % self.path)
        return finder.find(path)

    def get_distinfo_file(self, path):
        """
        Returns a path located under the ``.dist-info`` directory. Returns a
        string representing the path.

        :parameter path: a ``'/'``-separated path relative to the
                         ``.dist-info`` directory or an absolute path;
                         If *path* is an absolute path and doesn't start
                         with the ``.dist-info`` directory path,
                         a :class:`DistlibException` is raised
        :type path: str
        :rtype: str
        """
        # Check if it is an absolute path  # XXX use relpath, add tests
        if path.find(os.sep) >= 0:
            # it's an absolute path?
            distinfo_dirname, path = path.split(os.sep)[-2:]
            if distinfo_dirname != self.path.split(os.sep)[-1]:
                raise DistlibException(
                    'dist-info file %r does not belong to the %r %s '
                    'distribution' % (path, self.name, self.version))

        # The file must be relative
        if path not in DIST_FILES:
            raise DistlibException('invalid path for a dist-info file: '
                                   '%r at %r' % (path, self.path))

        return os.path.join(self.path, path)

    def list_distinfo_files(self):
        """
        Iterates over the ``RECORD`` entries and returns paths for each line if
        the path is pointing to a file located in the ``.dist-info`` directory
        or one of its subdirectories.

        :returns: iterator of paths
        """
        base = os.path.dirname(self.path)
        for path, checksum, size in self._get_records():
            # XXX add separator or use real relpath algo
            if not os.path.isabs(path):
                path = os.path.join(base, path)
            if path.startswith(self.path):
                yield path

    def __eq__(self, other):
        return (isinstance(other, InstalledDistribution) and
                self.path == other.path)

    # See http://docs.python.org/reference/datamodel#object.__hash__
    __hash__ = object.__hash__


class EggInfoDistribution(BaseInstalledDistribution):
    """Created with the *path* of the ``.egg-info`` directory or file provided
    to the constructor. It reads the metadata contained in the file itself, or
    if the given path happens to be a directory, the metadata is read from the
    file ``PKG-INFO`` under that directory."""

    requested = True    # as we have no way of knowing, assume it was
    shared_locations = {}

    def __init__(self, path, env=None):
        def set_name_and_version(s, n, v):
            s.name = n
            s.key = n.lower()   # for case-insensitive comparisons
            s.version = v

        self.path = path
        self.dist_path = env
        if env and env._cache_enabled and path in env._cache_egg.path:
            metadata = env._cache_egg.path[path].metadata
            set_name_and_version(self, metadata.name, metadata.version)
        else:
            metadata = self._get_metadata(path)

            # Need to be set before caching
            set_name_and_version(self, metadata.name, metadata.version)

            if env and env._cache_enabled:
                env._cache_egg.add(self)
        super(EggInfoDistribution, self).__init__(metadata, path, env)

    def _get_metadata(self, path):
        requires = None

        def parse_requires_data(data):
            """Create a list of dependencies from a requires.txt file.

            *data*: the contents of a setuptools-produced requires.txt file.
            """
            reqs = []
            lines = data.splitlines()
            for line in lines:
                line = line.strip()
                if line.startswith('['):
                    logger.warning('Unexpected line: quitting requirement scan: %r',
                                   line)
                    break
                r = parse_requirement(line)
                if not r:
                    logger.warning('Not recognised as a requirement: %r', line)
                    continue
                if r.extras:
                    logger.warning('extra requirements in requires.txt are '
                                   'not supported')
                if not r.constraints:
                    reqs.append(r.name)
                else:
                    cons = ', '.join('%s%s' % c for c in r.constraints)
                    reqs.append('%s (%s)' % (r.name, cons))
            return reqs

        def parse_requires_path(req_path):
            """Create a list of dependencies from a requires.txt file.

            *req_path*: the path to a setuptools-produced requires.txt file.
            """

            reqs = []
            try:
                with codecs.open(req_path, 'r', 'utf-8') as fp:
                    reqs = parse_requires_data(fp.read())
            except IOError:
                pass
            return reqs

        if path.endswith('.egg'):
            if os.path.isdir(path):
                meta_path = os.path.join(path, 'EGG-INFO', 'PKG-INFO')
                metadata = Metadata(path=meta_path, scheme='legacy')
                req_path = os.path.join(path, 'EGG-INFO', 'requires.txt')
                requires = parse_requires_path(req_path)
            else:
                # FIXME handle the case where zipfile is not available
                zipf = zipimport.zipimporter(path)
                fileobj = StringIO(
                    zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8'))
                metadata = Metadata(fileobj=fileobj, scheme='legacy')
                try:
                    data = zipf.get_data('EGG-INFO/requires.txt')
                    requires = parse_requires_data(data.decode('utf-8'))
                except IOError:
                    requires = None
        elif path.endswith('.egg-info'):
            if os.path.isdir(path):
                path = os.path.join(path, 'PKG-INFO')
                req_path = os.path.join(path, 'requires.txt')
                requires = parse_requires_path(req_path)
            metadata = Metadata(path=path, scheme='legacy')
        else:
            raise DistlibException('path must end with .egg-info or .egg, '
                                   'got %r' % path)

        if requires:
            metadata.add_requirements(requires)
        return metadata

    def __repr__(self):
        return '<EggInfoDistribution %r %s at %r>' % (
            self.name, self.version, self.path)

    def __str__(self):
        return "%s %s" % (self.name, self.version)

    def check_installed_files(self):
        """
        Checks that the hashes and sizes of the files in ``RECORD`` are
        matched by the files themselves. Returns a (possibly empty) list of
        mismatches. Each entry in the mismatch list will be a tuple consisting
        of the path, 'exists', 'size' or 'hash' according to what didn't match
        (existence is checked first, then size, then hash), the expected
        value and the actual value.
        """
        mismatches = []
        record_path = os.path.join(self.path, 'installed-files.txt')
        if os.path.exists(record_path):
            for path, _, _ in self.list_installed_files():
                if path == record_path:
                    continue
                if not os.path.exists(path):
                    mismatches.append((path, 'exists', True, False))
        return mismatches

    def list_installed_files(self):
        """
        Iterates over the ``installed-files.txt`` entries and returns a tuple
        ``(path, hash, size)`` for each line.

        :returns: a list of (path, hash, size)
        """

        def _md5(path):
            f = open(path, 'rb')
            try:
                content = f.read()
            finally:
                f.close()
            return hashlib.md5(content).hexdigest()

        def _size(path):
            return os.stat(path).st_size

        record_path = os.path.join(self.path, 'installed-files.txt')
        result = []
        if os.path.exists(record_path):
            with codecs.open(record_path, 'r', encoding='utf-8') as f:
                for line in f:
                    line = line.strip()
                    p = os.path.normpath(os.path.join(self.path, line))
                    # "./" is present as a marker between installed files
                    # and installation metadata files
                    if not os.path.exists(p):
                        logger.warning('Non-existent file: %s', p)
                        if p.endswith(('.pyc', '.pyo')):
                            continue
                        #otherwise fall through and fail
                    if not os.path.isdir(p):
                        result.append((p, _md5(p), _size(p)))
            result.append((record_path, None, None))
        return result

    def list_distinfo_files(self, absolute=False):
        """
        Iterates over the ``installed-files.txt`` entries and returns paths for
        each line if the path is pointing to a file located in the
        ``.egg-info`` directory or one of its subdirectories.

        :parameter absolute: If *absolute* is ``True``, each returned path is
                          transformed into a local absolute path. Otherwise the
                          raw value from ``installed-files.txt`` is returned.
        :type absolute: boolean
        :returns: iterator of paths
        """
        record_path = os.path.join(self.path, 'installed-files.txt')
        skip = True
        with codecs.open(record_path, 'r', encoding='utf-8') as f:
            for line in f:
                line = line.strip()
                if line == './':
                    skip = False
                    continue
                if not skip:
                    p = os.path.normpath(os.path.join(self.path, line))
                    if p.startswith(self.path):
                        if absolute:
                            yield p
                        else:
                            yield line

    def __eq__(self, other):
        return (isinstance(other, EggInfoDistribution) and
                self.path == other.path)

    # See http://docs.python.org/reference/datamodel#object.__hash__
    __hash__ = object.__hash__

new_dist_class = InstalledDistribution
old_dist_class = EggInfoDistribution


class DependencyGraph(object):
    """
    Represents a dependency graph between distributions.

    The dependency relationships are stored in an ``adjacency_list`` that maps
    distributions to a list of ``(other, label)`` tuples where  ``other``
    is a distribution and the edge is labeled with ``label`` (i.e. the version
    specifier, if such was provided). Also, for more efficient traversal, for
    every distribution ``x``, a list of predecessors is kept in
    ``reverse_list[x]``. An edge from distribution ``a`` to
    distribution ``b`` means that ``a`` depends on ``b``. If any missing
    dependencies are found, they are stored in ``missing``, which is a
    dictionary that maps distributions to a list of requirements that were not
    provided by any other distributions.
    """

    def __init__(self):
        self.adjacency_list = {}
        self.reverse_list = {}
        self.missing = {}

    def add_distribution(self, distribution):
        """Add the *distribution* to the graph.

        :type distribution: :class:`distutils2.database.InstalledDistribution`
                            or :class:`distutils2.database.EggInfoDistribution`
        """
        self.adjacency_list[distribution] = []
        self.reverse_list[distribution] = []
        #self.missing[distribution] = []

    def add_edge(self, x, y, label=None):
        """Add an edge from distribution *x* to distribution *y* with the given
        *label*.

        :type x: :class:`distutils2.database.InstalledDistribution` or
                 :class:`distutils2.database.EggInfoDistribution`
        :type y: :class:`distutils2.database.InstalledDistribution` or
                 :class:`distutils2.database.EggInfoDistribution`
        :type label: ``str`` or ``None``
        """
        self.adjacency_list[x].append((y, label))
        # multiple edges are allowed, so be careful
        if x not in self.reverse_list[y]:
            self.reverse_list[y].append(x)

    def add_missing(self, distribution, requirement):
        """
        Add a missing *requirement* for the given *distribution*.

        :type distribution: :class:`distutils2.database.InstalledDistribution`
                            or :class:`distutils2.database.EggInfoDistribution`
        :type requirement: ``str``
        """
        logger.debug('%s missing %r', distribution, requirement)
        self.missing.setdefault(distribution, []).append(requirement)

    def _repr_dist(self, dist):
        return '%s %s' % (dist.name, dist.version)

    def repr_node(self, dist, level=1):
        """Prints only a subgraph"""
        output = [self._repr_dist(dist)]
        for other, label in self.adjacency_list[dist]:
            dist = self._repr_dist(other)
            if label is not None:
                dist = '%s [%s]' % (dist, label)
            output.append('    ' * level + str(dist))
            suboutput = self.repr_node(other, level + 1)
            subs = suboutput.split('\n')
            output.extend(subs[1:])
        return '\n'.join(output)

    def to_dot(self, f, skip_disconnected=True):
        """Writes a DOT output for the graph to the provided file *f*.

        If *skip_disconnected* is set to ``True``, then all distributions
        that are not dependent on any other distribution are skipped.

        :type f: has to support ``file``-like operations
        :type skip_disconnected: ``bool``
        """
        disconnected = []

        f.write("digraph dependencies {\n")
        for dist, adjs in self.adjacency_list.items():
            if len(adjs) == 0 and not skip_disconnected:
                disconnected.append(dist)
            for other, label in adjs:
                if not label is None:
                    f.write('"%s" -> "%s" [label="%s"]\n' %
                            (dist.name, other.name, label))
                else:
                    f.write('"%s" -> "%s"\n' % (dist.name, other.name))
        if not skip_disconnected and len(disconnected) > 0:
            f.write('subgraph disconnected {\n')
            f.write('label = "Disconnected"\n')
            f.write('bgcolor = red\n')

            for dist in disconnected:
                f.write('"%s"' % dist.name)
                f.write('\n')
            f.write('}\n')
        f.write('}\n')

    def topological_sort(self):
        """
        Perform a topological sort of the graph.
        :return: A tuple, the first element of which is a topologically sorted
                 list of distributions, and the second element of which is a
                 list of distributions that cannot be sorted because they have
                 circular dependencies and so form a cycle.
        """
        result = []
        # Make a shallow copy of the adjacency list
        alist = {}
        for k, v in self.adjacency_list.items():
            alist[k] = v[:]
        while True:
            # See what we can remove in this run
            to_remove = []
            for k, v in list(alist.items())[:]:
                if not v:
                    to_remove.append(k)
                    del alist[k]
            if not to_remove:
                # What's left in alist (if anything) is a cycle.
                break
            # Remove from the adjacency list of others
            for k, v in alist.items():
                alist[k] = [(d, r) for d, r in v if d not in to_remove]
            logger.debug('Moving to result: %s',
                         ['%s (%s)' % (d.name, d.version) for d in to_remove])
            result.extend(to_remove)
        return result, list(alist.keys())

    def __repr__(self):
        """Representation of the graph"""
        output = []
        for dist, adjs in self.adjacency_list.items():
            output.append(self.repr_node(dist))
        return '\n'.join(output)


def make_graph(dists, scheme='default'):
    """Makes a dependency graph from the given distributions.

    :parameter dists: a list of distributions
    :type dists: list of :class:`distutils2.database.InstalledDistribution` and
                 :class:`distutils2.database.EggInfoDistribution` instances
    :rtype: a :class:`DependencyGraph` instance
    """
    scheme = get_scheme(scheme)
    graph = DependencyGraph()
    provided = {}  # maps names to lists of (version, dist) tuples

    # first, build the graph and find out what's provided
    for dist in dists:
        graph.add_distribution(dist)

        for p in dist.provides:
            name, version = parse_name_and_version(p)
            logger.debug('Add to provided: %s, %s, %s', name, version, dist)
            provided.setdefault(name, []).append((version, dist))

    # now make the edges
    for dist in dists:
        requires = (dist.run_requires | dist.meta_requires |
                    dist.build_requires | dist.dev_requires)
        for req in requires:
            try:
                matcher = scheme.matcher(req)
            except UnsupportedVersionError:
                # XXX compat-mode if cannot read the version
                logger.warning('could not read version %r - using name only',
                               req)
                name = req.split()[0]
                matcher = scheme.matcher(name)

            name = matcher.key   # case-insensitive

            matched = False
            if name in provided:
                for version, provider in provided[name]:
                    try:
                        match = matcher.match(version)
                    except UnsupportedVersionError:
                        match = False

                    if match:
                        graph.add_edge(dist, provider, req)
                        matched = True
                        break
            if not matched:
                graph.add_missing(dist, req)
    return graph


def get_dependent_dists(dists, dist):
    """Recursively generate a list of distributions from *dists* that are
    dependent on *dist*.

    :param dists: a list of distributions
    :param dist: a distribution, member of *dists* for which we are interested
    """
    if dist not in dists:
        raise DistlibException('given distribution %r is not a member '
                               'of the list' % dist.name)
    graph = make_graph(dists)

    dep = [dist]  # dependent distributions
    todo = graph.reverse_list[dist]  # list of nodes we should inspect

    while todo:
        d = todo.pop()
        dep.append(d)
        for succ in graph.reverse_list[d]:
            if succ not in dep:
                todo.append(succ)

    dep.pop(0)  # remove dist from dep, was there to prevent infinite loops
    return dep


def get_required_dists(dists, dist):
    """Recursively generate a list of distributions from *dists* that are
    required by *dist*.

    :param dists: a list of distributions
    :param dist: a distribution, member of *dists* for which we are interested
    """
    if dist not in dists:
        raise DistlibException('given distribution %r is not a member '
                               'of the list' % dist.name)
    graph = make_graph(dists)

    req = []  # required distributions
    todo = graph.adjacency_list[dist]  # list of nodes we should inspect

    while todo:
        d = todo.pop()[0]
        req.append(d)
        for pred in graph.adjacency_list[d]:
            if pred not in req:
                todo.append(pred)

    return req


def make_dist(name, version, **kwargs):
    """
    A convenience method for making a dist given just a name and version.
    """
    summary = kwargs.pop('summary', 'Placeholder for summary')
    md = Metadata(**kwargs)
    md.name = name
    md.version = version
    md.summary = summary or 'Plaeholder for summary'
    return Distribution(md)
site-packages/pip/_vendor/distlib/metadata.py000064400000107717151733463540015324 0ustar00# -*- coding: utf-8 -*-
#
# Copyright (C) 2012 The Python Software Foundation.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
"""Implementation of the Metadata for Python packages PEPs.

Supports all metadata formats (1.0, 1.1, 1.2, and 2.0 experimental).
"""
from __future__ import unicode_literals

import codecs
from email import message_from_file
import json
import logging
import re


from . import DistlibException, __version__
from .compat import StringIO, string_types, text_type
from .markers import interpret
from .util import extract_by_key, get_extras
from .version import get_scheme, PEP426_VERSION_RE

logger = logging.getLogger(__name__)


class MetadataMissingError(DistlibException):
    """A required metadata is missing"""


class MetadataConflictError(DistlibException):
    """Attempt to read or write metadata fields that are conflictual."""


class MetadataUnrecognizedVersionError(DistlibException):
    """Unknown metadata version number."""


class MetadataInvalidError(DistlibException):
    """A metadata value is invalid"""

# public API of this module
__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION']

# Encoding used for the PKG-INFO files
PKG_INFO_ENCODING = 'utf-8'

# preferred version. Hopefully will be changed
# to 1.2 once PEP 345 is supported everywhere
PKG_INFO_PREFERRED_VERSION = '1.1'

_LINE_PREFIX = re.compile('\n       \|')
_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform',
               'Summary', 'Description',
               'Keywords', 'Home-page', 'Author', 'Author-email',
               'License')

_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform',
               'Supported-Platform', 'Summary', 'Description',
               'Keywords', 'Home-page', 'Author', 'Author-email',
               'License', 'Classifier', 'Download-URL', 'Obsoletes',
               'Provides', 'Requires')

_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier',
                'Download-URL')

_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform',
               'Supported-Platform', 'Summary', 'Description',
               'Keywords', 'Home-page', 'Author', 'Author-email',
               'Maintainer', 'Maintainer-email', 'License',
               'Classifier', 'Download-URL', 'Obsoletes-Dist',
               'Project-URL', 'Provides-Dist', 'Requires-Dist',
               'Requires-Python', 'Requires-External')

_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python',
                'Obsoletes-Dist', 'Requires-External', 'Maintainer',
                'Maintainer-email', 'Project-URL')

_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform',
               'Supported-Platform', 'Summary', 'Description',
               'Keywords', 'Home-page', 'Author', 'Author-email',
               'Maintainer', 'Maintainer-email', 'License',
               'Classifier', 'Download-URL', 'Obsoletes-Dist',
               'Project-URL', 'Provides-Dist', 'Requires-Dist',
               'Requires-Python', 'Requires-External', 'Private-Version',
               'Obsoleted-By', 'Setup-Requires-Dist', 'Extension',
               'Provides-Extra')

_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By',
                'Setup-Requires-Dist', 'Extension')

_ALL_FIELDS = set()
_ALL_FIELDS.update(_241_FIELDS)
_ALL_FIELDS.update(_314_FIELDS)
_ALL_FIELDS.update(_345_FIELDS)
_ALL_FIELDS.update(_426_FIELDS)

EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''')


def _version2fieldlist(version):
    if version == '1.0':
        return _241_FIELDS
    elif version == '1.1':
        return _314_FIELDS
    elif version == '1.2':
        return _345_FIELDS
    elif version == '2.0':
        return _426_FIELDS
    raise MetadataUnrecognizedVersionError(version)


def _best_version(fields):
    """Detect the best version depending on the fields used."""
    def _has_marker(keys, markers):
        for marker in markers:
            if marker in keys:
                return True
        return False

    keys = []
    for key, value in fields.items():
        if value in ([], 'UNKNOWN', None):
            continue
        keys.append(key)

    possible_versions = ['1.0', '1.1', '1.2', '2.0']

    # first let's try to see if a field is not part of one of the version
    for key in keys:
        if key not in _241_FIELDS and '1.0' in possible_versions:
            possible_versions.remove('1.0')
        if key not in _314_FIELDS and '1.1' in possible_versions:
            possible_versions.remove('1.1')
        if key not in _345_FIELDS and '1.2' in possible_versions:
            possible_versions.remove('1.2')
        if key not in _426_FIELDS and '2.0' in possible_versions:
            possible_versions.remove('2.0')

    # possible_version contains qualified versions
    if len(possible_versions) == 1:
        return possible_versions[0]   # found !
    elif len(possible_versions) == 0:
        raise MetadataConflictError('Unknown metadata set')

    # let's see if one unique marker is found
    is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS)
    is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS)
    is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS)
    if int(is_1_1) + int(is_1_2) + int(is_2_0) > 1:
        raise MetadataConflictError('You used incompatible 1.1/1.2/2.0 fields')

    # we have the choice, 1.0, or 1.2, or 2.0
    #   - 1.0 has a broken Summary field but works with all tools
    #   - 1.1 is to avoid
    #   - 1.2 fixes Summary but has little adoption
    #   - 2.0 adds more features and is very new
    if not is_1_1 and not is_1_2 and not is_2_0:
        # we couldn't find any specific marker
        if PKG_INFO_PREFERRED_VERSION in possible_versions:
            return PKG_INFO_PREFERRED_VERSION
    if is_1_1:
        return '1.1'
    if is_1_2:
        return '1.2'

    return '2.0'

_ATTR2FIELD = {
    'metadata_version': 'Metadata-Version',
    'name': 'Name',
    'version': 'Version',
    'platform': 'Platform',
    'supported_platform': 'Supported-Platform',
    'summary': 'Summary',
    'description': 'Description',
    'keywords': 'Keywords',
    'home_page': 'Home-page',
    'author': 'Author',
    'author_email': 'Author-email',
    'maintainer': 'Maintainer',
    'maintainer_email': 'Maintainer-email',
    'license': 'License',
    'classifier': 'Classifier',
    'download_url': 'Download-URL',
    'obsoletes_dist': 'Obsoletes-Dist',
    'provides_dist': 'Provides-Dist',
    'requires_dist': 'Requires-Dist',
    'setup_requires_dist': 'Setup-Requires-Dist',
    'requires_python': 'Requires-Python',
    'requires_external': 'Requires-External',
    'requires': 'Requires',
    'provides': 'Provides',
    'obsoletes': 'Obsoletes',
    'project_url': 'Project-URL',
    'private_version': 'Private-Version',
    'obsoleted_by': 'Obsoleted-By',
    'extension': 'Extension',
    'provides_extra': 'Provides-Extra',
}

_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist')
_VERSIONS_FIELDS = ('Requires-Python',)
_VERSION_FIELDS = ('Version',)
_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes',
               'Requires', 'Provides', 'Obsoletes-Dist',
               'Provides-Dist', 'Requires-Dist', 'Requires-External',
               'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist',
               'Provides-Extra', 'Extension')
_LISTTUPLEFIELDS = ('Project-URL',)

_ELEMENTSFIELD = ('Keywords',)

_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description')

_MISSING = object()

_FILESAFE = re.compile('[^A-Za-z0-9.]+')


def _get_name_and_version(name, version, for_filename=False):
    """Return the distribution name with version.

    If for_filename is true, return a filename-escaped form."""
    if for_filename:
        # For both name and version any runs of non-alphanumeric or '.'
        # characters are replaced with a single '-'.  Additionally any
        # spaces in the version string become '.'
        name = _FILESAFE.sub('-', name)
        version = _FILESAFE.sub('-', version.replace(' ', '.'))
    return '%s-%s' % (name, version)


class LegacyMetadata(object):
    """The legacy metadata of a release.

    Supports versions 1.0, 1.1 and 1.2 (auto-detected). You can
    instantiate the class with one of these arguments (or none):
    - *path*, the path to a metadata file
    - *fileobj* give a file-like object with metadata as content
    - *mapping* is a dict-like object
    - *scheme* is a version scheme name
    """
    # TODO document the mapping API and UNKNOWN default key

    def __init__(self, path=None, fileobj=None, mapping=None,
                 scheme='default'):
        if [path, fileobj, mapping].count(None) < 2:
            raise TypeError('path, fileobj and mapping are exclusive')
        self._fields = {}
        self.requires_files = []
        self._dependencies = None
        self.scheme = scheme
        if path is not None:
            self.read(path)
        elif fileobj is not None:
            self.read_file(fileobj)
        elif mapping is not None:
            self.update(mapping)
            self.set_metadata_version()

    def set_metadata_version(self):
        self._fields['Metadata-Version'] = _best_version(self._fields)

    def _write_field(self, fileobj, name, value):
        fileobj.write('%s: %s\n' % (name, value))

    def __getitem__(self, name):
        return self.get(name)

    def __setitem__(self, name, value):
        return self.set(name, value)

    def __delitem__(self, name):
        field_name = self._convert_name(name)
        try:
            del self._fields[field_name]
        except KeyError:
            raise KeyError(name)

    def __contains__(self, name):
        return (name in self._fields or
                self._convert_name(name) in self._fields)

    def _convert_name(self, name):
        if name in _ALL_FIELDS:
            return name
        name = name.replace('-', '_').lower()
        return _ATTR2FIELD.get(name, name)

    def _default_value(self, name):
        if name in _LISTFIELDS or name in _ELEMENTSFIELD:
            return []
        return 'UNKNOWN'

    def _remove_line_prefix(self, value):
        return _LINE_PREFIX.sub('\n', value)

    def __getattr__(self, name):
        if name in _ATTR2FIELD:
            return self[name]
        raise AttributeError(name)

    #
    # Public API
    #

#    dependencies = property(_get_dependencies, _set_dependencies)

    def get_fullname(self, filesafe=False):
        """Return the distribution name with version.

        If filesafe is true, return a filename-escaped form."""
        return _get_name_and_version(self['Name'], self['Version'], filesafe)

    def is_field(self, name):
        """return True if name is a valid metadata key"""
        name = self._convert_name(name)
        return name in _ALL_FIELDS

    def is_multi_field(self, name):
        name = self._convert_name(name)
        return name in _LISTFIELDS

    def read(self, filepath):
        """Read the metadata values from a file path."""
        fp = codecs.open(filepath, 'r', encoding='utf-8')
        try:
            self.read_file(fp)
        finally:
            fp.close()

    def read_file(self, fileob):
        """Read the metadata values from a file object."""
        msg = message_from_file(fileob)
        self._fields['Metadata-Version'] = msg['metadata-version']

        # When reading, get all the fields we can
        for field in _ALL_FIELDS:
            if field not in msg:
                continue
            if field in _LISTFIELDS:
                # we can have multiple lines
                values = msg.get_all(field)
                if field in _LISTTUPLEFIELDS and values is not None:
                    values = [tuple(value.split(',')) for value in values]
                self.set(field, values)
            else:
                # single line
                value = msg[field]
                if value is not None and value != 'UNKNOWN':
                    self.set(field, value)
        self.set_metadata_version()

    def write(self, filepath, skip_unknown=False):
        """Write the metadata fields to filepath."""
        fp = codecs.open(filepath, 'w', encoding='utf-8')
        try:
            self.write_file(fp, skip_unknown)
        finally:
            fp.close()

    def write_file(self, fileobject, skip_unknown=False):
        """Write the PKG-INFO format data to a file object."""
        self.set_metadata_version()

        for field in _version2fieldlist(self['Metadata-Version']):
            values = self.get(field)
            if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']):
                continue
            if field in _ELEMENTSFIELD:
                self._write_field(fileobject, field, ','.join(values))
                continue
            if field not in _LISTFIELDS:
                if field == 'Description':
                    values = values.replace('\n', '\n       |')
                values = [values]

            if field in _LISTTUPLEFIELDS:
                values = [','.join(value) for value in values]

            for value in values:
                self._write_field(fileobject, field, value)

    def update(self, other=None, **kwargs):
        """Set metadata values from the given iterable `other` and kwargs.

        Behavior is like `dict.update`: If `other` has a ``keys`` method,
        they are looped over and ``self[key]`` is assigned ``other[key]``.
        Else, ``other`` is an iterable of ``(key, value)`` iterables.

        Keys that don't match a metadata field or that have an empty value are
        dropped.
        """
        def _set(key, value):
            if key in _ATTR2FIELD and value:
                self.set(self._convert_name(key), value)

        if not other:
            # other is None or empty container
            pass
        elif hasattr(other, 'keys'):
            for k in other.keys():
                _set(k, other[k])
        else:
            for k, v in other:
                _set(k, v)

        if kwargs:
            for k, v in kwargs.items():
                _set(k, v)

    def set(self, name, value):
        """Control then set a metadata field."""
        name = self._convert_name(name)

        if ((name in _ELEMENTSFIELD or name == 'Platform') and
            not isinstance(value, (list, tuple))):
            if isinstance(value, string_types):
                value = [v.strip() for v in value.split(',')]
            else:
                value = []
        elif (name in _LISTFIELDS and
              not isinstance(value, (list, tuple))):
            if isinstance(value, string_types):
                value = [value]
            else:
                value = []

        if logger.isEnabledFor(logging.WARNING):
            project_name = self['Name']

            scheme = get_scheme(self.scheme)
            if name in _PREDICATE_FIELDS and value is not None:
                for v in value:
                    # check that the values are valid
                    if not scheme.is_valid_matcher(v.split(';')[0]):
                        logger.warning(
                            '%r: %r is not valid (field %r)',
                            project_name, v, name)
            # FIXME this rejects UNKNOWN, is that right?
            elif name in _VERSIONS_FIELDS and value is not None:
                if not scheme.is_valid_constraint_list(value):
                    logger.warning('%r: %r is not a valid version (field %r)',
                                   project_name, value, name)
            elif name in _VERSION_FIELDS and value is not None:
                if not scheme.is_valid_version(value):
                    logger.warning('%r: %r is not a valid version (field %r)',
                                   project_name, value, name)

        if name in _UNICODEFIELDS:
            if name == 'Description':
                value = self._remove_line_prefix(value)

        self._fields[name] = value

    def get(self, name, default=_MISSING):
        """Get a metadata field."""
        name = self._convert_name(name)
        if name not in self._fields:
            if default is _MISSING:
                default = self._default_value(name)
            return default
        if name in _UNICODEFIELDS:
            value = self._fields[name]
            return value
        elif name in _LISTFIELDS:
            value = self._fields[name]
            if value is None:
                return []
            res = []
            for val in value:
                if name not in _LISTTUPLEFIELDS:
                    res.append(val)
                else:
                    # That's for Project-URL
                    res.append((val[0], val[1]))
            return res

        elif name in _ELEMENTSFIELD:
            value = self._fields[name]
            if isinstance(value, string_types):
                return value.split(',')
        return self._fields[name]

    def check(self, strict=False):
        """Check if the metadata is compliant. If strict is True then raise if
        no Name or Version are provided"""
        self.set_metadata_version()

        # XXX should check the versions (if the file was loaded)
        missing, warnings = [], []

        for attr in ('Name', 'Version'):  # required by PEP 345
            if attr not in self:
                missing.append(attr)

        if strict and missing != []:
            msg = 'missing required metadata: %s' % ', '.join(missing)
            raise MetadataMissingError(msg)

        for attr in ('Home-page', 'Author'):
            if attr not in self:
                missing.append(attr)

        # checking metadata 1.2 (XXX needs to check 1.1, 1.0)
        if self['Metadata-Version'] != '1.2':
            return missing, warnings

        scheme = get_scheme(self.scheme)

        def are_valid_constraints(value):
            for v in value:
                if not scheme.is_valid_matcher(v.split(';')[0]):
                    return False
            return True

        for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints),
                                   (_VERSIONS_FIELDS,
                                    scheme.is_valid_constraint_list),
                                   (_VERSION_FIELDS,
                                    scheme.is_valid_version)):
            for field in fields:
                value = self.get(field, None)
                if value is not None and not controller(value):
                    warnings.append('Wrong value for %r: %s' % (field, value))

        return missing, warnings

    def todict(self, skip_missing=False):
        """Return fields as a dict.

        Field names will be converted to use the underscore-lowercase style
        instead of hyphen-mixed case (i.e. home_page instead of Home-page).
        """
        self.set_metadata_version()

        mapping_1_0 = (
            ('metadata_version', 'Metadata-Version'),
            ('name', 'Name'),
            ('version', 'Version'),
            ('summary', 'Summary'),
            ('home_page', 'Home-page'),
            ('author', 'Author'),
            ('author_email', 'Author-email'),
            ('license', 'License'),
            ('description', 'Description'),
            ('keywords', 'Keywords'),
            ('platform', 'Platform'),
            ('classifier', 'Classifier'),
            ('download_url', 'Download-URL'),
        )

        data = {}
        for key, field_name in mapping_1_0:
            if not skip_missing or field_name in self._fields:
                data[key] = self[field_name]

        if self['Metadata-Version'] == '1.2':
            mapping_1_2 = (
                ('requires_dist', 'Requires-Dist'),
                ('requires_python', 'Requires-Python'),
                ('requires_external', 'Requires-External'),
                ('provides_dist', 'Provides-Dist'),
                ('obsoletes_dist', 'Obsoletes-Dist'),
                ('project_url', 'Project-URL'),
                ('maintainer', 'Maintainer'),
                ('maintainer_email', 'Maintainer-email'),
            )
            for key, field_name in mapping_1_2:
                if not skip_missing or field_name in self._fields:
                    if key != 'project_url':
                        data[key] = self[field_name]
                    else:
                        data[key] = [','.join(u) for u in self[field_name]]

        elif self['Metadata-Version'] == '1.1':
            mapping_1_1 = (
                ('provides', 'Provides'),
                ('requires', 'Requires'),
                ('obsoletes', 'Obsoletes'),
            )
            for key, field_name in mapping_1_1:
                if not skip_missing or field_name in self._fields:
                    data[key] = self[field_name]

        return data

    def add_requirements(self, requirements):
        if self['Metadata-Version'] == '1.1':
            # we can't have 1.1 metadata *and* Setuptools requires
            for field in ('Obsoletes', 'Requires', 'Provides'):
                if field in self:
                    del self[field]
        self['Requires-Dist'] += requirements

    # Mapping API
    # TODO could add iter* variants

    def keys(self):
        return list(_version2fieldlist(self['Metadata-Version']))

    def __iter__(self):
        for key in self.keys():
            yield key

    def values(self):
        return [self[key] for key in self.keys()]

    def items(self):
        return [(key, self[key]) for key in self.keys()]

    def __repr__(self):
        return '<%s %s %s>' % (self.__class__.__name__, self.name,
                               self.version)


METADATA_FILENAME = 'pydist.json'


class Metadata(object):
    """
    The metadata of a release. This implementation uses 2.0 (JSON)
    metadata where possible. If not possible, it wraps a LegacyMetadata
    instance which handles the key-value metadata format.
    """

    METADATA_VERSION_MATCHER = re.compile('^\d+(\.\d+)*$')

    NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I)

    VERSION_MATCHER = PEP426_VERSION_RE

    SUMMARY_MATCHER = re.compile('.{1,2047}')

    METADATA_VERSION = '2.0'

    GENERATOR = 'distlib (%s)' % __version__

    MANDATORY_KEYS = {
        'name': (),
        'version': (),
        'summary': ('legacy',),
    }

    INDEX_KEYS = ('name version license summary description author '
                  'author_email keywords platform home_page classifiers '
                  'download_url')

    DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires '
                       'dev_requires provides meta_requires obsoleted_by '
                       'supports_environments')

    SYNTAX_VALIDATORS = {
        'metadata_version': (METADATA_VERSION_MATCHER, ()),
        'name': (NAME_MATCHER, ('legacy',)),
        'version': (VERSION_MATCHER, ('legacy',)),
        'summary': (SUMMARY_MATCHER, ('legacy',)),
    }

    __slots__ = ('_legacy', '_data', 'scheme')

    def __init__(self, path=None, fileobj=None, mapping=None,
                 scheme='default'):
        if [path, fileobj, mapping].count(None) < 2:
            raise TypeError('path, fileobj and mapping are exclusive')
        self._legacy = None
        self._data = None
        self.scheme = scheme
        #import pdb; pdb.set_trace()
        if mapping is not None:
            try:
                self._validate_mapping(mapping, scheme)
                self._data = mapping
            except MetadataUnrecognizedVersionError:
                self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme)
                self.validate()
        else:
            data = None
            if path:
                with open(path, 'rb') as f:
                    data = f.read()
            elif fileobj:
                data = fileobj.read()
            if data is None:
                # Initialised with no args - to be added
                self._data = {
                    'metadata_version': self.METADATA_VERSION,
                    'generator': self.GENERATOR,
                }
            else:
                if not isinstance(data, text_type):
                    data = data.decode('utf-8')
                try:
                    self._data = json.loads(data)
                    self._validate_mapping(self._data, scheme)
                except ValueError:
                    # Note: MetadataUnrecognizedVersionError does not
                    # inherit from ValueError (it's a DistlibException,
                    # which should not inherit from ValueError).
                    # The ValueError comes from the json.load - if that
                    # succeeds and we get a validation error, we want
                    # that to propagate
                    self._legacy = LegacyMetadata(fileobj=StringIO(data),
                                                  scheme=scheme)
                    self.validate()

    common_keys = set(('name', 'version', 'license', 'keywords', 'summary'))

    none_list = (None, list)
    none_dict = (None, dict)

    mapped_keys = {
        'run_requires': ('Requires-Dist', list),
        'build_requires': ('Setup-Requires-Dist', list),
        'dev_requires': none_list,
        'test_requires': none_list,
        'meta_requires': none_list,
        'extras': ('Provides-Extra', list),
        'modules': none_list,
        'namespaces': none_list,
        'exports': none_dict,
        'commands': none_dict,
        'classifiers': ('Classifier', list),
        'source_url': ('Download-URL', None),
        'metadata_version': ('Metadata-Version', None),
    }

    del none_list, none_dict

    def __getattribute__(self, key):
        common = object.__getattribute__(self, 'common_keys')
        mapped = object.__getattribute__(self, 'mapped_keys')
        if key in mapped:
            lk, maker = mapped[key]
            if self._legacy:
                if lk is None:
                    result = None if maker is None else maker()
                else:
                    result = self._legacy.get(lk)
            else:
                value = None if maker is None else maker()
                result = self._data.get(key, value)
        elif key not in common:
            result = object.__getattribute__(self, key)
        elif self._legacy:
            result = self._legacy.get(key)
        else:
            result = self._data.get(key)
        return result

    def _validate_value(self, key, value, scheme=None):
        if key in self.SYNTAX_VALIDATORS:
            pattern, exclusions = self.SYNTAX_VALIDATORS[key]
            if (scheme or self.scheme) not in exclusions:
                m = pattern.match(value)
                if not m:
                    raise MetadataInvalidError('%r is an invalid value for '
                                               'the %r property' % (value,
                                                                    key))

    def __setattr__(self, key, value):
        self._validate_value(key, value)
        common = object.__getattribute__(self, 'common_keys')
        mapped = object.__getattribute__(self, 'mapped_keys')
        if key in mapped:
            lk, _ = mapped[key]
            if self._legacy:
                if lk is None:
                    raise NotImplementedError
                self._legacy[lk] = value
            else:
                self._data[key] = value
        elif key not in common:
            object.__setattr__(self, key, value)
        else:
            if key == 'keywords':
                if isinstance(value, string_types):
                    value = value.strip()
                    if value:
                        value = value.split()
                    else:
                        value = []
            if self._legacy:
                self._legacy[key] = value
            else:
                self._data[key] = value

    @property
    def name_and_version(self):
        return _get_name_and_version(self.name, self.version, True)

    @property
    def provides(self):
        if self._legacy:
            result = self._legacy['Provides-Dist']
        else:
            result = self._data.setdefault('provides', [])
        s = '%s (%s)' % (self.name, self.version)
        if s not in result:
            result.append(s)
        return result

    @provides.setter
    def provides(self, value):
        if self._legacy:
            self._legacy['Provides-Dist'] = value
        else:
            self._data['provides'] = value

    def get_requirements(self, reqts, extras=None, env=None):
        """
        Base method to get dependencies, given a set of extras
        to satisfy and an optional environment context.
        :param reqts: A list of sometimes-wanted dependencies,
                      perhaps dependent on extras and environment.
        :param extras: A list of optional components being requested.
        :param env: An optional environment for marker evaluation.
        """
        if self._legacy:
            result = reqts
        else:
            result = []
            extras = get_extras(extras or [], self.extras)
            for d in reqts:
                if 'extra' not in d and 'environment' not in d:
                    # unconditional
                    include = True
                else:
                    if 'extra' not in d:
                        # Not extra-dependent - only environment-dependent
                        include = True
                    else:
                        include = d.get('extra') in extras
                    if include:
                        # Not excluded because of extras, check environment
                        marker = d.get('environment')
                        if marker:
                            include = interpret(marker, env)
                if include:
                    result.extend(d['requires'])
            for key in ('build', 'dev', 'test'):
                e = ':%s:' % key
                if e in extras:
                    extras.remove(e)
                    # A recursive call, but it should terminate since 'test'
                    # has been removed from the extras
                    reqts = self._data.get('%s_requires' % key, [])
                    result.extend(self.get_requirements(reqts, extras=extras,
                                                        env=env))
        return result

    @property
    def dictionary(self):
        if self._legacy:
            return self._from_legacy()
        return self._data

    @property
    def dependencies(self):
        if self._legacy:
            raise NotImplementedError
        else:
            return extract_by_key(self._data, self.DEPENDENCY_KEYS)

    @dependencies.setter
    def dependencies(self, value):
        if self._legacy:
            raise NotImplementedError
        else:
            self._data.update(value)

    def _validate_mapping(self, mapping, scheme):
        if mapping.get('metadata_version') != self.METADATA_VERSION:
            raise MetadataUnrecognizedVersionError()
        missing = []
        for key, exclusions in self.MANDATORY_KEYS.items():
            if key not in mapping:
                if scheme not in exclusions:
                    missing.append(key)
        if missing:
            msg = 'Missing metadata items: %s' % ', '.join(missing)
            raise MetadataMissingError(msg)
        for k, v in mapping.items():
            self._validate_value(k, v, scheme)

    def validate(self):
        if self._legacy:
            missing, warnings = self._legacy.check(True)
            if missing or warnings:
                logger.warning('Metadata: missing: %s, warnings: %s',
                               missing, warnings)
        else:
            self._validate_mapping(self._data, self.scheme)

    def todict(self):
        if self._legacy:
            return self._legacy.todict(True)
        else:
            result = extract_by_key(self._data, self.INDEX_KEYS)
            return result

    def _from_legacy(self):
        assert self._legacy and not self._data
        result = {
            'metadata_version': self.METADATA_VERSION,
            'generator': self.GENERATOR,
        }
        lmd = self._legacy.todict(True)     # skip missing ones
        for k in ('name', 'version', 'license', 'summary', 'description',
                  'classifier'):
            if k in lmd:
                if k == 'classifier':
                    nk = 'classifiers'
                else:
                    nk = k
                result[nk] = lmd[k]
        kw = lmd.get('Keywords', [])
        if kw == ['']:
            kw = []
        result['keywords'] = kw
        keys = (('requires_dist', 'run_requires'),
                ('setup_requires_dist', 'build_requires'))
        for ok, nk in keys:
            if ok in lmd and lmd[ok]:
                result[nk] = [{'requires': lmd[ok]}]
        result['provides'] = self.provides
        author = {}
        maintainer = {}
        return result

    LEGACY_MAPPING = {
        'name': 'Name',
        'version': 'Version',
        'license': 'License',
        'summary': 'Summary',
        'description': 'Description',
        'classifiers': 'Classifier',
    }

    def _to_legacy(self):
        def process_entries(entries):
            reqts = set()
            for e in entries:
                extra = e.get('extra')
                env = e.get('environment')
                rlist = e['requires']
                for r in rlist:
                    if not env and not extra:
                        reqts.add(r)
                    else:
                        marker = ''
                        if extra:
                            marker = 'extra == "%s"' % extra
                        if env:
                            if marker:
                                marker = '(%s) and %s' % (env, marker)
                            else:
                                marker = env
                        reqts.add(';'.join((r, marker)))
            return reqts

        assert self._data and not self._legacy
        result = LegacyMetadata()
        nmd = self._data
        for nk, ok in self.LEGACY_MAPPING.items():
            if nk in nmd:
                result[ok] = nmd[nk]
        r1 = process_entries(self.run_requires + self.meta_requires)
        r2 = process_entries(self.build_requires + self.dev_requires)
        if self.extras:
            result['Provides-Extra'] = sorted(self.extras)
        result['Requires-Dist'] = sorted(r1)
        result['Setup-Requires-Dist'] = sorted(r2)
        # TODO: other fields such as contacts
        return result

    def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True):
        if [path, fileobj].count(None) != 1:
            raise ValueError('Exactly one of path and fileobj is needed')
        self.validate()
        if legacy:
            if self._legacy:
                legacy_md = self._legacy
            else:
                legacy_md = self._to_legacy()
            if path:
                legacy_md.write(path, skip_unknown=skip_unknown)
            else:
                legacy_md.write_file(fileobj, skip_unknown=skip_unknown)
        else:
            if self._legacy:
                d = self._from_legacy()
            else:
                d = self._data
            if fileobj:
                json.dump(d, fileobj, ensure_ascii=True, indent=2,
                          sort_keys=True)
            else:
                with codecs.open(path, 'w', 'utf-8') as f:
                    json.dump(d, f, ensure_ascii=True, indent=2,
                              sort_keys=True)

    def add_requirements(self, requirements):
        if self._legacy:
            self._legacy.add_requirements(requirements)
        else:
            run_requires = self._data.setdefault('run_requires', [])
            always = None
            for entry in run_requires:
                if 'environment' not in entry and 'extra' not in entry:
                    always = entry
                    break
            if always is None:
                always = { 'requires': requirements }
                run_requires.insert(0, always)
            else:
                rset = set(always['requires']) | set(requirements)
                always['requires'] = sorted(rset)

    def __repr__(self):
        name = self.name or '(no name)'
        version = self.version or 'no version'
        return '<%s %s %s (%s)>' % (self.__class__.__name__,
                                    self.metadata_version, name, version)
site-packages/pip/_vendor/distlib/markers.py000064400000014212151733463540015173 0ustar00# -*- coding: utf-8 -*-
#
# Copyright (C) 2012-2013 Vinay Sajip.
# Licensed to the Python Software Foundation under a contributor agreement.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
"""Parser for the environment markers micro-language defined in PEP 345."""

import ast
import os
import sys
import platform

from .compat import python_implementation, string_types
from .util import in_venv

__all__ = ['interpret']


class Evaluator(object):
    """
    A limited evaluator for Python expressions.
    """

    operators = {
        'eq': lambda x, y: x == y,
        'gt': lambda x, y: x > y,
        'gte': lambda x, y: x >= y,
        'in': lambda x, y: x in y,
        'lt': lambda x, y: x < y,
        'lte': lambda x, y: x <= y,
        'not': lambda x: not x,
        'noteq': lambda x, y: x != y,
        'notin': lambda x, y: x not in y,
    }

    allowed_values = {
        'sys_platform': sys.platform,
        'python_version': '%s.%s' % sys.version_info[:2],
        # parsing sys.platform is not reliable, but there is no other
        # way to get e.g. 2.7.2+, and the PEP is defined with sys.version
        'python_full_version': sys.version.split(' ', 1)[0],
        'os_name': os.name,
        'platform_in_venv': str(in_venv()),
        'platform_release': platform.release(),
        'platform_version': platform.version(),
        'platform_machine': platform.machine(),
        'platform_python_implementation': python_implementation(),
    }

    def __init__(self, context=None):
        """
        Initialise an instance.

        :param context: If specified, names are looked up in this mapping.
        """
        self.context = context or {}
        self.source = None

    def get_fragment(self, offset):
        """
        Get the part of the source which is causing a problem.
        """
        fragment_len = 10
        s = '%r' % (self.source[offset:offset + fragment_len])
        if offset + fragment_len < len(self.source):
            s += '...'
        return s

    def get_handler(self, node_type):
        """
        Get a handler for the specified AST node type.
        """
        return getattr(self, 'do_%s' % node_type, None)

    def evaluate(self, node, filename=None):
        """
        Evaluate a source string or node, using ``filename`` when
        displaying errors.
        """
        if isinstance(node, string_types):
            self.source = node
            kwargs = {'mode': 'eval'}
            if filename:
                kwargs['filename'] = filename
            try:
                node = ast.parse(node, **kwargs)
            except SyntaxError as e:
                s = self.get_fragment(e.offset)
                raise SyntaxError('syntax error %s' % s)
        node_type = node.__class__.__name__.lower()
        handler = self.get_handler(node_type)
        if handler is None:
            if self.source is None:
                s = '(source not available)'
            else:
                s = self.get_fragment(node.col_offset)
            raise SyntaxError("don't know how to evaluate %r %s" % (
                node_type, s))
        return handler(node)

    def get_attr_key(self, node):
        assert isinstance(node, ast.Attribute), 'attribute node expected'
        return '%s.%s' % (node.value.id, node.attr)

    def do_attribute(self, node):
        if not isinstance(node.value, ast.Name):
            valid = False
        else:
            key = self.get_attr_key(node)
            valid = key in self.context or key in self.allowed_values
        if not valid:
            raise SyntaxError('invalid expression: %s' % key)
        if key in self.context:
            result = self.context[key]
        else:
            result = self.allowed_values[key]
        return result

    def do_boolop(self, node):
        result = self.evaluate(node.values[0])
        is_or = node.op.__class__ is ast.Or
        is_and = node.op.__class__ is ast.And
        assert is_or or is_and
        if (is_and and result) or (is_or and not result):
            for n in node.values[1:]:
                result = self.evaluate(n)
                if (is_or and result) or (is_and and not result):
                    break
        return result

    def do_compare(self, node):
        def sanity_check(lhsnode, rhsnode):
            valid = True
            if isinstance(lhsnode, ast.Str) and isinstance(rhsnode, ast.Str):
                valid = False
            #elif (isinstance(lhsnode, ast.Attribute)
            #      and isinstance(rhsnode, ast.Attribute)):
            #    klhs = self.get_attr_key(lhsnode)
            #    krhs = self.get_attr_key(rhsnode)
            #    valid = klhs != krhs
            if not valid:
                s = self.get_fragment(node.col_offset)
                raise SyntaxError('Invalid comparison: %s' % s)

        lhsnode = node.left
        lhs = self.evaluate(lhsnode)
        result = True
        for op, rhsnode in zip(node.ops, node.comparators):
            sanity_check(lhsnode, rhsnode)
            op = op.__class__.__name__.lower()
            if op not in self.operators:
                raise SyntaxError('unsupported operation: %r' % op)
            rhs = self.evaluate(rhsnode)
            result = self.operators[op](lhs, rhs)
            if not result:
                break
            lhs = rhs
            lhsnode = rhsnode
        return result

    def do_expression(self, node):
        return self.evaluate(node.body)

    def do_name(self, node):
        valid = False
        if node.id in self.context:
            valid = True
            result = self.context[node.id]
        elif node.id in self.allowed_values:
            valid = True
            result = self.allowed_values[node.id]
        if not valid:
            raise SyntaxError('invalid expression: %s' % node.id)
        return result

    def do_str(self, node):
        return node.s


def interpret(marker, execution_context=None):
    """
    Interpret a marker and return a result depending on environment.

    :param marker: The marker to interpret.
    :type marker: str
    :param execution_context: The context used for name lookup.
    :type execution_context: mapping
    """
    return Evaluator(execution_context).evaluate(marker.strip())
site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-33.pyc000064400000040443151733463540022027 0ustar00�
7�Re�$c@s�ddlmZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZddl
mZmZmZmZeje�ZdaGdd�de�ZGdd	�d	e�ZGd
d�de�ZGdd
�d
e�ZGdd�de�ZGdd�de�Zieed�6ee
j6Z y*ddl!Z!ee e!j"<ee e!j#<Wne$e%fk
r�YnXdd�Z&iZ'dd�Z(e	j)e*d��Z+dd�Z,dS(i(uunicode_literalsNi(uDistlibException(ucached_propertyuget_cache_baseupath_to_cache_diruCachecsA|EeZdZd�fdd�Zdd�Zdd�Z�S(u
ResourceCachecsG|dkr-tjjt�td��}ntt|�j|�dS(Nuresource-cache(	uNoneuosupathujoinuget_cache_baseustrusuperu
ResourceCacheu__init__(uselfubase(u	__class__(u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyu__init__s!uResourceCache.__init__cCsdS(u�
        Is the cache stale for the given resource?

        :param resource: The :class:`Resource` being cached.
        :param path: The path of the resource in the cache.
        :return: True if the cache is stale.
        T(uTrue(uselfuresourceupath((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyuis_stale#s	uResourceCache.is_stalec	Cs�|jj|�\}}|dkr-|}n�tjj|j|j|�|�}tjj|�}tjj	|�s�tj
|�ntjj|�s�d}n|j
||�}|r�t|d��}|j|j�WdQXn|S(u�
        Get a resource into the cache,

        :param resource: A :class:`Resource` instance.
        :return: The pathname of the resource in the cache.
        uwbNT(ufinderuget_cache_infouNoneuosupathujoinubaseu
prefix_to_dirudirnameuisdirumakedirsuexistsuTrueuis_staleuopenuwriteubytes(uselfuresourceuprefixupathuresultudirnameustaleuf((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyuget.s	$	uResourceCache.getN(u__name__u
__module__u__qualname__uNoneu__init__uis_staleuget(u
__locals__((u	__class__u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyu
ResourceCachesu
ResourceCachecBs |EeZdZdd�ZdS(uResourceBasecCs||_||_dS(N(ufinderuname(uselfufinderuname((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyu__init__Is	uResourceBase.__init__N(u__name__u
__module__u__qualname__u__init__(u
__locals__((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyuResourceBaseHsuResourceBasecBsb|EeZdZdZdZdd�Zedd��Zedd��Z	edd	��Z
d
S(uResourceu�
    A class representing an in-package resource, such as a data file. This is
    not normally instantiated by user code, but rather by a
    :class:`ResourceFinder` which manages the resource.
    cCs|jj|�S(u�
        Get the resource as a stream.

        This is not a property to make it obvious that it returns a new stream
        each time.
        (ufinderu
get_stream(uself((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyu	as_streamVsuResource.as_streamcCs%tdkrt�antj|�S(N(ucacheuNoneu
ResourceCacheuget(uself((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyu	file_path_suResource.file_pathcCs|jj|�S(N(ufinderu	get_bytes(uself((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyubytesfsuResource.bytescCs|jj|�S(N(ufinderuget_size(uself((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyusizejsu
Resource.sizeNF(u__name__u
__module__u__qualname__u__doc__uFalseuis_containeru	as_streamucached_propertyu	file_pathubytesusize(u
__locals__((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyuResourceNs	uResourcecBs,|EeZdZdZedd��ZdS(uResourceContainercCs|jj|�S(N(ufinderu
get_resources(uself((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyu	resourcesrsuResourceContainer.resourcesNT(u__name__u
__module__u__qualname__uTrueuis_containerucached_propertyu	resources(u
__locals__((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyuResourceContainerosuResourceContainercBs�|EeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zeejj�ZdS(uResourceFinderu4
    Resource finder for file system resources.
    cCsC||_t|dd�|_tjjt|dd��|_dS(Nu
__loader__u__file__u(umoduleugetattruNoneuloaderuosupathudirnameubase(uselfumodule((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyu__init__{s	uResourceFinder.__init__cCstjj|�S(N(uosupathurealpath(uselfupath((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyu_adjust_path�suResourceFinder._adjust_pathcCsA|jd�}|jd|j�tjj|�}|j|�S(Nu/i(usplituinsertubaseuosupathujoinu_adjust_path(uselfu
resource_nameupartsuresult((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyu
_make_path�suResourceFinder._make_pathcCstjj|�S(N(uosupathuexists(uselfupath((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyu_find�suResourceFinder._findcCs
d|jfS(N(uNoneupath(uselfuresource((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyuget_cache_info�suResourceFinder.get_cache_infocCsd|j|�}|j|�s'd}n9|j|�rHt||�}nt||�}||_|S(N(u
_make_pathu_finduNoneu
_is_directoryuResourceContaineruResourceupath(uselfu
resource_nameupathuresult((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyufind�s		uResourceFinder.findcCst|jd�S(Nurb(uopenupath(uselfuresource((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyu
get_stream�suResourceFinder.get_streamcCs)t|jd��}|j�SWdQXdS(Nurb(uopenupathuread(uselfuresourceuf((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyu	get_bytes�suResourceFinder.get_bytescCstjj|j�S(N(uosupathugetsize(uselfuresource((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyuget_size�suResourceFinder.get_sizecs5dd��t�fdd�tj|j�D��S(NcSs|dko|jd�S(Nu__pycache__u.pycu.pyo(u.pycu.pyo(uendswith(uf((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyuallowed�su-ResourceFinder.get_resources.<locals>.allowedcs"g|]}�|�r|�qS(((u.0uf(uallowed(u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyu
<listcomp>�s	u0ResourceFinder.get_resources.<locals>.<listcomp>(usetuosulistdirupath(uselfuresource((uallowedu6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyu
get_resources�suResourceFinder.get_resourcescCs|j|j�S(N(u
_is_directoryupath(uselfuresource((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyuis_container�suResourceFinder.is_containerN(u__name__u
__module__u__qualname__u__doc__u__init__u_adjust_pathu
_make_pathu_finduget_cache_infoufindu
get_streamu	get_bytesuget_sizeu
get_resourcesuis_containerustaticmethoduosupathuisdiru
_is_directory(u
__locals__((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyuResourceFinderwsuResourceFindercs�|EeZdZdZ�fdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Z�S(uZipResourceFinderu6
    Resource finder for resources in .zip files.
    cstt|�j|�|jj}dt|�|_t|jd�rY|jj|_nt	j
||_t|j�|_dS(Niu_files(
usuperuZipResourceFinderu__init__uloaderuarchiveulenu
prefix_lenuhasattru_filesu	zipimportu_zip_directory_cacheusorteduindex(uselfumoduleuarchive(u	__class__(u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyu__init__�suZipResourceFinder.__init__cCs|S(N((uselfupath((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyu_adjust_path�suZipResourceFinder._adjust_pathc
Cs�||jd�}||jkr+d}ns|rT|dtjkrT|tj}ntj|j|�}y|j|j|�}Wntk
r�d}YnX|s�t
jd||jj
�nt
jd||jj
�|S(Niu_find failed: %r %ru_find worked: %r %rTi����F(u
prefix_lenu_filesuTrueuosusepubisectuindexu
startswithu
IndexErroruFalseuloggerudebuguloaderuprefix(uselfupathuresultui((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyu_find�s	
uZipResourceFinder._findcCs3|jj}|jdt|�d�}||fS(Ni(uloaderuarchiveupathulen(uselfuresourceuprefixupath((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyuget_cache_info�su ZipResourceFinder.get_cache_infocCs|jj|j�S(N(uloaderuget_dataupath(uselfuresource((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyu	get_bytes�suZipResourceFinder.get_bytescCstj|j|��S(N(uiouBytesIOu	get_bytes(uselfuresource((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyu
get_stream�suZipResourceFinder.get_streamcCs%|j|jd�}|j|dS(Ni(upathu
prefix_lenu_files(uselfuresourceupath((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyuget_size�suZipResourceFinder.get_sizecCs�|j|jd�}|r?|dtjkr?|tj7}nt|�}t�}tj|j|�}xt|t|j�kr�|j|j|�s�Pn|j||d�}|j	|j
tjd�d�|d7}qlW|S(Niii����(upathu
prefix_lenuosusepulenusetubisectuindexu
startswithuaddusplit(uselfuresourceupathuplenuresultuius((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyu
get_resources�s	 uZipResourceFinder.get_resourcescCs�||jd�}|r<|dtjkr<|tj7}ntj|j|�}y|j|j|�}Wntk
r�d}YnX|S(Nii����F(u
prefix_lenuosusepubisectuindexu
startswithu
IndexErroruFalse(uselfupathuiuresult((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyu
_is_directory�s
uZipResourceFinder._is_directory(
u__name__u
__module__u__qualname__u__doc__u__init__u_adjust_pathu_finduget_cache_infou	get_bytesu
get_streamuget_sizeu
get_resourcesu
_is_directory(u
__locals__((u	__class__u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyuZipResourceFinder�suZipResourceFindercCs|tt|�<dS(N(u_finder_registryutype(uloaderufinder_maker((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyuregister_finder
suregister_findercCs�|tkrt|}n�|tjkr5t|�ntj|}t|dd�}|dkrotd��nt|dd�}tjt	|��}|dkr�td|��n||�}|t|<|S(u�
    Return a resource finder for a package.
    :param package: The name of the package.
    :return: A :class:`ResourceFinder` instance for the package.
    u__path__u8You cannot get a finder for a module, only for a packageu
__loader__uUnable to locate finder for %rN(
u
_finder_cacheusysumodulesu
__import__ugetattruNoneuDistlibExceptionu_finder_registryugetutype(upackageuresultumoduleupathuloaderufinder_maker((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyufinders



ufinderu	__dummy__cCszd}tj|�tjj|�}tjt|��}|rvt}t	j
j|d�|_||_
||�}n|S(u�
    Return a resource finder for a path, which should represent a container.

    :param path: The path.
    :return: A :class:`ResourceFinder` instance for the path.
    uN(uNoneupkgutiluget_importerusysupath_importer_cacheugetu_finder_registryutypeu
_dummy_moduleuosupathujoinu__file__u
__loader__(upathuresultuloaderufinderumodule((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyufinder_for_path,s
	ufinder_for_path(-u
__future__uunicode_literalsubisectuioulogginguosupkgutilushutilusysutypesu	zipimportuuDistlibExceptionuutilucached_propertyuget_cache_baseupath_to_cache_diruCacheu	getLoggeru__name__uloggeruNoneucacheu
ResourceCacheuobjectuResourceBaseuResourceuResourceContaineruResourceFinderuZipResourceFinderutypeuzipimporteru_finder_registryu_frozen_importlibuSourceFileLoaderu
FileFinderuImportErroruAttributeErroruregister_finderu
_finder_cacheufinderu
ModuleTypeustru
_dummy_moduleufinder_for_path(((u6/tmp/pip-zej_zi-build/pip/_vendor/distlib/resources.pyu<module>sB",!9M


site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-33.pyc000064400000122447151733463540021602 0ustar00�
7�ReϏc@s�dZddlmZddlZddlmZddlZddlZddlZddl	m
Z
mZddlm
Z
mZmZddlmZdd	lmZmZdd
lmZmZeje�ZGdd�de
�ZGd
d�de
�ZGdd�de
�ZGdd�de
�ZdddgZdZ dZ!ej"d�Z#dddddddd d!d"d#fZ$ddddd$dddd d!d"d#d%d&d'd(d)fZ%d'd(d)d%d&fZ&ddddd$dddd d!d"d*d+d#d%d&d,d-d.d/d0d1fZ'd.d/d0d,d1d*d+d-fZ(ddddd$dddd d!d"d*d+d#d%d&d,d-d.d/d0d1d2d3d4d5d6fZ)d2d6d3d4d5fZ*e+�Z,e,j-e$�e,j-e%�e,j-e'�e,j-e)�ej"d7�Z.d8d9�Z/d:d;�Z0idd<6dd=6dd>6dd?6d$d@6ddA6ddB6ddC6d dD6d!dE6d"dF6d*dG6d+dH6d#dI6d%dJ6d&dK6d,dL6d.dM6d/dN6d4dO6d0dP6d1dQ6d)dR6d(dS6d'dT6d-dU6d2dV6d3dW6d5dX6d6dY6Z1d/d,d.fZ2d0fZ3dfZ4dd%d'd)d(d,d.d/d1d-d$d4d6d5fZ5d-fZ6dfZ7d!d*ddfZ8e9�Z:ej"dZ�Z;e<d[d\�Z=Gd]d^�d^e9�Z>d_Z?Gd`d�de9�Z@dS(auImplementation of the Metadata for Python packages PEPs.

Supports all metadata formats (1.0, 1.1, 1.2, and 2.0 experimental).
i(uunicode_literalsN(umessage_from_filei(uDistlibExceptionu__version__(uStringIOustring_typesu	text_type(u	interpret(uextract_by_keyu
get_extras(u
get_schemeuPEP426_VERSION_REcBs|EeZdZdZdS(uMetadataMissingErroruA required metadata is missingN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuMetadataMissingErrorsuMetadataMissingErrorcBs|EeZdZdZdS(uMetadataConflictErroru>Attempt to read or write metadata fields that are conflictual.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuMetadataConflictError suMetadataConflictErrorcBs|EeZdZdZdS(u MetadataUnrecognizedVersionErroru Unknown metadata version number.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu MetadataUnrecognizedVersionError$su MetadataUnrecognizedVersionErrorcBs|EeZdZdZdS(uMetadataInvalidErroruA metadata value is invalidN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuMetadataInvalidError(suMetadataInvalidErroruMetadatauPKG_INFO_ENCODINGuPKG_INFO_PREFERRED_VERSIONuutf-8u1.1u

       \|uMetadata-VersionuNameuVersionuPlatformuSummaryuDescriptionuKeywordsu	Home-pageuAuthoruAuthor-emailuLicenseuSupported-Platformu
ClassifieruDownload-URLu	ObsoletesuProvidesuRequiresu
MaintaineruMaintainer-emailuObsoletes-DistuProject-URLu
Provides-Distu
Requires-DistuRequires-PythonuRequires-ExternaluPrivate-VersionuObsoleted-ByuSetup-Requires-Distu	ExtensionuProvides-Extrau"extra\s*==\s*("([^"]+)"|'([^']+)')cCsP|dkrtS|dkr tS|dkr0tS|dkr@tSt|��dS(Nu1.0u1.1u1.2u2.0(u_241_FIELDSu_314_FIELDSu_345_FIELDSu_426_FIELDSu MetadataUnrecognizedVersionError(uversion((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu_version2fieldlistfsu_version2fieldlistc	Csdd�}g}xB|j�D]4\}}|gddfkrFqn|j|�qWddddg}x�|D]�}|tkr�d|kr�|jd�n|tkr�d|kr�|jd�n|tkr�d|kr�|jd�n|tkrpd|krp|jd�qpqpWt|�dkr4|d	St|�d	krUt	d
��nd|kom||t
�}d|ko�||t�}d|ko�||t�}t
|�t
|�t
|�dkr�t	d��n|r|r|rt|krtSn|r
dS|rdSdS(
u5Detect the best version depending on the fields used.cSs%x|D]}||krdSqWdS(NTF(uTrueuFalse(ukeysumarkersumarker((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu_has_markerts
u"_best_version.<locals>._has_markeruUNKNOWNu1.0u1.1u1.2u2.0iiuUnknown metadata setu(You used incompatible 1.1/1.2/2.0 fieldsN(uitemsuNoneuappendu_241_FIELDSuremoveu_314_FIELDSu_345_FIELDSu_426_FIELDSulenuMetadataConflictErroru_314_MARKERSu_345_MARKERSu_426_MARKERSuintuPKG_INFO_PREFERRED_VERSION(	ufieldsu_has_markerukeysukeyuvalueupossible_versionsuis_1_1uis_1_2uis_2_0((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu
_best_versionrsB
&u
_best_versionumetadata_versionunameuversionuplatformusupported_platformusummaryudescriptionukeywordsu	home_pageuauthoruauthor_emailu
maintainerumaintainer_emailulicenseu
classifierudownload_urluobsoletes_distu
provides_distu
requires_distusetup_requires_disturequires_pythonurequires_externalurequiresuprovidesu	obsoletesuproject_urluprivate_versionuobsoleted_byu	extensionuprovides_extrau[^A-Za-z0-9.]+cCsG|r9tjd|�}tjd|jdd��}nd||fS(uhReturn the distribution name with version.

    If for_filename is true, return a filename-escaped form.u-u u.u%s-%s(u	_FILESAFEusubureplace(unameuversionufor_filename((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu_get_name_and_version�s!u_get_name_and_versioncBs�|EeZdZdZd=d=d=ddd�Zdd�Zdd�Zd	d
�Zdd�Z	d
d�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zd>dd�Zdd�Zdd�Zdd �Zd!d"�Zd>d#d$�Zd>d%d&�Zd=d'd(�Zd)d*�Zed+d,�Zd>d-d.�Zd>d/d0�Zd1d2�Zd3d4�Zd5d6�Z d7d8�Z!d9d:�Z"d;d<�Z#d=S(?uLegacyMetadatauaThe legacy metadata of a release.

    Supports versions 1.0, 1.1 and 1.2 (auto-detected). You can
    instantiate the class with one of these arguments (or none):
    - *path*, the path to a metadata file
    - *fileobj* give a file-like object with metadata as content
    - *mapping* is a dict-like object
    - *scheme* is a version scheme name
    udefaultcCs�|||gjd�dkr-td��ni|_g|_d|_||_|dk	rm|j|�nB|dk	r�|j|�n&|dk	r�|j	|�|j
�ndS(Niu'path, fileobj and mapping are exclusive(ucountuNoneu	TypeErroru_fieldsurequires_filesu
_dependenciesuschemeureadu	read_fileuupdateuset_metadata_version(uselfupathufileobjumappinguscheme((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu__init__�s				
uLegacyMetadata.__init__cCst|j�|jd<dS(NuMetadata-Version(u
_best_versionu_fields(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuset_metadata_versionsu#LegacyMetadata.set_metadata_versioncCs|jd||f�dS(Nu%s: %s
(uwrite(uselfufileobjunameuvalue((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu_write_field
suLegacyMetadata._write_fieldcCs
|j|�S(N(uget(uselfuname((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu__getitem__
suLegacyMetadata.__getitem__cCs|j||�S(N(uset(uselfunameuvalue((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu__setitem__suLegacyMetadata.__setitem__cCsB|j|�}y|j|=Wntk
r=t|��YnXdS(N(u
_convert_nameu_fieldsuKeyError(uselfunameu
field_name((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu__delitem__s

uLegacyMetadata.__delitem__cCs%||jkp$|j|�|jkS(N(u_fieldsu
_convert_name(uselfuname((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu__contains__suLegacyMetadata.__contains__cCs8|tkr|S|jdd�j�}tj||�S(Nu-u_(u_ALL_FIELDSureplaceuloweru_ATTR2FIELDuget(uselfuname((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu
_convert_namesuLegacyMetadata._convert_namecCs |tks|tkrgSdS(NuUNKNOWN(u_LISTFIELDSu_ELEMENTSFIELD(uselfuname((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu_default_value$suLegacyMetadata._default_valuecCstjd|�S(Nu
(u_LINE_PREFIXusub(uselfuvalue((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu_remove_line_prefix)su"LegacyMetadata._remove_line_prefixcCs$|tkr||St|��dS(N(u_ATTR2FIELDuAttributeError(uselfuname((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu__getattr__,suLegacyMetadata.__getattr__cCst|d|d|�S(uhReturn the distribution name with version.

        If filesafe is true, return a filename-escaped form.uNameuVersion(u_get_name_and_version(uselfufilesafe((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuget_fullname7suLegacyMetadata.get_fullnamecCs|j|�}|tkS(u+return True if name is a valid metadata key(u
_convert_nameu_ALL_FIELDS(uselfuname((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuis_field=suLegacyMetadata.is_fieldcCs|j|�}|tkS(N(u
_convert_nameu_LISTFIELDS(uselfuname((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuis_multi_fieldBsuLegacyMetadata.is_multi_fieldc
Cs;tj|ddd�}z|j|�Wd|j�XdS(u*Read the metadata values from a file path.uruencodinguutf-8N(ucodecsuopenu	read_fileuclose(uselfufilepathufp((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyureadFsuLegacyMetadata.readcCs�t|�}|d|jd<x�tD]�}||kr<q$n|tkr�|j|�}|tkr�|dk	r�dd�|D�}n|j||�q$||}|dk	r$|dkr$|j||�q$q$W|j�dS(u,Read the metadata values from a file object.umetadata-versionuMetadata-VersioncSs%g|]}t|jd���qS(u,(utupleusplit(u.0uvalue((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu
<listcomp>[s	u,LegacyMetadata.read_file.<locals>.<listcomp>uUNKNOWNN(	umessage_from_fileu_fieldsu_ALL_FIELDSu_LISTFIELDSuget_allu_LISTTUPLEFIELDSuNoneusetuset_metadata_version(uselfufileobumsgufielduvaluesuvalue((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu	read_fileNs

uLegacyMetadata.read_filec
Cs>tj|ddd�}z|j||�Wd|j�XdS(u&Write the metadata fields to filepath.uwuencodinguutf-8N(ucodecsuopenu
write_fileuclose(uselfufilepathuskip_unknownufp((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuwritedsuLegacyMetadata.writecCs	|j�x�t|d�D]�}|j|�}|rT|dgdgfkrTqn|tkr�|j||dj|��qn|tkr�|dkr�|jdd�}n|g}n|tkr�dd�|D�}nx!|D]}|j|||�q�WqWd	S(
u0Write the PKG-INFO format data to a file object.uMetadata-VersionuUNKNOWNu,uDescriptionu
u	
       |cSsg|]}dj|��qS(u,(ujoin(u.0uvalue((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu
<listcomp>}s	u-LegacyMetadata.write_file.<locals>.<listcomp>N(	uset_metadata_versionu_version2fieldlistugetu_ELEMENTSFIELDu_write_fieldujoinu_LISTFIELDSureplaceu_LISTTUPLEFIELDS(uselfu
fileobjectuskip_unknownufielduvaluesuvalue((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu
write_filels 

uLegacyMetadata.write_filecs��fdd�}|sn^t|d�rUxL|j�D]}||||�q7Wn$x!|D]\}}|||�q\W|r�x*|j�D]\}}|||�q�WndS(u�Set metadata values from the given iterable `other` and kwargs.

        Behavior is like `dict.update`: If `other` has a ``keys`` method,
        they are looped over and ``self[key]`` is assigned ``other[key]``.
        Else, ``other`` is an iterable of ``(key, value)`` iterables.

        Keys that don't match a metadata field or that have an empty value are
        dropped.
        cs2|tkr.|r.�j�j|�|�ndS(N(u_ATTR2FIELDusetu
_convert_name(ukeyuvalue(uself(u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu_set�su#LegacyMetadata.update.<locals>._setukeysN(uhasattrukeysuitems(uselfuotherukwargsu_setukuv((uselfu5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuupdate�s
uLegacyMetadata.updatecCs
|j|�}|tks'|dkrtt|ttf�rtt|t�rkdd�|jd�D�}q�g}nF|tkr�t|ttf�r�t|t�r�|g}q�g}ntj	t
j�r�|d}t|j
�}|tkrF|dk	rFx�|D];}|j|jd�d�stjd|||�qqWq�|tkr�|dk	r�|j|�s�tjd	|||�q�q�|tkr�|dk	r�|j|�s�tjd	|||�q�q�n|tkr�|d
kr�|j|�}q�n||j|<dS(u"Control then set a metadata field.uPlatformcSsg|]}|j��qS((ustrip(u.0uv((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu
<listcomp>�s	u&LegacyMetadata.set.<locals>.<listcomp>u,uNameu;iu%r: %r is not valid (field %r)u(%r: %r is not a valid version (field %r)uDescriptionN(u
_convert_nameu_ELEMENTSFIELDu
isinstanceulistutupleustring_typesusplitu_LISTFIELDSuloggeruisEnabledForulogginguWARNINGu
get_schemeuschemeu_PREDICATE_FIELDSuNoneuis_valid_matcheruwarningu_VERSIONS_FIELDSuis_valid_constraint_listu_VERSION_FIELDSuis_valid_versionu_UNICODEFIELDSu_remove_line_prefixu_fields(uselfunameuvalueuproject_nameuschemeuv((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuset�s@		

		uLegacyMetadata.setcCs|j|�}||jkr@|tkr<|j|�}n|S|tkr]|j|}|S|tkr�|j|}|dkr�gSg}xE|D]=}|tkr�|j|�q�|j|d|df�q�W|S|t	kr|j|}t
|t�r|jd�Sn|j|S(uGet a metadata field.iiu,N(
u
_convert_nameu_fieldsu_MISSINGu_default_valueu_UNICODEFIELDSu_LISTFIELDSuNoneu_LISTTUPLEFIELDSuappendu_ELEMENTSFIELDu
isinstanceustring_typesusplit(uselfunameudefaultuvalueuresuval((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuget�s.



uLegacyMetadata.getcsx|j�gg}}x*dD]"}||kr|j|�qqW|rx|gkrxddj|�}t|��nx*d
D]"}||kr|j|�qqW|ddkr�||fSt|j���fd	d
�}x�t|ft�jft	�j
ffD]b\}}xS|D]K}	|j|	d�}
|
dk	r||
�r|jd|	|
f�qqWqW||fS(ukCheck if the metadata is compliant. If strict is True then raise if
        no Name or Version are provideduNameuVersionumissing required metadata: %su, u	Home-pageuAuthoruMetadata-Versionu1.2cs5x.|D]&}�j|jd�d�sdSqWdS(Nu;iFT(uis_valid_matcherusplituFalseuTrue(uvalueuv(uscheme(u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuare_valid_constraintss
u3LegacyMetadata.check.<locals>.are_valid_constraintsuWrong value for %r: %s(uNameuVersion(u	Home-pageuAuthorN(
uset_metadata_versionuappendujoinuMetadataMissingErroru
get_schemeuschemeu_PREDICATE_FIELDSu_VERSIONS_FIELDSuis_valid_constraint_listu_VERSION_FIELDSuis_valid_versionugetuNone(uselfustrictumissinguwarningsuattrumsguare_valid_constraintsufieldsu
controllerufielduvalue((uschemeu5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyucheck�s2




	
"uLegacyMetadata.checkcCs0|j�dB}i}x;|D]3\}}|s?||jkr||||<qqW|ddkr�dK}x�|D]]\}}|s�||jkrq|d&kr�||||<q�d,d-�||D�||<qqqqWnW|dd.kr,dO}x>|D]3\}}|s||jkr�||||<q�q�Wn|S(Pu�Return fields as a dict.

        Field names will be converted to use the underscore-lowercase style
        instead of hyphen-mixed case (i.e. home_page instead of Home-page).
        umetadata_versionuMetadata-VersionunameuNameuversionuVersionusummaryuSummaryu	home_pageu	Home-pageuauthoruAuthoruauthor_emailuAuthor-emailulicenseuLicenseudescriptionuDescriptionukeywordsuKeywordsuplatformuPlatformu
classifieru
Classifierudownload_urluDownload-URLu1.2u
requires_distu
Requires-Disturequires_pythonuRequires-Pythonurequires_externaluRequires-Externalu
provides_distu
Provides-Distuobsoletes_distuObsoletes-Distuproject_urluProject-URLu
maintaineru
Maintainerumaintainer_emailuMaintainer-emailcSsg|]}dj|��qS(u,(ujoin(u.0uu((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu
<listcomp>@s	u)LegacyMetadata.todict.<locals>.<listcomp>u1.1uprovidesuProvidesurequiresuRequiresu	obsoletesu	Obsoletes(umetadata_versionuMetadata-Version(unameuName(uversionuVersion(usummaryuSummary(u	home_pageu	Home-page(uauthoruAuthor(uauthor_emailuAuthor-email(ulicenseuLicense(udescriptionuDescription(ukeywordsuKeywords(uplatformuPlatform(u
classifieru
Classifier(udownload_urluDownload-URL(
(umetadata_versionuMetadata-Version(unameuName(uversionuVersion(usummaryuSummary(u	home_pageu	Home-page(uauthoruAuthor(uauthor_emailuAuthor-email(ulicenseuLicense(udescriptionuDescription(ukeywordsuKeywords(uplatformuPlatform(u
classifieru
Classifier(udownload_urluDownload-URL(u
requires_distu
Requires-Dist(urequires_pythonuRequires-Python(urequires_externaluRequires-External(u
provides_distu
Provides-Dist(uobsoletes_distuObsoletes-Dist(uproject_urluProject-URL(u
maintaineru
Maintainer(umaintainer_emailuMaintainer-email((u
requires_distu
Requires-Dist(urequires_pythonuRequires-Python(urequires_externaluRequires-External(u
provides_distu
Provides-Dist(uobsoletes_distuObsoletes-Dist(uproject_urluProject-URL(u
maintaineru
Maintainer(umaintainer_emailuMaintainer-email(uprovidesuProvides(urequiresuRequires(u	obsoletesu	Obsoletes((uprovidesuProvides(urequiresuRequires(u	obsoletesu	Obsoletes(uset_metadata_versionu_fields(uselfuskip_missingumapping_1_0udataukeyu
field_nameumapping_1_2umapping_1_1((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyutodictsP
%uLegacyMetadata.todictcCsL|ddkr:x'dD]}||kr||=qqWn|d|7<dS(NuMetadata-Versionu1.1u	ObsoletesuRequiresuProvidesu
Requires-Dist(u	ObsoletesuRequiresuProvides((uselfurequirementsufield((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuadd_requirementsNs

uLegacyMetadata.add_requirementscCstt|d��S(NuMetadata-Version(ulistu_version2fieldlist(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyukeysYsuLegacyMetadata.keysccs x|j�D]}|Vq
WdS(N(ukeys(uselfukey((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu__iter__\suLegacyMetadata.__iter__cs�fdd��j�D�S(Ncsg|]}�|�qS(((u.0ukey(uself(u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu
<listcomp>as	u)LegacyMetadata.values.<locals>.<listcomp>(ukeys(uself((uselfu5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuvalues`suLegacyMetadata.valuescs�fdd��j�D�S(Ncs g|]}|�|f�qS(((u.0ukey(uself(u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu
<listcomp>ds	u(LegacyMetadata.items.<locals>.<listcomp>(ukeys(uself((uselfu5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuitemscsuLegacyMetadata.itemscCsd|jj|j|jfS(Nu
<%s %s %s>(u	__class__u__name__unameuversion(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu__repr__fsuLegacyMetadata.__repr__NF($u__name__u
__module__u__qualname__u__doc__uNoneu__init__uset_metadata_versionu_write_fieldu__getitem__u__setitem__u__delitem__u__contains__u
_convert_nameu_default_valueu_remove_line_prefixu__getattr__uFalseuget_fullnameuis_fielduis_multi_fieldureadu	read_fileuwriteu
write_fileuupdateusetu_MISSINGugetucheckutodictuadd_requirementsukeysu__iter__uvaluesuitemsu__repr__(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuLegacyMetadata�s>		,,;uLegacyMetadataupydist.jsoncBs�|EeZdZdZejd�Zejdej�Ze	Z
ejd�ZdZde
Zifd6fd6dQd
6ZdZdZieffd
6edRfd6e
dSfd6edTfd
6ZdUZdPdPdPddd�ZedV�ZdPefZdPefZi
defd6defd6ed6ed6ed6defd6ed6ed 6ed!6ed"6d#efd$6dWd&6dXd
6Z[[d(d)�ZdPd*d+�Zd,d-�Ze d.d/��Z!e d0d1��Z"e"j#d2d1��Z"dPdPd3d4�Z$e d5d6��Z%e d7d8��Z&e&j#d9d8��Z&d:d;�Z'd<d=�Z(d>d?�Z)d@dA�Z*idBd6dCd6dDd6dEd
6dFdG6d#d$6Z+dHdI�Z,dPdPdYdZdJdK�Z/dLdM�Z0dNdO�Z1dPS([uMetadatau�
    The metadata of a release. This implementation uses 2.0 (JSON)
    metadata where possible. If not possible, it wraps a LegacyMetadata
    instance which handles the key-value metadata format.
    u
^\d+(\.\d+)*$u!^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$u	.{1,2047}u2.0udistlib (%s)unameuversionulegacyusummaryuqname version license summary description author author_email keywords platform home_page classifiers download_urluwextras run_requires test_requires build_requires dev_requires provides meta_requires obsoleted_by supports_environmentsumetadata_versionu_legacyu_datauschemeudefaultcCs�|||gjd�dkr-td��nd|_d|_||_|dk	r�y|j||�||_Wq�tk
r�td|d|�|_|j	�Yq�Xn�d}|r�t
|d��}|j�}WdQXn|r�|j�}n|dkri|jd6|j
d6|_n�t|t�s@|jd�}ny)tj|�|_|j|j|�Wn:tk
r�td	t|�d|�|_|j	�YnXdS(
Niu'path, fileobj and mapping are exclusiveumappinguschemeurbumetadata_versionu	generatoruutf-8ufileobj(ucountuNoneu	TypeErroru_legacyu_datauschemeu_validate_mappingu MetadataUnrecognizedVersionErroruLegacyMetadatauvalidateuopenureaduMETADATA_VERSIONu	GENERATORu
isinstanceu	text_typeudecodeujsonuloadsu
ValueErroruStringIO(uselfupathufileobjumappinguschemeudatauf((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu__init__�s>			



uMetadata.__init__ulicenseukeywordsu
Requires-Disturun_requiresuSetup-Requires-Distubuild_requiresudev_requiresu
test_requiresu
meta_requiresuProvides-Extrauextrasumodulesu
namespacesuexportsucommandsu
ClassifieruclassifiersuDownload-URLu
source_urluMetadata-VersioncCstj|d�}tj|d�}||kr�||\}}|jr�|dkrs|dkrgdn|�}q�|jj|�}q|dkr�dn|�}|jj||�}nQ||kr�tj||�}n0|jr�|jj|�}n|jj|�}|S(Nucommon_keysumapped_keys(uobjectu__getattribute__u_legacyuNoneugetu_data(uselfukeyucommonumappedulkumakeruresultuvalue((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu__getattribute__�s 		uMetadata.__getattribute__cCso||jkrk|j|\}}|p.|j|krk|j|�}|shtd||f��qhqkndS(Nu*%r is an invalid value for the %r property(uSYNTAX_VALIDATORSuschemeumatchuMetadataInvalidError(uselfukeyuvalueuschemeupatternu
exclusionsum((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu_validate_value�suMetadata._validate_valuecCs"|j||�tj|d�}tj|d�}||kr�||\}}|jr~|dkrnt�n||j|<q||j|<n�||kr�tj|||�nn|dkr�t|t	�r�|j
�}|r�|j�}q�g}q�n|jr||j|<n
||j|<dS(Nucommon_keysumapped_keysukeywords(u_validate_valueuobjectu__getattribute__u_legacyuNoneuNotImplementedErroru_datau__setattr__u
isinstanceustring_typesustripusplit(uselfukeyuvalueucommonumappedulku_((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu__setattr__�s*			uMetadata.__setattr__cCst|j|jd�S(NT(u_get_name_and_versionunameuversionuTrue(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuname_and_versionsuMetadata.name_and_versioncCsd|jr|jd}n|jjdg�}d|j|jf}||kr`|j|�n|S(Nu
Provides-Distuprovidesu%s (%s)(u_legacyu_datau
setdefaultunameuversionuappend(uselfuresultus((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuprovidess	uMetadata.providescCs*|jr||jd<n
||jd<dS(Nu
Provides-Distuprovides(u_legacyu_data(uselfuvalue((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuprovides%s	c
	CsL|jr|}n6g}t|p$g|j�}x�|D]�}d|kr^d|kr^d}nZd|krsd}n|jd�|k}|r�|jd�}|r�t||�}q�n|r7|j|d�q7q7WxodD]g}d|}	|	|kr�|j|	�|jjd|g�}|j|j	|d	|d
|��q�q�W|S(
u�
        Base method to get dependencies, given a set of extras
        to satisfy and an optional environment context.
        :param reqts: A list of sometimes-wanted dependencies,
                      perhaps dependent on extras and environment.
        :param extras: A list of optional components being requested.
        :param env: An optional environment for marker evaluation.
        uextrauenvironmenturequiresubuildudevutestu:%s:u%s_requiresuextrasuenvT(ubuildudevutest(
u_legacyu
get_extrasuextrasuTrueugetu	interpretuextenduremoveu_datauget_requirements(
uselfureqtsuextrasuenvuresultuduincludeumarkerukeyue((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuget_requirements,s0			
		


uMetadata.get_requirementscCs|jr|j�S|jS(N(u_legacyu_from_legacyu_data(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu
dictionaryVs	
uMetadata.dictionarycCs)|jrt�nt|j|j�SdS(N(u_legacyuNotImplementedErroruextract_by_keyu_datauDEPENDENCY_KEYS(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyudependencies\s		uMetadata.dependenciescCs&|jrt�n|jj|�dS(N(u_legacyuNotImplementedErroru_datauupdate(uselfuvalue((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyudependenciescs		c	Cs�|jd�|jkr$t��ng}xH|jj�D]7\}}||kr:||krq|j|�qqq:q:W|r�ddj|�}t|��nx-|j�D]\}}|j|||�q�WdS(Numetadata_versionuMissing metadata items: %su, (	ugetuMETADATA_VERSIONu MetadataUnrecognizedVersionErroruMANDATORY_KEYSuitemsuappendujoinuMetadataMissingErroru_validate_value(	uselfumappinguschemeumissingukeyu
exclusionsumsgukuv((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu_validate_mappingjsuMetadata._validate_mappingcCs`|jrF|jjd�\}}|s-|r\tjd||�q\n|j|j|j�dS(Nu#Metadata: missing: %s, warnings: %sT(u_legacyucheckuTrueuloggeruwarningu_validate_mappingu_datauscheme(uselfumissinguwarnings((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuvalidatexs		uMetadata.validatecCs6|jr|jjd�St|j|j�}|SdS(NT(u_legacyutodictuTrueuextract_by_keyu_datau
INDEX_KEYS(uselfuresult((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyutodict�s	uMetadata.todictc
Cs-|jr|jst�i|jd6|jd6}|jjd�}xFdD]>}||krL|dkrsd	}n|}||||<qLqLW|jd
g�}|dgkr�g}n||d<d}xE|D]=\}}||kr�||r�i||d6g||<q�q�W|j|d<i}i}	|S(Numetadata_versionu	generatorunameuversionulicenseusummaryudescriptionu
classifieruclassifiersuKeywordsuukeywordsu
requires_disturun_requiresusetup_requires_distubuild_requiresurequiresuprovidesT(unameuversionulicenseusummaryudescriptionu
classifier(u
requires_disturun_requires(usetup_requires_distubuild_requires((u
requires_disturun_requires(usetup_requires_distubuild_requires(	u_legacyu_datauAssertionErroruMETADATA_VERSIONu	GENERATORutodictuTrueugetuprovides(
uselfuresultulmdukunkukwukeysuokuauthoru
maintainer((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu_from_legacy�s2


		

uMetadata._from_legacyuNameuVersionuLicenseuSummaryuDescriptionudescriptioncCs�dd�}|jr|js%t�t�}|j}x:|jj�D])\}}||krG||||<qGqGW||j|j�}||j|j	�}|j
r�t|j
�|d<nt|�|d<t|�|d<|S(NcSs�t�}x�|D]�}|jd�}|jd�}|d}x�|D]�}|ri|ri|j|�qEd}|r�d|}n|r�|r�d||f}q�|}n|jdj||f��qEWqW|S(Nuextrauenvironmenturequiresuu
extra == "%s"u(%s) and %su;(usetugetuaddujoin(uentriesureqtsueuextrauenvurlisturumarker((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuprocess_entries�s"	



	$u,Metadata._to_legacy.<locals>.process_entriesuProvides-Extrau
Requires-DistuSetup-Requires-Dist(u_datau_legacyuAssertionErroruLegacyMetadatauLEGACY_MAPPINGuitemsurun_requiresu
meta_requiresubuild_requiresudev_requiresuextrasusorted(uselfuprocess_entriesuresultunmdunkuokur1ur2((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu
_to_legacy�s			uMetadata._to_legacycCs||gjd�dkr*td��n|j�|r�|jrO|j}n|j�}|rw|j|d|�q|j|d|�n�|jr�|j�}n	|j	}|r�t
j||dd
dddd
�n@t
j|dd	��)}t
j||dd
dddd
�WdQXdS(Niu)Exactly one of path and fileobj is neededuskip_unknownuensure_asciiuindentiu	sort_keysuwuutf-8T(ucountuNoneu
ValueErroruvalidateu_legacyu
_to_legacyuwriteu
write_fileu_from_legacyu_dataujsonudumpuTrueucodecsuopen(uselfupathufileobjulegacyuskip_unknownu	legacy_mduduf((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuwrite�s&
			
uMetadata.writecCs�|jr|jj|�n�|jjdg�}d}x0|D](}d|kr>d|kr>|}Pq>q>W|dkr�i|d6}|jd|�n*t|d�t|�B}t|�|d<dS(Nurun_requiresuenvironmentuextraurequiresi(u_legacyuadd_requirementsu_datau
setdefaultuNoneuinsertusetusorted(uselfurequirementsurun_requiresualwaysuentryurset((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuadd_requirements�s	

uMetadata.add_requirementscCs;|jpd}|jpd}d|jj|j||fS(Nu	(no name)u
no versionu<%s %s %s (%s)>(unameuversionu	__class__u__name__umetadata_version(uselfunameuversion((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu__repr__�suMetadata.__repr__N(ulegacy(ulegacy(ulegacy(ulegacy(u_legacyu_datauscheme(unameuversionulicenseukeywordsusummary(uDownload-URLN(uMetadata-VersionNFT(2u__name__u
__module__u__qualname__u__doc__ureucompileuMETADATA_VERSION_MATCHERuIuNAME_MATCHERuPEP426_VERSION_REuVERSION_MATCHERuSUMMARY_MATCHERuMETADATA_VERSIONu__version__u	GENERATORuMANDATORY_KEYSu
INDEX_KEYSuDEPENDENCY_KEYSuSYNTAX_VALIDATORSu	__slots__uNoneu__init__usetucommon_keysulistu	none_listudictu	none_dictumapped_keysu__getattribute__u_validate_valueu__setattr__upropertyuname_and_versionuprovidesusetteruget_requirementsu
dictionaryudependenciesu_validate_mappinguvalidateutodictu_from_legacyuLEGACY_MAPPINGu
_to_legacyuFalseuTrueuwriteuadd_requirementsu__repr__(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyuMetadatans�




	,





*	
%(Au__doc__u
__future__uunicode_literalsucodecsuemailumessage_from_fileujsonuloggingureuuDistlibExceptionu__version__ucompatuStringIOustring_typesu	text_typeumarkersu	interpretuutiluextract_by_keyu
get_extrasuversionu
get_schemeuPEP426_VERSION_REu	getLoggeru__name__uloggeruMetadataMissingErroruMetadataConflictErroru MetadataUnrecognizedVersionErroruMetadataInvalidErroru__all__uPKG_INFO_ENCODINGuPKG_INFO_PREFERRED_VERSIONucompileu_LINE_PREFIXu_241_FIELDSu_314_FIELDSu_314_MARKERSu_345_FIELDSu_345_MARKERSu_426_FIELDSu_426_MARKERSusetu_ALL_FIELDSuupdateuEXTRA_REu_version2fieldlistu
_best_versionu_ATTR2FIELDu_PREDICATE_FIELDSu_VERSIONS_FIELDSu_VERSION_FIELDSu_LISTFIELDSu_LISTTUPLEFIELDSu_ELEMENTSFIELDu_UNICODEFIELDSuobjectu_MISSINGu	_FILESAFEuFalseu_get_name_and_versionuLegacyMetadatauMETADATA_FILENAMEuMetadata(((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/metadata.pyu<module>	s�																		



8
									
��site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-33.pyc000064400000147504151733463540021651 0ustar00�
7�Reb�c@sddlZddlmZddlZddlZddlZddlZddlZyddlZWne	k
r�ddl
ZYnXddlZddlm
Z
ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZddlmZm Z m!Z!ddl"m#Z#ddl$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,dd	l-m.Z.m/Z/dd
l0m1Z1m2Z2ej3e4�Z5ej6d�Z7ej6dej8�Z9ej6d
�Z:dZ;e<dd�Z=Gdd�de�Z>Gdd�de?�Z@Gdd�de@�ZAGdd�de@�ZBGdd�de?�ZCGdd�de@�ZDGdd�de@�ZEGdd �d e@�ZFGd!d"�d"e@�ZGGd#d$�d$e@�ZHeHeF�eDd%d&d'�d(d)�ZIeIjJZJej6d*�ZKGd+d,�d,e?�ZLdS(-iN(uBytesIOi(uDistlibException(uurljoinuurlparseu
urlunparseuurl2pathnameupathname2urluqueueuquoteuunescapeustring_typesubuild_openeruHTTPRedirectHandleruRequestu	HTTPErroruURLError(uDistributionuDistributionPathu	make_dist(uMetadata(ucached_propertyuparse_credentialsuensure_slashusplit_filenameuget_project_datauparse_requirementuparse_name_and_versionuServerProxy(u
get_schemeuUnsupportedVersionError(uWheelu
is_compatibleu^(\w+)=([a-f0-9]+)u;\s*charset\s*=\s*(.*)\s*$utext/html|application/x(ht)?mluhttp://python.org/pypicCs1|dkrt}nt|dd�}|j�S(u�
    Return all distribution names known by an index.
    :param url: The URL of the index.
    :return: A list of all known distribution names.
    utimeoutg@N(uNoneu
DEFAULT_INDEXuServerProxyu
list_packages(uurluclient((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuget_all_distribution_names)s	uget_all_distribution_namescBs4|EeZdZdZdd�ZeZZZdS(uRedirectHandleruE
    A class to work around a bug in some Python 3.2.x releases.
    c	Cs�d}x(dD] }||kr
||}Pq
q
W|dkrAdSt|�}|jdkr�t|j�|�}t|d�r�|j||�q�|||<ntj||||||�S(Nulocationuuriuureplace_header(ulocationuuri(	uNoneuurlparseuschemeuurljoinuget_full_urluhasattrureplace_headeruBaseRedirectHandleruhttp_error_302(	uselfurequfpucodeumsguheadersunewurlukeyuurlparts((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuhttp_error_302=s


uRedirectHandler.http_error_302N(u__name__u
__module__u__qualname__u__doc__uhttp_error_302uhttp_error_301uhttp_error_303uhttp_error_307(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuRedirectHandler4suRedirectHandlercBs�|EeZdZdZd*Zd+Zd,Zd)Zed-Z	dd
d�Z
dd�Zdd�Zdd�Z
eee
�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd.d'd(�Zd)S(/uLocatoruG
    A base class for locators - things that locate distributions.
    u.tar.gzu.tar.bz2u.taru.zipu.tgzu.tbzu.eggu.exeu.whlu.pdfudefaultcCs1i|_||_tt��|_d|_dS(u^
        Initialise an instance.
        :param scheme: Because locators look for most recent versions, they
                       need to know the version scheme to use. This specifies
                       the current PEP-recommended scheme - use ``'legacy'``
                       if you need to support existing distributions on PyPI.
        N(u_cacheuschemeubuild_openeruRedirectHandleruopeneruNoneumatcher(uselfuscheme((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu__init__cs		uLocator.__init__cCs|jj�dS(N(u_cacheuclear(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuclear_cacheusuLocator.clear_cachecCs|jS(N(u_scheme(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu_get_schemexsuLocator._get_schemecCs
||_dS(N(u_scheme(uselfuvalue((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu_set_scheme{suLocator._set_schemecCstd��dS(u=
        For a given project, get a dictionary mapping available versions to Distribution
        instances.

        This should be implemented in subclasses.

        If called from a locate() request, self.matcher will be set to a
        matcher for the requirement to satisfy, otherwise it will be None.
        u Please implement in the subclassN(uNotImplementedError(uselfuname((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu_get_project�s
uLocator._get_projectcCstd��dS(uJ
        Return all the distribution names known to this locator.
        u Please implement in the subclassN(uNotImplementedError(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuget_distribution_names�suLocator.get_distribution_namescCs`|jdkr!|j|�}n;||jkr@|j|}n|j|�}||j|<|S(u�
        For a given project, get a dictionary mapping available versions to Distribution
        instances.

        This calls _get_project to do all the work, and just implements a caching layer on top.
        N(u_cacheuNoneu_get_project(uselfunameuresult((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuget_project�s
uLocator.get_projectcCs7t|�}|jdkd|jktj|j�fS(uu
        Give an url a score which can be used to choose preferred URLs
        for a given project release.
        uhttpsupypi.python.org(uurlparseuschemeunetlocu	posixpathubasenameupath(uselfuurlut((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu	score_url�suLocator.score_urlcCs{|}|rw|j|�}|j|�}||kr?|}n||kratjd||�qwtjd||�n|S(uL
        Choose one of two URLs where both are candidates for distribution
        archives for the same version of a distribution (for example,
        .tar.gz vs. zip).

        The current implement favours http:// URLs over https://, archives
        from PyPI over those from other locations and then the archive name.
        uNot replacing %r with %ruReplacing %r with %r(u	score_urluloggerudebug(uselfuurl1uurl2uresultus1us2((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu
prefer_url�s		uLocator.prefer_urlcCs
t||�S(uZ
        Attempt to split a filename in project name, version and Python version.
        (usplit_filename(uselfufilenameuproject_name((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyusplit_filename�suLocator.split_filenamecCs�dd�}d}t|�\}}}}}	}
|
j�jd�r[tjd||
�ntj|
�}|r�|j�\}}
nd\}}
|}|r�|ddkr�|dd�}n|j	d�r�y�t
|�}t||j�r�|dkrd}n||j|�}|r�i|jd	6|jd
6|jd6t|||||	df�d
6djdd�|jD��d6}q�nWq�tk
r�}ztjd|�WYdd}~Xq�Xn|j	|j�r�tj|�}}x�|jD]�}|j	|�r�|dt|��}|j||�}|sHtjd|�nu|\}}}|sm|||�r�i|d	6|d
6|d6t|||||	df�d
6}|r�||d<q�nPq�q�Wn|r�|r�|
|d|<n|S(u
        See if a URL is a candidate for a download URL for a project (the URL
        has typically been scraped from an HTML page).

        If it is, a dictionary is returned with keys "name", "version",
        "filename" and "url"; otherwise, None is returned.
        cSsV|j�|j�}}||kr.d}n$|jdd�|jdd�k}|S(Nu_u-T(uloweruTrueureplace(uname1uname2uresult((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyusame_project�s
	$u:Locator.convert_url_to_download_info.<locals>.same_projectuegg=u %s: version hint in fragment: %riu/Nu.whlunameuversionufilenameuuurlu, cSs/g|]%}djt|dd����qS(u.iN(ujoinulist(u.0uv((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu
<listcomp>�s	u8Locator.convert_url_to_download_info.<locals>.<listcomp>upython-versionuinvalid path for wheel: %su No match for project/version: %su	%s_digest(NNi����i����T(uNoneuurlparseuloweru
startswithuloggerudebuguHASHER_HASHumatchugroupsuendswithuWheelu
is_compatibleu
wheel_tagsuTrueunameuversionufilenameu
urlunparseujoinupyveru	Exceptionuwarningudownloadable_extensionsu	posixpathubasenameulenusplit_filename(uselfuurluproject_nameusame_projecturesultuschemeunetlocupathuparamsuqueryufragumualgoudigestuorigpathuwheeluincludeueufilenameuextutunameuversionupyver((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuconvert_url_to_download_info�sj
	
	


'&u$Locator.convert_url_to_download_infocCsEd}x8dD]0}d|}||kr
|||f}Pq
q
W|S(u�
        Get a digest from a dictionary by looking at keys of the form
        'algo_digest'.

        Returns a 2-tuple (algo, digest) if found, else None. Currently
        looks only for SHA256, then MD5.
        usha256umd5u	%s_digestN(usha256umd5(uNone(uselfuinfouresultualgoukey((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu_get_digests

uLocator._get_digestcCs�|jd�}|jd�}||kr@||}|j}n!t||d|j�}|j}|j|�|_|j|dkr�|j|j|d�|_n||_|||<dS(u�
        Update a result dictionary (the final result from _get_project) with a dictionary for a
        specific version, whih typically holds information gleaned from a filename or URL for an
        archive for the distribution.
        unameuversionuschemeuurlN(	upopumetadatau	make_distuschemeu_get_digestudigestu
source_urlu
prefer_urlulocator(uselfuresultuinfounameuversionudistumd((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu_update_version_data#s
		uLocator._update_version_datacCs�d	}t|�}|d	kr1td|��nt|j�}|j|j�|_}tjd|t	|�j
�|j|j�}|r�g}|j
}	x�|D]�}
ye|j|
�s�tjd||
�n<|s�|	|
�jr�|j|
�ntjd|
|j�Wq�tk
r5tjd||
�Yq�Xq�Wt|�dkrdt|d|j�}n|r�tjd|�||d
}q�n|r�|jr�|j|_nd	|_|S(u
        Find the most recent distribution which matches the given
        requirement.

        :param requirement: A requirement of the form 'foo (1.0)' or perhaps
                            'foo (>= 1.0, < 2.0, != 1.3)'
        :param prereleases: If ``True``, allow pre-release versions
                            to be located. Otherwise, pre-release versions
                            are not returned.
        :return: A :class:`Distribution` instance, or ``None`` if no such
                 distribution could be located.
        uNot a valid requirement: %rumatcher: %s (%s)u%s did not match %ru%skipping pre-release version %s of %suerror matching %s with %riukeyusorted list: %sNi����(uNoneuparse_requirementuDistlibExceptionu
get_schemeuschemeumatcherurequirementuloggerudebugutypeu__name__uget_projectunameu
version_classumatchu
is_prereleaseuappendu	Exceptionuwarningulenusortedukeyuextras(uselfurequirementuprereleasesuresulturuschemeumatcheruversionsuslistuvclsuk((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyulocate7s>
	
	
		uLocator.locateN(u.tar.gzu.tar.bz2u.taru.zipu.tgzu.tbz(u.eggu.exeu.whl(u.pdf(u.whlF(u__name__u
__module__u__qualname__u__doc__usource_extensionsubinary_extensionsuexcluded_extensionsuNoneu
wheel_tagsudownloadable_extensionsu__init__uclear_cacheu_get_schemeu_set_schemeupropertyuschemeu_get_projectuget_distribution_namesuget_projectu	score_urlu
prefer_urlusplit_filenameuconvert_url_to_download_infou_get_digestu_update_version_datauFalseulocate(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuLocatorSs*
	MuLocatorcsD|EeZdZdZ�fdd�Zdd�Zdd�Z�S(uPyPIRPCLocatoru�
    This locator uses XML-RPC to locate distributions. It therefore
    cannot be used with simple mirrors (that only mirror file content).
    cs8tt|�j|�||_t|dd�|_dS(u�
        Initialise an instance.

        :param url: The URL to use for XML-RPC.
        :param kwargs: Passed to the superclass constructor.
        utimeoutg@N(usuperuPyPIRPCLocatoru__init__ubase_urluServerProxyuclient(uselfuurlukwargs(u	__class__(u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu__init__ms	uPyPIRPCLocator.__init__cCst|jj��S(uJ
        Return all the distribution names known to this locator.
        (usetuclientu
list_packages(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuget_distribution_namesxsu%PyPIRPCLocator.get_distribution_namesc
Csi}|jj|d	�}x�|D]�}|jj||�}|jj||�}td|j�}|d|_|d|_|j	d�|_
|j	dg�|_|j	d�|_t
|�}|r"|d}	|	d|_|j|	�|_||_|||<q"q"W|S(
NuschemeunameuversionulicenseukeywordsusummaryiuurlT(uclientupackage_releasesuTrueurelease_urlsurelease_datauMetadatauschemeunameuversionugetulicenseukeywordsusummaryuDistributionu
source_urlu_get_digestudigestulocator(
uselfunameuresultuversionsuvuurlsudataumetadataudistuinfo((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu_get_project~s&




	uPyPIRPCLocator._get_project(u__name__u
__module__u__qualname__u__doc__u__init__uget_distribution_namesu_get_project(u
__locals__((u	__class__u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuPyPIRPCLocatorhsuPyPIRPCLocatorcsD|EeZdZdZ�fdd�Zdd�Zdd�Z�S(uPyPIJSONLocatoruw
    This locator uses PyPI's JSON interface. It's very limited in functionality
    nad probably not worth using.
    cs)tt|�j|�t|�|_dS(N(usuperuPyPIJSONLocatoru__init__uensure_slashubase_url(uselfuurlukwargs(u	__class__(u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu__init__�suPyPIJSONLocator.__init__cCstd��dS(uJ
        Return all the distribution names known to this locator.
        uNot available from this locatorN(uNotImplementedError(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuget_distribution_names�su&PyPIJSONLocator.get_distribution_namescCsbi}t|jdt|��}y|jj|�}|j�j�}tj|�}t	d|j
�}|d}|d|_|d|_|j
d�|_|j
dg�|_|j
d�|_t|�}|d	}	|	r%|	d
}
|
d|_|j|
�|_||_|||j<nWn5tk
r]}ztjd|�WYdd}~XnX|S(
Nu%s/jsonuschemeuinfounameuversionulicenseukeywordsusummaryuurlsiuurluJSON fetch failed: %s(uurljoinubase_urluquoteuopeneruopenureadudecodeujsonuloadsuMetadatauschemeunameuversionugetulicenseukeywordsusummaryuDistributionu
source_urlu_get_digestudigestulocatoru	Exceptionuloggeru	exception(uselfunameuresultuurlurespudataudumdudistuurlsuinfoue((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu_get_project�s0





	#uPyPIJSONLocator._get_project(u__name__u
__module__u__qualname__u__doc__u__init__uget_distribution_namesu_get_project(u
__locals__((u	__class__u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuPyPIJSONLocator�suPyPIJSONLocatorcBs�|EeZdZdZejdejejBejB�Z	ejdejejB�Z
dd�Zejdej�Ze
dd��Zd	S(
uPageu4
    This class represents a scraped HTML page.
    u�
(rel\s*=\s*(?:"(?P<rel1>[^"]*)"|'(?P<rel2>[^']*)'|(?P<rel3>[^>\s
]*))\s+)?
href\s*=\s*(?:"(?P<url1>[^"]*)"|'(?P<url2>[^']*)'|(?P<url3>[^>\s
]*))
(\s+rel\s*=\s*(?:"(?P<rel4>[^"]*)"|'(?P<rel5>[^']*)'|(?P<rel6>[^>\s
]*)))?
u!<base\s+href\s*=\s*['"]?([^'">]+)cCsM||_||_|_|jj|j�}|rI|jd�|_ndS(uk
        Initialise an instance with the Unicode page contents and the URL they
        came from.
        iN(udataubase_urluurlu_baseusearchugroup(uselfudatauurlum((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu__init__�s
	u
Page.__init__u[^a-z0-9$&+,/:;=?@.#%_\\|-]cCsdd�}t�}x�|jj|j�D]�}|jd�}|dpy|dpy|dpy|dpy|dpy|d	}|d
p�|dp�|d}t|j|�}t|�}|jj	d
d�|�}|j
||f�q+Wt|ddd�dd�}|S(u�
        Return the URLs of all the links on a page together with information
        about their "rel" attribute, for determining which ones to treat as
        downloads and which ones to queue for further scraping.
        cSs@t|�\}}}}}}t||t|�|||f�S(uTidy up an URL.(uurlparseu
urlunparseuquote(uurluschemeunetlocupathuparamsuqueryufrag((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuclean�suPage.links.<locals>.cleanuurel1urel2urel3urel4urel5urel6uurl1uurl2uurl3cSsdt|jd��S(Nu%%%2xi(uordugroup(um((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu<lambda>�suPage.links.<locals>.<lambda>ukeycSs|dS(Ni((ut((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu<lambda>�sureverseT(
usetu_hrefufinditerudatau	groupdictuurljoinubase_urluunescapeu	_clean_reusubuaddusorteduTrue(uselfucleanuresultumatchudureluurl((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyulinks�s	u
Page.linksN(u__name__u
__module__u__qualname__u__doc__ureucompileuIuSuXu_hrefu_baseu__init__u	_clean_reucached_propertyulinks(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuPage�suPagecs�|EeZdZdZiejd6dd�d6dd�d6Zdd�fd	d
�Zdd�Z	d
d�Z
dd�Zej
dej�Zdd�Zdd�Zdd�Zdd�Zdd�Zej
d�Zdd�Z�S( uSimpleScrapingLocatoru�
    A locator which scrapes HTML pages to locate downloads for a distribution.
    This runs multiple threads to do the I/O; performance is at least as good
    as pip's PackageFinder, which works in an analogous fashion.
    udeflatecCstjdtt��j�S(Nufileobj(ugzipuGzipFileuBytesIOuduread(ub((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu<lambda>suSimpleScrapingLocator.<lambda>ugzipcCs|S(N((ub((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu<lambda>sunonei
cs�tt|�j|�t|�|_||_i|_t�|_t	j
�|_t�|_d|_||_tj�|_tj�|_dS(u�
        Initialise an instance.
        :param url: The root URL to use for scraping.
        :param timeout: The timeout, in seconds, to be applied to requests.
                        This defaults to ``None`` (no timeout specified).
        :param num_workers: The number of worker threads you want to do I/O,
                            This defaults to 10.
        :param kwargs: Passed to the superclass.
        NF(usuperuSimpleScrapingLocatoru__init__uensure_slashubase_urlutimeoutu_page_cacheusetu_seenuqueueuQueueu	_to_fetchu
_bad_hostsuFalseuskip_externalsunum_workersu	threadinguRLocku_locku_gplock(uselfuurlutimeoutunum_workersukwargs(u	__class__(u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu__init__s
				uSimpleScrapingLocator.__init__cCscg|_xSt|j�D]B}tjd|j�}|jd�|j�|jj	|�qWdS(u�
        Threads are created only when get_project is called, and terminate
        before it returns. They are there primarily to parallelise I/O (i.e.
        fetching web pages).
        utargetNT(
u_threadsurangeunum_workersu	threadinguThreadu_fetchu	setDaemonuTrueustartuappend(uselfuiut((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu_prepare_threadss	

u&SimpleScrapingLocator._prepare_threadscCsOx!|jD]}|jjd�q
Wx|jD]}|j�q.Wg|_dS(uu
        Tell all the threads to terminate (by sending a sentinel value) and
        wait for them to do so.
        N(u_threadsu	_to_fetchuputuNoneujoin(uselfut((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu
_wait_threads,s
u#SimpleScrapingLocator._wait_threadscCs�i}|j��||_||_t|jdt|��}|jj�|jj�|j	�z1t
jd|�|jj
|�|jj�Wd|j�X|`WdQX|S(Nu%s/uQueueing %s(u_gplockuresultuproject_nameuurljoinubase_urluquoteu_seenuclearu_page_cacheu_prepare_threadsuloggerudebugu	_to_fetchuputujoinu
_wait_threads(uselfunameuresultuurl((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu_get_project9s
		


u"SimpleScrapingLocator._get_projectu<\b(linux-(i\d86|x86_64|arm\w+)|win(32|-amd64)|macosx-?\d+)\bcCs|jj|�S(uD
        Does an URL refer to a platform-specific download?
        (uplatform_dependentusearch(uselfuurl((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu_is_platform_dependentNsu,SimpleScrapingLocator._is_platform_dependentc
Csp|j|�rd}n|j||j�}tjd||�|rl|j�|j|j|�WdQXn|S(u%
        See if an URL is a suitable download for a project.

        If it is, register information in the result dictionary (for
        _get_project) about the specific version it's for.

        Note that the return value isn't actually used other than as a boolean
        value.
        uprocess_download: %s -> %sN(	u_is_platform_dependentuNoneuconvert_url_to_download_infouproject_nameuloggerudebugu_locku_update_version_datauresult(uselfuurluinfo((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu_process_downloadTs
	
u'SimpleScrapingLocator._process_downloadc
Cst|�\}}}}}}|j|j|j|j�rGd}n�|jrl|j|j�rld}n�|j|j�s�d}ny|dkr�d}nd|d
kr�d}nO|j	|�r�d}n7|j
dd�d}	|	j�d	kr�d}nd}t
jd
||||�|S(u�
        Determine whether a link URL from a referring page and with a
        particular "rel" attribute should be queued for scraping.
        uhomepageudownloaduhttpuhttpsuftpu:iiu	localhostu#should_queue: %s (%s) from %s -> %sF(uhomepageudownload(uhttpuhttpsuftpT(uurlparseuendswithusource_extensionsubinary_extensionsuexcluded_extensionsuFalseuskip_externalsu
startswithubase_urlu_is_platform_dependentusplituloweruTrueuloggerudebug(
uselfulinkureferrerureluschemeunetlocupathu_uresultuhost((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu
_should_queuehs*
							
u#SimpleScrapingLocator._should_queuecCs�x�|jj�}z�|r�|j|�}|dkr<wnx�|jD]y\}}||jkrF|jj|�|j|�r�|j|||�r�t	j
d||�|jj|�q�qFqFWnWd|jj�X|sPqqdS(u�
        Get a URL to fetch from the work queue, get the HTML page, examine its
        links for download candidates and candidates for further scraping.

        This is a handy method to run in a thread.
        uQueueing %s from %sN(
u	_to_fetchugetuget_pageuNoneulinksu_seenuaddu_process_downloadu
_should_queueuloggerudebuguputu	task_done(uselfuurlupageulinkurel((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu_fetch�s"!uSimpleScrapingLocator._fetchcCst|�\}}}}}}|dkrZtjjt|��rZtt|�d�}n||jkr�|j|}tj	d||�n�|j
dd�d}d}||jkr�tj	d||�nAt
|did	d
6�}zy8tj	d|�|jj|d|j�}	tj	d
|�|	j�}
|
jdd�}tj|�r |	j�}|	j�}
|
jd�}|r�|j|}||
�}
nd}tj|�}|r�|jd�}ny|
j|�}
Wn!tk
r|
jd�}
YnXt|
|�}||j|<nWn�tk
rm}z*|jdkr[tj d||�nWYdd}~Xn�t!k
r�}z8tj d||�|j"�|jj#|�WdQXWYdd}~Xn8t$k
r�}ztj d||�WYdd}~XnXWd||j|<X|S(u
        Get the HTML for an URL, possibly from an in-memory cache.

        XXX TODO Note: this cache is never actually cleared. It's assumed that
        the data won't get stale over the lifetime of a locator instance (not
        necessarily true for the default_locator).
        ufileu
index.htmluReturning %s from cache: %su:iiuSkipping %s due to bad host %suheadersuidentityuAccept-encodinguFetching %sutimeoutu
Fetched %suContent-TypeuuContent-Encodinguutf-8ulatin-1i�uFetch failed: %s: %sN(%uurlparseuosupathuisdiruurl2pathnameuurljoinuensure_slashu_page_cacheuloggerudebugusplituNoneu
_bad_hostsuRequestuopeneruopenutimeoutuinfougetuHTML_CONTENT_TYPEumatchugeturlureadudecodersuCHARSETusearchugroupudecodeuUnicodeErroruPageu	HTTPErrorucodeu	exceptionuURLErroru_lockuaddu	Exception(uselfuurluschemeunetlocupathu_uresultuhosturequrespuheadersucontent_typeu	final_urludatauencodingudecoderumue((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuget_page�sZ	$


(
(*uSimpleScrapingLocator.get_pageu<a href=[^>]*>([^<]+)<cCsqt�}|j|j�}|s7td|j��nx3|jj|j�D]}|j|jd��qMW|S(uJ
        Return all the distribution names known to this locator.
        uUnable to get %si(	usetuget_pageubase_urluDistlibExceptionu_distname_reufinditerudatauaddugroup(uselfuresultupageumatch((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuget_distribution_names�s	u,SimpleScrapingLocator.get_distribution_namesN(u__name__u
__module__u__qualname__u__doc__uzlibu
decompressudecodersuNoneu__init__u_prepare_threadsu
_wait_threadsu_get_projectureucompileuIuplatform_dependentu_is_platform_dependentu_process_downloadu
_should_queueu_fetchuget_pageu_distname_reuget_distribution_names(u
__locals__((u	__class__u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuSimpleScrapingLocator�s$



	;uSimpleScrapingLocatorcsP|EeZdZdZ�fdd�Zdd�Zdd�Zdd	�Z�S(
uDirectoryLocatoru?
    This class locates distributions in a directory tree.
    cso|jdd�|_tt|�j|�tjj|�}tjj	|�sbt
d|��n||_dS(u�
        Initialise an instance.
        :param path: The root of the directory tree to search.
        :param kwargs: Passed to the superclass constructor,
                       except for:
                       * recursive - if True (the default), subdirectories are
                         recursed into. If False, only the top-level directory
                         is searched,
        u	recursiveuNot a directory: %rNT(upopuTrueu	recursiveusuperuDirectoryLocatoru__init__uosupathuabspathuisdiruDistlibExceptionubase_dir(uselfupathukwargs(u	__class__(u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu__init__�s
uDirectoryLocator.__init__cCs|j|j�S(u�
        Should a filename be considered as a candidate for a distribution
        archive? As well as the filename, the directory which contains it
        is provided, though not used by the current implementation.
        (uendswithudownloadable_extensions(uselfufilenameuparent((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyushould_includesuDirectoryLocator.should_includec		Cs�i}x�tj|j�D]�\}}}x�|D]�}|j||�r/tjj||�}tddttjj|��dddf�}|j	||�}|r�|j
||�q�q/q/W|jsPqqW|S(Nufileu(uosuwalkubase_dirushould_includeupathujoinu
urlunparseupathname2urluabspathuconvert_url_to_download_infou_update_version_datau	recursive(	uselfunameuresulturootudirsufilesufnuurluinfo((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu_get_projects"
		uDirectoryLocator._get_projectc	Cs�t�}x�tj|j�D]�\}}}x�|D]�}|j||�r2tjj||�}tddttjj	|��dddf�}|j
|d�}|r�|j|d�q�q2q2W|j
sPqqW|S(uJ
        Return all the distribution names known to this locator.
        ufileuunameN(usetuosuwalkubase_dirushould_includeupathujoinu
urlunparseupathname2urluabspathuconvert_url_to_download_infouNoneuaddu	recursive(uselfuresulturootudirsufilesufnuurluinfo((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuget_distribution_namess	"
		u'DirectoryLocator.get_distribution_names(u__name__u
__module__u__qualname__u__doc__u__init__ushould_includeu_get_projectuget_distribution_names(u
__locals__((u	__class__u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuDirectoryLocator�s
uDirectoryLocatorcBs2|EeZdZdZdd�Zdd�ZdS(uJSONLocatoru
    This locator uses special extended metadata (not available on PyPI) and is
    the basis of performant dependency resolution in distlib. Other locators
    require archive downloads before dependencies can be determined! As you
    might imagine, that can be slow.
    cCstd��dS(uJ
        Return all the distribution names known to this locator.
        uNot available from this locatorN(uNotImplementedError(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuget_distribution_names2su"JSONLocator.get_distribution_namesc	Cs
i}t|�}|r	x�|jdg�D]�}|ddks+|ddkrWq+nt|d|dd|jdd	�d
|j�}|j}|d|_d|kr�|dr�d
|df|_n|jdi�|_|jdi�|_|||j	<q+Wn|S(Nufilesuptypeusdistu	pyversionusourceunameuversionusummaryuPlaceholder for summaryuschemeuurludigestumd5urequirementsuexports(
uget_project_dataugetu	make_distuschemeumetadatau
source_urludigestudependenciesuexportsuversion(uselfunameuresultudatauinfoudistumd((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu_get_project8s$ 			
uJSONLocator._get_projectN(u__name__u
__module__u__qualname__u__doc__uget_distribution_namesu_get_project(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuJSONLocator+suJSONLocatorcs8|EeZdZdZ�fdd�Zdd�Z�S(uDistPathLocatoru�
    This locator finds installed distributions in a path. It can be useful for
    adding to an :class:`AggregatingLocator`.
    cs8tt|�j|�t|t�s+t�||_dS(us
        Initialise an instance.

        :param distpath: A :class:`DistributionPath` instance to search.
        N(usuperuDistPathLocatoru__init__u
isinstanceuDistributionPathuAssertionErrorudistpath(uselfudistpathukwargs(u	__class__(u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu__init__UsuDistPathLocator.__init__cCs;|jj|�}|dkr'i}ni||j6}|S(N(udistpathuget_distributionuNoneuversion(uselfunameudisturesult((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu_get_project_s
	uDistPathLocator._get_project(u__name__u
__module__u__qualname__u__doc__u__init__u_get_project(u
__locals__((u	__class__u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuDistPathLocatorPs
uDistPathLocatorcsw|EeZdZdZ�fdd�Z�fdd�Zdd�Zeej	j
e�Z	dd	�Zd
d�Z�S(uAggregatingLocatoruI
    This class allows you to chain and/or merge a list of locators.
    cs8|jdd�|_||_tt|�j|�dS(u�
        Initialise an instance.

        :param locators: The list of locators to search.
        :param kwargs: Passed to the superclass constructor,
                       except for:
                       * merge - if False (the default), the first successful
                         search from any of the locators is returned. If True,
                         the results from all locators are merged (this can be
                         slow).
        umergeNF(upopuFalseumergeulocatorsusuperuAggregatingLocatoru__init__(uselfulocatorsukwargs(u	__class__(u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu__init__ls	uAggregatingLocator.__init__cs5tt|�j�x|jD]}|j�qWdS(N(usuperuAggregatingLocatoruclear_cacheulocators(uselfulocator(u	__class__(u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuclear_cache|suAggregatingLocator.clear_cachecCs*||_x|jD]}||_qWdS(N(u_schemeulocatorsuscheme(uselfuvalueulocator((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu_set_scheme�s	uAggregatingLocator._set_schemecCs�i}x�|jD]�}|j|�}|r|jrD|j|�q�|jdkr\d}n3d}x*|D]"}|jj|�rid}PqiqiW|r�|}Pq�qqW|S(NTF(	ulocatorsuget_projectumergeuupdateumatcheruNoneuTrueuFalseumatch(uselfunameuresultulocatorudufounduk((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu_get_project�s"		
uAggregatingLocator._get_projectcCsJt�}x:|jD]/}y||j�O}Wqtk
rAYqXqW|S(uJ
        Return all the distribution names known to this locator.
        (usetulocatorsuget_distribution_namesuNotImplementedError(uselfuresultulocator((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuget_distribution_names�s	
	u)AggregatingLocator.get_distribution_names(
u__name__u
__module__u__qualname__u__doc__u__init__uclear_cacheu_set_schemeupropertyuLocatoruschemeufgetu_get_projectuget_distribution_names(u
__locals__((u	__class__u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuAggregatingLocatorhsuAggregatingLocatoruhttps://pypi.python.org/simple/utimeoutg@uschemeulegacyu1(?P<name>[\w-]+)\s*\(\s*(==\s*)?(?P<ver>[^)]+)\)$cBsw|EeZdZdZddd�Zdd�Zdd�Zdd	�Zd
d�Z	dd
�Z
dddd�ZdS(uDependencyFinderu0
    Locate dependencies for distributions.
    cCs(|p	t|_t|jj�|_dS(uf
        Initialise an instance, using the specified locator
        to locate distributions.
        N(udefault_locatorulocatoru
get_schemeuscheme(uselfulocator((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu__init__�suDependencyFinder.__init__cCs�tjd|�|j}||j|<||j||jf<x^|jD]S}t|�\}}tjd|||�|jj	|t
��j||f�qFWdS(u�
        Add a distribution to the finder. This will update internal information
        about who provides what.
        :param dist: The distribution to add.
        uadding distribution %suAdd to provided: %s, %s, %sN(uloggerudebugukeyu
dists_by_nameudistsuversionuprovidesuparse_name_and_versionuprovidedu
setdefaultusetuadd(uselfudistunameupuversion((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuadd_distribution�s	
u!DependencyFinder.add_distributioncCs�tjd|�|j}|j|=|j||jf=xl|jD]a}t|�\}}tjd|||�|j|}|j	||f�|s@|j|=q@q@WdS(u�
        Remove a distribution from the finder. This will update internal
        information about who provides what.
        :param dist: The distribution to remove.
        uremoving distribution %su Remove from provided: %s, %s, %sN(
uloggerudebugukeyu
dists_by_nameudistsuversionuprovidesuparse_name_and_versionuprovideduremove(uselfudistunameupuversionus((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuremove_distribution�s	

u$DependencyFinder.remove_distributioncCsQy|jj|�}Wn4tk
rL|j�d}|jj|�}YnX|S(u�
        Get a version matcher for a requirement.
        :param reqt: The requirement
        :type reqt: str
        :return: A version matcher (an instance of
                 :class:`distlib.version.Matcher`).
        i(uschemeumatcheruUnsupportedVersionErrorusplit(uselfureqtumatcheruname((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuget_matcher�s
uDependencyFinder.get_matcherc	Cs�|j|�}|j}t�}|j}||kr�x`||D]Q\}}y|j|�}Wntk
rzd}YnX|rA|j|�PqAqAWn|S(u�
        Find the distributions which can fulfill a requirement.

        :param reqt: The requirement.
         :type reqt: str
        :return: A set of distribution which can fulfill the requirement.
        F(uget_matcherukeyusetuprovidedumatchuUnsupportedVersionErroruFalseuadd(	uselfureqtumatcherunameuresultuprovideduversionuproviderumatch((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyufind_providers�s			

uDependencyFinder.find_providersc	Cs�|j|}t�}x?|D]7}|j|�}|j|j�s|j|�qqW|r�|jd|||f�d}nZ|j|�|j|=x-|D]%}|jj|t��j|�q�W|j	|�d}|S(u�
        Attempt to replace one provider with another. This is typically used
        when resolving dependencies from multiple sources, e.g. A requires
        (B >= 1.0) while C requires (B >= 1.1).

        For successful replacement, ``provider`` must meet all the requirements
        which ``other`` fulfills.

        :param provider: The provider we are trying to replace with.
        :param other: The provider we're trying to replace.
        :param problems: If False is returned, this will contain what
                         problems prevented replacement. This is currently
                         a tuple of the literal string 'cantreplace',
                         ``provider``, ``other``  and the set of requirements
                         that ``provider`` couldn't fulfill.
        :return: True if we can replace ``other`` with ``provider``, else
                 False.
        ucantreplaceFT(ureqtsusetuget_matcherumatchuversionuadduFalseuremove_distributionu
setdefaultuadd_distributionuTrue(	uselfuprovideruotheruproblemsurlistu	unmatchedusumatcheruresult((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyutry_to_replaces 
	
	


#
uDependencyFinder.try_to_replacec	Csi|_i|_i|_i|_t|p0g�}d|krk|jd�|tdddg�O}nt|t�r�|}}tj	d|�nK|j
j|d|�}}|dkr�t
d|��ntj	d|�d|_t�}t|g�}t|g�}x�|r�|j�}|j}	|	|jkrO|j|�n/|j|	}
|
|kr~|j||
|�n|j|jB}|j}t�}
||kr�xAdD]6}d|}||kr�|
t|d
|�O}
q�q�Wn||B|
B}x�|D]�}|j|�}|s+tj	d|�|j
j|d|�}|dkrv|rv|j
j|dd�}n|dkr�tj	d|�|jd|f�q+|j|j}}||f|jkr�|j|�n|j|�||kr+||kr+|j|�tj	d|j�q+nxw|D]o}|j}	|	|jkrr|jj|t��j|�q2|j|	}
|
|kr2|j||
|�q2q2WqWqWt|jj��}x<|D]4}||k|_|jr�tj	d|j�q�q�Wtj	d|�||fS(u�
        Find a distribution and all distributions it depends on.

        :param requirement: The requirement specifying the distribution to
                            find, or a Distribution instance.
        :param meta_extras: A list of meta extras such as :test:, :build: and
                            so on.
        :param prereleases: If ``True``, allow pre-release versions to be
                            returned - otherwise, don't return prereleases
                            unless they're all that's available.

        Return a set of :class:`Distribution` instances and a set of
        problems.

        The distributions returned should be such that they have the
        :attr:`required` attribute set to ``True`` if they were
        from the ``requirement`` passed to ``find()``, and they have the
        :attr:`build_time_dependency` attribute set to ``True`` unless they
        are post-installation dependencies of the ``requirement``.

        The problems should be a tuple consisting of the string
        ``'unsatisfied'`` and the requirement which couldn't be satisfied
        by any distribution known to the locator.
        u:*:u:test:u:build:u:dev:upassed %s as requirementuprereleasesuUnable to locate %ru
located %sutestubuildudevu:%s:u%s_requiresuNo providers found for %ruCannot satisfy %ruunsatisfieduAdding %s to install_distsu#%s is a build-time dependency only.ufind done for %sNT(utestubuildudev(uprovidedudistsu
dists_by_nameureqtsuseturemoveu
isinstanceuDistributionuloggerudebugulocatorulocateuNoneuDistlibExceptionuTrueu	requestedupopukeyuadd_distributionutry_to_replaceurun_requiresu
meta_requiresubuild_requiresugetattrufind_providersuadduversionuname_and_versionu
setdefaultuvaluesubuild_time_dependency(uselfurequirementumeta_extrasuprereleasesudistuodistuproblemsutodou
install_distsunameuotheruireqtsusreqtsuereqtsukeyueu	all_reqtsuru	providersuproviderunuvupudists((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyufind>s�				


				
		

!


	
	"
"
		uDependencyFinder.findNF(
u__name__u
__module__u__qualname__u__doc__uNoneu__init__uadd_distributionuremove_distributionuget_matcherufind_providersutry_to_replaceuFalseufind(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyuDependencyFinder�s'uDependencyFinder(MugzipuiouBytesIOujsonulogginguosu	posixpathureu	threadinguImportErrorudummy_threadinguzlibuuDistlibExceptionucompatuurljoinuurlparseu
urlunparseuurl2pathnameupathname2urluqueueuquoteuunescapeustring_typesubuild_openeruHTTPRedirectHandleruBaseRedirectHandleruRequestu	HTTPErroruURLErrorudatabaseuDistributionuDistributionPathu	make_distumetadatauMetadatauutilucached_propertyuparse_credentialsuensure_slashusplit_filenameuget_project_datauparse_requirementuparse_name_and_versionuServerProxyuversionu
get_schemeuUnsupportedVersionErroruwheeluWheelu
is_compatibleu	getLoggeru__name__uloggerucompileuHASHER_HASHuIuCHARSETuHTML_CONTENT_TYPEu
DEFAULT_INDEXuNoneuget_all_distribution_namesuRedirectHandleruobjectuLocatoruPyPIRPCLocatoruPyPIJSONLocatoruPageuSimpleScrapingLocatoruDirectoryLocatoruJSONLocatoruDistPathLocatoruAggregatingLocatorudefault_locatorulocateuNAME_VERSION_REuDependencyFinder(((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/locators.pyu<module>sV
^:�+*:�A%N				site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-33.pyc000064400000107013151733463540021116 0ustar00�
7�Res�c@s�ddlmZddlZddlZddlZddlZddlmZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlZddlmZmZddlmZmZmZmZmZddlmZddlm Z m!Z!dd	l"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+dd
l,m-Z-m.Z.ej/e0�Z1e2a3e4ed�r�dZ5n9ej6j7d
�r�dZ5nej6dkr�dZ5ndZ5ej8d�Z9e9r$dej:dd�Z9nde9Z;e5e9Z<ej"j=�j>dd�j>dd�Z?ej8d�Z@e@o�e@j7d�r�e@j>dd�Z@ndd�ZAeA�Z@[AejBdejCejDB�ZEejBdejCejDB�ZFejBd�ZGe
jHd krd!d"�ZInd#d"�ZIGd$d%�d%eJ�ZKeK�ZLGd&d'�d'eJ�ZMd(d)�ZNeN�ZO[Ne2d*d+�ZPdS(,i(uunicode_literalsN(umessage_from_filei(u__version__uDistlibException(u	sysconfiguZipFileufsdecodeu	text_typeufilter(uInstalledDistribution(uMetadatauMETADATA_FILENAME(	uFileOperatoruconvert_pathu	CSVReaderu	CSVWriteruCacheucached_propertyuget_cache_baseuread_exportsutempdir(uNormalizedVersionuUnsupportedVersionErrorupypy_version_infouppujavaujyucliuipucpupy_version_nodotu%s%siupyu-u_u.uSOABIucpython-cCs|dtg}tjd�r+|jd�ntjd�rJ|jd�ntjd�dkro|jd�nd	j|�S(
NucpuPy_DEBUGudu
WITH_PYMALLOCumuPy_UNICODE_SIZEiuuu(u
VER_SUFFIXu	sysconfiguget_config_varuappendujoin(uparts((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyu_derive_abi;su_derive_abiur
(?P<nm>[^-]+)
-(?P<vn>\d+[^-]*)
(-(?P<bn>\d+[^-]*))?
-(?P<py>\w+\d+(\.\w+\d+)*)
-(?P<bi>\w+)
-(?P<ar>\w+)
\.whl$
u7
(?P<nm>[^-]+)
-(?P<vn>\d+[^-]*)
(-(?P<bn>\d+[^-]*))?$
s
\s*#![^\r\n]*u/cCs|S(N((uo((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyu<lambda>Zsu<lambda>cCs|jtjd�S(Nu/(ureplaceuosusep(uo((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyu<lambda>\scBsS|EeZdZdd�Zdd�Zdd�Zddd�Zd	d
�ZdS(uMountercCsi|_i|_dS(N(u
impure_wheelsulibs(uself((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyu__init__`s	uMounter.__init__cCs!||j|<|jj|�dS(N(u
impure_wheelsulibsuupdate(uselfupathnameu
extensions((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyuaddds
uMounter.addcCsI|jj|�}x0|D](\}}||jkr|j|=qqWdS(N(u
impure_wheelsupopulibs(uselfupathnameu
extensionsukuv((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyuremovehsuMounter.removecCs"||jkr|}nd}|S(N(ulibsuNone(uselfufullnameupathuresult((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyufind_modulens	uMounter.find_modulecCs�|tjkrtj|}nx||jkrAtd|��ntj||j|�}||_|jdd�}t|�dkr�|d|_	n|S(Nuunable to find extension for %su.ii(
usysumodulesulibsuImportErroruimpuload_dynamicu
__loader__ursplitulenu__package__(uselfufullnameuresultuparts((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyuload_moduleus	uMounter.load_moduleN(	u__name__u
__module__u__qualname__u__init__uadduremoveuNoneufind_moduleuload_module(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyuMounter_s
uMountercBsd|EeZdZdZd1ZdZd0d2d2dd�Ze	dd��Z
e	dd	��Ze	d
d��Ze
dd
��Zdd�Ze
dd��Zdd�Zd0dd�Zdd�Zdd�Zdd�Zd0d0dd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd2d(d)�Zd*d+�Zd,d-�Zd0d.d/�Zd0S(3uWheelu@
    Class to build and install from Wheel files (PEP 427).
    iusha256cCs�||_||_d|_tg|_dg|_dg|_tj�|_	|dkr{d|_d|_|j
|_nEtj|�}|r�|jd�}|d|_|djdd	�|_|d
|_|j
|_n�tjj|�\}}tj|�}|s!td|��n|r?tjj|�|_	n||_|jd�}|d|_|d|_|d
|_|djd
�|_|djd
�|_|djd
�|_dS(uB
        Initialise an instance using a (valid) filename.
        uunoneuanyudummyu0.1unmuvnu_u-ubnuInvalid name or filename: %rupyu.ubiuarN(usignu
should_verifyubuildveruPYVERupyveruabiuarchuosugetcwdudirnameuNoneunameuversionufilenameu	_filenameuNAME_VERSION_REumatchu	groupdictureplaceupathusplituFILENAME_REuDistlibExceptionuabspath(uselfufilenameusignuverifyumuinfoudirname((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyu__init__�sB					


	


uWheel.__init__cCs�|jrd|j}nd}dj|j�}dj|j�}dj|j�}|jjdd�}d|j|||||fS(uJ
        Build and return a filename from the various components.
        u-uu.u_u%s-%s%s-%s-%s-%s.whl(ubuildverujoinupyveruabiuarchuversionureplaceuname(uselfubuildverupyveruabiuarchuversion((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyufilename�s	uWheel.filenamecCs+tjj|j|j�}tjj|�S(N(uosupathujoinudirnameufilenameuisfile(uselfupath((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyuexists�suWheel.existsccsNxG|jD]<}x3|jD](}x|jD]}|||fVq*WqWq
WdS(N(upyveruabiuarch(uselfupyveruabiuarch((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyutags�su
Wheel.tagscCs-tjj|j|j�}d|j|jf}d|}tjd�}t	|d���}|j
|�}|djdd�}tdd	�|D��}|d
kr�d
}	nt
}	yItj||	�}
|j|
��"}||�}td|�}
WdQXWn"tk
r"td|	��YnXWdQX|
S(Nu%s-%su%s.dist-infouutf-8uru
Wheel-Versionu.icSsg|]}t|��qS((uint(u.0ui((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyu
<listcomp>�s	u"Wheel.metadata.<locals>.<listcomp>uMETADATAufileobju$Invalid wheel, because %s is missing(ii(uosupathujoinudirnameufilenameunameuversionucodecsu	getreaderuZipFileuget_wheel_metadatausplitutupleuMETADATA_FILENAMEu	posixpathuopenuMetadatauKeyErroru
ValueError(uselfupathnameuname_veruinfo_diruwrapperuzfuwheel_metadatauwvufile_versionufnumetadata_filenameubfuwfuresult((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyumetadata�s(
	
uWheel.metadatac	Csud|j|jf}d|}tj|d�}|j|��(}tjd�|�}t|�}WdQXt|�S(Nu%s-%su%s.dist-infouWHEELuutf-8(	unameuversionu	posixpathujoinuopenucodecsu	getreaderumessage_from_fileudict(uselfuzfuname_veruinfo_dirumetadata_filenameubfuwfumessage((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyuget_wheel_metadata�s
uWheel.get_wheel_metadatac	CsFtjj|j|j�}t|d��}|j|�}WdQX|S(Nur(uosupathujoinudirnameufilenameuZipFileuget_wheel_metadata(uselfupathnameuzfuresult((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyuinfo�su
Wheel.infocCs�tj|�}|r2d||j�d�}nv|jd�}|jd�}|dksh||krqd}n)|||d�dkr�d}nd}d||}|S(Ns#!pythons
s
iis
(u
SHEBANG_REumatchuendufind(uselfudataumucrulfuterm((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyuprocess_shebang�s		uWheel.process_shebangcCs�|dkr|j}nytt|�}Wn"tk
rOtd|��YnX||�j�}tj|�j	d�j
d�}||fS(NuUnsupported hash algorithm: %rs=uascii(uNoneu	hash_kindugetattruhashlibuAttributeErroruDistlibExceptionudigestubase64uurlsafe_b64encodeurstripudecode(uselfudatau	hash_kinduhasheruresult((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyuget_hashs
!uWheel.get_hashcCsht|��V}x|D]}|j|�qWttjj||��}|j|ddf�WdQXdS(Nu(u	CSVWriteruwriterowuto_posixuosupathurelpath(uselfurecordsurecord_pathubaseuwriterurowup((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyuwrite_records

uWheel.write_recordcCs�g}|\}}tt|j�}xs|D]k\}}	t|	d��}
|
j�}WdQXd|j|�}tjj|	�}
|j	|||
f�q+Wtjj
|d�}	|j||	|�ttjj
|d��}|j	||	f�dS(Nurbu%s=%suRECORD(
ugetattruhashlibu	hash_kinduopenureaduget_hashuosupathugetsizeuappendujoinuwrite_recorduto_posix(uselfuinfoulibdiru
archive_pathsurecordsudistinfouinfo_diruhasheruapupufudataudigestusize((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyu
write_recordssuWheel.write_recordscCs\t|dtj��A}x7|D]/\}}tjd||�|j||�qWWdQXdS(NuwuWrote %s to %s in wheel(uZipFileuzipfileuZIP_DEFLATEDuloggerudebuguwrite(uselfupathnameu
archive_pathsuzfuapup((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyu	build_zip.suWheel.build_zipc!s�|dkri}ntt�fdd�d%��d}|dkrjd}tg}tg}tg}n!d}tg}dg}d	g}|jd
|�|_|jd|�|_	|jd|�|_
�|}	d
|j|jf}
d|
}d|
}g}
xKd&D]C}|�kr#qn�|}t
jj|�rxt
j|�D]�\}}}x�|D]�}tt
jj||��}t
jj||�}tt
jj|||��}|
j||f�|dkre|jd�ret|d��}|j�}WdQX|j|�}t|d��}|j|�WdQXqeqeWqOWqqW|	}d}xt
j|�D]�\}}}||kr�xUt|�D]G\}}t|�}|jd�r�t
jj||�}||=Pq�q�W|s�td��nxl|D]d}t|�jd'�rq�nt
jj||�}tt
jj||��}|
j||f�q�WqnWt
j|�}xf|D]^}|d(krtt
jj||��}tt
jj||��}|
j||f�qqWd|p�|jdtd |g}x4|j D])\}}}|jd!|||f�qWt
jj|d"�}t|d#��}|jd$j|��WdQXtt
jj|d"��}|
j||f�|j!||f|	|
�t
jj|j"|j#�} |j$| |
�| S()u�
        Build a wheel from files in specified paths, and use any specified tags
        when determining the name of the wheel.
        cs
|�kS(N((uo(upaths(u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyu<lambda><suWheel.build.<locals>.<lambda>upurelibuplatlibiufalseutrueunoneuanyupyveruabiuarchu%s-%su%s.datau%s.dist-infoudatauheadersuscriptsu.exeurbNuwbu
.dist-infou(.dist-info directory expected, not foundu.pycu.pyouRECORDu	INSTALLERuSHAREDuWheel-Version: %d.%duGenerator: distlib %suRoot-Is-Purelib: %su
Tag: %s-%s-%suWHEELuwu
(upurelibuplatlib(udatauheadersuscripts(u.pycu.pyo(uRECORDu	INSTALLERuSHARED(%uNoneulistufilteruIMPVERuABIuARCHuPYVERugetupyveruabiuarchunameuversionuosupathuisdiruwalkufsdecodeujoinurelpathuto_posixuappenduendswithuopenureaduprocess_shebanguwriteu	enumerateuAssertionErrorulistdiru
wheel_versionu__version__utagsu
write_recordsudirnameufilenameu	build_zip(!uselfupathsutagsu
wheel_versionulibkeyuis_pureu
default_pyverudefault_abiudefault_archulibdiruname_verudata_diruinfo_diru
archive_pathsukeyupathurootudirsufilesufnupurpuapufudataudistinfouiudnuwheel_metadataupyveruabiuarchupathname((upathsu2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyubuild4s�	%					





%


uWheel.buildcBIKs	|j}|jd�}|jdd9�}tjj|j|j�}d|j|j	f}d|}	d|}
t
j|
t�}t
j|
d�}t
j|
d�}
tj
d�}t|d	���}|j|��}||�}t|�}Wd
QX|djdd
�}tdd�|D��}||jkrM|rM||j|�n|ddkrj|d}n
|d}i}|j|
��D}td|��,}x"|D]}|d}|||<q�WWd
QXWd
QXt
j|	d�}t
j|
d�}t
j|	dd�}td|�}d:|_tj}g} tj�}!|!|_d
|_zy�x�|j�D]�}"|"j}#t |#t!�r�|#}$n|#j"d�}$|$j#d�r�qan||$}|dr�t$|"j%�|dkr�t&d|$��n|d
rp|d
jdd
�\}%}&|j|#��}|j'�}'Wd
QX|j(|'|%�\}(})|)|&krpt&d|#��qpn|r�|$j)||f�r�t*j+d|$�qan|$j)|�o�|$j#d�}*|$j)|�r|$jd d�\}(}+},tjj||+t,|,��}-n3|$||
fkr$qantjj|t,|$��}-|*sL|j|#��}|j-||-�Wd
QX| j.|-�|r�|d
r�t|-d!��J}|j'�}'|j(|'|%�\}(}.|.|)kr�t&d"|-��nWd
QXn|r�|-j#d#�r�y |j/|-�}/| j.|/�WqIt0k
rEt*j1d$d%d:�YqIXq�qatjj2t,|#��}0tjj|!|0�}1|j|#��}|j-||1�Wd
QXtjj|-�\}2}0|2|_|j3|0�}3|j4|3�| j5|3�qaW|rt*j+d&�d
}4n$d
}5|j6d}|d'kr&t
j|
d(�}6y�|j|6��}t7|�}7Wd
QXi}5x�d;D]�}8d+|8}9|9|7krpi|5d,|8<}:x[|7|9j8�D]F};d-|;j9|;j:f}<|;j;r�|<d.|;j;7}<n|<|:|;j<q�WqpqpWWq�t0k
r"t*j1d/�Yq�Xnby@|j|��+}||�}t<j=|�jd0�}5Wd
QXWnt0k
r�t*j1d1�YnX|5r�|5jd2i�}=|5jd3i�}>|=s�|>r�|jdd�}?tjj>|?�s�t?d4��n|?|_xF|=j@�D]8\}9};d5|9|;f}@|j3|@�}3|j4|3�qW|>r�id:d*6}AxL|>j@�D];\}9};d5|9|;f}@|j3|@|A�}3|j4|3�qcWq�q�ntjj||
�}tA|�}4tB|�}|d=|d=||d6<|4jC||�}|r	| j.|�n|4jD| |d7|�|4SWn,t0k
rb	t*jEd8�|jF��YnXWd
tGjH|!�XWd
QXd
S(<u�
        Install a wheel to the specified paths. If kwarg ``warner`` is
        specified, it should be a callable, which will be called with two
        tuples indicating the wheel version of this software and the wheel
        version in the file, if there is a discrepancy in the versions.
        This can be used to issue any warnings to raise any exceptions.
        If kwarg ``lib_only`` is True, only the purelib/platlib files are
        installed, and the headers, scripts, data and dist-info metadata are
        not written.

        The return value is a :class:`InstalledDistribution` instance unless
        ``options.lib_only`` is True, in which case the return value is ``None``.
        uwarnerulib_onlyu%s-%su%s.datau%s.dist-infouWHEELuRECORDuutf-8urNu
Wheel-Versionu.icSsg|]}t|��qS((uint(u.0ui((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyu
<listcomp>�s	u!Wheel.install.<locals>.<listcomp>uRoot-Is-Purelibutrueupurelibuplatlibustreamiuuscriptsudry_runu/RECORD.jwsiusize mismatch for %su=udigest mismatch for %sulib_only: skipping %su.exeu/urbudigest mismatch on write for %su.pyuByte-compilation faileduexc_infoulib_only: returning Noneu1.0uentry_points.txtuconsoleuguiu
%s_scriptsuwrap_%su%s:%su %suAUnable to read legacy script metadata, so cannot generate scriptsucommandsu8Unable to read JSON metadata, so cannot generate scriptsuwrap_consoleuwrap_guiuValid script path not specifiedu%s = %sulibuprefixuinstallation failed.FT(uconsoleugui(Iudry_runugetuFalseuosupathujoinudirnameufilenameunameuversionu	posixpathuMETADATA_FILENAMEucodecsu	getreaderuZipFileuopenumessage_from_fileusplitutupleu
wheel_versionu	CSVReaderuFileOperatoruTrueurecordusysudont_write_bytecodeutempfileumkdtempu
source_diruNoneu
target_diruinfolistu
isinstanceu	text_typeudecodeuendswithustru	file_sizeuDistlibExceptionureaduget_hashu
startswithuloggerudebuguconvert_pathucopy_streamuappendubyte_compileu	Exceptionuwarningubasenameumakeuset_executable_modeuextenduinfouread_exportsuvaluesuprefixusuffixuflagsujsonuloaduisdiru
ValueErroruitemsuInstalledDistributionudictuwrite_shared_locationsuwrite_installed_filesu	exceptionurollbackushutilurmtree(Buselfupathsumakerukwargsudry_runuwarnerulib_onlyupathnameuname_verudata_diruinfo_diru
metadata_nameuwheel_metadata_nameurecord_nameuwrapperuzfubwfuwfumessageuwvufile_versionulibdirurecordsubfureaderurowupudata_pfxuinfo_pfxu
script_pfxufileopubcuoutfilesuworkdiruzinfouarcnameu	u_arcnameukinduvalueudatau_udigestu	is_scriptuwhereurpuoutfileu	newdigestupycufnuworknameudnu	filenamesudistucommandsuepuepdataukeyukuduvusuconsole_scriptsugui_scriptsu
script_diruscriptuoptions((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyuinstall�s>	





	
				
#

"

	

	


	
"
	




u
Wheel.installcCsMtdkrItjjt�td�tjdd��}t	|�antS(Nudylib-cachei(
ucacheuNoneuosupathujoinuget_cache_baseustrusysuversionuCache(uselfubase((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyu_get_dylib_cache~s
uWheel._get_dylib_cachecCs�tjj|j|j�}d|j|jf}d|}tj|d�}tj	d�}g}t
|d��x}y\|j|��G}||�}	tj
|	�}
|j�}|j|�}tjj|j|�}
tjj|
�s�tj|
�nx�|
j�D]�\}}tjj|
t|��}tjj|�sHd}nQtj|�j}tjj|�}|j|�}tj|j�}||k}|r�|j||
�n|j||f�qWWdQXWntk
r�YnXWdQX|S(Nu%s-%su%s.dist-infou
EXTENSIONSuutf-8urT( uosupathujoinudirnameufilenameunameuversionu	posixpathucodecsu	getreaderuZipFileuopenujsonuloadu_get_dylib_cacheu
prefix_to_dirubaseuisdirumakedirsuitemsuconvert_pathuexistsuTrueustatust_mtimeudatetimeu
fromtimestampugetinfou	date_timeuextractuappenduKeyError(uselfupathnameuname_veruinfo_diruarcnameuwrapperuresultuzfubfuwfu
extensionsucacheuprefixu
cache_baseunameurelpathudestuextractu	file_timeuinfou
wheel_time((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyu_get_extensions�s>
	!
uWheel._get_extensionscCs
t|�S(uM
        Determine if a wheel is compatible with the running system.
        (u
is_compatible(uself((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyu
is_compatible�suWheel.is_compatiblecCsdS(uP
        Determine if a wheel is asserted as mountable by its metadata.
        T(uTrue(uself((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyuis_mountable�suWheel.is_mountablecCs
tjjtjj|j|j��}|j�sLd|}t|��n|j�sqd|}t|��n|t	jkr�t
jd|�ns|r�t	jj|�nt	jj
d|�|j�}|rtt	jkr�t	jjt�ntj||�ndS(Nu)Wheel %s not compatible with this Python.u$Wheel %s is marked as not mountable.u%s already in pathi(uosupathuabspathujoinudirnameufilenameu
is_compatibleuDistlibExceptionuis_mountableusysuloggerudebuguappenduinsertu_get_extensionsu_hooku	meta_pathuadd(uselfuappendupathnameumsgu
extensions((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyumount�s"'

uWheel.mountcCs�tjjtjj|j|j��}|tjkrItjd|�n]tjj	|�|t
jkrxt
j	|�nt
js�t
tjkr�tjj	t
�q�ndS(Nu%s not in path(
uosupathuabspathujoinudirnameufilenameusysuloggerudebuguremoveu_hooku
impure_wheelsu	meta_path(uselfupathname((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyuunmount�s'	u
Wheel.unmountc$Cs�tjj|j|j�}d|j|jf}d|}d|}tj|t�}tj|d�}tj|d�}t	j
d�}t|d��}	|	j|��}
||
�}t
|�}WdQX|djd	d
�}
tdd�|
D��}i}|	j|��D}td
|��,}x"|D]}|d}|||<q,WWdQXWdQXx<|	j�D].}|j}t|t�r�|}n|jd�}d|kr�td|��n|jd�r�qcn||}|dr
t|j�|dkr
td|��n|d
rc|d
jdd
�\}}|	j|��}|j�}WdQX|j||�\}}||kr�td|��q�qcqcWWdQXdS(Nu%s-%su%s.datau%s.dist-infouWHEELuRECORDuutf-8uru
Wheel-Versionu.icSsg|]}t|��qS((uint(u.0ui((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyu
<listcomp>�s	u Wheel.verify.<locals>.<listcomp>ustreamiu..uinvalid entry in wheel: %ru/RECORD.jwsiusize mismatch for %su=udigest mismatch for %s(uosupathujoinudirnameufilenameunameuversionu	posixpathuMETADATA_FILENAMEucodecsu	getreaderuZipFileuopenumessage_from_fileusplitutupleu	CSVReaderuinfolistu
isinstanceu	text_typeudecodeuDistlibExceptionuendswithustru	file_sizeureaduget_hash(uselfupathnameuname_verudata_diruinfo_diru
metadata_nameuwheel_metadata_nameurecord_nameuwrapperuzfubwfuwfumessageuwvufile_versionurecordsubfureaderurowupuzinfouarcnameu	u_arcnameukinduvalueudatau_udigest((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyuverify�sT



		

#

uWheel.verifycKs�dd�}dd�}tjj|j|j�}d|j|jf}d|}tj|d�}	t��(}
t	|d���}i}x�|j
�D]�}
|
j}t|t�r�|}n|j
d	�}||	kr�q�nd
|kr�td|��n|j|
|
�tjj|
t|��}|||<q�WWdQX|||�\}}|||�}|r�|||�\}}|r�||kr�|||�n|dkr�tjd
dddd|
�\}}tj|�n=tjj|�std|��ntjj||j�}t|j��}tjj|
|�}||f}|j||
|�|j||�|dkr�tj||�q�nWdQX|S(u�
        Update the contents of a wheel in a generic way. The modifier should
        be a callable which expects a dictionary argument: its keys are
        archive-entry paths, and its values are absolute filesystem paths
        where the contents the corresponding archive entries can be found. The
        modifier is free to change the contents of the files pointed to, add
        new entries and remove entries, before returning. This method will
        extract the entire contents of the wheel to a temporary location, call
        the modifier, and then use the passed (and possibly updated)
        dictionary to write a new wheel. If ``dest_dir`` is specified, the new
        wheel is written there -- otherwise, the original wheel is overwritten.

        The modifier should return True if it updated the wheel, else False.
        This method returns the same value the modifier returns.
        cSshd}}d|tf}||kr3d|}n||kr^||}td|�j}n||fS(Nu%s/%su%s/PKG-INFOupath(uNoneuMETADATA_FILENAMEuMetadatauversion(upath_mapuinfo_diruversionupathukey((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyuget_versions


u!Wheel.update.<locals>.get_versionc
Ss)d}y�t|�}|jd�}|dkr=d|}nhdd�||dd�jd�D�}|dd7<d|d|�djd	d
�|D��f}Wn"tk
r�tjd|�YnX|r%td|�}||_	|j
t�}|jd|d
|�tjd||�ndS(Nu-iu%s-1cSsg|]}t|��qS((uint(u.0us((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyu
<listcomp>/s	u8Wheel.update.<locals>.update_version.<locals>.<listcomp>iu.u%s-%scss|]}t|�VqdS(N(ustr(u.0ui((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyu	<genexpr>2su7Wheel.update.<locals>.update_version.<locals>.<genexpr>u0Cannot update non-compliant (PEP-440) version %rupathulegacyuVersion updated from %r to %ri����(
uNoneuNormalizedVersionufindusplitujoinuUnsupportedVersionErroruloggerudebuguMetadatauversionuendswithuMETADATA_FILENAMEuwrite(uversionupathuupdateduvuiupartsumdulegacy((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyuupdate_version's(
*$
		u$Wheel.update.<locals>.update_versionu%s-%su%s.dist-infouRECORDuruutf-8u..uinvalid entry in wheel: %rNusuffixu.whluprefixu
wheel-update-udiruNot a directory: %r(uosupathujoinudirnameufilenameunameuversionu	posixpathutempdiruZipFileuinfolistu
isinstanceu	text_typeudecodeuDistlibExceptionuextractuconvert_pathuNoneutempfileumkstempucloseuisdirulistuitemsu
write_recordsu	build_zipushutilucopyfile(uselfumodifierudest_dirukwargsuget_versionuupdate_versionupathnameuname_veruinfo_dirurecord_nameuworkdiruzfupath_mapuzinfouarcnameu	u_arcnameupathuoriginal_versionu_umodifieducurrent_versionufdunewpathu
archive_pathsudistinfouinfo((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyuupdatesX

		
uWheel.updateN(iiF( u__name__u
__module__u__qualname__u__doc__u
wheel_versionu	hash_kinduNoneuFalseu__init__upropertyufilenameuexistsutagsucached_propertyumetadatauget_wheel_metadatauinfouprocess_shebanguget_hashuwrite_recordu
write_recordsu	build_zipubuilduinstallu_get_dylib_cacheu_get_extensionsu
is_compatibleuis_mountableumountuunmountuverifyuupdate(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyuWheel�s2)	h�	"6uWheelcCs�tg}td}xGttjdddd�D](}|jdj|t|�g��q1Wg}xLtj�D]>\}}}|j	d�rp|j|j
dd�d�qpqpW|j�tdkr�|j
dt�n|jd�g}tg}tjdkr=tjd	t�}|r=|j�\}	}}}
t|�}|
g}|
dkrg|jd�n|
dkr�|jd�n|
dkr�|jd�n|
dkr�|jd�n|
dkr�|jd�nx`|dkr6x@|D]8}d|	|||f}
|
tkr�|j|
�q�q�W|d8}q�Wq=nxH|D]@}x7|D]/}
|jdjt|df�||
f�qQWqDWxwt|�D]i\}}|jdjt|f�ddf�|dkr�|jdjt|df�ddf�q�q�Wxwt|�D]i\}}|jdjd|f�ddf�|dkr|jdjd|df�ddf�qqWt|�S(uG
    Return (pyver, abi, arch) tuples compatible with this Python.
    iiuu.abiu.iunoneudarwinu(\w+)_(\d+)_(\d+)_(\w+)$ui386uppcufatux86_64ufat3uppc64ufat64uintelu	universalu%s_%s_%s_%suanyupyi����i����(ui386uppc(ui386uppcux86_64(uppc64ux86_64(ui386ux86_64(ui386ux86_64uinteluppcuppc64(u
VER_SUFFIXurangeusysuversion_infouappendujoinustruimpuget_suffixesu
startswithusplitusortuABIuinsertuARCHuplatformureumatchugroupsuintu
IMP_PREFIXu	enumerateuset(uversionsumajoruminoruabisusuffixu_uresultuarchesumunameuarchumatchesumatchusuabiuiuversion((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyucompatible_tagsqs`	
$&$

		


1%0%0ucompatible_tagscCs�t|t�st|�}nd}|dkr9t}nxN|D]F\}}}||jkr@||jkr@||jkr@d}Pq@q@W|S(NFT(	u
isinstanceuWheeluFalseuNoneuCOMPATIBLE_TAGSupyveruabiuarchuTrue(uwheelutagsuresultuveruabiuarch((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyu
is_compatible�s	-u
is_compatible(Qu
__future__uunicode_literalsubase64ucodecsudatetimeudistutils.utilu	distutilsuemailumessage_from_fileuhashlibuimpujsonulogginguosu	posixpathureushutilusysutempfileuzipfileuu__version__uDistlibExceptionucompatu	sysconfiguZipFileufsdecodeu	text_typeufilterudatabaseuInstalledDistributionumetadatauMetadatauMETADATA_FILENAMEuutiluFileOperatoruconvert_pathu	CSVReaderu	CSVWriteruCacheucached_propertyuget_cache_baseuread_exportsutempdiruversionuNormalizedVersionuUnsupportedVersionErroru	getLoggeru__name__uloggeruNoneucacheuhasattru
IMP_PREFIXuplatformu
startswithuget_config_varu
VER_SUFFIXuversion_infouPYVERuIMPVERuget_platformureplaceuARCHuABIu_derive_abiucompileu
IGNORECASEuVERBOSEuFILENAME_REuNAME_VERSION_REu
SHEBANG_REuseputo_posixuobjectuMounteru_hookuWheelucompatible_tagsuCOMPATIBLE_TAGSu
is_compatible(((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/wheel.pyu<module>sx(@			

'		#	���>	site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-33.pyc000064400000135151151733463540021301 0ustar00�
7�Reۗc@s�ddlmZddlZddlZddlZejddkr�ddlmZefZe	Z
ddlmZ
ddlZddlZddlmZddlmZmZmZmZmZdd	lmZmZmZmZmZm Z m!Z!d
d�Zddl"Z"ddl"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,ddl-Z-ddl.Z.ddl/Z0dd
l1m1Z1ddl2Z2e3Z3ddl4m5Z6ddl4m7Z8da:dd�Z;noddl<mZe=fZe=Z
ddl<m>Z
ddlZddlZddlZddl?mZmZmZm;Z;mZmZmZmZm!Z!ddl@m$Z$mZm#Z#mZmZm'Z'm(Z(m)Z)m*Z*m+Z+m,Z,ddlAm&Z&m%Z%m Z ddlBjCZ-ddl@jDZ"ddlEjCZ.ddl0Z0dd
lFm1Z1ddlGjHZ2eIZ3ddl4m8Z8e6Z6yddlJmKZKmLZLWn@eMk
r�Gdd�deN�ZLdd�ZOdd�ZKYnXyddlmPZQWn(eMk
r�Gdd �d eR�ZQYnXydd!lmSZSWn.eMk
r"ejTejUBdd"d#�ZSYnXdd$lVmWZXeYeXd%�rKeXZWn<dd&lVmZZ[Gd'd(�d(e[�ZZGd)d*�d*eX�ZWydd+l\m]Z]WneMk
r�d,d-�Z]YnXyddl^Z^Wn"eMk
r�dd.lm^Z^YnXy
e_Z_Wn.e`k
r+dd/lambZbd0d1�Z_YnXyejcZcejdZdWnQeek
r�ejf�Zgegd2krsd3Zhnd4Zhd5d6�Zcd7d8�ZdYnXydd9limjZjWn[eMk
rdd:lkmlZlmmZmddlZejnd;�Zod<d=�Zpd>d?�ZjYnXydd@lqmrZrWn"eMk
r@dd@lsmrZrYnXejddA�dbkrie1�jtZtnddClqmtZtyddDlamuZuWnpeMk
r�ddElamvZvyddFlwmxZyWn!eMk
r�dGdHdI�ZyYnXGdJdK�dKev�ZuYnXyddLlzm{Z{Wn!eMk
r7ddMdN�Z{YnXyddOlam|Z|Wn�eMk
r�yddPl}m~ZWn"eMk
r�ddPl�m~ZYnXy ddQl�m�Z�m�Z�m�Z�WneMk
r�YnXGdRdS�dSe��Z|YnXyddTl�m�Z�m�Z�Wn�eMk
r�ejndUej��Z�dVdW�Z�GdXdY�dYe��Z�ddZd[�Z�Gd\d]�d]e��Z�Gd^d_�d_e��Z�Gd`da�daeR�Z�YnXdS(ci(uabsolute_importNi(uStringIO(uFileTypei(ushutil(uurlparseu
urlunparseuurljoinuurlsplitu
urlunsplit(uurlretrieveuquoteuunquoteuurl2pathnameupathname2urluContentTooShortErroru	splittypecCs+t|t�r!|jd�}nt|�S(Nuutf-8(u
isinstanceuunicodeuencodeu_quote(us((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuquotesuquote(
uRequestuurlopenuURLErroru	HTTPErroruHTTPBasicAuthHandleruHTTPPasswordMgruHTTPSHandleruHTTPHandleruHTTPRedirectHandlerubuild_opener(u
HTMLParser(uifilter(uifilterfalsecCsYtdkr*ddl}|jd�antj|�}|rO|jdd�Sd|fS(uJsplituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.iNu^(.*)@(.*)$ii(u	_userproguNoneureucompileumatchugroup(uhostureumatch((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu	splituser-su	splituser(u
TextIOWrapper(	uurlparseu
urlunparseuurljoinu	splituseruquoteuunquoteuurlsplitu
urlunsplitu	splittype(uurlopenuurlretrieveuRequestuurl2pathnameupathname2urluHTTPBasicAuthHandleruHTTPPasswordMgruHTTPSHandleruHTTPHandleruHTTPRedirectHandlerubuild_opener(u	HTTPErroruURLErroruContentTooShortError(ufilterfalse(umatch_hostnameuCertificateErrorcBs|EeZdZdS(uCertificateErrorN(u__name__u
__module__u__qualname__(u
__locals__((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuCertificateErrorUsuCertificateErrorcCs�g}x[|jd�D]J}|dkr8|jd�qtj|�}|j|jdd��qWtjddj|�dtj�S(	Nu.u*u[^.]+u\*u[^.]*u\Au\.u\Z(usplituappendureuescapeureplaceucompileujoinu
IGNORECASE(udnupatsufrag((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu_dnsname_to_patYsu_dnsname_to_patcCsg|std��ng}|jdf�}xI|D]A\}}|dkr4t|�j|�redS|j|�q4q4W|s�xi|jdf�D]R}xI|D]A\}}|dkr�t|�j|�r�dS|j|�q�q�Wq�Wnt|�dkr(td|d	jtt	|��f��n;t|�dkrWtd
||df��ntd��dS(
u7Verify that *cert* (in decoded format as returned by
        SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 rules
        are mostly followed, but IP addresses are not accepted for *hostname*.

        CertificateError is raised on failure. On success, the function
        returns nothing.
        uempty or no certificateusubjectAltNameuDNSNusubjectu
commonNameiu&hostname %r doesn't match either of %su, uhostname %r doesn't match %riu=no appropriate commonName or subjectAltName fields were found(
u
ValueErrorugetu_dnsname_to_patumatchuappendulenuCertificateErrorujoinumapurepr(ucertuhostnameudnsnamesusanukeyuvalueusub((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyumatch_hostnamegs.%umatch_hostname(uSimpleNamespacecBs&|EeZdZdZdd�ZdS(u	ContaineruR
        A generic container for when multiple values need to be returned
        cKs|jj|�dS(N(u__dict__uupdate(uselfukwargs((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__init__�suContainer.__init__N(u__name__u
__module__u__qualname__u__doc__u__init__(u
__locals__((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu	Container�su	Container(uwhichcs�dd�}tjj��r5|�|�r1�SdS|dkr\tjjdtj�}n|sfdS|jtj�}t	j
dkrtj|kr�|jdtj�ntjjdd�jtj�}t
�fdd	�|D��r��g}q�fd
d�|D�}n	�g}t�}xu|D]m}tjj|�}||kr-|j|�x9|D].}	tjj||	�}
||
|�re|
SqeWq-q-WdS(
uKGiven a command, mode, and a PATH string, return the path which
        conforms to the given mode on the PATH, or None if there is no such
        file.

        `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result
        of os.environ.get("PATH"), or can be overridden with a custom search
        path.

        cSs5tjj|�o4tj||�o4tjj|�S(N(uosupathuexistsuaccessuisdir(ufnumode((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu
_access_check�s$uwhich.<locals>._access_checkuPATHuwin32iuPATHEXTuc3s*|] }�j�j|j��VqdS(N(uloweruendswith(u.0uext(ucmd(u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu	<genexpr>�suwhich.<locals>.<genexpr>csg|]}�|�qS(((u.0uext(ucmd(u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu
<listcomp>�s	uwhich.<locals>.<listcomp>N(uosupathudirnameuNoneuenvironugetudefpathusplitupathsepusysuplatformucurdiruinsertuanyusetunormcaseuaddujoin(ucmdumodeupathu
_access_checkupathextufilesuseenudirunormdiruthefileuname((ucmdu3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuwhich�s8
!		


uwhich(uZipFileu	__enter__(u
ZipExtFilecBs8|EeZdZdd�Zdd�Zdd�ZdS(u
ZipExtFilecCs|jj|j�dS(N(u__dict__uupdate(uselfubase((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__init__�suZipExtFile.__init__cCs|S(N((uself((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu	__enter__�suZipExtFile.__enter__cGs|j�dS(N(uclose(uselfuexc_info((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__exit__�suZipExtFile.__exit__N(u__name__u
__module__u__qualname__u__init__u	__enter__u__exit__(u
__locals__((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu
ZipExtFile�su
ZipExtFilecBs8|EeZdZdd�Zdd�Zdd�ZdS(uZipFilecCs|S(N((uself((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu	__enter__�suZipFile.__enter__cGs|j�dS(N(uclose(uselfuexc_info((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__exit__�suZipFile.__exit__cOstj|||�}t|�S(N(uBaseZipFileuopenu
ZipExtFile(uselfuargsukwargsubase((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuopen�suZipFile.openN(u__name__u
__module__u__qualname__u	__enter__u__exit__uopen(u
__locals__((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuZipFile�suZipFile(upython_implementationcCs@dtjkrdStjdkr&dStjjd�r<dSdS(u6Return a string identifying the Python implementation.uPyPyujavauJythonu
IronPythonuCPython(usysuversionuosunameu
startswith(((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyupython_implementationsupython_implementation(u	sysconfig(uCallablecCs
t|t�S(N(u
isinstanceuCallable(uobj((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyucallablesucallableumbcsustrictusurrogateescapecCsOt|t�r|St|t�r2|jtt�Stdt|�j��dS(Nuexpect bytes or str, not %s(	u
isinstanceubytesu	text_typeuencodeu_fsencodingu	_fserrorsu	TypeErrorutypeu__name__(ufilename((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyufsencode#sufsencodecCsOt|t�r|St|t�r2|jtt�Stdt|�j��dS(Nuexpect bytes or str, not %s(	u
isinstanceu	text_typeubytesudecodeu_fsencodingu	_fserrorsu	TypeErrorutypeu__name__(ufilename((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyufsdecode,sufsdecode(udetect_encoding(uBOM_UTF8ulookupucoding[:=]\s*([-\w.]+)cCsd|dd�j�jdd�}|dks=|jd�rAdS|d
ks\|jd�r`dS|S(u(Imitates get_normal_name in tokenizer.c.Niu_u-uutf-8uutf-8-ulatin-1u
iso-8859-1uiso-latin-1ulatin-1-uiso-8859-1-uiso-latin-1-(ulatin-1u
iso-8859-1uiso-latin-1(ulatin-1-uiso-8859-1-uiso-latin-1-(ulowerureplaceu
startswith(uorig_encuenc((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu_get_normal_name=s"u_get_normal_namecsy�jj�Wntk
r*d�YnXd	�d}d}�fdd�}��fdd�}|�}|jt�r�d
�|dd�}d}n|s�|gfS||�}|r�||gfS|�}|s�||gfS||�}|r|||gfS|||gfS(u>
        The detect_encoding() function is used to detect the encoding that should
        be used to decode a Python source file.  It requires one argment, readline,
        in the same way as the tokenize() generator.

        It will call readline a maximum of twice, and return the encoding used
        (as a string) and a list of any lines (left as bytes) it has read in.

        It detects the encoding from the presence of a utf-8 bom or an encoding
        cookie as specified in pep-0263.  If both a bom and a cookie are present,
        but disagree, a SyntaxError will be raised.  If the encoding cookie is an
        invalid charset, raise a SyntaxError.  Note that if a utf-8 bom is found,
        'utf-8-sig' is returned.

        If no encoding is specified, then the default of 'utf-8' will be returned.
        uutf-8cs(y��SWntk
r#dSYnXdS(Ns(u
StopIteration((ureadline(u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuread_or_stop`s
u%detect_encoding.<locals>.read_or_stopcs9y|jd�}WnEtk
rZd}�dk	rJdj|��}nt|��YnXtj|�}|stdSt|d�}yt|�}WnIt	k
r��dkr�d|}ndj�|�}t|��YnX�r5|j
dkr(�dkr
d}ndj��}t|��n|d	7}n|S(
Nuutf-8u'invalid or missing encoding declarationu{} for {!r}iuunknown encoding: uunknown encoding for {!r}: {}uencoding problem: utf-8u encoding problem for {!r}: utf-8u-sig(udecodeuUnicodeDecodeErroruNoneuformatuSyntaxErroru	cookie_reufindallu_get_normal_nameulookupuLookupErroruname(ulineuline_stringumsgumatchesuencodingucodec(u	bom_foundufilename(u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyufind_cookiefs6


			
u$detect_encoding.<locals>.find_cookieiNu	utf-8-sigFT(u__self__unameuAttributeErroruNoneuFalseu
startswithuBOM_UTF8uTrue(ureadlineuencodingudefaulturead_or_stopufind_cookieufirstusecond((u	bom_foundufilenameureadlineu3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyudetect_encodingHs4
&		

	
udetect_encoding(uescapeii(uunescape(uChainMap(uMutableMapping(urecursive_repru...cs�fdd�}|S(um
            Decorator to make a repr function return fillvalue for a recursive
            call
            cspt�����fdd�}t�d�|_t�d�|_t�d�|_t�di�|_|S(NcsWt|�t�f}|�kr%�S�j|�z�|�}Wd�j|�X|S(N(uidu	get_identuaddudiscard(uselfukeyuresult(u	fillvalueurepr_runningu
user_function(u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuwrapper�s
u=_recursive_repr.<locals>.decorating_function.<locals>.wrapperu
__module__u__doc__u__name__u__annotations__(usetugetattru
__module__u__doc__u__name__u__annotations__(u
user_functionuwrapper(u	fillvalue(urepr_runningu
user_functionu3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyudecorating_function�s	u,_recursive_repr.<locals>.decorating_function((u	fillvalueudecorating_function((u	fillvalueu3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu_recursive_repr�su_recursive_reprcBs|EeZdZdZdd�Zdd�Zdd�Zd&dd	�Zd
d�Z	dd
�Z
dd�Zdd�Ze
�dd��Zedd��Zdd�ZeZdd�Zedd��Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&S('uChainMapu� A ChainMap groups multiple dicts (or other mappings) together
        to create a single, updateable view.

        The underlying mappings are stored in a list.  That list is public and can
        accessed or updated using the *maps* attribute.  There is no other state.

        Lookups search the underlying mappings successively until a key is found.
        In contrast, writes, updates, and deletions only operate on the first
        mapping.

        cGst|�pig|_dS(u�Initialize a ChainMap by setting *maps* to the given mappings.
            If no mappings are provided, a single empty dictionary is used.

            N(ulistumaps(uselfumaps((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__init__�suChainMap.__init__cCst|��dS(N(uKeyError(uselfukey((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__missing__�suChainMap.__missing__cCsBx2|jD]'}y||SWq
tk
r0Yq
Xq
W|j|�S(N(umapsuKeyErroru__missing__(uselfukeyumapping((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__getitem__�s
	uChainMap.__getitem__cCs||kr||S|S(N((uselfukeyudefault((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuget�suChainMap.getcCstt�j|j��S(N(ulenusetuunionumaps(uself((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__len__�suChainMap.__len__cCstt�j|j��S(N(uiterusetuunionumaps(uself((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__iter__�suChainMap.__iter__cs t�fdd�|jD��S(Nc3s|]}�|kVqdS(N((u.0um(ukey(u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu	<genexpr>�su(ChainMap.__contains__.<locals>.<genexpr>(uanyumaps(uselfukey((ukeyu3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__contains__�suChainMap.__contains__cCs
t|j�S(N(uanyumaps(uself((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__bool__�suChainMap.__bool__cCs%dj|djtt|j���S(Nu{0.__class__.__name__}({1})u, (uformatujoinumapureprumaps(uself((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__repr__�suChainMap.__repr__cGs|tj||��S(u?Create a ChainMap with a single dict created from the iterable.(udictufromkeys(uclsuiterableuargs((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyufromkeyssuChainMap.fromkeyscCs*|j|jdj�|jdd��S(uHNew ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]iiN(u	__class__umapsucopy(uself((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyucopy	su
ChainMap.copycCs|ji|j�S(u;New ChainMap with a new dict followed by all previous maps.(u	__class__umaps(uself((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu	new_childsuChainMap.new_childcCs|j|jdd��S(uNew ChainMap from maps[1:].iN(u	__class__umaps(uself((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuparentssuChainMap.parentscCs||jd|<dS(Ni(umaps(uselfukeyuvalue((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__setitem__suChainMap.__setitem__cCs@y|jd|=Wn'tk
r;tdj|���YnXdS(Niu(Key not found in the first mapping: {!r}(umapsuKeyErroruformat(uselfukey((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__delitem__s
uChainMap.__delitem__cCs:y|jdj�SWntk
r5td��YnXdS(uPRemove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.iu#No keys found in the first mapping.N(umapsupopitemuKeyError(uself((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyupopitem!s
uChainMap.popitemcGsIy|jdj||�SWn'tk
rDtdj|���YnXdS(uWRemove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].iu(Key not found in the first mapping: {!r}N(umapsupopuKeyErroruformat(uselfukeyuargs((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyupop(s
uChainMap.popcCs|jdj�dS(u'Clear maps[0], leaving maps[1:] intact.iN(umapsuclear(uself((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuclear/suChainMap.clearN(u__name__u
__module__u__qualname__u__doc__u__init__u__missing__u__getitem__uNoneugetu__len__u__iter__u__contains__u__bool__u_recursive_repru__repr__uclassmethodufromkeysucopyu__copy__u	new_childupropertyuparentsu__setitem__u__delitem__upopitemupopuclear(u
__locals__((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuChainMap�s(uChainMap(ucache_from_sourcecCsG|jd�st�|dkr*t}n|r9d}nd}||S(Nu.pyucuo(uendswithuAssertionErroruNoneu	__debug__(upathudebug_overrideusuffix((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyucache_from_source6s		ucache_from_source(uOrderedDict(u	get_ident(uKeysViewu
ValuesViewu	ItemsViewcBsv|EeZdZdZdd�Zejdd�Zejdd�Zdd	�Zd
d�Z	dd
�Z
d5dd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�ZeZe�Zedd�Zd4d d!�Zd4d"d#�Zd$d%�Zd&d'�Zed4d(d)��Zd*d+�Zd,d-�Z d.d/�Z!d0d1�Z"d2d3�Z#d4S(6uOrderedDictu)Dictionary that remembers insertion ordercOs�t|�dkr+tdt|���ny|jWnAtk
ryg|_}||dg|dd�<i|_YnX|j||�dS(u�Initialize an ordered dictionary.  Signature is the same as for
            regular dictionaries, but keyword arguments are not recommended
            because their insertion order is arbitrary.

            iu$expected at most 1 arguments, got %dN(ulenu	TypeErroru_OrderedDict__rootuAttributeErroruNoneu_OrderedDict__mapu_OrderedDict__update(uselfuargsukwdsuroot((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__init__]s

uOrderedDict.__init__cCs\||krH|j}|d}|||g|d<|d<|j|<n||||�dS(u!od.__setitem__(i, y) <==> od[i]=yiiN(u_OrderedDict__rootu_OrderedDict__map(uselfukeyuvalueudict_setitemurootulast((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__setitem__ms
	
)uOrderedDict.__setitem__cCs@|||�|jj|�\}}}||d<||d<dS(u od.__delitem__(y) <==> del od[y]iiN(u_OrderedDict__mapupop(uselfukeyudict_delitemu	link_prevu	link_next((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__delitem__ws

uOrderedDict.__delitem__ccs=|j}|d}x#||k	r8|dV|d}qWdS(uod.__iter__() <==> iter(od)iiN(u_OrderedDict__root(uselfurootucurr((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__iter__�s
	
	uOrderedDict.__iter__ccs=|j}|d}x#||k	r8|dV|d}qWdS(u#od.__reversed__() <==> reversed(od)iiN(u_OrderedDict__root(uselfurootucurr((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__reversed__�s
	
	uOrderedDict.__reversed__cCs�yZx$|jj�D]}|dd�=qW|j}||dg|dd�<|jj�Wntk
rnYnXtj|�dS(u.od.clear() -> None.  Remove all items from od.N(u_OrderedDict__mapu
itervaluesu_OrderedDict__rootuNoneuclearuAttributeErrorudict(uselfunodeuroot((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuclear�s	
uOrderedDict.clearcCs�|std��n|j}|rO|d}|d}||d<||d<n(|d}|d}||d<||d<|d}|j|=tj||�}||fS(u�od.popitem() -> (k, v), return and remove a (key, value) pair.
            Pairs are returned in LIFO order if last is true or FIFO order if false.

            udictionary is emptyiii(uKeyErroru_OrderedDict__rootu_OrderedDict__mapudictupop(uselfulasturootulinku	link_prevu	link_nextukeyuvalue((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyupopitem�s 	









uOrderedDict.popitemcCs
t|�S(uod.keys() -> list of keys in od(ulist(uself((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyukeys�suOrderedDict.keyscs�fdd��D�S(u#od.values() -> list of values in odcsg|]}�|�qS(((u.0ukey(uself(u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu
<listcomp>�s	u&OrderedDict.values.<locals>.<listcomp>((uself((uselfu3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuvalues�suOrderedDict.valuescs�fdd��D�S(u.od.items() -> list of (key, value) pairs in odcs g|]}|�|f�qS(((u.0ukey(uself(u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu
<listcomp>�s	u%OrderedDict.items.<locals>.<listcomp>((uself((uselfu3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuitems�suOrderedDict.itemscCs
t|�S(u0od.iterkeys() -> an iterator over the keys in od(uiter(uself((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuiterkeys�suOrderedDict.iterkeysccsx|D]}||VqWdS(u2od.itervalues -> an iterator over the values in odN((uselfuk((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu
itervalues�s
uOrderedDict.itervaluesccs$x|D]}|||fVqWdS(u=od.iteritems -> an iterator over the (key, value) items in odN((uselfuk((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu	iteritems�s
uOrderedDict.iteritemscOs&t|�dkr.tdt|�f��n|sCtd��n|d}f}t|�dkrr|d}nt|t�r�xw|D]}||||<q�WnXt|d�r�xF|j�D]}||||<q�Wn!x|D]\}}|||<q�Wx$|j�D]\}}|||<qWdS(u�od.update(E, **F) -> None.  Update od from dict/iterable E and F.

            If E is a dict instance, does:           for k in E: od[k] = E[k]
            If E has a .keys() method, does:         for k in E.keys(): od[k] = E[k]
            Or if E is an iterable of items, does:   for k, v in E: od[k] = v
            In either case, this is followed by:     for k, v in F.items(): od[k] = v

            iu8update() takes at most 2 positional arguments (%d given)u,update() takes at least 1 argument (0 given)iiukeysN(ulenu	TypeErroru
isinstanceudictuhasattrukeysuitems(uargsukwdsuselfuotherukeyuvalue((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuupdate�s&	


uOrderedDict.updatecCsC||kr!||}||=|S||jkr?t|��n|S(u�od.pop(k[,d]) -> v, remove specified key and return the corresponding value.
            If key is not found, d is returned if given, otherwise KeyError is raised.

            (u_OrderedDict__markeruKeyError(uselfukeyudefaulturesult((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyupop�s
uOrderedDict.popcCs"||kr||S|||<|S(uDod.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od((uselfukeyudefault((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu
setdefault�s
uOrderedDict.setdefaultcCs�|si}nt|�t�f}||kr4dSd||<z5|sXd|jjfSd|jj|j�fSWd||=XdS(uod.__repr__() <==> repr(od)u...iu%s()u%s(%r)N(uidu
_get_identu	__class__u__name__uitems(uselfu
_repr_runningucall_key((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__repr__s	
uOrderedDict.__repr__cs~�fdd��D�}t��j�}x'tt��D]}|j|d�q;W|rn�j|f|fS�j|ffS(u%Return state information for picklingcs g|]}|�|g�qS(((u.0uk(uself(u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu
<listcomp>s	u*OrderedDict.__reduce__.<locals>.<listcomp>N(uvarsucopyuOrderedDictupopuNoneu	__class__(uselfuitemsu	inst_dictuk((uselfu3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu
__reduce__suOrderedDict.__reduce__cCs
|j|�S(u!od.copy() -> a shallow copy of od(u	__class__(uself((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyucopysuOrderedDict.copycCs(|�}x|D]}|||<qW|S(u�OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S
            and values equal to v (which defaults to None).

            ((uclsuiterableuvalueudukey((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyufromkeys"s	
uOrderedDict.fromkeyscCsMt|t�r=t|�t|�ko<|j�|j�kStj||�S(u�od.__eq__(y) <==> od==y.  Comparison to another OD is order-sensitive
            while comparison to a regular mapping is order-insensitive.

            (u
isinstanceuOrderedDictulenuitemsudictu__eq__(uselfuother((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__eq__-s.uOrderedDict.__eq__cCs||kS(N((uselfuother((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__ne__6suOrderedDict.__ne__cCs
t|�S(u@od.viewkeys() -> a set-like object providing a view on od's keys(uKeysView(uself((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuviewkeys;suOrderedDict.viewkeyscCs
t|�S(u<od.viewvalues() -> an object providing a view on od's values(u
ValuesView(uself((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu
viewvalues?suOrderedDict.viewvaluescCs
t|�S(uBod.viewitems() -> a set-like object providing a view on od's items(u	ItemsView(uself((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu	viewitemsCsuOrderedDict.viewitemsNT($u__name__u
__module__u__qualname__u__doc__u__init__udictu__setitem__u__delitem__u__iter__u__reversed__uclearuTrueupopitemukeysuvaluesuitemsuiterkeysu
itervaluesu	iteritemsuupdateu_OrderedDict__updateuobjectu_OrderedDict__markerupopuNoneu
setdefaultu__repr__u
__reduce__ucopyuclassmethodufromkeysu__eq__u__ne__uviewkeysu
viewvaluesu	viewitems(u
__locals__((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuOrderedDictQs:
		


	uOrderedDict(uBaseConfiguratoruvalid_identu^[a-z_][a-z0-9_]*$cCs,tj|�}|s(td|��ndS(Nu!Not a valid Python identifier: %rT(u
IDENTIFIERumatchu
ValueErroruTrue(usum((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuvalid_identMsuvalid_identcBs5|EeZdZdZdd�Zddd�ZdS(uConvertingDictu A converting dictionary wrapper.cCsqtj||�}|jj|�}||k	rm|||<t|�tttfkrm||_||_	qmn|S(N(
udictu__getitem__uconfiguratoruconvertutypeuConvertingDictuConvertingListuConvertingTupleuparentukey(uselfukeyuvalueuresult((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__getitem__`s
	uConvertingDict.__getitem__cCsttj|||�}|jj|�}||k	rp|||<t|�tttfkrp||_||_	qpn|S(N(
udictugetuconfiguratoruconvertutypeuConvertingDictuConvertingListuConvertingTupleuparentukey(uselfukeyudefaultuvalueuresult((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyugetls
	uConvertingDict.getN(u__name__u
__module__u__qualname__u__doc__u__getitem__uNoneuget(u
__locals__((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuConvertingDict]suConvertingDictcCsjtj|||�}|jj|�}||k	rft|�tttfkrf||_||_	qfn|S(N(
udictupopuconfiguratoruconvertutypeuConvertingDictuConvertingListuConvertingTupleuparentukey(uselfukeyudefaultuvalueuresult((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyupopxs	upopcBs5|EeZdZdZdd�Zddd�ZdS(	uConvertingListuA converting list wrapper.cCsqtj||�}|jj|�}||k	rm|||<t|�tttfkrm||_||_	qmn|S(N(
ulistu__getitem__uconfiguratoruconvertutypeuConvertingDictuConvertingListuConvertingTupleuparentukey(uselfukeyuvalueuresult((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__getitem__�s
	uConvertingList.__getitem__icCs^tj||�}|jj|�}||k	rZt|�tttfkrZ||_qZn|S(N(	ulistupopuconfiguratoruconvertutypeuConvertingDictuConvertingListuConvertingTupleuparent(uselfuidxuvalueuresult((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyupop�suConvertingList.popNi����(u__name__u
__module__u__qualname__u__doc__u__getitem__upop(u
__locals__((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuConvertingList�suConvertingListcBs&|EeZdZdZdd�ZdS(uConvertingTupleuA converting tuple wrapper.cCsgtj||�}|jj|�}||k	rct|�tttfkrc||_||_	qcn|S(N(
utupleu__getitem__uconfiguratoruconvertutypeuConvertingDictuConvertingListuConvertingTupleuparentukey(uselfukeyuvalueuresult((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__getitem__�s	uConvertingTuple.__getitem__N(u__name__u
__module__u__qualname__u__doc__u__getitem__(u
__locals__((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuConvertingTuple�suConvertingTuplecBs�|EeZdZdZejd�Zejd�Zejd�Zejd�Z	ejd�Z
idd6d	d
6Zee
�Zdd�Zd
d�Zdd�Zdd�Zdd�Zdd�Zdd�ZdS(uBaseConfiguratoruQ
        The configurator base class which defines some useful defaults.
        u%^(?P<prefix>[a-z]+)://(?P<suffix>.*)$u^\s*(\w+)\s*u^\.\s*(\w+)\s*u^\[\s*(\w+)\s*\]\s*u^\d+$uext_convertuextucfg_convertucfgcCst|�|_||j_dS(N(uConvertingDictuconfiguconfigurator(uselfuconfig((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu__init__�suBaseConfigurator.__init__c	Cs�|jd�}|jd�}yz|j|�}x`|D]X}|d|7}yt||�}Wq7tk
r�|j|�t||�}Yq7Xq7W|SWn]tk
r�tj�dd�\}}td||f�}|||_	|_
|�YnXdS(ul
            Resolve strings to objects using standard import and attribute
            syntax.
            u.iiNuCannot resolve %r: %s(usplitupopuimporterugetattruAttributeErroruImportErrorusysuexc_infou
ValueErroru	__cause__u
__traceback__(	uselfusunameuusedufoundufragueutbuv((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuresolve�s"



uBaseConfigurator.resolvecCs
|j|�S(u*Default converter for the ext:// protocol.(uresolve(uselfuvalue((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuext_convert�suBaseConfigurator.ext_convertcCs\|}|jj|�}|dkr7td|��n!||j�d�}|j|j�d}x�|rW|jj|�}|r�||j�d}n�|jj|�}|r|j�d}|j	j|�s�||}qyt
|�}||}Wqtk
r||}YqXn|r>||j�d�}qgtd||f��qgW|S(u*Default converter for the cfg:// protocol.uUnable to convert %rNiuUnable to convert %r at %r(uWORD_PATTERNumatchuNoneu
ValueErroruenduconfigugroupsuDOT_PATTERNu
INDEX_PATTERNu
DIGIT_PATTERNuintu	TypeError(uselfuvalueurestumuduidxun((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyucfg_convert�s2	

uBaseConfigurator.cfg_convertcCs/t|t�r7t|t�r7t|�}||_n�t|t�rnt|t�rnt|�}||_n�t|t�r�t|t�r�t|�}||_n�t|t�r+|j	j
|�}|r+|j�}|d}|jj
|d�}|r(|d}t||�}||�}q(q+n|S(u�
            Convert values to an appropriate type. dicts, lists and tuples are
            replaced by their converting alternatives. Strings are checked to
            see if they have a conversion format and are converted if they do.
            uprefixusuffixN(u
isinstanceuConvertingDictudictuconfiguratoruConvertingListulistuConvertingTupleutupleustring_typesuCONVERT_PATTERNumatchu	groupdictuvalue_convertersugetuNoneugetattr(uselfuvalueumuduprefixu	converterusuffix((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuconvert�s*

uBaseConfigurator.convertcs��jd�}t|�s-|j|�}n�jdd�}t�fdd��D��}||�}|r�x-|j�D]\}}t|||�q}Wn|S(u1Configure an object with a user-supplied factory.u()u.cs,g|]"}t|�r|�|f�qS((uvalid_ident(u.0uk(uconfig(u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu
<listcomp>s	u5BaseConfigurator.configure_custom.<locals>.<listcomp>N(upopucallableuresolveuNoneudictuitemsusetattr(uselfuconfigucupropsukwargsuresultunameuvalue((uconfigu3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuconfigure_customsu!BaseConfigurator.configure_customcCs"t|t�rt|�}n|S(u0Utility function which converts lists to tuples.(u
isinstanceulistutuple(uselfuvalue((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuas_tuple$suBaseConfigurator.as_tupleN(u__name__u
__module__u__qualname__u__doc__ureucompileuCONVERT_PATTERNuWORD_PATTERNuDOT_PATTERNu
INDEX_PATTERNu
DIGIT_PATTERNuvalue_convertersustaticmethodu
__import__uimporteru__init__uresolveuext_convertucfg_convertuconvertuconfigure_customuas_tuple(u
__locals__((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyuBaseConfigurator�s"
"uBaseConfigurator(ii(�u
__future__uabsolute_importuosureusysuversion_infouStringIOu
basestringustring_typesuunicodeu	text_typeutypesuFileTypeu	file_typeu__builtin__ubuiltinsuConfigParseruconfigparseru	_backportushutiluurlparseu
urlunparseuurljoinuurlsplitu
urlunsplituurllibuurlretrieveuquoteu_quoteuunquoteuurl2pathnameupathname2urluContentTooShortErroru	splittypeuurllib2uRequestuurlopenuURLErroru	HTTPErroruHTTPBasicAuthHandleruHTTPPasswordMgruHTTPSHandleruHTTPHandleruHTTPRedirectHandlerubuild_openeruhttplibu	xmlrpclibuQueueuqueueu
HTMLParseruhtmlentitydefsu	raw_inputu	itertoolsuifilterufilteruifilterfalseufilterfalseuNoneu	_userprogu	splituseruioustru
TextIOWrapperuurllib.parseuurllib.requestuurllib.erroruhttp.clientuclienturequestu
xmlrpc.clientuhtml.parseru
html.entitiesuentitiesuinputusslumatch_hostnameuCertificateErroruImportErroru
ValueErroru_dnsname_to_patuSimpleNamespaceu	ContaineruobjectuwhichuF_OKuX_OKuzipfileuZipFileuBaseZipFileuhasattru
ZipExtFileuBaseZipExtFileuplatformupython_implementationu	sysconfigucallableu	NameErrorucollectionsuCallableufsencodeufsdecodeuAttributeErrorugetfilesystemencodingu_fsencodingu	_fserrorsutokenizeudetect_encodingucodecsuBOM_UTF8ulookupucompileu	cookie_reu_get_normal_nameuhtmluescapeucgiuunescapeuChainMapuMutableMappingureprliburecursive_repru_recursive_repruimpucache_from_sourceuOrderedDictuthreadu	get_identu
_get_identudummy_threadu_abcolluKeysViewu
ValuesViewu	ItemsViewudictulogging.configuBaseConfiguratoruvalid_identuIu
IDENTIFIERuConvertingDictupopulistuConvertingListutupleuConvertingTuple(((u3/tmp/pip-zej_zi-build/pip/_vendor/distlib/compat.pyu<module>s	(4F	@L
)

!A	




	

			
[


b



 
�

site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-33.pyc000064400000003144151733463540021551 0ustar00�
7�ReEc@s�ddlZdZGdd�de�ZyddlmZWn+ek
riGdd�dej�ZYnXeje�Z	e	j
e��dS(iNu0.1.8cBs|EeZdZdS(uDistlibExceptionN(u__name__u
__module__u__qualname__(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/__init__.pyuDistlibExceptionsuDistlibException(uNullHandlercBs8|EeZdZdd�Zdd�Zdd�ZdS(uNullHandlercCsdS(N((uselfurecord((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/__init__.pyuhandlesuNullHandler.handlecCsdS(N((uselfurecord((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/__init__.pyuemitsuNullHandler.emitcCs
d|_dS(N(uNoneulock(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/__init__.pyu
createLocksuNullHandler.createLockN(u__name__u
__module__u__qualname__uhandleuemitu
createLock(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/__init__.pyuNullHandlersuNullHandler(uloggingu__version__u	ExceptionuDistlibExceptionuNullHandleruImportErroruHandleru	getLoggeru__name__uloggeru
addHandler(((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/__init__.pyu<module>s
site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-33.pyc000064400000030022151733463540021474 0ustar00�
7�Re0c@s�ddlmZddlZddlZddlZddlZddlZddlmZm	Z	m
Z
mZddlm
Z
ddlmZmZmZmZmZeje�Zdj�Zejd�Zd	ZGd
d�de�ZdS(i(uBytesIONi(u	sysconfigufsencodeudetect_encodinguZipFile(ufinder(uFileOperatoruget_export_entryuconvert_pathuget_executableuin_venvu�
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
 <assemblyIdentity version="1.0.0.0"
 processorArchitecture="X86"
 name="%s"
 type="win32"/>

 <!-- Identify the application security requirements. -->
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
 <security>
 <requestedPrivileges>
 <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
 </requestedPrivileges>
 </security>
 </trustInfo>
</assembly>s^#!.*pythonw?[0-9.]*([ 	].*)?$u{# -*- coding: utf-8 -*-
if __name__ == '__main__':
    import sys, re

    def _resolve(module, func):
        __import__(module)
        mod = sys.modules[module]
        parts = func.split('.')
        result = getattr(mod, parts.pop(0))
        for p in parts:
            result = getattr(result, p)
        return result

    try:
        sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])

        func = _resolve('%(module)s', '%(func)s')
        rc = func() # None interpreted as 0
    except Exception as e:  # only supporting Python >= 2.6
        sys.stderr.write('%%s\n' %% e)
        rc = 1
    sys.exit(rc)
cBs|EeZdZdZeZdZddddd�Z
dd�Zdddd�Zd	d
�Z
eZdd�Zd
d�Zddd�Zdd�Zedd��Zejdd��Zejdkr�dd�Znddd�Zddd�ZdS( uScriptMakeru_
    A class to copy or create scripts from source scripts or callable
    specifications.
    cCsg||_||_||_d|_d|_tjdk|_t	d�|_
|p]t|�|_dS(NuposixuuX.YF(uuX.Y(
u
source_diru
target_diru
add_launchersuFalseuforceuclobberuosunameuset_modeusetuvariantsuFileOperatoru_fileop(uselfu
source_diru
target_diru
add_launchersudry_runufileop((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/scripts.pyu__init__Ks					uScriptMaker.__init__cCsg|jdd�rctjdkrctjj|�\}}|jdd�}tjj||�}n|S(NuguiuntupythonupythonwF(ugetuFalseuosunameupathusplitureplaceujoin(uselfu
executableuoptionsudnufn((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/scripts.pyu_get_alternate_executableWs
!u%ScriptMaker._get_alternate_executablescCs�d}|jr!|j}d}n�tj�s9t�}nqt�rptjj	tj
d�dtjd��}n:tjj	tjd�dtjd�tjd�f�}|r�|j||�}n|r�d|kr�d|}nt
|�}d	||d
}y|jd�Wn"tk
r7td|��YnX|dkr�y|j|�Wq�tk
rtd
||f��Yq�Xn|S(Nuscriptsupython%suEXEuBINDIRu
python%s%suVERSIONu u"%s"s#!s
uutf-8u,The shebang (%r) is not decodable from utf-8u?The shebang (%r) is not decodable from the script encoding (%r)TF(uTrueu
executableuFalseu	sysconfiguis_python_builduget_executableuin_venvuosupathujoinuget_pathuget_config_varu_get_alternate_executableufsencodeudecodeuUnicodeDecodeErroru
ValueError(uselfuencodingupost_interpuoptionsuenquoteu
executableushebang((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/scripts.pyu_get_shebang^s@					


uScriptMaker._get_shebangcCs |jtd|jd|j�S(Numoduleufunc(uscript_templateudictuprefixusuffix(uselfuentry((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/scripts.pyu_get_script_text�suScriptMaker._get_script_textcCstjj|�}|j|S(N(uosupathubasenameumanifest(uselfuexenameubase((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/scripts.pyuget_manifest�suScriptMaker.get_manifestcCs�|jotjdk}tjjd�}|sA|||}n||dkr_|jd�}n|jd�}t�}	t|	d��}
|
jd|�WdQX|	j	�}||||}x�|D]�}tj
j|j|�}
|r�tj
j
|
�\}}|jd�r|}
nd|
}
y|jj|
|�Wqztk
r�tjd	�d
|
}tj
j|�r�tj|�ntj|
|�|jj|
|�tjd�ytj|�Wntk
r�YnXYqzXn�tjdkr|
jd|�rd
|
|f}
ntj
j|
�rH|jrHtjd|
�q�n|jj|
|�|jrz|jj|
g�n|j|
�q�WdS(Nuntuutf-8upyutuwu__main__.pyu.pyu%s.exeu:Failed to write executable - trying to use .deleteme logicu%s.deletemeu0Able to replace executable using .deleteme logicu.u%s.%suSkipping existing file %s(u
add_launchersuosunameulinesepuencodeu
_get_launcheruBytesIOuZipFileuwritestrugetvalueupathujoinu
target_dirusplitextu
startswithu_fileopuwrite_binary_fileu	Exceptionuloggeruwarninguexistsuremoveurenameudebuguendswithuclobberuset_modeuset_executable_modeuappend(uselfunamesushebanguscript_bytesu	filenamesuextuuse_launcherulinesepulauncherustreamuzfuzip_dataunameuoutnameunueudfname((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/scripts.pyu
_write_script�sT	
	






#	uScriptMaker._write_scriptc	Cs|jdd|�}|j|�jd�}|j}t�}d|jkr^|j|�nd|jkr�|jd|tjdf�nd|jkr�|jd|tjdd	�f�n|r�|j	d
d
�r�d}nd}|j|||||�dS(Nuutf-8uoptionsuuXu%s%siuX.Yu%s-%siuguiupywupyF(u_get_shebangu_get_script_textuencodeunameusetuvariantsuaddusysuversionugetuFalseu
_write_script(	uselfuentryu	filenamesuoptionsushebanguscriptunameuscriptnamesuext((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/scripts.pyu_make_script�s		!'	uScriptMaker._make_scriptcCsAd
}tjj|jt|��}tjj|jtjj|��}|jr||j	j
||�r|tjd|�dSyt
|d�}Wn'tk
r�|js��nd}Yn�Xt|j�\}}|jd�|j�}|s
tjd|j�|�dStj|jdd��}	|	rId}|	jd�pCd}
n|s�|rb|j�n|j	j||�|jr�|j	j|g�n|j|�n�tj d	||j�|j	js*|j!||
�}d
|kr�d}nd}tjj|�}
|j"|
g||j#�||�n|r=|j�ndS(Nunot copying %s (up-to-date)urbiu"%s: %s is an empty file (skipping)s
s
isucopying and adjusting %s -> %sspythonwupywupyFT($uFalseuosupathujoinu
source_diruconvert_pathu
target_dirubasenameuforceu_fileopuneweruloggerudebuguopenuIOErrorudry_runuNoneudetect_encodingureadlineuseekuwarninguget_command_nameu
FIRST_LINE_REumatchureplaceuTrueugroupucloseu	copy_fileuset_modeuset_executable_modeuappenduinfou_get_shebangu
_write_scripturead(uselfuscriptu	filenamesuadjustuoutnameufuencodingulinesu
first_lineumatchupost_interpushebanguextun((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/scripts.pyu_copy_script�sR$ 
	
	
	
	%uScriptMaker._copy_scriptcCs
|jjS(N(u_fileopudry_run(uself((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/scripts.pyudry_run
suScriptMaker.dry_runcCs||j_dS(N(u_fileopudry_run(uselfuvalue((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/scripts.pyudry_runsuntcCsftjd�dkrd}nd}d||f}tjdd�d}t|�j|�j}|S(	NuPiu64u32u%s%s.exeu.ii(ustructucalcsizeu__name__ursplitufinderufindubytes(uselfukindubitsunameudistlib_packageuresult((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/scripts.pyu
_get_launchers	uScriptMaker._get_launchercCsKg}t|�}|dkr1|j||�n|j||d|�|S(u�
        Make a script.

        :param specification: The specification, which is either a valid export
                              entry specification (to make a script from a
                              callable) or a filename (to make a script by
                              copying from a source location).
        :param options: A dictionary of options controlling script generation.
        :return: A list of all absolute pathnames written to.
        uoptionsN(uget_export_entryuNoneu_copy_scriptu_make_script(uselfu
specificationuoptionsu	filenamesuentry((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/scripts.pyumake'suScriptMaker.makecCs4g}x'|D]}|j|j||��q
W|S(u�
        Take a list of specifications and make scripts from them,
        :param specifications: A list of specifications.
        :return: A list of all absolute pathnames written to,
        (uextendumake(uselfuspecificationsuoptionsu	filenamesu
specification((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/scripts.pyu
make_multiple:s
uScriptMaker.make_multipleNTF(u__name__u
__module__u__qualname__u__doc__uSCRIPT_TEMPLATEuscript_templateuNoneu
executableuTrueuFalseu__init__u_get_alternate_executableu_get_shebangu_get_script_textu_DEFAULT_MANIFESTumanifestuget_manifestu
_write_scriptu_make_scriptu_copy_scriptupropertyudry_runusetteruosunameu
_get_launcherumakeu
make_multiple(u
__locals__((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/scripts.pyuScriptMakerBs&.24uScriptMaker(uiouBytesIOulogginguosureustructusysucompatu	sysconfigufsencodeudetect_encodinguZipFileu	resourcesufinderuutiluFileOperatoruget_export_entryuconvert_pathuget_executableuin_venvu	getLoggeru__name__uloggerustripu_DEFAULT_MANIFESTucompileu
FIRST_LINE_REuSCRIPT_TEMPLATEuobjectuScriptMaker(((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/scripts.pyu<module>s"(site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-33.pyc000064400000022215151733463540021456 0ustar00�
7�Re�c@s�dZddlZddlZddlZddlZddlmZmZddlm	Z	dgZ
Gdd�de�Zdd	d�ZdS(
uEParser for the environment markers micro-language defined in PEP 345.iNi(upython_implementationustring_types(uin_venvu	interpretcBs�|EeZdZdZi	dd�d6dd�d6dd�d6d	d�d
6dd�d6d
d�d6dd�d6dd�d6dd�d6Zi	ejd6dejdd�d6ejj	dd�dd6e
jd6ee
��d6ej�d 6ej�d!6ej�d"6e�d#6Zdd$d%�Zd&d'�Zd(d)�Zdd*d+�Zd,d-�Zd.d/�Zd0d1�Zd2d3�Zd4d5�Zd6d7�Zd8d9�ZdS(:u	Evaluatoru5
    A limited evaluator for Python expressions.
    cCs
||kS(N((uxuy((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyu<lambda>suEvaluator.<lambda>ueqcCs
||kS(N((uxuy((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyu<lambda>sugtcCs
||kS(N((uxuy((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyu<lambda>sugtecCs
||kS(N((uxuy((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyu<lambda>suincCs
||kS(N((uxuy((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyu<lambda>sultcCs
||kS(N((uxuy((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyu<lambda>sultecCs|S(N((ux((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyu<lambda> sunotcCs
||kS(N((uxuy((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyu<lambda>!sunoteqcCs
||kS(N((uxuy((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyu<lambda>"sunotinusys_platformu%s.%sNiupython_versionu iiupython_full_versionuos_nameuplatform_in_venvuplatform_releaseuplatform_versionuplatform_machineuplatform_python_implementationcCs|p	i|_d|_dS(uu
        Initialise an instance.

        :param context: If specified, names are looked up in this mapping.
        N(ucontextuNoneusource(uselfucontext((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyu__init__3suEvaluator.__init__cCsKd}d|j|||�}||t|j�krG|d7}n|S(uH
        Get the part of the source which is causing a problem.
        i
u%ru...(usourceulen(uselfuoffsetufragment_lenus((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyuget_fragment<s

uEvaluator.get_fragmentcCst|d|d�S(u@
        Get a handler for the specified AST node type.
        udo_%sN(ugetattruNone(uselfu	node_type((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyuget_handlerFsuEvaluator.get_handlercCst|t�r�||_idd6}|r8||d<nytj||�}Wq�tk
r�}z'|j|j�}td|��WYdd}~Xq�Xn|jj	j
�}|j|�}|dkr|jdkr�d}n|j|j
�}td||f��n||�S(uf
        Evaluate a source string or node, using ``filename`` when
        displaying errors.
        uevalumodeufilenameusyntax error %sNu(source not available)u don't know how to evaluate %r %s(u
isinstanceustring_typesusourceuastuparseuSyntaxErroruget_fragmentuoffsetu	__class__u__name__uloweruget_handleruNoneu
col_offset(uselfunodeufilenameukwargsueusu	node_typeuhandler((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyuevaluateLs&	

&	uEvaluator.evaluatecCs5t|tj�std��d|jj|jfS(Nuattribute node expectedu%s.%s(u
isinstanceuastu	AttributeuAssertionErroruvalueuiduattr(uselfunode((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyuget_attr_keyfsuEvaluator.get_attr_keycCs�t|jtj�sd}n-|j|�}||jkpH||jk}|sdtd|��n||jkr�|j|}n
|j|}|S(Nuinvalid expression: %sF(	u
isinstanceuvalueuastuNameuFalseuget_attr_keyucontextuallowed_valuesuSyntaxError(uselfunodeuvalidukeyuresult((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyudo_attributejs	
uEvaluator.do_attributec	Cs�|j|jd�}|jjtjk}|jjtjk}|sR|sRt�|r^|sk|r�|r�xJ|jdd�D]2}|j|�}|r�|s�|r|rPqqWn|S(Nii(uevaluateuvaluesuopu	__class__uastuOruAnduAssertionError(uselfunodeuresultuis_oruis_andun((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyu	do_boolopxsuEvaluator.do_boolopc	s���fdd�}�j}�j|�}d}x�t�j�j�D]�\}}|||�|jjj�}|�j	kr�t
d|��n�j|�}�j	|||�}|s�Pn|}|}qIW|S(Ncsbd}t|tj�r3t|tj�r3d}n|s^�j�j�}td|��ndS(NuInvalid comparison: %sTF(uTrueu
isinstanceuastuStruFalseuget_fragmentu
col_offsetuSyntaxError(ulhsnodeurhsnodeuvalidus(unodeuself(u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyusanity_check�s$	u*Evaluator.do_compare.<locals>.sanity_checkuunsupported operation: %rT(uleftuevaluateuTrueuzipuopsucomparatorsu	__class__u__name__uloweru	operatorsuSyntaxError(	uselfunodeusanity_checkulhsnodeulhsuresultuopurhsnodeurhs((unodeuselfu4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyu
do_compare�s 
	"

uEvaluator.do_comparecCs|j|j�S(N(uevaluateubody(uselfunode((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyu
do_expression�suEvaluator.do_expressioncCs|d}|j|jkr1d}|j|j}n+|j|jkr\d}|j|j}n|sxtd|j��n|S(Nuinvalid expression: %sFT(uFalseuiducontextuTrueuallowed_valuesuSyntaxError(uselfunodeuvaliduresult((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyudo_name�suEvaluator.do_namecCs|jS(N(us(uselfunode((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyudo_str�suEvaluator.do_str(u__name__u
__module__u__qualname__u__doc__u	operatorsusysuplatformuversion_infouversionusplituosunameustruin_venvureleaseumachineupython_implementationuallowed_valuesuNoneu__init__uget_fragmentuget_handleruevaluateuget_attr_keyudo_attributeu	do_boolopu
do_compareu
do_expressionudo_nameudo_str(u
__locals__((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyu	Evaluators@













	
u	EvaluatorcCst|�j|j��S(u�
    Interpret a marker and return a result depending on environment.

    :param marker: The marker to interpret.
    :type marker: str
    :param execution_context: The context used for name lookup.
    :type execution_context: mapping
    (u	Evaluatoruevaluateustrip(umarkeruexecution_context((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyu	interpret�s	(u__doc__uastuosusysuplatformucompatupython_implementationustring_typesuutiluin_venvu__all__uobjectu	EvaluatoruNoneu	interpret(((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/markers.pyu<module>s	�site-packages/pip/_vendor/distlib/__pycache__/util.cpython-33.pyc000064400000205101151733463540020764 0ustar00�
7�Re�c@s�ddlZddlmZddlZddlZddlmZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlZddlZyddlZWnek
rddlZYnXddlZddlmZddlmZmZmZmZmZm 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/e
j0e1�Z2dZ3e
j4e3�Z5dZ6d	e6d
Z7e6dZ8dZ9d
e9de8de3d
e9de8dZ:dZ;de:de;de:dZ<e7d
e3e7dZ=de=dZ>de6de>de<dZ?e
j4e?�Z@de9de8d
ZAe
j4eA�ZBdd �ZCd!d"�ZDd#d$�ZEd%d&�ZFddd'd(�ZHd)d*�ZId+d,�ZJd-d.�ZKejLd/d0��ZMejLd1d2��ZNejLd3d4d5��ZOGd6d7�d7eP�ZQd8d9�ZRGd:d;�d;eP�ZSd<d=�ZTGd>d?�d?eP�ZUe
j4d@e
jV�ZWdAdB�ZXddCdD�ZYdEdF�ZZdGdH�Z[dIdJ�Z\dKdL�Z]dMdN�Z^e
j4dOe
j_�Z`e
j4dP�ZaddQdR�Zbe
j4dS�ZcdTdU�ZddVdW�ZedXdY�ZfdZd[�Zgd\d]�ZhGd^d_�d_eP�ZiGd`da�daeP�ZjGdbdc�dceP�Zkd�Zldd�dkdl�Zndmdn�Zod�ZpGdudv�dveP�Zqe
j4dw�Zre
j4dx�Zse
j4dy�Ztdzd{�Zd|d}�ZuGd~d�de"jv�ZvGd�d��d�e'�Z&Gd�d��d�e&e%�Zwejxdd��Zyeyd�krGd�d��d�e"jz�ZzGd�d��d�e"j{�Z{nGd�d��d�e#j|�Z|Gd�d��d�e#j}�Z}Gd�d��d�e#j~�Z~d�d��ZGd�d��d�eP�Z�Gd�d��d�e��Z�Gd�d��d�e��Z�Gd�d��d�e(�Z�Gd�d��d�eP�Z�dS(�iN(udeque(uiglobi(uDistlibException(ustring_typesu	text_typeushutilu	raw_inputuStringIOucache_from_sourceuurlopenuhttplibu	xmlrpclibu	splittypeuHTTPHandleruHTTPSHandleruBaseConfiguratoruvalid_identu	ContaineruconfigparseruURLErrorumatch_hostnameuCertificateErroruZipFileu\s*,\s*u
(\w|[.-])+u(\*|:(\*|\w+):|u)u\*?u([<>=!~]=)|[<>]u(u)?\s*(u)(u)\s*(u))*u(from\s+(?P<diref>.*))u\(\s*(?P<c1>u|u)\s*\)|(?P<c2>u\s*)u)*u\[\s*(?P<ex>u)?\s*\]u(?P<dn>u	\s*)?(\s*u)?$u(?P<op>u)\s*(?P<vn>cs^dd��d}tj|�}|rZ|j�}|d}|dpN|d}|dsdd}nd}|dj�}|s�d}d}|d}nk|dd	kr�d
|}ntj|�}	�fdd�|	D�}d
|djdd�|D��f}|dsd}
ntj	|d�}
t
d|d|d|
d|d|d|�}n|S(NcSs|j�}|d|dfS(Nuopuvn(u	groupdict(umud((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuget_constraintTsu)parse_requirement.<locals>.get_constraintudnuc1uc2udirefuiu<>!=u~=csg|]}�|��qS(((u.0um(uget_constraint(u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu
<listcomp>ls	u%parse_requirement.<locals>.<listcomp>u%s (%s)u, cSsg|]}d|�qS(u%s %s((u.0ucon((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu
<listcomp>ms	uexunameuconstraintsuextrasurequirementusourceuurl(uNoneuREQUIREMENT_REumatchu	groupdictustripuRELOP_IDENT_REufinditerujoinuCOMMA_REusplitu	Container(usuresultumudunameuconsuurluconstrursuiteratoruextras((uget_constraintu1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuparse_requirementRs4

	

&
	uparse_requirementcCs�dd�}i}x�|D]�\}}}tjj||�}x�t|�D]�}tjj||�}	x�t|	�D]v}
|||
�}|dkr�|j|d�qr|||
�}|jtjjd�jd�}
|
d|||<qrWqJWqW|S(u%Find destinations for resources filescSsb|jtjjd�}|jtjjd�}|j|�sEt�|t|�d�jd�S(Nu/(ureplaceuosupathusepu
startswithuAssertionErrorulenulstrip(ubaseupath((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuget_rel_pathzsu)get_resources_dests.<locals>.get_rel_pathu/N(	uosupathujoinuiglobuNoneupopureplaceusepurstrip(uresources_rooturulesuget_rel_pathudestinationsubaseusuffixudestuprefixuabs_baseuabs_globuabs_pathu
resource_fileurel_pathurel_dest((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuget_resources_destsws!uget_resources_destscCs:ttd�rd}ntjttdtj�k}|S(Nureal_prefixubase_prefixT(uhasattrusysuTrueuprefixugetattr(uresult((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuin_venv�s	uin_venvcCs;tjdkr.dtjkr.tjd}n	tj}|S(Nudarwinu__PYVENV_LAUNCHER__(usysuplatformuosuenvironu
executable(uresult((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuget_executable�s
	uget_executablecCs}|}xpt|�}|}|r1|r1|}n|r	|dj�}||krWPn|rvd|||f}qvq	q	|S(Niu	%c: %s
%s(u	raw_inputulower(upromptu
allowed_charsuerror_promptudefaultupusuc((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuproceed�s
	uproceedcCsVt|t�r|j�}ni}x+|D]#}||kr+||||<q+q+W|S(N(u
isinstanceustring_typesusplit(udukeysuresultukey((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuextract_by_key�s
uextract_by_keyc

Cs�tjddkr+tjd�|�}n|j�}t|�}y�tj|�}|d}xo|j�D]a\}}xR|j�D]D\}}d||f}t	|�}|dk	s�t�|||<q�WqlW|SWn"tk
r�|j
dd�YnXtj�}	t|	d�r&|	j|�n
|	j|�i}xz|	j�D]l}
i||
<}xU|	j|
�D]D\}}d||f}t	|�}|dk	s�t�|||<qjWqFW|S(Niiuutf-8uexportsu%s = %su	read_file(usysuversion_infoucodecsu	getreaderureaduStringIOujsonuloaduitemsuget_export_entryuNoneuAssertionErroru	ExceptionuseekuconfigparseruConfigParseruhasattru	read_fileureadfpusections(
ustreamudatauresultugroupuentriesukuvusuentryucpukeyunameuvalue((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuread_exports�s:


uread_exportscCs�tjddkr+tjd�|�}ntj�}x�|j�D]�\}}|j|�x�|j�D]u}|j	dkr�|j}nd|j|j	f}|jr�d|dj
|j�f}n|j||j|�qjWqDW|j|�dS(Niiuutf-8u%s:%su%s [%s]u, (usysuversion_infoucodecsu	getwriteruconfigparseruConfigParseruitemsuadd_sectionuvaluesusuffixuNoneuprefixuflagsujoinusetunameuwrite(uexportsustreamucpukuvuentryus((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu
write_exports�s
	u
write_exportsccs*tj�}z	|VWdtj|�XdS(N(utempfileumkdtempushutilurmtree(utd((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyutempdir�s	utempdirccs7tj�}ztj|�dVWdtj|�XdS(N(uosugetcwduchdir(uducwd((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuchdir�s

	uchdiriccs7tj�}ztj|�dVWdtj|�XdS(N(usocketugetdefaulttimeoutusetdefaulttimeout(usecondsucto((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyusocket_timeouts

	usocket_timeoutcBs/|EeZdZdd�Zddd�ZdS(ucached_propertycCs
||_dS(N(ufunc(uselfufunc((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__init__sucached_property.__init__cCs<|dkr|S|j|�}tj||jj|�|S(N(uNoneufuncuobjectu__setattr__u__name__(uselfuobjuclsuvalue((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__get__s
ucached_property.__get__N(u__name__u
__module__u__qualname__u__init__uNoneu__get__(u
__locals__((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyucached_propertysucached_propertycCs�tjdkr|S|s|S|ddkr@td|��n|ddkrctd|��n|jd�}x#tj|kr�|jtj�quW|s�tjStjj|�S(u�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.
    u/iupath '%s' cannot be absoluteiupath '%s' cannot end with '/'i����(uosusepu
ValueErrorusplitucurdiruremoveupathujoin(upathnameupaths((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuconvert_paths
uconvert_pathcBs�|EeZdZd"dd�Zdd�Zdd�Zdd�Zd#d	d
�Z	d!dd�Zd
d�Zdd�Z
dd�Zdd�Zdd�Zd"d"d!dd�Zdd�Zdd�Zdd�Zdd �Zd!S($uFileOperatorcCs#||_t�|_|j�dS(N(udry_runusetuensuredu_init_record(uselfudry_run((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__init__;s	uFileOperator.__init__cCs%d|_t�|_t�|_dS(NF(uFalseurecordusetu
files_writtenudirs_created(uself((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu_init_record@s	uFileOperator._init_recordcCs |jr|jj|�ndS(N(urecordu
files_writtenuadd(uselfupath((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyurecord_as_writtenEs	uFileOperator.record_as_writtencCsitjj|�s1tdtjj|���ntjj|�sGdStj|�jtj|�jkS(u�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".
        ufile '%r' does not existT(uosupathuexistsuDistlibExceptionuabspathuTrueustatust_mtime(uselfusourceutarget((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyunewerIsuFileOperator.newercCs�|jtjj|��tjd||�|js�d}|r�tjj|�r`d|}q�tjj	|�r�tjj
|�r�d|}q�n|r�t|d��ntj
||�n|j|�dS(u8Copy a file respecting dry-run and force flags.
        uCopying %s to %su%s is a symlinku%s is a non-regular fileu which would be overwrittenN(u
ensure_diruosupathudirnameuloggeruinfoudry_runuNoneuislinkuexistsuisfileu
ValueErrorushutilucopyfileurecord_as_written(uselfuinfileuoutfileucheckumsg((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu	copy_file]s	
%uFileOperator.copy_filec
Cs�tjj|�st�|jtjj|��tjd||�|js�|dkrlt
|d�}ntj
|dd|�}ztj
||�Wd|j�Xn|j|�dS(NuCopying stream %s to %suwbuwuencoding(uosupathuisdiruAssertionErroru
ensure_dirudirnameuloggeruinfoudry_runuNoneuopenucodecsushutilucopyfileobjucloseurecord_as_written(uselfuinstreamuoutfileuencodingu	outstream((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyucopy_streamns	uFileOperator.copy_streamc	Cs[|jtjj|��|jsJt|d��}|j|�WdQXn|j|�dS(Nuwb(u
ensure_diruosupathudirnameudry_runuopenuwriteurecord_as_written(uselfupathudatauf((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuwrite_binary_file}s
	uFileOperator.write_binary_filec
Csd|jtjj|��|jsSt|d��}|j|j|��WdQXn|j|�dS(Nuwb(	u
ensure_diruosupathudirnameudry_runuopenuwriteuencodeurecord_as_written(uselfupathudatauencodinguf((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuwrite_text_file�s
	uFileOperator.write_text_filecCs�tjdkr|xj|D]_}|jr8tjd|�qtj|�j|B|@}tjd||�tj||�qWndS(Nuposixuchanging mode of %suchanging mode of %s to %o(uosunameudry_runuloggeruinfoustatust_modeuchmod(uselfubitsumaskufilesufumode((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuset_mode�s
	uFileOperator.set_modecCs|jdd|�S(Nimi�(uset_mode(usuf((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu<lambda>�suFileOperator.<lambda>cCs�tjj|�}||jkr�tjj|�r�|jj|�tjj|�\}}|j|�tj	d|�|j
s�tj|�n|jr�|j
j|�q�ndS(NuCreating %s(uosupathuabspathuensureduexistsuaddusplitu
ensure_diruloggeruinfoudry_runumkdirurecordudirs_created(uselfupathuduf((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu
ensure_dir�s"
		uFileOperator.ensure_dircCs�t||�}tjd||�|js�|sD|j||�r�|sSd}q�|j|�sht�|t|�d�}nt	j
|||d�n|j|�|S(NuByte-compiling %s to %sT(
ucache_from_sourceuloggeruinfoudry_rununeweruNoneu
startswithuAssertionErrorulenu
py_compileucompileuTrueurecord_as_written(uselfupathuoptimizeuforceuprefixudpathudiagpath((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyubyte_compile�s		
uFileOperator.byte_compilecCstjj|�rtjj|�r�tjj|�r�tjd|�|js`tj	|�n|j
r||jkr�|jj|�q�qqtjj|�r�d}nd}tjd||�|js�tj|�n|j
r||j
kr|j
j|�qqndS(NuRemoving directory tree at %sulinkufileuRemoving %s %s(uosupathuexistsuisdiruislinkuloggerudebugudry_runushutilurmtreeurecordudirs_createduremoveu
files_written(uselfupathus((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuensure_removed�s"%					uFileOperator.ensure_removedcCsjd}x]|setjj|�r:tj|tj�}Pntjj|�}||kr\Pn|}q	W|S(NF(uFalseuosupathuexistsuaccessuW_OKudirname(uselfupathuresultuparent((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuis_writable�s	
uFileOperator.is_writablecCs/|jst�|j|jf}|j�|S(uV
        Commit recorded changes, turn off recording, return
        changes.
        (urecorduAssertionErroru
files_writtenudirs_createdu_init_record(uselfuresult((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyucommit�s
uFileOperator.commitcCs�|js�x9t|j�D](}tjj|�rtj|�qqWt|jdd�}xq|D]f}tj
|�}|r�|dgks�t�tjj||d�}tj
|�ntj
|�qaWn|j�dS(Nureverseu__pycache__iT(udry_runulistu
files_writtenuosupathuexistsuremoveusortedudirs_createduTrueulistdiruAssertionErrorujoinurmdiru_init_record(uselfufudirsuduflistusd((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyurollback�s	
uFileOperator.rollbackNFT(u__name__u
__module__u__qualname__uFalseu__init__u_init_recordurecord_as_writtenuneweruTrueu	copy_fileuNoneucopy_streamuwrite_binary_fileuwrite_text_fileuset_modeuset_executable_modeu
ensure_dirubyte_compileuensure_removeduis_writableucommiturollback(u
__locals__((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuFileOperator:s 
uFileOperatorcCs�|tjkrtj|}nt|�}|dkr@|}nG|jd�}t||jd��}x|D]}t||�}qnW|S(Nu.i(usysumodulesu
__import__uNoneusplitugetattrupop(umodule_nameudotted_pathumoduresultupartsup((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuresolve�s	
uresolvecBsS|EeZdZdd�Zedd��Zdd�Zdd�Zej	Z	d	S(
uExportEntrycCs(||_||_||_||_dS(N(unameuprefixusuffixuflags(uselfunameuprefixusuffixuflags((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__init__s			uExportEntry.__init__cCst|j|j�S(N(uresolveuprefixusuffix(uself((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuvaluesuExportEntry.valuecCs d|j|j|j|jfS(Nu<ExportEntry %s = %s:%s %s>(unameuprefixusuffixuflags(uself((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__repr__
suExportEntry.__repr__cCsdt|t�sd}nH|j|jko]|j|jko]|j|jko]|j|jk}|S(NF(u
isinstanceuExportEntryuFalseunameuprefixusuffixuflags(uselfuotheruresult((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__eq__s	uExportEntry.__eq__N(
u__name__u
__module__u__qualname__u__init__ucached_propertyuvalueu__repr__u__eq__uobjectu__hash__(u
__locals__((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuExportEntry�s

uExportEntryu�(?P<name>(\w|[-.])+)
                      \s*=\s*(?P<callable>(\w+)([:\.]\w+)*)
                      \s*(\[\s*(?P<flags>\w+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])?
                      c
CsGtj|�}|sId}d|ks3d|krCtd|��qCn�|j�}|d}|d}|jd�}|dkr�|d}}n4|dkr�td|��n|jd�\}}|d	}	|	dkrd|ks�d|kr	td|��ng}	nd
d�|	jd�D�}	t||||	�}|S(
Nu[u]uInvalid specification %runameucallableu:iiuflagscSsg|]}|j��qS((ustrip(u.0uf((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu
<listcomp>;s	u$get_export_entry.<locals>.<listcomp>u,(uENTRY_REusearchuNoneuDistlibExceptionu	groupdictucountusplituExportEntry(
u
specificationumuresultudunameupathucolonsuprefixusuffixuflags((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuget_export_entry!s2




	uget_export_entrycCs|d
krd}ntjdkrHdtjkrHtjjd�}ntjjd�}tjj|�r�tj|tj	�}|s�t
jd|�q�nHytj|�d}Wn.tk
r�t
jd|dd�d}YnX|s
tj�}t
jd	|�ntjj||�S(
u�
    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``.
    u.distlibuntuLOCALAPPDATAu
$localappdatau~u(Directory exists but is not writable: %suUnable to create %suexc_infou#Default location unusable, using %sNTF(uNoneuosunameuenvironupathu
expandvarsu
expanduseruisdiruaccessuW_OKuloggeruwarningumakedirsuTrueuOSErroruFalseutempfileumkdtempujoin(usuffixuresultuusable((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuget_cache_base@s&	


uget_cache_basecCs`tjjtjj|��\}}|r?|jdd�}n|jtjd�}||dS(u
    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.
    u:u---u--u.cache(uosupathu
splitdriveuabspathureplaceusep(upathudup((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyupath_to_cache_diris

$upath_to_cache_dircCs|jd�s|dS|S(Nu/(uendswith(us((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuensure_slashzsuensure_slashcCskd}}d|kr^|jdd�\}}d|krC|}q^|jdd�\}}n|||fS(Nu@iu:(uNoneusplit(unetlocuusernameupassworduprefix((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuparse_credentials�s
	uparse_credentialscCs tjd�}tj|�|S(Ni(uosuumask(uresult((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuget_process_umask�s
uget_process_umaskcCsXd}d}x3t|�D]%\}}t|t�sd}PqqW|dk	sTt�|S(NTF(uTrueuNoneu	enumerateu
isinstanceustring_typesuFalseuAssertionError(usequresultuius((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuis_string_sequence�suis_string_sequenceu3([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-([a-z0-9_.+-]+)u
-py(\d\.?\d?)cCsd}d}tj|�}|rI|jd�}|d|j��}n|r�t|�t|�dkr�tjtj|�d|�}|r�|j	�}|d|�||dd�|f}q�n|dkrt
j|�}|r|jd�|jd�|f}qn|S(uw
    Extract name, version, python version from a filename (no extension)

    Return name, version, pyver or None
    iNu\bi(uNoneuPYTHON_VERSIONusearchugroupustartulenureumatchuescapeuenduPROJECT_NAME_AND_VERSION(ufilenameuproject_nameuresultupyverumun((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyusplit_filename�s "-'usplit_filenameu-(?P<name>[\w .-]+)\s*\(\s*(?P<ver>[^\s)]+)\)$cCsRtj|�}|s(td|��n|j�}|dj�j�|dfS(u�
    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.
    u$Ill-formed name/version string: '%s'unameuver(uNAME_VERSION_REumatchuDistlibExceptionu	groupdictustripulower(upumud((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuparse_name_and_version�s
	uparse_name_and_versioncCst�}t|pg�}t|p'g�}d|krS|jd�||O}nx�|D]�}|dkr||j|�qZ|jd�r�|dd�}||kr�tjd|�n||kr|j|�qqZ||kr�tjd|�n|j|�qZW|S(Nu*u-iuundeclared extra: %s(useturemoveuaddu
startswithuloggeruwarning(u	requestedu	availableuresulturuunwanted((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu
get_extras�s&	


u
get_extrascCs�i}yet|�}|j�}|jd�dkrFtjd�n$tjd�|�}tj|�}Wn8t	k
r�}ztj
d||�WYdd}~XnX|S(NuContent-Typeuapplication/jsonu$Unexpected response for JSON requestuutf-8u&Failed to get external data for %s: %s(uurlopenuinfougetuloggerudebugucodecsu	getreaderujsonuloadu	Exceptionu	exception(uurluresulturespuheadersureaderue((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu_get_external_data�s&u_get_external_datacCs*d|dj�|f}t|�}|S(Nu9https://www.red-dove.com/pypi/projects/%s/%s/project.jsoni(uupperu_get_external_data(unameuurluresult((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuget_project_data�suget_project_datacCs'd|dj�||f}t|�S(Nu<https://www.red-dove.com/pypi/projects/%s/%s/package-%s.jsoni(uupperu_get_external_data(unameuversionuurl((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuget_package_data�suget_package_datacBs>|EeZdZdZdd�Zdd�Zdd�ZdS(	uCacheu�
    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.
    cCsvtjj|�s"tj|�ntj|�jd@dkrQtjd|�ntjjtjj	|��|_
dS(uu
        Initialise an instance.

        :param base: The base directory where the cache should be located.
        i?iuDirectory '%s' is not privateN(uosupathuisdirumakedirsustatust_modeuloggeruwarninguabspathunormpathubase(uselfubase((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__init__	s
uCache.__init__cCs
t|�S(uN
        Converts a resource prefix to a directory name in the cache.
        (upath_to_cache_dir(uselfuprefix((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu
prefix_to_dirsuCache.prefix_to_dircCs�g}x�tj|j�D]�}tjj|j|�}yZtjj|�s^tjj|�rntj|�n"tjj|�r�t	j
|�nWqtk
r�|j|�YqXqW|S(u"
        Clear the cache.
        (
uosulistdirubaseupathujoinuislinkuisfileuremoveuisdirushutilurmtreeu	Exceptionuappend(uselfunot_removedufn((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuclears$
uCache.clearN(u__name__u
__module__u__qualname__u__doc__u__init__u
prefix_to_diruclear(u
__locals__((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuCachesuCachecBsY|EeZdZdZdd�Zd
dd�Zdd�Zdd	�Zd
d�Z	dS(u
EventMixinu1
    A very simple publish/subscribe system.
    cCs
i|_dS(N(u_subscribers(uself((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__init__2suEventMixin.__init__cCs\|j}||kr+t|g�||<n-||}|rK|j|�n
|j|�dS(u`
        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(u_subscribersudequeuappendu
appendleft(uselfueventu
subscriberuappendusubsusq((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuadd5s
	
uEventMixin.addcCs=|j}||kr(td|��n||j|�dS(u�
        Remove a subscriber for an event.

        :param event: The name of an event.
        :param subscriber: The subscriber to be removed.
        uNo subscribers: %rN(u_subscribersu
ValueErroruremove(uselfueventu
subscriberusubs((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuremoveIs	uEventMixin.removecCst|jj|f��S(u�
        Return an iterator for the subscribers for an event.
        :param event: The event to return subscribers for.
        (uiteru_subscribersuget(uselfuevent((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuget_subscribersUsuEventMixin.get_subscriberscOs�g}xb|j|�D]Q}y||||�}Wn%tk
rYtjd�d}YnX|j|�qWtjd||||�|S(u^
        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.
        u"Exception during event publicationu/publish %s: args = %s, kwargs = %s, result = %sN(uget_subscribersu	Exceptionuloggeru	exceptionuNoneuappendudebug(uselfueventuargsukwargsuresultu
subscriberuvalue((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyupublish\s

	uEventMixin.publishNT(
u__name__u
__module__u__qualname__u__doc__u__init__uTrueuadduremoveuget_subscribersupublish(u
__locals__((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu
EventMixin.su
EventMixincBs�|EeZdZdd�Zdd�Zddd�Zdd�Zd	d
�Zdd�Z	d
d�Z
edd��Zedd��Z
dS(u	SequencercCs"i|_i|_t�|_dS(N(u_predsu_succsusetu_nodes(uself((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__init__ws		uSequencer.__init__cCs|jj|�dS(N(u_nodesuadd(uselfunode((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuadd_node|suSequencer.add_nodecCs
||jkr"|jj|�n|r	x3t|jj|f��D]}|j||�qDWx3t|jj|f��D]}|j||�qzWx6t|jj��D]\}}|s�|j|=q�q�Wx9t|jj��D]\}}|s�|j|=q�q�WndS(N(u_nodesuremoveusetu_predsugetu_succsulistuitems(uselfunodeuedgesupusukuv((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuremove_nodes""""uSequencer.remove_nodecCsT||kst�|jj|t��j|�|jj|t��j|�dS(N(uAssertionErroru_predsu
setdefaultusetuaddu_succs(uselfupredusucc((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuadd�su
Sequencer.addcCs�||kst�y|j|}|j|}Wn"tk
rTtd|��YnXy|j|�|j|�Wn(tk
r�td||f��YnXdS(Nu%r not a successor of anythingu%r not a successor of %r(uAssertionErroru_predsu_succsuKeyErroru
ValueErroruremove(uselfupredusuccupredsusuccs((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuremove�s



uSequencer.removecCs+||jkp*||jkp*||jkS(N(u_predsu_succsu_nodes(uselfustep((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuis_step�suSequencer.is_stepcCs�|j|�s"td|��ng}g}t�}|j|�x�|r�|jd�}||kr�||kr�|j|�|j|�q�qG|j|�|j|�|jj|f�}|j	|�qGWt
|�S(NuUnknown: %ri(uis_stepu
ValueErrorusetuappendupopuremoveuaddu_predsugetuextendureversed(uselfufinaluresultutodouseenustepupreds((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu	get_steps�s"	
	


uSequencer.get_stepscs|dg�g�i�i�g�|j��������fdd��x'�D]}|�krU�|�qUqUW�S(Nic
s8�d�|<�d�|<�dd7<�j|�y�|}Wntk
r_g}YnXxl|D]d}|�kr��|�t�|�|��|<qg|�krgt�|�|��|<qgqgW�|�|kr4g}x,�j�}|j|�||kr�Pq�q�t|�}�j|�ndS(Nii(uappendu	Exceptionuminupoputuple(unodeu
successorsu	successoruconnected_componentu	component(ugraphuindexu
index_counterulowlinksuresultustacku
strongconnect(u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu
strongconnect�s.



"
u3Sequencer.strong_connections.<locals>.strongconnect(u_succs(uselfunode((ugraphuindexu
index_counterulowlinksuresultustacku
strongconnectu1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyustrong_connections�s		$"
uSequencer.strong_connectionscCs�dg}xF|jD];}|j|}x%|D]}|jd||f�q-WqWx"|jD]}|jd|�q\W|jd�dj|�S(Nudigraph G {u  %s -> %s;u  %s;u}u
(u_predsuappendu_nodesujoin(uselfuresultusuccupredsupredunode((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyudot�s	


u
Sequencer.dotNF(u__name__u
__module__u__qualname__u__init__uadd_nodeuFalseuremove_nodeuadduremoveuis_stepu	get_stepsupropertyustrong_connectionsudot(u
__locals__((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu	Sequencervs
3u	Sequenceru.tar.gzu.tar.bz2u.taru.zipu.tgzu.tbzu.whlc
s���fdd�}tjj���t���d}|dkr�|jd�r]d}q�|jd�r{d}d	}q�|jd�r�d}d
}q�|jd�r�d}d}q�td|��nz|dkrt|d�}|r]|j�}x|D]}||�qWq]nBt	j
||�}|r]|j�}x|D]}||�qFWn|dkr�tj
ddkr�xA|j�D]0}	t|	jt�s�|	jjd�|	_q�q�Wn|j��Wd|r�|j�nXdS(Ncs|t|t�s!|jd�}ntjjtjj�|��}|j��se|�tjkrxt	d|��ndS(Nuutf-8upath outside destination: %r(
u
isinstanceu	text_typeudecodeuosupathuabspathujoinu
startswithusepu
ValueError(upathup(udest_diruplen(u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu
check_paths
!#uunarchive.<locals>.check_pathu.zipu.whluzipu.tar.gzu.tgzutgzur:gzu.tar.bz2u.tbzutbzur:bz2u.tarutaruruUnknown format for %riiuutf-8(u.zipu.whl(u.tar.gzu.tgz(u.tar.bz2u.tbz(uosupathuabspathulenuNoneuendswithu
ValueErroruZipFileunamelistutarfileuopenugetnamesusysuversion_infou
getmembersu
isinstanceunameu	text_typeudecodeu
extractalluclose(
uarchive_filenameudest_diruformatuchecku
check_pathuarchiveumodeunamesunameutarinfo((udest_diruplenu1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu	unarchivesH				

u	unarchivecCs�tj�}t|�}t|d���}x{tj|�D]j\}}}xX|D]P}tjj||�}||d�}	tjj|	|�}
|j||
�qPWq:WWdQX|S(u*zip a directory tree into a BytesIO objectuwN(	uiouBytesIOulenuZipFileuosuwalkupathujoinuwrite(u	directoryuresultudlenuzfurootudirsufilesunameufullureludest((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuzip_dir:s
uzip_diruuKuMuGuTuPcBs�|EeZdZdZdddd�Zdd�Zdd	�Zd
d�Zdd
�Ze	dd��Z
e	dd��Zdd�Ze	dd��Z
e	dd��ZdS(uProgressuUNKNOWNiidcCsV|dks||kst�||_|_||_d|_d|_d|_dS(NiF(	uNoneuAssertionErroruminucurumaxustarteduelapseduFalseudone(uselfuminvalumaxval((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__init__Qs			uProgress.__init__cCs}|j|kst�|jdks9||jks9t�||_tj�}|jdkri||_n||j|_dS(N(uminuAssertionErrorumaxuNoneucurutimeustarteduelapsed(uselfucurvalunow((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuupdateYs$	uProgress.updatecCs*|dkst�|j|j|�dS(Ni(uAssertionErroruupdateucur(uselfuincr((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu	incrementcsuProgress.incrementcCs|j|j�|S(N(uupdateumin(uself((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyustartgsuProgress.startcCs/|jdk	r"|j|j�nd|_dS(NT(umaxuNoneuupdateuTrueudone(uself((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyustopksu
Progress.stopcCs|jdkr|jS|jS(N(umaxuNoneuunknown(uself((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyumaximumpsuProgress.maximumcCsZ|jrd}nD|jdkr*d}n,d|j|j|j|j}d|}|S(Nu100 %u ?? %gY@u%3d %%(udoneumaxuNoneucurumin(uselfuresultuv((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu
percentagets			"
uProgress.percentagecCsU|dkr|jdks-|j|jkr6d}ntjdtj|��}|S(Niu??:??:??u%H:%M:%S(umaxuNoneucuruminutimeustrftimeugmtime(uselfudurationuresult((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuformat_durations-	uProgress.format_durationcCs�|jrd}|j}n�d}|jdkr9d}ne|jdksZ|j|jkrcd}n;t|j|j�}||j|j}|d|j}d||j|�fS(NuDoneuETA iiu%s: %si����(udoneuelapsedumaxuNoneucuruminufloatuformat_duration(uselfuprefixut((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuETA�s		!	uProgress.ETAcCsh|jdkrd}n|j|j|j}x(tD] }|dkrLPn|d}q6Wd||fS(Nigi�g@�@u%d %sB/s(uelapseducuruminuUNITS(uselfuresultuunit((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuspeed�s	
uProgress.speedN(u__name__u
__module__u__qualname__uunknownu__init__uupdateu	incrementustartustopupropertyumaximumu
percentageuformat_durationuETAuspeed(u
__locals__((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuProgressNs
	uProgressu\{([^}]*)\}u[^/\\,{]\*\*|\*\*[^/\\,}]u^[^{]*\}|\{[^}]*$cCsZtj|�r(d}t||��ntj|�rPd}t||��nt|�S(uAExtended globbing function that supports ** and {opt1,opt2,opt3}.u7invalid glob %r: recursive glob "**" must be used aloneu2invalid glob %r: mismatching set marker '{' or '}'(u_CHECK_RECURSIVE_GLOBusearchu
ValueErroru_CHECK_MISMATCH_SETu_iglob(u	path_globumsg((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuiglob�suiglobccs�tj|d�}t|�dkr�t|�dksBt|��|\}}}x3|jd�D]4}x+tdj|||f��D]}|Vq�WqaWn�d|kr�x�t|�D]}|Vq�Wn�|jdd�\}}|dkr�d}n|dkr	d}n|jd�}|jd	�}x]tj	|�D]L\}}}	tj
j|�}x(ttj
j||��D]}
|
VqtWq7WdS(
Niiu,uu**u.u*u/u\(u	RICH_GLOBusplitulenuAssertionErroru_iglobujoinu	std_iglobulstripuosuwalkupathunormpath(u	path_globurich_path_globuprefixusetusuffixuitemupathuradicaludirufilesufn((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu_iglob�s*%		"u_iglobcBs,|EeZdZdZdZdd�ZdS(uHTTPSConnectioncCs�tj|j|jf|j�}t|dd
�rI||_|j�nt	t
d�s�|jrmt
j}n	t
j
}t
j||j|jd|dt
jd|j�|_n�t
jt
j�}|jt
jO_|jr�|j|j|j�ni}|jrHt
j|_|jd|j�tt
dd
�rH|j|d<qHn|j||�|_|jr�|jr�y0t|jj�|j�tjd	|j�Wq�tk
r�|jjtj�|jj ��Yq�XndS(Nu_tunnel_hostu
SSLContextu	cert_reqsussl_versionuca_certsucafileuHAS_SNIuserver_hostnameuHost verified: %sF(!usocketucreate_connectionuhostuportutimeoutugetattruFalseusocku_tunneluhasattrussluca_certsu
CERT_REQUIREDu	CERT_NONEuwrap_socketukey_fileu	cert_fileuPROTOCOL_SSLv23u
SSLContextuoptionsuOP_NO_SSLv2uload_cert_chainuverify_modeuload_verify_locationsucheck_domainumatch_hostnameugetpeercertuloggerudebuguCertificateErrorushutdownu	SHUT_RDWRuclose(uselfusocku	cert_reqsucontextukwargs((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuconnect�s>!	
					

uHTTPSConnection.connectNT(u__name__u
__module__u__qualname__uNoneuca_certsuTrueucheck_domainuconnect(u
__locals__((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuHTTPSConnection�suHTTPSConnectioncBs;|EeZdZddd�Zdd�Zdd�ZdS(	uHTTPSHandlercCs#tj|�||_||_dS(N(uBaseHTTPSHandleru__init__uca_certsucheck_domain(uselfuca_certsucheck_domain((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__init__s
	uHTTPSHandler.__init__cOs7t||�}|jr3|j|_|j|_n|S(u�
        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.
        (uHTTPSConnectionuca_certsucheck_domain(uselfuargsukwargsuresult((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu_conn_makers

	uHTTPSHandler._conn_makercCsqy|j|j|�SWnStk
rl}z3dt|j�krWtd|j��n�WYdd}~XnXdS(Nucertificate verify failedu*Unable to verify server certificate for %s(udo_openu_conn_makeruURLErrorustrureasonuCertificateErroruhost(uselfureque((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu
https_opensuHTTPSHandler.https_openNT(u__name__u
__module__u__qualname__uTrueu__init__u_conn_makeru
https_open(u
__locals__((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuHTTPSHandlersuHTTPSHandlercBs |EeZdZdd�ZdS(uHTTPSOnlyHandlercCstd|��dS(NuAUnexpected HTTP request on what should be a secure connection: %s(uURLError(uselfureq((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu	http_open0suHTTPSOnlyHandler.http_openN(u__name__u
__module__u__qualname__u	http_open(u
__locals__((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuHTTPSOnlyHandler/suHTTPSOnlyHandleriicBs&|EeZdZdddd�ZdS(uHTTPucKs5|dkrd}n|j|j|||��dS(Ni(uNoneu_setupu_connection_class(uselfuhostuportukwargs((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__init__<s	u
HTTP.__init__N(u__name__u
__module__u__qualname__uNoneu__init__(u
__locals__((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuHTTP;suHTTPcBs&|EeZdZdddd�ZdS(uHTTPSucKs5|dkrd}n|j|j|||��dS(Ni(uNoneu_setupu_connection_class(uselfuhostuportukwargs((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__init__Cs	uHTTPS.__init__N(u__name__u
__module__u__qualname__uNoneu__init__(u
__locals__((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuHTTPSBsuHTTPScBs/|EeZdZddd�Zdd�ZdS(u	TransporticCs ||_tjj||�dS(N(utimeoutu	xmlrpclibu	Transportu__init__(uselfutimeoutuuse_datetime((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__init__Js	uTransport.__init__cCs�|j|�\}}}tdkr<t|d|j�}nN|jsY||jdkr}||_|tj|�f|_n|jd}|S(Niiutimeoutii(ii(u
get_host_infou	_ver_infouHTTPutimeoutu_connectionu_extra_headersuhttplibuHTTPConnection(uselfuhostuhuehux509uresult((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyumake_connectionNs	
uTransport.make_connectionN(u__name__u
__module__u__qualname__u__init__umake_connection(u
__locals__((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu	TransportIsu	TransportcBs/|EeZdZddd�Zdd�ZdS(u
SafeTransporticCs ||_tjj||�dS(N(utimeoutu	xmlrpclibu
SafeTransportu__init__(uselfutimeoutuuse_datetime((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__init__Zs	uSafeTransport.__init__cCs�|j|�\}}}|s'i}n|j|d<tdkrUt|d|�}nT|jsr||jdkr�||_|tj|d|�f|_n|jd}|S(Nutimeoutiiii(ii(	u
get_host_infoutimeoutu	_ver_infouHTTPSuNoneu_connectionu_extra_headersuhttplibuHTTPSConnection(uselfuhostuhuehukwargsuresult((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyumake_connection^s	
	
uSafeTransport.make_connectionN(u__name__u
__module__u__qualname__u__init__umake_connection(u
__locals__((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu
SafeTransportYsu
SafeTransportcBs |EeZdZdd�ZdS(uServerProxyc	Ks�|jdd�|_}|dk	r�t|�\}}|jdd�}|dkr^t}nt}||d|�|d<}||_ntj	j
|||�dS(Nutimeoutuuse_datetimeiuhttpsu	transport(upopuNoneutimeoutu	splittypeugetu
SafeTransportu	Transportu	transportu	xmlrpclibuServerProxyu__init__(	uselfuuriukwargsutimeoutuschemeu_uuse_datetimeutclsut((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__init__os	uServerProxy.__init__N(u__name__u
__module__u__qualname__u__init__(u
__locals__((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuServerProxynsuServerProxycKs:tjddkr |d7}n
d|d<t|||�S(Niiubuunewline(usysuversion_infouopen(ufnumodeukwargs((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu	_csv_open�s

u	_csv_opencBsY|EeZdZied�d6ed�d6ed�d6Zdd�Zd	d
�ZdS(uCSVBaseu,u	delimiteru"u	quotecharu
ulineterminatorcCs|S(N((uself((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu	__enter__�suCSVBase.__enter__cGs|jj�dS(N(ustreamuclose(uselfuexc_info((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__exit__�suCSVBase.__exit__N(u__name__u
__module__u__qualname__ustrudefaultsu	__enter__u__exit__(u
__locals__((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuCSVBase�s

uCSVBasecBs>|EeZdZdd�Zdd�Zdd�ZeZdS(u	CSVReadercKs�d|krM|d}tjddkrAtjd�|�}n||_nt|dd�|_tj|j|j�|_dS(Nustreamiiuutf-8upathur(	usysuversion_infoucodecsu	getreaderustreamu	_csv_openucsvureaderudefaults(uselfukwargsustream((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__init__�s
uCSVReader.__init__cCs|S(N((uself((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__iter__�suCSVReader.__iter__cCskt|j�}tjddkrgxBt|�D]1\}}t|t�s/|jd�||<q/q/Wn|S(Niiuutf-8(unextureaderusysuversion_infou	enumerateu
isinstanceu	text_typeudecode(uselfuresultuiuitem((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyunext�suCSVReader.nextN(u__name__u
__module__u__qualname__u__init__u__iter__unextu__next__(u
__locals__((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu	CSVReader�su	CSVReadercBs,|EeZdZdd�Zdd�ZdS(u	CSVWritercKs1t|d�|_tj|j|j�|_dS(Nuw(u	_csv_openustreamucsvuwriterudefaults(uselfufnukwargs((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__init__�suCSVWriter.__init__cCsutjddkrag}x<|D]4}t|t�rG|jd�}n|j|�q W|}n|jj|�dS(Niiuutf-8(usysuversion_infou
isinstanceu	text_typeuencodeuappenduwriteruwriterow(uselfurowuruitem((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuwriterow�s
	uCSVWriter.writerowN(u__name__u
__module__u__qualname__u__init__uwriterow(u
__locals__((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu	CSVWriter�su	CSVWritercsf|EeZdZeej�Zded<d�fdd�Zdd�Zdd�Z	d	d
�Z
�S(uConfiguratoruinc_convertuinccs/tt|�j|�|p%tj�|_dS(N(usuperuConfiguratoru__init__uosugetcwdubase(uselfuconfigubase(u	__class__(u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__init__�suConfigurator.__init__c
s��fdd���jd�}t|�sB�j|�}n�jdd�}�jdf�}|r�t�fdd�|D��}n��fdd��D�}t|�}|||�}|rx3|j�D]"\}}	t||�|	��q�Wn|S(	Ncs�t|ttf�r=t|��fdd�|D��}njt|t�r�d|krj�j|�}q�i}x4|D]}�||�||<qwWn�j|�}|S(Ncsg|]}�|��qS(((u.0ui(uconvert(u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu
<listcomp>�s	uBConfigurator.configure_custom.<locals>.convert.<locals>.<listcomp>u()(u
isinstanceulistutupleutypeudictuconfigure_customuconvert(uouresultuk(uconvertuself(u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuconvert�s(
u.Configurator.configure_custom.<locals>.convertu()u.u[]csg|]}�|��qS(((u.0uo(uconvert(u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu
<listcomp>�s	u1Configurator.configure_custom.<locals>.<listcomp>cs2g|](}t|�r|��|�f�qS((uvalid_ident(u.0uk(uconfiguconvert(u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu
<listcomp>�s	(upopucallableuresolveuNoneutupleudictuitemsusetattr(
uselfuconfigucupropsuargsuitemsukwargsuresultunuv((uconfiguconvertuselfu1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuconfigure_custom�s"uConfigurator.configure_customcCsI|j|}t|t�rEd|krE|j|�|j|<}n|S(Nu()(uconfigu
isinstanceudictuconfigure_custom(uselfukeyuresult((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__getitem__�s
uConfigurator.__getitem__c	Csatjj|�s-tjj|j|�}ntj|ddd��}tj|�}WdQX|S(u*Default converter for the inc:// protocol.uruencodinguutf-8N(	uosupathuisabsujoinubaseucodecsuopenujsonuload(uselfuvalueufuresult((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuinc_convert�s
uConfigurator.inc_convertN(u__name__u
__module__u__qualname__udictuBaseConfiguratoruvalue_convertersuNoneu__init__uconfigure_customu__getitem__uinc_convert(u
__locals__((u	__class__u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuConfigurator�s
uConfiguratorcBs>|EeZdZdddd�Zdd�Zdd�ZdS(	uSubprocessMixincCs||_||_dS(N(uverboseuprogress(uselfuverboseuprogress((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu__init__s	uSubprocessMixin.__init__cCs�|j}|j}xt|j�}|s+Pn|dk	rG|||�q|s`tjjd�ntjj|jd��tjj�q|j	�dS(u�
        Read lines from a subprocess' output stream and either pass to a progress
        callable (if specified) or write progress information to sys.stderr.
        u.uutf-8N(
uprogressuverboseureadlineuNoneusysustderruwriteudecodeuflushuclose(uselfustreamucontextuprogressuverboseus((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyureaders		uSubprocessMixin.readercKs�tj|dtjdtj|�}tjd|jd|jdf�}|j�tjd|jd|jdf�}|j�|j	�|j
�|j
�|jdk	r�|jdd�n|j
r�tjjd�n|S(Nustdoutustderrutargetuargsudone.umainudone.
(u
subprocessuPopenuPIPEu	threadinguThreadureaderustdoutustartustderruwaitujoinuprogressuNoneuverboseusysuwrite(uselfucmdukwargsuput1ut2((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyurun_commands$
$



	uSubprocessMixin.run_commandNF(u__name__u
__module__u__qualname__uFalseuNoneu__init__ureaderurun_command(u
__locals__((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyuSubprocessMixin�suSubprocessMixin(u.tar.gzu.tar.bz2u.taru.zipu.tgzu.tbzu.whlT(uuKuMuGuTuP(ii(�ucodecsucollectionsudequeu
contextlibucsvuglobuiglobu	std_iglobuioujsonulogginguosu
py_compileureushutilusocketusslu
subprocessusysutarfileutempfileu	threadinguImportErrorudummy_threadingutimeuuDistlibExceptionucompatustring_typesu	text_typeu	raw_inputuStringIOucache_from_sourceuurlopenuhttplibu	xmlrpclibu	splittypeuHTTPHandleruHTTPSHandleruBaseHTTPSHandleruBaseConfiguratoruvalid_identu	ContaineruconfigparseruURLErrorumatch_hostnameuCertificateErroruZipFileu	getLoggeru__name__uloggeruCOMMAucompileuCOMMA_REuIDENTuEXTRA_IDENTuVERSPECuRELOPuBARE_CONSTRAINTSu
DIRECT_REFuCONSTRAINTSu
EXTRA_LISTuEXTRASuREQUIREMENTuREQUIREMENT_REuRELOP_IDENTuRELOP_IDENT_REuparse_requirementuget_resources_destsuin_venvuget_executableuNoneuproceeduextract_by_keyuread_exportsu
write_exportsucontextmanagerutempdiruchdirusocket_timeoutuobjectucached_propertyuconvert_pathuFileOperatoruresolveuExportEntryuVERBOSEuENTRY_REuget_export_entryuget_cache_baseupath_to_cache_diruensure_slashuparse_credentialsuget_process_umaskuis_string_sequenceuIuPROJECT_NAME_AND_VERSIONuPYTHON_VERSIONusplit_filenameuNAME_VERSION_REuparse_name_and_versionu
get_extrasu_get_external_datauget_project_datauget_package_datauCacheu
EventMixinu	SequenceruARCHIVE_EXTENSIONSuTrueu	unarchiveuzip_diruUNITSuProgressu	RICH_GLOBu_CHECK_RECURSIVE_GLOBu_CHECK_MISMATCH_SETu_iglobuHTTPSConnectionuHTTPSOnlyHandleruversion_infou	_ver_infouHTTPuHTTPSu	Transportu
SafeTransportuServerProxyu	_csv_openuCSVBaseu	CSVReaderu	CSVWriteruConfiguratoruSubprocessMixin(((u1/tmp/pip-zej_zi-build/pip/_vendor/distlib/util.pyu<module>s�
�
.%
		$
	�)
	,H�6]!*)	:site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-33.pyc000064400000032755151733463540021632 0ustar00�
7�Re�4c@s�dZddlZddlZddlZddlZddlmZddlmZddl	m
Z
dgZeje
�Zejdej�Zejd	ejejB�ZGd
d�de�ZdS(uu
Class representing the list of files in a distribution.

Equivalent to distutils.filelist, but fixes some problems.
iNi(uDistlibException(ufsdecode(uconvert_pathuManifestu\\w*
u#.*?(?=
)|
(?=$)cBs�|EeZdZdZddd�Zdd�Zdd�Zdd	�Zdd
d�Z
dd
�Zdd�Zdd�Z
ddddd�Zddddd�Zddddd�Zdd�ZdS(uManifestu~A list of files built by on exploring the filesystem and filtered by
    applying various patterns to what we find there.
    cCsYtjjtjj|p!tj���|_|jtj|_d|_	t
�|_dS(ud
        Initialise an instance.

        :param base: The base directory to explore under.
        N(uosupathuabspathunormpathugetcwdubaseusepuprefixuNoneuallfilesusetufiles(uselfubase((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/manifest.pyu__init__#s-	uManifest.__init__cCs�ddlm}m}m}g|_}|j}|g}|j}|j}x�|r�|�}tj	|�}	x�|	D]{}
tj
j||
�}tj|�}|j}
||
�r�|jt
|��qu||
�ru||
�ru||�ququWqPWdS(umFind all files under the base and set ``allfiles`` to the absolute
        pathnames of files found.
        i(uS_ISREGuS_ISDIRuS_ISLNKN(ustatuS_ISREGuS_ISDIRuS_ISLNKuallfilesubaseupopuappenduosulistdirupathujoinust_modeufsdecode(uselfuS_ISREGuS_ISDIRuS_ISLNKuallfilesurootustackupopupushunamesunameufullnameustatumode((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/manifest.pyufindall2s"
						
	uManifest.findallcCsM|j|j�s-tjj|j|�}n|jjtjj|��dS(uz
        Add a file to the manifest.

        :param item: The pathname to add. This can be relative to the base.
        N(	u
startswithuprefixuosupathujoinubaseufilesuaddunormpath(uselfuitem((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/manifest.pyuaddMsuManifest.addcCs"x|D]}|j|�qWdS(u�
        Add a list of files to the manifest.

        :param items: The pathnames to add. These can be relative to the base.
        N(uadd(uselfuitemsuitem((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/manifest.pyuadd_manyWs
uManifest.add_manycs���fdd��t�j�}|rjt�}x'|D]}�|tjj|��q:W||O}ndd�tdd�|D��D�S(u8
        Return sorted files in directory order
        csj|j|�tjd|�|�jkrftjj|�\}}|dksVt��||�ndS(Nuadd_dir added %suu/(uu/(uadduloggerudebugubaseuosupathusplituAssertionError(udirsuduparentu_(uadd_diruself(u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/manifest.pyuadd_dires
u Manifest.sorted.<locals>.add_dircSs"g|]}tjj|��qS((uosupathujoin(u.0u
path_tuple((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/manifest.pyu
<listcomp>ss	u#Manifest.sorted.<locals>.<listcomp>css!|]}tjj|�VqdS(N(uosupathusplit(u.0upath((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/manifest.pyu	<genexpr>tsu"Manifest.sorted.<locals>.<genexpr>(usetufilesuosupathudirnameusorted(uselfuwantdirsuresultudirsuf((uadd_diruselfu5/tmp/pip-zej_zi-build/pip/_vendor/distlib/manifest.pyusorted`s	

	uManifest.sortedcCst�|_g|_dS(uClear all collected files.N(usetufilesuallfiles(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/manifest.pyuclearvsuManifest.clearcCsS|j|�\}}}}|dkrcx%|D].}|j|dd�s.tjd|�q.q.Wn�|dkr�x�|D].}|j|dd�svtjd|�qvqvWn�|dkr�x�|D].}|j|dd�s�tjd|�q�q�Wn\|dkr;xM|D].}|j|dd�stjd	|�qqWn|d
kr�x|D]1}|j|d|�sNtjd||�qNqNWn�|d
kr�x�|D]1}|j|d|�s�tjd||�q�q�Wn~|dkr|jdd|�sOtjd|�qOnG|dkr?|jdd|�sOtjd|�qOntd|��dS(uv
        Process a directive which either adds some files from ``allfiles`` to
        ``files``, or removes some files from ``files``.

        :param directive: The directive to process. This should be in a format
                     compatible with distutils ``MANIFEST.in`` files:

                     http://docs.python.org/distutils/sourcedist.html#commands
        uincludeuanchoruno files found matching %ruexcludeu.no previously-included files found matching %ruglobal-includeu3no files found matching %r anywhere in distributionuglobal-excludeuGno previously-included files matching %r found anywhere in distributionurecursive-includeuprefixu-no files found matching %r under directory %rurecursive-excludeuAno previously-included files matching %r found under directory %rugraftu no directories found matching %rupruneu4no previously-included directories found matching %ruinvalid action %rNTF(	u_parse_directiveu_include_patternuTrueuloggeruwarningu_exclude_patternuFalseuNoneuDistlibException(uselfu	directiveuactionupatternsuthediru
dirpatternupattern((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/manifest.pyuprocess_directive{sP

	
	
	
	
		
	
uManifest.process_directivec
Cso|j�}t|�dkrA|ddkrA|jdd�n|d}d}}}|dkr�t|�dkr�td|��nd
d�|dd�D�}n�|dkrt|�dkr�td|��nt|d�}dd�|dd�D�}nT|dkrOt|�dkr<td|��nt|d�}ntd|��||||fS(u�
        Validate a directive.
        :param directive: The directive to validate.
        :return: A tuple of action, patterns, thedir, dir_patterns
        iiuincludeuexcludeuglobal-includeuglobal-excludeurecursive-includeurecursive-excludeugraftupruneiu$%r expects <pattern1> <pattern2> ...cSsg|]}t|��qS((uconvert_path(u.0uword((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/manifest.pyu
<listcomp>�s	u-Manifest._parse_directive.<locals>.<listcomp>Niu*%r expects <dir> <pattern1> <pattern2> ...cSsg|]}t|��qS((uconvert_path(u.0uword((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/manifest.pyu
<listcomp>�s	u!%r expects a single <dir_pattern>uunknown action %r(uincludeuexcludeuglobal-includeuglobal-excludeurecursive-includeurecursive-excludeugraftuprune(uincludeuexcludeuglobal-includeuglobal-exclude(urecursive-includeurecursive-exclude(ugraftuprune(usplitulenuinsertuNoneuDistlibExceptionuconvert_path(uselfu	directiveuwordsuactionupatternsuthedirudir_pattern((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/manifest.pyu_parse_directive�s:	
	  uManifest._parse_directivecCszd}|j||||�}|jdkr:|j�nx9|jD].}|j|�rD|jj|�d}qDqDW|S(u�Select strings (presumably filenames) from 'self.files' that
        match 'pattern', a Unix-style wildcard (glob) pattern.

        Patterns are not quite the same as implemented by the 'fnmatch'
        module: '*' and '?'  match non-special characters, where "special"
        is platform-dependent: slash on Unix; colon, slash, and backslash on
        DOS/Windows; and colon on Mac OS.

        If 'anchor' is true (the default), then the pattern match is more
        stringent: "*.py" will match "foo.py" but not "foo/bar.py".  If
        'anchor' is false, both of these will match.

        If 'prefix' is supplied, then only filenames starting with 'prefix'
        (itself a pattern) and ending with 'pattern', with anything in between
        them, will match.  'anchor' is ignored in this case.

        If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and
        'pattern' is assumed to be either a string containing a regex or a
        regex object -- no translation is done, the regex is just compiled
        and used as-is.

        Selected strings will be added to self.files.

        Return True if files are found.
        FNT(	uFalseu_translate_patternuallfilesuNoneufindallusearchufilesuadduTrue(uselfupatternuanchoruprefixuis_regexufoundu
pattern_reuname((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/manifest.pyu_include_pattern�s

uManifest._include_patterncCsdd}|j||||�}x?t|j�D].}|j|�r.|jj|�d}q.q.W|S(utRemove strings (presumably filenames) from 'files' that match
        'pattern'.

        Other parameters are the same as for 'include_pattern()', above.
        The list 'self.files' is modified in place. Return True if files are
        found.

        This API is public to allow e.g. exclusion of SCM subdirs, e.g. when
        packaging source distributions
        FT(uFalseu_translate_patternulistufilesusearchuremoveuTrue(uselfupatternuanchoruprefixuis_regexufoundu
pattern_reuf((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/manifest.pyu_exclude_patterns
uManifest._exclude_patternc
Cs|r)t|t�r"tj|�S|Sn|rA|j|�}nd}tjtjj|j	d��}|dk	r�|jd�}|j|�dt|��}tj}	tjdkr�d}	nd||	j|d|f�}n|r�d||}ntj|�S(uTranslate a shell-like wildcard pattern to a compiled regular
        expression.

        Return the compiled regex.  If 'is_regex' true,
        then 'pattern' is directly compiled to a regex (if it's a string)
        or just returned as-is (assumes it's a regex object).
        uNu\u\\u^u.*(
u
isinstanceustrureucompileu_glob_to_reuescapeuosupathujoinubaseuNoneulenusep(
uselfupatternuanchoruprefixuis_regexu
pattern_reubaseu
empty_patternu	prefix_reusep((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/manifest.pyu_translate_pattern3s&	
! 		uManifest._translate_patterncCsStj|�}tj}tjdkr0d}nd|}tjd||�}|S(u�Translate a shell-like glob pattern to a regular expression.

        Return a string containing the regex.  Differs from
        'fnmatch.translate()' in that '*' does not match "special characters"
        (which are platform-specific).
        u\u\\\\u\1[^%s]u((?<!\\)(\\\\)*)\.(ufnmatchu	translateuosusepureusub(uselfupatternu
pattern_reusepuescaped((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/manifest.pyu_glob_to_reWs		
uManifest._glob_to_reNFT(u__name__u
__module__u__qualname__u__doc__uNoneu__init__ufindalluadduadd_manyuFalseusorteduclearuprocess_directiveu_parse_directiveuTrueu_include_patternu_exclude_patternu_translate_patternu_glob_to_re(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/manifest.pyuManifests 
	L/(#(u__doc__ufnmatchulogginguosureuuDistlibExceptionucompatufsdecodeuutiluconvert_pathu__all__u	getLoggeru__name__uloggerucompileuMu_COLLAPSE_PATTERNuSu_COMMENTED_LINEuobjectuManifest(((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/manifest.pyu<module>
s	site-packages/pip/_vendor/distlib/__pycache__/version.cpython-33.pyc000064400000101547151733463540021505 0ustar00�
7�Re�Yc@s�dZddlZddlZddlmZddddd	d
ddgZeje�ZGd
d�de	�Z
Gdd�de�ZGdd�de�Z
ejd�Zdd�ZeZGdd�de�Zdd�ZGdd�de
�Zejd�dfejd�dfejd�dfejd�dfejd �d!fejd"�d!fejd#�d$fejd%�d&fejd'�d(fejd)�d*ff
Zejd+�dfejd,�dfejd-�d$fejd#�d$fejd.�dffZejd/�Zd0d1�Zd2d3�Zejd4ej�Zid5d66d5d76d8d96d5d:6d;d<6dd6dd$6Zd=d>�ZGd?d�de�ZGd@d�de
�Z ejdAej�Z!dBdC�Z"dDdE�Z#GdFd	�d	e�Z$GdGd
�d
e
�Z%GdHdI�dIe�Z&ie&eee�dJ6e&ee dKdL��dM6e&e#e%e�dN6Z'e'dJe'dO<dPd�Z(dS(Qu~
Implementation of a flexible versioning scheme providing support for PEP-386,
distribute-compatible and semantic versioning.
iNi(ustring_typesuNormalizedVersionuNormalizedMatcheru
LegacyVersionu
LegacyMatcheruSemanticVersionuSemanticMatcheruUnsupportedVersionErroru
get_schemecBs|EeZdZdZdS(uUnsupportedVersionErroruThis is an unsupported version.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyuUnsupportedVersionErrorscBs�|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zedd��ZdS(uVersioncCsZ|j�|_}|j|�|_}t|t�s>t�t|�dksVt�dS(Ni(ustripu_stringuparseu_partsu
isinstanceutupleuAssertionErrorulen(uselfusuparts((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu__init__suVersion.__init__cCstd��dS(Nuplease implement in a subclass(uNotImplementedError(uselfus((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyuparse$su
Version.parsecCs5t|�t|�kr1td||f��ndS(Nucannot compare %r and %r(utypeu	TypeError(uselfuother((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu_check_compatible'suVersion._check_compatiblecCs|j|�|j|jkS(N(u_check_compatibleu_parts(uselfuother((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu__eq__+s
uVersion.__eq__cCs|j|�S(N(u__eq__(uselfuother((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu__ne__/suVersion.__ne__cCs|j|�|j|jkS(N(u_check_compatibleu_parts(uselfuother((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu__lt__2s
uVersion.__lt__cCs|j|�p|j|�S(N(u__lt__u__eq__(uselfuother((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu__gt__6suVersion.__gt__cCs|j|�p|j|�S(N(u__lt__u__eq__(uselfuother((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu__le__9suVersion.__le__cCs|j|�p|j|�S(N(u__gt__u__eq__(uselfuother((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu__ge__<suVersion.__ge__cCs
t|j�S(N(uhashu_parts(uself((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu__hash__@suVersion.__hash__cCsd|jj|jfS(Nu%s('%s')(u	__class__u__name__u_string(uself((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu__repr__CsuVersion.__repr__cCs|jS(N(u_string(uself((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu__str__FsuVersion.__str__cCstd��dS(NuPlease implement in subclasses.(uNotImplementedError(uself((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
is_prereleaseIsuVersion.is_prereleaseN(u__name__u
__module__u__qualname__u__init__uparseu_check_compatibleu__eq__u__ne__u__lt__u__gt__u__le__u__ge__u__hash__u__repr__u__str__upropertyu
is_prerelease(u
__locals__((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyuVersionsuVersioncBs|EeZdZd%Zejd�Zejd�Zejd�Z	idd�d6dd�d6d	d�d
6dd�d6d
d�d6dd�d6dd�d6Z
dd�Zdd�Ze
dd��Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%S(&uMatcheru^(\w[\s\w'.-]*)(\((.*)\))?u#^(<=|>=|<|>|!=|==|~=)?\s*([^\s,]+)$u
^\d+(\.\d+)*$cCs
||kS(N((uvucup((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu<lambda>WsuMatcher.<lambda>u<cCs
||kS(N((uvucup((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu<lambda>Xsu>cCs||kp||kS(N((uvucup((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu<lambda>Ysu<=cCs||kp||kS(N((uvucup((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu<lambda>Zsu>=cCs
||kS(N((uvucup((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu<lambda>[su==cCs||kp||kS(N((uvucup((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu<lambda>]su~=cCs
||kS(N((uvucup((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu<lambda>^su!=c
Cs�|jdkrtd��n|j�|_}|jj|�}|s\td|��n|jd�}|dj�|_|jj	�|_
g}|dr�dd�|djd�D�}x�|D]�}|jj|�}|s�td	||f��n|j�}|dpd
}|d}|j
d�r�|dkrRtd|��n|dd�d}}	|jj|�s�|j|�q�n|j|�d}}	|j|||	f�q�Wnt|�|_dS(NuPlease specify a version classu
Not valid: %ruiicSsg|]}|j��qS((ustrip(u.0uc((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
<listcomp>ms	u$Matcher.__init__.<locals>.<listcomp>u,uInvalid %r in %ru~=iu.*u==u!=u#'.*' not allowed for %r constraints(u==u!=i����TF(u
version_classuNoneu
ValueErrorustripu_stringudist_reumatchugroupsunameulowerukeyusplitucomp_reuendswithuTrueunum_reuFalseuappendutupleu_parts(
uselfusumugroupsuclistuconstraintsucuopuvnuprefix((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu__init__as:
 


uMatcher.__init__cCs�t|t�r!|j|�}nx�|jD]�\}}}|jj|�}t|t�rmt||�}n|s�d||jjf}t	|��n||||�s+dSq+WdS(u�
        Check if the provided version matches the constraints.

        :param version: The version to match against this instance.
        :type version: Strring or :class:`Version` instance.
        u%r not implemented for %sFT(u
isinstanceustring_typesu
version_classu_partsu
_operatorsugetugetattru	__class__u__name__uNotImplementedErroruFalseuTrue(uselfuversionuoperatoru
constraintuprefixufumsg((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyumatch�su
Matcher.matchcCsJd}t|j�dkrF|jdddkrF|jdd}n|S(Niiu==(uNoneulenu_parts(uselfuresult((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
exact_version�s,uMatcher.exact_versioncCsGt|�t|�ks*|j|jkrCtd||f��ndS(Nucannot compare %s and %s(utypeunameu	TypeError(uselfuother((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu_check_compatible�s*uMatcher._check_compatiblecCs/|j|�|j|jko.|j|jkS(N(u_check_compatibleukeyu_parts(uselfuother((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu__eq__�s
uMatcher.__eq__cCs|j|�S(N(u__eq__(uselfuother((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu__ne__�suMatcher.__ne__cCst|j�t|j�S(N(uhashukeyu_parts(uself((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu__hash__�suMatcher.__hash__cCsd|jj|jfS(Nu%s(%r)(u	__class__u__name__u_string(uself((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu__repr__�suMatcher.__repr__cCs|jS(N(u_string(uself((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu__str__�suMatcher.__str__N(u__name__u
__module__u__qualname__uNoneu
version_classureucompileudist_reucomp_reunum_reu
_operatorsu__init__umatchupropertyu
exact_versionu_check_compatibleu__eq__u__ne__u__hash__u__repr__u__str__(u
__locals__((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyuMatcherNs*





%uMatcheruQ^(\d+(\.\d+)*)((a|b|c|rc)(\d+))?(\.(post)(\d+))?(\.(dev)(\d+))?(-(\d+(\.\d+)?))?$cCs�|j�}tj|�}|s4td|��n|j�}tdd�|djd�D��}x6t|�dkr�|ddkr�|dd�}qiW|dd�}|d	d
�}|dd�}|d
}|dkr�f}n|dt	|d�f}|dkrf}n|dt	|d�f}|dkrLf}n|dt	|d�f}|dkr{f}n"tdd�|jd�D��}|s�|r�|r�d}q�d}n|s�d}n|s�d}n|||||fS(NuNot a valid version: %scss|]}t|�VqdS(N(uint(u.0uv((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu	<genexpr>�su_pep426_key.<locals>.<genexpr>iu.iiiiii	iicSsg|]}t|��qS((uint(u.0us((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
<listcomp>�s	u_pep426_key.<locals>.<listcomp>uauzu_ufinali����i����(NN(NN(NNi����(uai����(uz(u_(ufinal(
ustripuPEP426_VERSION_REumatchuUnsupportedVersionErrorugroupsutupleusplitulenuNoneuint(usumugroupsunumsupreupostudevulocal((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu_pep426_key�sB&%
				"
				u_pep426_keycBsS|EeZdZdZdd�Zedddddg�Zed	d
��ZdS(uNormalizedVersionuIA rational version.

    Good:
        1.2         # equivalent to "1.2.0"
        1.2.0
        1.2a1
        1.2.3a2
        1.2.3b1
        1.2.3c1
        1.2.3.4
        TODO: fill this out

    Bad:
        1           # mininum two numbers
        1.2a        # release level must have a release serial
        1.2.3b
    cCsTt|�}tj|�}|j�}tdd�|djd�D��|_|S(Ncss|]}t|�VqdS(N(uint(u.0uv((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu	<genexpr>	su*NormalizedVersion.parse.<locals>.<genexpr>iu.(u_normalized_keyuPEP426_VERSION_REumatchugroupsutupleusplitu_release_clause(uselfusuresultumugroups((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyuparses
)uNormalizedVersion.parseuaubucurcudevcs t�fdd��jD��S(Nc3s(|]}|r|d�jkVqdS(iN(uPREREL_TAGS(u.0ut(uself(u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu	<genexpr>su2NormalizedVersion.is_prerelease.<locals>.<genexpr>(uanyu_parts(uself((uselfu4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
is_prereleasesuNormalizedVersion.is_prereleaseN(	u__name__u
__module__u__qualname__u__doc__uparseusetuPREREL_TAGSupropertyu
is_prerelease(u
__locals__((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyuNormalizedVersion�scCsUt|�}t|�}||kr(dS|j|�s;dSt|�}||dkS(Nu.TF(ustruTrueu
startswithuFalseulen(uxuyun((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
_match_prefixsu
_match_prefixcBs�|EeZdZeZidd6dd6dd6dd6d	d
6dd6d
d6Zdd�Zdd�Zdd�Zdd�Z	dd�Z
dd�Zdd�Zdd�Z
dS( uNormalizedMatcheru_match_compatibleu~=u	_match_ltu<u	_match_gtu>u	_match_leu<=u	_match_geu>=u	_match_equ==u	_match_neu!=cCsx|r"d|ko|jd}n|jdo:|jd}|rn|jjdd�d}|j|�}n||fS(Nu-iii����i����i����(u_partsu_stringusplitu
version_class(uselfuversionu
constraintuprefixustrip_localus((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
_adjust_local,suNormalizedMatcher._adjust_localcCs^|j|||�\}}||kr+dS|j}djdd�|D��}t||�S(Nu.cSsg|]}t|��qS((ustr(u.0ui((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
<listcomp>?s	u/NormalizedMatcher._match_lt.<locals>.<listcomp>F(u
_adjust_localuFalseu_release_clauseujoinu
_match_prefix(uselfuversionu
constraintuprefixurelease_clauseupfx((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu	_match_lt:s	uNormalizedMatcher._match_ltcCs^|j|||�\}}||kr+dS|j}djdd�|D��}t||�S(Nu.cSsg|]}t|��qS((ustr(u.0ui((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
<listcomp>Gs	u/NormalizedMatcher._match_gt.<locals>.<listcomp>F(u
_adjust_localuFalseu_release_clauseujoinu
_match_prefix(uselfuversionu
constraintuprefixurelease_clauseupfx((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu	_match_gtBs	uNormalizedMatcher._match_gtcCs%|j|||�\}}||kS(N(u
_adjust_local(uselfuversionu
constraintuprefix((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu	_match_leJsuNormalizedMatcher._match_lecCs%|j|||�\}}||kS(N(u
_adjust_local(uselfuversionu
constraintuprefix((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu	_match_geNsuNormalizedMatcher._match_gecCsC|j|||�\}}|s0||k}nt||�}|S(N(u
_adjust_localu
_match_prefix(uselfuversionu
constraintuprefixuresult((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu	_match_eqRs
uNormalizedMatcher._match_eqcCsD|j|||�\}}|s0||k}nt||�}|S(N(u
_adjust_localu
_match_prefix(uselfuversionu
constraintuprefixuresult((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu	_match_neZs
uNormalizedMatcher._match_necCs�|j|||�\}}||kr+dS||kr;dS|j}t|�dkri|dd�}ndjdd�|D��}t||�S(Niu.cSsg|]}t|��qS((ustr(u.0ui((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
<listcomp>ks	u7NormalizedMatcher._match_compatible.<locals>.<listcomp>TFi����(u
_adjust_localuTrueuFalseu_release_clauseulenujoinu
_match_prefix(uselfuversionu
constraintuprefixurelease_clauseupfx((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu_match_compatiblebs	u#NormalizedMatcher._match_compatibleN(u__name__u
__module__u__qualname__uNormalizedVersionu
version_classu
_operatorsu
_adjust_localu	_match_ltu	_match_gtu	_match_leu	_match_geu	_match_equ	_match_neu_match_compatible(u
__locals__((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyuNormalizedMatchers"
u[.+-]$uu^[.](\d)u0.\1u^[.-]u
^\((.*)\)$u\1u^v(ersion)?\s*(\d+)u\2u^r(ev)?\s*(\d+)u[.]{2,}u.u\b(alfa|apha)\bualphau\b(pre-alpha|prealpha)\bu	pre.alphau	\(beta\)$ubetau
^[:~._+-]+u
[,*")([\]]u[~:+_ -]u\.$u
(\d+(\.\d+)*)cCs�|j�j�}x&tD]\}}|j||�}qW|sJd}ntj|�}|snd}|}n�|j�djd�}dd�|D�}x#t|�dkr�|j	d�q�Wt|�dkr�||j
�d�}nJdjdd�|dd�D��||j
�d�}|dd�}djd	d�|D��}|j�}|r�x)tD]\}}|j||�}qjWn|s�|}n&d
|kr�dnd}|||}t
|�s�d}n|S(
u�
    Try to suggest a semantic form for a version for which
    _suggest_normalized_version couldn't come up with anything.
    u0.0.0iu.cSsg|]}t|��qS((uint(u.0ui((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
<listcomp>�s	u-_suggest_semantic_version.<locals>.<listcomp>iNcSsg|]}t|��qS((ustr(u.0ui((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
<listcomp>�s	cSsg|]}t|��qS((ustr(u.0ui((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
<listcomp>�s	udevu-u+(ustripuloweru
_REPLACEMENTSusubu_NUMERIC_PREFIXumatchugroupsusplitulenuappenduendujoinu_SUFFIX_REPLACEMENTSu	is_semveruNone(usuresultupatureplumuprefixusuffixusep((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu_suggest_semantic_version�s:		:		u_suggest_semantic_versioncCs�yt|�|SWntk
r&YnX|j�}x&dBD]\}}|j||�}q:Wtjdd|�}tjdd|�}tjdd|�}tjdd|�}tjdd|�}|jd�r�|d d!�}ntjd"d|�}tjd#d$|�}tjd%d&|�}tjd'd|�}tjd(d)|�}tjd*d)|�}tjd+d
|�}tjd,d-|�}tjd.d&|�}tjd/d0|�}tjd1d2|�}yt|�Wntk
r�d!}YnX|S(Cu�Suggest a normalized version close to the given version string.

    If you have a version string that isn't rational (i.e. NormalizedVersion
    doesn't like it) then you might be able to get an equivalent (or close)
    rational version from this function.

    This does a number of simple normalizations to the given string, based
    on observation of versions currently in use on PyPI. Given a dump of
    those version during PyCon 2009, 4287 of them:
    - 2312 (53.93%) match NormalizedVersion without change
      with the automatic suggestion
    - 3474 (81.04%) match when using this suggestion method

    @param s {str} An irrational version string.
    @returns A rational version string, or None, if couldn't determine one.
    u-alphauau-betaubualphaubetaurcucu-finaluu-preu-releaseu.releaseu-stableu+u.u_u u.finalufinalupre$upre0udev$udev0u([abc]|rc)[\-\.](\d+)$u\1\2u[\-\.](dev)[\-\.]?r?(\d+)$u.\1\2u[.~]?([abc])\.?u\1uviNu\b0+(\d+)(?!\d)u(\d+[abc])$u\g<1>0u\.?(dev-r|dev\.r)\.?(\d+)$u.dev\2u-(a|b|c)(\d+)$u[\.\-](dev|devel)$u.dev0u(?![\.\-])dev$u(final|stable)$u\.?(r|-|-r)\.?(\d+)$u.post\2u\.?(dev|git|bzr)\.?(\d+)$u\.?(pre|preview|-c)(\d+)$uc\g<2>up(\d+)$u.post\1(u-alphaua(u-betaub(ualphaua(ubetaub(urcuc(u-finalu(u-preuc(u-releaseu(u.releaseu(u-stableu(u+u.(u_u.(u u(u.finalu(ufinalu((u-alphaua(u-betaub(ualphaua(ubetaub(urcuc(u-finalu(u-preuc(u-releaseu(u.releaseu(u-stableu(u+u.(u_u.(u u(u.finalu(ufinalu(u_normalized_keyuUnsupportedVersionErrorulowerureplaceureusubu
startswithuNone(usursuorigurepl((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu_suggest_normalized_version�sH

	
u_suggest_normalized_versionu([a-z]+|\d+|[\.-])ucupreupreviewufinal-u-urcu@udevcCs�dd�}g}x�||�D]�}|jd�r�|dkrjx'|rf|ddkrf|j�qCWnx'|r�|d	dkr�|j�qmWn|j|�qWt|�S(
NcSs�g}x�tj|j��D]p}tj||�}|rd|dd�ko[dknrr|jd�}n
d|}|j|�qqW|jd�|S(Nu0iu9iu*u*final(u
_VERSION_PARTusplituloweru_VERSION_REPLACEugetuzfilluappend(usuresultup((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu	get_parts4s&

u_legacy_key.<locals>.get_partsu*u*finaliu*final-u00000000i����i����(u
startswithupopuappendutuple(usu	get_partsuresultup((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu_legacy_key3s
u_legacy_keycBs2|EeZdZdd�Zedd��ZdS(u
LegacyVersioncCs
t|�S(N(u_legacy_key(uselfus((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyuparseNsuLegacyVersion.parsecCsRd}xE|jD]:}t|t�r|jd�r|dkrd}PqqW|S(Nu*u*finalFT(uFalseu_partsu
isinstanceustring_typesu
startswithuTrue(uselfuresultux((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
is_prereleaseQsuLegacyVersion.is_prereleaseN(u__name__u
__module__u__qualname__uparseupropertyu
is_prerelease(u
__locals__((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
LegacyVersionMscBsN|EeZdZeZeej�Zded<ej	d�Z
dd�ZdS(u
LegacyMatcheru_match_compatibleu~=u^(\d+(\.\d+)*)cCs�||krdS|jjt|��}|sEtjd||�dS|j�d}d|krz|jdd�d}nt	||�S(NuACannot compute compatible match for version %s  and constraint %siu.iFT(
uFalseu
numeric_reumatchustruloggeruwarninguTrueugroupsursplitu
_match_prefix(uselfuversionu
constraintuprefixumus((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu_match_compatibleds	
uLegacyMatcher._match_compatibleN(u__name__u
__module__u__qualname__u
LegacyVersionu
version_classudictuMatcheru
_operatorsureucompileu
numeric_reu_match_compatible(u
__locals__((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
LegacyMatcher\s

uN^(\d+)\.(\d+)\.(\d+)(-[a-z0-9]+(\.[a-z0-9-]+)*)?(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$cCs
tj|�S(N(u
_SEMVER_REumatch(us((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu	is_semverzsu	is_semverc	Cs�dd�}t|�}|s-t|��n|j�}dd�|dd�D�\}}}||dd�||dd�}}|||f||fS(	NcSsN|dkr|f}n2|dd�jd�}tdd�|D��}|S(Niu.cSs1g|]'}|j�r'|jd�n|�qS(i(uisdigituzfill(u.0up((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
<listcomp>�s	u5_semantic_key.<locals>.make_tuple.<locals>.<listcomp>(uNoneusplitutuple(usuabsenturesultuparts((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
make_tuples
u!_semantic_key.<locals>.make_tuplecSsg|]}t|��qS((uint(u.0ui((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
<listcomp>�s	u!_semantic_key.<locals>.<listcomp>iu|iu*(u	is_semveruUnsupportedVersionErrorugroups(	usu
make_tupleumugroupsumajoruminorupatchupreubuild((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
_semantic_key~s
&'u
_semantic_keycBs2|EeZdZdd�Zedd��ZdS(uSemanticVersioncCs
t|�S(N(u
_semantic_key(uselfus((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyuparse�suSemanticVersion.parsecCs|jdddkS(Niiu|(u_parts(uself((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
is_prerelease�suSemanticVersion.is_prereleaseN(u__name__u
__module__u__qualname__uparseupropertyu
is_prerelease(u
__locals__((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyuSemanticVersion�scBs|EeZdZeZdS(uSemanticMatcherN(u__name__u
__module__u__qualname__uSemanticVersionu
version_class(u
__locals__((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyuSemanticMatcher�scBsS|EeZdZddd�Zdd�Zdd�Zdd�Zd	d
�ZdS(u
VersionSchemecCs||_||_||_dS(N(ukeyumatcheru	suggester(uselfukeyumatcheru	suggester((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu__init__�s		uVersionScheme.__init__cCs9y|jj|�d}Wntk
r4d}YnX|S(NTF(umatcheru
version_classuTrueuUnsupportedVersionErroruFalse(uselfusuresult((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyuis_valid_version�s

uVersionScheme.is_valid_versioncCs6y|j|�d}Wntk
r1d}YnX|S(NTF(umatcheruTrueuUnsupportedVersionErroruFalse(uselfusuresult((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyuis_valid_matcher�s


uVersionScheme.is_valid_matchercCs|jd|�S(u:
        Used for processing some metadata fields
        udummy_name (%s)(uis_valid_matcher(uselfus((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyuis_valid_constraint_list�su&VersionScheme.is_valid_constraint_listcCs+|jdkrd}n|j|�}|S(N(u	suggesteruNone(uselfusuresult((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyusuggest�s	uVersionScheme.suggestN(	u__name__u
__module__u__qualname__uNoneu__init__uis_valid_versionuis_valid_matcheruis_valid_constraint_listusuggest(u
__locals__((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
VersionScheme�s
u
VersionSchemeu
normalizedcCs|S(N((uselfus((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu<lambda>�su<lambda>ulegacyusemanticudefaultcCs'|tkrtd|��nt|S(Nuunknown scheme name: %r(u_SCHEMESu
ValueError(uname((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu
get_scheme�s()u__doc__uloggingureucompatustring_typesu__all__u	getLoggeru__name__uloggeru
ValueErroruUnsupportedVersionErroruobjectuVersionuMatcherucompileuPEP426_VERSION_REu_pep426_keyu_normalized_keyuNormalizedVersionu
_match_prefixuNormalizedMatcheru
_REPLACEMENTSu_SUFFIX_REPLACEMENTSu_NUMERIC_PREFIXu_suggest_semantic_versionu_suggest_normalized_versionuIu
_VERSION_PARTuNoneu_VERSION_REPLACEu_legacy_keyu
LegacyVersionu
LegacyMatcheru
_SEMVER_REu	is_semveru
_semantic_keyuSemanticVersionuSemanticMatcheru
VersionSchemeu_SCHEMESu
get_scheme(((u4/tmp/pip-zej_zi-build/pip/_vendor/distlib/version.pyu<module>	s~1j/$Q.r
		#	
	
site-packages/pip/_vendor/distlib/__pycache__/database.cpython-33.pyc000064400000162611151733463550021564 0ustar00�
7�Re�c@s6dZddlmZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlm
Z
mZddlmZddlmZmZddlmZmZdd	lmZmZmZmZmZmZmZd
ddd
dgZej e!�Z"dZ#dZ$deddde#dfZ%dZ&Gdd�de'�Z(Gdd�de'�Z)Gdd
�d
e'�Z*Gdd�de*�Z+Gdd�de+�Z,Gdd
�d
e+�Z-e,Z.e-Z/Gdd�de'�Z0d d!d"�Z1d#d$�Z2d%d&�Z3d'd(�Z4dS()uPEP 376 implementation.i(uunicode_literalsNi(uDistlibExceptionu	resources(uStringIO(u
get_schemeuUnsupportedVersionError(uMetadatauMETADATA_FILENAME(uparse_requirementucached_propertyuparse_name_and_versionuread_exportsu
write_exportsu	CSVReaderu	CSVWriteruDistributionuBaseInstalledDistributionuInstalledDistributionuEggInfoDistributionuDistributionPathupydist-exports.jsonupydist-commands.jsonu	INSTALLERuRECORDu	REQUESTEDu	RESOURCESuSHAREDu
.dist-infocBs>|EeZdZdZdd�Zdd�Zdd�ZdS(	u_CacheuL
    A simple cache mapping names and .dist-info paths to distributions
    cCsi|_i|_d|_dS(uZ
        Initialise an instance. There is normally one for each DistributionPath.
        NF(unameupathuFalseu	generated(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu__init__0s		u_Cache.__init__cCs'|jj�|jj�d|_dS(uC
        Clear the cache, setting it to its initial state.
        NF(unameuclearupathuFalseu	generated(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuclear8s

u_Cache.clearcCsH|j|jkrD||j|j<|jj|jg�j|�ndS(u`
        Add a distribution to the cache.
        :param dist: The distribution to add.
        N(upathunameu
setdefaultukeyuappend(uselfudist((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuadd@su
_Cache.addN(u__name__u
__module__u__qualname__u__doc__u__init__uclearuadd(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu_Cache,su_CachecBs�|EeZdZdZdddd�Zdd�Zdd�Ze	ee�Z
dd	�Zd
d�Zdd
�Z
edd��Zdd�Zdd�Zddd�Zdd�Zddd�ZdS(uDistributionPathuU
    Represents a set of distributions installed on a path (typically sys.path).
    cCsg|dkrtj}n||_d|_||_t�|_t�|_d|_	t
d�|_dS(u�
        Create an instance from a path, optionally including legacy (distutils/
        setuptools/distribute) distributions.
        :param path: The path to use, as a list of directories. If not specified,
                     sys.path is used.
        :param include_egg: If True, this instance will look for and return legacy
                            distributions as well as those based on PEP 376.
        udefaultNT(uNoneusysupathuTrueu
_include_distu_include_eggu_Cacheu_cacheu
_cache_eggu_cache_enabledu
get_schemeu_scheme(uselfupathuinclude_egg((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu__init__Ns					uDistributionPath.__init__cCs|jS(N(u_cache_enabled(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu_get_cache_enabledbsu#DistributionPath._get_cache_enabledcCs
||_dS(N(u_cache_enabled(uselfuvalue((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu_set_cache_enabledesu#DistributionPath._set_cache_enabledcCs|jj�|jj�dS(u,
        Clears the internal cache.
        N(u_cacheuclearu
_cache_egg(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuclear_cachejs
uDistributionPath.clear_cachec
cs�t�}x�|jD]�}tj|�}|d
kr:qn|jd�}|s|jr`qnt|j�}x(|D] }|j|�}|sv|j|kr�qvn|jrG|j	t
�rGtj|t
�}|j|�}|s�qvntd|j�dd�}	tjd|j�|j|j�t|jd|	d|�Vqv|jrv|j	d�rvtjd|j�|j|j�t|j|�VqvqvWqWd
S(uD
        Yield .dist-info and/or .egg(-info) distributions.
        uufileobjuschemeulegacyuFound %sumetadatauenvu	.egg-infou.eggN(u	.egg-infou.egg(usetupathu	resourcesufinder_for_pathuNoneufinduis_containerusortedu
_include_distuendswithuDISTINFO_EXTu	posixpathujoinuMETADATA_FILENAMEuMetadatau	as_streamuloggerudebuguaddunew_dist_classu_include_egguold_dist_class(
uselfuseenupathufinderurursetuentryu
metadata_pathupydistumetadata((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu_yield_distributionsrs:	
		u%DistributionPath._yield_distributionscCs�|jj}|jo |jj}|s/|r�xF|j�D]8}t|t�rd|jj|�q<|jj|�q<W|r�d|j_n|r�d|j_q�ndS(uk
        Scan the path for distributions and populate the cache with
        those that are found.
        NT(	u_cacheu	generatedu_include_eggu
_cache_eggu_yield_distributionsu
isinstanceuInstalledDistributionuadduTrue(uselfugen_distugen_eggudist((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu_generate_cache�s
u DistributionPath._generate_cachecCs)|jdd�}dj||g�tS(uo
        The *name* and *version* parameters are converted into their
        filename-escaped form, i.e. any ``'-'`` characters are replaced
        with ``'_'`` other than the one in ``'dist-info'`` and the one
        separating the name from the version number.

        :parameter name: is converted to a standard distribution name by replacing
                         any runs of non- alphanumeric characters with a single
                         ``'-'``.
        :type name: string
        :parameter version: is converted to a standard version string. Spaces
                            become dots, and all other non-alphanumeric characters
                            (except dots) become dashes, with runs of multiple
                            dashes condensed to a single dash.
        :type version: string
        :returns: directory name
        :rtype: stringu-u_(ureplaceujoinuDISTINFO_EXT(uclsunameuversion((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyudistinfo_dirname�su!DistributionPath.distinfo_dirnameccs�|js(xv|j�D]}|VqWnZ|j�x|jjj�D]}|VqEW|jr�x"|jjj�D]}|VqpWndS(u5
        Provides an iterator that looks for distributions and returns
        :class:`InstalledDistribution` or
        :class:`EggInfoDistribution` instances for each one of them.

        :rtype: iterator of :class:`InstalledDistribution` and
                :class:`EggInfoDistribution` instances
        N(u_cache_enabledu_yield_distributionsu_generate_cacheu_cacheupathuvaluesu_include_eggu
_cache_egg(uselfudist((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuget_distributions�s		
		u"DistributionPath.get_distributionscCs�d}|j�}|jsNx�|j�D]}|j|kr(|}Pq(q(Wne|j�||jjkr�|jj|d}n2|jr�||j	jkr�|j	j|d}n|S(u=
        Looks for a named distribution on the path.

        This function only returns the first result found, as no more than one
        value is expected. If nothing is found, ``None`` is returned.

        :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution`
                or ``None``
        iN(
uNoneuloweru_cache_enabledu_yield_distributionsukeyu_generate_cacheu_cacheunameu_include_eggu
_cache_egg(uselfunameuresultudist((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuget_distribution�s
	
u!DistributionPath.get_distributionc	
cs�d}|dk	r`y |jjd||f�}Wq`tk
r\td||f��Yq`Xnx�|j�D]z}|j}xh|D]`}t|�\}}|dkr�||kr�|VPq�q�||kr�|j|�r�|VPq�q�WqmWdS(u
        Iterates over all distributions to find which distributions provide *name*.
        If a *version* is provided, it will be used to filter the results.

        This function only returns the first result found, since no more than
        one values are expected. If the directory is not found, returns ``None``.

        :parameter version: a version specifier that indicates the version
                            required, conforming to the format in ``PEP-345``

        :type name: string
        :type version: string
        u%s (%s)uinvalid name or version: %r, %rN(	uNoneu_schemeumatcheru
ValueErroruDistlibExceptionuget_distributionsuprovidesuparse_name_and_versionumatch(	uselfunameuversionumatcherudistuprovidedupup_nameup_ver((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuprovides_distribution�s$ 
	
u&DistributionPath.provides_distributioncCs;|j|�}|dkr.td|��n|j|�S(u5
        Return the path to a resource file.
        uno distribution named %r foundN(uget_distributionuNoneuLookupErroruget_resource_path(uselfunameu
relative_pathudist((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu
get_file_pathsuDistributionPath.get_file_pathccs�xy|j�D]k}|j}||kr
||}|dk	rY||kru||Vquqxx|j�D]}|VqfWq
q
WdS(u�
        Return all of the exported entries in a particular category.

        :param category: The category to search for entries.
        :param name: If specified, only entries with that name are returned.
        N(uget_distributionsuexportsuNoneuvalues(uselfucategoryunameudisturuduv((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuget_exported_entriess	
u%DistributionPath.get_exported_entriesNF(u__name__u
__module__u__qualname__u__doc__uNoneuFalseu__init__u_get_cache_enabledu_set_cache_enabledupropertyu
cache_enableduclear_cacheu_yield_distributionsu_generate_cacheuclassmethodudistinfo_dirnameuget_distributionsuget_distributionuprovides_distributionu
get_file_pathuget_exported_entries(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuDistributionPathJs&$	cBs|EeZdZdZdZdZdd�Zedd��Z	e	Z
edd��Zedd	��Zd
d�Z
edd
��Zedd��Zedd��Zedd��Zedd��Zdd�Zdd�Zdd�Zdd�ZdS( uDistributionu�
    A base class for distributions, whether installed or from indexes.
    Either way, it must have some metadata, so that's all that's needed
    for construction.
    cCs[||_|j|_|jj�|_|j|_d|_d|_d|_d|_	dS(u�
        Initialise an instance.
        :param metadata: The instance of :class:`Metadata` describing this
        distribution.
        N(
umetadataunameulowerukeyuversionuNoneulocatorudigestuextrasucontext(uselfumetadata((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu__init__Cs				uDistribution.__init__cCs
|jjS(uH
        The source archive download URL for this distribution.
        (umetadatau
source_url(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu
source_urlRsuDistribution.source_urlcCsd|j|jfS(uX
        A utility property which displays the name and version in parentheses.
        u%s (%s)(unameuversion(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuname_and_version[suDistribution.name_and_versioncCsB|jj}d|j|jf}||kr>|j|�n|S(u�
        A set of distribution names and versions provided by this distribution.
        :return: A set of "name (version)" strings.
        u%s (%s)(umetadatauprovidesunameuversionuappend(uselfuplistus((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuprovidesbs
uDistribution.providescCs:t|j|�}t|jj|d|jd|j��S(Nuextrasuenv(ugetattrumetadatausetuget_requirementsuextrasucontext(uselfureq_attrureqts((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu_get_requirementsnsuDistribution._get_requirementscCs
|jd�S(Nurun_requires(u_get_requirements(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyurun_requiresssuDistribution.run_requirescCs
|jd�S(Nu
meta_requires(u_get_requirements(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu
meta_requireswsuDistribution.meta_requirescCs
|jd�S(Nubuild_requires(u_get_requirements(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyubuild_requires{suDistribution.build_requirescCs
|jd�S(Nu
test_requires(u_get_requirements(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu
test_requiressuDistribution.test_requirescCs
|jd�S(Nudev_requires(u_get_requirements(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyudev_requires�suDistribution.dev_requiresc
Cs�t|�}t|jj�}y|j|j�}WnAtk
rwtjd|�|j	�d}|j|�}YnX|j
}d}x^|jD]S}t
|�\}}	||kr�q�ny|j|	�}PWq�tk
r�Yq�Xq�W|S(u�
        Say if this instance matches (fulfills) a requirement.
        :param req: The requirement to match.
        :rtype req: str
        :return: True if it matches, else False.
        u+could not read version %r - using name onlyiF(uparse_requirementu
get_schemeumetadatauschemeumatcherurequirementuUnsupportedVersionErroruloggeruwarningusplitukeyuFalseuprovidesuparse_name_and_versionumatch(
uselfurequruschemeumatcherunameuresultupup_nameup_ver((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyumatches_requirement�s*	
		
	u Distribution.matches_requirementcCs6|jrd|j}nd}d|j|j|fS(uC
        Return a textual representation of this instance,
        u [%s]uu<Distribution %s (%s)%s>(u
source_urlunameuversion(uselfusuffix((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu__repr__�s	uDistribution.__repr__cCs[t|�t|�k	r!d}n6|j|jkoT|j|jkoT|j|jk}|S(u<
        See if this distribution is the same as another.
        :param other: The distribution to compare with. To be equal to one
                      another. distributions must have the same type, name,
                      version and source_url.
        :return: True if it is the same, else False.
        F(utypeuFalseunameuversionu
source_url(uselfuotheruresult((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu__eq__�s	uDistribution.__eq__cCs't|j�t|j�t|j�S(uH
        Compute hash in a way which matches the equality test.
        (uhashunameuversionu
source_url(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu__hash__�suDistribution.__hash__NF(u__name__u
__module__u__qualname__u__doc__uFalseubuild_time_dependencyu	requestedu__init__upropertyu
source_urludownload_urluname_and_versionuprovidesu_get_requirementsurun_requiresu
meta_requiresubuild_requiresu
test_requiresudev_requiresumatches_requirementu__repr__u__eq__u__hash__(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuDistribution1s$"
csD|EeZdZdZdZd�fdd�Zddd�Z�S(uBaseInstalledDistributionu]
    This is the base class for installed distributions (whether PEP 376 or
    legacy).
    cs,tt|�j|�||_||_dS(u
        Initialise an instance.
        :param metadata: An instance of :class:`Metadata` which describes the
                         distribution. This will normally have been initialised
                         from a metadata file in the ``path``.
        :param path:     The path of the ``.dist-info`` or ``.egg-info``
                         directory for the distribution.
        :param env:      This is normally the :class:`DistributionPath`
                         instance where this distribution was found.
        N(usuperuBaseInstalledDistributionu__init__upathu	dist_path(uselfumetadataupathuenv(u	__class__(u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu__init__�s	u"BaseInstalledDistribution.__init__cCs�|dkr|j}n|dkr6tj}d}ntt|�}d|j}||�j�}tj|�jd�j	d�}d||fS(u�
        Get the hash of some data, using a particular hash algorithm, if
        specified.

        :param data: The data to be hashed.
        :type data: bytes
        :param hasher: The name of a hash implementation, supported by hashlib,
                       or ``None``. Examples of valid values are ``'sha1'``,
                       ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and
                       ``'sha512'``. If no hasher is specified, the ``hasher``
                       attribute of the :class:`InstalledDistribution` instance
                       is used. If the hasher is determined to be ``None``, MD5
                       is used as the hashing algorithm.
        :returns: The hash of the data. If a hasher was explicitly specified,
                  the returned hash will be prefixed with the specified hasher
                  followed by '='.
        :rtype: str
        uu%s=s=uasciiu%s%sN(
uNoneuhasheruhashlibumd5ugetattrudigestubase64uurlsafe_b64encodeurstripudecode(uselfudatauhasheruprefixudigest((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuget_hash�s		
!u"BaseInstalledDistribution.get_hashN(u__name__u
__module__u__qualname__u__doc__uNoneuhasheru__init__uget_hash(u
__locals__((u	__class__u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuBaseInstalledDistribution�scs|EeZdZdZdZd%d%�fdd�Zdd�Zdd�Zd	d
�Z	e
dd��Zd
d�Zdd�Z
dd�Zdd�Zd&dd�Zdd�Ze
dd��Zd&dd�Zdd�Zdd �Zd!d"�Zd#d$�ZejZ�S('uInstalledDistributionu
    Created with the *path* of the ``.dist-info`` directory provided to the
    constructor. It reads the metadata contained in ``pydist.json`` when it is
    instantiated., or uses a passed in Metadata instance (useful for when
    dry-run mode is being used).
    usha256cs�tj|�|_}|dkr;ddl}|j�n|rr|jrr||jjkrr|jj|j	}n�|dkr|j
t�}|dkr�|j
d�}n|dkr�tdt|f��nt
j|j���}td|dd�}WdQXntt|�j|||�|rD|jrD|jj|�ny|j
d�}Wn(tk
r�ddl}|j�YnX|dk	|_dS(NiuMETADATAuno %s found in %sufileobjuschemeulegacyu	REQUESTED(u	resourcesufinder_for_pathufinderuNoneupdbu	set_traceu_cache_enabledu_cacheupathumetadataufinduMETADATA_FILENAMEu
ValueErroru
contextlibuclosingu	as_streamuMetadatausuperuInstalledDistributionu__init__uadduAttributeErroru	requested(uselfupathumetadatauenvufinderupdburustream(u	__class__(u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu__init__s0
!	
uInstalledDistribution.__init__cCsd|j|j|jfS(Nu#<InstalledDistribution %r %s at %r>(unameuversionupath(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu__repr__'suInstalledDistribution.__repr__cCsd|j|jfS(Nu%s %s(unameuversion(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu__str__+suInstalledDistribution.__str__c
Cs�g}|jd�}tj|j���{}td|��c}xY|D]Q}dd�tt|�d�D�}||\}}}	|j|||	f�qFWWdQXWdQX|S(u"
        Get the list of installed files for the distribution
        :return: A list of tuples of path, hash and size. Note that hash and
                 size might be ``None`` for some entries. The path is exactly
                 as stored in the file (which is as in PEP 376).
        uRECORDustreamcSsg|]}d�qS(N(uNone(u.0ui((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu
<listcomp>=s	u6InstalledDistribution._get_records.<locals>.<listcomp>iN(uget_distinfo_resourceu
contextlibuclosingu	as_streamu	CSVReaderurangeulenuappend(
uselfuresultsurustreamu
record_readerurowumissingupathuchecksumusize((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu_get_records.s
"&u"InstalledDistribution._get_recordscCs.i}|jt�}|r*|j�}n|S(u
        Return the information exported by this distribution.
        :return: A dictionary of exports, mapping an export category to a dict
                 of :class:`ExportEntry` instances describing the individual
                 export entries, and keyed by name.
        (uget_distinfo_resourceuEXPORTS_FILENAMEuread_exports(uselfuresultur((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuexportsEs
uInstalledDistribution.exportsc	CsLi}|jt�}|rHtj|j���}t|�}WdQXn|S(u�
        Read exports data from a file in .ini format.

        :return: A dictionary of exports, mapping an export category to a list
                 of :class:`ExportEntry` instances describing the individual
                 export entries.
        N(uget_distinfo_resourceuEXPORTS_FILENAMEu
contextlibuclosingu	as_streamuread_exports(uselfuresulturustream((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuread_exportsSsu"InstalledDistribution.read_exportsc
Cs8|jt�}t|d��}t||�WdQXdS(u
        Write a dictionary of exports to a file in .ini format.
        :param exports: A dictionary of exports, mapping an export category to
                        a list of :class:`ExportEntry` instances describing the
                        individual export entries.
        uwN(uget_distinfo_fileuEXPORTS_FILENAMEuopenu
write_exports(uselfuexportsurfuf((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu
write_exportsbsu#InstalledDistribution.write_exportscCs�|jd�}tj|j���F}td|��.}x$|D]\}}||kr@|Sq@WWdQXWdQXtd|��dS(uW
        NOTE: This API may change in the future.

        Return the absolute path to a resource file with the given relative
        path.

        :param relative_path: The path, relative to .dist-info, of the resource
                              of interest.
        :return: The absolute path where the resource is to be found.
        u	RESOURCESustreamNu3no resource file with relative path %r is installed(uget_distinfo_resourceu
contextlibuclosingu	as_streamu	CSVReaderuKeyError(uselfu
relative_pathurustreamuresources_readerurelativeudestination((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuget_resource_pathmsu'InstalledDistribution.get_resource_pathccs x|j�D]}|Vq
WdS(u�
        Iterates over the ``RECORD`` entries and returns a tuple
        ``(path, hash, size)`` for each line.

        :returns: iterator of (path, hash, size)
        N(u_get_records(uselfuresult((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyulist_installed_files�su*InstalledDistribution.list_installed_filescCs�tjj|d�}tjj|j�}|j|�}tjj|d�}|jd�}tjd|�|rwdSt	|��}x�|D]�}tjj
|�s�|jd	�r�d}	}
nCdtjj|�}
t
|d��}|j|j��}	WdQX|j|�s(|r@|j|�r@tjj||�}n|j||	|
f�q�W|j|�r�tjj||�}n|j|ddf�WdQX|S(
u�
        Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any
        existing ``RECORD`` file is silently overwritten.

        prefix is used to determine when to write absolute paths.
        uuRECORDucreating %su.pycu.pyou%durbN(u.pycu.pyo(uosupathujoinudirnameu
startswithuget_distinfo_fileuloggeruinfouNoneu	CSVWriteruisdiruendswithugetsizeuopenuget_hashureadurelpathuwriterow(uselfupathsuprefixudry_runubaseubase_under_prefixurecord_pathuwriterupathu
hash_valueusizeufp((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuwrite_installed_files�s.
!
u+InstalledDistribution.write_installed_filescCs�g}tjj|j�}|jd�}xn|j�D]`\}}}tjj|�sptjj||�}n||kr�q7ntjj|�s�|j|dd
df�q7tjj|�r7ttjj
|��}|r||kr|j|d||f�q�|r�d|kr3|jdd�d}nd	}t|d��G}	|j|	j�|�}
|
|kr�|j|d||
f�nWd	QXq�q7q7W|S(u�
        Checks that the hashes and sizes of the files in ``RECORD`` are
        matched by the files themselves. Returns a (possibly empty) list of
        mismatches. Each entry in the mismatch list will be a tuple consisting
        of the path, 'exists', 'size' or 'hash' according to what didn't match
        (existence is checked first, then size, then hash), the expected
        value and the actual value.
        uRECORDuexistsusizeu=iiurbuhashNTF(uosupathudirnameuget_distinfo_fileulist_installed_filesuisabsujoinuexistsuappenduTrueuFalseuisfileustrugetsizeusplituNoneuopenuget_hashuread(uselfu
mismatchesubaseurecord_pathupathu
hash_valueusizeuactual_sizeuhasherufuactual_hash((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyucheck_installed_files�s.	,u+InstalledDistribution.check_installed_filesc
Cs�i}tjj|jd�}tjj|�r�tj|ddd��}|j�j�}WdQXx[|D]P}|jdd�\}}|dkr�|j	|g�j
|�qj|||<qjWn|S(	u�
        A dictionary of shared locations whose keys are in the set 'prefix',
        'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'.
        The corresponding value is the absolute path of that category for
        this distribution, and takes into account any paths selected by the
        user at installation time (e.g. via command-line arguments). In the
        case of the 'namespace' key, this would be a list of absolute paths
        for the roots of namespace packages in this distribution.

        The first time this property is accessed, the relevant information is
        read from the SHARED file in the .dist-info directory.
        uSHAREDuruencodinguutf-8Nu=iu	namespace(uosupathujoinuisfileucodecsuopenureadu
splitlinesusplitu
setdefaultuappend(uselfuresultushared_pathufulinesulineukeyuvalue((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyushared_locations�s
u&InstalledDistribution.shared_locationsc	
Cs�tjj|jd�}tjd|�|r2dSg}xHdD]@}||}tjj||�r?|jd||f�q?q?Wx+|jd	f�D]}|jd
|�q�Wt	j
|ddd
��}|jdj|��WdQX|S(ua
        Write shared location information to the SHARED file in .dist-info.
        :param paths: A dictionary as described in the documentation for
        :meth:`shared_locations`.
        :param dry_run: If True, the action is logged but no file is actually
                        written.
        :return: The path of the file written to.
        uSHAREDucreating %suprefixulibuheadersuscriptsudatau%s=%su	namespaceunamespace=%suwuencodinguutf-8u
N(uprefixulibuheadersuscriptsudata(uosupathujoinuloggeruinfouNoneuisdiruappendugetucodecsuopenuwrite(	uselfupathsudry_runushared_pathulinesukeyupathunsuf((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuwrite_shared_locations�s	

u,InstalledDistribution.write_shared_locationscCsi|tkr(td||jf��ntj|j�}|dkr\td|j��n|j|�S(Nu+invalid path for a dist-info file: %r at %ruUnable to get a finder for %s(u
DIST_FILESuDistlibExceptionupathu	resourcesufinder_for_pathuNoneufind(uselfupathufinder((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuget_distinfo_resourcesu+InstalledDistribution.get_distinfo_resourcecCs�|jtj�dkr~|jtj�dd�\}}||jjtj�dkr~td||j|jf��q~n|tkr�td||jf��ntjj	|j|�S(	u�
        Returns a path located under the ``.dist-info`` directory. Returns a
        string representing the path.

        :parameter path: a ``'/'``-separated path relative to the
                         ``.dist-info`` directory or an absolute path;
                         If *path* is an absolute path and doesn't start
                         with the ``.dist-info`` directory path,
                         a :class:`DistlibException` is raised
        :type path: str
        :rtype: str
        iiNiu;dist-info file %r does not belong to the %r %s distributionu+invalid path for a dist-info file: %r at %ri����i����(
ufinduosusepusplitupathuDistlibExceptionunameuversionu
DIST_FILESujoin(uselfupathudistinfo_dirname((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuget_distinfo_files"u'InstalledDistribution.get_distinfo_fileccs}tjj|j�}xa|j�D]S\}}}tjj|�s[tjj||�}n|j|j�r"|Vq"q"WdS(u�
        Iterates over the ``RECORD`` entries and returns paths for each line if
        the path is pointing to a file located in the ``.dist-info`` directory
        or one of its subdirectories.

        :returns: iterator of paths
        N(uosupathudirnameu_get_recordsuisabsujoinu
startswith(uselfubaseupathuchecksumusize((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyulist_distinfo_files+su)InstalledDistribution.list_distinfo_filescCst|t�o|j|jkS(N(u
isinstanceuInstalledDistributionupath(uselfuother((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu__eq__;suInstalledDistribution.__eq__NF(u__name__u
__module__u__qualname__u__doc__uhasheruNoneu__init__u__repr__u__str__u_get_recordsucached_propertyuexportsuread_exportsu
write_exportsuget_resource_pathulist_installed_filesuFalseuwrite_installed_filesucheck_installed_filesushared_locationsuwrite_shared_locationsuget_distinfo_resourceuget_distinfo_fileulist_distinfo_filesu__eq__uobjectu__hash__(u
__locals__((u	__class__u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuInstalledDistributions(
##	cs�|EeZdZdZdZiZd�fdd�Zdd�Z	dd�Z
dd	�Zd
d�Zdd
�Z
ddd�Zdd�ZejZ�S(uEggInfoDistributionuCreated with the *path* of the ``.egg-info`` directory or file provided
    to the constructor. It reads the metadata contained in the file itself, or
    if the given path happens to be a directory, the metadata is read from the
    file ``PKG-INFO`` under that directory.cs�dd�}||_||_|rk|jrk||jjkrk|jj|j}|||j|j�nG|j|�}|||j|j�|r�|jr�|jj|�nt	t
|�j|||�dS(NcSs%||_|j�|_||_dS(N(unameulowerukeyuversion(usunuv((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuset_name_and_versionMs	u:EggInfoDistribution.__init__.<locals>.set_name_and_version(upathu	dist_pathu_cache_enabledu
_cache_eggumetadataunameuversionu
_get_metadatauaddusuperuEggInfoDistributionu__init__(uselfupathuenvuset_name_and_versionumetadata(u	__class__(u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu__init__Ls		!uEggInfoDistribution.__init__c
s�d}dd���fdd�}|jd�r!tjj|�r�tjj|dd�}td|d	d
�}tjj|dd�}||�}q�tj|�}t	|j
d�jd
��}td|d	d
�}y(|j
d�}	�|	jd��}Wq�tk
rd}Yq�Xn�|jd�r�tjj|�r{tjj|d�}tjj|d�}||�}ntd|d	d
�}nt
d|��|r�|j|�n|S(NcSs�g}|j�}x�|D]�}|j�}|jd�rNtjd|�Pnt|�}|svtjd|�qn|jr�tjd�n|js�|j|j	�qdj
dd�|jD��}|jd|j	|f�qW|S(	u�Create a list of dependencies from a requires.txt file.

            *data*: the contents of a setuptools-produced requires.txt file.
            u[u.Unexpected line: quitting requirement scan: %ru#Not recognised as a requirement: %ru4extra requirements in requires.txt are not supportedu, css|]}d|VqdS(u%s%sN((u.0uc((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu	<genexpr>{suQEggInfoDistribution._get_metadata.<locals>.parse_requires_data.<locals>.<genexpr>u%s (%s)(u
splitlinesustripu
startswithuloggeruwarninguparse_requirementuextrasuconstraintsuappendunameujoin(udataureqsulinesulineurucons((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuparse_requires_datads&
			u>EggInfoDistribution._get_metadata.<locals>.parse_requires_datacsSg}y4tj|dd��}�|j��}WdQXWntk
rNYnX|S(u�Create a list of dependencies from a requires.txt file.

            *req_path*: the path to a setuptools-produced requires.txt file.
            uruutf-8N(ucodecsuopenureaduIOError(ureq_pathureqsufp(uparse_requires_data(u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuparse_requires_paths
u>EggInfoDistribution._get_metadata.<locals>.parse_requires_pathu.egguEGG-INFOuPKG-INFOupathuschemeulegacyurequires.txtuEGG-INFO/PKG-INFOuutf8ufileobjuEGG-INFO/requires.txtuutf-8u	.egg-infou,path must end with .egg-info or .egg, got %r(uNoneuendswithuosupathuisdirujoinuMetadatau	zipimportuzipimporteruStringIOuget_dataudecodeuIOErroruDistlibExceptionuadd_requirements(
uselfupathurequiresuparse_requires_pathu	meta_pathumetadataureq_pathuzipfufileobjudata((uparse_requires_datau5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu
_get_metadataas:

u!EggInfoDistribution._get_metadatacCsd|j|j|jfS(Nu!<EggInfoDistribution %r %s at %r>(unameuversionupath(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu__repr__�suEggInfoDistribution.__repr__cCsd|j|jfS(Nu%s %s(unameuversion(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu__str__�suEggInfoDistribution.__str__cCs�g}tjj|jd�}tjj|�r�x`|j�D]O\}}}||kr^q=ntjj|�s=|j|dddf�q=q=Wn|S(u�
        Checks that the hashes and sizes of the files in ``RECORD`` are
        matched by the files themselves. Returns a (possibly empty) list of
        mismatches. Each entry in the mismatch list will be a tuple consisting
        of the path, 'exists', 'size' or 'hash' according to what didn't match
        (existence is checked first, then size, then hash), the expected
        value and the actual value.
        uinstalled-files.txtuexistsTF(uosupathujoinuexistsulist_installed_filesuappenduTrueuFalse(uselfu
mismatchesurecord_pathupathu_((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyucheck_installed_files�s	#u)EggInfoDistribution.check_installed_filesc
Cs8dd�}dd�}tjj|jd�}g}tjj|�r4tj|ddd���}x�|D]�}|j�}tjjtjj|j|��}tjj|�s�tj	d	|�|j
d
�r�qjq�ntjj|�sj|j|||�||�f�qjqjWWdQX|j|ddf�n|S(u�
        Iterates over the ``installed-files.txt`` entries and returns a tuple
        ``(path, hash, size)`` for each line.

        :returns: a list of (path, hash, size)
        c
Ss@t|d�}z|j�}Wd|j�Xtj|�j�S(Nurb(uopenureaducloseuhashlibumd5u	hexdigest(upathufucontent((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu_md5�s
u6EggInfoDistribution.list_installed_files.<locals>._md5cSstj|�jS(N(uosustatust_size(upath((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu_size�su7EggInfoDistribution.list_installed_files.<locals>._sizeuinstalled-files.txturuencodinguutf-8uNon-existent file: %su.pycu.pyoN(u.pycu.pyo(uosupathujoinuexistsucodecsuopenustripunormpathuloggeruwarninguendswithuisdiruappenduNone(uselfu_md5u_sizeurecord_pathuresultufulineup((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyulist_installed_files�s"
$	/u(EggInfoDistribution.list_installed_filesccs�tjj|jd�}d}tj|ddd���}x�|D]}|j�}|dkrjd}q@n|s@tjjtjj|j|��}|j	|j�r�|r�|Vq�|Vq�q@q@WWdQXdS(	u
        Iterates over the ``installed-files.txt`` entries and returns paths for
        each line if the path is pointing to a file located in the
        ``.egg-info`` directory or one of its subdirectories.

        :parameter absolute: If *absolute* is ``True``, each returned path is
                          transformed into a local absolute path. Otherwise the
                          raw value from ``installed-files.txt`` is returned.
        :type absolute: boolean
        :returns: iterator of paths
        uinstalled-files.txturuencodinguutf-8u./NTF(
uosupathujoinuTrueucodecsuopenustripuFalseunormpathu
startswith(uselfuabsoluteurecord_pathuskipufulineup((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyulist_distinfo_files�s
$u'EggInfoDistribution.list_distinfo_filescCst|t�o|j|jkS(N(u
isinstanceuEggInfoDistributionupath(uselfuother((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu__eq__suEggInfoDistribution.__eq__TNF(u__name__u
__module__u__qualname__u__doc__uTrueu	requestedushared_locationsuNoneu__init__u
_get_metadatau__repr__u__str__ucheck_installed_filesulist_installed_filesuFalseulist_distinfo_filesu__eq__uobjectu__hash__(u
__locals__((u	__class__u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuEggInfoDistributionCsK&cBs�|EeZdZdZdd�Zdd�Zddd�Zdd	�Zd
d�Z	dd
d�Z
ddd�Zdd�Z
dd�ZdS(uDependencyGraphu�
    Represents a dependency graph between distributions.

    The dependency relationships are stored in an ``adjacency_list`` that maps
    distributions to a list of ``(other, label)`` tuples where  ``other``
    is a distribution and the edge is labeled with ``label`` (i.e. the version
    specifier, if such was provided). Also, for more efficient traversal, for
    every distribution ``x``, a list of predecessors is kept in
    ``reverse_list[x]``. An edge from distribution ``a`` to
    distribution ``b`` means that ``a`` depends on ``b``. If any missing
    dependencies are found, they are stored in ``missing``, which is a
    dictionary that maps distributions to a list of requirements that were not
    provided by any other distributions.
    cCsi|_i|_i|_dS(N(uadjacency_listureverse_listumissing(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu__init__#s		uDependencyGraph.__init__cCsg|j|<g|j|<dS(u�Add the *distribution* to the graph.

        :type distribution: :class:`distutils2.database.InstalledDistribution`
                            or :class:`distutils2.database.EggInfoDistribution`
        N(uadjacency_listureverse_list(uselfudistribution((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuadd_distribution(s
u DependencyGraph.add_distributioncCsH|j|j||f�||j|krD|j|j|�ndS(u�Add an edge from distribution *x* to distribution *y* with the given
        *label*.

        :type x: :class:`distutils2.database.InstalledDistribution` or
                 :class:`distutils2.database.EggInfoDistribution`
        :type y: :class:`distutils2.database.InstalledDistribution` or
                 :class:`distutils2.database.EggInfoDistribution`
        :type label: ``str`` or ``None``
        N(uadjacency_listuappendureverse_list(uselfuxuyulabel((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuadd_edge2s
uDependencyGraph.add_edgecCs3tjd||�|jj|g�j|�dS(u
        Add a missing *requirement* for the given *distribution*.

        :type distribution: :class:`distutils2.database.InstalledDistribution`
                            or :class:`distutils2.database.EggInfoDistribution`
        :type requirement: ``str``
        u
%s missing %rN(uloggerudebugumissingu
setdefaultuappend(uselfudistributionurequirement((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuadd_missingAsuDependencyGraph.add_missingcCsd|j|jfS(Nu%s %s(unameuversion(uselfudist((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu
_repr_distLsuDependencyGraph._repr_disticCs�|j|�g}x�|j|D]�\}}|j|�}|dk	rZd||f}n|jd|t|��|j||d�}|jd�}|j|dd��q Wdj|�S(uPrints only a subgraphu%s [%s]u    iu
N(	u
_repr_distuadjacency_listuNoneuappendustru	repr_nodeusplituextendujoin(uselfudistuleveluoutputuotherulabelu	suboutputusubs((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu	repr_nodeOsuDependencyGraph.repr_nodecCsRg}|jd�x�|jj�D]�\}}t|�dkrX|rX|j|�nx`|D]X\}}|dk	r�|jd|j|j|f�q_|jd|j|jf�q_Wq#W|rAt|�dkrA|jd�|jd�|jd�x/|D]'}|jd|j�|jd	�qW|jd
�n|jd
�dS(u9Writes a DOT output for the graph to the provided file *f*.

        If *skip_disconnected* is set to ``True``, then all distributions
        that are not dependent on any other distribution are skipped.

        :type f: has to support ``file``-like operations
        :type skip_disconnected: ``bool``
        udigraph dependencies {
iu"%s" -> "%s" [label="%s"]
u
"%s" -> "%s"
usubgraph disconnected {
ulabel = "Disconnected"
ubgcolor = red
u"%s"u
u}
N(uwriteuadjacency_listuitemsulenuappenduNoneuname(uselfufuskip_disconnectedudisconnectedudistuadjsuotherulabel((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuto_dot\s&	
	%



uDependencyGraph.to_dotcsg}i}x1|jj�D] \}}|dd�||<qWx�g�xGt|j��dd�D])\}}|sf�j|�||=qfqfW�s�Pnx7|j�D])\}}�fdd�|D�||<q�Wtjddd��D��|j��qC|t|j��fS(ua
        Perform a topological sort of the graph.
        :return: A tuple, the first element of which is a topologically sorted
                 list of distributions, and the second element of which is a
                 list of distributions that cannot be sorted because they have
                 circular dependencies and so form a cycle.
        Ncs.g|]$\}}|�kr||f�qS(((u.0udur(u	to_remove(u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu
<listcomp>�s	u4DependencyGraph.topological_sort.<locals>.<listcomp>uMoving to result: %scSs&g|]}d|j|jf�qS(u%s (%s)(unameuversion(u.0ud((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu
<listcomp>�s	(uadjacency_listuitemsulistuappenduloggerudebuguextendukeys(uselfuresultualistukuv((u	to_removeu5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyutopological_sort|s$)
!	u DependencyGraph.topological_sortcCsIg}x3|jj�D]"\}}|j|j|��qWdj|�S(uRepresentation of the graphu
(uadjacency_listuitemsuappendu	repr_nodeujoin(uselfuoutputudistuadjs((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu__repr__�suDependencyGraph.__repr__NT(u__name__u
__module__u__qualname__u__doc__u__init__uadd_distributionuNoneuadd_edgeuadd_missingu
_repr_distu	repr_nodeuTrueuto_dotutopological_sortu__repr__(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuDependencyGraphs

 uDependencyGraphudefaultcCs�t|�}t�}i}xv|D]n}|j|�xX|jD]M}t|�\}}tjd|||�|j|g�j||f�q?Wq"Wx7|D]/}|j	|j
B|jB|jB}x|D]}	y|j
|	�}
WnAtk
r"tjd|	�|	j�d}|j
|�}
YnX|
j}d}||kr�xl||D]]\}}y|
j|�}
Wntk
r�d}
YnX|
rI|j|||	�d}PqIqIWn|s�|j||	�q�q�Wq�W|S(u6Makes a dependency graph from the given distributions.

    :parameter dists: a list of distributions
    :type dists: list of :class:`distutils2.database.InstalledDistribution` and
                 :class:`distutils2.database.EggInfoDistribution` instances
    :rtype: a :class:`DependencyGraph` instance
    uAdd to provided: %s, %s, %su+could not read version %r - using name onlyiFT(u
get_schemeuDependencyGraphuadd_distributionuprovidesuparse_name_and_versionuloggerudebugu
setdefaultuappendurun_requiresu
meta_requiresubuild_requiresudev_requiresumatcheruUnsupportedVersionErroruwarningusplitukeyuFalseumatchuadd_edgeuTrueuadd_missing(udistsuschemeugraphuprovidedudistupunameuversionurequiresurequmatcherumatcheduproviderumatch((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu
make_graph�sD	

'


		
u
make_graphcCs�||kr"td|j��nt|�}|g}|j|}xW|r�|j�}|j|�x1|j|D]"}||krt|j|�qtqtWqGW|jd�|S(u�Recursively generate a list of distributions from *dists* that are
    dependent on *dist*.

    :param dists: a list of distributions
    :param dist: a distribution, member of *dists* for which we are interested
    u1given distribution %r is not a member of the listi(uDistlibExceptionunameu
make_graphureverse_listupopuappend(udistsudistugraphudeputodoudusucc((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuget_dependent_dists�s	
	

uget_dependent_distscCs�||kr"td|j��nt|�}g}|j|}x[|r�|j�d}|j|�x1|j|D]"}||kru|j|�ququWqDW|S(u�Recursively generate a list of distributions from *dists* that are
    required by *dist*.

    :param dists: a list of distributions
    :param dist: a distribution, member of *dists* for which we are interested
    u1given distribution %r is not a member of the listi(uDistlibExceptionunameu
make_graphuadjacency_listupopuappend(udistsudistugraphurequtodoudupred((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyuget_required_dists�s
	
uget_required_distscKsI|jdd�}t|�}||_||_|p9d|_t|�S(uO
    A convenience method for making a dist given just a name and version.
    usummaryuPlaceholder for summaryuPlaeholder for summary(upopuMetadataunameuversionusummaryuDistribution(unameuversionukwargsusummaryumd((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu	make_dists		u	make_dist(5u__doc__u
__future__uunicode_literalsubase64ucodecsu
contextlibuhashlibulogginguosu	posixpathusysu	zipimportuuDistlibExceptionu	resourcesucompatuStringIOuversionu
get_schemeuUnsupportedVersionErrorumetadatauMetadatauMETADATA_FILENAMEuutiluparse_requirementucached_propertyuparse_name_and_versionuread_exportsu
write_exportsu	CSVReaderu	CSVWriteru__all__u	getLoggeru__name__uloggeruEXPORTS_FILENAMEuCOMMANDS_FILENAMEu
DIST_FILESuDISTINFO_EXTuobjectu_CacheuDistributionPathuDistributionuBaseInstalledDistributionuInstalledDistributionuEggInfoDistributionunew_dist_classuold_dist_classuDependencyGraphu
make_graphuget_dependent_distsuget_required_distsu	make_dist(((u5/tmp/pip-zej_zi-build/pip/_vendor/distlib/database.pyu<module>sL4	��7�C��6site-packages/pip/_vendor/distlib/__pycache__/index.cpython-33.pyc000064400000051447151733463550021133 0ustar00�
7�ReLc@sddlZddlZddlZddlZddlZddlZyddlmZWn"ek
r�ddl	mZYnXddl
mZddlm
Z
mZmZmZmZmZddlmZmZmZeje�ZdZdZGd	d
�d
e�ZdS(iN(uThreadi(uDistlibException(uHTTPBasicAuthHandleruRequestuHTTPPasswordMgruurlparseubuild_openerustring_types(ucached_propertyuzip_diruServerProxyuhttps://pypi.python.org/pypiupypicBs|EeZdZdZdZd)dd�Zdd�Zdd�Zd	d
�Z	dd�Z
d
d�Zdd�Zdd�Z
d)dd�Zdd�Zd)d)dddd�Zdd�Zdd�Zdd �Zd)d)d!d"�Zd#d$�Zd%d&�Zd)d'd(�Zd)S(*uPackageIndexuc
    This class represents a package index compatible with PyPI, the Python
    Package Index.
    s.----------ThIs_Is_tHe_distlib_index_bouNdaRY_$cCs|p	t|_|j�t|j�\}}}}}}|sX|sX|sX|dkrntd|j��nd|_d|_d|_d|_	d|_
ttj
d��k}xad
D]Y}	y>tj|	dgd|d	|�}
|
d
kr�|	|_PnWq�tk
rYq�Xq�WWdQXdS(u�
        Initialise an instance.

        :param url: The URL of the index. If not specified, the URL for PyPI is
                    used.
        uhttpuhttpsuinvalid repository: %suwugpg2ugpgu	--versionustdoutustderriN(uhttpuhttps(ugpg2ugpg(u
DEFAULT_INDEXuurluread_configurationuurlparseuDistlibExceptionuNoneupassword_handlerussl_verifierugpgugpg_homeu	rpc_proxyuopenuosudevnullu
subprocessu
check_calluOSError(uselfuurluschemeunetlocupathuparamsuqueryufragusinkusurc((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/index.pyu__init__$s(
!					
		
uPackageIndex.__init__cCs3ddlm}ddlm}|�}||�S(us
        Get the distutils command for interacting with PyPI configurations.
        :return: the command.
        i(uDistribution(u
PyPIRCCommand(udistutils.coreuDistributionudistutils.configu
PyPIRCCommand(uselfuDistributionu
PyPIRCCommandud((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/index.pyu_get_pypirc_command@s	u PackageIndex._get_pypirc_commandcCsy|j�}|j|_|j�}|jd�|_|jd�|_|jdd�|_|jd|j�|_dS(u�
        Read the PyPI access configuration as supported by distutils, getting
        PyPI to do the acutal work. This populates ``username``, ``password``,
        ``realm`` and ``url`` attributes from the configuration.
        uusernameupasswordurealmupypiu
repositoryN(u_get_pypirc_commanduurlu
repositoryu_read_pypircugetuusernameupasswordurealm(uselfucucfg((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/index.pyuread_configurationJsuPackageIndex.read_configurationcCs0|j�|j�}|j|j|j�dS(u�
        Save the PyPI access configuration. You must have set ``username`` and
        ``password`` attributes before calling this method.

        Again, distutils is used to do the actual work.
        N(ucheck_credentialsu_get_pypirc_commandu
_store_pypircuusernameupassword(uselfuc((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/index.pyusave_configurationYs
uPackageIndex.save_configurationcCs�|jdks|jdkr-td��nt�}t|j�\}}}}}}|j|j||j|j�t	|�|_
dS(up
        Check that ``username`` and ``password`` have been set, and raise an
        exception if not.
        u!username and password must be setN(uusernameuNoneupassworduDistlibExceptionuHTTPPasswordMgruurlparseuurluadd_passwordurealmuHTTPBasicAuthHandlerupassword_handler(uselfupmu_unetloc((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/index.pyucheck_credentialses	!uPackageIndex.check_credentialscCs�|j�|j�|j�}d|d<|j|j�g�}|j|�}d|d<|j|j�g�}|j|�S(uq
        Register a distribution on PyPI, using the provided metadata.

        :param metadata: A :class:`Metadata` instance defining at least a name
                         and version number for the distribution to be
                         registered.
        :return: The HTTP response received from PyPI upon submission of the
                request.
        uverifyu:actionusubmit(ucheck_credentialsuvalidateutodictuencode_requestuitemsusend_request(uselfumetadataudurequesturesponse((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/index.pyuregisterqs




uPackageIndex.registercCscxR|j�}|sPn|jd�j�}|j|�tjd||f�q|j�dS(ur
        Thread runner for reading lines of from a subprocess into a buffer.

        :param name: The logical name of the stream (used for logging only).
        :param stream: The stream to read from. This will typically a pipe
                       connected to the output stream of a subprocess.
        :param outbuf: The list to append the read lines to.
        uutf-8u%s: %sN(ureadlineudecodeurstripuappenduloggerudebuguclose(uselfunameustreamuoutbufus((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/index.pyu_reader�s	
uPackageIndex._readercCs�|jdddg}|jr7|jd|jg�n|dk	r\|jdddg�ntj�}tjj|tjj	|�d�}|jd	d
d|d||g�t
jd
dj|��||fS(u�
        Return a suitable command for signing a file.

        :param filename: The pathname to the file to be signed.
        :param signer: The identifier of the signer of the file.
        :param sign_password: The passphrase for the signer's
                              private key used for signing.
        :return: The signing command as a list suitable to be
                 passed to :class:`subprocess.Popen`.
        u--status-fdu2u--no-ttyu	--homediru--batchu--passphrase-fdu0u.ascu
--detach-signu--armoru--local-useru--outputuinvoking: %su N(ugpgugpg_homeuextenduNoneutempfileumkdtempuosupathujoinubasenameuloggerudebug(uselfufilenameusigneru
sign_passworducmdutdusf((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/index.pyuget_sign_command�s	%uPackageIndex.get_sign_commandc	Cs
itjd6tjd6}|dk	r6tj|d<ng}g}tj||�}td|jdd|j|f�}|j�td|jdd|j|f�}|j�|dk	r�|j	j
|�|j	j�n|j�|j
�|j
�|j||fS(u�
        Run a command in a child process , passing it any input data specified.

        :param cmd: The command to run.
        :param input_data: If specified, this must be a byte string containing
                           data to be sent to the child process.
        :return: A tuple consisting of the subprocess' exit code, a list of
                 lines read from the subprocess' ``stdout``, and a list of
                 lines read from the subprocess' ``stderr``.
        ustdoutustderrustdinutargetuargsN(u
subprocessuPIPEuNoneuPopenuThreadu_readerustdoutustartustderrustdinuwriteucloseuwaitujoinu
returncode(	uselfucmdu
input_dataukwargsustdoutustderruput1ut2((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/index.pyurun_command�s&

$
$



uPackageIndex.run_commandc	Csb|j|||�\}}|j||jd��\}}}|dkr^td|��n|S(u}
        Sign a file.

        :param filename: The pathname to the file to be signed.
        :param signer: The identifier of the signer of the file.
        :param sign_password: The passphrase for the signer's
                              private key used for signing.
        :return: The absolute pathname of the file where the signature is
                 stored.
        uutf-8iu&sign command failed with error code %s(uget_sign_commandurun_commanduencodeuDistlibException(	uselfufilenameusigneru
sign_passworducmdusig_fileurcustdoutustderr((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/index.pyu	sign_file�s	
uPackageIndex.sign_fileusdistusourcecCs�|j�tjj|�s/td|��n|j�|j�}d}|r�|jsjt	j
d�q�|j|||�}nt|d��}	|	j
�}
WdQXtj|
�j�}tj|
�j�}|jidd6dd6|d	6|d
6|d6|d6�d
tjj|�|
fg}
|r�t|d��}	|	j
�}WdQX|
jdtjj|�|f�tjtjj|��n|j|j�|
�}|j|�S(u�
        Upload a release file to the index.

        :param metadata: A :class:`Metadata` instance defining at least a name
                         and version number for the file to be uploaded.
        :param filename: The pathname of the file to be uploaded.
        :param signer: The identifier of the signer of the file.
        :param sign_password: The passphrase for the signer's
                              private key used for signing.
        :param filetype: The type of the file being uploaded. This is the
                        distutils command which produced that file, e.g.
                        ``sdist`` or ``bdist_wheel``.
        :param pyversion: The version of Python which the release relates
                          to. For code compatible with any Python, this would
                          be ``source``, otherwise it would be e.g. ``3.2``.
        :return: The HTTP response received from PyPI upon submission of the
                request.
        u
not found: %su)no signing program available - not signedurbNufile_uploadu:actionu1uprotcol_versionufiletypeu	pyversionu
md5_digestu
sha256_digestucontentu
gpg_signature(ucheck_credentialsuosupathuexistsuDistlibExceptionuvalidateutodictuNoneugpguloggeruwarningu	sign_fileuopenureaduhashlibumd5u	hexdigestusha256uupdateubasenameuappendushutilurmtreeudirnameuencode_requestuitemsusend_request(uselfumetadataufilenameusigneru
sign_passwordufiletypeu	pyversionudusig_fileufu	file_datau
md5_digestu
sha256_digestufilesusig_dataurequest((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/index.pyuupload_file�s<

		
uPackageIndex.upload_filec
Cs�|j�tjj|�s/td|��ntjj|d�}tjj|�sitd|��n|j�|j|j	}}t
|�j�}d	d|fd|fg}d||fg}|j||�}	|j
|	�S(
u2
        Upload documentation to the index.

        :param metadata: A :class:`Metadata` instance defining at least a name
                         and version number for the documentation to be
                         uploaded.
        :param doc_dir: The pathname of the directory which contains the
                        documentation. This should be the directory that
                        contains the ``index.html`` for the documentation.
        :return: The HTTP response received from PyPI upon submission of the
                request.
        unot a directory: %ru
index.htmlu
not found: %ru:actionu
doc_uploadunameuversionucontent(u:actionu
doc_upload(ucheck_credentialsuosupathuisdiruDistlibExceptionujoinuexistsuvalidateunameuversionuzip_dirugetvalueuencode_requestusend_request(
uselfumetadataudoc_dirufnunameuversionuzip_dataufieldsufilesurequest((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/index.pyuupload_documentations

u!PackageIndex.upload_documentationcCsj|jdddg}|jr7|jd|jg�n|jd||g�tjddj|��|S(u�
        Return a suitable command for verifying a file.

        :param signature_filename: The pathname to the file containing the
                                   signature.
        :param data_filename: The pathname to the file containing the
                              signed data.
        :return: The verifying command as a list suitable to be
                 passed to :class:`subprocess.Popen`.
        u--status-fdu2u--no-ttyu	--homediru--verifyuinvoking: %su (ugpgugpg_homeuextenduloggerudebugujoin(uselfusignature_filenameu
data_filenameucmd((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/index.pyuget_verify_command5s	uPackageIndex.get_verify_commandcCsk|jstd��n|j||�}|j|�\}}}|dkratd|��n|dkS(u\
        Verify a signature for a file.

        :param signature_filename: The pathname to the file containing the
                                   signature.
        :param data_filename: The pathname to the file containing the
                              signed data.
        :return: True if the signature was verified, else False.
        u0verification unavailable because gpg unavailableiiu(verify command failed with error code %s(ii(ugpguDistlibExceptionuget_verify_commandurun_command(uselfusignature_filenameu
data_filenameucmdurcustdoutustderr((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/index.pyuverify_signatureGs
	
uPackageIndex.verify_signaturecCs|d
kr"d
}tjd�nMt|ttf�rF|\}}nd}tt|��}tjd|�t|d���}|j	t
|��}z�|j�}	d}
d}d}d}
d|	kr�t|	d	�}n|r�||
|
|�nxr|j
|
�}|sPn|t|�7}|j|�|rD|j|�n|
d7}
|r�||
|
|�q�q�Wd
|j�XWd
QX|dkr�||kr�td||f��n|r|j�}||kr�td||||f��ntjd
|�nd
S(u
        This is a convenience method for downloading a file from an URL.
        Normally, this will be a file from the index, though currently
        no check is made for this (i.e. a file can be downloaded from
        anywhere).

        The method is just like the :func:`urlretrieve` function in the
        standard library, except that it allows digest computation to be
        done during download and checking that the downloaded data
        matched any expected value.

        :param url: The URL of the file to be downloaded (assumed to be
                    available via an HTTP GET request).
        :param destfile: The pathname where the downloaded file is to be
                         saved.
        :param digest: If specified, this must be a (hasher, value)
                       tuple, where hasher is the algorithm used (e.g.
                       ``'md5'``) and ``value`` is the expected value.
        :param reporthook: The same as for :func:`urlretrieve` in the
                           standard library.
        uNo digest specifiedumd5uDigest specified: %suwbi iiucontent-lengthuContent-LengthNu1retrieval incomplete: got only %d out of %d bytesu.%s digest mismatch for %s: expected %s, got %suDigest verified: %si����(uNoneuloggerudebugu
isinstanceulistutupleugetattruhashlibuopenusend_requestuRequestuinfouintureadulenuwriteuupdateucloseuDistlibExceptionu	hexdigest(uselfuurludestfileudigestu
reporthookudigesteruhasherudfpusfpuheadersu	blocksizeusizeureadublocknumublockuactual((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/index.pyu
download_file[sV

uPackageIndex.download_filecCsWg}|jr"|j|j�n|jr>|j|j�nt|�}|j|�S(u�
        Send a standard library :class:`Request` to PyPI and return its
        response.

        :param req: The request to send.
        :return: The HTTP response from PyPI (a standard library HTTPResponse).
        (upassword_handleruappendussl_verifierubuild_openeruopen(uselfurequhandlersuopener((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/index.pyusend_request�s		uPackageIndex.send_requestcCs<g}|j}xy|D]q\}}t|ttf�sC|g}nxA|D]9}|jd|d|jd�d|jd�f�qJWqWxG|D]?\}}	}
|jd|d||	fjd�d|
f�q�W|jd|ddf�dj|�}d|}i|d6tt|��d	6}
t	|j
||
�S(
u&
        Encode fields and files for posting to an HTTP server.

        :param fields: The fields to send as a list of (fieldname, value)
                       tuples.
        :param files: The files to send as a list of (fieldname, filename,
                      file_bytes) tuple.
        s--u)Content-Disposition: form-data; name="%s"uutf-8su8Content-Disposition: form-data; name="%s"; filename="%s"s
smultipart/form-data; boundary=uContent-typeuContent-length(uboundaryu
isinstanceulistutupleuextenduencodeujoinustrulenuRequestuurl(uselfufieldsufilesupartsuboundaryukuvaluesuvukeyufilenameuvalueubodyuctuheaders((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/index.pyuencode_request�s4	


uPackageIndex.encode_requestcCsbt|t�ri|d6}n|jdkrIt|jdd�|_n|jj||p^d�S(Nunameutimeoutg@uand(u
isinstanceustring_typesu	rpc_proxyuNoneuServerProxyuurlusearch(uselfutermsuoperator((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/index.pyusearch�s
uPackageIndex.searchN(u__name__u
__module__u__qualname__u__doc__uboundaryuNoneu__init__u_get_pypirc_commanduread_configurationusave_configurationucheck_credentialsuregisteru_readeruget_sign_commandurun_commandu	sign_fileuupload_fileuupload_documentationuget_verify_commanduverify_signatureu
download_fileusend_requestuencode_requestusearch(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/index.pyuPackageIndexs*
#4M+uPackageIndex(uhashlibulogginguosushutilu
subprocessutempfileu	threadinguThreaduImportErrorudummy_threadinguuDistlibExceptionucompatuHTTPBasicAuthHandleruRequestuHTTPPasswordMgruurlparseubuild_openerustring_typesuutilucached_propertyuzip_diruServerProxyu	getLoggeru__name__uloggeru
DEFAULT_INDEXu
DEFAULT_REALMuobjectuPackageIndex(((u2/tmp/pip-zej_zi-build/pip/_vendor/distlib/index.pyu<module>s 
.site-packages/pip/_vendor/distlib/w32.exe000064400000252000151733463550014273 0ustar00MZ����@���	�!�L�!This program cannot be run in DOS mode.

$�4�m�U�>�U�>�U�>+>�U�>�->�U�>�->�U�>�->�U�>�->�U�>�U�>�U�>�->�U�>�->�U�>�->�U�>Rich�U�>PEL1�R�	���'�@�2�@���(0�P�D	��H�@�H.textڹ� `.rdata2#�$�@@.data�,�@�.rsrc�P0R�@@.reloc�D@BVh��@�<�@��pA��u��t7h��@V�8�@�pA��th�jhh�@�t$j��^�V��@3�^�U����A3ʼnE��}u4�EP�u������h�hP��/������P�h�����j��@�M�3��y�ËL$W3��F��0P��APQ�����t��A�	;u���H�D$+��D0���}̋�_�U���(Wh�@�E�3�hhAP�}��}��
3�;���h �@Q�/���jW�u��4�u��4�E�������$;ljE�}�}�SVW�u��u��	�u��Sj�u�D�u���5����� ;�tj��Y�}��}+�E����~�V�
�E�E��;�Y�E�}�}�W�u��u���u�Vj�u����u��������3�����h<�@P�f�����+]�j]�Y�u�}�����}��,�+u�+u�+�y3�jV�u��:�u�SjW�|��3�;����h`�@P�	�����$�D>�^[�f��|�@f;tH;�s���E�u����E�Y_��V���@�&jjjVP�t$P�H�@��u�4�@��uF��^Ã|$u�lA��t	jP��@3�@�U�����SVW3�WW�,�@�؍D$Pjp�D$pPj	S�(�@��t�|$pu3�@�3�h��@P�9�����$�0YYjp�D$lPj	S��@h��@P����jD^V�D$,WP�S���t$ �50�@j���P�D$\�����$��@P����YYj���P�D$`���$��@P���YYj��P�D$d�����$��@P���YYjh�@�D$T�@�@�D$P�D$$PWWWjWW�uW�$�@�uh�@P�`����D$$���t$�lAS��@�t$�L�@j��t$��@�D$P�t$� �@h8�@P����YY�t$��@�U��$p������A3ʼn��SVW��@�8"t� �@�"@��QP�3�YY;�u	�E��@��p���P��Y��tF���u�u�h�hAVW�D�@�=hA"t�u��	H�E�iAH�]���E�P��AP������3�;����$\�@P�M���Y��Y��;�s���
t��
tA;�r����3�����ht�@P����YY���P�Y��tF�>u�3��>#h��@��P���YY���P��Y��tF���u�3��>!h��@��P���YY���P�Y��tF���u�ƍP�@��u�+‹��ÍH�@��u�+��ȋE��P�@��u�+���|8jW�4��3�����h�@P�T����u��u�Vh8�@WWS�W��,S�����%����;
Au���Z��U��W��W�T�@�u�P�@�����`�w��t�_]Ë�U���n�u��5A�h��Ѓ�]Ë�U��h��@�P�@��th��@P�8�@��t�u��]Ë�U��u����Y�u��@�j�Y�j��YË�U��V������t�Ѓ�;ur�^]Ë�U��V�u3����u���t�у�;ur�^]Ë�U��=�,Ath�,A�Y��t
�u��,AY��hh�@hP�@���YY��uBh5@�e�H�@�$L�@�c����=�,AYth�,A�\Y��tjjj��,A3�]�jh�@�j��Y�e�3�C90A���,A�E�(A�}���5�,A�Y���}؅�tx�5�,A�Y��u܉}�u���u�;�rW��9t�;�rJ�6���������5�,A�����5�,A���9}�u9E�t�}�}؉E��u܋}��hx�@�l�@�_���Yh��@�|�@�O���Y�E�������}u(�0Aj�Y�u���3�C�}tj��Y��!Ë�U��jj�u������]Ë�U��jj�u�����]�jjj������jjj�����Ë�V����V�#V�B#V�V�'#V�#V� V�V�|h�@�2��$�A^Ë�U��EPj�u�u�u�u��%��]Ë�U��EV���F��uc��F�Hl��Hh�N�;
�	At�
�A�Hpu�80��F;�At�F�
�A�Hpu�(�F�F�@pu�Hp�F�
���@�F��^]���U����u�M��f����E�~�E�Pj�u�:0�������M�H���}�t�M��ap���U��=0Au�E�
�	A�A��]�j�u���YY]�jh �@��u��tu�=�,AuCj��Y�e�V�0Y�E�t	VP��0YY�E�������}�u7�u�
j��Y�Vj�5TA�X�@��u�Y��4�@P�	�Y���U��Q�e�V�E�P�u�u��:�����u9E�t���t
��M����^��jh@�@�B�e��u;5�,Aw"j�Y�e�V�7Y�E��E������	�E��N�j�	YË�U��V�u�����SW�=\�@�=TAu�j�Rh�����YY��,A��u��t���3�@P���uV�S���Y��u��uF�����Vj�5TA�׋؅�u.j^9\At�u� Y��t�u�{�����0��0_��[�V� Y���3�^]�����̍B�[Í�$�d$3��D$S����T$��t�
��:�tτ�tQ��u��W���V؋
����~����3������3�3ƃ����u%�t�%u���u�^_[3�ËB�:�t6��t�:�t'��t��:�t��t�:�t��t��^_�B�[ÍB�^_[ÍB�^_[ÍB�^_[��̋D$S��tR�T$3ۊ\$��t�
��2�tr��t2��u��rW����ߋ�����_��t�
��2�t@��u�[�r�
3˿���~���3σ����t�J�2�t#2�t��2�t2�t��_�B�[ÍB�_[ÍB�_[ÍB�_[�jh`�@�3ۉ]�3��};���;�u�C�SSSSS����3��y3��u;���;�t�3�8��;�t��n=�E;�u
���ʉ]�8u ���j��E�PhA�p>���P�uVW�_:���E��E������	�E��?�u��9YË�U��VW�}3�;�u�j_VVVVV�8������$h��u�u�������;�t3���V�_^]Ë�U����MS�]VW3��M��]�9}t!9}t;�u�$WWWW�W���3�_^[�Ëu;�t
��3�u9Ev!���tSWQ�uG��;�t���3�u9Ew��}�}�F�}��t�F�E���E������FtD�F��t=�5��;�r��;}���W�6�u��u��{F)~>}�+߃�)}��}��;]�rh�}�t����3�;�v	���u����u��+������;�w��;E���P�u�V��EYP��D�����������E�+�)E��(V��=Y������}�tN�M��E���FK�M��E�������E���3��}�t�uV�u�/F���VVVV�"V�r����}�t�uj�u�F���p�"3�PPPPP�E����N ��+�3�u�=����N��jh��@�3��u�9ut79ut29uu5�}�t�uV�u�E����VVVVV���3���u�6Y�u��u�u�u�u�u������E��E�������E���u��6YË�U��u�u�uj��u�R�����]Ë�U���SW�}3�;�u �{SSSSS�������fW�/D9_Y�E�}�_jSP�H��;ÉE�|ӋW��u+G�.��OV��+�u��tA�U��u������A�����D2�t��;�s��:
u�E�3�B;�r�9]�u�E�����x������G���W;�u�]���]��u�+��������A�E����D0�tyjj�u��EG��;E�u �G�M��	�8
u�E@;�r�G �@j�u��u��G����}���:�9Ew�O��t��t�G�E��D0t�E�E)E��E�M��^_[��jh��@�63�3�9u��;�u���VVVVV�_�����'�u�p4Y�u��u����Y�E��E������	�E��$�u�4YË�U��V�u�F��u�s����g���}�FuV����E�eYV��F�FY��y��F��t�t�u�F�u�uV��AYP��E3Ƀ������I��^]�jh��@�>3�3�9u��;�u���VVVVV�g�����>�};�t
��t��u�u�g3Y�u�W�u�u�������E��E������	�E���u�3Y�U��SV�uW3���;�u�`WWWWW���
����B�F�t7V��EV����HV�AP�H����}����F;�t
P�@���Y�~�~��_^[]�jh��@�B�M�3��u3�;���;�u��
�WWWWW�e
������F@t�~�E��E�V�f2Y�}�V�*���Y�E��E�������ՋuV�2YË�U��=<Au��	�u�9h���YY]�jXh�@�3��u��E�P�`�@j�_�}��MZf9@u8�<@��@PEu'�f9�@u��t@v3�9��@���M���u�3�CS�$Y��uj�X���Y���uj�G���Y�N�]���@��}j��Y��@��,A�]K�4A�J��}j��Y�H��}j	�~�YS�6�Y;�tP�l�Y�G�]�t�M��j
YQPVh@���E�9u�uP�����}��5�E��	�M�PQ�YYËe�E܉E�}�uP�����E������E��3�@Ëe��E��������q���K�x�����U���(�HA�
DA�@A�<A�58A�=4Af�`Af�
TAf�0Af�,Af�%(Af�-$A��XA�E�LA�E�PA�E�\A������A�PA�LA�@A	��DA�A������A������p�@��Aj�KYj�l�@h��@�h�@�=�Auj�kKYh	���@P�d�@�Ë�U��V�5 A�5t�@�օ�t!�A���tP�5 A��Ѕ�t����'���@V�P�@��uV�Q�Y��th��@P�8�@��t�u�ЉE�E^]�j���YË�U��V�5 A�5t�@�օ�t!�A���tP�5 A��Ѕ�t����'���@V�P�@��uV���Y��th�@P�8�@��t�u�ЉE�E^]�x�@���V�5 A�t�@��u�5hA�e���Y��V�5 A�|�@��^áA���tP�5pA�;���Y�Ѓ
A�� A���tP���@�
 A��ejh(�@����@V�P�@��uV��Y�E�u�F\�@3�G�~��t$h��@P�8�@�Ӊ��h�@�u�Ӊ���~pƆ�CƆKC�Fh�Aj
�Y�e��vh���@�E������>j�Y�}��E�Fl��u��	A�Fl�vl��Y�E�������+�3�G�uj
��Y�j��YË�VW�4�@�5A������Ћ�uNhj�*I��YY��t:V�5A�5lA���Y�Ѕ�tjV����YY���@�N���	V�G�Y3�W���@_��^Ë�V������uj���Y��^�jhP�@�.�u�����F$��tP��Y�F,��tP���Y�F4��tP���Y�F<��tP���Y�F@��tP���Y�FD��tP��Y�FH��tP��Y�F\=�@tP��Yj
�Y�e��~h��tW���@��u���AtW�h�Y�E������Wj�RY�E��~l��t#W��Y;=�	At���At�?uW��Y�E������V��Y�k
��uj
�!YËuj�YË�VW���@V�P�@��uV�v�Y�����^�58�@h8�@W��h,�@W�dA��h �@W�hA��h�@W�lA�փ=dA�5|�@�pAt�=hAt
�=lAt��u$�t�@�hA���@�dA�)@�5lA�pA�x�@� A������5hAP�օ������5dA�����5hA�dA�����5lA�hA���5pA�lA������pA�W��tehv+@�5dA�=���Y�УA���tHhj�LF��YY��t4V�5A�5lA�
���Y�Ѕ�tjV���YY���@�N��3�@����3�_^Ë�U��QQS�]VW3�3��}�;�(At	G�}���r��wj�IY���4j��IY��u
�=A�����Ah��@�S�xAW�NI����t
VVVVV���h��AVj��A�D�@��u&h��@h�V�I����t3�PPPPP����V�eH@Y��<v8V�XH��;�j��Ah��@+�QP�}G����t3�VVVVV����3�h��@SW��F����t
VVVVV�k���E��4�,ASW�F����t
VVVVV�F��h h��@W�1E���2j�0�@��;�t$���tj�E�P�4�,A�6�GYP�6S���@_^[��j�HY��tj�rHY��u�=Auh��)���h�����YYË�VW3���A�<��Au���A�8h��0���CYY��tF��$|�3�@_^Ã$��A3���S���@V��AW�>��t�~t
W��W���&Y����A|ܾ�A_���t	�~uP�Ӄ���A|�^[Ë�U��E�4��A���@]�jhx�@��3�G�}�3�9TAu���j�;���h���YY�u�4��A9t���nj��BY��;�u�<�3��Qj
�YY�]�9u,h�W�:YY��uW�<�Y���]���>�W�!�Y�E������	�E��m�j
�(���YË�U��EV�4��A�>uP�"���Y��uj��Y�6���@^]Ë�U��E��A]Ë�U���(�A3ʼnE������SjL�����jP��4�������(�����0�������,��������������������������������f������f����f�����f�����f������f�����������E�MDž0�����������I�����Dž����Dž��������p�@j��l�@��(���P�h�@��u��uj�AYh���@P�d�@�M�3�[�,��Ë�U��5�A����Y��t]��j��@Y]�����U��E3�;�AtA��-r�H�wj
X]Ë�A]�D���jY;��#���]��z�����u�hAÃ���g�����u�lAÃ�Ë�U��V����MQ����Y������0^]Ë�U��QSVW�5�,A�O����5�,A���}��?�����YY;�����+ߍC��rwW�D���CY;�sH�;�s���;�rP�u��q@YY��u�G;�r@P�u��[@YY��t1��P�4��Z�Y��,A�u�L���V�A�Y��,A�EY�3�_^[�Ë�Vjj ��?��V�����,A��,A��ujX^Ã&3�^�jh��@��(��e��u���Y�E��E������	�E��(���Ë�U��u��������YH]Ë�V���@���@W��;�s���t�Ѓ�;�r�_^Ë�V���@���@W��;�s���t�Ѓ�;�r�_^Ë�VW3���pA�6�K��Y���(r�_^��������̋�U��M�MZf9t3�]ËA<��8PEu�3ҹf9H�‹�]�����������̋�U��E�H<��ASV�q3�W�D��v�}�H;�r	�X�;�r
B��(;�r�3�_^[]������������̋�U��j�h��@h7@d�P��SVW�A1E�3�P�E�d��e��E�h@�*�������tU�E-@Ph@�P�������t;�@$���Ѓ��E������M�d�
Y_^[��]ËE��3�=��‹�Ëe��E�����3��M�d�
Y_^[��]����h7@d�5�D$�l$�l$+�SVW�A1E�3�P�e�u��E��E������E��E�d�ËM�d�
Y__^[��]Q�������̋�U���S�]V�s35AW��E��E��{���t
�N�38�����N�F�38�����E�@f��M�U�S��[�E�M��t_�I�[�L��D��E��E���t���P&�E���|@G�E��؃��u΀}�t$����t
�N�38�Z���N�V�3:�J���E�_^[��]��E��ɋM�9csm�u)�=�,At h�,A�������t�UjR��,A���M��%�E9XthAW�Ӌ��%�E�M��H����t
�N�38�����N�V�3:����E�H���%�����9S�R���hAW���%����jh��@������@x��t�e����3�@Ëe��E������@�!����h�8@��Y��A�Ë�U��QQV�����F�V\��AW�}��S99t��k����;�r�k��;�s99u���3���t
�X�]���u3����u�`3�@�������N`�M��M�N`�H�����
�A�=�A���;�}$k��~\�d9�=�A��AB߃�;�|�]���~d=��u	�Fd��^=��u	�Fd��N=��u	�Fd��>=��u	�Fd��.=��u	�Fd��=��u	�Fd��=��u�Fd��vdj��Y�~d��`Q�ӋE�Y�F`��[_^�Ë�U��E��A��A��A��A]Ë�U��E�
�AV9Pt��k�u��;�r�k�M^;�s9Pt3�]�5�A�i�Y�j h��@���3��}�}؋]��Lt��jY+�t"+�t+�td+�uD����}؅�u���a��A��A�`�w\���]��������Z�Ã�t<��t+Ht�?����3�PPPPP������뮾�A��A���A��A�
��A��A�E�P���E�Y3��}���9E�uj�d��9E�tP����Y3��E���t
��t��u�O`�MԉG`��u@�Od�M��Gd���u.�
�A�M܋
�A��A�9M�}�M�k��W\�D�E����
���E��������u�wdS�U�Y��]�}؃}�tj��Y�S�U�Y��t
��t��u�EԉG`��u�EЉGd3����Ë�U��E��A]Ë�U��E�A]Ë�U��E�A]�jh�@�����e��u�u���@�E��/�E���E�3�=�����Ëe�}��uj���@�e��E������E�����Ë�U��E�A]Ë�U��5A��Y��t�u��Y��t3�@]�3�]Ë�U��QV�uV�)�E�FY��u�'����	�N ���/�@t
�����"��S3ۨt�^����N���F�F�����F�^�]��u,��� ;�t���@;�u
�u�EJY��uV��IY�FW���F�>�H��N+�I;��N~WP�u��H���E��M�� �F���y�M���t���t�����������A��P
A�@ tjSSQ�N@#ƒ����t%�F�M��3�GW�EP�u�vH���E�9}�t	�N ����E%�_[^�Ë�U��� S3�9]u ���SSSSS��V�����V�uW�};�t!;�u��SSSSS��&�����j�����E�;�w�}�u�E�u�E�B�u�u�P�u�U���E;�t4;�|"�M�x�E���E�PS���YY���t�E�3�9]�\>���HH_^[�Ë�U��QS3�9]u ��SSSSS��������V�uW9]u;�u9]u3��;�t�};�w������u�u�u;}v-�8�E@PVh��@��������uL��8"ue�x�8�\�WVh��@�E�������\>����u�}�u�L�8"u/�B�M���#;�}"����u�+��"SSSSS�����_^[�Ë�U��uj�u�u�u�u������]�-�t"��t��
tHt3�øøøøË�VW��h3��FWP�6&3��ȋ��~�~�~����~�����A���F+ο��@Ou������@Nu�_^Ë�U����A3ʼnE�SW����P�v���@�����3�������@;�r���ƅ���� ��t.�������;�w+�@P��
����j R�s%��C�C��u�j�v�������vPW������Pjj�W[3�S�v������WPW������PW�vS�8Y��DS�v������WPW������Ph�vS�Y��$3���E������t�L���������t�L ���������Ƅ@;�r��V��Dž������3�)���������ЍZ ��w�L�р� ���w�L �р� ���A;�r‹M�_3�[�����jh8�@�
�������A�Gpt�lt�wh��uj ���Y���"��j
��Y�e��wh�u�;5�At6��tV���@��u���AtV���Y��A�Gh�5�A�u�V���@�E������뎋u�j
�|�YË�U���S3�S�M��<���A���u�A���@8]�tE�M��ap��<���u�A���@�ۃ��u�E�@�A��8]�t�E��`p���[�Ë�U��� �A3ʼnE�S�]V�uW�d�����3��};�u�����3���u�3�9��A���E�0=�r���p����d��P���@���R�E�PW���@���3h�CVP�"3�B���{�s9U����}����u������F����h�CVP�L"�M��k�0�u��A�u��*�F��t(�>����E��AD;�FG;�v�}FF�>uыu�E���}��u�r�lj{�C�g���j�C�C���AZf�1Af�0A@@Ju����������L@;�v�FF�~��4����C���@Iu��C�����C�S��s3��ȋ�����{����95A�X������M�_^3�[�����jhX�@��M������}������_h�u�u����E;C�Wh �.Y�؅��F���wh���#S�u���YY�E����u�vh���@��u�Fh=�AtP�e��Y�^hS�=��@��Fp����A��j
�8�Y�e��C�$A�C�(A�C�,A3��E�}f�LCf�EA@��3��E�=}
�L���A@��3��E�=}�����A@��5�A���@��u��A=�AtP���Y��AS���E�������0j
��Y��%���u ���AtS�v��Y�@����e��E���Ã=�,Auj��V���Y��,A3�Ë�U��SV�u���3�W;�to=hAth���;�t^9uZ���;�t9uP�������yWYY���;�t9uP��������WYY�������������YY���;�tD9u@���-�P��������+�P������+�P�w������l��������=�
At9��uP�T�7�E��YY�~P�E���At�;�t9uP� ��Y9_�t�G;�t9uP�	��Y���Mu�V���Y_^[]Ë�U��SV�5��@W�}W�֋����tP�֋����tP�֋����tP�֋����tP�֍_P�E�{��At	���tP�փ{�t
�C��tP�փ��Mu֋���P��_^[]Ë�U��W�}����SV�5��@W�֋����tP�֋����tP�֋����tP�֋����tP�֍_P�E�{��At	���tP�փ{�t
�C��tP�փ��Mu֋���P��^[��_]Å�t7��t3V�0;�t(W�8���Y��tV�E����>Yu���AtV�Y���Y��^�3��jhx�@���E����A�Fpt"�~lt�.��pl��uj �)��Y�����j�F�Y�e��Fl�=�	A�i����E��E�������j�A�Y�u�Ë�U���S�u�M�����]�C=w�E苀��X�u�]�}�E�P�E%�P�9?YY��t�Ej�E��]��E�Y�
3Ɉ]��E�A�E�j�p�p�E�PQ�E�P�E�jP�Q�� ��u8E�t�E�`p�3���E�#E�}�t�M�ap�[�Ë�U��3�9Ej��hP���@�TA��u]�3�@��,A]Ë�U��
�,A��,Ak����U+P��r	��;�r�3�]Ë�U����M�AV�uW��+y������i���D�M�I�M�����S�1��U�V��U��U�]��ut��J��?vj?Z�K;KuB���� s����L��!\�D�	u#�M!��J���L��!����	u�M!Y�]�S�[�M�M�Z�U�Z�R�S�M����J��?vj?Z�]����]���+u��]���j?�uK^;�v��M����J�M�;�v��;�t^�M�q;qu;���� s�����!t�D�Lu!�M!1��K����!����Lu�M!q�M�q�I�N�M�q�I�N�u��]�}�u;����M�ыY�N�^�q�N�q�N;Nu`�L�M���L�� s%�}u�ʻ���M	������D�D	�)�}u�J����M	Y�J���ꍄ��	�E���D0��E����XA�����
�,A�5��@h@��H��SQ�֋
�,A�XA����	P�XA�@�
�,A�����XA�@�HC�XA�H�yCu	�`��XA�x�ueSj�p�֡XA�pj�5TA�X�@�
�,A�XAk���,A+ȍL�Q�HQP�S�E���
�,A;XAv�m��,A��,A�E�XA�=�,A[_^�á�,AV�5�,AW3�;�u4��k�P�5�,AW�5TA���@;�u3��x��,A�5�,A��,Ak�5�,Ah�Aj�5TA�\�@�F;�t�jh hW���@�F;�u�vW�5TA�X�@뛃N��>�~��,A�F����_^Ë�U��QQ�M�ASV�qW3���C��}���i���0Dj?�E�Z�@�@��Ju�j��h��yh�W���@��u�����p�U�;�wC��+���GA�H���������������@���Pǀ��IuˋU��E���O�H�A�J�H�A�d�D3�G�����FC������E�NCu	x�������!P��_^[�Ë�U����M�ASV�uW�}��+Q������i���D�M�O����I;�|9���M�]��U���E�;��;�M���I�M���?vj?Y�M��_;_uC���� s��M��L��!\�D�	u&�M!������M��L��!����	u�M!Y�O�_�Y�O��y�M+�M��}����}��M��O�L1���?vj?_�]���]�[�Y�]�Y�K�Y�K�Y;YuW�L�M���L�� s�}u�ϻ���M	�D�D��� �}u�O����M	Y�����O����	�U�M��D2���L���U�F�B��D2��<3��8�/�])u�N�K��\3��u��N�]�K���?vj?^�E����u���N��?vj?^�O;OuB���� s����t��!\�D�u#�M!��N���L��!����	u�M!Y�]�O�w�q�w�O�q�uu��u��N��?vj?^�M��y�K�{�Y�K�Y�K;KuW�L�M���L�� s�}u�ο���M	9�D�D��� �}u�N����M	y�����N����	�E��D�3�@_^[�Ë�U�����,A�Mk��,A�����M�SI�� VW}����M���
����3���U��
�,A����S�;#U�#��u
���];�r�;�u��,A��S�;#U�#��u
���];�r�;�u[��{u
���];�r�;�u1��,A�	�{u
���];�r�;�u����؉]��u3��	S�:���Y�K��C�8�t��,A�C��U����t�����|�D#M�#��u)�e�����HD�9#U�#��u�E��������U���i���D�M�L�D3�#�u����#M�j _��G��}��M�T��
+M��N��?�M�~j?^;���J;Ju\�� ��}&����M��|8�Ӊ]�#\�D�\�D�u3�M�]!�,�O���M������|8��!��]�u�]�M�!K��]�}��J�z�y�J�z�y���M��y�J�z�Q�J�Q�J;Ju^�L�M���� �L}#�}u������	;�ο���M�	|�D�)�}u
�N����	{�M������N����	7�M���t�
�L���M��u�эN�
�L2��u��y�>��u;XAu�M�;
�,Au�%XA�M���B_^[��jh��@�|��M3�;�v.j�X3��;E�@u����WWWWW�����3����M��u;�u3�F3ۉ]��wi�=�,AuK�����u�E;�,Aw7j����Y�}��u���Y�E��E������_�]�;�t�uWS���;�uaVj�5TA�\�@��;�uL9=\At3V��Y���r����E;��P�����E���3��uj���Y�;�u
�E;�t������ø�	Aá�,AVj^��u��;�}�ƣ�,AjP��YY��A��ujV�5�,A�YY��A��ujX^�3ҹ�	A���A��� ����PA|�j�^3ҹ�	AW������A����������t;�t��u�1�� B��@
A|�_3�^���=(At��L�5�A�y��Y�U��V�u��	A;�r"��0Aw��+����Q�K���N�Y�
�� V���@^]Ë�U��E��}��P����E�H�Y]ËE�� P���@]Ë�U��E��	A;�r=0Aw�`���+�����P���Y]Ã� P���@]Ë�U��M���E}�`�����Q����Y]Ã� P���@]Ë�U�����AS3�V�u�E��]�]��]��F�> t��<at9<rt,<wt�.��SSSSS������3��p�E��M��]��E	�M�3�AF�W:����Q�@;��.����S������ ���tVHtG��t/��
t"����9]����M�E���	U���E@���M@��E���E���E����E�E���‰E��9]�uw�M �E��u��Tt\��tEHt1��t����E�uF	}�L9]�u<�e������E��79]�u'	}��E��&�E�u�M���Et3���MF�:�����9]����F�> t�jVhx�@�vV���������F�> t��>=upF�> t�jh|�@V��T����u���M�Ajh��@V�T����u���M�!jh��@V�T����u���M�F�> t�8t���SSSSS�������h��u�E�u�uP��Q����t3�� �E�`A�M��H�M�X��X�X�H_^[��jh��@����3�3��}�j���Y�]�3��u�;5�,A����A��9t[��@��uH��uA�F���w�FP���Y������A�4�V�'���YY��A���@�tPV�~���YYF둋��}��h��j8�Y�
�A���A�9tIh���� P���YY����Au�4���Y��A����� P���@��A�<�}�_;�t�g��_�_��_�O��E�����������Ë}�j���Y�SVW�T$�D$�L$URPQQh�]@d�5�A3ĉD$d�%�D$0�X�L$,3�p���t;�T$4���t;�v.�4v�\���H�{u�h�C�U��C� U�d���_^[ËL$�A�t3�D$�H3��z���U�h�p�p�p�>�����]�D$�T$���U�L$�)�q�q�q(������]�UVWS��3�3�3�3�3���[_^]Ë��j�kT3�3�3�3�3���U��SVWjjh3^@Q�k_^[]�U�l$RQ�t$�����]���U��V�uW3�;�u���WWWWW��������F�����@���t�� �F�����F�u	V�)Y��F��v�vV�tYP�p���F;���������F�uOV�JY���t.V�>Y���t"V�2��V�<��A�"��Y��Y��P
A�@$�<�u�N �~u�F�t�u�F��N�A���������	F�~��_^]Ë�U����UV�uj�X�E�U�;�u����� ����	���S3�;�|;5|Ar'�������SSSSS�	� �������Q���W�<��A�����ƊH��u�l����R���	�j�����wP�]�;������9]t7�@$���E���HjYtHu��Шt��U�E�E����Шu!���������SSSSS�n�����4����M;�r�E�u�JY�E�;�u�����������hjSS�u�*��D(�E���T,��AHtt�I��
tl9]tg��@�M�E��D
8]�tN��L%��
tC9]t>��@�M�}��E��D%
u$��L&��
t9]t��@�M�E��D&
S�M�Q�uP��4���@���{�M�;��p;M�g�M�D�����}��;�t
�M�9
u��� ��]�E�É]�E�;����M�<��<
t�CA�M��E�H;�s�A�8
u
AA�M�
�u�E�m�Ej�E�Pj�E�P��4���@��u
�4�@��uE�}�t?��DHt�}�
t��
��M��L�%;]�u�}�
t�jj�j��u����}�
t�
C�E�9E�G������D�@u����C��+E�}��E�������K���xC�3�@�����;]�rK�@��PAt�����PA��u
�Y���*�zA;�u��@��AHt$C���Q|	���T%C��u	���T&C+���ؙjRP�u����E�+]���P�uS�u�jh����@�E�u4�4�@P���Y�M�E�;EtP���Y�E�����E���E�3�;�����E�L0��;�t�M�f�9
u��� ��]�E�É]�E�;����E�f����f��
tf�CC@@�E��M�;�s�Hf�9
u
���Ej
��M��Ej�E�Pj�E�P��4���@��u
�4�@��u[�}�tU��DHt(f�}�
t�j
Xf���M��L��M��L%��D&
�*;]�uf�}�
t�jj�j��u�H��f�}�
tj
Xf�CC�E�9E�������t�@u��f�f�CC+]�]�����4�@j^;�u�R���	�Z���0�i�����m�Y����]��\���3�_[^��jh��@�h���E���u�"��� ����	���3�;�|;|Ar!����0�����	VVVVV�g�����ɋ�����A��������L9��t�����;M�Au����0�����P�<NY�u���D8t�u�u�u�~������E���[���	�c���0�M��E������	�E������u�NYË�U��EV3�;�u���VVVVV����������@^]Ë�U��V�uW3�;�u3��e9}u����j^�0WWWWW�d�������E9}t9urV�u�u�����uW�u�*��9}t�9us���j"Y����jX_^]��������̋T$�L$��ti3��D$��u��r�=tAt�OW����r1�ك�t+ш����u����������ʃ���t��t
�����u��D$_ËD$�jTh��@�:��3��}��E�P�`�@�E�����j@j ^V�YY;����A�5|A���0�@���@
�x�@$�@%
�@&
�x8�@4��@�
�A��;�r�f9}��
�E�;����8�X�;�E�;�|���E��[j@j �YY��tV�M���A��|A ���*�@���@
�`�`$��@%
�@&
�`8�@4��@��;�r�E�9=|A|���=|A�e���~m�E����tV���tQ��tK�uQ���@��t<�u�������4��A�E����Fh��FP���YY�����F�E�C�E�9}�|�3ۋ��5�A����t���t�N��r�F���uj�X�
��H������P�0�@�����tC��t?W���@��t4�>%���u�N@�	��u�Nh��FP���YY��t7�F�
�N@�����C���g����5|A���@3��3�@Ëe��E��������8��Ë�U��V�uV��IY���u����	���MW�uj�uP���@�����u�4�@�3���tP�|��Y���������A�����D0� ���_^]�jh�@�q���E���u�+��� ����	���3�;�|;|Ar!����8�����	WWWWW�p�����ɋ�����A�������L1��t�P�fIY�}���D0t�u�u�u������E������	����8�M��E������	�E������u�IYË�U��SV�u�F�Ȁ�3ۀ�u@�t9�FW�>+���~,WPV���YP���;�u�F��y��F��N ��_�F�f�^��[]Ë�U��V�u��u	V�5Y�/V�|���Y��t����F@tV���P�qLY��Y��3�^]�jh8�@����3��}�}�j���Y�}�3��u�;5�,A����A��98t^��@�tVPV�T�YY3�B�U���A���H���t/9UuP�J���Y���t�E��9}u��tP�/���Y���u	E܉}��F�3��uࡀA�4�V�]�YY��E�������}�E�t�E��f���j�!��Y�j����YË�U��V�uWV��FY���tP��A��u	���u��u�@Dtj��Fj���FYY;�tV�FYP�L�@��u
�4�@���3�V�F������A����Y�D0��tW�X��Y���3�_^]�jh`�@�f���E���u� ��� ����	���3�;�|;|Ar!����8�����	WWWWW�e�����ɋ�����A�������L1��t�P�[FY�}���D0t�u����Y�E������	�M��E������	�E�����u�FYË�U��V�u�F��t�t�v�m����f����3�Y��F�F^]Ë�U��E��8csm�u*�xu$�@= �t=!�t="�t=@�u�$��3�]�h<n@�l�@3�Ë�VW3�9=�,Au����5�,A��u��@�< w��t.��t$<"u	3Ʌ�������P�JY��tFF��< wF���u�_��^Ã=�,Au�@��V�54AW3���u���<=tGV�VY�t���u�jGW�
��YY�=A��tˋ54AS�BV�%��C�>=Yt1jS��YY���tNVSP�����t3�PPPPP�U�������>u��54A����%4A�'��,A3�Y[_^�5A�ת���%A����U��Q�MS3�V���U�9Et	�]�E��E��>"u3�9E��"��F�E��<���t��B�U���PF�4IY��t��}t
�M��E�F�U�M��t2�}�u��� t��	u���t�B��e��>���< t<	uF��N��>���}t	�E�E��3�C3��FA�>\t��>"u&��u�}�t�F�8"u���
3�3�9E����E����tI��t�\B���u�U���tU�}�u< tK<	tG��t=��P��t#�OHY��t
��M�E�F��M��E��
�,HY��tF���UF�V�����t�B�U��M�����E^[��t� ���U���S3�VW9�,Au���h�hAVS�lA�D�@��,A�5 A;�t�E�8u�u��U��E�PSS�}��
����E���=���?sJ�M�sB�����;�r6P�
��Y;�t)�U��E�P�WV�}������E���H�A�5A3����_^[�Ë�U��pA��SV�5��@W3�3�;�u.�֋�;�t�pA�#�4�@��xu
jX�pA��pA����;�u�֋�;�u3�����f9t@@f9u�@@f9u�5��@SSS+�S�@PWSS�E�։E�;�t/P�3Y�E�;�t!SS�u�P�u�WSS�օ�u�u�貧��Y�]��]�W���@���\��t;�u����@��;��r���8t
@8u�@8u�+�@P�E�����Y;�uV���@�E����u�VW�<��V���@��_^[��U����A�e��e�SW�N�@����;�t
��t	�УA�`V�E�P��@�u�3u����@3���@3���@3�E�P���@�E�3E�3�;�u�O�@����u����5A�։5A^_[�Ã%xAË�U��VW3��u譧����Y��u'9tAvV�T�@���;tAv����uʋ�_^]Ë�U��VW3�j�u�u���������u'9tAvV�T�@���;tAv����uË�_^]Ë�U��VW3��u�u��D��YY��u,9Et'9tAvV�T�@���;tAv����u���_^]Ë�U���SVW�%����e��=xA����h��@�<�@�����*�58�@h��@W�օ��P�o����$��@W�xA��P�Z����$��@W�|A��P�E����$��@W��A��P�0���Y��A��th��@W��P����Y��A��A;�tO9�AtGP�v����5�A���i���YY����t,��t(�օ�t�M�Qj�M�QjP�ׅ�t�E�u	�M �9�|A;�t0P�&���Y��t%�ЉE���t��A;�tP�	���Y��t�u��ЉE��5xA��Y��t�u�u�u�u����3�_^[�Ë�U��ES3�VW;�t�};�w����j^�0SSSSS蕼�������<�u;�u��ڋ�8tBOu�;�t��
BF:�tOu�;�u��ż��j"Y����3�_^[]Ë�U��SV�u3�W9]u;�u9]u3�_^[]�;�t�};�w胼��j^�0SSSSS����������9]u��ʋU;�u��у}���u�
�@B:�tOu���
�@B:�tOt�Mu�9]u�;�u��}�u�EjP�\�X�x�����	���j"Y���������������̋L$��t$�����tN��u���$��$�����~Ѓ�3ƒ���t�A���t2��t$��t��t�͍A��L$+�ÍA��L$+�ÍA��L$+�ÍA��L$+�Ë�U��MS3�VW;�t�};�w�L���j^�0SSSSS�պ�������0�u;�u��ڋъ�BF:�tOu�;�u�����j"Y����3�_^[]Ë�U��MV3�;�|��~��u�<A�(�<A�
<A��Ϻ��VVVVV��W�������^]�jh��@���3��]3�;���;�u蕺���WWWWW���������S�=�,Au8j蛸��Y�}�S�c��Y�E�;�t�s���	�u���u��E������%9}�uSW�5TA��@���趽���3��]�u�j�i���Y�j�
���YË�U���(�A3ʼnE���
AVtj
貴��Y������tj����Y��
A�������������������������������f������f����f�����f�����f������f�����������u�E���Dž0��������@�jP���������jP������������(�����0���jDž���@������,����l�@��(���P�h�@j�{�������������������U��WV�u�M�}�����;�v;�����r�=tAtWV����;�^_u^_]�JA��u������r*�$��{@��Ǻ��r���$�{@�$�|@��$��{@�{@D{@h{@#ъ��F�G�F���G������r��$��{@�I#ъ��F���G������r��$��{@�#ъ���������r��$��{@�I�{@�{@�{@�{@�{@�{@�{@�{@�D��D��D��D��D��D��D��D��D��D��D���D���D���D�������$��{@��|@|@|@,|@�E^_�Ð���E^_�Ð���F�G�E^_�ÍI���F�G�F�G�E^_�Ð�t1��|9���u$������r
��$��}@����$�@}@�I�Ǻ��r��+�$��|@�$��}@��|@�|@�|@�F#шG��������r���$��}@�I�F#шG�F���G������r���$��}@��F#шG�F�G�F���G�������V�����$��}@�ID}@L}@T}@\}@d}@l}@t}@�}@�D��D��D��D��D��D��D��D��D��D��D��D��D��D������$��}@���}@�}@�}@�}@�E^_�Ð�F�G�E^_�ÍI�F�G�F�G�E^_�Ð�F�G�F�G�F�G�E^_�Ë�U��E��t���8��uP蒜��Y]Ë�U��QQ�EV�u�E��EWV�E��5��Y;�u�4����	�Nj��J�u�M�Q�u�P���@�E�;�u�4�@��t	P�&���Y�ϋ�����A�����D0� ��E��U�_^��jh��@�������u܉u�E���u�˴��� 谴���	�Ƌ���3�;�|;|Ar!衴���8致���	WWWWW�������ȋ�����A�������L1��u&�`����8�F����	WWWWW�γ���������[P��4Y�}���D0t�u�u�u�u������E܉U������	�����8�M��M��E�������E܋U��]����u�5YË�U����~?�A3ʼnE��EV3���4���8���0�9uu3���;�u'莳���0�t���VVVVV���������SW�}����4��A�����NJX$����(���'���t��u0�M���u&�%���3��0�	���VVVVV�葲�����C�@ tjjj�u�~������u�iY������D���诪���@l3�9H�����P��4�� ���@���`3�9� �t���P��@��4����3���<�9E�B��D���'����g���(�3���
���� ��ǃx8t�P4�U�M��`8j�E�P�K��P��Y��t:��4�+�M3�@;���j��@�SP�=�������C��D��jS��@�P�[=�������3�PPj�M�Qj��@�QP���C��D����@���\j��<�PV�E�P��(���4���@���)��D���0��9�<���8���� ���j��<�Pj�E�P��(���E�
�4���@������<�����0���8��<t<u!�33�f��
��CC��D���@��� �<t<uR��@��h:Yf;�@��h��8��� �t)j
XP��@��;:Yf;�@��;��8���0��E9�D�������'����8��T4��D8�3ɋ�@�����4���@�������<�9M� ���(���<���D�+�4���H�;Ms9��<���<��A��
u��0��
@��D��@��D���D��r‹؍�H�+�j��,�PS��H�P��4���@���B��,��8�;��:��<�+�4�;E�L���� ��D�����9M�M���(���D���<�+�4���H�;MsF��D���D��AAf��
u��0�j
[f�@@��<���<�f�@@��<��r��؍�H�+�j��,�PS��H�P��4���@���b��,��8�;��Z��D�+�4�;E�?����@9M�|��D���<�+�4�j��H���^;Ms<��D���D��f��
uj
[f���<��<�f�Ɓ�<��r�3�VVhU
����Q��H���+��+��P��PVh����@��;���j��,�P��+�P��5��P��(���4���@��t�,�;����4�@��@�;�\��D�+�4���8�;E�
����?j��,�Q�u��4��0���@��t��,���@���8���4�@��@���8�ul��@�t-j^9�@�u����	�����0�?��@�����Y�1��(���D@t��4��8u3��$輬����Ĭ��� �����8�+�0�_[�M�3�^�R�����jh��@�ί���E���u般��� �m����	���3�;�|;|Ar!�_����8�E����	WWWWW�ͫ�����ɋ�����A�������L1��t�P��,Y�}���D0t�u�u�u�.������E������	����8�M��E������	�E��N����u�
-Y�U��`Ah�,�Y�M�A��t
�I�A��I�A�A�A�A�a�]Ë�U��E���u�W����	3�]�V3�;�|;|Ar�9���VVVVV�	�����3���ȃ������A���D��@^]áA��3�9�A����Ë�U���SV�u3�W�};�u;�v�E;�t�3���E;�t�������v譪��j^SSSSS�0�6��������V�u�M�趐���E�9X��f�E��f;�v6;�t;�vWSV�������Z����*�O����8]�t�M��ap�_^[��;�t2;�w,�/���j"^SSSSS�0踩����8]��y����E��`p��m�����E;�t�8]��%����E��`p������MQSWVj�MQS�]�p���@;�t9]�^����M;�t���4�@��z�D���;��g���;��_���WSV������O�����U��j�u�u�u�u�|�����]Ë�U����u�M��}����E�M���A%��}�t�M��ap��Ë�U��j�u���YY]��������V�D$�u(�L$�D$3��؋D$����d$�ȋ�d$��G�ȋ\$�T$�D$���������u���d$�ȋD$���r;T$wr;D$v	N+D$T$3�+D$T$��؃��ʋӋًȋ�^��A@t�yt$�Ix��������QP����YY���u	�Ë�U��V����M�E�M����>�t�}�^]Ë�U��G@SV���t2�u,�E�+��M���}���C�>�u���8*u�ϰ?�d����}�^[]Ë�U���x�A3ʼnE�S�]V�u3�W�}�u���������������������������������������������������蜍����u5�i����3�PPPPP�����������t
�������`p����
�F@u^V���Y�P
A���t���t�ȃ�������A���A$u����t���t�ȃ�������A���@$��g���3�;��]��������������������������������P
C3�9����������
�ʀ� ��Xw
������@��������k�	���@j��^������;����jY;���	�$�;�@3�������������������������������������t	�ƒ� tH��t4+�t$HHt���V		���K	����?	����3	�����$	����	��*u,���������������������������������k�
�ʍDЉ�������������*u&���������������������������k�
�ʍDЉ����z��ItU��htD��lt��w�b����S�;luC���������8����,��� � �<6u�{4uCC����������<3u�{2uCC�������������<d��<i��<o��<u��<x��<X�������������������P��P����Y������Yt"���������������C������������������������j����J�ƒ�d���w��S������AtHHtYHHtHH���� Dž�����������@�������������������EDž������0���������0u
����������u������������������������u��A��������Dž����{��X��HHty+��&���HH������������t0�G�Ph���P����P��������tDž������G����Dž����������1����������t<�H��t5��������t�+��Dž��������������A����P��Y����p������e����g�2�����itm��nt$��o����������ta����U�7������������������� tf�����f��������Dž��������@Dž��
����������G��W���u��gufDž���Z9���~���������~@������]V�{�����Y������j��t�������������
Dž���^��G��������G�������������P����������������P������������SP�5�A� ���Y�Ћ������t!����u������PS�5�A��Y��YY����gu��u������PS�5�A�˕��Y��YY�;-u���C����S���������������$��s�����HH���������Dž����'����Dž���k���������Qƅ���0�����Dž����G������M������� t�������@t�G���G����G���@t��3҉������@t��|��s�؃��ځ�������ڋ�u3ۃ���}Dž��������9���~�������u!�����u������������t-�����RPSW�����0��9����������~������N뽍E�+�F�����������tb��t�΀90tW���������0@�?If�8t@@��u�+�����(��u��A���������I�8t@��u�+��������������\����@t2�t	ƅ���-��t	ƅ���+��tƅ��� Dž��������+���+�������u�����������Sj �[���������������������������a������Yt���uWSj0��������������������tf��~b�����������������Pj�E�P������FPF�����u(9�����t ������������M���������Yu�������������P�������Y�����|���tWSj ������m��������t�������҃��������Y������������t
�����������3�9�����t������t�c���VVVV�V�������t
�������`p�������M�_^3�[��~����%�@$�@V�@��@��@
�@P�@��@��U����A3ʼnE�SV3�W��9�Au8SS3�GWhd�@hS��@��t�=�A��4�@��xu
��A9]~"�M�EI8t@;�u����E+�H;E}@�E��A����;��������]�9] u��@�E �5��@3�9]$SS�u���u��P�u �֋�;���~Cj�3�X����r7�D?=w�$��;�t����P�H���Y;�t	������E���]�9]��>W�u�u�uj�u �օ����5�@SSW�u�u�u�֋ȉM�;����Et)9]��;M���u�uW�u�u�u���;�~Ej�3�X��r9�D	=w��#��;�tj������P膂��Y;�t	��������3�;�tA�u�VW�u�u�u��@��t"SS9]uSS��u�u�u�VS�u ���@�E�V�b�Y�u��Y��E�Y�Y�]�]�9]u��@�E9] u��@�E �u�'Y�E��u3��!;E ��SS�MQ�uP�u �(���E�;�tԋ5�@SS�uP�u�u�։E�;�u3��~=���w8��=w��"��;�t�������P�p���Y;�t	��������3�;�t��u�SW������u�W�u�u�u�u�։E�;�u3��%�u�E��uPW�u �u��e'��u�����#u�W�7�Y��u�u�u�u�u�u��@��9]�t	�u����Y�E�;�t9EtP���Y�ƍe�_^[�M�3��({���Ë�U����u�M��{~���u(�M�u$�u �u�u�u�u�u�(����� �}�t�M��ap��Ë�U��QQ�A3ʼnE���ASV3�W��;�u:�E�P3�FVhd�@V� �@��t�5�A�4�4�@��xu
jX��A���A����;��������]�9]u��@�E�5��@3�9] SS�u���u��P�u�֋�;���~<���w4�D?=w�� ��;�t����P���Y;�t	������؅�ti�?PjS�����WS�u�uj�u�օ�t�uPS�u� �@�E�S�s��E�Y�u3�9]u��@�E9]u��@�E�u�%Y���u3��G;EtSS�MQ�uP�u�A%���;�t܉u�u�u�u�u�u��@��;�tV�}��Y�Ǎe�_^[�M�3��)y���Ë�U����u�M��||���u$�M�u �u�u�u�u�u�������}�t�M��ap��Ë�U��V�u�����v�:}���v�2}���v�*}���v�"}���v�}���v�}���6�}���v �}���v$�|���v(��|���v,��|���v0��|���v4��|���v��|���v8��|���v<��|����@�v@�|���vD�|���vH�|���vL�|���vP�|���vT�|���vX�|���v\�|���v`�x|���vd�p|���vh�h|���vl�`|���vp�X|���vt�P|���vx�H|���v|�@|����@����2|������'|������|������|������|������{�������{�������{�������{�������{�������{����,^]Ë�U��V�u��t5�;hAtP�{��Y�F;lAtP�{��Y�v;5pAtV�}{��Y^]Ë�U��V�u��t~�F;tAtP�[{��Y�F;xAtP�I{��Y�F;|AtP�7{��Y�F;�AtP�%{��Y�F;�AtP�{��Y�F ;�AtP�{��Y�v$;5�AtV��z��Y^]��������U��V3�PPPPPPPP�U�I�
�t	���$��u���I���
�t	���$s��� ^�����������̋T$�L$��u<�:u.
�t&:au%
�t��:Au
�t:au����
�uҋ�3�Ð�����t���:u�
�t��t�f���:u�
�t�:au�
�t���눋�U��Q�e�S�]��u3��W��ru�{���vn�M�E�������tR:Q�uM�P���t<:Q�u7�P���t&:Q�u!�P���t:Q�u�E�9}�r��?�@��I��F�@��I��<�@��I��2�@��I��(�M�E����t:u@A�E�9]�r�3�_[����	+�����������U��V3�PPPPPPPP�U�I�
�t	���$��u���
�t���$s�F��� ^��U��WV�u�M�}�����;�v;�����r�=tAtWV����;�^_u^_]�:��u������r*�$��@��Ǻ��r���$��@�$��@��$���@�(�@T�@x�@#ъ��F�G�F���G������r��$��@�I#ъ��F���G������r��$��@�#ъ���������r��$��@�I��@�@�@آ@Т@Ȣ@��@��@�D��D��D��D��D��D��D��D��D��D��D���D���D���D�������$��@���@�@(�@<�@�E^_�Ð���E^_�Ð���F�G�E^_�ÍI���F�G�F�G�E^_�Ð�t1��|9���u$������r
��$���@����$�P�@�I�Ǻ��r��+�$���@�$���@���@أ@�@�F#шG��������r���$���@�I�F#шG�F���G������r���$���@��F#шG�F�G�F���G�������V�����$���@�IT�@\�@d�@l�@t�@|�@��@��@�D��D��D��D��D��D��D��D��D��D��D��D��D��D������$���@����@��@Ȥ@ܤ@�E^_�Ð�F�G�E^_�ÍI�F�G�F�G�E^_�Ð�F�G�F�G�F�G�E^_��jh��@译��3ۉ]�j腌��Y�]�j_�}�;=�,A}W������A�9tD��@�tP�%���Y���t�E�|(��A��� P���@��A�4�*u��Y��A�G��E������	�E��k����j�&���YË�U���0S3�E�VW��]�]��E��]�t	�]��E��
�E��]��E�P�!Y��t
SSSSS�����M����u��@u9E�t�M������+ú���tGHt.Ht&�U�������8���j^SSSSS�0�������U����t��u��E�@��}��EjY+�t7+�t*+�t+�t��@u�9}����E���E���E���E���]�E�#¹;��;t0;�t,;�t=��=�@����E��/�E��&�E��=t=t`;������E��E�E���t�
A��#M��x�E��@t�M��M��M��t	}� t�M���E�릨t�M��e
����u�������ϋ�����E�=$�@S�u���u�E�P�u�u��u�׉E��um�M���#�;�u+�Et%�e����S�u�E�u�P�u�u��u�׉E��u4�6������A�����D0� ��4�@P�]���Y�1�����t�u���@;�uD�6������A�����D0� ��4�@��V����Y�u�L�@;�u�����
룃�u�M�@�	��u�M��u�6�	��Ѓ������AY��Y�M����L��Ѓ������A���D$� ��M��e�H�M���������Etqj��W�6������E�;�u�X����8�tM�6�t�����j�E�P�6�]��7�������u�}�u�E�RP�6���;�t�SS�6�Q�����;�t��E���0�@�@�}u�E�#�u	M�	E�E#�;�tD=t)=@t"=t)=@t"=t=@u�E���M�#�;�u	�E���]��E���E�@�]����E���#�=@��=�tw;����E�;��y��v��v0���f�E�3�H�&H�R�E��E��jSS�6������t�SSS�6�z��#ƒ���������j�E�P�6�Դ��������u�����tk�����}�uY�E����E�;������b������P���jSS�6�������C���SSS�6�����#ƒ���������E�%��=��u�6�j���Y�&���j^�0���d=��uSj�6�c��������������E��ASS�6�H�������E��E��E�+�P�D=�P�6�;�������������9}�ۋ������A�����D$�2M���0�������A�����D$�M�������
ʈ8]�u!�Et��ȃ������A���D� �}�����#�;�u|�Etv�u�L�@S�u�E�jP�u���W�u�$�@���u4�4�@P������ȃ������A���D� ��6�Y����6������A�������_^[��jh�@��3��u�3��};���;�u荆��j_�8VVVVV���������Y��3�9u��;�t�9ut�E%������@t‰u��u�u�u�u�E�P���j������E��E�������E�;�t��誉���3��}9u�t(9u�t�����������A�D� ��7�@YË�U��j�u�u�u�u�u������]Ë�U���S�u�M���k��3�9]u8]�t�E�`p�3����E�9Xu&�u�u�u����8]����M�ap��9]u.�_���SSSSS������8]�t�E�`p������W�};�u.�)���SSSSS�豄����8]�t�E�`p������NV�Mf�	�M�E����D�M�ti9]u��D�]����f�����U�:�u�]��Z��f��f�E��f��M�f;prf;pwfp�6f;pr0f;pw*fp�$�U���At
f������ʉM�f�u�f�����G�D�M�tH9]u�]��^��M:�t��f��f���G�M�f;Hrf;HwfH�6f;Hr0f;Hw*fH�$�U���At
f������ʉM�f�M�f;�u!f;�t	9]����8]�t�E�`p�3�^_[�����H8]�t�M�ap���U��j�u�u�u�����]Ë�U���S3�9]u3���W�u�M��i���}�9_u&�u�u�u�k��8]����M��ap��9]u+�%���SSSSS�譂����8]�t�E��`p������mV�u;�u+��SSSSS��z�����8]�t�E��`p������9�Ef��M�E�����D8tA9]u�3�D8t_8]�t�E��`p�3�^_[�ËE�:�u3����f��f�E��f�����F�D:t 9]u3����M:�t�f���f�F��f;�uf;�t�9]�`�������H8]�t��M��ap�냋�U��j�u�u�u�����]�U��SVWUjjh��@�u�T]_^[��]ËL$�A�t2�D$�H�3��~d��U�h�P(R�P$R���]�D$�T$���SVW�D$UPj�h��@d�5�A3�P�D$d��D$(�X�p���t:�|$,�t;t$,v-�4v���L$�H�|�uh�D��I�D��_뷋L$d�
��_^[�3�d�
�y��@u�Q�R9Qu��SQ��A�SQ��A�L$�K�C�kUQPXY]Y[����U��EVW��|Y;|AsQ�������<��A����<�u5�=AS�]u��tHtHuSj��Sj��Sj��(�@��3�[��Y����	�a���� ��_^]�U��MS3�;�VW|[;
|AsS������<��A������@t5�8�t0�=Au+�tItIuSj��Sj��Sj��(�@���3�������	�������_^[]Ë�U��E���u���� ����	��]�V3�;�|";|As�ȃ������A����@u$�~���0�d��VVVVV�	��~��������^]�jh �@臂���}���������4��A�E�3�9^u6j
�=}��Y�]�9^uh��FP����YY��u�]�F�E������09]�t����������A�D8P���@�E��G����3ۋ}j
�{��YË�U��E�ȃ������A���DP���@]�jh@�@����M�3��}�j��{��Y��u���bj�~|��Y�}��}؃�@�<�4��A�����u���A;����Fu\�~u9j
�5|��Y3�C�]��~uh��FP����YY��u�]���F�e��(�}�u�^S���@�FtS���@��@낋}؋u�j
�z��YÃ}�u��F��+4��A������u�}�uyG�+���j@j �B���YY�E�ta���A��|A ���;�s�@���@
�`��@�E�����}����σ������A�DW����Y��u�M��E������	�E�聀���j�<z��Y�U����}��}�M��f����$�ffGfG fG0fG@fGPfG`fGp���IuЋ}���]�U����}��E���3�+���3�+���u<�M�у��U�;�t+�QP�s������E�U��tEE+‰E�3��}��M��E�.�߃��}�3��}�M��E�M�U�+�RjQ�~������E�}���]�jhh�@�@���e�f(��E��#�E��=�t
=�t3��3�@Ëe�e��E������E��B��Ë�U���3�S�E��E�E�S�X��5 P��Z+�tQ�3���E�]�U�M���U��E�[�E�t�\�����t3�@�3�[������tA3��jh��@�~���E���u�({���	���3�;�|;|Ar�{���	SSSSS�z�����Ћ���<��A�������L��t�P���Y�]���Dt1�u���YP�,�@��u�4�@�E���]�9]�t�z���M��z���	�M��E������	�E��}���u���YË�U����u�M��w`���E�M�U�Tu�}t�M���A#E�3���t3�@�}�t�M��ap��Ë�U��jj�uj�����]�jh��@�5}���]��u�u�'b��Y���u��uS�`��Y��=�,A��3��}����j��w��Y�}�S蕑��Y�E�;���;5�,AwIVSP�w�������t�]��5V�F���Y�E�;�t'�C�H;�r��PS�u��g���S�E����E�SP�k�����9}�uH;�u3�F�u�����uVW�5TA�\�@�E�;�t �C�H;�r��PS�u�����S�u��������E������.�}�u1��uF�����uVSj�5TA���@����u�]j�u��YË}���9=\At,V� ���Y�������x��9}�ul��4�@P�,x��Y��_�����\x��9}�th��q��uFVSj�5TA���@����uV9\At4V跁��Y��t���v�V见��Y�x���3��{����w���|�����u��w����4�@P�w���Y����U����}��u��u�}�M�����fofoNfoV fo^0ffOfW f_0fof@fonPfov`fo~pfg@foPfw`fp������Iu��u��}���]�U����}�u��]��]�Ù�ȋE3�+ʃ�3�+ʙ��3�+���3�+����uJ�u�΃��M�;�t+�VSP�'������E�M��tw�]�U�+щU��+ى]�u�}�M��E�S;�u5�ك��M�u�}�M��MM�UU�E+E�PRQ�L������E��u�}�M����ʃ��E�]��u��}��]�������������Q�L$+ȃ����Y�Q�L$+ȃ����Y���U����A3ʼnE�V3�95�AtO�=�A�u�l
��A���u����pV�M�Qj�MQP�8�@��ug�=�Au�4�@��xuω5�AVVj�E�Pj�EPV�4�@P���@�
�A���t�V�U�RP�E�PQ�0�@��t�f�E�M�3�^�CX������A��U���SV�u3�;�t9]t8u�E;�t3�f�3�^[��u�M��d[���E�9Xu�E;�tf�f�8]�t�E��`p�3�@�ʍE�P�P���YY��t}�E���~%9M| 3�9]��R�uQVj	�p���@���E�u�M;��r 8^t���8]��e����M��ap��Y����t���*8]�t�E��`p����:���3�9]��P�u�E�jVj	�p���@���:���뺋�U��j�u�u�u������]���������������Q�L$+����#ȋ�%�;�r
��Y���$�-���U���VW�u�M��Z���E�u3�;�t�0;�u,��s��WWWWW��es�����}�t�E�`p�3���9}t�}|Ƀ}$ËM�S��}��~���~�E�P��jP虊���M���������B����t�G�ǀ�-u�M���+u�G�E���K���B��$�9��u*��0t	�E
�4�<xt
<Xt	�E�!�E�
��u��0u�<xt<XuG�G��������3�u���N��t�˃�0���t1�ˀ�a����w�� ���;Ms�M9E�r'u;�v!�M�}u#�EO�u �}t�}�e��[�]��]ى]��G닾����u�u=��t	�}��w	��u+9u�v&�<r���E�"t�M����EjX��ƉE��E��t�8�Et�]��}�t�E�`p��E���E��t�0�}�t�E�`p�3�[_^�Ë�U��3�P�u�u�u90Auh�	A�P�����]Ë�U����A3ʼnE�j�E�Ph�u�E���@��u���
�E�P�Y�M�3��*T���Ë�U���4�A3ʼnE��E�M�E؋ES�EЋV�E܋EW3��M̉}�}�;E�_�5��@�M�QP�֋��@��t^�}�uX�E�P�u�օ�tK�}�uE�u��E����u�u������YF;�~[���wS�D6=w/�[�����;�t8����-WW�u�u�j�u�Ӌ�;�u�3���P��X��Y;�t	������E���}�9}�t؍6PW�u�����V�u�u�u�j�u�Ӆ�t�]�;�tWW�uSV�u�W�u���@��t`�]��[���@9}�uWWWWV�u�W�u�Ӌ�;�t<Vj�ذ��YY�E�;�t+WWVPV�u�W�u��;�u�u��W��Y�}���}�t�MЉ�u��I���Y�E�e�_^[�M�3��vR���Ë�U��j
j�u������]Ë�U���S3�VW9]���u�M��U��9]u.�qo��SSSSS��n����8]�t�E��`p�������};�t˾���9uv(�2o��SSSSS��n����8]�t�E��`p����`�E�9Xu�uW�u����8]�tD�M��ap��;�E��M�QP��E����M�QP�s��G�Mt;�t;�t�+���3�_^[�Ë�U��V3�950Au99uu�n��VVVVV��n���������'9ut܁}���w�^]�-V�u�u�u�����^]Ë�U���SVW3�jSS�u�]�]��θ���E�#ƒ��U��tYjSS�u貸����#ʃ����tA�u�}+����;����Sj�@�@P�\�@�E���u��m����m���_^[��h��u�YY�E���|
;�r�����P�u��u�ɹ�������t6�+��xӅ�wϋu�u��u��YY�u�j�@�@P�X�@3���Zm���8u�=m���
���u��;�q|;�skS�u�u�u跷��#ƒ�����D����u�B�YP�<�@�����H��E�#‰U�u)��l���
��l����4�@��u�#u������S�u�u�u�L���#ƒ��������3�������U��S�]V�u������A������0�A$�W�y�������@tP���tB��t&��t��u=�I��
�L1$��⁀���'�I��
�L1$��₀���a�
�I��
�L1$�!���_^[u��]���%�@]�U��EV3�;�u��k��VVVVV��Nk����jX�
�
`A�3�^]�3�PPjPjh@h��@�$�@��Aá�AV�5L�@���t���tP�֡�A���t���tP��^Ë�U���SV�u�M��jQ���]�;�sT�M胹�~�E�PjS�4����M���
����X����t������}�t�E�`p�����E胸�~1�]�}�E�P�E%�P�U���YY��t�Ej�E��]��E�Y��j���*3Ɉ]��E�A�E�j�p�U�jRQ�M�QV�p�E�P�
����$���o������E�t	�M�����}�t�M�ap�^[��������������U��WVS�M�tM�u�}�A�Z� �I�&
�t'
�t#����:�r:�w�:�r:�w�:�u��u�3�:�t	�����r�ً�[^_����������������̋D$�L$ȋL$u	�D$���S��؋D$�d$؋D$���[��%��@4�B�\�j�~������������"�6�F�V�h�x�����������������.�J�h�|�����������������(�@�X�����������������������.�<�N�h�������������
�$�0�B�R�d�t����������������� �g4@9G@LW@�@~n@��@�W@1�RL����CorExitProcessmscoree.dll@A�AEncodePointerKERNEL32.DLLDecodePointerFlsFreeFlsSetValueFlsGetValueFlsAllocruntime error 
TLOSS error
SING error
DOMAIN error
R6034
An application has made an attempt to load the C runtime library incorrectly.
Please contact the application's support team for more information.
R6033
- Attempt to use MSIL code from this assembly during native code initialization
This indicates a bug in your application. It is most likely the result of calling an MSIL-compiled (/clr) function from a native constructor or from DllMain.
R6032
- not enough space for locale information
R6031
- Attempt to initialize the CRT more than once.
This indicates a bug in your application.
R6030
- CRT not initialized
R6028
- unable to initialize heap
R6027
- not enough space for lowio initialization
R6026
- not enough space for stdio initialization
R6025
- pure virtual function call
R6024
- not enough space for _onexit/atexit table
R6019
- unable to open console device
R6018
- unexpected heap error
R6017
- unexpected multithread lock error
R6016
- not enough space for thread data

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
R6009
- not enough space for environment
R6008
- not enough space for arguments
R6002
- floating point support not loaded
Microsoft Visual C++ Runtime Library

...<program name unknown>Runtime Error!

Program: ������������������(null)(null)EEE50P( 8PX700WP  `h````xpxxxx	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ccsUTF-8UTF-16LEUNICODEGetProcessWindowStationGetUserObjectInformationAGetLastActivePopupGetActiveWindowMessageBoxAUSER32.DLL�����������EEE���00�P��('8PW�700PP� (����`h`hhhxppwpp         (((((                  H����������������������          h((((                  H����������������������                                 H�����������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~�����������������������������������������������������������������������������������������������������������������������������HH:mm:ssdddd, MMMM dd, yyyyMM/dd/yyPMAMDecemberNovemberOctoberSeptemberAugustJulyJuneAprilMarchFebruaryJanuaryDecNovOctSepAugJulJunMayAprMarFebJanSaturdayFridayThursdayWednesdayTuesdayMondaySundaySatFriThuWedTueMonSunSunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecCONOUT$user32.dllMessageBoxTimeoutAFatal Error in LauncherrbFailed to open executableUnable to find an appended archive.Unable to read from file#!Job information querying failedJob information setting failedstdin duplication failedstdout duplication failedstderr duplication failedUnable to create process using '%s'Failed to get exit code of processFailed to find shebangExpected to find terminator in shebang lineExpected to find '#' at start of shebang lineExpected to find '!' following '#' in shebang lineExpected to be able to allocate command line memory"%s" "%s" %sHA��@RSDS�j�!���N���~Dx1c:\Users\Vinay\Projects\SimpleLauncher\dist\w32.pdb7�]��������������@������������@������������@������������@������������!@������������#@������������$@������������%@������������l'@p'@����2'@F'@������������*@�����*@������������,@�����,@������������1@������������4@�����������{6@�6@������������8@�8@������������<@������������<@�<@�����������2C@�����������G@�����������pJ@�����������W@������������\@�����������/f@�������������i@�i@�����������k@������������l@\l@�����������n@�����������@y@������������@�������������@�������������@�����������L�@�������������@�����������u�@��@�������������@��@�������������@�������������@�����4�B�\�j�~������������"�6�F�V�h�x�����������������.�J�h�|�����������������(�@�X�����������������������.�<�N�h�������������
�$�0�B�R�d�t����������������� �ExitProcessqSetInformationJobObjectbFreeLibrary�GetCurrentProcess�WaitForSingleObjectgGenerateConsoleCtrlEvent�GetCommandLineAAssignProcessToJobObject�GetExitCodeProcess�CreateProcessA�QueryInformationJobObject�CreateJobObjectAdGetStdHandleGetLastErrorEGetProcAddress<LoadLibraryA-SetConsoleCtrlHandlerGetModuleFileNameA�DuplicateHandleRCloseHandleKERNEL32.dllGetModuleHandleW�Sleep�HeapFree�HeapAllocbGetStartupInfoA�TerminateProcess�UnhandledExceptionFilter�SetUnhandledExceptionFilterIsDebuggerPresent�TlsGetValue�TlsAlloc�TlsSetValue�TlsFree�InterlockedIncrementsSetLastError�GetCurrentThreadId�InterlockedDecrement%WriteFile�DeleteCriticalSection9LeaveCriticalSection�EnterCriticalSection�InitializeCriticalSectionAndSpinCountrGetCPInfohGetACP7GetOEMCP
IsValidCodePage�HeapCreate�VirtualFree�VirtualAlloc�HeapReAllocRtlUnwindgMultiByteToWideChar�ReadFileoSetHandleCount�GetFileTypefSetFilePointer`FreeEnvironmentStringsA�GetEnvironmentStringsaFreeEnvironmentStringsWWideCharToMultiByte�GetEnvironmentStringsW�QueryPerformanceCounter�GetTickCount�GetCurrentProcessIdyGetSystemTimeAsFileTime�HeapSizeGetLocaleInfoA�GetConsoleCP�GetConsoleMode+LCMapStringA-LCMapStringWfGetStringTypeAiGetStringTypeW�CreateFileA�SetStdHandleWFlushFileBuffersWriteConsoleA�GetConsoleOutputCP$WriteConsoleWSSetEndOfFileJGetProcessHeap�@N�@���D��������p�@D�@	�@
��@T�@$�@�@��@��@t�@<�@�@��@��@X�@  �@!(�@"��@xx�@yh�@zX�@�T�@�D�@
		


!
5A
CPR
S
WYl
m pr	�
�
�	��
�)�
���
���Qy@Qy@Qy@Qy@Qy@Qy@Qy@Qy@Qy@Qy@x
��@��@                          abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ                          abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ�A�`�y�!�������@~�����ڣ ��@����ڣ ��A��Ϣ���[��@~��QQ�^� _�j�2�����1~��l�@����C�A�A�A�A�AhAh�@��@p�@�
A�A�A�A�A�A�����
h�@j�@��@��@��@��@��@��@��@x�@p�@h�@\�@P�@H�@<�@8�@4�@0�@,�@(�@$�@ �@�@�@�@�@�@�@��@��@��@(�@��@��@��@��@��@��@��@��@��@��@|�@p�@	�
A.dA�A�A�A�A�A�A�A�A�AhA. ��p��PSTPDT�A A��������������������;Zx����0Nm����:Yw����/MlK(�p�������������0�eH�`�x�������	�2���4(�6���>h�(D�%��i��xzh��~h�HZ�( @...GGGWWWiiiuuu����������������������������������̀�ww����ww||�����ww��������wwww��������ww��������f�wwwww|�����f�wwwwww����ff�wwwwww�����ff��wwwww���ffl����ww����ffffff��w����ffffffl�w������ffffff�w�����ffffff�|����������ff��������ffff�������ff��R\I���lffl���)����ff�ح���������2L���������18�������Ϥ"������A<��������ΣT��π�����U���������������������������؀����������������������?������������������?�?�?�?�?�?�������������( 444MMMSSSzzz������������������������������p�p�����{p{��f���fko�f�����_fffk�_�fff��[���f}��UUU�fL4�UUU_kJqO���_�~�'�[U_����U�����������wwwww{~����������������( @%%%+++000===AAAIIIMMMQQQVVVYYY]]]~dFgggjjjmmmrrruuu}}}�u?�z=�~;�gE�kC�oA�r@��:��I��b��pƏKУk(��,�1�?�5�<�\�C�K�Q�s�U�[�c�b�����������������������������������������ð����������������������������������������������������/Pp�
��� �=�1[�Qy�q�����������/"P0p=�L�Y�g�x���1��Q��q����������&/@PZpt���������1�Q�q��������/&PAp[�t��ϩ������1��Q��q����������/P"p0�>�M�[�i�y��1��Q��q����ұ������/Pp�	�
��� �>1�\Q�zq������������/Pp!�+�6�@�I�Z�1p�Q��q�������������/ P6pL�b�x�������1��Q��q�������������,/KPip�����������1��Q��q������������/-P?pR�c�v������1��Q��q�ϑ�ܱ������/Pp�!�&�,�>�X1�qQ��q������������_______CCBABADL*(%$""&GABJIIDDJC??AD_-(''%$GG#_DIJIIJIIIDIJDD_+)(''%GG _JMCEJ?ABAECA?BA_,+)('%%"!_IM@AJACDCIDI____.,++>________JMJJJJJJJJJF_..,+)('%$"! #GIMCEJJJI?J__...,+(('%$"! &_JM?AJJJJCJ__...,+)(''%$"  _IMJJJJJJJJ_K=...,++(''%$! _JMCDJJJJAJ_K_______L*%$"!_I_?AMNJJEJ_L'%$"_I_MMMMMMJJ__('%%_I_CEMIJJMEM_(''*_I_?BMDJEMDMF_)(-LI_MMMCMMMMM_________<____I_CEM1;MACDMEJM__I_?A_D1@IJJMJMM_FF_I__6_@/EMMMNMM_FF_I_C80EJDMJCJFF?:AA20?_M_MIEM______MIC4BC/
N______MMMMJIDAI_9/	HJJMMJMMMJ??BAI_A7503	IJMMCBCBA44CCI___BAO;6___C_MJIDIDMI_CI___O;
@__C_C?J?AJI_?A_DJJI@O_CM?;I?JI_________H9MAIJJIJI_CD_____JJI73C;IJIJI_?AMDJJDIMJIE5:JIJI__________MMIA:IJJJJJJJJJJJJJJJJMJ�����?������������������?������������������?�( 444MMMRRRYYY~eGuuu}}}�x>�iE�rC��E��~7�?�H�V�b�x����������������������������������������������������������������������������������/!P7pL�c�yϏ���1��Q��q�������������/Pp"�,�6�@�J�[1�qQ��q�������������/Pp�
��� �=�1[�Qy�q�����������/"P0p=�L�Y�g�x���1��Q��q����������&/@PZpt���������1�Q�q��������/&PAp[�t��ϩ������1��Q��q����������/P"p0�>�M�[�i�y��1��Q��q����ұ������/Pp�	�
��� �>1�\Q�zq������������/Pp!�+�6�@�I�Z�1p�Q��q�������������/ P6pL�b�x�������1��Q��q�������������,/KPip�����������1��Q��q������������/-P?pR�c�v������1��Q��q�ϑ�ܱ������/Pp�!�&�,�>�X1�qQ��q������������!%///* !*/"(%%'%/)
/!#''////+/+"*(/
/

!%(/
(

  (*/(///)
*/
	)*

	/"/////	/+///#
		+ !%//
+"*+'#+//+'!%*++$++!+!    !!!<(0` !!$&			&"

 ���W���������������������������������ܱ��Nj+<<</	&&&#&[[[?6666��׏��������������������������������������������Ҟ���BBB3"


mmm3����,����!!!4777&�����������������������������������������������������ʟ���}���}___E���OpppD���P,)+3���Z2226DDD(���,�����###5��������������������������������������������������������������������������������չ�������������5�������,�������������������������������������������������������������������������������������������������������������,������Ì222"��Є�����������������������������������������������������������������������������������������������������&&&2����   4888&�������������������������������������������������������������������������e��?��4��/��+���.���R�������ӎ����������$$$5��Ď���������������������������������������������������������������������D��@��;��7��3��/��*���&���"�����������������������������������������������������������������������������������������W��G��C��?��;��6��2��n������f��0�������������nj333"��ӄ��������������������������������������������������������������������O��K��G��B��>��:��5��p������i��$�����������!!!4888&���������������������������������������������������������������������S�N��J��F��B��=��9��5��0��,��(���������������%%%5��ǎ���������������������������������������������������������������������V�R�N��I��E���������������������������������������������������������������������������������������������������������ѹ���|J��q?��o@�����Z�U�Q�M��I��D��@��<��7��3��/��+���&���"���-����������������Ɍ444"��ք�������������������������������������������������̴��w<��u=��s>��q?�����]�Y�U�P��L��H��C��?��;��7��2��.��*���%���!����������������"""4888&���������������������������������������������������d��y<��w=��u=��s>�����a�\�X�T�P��K��G��C��>��:��6��1��-��)���%��� ���O������������Ñ%%%5��ʎ���������������������������������������������������A��{;��y<��w=��t>�����s�`�\�W�S�O��J��F��B��>��9��5��1��,��(���$���(����������������������������������������������������������������������9��|:��z;��x<��v=�������s�_�[�W�R�N��J��E��A��=��8��4��0��,��'���#�������������̌555"��ل���������������������������������������������������9��~9��|:��z;��x<���o�����������������������������������������m��8��3��/��+���'�����������"""4:::&������������������������������������������������������8���9��~:��|;��z;��w<��u=��s>��q?��o@��mA��kB��iC��gC�dD��uZ������;��7��3��.��*�������������Ǒ%%%5��̎���������������������������������������������������È>���8���9��}:��{;��y<��w<��u=��s>��q?��o@��mA��jB��hC��fD�~dE��uZ�����?��:��6��2��5�����������������������������������������������������������������������������Оa���7���8��9��}:��{;��y<��w=��u>��r>��p?��n@��lA��jB��hC��fD�}dE�����B��>��:��5��^������������ό555"��܄����������������������������������������������������������ѳ�„7���7���8��9��}:��{;��x<��v=��t>��r?��p@��n@��lA��jB��gC��eD�����F��A��=��9������������"""4;;;&�����������������������������������������������������������������ŌC���8���9��~9��|:��z;��x<��v=��t>��r?��p@��mA��kA��iB��gC�����I��E��L��������������ɑQQQJnnn����������~~~�������������������������������������������������������������������������������������������Į��q?��o@��mA��kB��iC�������������������������HHH�"""���������������vvv������������������������������������������������������������������9��~:��{;��y<��w<��u=��s>��q?��o@��mA��kB�������������:::�'''�___���������sss�ttt��������������������������������������������������������������8�Ϧu�����ǣv��y<��w=��u=��s>��p?��n@��lA��������888T����---6fffnddd�%%%�"""�����OOO�SSS������������������������������������������������������������ċD�ҧu�����ʤv��{;��y<��v=��t>��r?��p?��xM�����<<<�MMM�������̑&&&5����;;;�<<<�xxx�QQQ�;;;�KKK����������������������������������������������������������8���8��~9��|:��z;��x<��v=��t>��r?�̷������999�����������������������VVV�###�)))�444��������������������������������������������������������������������ѳ�͝b���@��~9��|:��z;��}C���g��˶����Ӎ���������󑑑�����ZZZ�lll�;;;�!!!�"""�)))�___���������������������������������������������������������������������������������������&&&2����:::�ppp�{{{�___�WWW�WWW�:::�!!!�"""�***�www�������������������������������������������������������������������"""4888&���,������̑999����Ԗ���JJJ�|||�lll�:::�"""�BBB�XXX�|||��������������������������������������������������������������������$$$6�������,��������������������������������uuu�KKK�CCC�@@@�...�www����������������������������������������������������������������������������������*������Ҍ666"������������������������KKK�aaa�LLL�WWW��������������������������������������������������������������@��������$����"""4;;;&���������������������nnn�fff�!!!�$$$�999������������������������������������������������������������444]ttt|������ȇ������ɑ&&&5��Ў������������������������vvv�mmm�VVV�{{{�OOO����������������������������������������������������������������ڥ�����������������������������������������������aaa�CCC�����ppp�������������������������������������������������������������������������ό555"��ބ����������������������������������|||�MMM�����fff���������������������������������������������������������������"""4;;;&�������������������������������������������\\\�����������������������������������������������������������������Ǒ%%%5��Ύ�����������������������������������������������������������������������������������������������ݧ�����������������������������������������������������������������������������������������������������������������ܦ������͌555"��ۄ�����������������������������������������������������������������������������������ۥ����"""4:::&������������������������������������������������������������������������������������ڤ������Ñ%%%5��ˎ�����������������������������������������������������������������������ܤ��������������������������������������������������������������������������������������������������ׇ
������ww���?ww�?�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�ww�ww�ww�ww�ww�ww�ww�ww�ww�ww�ww�ww�ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�ww��ww��ww��ww��ww��ww��ww�?�ww��ww���ww���ww( @ ����������������������������������!!!0\\\JeeeQ666D555A0$
�������v�H��<��6��0��2��\�������7���q��������������������ڴ���vvvj&&&D1"����g�L��F��@��;��5������?��������������������������������������������������к����V�Q�K��E��?��9������(�����������a���V�������������������������������������[�U�P��J��D��>��8��2��-���������uuun{{{j���������������������������������������`�Z�T�O������������������������������������������������������������������������V��o@��lA�����b�_�Y�S�M��G��B��<��6��0��+���%���<���������������a���V�����������������������m��t>��q?��n@�����b�b�^�X�R�L��F��A��;��5��/��)���$���Y����������wwwn}}}j����������������������~C��v=��s>��p?�����b�b�a�]�W�Q�K��E��@��:��4��.��(���+���������������������������������������{;��x<��v=��s>�����b�b�a�[�V�P��J��D��?��9��3��-��'��������������a���V����������������������~:��{;��x<��u=���p���������������������������������r��=��7��2��,����������yyynj�����������������������9��}:��z;��w<��u>��r?��o@��lA��iB��fD�}dE�|cE�|cE���i���B��<��6��1��������������������������������������?��9��}:��z;��w=��t>��q?��n@��kA��iC��fD�}cE�|cE�}dF�����G��A��;��=�������������a���V���������������������ңi���8��9��|:��y<��v=��s>��q?��n@��kB��hC��eD�|cE�|cE�����L��F��@��m����������zzzn���j�������������������������ʓP���8��~9��{;��y<��v=��s>��p?��mA��jB��gC�eD�|cE�����P��J��\��������������������������������������������������������������������������������¯��mA��jB��gC�~dE��������������������������a���V��������������������������������������}:��z;��x<��u=��r?��o@��lA��iB��fD���������|||n���m���������������������������������������9��������w=��t>��q?��n@��lA��iC�������������JJJ��������������������������������������������őP��������y<��v=��t>��q?��n@��~Y������������VVV�???�www�����iii�����������������������������������Ρk���A��|;��y<��v=��yF���p��������>>>3@@@y����~~~obbb�000�kkk�@@@������������������������������������������������������������������---U��������������<<<�&&&�[[[�������������������������������������������������������6���uuu�sss�WWW�III�$$$�&&&�qqq�����������������������������������lllg|||s���4����bbb�hhhƑ�������UUU�000�QQQ�}}}��������������������������������---{bbb�����(����������������������iii�LLL�BBB������������������������������������������������������a���V����������������ggg�+++�NNN�������������������������������������������|||n���j����������������]]]�ttt�kkk�������������������������������������������������������������������rrr�www���������������������������Ӧ�������a���V���������������������������������������������������Ӧ����zzzn���j�������������������������������������������Ӧ�����������������������������������������������������������ˉ��?������������������?�?�?���������������?�(  ������C�������������������﫫�o���������I�����������������������������������������ਨ������������S��=��?���������������������������������_�Q�F����4���������������������������������a�Z��������������������������������������м���oE�����c�a�X�M��B��7��0��������������������~I��q?�����c�`�V�K��@��5��8��������������������z;��u=���q�����������������v�>��3����������������������E��y<��t>��n@��iB�~dE�}dF�������G��H������YYY�uuu����������ġ���=��x<��s>��mA��hC�}dE�}eG�����S���������444�|||����������������������������gC�}cE�������������������������MMM������������������~>�����q?��kA��iG������������������RRR��������������¢���G��u=��xK�ʺ��������������������������������������������������������������������������������������������������������������������������������������������~�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A  �(  �h00 �%   � h<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPAD�0000#0(0=0N0`0�0�0�0�011�1C2\2�2�2�2�2�2�2�2363;3]3r3�3�3�3�3�3�34	444.434E4Y4j4�4�4�4�4�4�4�445_5�5�5
6(6C6L6y6�6�6�6�6�6+737F7Q7V7f7p7w7�7�7�7�7�7�7�7�7�7?8L8v8{8�8�8�8Z9g9�9�9�9�9m:y:�:�:�:�:;e;w;�;�;�;$<5<>�> @!1Z2�2q3i4e5�5
660676=6O6W6b6�6�6�67�7�7�7�7�7�7�7�7�7�7�7�7�7�7�78888"8,858@8L8Q8a8f8l8r8�8�8�8�8�8�8�8�8�8�899)959J9Q9e9l9�9�9�9�9�9�9�9�9�9�9�9�9�9	::(:7:>:K:n:�:�:�:�:;;;;S;y;�;< <X<`<�<�<�<�<�<�<�<�<�<�<==
===*=/=4=:=>=D=I=O=T=c=y=�=�=�=�=�=�=�=�=�=�=�=�=>I>�>�>�>�>�>�>�> ?%?M?r?�?�?�?�?�?0�0$0.0X0f0l0�0�0�0�0�0�0�0	1�1�1�1�1�2�2�2�2�23/3K3n3�3�3�3=4V44�4�4�4�455?5�5�56-6A6G6�6�6"7�78848�8�8�8�89{9�9�9�9P:U:Z:_:o:�:�:�:�:=;B;I;N;U;Z;�;�;�;b<q<�<�<�<�<�<�<!>(>�?�?@��01*1�2�2�2�2�2
33 3T3_3i3�3�3�3�3�3/4B4�4�45�5�56#666H6c6k6s6�6�6�6�6�6�6�6�67;7L7o748^8�8�8D9�9�9	::V:K;P;^;k;p;�=�=�=�=�=�=�=>>(>;>F>L>R>W>`>}>�>�>�>�>�>�>�>�>�>�>�>�>�>�>?	?#?4?:?K?�?P�L3X3�3�3�304666+6�6�6�6�6�6G7M7g7v7�7�7�7�7�7�7�7�788'818W8�8�8�8�8�89�:�:;<;�;�;�;�;*<:<g<o<�<�<�<�<==)>?$?�?�?`�y112;2�2�2u3�3Z4d45?5s5�57m7�7�7�7�71898y8�8�8�8959G9�9�9�9�9:6:j:�:�;�;�;<b<�<�<==A=u=�=>�>�>�>�>�>�>4?>?�?�?�?�?�?pr1�1�1�1�1�122$2/2F2R2_2f2�2�2�213J3^3�3�3�3�3�3�3�3�3�3
44"4Y4b4n4�4�4�4�4�4�455)5/5>5D5S5Y5g5p55�5�5�5�5�56}8�8�8�8�8,929f9q9�9X:e:�:�:�:�:;;;;=;c;�;�;�;�;�;�;�;�;�;�;�;�;�;<f<q<�<�<�<�<�<�<�<=$=(=,=0=4=8=<=@=�=�=�=�=�=I>V>o>�>�>�>�?�D0�0�0�12^2�3�4�5�5�56<6�6
7<7�7 8M8`8k8�9�9�;9<W<}<�<�< =�lo0`1�23<35;7?7C7G7K7O7S7W7d7v7�7�7�7�7�7�78�8S9v9�9�:M;W;o;v;�;�;�;�;�;e<�<�>�>?-???Q?c?u?�?�?���1�12222 2$2M2s2�2�2�2�2�2�2�2�2�2�23333v3�3�3�3�3�3�3�3�3-44484<4@4D4H4L4P4�4�4�4�4�4�45%5L5Y5^5l5%7�78#8?8Q8d8v8�8�8�;�;<;<X<c<z<�<�<k=��t1�1�1]2w2�2�2�2�2�233C3^3~3�3�3 4<4�4�4�4�4�4'595�5�5�56
6H6g78&8R8z8�8�8r9�9�9H:N:�:�:�:�: ;&;2;y;5=C=K=X=v=�=�=�=�=�=�=�=�=�>�>�<�1�1�1�12@2M2,3;3�4�5�56
6h6�6�6�7�7�7�7�7�7�7�9�T1X1\1`1d1p1t1�1�1�p�6�6787X7x7�7�7�7�788 8$8@8L8h8t8�8�8�8�8�8�89,909P9p9�9�9�9�9::0:P:\:x:�:�:�:�:;8;X;d;|;�;�;�;�0,040<0D0L0T0\0d0l0t0|0�0�0�0�0�0�0�0�0�0�0�0�0p3t3x3|3�3�3�3�3�3�3�3�3�7�889H9X9h9x9�9�9�9�9�9�9�9�9�9�9�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=>>>>>>>> >$>(>,>0>4>8><>@>D>H>L>P>`>h>l>p>t>x>|>�>�>�>�>�>`?d?site-packages/pip/_vendor/distlib/t32.exe000064400000262000151733463550014271 0ustar00MZ����@���	�!�L�!This program cannot be run in DOS mode.

$����՚��՚��՚�e���՚�ѭ��՚�ѭ��՚�ѭ��՚�ѭ	��՚��՛��՚�ѭ��՚�ѭ��՚�ѭ��՚�Rich�՚�PEL1�R�	���&�@� @���(@�P�x	��(�@�D.textz�� `.rdata#�$�@@.data�,�@�.rsrc�P@R@@.reloc�R@BU�����A3ʼnE��}uE�EP�u������h�hP�(��������Ph��@���@P���j��@�M�3��x�ËL$W3��F��0P��APQ�����t��A�	;u���H�D$+��D0���}̋�_�U���(Wh��@�E�3�h`*AP�}��}��13�;���h�@Q����jW�u����u����E�������$;ljE�}�}�SVW�u��u���u��Sj�u���u���5����� ;�tj��Y�}��}+�E����~�V���E�E��;�Y�E�}�}�W�u��u��C�u�Vj�u��g�u��������3�����h�@P�U�����+]�j]�Y�u�}����Q�}��,�+u�+u�+�y3�jV�u����u�SjW���3�;����h@�@P�����$�D>�^[�f��\�@f;tH;�s���E�u���E�Y_��V���@�&jjjVP�t$P�<�@��u�0�@��uF��^Ã|$u�d+A��t	jP��@3�@�U�����SVW3�WW�(�@�؍D$Pjp�D$pPj	S�$�@��t�|$pu3�@�3�h`�@P�(�����$�0YYjp�D$lPj	S��@h��@P����jD^V�D$,WP�^���t$ �5,�@j���P�D$\�����$��@P����YYj���P�D$`���$��@P���YYj��P�D$d�����$��@P���YYjhn@�D$T�4�@�D$P�D$$PWWWjWW�uW� �@�uh��@P�O����D$$���t$�d+AS��@�t$�@�@j��t$��@�D$P�t$��@h�@P����YY�t$��@�U��$p�������A3ʼn��SVW��@�8"t� �@�"@��QP�3�YY;�u	�E�_�@��p���P�Y��tF���u�u�h�`*AVW�8�@�=`*A"t�u��	H�E�a*AH�]���E�P��AP������3�;����$<�@P�<���Y��Y��;�s���
t��
tA;�r����3�����hT�@P����YY���P��Y��tF�>u�3��>#h��@��P����YY���P�Y��tF���u�3��>!h��@��P���YY���P�Y��tF���u�ƍP�@��u�+‹��ÍH�@��u�+��ȋE��P�@��u�+���|8jW���3�����h�@P�C����u��u�Vh�@WWS���,S�����%���;
�Au������U��EPj�u�u�u�u�!��]�U��EV���F��uc�/�F�Hl��Hh�N�;
At�
,A�Hpu�+,��F;0At�F�
,A�Hpu�$�F�F�@pu�Hp�F�
���@�F��^]���U����u�M��f����E�~�E�Pj�u��1�������M�H���}�t�M��ap���U��=T#Au�E�
A�A��]�j�u���YY]�jh�@��>�u��tu�=�,AuCj�3Y�e�V��3Y�E�t	VP�4YY�E�������}�u7�u�
j�2Y�Vj�5�#A�D�@��u� ��0�@P���Y�>�U��Q�e�V�E�P�u�u�@�����u9E�t����t
���M����^��jh�@�=�e��u;5�,Aw"j��2Y�e�V��:Y�E��E������	�E��>�j��1YË�U��V�u�����SW�=H�@�=�#Au�Ej��Ch��AYY��,A��u��t���3�@P���uV�S���Y��u��uF�����Vj�5�#A�׋؅�u.j^90(At�u�`EY��t�u�{������0���0_��[�V�9EY��3�^]øAá�<AVj^��u��;�}�ƣ�<AjP�GYY��,A��ujV�5�<A�GYY��,A��ujX^�3ҹA���,A��� �����A|�j�^3ҹAW������+A����������t;�t��u�1�� B��pA|�_3�^���I�=%At�G�5�,A�D���YË�U��V�u�A;�r"��`Aw��+����Q��0�N�Y�
�� V�L�@^]Ë�U��E��}��P��0�E�H�Y]ËE�� P�L�@]Ë�U��E�A;�r=`Aw�`���+�����P�/Y]Ã� P�P�@]Ë�U��M���E}�`�����Q�u/Y]Ã� P�P�@]��������������̍B�[Í�$�d$3��D$S����T$��t�
��:�tτ�tQ��u��W���V؋
����~����3������3�3ƃ����u%�t�%u���u�^_[3�ËB�:�t6��t�:�t'��t��:�t��t�:�t��t��^_�B�[ÍB�^_[ÍB�^_[ÍB�^_[��̋D$S��tR�T$3ۊ\$��t�
��2�tr��t2��u��rW����ߋ�����_��t�
��2�t@��u�[�r�
3˿���~���3σ����t�J�2�t#2�t��2�t2�t��_�B�[ÍB�_[ÍB�_[ÍB�_[�jh �@�93ۉ]�3��};���;�u�L�SSSSS����3��y3��u;���;�t�3�8��;�t���I�E;�u
���ʉ]�8u ��j��E�Ph�A��J���P�uVW��F���E��E������	�E��;9�u�H���YË�U��VW�}3�;�u�j_VVVVV�8� �����$h��u�u�������;�t3���_�_^]Ë�U����MS�]VW3��M��]�9}t!9}t;�u�-WWWW�W���3�_^[�Ëu;�t
��3�u9Ev!���tSWQ��S��;�t���3�u9Ew��}�}�F�}��t�F�E���E������FtD�F��t=�5��;�r��;}���W�6�u��u���R)~>}�+߃�)}��}��;]�rh�}�t����3�;�v	���u����u��+������;�w��;E���P�u�V�aRYP�]Q�����������E�+�)E��(V�LJY������}�tN�M��E���FK�M��E�������E���3��}�t�uV�u�R���VVVV�"V�r����}�t�uj�u�tR���y�"3�PPPPP�E����N ��+�3�u�=����N��jh@�@�63��u�9ut79ut29uu5�}�t�uV�u�R����VVVVV���3��6�u����Y�u��u�u�u�u�u������E��E�������E���u�U���YË�U��u�u�uj��u�R�����]�jh`�@��53��u�3��];���;�u �x�VVVVV�������3�9u��;�tԉ]S�o���Y�u��C@uwS�|PY���t���t����ȃ�����+A��A�A$u)���t���t���������+A��A�@$�t���VVVVV�f���M�9u�u#S�)Q���EPV�uS�u�E�SW�Q���E������	�E��5�u����YË�U���SW�}3�;�u �hSSSSS��������fW�O9_Y�E�}�_jSP��Q��;ÉE�|ӋW��u+G�.��OV��+�u��tA�U��u������+A�����D2�t��;�s��:
u�E�3�B;�r�9]�u�E�����x�����G���W;�u�]���]��u�+��������+A�E����D0�tyjj�u��Q��;E�u �G�M��	�8
u�E@;�r�G �@j�u��u���P����}���:�9Ew�O��t��t�G�E��D0t�E�E)E��E�M��^_[��jh��@�33�3�9u��;�u���VVVVV�L�����'�u����Y�u��u����Y�E��E������	�E��3�u����YË�U��V�u�F��u�`����g���}�FuV����E�eYV�>�FY��y��F��t�t�u�F�u�uV�GMYP�O3Ƀ������I��^]�jh��@�23�3�9u��;�u���VVVVV�T�����>�};�t
��t��u�u����Y�u�W�u�u�������E��E������	�E��1�u����Y�U��SV�uW3���;�u�MWWWWW�������B�F�t7V�=V���QV�`LP�@P����}����F;�t
P�f�Y�~�~��_^[]�jh��@�"1�M�3��u3�;���;�u���WWWWW�R������F@t�~�E��%1�V��Y�}�V�*���Y�E��E�������ՋuV����YË�U��= At�8�u��6h��4YY]�jh�@�}0�MZf9@u8�<@��@PEu'�f9�@u��t@v3�9��@���M���e�j�#Y��uj�n���Y�/!��uj�]���Y�
V�e��a8��}j�33Y��@��,A�T� A��S��}j�
3Y�cQ��}j	�2Yj�3Y��tP��2Y��$A��$AP�5�$A�5�$A�}����E�}�uP�*5�Q5�.�E��	�M�PQ�OYYËe�E܉E�}�uP�5�05�E������E��}/��U�����U���(�!A�
!A�!A�!A�5!A�=!Af�0!Af�
$!Af�!Af�� Af�%� Af�-� A��(!A�E�!A�E� !A�E�,!A�����h A� !A� A� A	�� A��A�������A������`�@�` Aj�FUYj�\�@h��@�X�@�=` Auj�"UYh	���@P�T�@��U��QV�uV�I�E�FY��u���	�N ���/�@t
��"��S3ۨt�^����N���F�F�����F�^�]��u,��� ;�t���@;�u
�u�r^Y��uV�^Y�FW���F�>�H��N+�I;��N~WP�u�]���E��M�� �F���y�M���t���t�����������+A��A�@ tjSSQ�{T#ƒ����t%�F�M��3�GW�EP�u�\���E�9}�t	�N ����E%�_[^�Ë�U��G@SV���t2�u,�E�+��M���aC�>�u�O
�8*u�ϰ?�`�}�^[]Ë�U���x��A3ʼnE�S�]V�u3�W�}�u����������������������������������������������������3���u5���3�PPPPP�M��������t
�������`p�����
�F@u^V��FY�A���t���t�ȃ�������+A���A$u����t���t�ȃ�������+A���@$��g���3�;��]��������������������������
C�����������
��, <Xw������@��3��3�3������@j��Y������;���	�$��4@������������������������������������v	�ƒ� tJ��t6��t%HHt���W	����K	����?	����3	�����$	����	��*u,���������;�����������������������k�
�ʍDЉ�������������*u&���������;�����������������k�
�ʍDЉ����{��ItU��htD��lt��w�c����T�;luC���������9����-��� �!�<6u�{4uCC����������<3u�{2uCC�������������<d��<i��<o��<u��<x��<X��������������P��P������u\Y������Yt"������������9]�C������������������������]�M�ƒ�d���y��S������AtHHtXHHtHH���� Dž�����������@9������������������HDž������0���������0u
����������u����������������������;�u��A��������Dž������X��HHty+��'���HH������������t0�G�Ph���P����P�Z����tDž������G����Dž����������5��������;�t;�H;�t4��������t�+��Dž��������������A����P�/XY����p������e����g�4�����itq��nt(��o������Dž��ta����U�7��������W���/������ tf�����f��������Dž��������@Dž��
����������W����u��gueDž���Y9���~���������~?������]V�T0����Y��������t�������������
Dž���3�����������G�������������P����������������P������������SP�5xA�Y�Ћ������t 9���u������PS�5�A�yY��YY����gu;�u������PS�5�A�TY��YY�;-u���C����S����Dž���������$��s�����HH���������Dž����'����Dž���i���������Qƅ���0�����Dž����E������K������� t�������@t�G���G����G���@t��3҉������@t;�|;�s�؃��ځ�������ڋ�u3ۃ���}Dž��������9���~�������u!�����u������������t-�����RPSW�QW��0��9����������~������N뽍E�+�F�����������ta��t�΀90tV���������0@�>If90t@@;�u�+�����(;�u��A���������I�8t@;�u�+��������������\����@t2�t	ƅ���-��t	ƅ���+��tƅ��� Dž��������+���+�������u�����������Sj �W������������������������v������Yt���uWSj0�������V�����������tf��~b�����������������Pj�E�P������FPF�RU����u(9�����t ������������M���������Yu�������������P��������Y�����|���tWSj ������V��������t�������~�������Y������������t����������������������t
�������`p�������M�_^3�[���Ð�,@�*@*+@�+@�+@�+@%,@S-@��U��E�4#A]Ë�U���(��A3ʼnE������SjL�����jP�V<�������(�����0�������,��������������������������������f������f����f�����f�����f������f�����������E�MDž0�����������I�����Dž����Dž��������`�@j��\�@��(���P�X�@��u��uj�FYh���@P�T�@�M�3�[����Ë�U��54#A�
Y��t]��j�nFY]�����U��E3�;͘AtA��-r�H�wj
X]Ë͜A]�D���jY;��#���]����u�AÃ���z��u�AÃ�Ë�U��V����MQ����Y������0^]Ë�U��� S3�9]u ���SSSSS��*��������V�uW�};�t!;�u�r���SSSSS���������j�����E�;�w�}�u�E�u�E�B�u�u�P�u�U���E;�t4;�|"�M�x�E���E�PS�"�YY���t�E�3�9]�\>���HH_^[�Ë�U��QS3�9]u ����SSSSS��`���������V�uW9]u;�u9]u3��;�t�};�w���������u�u�u;}v-�8�E@PVh��@��������uL�V����8"ue�L����8�\�WVh��@�E�������\>����u�}�u� ����8"u/�����M���#;�}"����u����"SSSSS�������_^[�Ë�U��uj�u�u�u�u������]�-�t"��t��
tHt3�øøøøË�VW��h3��FWP�q83��ȋ��~�~�~����~����A���F+ο��@Ou������@Nu�_^Ë�U�����A3ʼnE�SW����P�v�d�@�����3�������@;�r���ƅ���� ��t.�������;�w+�@P��
����j R�7��C�C��u�j�v�������vPW������Pjj�5b3�S�v������WPW������PW�vS�`��DS�v������WPW������Ph�vS��_��$3���E������t�L���������t�L ���������Ƅ@;�r��V��Dž������3�)���������ЍZ ��w�L�р� ���w�L �р� ���A;�r‹M�_3�[������jh�@���
���,A�Gpt�lt�wh��uj ��Y�����j
�Y�e��wh�u�;50At6��tV�l�@��u��AtV���Y�0A�Gh�50A�u�V�h�@�E������뎋u�j
�gYË�U���S3�S�M��I���8#A���u�8#A�t�@8]�tE�M��ap��<���u�8#A�p�@�ۃ��u�E�@�8#A��8]�t�E��`p���[�Ë�U��� ��A3ʼnE�S�]V�uW�d�����3��};�u�����3���u�3�9�8A���E�0=�r���p����d��P�x�@���R�E�PW�d�@���3h�CVP��43�B���{�s9U����}����u������F����h�CVP�4�M��k�0�u�HA�u��*�F��t(�>����E�4AD;�FG;�v�}FF�>uыu�E���}��u�r�lj{�C�g���j�C�C��<AZf�1Af�0A@@Ju����������L@;�v�FF�~��4����C���@Iu��C�����C�S��s3��ȋ�����{����958#A�X������M�_^3�[������jh �@���M�����}������_h�u�u����E;C�Wh �M"Y�؅��F���wh���#S�u���YY�E����u�vh�l�@��u�Fh=AtP�r��Y�^hS�=h�@��Fp���,A��j
�#Y�e��C�H#A�C�L#A�C�P#A3��E�}f�LCf�E<#A@��3��E�=}
�L��(A@��3��E�=}����0A@��50A�l�@��u�0A=AtP���Y�0AS���E�������0j
�
Y��%���u ��AtS���Y�������e��E��Ã=�,Auj��V���Y��,A3�Ë�U��SV�u���3�W;�to=XAth���;�t^9uZ���;�t9uP�
������W^YY���;�t9uP���������]YY��������������YY���;�tD9u@���-�P��������+�P������+�P�������y��������=�At9��uP��[�7�R��YY�~P�E��0At�;�t9uP�-��Y9_�t�G;�t9uP���Y���Mu�V���Y_^[]Ë�U��SV�5h�@W�}W�֋����tP�֋����tP�֋����tP�֋����tP�֍_P�E�{�0At	���tP�փ{�t
�C��tP�փ��Mu֋���P��_^[]Ë�U��W�}����SV�5l�@W�֋����tP�֋����tP�֋����tP�֋����tP�֍_P�E�{�0At	���tP�փ{�t
�C��tP�փ��Mu֋���P��^[��_]Å�t7��t3V�0;�t(W�8���Y��tV�E����>Yu��8AtV�Y���Y��^�3��jh@�@�e�,��,A�Fpt"�~lt��pl��uj �yY���x�j�1Y�e��Fl�=A�i����E��E�������j�,Y�u�Ë�U��V�5$A�5��@�օ�t!� A���tP�5$A��Ѕ�t����'���@V�|�@��uV�Y��th��@P���@��t�u�ЉE�E^]�j���YË�U��V�5$A�5��@�օ�t!� A���tP�5$A��Ѕ�t����'���@V�|�@��uV�?Y��th��@P���@��t�u�ЉE�E^]���@���V�5$A���@��u�5|#A�e���Y��V�5$A���@��^á A���tP�5�#A�;���Y�Ѓ
 A��$A���tP���@�
$A��ijh`�@����@V�|�@��uV�Y�E�u�F\�@3�G�~��t$h��@P���@�Ӊ��h��@�u�Ӊ���~pƆ�CƆKC�FhAj
�Y�e��vh�h�@�E������>j�Y�}��E�Fl��u�A�Fl�vl����Y�E��������3�G�uj
��Y�j��YË�VW�0�@�5 A������Ћ�uNhj�|��YY��t:V�5 A�5�#A���Y�Ѕ�tjV����YY���@�N���	V�m��Y3�W���@_��^Ë�V������uj�]Y��^�jh��@��u�����F$��tP� ��Y�F,��tP���Y�F4��tP���Y�F<��tP���Y�F@��tP����Y�FD��tP����Y�FH��tP����Y�F\=�@tP���Yj
�Y�e��~h��tW�l�@��u��AtW���Y�E������Wj�VY�E��~l��t#W��Y;=At��8At�?uW���Y�E������V�6��Y�K��uj
�%YËuj�YË�VW���@V�|�@��uV��Y�����^�5��@h��@W��h��@W�x#A��h��@W�|#A��h��@W��#A�փ=x#A�5��@��#At�=|#At
�=�#At��u$���@�|#A���@�x#A�C@�5�#A��#A���@�$A������5|#AP�օ�����5x#A�����5|#A�x#A�����5�#A�|#A���5�#A��#A�������#A�[��teh�E@�5x#A�=���Y�У A���tHhj���YY��t4V�5 A�5�#A�
���Y�Ѕ�tjV���YY���@�N��3�@����3�_^Ë�U���S�u�M��n���]�C=w�E苀��X�u�]�}�E�P�E%�P�@YY��t�Ej�E��]��E�Y�
3Ɉ]��E�A�E�j�p�p�E�PQ�E�P�E�jP�:S�� ��u8E�t�E�`p�3���E�#E�}�t�M�ap�[�Ë�U��3�9Ej��hP���@��#A��u]�3�@��,A]Ë�VW3���#A�<�4Au��0A�8h��0���L\YY��tF��$|�3�@_^Ã$�0A3���S���@V�0AW�>��t�~t
W��W�0���&Y����PA|ܾ0A_���t	�~uP�Ӄ���PA|�^[Ë�U��E�4�0A�P�@]�jh��@�3�G�}�3�9�#Au�j��h��YY�u�4�0A9t���nj�%Y��;�u�%��3��Qj
�YY�]�9u,h�W�C[YY��uW�^��Y�����]���>�W�C��Y�E������	�E��I�j
�(���Y�U��EV�4�0A�>uP�"���Y��uj�Y�6�L�@^]�U��
�,A��,Ak����U+P��r	��;�r�3�]Ë�U����M�AV�uW��+y������i���D�M�I�M�����S�1��U�V��U��U�]��ut��J��?vj?Z�K;KuB���� s����L��!\�D�	u#�M!��J���L��!����	u�M!Y�]�S�[�M�M�Z�U�Z�R�S�M����J��?vj?Z�]����]���+u��]���j?�uK^;�v��M����J�M�;�v��;�t^�M�q;qu;���� s�����!t�D�Lu!�M!1��K����!����Lu�M!q�M�q�I�N�M�q�I�N�u��]�}�u;����M�ыY�N�^�q�N�q�N;Nu`�L�M���L�� s%�}u�ʻ���M	������D�D	�)�}u�J����M	Y�J���ꍄ��	�E���D0��E�����$A�����
�,A�5��@h@��H��SQ�֋
�,A��$A����	P��$A�@�
�,A������$A�@�HC��$A�H�yCu	�`���$A�x�ueSj�p�֡�$A�pj�5�#A�D�@�
�,A��$Ak���,A+ȍL�Q�HQP�X�E���
�,A;�$Av�m��,A��,A�E��$A�=�,A[_^�á�,AV�5�,AW3�;�u4��k�P�5�,AW�5�#A���@;�u3��x��,A�5�,A��,Ak�5�,Ah�Aj�5�#A�H�@�F;�t�jh hW���@�F;�u�vW�5�#A�D�@뛃N��>�~��,A�F����_^Ë�U��QQ�M�ASV�qW3���C��}���i���0Dj?�E�Z�@�@��Ju�j��h��yh�W���@��u�����p�U�;�wC��+���GA�H���������������@���Pǀ��IuˋU��E���O�H�A�J�H�A�d�D3�G�����FC������E�NCu	x�������!P��_^[�Ë�U����M�ASV�uW�}��+Q������i���D�M�O����I;�|9���M�]��U���E�;��;�M���I�M���?vj?Y�M��_;_uC���� s��M��L��!\�D�	u&�M!������M��L��!����	u�M!Y�O�_�Y�O��y�M+�M��}����}��M��O�L1���?vj?_�]���]�[�Y�]�Y�K�Y�K�Y;YuW�L�M���L�� s�}u�ϻ���M	�D�D��� �}u�O����M	Y�����O����	�U�M��D2���L���U�F�B��D2��<3��8�/�])u�N�K��\3��u��N�]�K���?vj?^�E����u���N��?vj?^�O;OuB���� s����t��!\�D�u#�M!��N���L��!����	u�M!Y�]�O�w�q�w�O�q�uu��u��N��?vj?^�M��y�K�{�Y�K�Y�K;KuW�L�M���L�� s�}u�ο���M	9�D�D��� �}u�N����M	y�����N����	�E��D�3�@_^[�Ë�U�����,A�Mk��,A�����M�SI�� VW}����M���
����3���U��
�,A����S�;#U�#��u
���];�r�;�u��,A��S�;#U�#��u
���];�r�;�u[��{u
���];�r�;�u1��,A�	�{u
���];�r�;�u����؉]��u3��	S�:���Y�K��C�8�t��,A�C��U����t�����|�D#M�#��u)�e�����HD�9#U�#��u�E��������U���i���D�M�L�D3�#�u����#M�j _��G��}��M�T��
+M��N��?�M�~j?^;���J;Ju\�� ��}&����M��|8�Ӊ]�#\�D�\�D�u3�M�]!�,�O���M������|8��!��]�u�]�M�!K��]�}��J�z�y�J�z�y���M��y�J�z�Q�J�Q�J;Ju^�L�M���� �L}#�}u������	;�ο���M�	|�D�)�}u
�N����	{�M������N����	7�M���t�
�L���M��u�эN�
�L2��u��y�>��u;�$Au�M�;
�,Au�%�$A�M���B_^[�����hPV@d�5�D$�l$�l$+�SVW��A1E�3�P�e�u��E��E������E��E�d�ËM�d�
Y__^[��]Q�����������̋�U���S�]V�s35�AW��E��E��{���t
�N�38�W����N�F�38�G����E�@f��M�U�S��[�E�M��t_�I�[�L��D��E��E���t�����E���|@G�E��؃��u΀}�t$����t
�N�38�Ծ���N�V�3:�ľ���E�_^[��]��E��ɋM�9csm�u)�=�,At h�,A�S����t�UjR��,A���M�k�E9Xth�AW�Ӌ��n�E�M��H����t
�N�38�A����N�V�3:�1����E�H��������9S�R���h�AW�������jh�@�����M3�;�v.j�X3��;E�@u����WWWWW�0����3����M��u;�u3�F3ۉ]��wi�=�,AuK�����u�E;�,Aw7j��Y�}��u���Y�E��E������_�]�;�t�uWS���;�uaVj�5�#A�H�@��;�uL9=0(At3V�qY���r����E;��P�����E���3��uj�9�Y�;�u
�E;�t����8���Ë�U��W��W���@�u�|�@�����`�w��t�_]Ë�U����u��5PA�%�h��Ѓ�]Ë�U��h�@�|�@��th�@P���@��t�u��]Ë�U��u����Y�u��@�j�U�Y�j�r�YË�U��V������t�Ѓ�;ur�^]Ë�U��V�u3����u���t�у�;ur�^]Ë�U��=�,Ath�,A�OPY��t
�u��,AY�-hd�@hL�@���YY��uBh|@�R�D�@�$H�@�c����=�,AYth�,A�OY��tjjj��,A3�]�jh�@�r���j�q�Y�e�3�C9%A���%A�E�%A�}���5�,A��Y���}؅�tx�5�,A��Y��u܉}�u���u�;�rW�{�9t�;�rJ�6�u����e����5�,A�_����5�,A�R���9}�u9E�t�}�}؉E��u܋}��ht�@�h�@�_���Yh|�@�x�@�O���Y�E�������}u(�%Aj��Y�u���3�C�}tj��Y����Ë�U��jj�u������]Ë�U��jj�u�����]�jjj������jjj�����Ë�V�w���V�"V��IV���V�RV�RV�PV�
V�fPh�[@�����$�PA^�U��QQS�]VW3�3��}�;�XAt	G�}���r��wj��SY���4j�SY��u
�=�A�����Ah��@�S�%AW�C����t
VVVVV�_����h�1%AVj�5&A�8�@��u&h��@h�V�|C����t3�PPPPP�����V�e*@Y��<v8V�X*��;�j�,(Ah��@+�QP�B����t3�VVVVV�������3�h��@SW�A����t
VVVVV������E��4�\ASW�A����t
VVVVV�����h h��@W�$Q���2j�,�@��;�t$���tj�E�P�4�\A�6�)YP�6S���@_^[��j�JRY��tj�=RY��u�=�Auh��)���h�����YY�U��E�,(A]�U��5,(A�7�Y��t�u��Y��t3�@]�3�]�jTh�@���3��}��E�P���@�E�����j@j ^V�lYY;����+A�5p+A���0�@���@
�x�@$�@%
�@&
�x8�@4��@�
�+A��;�r�f9}��
�E�;����8�X�;�E�;�|���E��[j@j ��YY��tV�M���+A��p+A ���*�@���@
�`�`$��@%
�@&
�`8�@4��@��;�r�E�9=p+A|���=p+A�e���~m�E����tV���tQ��tK�uQ���@��t<�u�������4��+A�E����Fh��FP�*FYY�����F�E�C�E�9}�|�3ۋ��5�+A����t���t�N��r�F���uj�X�
��H������P�,�@�����tC��t?W���@��t4�>%���u�N@�	��u�Nh��FP�EYY��t7�F�
�N@�����C���g����5p+A���@3��3�@Ëe��E����������Ë�U��VW3��u職����Y��u'94(AvV���@���;4(Av����uʋ�_^]Ë�U��VW3�j�u�u���������u'94(AvV���@���;4(Av����uË�_^]Ë�U��VW3��u�u�3O��YY��u,9Et'94(AvV���@���;4(Av����u���_^]�jh0�@�`�3ۉ]�j�Z�Y�]�j_�}�;=�<A}W������,A�9tD��@�tP���Y���t�E�|(��,A��� P���@��,A�4�!���Y��,A�G��E������	�E����j��YË�U��SV�u�F�Ȁ�3ۀ�u@�t9�FW�>+���~,WPV�YP�Q#��;�u�F��y��F��N ��_�F�f�^��[]Ë�U��V�u��u	V�5Y�/V�|���Y��t����F@tV�5P��OY��Y��3�^]�jhP�@��3��}�}�j��Y�}�3��u�;5�<A����,A��98t^��@�tVPV���YY3�B�U���,A���H���t/9UuP�J���Y���t�E��9}u��tP�/���Y���u	E܉}��F�3��uࡼ,A�4�V����YY��E�������}�E�t�E����j�q�Y�j����YË�U�����)AS3�V�u�E��]�]��]��F�> t��<at9<rt,<wt���SSSSS��H����3��p�E��M��]��E	�M�3�AF�W:����Q�@;��.����S������ ���tVHtG��t/��
t"����9]����M�E���	U���E@���M@��E���E���E����E�E���‰E��9]�uw�M �E��u��Tt\��tEHt1��t����E�uF	}�L9]�u<�e������E��79]�u'	}��E��&�E�u�M���Et3���MF�:�����9]����F�> t�jVh��@�Y���������F�> t��>=upF�> t�jh��@V��W����u���M�Ajh�@V��W����u���M�!jh�@V�W����u���M�F�> t�8t���SSSSS�������h��u�E�u�uP�U����t3�� �E� A�M��H�M�X��X�X�H_^[��jhx�@�e�3�3��}�j�]�Y�]�3��u�;5�<A����,A��9t[��@��uH��uA�F���w�FP�X�Y������,A�4�V�'���YY��,A���@�tPV�~���YYF둋��}��h��j8���Y�
�,A���,A�9tIh���� P�>YY����,Au�4�ï��Y��,A����� P�L�@��,A�<�}�_;�t�g��_�_��_�O��E����������Ë}�j�g�Y��SVW�T$�D$�L$URPQQhDh@d�5��A3ĉD$d�%�D$0�X�L$,3�p���t;�T$4���t;�v.�4v�\���H�{u�h�C�:X��C�LX�d���_^[ËL$�A�t3�D$�H3��|���U�h�p�p�p�>�����]�D$�T$���U�L$�)�q�q�q(������]�UVWS��3�3�3�3�3���[_^]Ë��j�W3�3�3�3�3���U��SVWjjh�h@Q�m_^[]�U�l$RQ�t$�����]���U��V�uW3�;�u���WWWWW��������F�����@���t�� �F�����F�u	V�Y��F��v�vV�tYP�p���F;���������F�uOV�JY���t.V�>Y���t"V�2��V�<��+A�"��Y��Y��A�@$�<�u�N �~u�F�t�u�F��N�A���������	F�~��_^]Ë�U����UV�uj�X�E�U�;�u�m��� �R���	���S3�;�|;5p+Ar'�C����)��SSSSS�	��������Q���W�<��+A�����ƊH��u���������	�j�����wP�]�;������9]t7�@$���E���HjYtHu��Шt��U�E�E����Шu!�����w���SSSSS������4����M;�r�E�u�@���Y�E�;�u�?����G������hjSS�u�G��D(�E���T,��AHtt�I��
tl9]tg��@�M�E��D
8]�tN��L%��
tC9]t>��@�M�}��E��D%
u$��L&��
t9]t��@�M�E��D&
S�M�Q�uP��4���@���{�M�;��p;M�g�M�D�����}��;�t
�M�9
u��� ��]�E�É]�E�;����M�<��<
t�CA�M��E�H;�s�A�8
u
AA�M�
�u�E�m�Ej�E�Pj�E�P��4���@��u
�0�@��uE�}�t?��DHt�}�
t��
��M��L�%;]�u�}�
t�jj�j��u����}�
t�
C�E�9E�G������D�@u����C��+E�}��E�������K���xC�3�@�����;]�rK�@��PAt�����PA��u
�����*�zA;�u��@��AHt$C���Q|	���T%C��u	���T&C+���ؙjRP�u�����E�+]���P�uS�u�jh����@�E�u4�0�@P���Y�M�E�;EtP迨��Y�E�����E���E�3�;�����E�L0��;�t�M�f�9
u��� ��]�E�É]�E�;����E�f����f��
tf�CC@@�E��M�;�s�Hf�9
u
���Ej
��M��Ej�E�Pj�E�P��4���@��u
�0�@��u[�}�tU��DHt(f�}�
t�j
Xf���M��L��M��L%��D&
�*;]�uf�}�
t�jj�j��u�e
��f�}�
tj
Xf�CC�E�9E�������t�@u��f�f�CC+]�]�����0�@j^;�u�����	�����0�i�����m�Y����]��\���3�_[^��jh��@����E���u���� ����	���3�;�|;p+Ar!����0�p���	VVVVV������ɋ�����+A��������L9��t�����;M�Au�<���0�"����P�hQY�u���D8t�u�u�u�~������E�������	�����0�M��E������	�E��K��u�QYË�U��EV3�;�u���VVVVV��0��������@^]Ë�U��V�uW3�;�u3��e9}u�l��j^�0WWWWW��������E9}t9urV�u�u�0���uW�u�"��9}t�9us���j"Y����jX_^]ËT$�L$��ti3��D$��u��r�=h+At��RW����r1�ك�t+ш����u����������ʃ���t��t
�����u��D$_ËD$Ë�U��V�uV����P�YY��t|�æ���� ;�u3��賦����@;�u`3�@� A�FuNSW�<�8(A�?�u S�%�Y���u�Fj�F�X�F�F�
�?�~�>�^�^�N3�_@[�3�^]Ë�U��}t'V�u�FtV�K��f���f�&�fY^]Ë�U��V�uV�NY���u����	���MW�uj�uP���@�����u�0�@�3���tP���Y���������+A�����D0� ���_^]�jh��@���E���u�H��� �-���	���3�;�|;p+Ar!����8����	WWWWW������ɋ�����+A�������L1��t�P�NY�}���D0t�u�u�u������E������	����8�M��E������	�E����u�hNYË�U��V�uWV�?MY���tP��+A��u	���u��u�@Dtj�Mj���MYY;�tV�LYP�@�@��u
�0�@���3�V�[L������+A����Y�D0��tW���Y���3�_^]�jh�@�	��E���u����� ����	���3�;�|;p+Ar!����8����	WWWWW�������ɋ�����+A�������L1��t�P�LY�}���D0t�u����Y�E���2����	�M��E������	�E����u�LYË�U��V�u�F��t�t�v�V����f����3�Y��F�F^]Ë�U��E��8csm�u*�xu$�@= �t=!�t="�t=@�u�:63�]�h�u@�\�@3��Ë�U��QQV������F�V\�\AW�}��S99t��k����;�r�k��;�s99u���3���t
�X�]���u3����u�`3�@�������N`�M��M�N`�H�����
PA�=TA���;�}$k��~\�d9�=PA�TAB߃�;�|�]���~d=��u	�Fd��^=��u	�Fd��N=��u	�Fd��>=��u	�Fd��.=��u	�Fd��=��u	�Fd��=��u�Fd��vdj��Y�~d��`Q�ӋE�Y�F`��[_^�Ã=�,Au���V�5 AW3���u���<=tGV�Y�t���u�jGW����YY�=�$A��tˋ5 AS�BV���C�>=Yt1jS���YY���tNVSP�d(����t3�PPPPP���������>u��5 A����% A�'��,A3�Y[_^�5�$A辞���%�$A����U��Q�MS3�V���U�9Et	�]�E��E��>"u3�9E��"��F�E��<���t��B�U���PF�MY��t��}t
�M��E�F�U�M��t2�}�u��� t��	u���t�B��e��>���< t<	uF��N��>���}t	�E�E��3�C3��FA�>\t��>"u&��u�}�t�F�8"u���
3�3�9E����E����tI��t�\B���u�U���tU�}�u< tK<	tG��t=��P��t#�LY��t
��M�E�F��M��E��
�LY��tF���UF�V�����t�B�U��M�����E^[��t� ���U���S3�VW9�,Au���h�@(AVS�D)A�8�@��,A�5%A;�t�E�8u�u��U��E�PSS�}��
����E���=���?sJ�M�sB�����;�r6P� ���Y;�t)�U��E�P�WV�}������E���H��$A�5�$A3����_^[�Ë�U��H)A��SV�5��@W3�3�;�u.�֋�;�t�H)A�#�0�@��xu
jX�H)A��H)A����;�u�֋�;�u3�����f9t@@f9u�@@f9u�5��@SSS+�S�@PWSS�E�։E�;�t/P�F�Y�E�;�t!SS�u�P�u�WSS�օ�u�u�虛��Y�]��]�W���@���\��t;�u����@��;��r���8t
@8u�@8u�+�@P�E������Y;�uV���@�E����u�VW�%��V���@��_^[�Ë�V��@��@W��;�s���t�Ѓ�;�r�_^Ë�V��@��@W��;�s���t�Ѓ�;�r�_^Ë�U�����A�e��e�SW�N�@����;�t
��t	�У�A�`V�E�P���@�u�3u����@3���@3���@3�E�P���@�E�3E�3�;�u�O�@����u����5�A�։5�A^_[�Ã%l+AË�U��QQ�EV�u�E��EWV�E��D��Y;�u訹���	�Nj��J�u�M�Q�u�P���@�E�;�u�0�@��t	P蚹��Y�ϋ�����+A�����D0� ��E��U�_^��jh��@������u܉u�E���u�?���� �$����	�Ƌ���3�;�|;p+Ar!�����8����	WWWWW胸�����ȋ�����+A�������L1��u&�Ը���8躸���	WWWWW�B����������[P��CY�}���D0t�u�u�u�u������E܉U���l����	�t����8�M��M��E�������E܋U������u�+DYË�U�����I��A3ʼnE��EV3���4���8���0�9uu3���;�u'�����0���VVVVV��p��������SW�}����4��+A�����NJX$����(���'���t��u0�M���u&虷��3��0�}���VVVVV��������C�@ tjjj�u�~������u�iY������D����6���@l3�9H�����P��4�� ����@���`3�9� �t���P���@��4����3���<�9E�B��D���'����g���(�3���
���� ��ǃx8t�P4�U�M��`8j�E�P�K��P�	Y��t:��4�+�M3�@;���j��@�SP��G�������C��D��jS��@�P��G�������3�PPj�M�Qj��@�QP���C��D����@���\j��<�PV�E�P��(���4���@���)��D���0��9�<���8���� ���j��<�Pj�E�P��(���E�
�4���@������<�����0���8��<t<u!�33�f��
��CC��D���@��� �<t<uR��@���DYf;�@��h��8��� �t)j
XP��@��DYf;�@��;��8���0��E9�D�������'����8��T4��D8�3ɋ�@�����4���@�������<�9M� ���(���<���D�+�4���H�;Ms9��<���<��A��
u��0��
@��D��@��D���D��r‹؍�H�+�j��,�PS��H�P��4���@���B��,��8�;��:��<�+�4�;E�L���� ��D�����9M�M���(���D���<�+�4���H�;MsF��D���D��AAf��
u��0�j
[f�@@��<���<�f�@@��<��r��؍�H�+�j��,�PS��H�P��4���@���b��,��8�;��Z��D�+�4�;E�?����@9M�|��D���<�+�4�j��H���^;Ms<��D���D��f��
uj
[f���<��<�f�Ɓ�<��r�3�VVhU
����Q��H���+��+��P��PVh����@��;���j��,�P��+�P��5��P��(���4���@��t�,�;����0�@��@�;�\��D�+�4���8�;E�
����?j��,�Q�u��4��0���@��t��,���@���8���0�@��@���8�ul��@�t-j^9�@�u�p����	�x����0�?��@��|���Y�1��(���D@t��4��8u3��$�0�����8���� �����8�+�0�_[�M�3�^�7�����jh�@�5���E���u���� ����	���3�;�|;p+Ar!�Ӱ���8蹰���	WWWWW�A������ɋ�����+A�������L1��t�P��;Y�}���D0t�u�u�u�.������E���V����	�^����8�M��E������	�E�����u�<YË�U�� Ah���Y�M�A��t
�I�A��I�A�A�A�A�a�]Ë�U��E���u�˯���	3�]�V3�;�|;p+Ar譯��VVVVV�	�5�����3���ȃ������+A���D��@^]Ë�VW3���`A�6誻����Y���(r�_^á�A��3�9L)A���������̋L$��t$�����tN��u���$��$�����~Ѓ�3ƒ���t�A���t2��t$��t��t�͍A��L$+�ÍA��L$+�ÍA��L$+�ÍA��L$+�Ë�U���SV�u3�W�};�u;�v�E;�t�3���E;�t�������v�p���j^SSSSS�0��������V�u�M�貍���E�9X��f�E��f;�v6;�t;�vWSV���������*�����8]�t�M��ap�_^[��;�t2;�w,��j"^SSSSS�0�{�����8]��y����E��`p��m�����E;�t�8]��%����E��`p������MQSWVj�MQS�]�p���@;�t9]�^����M;�t���0�@��z�D���;��g���;��_���WSV�A����O�����U��j�u�u�u�u�|�����]Ë�U����u�M��y����E�M���A%��}�t�M��ap��Ë�U��j�u���YY]��V�D$�u(�L$�D$3��؋D$����d$�ȋ�d$��G�ȋ\$�T$�D$���������u���d$�ȋD$���r;T$wr;D$v	N+D$T$3�+D$T$��؃��ʋӋًȋ�^��A@t�yt$�Ix��������QP�:���YY���u	�Ë�U��V����M�E�M����>�t�}�^]Ë�U���x��A3ʼnE�S�]V�u3�W�}�u��������������������������������������������������������u5�����3�PPPPP������������t
�������`p����
�F@u^V��Y�A���t���t�ȃ�������+A���A$u����t���t�ȃ�������+A���@$��g���3�;��]��������������������������������P
C3�9����������
�ʀ� ��Xw
����p�@��������k�	����@j��^������;����jY;���	�$�n�@3�������������������������������������t	�ƒ� tH��t4+�t$HHt���V		���K	����?	����3	�����$	����	��*u,���������������������������������k�
�ʍDЉ�������������*u&���������������������������k�
�ʍDЉ����z��ItU��htD��lt��w�b����S�;luC���������8����,��� � �<6u�{4uCC����������<3u�{2uCC�������������<d��<i��<o��<u��<x��<X�������������������P��P����Y������Yt"����������������C���������������������������J�ƒ�d���w��S������AtHHtYHHtHH���� Dž�����������@�������������������EDž������0���������0u
����������u������������������������u��A��������Dž����{��X��HHty+��&���HH������������t0�G�Ph���P����P�W�������tDž������G����Dž����������1����������t<�H��t5��������t�+��Dž��������������A����P����Y����p������e����g�2�����itm��nt$��o����������ta����U�7��������M������������ tf�����f��������Dž��������@Dž��
����������G��W���u��gufDž���Z9���~���������~@������]V�������Y������j��t�������������
Dž���^��G��������G�������������P����������������P������������SP�5xA�I���Y�Ћ������t!����u������PS�5�A����Y��YY����gu��u������PS�5�A��Y��YY�;-u���C����S���������������$��s�����HH���������Dž����'����Dž���k���������Qƅ���0�����Dž����G������M������� t�������@t�G���G����G���@t��3҉������@t��|��s�؃��ځ�������ڋ�u3ۃ���}Dž��������9���~�������u!�����u������������t-�����RPSW�����0��9����������~������N뽍E�+�F�����������tb��t�΀90tW���������0@�?If�8t@@��u�+�����(��u��A���������I�8t@��u�+��������������\����@t2�t	ƅ���-��t	ƅ���+��tƅ��� Dž��������+���+�������u�����������Sj ���������������������������������Yt���uWSj0������f��������������tf��~b�����������������Pj�E�P������FPF�����u(9�����t ������������M�蔓��������Yu�������������P������m���Y�����|���tWSj ��������������t�������!���������Y������������t
�����������3�9�����t������t�y���VVVV�V�������t
�������`p�������M�_^3�[�v���Ë�X�@W�@��@�@1�@=�@��@��@��U��E��t���8��uP�k���Y]Ë�U�����A3ʼnE�SV3�W��9P)Au8SS3�GWh��@hS��@��t�=P)A��0�@��xu
�P)A9]~"�M�EI8t@;�u����E+�H;E}@�E�P)A����;��������]�9] u��@�E �5��@3�9]$SS�u���u��P�u �֋�;���~Cj�3�X����r7�D?=w�X5��;�t����P�w���Y;�t	������E���]�9]��>W�u�u�uj�u �օ����5�@SSW�u�u�u�֋ȉM�;����Et)9]��;M���u�uW�u�u�u���;�~Ej�3�X��r9�D	=w�4��;�tj������P���Y;�t	��������3�;�tA�u�VW�u�u�u��@��t"SS9]uSS��u�u�u�VS�u ���@�E�V���Y�u�����E�Y�Y�]�]�9]u��@�E9] u��@�E �u��1Y�E��u3��!;E ��SS�MQ�uP�u �2���E�;�tԋ5�@SS�uP�u�u�։E�;�u3��~=���w8��=w�3��;�t�������P�~��Y;�t	��������3�;�t��u�SW�������u�W�u�u�u�u�։E�;�u3��%�u�E��uPW�u �u��[1��u�����#u�W���Y��u�u�u�u�u�u��@��9]�t	�u���|��Y�E�;�t9EtP��|��Y�ƍe�_^[�M�3��{���Ë�U����u�M��{���u(�M�u$�u �u�u�u�u�u�(����� �}�t�M��ap��Ë�U��QQ��A3ʼnE��T)ASV3�W��;�u:�E�P3�FVh��@V��@��t�5T)A�4�0�@��xu
jX�T)A��T)A����;��������]�9]u��@�E�5��@3�9] SS�u���u��P�u�֋�;���~<���w4�D?=w�1��;�t����P�|��Y;�t	������؅�ti�?PjS�����WS�u�uj�u�օ�t�uPS�u��@�E�S�����E�Y�u3�9]u��@�E9]u��@�E�u�/Y���u3��G;EtSS�MQ�uP�u�7/���;�t܉u�u�u�u�u�u��@��;�tV��z��Y�Ǎe�_^[�M�3��y���Ë�U����u�M��y���u$�M�u �u�u�u�u�u�������}�t�M��ap��Ë�U��V�u�����v�iz���v�az���v�Yz���v�Qz���v�Iz���v�Az���6�:z���v �2z���v$�*z���v(�"z���v,�z���v0�z���v4�
z���v�z���v8�y���v<��y����@�v@��y���vD��y���vH��y���vL��y���vP��y���vT�y���vX�y���v\�y���v`�y���vd�y���vh�y���vl�y���vp�y���vt�y���vx�wy���v|�oy����@����ay������Vy������Ky������@y������5y������*y������y������y������	y������x�������x����,^]Ë�U��V�u��t5�;XAtP��x��Y�F;\AtP�x��Y�v;5`AtV�x��Y^]Ë�U��V�u��t~�F;dAtP�x��Y�F;hAtP�xx��Y�F;lAtP�fx��Y�F;pAtP�Tx��Y�F;tAtP�Bx��Y�F ;xAtP�0x��Y�v$;5|AtV�x��Y^]Ë�U��ES3�VW;�t�};�w蔗��j^�0SSSSS���������<�u;�u��ڋ�8tBOu�;�t��
BF:�tOu�;�u��M���j"Y����3�_^[]�U��V3�PPPPPPPP�U�I�
�t	���$��u���I���
�t	���$s��� ^�Ë�U��SV�u3�W9]u;�u9]u3�_^[]�;�t�};�w�Ŗ��j^�0SSSSS�N���������9]u��ʋU;�u��у}���u�
�@B:�tOu���
�@B:�tOt�Mu�9]u�;�u��}�u�EjP�\�X�x�����K���j"Y���낋�U��MS3�VW;�t�};�w�%���j^�0SSSSS讕�������0�u;�u��ڋъ�BF:�tOu�;�u����j"Y����3�_^[]�������������̋T$�L$��u<�:u.
�t&:au%
�t��:Au
�t:au����
�uҋ�3�Ð�����t���:u�
�t��t�f���:u�
�t�:au�
�t������������U��WV�u�M�}�����;�v;�����r�=h+AtWV����;�^_u^_]�+��u������r*�$��@��Ǻ��r���$���@�$��@��$�x�@��@4�@X�@#ъ��F�G�F���G������r��$��@�I#ъ��F���G������r��$��@�#ъ���������r��$��@�Iۢ@Ȣ@��@��@��@��@��@��@�D��D��D��D��D��D��D��D��D��D��D���D���D���D�������$��@���@��@�@�@�E^_�Ð���E^_�Ð���F�G�E^_�ÍI���F�G�F�G�E^_�Ð�t1��|9���u$������r
��$���@����$�0�@�I�Ǻ��r��+�$���@�$���@���@��@�@�F#шG��������r���$���@�I�F#шG�F���G������r���$���@��F#шG�F�G�F���G�������V�����$���@�I4�@<�@D�@L�@T�@\�@d�@w�@�D��D��D��D��D��D��D��D��D��D��D��D��D��D������$���@����@��@��@��@�E^_�Ð�F�G�E^_�ÍI�F�G�F�G�E^_�Ð�F�G�F�G�F�G�E^_�Ë�U��Q�e�S�]��u3��W��ru�{���vn�M�E�������tR:Q�uM�P���t<:Q�u7�P���t&:Q�u!�P���t:Q�u�E�9}�r��?�@��I��F�@��I��<�@��I��2�@��I��(�M�E����t:u@A�E�9]�r�3�_[����	+��������������U��V3�PPPPPPPP�U�I�
�t	���$��u���
�t���$s�F��� ^�Ë�U��E�\)A]�jh8�@���e��u�u��@�E��/�E���E�3�=�����Ëe�}��uj���@�e��E������E������U��WV�u�M�}�����;�v;�����r�=h+AtWV����;�^_u^_]�'��u������r*�$�ħ@��Ǻ��r���$�ئ@�$�ԧ@��$�X�@��@�@8�@#ъ��F�G�F���G������r��$�ħ@�I#ъ��F���G������r��$�ħ@�#ъ���������r��$�ħ@�I��@��@��@��@��@��@��@x�@�D��D��D��D��D��D��D��D��D��D��D���D���D���D�������$�ħ@��ԧ@ܧ@�@��@�E^_�Ð���E^_�Ð���F�G�E^_�ÍI���F�G�F�G�E^_�Ð�t1��|9���u$������r
��$�`�@����$��@�I�Ǻ��r��+�$�d�@�$�`�@�t�@��@��@�F#шG��������r���$�`�@�I�F#шG�F���G������r���$�`�@��F#шG�F�G�F���G�������V�����$�`�@�I�@�@$�@,�@4�@<�@D�@W�@�D��D��D��D��D��D��D��D��D��D��D��D��D��D������$�`�@��p�@x�@��@��@�E^_�Ð�F�G�E^_�ÍI�F�G�F�G�E^_�Ð�F�G�F�G�F�G�E^_������������̋�U��M�MZf9t3�]ËA<��8PEu�3ҹf9H�‹�]�����������̋�U��E�H<��ASV�q3�W�D��v�}�H;�r	�X�;�r
B��(;�r�3�_^[]������������̋�U��j�hX�@hPV@d�P��SVW��A1E�3�P�E�d��e��E�h@�*�������tU�E-@Ph@�P�������t;�@$���Ѓ��E������M�d�
Y_^[��]ËE��3�=��‹�Ëe��E�����3��M�d�
Y_^[��]Ë�U��QSVW�5�,A�K����5�,A���}��;�����YY;�����+ߍC��rwW�$���CY;�sH�;�s���;�rP�u�迵��YY��u�G;�r@P�u�詵��YY��t1��P�4��V���Y��,A�u�H������V�=���Y��,A�EY�3�_^[�Ë�Vjj ������V��������,A��,A��ujX^Ã&3�^�jhx�@���荭���e��u���Y�E��E������	�E�������l���Ë�U��u��������YH]�jh��@蕩���\����@x��t�e����3�@Ëe��E������"$让���hK�@�c���Y�`)AË�U��E�d)A�h)A�l)A�p)A]Ë�U��E�
\AV9Pt��k�u��;�r�k�M^;�s9Pt3�]�5l)A�w���Y�j h��@���3��}�}؋]��Lt��jY+�t"+�t+�td+�uD�������}؅�u���a�d)A�d)A�`�w\���]��������Z�Ã�t<��t+Ht�:����3�PPPPP�����뮾l)A�l)A��h)A�h)A�
�p)A�p)A�E�P賕���E�Y3��}���9E�uj�ۭ��9E�tP����Y3��E���t
��t��u�O`�MԉG`��u@�Od�M��Gd���u.�
PA�M܋
TA�PA�9M�}�M�k��W\�D�E���������E��������u�wdS�U�Y��]�}؃}�tj蠛��Y�S�U�Y��t
��t��u�EԉG`��u�EЉGd3�苧��Ë�U��E�x)A]Ë�U��E��)A]Ë�U���SVW莔���e��=�)A����h��@��@�����*�5��@h|�@W�օ��P�ؓ���$l�@W��)A��P�Ó���$X�@W��)A��P讓���$<�@W��)A��P虓��Y��)A��th$�@W��P聓��Y��)A��)A;�tO9�)AtGP�ߓ���5�)A���ғ��YY����t,��t(�օ�t�M�Qj�M�QjP�ׅ�t�E�u	�M �9��)A;�t0P菓��Y��t%�ЉE���t��)A;�tP�r���Y��t�u��ЉE��5�)A�Z���Y��t�u�u�u�u����3�_^[�Ë�U��MV3�;�|��~��u� A�(� A�
 A��M���VVVVV��Յ������^]�jh�@�g����]��u�u�g��Y���u��uS�of��Y��=�,A��3��}����j�#���Y�}�S�L���Y�E�;���;5�,AwIVSP�.�������t�]��5V���Y�E�;�t'�C�H;�r��PS�u��M�S����E�SP�"�����9}�uH;�u3�F�u�����uVW�5�#A�H�@�E�;�t �C�H;�r��PS�u���S�u��ՙ�����E������.�}�u1��uF�����uVSj�5�#A���@����u�]j�T���YË}���9=0(At,V�F���Y���������9}�ul��0�@P�k���Y��_����蛄��9}�th��q��uFVSj�5�#A���@����uV90(At4V�ݫ��Y��t���v�V�ͫ��Y�O����3��ƣ����<����|�����u�.�����0�@P�ރ���Y����jh��@�L����E���u�����	���3�;�|;p+Ar�߃���	SSSSS�g������Ћ���<��+A�������L��t�P�Y�]���Dt1�u�lYP��@��u�0�@�E���]�9]�t�~����M��a����	�M��E������	�E��Ǣ���u�.YË�U���0S3�E�VW��]�]��E��]�t	�]��E��
�E��]��E�P�s Y��t
SSSSS�X������M����u��@u9E�t�M������+ú���tGHt.Ht&轂�����蠂��j^SSSSS�0�)�������U����t��u��E�@��}��EjY+�t7+�t*+�t+�t��@u�9}����E���E���E���E���]�E�#¹;��;t0;�t,;�t=��=�@����E��/�E��&�E��=t=t`;������E��E�E���t�
�$A��#M��x�E��@t�M��M��M��t	}� t�M���E�릨t�M��h
����u�T�������7������E�= �@S�u���u�E�P�u�u��u�׉E��um�M���#�;�u+�Et%�e����S�u�E�u�P�u�u��u�׉E��u4�6������+A�����D0� ��0�@P�ŀ��Y虀����t�u���@;�uD�6������+A�����D0� ��0�@��V肀��Y�u�@�@;�u��I����
룃�u�M�@�	��u�M��u�6�	��Ѓ������+AY��Y�M����L��Ѓ������+A���D$� ��M��e�H�M���������Etqj��W�6������E�;�u����8�tM�6�,������j�E�P�6�]���������u�}�u�E�RP�6�y��;�t�SS�6蜻����;�t��E���0�@�@�}u�E�#�u	M�	E�E#�;�tD=t)=@t"=t)=@t"=t=@u�E���M�#�;�u	�E���]��E���E�@�]����E���#�=@��=�tw;����E�;��y��v��v0���f�E�3�H�&H�R�E��E��jSS�6������t�SSS�6�n��#ƒ���������j�E�P�6諱��������u�����tk�����}�uY�E����E�;������b������P���jSS�6�������C���SSS�6������#ƒ���������E�%��=��u�6�"���Y�}��j^�0���d=��uSj�6讹�������������E��ASS�6蓹������E��E��E�+�P�D=�P�6�/�������������9}�ۋ������+A�����D$�2M���0�������+A�����D$�M�������
ʈ8]�u!�Et��ȃ������+A���D� �}�����#�;�u|�Etv�u�@�@S�u�E�jP�u���W�u� �@���u4�0�@P�|����ȃ������+A���D� ��6�Y����6������+A�������_^[��jh�@�L���3��u�3��};���;�u�{��j_�8VVVVV�~{�������Y��3�9u��;�t�9ut�E%������@t‰u��u�u�u�u�E�P���j������E��E�������E�;�t�������3��}9u�t(9u�t�����������+A�D� ��7�CYË�U��j�u�u�u�u�u������]Ë�U���S�u�M��|Z��3�9]u8]�t�E�`p�3����E�9Xu&�u�u�u����8]����M�ap��9]u.��z��SSSSS��Oz����8]�t�E�`p������W�};�u.�z��SSSSS��z����8]�t�E�`p������NV�Mf�	�M�E����D�M�ti9]u��D�]����f�����U�:�u�]��Z��f��f�E��f��M�f;prf;pwfp�6f;pr0f;pw*fp�$�U���At
f������ʉM�f�u�f�����G�D�M�tH9]u�]��^��M:�t��f��f���G�M�f;Hrf;HwfH�6f;Hr0f;Hw*fH�$�U���At
f������ʉM�f�M�f;�u!f;�t	9]����8]�t�E�`p�3�^_[�����H8]�t�M�ap���U��j�u�u�u�����]Ë�U���S3�9]u3���W�u�M��(X���}�9_u&�u�u�u�����8]����M��ap��9]u+�x��SSSSS��x����8]�t�E��`p������mV�u;�u+�Zx��SSSSS���w����8]�t�E��`p������9�Ef��M�E�����D8tA9]u�3�D8t_8]�t�E��`p�3�^_[�ËE�:�u3����f��f�E��f�����F�D:t 9]u3����M:�t�f���f�F��f;�uf;�t�9]�`�������H8]�t��M��ap�냋�U��j�u�u�u�����]����U��SVWUjjhd�@�u�]_^[��]ËL$�A�t2�D$�H�3��TV��U�h�P(R�P$R���]�D$�T$���SVW�D$UPj�hl�@d�5��A3�P�D$d��D$(�X�p���t:�|$,�t;t$,v-�4v���L$�H�|�uh�D��I�D��_뷋L$d�
��_^[�3�d�
�yl�@u�Q�R9Qu��SQ��A�SQ��A�L$�K�C�kUQPXY]Y[����U��EVW��|Y;p+AsQ�������<��+A����<�u5�=�AS�]u��tHtHuSj��Sj��Sj��$�@��3�[��u���	��u��� ��_^]�U��MS3�;�VW|[;
p+AsS������<��+A������@t5�8�t0�=�Au+�tItIuSj��Sj��Sj��$�@���3���8u���	�@u�����_^[]Ë�U��E���u�$u��� �	u���	��]�V3�;�|";p+As�ȃ������+A����@u$��t���0��t��VVVVV�	�Qt��������^]�jh8�@�ߓ���}���������4��+A�E�3�9^u6j
蹈��Y�]�9^uh��FP��YY��u�]�F�E������09]�t����������+A�D8P�L�@�E�蟓���3ۋ}j
�y���YË�U��E�ȃ������+A���DP�P�@]�jhX�@�����M�3��}�j�K���Y��u���bj���Y�}��}؃�@�<�4��+A�����u���+A;����Fu\�~u9j
豇��Y3�C�]��~uh��FP��YY��u�]���F�e��(�}�u�^S�L�@�FtS�P�@��@낋}؋u�j
�v���YÃ}�u��F��+4��+A������u�}�uyG�+���j@j ����YY�E�ta���+A��p+A ���;�s�@���@
�`��@�E�����}����σ������+A�DW����Y��u�M��E������	�E��ّ���j踅��Y�U����}��}�M��f����$�ffGfG fG0fG@fGPfG`fGp���IuЋ}���]�U����}��E���3�+���3�+���u<�M�у��U�;�t+�QP�s������E�U��tEE+‰E�3��}��M��E�.�߃��}�3��}�M��E�M�U�+�RjQ�~������E�}���]�jh��@蘐���e�f(��E��#�E��=�t
=�t3��3�@Ëe�e��E������E�蚐��Ë�U���3�S�E��E�E�S�X��5 P��Z+�tQ�3���E�]�U�M���U��E�[�E�t�\�����t3�@�3�[������h+A3�Ë�U����u�M��O���E�M�U�Tu�}t�M���A#E�3���t3�@�}�t�M��ap��Ë�U��jj�uj�����]Ë�U�����A3ʼnE�V3�95�AtO�=xA�u��
�xA���u����pV�M�Qj�MQP�0�@��ug�=�Au�0�@��xuω5�AVVj�E�Pj�EPV�,�@P���@�
xA���t�V�U�RP�E�PQ�(�@��t�f�E�M�3�^�N������A��U���SV�u3�;�t9]t8u�E;�t3�f�3�^[��u�M��N���E�9Xu�E;�tf�f�8]�t�E��`p�3�@�ʍE�P�P���YY��t}�E���~%9M| 3�9]��R�uQVj	�p���@���E�u�M;��r 8^t���8]��e����M��ap��Y����n���*8]�t�E��`p����:���3�9]��P�u�E�jVj	�p���@���:���뺋�U��j�u�u�u������]���������Q�L$+����#ȋ�%�;�r
��Y���$�-���j舐��YË�U���VW�u�M��WM���E�u3�;�t�0;�u,��m��WWWWW��em�����}�t�E�`p�3���9}t�}|Ƀ}$ËM�S��}��~���~�E�P��jP�b���M���������B����t�G�ǀ�-u�M���+u�G�E���K���B��$�9��u*��0t	�E
�4�<xt
<Xt	�E�!�E�
��u��0u�<xt<XuG�G��������3�u���N��t�˃�0���t1�ˀ�a����w�� ���;Ms�M9E�r'u;�v!�M�}u#�EO�u �}t�}�e��[�]��]ى]��G닾����u�u=��t	�}��w	��u+9u�v&�<l���E�"t�M����EjX��ƉE��E��t�8�Et�]��}�t�E�`p��E���E��t�0�}�t�E�`p�3�[_^�Ë�U��3�P�u�u�u9T#AuhA�P�����]Ë�U�����A3ʼnE�j�E�Ph�u�E���@��u���
�E�P�\Y�M�3��J���Ë�U���4��A3ʼnE��E�M�E؋ES�EЋV�E܋EW3��M̉}�}�;E�_�5d�@�M�QP�֋��@��t^�}�uX�E�P�u�օ�tK�}�uE�u��E����u�u�袻����YF;�~[���wS�D6=w/���;�t8����-WW�u�u�j�u�Ӌ�;�u�3���P�L��Y;�t	������E���}�9}�t؍6PW�u��Z�����V�u�u�u�j�u�Ӆ�t�]�;�tWW�uSV�u�W�u���@��t`�]��[���@9}�uWWWWV�u�W�u�Ӌ�;�t<Vj�=���YY�E�;�t+WWVPV�u�W�u��;�u�u��JJ��Y�}���}�t�MЉ�u����Y�E�e�_^[�M�3���H���������Q�L$+ȃ����Y�Z���Q�L$+ȃ����Y�D���U����}��u��u�}�M�����fofoNfoV fo^0ffOfW f_0fof@fonPfov`fo~pfg@foPfw`fp������Iu��u��}���]�U����}�u��]��]�Ù�ȋE3�+ʃ�3�+ʙ��3�+���3�+����uJ�u�΃��M�;�t+�VSP�'������E�M��tw�]�U�+щU��+ى]�u�}�M��E�S;�u5�ك��M�u�}�M��MM�UU�E+E�PRQ�L������E��u�}�M����ʃ��E�]��u��}��]Ë�U��j
j�u�,�����]Ë�U���S3�VW9]���u�M��CG��9]u.��g��SSSSS��^g����8]�t�E��`p�������};�t˾���9uv(�g��SSSSS��g����8]�t�E��`p����`�E�9Xu�uW�u���8]�tD�M��ap��;�E��M�QP�@�E����M�QP�.��G�Mt;�t;�t�+���3�_^[�Ë�U��V3�95T#Au99uu�f��VVVVV��}f���������'9ut܁}���w�^]��V�u�u�u�����^]��jh��@���3��]3�;���;�u�f���WWWWW�f�������S�=�,Au8j�z��Y�}�S��z��Y�E�;�t�s���	�u���u��E������%9}�uSW�5�#A�4�@���装���3��]�u�j�zy��YË�U���(��A3ʼnE��pAVtj
�l���Y�����tj� ��Y�pA�������������������������������f������f����f�����f�����f������f�����������u�E���Dž0��������@�jP���������jP�1������������(�����0���jDž���@������,����\�@��(���P�X�@j���̋�U���SVW3�jSS�u�]�]������E�#ƒ��U��tYjSS�u�����#ʃ����tA�u�}+����;����Sj�<�@P�H�@�E���u�td����id���_^[��h��u�YY�E���|
;�r�����P�u��u��������t6�+��xӅ�wϋu�u��u��YY�u�j�<�@P�D�@3���d���8u��c���
���u��;�q|;�skS�u�u�u���#ƒ�����D����u��YP�8�@�����H��E�#‰U�u)�c���
�c����0�@��u�#u������S�u�u�u肩��#ƒ��������3�������U��S�]V�u������+A������0�A$�W�y�������@tP���tB��t&��t��u=�I��
�L1$��⁀���'�I��
�L1$��₀���a�
�I��
�L1$�!���_^[u��]���%�@]�U��EV3�;�u�pb��VVVVV��a����jX�
�
X*A�3�^]�3�PPjPjh@h��@� �@�xAáxAV�5@�@���t���tP�֡tA���t���tP��^Ë�U���SV�u�M��MA���]�;�sT�M胹�~�E�PjS�s���M���
����X����t������}�t�E�`p�����E胸�~1�]�}�E�P�E%�P�<���YY��t�Ej�E��]��E�Y��Ha���*3Ɉ]��E�A�E�j�p�U�jRQ�M�QV�p�E�P�����$���o������E�t	�M�����}�t�M�ap�^[���������������U��WVS�M�tM�u�}�A�Z� �I�&
�t'
�t#����:�r:�w�:�r:�w�:�u��u�3�:�t	�����r�ً�[^_����������������̋D$�L$ȋL$u	�D$���S��؋D$�d$؋D$���[��%��@(�6�P�d�z����������,�<�T�j�|�����������.�B�N�f�~���������������$2@Xhv~��������.H^x������&8Jr��������@�?@ǫ@��@v@��@�@1�RLp�p� Ah A(null)(null)EEE50P( 8PX700WP  `h````xpxxxx	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~EncodePointerKERNEL32.DLLDecodePointerFlsFreeFlsSetValueFlsGetValueFlsAllocCorExitProcessmscoree.dllruntime error 
TLOSS error
SING error
DOMAIN error
R6034
An application has made an attempt to load the C runtime library incorrectly.
Please contact the application's support team for more information.
R6033
- Attempt to use MSIL code from this assembly during native code initialization
This indicates a bug in your application. It is most likely the result of calling an MSIL-compiled (/clr) function from a native constructor or from DllMain.
R6032
- not enough space for locale information
R6031
- Attempt to initialize the CRT more than once.
This indicates a bug in your application.
R6030
- CRT not initialized
R6028
- unable to initialize heap
R6027
- not enough space for lowio initialization
R6026
- not enough space for stdio initialization
R6025
- pure virtual function call
R6024
- not enough space for _onexit/atexit table
R6019
- unable to open console device
R6018
- unexpected heap error
R6017
- unexpected multithread lock error
R6016
- not enough space for thread data

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
R6009
- not enough space for environment
R6008
- not enough space for arguments
R6002
- floating point support not loaded
Microsoft Visual C++ Runtime Library

...<program name unknown>Runtime Error!

Program: ccsUTF-8UTF-16LEUNICODE�����������������������������EEE���00�P��('8PW�700PP� (����`h`hhhxppwpp         (((((                  H����������������������          h((((                  H����������������������                                 H�����������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~�����������������������������������������������������������������������������������������������������������������������������HH:mm:ssdddd, MMMM dd, yyyyMM/dd/yyPMAMDecemberNovemberOctoberSeptemberAugustJulyJuneAprilMarchFebruaryJanuaryDecNovOctSepAugJulJunMayAprMarFebJanSaturdayFridayThursdayWednesdayTuesdayMondaySundaySatFriThuWedTueMonSunGetProcessWindowStationGetUserObjectInformationAGetLastActivePopupGetActiveWindowMessageBoxAUSER32.DLLSunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecCONOUT$Fatal error in launcher: %s
rbFailed to open executableUnable to find an appended archive.Unable to read from file#!Job information querying failedJob information setting failedstdin duplication failedstdout duplication failedstderr duplication failedUnable to create process using '%s'Failed to get exit code of processFailed to find shebangExpected to find terminator in shebang lineExpected to find '#' at start of shebang lineExpected to find '!' following '#' in shebang lineExpected to be able to allocate command line memory"%s" "%s" %sH�A��@RSDS���z~-�C��"Iu�G�c:\Users\Vinay\Projects\SimpleLauncher\dist\t32.pdbPVDhl������������l@�����������*@������������@������������@�����������#!@�����������.#@�����������=$@�����������/%@�����������w&@�&@������������;@�����������u?@������������B@�����������'E@����6E@������������F@�����F@������������J@������������X@������������[@�������������`@�`@�����������b@������������c@lc@������������g@������������p@�����������1t@������������u@�����������n~@�����������}�@������������@'�@�����������۪@�@�����������.�@�����������k�@o�@������������e�@�������������@�����������k�@�����������-�@�������������@�����������Y�@��@�����������e�@��@�������������@����(�6�P�d�z����������,�<�T�j�|�����������.�B�N�f�~���������������$2@Xhv~��������.H^x������&8Jr��������ExitProcessqSetInformationJobObject�GetCurrentProcess�WaitForSingleObjectgGenerateConsoleCtrlEvent�GetCommandLineAAssignProcessToJobObject�GetExitCodeProcess�CreateProcessA�QueryInformationJobObject�CreateJobObjectAdGetStdHandleGetLastError-SetConsoleCtrlHandlerGetModuleFileNameA�DuplicateHandleRCloseHandleKERNEL32.dll�HeapFree�HeapAlloc�EnterCriticalSection9LeaveCriticalSection�TerminateProcess�UnhandledExceptionFilter�SetUnhandledExceptionFilterIsDebuggerPresentrGetCPInfo�InterlockedIncrement�InterlockedDecrementhGetACP7GetOEMCP
IsValidCodePageGetModuleHandleWEGetProcAddress�TlsGetValue�TlsAlloc�TlsSetValue�TlsFreesSetLastError�GetCurrentThreadId�HeapCreate�VirtualFree�DeleteCriticalSection�VirtualAlloc�HeapReAlloc�Sleep%WriteFileoSetHandleCount�GetFileTypebGetStartupInfoARtlUnwindgMultiByteToWideChar�ReadFilefSetFilePointer`FreeEnvironmentStringsA�GetEnvironmentStringsaFreeEnvironmentStringsWWideCharToMultiByte�GetEnvironmentStringsW�QueryPerformanceCounter�GetTickCount�GetCurrentProcessIdyGetSystemTimeAsFileTime�GetConsoleCP�GetConsoleMode+LCMapStringA-LCMapStringWfGetStringTypeAiGetStringTypeWGetLocaleInfoA�InitializeCriticalSectionAndSpinCount<LoadLibraryAWFlushFileBuffers�CreateFileA�SetStdHandleWriteConsoleA�GetConsoleOutputCP$WriteConsoleW�HeapSizeSSetEndOfFileJGetProcessHeap�,A�,AN�@���D��@��@
		


!
5A
CPR
S
WYl
m pr	�
�
�	��
�)�
���
���                          abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ                          abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZA�`�y�!�������@~�����ڣ ��@����ڣ ��A��Ϣ���[��@~��QQ�^� _�j�2�����1~����@����C0A0A0A0A0AXA��@x�@��@�A8A8AA���������[@`�@4�@	�@
p�@D�@�@��@��@��@d�@,�@��@��@��@H�@ �@!�@"x�@xd�@yT�@zD�@�@�@�0�@�����
x
��@��@��@��@��@��@��@��@��@��@��@��@ �@�@�@�@�@�@�@�@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@x�@p�@��@h�@`�@X�@L�@D�@8�@,�@(�@$�@�@�@��@	�A.TAX)AX)AX)AX)AX)AX)AX)AX)AX)AXA. ��p��PSTPDT�AA��������������������;Zx����0Nm����:Yw����/MlK(�p�������������0�eH�`�x�������	�B���D(�F���Nh�(T�%��y��x�h��h�H�Z�( @...GGGWWWiiiuuu����������������������������������̀�ww����ww||�����ww��������wwww��������ww��������f�wwwww|�����f�wwwwww����ff�wwwwww�����ff��wwwww���ffl����ww����ffffff��w����ffffffl�w������ffffff�w�����ffffff�|����������ff��������ffff�������ff��R\I���lffl���)����ff�ح���������2L���������18�������Ϥ"������A<��������ΣT��π�����U���������������������������؀����������������������?������������������?�?�?�?�?�?�������������( 444MMMSSSzzz������������������������������p�p�����{p{��f���fko�f�����_fffk�_�fff��[���f}��UUU�fL4�UUU_kJqO���_�~�'�[U_����U�����������wwwww{~����������������( @%%%+++000===AAAIIIMMMQQQVVVYYY]]]~dFgggjjjmmmrrruuu}}}�u?�z=�~;�gE�kC�oA�r@��:��I��b��pƏKУk(��,�1�?�5�<�\�C�K�Q�s�U�[�c�b�����������������������������������������ð����������������������������������������������������/Pp�
��� �=�1[�Qy�q�����������/"P0p=�L�Y�g�x���1��Q��q����������&/@PZpt���������1�Q�q��������/&PAp[�t��ϩ������1��Q��q����������/P"p0�>�M�[�i�y��1��Q��q����ұ������/Pp�	�
��� �>1�\Q�zq������������/Pp!�+�6�@�I�Z�1p�Q��q�������������/ P6pL�b�x�������1��Q��q�������������,/KPip�����������1��Q��q������������/-P?pR�c�v������1��Q��q�ϑ�ܱ������/Pp�!�&�,�>�X1�qQ��q������������_______CCBABADL*(%$""&GABJIIDDJC??AD_-(''%$GG#_DIJIIJIIIDIJDD_+)(''%GG _JMCEJ?ABAECA?BA_,+)('%%"!_IM@AJACDCIDI____.,++>________JMJJJJJJJJJF_..,+)('%$"! #GIMCEJJJI?J__...,+(('%$"! &_JM?AJJJJCJ__...,+)(''%$"  _IMJJJJJJJJ_K=...,++(''%$! _JMCDJJJJAJ_K_______L*%$"!_I_?AMNJJEJ_L'%$"_I_MMMMMMJJ__('%%_I_CEMIJJMEM_(''*_I_?BMDJEMDMF_)(-LI_MMMCMMMMM_________<____I_CEM1;MACDMEJM__I_?A_D1@IJJMJMM_FF_I__6_@/EMMMNMM_FF_I_C80EJDMJCJFF?:AA20?_M_MIEM______MIC4BC/
N______MMMMJIDAI_9/	HJJMMJMMMJ??BAI_A7503	IJMMCBCBA44CCI___BAO;6___C_MJIDIDMI_CI___O;
@__C_C?J?AJI_?A_DJJI@O_CM?;I?JI_________H9MAIJJIJI_CD_____JJI73C;IJIJI_?AMDJJDIMJIE5:JIJI__________MMIA:IJJJJJJJJJJJJJJJJMJ�����?������������������?������������������?�( 444MMMRRRYYY~eGuuu}}}�x>�iE�rC��E��~7�?�H�V�b�x����������������������������������������������������������������������������������/!P7pL�c�yϏ���1��Q��q�������������/Pp"�,�6�@�J�[1�qQ��q�������������/Pp�
��� �=�1[�Qy�q�����������/"P0p=�L�Y�g�x���1��Q��q����������&/@PZpt���������1�Q�q��������/&PAp[�t��ϩ������1��Q��q����������/P"p0�>�M�[�i�y��1��Q��q����ұ������/Pp�	�
��� �>1�\Q�zq������������/Pp!�+�6�@�I�Z�1p�Q��q�������������/ P6pL�b�x�������1��Q��q�������������,/KPip�����������1��Q��q������������/-P?pR�c�v������1��Q��q�ϑ�ܱ������/Pp�!�&�,�>�X1�qQ��q������������!%///* !*/"(%%'%/)
/!#''////+/+"*(/
/

!%(/
(

  (*/(///)
*/
	)*

	/"/////	/+///#
		+ !%//
+"*+'#+//+'!%*++$++!+!    !!!<(0` !!$&			&"

 ���W���������������������������������ܱ��Nj+<<</	&&&#&[[[?6666��׏��������������������������������������������Ҟ���BBB3"


mmm3����,����!!!4777&�����������������������������������������������������ʟ���}���}___E���OpppD���P,)+3���Z2226DDD(���,�����###5��������������������������������������������������������������������������������չ�������������5�������,�������������������������������������������������������������������������������������������������������������,������Ì222"��Є�����������������������������������������������������������������������������������������������������&&&2����   4888&�������������������������������������������������������������������������e��?��4��/��+���.���R�������ӎ����������$$$5��Ď���������������������������������������������������������������������D��@��;��7��3��/��*���&���"�����������������������������������������������������������������������������������������W��G��C��?��;��6��2��n������f��0�������������nj333"��ӄ��������������������������������������������������������������������O��K��G��B��>��:��5��p������i��$�����������!!!4888&���������������������������������������������������������������������S�N��J��F��B��=��9��5��0��,��(���������������%%%5��ǎ���������������������������������������������������������������������V�R�N��I��E���������������������������������������������������������������������������������������������������������ѹ���|J��q?��o@�����Z�U�Q�M��I��D��@��<��7��3��/��+���&���"���-����������������Ɍ444"��ք�������������������������������������������������̴��w<��u=��s>��q?�����]�Y�U�P��L��H��C��?��;��7��2��.��*���%���!����������������"""4888&���������������������������������������������������d��y<��w=��u=��s>�����a�\�X�T�P��K��G��C��>��:��6��1��-��)���%��� ���O������������Ñ%%%5��ʎ���������������������������������������������������A��{;��y<��w=��t>�����s�`�\�W�S�O��J��F��B��>��9��5��1��,��(���$���(����������������������������������������������������������������������9��|:��z;��x<��v=�������s�_�[�W�R�N��J��E��A��=��8��4��0��,��'���#�������������̌555"��ل���������������������������������������������������9��~9��|:��z;��x<���o�����������������������������������������m��8��3��/��+���'�����������"""4:::&������������������������������������������������������8���9��~:��|;��z;��w<��u=��s>��q?��o@��mA��kB��iC��gC�dD��uZ������;��7��3��.��*�������������Ǒ%%%5��̎���������������������������������������������������È>���8���9��}:��{;��y<��w<��u=��s>��q?��o@��mA��jB��hC��fD�~dE��uZ�����?��:��6��2��5�����������������������������������������������������������������������������Оa���7���8��9��}:��{;��y<��w=��u>��r>��p?��n@��lA��jB��hC��fD�}dE�����B��>��:��5��^������������ό555"��܄����������������������������������������������������������ѳ�„7���7���8��9��}:��{;��x<��v=��t>��r?��p@��n@��lA��jB��gC��eD�����F��A��=��9������������"""4;;;&�����������������������������������������������������������������ŌC���8���9��~9��|:��z;��x<��v=��t>��r?��p@��mA��kA��iB��gC�����I��E��L��������������ɑQQQJnnn����������~~~�������������������������������������������������������������������������������������������Į��q?��o@��mA��kB��iC�������������������������HHH�"""���������������vvv������������������������������������������������������������������9��~:��{;��y<��w<��u=��s>��q?��o@��mA��kB�������������:::�'''�___���������sss�ttt��������������������������������������������������������������8�Ϧu�����ǣv��y<��w=��u=��s>��p?��n@��lA��������888T����---6fffnddd�%%%�"""�����OOO�SSS������������������������������������������������������������ċD�ҧu�����ʤv��{;��y<��v=��t>��r?��p?��xM�����<<<�MMM�������̑&&&5����;;;�<<<�xxx�QQQ�;;;�KKK����������������������������������������������������������8���8��~9��|:��z;��x<��v=��t>��r?�̷������999�����������������������VVV�###�)))�444��������������������������������������������������������������������ѳ�͝b���@��~9��|:��z;��}C���g��˶����Ӎ���������󑑑�����ZZZ�lll�;;;�!!!�"""�)))�___���������������������������������������������������������������������������������������&&&2����:::�ppp�{{{�___�WWW�WWW�:::�!!!�"""�***�www�������������������������������������������������������������������"""4888&���,������̑999����Ԗ���JJJ�|||�lll�:::�"""�BBB�XXX�|||��������������������������������������������������������������������$$$6�������,��������������������������������uuu�KKK�CCC�@@@�...�www����������������������������������������������������������������������������������*������Ҍ666"������������������������KKK�aaa�LLL�WWW��������������������������������������������������������������@��������$����"""4;;;&���������������������nnn�fff�!!!�$$$�999������������������������������������������������������������444]ttt|������ȇ������ɑ&&&5��Ў������������������������vvv�mmm�VVV�{{{�OOO����������������������������������������������������������������ڥ�����������������������������������������������aaa�CCC�����ppp�������������������������������������������������������������������������ό555"��ބ����������������������������������|||�MMM�����fff���������������������������������������������������������������"""4;;;&�������������������������������������������\\\�����������������������������������������������������������������Ǒ%%%5��Ύ�����������������������������������������������������������������������������������������������ݧ�����������������������������������������������������������������������������������������������������������������ܦ������͌555"��ۄ�����������������������������������������������������������������������������������ۥ����"""4:::&������������������������������������������������������������������������������������ڤ������Ñ%%%5��ˎ�����������������������������������������������������������������������ܤ��������������������������������������������������������������������������������������������������ׇ
������ww���?ww�?�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�ww�ww�ww�ww�ww�ww�ww�ww�ww�ww�ww�ww�ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�ww��ww��ww��ww��ww��ww��ww�?�ww��ww���ww���ww( @ ����������������������������������!!!0\\\JeeeQ666D555A0$
�������v�H��<��6��0��2��\�������7���q��������������������ڴ���vvvj&&&D1"����g�L��F��@��;��5������?��������������������������������������������������к����V�Q�K��E��?��9������(�����������a���V�������������������������������������[�U�P��J��D��>��8��2��-���������uuun{{{j���������������������������������������`�Z�T�O������������������������������������������������������������������������V��o@��lA�����b�_�Y�S�M��G��B��<��6��0��+���%���<���������������a���V�����������������������m��t>��q?��n@�����b�b�^�X�R�L��F��A��;��5��/��)���$���Y����������wwwn}}}j����������������������~C��v=��s>��p?�����b�b�a�]�W�Q�K��E��@��:��4��.��(���+���������������������������������������{;��x<��v=��s>�����b�b�a�[�V�P��J��D��?��9��3��-��'��������������a���V����������������������~:��{;��x<��u=���p���������������������������������r��=��7��2��,����������yyynj�����������������������9��}:��z;��w<��u>��r?��o@��lA��iB��fD�}dE�|cE�|cE���i���B��<��6��1��������������������������������������?��9��}:��z;��w=��t>��q?��n@��kA��iC��fD�}cE�|cE�}dF�����G��A��;��=�������������a���V���������������������ңi���8��9��|:��y<��v=��s>��q?��n@��kB��hC��eD�|cE�|cE�����L��F��@��m����������zzzn���j�������������������������ʓP���8��~9��{;��y<��v=��s>��p?��mA��jB��gC�eD�|cE�����P��J��\��������������������������������������������������������������������������������¯��mA��jB��gC�~dE��������������������������a���V��������������������������������������}:��z;��x<��u=��r?��o@��lA��iB��fD���������|||n���m���������������������������������������9��������w=��t>��q?��n@��lA��iC�������������JJJ��������������������������������������������őP��������y<��v=��t>��q?��n@��~Y������������VVV�???�www�����iii�����������������������������������Ρk���A��|;��y<��v=��yF���p��������>>>3@@@y����~~~obbb�000�kkk�@@@������������������������������������������������������������������---U��������������<<<�&&&�[[[�������������������������������������������������������6���uuu�sss�WWW�III�$$$�&&&�qqq�����������������������������������lllg|||s���4����bbb�hhhƑ�������UUU�000�QQQ�}}}��������������������������������---{bbb�����(����������������������iii�LLL�BBB������������������������������������������������������a���V����������������ggg�+++�NNN�������������������������������������������|||n���j����������������]]]�ttt�kkk�������������������������������������������������������������������rrr�www���������������������������Ӧ�������a���V���������������������������������������������������Ӧ����zzzn���j�������������������������������������������Ӧ�����������������������������������������������������������ˉ��?������������������?�?�?���������������?�(  ������C�������������������﫫�o���������I�����������������������������������������ਨ������������S��=��?���������������������������������_�Q�F����4���������������������������������a�Z��������������������������������������м���oE�����c�a�X�M��B��7��0��������������������~I��q?�����c�`�V�K��@��5��8��������������������z;��u=���q�����������������v�>��3����������������������E��y<��t>��n@��iB�~dE�}dF�������G��H������YYY�uuu����������ġ���=��x<��s>��mA��hC�}dE�}eG�����S���������444�|||����������������������������gC�}cE�������������������������MMM������������������~>�����q?��kA��iG������������������RRR��������������¢���G��u=��xK�ʺ��������������������������������������������������������������������������������������������������������������������������������������������~�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A  �(  �h00 �%   � h<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPAD�
0A0Z0z0�0�0�0�0�1�12>2T2`2v2�2�2�2�2�2�23-3J3g3v3�3�3�3�3�3�3�3�3�344%4K4t4|4�4�4�4�4�45F5�5�5�5:6B6W6b6�6�67+7z7�7�7�7�7I8O8o8�8�8�899-9:9F9V9]9l9x9�9�9�9�9�9�9:A:P:Y:}:�:@<�<a? �0�0�0�0�0�1+2�2�3�4A5f5w5~5�5�5�5�5�5�5	6C6H6O6U6�6�6�6�6�6�6�6�6�67777"7*727>7G7L7R7\7e7p7|7�7�7�7�7�7�7�7�8�8�9$:B:h:�:�:�:A>1?0��0�01�2�4�4�4�4�455
55)5�566-646L6x6�6�6�6A8j8K9�9�9;#;];j;t;�;�;�;�;�;�;�;<<8<o<�<�<'=D=�=�=>�>�>�>�>�>�>�>�>?4?=?C?L?Q?`?�?�?�?�?@D�0�01j1�12g2~2�2�2�2�2
33+323F3M3t3z3�3�3�3�3�3�3�3�3�3�3
444(464<4H4N4[4e4l4�4�4�4�4�4�45E5K5u5{5�5�5�5O6r6|6�6�67
7(7-757;7B7H7O7U7]7d7i7q7z7�7�7�7�7�7�7�7�7�7�7�7�7�7�7�7888 8&838S8Y8u8]9b9p9}9�9�9�9�9�9�9�9:#:):2:E:i:�:;,;1;t=�=�=�=�=�=�=�=�=�=�=>
>>>!>>>D>O>T>\>b>l>s>�>�>�>�>�>�>�>�>�>�>�>�>?q?P�
33L3r3�3�3�5�5�5�5
6b6<7D7\7t7�7�7;8P8�8�8�899>9Y9_9h9o9�9�9�9:::+:5:<:G:P:f:q:�:�:�:�:�:;;;;@;K;P;n;<,<I<�<�<�<�<�<�<�< =%=M=r=�=�=�=�=�=>,>P>d>�>�>�>??\?f?�?�?�?`�0*0|0�0�0�0�0111U1^1j1�1�1�1�1�1�1�1�2�23#3r3�3�5�5�5�5[6~6�6�6�6�67&7E7U7g7l7�7�7�8�9�9r:�:1<�<�<�=�=->:>??�?�?p�+0Z0�1V2h23(3H3b3�3�3R4�4�4�4�45=566A6�6�6�6�6�7�7�7�7)848>8O8Z8
::&:,:1:7:�:�:�:�:�:�:�:;8;�;�;�;�;�;�;<<E<h<u<�<�<�<�<�<�<�<=+=D=b=�=�=�>�>�?�?�D�0�031�2�3j4�4�4�45�5�56�6�6"7<7V7a79:9�:l;�;�;<-<S<�?�h�02J2o2O4n6r6v6z6~6�6�6�6�6�6�6�6�6�6�6/7_7�7�8�8G9:�:�:�:�:�:�:�:�:;�;-<:>L>^>�>�>�>�>�>�>�>�<�1�1�1�1�1�122-2S2q2x2|2�2�2�2�2�2�2�2�2�2�2�2V3a3|3�3�3�3�3�3�3
4444 4$4(4,404z4�4�4�4�4�5�5676z6�6�6�6�6�6�6�6
737Q7X7\7`7d7h7l7p7t7�7�7�7�7�768A8\8c8h8l8p8�8�8�8�8�8�899999Z9`9d9h9l9X:]:o:�:�:�:;#;�;�;�;�;�;N<�<�<�<�<�<�<�<�<�<A=F=�=�=�=�=�=�=> >&>�>�>�>�>�>�>??"?1?7?F?L?Z?c?r?w?�?�?�?�?�d	0H0O0U0|0�0�0R1X1�1�1�1�1*202<2�2�2�2�2"3,35�5�56 626E6W6�6�6�9�9�9:9:D:[:�:�:L;X?�?�?�xA0[0d0�0�0�0�01'1B1b1�1�12 2{2�2�2�2�2333�3�3�3�3,4K56{6�6�6�6�6�6�6�6�6�6�67-7�7@8�:�:;$;P;�;�;u<�<�?�8080{0�0�0�0�0�1�1"2)2�2�2343�3W4q4w4|4�4�4�4v6�P1T1X1\1`1l1p1�1�1�ld6h6�6787X7x7�7�7�7�7�7888X8x8�8�8�8�8�89$9(9H9h9t9�9�9�9�9:0:L:P:l:p:�:�:�:�:�:;0;P;p;|;�;�;�;�00�2�208(9�9�9�9�9�9�9:::::::P;\;d;l;t;|;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;<<`=d=h=l=p=t=x=|=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=>>>>>>>> >$>(>,>0>4>8><>@>P>X>\>`>d>h>l>p>t>x>|>�>P?T?site-packages/pip/_vendor/distlib/t64.exe000064400000271000151733463550014276 0ustar00MZ����@���	�!�L�!This program cannot be run in DOS mode.

$x�<�r,<�r,<�r,���,=�r,5��,�r,5��,Q�r,5��,5�r,5��,?�r,<�s,]�r,5��,=�r,5��,=�r,5��,=�r,Rich<�r,PEd�1�R�"	��$)@�*w@�(`�PP�	����.textk�� `.rdata�+�,�@@.data�6�@�.pdata�	P
@@.rsrc�P`R@@.reloc��n@B��umL��I�SM�CM�K H��HH��H3�H��$0L�ʺI�CD�B�H�L$0H�D$ ��+�	L�D$0H�H`H�P����������H�\$H�t$WH�� �r�3�H��L�ًօ�x5�bLc�I������L��H��t�F��A;ID�I��A+��y�H�t$8H��H�\$0H�� _�H��H�XH�hH�PVWATAUAVH��@L��L���H�"H�H3�H�h����;�H���������H�L$xD�E3��H�L$x�xH�L$x������D��;�L�E3����wL�L$xD�uI��A�I����D�ML�vH��I�����H��H;�tH�L$ D�EH���&�A+����H����H�L$xA���;�H��L�E3����L�L$xL��I��H���nL�A�H��H���j�����H���H;�H��������H�L$ H��A�蜏+�H�����+\$0H�L$x+\$,��H�E3����xL�L$xA�I��I������H���H;�H�����s���N�\#�M;�r���fA9t
M+�M;�s��I��H�L$x�YL�\$@H��I�[0I�k@I��A^A]A\_^��H�\$H�t$WH��@H��H����H�#�D$0�L��H��L��H�׉t$(�d$ �Y��؅�u�5���D�H�t$X��H�\$PH��@_��H��(��u�
� ��t3����H��(�H�\$WH��pH��3�3���L��$�A��H��H��$��	H��H�D$ �����t��$��u��3�H�q��,�����$�0L��$�A���	H��
�H�^������3�H�L$pD�Bh�Z������D$ph�,�H��$�H�����H�=�������������H��$�H���s���H�4�����������H��$�H���J���H�+����d���H�
�����DŽ$����L�\$PL�\$HH�D$pE3�H�D$@H�d$8H�d$0�d$(E3�H��3��D$ �I�H���L�Nj����D�\$`H�T$PH��D���H�L$X�S�H�L$P�����H�L$PH��$����H����������$�������H�\$H�l$H�t$WATAUH��`H�:�H3�H��$P����8"t� ��"H����H���3�H;�u	L�%x��L�`����;�tI��A�$@:�u�L�-2�3�I��D��o��="��uL�-H��A�lH�L$@H����P�����H;�H���H�������H��H��H��H;�s�8
t�8
t
H��H;�r��H��H;���H������|���@�/���;�tH��@8.u�>#��H������O��������;�t
H�Ɗ@:�u�>!��H������#�������;�t
H�Ɗ@:�u�3�I��I��I�ɍP�H��H��L�A�I���I��H��H��L�I���H��I�\H���H���H;�H��@�ŋ����L�d$0L�
��L��H��H��L�l$(H�t$ �NH�������H��(��������������������ff�H;
!�uH��f����u��H���y�L��M�K H��8I�C(I�C�I�c���"H��8���@SH�� H���AH�����1H�CH���H�H���H�KH�
�H;�t����hu�y/H�H�OH9CtH�C����
Au	�Z&H�CH�C���u����C��o�H��H�� [����@SH��@�=Hc�uH�G�X���VH�L$ 3��&���H�D$ ��~L�D$ ����2D���H��@D�XA���|$8tH�D$0����A��H��@[���H��t7SH�� L��H�
�3�\���u� H��"������H�� [����@SH�� �d$@L�D$@�w3H��H��u9D$@t��H��t���L$@�H��H�� [����H�\$H�t$WH�� H��H���w|�H��HE�H�
!H��u ��9��7���4H�
�L��3���H��H��u,9ctH����9��t
��>��3�H����9��3�H�\$0H�t$8H�� _���H����@SH�� � ,���u��;�L�HcȺ��+��<H��H��u$�PH�ˉ�+��<H��H��u��x3�H�?�H�H��0H��H��t	H����E3�H�6�E�HI��L�LI��H����I��Hk�XL�I���tI���tM��u�����I��H��0I��u�3�H�� [���H��(�?�=�t�5=H�
"H��(����@SH�� H��H�
��H;�r:H��H;�w.H��H��������*H+�H��H��H��H��?�L�`A�k�
H�K0���H�� [��@SH�� ��H��}���2A�k�
H�J0���H�� [����H��(H��H;�r7H���H;�w+�qH+�H��������*H��H��H��H��?�L��?�
H��0�_�H��(���H��(��}�r���?�
H�J0�6�H��(���:�t
H�����u�:�uH���3����M��t
8t	H��I��u�I��H�H#��H�\$H�t$H�|$ ATH��@H�d$0E��H��H��3�H������u'�t�H�d$ E3�E3�3�3��3���3�H������u'�A�H�d$ E3�E3�3�3��V3��3�8����u$��H�d$ E3�E3�3�3��$3��g�SDH��H�D$PH��u���3��F�>u"���H�H�L$0�E��3��L��E��H��H���7AH��H���,���H��H�\$XH�t$`H�|$hH��@A\����@SH��0I��L��H��H��u%�WH�d$ �E3�E3�3�3ɉ�k���$A��H��I���~���H�H��t3����H��0[��H�\$ UVWATAUAVAWH��03�L��L��H�L$xM��M��H��H��$�H��L;�t)L;�t$L;�u9��H�\$ �E3�E3�3�3���3�H��$�H��0A_A^A]A\_^]�H��$�H;�t3�H��I��L;�v)H���tL��3�I����OH��H;�t�3�H��I��L;�w�I��I��GH��tD�O$�A�D�L$pH���g�GA����taLcwE��tS�/I;�DB�E��L;���L�H��H�L$x�ND)wA��L�t$xH+�HH��$�D�L$pL�H+��L�t$xE��I;�rhE��t 3�I;�vA��E��A���	H��D��I��D+��
D��I;�EG�A��H;�wuH���ME��L�t$xI�֋��uL�������tw��H+��s���H���zC���tdH��$�H��t*A�D�O$H��I��H��D�L$pL�t$xH��$�H������H���t
L��3�I���gN��H�d$ �"�����O H+�3�H��I�������O��I���������H��H�XH�pH�xL�` AUH��0I��M��H��L��M��trM��tmH�\$`H��u4H���t
L��3���M�^�H�d$ E3�E3�3�3��s3��1H���G����H�\$ L��M��H��I������H��H�����H���3�H�\$@H�t$HH�|$PL�d$XH��0A]����H��8L�L$ M��L��H���,���H��8����H��H�PH�HL�@L�H SVWATH��8H��3ۋ��H;���;�u'��H�\$ E3�E3�3�3�������H;���;�u'�i�H�\$ E3�E3�3�3������L�d$p�M�����G@��H���K���t*���t%Hc�H��H��L����Hk�XI�H�
]��H�
T�H��L���B8u%���t���tHc�H��H����Hk�XI��A8�t"��H�\$ E3�E3�3�3�����;�u*H���L��M��E3�H�T$hH���	��H�׋��M�H��������H��8A\_^[����H��H�XH�hH�pH�x ATAUAVH��0H��H��u'�.H!\$ E3�E3�3�3���D���X�J�{Lc�}�c3�A��D�B�M��xҋS��u
+s����;L����+k��t<I��I��H����I��Hk�X�D�tH�C�
�8
u��H��H;r�u������x��y��Z��������{u3��+{M��M��{I��A��K��Mk�XA�D�tz3�A��D�B�6M;�u#H�C��H��
�8
u��H��H;�r��c
sG�CE3���A���M�������;�w�Ct	�c
��s�{$H��J��A�Dt��+��D5H�\$PH�l$XH�t$`H�|$hH��0A^A]A\��H�\$H�L$WH��0H��3�H������u%�q�H�d$ E3�E3�3�3������\����H�������H��������H�\$HH��0_�H�\$H�l$H�t$WH�� �AA����H�٨�u�����j���3�AA��u	������H���3D�[E��y
A��D�[�A��tA��tA��
r�C$H���9HD�Nj֋��K���@�ōE�H�\$0H�l$8H�t$@H�� _���H�\$H�t$H�L$WH��0A�؋�H��3�H������u%�K�H�d$ E3�E3�3�3��`���R��t/��t*��t%��H�d$ E3�E3�3�3��-��������D�Ë�H�������H���{�����H�\$HH�t$PH��0_��H�\$WH��0��H��H��u#�H!\$ E3�E3�3�3������F�A�t:�i2H�ˋ��MH���G���lL��y���H�K(H��t
��H�c(�c��H�\$@H��0_����H�\$H�L$WH��0H�ك�3�H������u$��H�d$ E3�E3�3�3��+���&�A@t�a���H��������H���s��H�\$HH��0_���H�\$WH��0�MZf9^��uVHc���H�
N��H��8PEt3ۉ\$@�;�f9Ht3ۉ\$@�(���w3ۉ\$@�3�9���É\$@�3ۉ\$@����$��u"�=�t�~+��L)����%��"��u"�=�t�S+��!)���%�T��+��y
��%���H��
�@RH�y��<Q��y
���$�)N��y
�	��$����%��t����$L�2L�3H��
�����D$ ��u����'��'����|$@u����'���'���H�\$HH��0_��H��(�SH��(�V�����H�L$H��H�
u����L�`�L�\$XE3�H�T$`H�L$X�ӭH�D$PH�|$PtAH�D$8H�D$HH�D$0H�D$@H�D$(H� �H�D$ L�L$PL�D$XH�T$`3�聭�"H��$�H��H��$�H��H�y�H��H�C�H��$�H�D���	���H���H�D$hH���H�D$p��������bS3�r�H�
��]��=^�u
��:S����	�H��.�H�Ĉ���H��H�XH�hH�p �HWH�� H��H���>C�KHc�u��	�K ���4��@t
�~�"��3���t�{����H�C��H��K�C�{�����C�u/�7�H��0H;�t�)�H��`H;�u���-];�uH����\�C���+H�S+kH�BH��C$��;�C~D�ŋ��f[���W�� �K�?������t#���tH��H��H����H��Hk�XH��H�
��A t3ҋ�D�B�}RH������H�K�D$0���H�T$0��D����Z��;������D$0H�\$8H�l$@H�t$HH�� _���̅�~LH�\$H�l$H�t$WH�� I��I���@��L��H��@�����`�?�t���H�\$0H�l$8H�t$@H�� _����H�\$UVWATAUAVAWH���H�B�H3�H��$�3�H��H�L$hH��H�L$xI��M��D$`D��D$TD��D$H�D$X�D$P��E3�I;�uA�{3�E3�E3�3�3��H�\$ �8�$�tH��$��������A���C@L�
�����H���@H�{�A;�t(���t#Lc�L�
���I��A��H��Mk�XM��@4�
L��L�
���A�@8u)A;�t���tHc�H�ƒ�H��Hk�XI��@4�B8�tA�3�E3�E3�3�3��H�\$ ��
8�$�tH��$�����A���1E3�I;�t�@�/A��D�T$@D�T$DA��L��$�A:���H��$�A�H��A;�H��$����E�<XwH��B��@����A��Hc�Hc�H��B��
`����T$\��A;��y�������/�������������������<@�Ń�d�~����A�@��C����E�.��G�%��Stm��X����Zt��a���c���HI�EI��I;�t/H�XI;�t&A���s��D$P+���D�T$P�H�����A��0uA��I�]E;�A�ƹ���D�I��A���I;��D$PHDH�H����A��0uA��I��A��t,E�M�H��$�H�L$DM���3]E3�A;�t�D$X�A�E��D$D��$�H��$��M�D$p@�� A��@E;�H��$�A���-A��k��e���g~σ�i����n����o����pte��s�������u����x���'�S��fD9t	H��A;�u�H+�H��!I;�HD.�H���
��D8tH��A;�u�+ˉL$D�A�A����D$`A�E��y`Q�D$L0A�Q�D$M�SA�E��yDA��	�=I�}I����YE3�A;��x���A�� tf�7��7�D$X�lA��@A�
�T$HA��rA��s
M�EI���.I��A�� tA��@tM�E��E�E��A��@tMcE��E�E�A��@t
M;�}I��A��A��r
A��rE��E;�}A��A��E;�EO�D�|$`I��H��$�H���#ʉL$HA��A��A;�M;�t 3�I��Ic�H��L���B0��9~ALjH����H��$�A�����+�H��A��	�D$D�A;�t	�;0�H��D$D�0�u@��guAA��9E;�EO�A���~)A��]Hc��$H��$�H��tH�؋��A��I�EH�
��I��@��Hc�H��$��xH�L$xD��H�L$0�L$pL�ƉL$(H��$�H��D�t$ ��A��3���tD;�uH�
���0H�T$xH���3�@��gu;�uH�
w��H�T$xH��Ѐ;-uA��H��H���VE3҉D$DD9T$X�KA��@t1A��s�D$L-�A��t�D$L+��|$H�A��t�D$L ��|$H�t$TH�l$h+t$D+�A��uL�L$@L�ŋֱ �T���L�L$@H�L$LL�ŋ��YA��tA��uL�L$@L�ŋֱ0�#����|$D3�9D$Ptu;�~qH��D�MH��$�H��$�A���H����XE3�A;�u2��$�A;�t&L�D$hL�L$@H��$��YE3�A;�u�H�l$h�#H�l$hA�ljD$@�L�L$@L�ŋ�H����XE3ҋD$@A;�|A��tL�L$@L�ŋֱ �m���E3�H��$�I;�tH���Q�E3�L��$�H��$��t$@�T$\L�
��A�@�/A:��$���D8�$�tH��$�������H��$�H3���H��$ H���A_A^A]A\_^]�@��It:@��ht+@��lt
@��wu�A��돀?lu
H��A���A���w���A�� �n����A��<6u�4uH��A���O���<3u�2uH��A���7���<d�/���<i�'���<o����<u����<x����<X����D�T$\H�T$x@��D�T$P�\S3�;�t!H�T$hL�D$@@���W@�/H��@:��H�T$hL�D$@@����VE3����@��*uE�uI��E;������E�����C��@��D�tH��}���E���u���@��*uA�EI��A;‰D$T�Z���A������D$T��@�ōDHЉD$T�:���@�� tA@��#t1@��+t"@��-t@��0����A������A������A�����A����A�����D�T$pD�T$XD�T$TD�T$HE��E��D�T$P�����*E3�E3�3�3�H�t$ ��@@8�$��w������H�
9��@SH����d$pH�L$t3�A���X7L�\$pH��$H��$L�\$HH�D$P�;�H��$H�T$@H��E3�荟H��t;H�d$8H�T$@H�L$`H�L$0H�L$XL��H�L$(H��$L��H�L$ 3��I�� H��$�H��$H��$�H��$�H��$��D$p��D$tH��$����3ɋ�s�H�L$H�`���u��u�H�@E�����H��4�H���[����H�\$H�l$H�t$WH��0H��H�
��A��I��H���H��tL�T$`D��L��H��H��L�T$ ���%���DL�\$`D��L��H��H��L�\$ �h���H�\$@H�l$HH�t$PH��0_����L�
��3�I��D�@;
t+��IЃ�-r�A�w�
Á�D������AF��H�A�D���H��(��H��u	H����H��H��(�H��(�H��u	H����H��H��(�@SH�� ���H��u	H����H����jL���H��tL�P���;���A�H�� [���H�\$H�l$H�t$WH��`3�M��I��H��L��L;�u'�L���E3�E3�3�3�H�\$ ��b������L;�tH;�t�L��$�����A��L;�L��$�H�T$@G�H�T$0H�L$0I���D$HB�D$8A�Ӌ�H;�t7;�|%�l$8x	H�D$0��H�T$03�������t���9\$8�\.��ÍC�L�\$`I�[I�kI�s I��_��H��H�XH�hH�pH�x ATH��0I��I��H��H��M����M��uH��uH����3��H����H����I;�vP�(���L�FH�
�R�H�D$hL��H�D$(H�D$`H��H�D$ ������uo���8"�����������H�
eRL��D� H�D$hL��H�D$(H�D$`H��H�D$ �4����D����uH���u����8"uC���D� �9��y8����u-�w����"��j����H�d$ E3�E3�3�3�������H�\$@H�l$HH�t$PH�|$XH��0A\��H��8H�D$`H�D$(H�d$ ���H��8���H�\$H�l$H�t$WH�� H�YH��H��L��3��c2E3�H�}A�KA��D�]D�]D�]f�H�=��H+���H��H��u�H����9�H��H��u�H�\$0H�l$8H�t$@H�� _���H�\$H�t$WH��H���H3�H��$pH��IH�T$P�ף����=3�H�T$p���H��;�r��D$V�D$p H�|$V�)�WD��D;�wA+�I��J�LpD�B� �u1H�����uӋF�d$8L�D$p�D$0�FD�ˉD$(H��$p�3�H�D$ �c�d$@�F�V�D$8H��$p�\$0H�D$(L�L$pD��3ɉ\$ �\`�d$@�F�V�D$8H��$p�\$0H�D$(L�L$pA�3ɉ\$ �&`L��$pH�N3�A�t�	��p�A�t�	 ��p���ƁH��H��I��H��u��?3�H�ND�B�A�@ ��w�	�B �A��w�	 �B��Ɓ��H��;�r�H��$pH3����L��$�I�[I�s I��_��H�\$WH�� ��
H������
��tH���t	H����n�
��H���H�\$0H;��tDH��t��uH�C�H�L$0H;�t����H�]�H���H�O�H�D$0�H�\$0�
�H��u�K �&H��H�\$8H�� _�@SH��@��H�L$ 3��\���%	����u%����L��|$8tSH�L$0�����E���u������ԃ��uH�D$ ����@뻀|$8tH�D$0������H��@[�H�\$UVWATAUH��@H���H3�H�D$8H���I���3ۋ�;�u
H�������L�-Y���H��I��A�98�'A�I�H��0��r����������k�;���H�T$ ��>�;���H�N3�A��.�~�^D9d$ ��H�D$&8\$&t-8Xt(�8�H;�w+�H�T7I�I+�u�H��8u�H�F���I�I+�u��N��t(��t��
tA;�t�����������FD�f��^H�~�ùf���9"����������H�N3�A��;-H�lmL���H�A�M�D�I��A8t18Yt,��A;�wL�L2A�A�A�AM�;�v�H��8u�I��M�M+�u��~��D�ft$��t��
tA;�u��������^H�VI�|���H��f�H��I+�u�H���|���3�H�L$8H3��9��H��$�H��@A]A\_^]��H��H�XH�pH�xL�` AUH��0��A���H������H��������D��;C��� �@H��3�H;��|H���H��A� ��^�;H��A������D��;��$H�����uH���L�%>�I;�t�����L�%+�H��������	�D����
���C�>��C�9��C�4��׉T$ L�s�����}Hc��DKfA��H�*�‰T$ ��׉T$ ��}HcʊDB����‰T$ ��|$ ��}Hcϊ�B����lj|$ ��H�����uH�
��I;�t���H�u���
���+���u&L�%)�I;�tH������������3�D��A��H�\$@H�t$HH�|$PL�d$XH��0A]�H��(�=��u����������3�H��(�H�\$H�t$WH�� H��(H��H��tyH�
�H;�tmH��H��ta�8u\H�� H��t�9u�#��H��(�?bH��H��t�9u���H��(��aH������H��(����H��0H��tG�8uBH��8H�����H��H��H+����H��PH+����H��0���H��XH�,�H;�t��`u�]_H��X�]��H�{X�H���H9G�tH�H��t
�9u�5��H��tH�OH��t
�9u���H�� H��u�H��H�\$0H�t$8H�� _������H��H��t�H�� H��t�H��H��t�H��0H��t�H�AXA�H�3�H9P�tH�H��t�H�x�t
H�PH��t�H�� I��u�H��X�`����H����A���D	H��H��t�DH�� H��t�DH��H��t�DH��0H��t�DH�AXA�H���H9P�tH�H��t�D
H�x�t
H�PH��t�D
H�� I��u�H��X�D�`H������@SH�� H��H��tAH��t<L�L;�t/H�H�����M��tI���%���A�:uH��L;�t���H���3�H�� [��@SH�� ��H�؋���
��tH���t��H����+���H���H���V���H�ع�H��u�K �pH��H�� [����H�%ј�3�H�%ǘ���H�%Ř�H��(�
�����t
�ǘ�
���H��(����H�\$WH�� H��H��H���H����Aǁ�ƁtCƁ�CH���H����
�G�H�����
�1��'�H���H��uH��H���H����������H�\$0H�� _���H�\$WH�� �0��
�����җH��H��uH�H���%H��H��t3�
��H����H�˅�t3������H�K������3ۋ���H��H�\$0H�� _�@SH�� �q���H��H��u�H��H��H�� [�H���+H�\$WH�� H��H�I8H��t�$��H�KHH��t���H�KXH��t���H�KhH��t���H�KpH��t����H�KxH��t����H���H��t����H���H�/�H;�t����
��H���H�L$0H��t��uH���H�L$0H;�t�}����
�j��`�H���H��t+H����H;=L�tH���H;�t�?u	H��������H�����H�\$8H�� _����@SH�� �����t`H�
�������	����tH����=H��H��t1�
��H��ƕ��t3�H�������ʕH�K��������3�H�� [����H�l$H�t$WH��`Hc���H�L$@I���?��D�_A��wH�D$@H��@�y���H�T$@��@���z=���t@��$�@��$�Ƅ$�D�J�@��$�Ƅ$�D��H�L$@�T$8L��$��A�D$0�AH�L$@�D$(H�D$pH�D$ ��T��u8D$XtH�D$P����3���D$p#ŀ|$XtH�L$P����L�\$`I�kI�s I��_���̉L$H��(E3��3���H�1�H��t#L�D$0A�3�H���D$0�n��H��(�H�\$WH��0I��H��H��t23�H�B�H��H;�s$�L�H�d$ E3�E3�3�3���a�3��]H���H��HD�3�H���wH�
���PL��B�H��u-�=�tH�����u�H��t���H��t�H�\$@H��0_��@SH�� �������H�
�������H�� [H�����@SH�� ��H�
����H��tH�c�H��z�H��t���H�� [����@SH�� ����������̹���̹��
��H;�s-H�\$WH�� H��H��H�H��t��H��H;�r�H�\$0H�� _��H�\$WH�� 3�H��H��H;�s��uH�H��t��H��H;�r�H�\$0H�� _����H�\$WH�� H�=����tH�
���F_��t������;H���H�
ϓ�~�����uZH�
�-�v^H���H�=���H�H��t��H��H;�r�H�=O�tH�
F���^��tE3�3�A�P�.�3�H�\$0H�� _��H�\$H�t$D�D$WATAUAVAWH��@E���D����
��=�������D�%������H�
�����H��H�D$0H����H�
���v���H��H�D$ L��H�t$(L��H�D$8H��H�|$ H;�r�?���H9u��H;�r\H��7���H���#���H���H�
7�����H��H�
 �����L;�uL;�t L��H�\$(H��H�\$0L��H�D$8H��H�D$ �H���H�
q����H���H�
~�����E��t
��yE��u&���A�L$�`A������A��G��H�\$pH�t$xH��@A_A^A]A\_���E3�3��j�����E3�A�P�\���3�3�D�B�O�����̺3�D���=����@SH�� ����H��H���H���
`H����H����_H����_H���:]H���#H���]H�
�������H���H�� [��H�\$H�|$L�l$ AVH��0L�5����3�I��;t��H����r�����a���|��a��u
�=��a�����H�=P�A�L�3�H��I���,W��tH�d$ E3�E3�3�3��7�H�1�A�3��&��3���u1L�ЗH�
�����V��tH�d$ E3�E3�3�3����H�
���7H��H��<vFH�
���m7H���L�s�H�L8�A�H+��U��tH�d$ E3�E3�3�3���L�<�I��H����T��tH�d$ E3�E3�3�3��`�Lc�I��H��M�O�D���T��tH�d$ E3�E3�3�3��1�H���A� H���8^�E����H��H��t2H���t,Hc�H�I�L��6I�T�H�d$ L�L$HL��H���H�\$@H�|$PL�l$XH��0A^����H��(��_��t��_��u�=��u����������H��(��H�
q��@SH�� H��H�
`��?�H��tH��Ѕ�t��3�H�� [���H��H�XH�pH�xL�` AUAVAWH��H�L$ �9���XD�b�I���L��E3�I;�u���{H���A�̉
��HL;�sCE�{I��A�C	
E�{E�{8A�C9
A�C:
E�{PE�{LI��XH���HL;�rË
n�fD9|$b�IH�D$hI;��;L�hHc0I��9L�;���L�54��XI���_L��I;�tiI���
�Aĉ�I��L;�sAE�{I��A�C	
E�{A�c8�A�C9
A�C:
E�{PE�{LI��XI��HL;�rŋ��H��;�|������L�5��A��A;�~~H�>�tkH�>�teA�Et^A�EuH����A;�tILc�I��H��A��Mk�XM$�H�I�$A�EA�D$I�L$���>[A;�tA�D$�������I��H��;�|�E��I��H��Hk�XH
�H�;�tH�;�t�K���C�A�D$���Ƀ�������E;�D��H��H���tJI;�tEH����A;�t7H�3����u�K@�	��u�KH�K���ZA;�t�C����.�K@H�����A��H��H���Q����
^����3����L��$�I�[ I�s(I�{0M�c8I��A_A^A]����H�\$H�l$H�t$WH�� 3�H���H���d��H��H��u(9&�v ���D���D;�A��G�;�u�H�l$8H�t$@H��H�\$0H�� _�H��H�XH�hH�pH�x ATH�� 3�H��H��A��E3�H��H���1���H��H��u*9��v"����D���D;��A��AG�A;�u�H�l$8H�t$@H�|$HH��H�\$0H�� A\��H��H�XH�hH�pH�x ATH�� 3�H��H��A��H��H���[H��H��u/H��t*9%�v"���D���D;
�A��AG�A;�u�H�l$8H�t$@H�|$HH��H�\$0H�� A\����H�\$H�t$ATH��03��N�j��^�\$ ;��}iLc�H���J�<�tPJ��A�t�F�����t�Ɖt$$��|1H���J��H��0���H�
~�J���
���L�n�K�$��É\$ 돹����H�\$@H�t$HH��0A\�H�\$H�t$WH�� �A3�H��$<u?�At6�9+y��~-�|H�SD�Nj��b-;�u�C��y��C��K ��H�K�c��H�t$8H�H�\$0H�� _����@SH�� H��H��u�5�,�j�����t����csH������Z����3�H�� [��H�t$H�|$L�d$AUAVAWH��0D��E3�3��N���3��|$ A��;=N���Lc�H�6�J�<�tjJ��B�t`���f����H��J��A�t5A��u�9���A;�t%A��D�d$$�E��u�At����A;�AD��t$(H���J�������lj|$ �n�����@A��AD��H�t$PH�|$XL�d$`H��0A_A^A]ù������H�\$H�t$H�|$ATH�� L�%��3�3�I�܃{u%Hcƺ���H��H�:�H��H��U��t-H��H����H;�|øH�\$0H�t$8H�|$@H�� A\�Hc�H�I�$�3�����H�\$H�l$H�t$WH�� H�q�H�-��H��H�7H��t�tH��ȅH���H���H�'H��H;�|�H�H��t�{u���H��H;�|�H�\$0H�l$8H�t$@H�� _��Hc�H���H�H��H�%��H�\$H�t$H�|$AUH�� HcپH�=��u�P����N� �������H��H�L�-��I�|�t���{�(���H��H��u�����3��Z�
�f�I�|�u/��H���T��uH���L�������3��I�\��	H���.����H�
������H�\$0H�t$8H�|$@H�� A]�H�\$WH�� Hc�H�=�H�H�<�u�����u�H�U�H��H�\$0H�� _H�%L�H��H�XH�hH�p H�PWATAUAVAWH��@M�yM�!I�q8M+�AfM��H��L����3�H�H�L�@�9>�+H�^�C�L;����C�L;����{���;t�H�L$0H��I�Ѕ���~sA�}csm�u(H�=;�tH�
2��O��t�I����KA�H��I��7I�F@�SMcMH�D$(I�F(I�M��H��H�D$ �?��:��H��;>sj�>���3��fI�y 3�I+�9.vTH�^�K�L;�r>�C�L;�s6H;�rH;�sA�E u/�;t	�H;�t#�H�T$xIDZI�D�C�M�A���H��;.r��L�\$@I�[0I�k@I�sHI��A_A^A]A\_����H�\$H�l$VWATAUAWH��0�-D�I��E3�E3�E3ۀ: E�yE��H��L��uI߀; t��;at?�;rt3�;wt'�
��H�d$ E3�E3�3�3�����3��9��3�A���	��I�A�׊����A�������ȃ�S~to�� ����tLA+�tB��t+��
t���u���E����E�׃�����@��@����@�E���w@��uq�������jE��u]E�׃� �]��TtJ��t:A+�t'��t������A��u3���5E��u(E�����'E��uE�����A��u�����s3����Iߊ������E�����I߀; t�H�
��A�H���a�������H���I߀; t��;=�n���I߀; t�H�r�A�H���`��u
H�����MH�[�A�H����_��u
H�����*H�H�A�H����_������H�����I߀; t��;���H�L$hE��D��I���D$ ��d]�����D=}�!F�D$hH�&H�fH�f(�F�nH��H�\$`H�l$pH��0A_A]A\_^�H�\$H�t$WH��03ۍK�7����3��|$ ;=����Hc�H���H�<�tkH��@�uV�`rO�G���w�O�
�������H�S�H���萹��L�A�I��@�tH�Ћ�����H����lj|$ �x���Hc��X��H�
�H��H�
��H�<�tXH��H��0���N��uH�
��H���d���L���I�$��$H���H��H��0��}L���I���cH��t�c��cH�cH�#H�c(�K�����H��H�\$@H�t$HH��0_����������ff�H���M3�M3�H�d$ L�D$(�sH����������fDH�L$H�T$D�D$I� ��������f��������f�����H�\$H�t$WH��0H��H��u$���H!|$ E3�E3�3�3�������A����@���t�� �A�����A�u�	$�H�AH�H����	D�G$H�W���M�G����������G�u_H���	���t<H���	���t/H���	H��H�5��Hc�H���o	D��A��Mk�XL��L�#�A�C$�<�u�o
�$u�Gt�g
r�G$H��O�H��H���������	G�g��H�\$@H�t$HH��0_���H�T$�L$SUVWATAUAVAWH��XA�����Hc�A��D�d$4�\$8A;�u�H��3��8����	�3�;���;����H��L��L�
����I����K���@4Hk�X�D1��������v�����8�������;������H;�t�D�|18A�E�A�A�σ�t��u��Шt���L���d��Шt���A;�AB؋���L��H;�u�H����]����=��$�3�D�B�xL�
ə��L��K���@4L�\0@K���@4I��A�
�D0H���L0	A:���;���A�MK���@4A��A�I�UA�h�D�D0	D:�tbK���@4�L09A:�tQ;�tM�
K���@4A�H��A�h�D�D09A��u.K���@4�L0:A:�t;�t�
K���@4H��A�h�A�D�D0:K���@4L�L$0D��H�1H�|$ ��z;���HcT$0;�����H;���L������K���@4�D0��yA����;�tA�}
u�L0��d0�Hc�I��M��I�H�D$@L;��:�
A�$<�
@:�t
�H��I����H�D$@H��L;�sI�D$�8
u	I���L���K���@4L�L$0H��$�H�1A�I��H�|$ ��y;�u
�Ix;�u{9|$0tuL�ؗ��K���@4�D0Ht"��$�
t'@�+K���@4��$��D1	�GI;�u��$�
u�
�3��$�A�H���%��$�
L�n���t�L�c���@�+H��L;d$@����K���@4�D0@u�L0�	A�$�H�Ë�A+�A����;���A�I+��uI��A�����I;�rI+�A��B8�P t��B��P ;�u����*A�����;�uHc�H��^K���@4�D0Ht;I߃��L0	|�K���@4I߈D19��u�K���@4I߈D1:Hc�H+����$���E��Hc���D$8L��$�A+���D��M�ʼnD$(3ҹ�L�|$ ��w��;�u�yv�����A����D�d$4;�H�����J���@4@���|0H�;׺
tfA9Uu�L0��d0�Hc�I��M��N�<(M;��{�
A�$f���Ef;�tf�H��I���%I�G�L;�sI�D$f9u	I����L���K���@4L�L$0H��$�H�1A�I��H�|$ ��v;�u��u;���9|$0��L����K���@4�D0HtF�
f9�$�tKf�+��$�K���@4�D1	��$�K���@4�D19K���@4�T0:�WI;�u�
f9�$�uf��>��$�H�����D�B�7�
L�����f9�$�t��
L�k���f�+H��M;�������"K���@4�D0@u�L0�A�$f�H����A+�D�d$4L��$�M;�tI���(���A���DD�A���i�et��u�K���	�`���������muD��뮋��d������3��)�6���8����	E3�E3�3�3�H�|$ �%����H��XA_A^A]A\_^][��H�\$H�t$�L$WATAUAVAWH��0A��L��Hc����u����3ۉ����	���3�;���;=s���L��L��I��L�=d�A��Mk�XK��B�L ��u.�x����Q���	H�\$ E3�E3�3�3��g�������A�������;�u+�:�������H�\$ E3�E3�3�3��)�����n����V�K��B�D tD��I�Ջ��s�����������	����������[W���)���������	H�\$ E3�E3�3�3������H�\$hH�t$pH��0A_A^A]A\_���H��8H��u%�^��H�d$ E3�E3�3�3���s������AH��8���H�\$H�t$WH��0I��I��H��M��u3��fH��u%�	���H�d$ E3�E3�3�3ɉ������<M��tH;�r
L��H���T3�L��3��HH��t�H;�s����"뮸H�\$@H�t$HH��0_��������������������ff�H��I��rS��I�I��I��@rH�ك�tL+�H�H�M��I��?I��u9M��I��I��tfff��H�H��I��u�M��t
�H��I��u��@fff�ff�I��s0H�H�QH�QH��@H�Q�H�Q�I��H�Q�H�Q�H�Q�u��fDH�H�QH�QH��@H�Q�H�Q�I��H�Q�H�Q�H�Q�u��$�T�����H�\$H�|$ATH�� H��������������d���H��0H;�u3���R���H��`H;�uw����CucL�%��Hc�I�<�u+����I��H��uH�C H�CH���C$�C�I���C$�CH�KH��K��3�H�\$0H�|$8H�� A\���̅�t0SH�� �bH��sH�����c���c$H�#H�cH�� [����H�\$H�t$WH�� Hc�A�������RH���u�_���	���RD��E3���H���p�����u�Fo�3���t	���g����H��H��H��H����H��Hk�X�d���H�\$0H�t$8H�� _���H�\$H�t$�L$WATAUAVAWH��0E��D��Hcك��u����3��8����	����3�;���;����H��L��I��L�=t���Hk�XK���L0��u+����8�c���	H�|$ E3�E3�3�3��y�����m���=R�K���D0tE��A�Ջ�����������	�0���8�����R���)����8�����	H�|$ E3�E3�3�3��
����H�\$hH�t$pH��0A_A^A]A\_����H�\$WH�� Hc����$QH���tYH������u	@���u
;�u�@`t�P�H����PH;�t����PH���m��u
�]m���3ۋ��PL��H��H��A��H��H��Mk�XB�D��t���R�����3�H�\$0H�� _�H�\$H�t$ �L$WATAUH��0Hcك��u���3��8�����	����3�;���;����H��L��I��L�-����Hk�XK�D��L0��u+����8�|���	H�|$ E3�E3�3�3�������a���VP�K�D��D0t���������9���	������P���)�@���8����	H�|$ E3�E3�3�3��/����H�\$`H�t$hH��0A]A\_�@SH�� �A�H��t"�AtH�I芤���c����3�H�H�C�CH�� [��H��(H��8csm�u+�xu%�@ = �t=!�t="�t=@�u�k9�3�H��(����H��(H�
������k3�H��(���H�\$H�l$H�t$WH�� H�����E3�H��I;���H���Lc!�H��9:tI��H��H��H�H;�r�I��H��H�H;�s9:tI��I;��CL�BM;��6I��u
L�ZA�@��%I��u���H���H����J����Lc���
��A�M��D;�}*I��H���A��I��M�\��
_��]��D;�|ځ:�����uǃ���v�:��uǃ���b�:��uǃ���N�:��uǃ���:�:��uǃ���&�:��uǃ����:��u
ǃ������A�Љ���L�ZA��H������3�H�\$0H�l$8H�t$@H�� _���H�\$H�l$H�t$WH��0�=m�u���H��3�H��u����<=t��H����H�\���u�G�Hc��G�H��H�ųH��t�H����;teH����;=�ptCHc�H����H�H��trL��H��H���1��tH�d$ E3�E3�3�3�轿��H��Hc�H؀;u�H�W�H���W���H�%G�H�'�q�3�H�\$@H�l$HH�t$PH��0_�H�
�����H�%������H��H�XH�hH�pH�x ATAUAVH�� L�l$`M��I��A�eL��H��A�H��tL�I��3�;"u3���@�"��H�Ë��9A�EH��t��H���3H�Ë��=O��tA�EH��t��H��H��@��t��u�@�� t@��	u�H��t	�G��H��3��;���; t�;	uH����;��M��tI�<$I��A��3��H����;\t��;"u6��u��tH�C�8"uH���3�3҅����������H��t�\H��A�E��u���tO��u< tG<	tC��t7���`NH��t��t�H�ÈH��A�E��H�����tH��A�EA�EH���Y���H��t�H��A�E����M��tI�$$A�H�\$@H�l$HH�t$PH�|$XH�� A^A]A\��H�\$H�t$ WH��0�=r�u���H�=��A�3�H������dfH�]�H�=�H��t�;uH��H�D$HL�L$@E3�3�H��H�D$ ���Hct$@H��������H;�s\HcL$HH���sQH��H;�rHH�����H��H��t8L��H�D$HL�L$@H��H��H�D$ �g���D�\$@H�=K�A��3�D�;����H�\$PH�t$XH��0_���H��H�XH�hH�pH�x ATH��@�
ѶE3�I��A�t$A;�u2��fH��I;�t����!�Ie�
����xDΉ
������I;�u��fH��I;�u3��H��fD9#tH�fD9'u�H�fD9'u�L�d$8L�d$0H+�H�L��3�D�O3�D�d$(L�d$ �6fHc�A;�tAH���j��H��I;�t1L�d$8L�d$0D�OL��3�3ɉl$(H�D$ ��eA;�uH���5���I��H���eH���s;�t	A;��L�����eH��I;��:���D8 tH��D8 u�H��D8 u�+��Hc�H������H��I;�uH��pe����L��H��H���}%H��TeH��H�\$PH�l$XH�t$`H�|$hH��@A\���H�\$WH�� H��{H�=�{�H�H��t��H��H;�r�H�\$0H�� _�H�\$WH�� H��{H�=�{�H�H��t��H��H;�r�H�\$0H�� _�H�\$WH�� H�˖H�d$0H�2��-�+H;�tH��H����vH�L$0��dH�\$0��dD��I3��cD��I3��dH�L$8D��I3�{dL�\$8L3�H�������L#�H�3��-�+L;�LD�L�>�I��L�<�H�\$@H�� _�̃%���H�\$WH�� Hc�A��H�T$8���FH���u聻���	H���W�T$8L�D$<D��H���c�D$8���u�ab��t	��膻����H��H��H�'�H����H��Hk�X�d�H�D$8H�\$0H�� _����H�\$H�t$�L$WATAUAVAWH��0E��L��Hcك��u����3��8�ٺ���	H����3�;���;����H��L��I��L�=����Hk�XK���L0��u,詺���8肺���	H�|$ E3�E3�3�3�蘹��H���q���[E�K���D0tE��I�Ջ����H����8����	�M����8H������EH���*�6����8�����	H�|$ E3�E3�3�3��%���H��H�\$hH�t$pH��0A_A^A]A\_��H�\$ UVWATAUAVAW�0��WH+�H�,�H3�H��$ 3�3�E��L��Hcىl$@E��u3���H��u.袹��!8�{���H!|$ E3�E3�3�3��葸�����L��L��H�<�I��A��J��L�t$PMk�XA�t8@�@�@��t@��u	A��Шt�A�D t
3ҋ�D�B�Z����������H�ܳJ��A�D����+��3�H�T$XH���H���9YJ��I���^a������t	@�����;a!|$LI�܉D$XE���wD�t$X�
@����H�T$P�E3���
H�-H�H�T�A��A�|Pt A�DL�L$]A��D$\A�dPH�T$\�I���k��t4I��H+�I�H����H�L$DA�H���H����vH���A�H��H�L$D��H����UH�d$8H�d$0�L$XH�D$\L�D$DA�3��D$(H��H�D$ �`���H�D$PH�d$ H�
g�H��L�L$LH�T$\I�D��t_���B��A+�|$@9l$L���
E����H�D$PH�d$ @�l$\H�
�L�L$LD�E�H��H�T$\I��_�����|$L|{�D$@���e@��t@��u�E3�f��
f�D$DA��H��@��t@��u6�L$D�,Ef;D$D����E��t��f�l$D�
Ef;D$Dux��D$@��A+�A;������\$LL�t$P�l$@�������z���e�K����	�`���������L�t$P��J�L�A�DLJ�D�A�DP�\$L�]��떋\$L�H��J��A�D���3�I��@����E�����S
D�t$@H��$ 3ɋ�A+�A;�s&�EH��<
u�A��H��H��H���H��H���r�H!\$ H��$ D��D+�H�h�D�t$@L�t$PL�L$HH��$ J��I��k]��t5|$HH��$ H+�HcD$HH;������ź
A+�A;��N�������$\�����@����E���"�
D�t$@H��$ 3ɋ�A+�A;�s1�EH��f��
uf�A��H��H��H��f�H��H���r�H!\$ H��$ D��D+�H���D�t$@L�t$PL�L$HH��$ J��I���\���J���|$HH��$ H+�HcD$HH;������ź
A+�A;��?�������E���NA�
H�L$p3ҋ�A+�A;�s.�EH��f��
ufD�H��H��H��f�H��H���r�H�d$8H�d$0H�D$p+�L�D$p�D$(U
�����+�3��D��H��$ H�D$ �\D�������3�H�D$PH�d$ Hc�H�� E��H�
`�H��L�L$HD+�I��r[��tt$HD;����UZ��D;�������A�
A+�A;��������I�H!|$ L�L$HE��I��[��t�|$H3�����Z��������$����~���H�ȭJ��A�D@tA�<$�.���輲����Ѳ��� �H���+���H��$ H3����H��$�H��0A_A^A]A\_^]���H�\$H�t$�L$WATAUAVAWH��0E��L��Hcك��u�j���3��8�A����	����3�;���;���H��L��I��L�=����Hk�XK���L0��u+�����8����	H�|$ E3�E3�3�3��������m����<�K���D0tE��I�Ջ��������裱���	踱���8�����4=���)裱���8�|����	H�|$ E3�E3�3�3�蒰����H�\$hH�t$pH��0A_A^A]A\_����@SH�� ��H�ٹ����H�CH��t
�K�C$��KH�C �C$H�CH�C�cH�H�� [��H��8���u
����	�R��x.;
��s&Hc�H���H����H��Hk�XH���D��@�"裰��H�d$ E3�E3�3�3��	踯��3�H��8��@SH�� E�H��L��A��A�L��tA�@McP��L�Hc�L#�Ic�J�H�C�HHK�At�A���H�L�L3�I��H�� [�m����H��(M�A8H��I������H��(����@SH��@��H�L$ �~���H�D$ D��H��@B�Y%��|$8tH�L$0����H��@[����@SH��@��H�L$ 3��4���H�D$ D��H��@B�Y%��|$8tH�L$0����H��@[��������������������ff�H��H��H�tf��H����t_�u�I��������~I��H�M��H��L�H��I3�I#�t�H�P���tQ��tGH����t9��t/H����t!��t����t
��u�H�D��H�D��H�D��H�D��H�D��H�D��H�D��H�D��H�\$WH�� H����
H��b���H�H��H��u�H�\$0H�� _���H�
�3�H��H9
̦���H�\$fD�L$ UVWH��`3�I��H��H��H;�uL;�vH;�t�)3��H;�t�	�I�����v$�
����E3�E3�3�3ɉH�l$ �"������oH��$�H�L$@�p���L�\$@A9k����$���f;�vLH;�tH;�v
L��3�H���$�蟭���*蔭���@8l$XtH�L$P����H��$�H��`_^]�H;�tCH;�w<�`����"E3�E3�3�3ɉH�l$ �u���@8l$X�H���H�L$P�����7����H;�t�@8l$X���H�D$P��������H��$���$�A�KH�D$8H�l$0L��$�A�3҉|$(H�t$ �<U;�t9�$�����H;�t����S��z�����H;�tH;�v
L��3�H���������"E3�E3�3�3ɉH�l$ 蔫��@8l$X�g���H�D$P�����V���H��8H�d$ ���H��8�@SH�� �B@I��tH�zuA��&�B�x
H��H�������2������u	��H�� [��H�\$H�l$H�t$WH�� A�@@I��I���H��tI�xuA�7��~3�ML��H����r���H�Ń?�u虫���8*uL��H�ֱ?�S������H�\$0H�l$8H�t$@H�� _���H�\$UVWATAUAVAWH���H�ƅH3�H��$�3�H��H�L$hH��H�L$xI��M��D$`D��D$TD���D$H�D$X�D$P蠉��E3�I;�uA���3�E3�E3�3�3��H�\$ ����8�$�tH��$��������A���C@L�
dq����H���:��H���A;�t(���t#Lc�L�
;q��I��A��H��Mk�XM��@4�
L��L�
q��A�@8u)A;�t���tHc�H�ƒ�H��Hk�XI��@4�B8�tA�3���3�E3�E3�3�3��H�\$ �G���8�$�tH��$�����A���KE3�I;�t�@�/A��D�T$@D�T$DA��L��$�A:��H��$�A�H��A;�H��$����E�<XwH��B������A��Hc�H��Hc�H�B��	 ����T$\���/�����A;����������@�������������������<@�Ń�d�~����A�@��C����E�.��G�%��Stm��X����Zt��a���c���HI�EI��I;�t/H�XI;�t&A���s��D$P+���D�T$P�H����A��0uA��I�]E;�A�ǹ���D�I��A���I;��D$PHD��H����A��0uA��I��A��t,E�M�H��$�H�L$DM�����E3�A;�t�D$X�A�E��D$D��$�H��$��M�D$p@�� A��@E;�H��$�A���-A��k��e���g~σ�i����n����o����pte��s�������u����x���'�S��fD9t	H��A;�u�H+�H��!I;�HD��H���
��D8tH��A;�u�+ˉL$D�A�A����D$`A�E��y`Q�D$L0A�Q�D$M�SA�E��yDA��	�=I�}I���@���E3�A;��l���A�� tf�7��7�D$X�lA��@A�
�T$HA��rA��s
M�EI���.I��A�� tA��@tM�E��E�E��A��@tMcE��E�E�A��@t
M;�}I��A��A��r
A��rE��E;�}A��A��E;�EO�D�t$`I��H��$�H���#ʉL$HA��A��A;�M;�t 3�I��Ic�H��L���B0��9~AƈH����H��$�A�����+�H��A��	�D$D�A;�t	�;0�H��D$D�0�u@��guAA��9E;�EO�A���~)A��]Hc����H��$�H��tH�؋��A��I�EH�
\�I��@��Hc�H��$���H�L$xD��H�L$0�L$pL�ƉL$(H��$�H��D�|$ ��A��3���tD;�uH�
�訳��H�T$xH���3�@��gu;�uH�
�膳��H�T$xH��Ѐ;-uA��H��H���+���E3҉D$DD9T$X�KA��@t1A��s�D$L-�A��t�D$L+��|$H�A��t�D$L ��|$H�t$TH�l$h+t$D+�A��uL�L$@L�ŋֱ �̖��L�L$@H�L$LL�ŋ�����A��tA��uL�L$@L�ŋֱ0蛖���|$D3�9D$Ptu;�~qH��D�MH��$�H��$�A���H���V���E3�A;�u2��$�A;�t&L�D$hL�L$@H��$����E3�A;�u�H�l$h�#H�l$hA�ƉD$@�L�L$@L�ŋ�H���X���E3ҋD$@A;�|A��tL�L$@L�ŋֱ ���E3�H��$�I;�tH���ɂ��E3�L��$�H��$��t$@�T$\L�
�i��A�@�/A:�����A;�t	�������D8�$�tH��$�������H��$�H3����H��$ H���A_A^A]A\_^]�@��It=@��ht.@��lt
@��wu�A��끀?lu
H��A���o���A���f���A�� �]����A��<6u�4uH��A���>���<3u�2uH��A���&���<d����<i����<o����<u����<x�����<X�����D�T$\H�T$x@��D�T$P���3�;�t!H�T$hL�D$@@���s���@�/H��@:��H�T$hL�D$@@���R���E3����@��*uE�}I��E;������E���~���C��@��D�|H��l���E���d���@��*uA�EI��A;‰D$T�I���A������D$T��@�ōDHЉD$T�)���@�� tA@��#t1@��+t"@��-t@��0����A�����A�����A�����A�����A������D�T$pD�T$XD�T$TD�T$HE��E��D�T$P���葠��E3�E3�3�3�H�t$ �觟��@8�$��Z�����@UATAUAVAWH��`H�l$@H�]PH�uXH�}`H��zH3�H�ED����3�M��L�MD�ED��UH��D�n�D;�uOL�5RE�ͺ3ɉ|$(H�|$ ��H;�tE��D�-Z����FD�K���xDD�D�=�L�]D�MpD;�~5A��I��A+�@88t
I�;�u��A��+�A+�A;�}
D�HD�Mp�D�ȉEpD;��\D;��SE;���D�����D;�uH�D�`���M��A��҉|$(H�|$ ��A�xGLc�D;��<H�����A���A�~[3�H�B�I��H��rLK�L?I;�w.H�AH;�wH��H�����<H+�H�|$@H�����������H��H��tD�0H��H����D�MpL�E�A��D�|$(H�|$ ��F3�;��K�U�L$(H�L$ �ME��L��#GE3�Hc�A;��!D�UA��
s;���A;��;����M�D$(H�ExE��L��A��H�D$ ��F��A;�~`3�H�B�H��H��rQH�L6I;�w*H�AH;�wH��H�����;H+�H�\$@I;�t�����~��E3�H��I;�tD�0H��D�U�I��I;�tn�ME��L��A�҉t$(H�\$ �FF3�;�t?���3�H�L$8D��L��H�L$0;�u�L$(H�L$ �
�D$(H�ExH�D$ A���E��H�K�D91u��|��H�O�D91u��|������H��L��D;�uH�D�pD�u�����uH��xA���0D���u3��L�}xL�E;��<3�L�Mp�Ћω\$(H�\$ ��0H��H;�t�D�Mp�UL��A�Ή\$(H�\$ �MELc�D�MD;�u���D;�A���~bI��I���wYH��H��w4H�YH;�w
H�����H���H���R:H+�H�\$@H��t%�����l|��H��H��tD�0H��D�MH��u3��Mc�3�H�����D�]D�Mp�U�MD�\$(L��H�\$ ��D�E��u3��.���L�ML�ÉD$(��A��L�|$ ��/�}L��3�L;�D�H�K�D91u(�W{���!���D�Mp�U�D$(A��L�|$ �.D��3�H;�tH���%{��L;�t
M;�tI���{����H�MH3��y��H�]PH�uXH�}`H�e A_A^A]A\]����H�\$H�t$WH��p��H��H�L$PI��A���y����$�D��$�H�L$PD�\$@�D$8��$��D$0H��$�L��H�D$(��$�D�Nj։D$ �O����|$htH�L$`����L�\$pI�[I�sI��_���D�L$ UATAUAVAWH��@H�l$0H�]@H�uHH�}PH��tH3�H�ED�
Ԓ�3�M��D��L��wD;�u=L�MH�aLD�Nj��B;�t�=���6�(AD�
����xDD�D�
�D;��&D;��D;��C�uh;�uI�E�p�]xD�MXM��ҋΉ\$(��H�\$ �BLc�D;��A���~hH�����L;�wYK�L$H��w5H�AH;�w
H�����H����{7H+�H�|$0H;��������y��H��H;�tD�(H���H��H;���M��3�H��M����D�MXM�ƺ��D�d$(H�|$ �JA;�tL�M`D��H��A���A��H�O�D9)u�x�����D�epH��D;�uI�ED�`�uh;�uI�E�pA���z,���u3��U;�t$L�MXM�ƋЋΉ\$(H�\$ �,H��H;�t�L��H�E`D�MXM��A��A��H�D$ �%A��H;�tH���x����H�MH3��v��H�]@H�uHH�}PH�eA_A^A]A\]���H�\$H�t$WH��`��H��H�L$@A��I���v����$�D��$�H�L$@D�\$8�D$0��$��D$(H��$�D��L�Nj�H�D$ �.����|$XtH�L$P����H�\$pH�t$xH��`_������������������ff�L��H+���I��ra��t6��t�
I�ȈH����tf�
I��f�H����t
�
I���H��M��I��uQM��I��tH�
H�H��I��u�I��M��uI���@�
�H��I��u�I���fffffff�fff�ff�I�� sBH�
L�T
H�� H�A�L�Q�H�D
�L�T
�I��H�A�L�Q�u�I���q���fff�f�H��r�� 
D
@H�����u�H���@L�
L�T
L�	L�QL�L
L�T
L�IL�QL�L
 L�T
(H��@L�I�L�Q�L�L
�L�T
���L�I�L�Q�u�I��I���q����$���ffff�fff�fff�f�I�I��ra��t6��tH�Ɋ
I�Ȉ��tH��f�
I��f���t
H���
I���M��I��uPM��I��tH��H�
I��H�u�I��M��uI���H�Ɋ
I�Ȉu�I���fffffff�fff�ff�I�� sBH�D
�L�T
�H�� H�AL�QH�D
L�
I��H�AL�u�I���s���ffff�f�H���w�� H��
D
@��u�H���@L�L
�L�T
�L�I�L�Q�L�L
�L�T
�L�I�L�Q�L�L
�L�T
�H��@L�IL�QL�L
L�
��L�IL�u�I��I���q����$���H����SH�� H��H�I��s��H�K��s��H�K��s��H�K ��s��H�K(��s��H�K0��s��H��s��H�K@�s��H�KH�s��H�KP�s��H�KX�s��H�K`�s��H�Kh�s��H�K8�~s��H�Kp�us��H�Kx�ls��H����`s��H����Ts��H����Hs��H����<s��H����0s��H����$s��H����s��H����s��H����s��H�����r��H�����r��H�����r��H�����r��H�����r��H����r��H����r��H���r��H���r��H���r��H���|r��H�� �pr��H��(�dr��H��0�Xr��H��8�Lr��H��@�@r��H��H�4r��H��P�(r��H�� [���H��tBSH�� H��H�	H;
9|t�r��H�KH;
/|t��q��H�KH;
%|t��q��H�� [�H����SH�� H��H�IH;
|t�q��H�K H;
�{t�q��H�K(H;
�{t�q��H�K0H;
�{t�q��H�K8H;
�{t�mq��H�K@H;
�{t�[q��H�KHH;
�{t�Iq��H�� [����@SH��0L��H��t
H��tM��u,D��`����H�d$ E3�E3�3�3ɉ�t�����H��0[À9t	H��H��u�H��uA��A�I���H����tH��u�H��uA������"�3�����@SH��0M��M��uH��uH��u 3��?H��tH��tM��uD�	��M��u,D�跐���H�d$ E3�E3�3�3ɉ�ˏ����H��0[�L��L��I���uA�I��A�I�„�t,I��u��$A�I��A�I�„�tI��tI��u�M��uE�
M���f���I���uD�D�A�@P���)����"�m������@SH��0H��t
H��tM��u,D�����H�d$ E3�E3�3�3ɉ������H��0[�L��A�I��A�I����tH��u�H��u�趏���"�3��������������������ff�H+�L���t�B�	:�uVH����tWH��u�I��J�	f��f���w�H�J�	H;�u�I��������~L�H��H��I3�I��t��H�H���3��fff���t'��t#H����t��tH����t��t����t��u�3��H�H���������ff�H+�I��r"��tf��:
u,H��I���u�M��I��uM��t�:
uH��I��u�H3�����ÐI��t7H�H;
u[H�AH;D
uLH�AH;D
u=H�AH;D
u.H�� I��u�I��M��I��t�H�H;
uH��I��u�I���H��H��H��H�H�H�H;��������������������ff�M��tuH+�L��I����t�B�	H��:�uWI��tN��tJH��u�J�	f��f���w�H�J�	H;�u�H��I��I��������~vH��L�I3�I��t��H3��H�H��Ä�t'��t#H����t��tH����t��t����t��u�H3�����@SH�� ��J�M���H��H����H��H��H��u�C�H�#3�H�� [���H�\$H�t$H�|$ATAUAVH�� L��蓡���H�
ˉ貛��L��H�
��裛��H��I;���H��I+�L�oI����I���$H��I;�sT�H;�HB�H�H;�rI������3�H;�u�3�H�V H;�rFI�����H;�t9H��H��H������H�3�I������H�H�K���H��I���3��ؠ��H��H�\$@H�t$HH�|$PH�� A^A]A\����H��(���H������H��(������H���MZf9t3��HcH<H�3��9PEu�f9Q�����LcA<E3�L��L�A�@E�XJ�LE��t�QL;�r
�A�L;�rA��H��(E;�r�3��H�������������H��(L��L�
�Q��I���j�����t"M+�I��I�����H��t�@$���Ѓ��3�H��(����H��(�W���H���H��t����#H��(��H��(H�
���谙��H�Y�H��(�H�
U�H�
V�H�
W�H�
X�����H�
E�錙��H�\$H�t$WATAUAVAWH��@��3��|$p3��у��	������������������tM��t,��t_�<����H!t$ E3�E3�3�3��R�������L�%��H�
����|$p�L�%��H�
����|$p�L�%{�H�
t���|$p�u蔙��H��H��u���kH���H��Lc�q9YtH��I��H��H�H;�r�I��H��H�H;�s9Yt3�L�aM�,$�L�%�H�
���|$p�;���L��I��u3��M��u
A�M���̅�t3��ݬ�����t��t��tL�|$8D�t$p�1L���L�|$8H�����uD���dž���D�t$p��u9�
�p�щL$0��p�;�}*Hc�H�H���H�d��‰T$0�
�p���u���I�$��t3��>����;�u
�����A�����A��;�t
��t��uL���;�uD���3�L�\$@I�[8I�s@I��A_A^A]A\_����H�
݀�H�
��H�
��H��8��0D�؉D$ �=�u���/E3�D�\$ A��H��8����H�\$H�l$VWATAUAVH��@A��L��L��蘖��3�H��H9����H�
�C�y0H��H����H�~CH���/H���sH���D���H�MCH��H�3��e/H���%���H�CH��H���F/H������H��BH��H���'/H�����L��H��H��t!H��BH��/H�����H���H���H��L��H;�tcL;�t^H��袕��H�
�H��蓕��L��H��t?H��t:��H��t-H��$�A�L�D$0H�L$ A�Q�H��A�ԅ�t�D$8u���>H�
9H;�t2�;���H��t(��H��H��tH�
!H;�t����H��tH���H��H�
�~����H��tD��M��I��H����3�H�\$pH�l$xH��@A^A]A\_^�H��8��x ��~
��u��q�1��q�
�q�#軅��H�d$ E3�E3�3�3���Є����H��8�H�\$H�t$WH�� H��H��H��u
H���e���jH��u�*e���\H���wCH�
�v�H��HD�L��3�L��1.H��H��uo9CztPH�������t+H���v�H��诟�������3�H�\$0H�t$8H�� _����H���+��蝄������܄��H���+��脄���H����H�\$�L$VWATH��0Hc����u覄���	��������;=r��H��H��H��L�%c��Hk�XI���L��u%�Y����	H�d$ E3�E3�3�3��n������z���2�I��Dt+���H��-��u
�+���3ۅ�t���������	��������#�݃���	H�d$ E3�E3�3�3�����H�\$`H��0A\_^��H��H�XL�@H�HUVWATAUAVAWH��3�A��A��H���@��o�x�@��$�H�x�E��t�x�A���l$pD��H�L$T�;�tE3�E3�3�3�H�|$ �=�����r��@u
�|$T�tE
��A���A#Ⱥ�;�tT+�t:;�t1�����8������E3�E3�3�3�H�|$ �������D���@��t��u�A�@�D����$�A���t,��t#��t��t��@u�D;������A���A�������ϋƺ�L$H#�tF=t8=t*=t=t*=t&=t;�t�/���A�����
��A����A��D�l$Ps��s��"�$���A�E�DD�D�l$P@��@tA��A����D�l$P�L$H��s
A��D�l$P@�� tA���@��t
A��D�l$P�e
����u!詁���8��������t�����H��$�D�D$HH��$�H�|$0L�L$`A��D�l$(��l$ �6*H�D$XH�������A��#�;�uC�@��t9D�D$HH��$�H�|$0A��L�L$`D�l$(A�׉l$ ��)H�D$XH���u;HcL�-�{H����H��Hk�XI�D��d���'�����袀���8��H���(;�uMHcL�-t{H����H��Hk�XI�D��d��v'�ȋ�蝀��H�L$X��';�u��I����
�A;�uA��@�	��uA��H�T$X��A	HcL�-{H�����H��D
�I�D�Hk�XD�tHcH����H��Hk�XI�D��d8�A��$H�D$L��E����A��tx�E�ă��*����D$D���u�����8�tP��ٸ������H�T$@A�@�|$@����;�u�|$@uHcT$D�����t��E3�3��ɶ�����t��E���<�@��u�D$T#�u�����#�=@tJ=t,=@t%=t+=@t$=t=@u(��$�����#�;�uD��$��@��$������|$DA��@��A��%�=@�$=�t|=���;��A;�v��v8���l��$�A���A+�� A;��P�D$D����E��3����H;�t��E3�3��z��H����|����H�T$DA�覩������a���A;�t ��uk�|$DuD�@�D��$����D$D=��u��	����}��������=��u#�E3�A��������������D��$���E3�3�������;;�vqA;������������E��3����H;������E3�3����H���u8����D$DA��Hc�E��H�TDD+��������m����D;��A�Hc@��$�H����@��H��Hk�XI�D��d8�@l8HcH�ƒ�H��Hk�XI�L��ƀd8����D8@8|$Lu!@��tHcH����H��Hk�XI�D��L A��%�=���A����H�L$X��#�D$PD�D$HH��$�H�|$0�D$(A��L�L$`�D$ A��%%H���u6�)#���R|��LcI��A��H��Mk�XI�D�B�d����B���HcH�ʃ�H��Hk�XI�L�H�
��H��$�H�ĀA_A^A]A\_^]���H�t$WH��PE��L���d$@3�H��$�H������u(�{����8H�d$ E3�E3�3�3��z��������3�H������u(�K{����8H�d$ E3�E3�3�3��_z�������$���t8A����������u%�{����8H�d$ E3�E3�3�3��z�����`�L$0D�L$(D�T$ D��H��H�L$@�������D$D�|$@t,��t!HcH��H��L��u��Hk�XI���d���6��t����H�t$`H��P_���H��8A��D�L$`E��L���D$(H�L$ D��A��I�����H��8���H��H�XH�hH�pWH��PH��H��H�H�I��I���X��3�H;�u@8l$HtH�D$@����3��H�L$89iuL��H��H����[H;�u<��y��E3�E3�3�3�H�l$ ���x��@8l$HtH�D$@���������-H;�t�A��H��H��D�L
tUH;�u�f��D�L�Z�����@8/u���C�f��H��f�f;Qrf;QwfQ�$f;Qrf;QwfQ���Dt��D�H��I��E�LtNH;�u���^H��@8.uf���Q�fA��H��fD�fA��fD;Arf;AwfA�+f;Ar%f;AwfA�A���Dt
���fA��f;�uf;������H;�������u��������@8l$HtH�L$@����H�\$`H�l$hH�t$pH��P_���E3�����H�\$H�l$H�t$WH��P3�I��H��H��L;�u3��&H�L$0I���V��L�\$8A9kuL��H��H������H;�u<��w��E3�E3�3�3�H�l$ ��w��@8l$HtH�D$@���������H;�t�A��H��H��F�Dt-H;�u���F�Du[f���G@8/uf���
�f��f�H���H��F�Dt#H;�u���H��@8.uf���
�f��f�H��f;�u&f;�tH;�u�@8l$H�����H�D$@������������@8l$HtH�L$@����H�\$`H�l$hH�t$pH��P_���E3����H�\$H�l$H�t$WH�� H�څ�xi;
�qsaHc�H�-�qH����H��Hk�XH�D�H�<�u=�=Qu'��t��t��u���������������qH�D�H�3���Wv���	�lv��� ��H�\$0H�l$8H�t$@H�� _��H�\$H�l$WH�� ��xs;
�pskHc�H�-�pH����H��Hk�XH�D��DtGH�<�t@�=SPu)��t��t��u��������������3��H�D�H��3���u���	�u��� ��H�\$0H�l$8H�� _�H��8���u�u��� �nu���	�]��x1;
Dps)Hc�H�
@pH�ƒ�H��Hk�XH���DtH��,�Lu��� �$u��H�d$ E3�E3�3�3��	�9t��H��H��8�H��H�XH�pH�xL�` AUH�� Hc�L��I��L�-�o��Hk�XK�t���|3u3�O	�n�����|3uH�L3�������#��D3�
�C�����tK�L�H�L����H�\$0H�t$8H�|$@L�d$HH�� A]���Hc�H�
>oH�ƒ�H��Hk�XH��H�LH�%�H�\$H�|$L�d$AUAVAWH��@I��E��E3�A�L$�Ӗ����uA�����襗���3��|$$H��n��@��Lc�J��H���H�\$0J��HH;����C���{u;�
�L�����{u H�K���k���uD�pD�t$(��C�
����E��u H�K���CtH�K���HI��E��u?�CL�#L�nK+�H���.�袋.H��L��I��I��H��?L���D�D�l$ �H��XH�\$0I��H��m� ���E;����lj|$$H��m����X�J����H�D$0H��ttHc�L��mI�Ѓ�m I��H��H;�s�@L� �@	
�`H��XH�D$0����|$ Hc�H��H����Hk�XI���D���H�����AD�D��|$ ����A��H�\$`H�|$hL�d$pH��@A_A^A]�H�\$H�t$WH��@��H��H�L$ A��A���P��H�D$(D��A�|u��tH�D$ H��@B�Y#��3���t��|$8tH�L$0����H�\$PH�t$XH��@_�̋�A�E3�3��r�����H��hH��KH3�H�D$P�=�[f�L$@tfH�
�\H���u�U
H�
�\H�����H�d$ L�L$DH�T$@A��D�����=u[�����xu}�%][�H�d$8H�d$0��H�D$HL�D$@A�3��D$(H�D$ �<H�
�[H���t0H�d$ L�L$DH�T$HD������tf�D$@���Z���H�L$PH3���N��H��h�H�\$H�l$H�t$WH��P3�I��H��H��H;�tL;�t
@8*uH;�tf�)3�H�\$`H�l$hH�t$pH��P_�H�L$0I���N��L�\$0A9ku%H;�t�f�@8l$HtH�D$@�������H�T$0�ݿ��;���H�L$0D��A��~0A;�|+�I��H;���L�Ǻ	�D$(H�\$ ��H�L$0;�uHc�H;�r(@8ot"��@8l$H�4���H�L$@�����#����Vo���*@8l$HtH�D$@�����������A�H;���A�QL�ljD$(H�D$0H�\$ �H�Q;���������E3�������̹�"�����H��H�XH�hH�pH�x ATAUAVH��PL��H��H�H�E��M���FM��M��tM�uM��u*�n��H�d$ E3�E3�3�3���m���|$H��E��tA��|�A��$�A�.L�D$03�I�^A��~L�D$0@�ͺ�r���L�D$0�I��@@���H����t@�+H��뾋�$�@��-u���@��+u@�+H��E���SA���IA��$�?E��u(@��0tA�
�8�;xt
�;XtA��&A��A��u@��0u�;xt�;Xu@�kH��M��@3҃�A��D��@��E�JA��t	@�̓�0�A��t,�E�@��<w�� ���A;�s��A;�r"u;�v��M��uH��@��uM��IE�3��YA���@�+H��둽���@��u@��u:�ƃ�t���w��u';�v#��l���"@��t���
@��$������M��tI�]@��t�߀|$HtH�L$@�������M��tM�u@8|$HtH�D$@����3�L�\$PI�[ I�k(I�s0I�{8I��A^A]A\���H��83�E��L�‰D$ H��9�]u	H�
O�3��Q���H��8�H��8H��FH3�H�D$(L�D$ A���D$&����u���
H�L$ �H�L$(H3��2J��H��8��@USVWATAUAVAWH��H�l$@H�4FH3�H�E0L���E�!3�I��H���}L�MD��D��H�];��H�U�;����}��H�UA���;����}uz�EA���t`A������Hc�H�����H;���H�L	H��wlH�AH;�w
H�����H����	H+�H�\$@H��t<����NH��莻���x�E��L�úA�ω|$(H�|$ ������o���3��7��J��H��H��t���H���3�H��t�Lc�3�H��M����L�EE�̺A�ω|$(H�\$ ��E3�A;���M;�t;���L�|$8L�|$0�D$(D��L��3�A��L�t$ ��A;���I���D9}u,L�|$8L�|$0D��L��3�A��D�|$(L�|$ �^��A;�tWHc׹���H��I;�tBL�|$8L�|$0D��L��3�A�͉|$(H�D$ �A;�u
H���YI��I���A���tH�M�H�K�9��u�7I��H��H�M0H3��G��H�eHA_A^A]A\_^[]����3�D�B
����L��M��t<E�
I��A�A���wA�� �
H�A���w�� I��t
E��tD;�t�D+�A���3���H��H�XH�hH�pWH��PI��H��H��M����H�H�I���bG��H��u=��h��H�d$ E3�E3�3�3����g���|$HtH�D$@���������H��t�H�����w�H�D$0�xu#L��H��H�������|$HtZH�L$@�����L�MH�T$0��H�T$0��H���H��H��t��t;�t�+؀|$HtH�L$@�������3�H�\$`H�l$hH�t$pH��P_����H��8�=IYuAH��u'��g��H�d$ E3�E3�3�3����f�������H��t�I�����w��X����E3����H��8��H��8H��u&�g��H�d$ E3�E3�3�3���f��H���L��H�
�X3�wH��8���H���fRt
�
�R���}��H��t
��z���?Rt_H��$���H�L$03�A���q���H��$�3�H�D$@H�D$0�D$0@H�D$ H��$�H�D$(�%H�L$ ���8~������H��H�XH�hH�pH�x ATAUAWH�� H��3�3�D�G���ͪ��L��H���tPD�G3ҋ�跪��H���t=H��H+�H;����|A��WH��M��o
H��H;�u1�"f����f���H�\$@H�l$HH�t$PH�|$XH�� A_A]A\ú�����D��D��I;�H��EMNj�������tH�H+�H;�~����e���8u�e���
H��A�ԋ����L��H��3���U}]E3�H�Ջ��ҩ��H����T��������H�����H�H��H��H���u%�Je���
�_e��H��F�H�������E3�I�Ջ��u���H��������3����H�\$Lc�H��_M��A��I��Mk�XJ��B�D8F�\�A��D��A���@tX���tH��t(��t ��uHB�L�J��B�d8�B�L8�0B�L�J��B�d8�B�L8�B�d�B�L�J��B�d8�E��u���A���%�@H�\$���H��8H��u'�.d��H�d$ E3�E3�3�3���Cc����
��]�3�H��8��H��HH�d$0�d$(A�H�
8 E3ɺ@D�D$ ��H��NH��H��H��(H�
�NH���tH���t��
H�
�NH���tH���t��
H��(��H�l$WH��pHc�H�L$P�B����sbH�T$P��~L�D$P����zu��H�T$P�H��@�x����tH��H�8���|$htH�D$`��������H�D$P��~6��H�T$P��@�������t@��$�@��$�Ƅ$��� �b����*@��$�Ƅ$�H�L$P�D$@L��$��AA��D$8H��$��D$0H�D$(�T$ �QH�L$P�/�����2�������$�t
��$�����|$htH�L$`����H��$�H��p_�%�	�%�	�%B
��������ff�H��L�$L�\$M3�L�T$L+�MB�eL�%M;�sfA���M���A�M;�u�L�$L�\$H�����@UH��0H��H�MP�.D��H��0]�@UH��0H��H�M`�D��H��0]�@UH��0H��H�M@�C��H��0]�@UH�� H��H�H�ы��H�� ]�@UH�� H��
���H�� ]�@UH�� H���ȃ��H�� ]�@UH�� H��
诃��H�� ]��������@UH�� H��菃��H�� ]�@UH�� H�ꃽ�t
��m���H�� ]�@UH�� H��HcM H��H��]H���C��H�� ]�����������@UH�� H���$���H�� ]�@UH�� H��H�
�E��H�� ]�@UH�� H�����H�� ]�@UH��0H��M`���H��0]�@UH�� H����t��H�� ]�������@UH�� H��H�3Ɂ8�������H�� ]�@UH��0H��}pt3�聂��H��0]�@UH�� H��H�E3ہ8�A��A��H�� ]�@UH��0H��MP�8�H��0]�@UH��@H��}@t>�}Dt*H���Hc
H��H��L�MZ��Hk�XI���d��H����
���H��@]�@UH�� H��
�܁��H�� ]�@UH�� H��
�Á��H�� ]��������@UH�� H��裁��H�� ]����6Hdz������
8DPh������$0:FXhx��������		"	.	@	N	`	x	�	�	�	�	�	�	

6
P
`
v
�
�
�
�
�
�
�
@Nbp������T@tD@�@�t@��@8@1�RL(�(� %@�%@(null)(null)EEE50P( 8PX700WP  `h````xpxxxx	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~CorExitProcessmscoree.dllruntime error 
TLOSS error
SING error
DOMAIN error
R6034
An application has made an attempt to load the C runtime library incorrectly.
Please contact the application's support team for more information.
R6033
- Attempt to use MSIL code from this assembly during native code initialization
This indicates a bug in your application. It is most likely the result of calling an MSIL-compiled (/clr) function from a native constructor or from DllMain.
R6032
- not enough space for locale information
R6031
- Attempt to initialize the CRT more than once.
This indicates a bug in your application.
R6030
- CRT not initialized
R6028
- unable to initialize heap
R6027
- not enough space for lowio initialization
R6026
- not enough space for stdio initialization
R6025
- pure virtual function call
R6024
- not enough space for _onexit/atexit table
R6019
- unable to open console device
R6018
- unexpected heap error
R6017
- unexpected multithread lock error
R6016
- not enough space for thread data

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
R6009
- not enough space for environment
R6008
- not enough space for arguments
R6002
- floating point support not loaded
Microsoft Visual C++ Runtime Library

...<program name unknown>Runtime Error!

Program: ccsUTF-8UTF-16LEUNICODE�����������������������������EEE���00�P��('8PW�700PP� (����`h`hhhxppwpp         (((((                  H����������������������          h((((                  H����������������������                                 H�����������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~�����������������������������������������������������������������������������������������������������������������������������HH:mm:ssdddd, MMMM dd, yyyyMM/dd/yyPMAMDecemberNovemberOctoberSeptemberAugustJulyJuneAprilMarchFebruaryJanuaryDecNovOctSepAugJulJunMayAprMarFebJanSaturdayFridayThursdayWednesdayTuesdayMondaySundaySatFriThuWedTueMonSunGetProcessWindowStationGetUserObjectInformationAGetLastActivePopupGetActiveWindowMessageBoxAUSER32.DLLSunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecCONOUT$Fatal error in launcher: %s
rbFailed to open executableUnable to find an appended archive.Unable to read from file#!Job information querying failedJob information setting failedstdin duplication failedstdout duplication failedstderr duplication failedUnable to create process using '%s'Failed to get exit code of processFailed to find shebangExpected to find terminator in shebang lineExpected to find '#' at start of shebang lineExpected to find '!' following '#' in shebang lineExpected to be able to allocate command line memory"%s" "%s" %sRSDSu�|NbmC��E/�uKc:\Users\Vinay\Projects\SimpleLauncher\dist\t64.pdbb

2020t
d4r�L]��������
4R���
�p`P
�t
d	4R�L]!3!��b�p`0L]"�"��t
dT4
R���4	RpL]%%��d
4	RpL]^&m&��4	RpL]k'u'��	

4	
RpL]c(�(���(d	T42pdT42p)4dZ���
�p`P4��		�0d
T	4RpdT4�p
td
T	4R�$d�4��p4�p

4
2pL]�>O?�4r�
�p`P4�8
�t
d	4R�L]eCD�20L]�GH-�

4
2pL]�H�HF��H	If�42pL]fJ�JF��J�Jf�dT�pB

4
Rp42p
d4r����pL]wO�P��t
4R�	 
 � t d 4 ���L]<THT�V
t	dT42�d	4R�L]�XY�
�td
R���L][Z�Z��"Z�Z��td42�td42�L]�\�\��  d T 4 r����p
T4R���p`d	4RpL]�ac��d	4Rp	�����
p`P
0
d4
R����pL]dm�m�t42�		20RP
d4
R����pL]rEr�d
4R��pL]�s t��td
T	42���d4
Rp
t
dT4
r�

4
2p
d4
R����pL]�~)�/4qf���
�p`P4� 
d4
R����pL]�����r0

4
2p4�p
`P-
Etd4C�
����P4�Xd4�p1
5#td43r��
��P4�8d4�p2
0R02P
t
d	42���L]~�?�6�	BL]�:�P�:�	BL]Y�]�]�
d4r���
�pL],���q�	bL]@�O���O�
T4r���p`b4R
�p
`L]�c���!
!4!�����p`PrP

d
�pL]k�����dT42pT42p
�	td42�L]�����
�t
4r���L]����2�d��R��4�PdT
4�ptdT4����b4�('EC
��	��p`0P4�p�td
T	42���4�

T
�pd4
rpd42p,�4�0

40
.p
T4r���p`-d2T140,��p4�PB0*����6Hdz������
8DPh������$0:FXhx��������		"	.	@	N	`	x	�	�	�	�	�	�	

6
P
`
v
�
�
�
�
�
�
�
@Nbp������ExitProcess~SetInformationJobObject�GetCurrentProcessWaitForSingleObjectmGenerateConsoleCtrlEvent�GetCommandLineAAssignProcessToJobObject�GetExitCodeProcess�CreateProcessA�QueryInformationJobObject�CreateJobObjectAkGetStdHandleGetLastError;SetConsoleCtrlHandlerGetModuleFileNameA�DuplicateHandleRCloseHandleKERNEL32.dll�HeapFree�HeapAlloc�EnterCriticalSection;LeaveCriticalSection�TerminateProcess�UnhandledExceptionFilter�SetUnhandledExceptionFilterIsDebuggerPresent&RtlVirtualUnwindRtlLookupFunctionEntryRtlCaptureContextxGetCPInfonGetACP>GetOEMCPIsValidCodePage�EncodePointer�DecodePointerZFlsGetValue[FlsSetValueYFlsFree�SetLastError�GetCurrentThreadIdXFlsAlloc�HeapSetInformation�HeapCreateGetModuleHandleW�SleepLGetProcAddress4WriteFile|SetHandleCount�GetFileTypeiGetStartupInfoA�DeleteCriticalSection%RtlUnwindExiMultiByteToWideChar�ReadFiletSetFilePointerfFreeEnvironmentStringsA�GetEnvironmentStringsgFreeEnvironmentStringsW WideCharToMultiByte�GetEnvironmentStringsW�QueryPerformanceCounter�GetTickCount�GetCurrentProcessId�GetSystemTimeAsFileTime�GetConsoleCP�GetConsoleMode-LCMapStringA/LCMapStringWmGetStringTypeApGetStringTypeW
GetLocaleInfoA>LoadLibraryA�InitializeCriticalSectionAndSpinCount�HeapReAlloc]FlushFileBuffers�CreateFileA�SetStdHandle)WriteConsoleA�GetConsoleOutputCP3WriteConsoleW�HeapSizeaSetEndOfFileQGetProcessHeap�6@�6@2��-�+�] �f��P�@@�@
		


!
5A
CPR
S
WYl
m pr	�
�
�	��
�)�
���
���                          abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ                          abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`@�`�y�!�������@~�����ڣ ��@����ڣ ��A��Ϣ���[��@~��QQ�^� _�j�2�����1~����@����C�@�@�@�@�@@#@��@�@��@�!@�@�@`@�����P@��@��@	X�@
��@��@X�@0�@�@��@��@h�@0�@�@��@��@ H�@!P�@"��@x��@y��@z��@�x�@�h�@���������
�
`�@`�@`�@`�@`�@`�@`�@`�@`�@`�@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@x�@t�@p�@l�@h�@d�@`�@\�@X�@T�@P�@L�@H�@@�@0�@$�@�@d�@�@�@�@��@��@��@��@��@��@��@��@��@	�!@.0#@�1@�1@�1@�1@�1@�1@�1@�1@�1@@#@.�p��PSTPDT�#@$@����������������������������;Zx����0Nm����:Yw����/MlKr�t������C�Dh�hj�l{�|�����������8�M��P����J�T6��8_�`��������F�Ho������C�D� �� ]!�`!}!��!�"4��"�$\��$$%x�$%�%0�%�&���&'�'�'��'#)�$)6)�8)�*��*,�,e,(�h,M7<�X7}8`��89l�P9p9�p9�9��9�9���9�:���:<�� <><�@<�<0�<�>���>t?�t?@8�@{B�|BtD�tD�D��DF�XG�G���G%H8�DHiH�lHIX� I�I@��I�I���I�J��K�K���K�L���L�L��L�M��M�M���M�M���MN��(N[N�\N�N@��NGO@�HO�P�QsQ��tQ�S ��S�S��ST��T	W4�WxW0xW�Wl��W�Xl��X4Y��4Y�Y��Y�Y���Y�Z���Z�[��[\0 \]�]L]@�L]�^,��^�aH��ac`�0cTc���c�d���dol��pl�m���mn�n�n���o�p��p�p���p^q�`q�r��rPs@�Psht8�ht�t���t�t��t�t�u�v0�v�wl�x�yd��y�z���zz|��||�|@��|�|@��|�}���}=~@�@~w��xֆ�؆	���_���`�ψ�Ј3���4�Q��T���8����8���ފ@����L�����c���d��0��<��%�\�(�������*���,���������8���8�ͧ�ЧY��\�1��4�����Z���\�a��d�{���A�D�g�4h������!�T<�q��t�h��h���������������������־ؾ
�������f��p��0 ���D��P��P���T �<��<�����������Q��l������ �� �s�t���P�a��d�����������@��D�HD��d�S��T���l�������<�t`������������������������-��-�F��F�_��f�������������������������6��6�J��P�q��q������������������2��2�K��R�k��(�p�������������0�eH�`�x�������	�b���d(�f���nh�(t�%�Й��x�h��h�H�Z�( @...GGGWWWiiiuuu����������������������������������̀�ww����ww||�����ww��������wwww��������ww��������f�wwwww|�����f�wwwwww����ff�wwwwww�����ff��wwwww���ffl����ww����ffffff��w����ffffffl�w������ffffff�w�����ffffff�|����������ff��������ffff�������ff��R\I���lffl���)����ff�ح���������2L���������18�������Ϥ"������A<��������ΣT��π�����U���������������������������؀����������������������?������������������?�?�?�?�?�?�������������( 444MMMSSSzzz������������������������������p�p�����{p{��f���fko�f�����_fffk�_�fff��[���f}��UUU�fL4�UUU_kJqO���_�~�'�[U_����U�����������wwwww{~����������������( @%%%+++000===AAAIIIMMMQQQVVVYYY]]]~dFgggjjjmmmrrruuu}}}�u?�z=�~;�gE�kC�oA�r@��:��I��b��pƏKУk(��,�1�?�5�<�\�C�K�Q�s�U�[�c�b�����������������������������������������ð����������������������������������������������������/Pp�
��� �=�1[�Qy�q�����������/"P0p=�L�Y�g�x���1��Q��q����������&/@PZpt���������1�Q�q��������/&PAp[�t��ϩ������1��Q��q����������/P"p0�>�M�[�i�y��1��Q��q����ұ������/Pp�	�
��� �>1�\Q�zq������������/Pp!�+�6�@�I�Z�1p�Q��q�������������/ P6pL�b�x�������1��Q��q�������������,/KPip�����������1��Q��q������������/-P?pR�c�v������1��Q��q�ϑ�ܱ������/Pp�!�&�,�>�X1�qQ��q������������_______CCBABADL*(%$""&GABJIIDDJC??AD_-(''%$GG#_DIJIIJIIIDIJDD_+)(''%GG _JMCEJ?ABAECA?BA_,+)('%%"!_IM@AJACDCIDI____.,++>________JMJJJJJJJJJF_..,+)('%$"! #GIMCEJJJI?J__...,+(('%$"! &_JM?AJJJJCJ__...,+)(''%$"  _IMJJJJJJJJ_K=...,++(''%$! _JMCDJJJJAJ_K_______L*%$"!_I_?AMNJJEJ_L'%$"_I_MMMMMMJJ__('%%_I_CEMIJJMEM_(''*_I_?BMDJEMDMF_)(-LI_MMMCMMMMM_________<____I_CEM1;MACDMEJM__I_?A_D1@IJJMJMM_FF_I__6_@/EMMMNMM_FF_I_C80EJDMJCJFF?:AA20?_M_MIEM______MIC4BC/
N______MMMMJIDAI_9/	HJJMMJMMMJ??BAI_A7503	IJMMCBCBA44CCI___BAO;6___C_MJIDIDMI_CI___O;
@__C_C?J?AJI_?A_DJJI@O_CM?;I?JI_________H9MAIJJIJI_CD_____JJI73C;IJIJI_?AMDJJDIMJIE5:JIJI__________MMIA:IJJJJJJJJJJJJJJJJMJ�����?������������������?������������������?�( 444MMMRRRYYY~eGuuu}}}�x>�iE�rC��E��~7�?�H�V�b�x����������������������������������������������������������������������������������/!P7pL�c�yϏ���1��Q��q�������������/Pp"�,�6�@�J�[1�qQ��q�������������/Pp�
��� �=�1[�Qy�q�����������/"P0p=�L�Y�g�x���1��Q��q����������&/@PZpt���������1�Q�q��������/&PAp[�t��ϩ������1��Q��q����������/P"p0�>�M�[�i�y��1��Q��q����ұ������/Pp�	�
��� �>1�\Q�zq������������/Pp!�+�6�@�I�Z�1p�Q��q�������������/ P6pL�b�x�������1��Q��q�������������,/KPip�����������1��Q��q������������/-P?pR�c�v������1��Q��q�ϑ�ܱ������/Pp�!�&�,�>�X1�qQ��q������������!%///* !*/"(%%'%/)
/!#''////+/+"*(/
/

!%(/
(

  (*/(///)
*/
	)*

	/"/////	/+///#
		+ !%//
+"*+'#+//+'!%*++$++!+!    !!!<(0` !!$&			&"

 ���W���������������������������������ܱ��Nj+<<</	&&&#&[[[?6666��׏��������������������������������������������Ҟ���BBB3"


mmm3����,����!!!4777&�����������������������������������������������������ʟ���}���}___E���OpppD���P,)+3���Z2226DDD(���,�����###5��������������������������������������������������������������������������������չ�������������5�������,�������������������������������������������������������������������������������������������������������������,������Ì222"��Є�����������������������������������������������������������������������������������������������������&&&2����   4888&�������������������������������������������������������������������������e��?��4��/��+���.���R�������ӎ����������$$$5��Ď���������������������������������������������������������������������D��@��;��7��3��/��*���&���"�����������������������������������������������������������������������������������������W��G��C��?��;��6��2��n������f��0�������������nj333"��ӄ��������������������������������������������������������������������O��K��G��B��>��:��5��p������i��$�����������!!!4888&���������������������������������������������������������������������S�N��J��F��B��=��9��5��0��,��(���������������%%%5��ǎ���������������������������������������������������������������������V�R�N��I��E���������������������������������������������������������������������������������������������������������ѹ���|J��q?��o@�����Z�U�Q�M��I��D��@��<��7��3��/��+���&���"���-����������������Ɍ444"��ք�������������������������������������������������̴��w<��u=��s>��q?�����]�Y�U�P��L��H��C��?��;��7��2��.��*���%���!����������������"""4888&���������������������������������������������������d��y<��w=��u=��s>�����a�\�X�T�P��K��G��C��>��:��6��1��-��)���%��� ���O������������Ñ%%%5��ʎ���������������������������������������������������A��{;��y<��w=��t>�����s�`�\�W�S�O��J��F��B��>��9��5��1��,��(���$���(����������������������������������������������������������������������9��|:��z;��x<��v=�������s�_�[�W�R�N��J��E��A��=��8��4��0��,��'���#�������������̌555"��ل���������������������������������������������������9��~9��|:��z;��x<���o�����������������������������������������m��8��3��/��+���'�����������"""4:::&������������������������������������������������������8���9��~:��|;��z;��w<��u=��s>��q?��o@��mA��kB��iC��gC�dD��uZ������;��7��3��.��*�������������Ǒ%%%5��̎���������������������������������������������������È>���8���9��}:��{;��y<��w<��u=��s>��q?��o@��mA��jB��hC��fD�~dE��uZ�����?��:��6��2��5�����������������������������������������������������������������������������Оa���7���8��9��}:��{;��y<��w=��u>��r>��p?��n@��lA��jB��hC��fD�}dE�����B��>��:��5��^������������ό555"��܄����������������������������������������������������������ѳ�„7���7���8��9��}:��{;��x<��v=��t>��r?��p@��n@��lA��jB��gC��eD�����F��A��=��9������������"""4;;;&�����������������������������������������������������������������ŌC���8���9��~9��|:��z;��x<��v=��t>��r?��p@��mA��kA��iB��gC�����I��E��L��������������ɑQQQJnnn����������~~~�������������������������������������������������������������������������������������������Į��q?��o@��mA��kB��iC�������������������������HHH�"""���������������vvv������������������������������������������������������������������9��~:��{;��y<��w<��u=��s>��q?��o@��mA��kB�������������:::�'''�___���������sss�ttt��������������������������������������������������������������8�Ϧu�����ǣv��y<��w=��u=��s>��p?��n@��lA��������888T����---6fffnddd�%%%�"""�����OOO�SSS������������������������������������������������������������ċD�ҧu�����ʤv��{;��y<��v=��t>��r?��p?��xM�����<<<�MMM�������̑&&&5����;;;�<<<�xxx�QQQ�;;;�KKK����������������������������������������������������������8���8��~9��|:��z;��x<��v=��t>��r?�̷������999�����������������������VVV�###�)))�444��������������������������������������������������������������������ѳ�͝b���@��~9��|:��z;��}C���g��˶����Ӎ���������󑑑�����ZZZ�lll�;;;�!!!�"""�)))�___���������������������������������������������������������������������������������������&&&2����:::�ppp�{{{�___�WWW�WWW�:::�!!!�"""�***�www�������������������������������������������������������������������"""4888&���,������̑999����Ԗ���JJJ�|||�lll�:::�"""�BBB�XXX�|||��������������������������������������������������������������������$$$6�������,��������������������������������uuu�KKK�CCC�@@@�...�www����������������������������������������������������������������������������������*������Ҍ666"������������������������KKK�aaa�LLL�WWW��������������������������������������������������������������@��������$����"""4;;;&���������������������nnn�fff�!!!�$$$�999������������������������������������������������������������444]ttt|������ȇ������ɑ&&&5��Ў������������������������vvv�mmm�VVV�{{{�OOO����������������������������������������������������������������ڥ�����������������������������������������������aaa�CCC�����ppp�������������������������������������������������������������������������ό555"��ބ����������������������������������|||�MMM�����fff���������������������������������������������������������������"""4;;;&�������������������������������������������\\\�����������������������������������������������������������������Ǒ%%%5��Ύ�����������������������������������������������������������������������������������������������ݧ�����������������������������������������������������������������������������������������������������������������ܦ������͌555"��ۄ�����������������������������������������������������������������������������������ۥ����"""4:::&������������������������������������������������������������������������������������ڤ������Ñ%%%5��ˎ�����������������������������������������������������������������������ܤ��������������������������������������������������������������������������������������������������ׇ
������ww���?ww�?�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�ww�ww�ww�ww�ww�ww�ww�ww�ww�ww�ww�ww�ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�ww��ww��ww��ww��ww��ww��ww�?�ww��ww���ww���ww( @ ����������������������������������!!!0\\\JeeeQ666D555A0$
�������v�H��<��6��0��2��\�������7���q��������������������ڴ���vvvj&&&D1"����g�L��F��@��;��5������?��������������������������������������������������к����V�Q�K��E��?��9������(�����������a���V�������������������������������������[�U�P��J��D��>��8��2��-���������uuun{{{j���������������������������������������`�Z�T�O������������������������������������������������������������������������V��o@��lA�����b�_�Y�S�M��G��B��<��6��0��+���%���<���������������a���V�����������������������m��t>��q?��n@�����b�b�^�X�R�L��F��A��;��5��/��)���$���Y����������wwwn}}}j����������������������~C��v=��s>��p?�����b�b�a�]�W�Q�K��E��@��:��4��.��(���+���������������������������������������{;��x<��v=��s>�����b�b�a�[�V�P��J��D��?��9��3��-��'��������������a���V����������������������~:��{;��x<��u=���p���������������������������������r��=��7��2��,����������yyynj�����������������������9��}:��z;��w<��u>��r?��o@��lA��iB��fD�}dE�|cE�|cE���i���B��<��6��1��������������������������������������?��9��}:��z;��w=��t>��q?��n@��kA��iC��fD�}cE�|cE�}dF�����G��A��;��=�������������a���V���������������������ңi���8��9��|:��y<��v=��s>��q?��n@��kB��hC��eD�|cE�|cE�����L��F��@��m����������zzzn���j�������������������������ʓP���8��~9��{;��y<��v=��s>��p?��mA��jB��gC�eD�|cE�����P��J��\��������������������������������������������������������������������������������¯��mA��jB��gC�~dE��������������������������a���V��������������������������������������}:��z;��x<��u=��r?��o@��lA��iB��fD���������|||n���m���������������������������������������9��������w=��t>��q?��n@��lA��iC�������������JJJ��������������������������������������������őP��������y<��v=��t>��q?��n@��~Y������������VVV�???�www�����iii�����������������������������������Ρk���A��|;��y<��v=��yF���p��������>>>3@@@y����~~~obbb�000�kkk�@@@������������������������������������������������������������������---U��������������<<<�&&&�[[[�������������������������������������������������������6���uuu�sss�WWW�III�$$$�&&&�qqq�����������������������������������lllg|||s���4����bbb�hhhƑ�������UUU�000�QQQ�}}}��������������������������������---{bbb�����(����������������������iii�LLL�BBB������������������������������������������������������a���V����������������ggg�+++�NNN�������������������������������������������|||n���j����������������]]]�ttt�kkk�������������������������������������������������������������������rrr�www���������������������������Ӧ�������a���V���������������������������������������������������Ӧ����zzzn���j�������������������������������������������Ӧ�����������������������������������������������������������ˉ��?������������������?�?�?���������������?�(  ������C�������������������﫫�o���������I�����������������������������������������ਨ������������S��=��?���������������������������������_�Q�F����4���������������������������������a�Z��������������������������������������м���oE�����c�a�X�M��B��7��0��������������������~I��q?�����c�`�V�K��@��5��8��������������������z;��u=���q�����������������v�>��3����������������������E��y<��t>��n@��iB�~dE�}dF�������G��H������YYY�uuu����������ġ���=��x<��s>��mA��hC�}dE�}eG�����S���������444�|||����������������������������gC�}cE�������������������������MMM������������������~>�����q?��kA��iG������������������RRR��������������¢���G��u=��xK�ʺ��������������������������������������������������������������������������������������������������������������������������������������������~�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A  �(  �h00 �%   � h<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPAD�������Ȣ��0�8�`��أ࣐����8�X�x���ث���� �(�8�H�X�h�x���������Ȭج����(�8�H�X�h�x������� �`�h�p�x�������������������ȡСء������� �(�0�8�@�H�P�X�`�h�p�x�������������������ȢТآ������(�@�H�P�X�`�h�p�x�������P�X�site-packages/pip/_vendor/distlib/w64.exe000064400000263000151733463550014302 0ustar00MZ����@���	�!�L�!This program cannot be run in DOS mode.

$p���4���4���4���g�5���=�u����=�r�X���=�d�=���=�b�7���4���U���=�x�5���=�e�5���=�`�5���Rich4���PEd�1�R�"	��4*@�fv@��(P�P@`	����.textV�� `.rdata�+�,�@@.data�6�@�.pdata`	@
@@.rsrc�PPR@@.reloc��b@BL��I�SM�CM�K SWH��HH���H3�H��$03�;���L�ʺI�CD�B�H�L$0H�D$ �}3H�
V���H��H��H;�u,H;�tJH�E�H���H��H;�uH��w��#L�6�H�T$0A�3��D$(�f�|$ �й�7��H��$0H3��FH��H_[�H�\$H�t$WH�� �r�3�H��L�ًօ�x5�Lc�I�����
L��H��t����A;ID�I��A+��y�H�t$8H��H�\$0H�� _�H��H�XH�hH�PVWATAUAVH��@L��L��H��H�H3�H�h���;�H�f����f���H�L$xD�E3��H�L$x��H�L$x������D��;�L�E3�����L�L$xD�uI��A�I���D�ML�&H��I�����H��H;�tH�L$ D�EH���iA+����H����H�L$xA���;�H��L�E3����UL�L$xL��I��H���BL��A�H��H���j�����H���H;�H�����o���H�L$ H��A��li+�H�����
+\$0H�L$x+\$,��H�E3�����L�L$xA�I��I�����H�Q�H;�H��������N�\#�M;�r�N�fA9t
M+�M;�s��I��H�L$x�L�\$@H��I�[0I�k@I��A^A]A\_^��H�\$H�t$WH��@H��H�����H�#�D$0�L��H��L��H�׉t$(�d$ ���؅�u�ͼ��D�H�t$X��H�\$PH��@_��H��(��u�
r��t3�Z��H��(�H�\$WH��pH��3�3�f�L��$�A��H��H��$��	H��H�D$ �2���t��$��u��3�H�!������$�0L��$�A���	H����H�������3�H�L$pD�Bh�gO������D$ph�ĻH��$�H�����H������F�����������H��$�H���s���H������������r�H��$�H���J���H�������H�
�����DŽ$��W�L�\$PL�\$HH�D$pE3�H�D$@H�d$8H�d$0�d$(E3�H��3��D$ ��H���L�Nj����D�\$`H�T$PH��D�����H�L$X���H�L$P���u�H�L$PH��$����H�c����4�����$��'����H�\$H�l$H�t$WATAUH��`H��H3�H��$P�!��8"t� ��"H����H���3�H;�u	L�%(��L�`����;�tI��A�$@:�u�L�-��3�I��D����=�"��uL�-�H��A�lH�L$@H�����P�����H;�H���H�����I���H��H��H��H;�s�8
t�8
t
H��H;�r��H��H;���H�|�������@�/���;�tH��@8.u�>#��H�������������;�t
H�Ɗ@:�u�>!��H������������;�t
H�Ɗ@:�u�3�I��I��I�ɍP�H��H��L�A�I���I��H��H��L�I���H��I�\H���H�S�H;�H��@�ŋ��B���L�d$0L�
n�L��H��H��L�l$(H�t$ �FH�������H��(H�1��
'�������������������������ff�H;
��uH��f����u��H���	�@SH�� �������H�
���H��H�� [H�����@SH�� ��H�
����H��tH���H��ַH��t���H�� [����@SH�� �������?���̹��̹���H;�s-H�\$WH�� H��H��H�H��t��H��H;�r�H�\$0H�� _��H�\$WH�� 3�H��H��H;�s��uH�H��t��H��H;�r�H�\$0H�� _����H�\$WH�� H�=Z��tH�
O�b��t��>�H�R�H�
#��~�����uZH�
7��H���H�=���H�H��t��H��H;�r�H�=�tH�
����tE3�3�A�P��3�H�\$0H�� _��H�\$H�t$D�D$WATAUAVAWH��@E���D����B��=>����*�D�%�����H�
P�KH��H�D$0H����H�
+�.H��H�D$ L��H�t$(L��H�D$8H��H�|$ H;�r�H9u��H;�r\H���H����H���H�
���H��H�
���L;�uL;�t L��H�\$(H��H�\$0L��H�D$8H��H�D$ �H��H�
ŷ���H��H�
ҷ����E��t
��)E��u&��A�L$�A������A�����H�\$pH�t$xH��@A_A^A]A\_���E3�3��j�����E3�A�P�\���3�3�D�B�O�����̺3�D���=����@SH�� ��H��H����#H���#H����H���#H���v#H���� H����H����H�
����zH���H�� [��L��M�K H��8I�C(I�C�I�c��/&H��8���@SH�� H���AH�����H�CH���H�H���H�KH�
��H;�t����`�u�2H�H�G�H9CtH�C����
9�u	�)H�CH�C���u����C��o�H��H�� [����@SH��@�=�Hc�uH�?��X���VH�L$ 3��&���H�D$ ��~L�D$ ����2D���H��@D�XA���|$8tH�D$0����A��H��@[���H��t7SH�� L��H�
l3����u�H��²����H�� [����@SH�� �d$@L�D$@�c3H��H��u9D$@t��H��t���L$@�H��H�� [����H�\$H�t$WH�� H��H���w|�H��HE�H�
�H��u �������g���H�
�L��3�a�H��H��u,9�tH���U!��t
��6��+�H����/!��3�H�\$0H�t$8H�� _����:�t
H�����u�:�uH���3����M��t
8t	H��I��u�I��H�H#��H�\$H�t$H�|$ ATH��@H�d$0E��H��H��3�H������u'��H�d$ E3�E3�3�3��3���3�H������u'�]�H�d$ E3�E3�3�3��r3��3�8����u$�+�H�d$ E3�E3�3�3��@3��g�#7H��H�D$PH��u��3��F�>u"���H�H�L$0�j8��3��L��E��H��H���4H��H���|3H��H�\$XH�t$`H�|$hH��@A\����@SH��0I��L��H��H��u%�sH�d$ �E3�E3�3�3ɉ����$A��H��I���~���H�H��t3���1�H��0[��H�\$ UVWATAUAVAWH��03�L��L��H�L$xM��M��H��H��$�H��L;�t)L;�t$L;�u9��H�\$ �E3�E3�3�3��3�H��$�H��0A_A^A]A\_^]�H��$�H;�t3�H��I��L;�v)H���tL��3�I���BH��H;�t�3�H��I��L;�w�I��I��GH��tD�O$�A�D�L$pH���g�GA����taLcwE��tS�/I;�DB�E��L;���L�H��H�L$x�AD)wA��L�t$xH+�HH��$�D�L$pL�H+��L�t$xE��I;�rhE��t 3�I;�vA��E��A���	H��D��I��D+��
D��I;�EG�A��H;�wuH����@E��L�t$xI�֋��Q?�������tw��H+��s���H���V6���tdH��$�H��t*A�D�O$H��I��H��D�L$pL�t$xH��$�H������H���t
L��3�I���CA�H�d$ �"�����O H+�3�H��I�������O��I���������H��H�XH�pH�xL�` AUH��0I��M��H��L��M��trM��tmH�\$`H��u4H���t
L��3��@�z�H�d$ E3�E3�3�3��3��1H���/�H�\$ L��M��H��I������H��H���0H���3�H�\$@H�t$HH�|$PL�d$XH��0A]����H��8L�L$ M��L��H���,���H��8����H��H�XH�hH�pH�x ATAUAVH��0H��H��u'��H!\$ E3�E3�3�3�������X��>�{Lc�}�c3�A��D�B�4D��xҋS��u
+s����;L���+k��t<I��I��H����I��Hk�X�D�tH�C�
�8
u��H��H;r�u������x��
��Z��������{u3��+{M��M��{I��A��K��Mk�XA�D�tz3�A��D�B�nC;�u#H�C��H��
�8
u��H��H;�r��c
sG�CE3���A���:C�������;�w�Ct	�c
��s�{$H��J��A�Dt��+��D5H�\$PH�l$XH�t$`H�|$hH��0A^A]A\��H�\$H�L$WH��0H��3�H������u%��H�d$ E3�E3�3�3������$-�H�������H���-��H�\$HH��0_�H�\$H�l$H�t$WH�� �AA����H�٨�u�����j���3�AA��u	������H���VCD�[E��y
A��D�[�A��tA��tA��
r�C$H���<D�Nj֋���A���@�ōE�H�\$0H�l$8H�t$@H�� _���H�\$H�t$H�L$WH��0A�؋�H��3�H������u%���H�d$ E3�E3�3�3���
���R��t/��t*��t%��H�d$ E3�E3�3�3��
�����+�D��H�������H���C,��H�\$HH�t$PH��0_��H�\$WH��0��H��H��u#�BH!\$ E3�E3�3�3���X
��F�A�t:�BH�ˋ��EH���[;���hD��y���H�K(H��t
���H�c(�c��H�\$@H��0_����H�\$H�L$WH��0H�ك�3�H������u$�
�H�d$ E3�E3�3�3�����&�A@t�a��*�H��������H���;+��H�\$HH��0_���H�\$H�t$WH��H�L$0�K���MZf9~��ubHc���H�5n��HƁ8PEt3ۉ�$��N�f9Ht3ۉ�$��8���w3ۉ�$��$3�9���É�$��3ۉ�$�H�5
�������'��u!9=|�u���������@��u!9=R�u�������[��F��;��y
�������H�
�HH����G��y
����D��y
�	��������t�����D@�|$l�T$pA�
DE�L��3�H�������D$ ��u�����������$�u������������L��$�I�[I�s I��_����H��(�IH��(������H�L$H��H�
�����L���L�\$XE3�H�T$`H�L$X諠H�D$PH�|$PtAH�D$8H�D$HH�D$0H�D$@H�D$(H���H�D$ L�L$PL�D$XH�T$`3��Y��"H��$�H�L�H��$�H��H���H�2�H���H��$�H����z�	��t�H���H�D$hH���H�D$p��������RI3���H�
���m��=��u
��*I����	�H��>�H�Ĉ���H�%e��3�H�%[����H�%Y��H��(�
f����t
�[��
T��H��(����H�\$WH�� H��H��H�a�H����Aǁ�ƁtCƁ�CH���H����
�?�H�����
�)���H���H��uH��H���H����T!����H�\$0H�� _���H�\$WH�� �̣�
~����f�H��H��uH�H���UHH��H��t3�
S�H��B�H�˅�t3����F�H�K�����3ۋ�&�H��H�\$0H�� _�@SH�� �q���H��H��u�H��H��H�� [�H���+H�\$WH�� H��H�I8H��t� �H�KHH��t��H�KXH��t��H�KhH��t��H�KpH��t���H�KxH��t���H���H��t���H���H���H;�t���
��H���H�L$0H��t��uH���H�L$0H;�t�y���
�b��X�H���H��t+H���7 H;=@�tH���H;�t�?u	H������H����H�\$8H�� _����@SH�� �I�����t`H�
�������������tH����mFH��H��t1�
k�H��Z���t3�H�������^�H�K��������3�H�� [����H�\$H�|$L�l$ AVH��0L�5$���3�I��;t��H����r�����wK���|��dK��u
�=���a�����H�=��A�L���H��I���J��tH�d$ E3�E3�3�3��H�u�A�3��j��Ϡ��u1L�T�H�
N����cJ��tH�d$ E3�E3�3�3���H�
$��IH��H��<vFH�
��IH���L���H�L8�A�H+��pH��tH�d$ E3�E3�3�3��oL���I��H���G��tH�d$ E3�E3�3�3��DLc�I��H��M�O�D��G��tH�d$ E3�E3�3�3��H�>�A� H���hE�E�����H��H��t2H���t,Hc�H�I�L��HI�T�H�d$ L�L$HL��H��A�H�\$@H�|$PL�l$XH��0A^����H��(��I��t��wI��u�=��u����������H��(��H�\$H�t$H�|$ATH�� L�%(�3�3�I�܃{u%Hcƺ���H��H���H��H���
��t-H�/�H����H;�|øH�\$0H�t$8H�|$@H�� A\�Hc�H�I�$�3�����H�\$H�l$H�t$WH�� H���H�-��H��H�7H��t�tH��$�H���L�H�'H��H;�|�H�H��t�{u���H��H;�|�H�\$0H�l$8H�t$@H�� _��Hc�H�*�H�H��H�%̞H�\$H�t$H�|$AUH�� HcپH�=O�u�h����N�8��������H��H�L�-��I�|�t���{�(��AH��H��u��3��Z�
�f�I�|�u/��H���h��uH���P���3��I�\��	H���2��H�
�������H�\$0H�t$8H�|$@H�� A]�H�\$WH�� Hc�H�= �H�H�<�u�����u�H��H��H�\$0H�� _H�%��H�
���@SH����d$pH�L$t3�A���0L�\$pH��$H��$L�\$HH�D$P���H��$H�T$@H��E3���H��t;H�d$8H�T$@H�L$`H�L$0H�L$XL��H�L$(H��$L��H�L$ 3��і� H��$�H��$H��$�H��$�H��$��D$p��D$tH��$��E�3ɋ�3�H�L$H� ���u��u�H��?�R���H���H���[����H�\$H�l$H�t$WH��0H��H�
R�A��I��H�����H��tL�T$`D��L��H��H��L�T$ ���%��k?L�\$`D��L��H��H��L�\$ �h���H�\$@H�l$HH�t$PH��0_����L�
q�3�I��D�@;
t+��IЃ�-r�A�w�
Á�D������AF��H�A�D���H��(����H��u	H����H��H��(�H��(���H��u	H�g��H��H��(�@SH�� �����H��u	H�C��H����v���L�+�H��tL�P���;���A�H�� [���@SH�� ��J��>H��H���>���H�KH�<H��u�C�H�#3�H�� [���H�\$H�t$H�|$ATAUAVH�� L���'��H�
��L��H�
����H��I;���H��I+�L�oI����I���DH��I;�sT�H;�HB�H�H;�rI���>3�H;�u�3�H�V H;�rFI���w>H;�t9H��H��H���^�H�k�I���O�H�H�K�C�H�H�I���3��l�H��H�\$@H�t$HH�|$PH�� A^A]A\����H��(���H������H��(��H�\$WH�� H��H�=��H�H��t��H��H;�r�H�\$0H�� _�H�\$WH�� H�˰H�=İ�H�H��t��H��H;�r�H�\$0H�� _�H�\$WH�� H�3��
H��j�H�H��H��u�H�\$0H�� _���������������H���MZf9t3��HcH<H�3��9PEu�f9Q�����LcA<E3�L��L�A�@E�XJ�LE��t�QL;�r
�A�L;�rA��H��(E;�r�3��H�������������H��(L��L�
"��I���j�����t"M+�I��I�����H��t�@$���Ѓ��3�H��(����H��H�XH�hH�p H�PWATAUAVAWH��@M�yM�!I�q8M+�AfM��H��L����3�H�H�L�@�9>�+H�^�C�L;����C�L;����{���;t�H�L$0H��I�Ѕ���~sA�}csm�u(H�=�tH�
�������t�I�����KA�H��I��I�F@�SMcMH�D$(I�F(I�M��H��H�D$ �G����H��;>sj�>���3��fI�y 3�I+�9.vTH�^�K�L;�r>�C�L;�s6H;�rH;�sA�E u/�;t	�H;�t#�H�T$xIDZI�D�C�M�A���H��;.r��L�\$@I�[0I�k@I�sHI��A_A^A]A\_����H��(�O�H���H��t����z@H��(��H��(H�
�����H�e�H��(���H�\$H�l$H�t$WH�� H���r�E3�H��I;���H���Lcu�H��9:tI��H��H��H�H;�r�I��H��H�H;�s9:tI��I;��CL�BM;��6I��u
L�ZA�@��%I��u���H���H����J����Lc���
��A�M��D;�}*I��H���A��I��M�\��
������D;�|ځ:�����uǃ���v�:��uǃ���b�:��uǃ���N�:��uǃ���:�:��uǃ���&�:��uǃ����:��u
ǃ������A�Љ���L�ZA��H������3�H�\$0H�l$8H�t$@H�� _���H�
��H�
��H�
��H�
������H�
}���H�\$H�t$WATAUAVAWH��@��3��|$p3��у��	������������������tM��t,��t_�T����H!t$ E3�E3�3�3��j�������L�%��H�
����|$p�L�%��H�
����|$p�L�%��H�
����|$p�u��H��H��u���kH���H��Lc��9YtH��I��H��H�H;�r�I��H��H�H;�s9Yt3�L�aM�,$�L�%,�H�
%���|$p�_�L��I��u3��M��u
A�M�-��̅�t3�����t��t��tL�|$8D�t$p�1L���L�|$8H�����uD���dž���D�t$p��u9�
���щL$0����;�}*Hc�H�H���H�d��‰T$0�
������I�$��t3��Z�;�u
�����A�����A��;�t
��t��uL���;�uD���3�L�\$@I�[8I�s@I��A_A^A]A\_����H�
��H�
��H�
��H��8�ڑD�؉D$ �=�u���E3�D�\$ A��H��8����H�
���@SH�� H��H�
�����H��tH��Ѕ�t��3�H�� [���H��H�XH�hH�p �HWH�� H��H����"�KHc�u����	�K ���4��@t
�j����"��3���t�{����H�C��H��K�C�{�����C�u/�WH��0H;�t�IH��`H;�u����I;�uH���yI�C���+H�S+kH�BH��C$��;�C~D�ŋ��H���W�� �K�?������t#���tH��H��H�T���H��Hk�XH��H�
<��A t3ҋ�D�B�)?H������H�K�D$0���H�T$0��D���G��;������D$0H�\$8H�l$@H�t$HH�� _����H�\$H�l$H�t$WH��`3�M��I��H��L��L;�u'��E3�E3�3�3�H�\$ �����L;�tH;�t�L��$�����A��L;�L��$�H�T$@G�H�T$0H�L$0I���D$HB�D$8A�Ӌ�H;�t7;�|%�l$8x	H�D$0��H�T$03�������t���9\$8�\.��ÍC�L�\$`I�[I�kI�s I��_��H��H�XH�hH�pH�x ATH��0I��I��H��H��M����M��uH��uH����3��H����H����I;�vP���L�FH�
�K�H�D$hL��H�D$(H�D$`H��H�D$ ������uo��8"�������H�
�KL��D� H�D$hL��H�D$(H�D$`H��H�D$ �4����D����uH���u�G�8"uC�=�D� �9��y8����u-�'��"����H�d$ E3�E3�3�3��/��H�\$@H�l$HH�t$PH�|$XH��0A\��H��8H�D$`H�D$(H�d$ ���H��8���H�\$H�l$H�t$WH�� H�YH��H��L��3���E3�H�}A�KA��D�]D�]D�]f�H�=~�H+���H��H��u�H����9�H��H��u�H�\$0H�l$8H�t$@H�� _���H�\$H�t$WH��H�s�H3�H��$pH��IH�T$P�������=3�H�T$p���H��;�r��D$V�D$p H�|$V�)�WD��D;�wA+�I��J�LpD�B� ��H�����uӋF�d$8L�D$p�D$0�FD�ˉD$(H��$p�3�H�D$ ��\�d$@�F�V�D$8H��$p�\$0H�D$(L�L$pD��3ɉ\$ �Y�d$@�F�V�D$8H��$p�\$0H�D$(L�L$pA�3ɉ\$ �jYL��$pH�N3�A�t�	��p�A�t�	 ��p���ƁH��H��I��H��u��?3�H�ND�B�A�@ ��w�	�B �A��w�	 �B��Ɓ��H��;�r�H��$pH3�����L��$�I�[I�s I��_��H�\$WH�� ��H������
r�tH���t	H����n�
����H���H�\$0H;7�tDH��t��uH��H�L$0H;�t���H�
�H���H���H�D$0�H�\$0�
�c�H��u�K �*��H��H�\$8H�� _�@SH��@��H�L$ 3�����%q����u%�b��,��|$8tSH�L$0�����E���u�8�����ԃ��uH�D$ ���@뻀|$8tH�D$0������H��@[�H�\$UVWATAUH��@H�E�H3�H�D$8H���I���3ۋ�;�u
H�������L�-	���H��I��A�98�'A�I�H��0��r����������K�;���H�T$ ���;���H�N3�A���~�^D9d$ ��H�D$&8\$&t-8Xt(�8�H;�w+�H�T7I�I+�u�H��8u�H�F���I�I+�u��N��t(��t��
tA;�t�����������FD�f��^H�~�ùf���9�����������H�N3�A��H�lmL���H�A�M�D�I��A8t18Yt,��A;�wL�L2A�A�A�AM�;�v�H��8u�I��M�M+�u��~��D�ft$��t��
tA;�u��������^H�VI�|���H��f�H��I+�u�H���|���3�H�L$8H3��	��H��$�H��@A]A\_^]��H��H�XH�pH�xL�` AUH��0��A����H������H��������D��;C��� �,*H��3�H;��|H���H��A� �q1�;H��A������D��;��$H�����uH���L�%�I;�t����L�%ۺH��������	�����
�X���C����C����C����׉T$ L�ô����}Hc��DKfA��H� �‰T$ ��׉T$ ��}HcʊDB����‰T$ ��|$ ��}Hcϊ�B����lj|$ ��H�C���uH�
6�I;�t���H�%���
���+���u&L�%ٹI;�tH���������3�D��A��H�\$@H�t$HH�|$PL�d$XH��0A]�H��(�=��u��������k�3�H��(�H�\$H�t$WH�� H��(H��H��tyH�
��H;�tmH��H��ta�8u\H�� H��t�9u����H��(�7XH��H��t�9u���H��(��WH�����H��(���H��0H��tG�8uBH��8H���q��H��H��H+��]��H��PH+��N��H��0�B��H��XH���H;�t��`u�UUH��X���H�{X�H���H9G�tH�H��t
�9u����H��tH�OH��t
�9u����H�� H��u�H��H�\$0H�t$8H�� _������H��H��t�H�� H��t�H��H��t�H��0H��t�H�AXA�H��H9P�tH�H��t�H�x�t
H�PH��t�H�� I��u�H��X�`����H����A���D	H��H��t�DH�� H��t�DH��H��t�DH��0H��t�DH�AXA�H�>�H9P�tH�H��t�D
H�x�t
H�PH��t�D
H�� I��u�H��X�D�`H������@SH�� H��H��tAH��t<L�L;�t/H�H�����M��tI���%���A�:uH�ȻL;�t���H���3�H�� [��@SH�� ���H�؋���
~�tH���t���H����+�����H���H�ü�V���H�ع��H��u�K �t��H��H�� [����H�l$H�t$WH��`Hc���H�L$@I���S��D�_A��wH�D$@H��@�y���H�T$@��@����:���t@��$�@��$�Ƅ$�D�J�@��$�Ƅ$�D��H�L$@�T$8L��$��A�D$0�AH�L$@�D$(H�D$pH�D$ �Q��u8D$XtH�D$P����3���D$p#ŀ|$XtH�L$P����L�\$`I�kI�s I��_���̉L$H��(E3��3���H���H��t#L�D$0A�3�H���D$0�j��H��(�H�\$WH��0I��H��H��t23�H�B�H��H;�s$�X�H�d$ E3�E3�3�3���m�3��]H���H��HD�3�H���wH�
b��PL��H��u-�=R�tH������u�H��t���H��t�H�\$@H��0_��H����@SH�� ������u��;�L�HcȺ�i��"H�=�H��u$�PH�ˉL���"H� �H��u��x3�H�K�H�H��0H��H��t	H�����E3�H�B�E�HI��L���I��H����I��Hk�XL�I���tI���tM��u�����I��H��0I��u�3�H�� [���H��(�{�=��t�UH�
v�H��(����@SH�� H��H�
��H;�r:H� �H;�w.H��H��������*H+�H��H��H��H��?�L�0��k�
H�K0�~H�� [��@SH�� ��H��}�����k�
H�J0��}H�� [����H��(H��H;�r7H���H;�w+�qH+�H��������*H��H��H��H��?�L����
H��0�{}H��(���H��(��}�r���z���
H�J0�R}H��(��H�\$H�l$VWATAUAWH��0�-<�I��E3�E3�E3ۀ: E�yE��H��L��uI߀; t��;at?�;rt3�;wt'�V�H�d$ E3�E3�3�3���k�3��9��3�A���	��I�A�׊����A�������ȃ�S~to�� ����tLA+�tB��t+��
t���u���E����E�׃�����@��@����@�E���w@��uq�������jE��u]E�׃� �]��TtJ��t:A+�t'��t������A��u3���5E��u(E�����'E��uE�����A��u�����s3����Iߊ������E�����I߀; t�H�
6�A�H���_�������H���I߀; t��;=�n���I߀; t�H���A�H����]��u
H�����MH��A�H����]��u
H�����*H�ԄA�H���]������H�����I߀; t��;���H�L$hE��D��I���D$ ��H[�����D=m�!F�D$hH�&H�fH�f(�F�nH��H�\$`H�l$pH��0A_A]A\_^�H�\$H�t$WH��03ۍK����3��|$ ;=����Hc�H�^�H�<�tkH��@�uV�`rO�G���w�O�Z������H�'�H�������L��I��@�tH�Ћ��}����H����lj|$ �x���Hc��X�'H�
��H��H�
��H�<�tXH��H��0�������uH�
��H�����L���I�$��$H���H��H��0�uyL�v�I���cH��t�c��cH�cH�#H�c(�K���N��H��H�\$@H�t$HH��0_����������������������ff�H���M3�M3�H�d$ L�D$(��rH����������fDH�L$H�T$D�D$I� ��������f��������f�����H�\$H�t$WH��0H��H��u$����H!|$ E3�E3�3�3�������A����@���t�� �A�����A�u�	1�H�AH�H����	D�G$H�W���M�G����������G�u_H���	���t<H���	���t/H���	H��H�5��Hc�H���o	D��A��Mk�XL��L���A�C$�<�u�o
�$u�Gt�g
r�G$H��O�H��H���������	G�g��H�\$@H�t$HH��0_���H�T$�L$SUVWATAUAVAWH��XA�����Hc�A��D�d$4�\$8A;�u���3��8�_���	�3�;���;����H��L��L�
����I����K���`$Hk�X�D1��������v�%���8�������;������H;�t�D�|18A�E�A�A�σ�t��u��Шt���L���d��Шt���A;�AB؋��L��H;�u���������=��$�3�D�B�x$L�
����L��K���`$L�\0@K���`$I��A�
�D0H���L0	A:���;���A�MK���`$A��A�I�UA�h�D�D0	D:�tbK���`$�L09A:�tQ;�tM�
K���`$A�H��A�h�D�D09A��u.K���`$�L0:A:�t;�t�
K���`$H��A�h�A�D�D0:K���`$L�L$0D��H�1H�|$ �ju;���HcT$0;�����H;���L������K���`$�D0��yA����;�tA�}
u�L0��d0�Hc�I��M��I�H�D$@L;��:�
A�$<�
@:�t
�H��I����H�D$@H��L;�sI�D$�8
u	I���L���K���`$L�L$0H��$�H�1A�I��H�|$ �{t;�u
�1s;�u{9|$0tuL�����K���`$�D0Ht"��$�
t'@�+K���`$��$��D1	�GI;�u��$�
u�
�3��$�A�H���%"��$�
L�N���t�L�C���@�+H��L;d$@����K���`$�D0@u�L0�	A�$�H�Ë�A+�A����;���A�I+��uI��A�����I;�rI+�A��B8�`t��B��`;�u�]���*A�����;�uHc�H��^K���`$�D0Ht;I߃��L0	|�K���`$I߈D19��u�K���`$I߈D1:Hc�H+����$���E��Hc�� �D$8L��$�A+���D��M�ʼnD$(3ҹ�L�|$ ��r��;�u�aq������A����D�d$4;�H�۠��J���`$@���|0H�;׺
tfA9Uu�L0��d0�Hc�I��M��N�<(M;��{�
A�$f���Ef;�tf�H��I���%I�G�L;�sI�D$f9u	I����L���K���`$L�L$0H��$�H�1A�I��H�|$ ��q;�u�up;���9|$0��L��K���`$�D0HtF�
f9�$�tKf�+��$�K���`$�D1	��$�K���`$�D19K���`$�T0:�WI;�u�
f9�$�uf��>��$�H�����D�B�7�
L�c���f9�$�t��
L�K���f�+H��M;�������"K���`$�D0@u�L0�A�$f�H����A+�D�d$4L��$�M;�tI���p���A���DD�A���i�Mo��u����	����������muD��뮋��������3��)�v���8�O���	E3�E3�3�3�H�|$ �e����H��XA_A^A]A\_^][��H�\$H�t$�L$WATAUAVAWH��0A��L��Hc����u���3ۉ�����	���3�;���;=_���L��L��I��L�=d�A��Mk�XK��B�L ��u.��������	H�\$ E3�E3�3�3���������A�������;�u+�z����S���H�\$ E3�E3�3�3��i�����n����T�K��B�D tD��I�Ջ��s�������
���	���������3U���)�
��������	H�\$ E3�E3�3�3������H�\$hH�t$pH��0A_A^A]A\_���H��8H��u%���H�d$ E3�E3�3�3���������AH��8���H�\$H�t$WH��0I��I��H��M��u3��fH��u%�I���H�d$ E3�E3�3�3ɉ�]�����<M��tH;�r
L��H���t�L��3��HH��t�H;�s����"뮸H�\$@H�t$HH��0_��������������������ff�H��I��rS��I�I��I��@rH�ك�tL+�H�H�M��I��?I��u9M��I��I��tfff��H�H��I��u�M��t
�H��I��u��@fff�ff�I��s0H�H�QH�QH��@H�Q�H�Q�I��H�Q�H�Q�H�Q�u��fDH�H�QH�QH��@H�Q�H�Q�I��H�Q�H�Q�H�Q�u��$�T�����H��H�XH�pH�xL�` AUAVAWH��H�L$ ��k��XD�b�I���L��E3�I;�u���{H�-�A�̉
�HL;�sCE�{I��A�C	
E�{E�{8A�C9
A�C:
E�{PE�{LI��XH��HL;�rË
��fD9|$b�IH�D$hI;��;L�hHc0I��9L�;���L�5���XI���;L��I;�tiI���Y�AĉP�I��L;�sAE�{I��A�C	
E�{A�c8�A�C9
A�C:
E�{PE�{LI��XI��HL;�rŋ�H��;�|�����L�5�A��A;�~~H�>�tkH�>�teA�Et^A�EuH��4kA;�tILc�I��H��A��Mk�XM$�H�I�$A�EA�D$I�L$������A;�tA�D$�������I��H��;�|�E��I��H��Hk�XHm�H�;�tH�;�t�K���C�A�D$���Ƀ�������E;�D�:iH��H���tJI;�tEH��{jA;�t7H�3����u�K@�	��u�KH�K�����A;�t�C����.�K@H�����A��H��H���Q����
���j3����L��$�I�[ I�s(I�{0M�c8I��A_A^A]����H�\$H�t$WH�� Hc�A�������NH���u����	���RD��E3���H���i�����u�Jh�3���t	��������H��H��H�$�H����H��Hk�X�d���H�\$0H�t$8H�� _���H�\$H�t$�L$WATAUAVAWH��0E��D��Hcك��u�>��3��8����	����3�;���;����H��L��I��L�=����Hk�XK���L0��u+�����8����	H�|$ E3�E3�3�3��������m���1N�K���D0tE��A�Ջ��������w���	����8�����N���)�w���8�P���	H�|$ E3�E3�3�3��f����H�\$hH�t$pH��0A_A^A]A\_����H�\$H�t$WH�� �A3�H��$<u?�At6�9+y��~-�8���H�SD�Nj��;�u�C��y��C��K ��H�K�c��H�t$8H�H�\$0H�� _����@SH�� H��H��u�5�,�j�����t����csH���������O����3�H�� [��H�t$H�|$L�d$AUAVAWH��0D��E3�3��N�����3��|$ A��;=����Lc�H���J�<�tjJ��B�t`�����H���J��A�t5A��u�9���A;�t%A��D�d$$�E��u�At����A;�AD��t$(H�T�J�������lj|$ �n�����@��A��AD��H�t$PH�|$XL�d$`H��0A_A^A]ù������H�\$WH�� Hc����TKH���tYH�����u	@���u
;�u�@`t�%K�H���KH;�t���KH���d��u
��d���3ۋ��@JL��H��H��A��H�s�H��Mk�XB�D��t���������3�H�\$0H�� _�H�\$H�t$ �L$WATAUH��0Hcك��u���3��8�k���	����3�;���;���H��L��I��L�-���Hk�XK�D��L0��u+�;���8����	H�|$ E3�E3�3�3��*�����a���J�K�D��D0t�������������	�����K���)�����8����	H�|$ E3�E3�3�3�������H�\$`H�t$hH��0A]A\_�@SH�� �A�H��t"�AtH�I�*����c����3�H�H�C�CH�� [��H��(H��8csm�u+�xu%�@ = �t=!�t="�t=@�u����3�H��(����H��(H�
�����c3�H��(�H�\$WH�� 3�9=��u�G��H���H�txH��HD؀; w	�;t3��t)�;"u	3���������M��tH��H����< w	H�Ê��u�H��H�\$0H�� _����H�\$H�l$H�t$WH��0�=U�u����H��3�H��u����<=t��H���
H�\���u�G�Hc��sH��H���H��t�H����;teH����
�;=�ptCHc�H���8H�H��trL��H��H���F��tH�d$ E3�E3�3�3����H��Hc�H؀;u�H�W�H���O���H�%G�H�'�Y�3�H�\$@H�l$HH�t$PH��0_�H�
ۥ����H�%Υ�����H��H�XH�hH�pH�x ATAUAVH�� L�l$`M��I��A�eL��H��A�H��tL�I��3�;"u3���@�"��H�Ë��9A�EH��t��H���3H�Ë���K��tA�EH��t��H��H��@��t��u�@�� t@��	u�H��t	�G��H��3��;���; t�;	uH����;��M��tI�<$I��A��3��H����;\t��;"u6��u��tH�C�8"uH���3�3҅����������H��t�\H��A�E��u���tO��u< tG<	tC��t7���JH��t��t�H�ÈH��A�E��H�����tH��A�EA�EH���Y���H��t�H��A�E����M��tI�$$A�H�\$@H�l$HH�t$PH�|$XH�� A^A]A\��H�\$H�t$ WH��0�=Z�u����H�=��A�3�H������_H�
�H�=ΣH��t�;uH��H�D$HL�L$@E3�3�H��H�D$ ���Hct$@H��������H;�s\HcL$HH���sQH��H;�rHH����H��H��t8L��H�D$HL�L$@H��H��H�D$ �g���D�\$@H�=�A��3�D�����H�\$PH�t$XH��0_���H��H�XH�hH�pH�x ATH��@�
��E3�I��A�t$A;�u2�{_H��I;�t����!��]�
����xDΉ
�����I;�u�;_H��I;�u3��H��fD9#tH�fD9'u�H�fD9'u�L�d$8L�d$0H+�H�L��3�D�O3�D�d$(L�d$ ��^Hc�A;�tAH���H��I;�t1L�d$8L�d$0D�OL��3�3ɉl$(H�D$ ��^A;�uH���-���I��H���^H���s;�t	A;��L����a^H��I;��:���D8 tH��D8 u�H��D8 u�+��Hc�H���	H��I;�uH��^����L��H��H���MH���]H��H�\$PH�l$XH�t$`H�|$hH��@A\���H�\$WH�� H��H�d$0H�2��-�+H;�tH��H����vH�L$0��]H�\$0��]D��I3��\D��I3��]H�L$8D��I3��]L�\$8L3�H�������L#�H�3��-�+L;�LD�L���I��L���H�\$@H�� _�̃%���H�\$H�l$H�t$WH�� 3�H���H���0���H��H��u(9B�v ���[D���D;*�A��G�;�u�H�l$8H�t$@H��H�\$0H�� _�H��H�XH�hH�pH�x ATH�� 3�H��H��A��E3�H��H������H��H��u*9Ǭv"��I[D���D;��A��AG�A;�u�H�l$8H�t$@H�|$HH��H�\$0H�� A\��H��H�XH�hH�pH�x ATH�� 3�H��H��A��H��H���FH��H��u/H��t*9A�v"���ZD���D;)�A��AG�A;�u�H�l$8H�t$@H�|$HH��H�\$0H�� A\����H�\$H�l$VWATAUAVH��@A��L��L���X���3�H��H9Ы��H�
+e�ZH��H����H�eH���YH���sH������H��dH��H����YH�����H��dH��H�h���YH���ƴ��H�[dH��H�Q���YH��觴��L��H�I�H��t!H�dH��dYH��耴��H���H���H��L��H;�tcL;�t^H���b���H�
�H���S���L��H��t?H��t:��H��t-H��$�A�L�D$0H�L$ A�Q�H��A�ԅ�t�D$8u���>H�
��H;�t2���H��t(��H��H��tH�
m�H;�t�۳��H��tH���H��H�
?��³��H��tD��M��I��H����3�H�\$pH�l$xH��@A^A]A\_^�@SH��0L��H��t
H��tM��u,D��|����H�d$ E3�E3�3�3ɉ萼����H��0[À9t	H��H��u�H��uA��A�I���H����tH��u�H��uA������"�3�����@SH��0M��M��uH��uH��u 3��?H��tH��tM��uD�	��M��u,D��Ӽ���H�d$ E3�E3�3�3ɉ�����H��0[�L��L��I���uA�I��A�I�„�t,I��u��$A�I��A�I�„�tI��tI��u�M��uE�
M���f���I���uD�D�A�@P���E����"�m��������������������ff�H��H��H�tf��H����t_�u�I��������~I��H�M��H��L�H��I3�I#�t�H�P���tQ��tGH����t9��t/H����t!��t����t
��u�H�D��H�D��H�D��H�D��H�D��H�D��H�D��H�D��@SH��0H��t
H��tM��u,D��[����H�d$ E3�E3�3�3ɉ�o�����H��0[�L��A�I��A�I����tH��u�H��u������"�3������H��8��x ��~
��u��1����
���#�׺��H�d$ E3�E3�3�3�������H��8�H��8H��u&覺��H�d$ E3�E3�3�3��軹��H���L��H�
å3��VH��8��̹����H���b�t
�
膳���}���H��t
��z����;�t_H��$��cUH�L$03�A���I�H��$�3�H�D$@H�D$0�D$0@H�D$ H��$�H�D$(��TH�L$ ��T�褟������������������������ff�L��H+���I��ra��t6��t�
I�ȈH����tf�
I��f�H����t
�
I���H��M��I��uQM��I��tH�
H�H��I��u�I��M��uI���@�
�H��I��u�I���fffffff�fff�ff�I�� sBH�
L�T
H�� H�A�L�Q�H�D
�L�T
�I��H�A�L�Q�u�I���q���fff�f�H��r�� 
D
@H�����u�H���@L�
L�T
L�	L�QL�L
L�T
L�IL�QL�L
 L�T
(H��@L�I�L�Q�L�L
�L�T
���L�I�L�Q�u�I��I���q����$���ffff�fff�fff�f�I�I��ra��t6��tH�Ɋ
I�Ȉ��tH��f�
I��f���t
H���
I���M��I��uPM��I��tH��H�
I��H�u�I��M��uI���H�Ɋ
I�Ȉu�I���fffffff�fff�ff�I�� sBH�D
�L�T
�H�� H�AL�QH�D
L�
I��H�AL�u�I���s���ffff�f�H���w�� H��
D
@��u�H���@L�L
�L�T
�L�I�L�Q�L�L
�L�T
�L�I�L�Q�L�L
�L�T
�H��@L�IL�QL�L
L�
��L�IL�u�I��I���q����$���@SH�� E�H��L��A��A�L��tA�@McP��L�Hc�L#�Ic�J�H�C�HHK�At�A���H�L�L3�I��H�� [�y����H��(M�A8H��I������H��(����H�\$WH�� Hc�A��H�T$8����6H���u����	H���W�T$8L�D$<D��H���Q�D$8���u�IP��t	���Ƶ����H��H��H�'�H����H��Hk�X�d�H�D$8H�\$0H�� _����H�\$H�t$�L$WATAUAVAWH��0E��L��Hcك��u�B���3��8�����	H����3�;���;����H��L��I��L�=����Hk�XK���L0��u,����8�´���	H�|$ E3�E3�3�3��س��H���q���36�K���D0tE��I�Ջ����H����x����	荴���8H�����6H���*�v����8�O����	H�|$ E3�E3�3�3��e���H��H�\$hH�t$pH��0A_A^A]A\_��H�\$ UVWATAUAVAW�0�IH+�H�T~H3�H��$ 3�3�E��L��Hcىl$@E��u3���H��u.���!8軳��H!|$ E3�E3�3�3���Ѳ�����L��L��H�<�I��A��J��L�t$PMk�XA�t8@�@�@��t@��u	A��Шt�A�D t
3ҋ�D�B�Z����������H�ܡJ��A�D����w���3�H�T$XH���H���9YJ��I���fO������t	@�����CO!|$LI�܉D$XE���wD�t$X�
@����H�T$P�E3���
H�-H�H�T�A��A�|Pt A�DL�L$]A��D$\A�dPH�T$\�I������t4I��H+�I�H����H�L$DA�H���;����vH���A�H��H�L$D�;����UH�d$8H�d$0�L$XH�D$\L�D$DA�3��D$(H��H�D$ �N���H�D$PH�d$ H�
g�H��L�L$LH�T$\I�D��,M���B��A+�|$@9l$L���
E����H�D$PH�d$ @�l$\H�
�L�L$LD�E�H��H�T$\I���L�����|$L|{�D$@���e@��t@��u�E3�f��
f�D$DA��H��@��t@��u6�L$D��7f;D$D����E��t��f�l$D��7f;D$Dux��D$@��A+�A;������\$LL�t$P�l$@�������z���e苰���	蠰��������L�t$P��J�L�A�DLJ�D�A�DP�\$L�K��떋\$L�H��J��A�D���3�I��@����E�����S
D�t$@H��$ 3ɋ�A+�A;�s&�EH��<
u�A��H��H��H���H��H���r�H!\$ H��$ D��D+�H�h�D�t$@L�t$PL�L$HH��$ J��I��#K��t5|$HH��$ H+�HcD$HH;������ź
A+�A;��N�������J�����@����E���"�
D�t$@H��$ 3ɋ�A+�A;�s1�EH��f��
uf�A��H��H��H��f�H��H���r�H!\$ H��$ D��D+�H���D�t$@L�t$PL�L$HH��$ J��I��<J���J���|$HH��$ H+�HcD$HH;������ź
A+�A;��?�������E���NA�
H�L$p3ҋ�A+�A;�s.�EH��f��
ufD�H��H��H��f�H��H���r�H�d$8H�d$0H�D$p+�L�D$p�D$(U
�����+�3��D��H��$ H�D$ �
JD�������3�H�D$PH�d$ Hc�H�� E��H�
`�H��L�L$HD+�I��*I��tt$HD;����=H��D;�������A�
A+�A;��������I�H!|$ L�L$HE��I���H��t�|$H3������G��������d����~���H�țJ��A�D@tA�<$�.������������ �H���+���H��$ H3��E���H��$�H��0A_A^A]A\_^]���H�\$H�t$�L$WATAUAVAWH��0E��L��Hcك��u説��3��8聬���	����3�;���;����H��L��I��L�=����Hk�XK���L0��u+�R����8�+����	H�|$ E3�E3�3�3��A������m���-�K���D0tE��I�Ջ������������	����8�����.���)����8輫���	H�|$ E3�E3�3�3��Ҫ����H�\$hH�t$pH��0A_A^A]A\_����@SH�� �̖H�ٹ�c�H�CH��t
�K�C$��KH�C �C$H�CH�C�cH�H�� [��H��8���u
�"����	�R��x.;
��s&Hc�H���H����H��Hk�XH���D��@�"���H�d$ E3�E3�3�3��	���3�H��8��@SH��@��H�L$ �J���H�D$ D��H��@B�Y%��|$8tH�L$0����H��@[����@SH��@��H�L$ 3�����H�D$ D��H��@B�Y%��|$8tH�L$0����H��@[��H�
�t3�H��H9
�����H�\$fD�L$ UVWH��`3�I��H��H��H;�uL;�vH;�t�)3��H;�t�	�I�����v$�ͩ���E3�E3�3�3ɉH�l$ ������oH��$�H�L$@�8���L�\$@A9k����$���f;�vLH;�tH;�v
L��3�H������_����*�T����@8l$XtH�L$P����H��$�H��`_^]�H;�tCH;�w<� ����"E3�E3�3�3ɉH�l$ �5���@8l$X�H���H�L$P�����7����H;�t�@8l$X���H�D$P��������H��$���$�A�KH�D$8H�l$0L��$�A�3҉|$(H�t$ ��D;�t9�$�����H;�t���C��z�����H;�tH;�v
L��3�H������?����"E3�E3�3�3ɉH�l$ �T���@8l$X�g���H�D$P�����V���H��8H�d$ ���H��8�@SH�� �B@I��tH�zuA��&�B�x
H��H�������������u	��H�� [�̅�~LH�\$H�l$H�t$WH�� I��I���@��L��H��@�������?�t���H�\$0H�l$8H�t$@H�� _����H�\$H�l$H�t$WH�� A�@@I��I���H��tI�xuA�7��~3�ML��H�������H�Ń?�u�����8*uL��H�ֱ?������H�\$0H�l$8H�t$@H�� _���H�\$UVWATAUAVAWH���H�qH3�H��$�3�H��H�L$hH��H�L$xI��M��D$`D��D$TD���D$H�D$X�D$P����E3�I;�uA�k���3�E3�E3�3�3��H�\$ ����8�$�tH��$��������A���C@L�
pp����H���f��H���A;�t(���t#Lc�L�
Gp��I��A��H��Mk�XM��`$�
L��L�
$p��A�@8u)A;�t���tHc�H�ƒ�H��Hk�XI��`$�B8�tA蟥��3�E3�E3�3�3��H�\$ 賤��8�$�tH��$�����A���KE3�I;�t�@�/A��D�T$@D�T$DA��L��$�A:��H��$�A�H��A;�H��$����E�<XwH��B�������A��Hc�H��Hc�H�B��	�����T$\���/�����A;����������@�������������������<@�Ń�d�~����A�@��C����E�.��G�%��Stm��X����Zt��a���c���HI�EI��I;�t/H�XI;�t&A���s��D$P+���D�T$P�H��s��A��0uA��I�]E;�A�ǹ���D�I��A���I;��D$PHD�sH����A��0uA��I��A��t,E�M�H��$�H�L$DM���W���E3�A;�t�D$X�A�E��D$D��$�H��$��M�D$p@�� A��@E;�H��$�A���-A��k��e���g~σ�i����n����o����pte��s�������u����x���'�S��fD9t	H��A;�u�H+�H��!I;�HD�rH���
��D8tH��A;�u�+ˉL$D�A�A����D$`A�E��y`Q�D$L0A�Q�D$M�SA�E��yDA��	�=I�}I�����E3�A;��l���A�� tf�7��7�D$X�lA��@A�
�T$HA��rA��s
M�EI���.I��A�� tA��@tM�E��E�E��A��@tMcE��E�E�A��@t
M;�}I��A��A��r
A��rE��E;�}A��A��E;�EO�D�t$`I��H��$�H���#ʉL$HA��A��A;�M;�t 3�I��Ic�H��L���B0��9~AƈH����H��$�A�����+�H��A��	�D$D�A;�t	�;0�H��D$D�0�u@��guAA��9E;�EO�A���~)A��]Hc����H��$�H��tH�؋��A��I�EH�
XpI��@��Hc�H��$��h���H�L$xD��H�L$0�L$pL�ƉL$(H��$�H��D�|$ ��A��3���tD;�uH�
p� ���H�T$xH���3�@��gu;�uH�
�o���H�T$xH��Ѐ;-uA��H��H�����E3҉D$DD9T$X�KA��@t1A��s�D$L-�A��t�D$L+��|$H�A��t�D$L ��|$H�t$TH�l$h+t$D+�A��uL�L$@L�ŋֱ ����L�L$@H�L$LL�ŋ�����A��tA��uL�L$@L�ŋֱ0����|$D3�9D$Ptu;�~qH��D�MH��$�H��$�A���H������E3�A;�u2��$�A;�t&L�D$hL�L$@H��$����E3�A;�u�H�l$h�#H�l$hA�ƉD$@�L�L$@L�ŋ�H���X���E3ҋD$@A;�|A��tL�L$@L�ŋֱ ���E3�H��$�I;�tH���=���E3�L��$�H��$��t$@�T$\L�
�h��A�@�/A:�����A;�t	�������D8�$�tH��$�������H��$�H3��x���H��$ H���A_A^A]A\_^]�@��It=@��ht.@��lt
@��wu�A��끀?lu
H��A���o���A���f���A�� �]����A��<6u�4uH��A���>���<3u�2uH��A���&���<d����<i����<o����<u����<x�����<X�����D�T$\H�T$x@��D�T$P�k�3�;�t!H�T$hL�D$@@������@�/H��@:��H�T$hL�D$@@����E3����@��*uE�}I��E;������E���~���C��@��D�|H��l���E���d���@��*uA�EI��A;‰D$T�I���A������D$T��@�ōDHЉD$T�)���@�� tA@��#t1@��+t"@��-t@��0����A�����A�����A�����A�����A������D�T$pD�T$XD�T$TD�T$HE��E��D�T$P������E3�E3�3�3�H�t$ �����@8�$��Z�����@UATAUAVAWH��`H�l$@H�]PH�uXH�}`H�fH3�H�ED�@��3�M��L�MD�ED��UH��D�n�D;�uOL��AE�ͺ3ɉ|$(H�|$ ��7;�tE��D�-����5D�߇��xDD�D�чL�]D�MpD;�~5A��I��A+�@88t
I�;�u��A��+�A+�A;�}
D�HD�Mp�D�ȉEpD;��\D;��SE;���D�����D;�uH�D�`���M��A��҉|$(H�|$ ��A��6Lc�D;��<H�����A���A�~[3�H�B�I��H��rLK�L?I;�w.H�AH;�wH��H�����/H+�H�|$@H���������x���H��H��tD�0H��H����D�MpL�E�A��D�|$(H�|$ ��53�;��K�U�L$(H�L$ �ME��L��W6E3�Hc�A;��!D�UA��
s;���A;��;����M�D$(H�ExE��L��A��H�D$ �6��A;�~`3�H�B�H��H��rQH�L6I;�w*H�AH;�wH��H�����.H+�H�\$@I;�t�����y���E3�H��I;�tD�0H��D�U�I��I;�tn�ME��L��A�҉t$(H�\$ �z53�;�t?���3�H�L$8D��L��H�L$0;�u�L$(H�L$ �
�D$(H�ExH�D$ A���4��H�K�D91u�g���H�O�D91u�Y�������H��L��D;�uH�D�pD�u�����uH��xA���$D���u3��L�}xL�E;��<3�L�Mp�Ћω\$(H�\$ �$H��H;�t�D�Mp�UL��A�Ή\$(H�\$ ��4Lc�D�MD;�u���D;�A���~bI��I���wYH��H��w4H�YH;�w
H�����H���H���N-H+�H�\$@H��t%��������H��H��tD�0H��D�MH��u3��Mc�3�H�����D�]D�Mp�U�MD�\$(L��H�\$ ��3�E��u3��.���L�ML�ÉD$(��A��L�|$ �#�}L��3�L;�D�H�K�D91u(��~���!���D�Mp�U�D$(A��L�|$ �b3��3�H;�tH���~��L;�t
M;�tI���~����H�MH3��!y��H�]PH�uXH�}`H�e A_A^A]A\]����H�\$H�t$WH��p��H��H�L$PI��A���}����$�D��$�H�L$PD�\$@�D$8��$��D$0H��$�L��H�D$(��$�D�Nj։D$ �O����|$htH�L$`����L�\$pI�[I�sI��_���D�L$ UATAUAVAWH��@H�l$0H�]@H�uHH�}PH�2`H3�H�ED�
h��3�M��D��L��wD;�u=L�MH��;D�Nj�.2;�t�=0��6�<0D�
!���xDD�D�
�D;��&D;��D;��C�uh;�uI�E�p�]xD�MXM��ҋΉ\$(��H�\$ �1Lc�D;��A���~hH�����L;�wYK�L$H��w5H�AH;�w
H�����H����w*H+�H�|$0H;��������}��H��H;�tD�(H���H��H;���M��3�H��M�����D�MXM�ƺ��D�d$(H�|$ �^0;�tL�M`D��H��A���0��H�O�D9)u�|�����D�epH��D;�uI�ED�`�uh;�uI�E�pA���Z ���u3��U;�t$L�MXM�ƋЋΉ\$(H�\$ � H��H;�t�L��H�E`D�MXM��A��A��H�D$ �Y0��H;�tH���{����H�MH3��v��H�]@H�uHH�}PH�eA_A^A]A\]���H�\$H�t$WH��`��H��H�L$@A��I���z����$�D��$�H�L$@D�\$8�D$0��$��D$(H��$�D��L�Nj�H�D$ �.����|$XtH�L$P����H�\$pH�t$xH��`_����H����SH�� H��H�I�z��H�K�z��H�K�z��H�K �z��H�K(�z��H�K0�z��H��}z��H�K@�tz��H�KH�kz��H�KP�bz��H�KX�Yz��H�K`�Pz��H�Kh�Gz��H�K8�>z��H�Kp�5z��H�Kx�,z��H���� z��H����z��H����z��H����y��H�����y��H�����y��H�����y��H�����y��H����y��H����y��H����y��H����y��H����y��H����y��H����xy��H����ly��H���`y��H���Ty��H���Hy��H���<y��H�� �0y��H��(�$y��H��0�y��H��8�y��H��@�y��H��H��x��H��P��x��H�� [���H��tBSH�� H��H�	H;
�nt��x��H�KH;
�nt�x��H�KH;
�nt�x��H�� [�H����SH�� H��H�IH;
|nt�ux��H�K H;
rnt�cx��H�K(H;
hnt�Qx��H�K0H;
^nt�?x��H�K8H;
Tnt�-x��H�K@H;
Jnt�x��H�KHH;
@nt�	x��H�� [������������������ff�H+�L���t�B�	:�uVH����tWH��u�I��J�	f��f���w�H�J�	H;�u�I��������~L�H��H��I3�I��t��H�H���3��fff���t'��t#H����t��tH����t��t����t��u�3��H�H���������ff�H+�I��r"��tf��:
u,H��I���u�M��I��uM��t�:
uH��I��u�H3�����ÐI��t7H�H;
u[H�AH;D
uLH�AH;D
u=H�AH;D
u.H�� I��u�I��M��I��t�H�H;
uH��I��u�I���H��H��H��H�H�H�H;��������������������ff�M��tuH+�L��I����t�B�	H��:�uWI��tN��tJH��u�J�	f��f���w�H�J�	H;�u�H��I��I��������~vH��L�I3�I��t��H3��H�H��Ä�t'��t#H����t��tH����t��t����t��u�H3�����H�\$H�t$ATH��03��N�j�����^�\$ ;p�}iLc�H�D~J�<�tPJ��A�t������t�Ɖt$$��|1H�~J��H��0��(H�
~J���u��L��}K�$��É\$ 돹�����H�\$@H�t$HH��0A\�H��H�XL�@H�HUVWATAUAVAWH��3�A��A��H���@��o�x�@��$�H�x�E��t�x�A���l$pD��H�L$T� ;�tE3�E3�3�3�H�|$ 襊����r��@u
�|$T�tE
��A���A#Ⱥ�;�tT+�t:;�t1�|����8���R����E3�E3�3�3�H�|$ ��g������D���@��t��u�A�@�D����$�A���t,��t#��t��t��@u�D;������A���A�������ϋƺ�L$H#�tF=t8=t*=t=t*=t&=t;�t�/���A�����
��A����A��D�l$Ps��j��"�$���A�E�DD�D�l$P@��@tA��A����D�l$P�L$H��s
A��D�l$P@�� tA���@��t
A��D�l$P�e
����u!�����8�������܊����H��$�D�D$HH��$�H�|$0L�L$`A��D�l$(��l$ �>'H�D$XH�������A��#�;�uC�@��t9D�D$HH��$�H�|$0A��L�L$`D�l$(A�׉l$ ��&H�D$XH���u;HcL�-�xH����H��Hk�XI�D��d���$���O����
����8��H��&;�uMHcL�-�xH����H��Hk�XI�D��d���$�ȋ�����H�L$X��$;�u�豉���
�A;�uA��@�	��uA��H�T$X��A	HcL�-/xH�����H��D
�I�D�Hk�XD�tHcH����H��Hk�XI�D��d8�A��$H�D$L��E����A��tx�E�ă��6����D$D���u�,����8�tP�詾������H�T$@A�@�|$@�A���;�u�|$@uHcT$D�����t��E3�3��պ�����t��E���<�@��u�D$T#�u�����#�=@tJ=t,=@t%=t+=@t$=t=@u(��$�����#�;�uD��$��@��$������|$DA��@��A��%�=@�$=�t|=���;��A;�v��v8���l��$�A���A+�� A;��P�D$D����E��3����H;�t��E3�3����H����|����H�T$DA��Ϋ������a���A;�t ��uk�|$DuD�@�D��$����D$D=��u��ټ���(���������=��u#�E3�A���"�����������D��$���E3�3���������;;�vqA;������������E��3�����H;������E3�3����H���u8����D$DA��Hc�E��H�TDD+���������m����D;��A�Hc@��$�H����@��H��Hk�XI�D��d8�@l8HcH�ƒ�H��Hk�XI�L��ƀd8����D8@8|$Lu!@��tHcH����H��Hk�XI�D��L A��%�=���A����H�L$X�� �D$PD�D$HH��$�H�|$0�D$(A��L�L$`�D$ A��-"H���u6�9 ��躅��LcI��A��H��Mk�XI�D�B�d����B���HcH�ʃ�H��Hk�XI�L�H�
��H��$�H�ĀA_A^A]A\_^]���H�t$WH��PE��L���d$@3�H��$�H������u(�����8H�d$ E3�E3�3�3����������3�H������u(賄����8H�d$ E3�E3�3�3��ǃ�������$���t8A����������u%�m�����8H�d$ E3�E3�3�3�聃�����`�L$0D�L$(D�T$ D��H��H�L$@�������D$D�|$@t,��t!HcH��H��L��r��Hk�XI���d���6��t����H�t$`H��P_���H��8A��D�L$`E��L���D$(H�L$ D��A��I�����H��8���H��H�XH�hH�pWH��PH��H��H�H�I��I���j��3�H;�u@8l$HtH�D$@����3��H�L$89iuL��H��H�����[H;�u<�;���E3�E3�3�3�H�l$ ��Q���@8l$HtH�D$@���������-H;�t�A��H��H��D�L
tUH;�u�f��D�L�Z�����@8/u���C�f��H��f�f;Qrf;QwfQ�$f;Qrf;QwfQ���Dt��D�H��I��E�LtNH;�u���^H��@8.uf���Q�fA��H��fD�fA��fD;Arf;AwfA�+f;Ar%f;AwfA�A���Dt
���fA��f;�uf;������H;�������u��������@8l$HtH�L$@����H�\$`H�l$hH�t$pH��P_���E3�����H�\$H�l$H�t$WH��P3�I��H��H��L;�u3��&H�L$0I���h��L�\$8A9kuL��H��H�������H;�u<�X���E3�E3�3�3�H�l$ ��n���@8l$HtH�D$@���������H;�t�A��H��H��F�Dt-H;�u���F�Du[f���G@8/uf���
�f��f�H���H��F�Dt#H;�u���H��@8.uf���
�f��f�H��f;�u&f;�tH;�u�@8l$H�����H�D$@������������@8l$HtH�L$@����H�\$`H�l$hH�t$pH��P_���E3����H�\$H�l$H�t$WH�� H�څ�xi;
�nsaHc�H�-�nH����H��Hk�XH�D�H�<�u=�=RJu'��t��t��u���������������yH�D�H�3������	����� ��H�\$0H�l$8H�t$@H�� _��H�\$H�l$WH�� ��xs;
nskHc�H�-#nH����H��Hk�XH�D��DtGH�<�t@�=�Iu)��t��t��u��������������3��H�D�H��3���
���	�"��� ��H�\$0H�l$8H�� _�H��8���u�~��� ��~���	�]��x1;
Xms)Hc�H�
hmH�ƒ�H��Hk�XH���DtH��,�~��� �~��H�d$ E3�E3�3�3��	�}��H��H��8�H��H�XH�pH�xL�` AUH�� Hc�L��I��L�-�l��Hk�XK�t���|3u3�O	��{����|3uH�L3���ۇ�����#��D3�
�z����tK�L�H�L����H�\$0H�t$8H�|$@L�d$HH�� A]���Hc�H�
flH�ƒ�H��Hk�XH��H�LH�%8H�\$H�|$L�d$AUAVAWH��@I��E��E3�A�L$�?z����uA������{���3��|$$H��k��@��Lc�J��H���H�\$0J��HH;����C���{u;�
�z����{u H�K��軆����uD�pD�t$(��C�
�y��E��u H�K�d�CtH�K�L�HI��E��u?�CL�#L�CkK+�H���.�袋.H��L��I��I��H��?L���D�D�l$ �H��XH�\$0I��H��j� ���E;����lj|$$H��j����X�J�腻��H�D$0H��ttHc�L��jI�Ѓ�j I��H��H;�s�@L� �@	
�`H��XH�D$0����|$ Hc�H��H����Hk�XI���D���H�����AD�D��|$ ��Ux��A��H�\$`H�|$hL�d$pH��@A_A^A]�H�\$�L$VWATH��0Hc����u�^{���	��������;=�i��H��H��H��L�%�i��Hk�XI���L��u%�{���	H�d$ E3�E3�3�3��&z�����z������I��Dt+�����H��~��u
�|���3ۅ�t��z����z���	�����������#�z���	H�d$ E3�E3�3�3��y����H�\$`H��0A\_^��H�\$H�t$WH��@��H��H�L$ A��A����`��H�D$(D��A�|u��tH�D$ H��@B�Y#��3���t��|$8tH�L$0����H�\$PH�t$XH��@_�̋�A�E3�3��r�����H�\$H�t$WH�� H��H��H��u
H���b���jH��u�ra���\H���wCH�
�d�H��HD�L��3�L��9H��H��uo9�dtPH���}�����t+H���v�H���k����Ry���3�H�\$0H�t$8H�� _��5y��H�������x������y��H�������x���H��������H��hH�UCH3�H�D$P�=Wf�L$@tfH�
�WH���u�YH�
�WH�����H�d$ L�L$DH�T$@A��p�����=�V���=��xu}�%�V�;H�d$8H�d$0��H�D$HL�D$@A�3��D$(H�D$ �pH�
1WH���t0H�d$ L�L$DH�T$HD������tf�D$@��%V���H�L$PH3��aZ��H��h�H�\$H�l$H�t$WH��P3�I��H��H��H;�tL;�t
@8*uH;�tf�)3�H�\$`H�l$hH�t$pH��P_�H�L$0I���.^��L�\$0A9ku%H;�t�f�@8l$HtH�D$@�������H�T$0���;���H�L$0D��A��~0A;�|+�I��H;���L�Ǻ	�D$(H�\$ �H�L$0;�uHc�H;�r(@8ot"��@8l$H�4���H�L$@�����#�����v���*@8l$HtH�D$@�����������A�H;���A�QL�ljD$(H�D$0H�\$ �H�u;���������E3����H��H�XH�hH�pH�x ATAUAVH��PL��H��H�H�E��M����\��M��tM�uM��u*�+v��H�d$ E3�E3�3�3���@u���|$H��E��tA��|�A��$�A�.L�D$03�I�^A��~L�D$0@�ͺ��L�D$0�I��@@���H����t@�+H��뾋�$�@��-u���@��+u@�+H��E���SA���IA��$�?E��u(@��0tA�
�8�;xt
�;XtA��&A��A��u@��0u�;xt�;Xu@�kH��M��@3҃�A��D��@��E�JA��t	@�̓�0�A��t,�E�@��<w�� ���A;�s��A;�r"u;�v��M��uH��@��uM��IE�3��YA���@�+H��둽���@��u@��u:�ƃ�t���w��u';�v#�qt���"@��t���
@��$������M��tI�]@��t�߀|$HtH�L$@�������M��tM�u@8|$HtH�D$@����3�L�\$PI�[ I�k(I�s0I�{8I��A^A]A\���H��83�E��L�‰D$ H��9�^u	H�
�J�3��Q���H��8�H��8H�>H3�H�D$(L�D$ A���D$&����u���
H�L$ �H�L$(H3���U��H��8��@USVWATAUAVAWH��H�l$@H��=H3�H�E0L���E�!3�I��H���}L�MD��D��H�];��H�U��;����}��H�UA���;����}uz�EA���t`A������Hc�H�����H;���H�L	H��wlH�AH;�w
H�����H����'H+�H�\$@H��t<����NH���J����x�E��L�úA�ω|$(H�|$ �8�����o���3��7�~Z��H��H��t���H���3�H��t�Lc�3�H��M��G���L�EE�̺A�ω|$(H�\$ ��
E3�A;���M;�t;���L�|$8L�|$0�D$(D��L��3�A��L�t$ ��
A;���I���D9}u,L�|$8L�|$0D��L��3�A��D�|$(L�|$ ��
��A;�tWHc׹�°��H��I;�tBL�|$8L�|$0D��L��3�A�͉|$(H�D$ �b
A;�u
H����X��I���A���tH�M�H�K�9��u��X��H��H�M0H3��dS��H�eHA_A^A]A\_^[]����3�D�B
����L��M��t<E�
I��A�A���wA�� �
H�A���w�� I��t
E��tD;�t�D+�A���3���H��H�XH�hH�pWH��PI��H��H��M����H�H�I���V��H��u=�Pp��H�d$ E3�E3�3�3���eo���|$HtH�D$@���������H��t�H�����w�H�D$0�xu#L��H��H�������|$HtZH�L$@�����L�MH�T$0���H�T$0��H���H��H��t��t;�t�+؀|$HtH�L$@�������3�H�\$`H�l$hH�t$pH��P_����H��8�=�ZuAH��u'�ao��H�d$ E3�E3�3�3���vn�������H��t�I�����w��X����E3����H��8��H��H�XH�hH�pH�x ATAUAWH�� H��3�3�D�G������L��H���tPD�G3ҋ����H���t=H��H+�H;�����A��WH��M���	H��H;�u1�n����n���H�\$@H�l$HH�t$PH�|$XH�� A_A]A\ú�����D��D��I;�H��EMNj��3������tH�H+�H;�~���Un���8u�+n���
H��A�ԋ����
L��H��3�	�U}]E3�H�Ջ��
���H����T�������H���
��H�H��H��H���u%��m���
��m��H��f�H�������E3�I�Ջ�護��H��������3����H�\$Lc�H�%\M��A��I��Mk�XJ��B�D8F�\�A��D��A���@tX���tH��t(��t ��uHB�L�J��B�d8�B�L8�0B�L�J��B�d8�B�L8�B�d�B�L�J��B�d8�E��u���A���%�@H�\$���H��8H��u'�l��H�d$ E3�E3�3�3���k����
��Y�3�H��8��H��HH�d$0�d$(A�H�
PE3ɺ@D�D$ ��H�6KH��H��H��(H�
%KH���tH���t�H�
KH���tH���t��H��(��H�l$WH��pHc�H�L$P�R����sbH�T$P��~L�D$P������H�T$P�H��@�x����tH��H�8���|$htH�D$`��������H�D$P��~6��H�T$P��@�������t@��$�@��$�Ƅ$��� �2k����*@��$�Ƅ$�H�L$P�D$@L��$��AA��D$8H��$��D$0H�D$(�T$ �QH�L$P�;�����2�������$�t
��$�����|$htH�L$`����H��$�H��p_�%��%��%*����������������ff�H��L�$L�\$M3�L�T$L+�MB�eL�%M;�sfA���M���A�M;�u�L�$L�\$H�����@UH�� H�ꃽ�t
��f��H�� ]�@UH��0H��H�MP谇��H��0]�@UH��0H��H�M`蘇��H��0]�@UH��0H��H�M@耇��H��0]�@UH�� H��H�H�ы��n��H�� ]�@UH�� H��
�3f��H�� ]��������@UH�� H���f��H�� ]�@UH�� H��H�
�5��H�� ]�@UH�� H���GL��H�� ]��@UH�� H��H�3Ɂ8�������H�� ]�@UH��0H��}pt3��e��H��0]�@UH�� H��H�E3ہ8�A��A��H�� ]�@UH�� H��
�je��H�� ]�@UH�� H���Qe��H�� ]�@UH�� H���8e��H�� ]�@UH�� H��HcM H��H�YH��肆��H�� ]�����������@UH�� H����d��H�� ]�@UH��0H��MP�\�H��0]�@UH��0H��M`�E�H��0]�@UH��@H��}@t>�}Dt*H���Hc
H��H��L��V��Hk�XI���d��H����
���H��@]�@UH�� H��
�Ud��H�� ]�@UH�� H��
�<d��H�� ]��������@UH�� H���d��H�� ]�������(�D�V�r�������������$�:�L�h�|��������������$�>�R�b�r����������������,�T�`�j�v�������������2�L�b�|������������&�6�H�Z�h�x�����������86@$L@�Q@�m@x�@�R@1�RLH�H�CorExitProcessmscoree.dll�@0@runtime error 
TLOSS error
SING error
DOMAIN error
R6034
An application has made an attempt to load the C runtime library incorrectly.
Please contact the application's support team for more information.
R6033
- Attempt to use MSIL code from this assembly during native code initialization
This indicates a bug in your application. It is most likely the result of calling an MSIL-compiled (/clr) function from a native constructor or from DllMain.
R6032
- not enough space for locale information
R6031
- Attempt to initialize the CRT more than once.
This indicates a bug in your application.
R6030
- CRT not initialized
R6028
- unable to initialize heap
R6027
- not enough space for lowio initialization
R6026
- not enough space for stdio initialization
R6025
- pure virtual function call
R6024
- not enough space for _onexit/atexit table
R6019
- unable to open console device
R6018
- unexpected heap error
R6017
- unexpected multithread lock error
R6016
- not enough space for thread data

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
R6009
- not enough space for environment
R6008
- not enough space for arguments
R6002
- floating point support not loaded
Microsoft Visual C++ Runtime Library

...<program name unknown>Runtime Error!

Program: ������������������(null)(null)EEE50P( 8PX700WP  `h````xpxxxx	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ccsUTF-8UTF-16LEUNICODEGetProcessWindowStationGetUserObjectInformationAGetLastActivePopupGetActiveWindowMessageBoxAUSER32.DLL�����������EEE���00�P��('8PW�700PP� (����`h`hhhxppwpp         (((((                  H����������������������          h((((                  H����������������������                                 H�����������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~�����������������������������������������������������������������������������������������������������������������������������HH:mm:ssdddd, MMMM dd, yyyyMM/dd/yyPMAMDecemberNovemberOctoberSeptemberAugustJulyJuneAprilMarchFebruaryJanuaryDecNovOctSepAugJulJunMayAprMarFebJanSaturdayFridayThursdayWednesdayTuesdayMondaySundaySatFriThuWedTueMonSunSunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecCONOUT$user32.dllMessageBoxTimeoutAFatal Error in LauncherrbFailed to open executableUnable to find an appended archive.Unable to read from file#!Job information querying failedJob information setting failedstdin duplication failedstdout duplication failedstderr duplication failedUnable to create process using '%s'Failed to get exit code of processFailed to find shebangExpected to find terminator in shebang lineExpected to find '#' at start of shebang lineExpected to find '!' following '#' in shebang lineExpected to be able to allocate command line memory"%s" "%s" %sRSDS��م�ƋI�{஦`��c:\Users\Vinay\Projects\SimpleLauncher\dist\w64.pdb42p
d4r����p9+4��b

20t
d4r�9����� ��
4R���
�p`P
�t
d	4R�9^#w#��t
dT4
R���4	Rp9�%�%��d
4	Rp9*'9'��

4
Rp4	Rp97(A(��	d4p9j(v(*W)�)
��)

4
2p9.,9,&�N,u,F�42p9�-.&�.L.F��t
4R�td42�td42�93G3_�		�0d
T	4Rp
t
d	42���9�6_7{�	B9�8
9��
9  d T 4 r����p	B9�:�:�:RP
d4r���
�p9t>?��	b9�?�?���?d	T42pdT4�p
td
T	4R�$d�4��p�p

4
2p9�F�F��4r�
�p`P�8
�t
d	4R�9K�K��d42p209�O�O�dT�pB20
T4R���p`d	4Rp9�VX!��d	4Rp	�����
p`P
0
d4
R����p9�b�b��	 
 � t d 4 ���9�de�g
d4
R����p9iIi��
�td
R���9�jk:��j"kj�d
4R��p9�l�l��B

4
2ptd
T	42���d4
Rp
t
dT4
r�

4
2p
t	dT42�
T4r���p`R0�
d4
R����p9�I���/4qf���
�p`P� 
d4
R����p9��݉��r04�p
`PbdT42pdT42p)4dZ���
�p`P��-
Etd4C�
����P�Xd4�p1
5#td43r��
��P�8d4�p2
0d	4R�9�{�!�!
!4!�����p`PrP

d
�p9c�����dT
4�pT42p2P
�	td42�9�����
�t
4r���9��۸�\�
�=�4R
�p
`9Ǻ�����PtdT4����b�('EC
��	��p`0P�ptd
T	42���4�

T
�pd4
rp*�p0�0

40
.p
T4r���p`-d2T140,��p�P(�Z��������(�D�V�r�������������$�:�L�h�|��������������$�>�R�b�r����������������,�T�`�j�v�������������2�L�b�|������������&�6�H�Z�h�x�����������ExitProcess~SetInformationJobObjecthFreeLibrary�GetCurrentProcessWaitForSingleObjectmGenerateConsoleCtrlEvent�GetCommandLineAAssignProcessToJobObject�GetExitCodeProcess�CreateProcessA�QueryInformationJobObject�CreateJobObjectAkGetStdHandleGetLastErrorLGetProcAddress>LoadLibraryA;SetConsoleCtrlHandlerGetModuleFileNameA�DuplicateHandleRCloseHandleKERNEL32.dllGetModuleHandleW�Sleep�HeapFree�HeapAllociGetStartupInfoA�TerminateProcess�UnhandledExceptionFilter�SetUnhandledExceptionFilterIsDebuggerPresent&RtlVirtualUnwindRtlLookupFunctionEntryRtlCaptureContext�EncodePointer�DecodePointerZFlsGetValue[FlsSetValueYFlsFree�SetLastError�GetCurrentThreadIdXFlsAlloc4WriteFile�DeleteCriticalSection;LeaveCriticalSection�EnterCriticalSection%RtlUnwindEx�InitializeCriticalSectionAndSpinCountxGetCPInfonGetACP>GetOEMCPIsValidCodePage�HeapSetInformation�HeapCreateiMultiByteToWideChar�ReadFile|SetHandleCount�GetFileTypetSetFilePointerfFreeEnvironmentStringsA�GetEnvironmentStringsgFreeEnvironmentStringsW WideCharToMultiByte�GetEnvironmentStringsW�QueryPerformanceCounter�GetTickCount�GetCurrentProcessId�GetSystemTimeAsFileTime�HeapSize
GetLocaleInfoA�GetConsoleCP�GetConsoleMode-LCMapStringA/LCMapStringWmGetStringTypeApGetStringTypeW�CreateFileA�SetStdHandle]FlushFileBuffers�HeapReAlloc)WriteConsoleA�GetConsoleOutputCP3WriteConsoleWaSetEndOfFileQGetProcessHeap�@2��-�+�] �f��������@��@	X�@
��@��@X�@0�@�@��@��@h�@0�@�@��@��@ H�@!P�@"��@x��@y��@z��@�x�@�h�@
		


!
5A
CPR
S
WYl
m pr	�
�
�	��
�)�
���
���D{@D{@D{@D{@D{@D{@D{@D{@D{@D{@�
�@��@                          abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ                          abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ�@�`�y�!�������@~�����ڣ ��@����ڣ ��A��Ϣ���[��@~��QQ�^� _�j�2�����1~���@����C@@@@@`@�@��@�@�@@@�@�&@�&@���������
�@�@`�@\�@X�@T�@P�@L�@H�@@�@8�@0�@ �@�@�@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@x�@p�@`�@P�@H�@D�@8�@ �@�@	�@.P@X"@X"@X"@X"@X"@X"@X"@X"@X"@`@.�p��PSTPDT�@0@����������������������������;Zx����0Nm����:Yw����/MlK����L��LG��H������������������@m8�p�8���8����I��L��������'8�(J��L�8��v��x�����8������! �$ � H�� �"@��"�#X��#�#���#�%���%�%���%�&��&S'��T'�'���'V(��X(1* �4*F*��H*�+\��+�+���+�,d��,-��-4-8�4-i.��l.�.8��.1��1[1��\1�1���1k2��2l3��l3�3���3�4 ��4e5,��5�5���5�5���5668�86z68�|6�7@��7�7���7�7���78��8B8���89p�9�:���:�:���:�:���:�<��<i?���?�?��?�?8��?�A$��AsB8�tB�CL��C�C���C�D��DgFd�hF$G��$G�G���G+J��,J$L��$LLL��LL�M��O_O8�`O�O��O�P ��P0Q0�0Q�Q���Q�R8��R�R���RSS8�TS�S8��S�S���ST��T�V@��V1XX�PXtX���XZ��Z�a���ac��c:c��<c�c���d�g���gbh��dh�i��ij��j[j8�\jPkH�\kl��l0m��0mgm8�hm�m���m�m���m=n��@noo,�po?q��@q6r��8r�s���s�t��tu�u�u��uv� vx0�x�xH��xuyH�8z�zH��z�z���zB{��P{�{P�D�8������]���`���X���������)���,��8�������5���8�������������������8��U���X�֎�؎ڙ$�ܙ�H����p������ �����������������u����������������α�б�����,���^�,�h����Ķ@�ĶH���H��X��4���4�G���H�û��ػ������Ľ��Ľ5�,�@��������G�$�H���4�$�5�,�8�������,�X�,���t���;���<�w�|�x�������$���P���������P���������������
���
�&�P�&�?�P�F�_�P�_�{�P�{���P�����P�����������P����P��!�P�!�:�P�:�`�P�j���P�������������������P��6�P�=�V�P�(�p�������������0�eH�`�x�������	�R���T(�V���^h�(d�%�Љ��x�h��h�H�Z�( @...GGGWWWiiiuuu����������������������������������̀�ww����ww||�����ww��������wwww��������ww��������f�wwwww|�����f�wwwwww����ff�wwwwww�����ff��wwwww���ffl����ww����ffffff��w����ffffffl�w������ffffff�w�����ffffff�|����������ff��������ffff�������ff��R\I���lffl���)����ff�ح���������2L���������18�������Ϥ"������A<��������ΣT��π�����U���������������������������؀����������������������?������������������?�?�?�?�?�?�������������( 444MMMSSSzzz������������������������������p�p�����{p{��f���fko�f�����_fffk�_�fff��[���f}��UUU�fL4�UUU_kJqO���_�~�'�[U_����U�����������wwwww{~����������������( @%%%+++000===AAAIIIMMMQQQVVVYYY]]]~dFgggjjjmmmrrruuu}}}�u?�z=�~;�gE�kC�oA�r@��:��I��b��pƏKУk(��,�1�?�5�<�\�C�K�Q�s�U�[�c�b�����������������������������������������ð����������������������������������������������������/Pp�
��� �=�1[�Qy�q�����������/"P0p=�L�Y�g�x���1��Q��q����������&/@PZpt���������1�Q�q��������/&PAp[�t��ϩ������1��Q��q����������/P"p0�>�M�[�i�y��1��Q��q����ұ������/Pp�	�
��� �>1�\Q�zq������������/Pp!�+�6�@�I�Z�1p�Q��q�������������/ P6pL�b�x�������1��Q��q�������������,/KPip�����������1��Q��q������������/-P?pR�c�v������1��Q��q�ϑ�ܱ������/Pp�!�&�,�>�X1�qQ��q������������_______CCBABADL*(%$""&GABJIIDDJC??AD_-(''%$GG#_DIJIIJIIIDIJDD_+)(''%GG _JMCEJ?ABAECA?BA_,+)('%%"!_IM@AJACDCIDI____.,++>________JMJJJJJJJJJF_..,+)('%$"! #GIMCEJJJI?J__...,+(('%$"! &_JM?AJJJJCJ__...,+)(''%$"  _IMJJJJJJJJ_K=...,++(''%$! _JMCDJJJJAJ_K_______L*%$"!_I_?AMNJJEJ_L'%$"_I_MMMMMMJJ__('%%_I_CEMIJJMEM_(''*_I_?BMDJEMDMF_)(-LI_MMMCMMMMM_________<____I_CEM1;MACDMEJM__I_?A_D1@IJJMJMM_FF_I__6_@/EMMMNMM_FF_I_C80EJDMJCJFF?:AA20?_M_MIEM______MIC4BC/
N______MMMMJIDAI_9/	HJJMMJMMMJ??BAI_A7503	IJMMCBCBA44CCI___BAO;6___C_MJIDIDMI_CI___O;
@__C_C?J?AJI_?A_DJJI@O_CM?;I?JI_________H9MAIJJIJI_CD_____JJI73C;IJIJI_?AMDJJDIMJIE5:JIJI__________MMIA:IJJJJJJJJJJJJJJJJMJ�����?������������������?������������������?�( 444MMMRRRYYY~eGuuu}}}�x>�iE�rC��E��~7�?�H�V�b�x����������������������������������������������������������������������������������/!P7pL�c�yϏ���1��Q��q�������������/Pp"�,�6�@�J�[1�qQ��q�������������/Pp�
��� �=�1[�Qy�q�����������/"P0p=�L�Y�g�x���1��Q��q����������&/@PZpt���������1�Q�q��������/&PAp[�t��ϩ������1��Q��q����������/P"p0�>�M�[�i�y��1��Q��q����ұ������/Pp�	�
��� �>1�\Q�zq������������/Pp!�+�6�@�I�Z�1p�Q��q�������������/ P6pL�b�x�������1��Q��q�������������,/KPip�����������1��Q��q������������/-P?pR�c�v������1��Q��q�ϑ�ܱ������/Pp�!�&�,�>�X1�qQ��q������������!%///* !*/"(%%'%/)
/!#''////+/+"*(/
/

!%(/
(

  (*/(///)
*/
	)*

	/"/////	/+///#
		+ !%//
+"*+'#+//+'!%*++$++!+!    !!!<(0` !!$&			&"

 ���W���������������������������������ܱ��Nj+<<</	&&&#&[[[?6666��׏��������������������������������������������Ҟ���BBB3"


mmm3����,����!!!4777&�����������������������������������������������������ʟ���}���}___E���OpppD���P,)+3���Z2226DDD(���,�����###5��������������������������������������������������������������������������������չ�������������5�������,�������������������������������������������������������������������������������������������������������������,������Ì222"��Є�����������������������������������������������������������������������������������������������������&&&2����   4888&�������������������������������������������������������������������������e��?��4��/��+���.���R�������ӎ����������$$$5��Ď���������������������������������������������������������������������D��@��;��7��3��/��*���&���"�����������������������������������������������������������������������������������������W��G��C��?��;��6��2��n������f��0�������������nj333"��ӄ��������������������������������������������������������������������O��K��G��B��>��:��5��p������i��$�����������!!!4888&���������������������������������������������������������������������S�N��J��F��B��=��9��5��0��,��(���������������%%%5��ǎ���������������������������������������������������������������������V�R�N��I��E���������������������������������������������������������������������������������������������������������ѹ���|J��q?��o@�����Z�U�Q�M��I��D��@��<��7��3��/��+���&���"���-����������������Ɍ444"��ք�������������������������������������������������̴��w<��u=��s>��q?�����]�Y�U�P��L��H��C��?��;��7��2��.��*���%���!����������������"""4888&���������������������������������������������������d��y<��w=��u=��s>�����a�\�X�T�P��K��G��C��>��:��6��1��-��)���%��� ���O������������Ñ%%%5��ʎ���������������������������������������������������A��{;��y<��w=��t>�����s�`�\�W�S�O��J��F��B��>��9��5��1��,��(���$���(����������������������������������������������������������������������9��|:��z;��x<��v=�������s�_�[�W�R�N��J��E��A��=��8��4��0��,��'���#�������������̌555"��ل���������������������������������������������������9��~9��|:��z;��x<���o�����������������������������������������m��8��3��/��+���'�����������"""4:::&������������������������������������������������������8���9��~:��|;��z;��w<��u=��s>��q?��o@��mA��kB��iC��gC�dD��uZ������;��7��3��.��*�������������Ǒ%%%5��̎���������������������������������������������������È>���8���9��}:��{;��y<��w<��u=��s>��q?��o@��mA��jB��hC��fD�~dE��uZ�����?��:��6��2��5�����������������������������������������������������������������������������Оa���7���8��9��}:��{;��y<��w=��u>��r>��p?��n@��lA��jB��hC��fD�}dE�����B��>��:��5��^������������ό555"��܄����������������������������������������������������������ѳ�„7���7���8��9��}:��{;��x<��v=��t>��r?��p@��n@��lA��jB��gC��eD�����F��A��=��9������������"""4;;;&�����������������������������������������������������������������ŌC���8���9��~9��|:��z;��x<��v=��t>��r?��p@��mA��kA��iB��gC�����I��E��L��������������ɑQQQJnnn����������~~~�������������������������������������������������������������������������������������������Į��q?��o@��mA��kB��iC�������������������������HHH�"""���������������vvv������������������������������������������������������������������9��~:��{;��y<��w<��u=��s>��q?��o@��mA��kB�������������:::�'''�___���������sss�ttt��������������������������������������������������������������8�Ϧu�����ǣv��y<��w=��u=��s>��p?��n@��lA��������888T����---6fffnddd�%%%�"""�����OOO�SSS������������������������������������������������������������ċD�ҧu�����ʤv��{;��y<��v=��t>��r?��p?��xM�����<<<�MMM�������̑&&&5����;;;�<<<�xxx�QQQ�;;;�KKK����������������������������������������������������������8���8��~9��|:��z;��x<��v=��t>��r?�̷������999�����������������������VVV�###�)))�444��������������������������������������������������������������������ѳ�͝b���@��~9��|:��z;��}C���g��˶����Ӎ���������󑑑�����ZZZ�lll�;;;�!!!�"""�)))�___���������������������������������������������������������������������������������������&&&2����:::�ppp�{{{�___�WWW�WWW�:::�!!!�"""�***�www�������������������������������������������������������������������"""4888&���,������̑999����Ԗ���JJJ�|||�lll�:::�"""�BBB�XXX�|||��������������������������������������������������������������������$$$6�������,��������������������������������uuu�KKK�CCC�@@@�...�www����������������������������������������������������������������������������������*������Ҍ666"������������������������KKK�aaa�LLL�WWW��������������������������������������������������������������@��������$����"""4;;;&���������������������nnn�fff�!!!�$$$�999������������������������������������������������������������444]ttt|������ȇ������ɑ&&&5��Ў������������������������vvv�mmm�VVV�{{{�OOO����������������������������������������������������������������ڥ�����������������������������������������������aaa�CCC�����ppp�������������������������������������������������������������������������ό555"��ބ����������������������������������|||�MMM�����fff���������������������������������������������������������������"""4;;;&�������������������������������������������\\\�����������������������������������������������������������������Ǒ%%%5��Ύ�����������������������������������������������������������������������������������������������ݧ�����������������������������������������������������������������������������������������������������������������ܦ������͌555"��ۄ�����������������������������������������������������������������������������������ۥ����"""4:::&������������������������������������������������������������������������������������ڤ������Ñ%%%5��ˎ�����������������������������������������������������������������������ܤ��������������������������������������������������������������������������������������������������ׇ
������ww���?ww�?�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�ww�ww�ww�ww�ww�ww�ww�ww�ww�ww�ww�ww�ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�?ww�ww��ww��ww��ww��ww��ww��ww�?�ww��ww���ww���ww( @ ����������������������������������!!!0\\\JeeeQ666D555A0$
�������v�H��<��6��0��2��\�������7���q��������������������ڴ���vvvj&&&D1"����g�L��F��@��;��5������?��������������������������������������������������к����V�Q�K��E��?��9������(�����������a���V�������������������������������������[�U�P��J��D��>��8��2��-���������uuun{{{j���������������������������������������`�Z�T�O������������������������������������������������������������������������V��o@��lA�����b�_�Y�S�M��G��B��<��6��0��+���%���<���������������a���V�����������������������m��t>��q?��n@�����b�b�^�X�R�L��F��A��;��5��/��)���$���Y����������wwwn}}}j����������������������~C��v=��s>��p?�����b�b�a�]�W�Q�K��E��@��:��4��.��(���+���������������������������������������{;��x<��v=��s>�����b�b�a�[�V�P��J��D��?��9��3��-��'��������������a���V����������������������~:��{;��x<��u=���p���������������������������������r��=��7��2��,����������yyynj�����������������������9��}:��z;��w<��u>��r?��o@��lA��iB��fD�}dE�|cE�|cE���i���B��<��6��1��������������������������������������?��9��}:��z;��w=��t>��q?��n@��kA��iC��fD�}cE�|cE�}dF�����G��A��;��=�������������a���V���������������������ңi���8��9��|:��y<��v=��s>��q?��n@��kB��hC��eD�|cE�|cE�����L��F��@��m����������zzzn���j�������������������������ʓP���8��~9��{;��y<��v=��s>��p?��mA��jB��gC�eD�|cE�����P��J��\��������������������������������������������������������������������������������¯��mA��jB��gC�~dE��������������������������a���V��������������������������������������}:��z;��x<��u=��r?��o@��lA��iB��fD���������|||n���m���������������������������������������9��������w=��t>��q?��n@��lA��iC�������������JJJ��������������������������������������������őP��������y<��v=��t>��q?��n@��~Y������������VVV�???�www�����iii�����������������������������������Ρk���A��|;��y<��v=��yF���p��������>>>3@@@y����~~~obbb�000�kkk�@@@������������������������������������������������������������������---U��������������<<<�&&&�[[[�������������������������������������������������������6���uuu�sss�WWW�III�$$$�&&&�qqq�����������������������������������lllg|||s���4����bbb�hhhƑ�������UUU�000�QQQ�}}}��������������������������������---{bbb�����(����������������������iii�LLL�BBB������������������������������������������������������a���V����������������ggg�+++�NNN�������������������������������������������|||n���j����������������]]]�ttt�kkk�������������������������������������������������������������������rrr�www���������������������������Ӧ�������a���V���������������������������������������������������Ӧ����zzzn���j�������������������������������������������Ӧ�����������������������������������������������������������ˉ��?������������������?�?�?���������������?�(  ������C�������������������﫫�o���������I�����������������������������������������ਨ������������S��=��?���������������������������������_�Q�F����4���������������������������������a�Z��������������������������������������м���oE�����c�a�X�M��B��7��0��������������������~I��q?�����c�`�V�K��@��5��8��������������������z;��u=���q�����������������v�>��3����������������������E��y<��t>��n@��iB�~dE�}dF�������G��H������YYY�uuu����������ġ���=��x<��s>��mA��hC�}dE�}eG�����S���������444�|||����������������������������gC�}cE�������������������������MMM������������������~>�����q?��kA��iG������������������RRR��������������¢���G��u=��xK�ʺ��������������������������������������������������������������������������������������������������������������������������������������������~�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A  �(  �h00 �%   � h<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPAD�����ȢТ��X�`�t�8�H�X�h�x���������Ƞؠ����(�8�H�X�h�x�����P�X�`�h�p�x���������������x�����ث��8�P�X�`�h�p����������Сء������� �(�0�8�@�H�P�X�`�h�p�x�������������������ȢТآ������� �(�0�H�`�h�p�x���������������p�x�site-packages/pip/_vendor/distlib/wheel.py000064400000112563151733463550014644 0ustar00# -*- coding: utf-8 -*-
#
# Copyright (C) 2013-2014 Vinay Sajip.
# Licensed to the Python Software Foundation under a contributor agreement.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
from __future__ import unicode_literals

import base64
import codecs
import datetime
import distutils.util
from email import message_from_file
import hashlib
import imp
import json
import logging
import os
import posixpath
import re
import shutil
import sys
import tempfile
import zipfile

from . import __version__, DistlibException
from .compat import sysconfig, ZipFile, fsdecode, text_type, filter
from .database import InstalledDistribution
from .metadata import Metadata, METADATA_FILENAME
from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache,
                   cached_property, get_cache_base, read_exports, tempdir)
from .version import NormalizedVersion, UnsupportedVersionError

logger = logging.getLogger(__name__)

cache = None    # created when needed

if hasattr(sys, 'pypy_version_info'):
    IMP_PREFIX = 'pp'
elif sys.platform.startswith('java'):
    IMP_PREFIX = 'jy'
elif sys.platform == 'cli':
    IMP_PREFIX = 'ip'
else:
    IMP_PREFIX = 'cp'

VER_SUFFIX = sysconfig.get_config_var('py_version_nodot')
if not VER_SUFFIX:   # pragma: no cover
    VER_SUFFIX = '%s%s' % sys.version_info[:2]
PYVER = 'py' + VER_SUFFIX
IMPVER = IMP_PREFIX + VER_SUFFIX

ARCH = distutils.util.get_platform().replace('-', '_').replace('.', '_')

ABI = sysconfig.get_config_var('SOABI')
if ABI and ABI.startswith('cpython-'):
    ABI = ABI.replace('cpython-', 'cp')
else:
    def _derive_abi():
        parts = ['cp', VER_SUFFIX]
        if sysconfig.get_config_var('Py_DEBUG'):
            parts.append('d')
        if sysconfig.get_config_var('WITH_PYMALLOC'):
            parts.append('m')
        if sysconfig.get_config_var('Py_UNICODE_SIZE') == 4:
            parts.append('u')
        return ''.join(parts)
    ABI = _derive_abi()
    del _derive_abi

FILENAME_RE = re.compile(r'''
(?P<nm>[^-]+)
-(?P<vn>\d+[^-]*)
(-(?P<bn>\d+[^-]*))?
-(?P<py>\w+\d+(\.\w+\d+)*)
-(?P<bi>\w+)
-(?P<ar>\w+)
\.whl$
''', re.IGNORECASE | re.VERBOSE)

NAME_VERSION_RE = re.compile(r'''
(?P<nm>[^-]+)
-(?P<vn>\d+[^-]*)
(-(?P<bn>\d+[^-]*))?$
''', re.IGNORECASE | re.VERBOSE)

SHEBANG_RE = re.compile(br'\s*#![^\r\n]*')

if os.sep == '/':
    to_posix = lambda o: o
else:
    to_posix = lambda o: o.replace(os.sep, '/')


class Mounter(object):
    def __init__(self):
        self.impure_wheels = {}
        self.libs = {}

    def add(self, pathname, extensions):
        self.impure_wheels[pathname] = extensions
        self.libs.update(extensions)

    def remove(self, pathname):
        extensions = self.impure_wheels.pop(pathname)
        for k, v in extensions:
            if k in self.libs:
                del self.libs[k]

    def find_module(self, fullname, path=None):
        if fullname in self.libs:
            result = self
        else:
            result = None
        return result

    def load_module(self, fullname):
        if fullname in sys.modules:
            result = sys.modules[fullname]
        else:
            if fullname not in self.libs:
                raise ImportError('unable to find extension for %s' % fullname)
            result = imp.load_dynamic(fullname, self.libs[fullname])
            result.__loader__ = self
            parts = fullname.rsplit('.', 1)
            if len(parts) > 1:
                result.__package__ = parts[0]
        return result

_hook = Mounter()


class Wheel(object):
    """
    Class to build and install from Wheel files (PEP 427).
    """

    wheel_version = (1, 1)
    hash_kind = 'sha256'

    def __init__(self, filename=None, sign=False, verify=False):
        """
        Initialise an instance using a (valid) filename.
        """
        self.sign = sign
        self.should_verify = verify
        self.buildver = ''
        self.pyver = [PYVER]
        self.abi = ['none']
        self.arch = ['any']
        self.dirname = os.getcwd()
        if filename is None:
            self.name = 'dummy'
            self.version = '0.1'
            self._filename = self.filename
        else:
            m = NAME_VERSION_RE.match(filename)
            if m:
                info = m.groupdict('')
                self.name = info['nm']
                # Reinstate the local version separator
                self.version = info['vn'].replace('_', '-')
                self.buildver = info['bn']
                self._filename = self.filename
            else:
                dirname, filename = os.path.split(filename)
                m = FILENAME_RE.match(filename)
                if not m:
                    raise DistlibException('Invalid name or '
                                           'filename: %r' % filename)
                if dirname:
                    self.dirname = os.path.abspath(dirname)
                self._filename = filename
                info = m.groupdict('')
                self.name = info['nm']
                self.version = info['vn']
                self.buildver = info['bn']
                self.pyver = info['py'].split('.')
                self.abi = info['bi'].split('.')
                self.arch = info['ar'].split('.')

    @property
    def filename(self):
        """
        Build and return a filename from the various components.
        """
        if self.buildver:
            buildver = '-' + self.buildver
        else:
            buildver = ''
        pyver = '.'.join(self.pyver)
        abi = '.'.join(self.abi)
        arch = '.'.join(self.arch)
        # replace - with _ as a local version separator
        version = self.version.replace('-', '_')
        return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver,
                                         pyver, abi, arch)

    @property
    def exists(self):
        path = os.path.join(self.dirname, self.filename)
        return os.path.isfile(path)

    @property
    def tags(self):
        for pyver in self.pyver:
            for abi in self.abi:
                for arch in self.arch:
                    yield pyver, abi, arch

    @cached_property
    def metadata(self):
        pathname = os.path.join(self.dirname, self.filename)
        name_ver = '%s-%s' % (self.name, self.version)
        info_dir = '%s.dist-info' % name_ver
        wrapper = codecs.getreader('utf-8')
        with ZipFile(pathname, 'r') as zf:
            wheel_metadata = self.get_wheel_metadata(zf)
            wv = wheel_metadata['Wheel-Version'].split('.', 1)
            file_version = tuple([int(i) for i in wv])
            if file_version < (1, 1):
                fn = 'METADATA'
            else:
                fn = METADATA_FILENAME
            try:
                metadata_filename = posixpath.join(info_dir, fn)
                with zf.open(metadata_filename) as bf:
                    wf = wrapper(bf)
                    result = Metadata(fileobj=wf)
            except KeyError:
                raise ValueError('Invalid wheel, because %s is '
                                 'missing' % fn)
        return result

    def get_wheel_metadata(self, zf):
        name_ver = '%s-%s' % (self.name, self.version)
        info_dir = '%s.dist-info' % name_ver
        metadata_filename = posixpath.join(info_dir, 'WHEEL')
        with zf.open(metadata_filename) as bf:
            wf = codecs.getreader('utf-8')(bf)
            message = message_from_file(wf)
        return dict(message)

    @cached_property
    def info(self):
        pathname = os.path.join(self.dirname, self.filename)
        with ZipFile(pathname, 'r') as zf:
            result = self.get_wheel_metadata(zf)
        return result

    def process_shebang(self, data):
        m = SHEBANG_RE.match(data)
        if m:
            data = b'#!python' + data[m.end():]
        else:
            cr = data.find(b'\r')
            lf = data.find(b'\n')
            if cr < 0 or cr > lf:
                term = b'\n'
            else:
                if data[cr:cr + 2] == b'\r\n':
                    term = b'\r\n'
                else:
                    term = b'\r'
            data = b'#!python' + term + data
        return data

    def get_hash(self, data, hash_kind=None):
        if hash_kind is None:
            hash_kind = self.hash_kind
        try:
            hasher = getattr(hashlib, hash_kind)
        except AttributeError:
            raise DistlibException('Unsupported hash algorithm: %r' % hash_kind)
        result = hasher(data).digest()
        result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii')
        return hash_kind, result

    def write_record(self, records, record_path, base):
        with CSVWriter(record_path) as writer:
            for row in records:
                writer.writerow(row)
            p = to_posix(os.path.relpath(record_path, base))
            writer.writerow((p, '', ''))

    def write_records(self, info, libdir, archive_paths):
        records = []
        distinfo, info_dir = info
        hasher = getattr(hashlib, self.hash_kind)
        for ap, p in archive_paths:
            with open(p, 'rb') as f:
                data = f.read()
            digest = '%s=%s' % self.get_hash(data)
            size = os.path.getsize(p)
            records.append((ap, digest, size))

        p = os.path.join(distinfo, 'RECORD')
        self.write_record(records, p, libdir)
        ap = to_posix(os.path.join(info_dir, 'RECORD'))
        archive_paths.append((ap, p))

    def build_zip(self, pathname, archive_paths):
        with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf:
            for ap, p in archive_paths:
                logger.debug('Wrote %s to %s in wheel', p, ap)
                zf.write(p, ap)

    def build(self, paths, tags=None, wheel_version=None):
        """
        Build a wheel from files in specified paths, and use any specified tags
        when determining the name of the wheel.
        """
        if tags is None:
            tags = {}

        libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0]
        if libkey == 'platlib':
            is_pure = 'false'
            default_pyver = [IMPVER]
            default_abi = [ABI]
            default_arch = [ARCH]
        else:
            is_pure = 'true'
            default_pyver = [PYVER]
            default_abi = ['none']
            default_arch = ['any']

        self.pyver = tags.get('pyver', default_pyver)
        self.abi = tags.get('abi', default_abi)
        self.arch = tags.get('arch', default_arch)

        libdir = paths[libkey]

        name_ver = '%s-%s' % (self.name, self.version)
        data_dir = '%s.data' % name_ver
        info_dir = '%s.dist-info' % name_ver

        archive_paths = []

        # First, stuff which is not in site-packages
        for key in ('data', 'headers', 'scripts'):
            if key not in paths:
                continue
            path = paths[key]
            if os.path.isdir(path):
                for root, dirs, files in os.walk(path):
                    for fn in files:
                        p = fsdecode(os.path.join(root, fn))
                        rp = os.path.relpath(p, path)
                        ap = to_posix(os.path.join(data_dir, key, rp))
                        archive_paths.append((ap, p))
                        if key == 'scripts' and not p.endswith('.exe'):
                            with open(p, 'rb') as f:
                                data = f.read()
                            data = self.process_shebang(data)
                            with open(p, 'wb') as f:
                                f.write(data)

        # Now, stuff which is in site-packages, other than the
        # distinfo stuff.
        path = libdir
        distinfo = None
        for root, dirs, files in os.walk(path):
            if root == path:
                # At the top level only, save distinfo for later
                # and skip it for now
                for i, dn in enumerate(dirs):
                    dn = fsdecode(dn)
                    if dn.endswith('.dist-info'):
                        distinfo = os.path.join(root, dn)
                        del dirs[i]
                        break
                assert distinfo, '.dist-info directory expected, not found'

            for fn in files:
                # comment out next suite to leave .pyc files in
                if fsdecode(fn).endswith(('.pyc', '.pyo')):
                    continue
                p = os.path.join(root, fn)
                rp = to_posix(os.path.relpath(p, path))
                archive_paths.append((rp, p))

        # Now distinfo. Assumed to be flat, i.e. os.listdir is enough.
        files = os.listdir(distinfo)
        for fn in files:
            if fn not in ('RECORD', 'INSTALLER', 'SHARED'):
                p = fsdecode(os.path.join(distinfo, fn))
                ap = to_posix(os.path.join(info_dir, fn))
                archive_paths.append((ap, p))

        wheel_metadata = [
            'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version),
            'Generator: distlib %s' % __version__,
            'Root-Is-Purelib: %s' % is_pure,
        ]
        for pyver, abi, arch in self.tags:
            wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch))
        p = os.path.join(distinfo, 'WHEEL')
        with open(p, 'w') as f:
            f.write('\n'.join(wheel_metadata))
        ap = to_posix(os.path.join(info_dir, 'WHEEL'))
        archive_paths.append((ap, p))

        # Now, at last, RECORD.
        # Paths in here are archive paths - nothing else makes sense.
        self.write_records((distinfo, info_dir), libdir, archive_paths)
        # Now, ready to build the zip file
        pathname = os.path.join(self.dirname, self.filename)
        self.build_zip(pathname, archive_paths)
        return pathname

    def install(self, paths, maker, **kwargs):
        """
        Install a wheel to the specified paths. If kwarg ``warner`` is
        specified, it should be a callable, which will be called with two
        tuples indicating the wheel version of this software and the wheel
        version in the file, if there is a discrepancy in the versions.
        This can be used to issue any warnings to raise any exceptions.
        If kwarg ``lib_only`` is True, only the purelib/platlib files are
        installed, and the headers, scripts, data and dist-info metadata are
        not written.

        The return value is a :class:`InstalledDistribution` instance unless
        ``options.lib_only`` is True, in which case the return value is ``None``.
        """

        dry_run = maker.dry_run
        warner = kwargs.get('warner')
        lib_only = kwargs.get('lib_only', False)

        pathname = os.path.join(self.dirname, self.filename)
        name_ver = '%s-%s' % (self.name, self.version)
        data_dir = '%s.data' % name_ver
        info_dir = '%s.dist-info' % name_ver

        metadata_name = posixpath.join(info_dir, METADATA_FILENAME)
        wheel_metadata_name = posixpath.join(info_dir, 'WHEEL')
        record_name = posixpath.join(info_dir, 'RECORD')

        wrapper = codecs.getreader('utf-8')

        with ZipFile(pathname, 'r') as zf:
            with zf.open(wheel_metadata_name) as bwf:
                wf = wrapper(bwf)
                message = message_from_file(wf)
            wv = message['Wheel-Version'].split('.', 1)
            file_version = tuple([int(i) for i in wv])
            if (file_version != self.wheel_version) and warner:
                warner(self.wheel_version, file_version)

            if message['Root-Is-Purelib'] == 'true':
                libdir = paths['purelib']
            else:
                libdir = paths['platlib']

            records = {}
            with zf.open(record_name) as bf:
                with CSVReader(stream=bf) as reader:
                    for row in reader:
                        p = row[0]
                        records[p] = row

            data_pfx = posixpath.join(data_dir, '')
            info_pfx = posixpath.join(info_dir, '')
            script_pfx = posixpath.join(data_dir, 'scripts', '')

            # make a new instance rather than a copy of maker's,
            # as we mutate it
            fileop = FileOperator(dry_run=dry_run)
            fileop.record = True    # so we can rollback if needed

            bc = not sys.dont_write_bytecode    # Double negatives. Lovely!

            outfiles = []   # for RECORD writing

            # for script copying/shebang processing
            workdir = tempfile.mkdtemp()
            # set target dir later
            # we default add_launchers to False, as the
            # Python Launcher should be used instead
            maker.source_dir = workdir
            maker.target_dir = None
            try:
                for zinfo in zf.infolist():
                    arcname = zinfo.filename
                    if isinstance(arcname, text_type):
                        u_arcname = arcname
                    else:
                        u_arcname = arcname.decode('utf-8')
                    # The signature file won't be in RECORD,
                    # and we  don't currently don't do anything with it
                    if u_arcname.endswith('/RECORD.jws'):
                        continue
                    row = records[u_arcname]
                    if row[2] and str(zinfo.file_size) != row[2]:
                        raise DistlibException('size mismatch for '
                                               '%s' % u_arcname)
                    if row[1]:
                        kind, value = row[1].split('=', 1)
                        with zf.open(arcname) as bf:
                            data = bf.read()
                        _, digest = self.get_hash(data, kind)
                        if digest != value:
                            raise DistlibException('digest mismatch for '
                                                   '%s' % arcname)

                    if lib_only and u_arcname.startswith((info_pfx, data_pfx)):
                        logger.debug('lib_only: skipping %s', u_arcname)
                        continue
                    is_script = (u_arcname.startswith(script_pfx)
                                 and not u_arcname.endswith('.exe'))

                    if u_arcname.startswith(data_pfx):
                        _, where, rp = u_arcname.split('/', 2)
                        outfile = os.path.join(paths[where], convert_path(rp))
                    else:
                        # meant for site-packages.
                        if u_arcname in (wheel_metadata_name, record_name):
                            continue
                        outfile = os.path.join(libdir, convert_path(u_arcname))
                    if not is_script:
                        with zf.open(arcname) as bf:
                            fileop.copy_stream(bf, outfile)
                        outfiles.append(outfile)
                        # Double check the digest of the written file
                        if not dry_run and row[1]:
                            with open(outfile, 'rb') as bf:
                                data = bf.read()
                                _, newdigest = self.get_hash(data, kind)
                                if newdigest != digest:
                                    raise DistlibException('digest mismatch '
                                                           'on write for '
                                                           '%s' % outfile)
                        if bc and outfile.endswith('.py'):
                            try:
                                pyc = fileop.byte_compile(outfile)
                                outfiles.append(pyc)
                            except Exception:
                                # Don't give up if byte-compilation fails,
                                # but log it and perhaps warn the user
                                logger.warning('Byte-compilation failed',
                                               exc_info=True)
                    else:
                        fn = os.path.basename(convert_path(arcname))
                        workname = os.path.join(workdir, fn)
                        with zf.open(arcname) as bf:
                            fileop.copy_stream(bf, workname)

                        dn, fn = os.path.split(outfile)
                        maker.target_dir = dn
                        filenames = maker.make(fn)
                        fileop.set_executable_mode(filenames)
                        outfiles.extend(filenames)

                if lib_only:
                    logger.debug('lib_only: returning None')
                    dist = None
                else:
                    # Generate scripts

                    # Try to get pydist.json so we can see if there are
                    # any commands to generate. If this fails (e.g. because
                    # of a legacy wheel), log a warning but don't give up.
                    commands = None
                    file_version = self.info['Wheel-Version']
                    if file_version == '1.0':
                        # Use legacy info
                        ep = posixpath.join(info_dir, 'entry_points.txt')
                        try:
                            with zf.open(ep) as bwf:
                                epdata = read_exports(bwf)
                            commands = {}
                            for key in ('console', 'gui'):
                                k = '%s_scripts' % key
                                if k in epdata:
                                    commands['wrap_%s' % key] = d = {}
                                    for v in epdata[k].values():
                                        s = '%s:%s' % (v.prefix, v.suffix)
                                        if v.flags:
                                            s += ' %s' % v.flags
                                        d[v.name] = s
                        except Exception:
                            logger.warning('Unable to read legacy script '
                                           'metadata, so cannot generate '
                                           'scripts')
                    else:
                        try:
                            with zf.open(metadata_name) as bwf:
                                wf = wrapper(bwf)
                                commands = json.load(wf).get('commands')
                        except Exception:
                            logger.warning('Unable to read JSON metadata, so '
                                           'cannot generate scripts')
                    if commands:
                        console_scripts = commands.get('wrap_console', {})
                        gui_scripts = commands.get('wrap_gui', {})
                        if console_scripts or gui_scripts:
                            script_dir = paths.get('scripts', '')
                            if not os.path.isdir(script_dir):
                                raise ValueError('Valid script path not '
                                                 'specified')
                            maker.target_dir = script_dir
                            for k, v in console_scripts.items():
                                script = '%s = %s' % (k, v)
                                filenames = maker.make(script)
                                fileop.set_executable_mode(filenames)

                            if gui_scripts:
                                options = {'gui': True }
                                for k, v in gui_scripts.items():
                                    script = '%s = %s' % (k, v)
                                    filenames = maker.make(script, options)
                                    fileop.set_executable_mode(filenames)

                    p = os.path.join(libdir, info_dir)
                    dist = InstalledDistribution(p)

                    # Write SHARED
                    paths = dict(paths)     # don't change passed in dict
                    del paths['purelib']
                    del paths['platlib']
                    paths['lib'] = libdir
                    p = dist.write_shared_locations(paths, dry_run)
                    if p:
                        outfiles.append(p)

                    # Write RECORD
                    dist.write_installed_files(outfiles, paths['prefix'],
                                               dry_run)
                return dist
            except Exception:  # pragma: no cover
                logger.exception('installation failed.')
                fileop.rollback()
                raise
            finally:
                shutil.rmtree(workdir)

    def _get_dylib_cache(self):
        global cache
        if cache is None:
            # Use native string to avoid issues on 2.x: see Python #20140.
            base = os.path.join(get_cache_base(), str('dylib-cache'),
                                sys.version[:3])
            cache = Cache(base)
        return cache

    def _get_extensions(self):
        pathname = os.path.join(self.dirname, self.filename)
        name_ver = '%s-%s' % (self.name, self.version)
        info_dir = '%s.dist-info' % name_ver
        arcname = posixpath.join(info_dir, 'EXTENSIONS')
        wrapper = codecs.getreader('utf-8')
        result = []
        with ZipFile(pathname, 'r') as zf:
            try:
                with zf.open(arcname) as bf:
                    wf = wrapper(bf)
                    extensions = json.load(wf)
                    cache = self._get_dylib_cache()
                    prefix = cache.prefix_to_dir(pathname)
                    cache_base = os.path.join(cache.base, prefix)
                    if not os.path.isdir(cache_base):
                        os.makedirs(cache_base)
                    for name, relpath in extensions.items():
                        dest = os.path.join(cache_base, convert_path(relpath))
                        if not os.path.exists(dest):
                            extract = True
                        else:
                            file_time = os.stat(dest).st_mtime
                            file_time = datetime.datetime.fromtimestamp(file_time)
                            info = zf.getinfo(relpath)
                            wheel_time = datetime.datetime(*info.date_time)
                            extract = wheel_time > file_time
                        if extract:
                            zf.extract(relpath, cache_base)
                        result.append((name, dest))
            except KeyError:
                pass
        return result

    def is_compatible(self):
        """
        Determine if a wheel is compatible with the running system.
        """
        return is_compatible(self)

    def is_mountable(self):
        """
        Determine if a wheel is asserted as mountable by its metadata.
        """
        return True # for now - metadata details TBD

    def mount(self, append=False):
        pathname = os.path.abspath(os.path.join(self.dirname, self.filename))
        if not self.is_compatible():
            msg = 'Wheel %s not compatible with this Python.' % pathname
            raise DistlibException(msg)
        if not self.is_mountable():
            msg = 'Wheel %s is marked as not mountable.' % pathname
            raise DistlibException(msg)
        if pathname in sys.path:
            logger.debug('%s already in path', pathname)
        else:
            if append:
                sys.path.append(pathname)
            else:
                sys.path.insert(0, pathname)
            extensions = self._get_extensions()
            if extensions:
                if _hook not in sys.meta_path:
                    sys.meta_path.append(_hook)
                _hook.add(pathname, extensions)

    def unmount(self):
        pathname = os.path.abspath(os.path.join(self.dirname, self.filename))
        if pathname not in sys.path:
            logger.debug('%s not in path', pathname)
        else:
            sys.path.remove(pathname)
            if pathname in _hook.impure_wheels:
                _hook.remove(pathname)
            if not _hook.impure_wheels:
                if _hook in sys.meta_path:
                    sys.meta_path.remove(_hook)

    def verify(self):
        pathname = os.path.join(self.dirname, self.filename)
        name_ver = '%s-%s' % (self.name, self.version)
        data_dir = '%s.data' % name_ver
        info_dir = '%s.dist-info' % name_ver

        metadata_name = posixpath.join(info_dir, METADATA_FILENAME)
        wheel_metadata_name = posixpath.join(info_dir, 'WHEEL')
        record_name = posixpath.join(info_dir, 'RECORD')

        wrapper = codecs.getreader('utf-8')

        with ZipFile(pathname, 'r') as zf:
            with zf.open(wheel_metadata_name) as bwf:
                wf = wrapper(bwf)
                message = message_from_file(wf)
            wv = message['Wheel-Version'].split('.', 1)
            file_version = tuple([int(i) for i in wv])
            # TODO version verification

            records = {}
            with zf.open(record_name) as bf:
                with CSVReader(stream=bf) as reader:
                    for row in reader:
                        p = row[0]
                        records[p] = row

            for zinfo in zf.infolist():
                arcname = zinfo.filename
                if isinstance(arcname, text_type):
                    u_arcname = arcname
                else:
                    u_arcname = arcname.decode('utf-8')
                if '..' in u_arcname:
                    raise DistlibException('invalid entry in '
                                           'wheel: %r' % u_arcname)

                # The signature file won't be in RECORD,
                # and we  don't currently don't do anything with it
                if u_arcname.endswith('/RECORD.jws'):
                    continue
                row = records[u_arcname]
                if row[2] and str(zinfo.file_size) != row[2]:
                    raise DistlibException('size mismatch for '
                                           '%s' % u_arcname)
                if row[1]:
                    kind, value = row[1].split('=', 1)
                    with zf.open(arcname) as bf:
                        data = bf.read()
                    _, digest = self.get_hash(data, kind)
                    if digest != value:
                        raise DistlibException('digest mismatch for '
                                               '%s' % arcname)

    def update(self, modifier, dest_dir=None, **kwargs):
        """
        Update the contents of a wheel in a generic way. The modifier should
        be a callable which expects a dictionary argument: its keys are
        archive-entry paths, and its values are absolute filesystem paths
        where the contents the corresponding archive entries can be found. The
        modifier is free to change the contents of the files pointed to, add
        new entries and remove entries, before returning. This method will
        extract the entire contents of the wheel to a temporary location, call
        the modifier, and then use the passed (and possibly updated)
        dictionary to write a new wheel. If ``dest_dir`` is specified, the new
        wheel is written there -- otherwise, the original wheel is overwritten.

        The modifier should return True if it updated the wheel, else False.
        This method returns the same value the modifier returns.
        """

        def get_version(path_map, info_dir):
            version = path = None
            key = '%s/%s' % (info_dir, METADATA_FILENAME)
            if key not in path_map:
                key = '%s/PKG-INFO' % info_dir
            if key in path_map:
                path = path_map[key]
                version = Metadata(path=path).version
            return version, path

        def update_version(version, path):
            updated = None
            try:
                v = NormalizedVersion(version)
                i = version.find('-')
                if i < 0:
                    updated = '%s-1' % version
                else:
                    parts = [int(s) for s in version[i + 1:].split('.')]
                    parts[-1] += 1
                    updated = '%s-%s' % (version[:i],
                                         '.'.join(str(i) for i in parts))
            except UnsupportedVersionError:
                logger.debug('Cannot update non-compliant (PEP-440) '
                             'version %r', version)
            if updated:
                md = Metadata(path=path)
                md.version = updated
                legacy = not path.endswith(METADATA_FILENAME)
                md.write(path=path, legacy=legacy)
                logger.debug('Version updated from %r to %r', version,
                             updated)

        pathname = os.path.join(self.dirname, self.filename)
        name_ver = '%s-%s' % (self.name, self.version)
        info_dir = '%s.dist-info' % name_ver
        record_name = posixpath.join(info_dir, 'RECORD')
        with tempdir() as workdir:
            with ZipFile(pathname, 'r') as zf:
                path_map = {}
                for zinfo in zf.infolist():
                    arcname = zinfo.filename
                    if isinstance(arcname, text_type):
                        u_arcname = arcname
                    else:
                        u_arcname = arcname.decode('utf-8')
                    if u_arcname == record_name:
                        continue
                    if '..' in u_arcname:
                        raise DistlibException('invalid entry in '
                                               'wheel: %r' % u_arcname)
                    zf.extract(zinfo, workdir)
                    path = os.path.join(workdir, convert_path(u_arcname))
                    path_map[u_arcname] = path

            # Remember the version.
            original_version, _ = get_version(path_map, info_dir)
            # Files extracted. Call the modifier.
            modified = modifier(path_map, **kwargs)
            if modified:
                # Something changed - need to build a new wheel.
                current_version, path = get_version(path_map, info_dir)
                if current_version and (current_version == original_version):
                    # Add or update local version to signify changes.
                    update_version(current_version, path)
                # Decide where the new wheel goes.
                if dest_dir is None:
                    fd, newpath = tempfile.mkstemp(suffix='.whl',
                                                   prefix='wheel-update-',
                                                   dir=workdir)
                    os.close(fd)
                else:
                    if not os.path.isdir(dest_dir):
                        raise DistlibException('Not a directory: %r' % dest_dir)
                    newpath = os.path.join(dest_dir, self.filename)
                archive_paths = list(path_map.items())
                distinfo = os.path.join(workdir, info_dir)
                info = distinfo, info_dir
                self.write_records(info, workdir, archive_paths)
                self.build_zip(newpath, archive_paths)
                if dest_dir is None:
                    shutil.copyfile(newpath, pathname)
        return modified

def compatible_tags():
    """
    Return (pyver, abi, arch) tuples compatible with this Python.
    """
    versions = [VER_SUFFIX]
    major = VER_SUFFIX[0]
    for minor in range(sys.version_info[1] - 1, - 1, -1):
        versions.append(''.join([major, str(minor)]))

    abis = []
    for suffix, _, _ in imp.get_suffixes():
        if suffix.startswith('.abi'):
            abis.append(suffix.split('.', 2)[1])
    abis.sort()
    if ABI != 'none':
        abis.insert(0, ABI)
    abis.append('none')
    result = []

    arches = [ARCH]
    if sys.platform == 'darwin':
        m = re.match('(\w+)_(\d+)_(\d+)_(\w+)$', ARCH)
        if m:
            name, major, minor, arch = m.groups()
            minor = int(minor)
            matches = [arch]
            if arch in ('i386', 'ppc'):
                matches.append('fat')
            if arch in ('i386', 'ppc', 'x86_64'):
                matches.append('fat3')
            if arch in ('ppc64', 'x86_64'):
                matches.append('fat64')
            if arch in ('i386', 'x86_64'):
                matches.append('intel')
            if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'):
                matches.append('universal')
            while minor >= 0:
                for match in matches:
                    s = '%s_%s_%s_%s' % (name, major, minor, match)
                    if s != ARCH:   # already there
                        arches.append(s)
                minor -= 1

    # Most specific - our Python version, ABI and arch
    for abi in abis:
        for arch in arches:
            result.append((''.join((IMP_PREFIX, versions[0])), abi, arch))

    # where no ABI / arch dependency, but IMP_PREFIX dependency
    for i, version in enumerate(versions):
        result.append((''.join((IMP_PREFIX, version)), 'none', 'any'))
        if i == 0:
            result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any'))

    # no IMP_PREFIX, ABI or arch dependency
    for i, version in enumerate(versions):
        result.append((''.join(('py', version)), 'none', 'any'))
        if i == 0:
            result.append((''.join(('py', version[0])), 'none', 'any'))
    return set(result)


COMPATIBLE_TAGS = compatible_tags()

del compatible_tags


def is_compatible(wheel, tags=None):
    if not isinstance(wheel, Wheel):
        wheel = Wheel(wheel)    # assume it's a filename
    result = False
    if tags is None:
        tags = COMPATIBLE_TAGS
    for ver, abi, arch in tags:
        if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch:
            result = True
            break
    return result
site-packages/pip/_vendor/distlib/__init__.py000064400000001105151733463560015265 0ustar00# -*- coding: utf-8 -*-
#
# Copyright (C) 2012-2014 Vinay Sajip.
# Licensed to the Python Software Foundation under a contributor agreement.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
import logging

__version__ = '0.1.8'

class DistlibException(Exception):
    pass

try:
    from logging import NullHandler
except ImportError: # pragma: no cover
    class NullHandler(logging.Handler):
        def handle(self, record): pass
        def emit(self, record): pass
        def createLock(self): self.lock = None

logger = logging.getLogger(__name__)
logger.addHandler(NullHandler())
site-packages/pip/_vendor/distlib/locators.py000064400000133542151733463560015367 0ustar00# -*- coding: utf-8 -*-
#
# Copyright (C) 2012-2013 Vinay Sajip.
# Licensed to the Python Software Foundation under a contributor agreement.
# See LICENSE.txt and CONTRIBUTORS.txt.
#

import gzip
from io import BytesIO
import json
import logging
import os
import posixpath
import re
try:
    import threading
except ImportError:
    import dummy_threading as threading
import zlib

from . import DistlibException
from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url,
                     queue, quote, unescape, string_types, build_opener,
                     HTTPRedirectHandler as BaseRedirectHandler,
                     Request, HTTPError, URLError)
from .database import Distribution, DistributionPath, make_dist
from .metadata import Metadata
from .util import (cached_property, parse_credentials, ensure_slash,
                   split_filename, get_project_data, parse_requirement,
                   parse_name_and_version, ServerProxy)
from .version import get_scheme, UnsupportedVersionError
from .wheel import Wheel, is_compatible

logger = logging.getLogger(__name__)

HASHER_HASH = re.compile('^(\w+)=([a-f0-9]+)')
CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I)
HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml')
DEFAULT_INDEX = 'http://python.org/pypi'

def get_all_distribution_names(url=None):
    """
    Return all distribution names known by an index.
    :param url: The URL of the index.
    :return: A list of all known distribution names.
    """
    if url is None:
        url = DEFAULT_INDEX
    client = ServerProxy(url, timeout=3.0)
    return client.list_packages()

class RedirectHandler(BaseRedirectHandler):
    """
    A class to work around a bug in some Python 3.2.x releases.
    """
    # There's a bug in the base version for some 3.2.x
    # (e.g. 3.2.2 on Ubuntu Oneiric). If a Location header
    # returns e.g. /abc, it bails because it says the scheme ''
    # is bogus, when actually it should use the request's
    # URL for the scheme. See Python issue #13696.
    def http_error_302(self, req, fp, code, msg, headers):
        # Some servers (incorrectly) return multiple Location headers
        # (so probably same goes for URI).  Use first header.
        newurl = None
        for key in ('location', 'uri'):
            if key in headers:
                newurl = headers[key]
                break
        if newurl is None:
            return
        urlparts = urlparse(newurl)
        if urlparts.scheme == '':
            newurl = urljoin(req.get_full_url(), newurl)
            if hasattr(headers, 'replace_header'):
                headers.replace_header(key, newurl)
            else:
                headers[key] = newurl
        return BaseRedirectHandler.http_error_302(self, req, fp, code, msg,
                                                  headers)

    http_error_301 = http_error_303 = http_error_307 = http_error_302

class Locator(object):
    """
    A base class for locators - things that locate distributions.
    """
    source_extensions = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz')
    binary_extensions = ('.egg', '.exe', '.whl')
    excluded_extensions = ('.pdf',)

    # A list of tags indicating which wheels you want to match. The default
    # value of None matches against the tags compatible with the running
    # Python. If you want to match other values, set wheel_tags on a locator
    # instance to a list of tuples (pyver, abi, arch) which you want to match.
    wheel_tags = None

    downloadable_extensions = source_extensions + ('.whl',)

    def __init__(self, scheme='default'):
        """
        Initialise an instance.
        :param scheme: Because locators look for most recent versions, they
                       need to know the version scheme to use. This specifies
                       the current PEP-recommended scheme - use ``'legacy'``
                       if you need to support existing distributions on PyPI.
        """
        self._cache = {}
        self.scheme = scheme
        # Because of bugs in some of the handlers on some of the platforms,
        # we use our own opener rather than just using urlopen.
        self.opener = build_opener(RedirectHandler())
        # If get_project() is called from locate(), the matcher instance
        # is set from the requirement passed to locate(). See issue #18 for
        # why this can be useful to know.
        self.matcher = None

    def clear_cache(self):
        self._cache.clear()

    def _get_scheme(self):
        return self._scheme

    def _set_scheme(self, value):
        self._scheme = value

    scheme = property(_get_scheme, _set_scheme)

    def _get_project(self, name):
        """
        For a given project, get a dictionary mapping available versions to Distribution
        instances.

        This should be implemented in subclasses.

        If called from a locate() request, self.matcher will be set to a
        matcher for the requirement to satisfy, otherwise it will be None.
        """
        raise NotImplementedError('Please implement in the subclass')

    def get_distribution_names(self):
        """
        Return all the distribution names known to this locator.
        """
        raise NotImplementedError('Please implement in the subclass')

    def get_project(self, name):
        """
        For a given project, get a dictionary mapping available versions to Distribution
        instances.

        This calls _get_project to do all the work, and just implements a caching layer on top.
        """
        if self._cache is None:
            result = self._get_project(name)
        elif name in self._cache:
            result = self._cache[name]
        else:
            result = self._get_project(name)
            self._cache[name] = result
        return result

    def score_url(self, url):
        """
        Give an url a score which can be used to choose preferred URLs
        for a given project release.
        """
        t = urlparse(url)
        return (t.scheme != 'https', 'pypi.python.org' in t.netloc,
                posixpath.basename(t.path))

    def prefer_url(self, url1, url2):
        """
        Choose one of two URLs where both are candidates for distribution
        archives for the same version of a distribution (for example,
        .tar.gz vs. zip).

        The current implement favours http:// URLs over https://, archives
        from PyPI over those from other locations and then the archive name.
        """
        result = url2
        if url1:
            s1 = self.score_url(url1)
            s2 = self.score_url(url2)
            if s1 > s2:
                result = url1
            if result != url2:
                logger.debug('Not replacing %r with %r', url1, url2)
            else:
                logger.debug('Replacing %r with %r', url1, url2)
        return result

    def split_filename(self, filename, project_name):
        """
        Attempt to split a filename in project name, version and Python version.
        """
        return split_filename(filename, project_name)

    def convert_url_to_download_info(self, url, project_name):
        """
        See if a URL is a candidate for a download URL for a project (the URL
        has typically been scraped from an HTML page).

        If it is, a dictionary is returned with keys "name", "version",
        "filename" and "url"; otherwise, None is returned.
        """
        def same_project(name1, name2):
            name1, name2 = name1.lower(), name2.lower()
            if name1 == name2:
                result = True
            else:
                # distribute replaces '-' by '_' in project names, so it
                # can tell where the version starts in a filename.
                result = name1.replace('_', '-') == name2.replace('_', '-')
            return result

        result = None
        scheme, netloc, path, params, query, frag = urlparse(url)
        if frag.lower().startswith('egg='):
            logger.debug('%s: version hint in fragment: %r',
                         project_name, frag)
        m = HASHER_HASH.match(frag)
        if m:
            algo, digest = m.groups()
        else:
            algo, digest = None, None
        origpath = path
        if path and path[-1] == '/':
            path = path[:-1]
        if path.endswith('.whl'):
            try:
                wheel = Wheel(path)
                if is_compatible(wheel, self.wheel_tags):
                    if project_name is None:
                        include = True
                    else:
                        include = same_project(wheel.name, project_name)
                    if include:
                        result = {
                            'name': wheel.name,
                            'version': wheel.version,
                            'filename': wheel.filename,
                            'url': urlunparse((scheme, netloc, origpath,
                                               params, query, '')),
                            'python-version': ', '.join(
                                ['.'.join(list(v[2:])) for v in wheel.pyver]),
                        }
            except Exception as e:
                logger.warning('invalid path for wheel: %s', path)
        elif path.endswith(self.downloadable_extensions):
            path = filename = posixpath.basename(path)
            for ext in self.downloadable_extensions:
                if path.endswith(ext):
                    path = path[:-len(ext)]
                    t = self.split_filename(path, project_name)
                    if not t:
                        logger.debug('No match for project/version: %s', path)
                    else:
                        name, version, pyver = t
                        if not project_name or same_project(project_name, name):
                            result = {
                                'name': name,
                                'version': version,
                                'filename': filename,
                                'url': urlunparse((scheme, netloc, origpath,
                                                   params, query, '')),
                                #'packagetype': 'sdist',
                            }
                            if pyver:
                                result['python-version'] = pyver
                    break
        if result and algo:
            result['%s_digest' % algo] = digest
        return result

    def _get_digest(self, info):
        """
        Get a digest from a dictionary by looking at keys of the form
        'algo_digest'.

        Returns a 2-tuple (algo, digest) if found, else None. Currently
        looks only for SHA256, then MD5.
        """
        result = None
        for algo in ('sha256', 'md5'):
            key = '%s_digest' % algo
            if key in info:
                result = (algo, info[key])
                break
        return result

    def _update_version_data(self, result, info):
        """
        Update a result dictionary (the final result from _get_project) with a dictionary for a
        specific version, whih typically holds information gleaned from a filename or URL for an
        archive for the distribution.
        """
        name = info.pop('name')
        version = info.pop('version')
        if version in result:
            dist = result[version]
            md = dist.metadata
        else:
            dist = make_dist(name, version, scheme=self.scheme)
            md = dist.metadata
        dist.digest = self._get_digest(info)
        if md.source_url != info['url']:
            md.source_url = self.prefer_url(md.source_url, info['url'])
        dist.locator = self
        result[version] = dist

    def locate(self, requirement, prereleases=False):
        """
        Find the most recent distribution which matches the given
        requirement.

        :param requirement: A requirement of the form 'foo (1.0)' or perhaps
                            'foo (>= 1.0, < 2.0, != 1.3)'
        :param prereleases: If ``True``, allow pre-release versions
                            to be located. Otherwise, pre-release versions
                            are not returned.
        :return: A :class:`Distribution` instance, or ``None`` if no such
                 distribution could be located.
        """
        result = None
        r = parse_requirement(requirement)
        if r is None:
            raise DistlibException('Not a valid requirement: %r' % requirement)
        scheme = get_scheme(self.scheme)
        self.matcher = matcher = scheme.matcher(r.requirement)
        logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__)
        versions = self.get_project(r.name)
        if versions:
            # sometimes, versions are invalid
            slist = []
            vcls = matcher.version_class
            for k in versions:
                try:
                    if not matcher.match(k):
                        logger.debug('%s did not match %r', matcher, k)
                    else:
                        if prereleases or not vcls(k).is_prerelease:
                            slist.append(k)
                        else:
                            logger.debug('skipping pre-release '
                                         'version %s of %s', k, matcher.name)
                except Exception:
                    logger.warning('error matching %s with %r', matcher, k)
                    pass # slist.append(k)
            if len(slist) > 1:
                slist = sorted(slist, key=scheme.key)
            if slist:
                logger.debug('sorted list: %s', slist)
                result = versions[slist[-1]]
        if result and r.extras:
            result.extras = r.extras
        self.matcher = None
        return result


class PyPIRPCLocator(Locator):
    """
    This locator uses XML-RPC to locate distributions. It therefore
    cannot be used with simple mirrors (that only mirror file content).
    """
    def __init__(self, url, **kwargs):
        """
        Initialise an instance.

        :param url: The URL to use for XML-RPC.
        :param kwargs: Passed to the superclass constructor.
        """
        super(PyPIRPCLocator, self).__init__(**kwargs)
        self.base_url = url
        self.client = ServerProxy(url, timeout=3.0)

    def get_distribution_names(self):
        """
        Return all the distribution names known to this locator.
        """
        return set(self.client.list_packages())

    def _get_project(self, name):
        result = {}
        versions = self.client.package_releases(name, True)
        for v in versions:
            urls = self.client.release_urls(name, v)
            data = self.client.release_data(name, v)
            metadata = Metadata(scheme=self.scheme)
            metadata.name = data['name']
            metadata.version = data['version']
            metadata.license = data.get('license')
            metadata.keywords = data.get('keywords', [])
            metadata.summary = data.get('summary')
            dist = Distribution(metadata)
            if urls:
                info = urls[0]
                metadata.source_url = info['url']
                dist.digest = self._get_digest(info)
                dist.locator = self
                result[v] = dist
        return result

class PyPIJSONLocator(Locator):
    """
    This locator uses PyPI's JSON interface. It's very limited in functionality
    nad probably not worth using.
    """
    def __init__(self, url, **kwargs):
        super(PyPIJSONLocator, self).__init__(**kwargs)
        self.base_url = ensure_slash(url)

    def get_distribution_names(self):
        """
        Return all the distribution names known to this locator.
        """
        raise NotImplementedError('Not available from this locator')

    def _get_project(self, name):
        result = {}
        url = urljoin(self.base_url, '%s/json' % quote(name))
        try:
            resp = self.opener.open(url)
            data = resp.read().decode() # for now
            d = json.loads(data)
            md = Metadata(scheme=self.scheme)
            data = d['info']
            md.name = data['name']
            md.version = data['version']
            md.license = data.get('license')
            md.keywords = data.get('keywords', [])
            md.summary = data.get('summary')
            dist = Distribution(md)
            urls = d['urls']
            if urls:
                info = urls[0]
                md.source_url = info['url']
                dist.digest = self._get_digest(info)
                dist.locator = self
                result[md.version] = dist
        except Exception as e:
            logger.exception('JSON fetch failed: %s', e)
        return result


class Page(object):
    """
    This class represents a scraped HTML page.
    """
    # The following slightly hairy-looking regex just looks for the contents of
    # an anchor link, which has an attribute "href" either immediately preceded
    # or immediately followed by a "rel" attribute. The attribute values can be
    # declared with double quotes, single quotes or no quotes - which leads to
    # the length of the expression.
    _href = re.compile("""
(rel\s*=\s*(?:"(?P<rel1>[^"]*)"|'(?P<rel2>[^']*)'|(?P<rel3>[^>\s\n]*))\s+)?
href\s*=\s*(?:"(?P<url1>[^"]*)"|'(?P<url2>[^']*)'|(?P<url3>[^>\s\n]*))
(\s+rel\s*=\s*(?:"(?P<rel4>[^"]*)"|'(?P<rel5>[^']*)'|(?P<rel6>[^>\s\n]*)))?
""", re.I | re.S | re.X)
    _base = re.compile(r"""<base\s+href\s*=\s*['"]?([^'">]+)""", re.I | re.S)

    def __init__(self, data, url):
        """
        Initialise an instance with the Unicode page contents and the URL they
        came from.
        """
        self.data = data
        self.base_url = self.url = url
        m = self._base.search(self.data)
        if m:
            self.base_url = m.group(1)

    _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I)

    @cached_property
    def links(self):
        """
        Return the URLs of all the links on a page together with information
        about their "rel" attribute, for determining which ones to treat as
        downloads and which ones to queue for further scraping.
        """
        def clean(url):
            "Tidy up an URL."
            scheme, netloc, path, params, query, frag = urlparse(url)
            return urlunparse((scheme, netloc, quote(path),
                               params, query, frag))

        result = set()
        for match in self._href.finditer(self.data):
            d = match.groupdict('')
            rel = (d['rel1'] or d['rel2'] or d['rel3'] or
                   d['rel4'] or d['rel5'] or d['rel6'])
            url = d['url1'] or d['url2'] or d['url3']
            url = urljoin(self.base_url, url)
            url = unescape(url)
            url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url)
            result.add((url, rel))
        # We sort the result, hoping to bring the most recent versions
        # to the front
        result = sorted(result, key=lambda t: t[0], reverse=True)
        return result


class SimpleScrapingLocator(Locator):
    """
    A locator which scrapes HTML pages to locate downloads for a distribution.
    This runs multiple threads to do the I/O; performance is at least as good
    as pip's PackageFinder, which works in an analogous fashion.
    """

    # These are used to deal with various Content-Encoding schemes.
    decoders = {
        'deflate': zlib.decompress,
        'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(d)).read(),
        'none': lambda b: b,
    }

    def __init__(self, url, timeout=None, num_workers=10, **kwargs):
        """
        Initialise an instance.
        :param url: The root URL to use for scraping.
        :param timeout: The timeout, in seconds, to be applied to requests.
                        This defaults to ``None`` (no timeout specified).
        :param num_workers: The number of worker threads you want to do I/O,
                            This defaults to 10.
        :param kwargs: Passed to the superclass.
        """
        super(SimpleScrapingLocator, self).__init__(**kwargs)
        self.base_url = ensure_slash(url)
        self.timeout = timeout
        self._page_cache = {}
        self._seen = set()
        self._to_fetch = queue.Queue()
        self._bad_hosts = set()
        self.skip_externals = False
        self.num_workers = num_workers
        self._lock = threading.RLock()
        # See issue #45: we need to be resilient when the locator is used
        # in a thread, e.g. with concurrent.futures. We can't use self._lock
        # as it is for coordinating our internal threads - the ones created
        # in _prepare_threads.
        self._gplock = threading.RLock()

    def _prepare_threads(self):
        """
        Threads are created only when get_project is called, and terminate
        before it returns. They are there primarily to parallelise I/O (i.e.
        fetching web pages).
        """
        self._threads = []
        for i in range(self.num_workers):
            t = threading.Thread(target=self._fetch)
            t.setDaemon(True)
            t.start()
            self._threads.append(t)

    def _wait_threads(self):
        """
        Tell all the threads to terminate (by sending a sentinel value) and
        wait for them to do so.
        """
        # Note that you need two loops, since you can't say which
        # thread will get each sentinel
        for t in self._threads:
            self._to_fetch.put(None)    # sentinel
        for t in self._threads:
            t.join()
        self._threads = []

    def _get_project(self, name):
        result = {}
        with self._gplock:
            self.result = result
            self.project_name = name
            url = urljoin(self.base_url, '%s/' % quote(name))
            self._seen.clear()
            self._page_cache.clear()
            self._prepare_threads()
            try:
                logger.debug('Queueing %s', url)
                self._to_fetch.put(url)
                self._to_fetch.join()
            finally:
                self._wait_threads()
            del self.result
        return result

    platform_dependent = re.compile(r'\b(linux-(i\d86|x86_64|arm\w+)|'
                                    r'win(32|-amd64)|macosx-?\d+)\b', re.I)

    def _is_platform_dependent(self, url):
        """
        Does an URL refer to a platform-specific download?
        """
        return self.platform_dependent.search(url)

    def _process_download(self, url):
        """
        See if an URL is a suitable download for a project.

        If it is, register information in the result dictionary (for
        _get_project) about the specific version it's for.

        Note that the return value isn't actually used other than as a boolean
        value.
        """
        if self._is_platform_dependent(url):
            info = None
        else:
            info = self.convert_url_to_download_info(url, self.project_name)
        logger.debug('process_download: %s -> %s', url, info)
        if info:
            with self._lock:    # needed because self.result is shared
                self._update_version_data(self.result, info)
        return info

    def _should_queue(self, link, referrer, rel):
        """
        Determine whether a link URL from a referring page and with a
        particular "rel" attribute should be queued for scraping.
        """
        scheme, netloc, path, _, _, _ = urlparse(link)
        if path.endswith(self.source_extensions + self.binary_extensions +
                         self.excluded_extensions):
            result = False
        elif self.skip_externals and not link.startswith(self.base_url):
            result = False
        elif not referrer.startswith(self.base_url):
            result = False
        elif rel not in ('homepage', 'download'):
            result = False
        elif scheme not in ('http', 'https', 'ftp'):
            result = False
        elif self._is_platform_dependent(link):
            result = False
        else:
            host = netloc.split(':', 1)[0]
            if host.lower() == 'localhost':
                result = False
            else:
                result = True
        logger.debug('should_queue: %s (%s) from %s -> %s', link, rel,
                     referrer, result)
        return result

    def _fetch(self):
        """
        Get a URL to fetch from the work queue, get the HTML page, examine its
        links for download candidates and candidates for further scraping.

        This is a handy method to run in a thread.
        """
        while True:
            url = self._to_fetch.get()
            try:
                if url:
                    page = self.get_page(url)
                    if page is None:    # e.g. after an error
                        continue
                    for link, rel in page.links:
                        if link not in self._seen:
                            self._seen.add(link)
                            if (not self._process_download(link) and
                                self._should_queue(link, url, rel)):
                                logger.debug('Queueing %s from %s', link, url)
                                self._to_fetch.put(link)
            finally:
                # always do this, to avoid hangs :-)
                self._to_fetch.task_done()
            if not url:
                #logger.debug('Sentinel seen, quitting.')
                break

    def get_page(self, url):
        """
        Get the HTML for an URL, possibly from an in-memory cache.

        XXX TODO Note: this cache is never actually cleared. It's assumed that
        the data won't get stale over the lifetime of a locator instance (not
        necessarily true for the default_locator).
        """
        # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api
        scheme, netloc, path, _, _, _ = urlparse(url)
        if scheme == 'file' and os.path.isdir(url2pathname(path)):
            url = urljoin(ensure_slash(url), 'index.html')

        if url in self._page_cache:
            result = self._page_cache[url]
            logger.debug('Returning %s from cache: %s', url, result)
        else:
            host = netloc.split(':', 1)[0]
            result = None
            if host in self._bad_hosts:
                logger.debug('Skipping %s due to bad host %s', url, host)
            else:
                req = Request(url, headers={'Accept-encoding': 'identity'})
                try:
                    logger.debug('Fetching %s', url)
                    resp = self.opener.open(req, timeout=self.timeout)
                    logger.debug('Fetched %s', url)
                    headers = resp.info()
                    content_type = headers.get('Content-Type', '')
                    if HTML_CONTENT_TYPE.match(content_type):
                        final_url = resp.geturl()
                        data = resp.read()
                        encoding = headers.get('Content-Encoding')
                        if encoding:
                            decoder = self.decoders[encoding]   # fail if not found
                            data = decoder(data)
                        encoding = 'utf-8'
                        m = CHARSET.search(content_type)
                        if m:
                            encoding = m.group(1)
                        try:
                            data = data.decode(encoding)
                        except UnicodeError:
                            data = data.decode('latin-1')    # fallback
                        result = Page(data, final_url)
                        self._page_cache[final_url] = result
                except HTTPError as e:
                    if e.code != 404:
                        logger.exception('Fetch failed: %s: %s', url, e)
                except URLError as e:
                    logger.exception('Fetch failed: %s: %s', url, e)
                    with self._lock:
                        self._bad_hosts.add(host)
                except Exception as e:
                    logger.exception('Fetch failed: %s: %s', url, e)
                finally:
                    self._page_cache[url] = result   # even if None (failure)
        return result

    _distname_re = re.compile('<a href=[^>]*>([^<]+)<')

    def get_distribution_names(self):
        """
        Return all the distribution names known to this locator.
        """
        result = set()
        page = self.get_page(self.base_url)
        if not page:
            raise DistlibException('Unable to get %s' % self.base_url)
        for match in self._distname_re.finditer(page.data):
            result.add(match.group(1))
        return result

class DirectoryLocator(Locator):
    """
    This class locates distributions in a directory tree.
    """

    def __init__(self, path, **kwargs):
        """
        Initialise an instance.
        :param path: The root of the directory tree to search.
        :param kwargs: Passed to the superclass constructor,
                       except for:
                       * recursive - if True (the default), subdirectories are
                         recursed into. If False, only the top-level directory
                         is searched,
        """
        self.recursive = kwargs.pop('recursive', True)
        super(DirectoryLocator, self).__init__(**kwargs)
        path = os.path.abspath(path)
        if not os.path.isdir(path):
            raise DistlibException('Not a directory: %r' % path)
        self.base_dir = path

    def should_include(self, filename, parent):
        """
        Should a filename be considered as a candidate for a distribution
        archive? As well as the filename, the directory which contains it
        is provided, though not used by the current implementation.
        """
        return filename.endswith(self.downloadable_extensions)

    def _get_project(self, name):
        result = {}
        for root, dirs, files in os.walk(self.base_dir):
            for fn in files:
                if self.should_include(fn, root):
                    fn = os.path.join(root, fn)
                    url = urlunparse(('file', '',
                                      pathname2url(os.path.abspath(fn)),
                                      '', '', ''))
                    info = self.convert_url_to_download_info(url, name)
                    if info:
                        self._update_version_data(result, info)
            if not self.recursive:
                break
        return result

    def get_distribution_names(self):
        """
        Return all the distribution names known to this locator.
        """
        result = set()
        for root, dirs, files in os.walk(self.base_dir):
            for fn in files:
                if self.should_include(fn, root):
                    fn = os.path.join(root, fn)
                    url = urlunparse(('file', '',
                                      pathname2url(os.path.abspath(fn)),
                                      '', '', ''))
                    info = self.convert_url_to_download_info(url, None)
                    if info:
                        result.add(info['name'])
            if not self.recursive:
                break
        return result

class JSONLocator(Locator):
    """
    This locator uses special extended metadata (not available on PyPI) and is
    the basis of performant dependency resolution in distlib. Other locators
    require archive downloads before dependencies can be determined! As you
    might imagine, that can be slow.
    """
    def get_distribution_names(self):
        """
        Return all the distribution names known to this locator.
        """
        raise NotImplementedError('Not available from this locator')

    def _get_project(self, name):
        result = {}
        data = get_project_data(name)
        if data:
            for info in data.get('files', []):
                if info['ptype'] != 'sdist' or info['pyversion'] != 'source':
                    continue
                # We don't store summary in project metadata as it makes
                # the data bigger for no benefit during dependency
                # resolution
                dist = make_dist(data['name'], info['version'],
                                 summary=data.get('summary',
                                                  'Placeholder for summary'),
                                 scheme=self.scheme)
                md = dist.metadata
                md.source_url = info['url']
                # TODO SHA256 digest
                if 'digest' in info and info['digest']:
                    dist.digest = ('md5', info['digest'])
                md.dependencies = info.get('requirements', {})
                dist.exports = info.get('exports', {})
                result[dist.version] = dist
        return result

class DistPathLocator(Locator):
    """
    This locator finds installed distributions in a path. It can be useful for
    adding to an :class:`AggregatingLocator`.
    """
    def __init__(self, distpath, **kwargs):
        """
        Initialise an instance.

        :param distpath: A :class:`DistributionPath` instance to search.
        """
        super(DistPathLocator, self).__init__(**kwargs)
        assert isinstance(distpath, DistributionPath)
        self.distpath = distpath

    def _get_project(self, name):
        dist = self.distpath.get_distribution(name)
        if dist is None:
            result = {}
        else:
            result = { dist.version: dist }
        return result


class AggregatingLocator(Locator):
    """
    This class allows you to chain and/or merge a list of locators.
    """
    def __init__(self, *locators, **kwargs):
        """
        Initialise an instance.

        :param locators: The list of locators to search.
        :param kwargs: Passed to the superclass constructor,
                       except for:
                       * merge - if False (the default), the first successful
                         search from any of the locators is returned. If True,
                         the results from all locators are merged (this can be
                         slow).
        """
        self.merge = kwargs.pop('merge', False)
        self.locators = locators
        super(AggregatingLocator, self).__init__(**kwargs)

    def clear_cache(self):
        super(AggregatingLocator, self).clear_cache()
        for locator in self.locators:
            locator.clear_cache()

    def _set_scheme(self, value):
        self._scheme = value
        for locator in self.locators:
            locator.scheme = value

    scheme = property(Locator.scheme.fget, _set_scheme)

    def _get_project(self, name):
        result = {}
        for locator in self.locators:
            d = locator.get_project(name)
            if d:
                if self.merge:
                    result.update(d)
                else:
                    # See issue #18. If any dists are found and we're looking
                    # for specific constraints, we only return something if
                    # a match is found. For example, if a DirectoryLocator
                    # returns just foo (1.0) while we're looking for
                    # foo (>= 2.0), we'll pretend there was nothing there so
                    # that subsequent locators can be queried. Otherwise we
                    # would just return foo (1.0) which would then lead to a
                    # failure to find foo (>= 2.0), because other locators
                    # weren't searched. Note that this only matters when
                    # merge=False.
                    if self.matcher is None:
                        found = True
                    else:
                        found = False
                        for k in d:
                            if self.matcher.match(k):
                                found = True
                                break
                    if found:
                        result = d
                        break
        return result

    def get_distribution_names(self):
        """
        Return all the distribution names known to this locator.
        """
        result = set()
        for locator in self.locators:
            try:
                result |= locator.get_distribution_names()
            except NotImplementedError:
                pass
        return result


# We use a legacy scheme simply because most of the dists on PyPI use legacy
# versions which don't conform to PEP 426 / PEP 440.
default_locator = AggregatingLocator(
                    JSONLocator(),
                    SimpleScrapingLocator('https://pypi.python.org/simple/',
                                          timeout=3.0),
                    scheme='legacy')

locate = default_locator.locate

NAME_VERSION_RE = re.compile(r'(?P<name>[\w-]+)\s*'
                             r'\(\s*(==\s*)?(?P<ver>[^)]+)\)$')

class DependencyFinder(object):
    """
    Locate dependencies for distributions.
    """

    def __init__(self, locator=None):
        """
        Initialise an instance, using the specified locator
        to locate distributions.
        """
        self.locator = locator or default_locator
        self.scheme = get_scheme(self.locator.scheme)

    def add_distribution(self, dist):
        """
        Add a distribution to the finder. This will update internal information
        about who provides what.
        :param dist: The distribution to add.
        """
        logger.debug('adding distribution %s', dist)
        name = dist.key
        self.dists_by_name[name] = dist
        self.dists[(name, dist.version)] = dist
        for p in dist.provides:
            name, version = parse_name_and_version(p)
            logger.debug('Add to provided: %s, %s, %s', name, version, dist)
            self.provided.setdefault(name, set()).add((version, dist))

    def remove_distribution(self, dist):
        """
        Remove a distribution from the finder. This will update internal
        information about who provides what.
        :param dist: The distribution to remove.
        """
        logger.debug('removing distribution %s', dist)
        name = dist.key
        del self.dists_by_name[name]
        del self.dists[(name, dist.version)]
        for p in dist.provides:
            name, version = parse_name_and_version(p)
            logger.debug('Remove from provided: %s, %s, %s', name, version, dist)
            s = self.provided[name]
            s.remove((version, dist))
            if not s:
                del self.provided[name]

    def get_matcher(self, reqt):
        """
        Get a version matcher for a requirement.
        :param reqt: The requirement
        :type reqt: str
        :return: A version matcher (an instance of
                 :class:`distlib.version.Matcher`).
        """
        try:
            matcher = self.scheme.matcher(reqt)
        except UnsupportedVersionError:
            # XXX compat-mode if cannot read the version
            name = reqt.split()[0]
            matcher = self.scheme.matcher(name)
        return matcher

    def find_providers(self, reqt):
        """
        Find the distributions which can fulfill a requirement.

        :param reqt: The requirement.
         :type reqt: str
        :return: A set of distribution which can fulfill the requirement.
        """
        matcher = self.get_matcher(reqt)
        name = matcher.key   # case-insensitive
        result = set()
        provided = self.provided
        if name in provided:
            for version, provider in provided[name]:
                try:
                    match = matcher.match(version)
                except UnsupportedVersionError:
                    match = False

                if match:
                    result.add(provider)
                    break
        return result

    def try_to_replace(self, provider, other, problems):
        """
        Attempt to replace one provider with another. This is typically used
        when resolving dependencies from multiple sources, e.g. A requires
        (B >= 1.0) while C requires (B >= 1.1).

        For successful replacement, ``provider`` must meet all the requirements
        which ``other`` fulfills.

        :param provider: The provider we are trying to replace with.
        :param other: The provider we're trying to replace.
        :param problems: If False is returned, this will contain what
                         problems prevented replacement. This is currently
                         a tuple of the literal string 'cantreplace',
                         ``provider``, ``other``  and the set of requirements
                         that ``provider`` couldn't fulfill.
        :return: True if we can replace ``other`` with ``provider``, else
                 False.
        """
        rlist = self.reqts[other]
        unmatched = set()
        for s in rlist:
            matcher = self.get_matcher(s)
            if not matcher.match(provider.version):
                unmatched.add(s)
        if unmatched:
            # can't replace other with provider
            problems.add(('cantreplace', provider, other, unmatched))
            result = False
        else:
            # can replace other with provider
            self.remove_distribution(other)
            del self.reqts[other]
            for s in rlist:
                self.reqts.setdefault(provider, set()).add(s)
            self.add_distribution(provider)
            result = True
        return result

    def find(self, requirement, meta_extras=None, prereleases=False):
        """
        Find a distribution and all distributions it depends on.

        :param requirement: The requirement specifying the distribution to
                            find, or a Distribution instance.
        :param meta_extras: A list of meta extras such as :test:, :build: and
                            so on.
        :param prereleases: If ``True``, allow pre-release versions to be
                            returned - otherwise, don't return prereleases
                            unless they're all that's available.

        Return a set of :class:`Distribution` instances and a set of
        problems.

        The distributions returned should be such that they have the
        :attr:`required` attribute set to ``True`` if they were
        from the ``requirement`` passed to ``find()``, and they have the
        :attr:`build_time_dependency` attribute set to ``True`` unless they
        are post-installation dependencies of the ``requirement``.

        The problems should be a tuple consisting of the string
        ``'unsatisfied'`` and the requirement which couldn't be satisfied
        by any distribution known to the locator.
        """

        self.provided = {}
        self.dists = {}
        self.dists_by_name = {}
        self.reqts = {}

        meta_extras = set(meta_extras or [])
        if ':*:' in meta_extras:
            meta_extras.remove(':*:')
            # :meta: and :run: are implicitly included
            meta_extras |= set([':test:', ':build:', ':dev:'])

        if isinstance(requirement, Distribution):
            dist = odist = requirement
            logger.debug('passed %s as requirement', odist)
        else:
            dist = odist = self.locator.locate(requirement,
                                               prereleases=prereleases)
            if dist is None:
                raise DistlibException('Unable to locate %r' % requirement)
            logger.debug('located %s', odist)
        dist.requested = True
        problems = set()
        todo = set([dist])
        install_dists = set([odist])
        while todo:
            dist = todo.pop()
            name = dist.key     # case-insensitive
            if name not in self.dists_by_name:
                self.add_distribution(dist)
            else:
                #import pdb; pdb.set_trace()
                other = self.dists_by_name[name]
                if other != dist:
                    self.try_to_replace(dist, other, problems)

            ireqts = dist.run_requires | dist.meta_requires
            sreqts = dist.build_requires
            ereqts = set()
            if dist in install_dists:
                for key in ('test', 'build', 'dev'):
                    e = ':%s:' % key
                    if e in meta_extras:
                        ereqts |= getattr(dist, '%s_requires' % key)
            all_reqts = ireqts | sreqts | ereqts
            for r in all_reqts:
                providers = self.find_providers(r)
                if not providers:
                    logger.debug('No providers found for %r', r)
                    provider = self.locator.locate(r, prereleases=prereleases)
                    # If no provider is found and we didn't consider
                    # prereleases, consider them now.
                    if provider is None and not prereleases:
                        provider = self.locator.locate(r, prereleases=True)
                    if provider is None:
                        logger.debug('Cannot satisfy %r', r)
                        problems.add(('unsatisfied', r))
                    else:
                        n, v = provider.key, provider.version
                        if (n, v) not in self.dists:
                            todo.add(provider)
                        providers.add(provider)
                        if r in ireqts and dist in install_dists:
                            install_dists.add(provider)
                            logger.debug('Adding %s to install_dists',
                                         provider.name_and_version)
                for p in providers:
                    name = p.key
                    if name not in self.dists_by_name:
                        self.reqts.setdefault(p, set()).add(r)
                    else:
                        other = self.dists_by_name[name]
                        if other != p:
                            # see if other can be replaced by p
                            self.try_to_replace(p, other, problems)

        dists = set(self.dists.values())
        for dist in dists:
            dist.build_time_dependency = dist not in install_dists
            if dist.build_time_dependency:
                logger.debug('%s is a build-time dependency only.',
                             dist.name_and_version)
        logger.debug('find done for %s', odist)
        return dists, problems
site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-33.pyc000064400000073165151733463560023302 0ustar00�
7�Re2dc-@s�dZddlZddlZddlZddlmZddlZddlZddlZddl	m
Z
yddlZdcZ
Wnek
r�ddZ
YnXyddlmZWnek
r�dZYnXyddlmZWnek
r�dZYnXdd	d
ddd
dddddddddddddddgZGdd�de�ZGdd�de�ZGdd�de�ZGd d!�d!e�ZGd"d#�d#e�ZyeWnek
r�dZYnXded&d�Zd'd(�Z d)d	�Z!d*d
�Z"d+d�Z#d,d�Z$d-d
�Z%d.d�Z&ddde%ddd/d�Z'dddd0d�Z(d1d2�Z)d3d�Z*d4d5�Z+d6d7�Z,d8d9�Z-d:dddddd;d<�Z.ddddd=d>�Z/dddd?d@�Z0ie.dfgdBfdC6e.dggdEfdF6e.dhgdGfdH6e0gdIfdJ6Z1e
rOe.digdEfe1dF<ndKd�Z2ddLdMd�Z3dNd�Z4ddddddddOd�Z5dPd�Z6dQdR�Z7ddLdSd�Z8dTd�Z9dUdV�Z:dWdX�Z;dYdZ�Z<id[d\ge<gdBfdC6d]ge<gdGfdH6d^ge;gdIfdJ6Z=e
rad_ge<gdEfe=dF<nd`da�Z>dddbd�Z?dS(ju�Utility functions for copying and archiving files and directory trees.

XXX The functions here don't copy the resource fork or other metadata on Mac.

iN(uabspathi(utarfile(ugetpwnam(ugetgrnamucopyfileobjucopyfileucopymodeucopystatucopyucopy2ucopytreeumoveurmtreeuErroruSpecialFileErroru	ExecErrorumake_archiveuget_archive_formatsuregister_archive_formatuunregister_archive_formatuget_unpack_formatsuregister_unpack_formatuunregister_unpack_formatuunpack_archiveuignore_patternscBs|EeZdZdS(uErrorN(u__name__u
__module__u__qualname__(u
__locals__((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyuError,scBs|EeZdZdZdS(uSpecialFileErroru|Raised when trying to do a kind of operation (e.g. copying) which is
    not supported on a special file (e.g. a named pipe)N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyuSpecialFileError/scBs|EeZdZdZdS(u	ExecErroru+Raised when a command could not be executedN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyu	ExecError3scBs|EeZdZdZdS(u	ReadErroru%Raised when an archive cannot be readN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyu	ReadError6su	ReadErrorcBs|EeZdZdZdS(u
RegistryErroruXRaised when a registery operation with the archiving
    and unpacking registeries failsN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyu
RegistryError9su
RegistryErroriicCs0x)|j|�}|sPn|j|�qdS(u=copy data from file-like object fsrc to file-like object fdstN(ureaduwrite(ufsrcufdstulengthubuf((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyucopyfileobjCs
cCsttjd�rEytjj||�SWqEtk
rAdSYqEXntjjtjj|��tjjtjj|��kS(NusamefileF(uhasattruosupathusamefileuOSErroruFalseunormcaseuabspath(usrcudst((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyu	_samefileKs
u	_samefilecCs�t||�r(td||f��nxa||gD]S}ytj|�}Wntk
rbYq5Xtj|j�r5td|��q5q5Wt|d��,}t|d��}t	||�WdQXWdQXdS(uCopy data from src to dstu`%s` and `%s` are the same fileu`%s` is a named pipeurbuwbN(
u	_samefileuErroruosustatuOSErroruS_ISFIFOust_modeuSpecialFileErroruopenucopyfileobj(usrcudstufnustufsrcufdst((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyucopyfileWs
cCsGttd�rCtj|�}tj|j�}tj||�ndS(uCopy mode bits from src to dstuchmodN(uhasattruosustatuS_IMODEust_modeuchmod(usrcudstustumode((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyucopymodekscCs�tj|�}tj|j�}ttd�rOtj||j|jf�nttd�rqtj||�nttd�r�t|d�r�ytj	||j
�Wq�tk
r�}z-ttd�s�|jtj
kr��nWYdd}~Xq�XndS(uCCopy all stat info (mode bits, atime, mtime, flags) from src to dstuutimeuchmoduchflagsust_flagsu
EOPNOTSUPPN(uosustatuS_IMODEust_modeuhasattruutimeust_atimeust_mtimeuchmoduchflagsust_flagsuOSErroruerrnou
EOPNOTSUPP(usrcudstustumodeuwhy((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyucopystatrscCsTtjj|�r6tjj|tjj|��}nt||�t||�dS(uVCopy data and mode bits ("cp src dst").

    The destination may be a directory.

    N(uosupathuisdirujoinubasenameucopyfileucopymode(usrcudst((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyucopy�s$
cCsTtjj|�r6tjj|tjj|��}nt||�t||�dS(u]Copy data and all stat info ("cp -p src dst").

    The destination may be a directory.

    N(uosupathuisdirujoinubasenameucopyfileucopystat(usrcudst((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyucopy2�s$
cs�fdd�}|S(u�Function that can be used as copytree() ignore parameter.

    Patterns is a sequence of glob-style patterns
    that are used to exclude filescs:g}x'�D]}|jtj||��q
Wt|�S(N(uextendufnmatchufilteruset(upathunamesu
ignored_namesupattern(upatterns(u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyu_ignore_patterns�s
u)ignore_patterns.<locals>._ignore_patterns((upatternsu_ignore_patterns((upatternsu=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyuignore_patterns�scCsCtj|�}|dk	r-|||�}n	t�}tj|�g}xk|D]c}	|	|krhqPntjj||	�}
tjj||	�}y�tjj|
�r�tj|
�}|r�tj	||�q6tjj
|�r�|r�wPn||
|�n8tjj|
�r)t|
||||�n
||
|�WqPt
k
rr}
z|j|
jd�WYdd}
~
XqPtk
r�}z!|j|
|t|�f�WYdd}~XqPXqPWyt||�Wn_tk
r)}z?tdk	r�t|t�r�n|j||t|�f�WYdd}~XnX|r?t
|��ndS(u�Recursively copy a directory tree.

    The destination directory must not already exist.
    If exception(s) occur, an Error is raised with a list of reasons.

    If the optional symlinks flag is true, symbolic links in the
    source tree result in symbolic links in the destination tree; if
    it is false, the contents of the files pointed to by symbolic
    links are copied. If the file pointed by the symlink doesn't
    exist, an exception will be added in the list of errors raised in
    an Error exception at the end of the copy process.

    You can set the optional ignore_dangling_symlinks flag to true if you
    want to silence this exception. Notice that this has no effect on
    platforms that don't support os.symlink.

    The optional ignore argument is a callable. If given, it
    is called with the `src` parameter, which is the directory
    being visited by copytree(), and `names` which is the list of
    `src` contents, as returned by os.listdir():

        callable(src, names) -> ignored_names

    Since copytree() is called recursively, the callable will be
    called once for each directory that is copied. It returns a
    list of names relative to the `src` directory that should
    not be copied.

    The optional copy_function argument is a callable that will be used
    to copy each file. It will be called with the source path and the
    destination path as arguments. By default, copy2() is used, but any
    function that supports the same signature (like copy()) can be used.

    iN(uosulistdiruNoneusetumakedirsupathujoinuislinkureadlinkusymlinkuexistsuisdirucopytreeuErroruextenduargsuEnvironmentErroruappendustrucopystatuOSErroruWindowsErroru
isinstance(usrcudstusymlinksuignoreu
copy_functionuignore_dangling_symlinksunamesu
ignored_namesuerrorsunameusrcnameudstnameulinktouerruwhy((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyucopytree�sD$	

&3/c$Cs�|rdd�}n|dkr0dd�}ny%tjj|�rTtd��nWn2tk
r�|tjj|tj��dSYnXg}ytj|�}Wn.tjk
r�|tj|tj��YnXx�|D]�}tjj	||�}ytj
|�j}Wntjk
r)d}YnXtj
|�rLt|||�q�ytj|�Wq�tjk
r�|tj|tj��Yq�Xq�Wytj|�Wn.tjk
r�|tj|tj��YnXdS(u�Recursively delete a directory tree.

    If ignore_errors is set, errors are ignored; otherwise, if onerror
    is set, it is called to handle the error with arguments (func,
    path, exc_info) where func is os.listdir, os.remove, or os.rmdir;
    path is the argument to that function that caused it to fail; and
    exc_info is a tuple returned by sys.exc_info().  If ignore_errors
    is false and onerror is None, an exception is raised.

    cWsdS(N((uargs((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyuonerrorsurmtree.<locals>.onerrorcWs�dS(N((uargs((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyuonerrorsu%Cannot call rmtree on a symbolic linkNi(uNoneuosupathuislinkuOSErrorusysuexc_infoulistdiruerrorujoinulstatust_modeustatuS_ISDIRurmtreeuremoveurmdir(upathu
ignore_errorsuonerrorunamesunameufullnameumode((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyurmtree�s>
	
"cCstjj|jtjj��S(N(uosupathubasenameurstripusep(upath((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyu	_basename'su	_basenamecCs|}tjj|�r~t||�r;tj||�dStjj|t|��}tjj|�r~td|��q~nytj||�Wn�t	k
rtjj|�r�t
||�r�td||f��nt||dd�t
|�nt||�tj|�YnXdS(u�Recursively move a file or directory to another location. This is
    similar to the Unix "mv" command.

    If the destination is a directory or a symlink to a directory, the source
    is moved inside the directory. The destination path must not already
    exist.

    If the destination already exists but is not a directory, it may be
    overwritten depending on os.rename() semantics.

    If the destination is on our current filesystem, then rename() is used.
    Otherwise, src is copied to the destination and then removed.
    A lot more could be done here...  A look at a mv.c shows a lot of
    the issues this implementation glosses over.

    Nu$Destination path '%s' already existsu.Cannot move a directory '%s' into itself '%s'.usymlinksT(uosupathuisdiru	_samefileurenameujoinu	_basenameuexistsuErroruOSErroru
_destinsrcucopytreeuTrueurmtreeucopy2uunlink(usrcudstureal_dst((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyumove,s$


cCsut|�}t|�}|jtjj�s@|tjj7}n|jtjj�sh|tjj7}n|j|�S(N(uabspathuendswithuosupathusepu
startswith(usrcudst((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyu
_destinsrcTsu
_destinsrccCs_tdks|dkrdSyt|�}Wntk
rFd}YnX|dk	r[|dSdS(u"Returns a gid, given a group name.iN(ugetgrnamuNoneuKeyError(unameuresult((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyu_get_gid]s
u_get_gidcCs_tdks|dkrdSyt|�}Wntk
rFd}YnX|dk	r[|dSdS(u"Returns an uid, given a user name.iN(ugetpwnamuNoneuKeyError(unameuresult((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyu_get_uidis
u_get_uidugzipcsidd6dd6}idd6}	tr>d|d<d|	d<n|dk	rn||	krntdj|���n|d	|	j|d�}
tjj|
�}tjj|�s�|dk	r�|j	d
|�n|s�tj
|�q�n|dk	r|j	d�nt���t�������fdd
�}|s{t
j|
d||�}
z|
j|d|�Wd|
j�Xn|
S(u�Create a (possibly compressed) tar file from all the files under
    'base_dir'.

    'compress' must be "gzip" (the default), "bzip2", or None.

    'owner' and 'group' can be used to define an owner and a group for the
    archive that is being built. If not provided, the current owner and group
    will be used.

    The output tar file will be named 'base_name' +  ".tar", possibly plus
    the appropriate compression extension (".gz", or ".bz2").

    Returns the output filename.
    ugzugzipuu.gzubz2ubzip2u.bz2uCbad value for 'compress', or compression format not supported : {0}u.tarucreating %suCreating tar archivecsF�dk	r!�|_�|_n�dk	rB�|_�|_n|S(N(uNoneugidugnameuuiduuname(utarinfo(ugidugroupuowneruuid(u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyu_set_uid_gid�s		u#_make_tarball.<locals>._set_uid_giduw|%sufilterN(uNoneu_BZ2_SUPPORTEDu
ValueErroruformatugetuosupathudirnameuexistsuinfoumakedirsu_get_uidu_get_gidutarfileuopenuadduclose(u	base_nameubase_dirucompressuverboseudry_runuownerugroupuloggerutar_compressionucompress_extuarchive_nameuarchive_diru_set_uid_gidutar((ugidugroupuowneruuidu=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyu
_make_tarballus4


		u
_make_tarballcCs~|rd}nd}ddlm}ddlm}y |d|||gd|�Wn"|k
rytd�|�YnXdS(	Nu-ru-rqi(uDistutilsExecError(uspawnuzipudry_runukunable to create zip file '%s': could neither import the 'zipfile' module nor find a standalone zip utility(udistutils.errorsuDistutilsExecErrorudistutils.spawnuspawnu	ExecError(ubase_diruzip_filenameuverboseudry_runu
zipoptionsuDistutilsExecErroruspawn((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyu_call_external_zip�s	 
	u_call_external_zipcCs�|d}tjj|�}tjj|�sf|dk	rM|jd|�n|sftj|�qfnyddl}Wntk
r�d}YnX|dkr�t	||||�n�|dk	r�|jd||�n|s�|j
|dd|j�}x�tj|�D]�\}	}
}xs|D]k}tjj
tjj|	|��}
tjj|
�r|j|
|
�|dk	r�|jd|
�q�qqWqW|j�n|S(	umCreate a zip file from all the files under 'base_dir'.

    The output zip file will be named 'base_name' + ".zip".  Uses either the
    "zipfile" Python module (if available) or the InfoZIP "zip" utility
    (if installed and found on the default search path).  If neither tool is
    available, raises ExecError.  Returns the name of the output zip
    file.
    u.zipucreating %siNu#creating '%s' and adding '%s' to ituwucompressionuadding '%s'(uosupathudirnameuexistsuNoneuinfoumakedirsuzipfileuImportErroru_call_external_zipuZipFileuZIP_DEFLATEDuwalkunormpathujoinuisfileuwriteuclose(u	base_nameubase_diruverboseudry_runuloggeruzip_filenameuarchive_diruzipfileuzipudirpathudirnamesu	filenamesunameupath((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyu
_make_zipfile�s8	

	

!
u
_make_zipfileucompressugzip'ed tar-fileugztarubzip2ubzip2'ed tar-fileubztaruuncompressed tar fileutaruZIP fileuzipcCs'dd�tj�D�}|j�|S(u�Returns a list of supported formats for archiving and unarchiving.

    Each element of the returned sequence is a tuple (name, description)
    cSs&g|]\}}||df�qS(i((u.0unameuregistry((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyu
<listcomp>s	u'get_archive_formats.<locals>.<listcomp>(u_ARCHIVE_FORMATSuitemsusort(uformats((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyuget_archive_formats�s	
ucCs�|dkrg}nt|tj�s:td|��nt|ttf�s^td��nxE|D]=}t|ttf�s�t|�dkretd��qeqeW|||ft|<dS(uuRegisters an archive format.

    name is the name of the format. function is the callable that will be
    used to create archives. If provided, extra_args is a sequence of
    (name, value) tuples that will be passed as arguments to the callable.
    description can be provided to describe the format, and will be returned
    by the get_archive_formats() function.
    uThe %s object is not callableu!extra_args needs to be a sequenceiu+extra_args elements are : (arg_name, value)N(	uNoneu
isinstanceucollectionsuCallableu	TypeErrorutupleulistulenu_ARCHIVE_FORMATS(unameufunctionu
extra_argsudescriptionuelement((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyuregister_archive_formats		
(cCst|=dS(N(u_ARCHIVE_FORMATS(uname((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyuunregister_archive_formatsc	Csltj�}	|d
k	rb|d
k	r7|jd|�ntjj|�}|sbtj|�qbn|d
krztj}ni|d6|d6}
yt|}Wn"t	k
r�t
d|��YnX|d}x"|dD]\}
}||
|
<q�W|dkr||
d<||
d	<nz||||
�}Wd
|d
k	rg|d
k	rW|jd|	�ntj|	�nX|S(u�Create an archive file (eg. zip or tar).

    'base_name' is the name of the file to create, minus any format-specific
    extension; 'format' is the archive format: one of "zip", "tar", "bztar"
    or "gztar".

    'root_dir' is a directory that will be the root directory of the
    archive; ie. we typically chdir into 'root_dir' before creating the
    archive.  'base_dir' is the directory where we start archiving from;
    ie. 'base_dir' will be the common prefix of all files and
    directories in the archive.  'root_dir' and 'base_dir' both default
    to the current directory.  Returns the name of the archive file.

    'owner' and 'group' are used when creating a tar archive. By default,
    uses the current owner and group.
    uchanging into '%s'udry_runuloggeruunknown archive format '%s'iiuzipuownerugroupNuchanging back to '%s'(uosugetcwduNoneudebugupathuabspathuchdirucurdiru_ARCHIVE_FORMATSuKeyErroru
ValueError(u	base_nameuformaturoot_dirubase_diruverboseudry_runuownerugroupuloggerusave_cwdukwargsuformat_infoufuncuarguvalufilename((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyumake_archive s6



cCs'dd�tj�D�}|j�|S(u�Returns a list of supported formats for unpacking.

    Each element of the returned sequence is a tuple
    (name, extensions, description)
    cSs-g|]#\}}||d|df�qS(ii((u.0unameuinfo((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyu
<listcomp>]s	u&get_unpack_formats.<locals>.<listcomp>(u_UNPACK_FORMATSuitemsusort(uformats((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyuget_unpack_formatsWs	
c	Cs�i}x9tj�D]+\}}x|dD]}|||<q*WqWx=|D]5}||krId}t||||f��qIqIWt|tj�s�td��ndS(u+Checks what gets registered as an unpacker.iu!%s is already registered for "%s"u*The registered function must be a callableN(u_UNPACK_FORMATSuitemsu
RegistryErroru
isinstanceucollectionsuCallableu	TypeError(	u
extensionsufunctionu
extra_argsuexisting_extensionsunameuinfouextu	extensionumsg((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyu_check_unpack_optionsbs
	u_check_unpack_optionscCs?|dkrg}nt|||�||||ft|<dS(uMRegisters an unpack format.

    `name` is the name of the format. `extensions` is a list of extensions
    corresponding to the format.

    `function` is the callable that will be
    used to unpack archives. The callable will receive archives to unpack.
    If it's unable to handle an archive, it needs to raise a ReadError
    exception.

    If provided, `extra_args` is a sequence of
    (name, value) tuples that will be passed as arguments to the callable.
    description can be provided to describe the format, and will be returned
    by the get_unpack_formats() function.
    N(uNoneu_check_unpack_optionsu_UNPACK_FORMATS(unameu
extensionsufunctionu
extra_argsudescription((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyuregister_unpack_formatts	cCst|=dS(u+Removes the pack format from the registery.N(u_UNPACK_FORMATS(uname((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyuunregister_unpack_format�scCs8tjj|�}tjj|�s4tj|�ndS(u1Ensure that the parent directory of `path` existsN(uosupathudirnameuisdirumakedirs(upathudirname((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyu_ensure_directory�su_ensure_directoryc	CsByddl}Wntk
r0td��YnX|j|�sStd|��n|j|�}z�x�|j�D]�}|j}|jd�srd|kr�qrntj	j
||jd��}|s�qrnt|�|j
d�sr|j|j�}t|d�}z|j|�Wd|j�~XqrqrWWd|j�XdS(u+Unpack zip `filename` to `extract_dir`
    iNu/zlib not supported, cannot unpack this archive.u%s is not a zip fileu/u..uwb(uzipfileuImportErroru	ReadErroru
is_zipfileuZipFileuinfolistufilenameu
startswithuosupathujoinusplitu_ensure_directoryuendswithureaduopenuwriteuclose(	ufilenameuextract_diruzipfileuzipuinfounameutargetudatauf((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyu_unpack_zipfile�s0
	

u_unpack_zipfilecCs^ytj|�}Wn%tjk
r:td|��YnXz|j|�Wd|j�XdS(u:Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir`
    u/%s is not a compressed or uncompressed tar fileN(utarfileuopenuTarErroru	ReadErroru
extractalluclose(ufilenameuextract_dirutarobj((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyu_unpack_tarfile�su_unpack_tarfileu.tar.gzu.tgzu.taru.zipu.bz2cCsIxBtj�D]4\}}x%|dD]}|j|�r$|Sq$Wq
WdS(Ni(u_UNPACK_FORMATSuitemsuendswithuNone(ufilenameunameuinfou	extension((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyu_find_unpack_format�s
u_find_unpack_formatcCs�|dkrtj�}n|dk	r�yt|}Wn'tk
r^tdj|���YnX|d}|||t|d��nbt|�}|dkr�t	dj|���nt|d}tt|d�}||||�dS(u�Unpack an archive.

    `filename` is the name of the archive.

    `extract_dir` is the name of the target directory, where the archive
    is unpacked. If not provided, the current working directory is used.

    `format` is the archive format: one of "zip", "tar", or "gztar". Or any
    other registered format. If not provided, unpack_archive will use the
    filename extension and see if an unpacker was registered for that
    extension.

    In case none is found, a ValueError is raised.
    uUnknown unpack format '{0}'iiuUnknown archive format '{0}'N(
uNoneuosugetcwdu_UNPACK_FORMATSuKeyErroru
ValueErroruformatudictu_find_unpack_formatu	ReadError(ufilenameuextract_diruformatuformat_infoufuncukwargs((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyuunpack_archive�s

TFi@(ucompressugzip(ucompressubzip2(ucompressN(ucompressubzip2(@u__doc__uosusysustatuos.pathuabspathufnmatchucollectionsuerrnouutarfileubz2uTrueu_BZ2_SUPPORTEDuImportErroruFalseupwdugetpwnamuNoneugrpugetgrnamu__all__uEnvironmentErroruErroruSpecialFileErroru	ExecErroru	ReadErroru	Exceptionu
RegistryErroruWindowsErroru	NameErrorucopyfileobju	_samefileucopyfileucopymodeucopystatucopyucopy2uignore_patternsucopytreeurmtreeu	_basenameumoveu
_destinsrcu_get_gidu_get_uidu
_make_tarballu_call_external_zipu
_make_zipfileu_ARCHIVE_FORMATSuget_archive_formatsuregister_archive_formatuunregister_archive_formatumake_archiveuget_unpack_formatsu_check_unpack_optionsuregister_unpack_formatuunregister_unpack_formatu_ensure_directoryu_unpack_zipfileu_unpack_tarfileu_UNPACK_FORMATSu_find_unpack_formatuunpack_archive(((u=/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/shutil.pyu<module>
s�



	
	Q1(		=/	
	6%
site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-33.pyc000064400000000700151733463560023512 0ustar00�
7�Rec@s
dZdS(uModules copied from Python 3 standard libraries, for internal use only.

Individual classes and functions are found in d2._backport.misc.  Intended
usage is to always import things missing from 3.1 from that module: the
built-in/stdlib objects will be used if found.
N(u__doc__(((u?/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/__init__.pyu<module>ssite-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-33.pyc000064400000272577151733463560023430 0ustar00�
7�Re�ic@sXddlmZdZdZdZdZdZdZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZyddlZddlZWnek
r�eZZYnXeefZyeef7ZWnek
rYnXd	d
ddgZejdd
kr5ddlZnddlZejZdZdZ e dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2d Z3d!Z4d"Z5dZ6d#Z7d$Z8e7Z9e'e(e)e*e-e.e/e+e,e0e1e2fZ:e'e(e/e2fZ;e0e1e2fZ<d%d&d'd(d)d*d+d,fZ=e>d%d&d+d,f�Z?ie@d-6e@d.6e@d(6eAd)6eAd*6eAd'6ZBd/ZCd0ZDd1ZEd2ZFd3ZGd4ZHd5ZId6ZJdZKd7ZLd8ZMd9ZNd:ZOd;ZPd<ZQd=ZRd$ZSd#ZTe	jUd>d?fkr+d@ZVnejW�ZVdAdB�ZXdCdD�ZYdEdF�ZZd<e9dGdH�Z[dIdJ�Z\edKdL�Z]eCdMfeDdNfeEdOfeFdPfeGdQfeHdRffeLdSffeMdTffeNeIBdUfeIdVfeNdWffeOdSffePdTffeQeJBdUfeJdVfeQdWffeRdSffeSdTffeTeKBdXfeKdYfeTdWfff
Z^dZd[�Z_Gd\d�de`�ZaGd]d^�d^ea�ZbGd_d`�d`ea�ZcGdadb�dbea�ZdGdcdd�ddea�ZeGdedf�dfea�ZfGdgdh�dhef�ZgGdidj�djef�ZhGdkdl�dlef�ZiGdmdn�dnef�ZjGdodp�dpef�ZkGdqdr�drel�ZmGdsdt�dtel�ZnGdudv�dvel�ZoGdwdx�dxel�ZpGdydz�dzel�ZqGd{d|�d|el�ZrGd}d
�d
el�ZsGd~d	�d	el�ZtGdd��d�el�Zud�d�ZveZwetjZdS(�i(uprint_functionu
$Revision$u0.9.0u"Lars Gustäbel (lars@gustaebel.de)u5$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $u?$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $u4Gustavo Niemeyer, Niels Gustäbel, Richard Townsend.NuTarFileuTarInfou
is_tarfileuTarErrorisiisustar  sustar00idi�s0s1s2s3s4s5s6s7sLsKsSsxsgsXiiupathulinkpathusizeumtimeuuidugiduunameugnameuatimeuctimei�i�i`i@i iiiii�i@i iiiuntuceuutf-8cCs2|j||�}|d|�|t|�tS(u8Convert a string to a null-terminated bytes object.
    N(uencodeulenuNUL(usulengthuencodinguerrors((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyustn�sustncCs>|jd�}|dkr.|d|�}n|j||�S(u8Convert a null-terminated bytes object to a string.
    siNi����(ufindudecode(usuencodinguerrorsup((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyunts�suntscCs�|dtd�kr_y%tt|dd�p1dd�}Wq�tk
r[td��Yq�XnId}x@tt|�d�D](}|dK}|t||d�7}q|W|S(	u/Convert a number field to a python number.
    ii�uasciiustrictu0iuinvalid headeri(uchruintuntsu
ValueErroruInvalidHeaderErrorurangeulenuord(usunui((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyunti�s%

unticCs�d|kod|dknrHd|d|fjd�t}n�|tksh|d|dkrwtd��n|dkr�tjdtjd	|��d}nt�}x6t|d�D]$}|j	d|d
@�|dL}q�W|j	dd�|S(u/Convert a python number to a number field.
    iiiu%0*ouasciiiuoverflow in number fielduLuli�i�(
uencodeuNULu
GNU_FORMATu
ValueErrorustructuunpackupacku	bytearrayurangeuinsert(unudigitsuformatusui((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuitn�s	$$ %	uitncCs�dttjd|dd��tjd|dd���}dttjd|dd��tjd	|dd���}||fS(
u�Calculate the checksum for a member's header by summing up all
       characters except for the chksum field which is treated as if
       it was filled with spaces. According to the GNU tar sources,
       some tars (Sun and NeXT) calculate chksum with signed char,
       which will be different if there are chars in the buffer with
       the high bit set. So we calculate two checksums, unsigned and
       signed.
    iu148BNi�u356Bi�iu148bu356b(usumustructuunpack(ubufuunsigned_chksumu
signed_chksum((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyucalc_chksums�s	@@ucalc_chksumscCs|dkrdS|dkrLx)|jd�}|s8Pn|j|�qdSd}t||�\}}xQt|�D]C}|j|�}t|�|kr�td��n|j|�qtW|dkr|j|�}t|�|kr�td��n|j|�ndS(ujCopy length bytes from fileobj src to fileobj dst.
       If length is None, copy the entire content.
    iNiiuend of file reachedi@i@(uNoneureaduwriteudivmodurangeulenuIOError(usrcudstulengthubufuBUFSIZEublocksu	remainderub((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyucopyfileobjs,ucopyfileobjulu-ubuducupuruwusuSuxutuTcCsig}xStD]K}xB|D]-\}}||@|kr|j|�PqqW|jd�q
Wdj|�S(ucConvert a file's mode to a string of the form
       -rwxrwxrwx.
       Used by TarFile.list()
    u-u(ufilemode_tableuappendujoin(umodeupermutableubituchar((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyufilemode8s

ufilemodecBs|EeZdZdZdS(uTarErroruBase exception.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuTarErrorGscBs|EeZdZdZdS(uExtractErroru%General exception for extract errors.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuExtractErrorJsuExtractErrorcBs|EeZdZdZdS(u	ReadErroru%Exception for unreadble tar archives.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu	ReadErrorMsu	ReadErrorcBs|EeZdZdZdS(uCompressionErroru.Exception for unavailable compression methods.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuCompressionErrorPsuCompressionErrorcBs|EeZdZdZdS(uStreamErroru=Exception for unsupported operations on stream-like TarFiles.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuStreamErrorSsuStreamErrorcBs|EeZdZdZdS(uHeaderErroru!Base exception for header errors.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuHeaderErrorVsuHeaderErrorcBs|EeZdZdZdS(uEmptyHeaderErroruException for empty headers.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuEmptyHeaderErrorYsuEmptyHeaderErrorcBs|EeZdZdZdS(uTruncatedHeaderErroru Exception for truncated headers.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuTruncatedHeaderError\suTruncatedHeaderErrorcBs|EeZdZdZdS(uEOFHeaderErroru"Exception for end of file headers.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuEOFHeaderError_suEOFHeaderErrorcBs|EeZdZdZdS(uInvalidHeaderErroruException for invalid headers.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuInvalidHeaderErrorbsuInvalidHeaderErrorcBs|EeZdZdZdS(uSubsequentHeaderErroru3Exception for missing and invalid extended headers.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuSubsequentHeaderErroresuSubsequentHeaderErrorcBsJ|EeZdZdZdd�Zdd�Zdd�Zdd	�Zd
S(u
_LowLevelFileu�Low-level file object. Supports reading and writing.
       It is used instead of a regular file object for streaming
       access.
    cCsgitjd6tjtjBtjBd6|}ttd�rK|tjO}ntj||d�|_dS(NuruwuO_BINARYi�(	uosuO_RDONLYuO_WRONLYuO_CREATuO_TRUNCuhasattruO_BINARYuopenufd(uselfunameumode((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu__init__rs
u_LowLevelFile.__init__cCstj|j�dS(N(uosucloseufd(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuclose{su_LowLevelFile.closecCstj|j|�S(N(uosureadufd(uselfusize((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuread~su_LowLevelFile.readcCstj|j|�dS(N(uosuwriteufd(uselfus((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuwrite�su_LowLevelFile.writeN(u__name__u
__module__u__qualname__u__doc__u__init__ucloseureaduwrite(u
__locals__((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu
_LowLevelFilels
	u
_LowLevelFilecBs�|EeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zddd�Zddd�Zdd�Zdd�ZdS(u_Streamu�Class that serves as an adapter between TarFile and
       a stream-like object.  The stream-like object only
       needs to have a read() or write() method and is accessed
       blockwise.  Use of gzip or bzip2 compression is possible.
       A stream-like object could be for example: sys.stdin,
       sys.stdout, a socket, a tape device etc.

       _Stream is intended to be used only internally.
    cCs�d|_|dkr0t||�}d|_n|dkrWt|�}|j�}n|p`d|_||_||_	||_
||_d|_d|_
d|_y�|dkr&yddl}Wntk
r�td��YnX||_|jd�|_|dkr|j�q&|j�n|d	kr�yddl}Wntk
rbtd
��YnX|dkr�d|_|j�|_q�|j�|_nWn-|js�|j
j�nd|_�YnXdS(
u$Construct a _Stream object.
        u*usiugzNuzlib module is not availableurubz2ubz2 module is not availableTF(uTrueu_extfileobjuNoneu
_LowLevelFileuFalseu_StreamProxyugetcomptypeunameumodeucomptypeufileobjubufsizeubufuposucloseduzlibuImportErroruCompressionErrorucrc32ucrcu
_init_read_gzu_init_write_gzubz2udbufuBZ2Decompressorucmpu
BZ2Compressoruclose(uselfunameumodeucomptypeufileobjubufsizeuzlibubz2((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu__init__�sP								
	


			u_Stream.__init__cCs*t|d�r&|jr&|j�ndS(Nuclosed(uhasattrucloseduclose(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu__del__�su_Stream.__del__cCs�|jjd|jj|jj|jjd�|_tjdtt	j	���}|j
d|d�|jjd�r�|jdd�|_n|j
|jj
d	d
�t�dS(u6Initialize for writing with gzip compression.
        i	iu<Ls�s�u.gzNiu
iso-8859-1ureplacei����(uzlibucompressobjuDEFLATEDu	MAX_WBITSu
DEF_MEM_LEVELucmpustructupackuintutimeu_Stream__writeunameuendswithuencodeuNUL(uselfu	timestamp((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_init_write_gz�s
	u_Stream._init_write_gzcCsw|jdkr-|jj||j�|_n|jt|�7_|jdkrf|jj|�}n|j|�dS(u&Write string s to the stream.
        ugzutarN(	ucomptypeuzlibucrc32ucrcuposulenucmpucompressu_Stream__write(uselfus((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuwrite�su
_Stream.writecCsk|j|7_xUt|j�|jkrf|jj|jd|j��|j|jd�|_qWdS(u]Write string s to the stream if a whole new block
           is ready to be written.
        N(ubufulenubufsizeufileobjuwrite(uselfus((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu__write�s u_Stream.__writecCs�|jr
dS|jdkrF|jdkrF|j|jj�7_n|jdkr�|jr�|jj|j�d|_|jdkr�|jjtj	d|j
d@��|jjtj	d|jd@��q�n|js�|jj
�nd|_dS(	u[Close the _Stream object. No operation should be
           done on it afterwards.
        Nuwutarsugzu<Ll��T(uclosedumodeucomptypeubufucmpuflushufileobjuwriteustructupackucrcuposu_extfileobjucloseuTrue(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuclose�s		#)	u
_Stream.closecCse|jj|jj�|_d|_|jd�dkrItd��n|jd�dkrmtd��nt|jd��}|jd�|d	@r�t|jd��d
t|jd��}|j	|�n|d@rx,|jd�}|s|t
kr�Pq�q�n|d@rGx,|jd�}|s=|t
krPqqn|d@ra|jd�nd
S(u:Initialize for reading a gzip compressed fileobj.
        sis�unot a gzip fileisuunsupported compression methodiiiiiN(uzlibu
decompressobju	MAX_WBITSucmpudbufu
_Stream__readu	ReadErroruCompressionErroruordureaduNUL(uselfuflaguxlenus((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu
_init_read_gzs.	

,




u_Stream._init_read_gzcCs|jS(u3Return the stream's file pointer position.
        (upos(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyutell#su_Stream.tellicCs|||jdkrit||j|j�\}}x$t|�D]}|j|j�q?W|j|�ntd��|jS(uXSet the stream's file pointer to pos. Negative seeking
           is forbidden.
        iu seeking backwards is not allowed(uposudivmodubufsizeurangeureaduStreamError(uselfuposublocksu	remainderui((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuseek(su_Stream.seekcCs{|dkrSg}x,|j|j�}|s1Pn|j|�qdj|�}n|j|�}|jt|�7_|S(u�Return the next size number of bytes from the stream.
           If size is not defined, return all bytes of the stream
           up to EOF.
        uN(uNoneu_readubufsizeuappendujoinuposulen(uselfusizeutubuf((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuread5su_Stream.readcCs�|jdkr|j|�St|j�}x�||kr�|j|j�}|sVPny|jj|�}Wntk
r�td��YnX|j|7_|t|�7}q.W|jd|�}|j|d�|_|S(u+Return size bytes from the stream.
        utaruinvalid compressed dataN(	ucomptypeu
_Stream__readulenudbufubufsizeucmpu
decompressuIOErroru	ReadError(uselfusizeucubuf((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_readGs 

u
_Stream._readcCs�t|j�}xN||kr_|jj|j�}|s=Pn|j|7_|t|�7}qW|jd|�}|j|d�|_|S(usReturn size bytes from stream. If internal buffer is empty,
           read another block from the stream.
        N(ulenubufufileobjureadubufsize(uselfusizeucubuf((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu__read\su_Stream.__readN(u__name__u
__module__u__qualname__u__doc__u__init__u__del__u_init_write_gzuwriteu_Stream__writeucloseu
_init_read_gzutelluseekuNoneureadu_readu
_Stream__read(u
__locals__((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_Stream�s	4
	
u_StreamcBsJ|EeZdZdZdd�Zdd�Zdd�Zdd	�Zd
S(u_StreamProxyusSmall proxy class that enables transparent compression
       detection for the Stream interface (mode 'r|*').
    cCs"||_|jjt�|_dS(N(ufileobjureadu	BLOCKSIZEubuf(uselfufileobj((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu__init__qs	u_StreamProxy.__init__cCs|jj|_|jS(N(ufileobjureadubuf(uselfusize((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyureadusu_StreamProxy.readcCs0|jjd�rdS|jjd�r,dSdS(Ns�ugzsBZh91ubz2utar(ubufu
startswith(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyugetcomptypeys
u_StreamProxy.getcomptypecCs|jj�dS(N(ufileobjuclose(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuclose�su_StreamProxy.closeN(u__name__u
__module__u__qualname__u__doc__u__init__ureadugetcomptypeuclose(u
__locals__((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_StreamProxyls
u_StreamProxycBst|EeZdZdZdZdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�ZdS(u	_BZ2ProxyuSmall proxy class that enables external file object
       support for "r:bz2" and "w:bz2" modes. This is actually
       a workaround for a limitation in bz2 module's BZ2File
       class which (unlike gzip.GzipFile) has no support for
       a file object argument.
    iicCs8||_||_t|jdd�|_|j�dS(Nuname(ufileobjumodeugetattruNoneunameuinit(uselfufileobjumode((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu__init__�s		u_BZ2Proxy.__init__cCsbddl}d|_|jdkrO|j�|_|jjd�d|_n|j�|_dS(Niurs(	ubz2uposumodeuBZ2Decompressorubz2objufileobjuseekubufu
BZ2Compressor(uselfubz2((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuinit�s	u_BZ2Proxy.initcCs�t|j�}x`||krq|jj|j�}|s=Pn|jj|�}|j|7_|t|�7}qW|jd|�}|j|d�|_|jt|�7_|S(N(ulenubufufileobjureadu	blocksizeubz2obju
decompressupos(uselfusizeuxurawudataubuf((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuread�su_BZ2Proxy.readcCs4||jkr|j�n|j||j�dS(N(uposuinituread(uselfupos((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuseek�s
u_BZ2Proxy.seekcCs|jS(N(upos(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyutell�su_BZ2Proxy.tellcCs;|jt|�7_|jj|�}|jj|�dS(N(uposulenubz2objucompressufileobjuwrite(uselfudatauraw((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuwrite�su_BZ2Proxy.writecCs5|jdkr1|jj�}|jj|�ndS(Nuw(umodeubz2objuflushufileobjuwrite(uselfuraw((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuclose�su_BZ2Proxy.closeNi@(u__name__u
__module__u__qualname__u__doc__u	blocksizeu__init__uinitureaduseekutelluwriteuclose(u
__locals__((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu	_BZ2Proxy�s
u	_BZ2ProxycBs\|EeZdZdZddd�Zdd�Zdd�Zdd	�Zdd
d�Z	dS(
u_FileInFileuA thin wrapper around an existing file object that
       provides a part of its data as an individual file
       object.
    cCs||_||_||_d|_|dkrBd|fg}nd|_g|_d}|j}xs|D]k\}}||kr�|jjd||df�n|jjd||||f�||7}||}qjW||jkr
|jjd||jdf�ndS(NiFT(
ufileobjuoffsetusizeupositionuNoneu	map_indexumapuappenduFalseuTrue(uselfufileobjuoffsetusizeu	blockinfoulastposurealpos((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu__init__�s$							 
u_FileInFile.__init__cCs#t|jd�sdS|jj�S(NuseekableT(uhasattrufileobjuTrueuseekable(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuseekable�su_FileInFile.seekablecCs|jS(u*Return the current file position.
        (uposition(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyutell�su_FileInFile.tellcCs
||_dS(u(Seek to a position in the file.
        N(uposition(uselfuposition((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuseek�su_FileInFile.seekcCsD|dkr|j|j}nt||j|j�}d}x�|dkr?xu|j|j\}}}}||jko�|knr�PqP|jd7_|jt|j�krPd|_qPqPt|||j�}|r|jj||j|�||jj	|�7}n|t
|7}||8}|j|7_qAW|S(u!Read data from the file.
        siiN(uNoneusizeupositionuminumapu	map_indexulenufileobjuseekureaduNUL(uselfusizeubufudataustartustopuoffsetulength((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuread�s(
u_FileInFile.readN(
u__name__u
__module__u__qualname__u__doc__uNoneu__init__useekableutelluseekuread(u
__locals__((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_FileInFile�su_FileInFilecBs�|EeZdZdZdZdd�Zdd�Zdd�Zd	d
�Zddd�Z
e
Zddd�Zdd�Z
dd�Zejdd�Zdd�Zdd�ZdS(uExFileObjectuaFile-like object for reading an archive member.
       Is returned by TarFile.extractfile().
    icCsdt|j|j|j|j�|_|j|_d|_d|_|j|_d|_	d|_
dS(NurisF(u_FileInFileufileobjuoffset_datausizeusparseunameumodeuFalseuclosedupositionubuffer(uselfutarfileutarinfo((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu__init__s				uExFileObject.__init__cCsdS(NT(uTrue(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyureadable!suExFileObject.readablecCsdS(NF(uFalse(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuwritable$suExFileObject.writablecCs
|jj�S(N(ufileobjuseekable(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuseekable'suExFileObject.seekablecCs�|jrtd��nd}|jrt|dkrH|j}d|_qt|jd|�}|j|d�|_n|dkr�||jj�7}n ||jj|t|��7}|jt|�7_|S(u~Read at most size bytes from the file. If size is not
           present or None, read all data until EOF is reached.
        uI/O operation on closed filesN(uclosedu
ValueErrorubufferuNoneufileobjureadulenuposition(uselfusizeubuf((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuread*s			 uExFileObject.readicCs|jrtd��n|jjd�d}|dkr�xu|jj|j�}|j|7_|std|kr=|jjd�d}|dkr�t|j�}nPq=q=n|dkr�t||�}n|jd|�}|j|d�|_|j	t|�7_	|S(u�Read one entire line from the file. If size is present
           and non-negative, return a string with at most that
           size, which may be an incomplete line.
        uI/O operation on closed files
iiNi����(
uclosedu
ValueErrorubufferufindufileobjureadu	blocksizeulenuminuposition(uselfusizeuposubuf((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyureadlineEs$	
uExFileObject.readlinecCs3g}x&|j�}|sPn|j|�q	|S(u0Return a list with all remaining lines.
        (ureadlineuappend(uselfuresultuline((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu	readlinesbsuExFileObject.readlinescCs|jrtd��n|jS(u*Return the current file position.
        uI/O operation on closed file(uclosedu
ValueErroruposition(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyutellls	uExFileObject.tellcCs|jrtd��n|tjkrHtt|d�|j�|_n�|tjkr�|dkrt|j|d�|_q�t|j||j�|_nC|tj	kr�tt|j||j�d�|_ntd��d|_
|jj|j�dS(u(Seek to a position in the file.
        uI/O operation on closed fileiuInvalid argumentsN(
uclosedu
ValueErroruosuSEEK_SETuminumaxusizeupositionuSEEK_CURuSEEK_ENDubufferufileobjuseek(uselfuposuwhence((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuseekts	!(	uExFileObject.seekcCs
d|_dS(uClose the file object.
        NT(uTrueuclosed(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuclose�suExFileObject.closeccs%x|j�}|sPn|VqdS(u/Get an iterator over the file's lines.
        N(ureadline(uselfuline((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu__iter__�s
uExFileObject.__iter__Ni����(u__name__u
__module__u__qualname__u__doc__u	blocksizeu__init__ureadableuwritableuseekableuNoneureaduread1ureadlineu	readlinesutelluosuSEEK_SETuseekucloseu__iter__(u
__locals__((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuExFileObjects

uExFileObjectcBsT|EeZdZdZdiZddd�Zdd�Zdd�Zeee�Z	dd�Z
dd �Zee
e�Zd!d"�Z
d#d$�Zeed%d&d'�Zd(d)�Zd*d+�Zd,d-�Zed.d/��Zd0d1�Zed2d3��Zed4d5��Zed6d7��Zed8d9��Zed:d;��Zed<d=��Zd>d?�Zd@dA�Z dBdC�Z!dDdE�Z"dFdG�Z#dHdI�Z$dJdK�Z%dLdM�Z&dNdO�Z'dPdQ�Z(dRdS�Z)dTdU�Z*dVdW�Z+dXdY�Z,dZd[�Z-d\d]�Z.d^d_�Z/d`da�Z0dbdc�Z1ddde�Z2dfdg�Z3dhS(juTarInfouInformational class which holds the details about an
       archive member given by a tar header block.
       TarInfo objects are returned by TarFile.getmember(),
       TarFile.getmembers() and TarFile.gettarinfo() and are
       usually created internally.
    unameumodeuuidugidusizeumtimeuchksumutypeulinknameuunameugnameudevmajorudevminoruoffsetuoffset_dataupax_headersusparseutarfileu_sparse_structsu_link_targetucCs�||_d|_d|_d|_d|_d|_d|_t|_d|_	d|_
d|_d|_d|_
d|_d|_d|_i|_dS(uXConstruct a TarInfo object. name is the optional name
           of the member.
        i�iuN(unameumodeuuidugidusizeumtimeuchksumuREGTYPEutypeulinknameuunameugnameudevmajorudevminoruoffsetuoffset_datauNoneusparseupax_headers(uselfuname((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu__init__�s"																uTarInfo.__init__cCs|jS(N(uname(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_getpath�suTarInfo._getpathcCs
||_dS(N(uname(uselfuname((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_setpath�suTarInfo._setpathcCs|jS(N(ulinkname(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_getlinkpath�suTarInfo._getlinkpathcCs
||_dS(N(ulinkname(uselfulinkname((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_setlinkpath�suTarInfo._setlinkpathcCs d|jj|jt|�fS(Nu<%s %r at %#x>(u	__class__u__name__unameuid(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu__repr__�suTarInfo.__repr__cCs�i
|jd6|jd@d6|jd6|jd6|jd6|jd6|jd6|jd	6|jd
6|j	d6|j
d6|jd
6|jd6}|d	t
kr�|djd�r�|dd7<n|S(u9Return the TarInfo's attributes as a dictionary.
        unamei�umodeuuidugidusizeumtimeuchksumutypeulinknameuunameugnameudevmajorudevminoru/(unameumodeuuidugidusizeumtimeuchksumutypeulinknameuunameugnameudevmajorudevminoruDIRTYPEuendswith(uselfuinfo((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuget_info�s"











$uTarInfo.get_infousurrogateescapecCsv|j�}|tkr+|j|||�S|tkrJ|j|||�S|tkrf|j||�Std��dS(u<Return a tar header as a string of 512 byte blocks.
        uinvalid formatN(uget_infouUSTAR_FORMATucreate_ustar_headeru
GNU_FORMATucreate_gnu_headeru
PAX_FORMATucreate_pax_headeru
ValueError(uselfuformatuencodinguerrorsuinfo((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyutobuf�su
TarInfo.tobufcCst|d<t|d�tkr/td��nt|d�tkri|j|d�\|d<|d<n|j|t||�S(u3Return the object as a ustar header block.
        umagiculinknameulinkname is too longunameuprefix(uPOSIX_MAGICulenuLENGTH_LINKu
ValueErroruLENGTH_NAMEu_posix_split_nameu_create_headeruUSTAR_FORMAT(uselfuinfouencodinguerrors((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyucreate_ustar_header�s
$uTarInfo.create_ustar_headercCs�t|d<d}t|d�tkrI||j|dt||�7}nt|d�tkr�||j|dt||�7}n||j|t||�S(u:Return the object as a GNU header block sequence.
        umagicsulinknameuname(	u	GNU_MAGICulenuLENGTH_LINKu_create_gnu_long_headeruGNUTYPE_LONGLINKuLENGTH_NAMEuGNUTYPE_LONGNAMEu_create_headeru
GNU_FORMAT(uselfuinfouencodinguerrorsubuf((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyucreate_gnu_headers
##uTarInfo.create_gnu_headerc
Cs�t|d<|jj�}x�ddtfddtfddfD]�\}}}||kr_q>ny||jd	d
�Wn#tk
r�||||<w>YnXt||�|kr>||||<q>q>Wx�dD]�\}}||kr�d||<q�n||}d|ko d|dkns5t|t	�r�t
|�||<d||<q�q�W|rt|j|t|�}	nd}	|	|j
|td	d�S(u�Return the object as a ustar header block. If it cannot be
           represented this way, prepend a pax extended header sequence
           with supplement information.
        umagicunameupathulinknameulinkpathuunamei ugnameuasciiustrictuuidiugidusizeiumtimeiisureplace(uunameuunamei (ugnameugnamei (uuidi(ugidi(usizei(umtimei((uuidi(ugidi(usizei(umtimei(uPOSIX_MAGICupax_headersucopyuLENGTH_NAMEuLENGTH_LINKuencodeuUnicodeEncodeErrorulenu
isinstanceufloatustru_create_pax_generic_headeruXHDTYPEu_create_headeruUSTAR_FORMAT(
uselfuinfouencodingupax_headersunameuhnameulengthudigitsuvalubuf((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyucreate_pax_headers4



4uTarInfo.create_pax_headercCs|j|td�S(uAReturn the object as a pax global header block sequence.
        uutf8(u_create_pax_generic_headeruXGLTYPE(uclsupax_headers((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyucreate_pax_global_headerDsu TarInfo.create_pax_global_headercCs�|dtd�}x*|r@|ddkr@|dd�}qW|t|�d�}|dd�}|s�t|�tkr�td��n||fS(uUSplit a name longer than 100 chars into a prefix
           and a name part.
        Niu/uname is too longi����i����i����(u
LENGTH_PREFIXulenuLENGTH_NAMEu
ValueError(uselfunameuprefix((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_posix_split_nameJsuTarInfo._posix_split_namecCs�t|jdd�d||�t|jdd�d@d|�t|jdd�d|�t|jd	d�d|�t|jd
d�d|�t|jdd�d|�d
|jdt�t|jdd�d||�|jdt�t|jdd�d||�t|jdd�d||�t|jdd�d|�t|jdd�d|�t|jdd�d||�g}tjdtdj|��}t	|td��d}|dd�d|j
d�|d d�}|S(!u�Return a header block. info is a dictionary with file
           information, format must be one of the *_FORMAT constants.
        unameuidumodeii�iuuidugidusizeiumtimes        utypeulinknameumagicuunamei ugnameudevmajorudevminoruprefixi�u%dssNilu%06ouasciiiei����i����(ustnugetuitnuREGTYPEuPOSIX_MAGICustructupacku	BLOCKSIZEujoinucalc_chksumsuencode(uinfouformatuencodinguerrorsupartsubufuchksum((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_create_headerYs&$/uTarInfo._create_headercCs@tt|�t�\}}|dkr<|t|t7}n|S(udReturn the string payload filled with zero bytes
           up to the next 512 byte border.
        i(udivmodulenu	BLOCKSIZEuNUL(upayloadublocksu	remainder((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_create_payloadusuTarInfo._create_payloadcCsm|j||�t}i}d|d<||d<t|�|d<t|d<|j|t||�|j|�S(uTReturn a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence
           for name.
        u
././@LongLinkunameutypeusizeumagic(uencodeuNULulenu	GNU_MAGICu_create_headeruUSTAR_FORMATu_create_payload(uclsunameutypeuencodinguerrorsuinfo((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_create_gnu_long_headers


uTarInfo._create_gnu_long_headercCs�d}xJ|j�D]<\}}y|jdd�Wqtk
rNd}PYqXqWd}|rl|d7}nx�|j�D]�\}}|jd�}|r�|j|d�}n|jd�}t|�t|�d}d}	}
x/|tt|
��}	|	|
krPn|	}
q�|tt|
�d�d	|d
|d7}qyWi}d|d
<||d<t|�|d<t|d<|j	|t
dd�|j|�S(u�Return a POSIX.1-2008 extended or global header sequence
           that contains a list of keyword, value pairs. The values
           must be strings.
        uutf8ustrictss21 hdrcharset=BINARY
usurrogateescapeiiuasciis s=s
u././@PaxHeaderunameutypeusizeumagicureplaceFT(uFalseuitemsuencodeuUnicodeEncodeErroruTrueulenustrubytesuPOSIX_MAGICu_create_headeruUSTAR_FORMATu_create_payload(uclsupax_headersutypeuencodingubinaryukeyworduvalueurecordsulunupuinfo((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_create_pax_generic_header�s<



	1


u"TarInfo._create_pax_generic_headerc
Csft|�dkr!td��nt|�tkrBtd��n|jt�tkrftd��nt|dd��}|t|�kr�t	d��n|�}t
|dd�||�|_t|dd	��|_t|d	d
��|_
t|d
d��|_t|dd��|_t|dd��|_||_|dd
�|_t
|d
d�||�|_t
|dd�||�|_t
|dd�||�|_t|dd��|_t|dd��|_t
|dd�||�}|jtkr6|jjd�r6t|_n|jtkrd}g}x�td�D]u}	y<t|||d��}
t||d|d��}Wntk
r�PYnX|j|
|f�|d7}q^Wt|d�}t|dd��}
|||
f|_ n|j!�r6|jj"d�|_n|rb|jt#krb|d|j|_n|S(uAConstruct a TarInfo object from a 512 byte bytes object.
        iuempty headerutruncated headeruend of file headeri�i�ubad checksumidiliti|i�i�ii	i)iIiQiYi�u/i�iiii�i�i�($ulenuEmptyHeaderErroru	BLOCKSIZEuTruncatedHeaderErrorucountuNULuEOFHeaderErroruntiucalc_chksumsuInvalidHeaderErroruntsunameumodeuuidugidusizeumtimeuchksumutypeulinknameuunameugnameudevmajorudevminoruAREGTYPEuendswithuDIRTYPEuGNUTYPE_SPARSEurangeu
ValueErroruappenduboolu_sparse_structsuisdirurstripu	GNU_TYPES(uclsubufuencodinguerrorsuchksumuobjuprefixuposustructsuiuoffsetunumbytesu
isextendeduorigsize((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyufrombuf�sZ		!"
uTarInfo.frombufcCsP|jjt�}|j||j|j�}|jj�t|_|j|�S(uOReturn the next TarInfo object from TarFile object
           tarfile.
        (	ufileobjureadu	BLOCKSIZEufrombufuencodinguerrorsutelluoffsetu_proc_member(uclsutarfileubufuobj((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyufromtarfilesuTarInfo.fromtarfilecCst|jttfkr"|j|�S|jtkr>|j|�S|jtttfkrc|j	|�S|j
|�SdS(uYChoose the right processing method depending on
           the type and call it.
        N(utypeuGNUTYPE_LONGNAMEuGNUTYPE_LONGLINKu
_proc_gnulonguGNUTYPE_SPARSEu_proc_sparseuXHDTYPEuXGLTYPEuSOLARIS_XHDTYPEu	_proc_paxu
_proc_builtin(uselfutarfile((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_proc_members


uTarInfo._proc_membercCsx|jj�|_|j}|j�s6|jtkrO||j|j�7}n||_|j	|j
|j|j�|S(ufProcess a builtin type or an unknown type which
           will be treated as a regular file.
        (
ufileobjutelluoffset_datauisregutypeuSUPPORTED_TYPESu_blockusizeuoffsetu_apply_pax_infoupax_headersuencodinguerrors(uselfutarfileuoffset((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu
_proc_builtin$s		uTarInfo._proc_builtincCs�|jj|j|j��}y|j|�}Wntk
rQtd��YnX|j|_|jt	kr�t
||j|j�|_
n-|jtkr�t
||j|j�|_n|S(uSProcess the blocks that hold a GNU longname
           or longlink member.
        u missing or bad subsequent header(ufileobjureadu_blockusizeufromtarfileuHeaderErroruSubsequentHeaderErroruoffsetutypeuGNUTYPE_LONGNAMEuntsuencodinguerrorsunameuGNUTYPE_LONGLINKulinkname(uselfutarfileubufunext((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu
_proc_gnulong5s
uTarInfo._proc_gnulongc

Cs&|j\}}}|`x�|r�|jjt�}d}x�td�D]�}y<t|||d��}t||d|d��}	Wntk
r�PYnX|r�|	r�|j||	f�n|d7}qFWt|d�}qW||_	|jj
�|_|j|j|j
�|_||_
|S(u8Process a GNU sparse header plus extra headers.
        iiiii�(u_sparse_structsufileobjureadu	BLOCKSIZEurangeuntiu
ValueErroruappenduboolusparseutelluoffset_datau_blockusizeuoffset(
uselfutarfileustructsu
isextendeduorigsizeubufuposuiuoffsetunumbytes((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_proc_sparseKs(	"
		uTarInfo._proc_sparsec
Cs�|jj|j|j��}|jtkr9|j}n|jj�}tj	d|�}|dk	r�|jd�jd�|d<n|j
d�}|dkr�|j}nd}tjd�}d}x�|j||�}|s�Pn|j�\}	}
t|	�}	||jd�d|jd�|	d�}|j|
dd|j�}
|
tkrz|j|||j|j�}n|j|dd|j�}|||
<||	7}q�y|j|�}Wntk
r�td	��YnXd
|kr�|j||�nbd|kr!|j|||�n@|j
d�d
kra|j
d�dkra|j|||�n|jttfkr�|j ||j|j�|j!|_!d|kr�|j"}
|j#�s�|jt$kr�|
|j|j�7}
n|
|_!q�n|S(uVProcess an extended or global header as described in
           POSIX.1-2008.
        s\d+ hdrcharset=([^\n]+)\niuutf8u
hdrcharsetuBINARYs(\d+) ([^=]+)=iiu missing or bad subsequent headeruGNU.sparse.mapuGNU.sparse.sizeuGNU.sparse.majoru1uGNU.sparse.minoru0usizeN(%ufileobjureadu_blockusizeutypeuXGLTYPEupax_headersucopyureusearchuNoneugroupudecodeugetuencodingucompileumatchugroupsuintuendustartu_decode_pax_fielduerrorsuPAX_NAME_FIELDSufromtarfileuHeaderErroruSubsequentHeaderErroru_proc_gnusparse_01u_proc_gnusparse_00u_proc_gnusparse_10uXHDTYPEuSOLARIS_XHDTYPEu_apply_pax_infouoffsetuoffset_datauisreguSUPPORTED_TYPES(uselfutarfileubufupax_headersumatchu
hdrcharsetuencodinguregexuposulengthukeyworduvalueunextuoffset((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu	_proc_paxgs`.	


*	uTarInfo._proc_paxcCs�g}x6tjd|�D]"}|jt|jd���qWg}x6tjd|�D]"}|jt|jd���qXWtt||��|_dS(u?Process a GNU tar extended sparse header, version 0.0.
        s\d+ GNU.sparse.offset=(\d+)\nis\d+ GNU.sparse.numbytes=(\d+)\nN(ureufinditeruappenduintugroupulistuzipusparse(uselfunextupax_headersubufuoffsetsumatchunumbytes((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_proc_gnusparse_00�s  uTarInfo._proc_gnusparse_00cCsVdd�|djd�D�}tt|ddd�|ddd���|_dS(u?Process a GNU tar extended sparse header, version 0.1.
        cSsg|]}t|��qS((uint(u.0ux((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu
<listcomp>�s	u.TarInfo._proc_gnusparse_01.<locals>.<listcomp>uGNU.sparse.mapu,Nii(usplitulistuzipusparse(uselfunextupax_headersusparse((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_proc_gnusparse_01�s uTarInfo._proc_gnusparse_01cCs�d}g}|jjt�}|jdd�\}}t|�}xjt|�|dkr�d|kr�||jjt�7}n|jdd�\}}|jt|��qEW|jj�|_	t
t|ddd�|ddd���|_dS(u?Process a GNU tar extended sparse header, version 1.0.
        s
iiN(
uNoneufileobjureadu	BLOCKSIZEusplituintulenuappendutelluoffset_dataulistuzipusparse(uselfunextupax_headersutarfileufieldsusparseubufunumber((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_proc_gnusparse_10�suTarInfo._proc_gnusparse_10c
Csx�|j�D]�\}}|dkr8t|d|�q
|dkr]t|dt|��q
|dkr�t|dt|��q
|tkr
|tkr�yt||�}Wq�tk
r�d}Yq�Xn|dkr�|jd�}nt|||�q
q
W|j�|_dS(	uoReplace fields with supplemental information from a previous
           pax extended or global header.
        uGNU.sparse.nameupathuGNU.sparse.sizeusizeuGNU.sparse.realsizeiu/N(	uitemsusetattruintu
PAX_FIELDSuPAX_NUMBER_FIELDSu
ValueErrorurstripucopyupax_headers(uselfupax_headersuencodinguerrorsukeyworduvalue((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_apply_pax_info�s"
uTarInfo._apply_pax_infocCs=y|j|d�SWn"tk
r8|j||�SYnXdS(u1Decode a single field from a pax record.
        ustrictN(udecodeuUnicodeDecodeError(uselfuvalueuencodingufallback_encodingufallback_errors((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_decode_pax_fields
uTarInfo._decode_pax_fieldcCs0t|t�\}}|r(|d7}n|tS(u_Round up a byte count by BLOCKSIZE and return it,
           e.g. _block(834) => 1024.
        i(udivmodu	BLOCKSIZE(uselfucountublocksu	remainder((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_block
s
uTarInfo._blockcCs
|jtkS(N(utypeu
REGULAR_TYPES(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuisregsu
TarInfo.isregcCs
|j�S(N(uisreg(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuisfilesuTarInfo.isfilecCs
|jtkS(N(utypeuDIRTYPE(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuisdirsu
TarInfo.isdircCs
|jtkS(N(utypeuSYMTYPE(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuissymsu
TarInfo.issymcCs
|jtkS(N(utypeuLNKTYPE(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuislnksu
TarInfo.islnkcCs
|jtkS(N(utypeuCHRTYPE(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuischr su
TarInfo.ischrcCs
|jtkS(N(utypeuBLKTYPE(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuisblk"su
TarInfo.isblkcCs
|jtkS(N(utypeuFIFOTYPE(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuisfifo$suTarInfo.isfifocCs
|jdk	S(N(usparseuNone(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuissparse&suTarInfo.issparsecCs|jtttfkS(N(utypeuCHRTYPEuBLKTYPEuFIFOTYPE(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuisdev(su
TarInfo.isdevN(unameumodeuuidugidusizeumtimeuchksumutypeulinknameuunameugnameudevmajorudevminoruoffsetuoffset_dataupax_headersusparseutarfileu_sparse_structsu_link_target(4u__name__u
__module__u__qualname__u__doc__u	__slots__u__init__u_getpathu_setpathupropertyupathu_getlinkpathu_setlinkpathulinkpathu__repr__uget_infouDEFAULT_FORMATuENCODINGutobufucreate_ustar_headerucreate_gnu_headerucreate_pax_headeruclassmethoducreate_pax_global_headeru_posix_split_nameustaticmethodu_create_headeru_create_payloadu_create_gnu_long_headeru_create_pax_generic_headerufrombufufromtarfileu_proc_memberu
_proc_builtinu
_proc_gnulongu_proc_sparseu	_proc_paxu_proc_gnusparse_00u_proc_gnusparse_01u_proc_gnusparse_10u_apply_pax_infou_decode_pax_fieldu_blockuisreguisfileuisdiruissymuislnkuischruisblkuisfifouissparseuisdev(u
__locals__((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuTarInfo�s`
1
3?
f	cBs�|EeZdZdZdZdVZdVZdZe	Z
eZdUZeZeZdUddUdUdUdUdUdUddUdUdUdd�ZedUddUedd	��ZeddUd
d��ZeddUdd
d��ZeddUddd��Zidd6dd6dd6Zdd�Zdd�Zdd�Zdd�ZdUdUdUdd �ZdWd!d"�Z!dUdWdUdUd#d$�Z"dUd%d&�Z#d'dUd(d)�Z$d*dWd+d,�Z%d-d.�Z&dWd/d0�Z'd1d2�Z(d3d4�Z)d5d6�Z*d7d8�Z+d9d:�Z,d;d<�Z-d=d>�Z.d?d@�Z/dAdB�Z0dCdD�Z1dUdVdEdF�Z2dGdH�Z3dUdIdJ�Z4dKdL�Z5dMdN�Z6dOdP�Z7dQdR�Z8dSdT�Z9dUS(XuTarFileu=The TarFile Class provides an interface to tar archives.
    iiurusurrogateescapec
Cs�t|�dks|dkr-td��n||_idd6dd6dd	6||_|s�|jdkr�tjj|�r�d	|_d|_nt||j�}d|_	nN|dkr�t|d
�r�|j}nt|d�r�|j|_nd|_	|rtjj|�nd|_||_|dk	rC||_n|dk	r[||_n|dk	rs||_n|dk	r�||_n|dk	r�||_n|	|_|
dk	r�|jtkr�|
|_n	i|_|dk	r�||_n|dk	r||_nd|_g|_d|_|jj�|_i|_yE|jdkrod|_ |j!�|_ n|jdkrx�|jj"|j�y&|jj#|�}|jj$|�Wq�t%k
r�|jj"|j�PYq�t&k
r}
zt't(|
���WYdd}
~
Xq�Xq�n|jd
kr�d|_|jr�|jj)|jj*��}|jj+|�|jt|�7_q�nWn-|j	s�|jj,�nd|_�YnXdS(u�Open an (uncompressed) tar archive `name'. `mode' is either 'r' to
           read from an existing archive, 'a' to append data to an existing
           file or 'w' to create a new file overwriting an existing one. `mode'
           defaults to 'r'.
           If `fileobj' is given, it is used for reading or writing data. If it
           can be determined, `mode' is overridden by `fileobj's mode.
           `fileobj' is not closed, when TarFile is closed.
        iurawumode must be 'r', 'a' or 'w'urburur+buauwbuwunameumodeNuawFT(-ulenu
ValueErrorumodeu_modeuosupathuexistsu	bltn_openuFalseu_extfileobjuNoneuhasattrunameuTrueuabspathufileobjuformatutarinfoudereferenceuignore_zerosuencodinguerrorsu
PAX_FORMATupax_headersudebugu
errorleveluclosedumembersu_loadedutelluoffsetuinodesufirstmemberunextuseekufromtarfileuappenduEOFHeaderErroruHeaderErroru	ReadErrorustrucreate_pax_global_headerucopyuwriteuclose(uselfunameumodeufileobjuformatutarinfoudereferenceuignore_zerosuencodinguerrorsupax_headersudebugu
errorlevelueubuf((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu__init__Fs�	""		!								
+				uTarFile.__init__c
KsG|r|rtd��n|dkr�x�|jD]�}t||j|�}|dk	rj|j�}ny||d||�SWq3ttfk
r�}	z$|dk	r�|j|�nw3WYdd}	~	Xq3Xq3Wtd��nVd|krh|jdd�\}
}|
pd}
|pd}||jkrEt||j|�}ntd	|��|||
||�Sd
|kr|jd
d�\}
}|
p�d}
|p�d}|
dkr�td��nt	||
|||�}y|||
||�}Wn|j
��YnXd|_|S|d
kr7|j
||||�Std��dS(u|Open a tar archive for reading, writing or appending. Return
           an appropriate TarFile class.

           mode:
           'r' or 'r:*' open for reading with transparent compression
           'r:'         open for reading exclusively uncompressed
           'r:gz'       open for reading with gzip compression
           'r:bz2'      open for reading with bzip2 compression
           'a' or 'a:'  open for appending, creating the file if necessary
           'w' or 'w:'  open for writing without compression
           'w:gz'       open for writing with gzip compression
           'w:bz2'      open for writing with bzip2 compression

           'r|*'        open a stream of tar blocks with transparent compression
           'r|'         open an uncompressed stream of tar blocks for reading
           'r|gz'       open a gzip compressed stream of tar blocks
           'r|bz2'      open a bzip2 compressed stream of tar blocks
           'w|'         open an uncompressed stream for writing
           'w|gz'       open a gzip compressed stream for writing
           'w|bz2'      open a bzip2 compressed stream for writing
        unothing to openurur:*Nu%file could not be opened successfullyu:iutaruunknown compression type %ru|urwumode must be 'r' or 'w'uawuundiscernible mode(urur:*F(u
ValueErroru	OPEN_METHugetattruNoneutellu	ReadErroruCompressionErroruseekusplitu_StreamucloseuFalseu_extfileobjutaropen(
uclsunameumodeufileobjubufsizeukwargsucomptypeufuncu	saved_posueufilemodeustreamut((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuopen�sN
	uTarFile.opencKs@t|�dks|dkr-td��n|||||�S(uCOpen uncompressed tar archive name for reading or writing.
        iurawumode must be 'r', 'a' or 'w'(ulenu
ValueError(uclsunameumodeufileobjukwargs((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyutaropen�suTarFile.taropeni	c	Ks9t|�dks|dkr-td��nyddl}|jWn$ttfk
rjtd��YnX|dk	}y8|j||d||�}|j||||�}Wnzt	k
r|r�|dk	r�|j
�n|dkr��ntd��Yn+|r$|dk	r$|j
�n�YnX||_|S(	ukOpen gzip compressed tar archive name for reading or writing.
           Appending is not allowed.
        iurwumode must be 'r' or 'w'iNugzip module is not availableubunot a gzip file(
ulenu
ValueErrorugzipuGzipFileuImportErroruAttributeErroruCompressionErroruNoneutaropenuIOErrorucloseu	ReadErroru_extfileobj(	uclsunameumodeufileobju
compresslevelukwargsugzipu
extfileobjut((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyugzopens.


	uTarFile.gzopencKs�t|�dks|dkr-td��nyddl}Wntk
r]td��YnX|dk	r|t||�}n|j||d|�}y|j||||�}Wn.t	t
fk
r�|j�td��YnXd	|_|S(
ulOpen bzip2 compressed tar archive name for reading or writing.
           Appending is not allowed.
        iurwumode must be 'r' or 'w'.iNubz2 module is not availableu
compresslevelunot a bzip2 fileF(ulenu
ValueErrorubz2uImportErroruCompressionErroruNoneu	_BZ2ProxyuBZ2FileutaropenuIOErroruEOFErrorucloseu	ReadErroruFalseu_extfileobj(uclsunameumodeufileobju
compresslevelukwargsubz2ut((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyubz2open$s 

	uTarFile.bz2openutaropenutarugzopenugzubz2openubz2cCs�|jr
dS|jdkr�|jjttd�|jtd7_t|jt�\}}|dkr�|jjtt|�q�n|j	s�|jj
�nd|_dS(ulClose the TarFile. In write-mode, two finishing zero blocks are
           appended to the archive.
        NuawiiT(uclosedumodeufileobjuwriteuNULu	BLOCKSIZEuoffsetudivmodu
RECORDSIZEu_extfileobjucloseuTrue(uselfublocksu	remainder((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyucloseHs		u
TarFile.closecCs2|j|�}|dkr.td|��n|S(uReturn a TarInfo object for member `name'. If `name' can not be
           found in the archive, KeyError is raised. If a member occurs more
           than once in the archive, its last occurrence is assumed to be the
           most up-to-date version.
        ufilename %r not foundN(u
_getmemberuNoneuKeyError(uselfunameutarinfo((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu	getmember\suTarFile.getmembercCs'|j�|js |j�n|jS(u�Return the members of the archive as a list of TarInfo objects. The
           list has the same order as the members in the archive.
        (u_checku_loadedu_loadumembers(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu
getmembersgs
	
uTarFile.getmemberscCsdd�|j�D�S(u�Return the members of the archive as a list of their names. It has
           the same order as the list returned by getmembers().
        cSsg|]}|j�qS((uname(u.0utarinfo((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu
<listcomp>us	u$TarFile.getnames.<locals>.<listcomp>(u
getmembers(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyugetnamesqsuTarFile.getnamescCs^|jd�|d	k	r%|j}n|d	kr:|}ntjj|�\}}|jtjd�}|jd�}|j	�}||_
|d	kr�ttd�r�|jr�tj
|�}q�tj|�}ntj|j��}d}|j}tj|�r�|j|jf}	|jrj|jdkrj|	|jkrj||j|	krjt}
|j|	}qt}
|	dr||j|	<qn�tj|�r�t}
nstj|�r�t}
n[tj|�r�t}
tj|�}n4tj |�r�t!}
ntj"|�rt#}
nd	S||_||_$|j%|_&|j'|_(|
tkr]|j)|_*n	d|_*|j+|_,|
|_-||_.t/r�yt/j0|j&�d|_1Wq�t2k
r�Yq�Xnt3r�yt3j4|j(�d|_5Wq�t2k
r�Yq�Xn|
t!t#fkrZttd�rZttd�rZtj6|j7�|_8tj9|j7�|_:qZn|S(
uOCreate a TarInfo object for either the file `name' or the file
           object `fileobj' (using os.fstat on its file descriptor). You can
           modify some of the TarInfo's attributes before you add it using
           addfile(). If given, `arcname' specifies an alternative name for the
           file in the archive.
        uawu/ulstatuiiumajoruminorN(;u_checkuNoneunameuosupathu
splitdriveureplaceusepulstriputarinfoutarfileuhasattrudereferenceulstatustatufstatufilenoust_modeuS_ISREGust_inoust_devust_nlinkuinodesuLNKTYPEuREGTYPEuS_ISDIRuDIRTYPEuS_ISFIFOuFIFOTYPEuS_ISLNKuSYMTYPEureadlinkuS_ISCHRuCHRTYPEuS_ISBLKuBLKTYPEumodeust_uiduuidust_gidugidust_sizeusizeust_mtimeumtimeutypeulinknameupwdugetpwuiduunameuKeyErrorugrpugetgrgidugnameumajorust_rdevudevmajoruminorudevminor(uselfunameuarcnameufileobjudrvutarinfoustatresulinknameustmduinodeutype((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu
gettarinfows~
			"
									

uTarFile.gettarinfoc	Csv|j�xe|D]]}|r�tt|j�dd�td|jpK|j|jpZ|jfdd�|j�s�|j	�r�tdd|j
|jfdd�ntd|jdd�tdt
j|j�dd	�dd�nt|j|j�rd
nddd�|rg|j�r?td|jdd�n|j�rgtd
|jdd�qgnt�qWdS(u�Print a table of contents to sys.stdout. If `verbose' is False, only
           the names of the members are printed. If it is True, an `ls -l'-like
           output is produced.
        uendu u%s/%su%10su%d,%du%10du%d-%02d-%02d %02d:%02d:%02dNiu/uu->ulink to(u_checkuprintufilemodeumodeuunameuuidugnameugiduischruisblkudevmajorudevminorusizeutimeu	localtimeumtimeunameuisdiruissymulinknameuislnk(uselfuverboseutarinfo((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyulist�s&

	')uTarFile.listc		Cs�|jd�|dkr"|}n|dk	rtddl}|jdtd�||�rt|jdd|�dSn|jdk	r�tjj	|�|jkr�|jdd|�dS|jd|�|j
||�}|dkr�|jdd	|�dS|dk	r;||�}|dkr;|jdd|�dSn|j�rst|d
�}|j
||�|j�n�|j�r�|j
|�|r�xTtj|�D]@}|jtjj||�tjj||�||d|�q�Wq�n
|j
|�dS(u~Add the file `name' to the archive. `name' may be any type of file
           (directory, fifo, symbolic link, etc.). If given, `arcname'
           specifies an alternative name for the file in the archive.
           Directories are added recursively by default. This can be avoided by
           setting `recursive' to False. `exclude' is a function that should
           return True for each filename to be excluded. `filter' is a function
           that expects a TarInfo object argument and returns the changed
           TarInfo object, if it returns None the TarInfo object will be
           excluded from the archive.
        uawiNuuse the filter argument insteadiutarfile: Excluded %rutarfile: Skipped %riutarfile: Unsupported type %rurbufilter(u_checkuNoneuwarningsuwarnuDeprecationWarningu_dbgunameuosupathuabspathu
gettarinfouisregu	bltn_openuaddfileucloseuisdirulistdiruaddujoin(	uselfunameuarcnameu	recursiveuexcludeufilteruwarningsutarinfouf((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuadd�sD
		
*

*uTarFile.addcCs�|jd�tj|�}|j|j|j|j�}|jj|�|jt	|�7_|dk	r�t||j|j�t
|jt�\}}|dkr�|jjtt|�|d7}n|j|t7_n|jj|�dS(u]Add the TarInfo object `tarinfo' to the archive. If `fileobj' is
           given, tarinfo.size bytes are read from it and added to the archive.
           You can create TarInfo objects using gettarinfo().
           On Windows platforms, `fileobj' should always be opened with mode
           'rb' to avoid irritation about the file size.
        uawiiN(u_checkucopyutobufuformatuencodinguerrorsufileobjuwriteuoffsetulenuNoneucopyfileobjusizeudivmodu	BLOCKSIZEuNULumembersuappend(uselfutarinfoufileobjubufublocksu	remainder((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuaddfile4s

uTarFile.addfileu.cCsOg}|dkr|}nx_|D]W}|j�r\|j|�tj|�}d|_n|j||d|j��q"W|jddd��|j�x�|D]�}tj	j
||j�}y4|j||�|j
||�|j||�Wq�tk
rF}z.|jdkr �n|jdd|�WYdd}~Xq�Xq�WdS(	uMExtract all members from the archive to the current working
           directory and set owner, modification time and permissions on
           directories afterwards. `path' specifies a different directory
           to extract to. `members' is optional and must be a subset of the
           list returned by getmembers().
        i�u	set_attrsukeycSs|jS(N(uname(ua((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu<lambda>dsu$TarFile.extractall.<locals>.<lambda>iutarfile: %sN(uNoneuisdiruappenducopyumodeuextractusortureverseuosupathujoinunameuchownuutimeuchmoduExtractErroru
errorlevelu_dbg(uselfupathumembersudirectoriesutarinfoudirpathue((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu
extractallNs*	

!

uTarFile.extractallucCsa|jd�t|t�r.|j|�}n|}|j�r^tjj||j�|_	ny,|j
|tjj||j�d|�Wn�tk
r}zc|j
dkr��nI|jdkr�|jdd|j�n |jdd|j|jf�WYdd}~XnNtk
r\}z.|j
dkr6�n|jdd|�WYdd}~XnXdS(uxExtract a member from the archive to the current working directory,
           using its full name. Its file information is extracted as accurately
           as possible. `member' may be a filename or a TarInfo object. You can
           specify a different directory using `path'. File attributes (owner,
           mtime, mode) are set unless `set_attrs' is False.
        uru	set_attrsiiutarfile: %sutarfile: %s %rN(u_checku
isinstanceustru	getmemberuislnkuosupathujoinulinknameu_link_targetu_extract_memberunameuEnvironmentErroru
errorlevelufilenameuNoneu_dbgustrerroruExtractError(uselfumemberupathu	set_attrsutarinfoue((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuextractts&
!2uTarFile.extractcCs�|jd�t|t�r.|j|�}n|}|j�rP|j||�S|jtkro|j||�S|j�s�|j	�r�t|j
t�r�td��q�|j
|j|��SndSdS(u�Extract a member from the archive as a file object. `member' may be
           a filename or a TarInfo object. If `member' is a regular file, a
           file-like object is returned. If `member' is a link, a file-like
           object is constructed from the link's target. If `member' is none of
           the above, None is returned.
           The file-like object is read-only and provides the following
           methods: read(), readline(), readlines(), seek() and tell()
        uru'cannot extract (sym)link as file objectN(u_checku
isinstanceustru	getmemberuisregu
fileobjectutypeuSUPPORTED_TYPESuislnkuissymufileobju_StreamuStreamErroruextractfileu_find_link_targetuNone(uselfumemberutarinfo((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuextractfile�s	
uTarFile.extractfilecCs�|jd�}|jdtj�}tjj|�}|r_tjj|�r_tj|�n|j�sw|j	�r�|j
dd|j|jf�n|j
d|j�|j
�r�|j||�n�|j�r�|j||�n�|j�r
|j||�n�|j�s"|j�r5|j||�n]|j�sM|j	�r`|j||�n2|jtkr�|j||�n|j||�|r�|j||�|j	�s�|j||�|j||�q�ndS(u\Extract the TarInfo object tarinfo to a physical
           file called targetpath.
        u/iu%s -> %sN(urstripureplaceuosusepupathudirnameuexistsumakedirsuislnkuissymu_dbgunameulinknameuisregumakefileuisdirumakediruisfifoumakefifouischruisblkumakedevumakelinkutypeuSUPPORTED_TYPESumakeunknownuchownuchmoduutime(uselfutarinfou
targetpathu	set_attrsu	upperdirs((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_extract_member�s4#uTarFile._extract_membercCsXytj|d�Wn=tk
rS}z|jtjkrA�nWYdd}~XnXdS(u,Make a directory called targetpath.
        i�N(uosumkdiruEnvironmentErroruerrnouEEXIST(uselfutarinfou
targetpathue((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyumakedir�s
uTarFile.makedircCs�|j}|j|j�t|d�}|jdk	rqxJ|jD])\}}|j|�t|||�qAWnt|||j�|j|j�|j�|j	�dS(u'Make a file called targetpath.
        uwbN(
ufileobjuseekuoffset_datau	bltn_openusparseuNoneucopyfileobjusizeutruncateuclose(uselfutarinfou
targetpathusourceutargetuoffsetusize((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyumakefile�s	

uTarFile.makefilecCs+|j||�|jdd|j�dS(uYMake a file from a TarInfo object with an unknown type
           at targetpath.
        iu9tarfile: Unknown file type %r, extracted as regular file.N(umakefileu_dbgutype(uselfutarinfou
targetpath((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyumakeunknown	suTarFile.makeunknowncCs/ttd�rtj|�ntd��dS(u'Make a fifo called targetpath.
        umkfifoufifo not supported by systemN(uhasattruosumkfifouExtractError(uselfutarinfou
targetpath((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyumakefifo	suTarFile.makefifocCs�ttd�s ttd�r/td��n|j}|j�rT|tjO}n
|tjO}tj||tj	|j
|j��dS(u<Make a character or block device called targetpath.
        umknodumakedevu'special devices not supported by systemN(uhasattruosuExtractErrorumodeuisblkustatuS_IFBLKuS_IFCHRumknodumakedevudevmajorudevminor(uselfutarinfou
targetpathumode((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyumakedev	s 	
uTarFile.makedevcCsyj|j�r%tj|j|�nDtjj|j�rPtj|j|�n|j|j	|�|�WnQt
k
r�|j�r�tjjtjj|j
�|j�}n	|j}Yn?Xy|j|j	|�|�Wntk
r�td��YnXdS(u�Make a (symbolic) link called targetpath. If it cannot be created
          (platform limitation), we try to make a copy of the referenced file
          instead of a link.
        u%unable to resolve link inside archiveN(uissymuosusymlinkulinknameupathuexistsu_link_targetulinku_extract_memberu_find_link_targetusymlink_exceptionujoinudirnameunameuKeyErroruExtractError(uselfutarinfou
targetpathulinkpath((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyumakelink'	s"

uTarFile.makelinkc"Cs,tr(ttd�r(tj�dkr(ytj|j�d}Wntk
r^|j}YnXytj	|j
�d}Wntk
r�|j}YnXyZ|j�r�ttd�r�tj
|||�n%tjdkr�tj|||�nWq(tk
r$}ztd��WYdd}~Xq(XndS(u6Set owner of targetpath according to tarinfo.
        ugeteuidiiulchownuos2emxucould not change ownerN(upwduhasattruosugeteuidugrpugetgrnamugnameuKeyErrorugidugetpwnamuunameuuiduissymulchownusysuplatformuchownuEnvironmentErroruExtractError(uselfutarinfou
targetpathuguuue((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuchownD	s '

u
TarFile.chowncCsattd�r]ytj||j�Wq]tk
rY}ztd��WYdd}~Xq]XndS(uASet file permissions of targetpath according to tarinfo.
        uchmoducould not change modeN(uhasattruosuchmodumodeuEnvironmentErroruExtractError(uselfutarinfou
targetpathue((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuchmodZ	s
u
TarFile.chmodcCskttd�sdSy tj||j|jf�Wn1tk
rf}ztd��WYdd}~XnXdS(uBSet modification time of targetpath according to tarinfo.
        uutimeNu"could not change modification time(uhasattruosuutimeumtimeuEnvironmentErroruExtractError(uselfutarinfou
targetpathue((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuutimec	s u
TarFile.utimecCs'|jd�|jdk	r2|j}d|_|S|jj|j�d}x�y|jj|�}Wn�tk
r�}z@|j	r�|j
dd|j|f�|jt7_wNnWYdd}~Xn1tk
rI}zd|j	r|j
dd|j|f�|jt7_wNn$|jdkr7t
t|���nWYdd}~Xn�tk
rx|jdkrtt
d��nYntk
r�}z)|jdkr�t
t|���nWYdd}~Xn7tk
r�}zt
t|���WYdd}~XnXPqN|dk	r|jj|�n	d|_|S(u�Return the next member of the archive as a TarInfo object, when
           TarFile is opened for reading. Return None if there is no more
           available.
        uraiu0x%X: %sNiu
empty fileT(u_checkufirstmemberuNoneufileobjuseekuoffsetutarinfoufromtarfileuEOFHeaderErroruignore_zerosu_dbgu	BLOCKSIZEuInvalidHeaderErroru	ReadErrorustruEmptyHeaderErroruTruncatedHeaderErroruSubsequentHeaderErrorumembersuappenduTrueu_loaded(uselfumutarinfoue((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyunextn	sF
				'
'%	uTarFile.nextcCs�|j�}|dk	r4|d|j|��}n|rOtjj|�}nxKt|�D]=}|r�tjj|j�}n	|j}||kr\|Sq\WdS(u}Find an archive member by name from bottom to top.
           If tarinfo is given, it is used as the starting point.
        N(u
getmembersuNoneuindexuosupathunormpathureverseduname(uselfunameutarinfou	normalizeumembersumemberumember_name((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu
_getmember�	s	uTarFile._getmembercCs/x|j�}|dkrPqqd|_dS(uWRead through the entire archive file and look for readable
           members.
        NT(unextuNoneuTrueu_loaded(uselfutarinfo((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_load�	s
u
TarFile._loadcCsW|jr"td|jj��n|dk	rS|j|krStd|j��ndS(unCheck if TarFile is still open, and if the operation's mode
           corresponds to TarFile's mode.
        u%s is closedubad operation for mode %rN(ucloseduIOErroru	__class__u__name__uNoneumode(uselfumode((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_check�	s	uTarFile._checkcCs�|j�r5tjj|j�d|j}d}n|j}|}|j|d|dd�}|dkr~t	d|��n|S(uZFind the target member of a symlink or hardlink member in the
           archive.
        u/utarinfou	normalizeulinkname %r not foundNT(
uissymuosupathudirnameunameulinknameuNoneu
_getmemberuTrueuKeyError(uselfutarinfoulinknameulimitumember((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_find_link_target�	s 		uTarFile._find_link_targetcCs$|jrt|j�St|�SdS(u$Provide an iterator object.
        N(u_loadeduiterumembersuTarIter(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu__iter__�	s	
uTarFile.__iter__cCs)||jkr%t|dtj�ndS(u.Write debugging output to sys.stderr.
        ufileN(udebuguprintusysustderr(uselfulevelumsg((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu_dbg�	suTarFile._dbgcCs|j�|S(N(u_check(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu	__enter__�	s
uTarFile.__enter__cCs?|dkr|j�n"|js2|jj�nd|_dS(NT(uNoneucloseu_extfileobjufileobjuTrueuclosed(uselfutypeuvalueu	traceback((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu__exit__�	s

	uTarFile.__exit__NFT(:u__name__u
__module__u__qualname__u__doc__udebuguFalseudereferenceuignore_zerosu
errorleveluDEFAULT_FORMATuformatuENCODINGuencodinguNoneuerrorsuTarInfoutarinfouExFileObjectu
fileobjectu__init__uclassmethodu
RECORDSIZEuopenutaropenugzopenubz2openu	OPEN_METHucloseu	getmemberu
getmembersugetnamesu
gettarinfouTrueulistuadduaddfileu
extractalluextractuextractfileu_extract_memberumakedirumakefileumakeunknownumakefifoumakedevumakelinkuchownuchmoduutimeunextu
_getmemberu_loadu_checku_find_link_targetu__iter__u_dbgu	__enter__u__exit__(u
__locals__((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuTarFile,sniK

b>&#&0	1
	cBsD|EeZdZdZdd�Zdd�Zdd�ZeZdS(	uTarIteruMIterator Class.

       for tarinfo in TarFile(...):
           suite...
    cCs||_d|_dS(u$Construct a TarIter object.
        iN(utarfileuindex(uselfutarfile((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu__init__
s	uTarIter.__init__cCs|S(u Return iterator object.
        ((uself((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu__iter__
suTarIter.__iter__cCs~|jjs9|jj�}|skd|j_t�qkn2y|jj|j}Wntk
rjt�YnX|jd7_|S(u�Return the next item using TarFile's next() method.
           When all members have been read, set TarFile as _loaded.
        iT(utarfileu_loadedunextuTrueu
StopIterationumembersuindexu
IndexError(uselfutarinfo((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu__next__

s
uTarIter.__next__N(u__name__u
__module__u__qualname__u__doc__u__init__u__iter__u__next__unext(u
__locals__((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyuTarIter�	s
uTarItercCs;yt|�}|j�dSWntk
r6dSYnXdS(ufReturn True if name points to a tar archive that we
       are able to handle, else return False.
    NTF(uopenucloseuTrueuTarErroruFalse(unameut((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu
is_tarfile#
s

(xu
__future__uprint_functionu__version__uversionu
__author__u__date__u	__cvsid__u__credits__usysuosustatuerrnoutimeustructucopyureugrpupwduImportErroruNoneuAttributeErroruNotImplementedErrorusymlink_exceptionuWindowsErroru	NameErroru__all__uversion_infou__builtin__ubuiltinsuopenu_openuNULu	BLOCKSIZEu
RECORDSIZEu	GNU_MAGICuPOSIX_MAGICuLENGTH_NAMEuLENGTH_LINKu
LENGTH_PREFIXuREGTYPEuAREGTYPEuLNKTYPEuSYMTYPEuCHRTYPEuBLKTYPEuDIRTYPEuFIFOTYPEuCONTTYPEuGNUTYPE_LONGNAMEuGNUTYPE_LONGLINKuGNUTYPE_SPARSEuXHDTYPEuXGLTYPEuSOLARIS_XHDTYPEuUSTAR_FORMATu
GNU_FORMATu
PAX_FORMATuDEFAULT_FORMATuSUPPORTED_TYPESu
REGULAR_TYPESu	GNU_TYPESu
PAX_FIELDSusetuPAX_NAME_FIELDSufloatuintuPAX_NUMBER_FIELDSuS_IFLNKuS_IFREGuS_IFBLKuS_IFDIRuS_IFCHRuS_IFIFOuTSUIDuTSGIDuTSVTXuTUREADuTUWRITEuTUEXECuTGREADuTGWRITEuTGEXECuTOREADuTOWRITEuTOEXECunameuENCODINGugetfilesystemencodingustnuntsuntiuitnucalc_chksumsucopyfileobjufilemode_tableufilemodeu	ExceptionuTarErroruExtractErroru	ReadErroruCompressionErroruStreamErroruHeaderErroruEmptyHeaderErroruTruncatedHeaderErroruEOFHeaderErroruInvalidHeaderErroruSubsequentHeaderErroruobjectu
_LowLevelFileu_Streamu_StreamProxyu	_BZ2Proxyu_FileInFileuExFileObjectuTarInfouTarFileuTarIteru
is_tarfileu	bltn_open(((u>/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/tarfile.pyu<module>s.

	
					
	
					
	
	
	�?K��������*site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-33.pyc000064400000002770151733463560022717 0ustar00�
7�Re�c@s�dZddlZddlZdddgZyddlmZWn!ek
rdedd�ZYnXy
eZWn.e	k
r�ddl
mZd	d�ZYnXy
ejZWne
k
r�d
d�ZYnXdS(u/Backports for individual classes and functions.iNucache_from_sourceucallableufsencode(ucache_from_sourcecCs|rdpd}||S(Nucuo((upy_fileudebuguext((u;/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/misc.pyucache_from_sources(uCallablecCs
t|t�S(N(u
isinstanceuCallable(uobj((u;/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/misc.pyucallablescCsRt|t�r|St|t�r5|jtj��Stdt|�j��dS(Nuexpect bytes or str, not %s(	u
isinstanceubytesustruencodeusysugetfilesystemencodingu	TypeErrorutypeu__name__(ufilename((u;/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/misc.pyufsencode"s(u__doc__uosusysu__all__uimpucache_from_sourceuImportErroru	__debug__ucallableu	NameErrorucollectionsuCallableufsencodeuAttributeError(((u;/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/misc.pyu<module>s 




site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-33.pyc000064400000056406151733463560023775 0ustar00�
7�ReNic@s�dZddlZddlZddlZddlZddlmZmZyddlZWne	k
r|ddl
ZYnXdddddd	d
ddd
dgZdd�Zej
r�ejjeej
��Zneej��Zejdkr2dedCd�j�kr2eejjee��Znejdkr~dedDd�j�kr~eejjeee��Znejdkr�dedEd�j�kr�eejjeee��Zndd�Ze�ZdFadd�Zej�Zejd�Zdd�Zejj �dZ!ejdd�Z"e!de!d Z#ejj$ej%�Z&ejj$ej'�Z(da*dZ+d!d"�Z,d#d$�Z-d%d&�Z.d'd(�Z/d)d*�Z0d+d,�Z1dd-d.�Z2d/d�Z3d0d1�Z4d2d3�Z5dd4d�Z6d5d�Z7d6d
�Z8d7d	�Z9e0�ddGd8d
�Z;e0�ddGd9d�Z<d:d�Z=d;d�Z>d<d�Z?d=d�Z@d>d?�ZAd@dA�ZBeCdBkr�eB�ndS(Hu-Access to Python's configuration information.iN(upardirurealpathuget_config_h_filenameuget_config_varuget_config_varsuget_makefile_filenameuget_pathuget_path_namesu	get_pathsuget_platformuget_python_versionuget_scheme_namesuparse_config_hcCs+yt|�SWntk
r&|SYnXdS(N(urealpathuOSError(upath((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyu_safe_realpath"s
u_safe_realpathuntupcbuildiu\pc\vi
u\pcbuild\amd64icCs=x6dD].}tjjtjjtd|��rdSqWdS(Nu
Setup.distuSetup.localuModules(u
Setup.distuSetup.localTF(uosupathuisfileujoinu
_PROJECT_BASEuTrueuFalse(ufn((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyuis_python_build:s
$uis_python_buildcCs�ts�ddlm}tjdd�d}||�}|jd�}|sYtd��|j��}tj	|�WdQXt
r�x7dD],}tj|d
d�tj|dd
�q�WndandS(Ni(ufinderu.iiu
sysconfig.cfgusysconfig.cfg existsuposix_prefixu
posix_homeuincludeu{srcdir}/Includeuplatincludeu{projectbase}/.(uposix_prefixu
posix_homeT(
u	_cfg_readu	resourcesufinderu__name__ursplitufinduAssertionErroru	as_streamu_SCHEMESureadfpu
_PYTHON_BUILDusetuTrue(ufinderubackport_packageu_finderu_cfgfileususcheme((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyu_ensure_cfg_readDs
u_ensure_cfg_readu\{([^{]*?)\}cs0t�|jd�r(|jd�}n	t�}|j�}xb|D]Z}|dkr\qDnx?|D]7\}}|j||�r�qcn|j|||�qcWqDW|jd�xz|j�D]l}t|j|����fdd�}x<|j|�D]+\}}|j||t	j
||��q�Wq�WdS(Nuglobalscs0|jd�}|�kr#�|S|jd�S(Nii(ugroup(umatchobjuname(u	variables(u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyu	_replacerosu"_expand_globals.<locals>._replacer(u_ensure_cfg_readuhas_sectionuitemsutupleusectionsu
has_optionuseturemove_sectionudictu	_VAR_REPLusub(uconfiguglobalsusectionsusectionuoptionuvalueu	_replacer((u	variablesu@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyu_expand_globalsYs$	

u_expand_globalsiics"�fdd�}tj||�S(u�In the string `path`, replace tokens like {some.thing} with the
    corresponding value from the map `local_vars`.

    If there is no corresponding value, leave the token unchanged.
    csJ|jd�}|�kr#�|S|tjkr=tj|S|jd�S(Nii(ugroupuosuenviron(umatchobjuname(u
local_vars(u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyu	_replacer�su_subst_vars.<locals>._replacer(u	_VAR_REPLusub(upathu
local_varsu	_replacer((u
local_varsu@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyu_subst_vars�su_subst_varscCsI|j�}x6|j�D](\}}||kr7qn|||<qWdS(N(ukeysuitems(utarget_dictu
other_dictutarget_keysukeyuvalue((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyu_extend_dict�s
u_extend_dictcCs�i}|dkri}nt|t��x`tj|�D]O\}}tjdkrktjj|�}ntjj	t
||��||<q;W|S(Nuposixunt(uposixunt(uNoneu_extend_dictuget_config_varsu_SCHEMESuitemsuosunameupathu
expanduserunormpathu_subst_vars(uschemeuvarsuresukeyuvalue((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyu_expand_vars�s	#u_expand_varscs"�fdd�}tj||�S(Ncs0|jd�}|�kr#�|S|jd�S(Nii(ugroup(umatchobjuname(uvars(u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyu	_replacer�suformat_value.<locals>._replacer(u	_VAR_REPLusub(uvalueuvarsu	_replacer((uvarsu@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyuformat_value�suformat_valuecCstjdkrdStjS(Nuposixuposix_prefix(uosuname(((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyu_get_default_scheme�su_get_default_schemec	Cs�tjjdd�}dd�}tjdkrbtjjd�pEd}|rR|S||d�Sntjdkr�td	�}|r�|r�|S|dd
|dtjdd��Sq�n|r�|S|dd
�SdS(NuPYTHONUSERBASEcWstjjtjj|��S(N(uosupathu
expanduserujoin(uargs((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyujoinuser�su_getuserbase.<locals>.joinuseruntuAPPDATAu~uPythonudarwinuPYTHONFRAMEWORKuLibraryu%d.%diu.local(	uosuenvironugetuNoneunameusysuplatformuget_config_varuversion_info(uenv_baseujoinuserubaseu	framework((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyu_getuserbase�s"u_getuserbasecCstjd�}tjd�}tjd�}|dkrBi}ni}i}tj|dddd��}|j�}WdQXx�|D]�}	|	jd	�s�|	j�d
kr�q�n|j|	�}
|
r�|
j	dd�\}}|j�}|j
d
d
�}
d|
kr|||<q^yt|�}Wn(tk
rP|j
d
d�||<Yq^X|||<q�q�Wt
|j��}d}xNt|�dkr�x5t|�D]'}||}|j|�p�|j|�}
|
dk	r�|
j	d�}d}||kr
t||�}n�||krd}n�|tjkr>tj|}nx||kr�|jd�rx|dd�|krxd
}q�d||kr�d}q�t|d|�}nd
||<}|r�||
j�d�}|d|
j��||}d|kr	|||<q�yt|�}Wn"tk
r=|j�||<YnX|||<|j|�|jd�r�|dd�|kr�|dd�}||kr�|||<q�q�q�q�|||<|j|�q�Wq}Wx<|j�D].\}}t|t�r�|j�||<q�q�W|j|�|S(u�Parse a Makefile-style file.

    A dictionary containing name/value pairs is returned.  If an
    optional dictionary is passed in as the second argument, it is
    used instead of a new dictionary.
    u"([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)u\$\(([A-Za-z][A-Za-z0-9_]*)\)u\${([A-Za-z][A-Za-z0-9_]*)}uencodinguutf-8uerrorsusurrogateescapeNu#uiiu$$u$uCFLAGSuLDFLAGSuCPPFLAGSiuPY_i(uCFLAGSuLDFLAGSuCPPFLAGSTF(ureucompileuNoneucodecsuopenu	readlinesu
startswithustripumatchugroupureplaceuintu
ValueErrorulistukeysulenutupleusearchuTrueustruFalseuosuenvironuendustarturemoveuitemsu
isinstanceuupdate(ufilenameuvarsu_variable_rxu_findvar1_rxu_findvar2_rxudoneunotdoneufulinesulineumunuvutmpvu	variablesurenamed_variablesunameuvalueufounduitemuafteruk((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyu_parse_makefile�s�		
!


			





u_parse_makefilecCs`trtjjtd�Sttd�r>dttjf}nd}tjjt	d�|d�S(u Return the path of the Makefile.uMakefileuabiflagsuconfig-%s%suconfigustdlib(
u
_PYTHON_BUILDuosupathujoinu
_PROJECT_BASEuhasattrusysu_PY_VERSION_SHORTuabiflagsuget_path(uconfig_dir_name((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyuget_makefile_filenameMscCs&t�}yt||�Wn^tk
rz}z>d|}t|d�r\|d|j}nt|��WYdd}~XnXt�}y&t|��}t||�WdQXWn^tk
r
}z>d|}t|d�r�|d|j}nt|��WYdd}~XnXtr"|d|d<ndS(u7Initialize the module as appropriate for POSIX systems.u.invalid Python installation: unable to open %sustrerroru (%s)Nu	BLDSHAREDuLDSHARED(	uget_makefile_filenameu_parse_makefileuIOErroruhasattrustrerroruget_config_h_filenameuopenuparse_config_hu
_PYTHON_BUILD(uvarsumakefileueumsguconfig_huf((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyu_init_posixXs&	
	
u_init_posixcCsqtd�|d<td�|d<td�|d<d|d<d	|d
<t|d<tjjttj��|d<d
S(u+Initialize the module as appropriate for NTustdlibuLIBDESTu
platstdlibu
BINLIBDESTuincludeu	INCLUDEPYu.pyduSOu.exeuEXEuVERSIONuBINDIRN(uget_pathu_PY_VERSION_SHORT_NO_DOTuosupathudirnameu_safe_realpathusysu
executable(uvars((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyu_init_non_posixts


u_init_non_posixcCs�|dkri}ntjd�}tjd�}x�|j�}|sLPn|j|�}|r�|jdd�\}}yt|�}Wntk
r�YnX|||<q6|j|�}|r6d||jd�<q6q6|S(u�Parse a config.h-style file.

    A dictionary containing name/value pairs is returned.  If an
    optional dictionary is passed in as the second argument, it is
    used instead of a new dictionary.
    u"#define ([A-Z][A-Za-z0-9_]+) (.*)
u&/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/
iiiN(uNoneureucompileureadlineumatchugroupuintu
ValueError(ufpuvarsu	define_rxuundef_rxulineumunuv((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyuparse_config_h�s(	

cCsUtr6tjdkr-tjjtd�}qBt}ntd�}tjj|d�S(uReturn the path of pyconfig.h.untuPCuplatincludeu
pyconfig.h(u
_PYTHON_BUILDuosunameupathujoinu
_PROJECT_BASEuget_path(uinc_dir((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyuget_config_h_filename�s	cCstttj���S(u,Return a tuple containing the schemes names.(utupleusortedu_SCHEMESusections(((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyuget_scheme_names�scCs
tjd�S(u*Return a tuple containing the paths names.uposix_prefix(u_SCHEMESuoptions(((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyuget_path_names�scCs1t�|rt||�Sttj|��SdS(u�Return a mapping containing an install scheme.

    ``scheme`` is the install scheme name. If not provided, it will
    return the default scheme for the current platform.
    N(u_ensure_cfg_readu_expand_varsudictu_SCHEMESuitems(uschemeuvarsuexpand((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyu	get_paths�s
cCst|||�|S(u[Return a path corresponding to the scheme.

    ``scheme`` is the install scheme name.
    (u	get_paths(unameuschemeuvarsuexpand((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyuget_path�scGs�td"krTiattd<ttd<ttd<ttd<tdtdtd<ttd<ttd	<ttd
<ytjtd<Wnt	k
r�dtd<YnXt
jd#kr�tt�nt
jdkr�t
t�ntjdkr�t�td<ndtkrttd<nttd�td<tr�t
jdkr�t}yt
j�}Wntk
rgd"}YnXt
jjtd�r�||kr�t
jj|td�}t
jj|�td<q�ntjdkrTt
j�d}t|jd�d�}|dkrVxGd$D]D}t|}tjdd|�}tjdd|�}|t|<qWqQdt
jkr�t
jd}xHd%D]=}t|}tjdd|�}|d|}|t|<qyWntjdd�}	tj d|	�}
|
d"k	rQ|
j!d �}t
jj"|�sNx:d&D]/}t|}tjd!d|�}|t|<qWqNqQqTn|r�g}x$|D]}
|j#tj|
��qgW|StSd"S('uyWith no arguments, return a dictionary of all configuration
    variables relevant for the current platform.

    On Unix, this means every variable defined in Python's installed Makefile;
    On Windows and Mac OS it's a much smaller set.

    With arguments, return a list of values that result from looking up
    each argument in the configuration variable dictionary.
    uprefixuexec_prefixu
py_versionupy_version_shortiiupy_version_nodotubaseuplatbaseuprojectbaseuabiflagsuuntuos2uposixu2.6uuserbaseusrcdirudarwinu.iuLDFLAGSu
BASECFLAGSuCFLAGSu	PY_CFLAGSu	BLDSHAREDu
-arch\s+\w+\su u-isysroot [^ 	]*u	ARCHFLAGSu-isysroot\s+(\S+)iu-isysroot\s+\S+(\s|$)N(untuos2(uLDFLAGSu
BASECFLAGSuCFLAGSu	PY_CFLAGSu	BLDSHARED(uLDFLAGSu
BASECFLAGSuCFLAGSu	PY_CFLAGSu	BLDSHARED(uLDFLAGSu
BASECFLAGSuCFLAGSu	PY_CFLAGSu	BLDSHARED($u_CONFIG_VARSuNoneu_PREFIXu_EXEC_PREFIXu_PY_VERSIONu_PY_VERSION_SHORTu
_PROJECT_BASEusysuabiflagsuAttributeErroruosunameu_init_non_posixu_init_posixuversionu_getuserbaseu_safe_realpathu
_PYTHON_BUILDugetcwduOSErrorupathuisabsujoinunormpathuplatformuunameuintusplitureusubuenvironugetusearchugroupuexistsuappend(uargsubaseucwdusrcdirukernel_versionu
major_versionukeyuflagsuarchuCFLAGSumusdkuvalsuname((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyuget_config_vars�s�



















cCst�j|�S(u�Return the value of a single variable using the dictionary returned by
    'get_config_vars()'.

    Equivalent to get_config_vars().get(name)
    (uget_config_varsuget(uname((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyuget_config_varRscCs�tjdkr�d}tjj|�}|d:kr:tjStjjd|�}tj|t|�|�j�}|dkr�dS|dkr�dStjStjd	ks�ttd
�r�tjStj	�\}}}}}|j�j
dd�}|j
d
d�}|j
dd�}|dd�dkr:d||fS|dd�dkr�|ddkrzd}dt|d�d|dd�f}qzn�|dd�dkr�d||fS|dd�dkr�d|||fS|dd�d kr1d }tj
d!�}	|	j|�}
|
rz|
j�}qznI|dd�d"krzt�}|jd#�}|}
ytd$�}Wntk
r�YneXztjd%|j��}
Wd|j�X|
dk	r�d&j|
jd�jd&�dd��}
n|s�|
}n|rz|}d'}|
d&d(kr d)t�jd*d�j�kr d+}t�jd*�}tjd,|�}ttt|���}t|�dkr�|d}qt|d;kr�d+}qt|d<kr�d0}qt|d=kr�d1}qt|d>kr�d3}qt|d?kr
d4}qttd5|f��qw|d-krGtj d@krtd/}qtqw|dAkrwtj dBkrkd2}qtd.}qwqznd9|||fS(Cu�Return a string that identifies the current platform.

    This is used mainly to distinguish platform-specific build directories and
    platform-specific built distributions.  Typically includes the OS name
    and version and the architecture (as supplied by 'os.uname()'),
    although the exact information included depends on the OS; eg. for IRIX
    the architecture isn't particularly important (IRIX only runs on SGI
    hardware), but for Linux the kernel version isn't particularly
    important.

    Examples of returned values:
       linux-i586
       linux-alpha (?)
       solaris-2.6-sun4u
       irix-5.3
       irix64-6.2

    Windows will return one of:
       win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc)
       win-ia64 (64bit Windows on Itanium)
       win32 (all others - specifically, sys.platform is returned)

    For other non-POSIX platforms, currently just returns 'sys.platform'.
    untu bit (iu)uamd64u	win-amd64uitaniumuwin-ia64uposixuunameu/uu u_u-Niulinuxu%s-%susunosiu5usolarisu%d.%siiiuirixuaixu%s-%s.%siucygwinu[\d.]+udarwinuMACOSX_DEPLOYMENT_TARGETu0/System/Library/CoreServices/SystemVersion.plistu=<key>ProductUserVisibleVersion</key>\s*<string>(.*?)</string>u.umacosxu10.4.u-archuCFLAGSufatu
-arch\s+(\S+)ui386uppcux86_64uintelufat3uppc64ufat64u	universalu%Don't know machine value for archs=%ri uPowerPCuPower_Macintoshu%s-%s-%si����(ui386uppc(ui386ux86_64(ui386uppcux86_64(uppc64ux86_64(ui386uppcuppc64ux86_64l(uPowerPCuPower_Macintoshl(!uosunameusysuversionufinduplatformulenuloweruhasattruunameureplaceuintureucompileumatchugroupuget_config_varsugetuopenuIOErrorusearchureaducloseuNoneujoinusplitustripufindallutupleusortedusetu
ValueErrorumaxsize(uprefixuiujulookuosnameuhostureleaseuversionumachineurel_reumucfgvarsumacveru
macreleaseufucflagsuarchs((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyuget_platform[s�#.	
	.	!
						cCstS(N(u_PY_VERSION_SHORT(((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyuget_python_version�scCsdx]tt|j���D]C\}\}}|dkrHtd|�ntd||f�qWdS(Niu%s: u
	%s = "%s"(u	enumerateusorteduitemsuprint(utitleudatauindexukeyuvalue((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyu_print_dicts+u_print_dictcCsetdt��tdt��tdt��t�tdt��t�tdt��dS(u*Display all information sysconfig detains.uPlatform: "%s"uPython version: "%s"u!Current installation scheme: "%s"uPathsu	VariablesN(uprintuget_platformuget_python_versionu_get_default_schemeu_print_dictu	get_pathsuget_config_vars(((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyu_mainsu_mainu__main__i����i����i�FT(Du__doc__ucodecsuosureusysuos.pathupardirurealpathuconfigparseruImportErroruConfigParseru__all__u_safe_realpathu
executableupathudirnameu
_PROJECT_BASEugetcwdunameulowerujoinuis_python_buildu
_PYTHON_BUILDuFalseu	_cfg_readu_ensure_cfg_readuRawConfigParseru_SCHEMESucompileu	_VAR_REPLu_expand_globalsuversionusplitu_PY_VERSIONu_PY_VERSION_SHORTu_PY_VERSION_SHORT_NO_DOTunormpathuprefixu_PREFIXuexec_prefixu_EXEC_PREFIXuNoneu_CONFIG_VARSu
_USER_BASEu_subst_varsu_extend_dictu_expand_varsuformat_valueu_get_default_schemeu_getuserbaseu_parse_makefileuget_makefile_filenameu_init_posixu_init_non_posixuparse_config_huget_config_h_filenameuget_scheme_namesuget_path_namesuTrueu	get_pathsuget_pathuget_config_varsuget_config_varuget_platformuget_python_versionu_print_dictu_mainu__name__(((u@/tmp/pip-zej_zi-build/pip/_vendor/distlib/_backport/sysconfig.pyu<module>s�
		++!+!	#
	v
�	�site-packages/pip/_vendor/distlib/_backport/tarfile.py000064400000264723151733463560017141 0ustar00#-------------------------------------------------------------------
# tarfile.py
#-------------------------------------------------------------------
# Copyright (C) 2002 Lars Gustaebel <lars@gustaebel.de>
# All rights reserved.
#
# Permission  is  hereby granted,  free  of charge,  to  any person
# obtaining a  copy of  this software  and associated documentation
# files  (the  "Software"),  to   deal  in  the  Software   without
# restriction,  including  without limitation  the  rights to  use,
# copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies  of  the  Software,  and to  permit  persons  to  whom the
# Software  is  furnished  to  do  so,  subject  to  the  following
# conditions:
#
# The above copyright  notice and this  permission notice shall  be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS  IS", WITHOUT WARRANTY OF ANY  KIND,
# EXPRESS OR IMPLIED, INCLUDING  BUT NOT LIMITED TO  THE WARRANTIES
# OF  MERCHANTABILITY,  FITNESS   FOR  A  PARTICULAR   PURPOSE  AND
# NONINFRINGEMENT.  IN  NO  EVENT SHALL  THE  AUTHORS  OR COPYRIGHT
# HOLDERS  BE LIABLE  FOR ANY  CLAIM, DAMAGES  OR OTHER  LIABILITY,
# WHETHER  IN AN  ACTION OF  CONTRACT, TORT  OR OTHERWISE,  ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
#
from __future__ import print_function

"""Read from and write to tar format archives.
"""

__version__ = "$Revision$"

version     = "0.9.0"
__author__  = "Lars Gust\u00e4bel (lars@gustaebel.de)"
__date__    = "$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $"
__cvsid__   = "$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $"
__credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend."

#---------
# Imports
#---------
import sys
import os
import stat
import errno
import time
import struct
import copy
import re

try:
    import grp, pwd
except ImportError:
    grp = pwd = None

# os.symlink on Windows prior to 6.0 raises NotImplementedError
symlink_exception = (AttributeError, NotImplementedError)
try:
    # WindowsError (1314) will be raised if the caller does not hold the
    # SeCreateSymbolicLinkPrivilege privilege
    symlink_exception += (WindowsError,)
except NameError:
    pass

# from tarfile import *
__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError"]

if sys.version_info[0] < 3:
    import __builtin__ as builtins
else:
    import builtins

_open = builtins.open   # Since 'open' is TarFile.open

#---------------------------------------------------------
# tar constants
#---------------------------------------------------------
NUL = b"\0"                     # the null character
BLOCKSIZE = 512                 # length of processing blocks
RECORDSIZE = BLOCKSIZE * 20     # length of records
GNU_MAGIC = b"ustar  \0"        # magic gnu tar string
POSIX_MAGIC = b"ustar\x0000"    # magic posix tar string

LENGTH_NAME = 100               # maximum length of a filename
LENGTH_LINK = 100               # maximum length of a linkname
LENGTH_PREFIX = 155             # maximum length of the prefix field

REGTYPE = b"0"                  # regular file
AREGTYPE = b"\0"                # regular file
LNKTYPE = b"1"                  # link (inside tarfile)
SYMTYPE = b"2"                  # symbolic link
CHRTYPE = b"3"                  # character special device
BLKTYPE = b"4"                  # block special device
DIRTYPE = b"5"                  # directory
FIFOTYPE = b"6"                 # fifo special device
CONTTYPE = b"7"                 # contiguous file

GNUTYPE_LONGNAME = b"L"         # GNU tar longname
GNUTYPE_LONGLINK = b"K"         # GNU tar longlink
GNUTYPE_SPARSE = b"S"           # GNU tar sparse file

XHDTYPE = b"x"                  # POSIX.1-2001 extended header
XGLTYPE = b"g"                  # POSIX.1-2001 global header
SOLARIS_XHDTYPE = b"X"          # Solaris extended header

USTAR_FORMAT = 0                # POSIX.1-1988 (ustar) format
GNU_FORMAT = 1                  # GNU tar format
PAX_FORMAT = 2                  # POSIX.1-2001 (pax) format
DEFAULT_FORMAT = GNU_FORMAT

#---------------------------------------------------------
# tarfile constants
#---------------------------------------------------------
# File types that tarfile supports:
SUPPORTED_TYPES = (REGTYPE, AREGTYPE, LNKTYPE,
                   SYMTYPE, DIRTYPE, FIFOTYPE,
                   CONTTYPE, CHRTYPE, BLKTYPE,
                   GNUTYPE_LONGNAME, GNUTYPE_LONGLINK,
                   GNUTYPE_SPARSE)

# File types that will be treated as a regular file.
REGULAR_TYPES = (REGTYPE, AREGTYPE,
                 CONTTYPE, GNUTYPE_SPARSE)

# File types that are part of the GNU tar format.
GNU_TYPES = (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK,
             GNUTYPE_SPARSE)

# Fields from a pax header that override a TarInfo attribute.
PAX_FIELDS = ("path", "linkpath", "size", "mtime",
              "uid", "gid", "uname", "gname")

# Fields from a pax header that are affected by hdrcharset.
PAX_NAME_FIELDS = set(("path", "linkpath", "uname", "gname"))

# Fields in a pax header that are numbers, all other fields
# are treated as strings.
PAX_NUMBER_FIELDS = {
    "atime": float,
    "ctime": float,
    "mtime": float,
    "uid": int,
    "gid": int,
    "size": int
}

#---------------------------------------------------------
# Bits used in the mode field, values in octal.
#---------------------------------------------------------
S_IFLNK = 0o120000        # symbolic link
S_IFREG = 0o100000        # regular file
S_IFBLK = 0o060000        # block device
S_IFDIR = 0o040000        # directory
S_IFCHR = 0o020000        # character device
S_IFIFO = 0o010000        # fifo

TSUID   = 0o4000          # set UID on execution
TSGID   = 0o2000          # set GID on execution
TSVTX   = 0o1000          # reserved

TUREAD  = 0o400           # read by owner
TUWRITE = 0o200           # write by owner
TUEXEC  = 0o100           # execute/search by owner
TGREAD  = 0o040           # read by group
TGWRITE = 0o020           # write by group
TGEXEC  = 0o010           # execute/search by group
TOREAD  = 0o004           # read by other
TOWRITE = 0o002           # write by other
TOEXEC  = 0o001           # execute/search by other

#---------------------------------------------------------
# initialization
#---------------------------------------------------------
if os.name in ("nt", "ce"):
    ENCODING = "utf-8"
else:
    ENCODING = sys.getfilesystemencoding()

#---------------------------------------------------------
# Some useful functions
#---------------------------------------------------------

def stn(s, length, encoding, errors):
    """Convert a string to a null-terminated bytes object.
    """
    s = s.encode(encoding, errors)
    return s[:length] + (length - len(s)) * NUL

def nts(s, encoding, errors):
    """Convert a null-terminated bytes object to a string.
    """
    p = s.find(b"\0")
    if p != -1:
        s = s[:p]
    return s.decode(encoding, errors)

def nti(s):
    """Convert a number field to a python number.
    """
    # There are two possible encodings for a number field, see
    # itn() below.
    if s[0] != chr(0o200):
        try:
            n = int(nts(s, "ascii", "strict") or "0", 8)
        except ValueError:
            raise InvalidHeaderError("invalid header")
    else:
        n = 0
        for i in range(len(s) - 1):
            n <<= 8
            n += ord(s[i + 1])
    return n

def itn(n, digits=8, format=DEFAULT_FORMAT):
    """Convert a python number to a number field.
    """
    # POSIX 1003.1-1988 requires numbers to be encoded as a string of
    # octal digits followed by a null-byte, this allows values up to
    # (8**(digits-1))-1. GNU tar allows storing numbers greater than
    # that if necessary. A leading 0o200 byte indicates this particular
    # encoding, the following digits-1 bytes are a big-endian
    # representation. This allows values up to (256**(digits-1))-1.
    if 0 <= n < 8 ** (digits - 1):
        s = ("%0*o" % (digits - 1, n)).encode("ascii") + NUL
    else:
        if format != GNU_FORMAT or n >= 256 ** (digits - 1):
            raise ValueError("overflow in number field")

        if n < 0:
            # XXX We mimic GNU tar's behaviour with negative numbers,
            # this could raise OverflowError.
            n = struct.unpack("L", struct.pack("l", n))[0]

        s = bytearray()
        for i in range(digits - 1):
            s.insert(0, n & 0o377)
            n >>= 8
        s.insert(0, 0o200)
    return s

def calc_chksums(buf):
    """Calculate the checksum for a member's header by summing up all
       characters except for the chksum field which is treated as if
       it was filled with spaces. According to the GNU tar sources,
       some tars (Sun and NeXT) calculate chksum with signed char,
       which will be different if there are chars in the buffer with
       the high bit set. So we calculate two checksums, unsigned and
       signed.
    """
    unsigned_chksum = 256 + sum(struct.unpack("148B", buf[:148]) + struct.unpack("356B", buf[156:512]))
    signed_chksum = 256 + sum(struct.unpack("148b", buf[:148]) + struct.unpack("356b", buf[156:512]))
    return unsigned_chksum, signed_chksum

def copyfileobj(src, dst, length=None):
    """Copy length bytes from fileobj src to fileobj dst.
       If length is None, copy the entire content.
    """
    if length == 0:
        return
    if length is None:
        while True:
            buf = src.read(16*1024)
            if not buf:
                break
            dst.write(buf)
        return

    BUFSIZE = 16 * 1024
    blocks, remainder = divmod(length, BUFSIZE)
    for b in range(blocks):
        buf = src.read(BUFSIZE)
        if len(buf) < BUFSIZE:
            raise IOError("end of file reached")
        dst.write(buf)

    if remainder != 0:
        buf = src.read(remainder)
        if len(buf) < remainder:
            raise IOError("end of file reached")
        dst.write(buf)
    return

filemode_table = (
    ((S_IFLNK,      "l"),
     (S_IFREG,      "-"),
     (S_IFBLK,      "b"),
     (S_IFDIR,      "d"),
     (S_IFCHR,      "c"),
     (S_IFIFO,      "p")),

    ((TUREAD,       "r"),),
    ((TUWRITE,      "w"),),
    ((TUEXEC|TSUID, "s"),
     (TSUID,        "S"),
     (TUEXEC,       "x")),

    ((TGREAD,       "r"),),
    ((TGWRITE,      "w"),),
    ((TGEXEC|TSGID, "s"),
     (TSGID,        "S"),
     (TGEXEC,       "x")),

    ((TOREAD,       "r"),),
    ((TOWRITE,      "w"),),
    ((TOEXEC|TSVTX, "t"),
     (TSVTX,        "T"),
     (TOEXEC,       "x"))
)

def filemode(mode):
    """Convert a file's mode to a string of the form
       -rwxrwxrwx.
       Used by TarFile.list()
    """
    perm = []
    for table in filemode_table:
        for bit, char in table:
            if mode & bit == bit:
                perm.append(char)
                break
        else:
            perm.append("-")
    return "".join(perm)

class TarError(Exception):
    """Base exception."""
    pass
class ExtractError(TarError):
    """General exception for extract errors."""
    pass
class ReadError(TarError):
    """Exception for unreadble tar archives."""
    pass
class CompressionError(TarError):
    """Exception for unavailable compression methods."""
    pass
class StreamError(TarError):
    """Exception for unsupported operations on stream-like TarFiles."""
    pass
class HeaderError(TarError):
    """Base exception for header errors."""
    pass
class EmptyHeaderError(HeaderError):
    """Exception for empty headers."""
    pass
class TruncatedHeaderError(HeaderError):
    """Exception for truncated headers."""
    pass
class EOFHeaderError(HeaderError):
    """Exception for end of file headers."""
    pass
class InvalidHeaderError(HeaderError):
    """Exception for invalid headers."""
    pass
class SubsequentHeaderError(HeaderError):
    """Exception for missing and invalid extended headers."""
    pass

#---------------------------
# internal stream interface
#---------------------------
class _LowLevelFile(object):
    """Low-level file object. Supports reading and writing.
       It is used instead of a regular file object for streaming
       access.
    """

    def __init__(self, name, mode):
        mode = {
            "r": os.O_RDONLY,
            "w": os.O_WRONLY | os.O_CREAT | os.O_TRUNC,
        }[mode]
        if hasattr(os, "O_BINARY"):
            mode |= os.O_BINARY
        self.fd = os.open(name, mode, 0o666)

    def close(self):
        os.close(self.fd)

    def read(self, size):
        return os.read(self.fd, size)

    def write(self, s):
        os.write(self.fd, s)

class _Stream(object):
    """Class that serves as an adapter between TarFile and
       a stream-like object.  The stream-like object only
       needs to have a read() or write() method and is accessed
       blockwise.  Use of gzip or bzip2 compression is possible.
       A stream-like object could be for example: sys.stdin,
       sys.stdout, a socket, a tape device etc.

       _Stream is intended to be used only internally.
    """

    def __init__(self, name, mode, comptype, fileobj, bufsize):
        """Construct a _Stream object.
        """
        self._extfileobj = True
        if fileobj is None:
            fileobj = _LowLevelFile(name, mode)
            self._extfileobj = False

        if comptype == '*':
            # Enable transparent compression detection for the
            # stream interface
            fileobj = _StreamProxy(fileobj)
            comptype = fileobj.getcomptype()

        self.name     = name or ""
        self.mode     = mode
        self.comptype = comptype
        self.fileobj  = fileobj
        self.bufsize  = bufsize
        self.buf      = b""
        self.pos      = 0
        self.closed   = False

        try:
            if comptype == "gz":
                try:
                    import zlib
                except ImportError:
                    raise CompressionError("zlib module is not available")
                self.zlib = zlib
                self.crc = zlib.crc32(b"")
                if mode == "r":
                    self._init_read_gz()
                else:
                    self._init_write_gz()

            if comptype == "bz2":
                try:
                    import bz2
                except ImportError:
                    raise CompressionError("bz2 module is not available")
                if mode == "r":
                    self.dbuf = b""
                    self.cmp = bz2.BZ2Decompressor()
                else:
                    self.cmp = bz2.BZ2Compressor()
        except:
            if not self._extfileobj:
                self.fileobj.close()
            self.closed = True
            raise

    def __del__(self):
        if hasattr(self, "closed") and not self.closed:
            self.close()

    def _init_write_gz(self):
        """Initialize for writing with gzip compression.
        """
        self.cmp = self.zlib.compressobj(9, self.zlib.DEFLATED,
                                            -self.zlib.MAX_WBITS,
                                            self.zlib.DEF_MEM_LEVEL,
                                            0)
        timestamp = struct.pack("<L", int(time.time()))
        self.__write(b"\037\213\010\010" + timestamp + b"\002\377")
        if self.name.endswith(".gz"):
            self.name = self.name[:-3]
        # RFC1952 says we must use ISO-8859-1 for the FNAME field.
        self.__write(self.name.encode("iso-8859-1", "replace") + NUL)

    def write(self, s):
        """Write string s to the stream.
        """
        if self.comptype == "gz":
            self.crc = self.zlib.crc32(s, self.crc)
        self.pos += len(s)
        if self.comptype != "tar":
            s = self.cmp.compress(s)
        self.__write(s)

    def __write(self, s):
        """Write string s to the stream if a whole new block
           is ready to be written.
        """
        self.buf += s
        while len(self.buf) > self.bufsize:
            self.fileobj.write(self.buf[:self.bufsize])
            self.buf = self.buf[self.bufsize:]

    def close(self):
        """Close the _Stream object. No operation should be
           done on it afterwards.
        """
        if self.closed:
            return

        if self.mode == "w" and self.comptype != "tar":
            self.buf += self.cmp.flush()

        if self.mode == "w" and self.buf:
            self.fileobj.write(self.buf)
            self.buf = b""
            if self.comptype == "gz":
                # The native zlib crc is an unsigned 32-bit integer, but
                # the Python wrapper implicitly casts that to a signed C
                # long.  So, on a 32-bit box self.crc may "look negative",
                # while the same crc on a 64-bit box may "look positive".
                # To avoid irksome warnings from the `struct` module, force
                # it to look positive on all boxes.
                self.fileobj.write(struct.pack("<L", self.crc & 0xffffffff))
                self.fileobj.write(struct.pack("<L", self.pos & 0xffffFFFF))

        if not self._extfileobj:
            self.fileobj.close()

        self.closed = True

    def _init_read_gz(self):
        """Initialize for reading a gzip compressed fileobj.
        """
        self.cmp = self.zlib.decompressobj(-self.zlib.MAX_WBITS)
        self.dbuf = b""

        # taken from gzip.GzipFile with some alterations
        if self.__read(2) != b"\037\213":
            raise ReadError("not a gzip file")
        if self.__read(1) != b"\010":
            raise CompressionError("unsupported compression method")

        flag = ord(self.__read(1))
        self.__read(6)

        if flag & 4:
            xlen = ord(self.__read(1)) + 256 * ord(self.__read(1))
            self.read(xlen)
        if flag & 8:
            while True:
                s = self.__read(1)
                if not s or s == NUL:
                    break
        if flag & 16:
            while True:
                s = self.__read(1)
                if not s or s == NUL:
                    break
        if flag & 2:
            self.__read(2)

    def tell(self):
        """Return the stream's file pointer position.
        """
        return self.pos

    def seek(self, pos=0):
        """Set the stream's file pointer to pos. Negative seeking
           is forbidden.
        """
        if pos - self.pos >= 0:
            blocks, remainder = divmod(pos - self.pos, self.bufsize)
            for i in range(blocks):
                self.read(self.bufsize)
            self.read(remainder)
        else:
            raise StreamError("seeking backwards is not allowed")
        return self.pos

    def read(self, size=None):
        """Return the next size number of bytes from the stream.
           If size is not defined, return all bytes of the stream
           up to EOF.
        """
        if size is None:
            t = []
            while True:
                buf = self._read(self.bufsize)
                if not buf:
                    break
                t.append(buf)
            buf = "".join(t)
        else:
            buf = self._read(size)
        self.pos += len(buf)
        return buf

    def _read(self, size):
        """Return size bytes from the stream.
        """
        if self.comptype == "tar":
            return self.__read(size)

        c = len(self.dbuf)
        while c < size:
            buf = self.__read(self.bufsize)
            if not buf:
                break
            try:
                buf = self.cmp.decompress(buf)
            except IOError:
                raise ReadError("invalid compressed data")
            self.dbuf += buf
            c += len(buf)
        buf = self.dbuf[:size]
        self.dbuf = self.dbuf[size:]
        return buf

    def __read(self, size):
        """Return size bytes from stream. If internal buffer is empty,
           read another block from the stream.
        """
        c = len(self.buf)
        while c < size:
            buf = self.fileobj.read(self.bufsize)
            if not buf:
                break
            self.buf += buf
            c += len(buf)
        buf = self.buf[:size]
        self.buf = self.buf[size:]
        return buf
# class _Stream

class _StreamProxy(object):
    """Small proxy class that enables transparent compression
       detection for the Stream interface (mode 'r|*').
    """

    def __init__(self, fileobj):
        self.fileobj = fileobj
        self.buf = self.fileobj.read(BLOCKSIZE)

    def read(self, size):
        self.read = self.fileobj.read
        return self.buf

    def getcomptype(self):
        if self.buf.startswith(b"\037\213\010"):
            return "gz"
        if self.buf.startswith(b"BZh91"):
            return "bz2"
        return "tar"

    def close(self):
        self.fileobj.close()
# class StreamProxy

class _BZ2Proxy(object):
    """Small proxy class that enables external file object
       support for "r:bz2" and "w:bz2" modes. This is actually
       a workaround for a limitation in bz2 module's BZ2File
       class which (unlike gzip.GzipFile) has no support for
       a file object argument.
    """

    blocksize = 16 * 1024

    def __init__(self, fileobj, mode):
        self.fileobj = fileobj
        self.mode = mode
        self.name = getattr(self.fileobj, "name", None)
        self.init()

    def init(self):
        import bz2
        self.pos = 0
        if self.mode == "r":
            self.bz2obj = bz2.BZ2Decompressor()
            self.fileobj.seek(0)
            self.buf = b""
        else:
            self.bz2obj = bz2.BZ2Compressor()

    def read(self, size):
        x = len(self.buf)
        while x < size:
            raw = self.fileobj.read(self.blocksize)
            if not raw:
                break
            data = self.bz2obj.decompress(raw)
            self.buf += data
            x += len(data)

        buf = self.buf[:size]
        self.buf = self.buf[size:]
        self.pos += len(buf)
        return buf

    def seek(self, pos):
        if pos < self.pos:
            self.init()
        self.read(pos - self.pos)

    def tell(self):
        return self.pos

    def write(self, data):
        self.pos += len(data)
        raw = self.bz2obj.compress(data)
        self.fileobj.write(raw)

    def close(self):
        if self.mode == "w":
            raw = self.bz2obj.flush()
            self.fileobj.write(raw)
# class _BZ2Proxy

#------------------------
# Extraction file object
#------------------------
class _FileInFile(object):
    """A thin wrapper around an existing file object that
       provides a part of its data as an individual file
       object.
    """

    def __init__(self, fileobj, offset, size, blockinfo=None):
        self.fileobj = fileobj
        self.offset = offset
        self.size = size
        self.position = 0

        if blockinfo is None:
            blockinfo = [(0, size)]

        # Construct a map with data and zero blocks.
        self.map_index = 0
        self.map = []
        lastpos = 0
        realpos = self.offset
        for offset, size in blockinfo:
            if offset > lastpos:
                self.map.append((False, lastpos, offset, None))
            self.map.append((True, offset, offset + size, realpos))
            realpos += size
            lastpos = offset + size
        if lastpos < self.size:
            self.map.append((False, lastpos, self.size, None))

    def seekable(self):
        if not hasattr(self.fileobj, "seekable"):
            # XXX gzip.GzipFile and bz2.BZ2File
            return True
        return self.fileobj.seekable()

    def tell(self):
        """Return the current file position.
        """
        return self.position

    def seek(self, position):
        """Seek to a position in the file.
        """
        self.position = position

    def read(self, size=None):
        """Read data from the file.
        """
        if size is None:
            size = self.size - self.position
        else:
            size = min(size, self.size - self.position)

        buf = b""
        while size > 0:
            while True:
                data, start, stop, offset = self.map[self.map_index]
                if start <= self.position < stop:
                    break
                else:
                    self.map_index += 1
                    if self.map_index == len(self.map):
                        self.map_index = 0
            length = min(size, stop - self.position)
            if data:
                self.fileobj.seek(offset + (self.position - start))
                buf += self.fileobj.read(length)
            else:
                buf += NUL * length
            size -= length
            self.position += length
        return buf
#class _FileInFile


class ExFileObject(object):
    """File-like object for reading an archive member.
       Is returned by TarFile.extractfile().
    """
    blocksize = 1024

    def __init__(self, tarfile, tarinfo):
        self.fileobj = _FileInFile(tarfile.fileobj,
                                   tarinfo.offset_data,
                                   tarinfo.size,
                                   tarinfo.sparse)
        self.name = tarinfo.name
        self.mode = "r"
        self.closed = False
        self.size = tarinfo.size

        self.position = 0
        self.buffer = b""

    def readable(self):
        return True

    def writable(self):
        return False

    def seekable(self):
        return self.fileobj.seekable()

    def read(self, size=None):
        """Read at most size bytes from the file. If size is not
           present or None, read all data until EOF is reached.
        """
        if self.closed:
            raise ValueError("I/O operation on closed file")

        buf = b""
        if self.buffer:
            if size is None:
                buf = self.buffer
                self.buffer = b""
            else:
                buf = self.buffer[:size]
                self.buffer = self.buffer[size:]

        if size is None:
            buf += self.fileobj.read()
        else:
            buf += self.fileobj.read(size - len(buf))

        self.position += len(buf)
        return buf

    # XXX TextIOWrapper uses the read1() method.
    read1 = read

    def readline(self, size=-1):
        """Read one entire line from the file. If size is present
           and non-negative, return a string with at most that
           size, which may be an incomplete line.
        """
        if self.closed:
            raise ValueError("I/O operation on closed file")

        pos = self.buffer.find(b"\n") + 1
        if pos == 0:
            # no newline found.
            while True:
                buf = self.fileobj.read(self.blocksize)
                self.buffer += buf
                if not buf or b"\n" in buf:
                    pos = self.buffer.find(b"\n") + 1
                    if pos == 0:
                        # no newline found.
                        pos = len(self.buffer)
                    break

        if size != -1:
            pos = min(size, pos)

        buf = self.buffer[:pos]
        self.buffer = self.buffer[pos:]
        self.position += len(buf)
        return buf

    def readlines(self):
        """Return a list with all remaining lines.
        """
        result = []
        while True:
            line = self.readline()
            if not line: break
            result.append(line)
        return result

    def tell(self):
        """Return the current file position.
        """
        if self.closed:
            raise ValueError("I/O operation on closed file")

        return self.position

    def seek(self, pos, whence=os.SEEK_SET):
        """Seek to a position in the file.
        """
        if self.closed:
            raise ValueError("I/O operation on closed file")

        if whence == os.SEEK_SET:
            self.position = min(max(pos, 0), self.size)
        elif whence == os.SEEK_CUR:
            if pos < 0:
                self.position = max(self.position + pos, 0)
            else:
                self.position = min(self.position + pos, self.size)
        elif whence == os.SEEK_END:
            self.position = max(min(self.size + pos, self.size), 0)
        else:
            raise ValueError("Invalid argument")

        self.buffer = b""
        self.fileobj.seek(self.position)

    def close(self):
        """Close the file object.
        """
        self.closed = True

    def __iter__(self):
        """Get an iterator over the file's lines.
        """
        while True:
            line = self.readline()
            if not line:
                break
            yield line
#class ExFileObject

#------------------
# Exported Classes
#------------------
class TarInfo(object):
    """Informational class which holds the details about an
       archive member given by a tar header block.
       TarInfo objects are returned by TarFile.getmember(),
       TarFile.getmembers() and TarFile.gettarinfo() and are
       usually created internally.
    """

    __slots__ = ("name", "mode", "uid", "gid", "size", "mtime",
                 "chksum", "type", "linkname", "uname", "gname",
                 "devmajor", "devminor",
                 "offset", "offset_data", "pax_headers", "sparse",
                 "tarfile", "_sparse_structs", "_link_target")

    def __init__(self, name=""):
        """Construct a TarInfo object. name is the optional name
           of the member.
        """
        self.name = name        # member name
        self.mode = 0o644       # file permissions
        self.uid = 0            # user id
        self.gid = 0            # group id
        self.size = 0           # file size
        self.mtime = 0          # modification time
        self.chksum = 0         # header checksum
        self.type = REGTYPE     # member type
        self.linkname = ""      # link name
        self.uname = ""         # user name
        self.gname = ""         # group name
        self.devmajor = 0       # device major number
        self.devminor = 0       # device minor number

        self.offset = 0         # the tar header starts here
        self.offset_data = 0    # the file's data starts here

        self.sparse = None      # sparse member information
        self.pax_headers = {}   # pax header information

    # In pax headers the "name" and "linkname" field are called
    # "path" and "linkpath".
    def _getpath(self):
        return self.name
    def _setpath(self, name):
        self.name = name
    path = property(_getpath, _setpath)

    def _getlinkpath(self):
        return self.linkname
    def _setlinkpath(self, linkname):
        self.linkname = linkname
    linkpath = property(_getlinkpath, _setlinkpath)

    def __repr__(self):
        return "<%s %r at %#x>" % (self.__class__.__name__,self.name,id(self))

    def get_info(self):
        """Return the TarInfo's attributes as a dictionary.
        """
        info = {
            "name":     self.name,
            "mode":     self.mode & 0o7777,
            "uid":      self.uid,
            "gid":      self.gid,
            "size":     self.size,
            "mtime":    self.mtime,
            "chksum":   self.chksum,
            "type":     self.type,
            "linkname": self.linkname,
            "uname":    self.uname,
            "gname":    self.gname,
            "devmajor": self.devmajor,
            "devminor": self.devminor
        }

        if info["type"] == DIRTYPE and not info["name"].endswith("/"):
            info["name"] += "/"

        return info

    def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING, errors="surrogateescape"):
        """Return a tar header as a string of 512 byte blocks.
        """
        info = self.get_info()

        if format == USTAR_FORMAT:
            return self.create_ustar_header(info, encoding, errors)
        elif format == GNU_FORMAT:
            return self.create_gnu_header(info, encoding, errors)
        elif format == PAX_FORMAT:
            return self.create_pax_header(info, encoding)
        else:
            raise ValueError("invalid format")

    def create_ustar_header(self, info, encoding, errors):
        """Return the object as a ustar header block.
        """
        info["magic"] = POSIX_MAGIC

        if len(info["linkname"]) > LENGTH_LINK:
            raise ValueError("linkname is too long")

        if len(info["name"]) > LENGTH_NAME:
            info["prefix"], info["name"] = self._posix_split_name(info["name"])

        return self._create_header(info, USTAR_FORMAT, encoding, errors)

    def create_gnu_header(self, info, encoding, errors):
        """Return the object as a GNU header block sequence.
        """
        info["magic"] = GNU_MAGIC

        buf = b""
        if len(info["linkname"]) > LENGTH_LINK:
            buf += self._create_gnu_long_header(info["linkname"], GNUTYPE_LONGLINK, encoding, errors)

        if len(info["name"]) > LENGTH_NAME:
            buf += self._create_gnu_long_header(info["name"], GNUTYPE_LONGNAME, encoding, errors)

        return buf + self._create_header(info, GNU_FORMAT, encoding, errors)

    def create_pax_header(self, info, encoding):
        """Return the object as a ustar header block. If it cannot be
           represented this way, prepend a pax extended header sequence
           with supplement information.
        """
        info["magic"] = POSIX_MAGIC
        pax_headers = self.pax_headers.copy()

        # Test string fields for values that exceed the field length or cannot
        # be represented in ASCII encoding.
        for name, hname, length in (
                ("name", "path", LENGTH_NAME), ("linkname", "linkpath", LENGTH_LINK),
                ("uname", "uname", 32), ("gname", "gname", 32)):

            if hname in pax_headers:
                # The pax header has priority.
                continue

            # Try to encode the string as ASCII.
            try:
                info[name].encode("ascii", "strict")
            except UnicodeEncodeError:
                pax_headers[hname] = info[name]
                continue

            if len(info[name]) > length:
                pax_headers[hname] = info[name]

        # Test number fields for values that exceed the field limit or values
        # that like to be stored as float.
        for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)):
            if name in pax_headers:
                # The pax header has priority. Avoid overflow.
                info[name] = 0
                continue

            val = info[name]
            if not 0 <= val < 8 ** (digits - 1) or isinstance(val, float):
                pax_headers[name] = str(val)
                info[name] = 0

        # Create a pax extended header if necessary.
        if pax_headers:
            buf = self._create_pax_generic_header(pax_headers, XHDTYPE, encoding)
        else:
            buf = b""

        return buf + self._create_header(info, USTAR_FORMAT, "ascii", "replace")

    @classmethod
    def create_pax_global_header(cls, pax_headers):
        """Return the object as a pax global header block sequence.
        """
        return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf8")

    def _posix_split_name(self, name):
        """Split a name longer than 100 chars into a prefix
           and a name part.
        """
        prefix = name[:LENGTH_PREFIX + 1]
        while prefix and prefix[-1] != "/":
            prefix = prefix[:-1]

        name = name[len(prefix):]
        prefix = prefix[:-1]

        if not prefix or len(name) > LENGTH_NAME:
            raise ValueError("name is too long")
        return prefix, name

    @staticmethod
    def _create_header(info, format, encoding, errors):
        """Return a header block. info is a dictionary with file
           information, format must be one of the *_FORMAT constants.
        """
        parts = [
            stn(info.get("name", ""), 100, encoding, errors),
            itn(info.get("mode", 0) & 0o7777, 8, format),
            itn(info.get("uid", 0), 8, format),
            itn(info.get("gid", 0), 8, format),
            itn(info.get("size", 0), 12, format),
            itn(info.get("mtime", 0), 12, format),
            b"        ", # checksum field
            info.get("type", REGTYPE),
            stn(info.get("linkname", ""), 100, encoding, errors),
            info.get("magic", POSIX_MAGIC),
            stn(info.get("uname", ""), 32, encoding, errors),
            stn(info.get("gname", ""), 32, encoding, errors),
            itn(info.get("devmajor", 0), 8, format),
            itn(info.get("devminor", 0), 8, format),
            stn(info.get("prefix", ""), 155, encoding, errors)
        ]

        buf = struct.pack("%ds" % BLOCKSIZE, b"".join(parts))
        chksum = calc_chksums(buf[-BLOCKSIZE:])[0]
        buf = buf[:-364] + ("%06o\0" % chksum).encode("ascii") + buf[-357:]
        return buf

    @staticmethod
    def _create_payload(payload):
        """Return the string payload filled with zero bytes
           up to the next 512 byte border.
        """
        blocks, remainder = divmod(len(payload), BLOCKSIZE)
        if remainder > 0:
            payload += (BLOCKSIZE - remainder) * NUL
        return payload

    @classmethod
    def _create_gnu_long_header(cls, name, type, encoding, errors):
        """Return a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence
           for name.
        """
        name = name.encode(encoding, errors) + NUL

        info = {}
        info["name"] = "././@LongLink"
        info["type"] = type
        info["size"] = len(name)
        info["magic"] = GNU_MAGIC

        # create extended header + name blocks.
        return cls._create_header(info, USTAR_FORMAT, encoding, errors) + \
                cls._create_payload(name)

    @classmethod
    def _create_pax_generic_header(cls, pax_headers, type, encoding):
        """Return a POSIX.1-2008 extended or global header sequence
           that contains a list of keyword, value pairs. The values
           must be strings.
        """
        # Check if one of the fields contains surrogate characters and thereby
        # forces hdrcharset=BINARY, see _proc_pax() for more information.
        binary = False
        for keyword, value in pax_headers.items():
            try:
                value.encode("utf8", "strict")
            except UnicodeEncodeError:
                binary = True
                break

        records = b""
        if binary:
            # Put the hdrcharset field at the beginning of the header.
            records += b"21 hdrcharset=BINARY\n"

        for keyword, value in pax_headers.items():
            keyword = keyword.encode("utf8")
            if binary:
                # Try to restore the original byte representation of `value'.
                # Needless to say, that the encoding must match the string.
                value = value.encode(encoding, "surrogateescape")
            else:
                value = value.encode("utf8")

            l = len(keyword) + len(value) + 3   # ' ' + '=' + '\n'
            n = p = 0
            while True:
                n = l + len(str(p))
                if n == p:
                    break
                p = n
            records += bytes(str(p), "ascii") + b" " + keyword + b"=" + value + b"\n"

        # We use a hardcoded "././@PaxHeader" name like star does
        # instead of the one that POSIX recommends.
        info = {}
        info["name"] = "././@PaxHeader"
        info["type"] = type
        info["size"] = len(records)
        info["magic"] = POSIX_MAGIC

        # Create pax header + record blocks.
        return cls._create_header(info, USTAR_FORMAT, "ascii", "replace") + \
                cls._create_payload(records)

    @classmethod
    def frombuf(cls, buf, encoding, errors):
        """Construct a TarInfo object from a 512 byte bytes object.
        """
        if len(buf) == 0:
            raise EmptyHeaderError("empty header")
        if len(buf) != BLOCKSIZE:
            raise TruncatedHeaderError("truncated header")
        if buf.count(NUL) == BLOCKSIZE:
            raise EOFHeaderError("end of file header")

        chksum = nti(buf[148:156])
        if chksum not in calc_chksums(buf):
            raise InvalidHeaderError("bad checksum")

        obj = cls()
        obj.name = nts(buf[0:100], encoding, errors)
        obj.mode = nti(buf[100:108])
        obj.uid = nti(buf[108:116])
        obj.gid = nti(buf[116:124])
        obj.size = nti(buf[124:136])
        obj.mtime = nti(buf[136:148])
        obj.chksum = chksum
        obj.type = buf[156:157]
        obj.linkname = nts(buf[157:257], encoding, errors)
        obj.uname = nts(buf[265:297], encoding, errors)
        obj.gname = nts(buf[297:329], encoding, errors)
        obj.devmajor = nti(buf[329:337])
        obj.devminor = nti(buf[337:345])
        prefix = nts(buf[345:500], encoding, errors)

        # Old V7 tar format represents a directory as a regular
        # file with a trailing slash.
        if obj.type == AREGTYPE and obj.name.endswith("/"):
            obj.type = DIRTYPE

        # The old GNU sparse format occupies some of the unused
        # space in the buffer for up to 4 sparse structures.
        # Save the them for later processing in _proc_sparse().
        if obj.type == GNUTYPE_SPARSE:
            pos = 386
            structs = []
            for i in range(4):
                try:
                    offset = nti(buf[pos:pos + 12])
                    numbytes = nti(buf[pos + 12:pos + 24])
                except ValueError:
                    break
                structs.append((offset, numbytes))
                pos += 24
            isextended = bool(buf[482])
            origsize = nti(buf[483:495])
            obj._sparse_structs = (structs, isextended, origsize)

        # Remove redundant slashes from directories.
        if obj.isdir():
            obj.name = obj.name.rstrip("/")

        # Reconstruct a ustar longname.
        if prefix and obj.type not in GNU_TYPES:
            obj.name = prefix + "/" + obj.name
        return obj

    @classmethod
    def fromtarfile(cls, tarfile):
        """Return the next TarInfo object from TarFile object
           tarfile.
        """
        buf = tarfile.fileobj.read(BLOCKSIZE)
        obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors)
        obj.offset = tarfile.fileobj.tell() - BLOCKSIZE
        return obj._proc_member(tarfile)

    #--------------------------------------------------------------------------
    # The following are methods that are called depending on the type of a
    # member. The entry point is _proc_member() which can be overridden in a
    # subclass to add custom _proc_*() methods. A _proc_*() method MUST
    # implement the following
    # operations:
    # 1. Set self.offset_data to the position where the data blocks begin,
    #    if there is data that follows.
    # 2. Set tarfile.offset to the position where the next member's header will
    #    begin.
    # 3. Return self or another valid TarInfo object.
    def _proc_member(self, tarfile):
        """Choose the right processing method depending on
           the type and call it.
        """
        if self.type in (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK):
            return self._proc_gnulong(tarfile)
        elif self.type == GNUTYPE_SPARSE:
            return self._proc_sparse(tarfile)
        elif self.type in (XHDTYPE, XGLTYPE, SOLARIS_XHDTYPE):
            return self._proc_pax(tarfile)
        else:
            return self._proc_builtin(tarfile)

    def _proc_builtin(self, tarfile):
        """Process a builtin type or an unknown type which
           will be treated as a regular file.
        """
        self.offset_data = tarfile.fileobj.tell()
        offset = self.offset_data
        if self.isreg() or self.type not in SUPPORTED_TYPES:
            # Skip the following data blocks.
            offset += self._block(self.size)
        tarfile.offset = offset

        # Patch the TarInfo object with saved global
        # header information.
        self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors)

        return self

    def _proc_gnulong(self, tarfile):
        """Process the blocks that hold a GNU longname
           or longlink member.
        """
        buf = tarfile.fileobj.read(self._block(self.size))

        # Fetch the next header and process it.
        try:
            next = self.fromtarfile(tarfile)
        except HeaderError:
            raise SubsequentHeaderError("missing or bad subsequent header")

        # Patch the TarInfo object from the next header with
        # the longname information.
        next.offset = self.offset
        if self.type == GNUTYPE_LONGNAME:
            next.name = nts(buf, tarfile.encoding, tarfile.errors)
        elif self.type == GNUTYPE_LONGLINK:
            next.linkname = nts(buf, tarfile.encoding, tarfile.errors)

        return next

    def _proc_sparse(self, tarfile):
        """Process a GNU sparse header plus extra headers.
        """
        # We already collected some sparse structures in frombuf().
        structs, isextended, origsize = self._sparse_structs
        del self._sparse_structs

        # Collect sparse structures from extended header blocks.
        while isextended:
            buf = tarfile.fileobj.read(BLOCKSIZE)
            pos = 0
            for i in range(21):
                try:
                    offset = nti(buf[pos:pos + 12])
                    numbytes = nti(buf[pos + 12:pos + 24])
                except ValueError:
                    break
                if offset and numbytes:
                    structs.append((offset, numbytes))
                pos += 24
            isextended = bool(buf[504])
        self.sparse = structs

        self.offset_data = tarfile.fileobj.tell()
        tarfile.offset = self.offset_data + self._block(self.size)
        self.size = origsize
        return self

    def _proc_pax(self, tarfile):
        """Process an extended or global header as described in
           POSIX.1-2008.
        """
        # Read the header information.
        buf = tarfile.fileobj.read(self._block(self.size))

        # A pax header stores supplemental information for either
        # the following file (extended) or all following files
        # (global).
        if self.type == XGLTYPE:
            pax_headers = tarfile.pax_headers
        else:
            pax_headers = tarfile.pax_headers.copy()

        # Check if the pax header contains a hdrcharset field. This tells us
        # the encoding of the path, linkpath, uname and gname fields. Normally,
        # these fields are UTF-8 encoded but since POSIX.1-2008 tar
        # implementations are allowed to store them as raw binary strings if
        # the translation to UTF-8 fails.
        match = re.search(br"\d+ hdrcharset=([^\n]+)\n", buf)
        if match is not None:
            pax_headers["hdrcharset"] = match.group(1).decode("utf8")

        # For the time being, we don't care about anything other than "BINARY".
        # The only other value that is currently allowed by the standard is
        # "ISO-IR 10646 2000 UTF-8" in other words UTF-8.
        hdrcharset = pax_headers.get("hdrcharset")
        if hdrcharset == "BINARY":
            encoding = tarfile.encoding
        else:
            encoding = "utf8"

        # Parse pax header information. A record looks like that:
        # "%d %s=%s\n" % (length, keyword, value). length is the size
        # of the complete record including the length field itself and
        # the newline. keyword and value are both UTF-8 encoded strings.
        regex = re.compile(br"(\d+) ([^=]+)=")
        pos = 0
        while True:
            match = regex.match(buf, pos)
            if not match:
                break

            length, keyword = match.groups()
            length = int(length)
            value = buf[match.end(2) + 1:match.start(1) + length - 1]

            # Normally, we could just use "utf8" as the encoding and "strict"
            # as the error handler, but we better not take the risk. For
            # example, GNU tar <= 1.23 is known to store filenames it cannot
            # translate to UTF-8 as raw strings (unfortunately without a
            # hdrcharset=BINARY header).
            # We first try the strict standard encoding, and if that fails we
            # fall back on the user's encoding and error handler.
            keyword = self._decode_pax_field(keyword, "utf8", "utf8",
                    tarfile.errors)
            if keyword in PAX_NAME_FIELDS:
                value = self._decode_pax_field(value, encoding, tarfile.encoding,
                        tarfile.errors)
            else:
                value = self._decode_pax_field(value, "utf8", "utf8",
                        tarfile.errors)

            pax_headers[keyword] = value
            pos += length

        # Fetch the next header.
        try:
            next = self.fromtarfile(tarfile)
        except HeaderError:
            raise SubsequentHeaderError("missing or bad subsequent header")

        # Process GNU sparse information.
        if "GNU.sparse.map" in pax_headers:
            # GNU extended sparse format version 0.1.
            self._proc_gnusparse_01(next, pax_headers)

        elif "GNU.sparse.size" in pax_headers:
            # GNU extended sparse format version 0.0.
            self._proc_gnusparse_00(next, pax_headers, buf)

        elif pax_headers.get("GNU.sparse.major") == "1" and pax_headers.get("GNU.sparse.minor") == "0":
            # GNU extended sparse format version 1.0.
            self._proc_gnusparse_10(next, pax_headers, tarfile)

        if self.type in (XHDTYPE, SOLARIS_XHDTYPE):
            # Patch the TarInfo object with the extended header info.
            next._apply_pax_info(pax_headers, tarfile.encoding, tarfile.errors)
            next.offset = self.offset

            if "size" in pax_headers:
                # If the extended header replaces the size field,
                # we need to recalculate the offset where the next
                # header starts.
                offset = next.offset_data
                if next.isreg() or next.type not in SUPPORTED_TYPES:
                    offset += next._block(next.size)
                tarfile.offset = offset

        return next

    def _proc_gnusparse_00(self, next, pax_headers, buf):
        """Process a GNU tar extended sparse header, version 0.0.
        """
        offsets = []
        for match in re.finditer(br"\d+ GNU.sparse.offset=(\d+)\n", buf):
            offsets.append(int(match.group(1)))
        numbytes = []
        for match in re.finditer(br"\d+ GNU.sparse.numbytes=(\d+)\n", buf):
            numbytes.append(int(match.group(1)))
        next.sparse = list(zip(offsets, numbytes))

    def _proc_gnusparse_01(self, next, pax_headers):
        """Process a GNU tar extended sparse header, version 0.1.
        """
        sparse = [int(x) for x in pax_headers["GNU.sparse.map"].split(",")]
        next.sparse = list(zip(sparse[::2], sparse[1::2]))

    def _proc_gnusparse_10(self, next, pax_headers, tarfile):
        """Process a GNU tar extended sparse header, version 1.0.
        """
        fields = None
        sparse = []
        buf = tarfile.fileobj.read(BLOCKSIZE)
        fields, buf = buf.split(b"\n", 1)
        fields = int(fields)
        while len(sparse) < fields * 2:
            if b"\n" not in buf:
                buf += tarfile.fileobj.read(BLOCKSIZE)
            number, buf = buf.split(b"\n", 1)
            sparse.append(int(number))
        next.offset_data = tarfile.fileobj.tell()
        next.sparse = list(zip(sparse[::2], sparse[1::2]))

    def _apply_pax_info(self, pax_headers, encoding, errors):
        """Replace fields with supplemental information from a previous
           pax extended or global header.
        """
        for keyword, value in pax_headers.items():
            if keyword == "GNU.sparse.name":
                setattr(self, "path", value)
            elif keyword == "GNU.sparse.size":
                setattr(self, "size", int(value))
            elif keyword == "GNU.sparse.realsize":
                setattr(self, "size", int(value))
            elif keyword in PAX_FIELDS:
                if keyword in PAX_NUMBER_FIELDS:
                    try:
                        value = PAX_NUMBER_FIELDS[keyword](value)
                    except ValueError:
                        value = 0
                if keyword == "path":
                    value = value.rstrip("/")
                setattr(self, keyword, value)

        self.pax_headers = pax_headers.copy()

    def _decode_pax_field(self, value, encoding, fallback_encoding, fallback_errors):
        """Decode a single field from a pax record.
        """
        try:
            return value.decode(encoding, "strict")
        except UnicodeDecodeError:
            return value.decode(fallback_encoding, fallback_errors)

    def _block(self, count):
        """Round up a byte count by BLOCKSIZE and return it,
           e.g. _block(834) => 1024.
        """
        blocks, remainder = divmod(count, BLOCKSIZE)
        if remainder:
            blocks += 1
        return blocks * BLOCKSIZE

    def isreg(self):
        return self.type in REGULAR_TYPES
    def isfile(self):
        return self.isreg()
    def isdir(self):
        return self.type == DIRTYPE
    def issym(self):
        return self.type == SYMTYPE
    def islnk(self):
        return self.type == LNKTYPE
    def ischr(self):
        return self.type == CHRTYPE
    def isblk(self):
        return self.type == BLKTYPE
    def isfifo(self):
        return self.type == FIFOTYPE
    def issparse(self):
        return self.sparse is not None
    def isdev(self):
        return self.type in (CHRTYPE, BLKTYPE, FIFOTYPE)
# class TarInfo

class TarFile(object):
    """The TarFile Class provides an interface to tar archives.
    """

    debug = 0                   # May be set from 0 (no msgs) to 3 (all msgs)

    dereference = False         # If true, add content of linked file to the
                                # tar file, else the link.

    ignore_zeros = False        # If true, skips empty or invalid blocks and
                                # continues processing.

    errorlevel = 1              # If 0, fatal errors only appear in debug
                                # messages (if debug >= 0). If > 0, errors
                                # are passed to the caller as exceptions.

    format = DEFAULT_FORMAT     # The format to use when creating an archive.

    encoding = ENCODING         # Encoding for 8-bit character strings.

    errors = None               # Error handler for unicode conversion.

    tarinfo = TarInfo           # The default TarInfo class to use.

    fileobject = ExFileObject   # The default ExFileObject class to use.

    def __init__(self, name=None, mode="r", fileobj=None, format=None,
            tarinfo=None, dereference=None, ignore_zeros=None, encoding=None,
            errors="surrogateescape", pax_headers=None, debug=None, errorlevel=None):
        """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to
           read from an existing archive, 'a' to append data to an existing
           file or 'w' to create a new file overwriting an existing one. `mode'
           defaults to 'r'.
           If `fileobj' is given, it is used for reading or writing data. If it
           can be determined, `mode' is overridden by `fileobj's mode.
           `fileobj' is not closed, when TarFile is closed.
        """
        if len(mode) > 1 or mode not in "raw":
            raise ValueError("mode must be 'r', 'a' or 'w'")
        self.mode = mode
        self._mode = {"r": "rb", "a": "r+b", "w": "wb"}[mode]

        if not fileobj:
            if self.mode == "a" and not os.path.exists(name):
                # Create nonexistent files in append mode.
                self.mode = "w"
                self._mode = "wb"
            fileobj = bltn_open(name, self._mode)
            self._extfileobj = False
        else:
            if name is None and hasattr(fileobj, "name"):
                name = fileobj.name
            if hasattr(fileobj, "mode"):
                self._mode = fileobj.mode
            self._extfileobj = True
        self.name = os.path.abspath(name) if name else None
        self.fileobj = fileobj

        # Init attributes.
        if format is not None:
            self.format = format
        if tarinfo is not None:
            self.tarinfo = tarinfo
        if dereference is not None:
            self.dereference = dereference
        if ignore_zeros is not None:
            self.ignore_zeros = ignore_zeros
        if encoding is not None:
            self.encoding = encoding
        self.errors = errors

        if pax_headers is not None and self.format == PAX_FORMAT:
            self.pax_headers = pax_headers
        else:
            self.pax_headers = {}

        if debug is not None:
            self.debug = debug
        if errorlevel is not None:
            self.errorlevel = errorlevel

        # Init datastructures.
        self.closed = False
        self.members = []       # list of members as TarInfo objects
        self._loaded = False    # flag if all members have been read
        self.offset = self.fileobj.tell()
                                # current position in the archive file
        self.inodes = {}        # dictionary caching the inodes of
                                # archive members already added

        try:
            if self.mode == "r":
                self.firstmember = None
                self.firstmember = self.next()

            if self.mode == "a":
                # Move to the end of the archive,
                # before the first empty block.
                while True:
                    self.fileobj.seek(self.offset)
                    try:
                        tarinfo = self.tarinfo.fromtarfile(self)
                        self.members.append(tarinfo)
                    except EOFHeaderError:
                        self.fileobj.seek(self.offset)
                        break
                    except HeaderError as e:
                        raise ReadError(str(e))

            if self.mode in "aw":
                self._loaded = True

                if self.pax_headers:
                    buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy())
                    self.fileobj.write(buf)
                    self.offset += len(buf)
        except:
            if not self._extfileobj:
                self.fileobj.close()
            self.closed = True
            raise

    #--------------------------------------------------------------------------
    # Below are the classmethods which act as alternate constructors to the
    # TarFile class. The open() method is the only one that is needed for
    # public use; it is the "super"-constructor and is able to select an
    # adequate "sub"-constructor for a particular compression using the mapping
    # from OPEN_METH.
    #
    # This concept allows one to subclass TarFile without losing the comfort of
    # the super-constructor. A sub-constructor is registered and made available
    # by adding it to the mapping in OPEN_METH.

    @classmethod
    def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs):
        """Open a tar archive for reading, writing or appending. Return
           an appropriate TarFile class.

           mode:
           'r' or 'r:*' open for reading with transparent compression
           'r:'         open for reading exclusively uncompressed
           'r:gz'       open for reading with gzip compression
           'r:bz2'      open for reading with bzip2 compression
           'a' or 'a:'  open for appending, creating the file if necessary
           'w' or 'w:'  open for writing without compression
           'w:gz'       open for writing with gzip compression
           'w:bz2'      open for writing with bzip2 compression

           'r|*'        open a stream of tar blocks with transparent compression
           'r|'         open an uncompressed stream of tar blocks for reading
           'r|gz'       open a gzip compressed stream of tar blocks
           'r|bz2'      open a bzip2 compressed stream of tar blocks
           'w|'         open an uncompressed stream for writing
           'w|gz'       open a gzip compressed stream for writing
           'w|bz2'      open a bzip2 compressed stream for writing
        """

        if not name and not fileobj:
            raise ValueError("nothing to open")

        if mode in ("r", "r:*"):
            # Find out which *open() is appropriate for opening the file.
            for comptype in cls.OPEN_METH:
                func = getattr(cls, cls.OPEN_METH[comptype])
                if fileobj is not None:
                    saved_pos = fileobj.tell()
                try:
                    return func(name, "r", fileobj, **kwargs)
                except (ReadError, CompressionError) as e:
                    if fileobj is not None:
                        fileobj.seek(saved_pos)
                    continue
            raise ReadError("file could not be opened successfully")

        elif ":" in mode:
            filemode, comptype = mode.split(":", 1)
            filemode = filemode or "r"
            comptype = comptype or "tar"

            # Select the *open() function according to
            # given compression.
            if comptype in cls.OPEN_METH:
                func = getattr(cls, cls.OPEN_METH[comptype])
            else:
                raise CompressionError("unknown compression type %r" % comptype)
            return func(name, filemode, fileobj, **kwargs)

        elif "|" in mode:
            filemode, comptype = mode.split("|", 1)
            filemode = filemode or "r"
            comptype = comptype or "tar"

            if filemode not in "rw":
                raise ValueError("mode must be 'r' or 'w'")

            stream = _Stream(name, filemode, comptype, fileobj, bufsize)
            try:
                t = cls(name, filemode, stream, **kwargs)
            except:
                stream.close()
                raise
            t._extfileobj = False
            return t

        elif mode in "aw":
            return cls.taropen(name, mode, fileobj, **kwargs)

        raise ValueError("undiscernible mode")

    @classmethod
    def taropen(cls, name, mode="r", fileobj=None, **kwargs):
        """Open uncompressed tar archive name for reading or writing.
        """
        if len(mode) > 1 or mode not in "raw":
            raise ValueError("mode must be 'r', 'a' or 'w'")
        return cls(name, mode, fileobj, **kwargs)

    @classmethod
    def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
        """Open gzip compressed tar archive name for reading or writing.
           Appending is not allowed.
        """
        if len(mode) > 1 or mode not in "rw":
            raise ValueError("mode must be 'r' or 'w'")

        try:
            import gzip
            gzip.GzipFile
        except (ImportError, AttributeError):
            raise CompressionError("gzip module is not available")

        extfileobj = fileobj is not None
        try:
            fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj)
            t = cls.taropen(name, mode, fileobj, **kwargs)
        except IOError:
            if not extfileobj and fileobj is not None:
                fileobj.close()
            if fileobj is None:
                raise
            raise ReadError("not a gzip file")
        except:
            if not extfileobj and fileobj is not None:
                fileobj.close()
            raise
        t._extfileobj = extfileobj
        return t

    @classmethod
    def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
        """Open bzip2 compressed tar archive name for reading or writing.
           Appending is not allowed.
        """
        if len(mode) > 1 or mode not in "rw":
            raise ValueError("mode must be 'r' or 'w'.")

        try:
            import bz2
        except ImportError:
            raise CompressionError("bz2 module is not available")

        if fileobj is not None:
            fileobj = _BZ2Proxy(fileobj, mode)
        else:
            fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel)

        try:
            t = cls.taropen(name, mode, fileobj, **kwargs)
        except (IOError, EOFError):
            fileobj.close()
            raise ReadError("not a bzip2 file")
        t._extfileobj = False
        return t

    # All *open() methods are registered here.
    OPEN_METH = {
        "tar": "taropen",   # uncompressed tar
        "gz":  "gzopen",    # gzip compressed tar
        "bz2": "bz2open"    # bzip2 compressed tar
    }

    #--------------------------------------------------------------------------
    # The public methods which TarFile provides:

    def close(self):
        """Close the TarFile. In write-mode, two finishing zero blocks are
           appended to the archive.
        """
        if self.closed:
            return

        if self.mode in "aw":
            self.fileobj.write(NUL * (BLOCKSIZE * 2))
            self.offset += (BLOCKSIZE * 2)
            # fill up the end with zero-blocks
            # (like option -b20 for tar does)
            blocks, remainder = divmod(self.offset, RECORDSIZE)
            if remainder > 0:
                self.fileobj.write(NUL * (RECORDSIZE - remainder))

        if not self._extfileobj:
            self.fileobj.close()
        self.closed = True

    def getmember(self, name):
        """Return a TarInfo object for member `name'. If `name' can not be
           found in the archive, KeyError is raised. If a member occurs more
           than once in the archive, its last occurrence is assumed to be the
           most up-to-date version.
        """
        tarinfo = self._getmember(name)
        if tarinfo is None:
            raise KeyError("filename %r not found" % name)
        return tarinfo

    def getmembers(self):
        """Return the members of the archive as a list of TarInfo objects. The
           list has the same order as the members in the archive.
        """
        self._check()
        if not self._loaded:    # if we want to obtain a list of
            self._load()        # all members, we first have to
                                # scan the whole archive.
        return self.members

    def getnames(self):
        """Return the members of the archive as a list of their names. It has
           the same order as the list returned by getmembers().
        """
        return [tarinfo.name for tarinfo in self.getmembers()]

    def gettarinfo(self, name=None, arcname=None, fileobj=None):
        """Create a TarInfo object for either the file `name' or the file
           object `fileobj' (using os.fstat on its file descriptor). You can
           modify some of the TarInfo's attributes before you add it using
           addfile(). If given, `arcname' specifies an alternative name for the
           file in the archive.
        """
        self._check("aw")

        # When fileobj is given, replace name by
        # fileobj's real name.
        if fileobj is not None:
            name = fileobj.name

        # Building the name of the member in the archive.
        # Backward slashes are converted to forward slashes,
        # Absolute paths are turned to relative paths.
        if arcname is None:
            arcname = name
        drv, arcname = os.path.splitdrive(arcname)
        arcname = arcname.replace(os.sep, "/")
        arcname = arcname.lstrip("/")

        # Now, fill the TarInfo object with
        # information specific for the file.
        tarinfo = self.tarinfo()
        tarinfo.tarfile = self

        # Use os.stat or os.lstat, depending on platform
        # and if symlinks shall be resolved.
        if fileobj is None:
            if hasattr(os, "lstat") and not self.dereference:
                statres = os.lstat(name)
            else:
                statres = os.stat(name)
        else:
            statres = os.fstat(fileobj.fileno())
        linkname = ""

        stmd = statres.st_mode
        if stat.S_ISREG(stmd):
            inode = (statres.st_ino, statres.st_dev)
            if not self.dereference and statres.st_nlink > 1 and \
                    inode in self.inodes and arcname != self.inodes[inode]:
                # Is it a hardlink to an already
                # archived file?
                type = LNKTYPE
                linkname = self.inodes[inode]
            else:
                # The inode is added only if its valid.
                # For win32 it is always 0.
                type = REGTYPE
                if inode[0]:
                    self.inodes[inode] = arcname
        elif stat.S_ISDIR(stmd):
            type = DIRTYPE
        elif stat.S_ISFIFO(stmd):
            type = FIFOTYPE
        elif stat.S_ISLNK(stmd):
            type = SYMTYPE
            linkname = os.readlink(name)
        elif stat.S_ISCHR(stmd):
            type = CHRTYPE
        elif stat.S_ISBLK(stmd):
            type = BLKTYPE
        else:
            return None

        # Fill the TarInfo object with all
        # information we can get.
        tarinfo.name = arcname
        tarinfo.mode = stmd
        tarinfo.uid = statres.st_uid
        tarinfo.gid = statres.st_gid
        if type == REGTYPE:
            tarinfo.size = statres.st_size
        else:
            tarinfo.size = 0
        tarinfo.mtime = statres.st_mtime
        tarinfo.type = type
        tarinfo.linkname = linkname
        if pwd:
            try:
                tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0]
            except KeyError:
                pass
        if grp:
            try:
                tarinfo.gname = grp.getgrgid(tarinfo.gid)[0]
            except KeyError:
                pass

        if type in (CHRTYPE, BLKTYPE):
            if hasattr(os, "major") and hasattr(os, "minor"):
                tarinfo.devmajor = os.major(statres.st_rdev)
                tarinfo.devminor = os.minor(statres.st_rdev)
        return tarinfo

    def list(self, verbose=True):
        """Print a table of contents to sys.stdout. If `verbose' is False, only
           the names of the members are printed. If it is True, an `ls -l'-like
           output is produced.
        """
        self._check()

        for tarinfo in self:
            if verbose:
                print(filemode(tarinfo.mode), end=' ')
                print("%s/%s" % (tarinfo.uname or tarinfo.uid,
                                 tarinfo.gname or tarinfo.gid), end=' ')
                if tarinfo.ischr() or tarinfo.isblk():
                    print("%10s" % ("%d,%d" \
                                    % (tarinfo.devmajor, tarinfo.devminor)), end=' ')
                else:
                    print("%10d" % tarinfo.size, end=' ')
                print("%d-%02d-%02d %02d:%02d:%02d" \
                      % time.localtime(tarinfo.mtime)[:6], end=' ')

            print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ')

            if verbose:
                if tarinfo.issym():
                    print("->", tarinfo.linkname, end=' ')
                if tarinfo.islnk():
                    print("link to", tarinfo.linkname, end=' ')
            print()

    def add(self, name, arcname=None, recursive=True, exclude=None, filter=None):
        """Add the file `name' to the archive. `name' may be any type of file
           (directory, fifo, symbolic link, etc.). If given, `arcname'
           specifies an alternative name for the file in the archive.
           Directories are added recursively by default. This can be avoided by
           setting `recursive' to False. `exclude' is a function that should
           return True for each filename to be excluded. `filter' is a function
           that expects a TarInfo object argument and returns the changed
           TarInfo object, if it returns None the TarInfo object will be
           excluded from the archive.
        """
        self._check("aw")

        if arcname is None:
            arcname = name

        # Exclude pathnames.
        if exclude is not None:
            import warnings
            warnings.warn("use the filter argument instead",
                    DeprecationWarning, 2)
            if exclude(name):
                self._dbg(2, "tarfile: Excluded %r" % name)
                return

        # Skip if somebody tries to archive the archive...
        if self.name is not None and os.path.abspath(name) == self.name:
            self._dbg(2, "tarfile: Skipped %r" % name)
            return

        self._dbg(1, name)

        # Create a TarInfo object from the file.
        tarinfo = self.gettarinfo(name, arcname)

        if tarinfo is None:
            self._dbg(1, "tarfile: Unsupported type %r" % name)
            return

        # Change or exclude the TarInfo object.
        if filter is not None:
            tarinfo = filter(tarinfo)
            if tarinfo is None:
                self._dbg(2, "tarfile: Excluded %r" % name)
                return

        # Append the tar header and data to the archive.
        if tarinfo.isreg():
            f = bltn_open(name, "rb")
            self.addfile(tarinfo, f)
            f.close()

        elif tarinfo.isdir():
            self.addfile(tarinfo)
            if recursive:
                for f in os.listdir(name):
                    self.add(os.path.join(name, f), os.path.join(arcname, f),
                            recursive, exclude, filter=filter)

        else:
            self.addfile(tarinfo)

    def addfile(self, tarinfo, fileobj=None):
        """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is
           given, tarinfo.size bytes are read from it and added to the archive.
           You can create TarInfo objects using gettarinfo().
           On Windows platforms, `fileobj' should always be opened with mode
           'rb' to avoid irritation about the file size.
        """
        self._check("aw")

        tarinfo = copy.copy(tarinfo)

        buf = tarinfo.tobuf(self.format, self.encoding, self.errors)
        self.fileobj.write(buf)
        self.offset += len(buf)

        # If there's data to follow, append it.
        if fileobj is not None:
            copyfileobj(fileobj, self.fileobj, tarinfo.size)
            blocks, remainder = divmod(tarinfo.size, BLOCKSIZE)
            if remainder > 0:
                self.fileobj.write(NUL * (BLOCKSIZE - remainder))
                blocks += 1
            self.offset += blocks * BLOCKSIZE

        self.members.append(tarinfo)

    def extractall(self, path=".", members=None):
        """Extract all members from the archive to the current working
           directory and set owner, modification time and permissions on
           directories afterwards. `path' specifies a different directory
           to extract to. `members' is optional and must be a subset of the
           list returned by getmembers().
        """
        directories = []

        if members is None:
            members = self

        for tarinfo in members:
            if tarinfo.isdir():
                # Extract directories with a safe mode.
                directories.append(tarinfo)
                tarinfo = copy.copy(tarinfo)
                tarinfo.mode = 0o700
            # Do not set_attrs directories, as we will do that further down
            self.extract(tarinfo, path, set_attrs=not tarinfo.isdir())

        # Reverse sort directories.
        directories.sort(key=lambda a: a.name)
        directories.reverse()

        # Set correct owner, mtime and filemode on directories.
        for tarinfo in directories:
            dirpath = os.path.join(path, tarinfo.name)
            try:
                self.chown(tarinfo, dirpath)
                self.utime(tarinfo, dirpath)
                self.chmod(tarinfo, dirpath)
            except ExtractError as e:
                if self.errorlevel > 1:
                    raise
                else:
                    self._dbg(1, "tarfile: %s" % e)

    def extract(self, member, path="", set_attrs=True):
        """Extract a member from the archive to the current working directory,
           using its full name. Its file information is extracted as accurately
           as possible. `member' may be a filename or a TarInfo object. You can
           specify a different directory using `path'. File attributes (owner,
           mtime, mode) are set unless `set_attrs' is False.
        """
        self._check("r")

        if isinstance(member, str):
            tarinfo = self.getmember(member)
        else:
            tarinfo = member

        # Prepare the link target for makelink().
        if tarinfo.islnk():
            tarinfo._link_target = os.path.join(path, tarinfo.linkname)

        try:
            self._extract_member(tarinfo, os.path.join(path, tarinfo.name),
                                 set_attrs=set_attrs)
        except EnvironmentError as e:
            if self.errorlevel > 0:
                raise
            else:
                if e.filename is None:
                    self._dbg(1, "tarfile: %s" % e.strerror)
                else:
                    self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename))
        except ExtractError as e:
            if self.errorlevel > 1:
                raise
            else:
                self._dbg(1, "tarfile: %s" % e)

    def extractfile(self, member):
        """Extract a member from the archive as a file object. `member' may be
           a filename or a TarInfo object. If `member' is a regular file, a
           file-like object is returned. If `member' is a link, a file-like
           object is constructed from the link's target. If `member' is none of
           the above, None is returned.
           The file-like object is read-only and provides the following
           methods: read(), readline(), readlines(), seek() and tell()
        """
        self._check("r")

        if isinstance(member, str):
            tarinfo = self.getmember(member)
        else:
            tarinfo = member

        if tarinfo.isreg():
            return self.fileobject(self, tarinfo)

        elif tarinfo.type not in SUPPORTED_TYPES:
            # If a member's type is unknown, it is treated as a
            # regular file.
            return self.fileobject(self, tarinfo)

        elif tarinfo.islnk() or tarinfo.issym():
            if isinstance(self.fileobj, _Stream):
                # A small but ugly workaround for the case that someone tries
                # to extract a (sym)link as a file-object from a non-seekable
                # stream of tar blocks.
                raise StreamError("cannot extract (sym)link as file object")
            else:
                # A (sym)link's file object is its target's file object.
                return self.extractfile(self._find_link_target(tarinfo))
        else:
            # If there's no data associated with the member (directory, chrdev,
            # blkdev, etc.), return None instead of a file object.
            return None

    def _extract_member(self, tarinfo, targetpath, set_attrs=True):
        """Extract the TarInfo object tarinfo to a physical
           file called targetpath.
        """
        # Fetch the TarInfo object for the given name
        # and build the destination pathname, replacing
        # forward slashes to platform specific separators.
        targetpath = targetpath.rstrip("/")
        targetpath = targetpath.replace("/", os.sep)

        # Create all upper directories.
        upperdirs = os.path.dirname(targetpath)
        if upperdirs and not os.path.exists(upperdirs):
            # Create directories that are not part of the archive with
            # default permissions.
            os.makedirs(upperdirs)

        if tarinfo.islnk() or tarinfo.issym():
            self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname))
        else:
            self._dbg(1, tarinfo.name)

        if tarinfo.isreg():
            self.makefile(tarinfo, targetpath)
        elif tarinfo.isdir():
            self.makedir(tarinfo, targetpath)
        elif tarinfo.isfifo():
            self.makefifo(tarinfo, targetpath)
        elif tarinfo.ischr() or tarinfo.isblk():
            self.makedev(tarinfo, targetpath)
        elif tarinfo.islnk() or tarinfo.issym():
            self.makelink(tarinfo, targetpath)
        elif tarinfo.type not in SUPPORTED_TYPES:
            self.makeunknown(tarinfo, targetpath)
        else:
            self.makefile(tarinfo, targetpath)

        if set_attrs:
            self.chown(tarinfo, targetpath)
            if not tarinfo.issym():
                self.chmod(tarinfo, targetpath)
                self.utime(tarinfo, targetpath)

    #--------------------------------------------------------------------------
    # Below are the different file methods. They are called via
    # _extract_member() when extract() is called. They can be replaced in a
    # subclass to implement other functionality.

    def makedir(self, tarinfo, targetpath):
        """Make a directory called targetpath.
        """
        try:
            # Use a safe mode for the directory, the real mode is set
            # later in _extract_member().
            os.mkdir(targetpath, 0o700)
        except EnvironmentError as e:
            if e.errno != errno.EEXIST:
                raise

    def makefile(self, tarinfo, targetpath):
        """Make a file called targetpath.
        """
        source = self.fileobj
        source.seek(tarinfo.offset_data)
        target = bltn_open(targetpath, "wb")
        if tarinfo.sparse is not None:
            for offset, size in tarinfo.sparse:
                target.seek(offset)
                copyfileobj(source, target, size)
        else:
            copyfileobj(source, target, tarinfo.size)
        target.seek(tarinfo.size)
        target.truncate()
        target.close()

    def makeunknown(self, tarinfo, targetpath):
        """Make a file from a TarInfo object with an unknown type
           at targetpath.
        """
        self.makefile(tarinfo, targetpath)
        self._dbg(1, "tarfile: Unknown file type %r, " \
                     "extracted as regular file." % tarinfo.type)

    def makefifo(self, tarinfo, targetpath):
        """Make a fifo called targetpath.
        """
        if hasattr(os, "mkfifo"):
            os.mkfifo(targetpath)
        else:
            raise ExtractError("fifo not supported by system")

    def makedev(self, tarinfo, targetpath):
        """Make a character or block device called targetpath.
        """
        if not hasattr(os, "mknod") or not hasattr(os, "makedev"):
            raise ExtractError("special devices not supported by system")

        mode = tarinfo.mode
        if tarinfo.isblk():
            mode |= stat.S_IFBLK
        else:
            mode |= stat.S_IFCHR

        os.mknod(targetpath, mode,
                 os.makedev(tarinfo.devmajor, tarinfo.devminor))

    def makelink(self, tarinfo, targetpath):
        """Make a (symbolic) link called targetpath. If it cannot be created
          (platform limitation), we try to make a copy of the referenced file
          instead of a link.
        """
        try:
            # For systems that support symbolic and hard links.
            if tarinfo.issym():
                os.symlink(tarinfo.linkname, targetpath)
            else:
                # See extract().
                if os.path.exists(tarinfo._link_target):
                    os.link(tarinfo._link_target, targetpath)
                else:
                    self._extract_member(self._find_link_target(tarinfo),
                                         targetpath)
        except symlink_exception:
            if tarinfo.issym():
                linkpath = os.path.join(os.path.dirname(tarinfo.name),
                                        tarinfo.linkname)
            else:
                linkpath = tarinfo.linkname
        else:
            try:
                self._extract_member(self._find_link_target(tarinfo),
                                     targetpath)
            except KeyError:
                raise ExtractError("unable to resolve link inside archive")

    def chown(self, tarinfo, targetpath):
        """Set owner of targetpath according to tarinfo.
        """
        if pwd and hasattr(os, "geteuid") and os.geteuid() == 0:
            # We have to be root to do so.
            try:
                g = grp.getgrnam(tarinfo.gname)[2]
            except KeyError:
                g = tarinfo.gid
            try:
                u = pwd.getpwnam(tarinfo.uname)[2]
            except KeyError:
                u = tarinfo.uid
            try:
                if tarinfo.issym() and hasattr(os, "lchown"):
                    os.lchown(targetpath, u, g)
                else:
                    if sys.platform != "os2emx":
                        os.chown(targetpath, u, g)
            except EnvironmentError as e:
                raise ExtractError("could not change owner")

    def chmod(self, tarinfo, targetpath):
        """Set file permissions of targetpath according to tarinfo.
        """
        if hasattr(os, 'chmod'):
            try:
                os.chmod(targetpath, tarinfo.mode)
            except EnvironmentError as e:
                raise ExtractError("could not change mode")

    def utime(self, tarinfo, targetpath):
        """Set modification time of targetpath according to tarinfo.
        """
        if not hasattr(os, 'utime'):
            return
        try:
            os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime))
        except EnvironmentError as e:
            raise ExtractError("could not change modification time")

    #--------------------------------------------------------------------------
    def next(self):
        """Return the next member of the archive as a TarInfo object, when
           TarFile is opened for reading. Return None if there is no more
           available.
        """
        self._check("ra")
        if self.firstmember is not None:
            m = self.firstmember
            self.firstmember = None
            return m

        # Read the next block.
        self.fileobj.seek(self.offset)
        tarinfo = None
        while True:
            try:
                tarinfo = self.tarinfo.fromtarfile(self)
            except EOFHeaderError as e:
                if self.ignore_zeros:
                    self._dbg(2, "0x%X: %s" % (self.offset, e))
                    self.offset += BLOCKSIZE
                    continue
            except InvalidHeaderError as e:
                if self.ignore_zeros:
                    self._dbg(2, "0x%X: %s" % (self.offset, e))
                    self.offset += BLOCKSIZE
                    continue
                elif self.offset == 0:
                    raise ReadError(str(e))
            except EmptyHeaderError:
                if self.offset == 0:
                    raise ReadError("empty file")
            except TruncatedHeaderError as e:
                if self.offset == 0:
                    raise ReadError(str(e))
            except SubsequentHeaderError as e:
                raise ReadError(str(e))
            break

        if tarinfo is not None:
            self.members.append(tarinfo)
        else:
            self._loaded = True

        return tarinfo

    #--------------------------------------------------------------------------
    # Little helper methods:

    def _getmember(self, name, tarinfo=None, normalize=False):
        """Find an archive member by name from bottom to top.
           If tarinfo is given, it is used as the starting point.
        """
        # Ensure that all members have been loaded.
        members = self.getmembers()

        # Limit the member search list up to tarinfo.
        if tarinfo is not None:
            members = members[:members.index(tarinfo)]

        if normalize:
            name = os.path.normpath(name)

        for member in reversed(members):
            if normalize:
                member_name = os.path.normpath(member.name)
            else:
                member_name = member.name

            if name == member_name:
                return member

    def _load(self):
        """Read through the entire archive file and look for readable
           members.
        """
        while True:
            tarinfo = self.next()
            if tarinfo is None:
                break
        self._loaded = True

    def _check(self, mode=None):
        """Check if TarFile is still open, and if the operation's mode
           corresponds to TarFile's mode.
        """
        if self.closed:
            raise IOError("%s is closed" % self.__class__.__name__)
        if mode is not None and self.mode not in mode:
            raise IOError("bad operation for mode %r" % self.mode)

    def _find_link_target(self, tarinfo):
        """Find the target member of a symlink or hardlink member in the
           archive.
        """
        if tarinfo.issym():
            # Always search the entire archive.
            linkname = os.path.dirname(tarinfo.name) + "/" + tarinfo.linkname
            limit = None
        else:
            # Search the archive before the link, because a hard link is
            # just a reference to an already archived file.
            linkname = tarinfo.linkname
            limit = tarinfo

        member = self._getmember(linkname, tarinfo=limit, normalize=True)
        if member is None:
            raise KeyError("linkname %r not found" % linkname)
        return member

    def __iter__(self):
        """Provide an iterator object.
        """
        if self._loaded:
            return iter(self.members)
        else:
            return TarIter(self)

    def _dbg(self, level, msg):
        """Write debugging output to sys.stderr.
        """
        if level <= self.debug:
            print(msg, file=sys.stderr)

    def __enter__(self):
        self._check()
        return self

    def __exit__(self, type, value, traceback):
        if type is None:
            self.close()
        else:
            # An exception occurred. We must not call close() because
            # it would try to write end-of-archive blocks and padding.
            if not self._extfileobj:
                self.fileobj.close()
            self.closed = True
# class TarFile

class TarIter(object):
    """Iterator Class.

       for tarinfo in TarFile(...):
           suite...
    """

    def __init__(self, tarfile):
        """Construct a TarIter object.
        """
        self.tarfile = tarfile
        self.index = 0
    def __iter__(self):
        """Return iterator object.
        """
        return self

    def __next__(self):
        """Return the next item using TarFile's next() method.
           When all members have been read, set TarFile as _loaded.
        """
        # Fix for SF #1100429: Under rare circumstances it can
        # happen that getmembers() is called during iteration,
        # which will cause TarIter to stop prematurely.
        if not self.tarfile._loaded:
            tarinfo = self.tarfile.next()
            if not tarinfo:
                self.tarfile._loaded = True
                raise StopIteration
        else:
            try:
                tarinfo = self.tarfile.members[self.index]
            except IndexError:
                raise StopIteration
        self.index += 1
        return tarinfo

    next = __next__ # for Python 2.x

#--------------------
# exported functions
#--------------------
def is_tarfile(name):
    """Return True if name points to a tar archive that we
       are able to handle, else return False.
    """
    try:
        t = open(name)
        t.close()
        return True
    except TarError:
        return False

bltn_open = open
open = TarFile.open
site-packages/pip/_vendor/distlib/_backport/__init__.py000064400000000422151733463560017232 0ustar00"""Modules copied from Python 3 standard libraries, for internal use only.

Individual classes and functions are found in d2._backport.misc.  Intended
usage is to always import things missing from 3.1 from that module: the
built-in/stdlib objects will be used if found.
"""
site-packages/pip/_vendor/distlib/_backport/shutil.py000064400000062062151733463560017013 0ustar00# -*- coding: utf-8 -*-
#
# Copyright (C) 2012 The Python Software Foundation.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
"""Utility functions for copying and archiving files and directory trees.

XXX The functions here don't copy the resource fork or other metadata on Mac.

"""

import os
import sys
import stat
from os.path import abspath
import fnmatch
import collections
import errno
from . import tarfile

try:
    import bz2
    _BZ2_SUPPORTED = True
except ImportError:
    _BZ2_SUPPORTED = False

try:
    from pwd import getpwnam
except ImportError:
    getpwnam = None

try:
    from grp import getgrnam
except ImportError:
    getgrnam = None

__all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2",
           "copytree", "move", "rmtree", "Error", "SpecialFileError",
           "ExecError", "make_archive", "get_archive_formats",
           "register_archive_format", "unregister_archive_format",
           "get_unpack_formats", "register_unpack_format",
           "unregister_unpack_format", "unpack_archive", "ignore_patterns"]

class Error(EnvironmentError):
    pass

class SpecialFileError(EnvironmentError):
    """Raised when trying to do a kind of operation (e.g. copying) which is
    not supported on a special file (e.g. a named pipe)"""

class ExecError(EnvironmentError):
    """Raised when a command could not be executed"""

class ReadError(EnvironmentError):
    """Raised when an archive cannot be read"""

class RegistryError(Exception):
    """Raised when a registery operation with the archiving
    and unpacking registeries fails"""


try:
    WindowsError
except NameError:
    WindowsError = None

def copyfileobj(fsrc, fdst, length=16*1024):
    """copy data from file-like object fsrc to file-like object fdst"""
    while 1:
        buf = fsrc.read(length)
        if not buf:
            break
        fdst.write(buf)

def _samefile(src, dst):
    # Macintosh, Unix.
    if hasattr(os.path, 'samefile'):
        try:
            return os.path.samefile(src, dst)
        except OSError:
            return False

    # All other platforms: check for same pathname.
    return (os.path.normcase(os.path.abspath(src)) ==
            os.path.normcase(os.path.abspath(dst)))

def copyfile(src, dst):
    """Copy data from src to dst"""
    if _samefile(src, dst):
        raise Error("`%s` and `%s` are the same file" % (src, dst))

    for fn in [src, dst]:
        try:
            st = os.stat(fn)
        except OSError:
            # File most likely does not exist
            pass
        else:
            # XXX What about other special files? (sockets, devices...)
            if stat.S_ISFIFO(st.st_mode):
                raise SpecialFileError("`%s` is a named pipe" % fn)

    with open(src, 'rb') as fsrc:
        with open(dst, 'wb') as fdst:
            copyfileobj(fsrc, fdst)

def copymode(src, dst):
    """Copy mode bits from src to dst"""
    if hasattr(os, 'chmod'):
        st = os.stat(src)
        mode = stat.S_IMODE(st.st_mode)
        os.chmod(dst, mode)

def copystat(src, dst):
    """Copy all stat info (mode bits, atime, mtime, flags) from src to dst"""
    st = os.stat(src)
    mode = stat.S_IMODE(st.st_mode)
    if hasattr(os, 'utime'):
        os.utime(dst, (st.st_atime, st.st_mtime))
    if hasattr(os, 'chmod'):
        os.chmod(dst, mode)
    if hasattr(os, 'chflags') and hasattr(st, 'st_flags'):
        try:
            os.chflags(dst, st.st_flags)
        except OSError as why:
            if (not hasattr(errno, 'EOPNOTSUPP') or
                why.errno != errno.EOPNOTSUPP):
                raise

def copy(src, dst):
    """Copy data and mode bits ("cp src dst").

    The destination may be a directory.

    """
    if os.path.isdir(dst):
        dst = os.path.join(dst, os.path.basename(src))
    copyfile(src, dst)
    copymode(src, dst)

def copy2(src, dst):
    """Copy data and all stat info ("cp -p src dst").

    The destination may be a directory.

    """
    if os.path.isdir(dst):
        dst = os.path.join(dst, os.path.basename(src))
    copyfile(src, dst)
    copystat(src, dst)

def ignore_patterns(*patterns):
    """Function that can be used as copytree() ignore parameter.

    Patterns is a sequence of glob-style patterns
    that are used to exclude files"""
    def _ignore_patterns(path, names):
        ignored_names = []
        for pattern in patterns:
            ignored_names.extend(fnmatch.filter(names, pattern))
        return set(ignored_names)
    return _ignore_patterns

def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2,
             ignore_dangling_symlinks=False):
    """Recursively copy a directory tree.

    The destination directory must not already exist.
    If exception(s) occur, an Error is raised with a list of reasons.

    If the optional symlinks flag is true, symbolic links in the
    source tree result in symbolic links in the destination tree; if
    it is false, the contents of the files pointed to by symbolic
    links are copied. If the file pointed by the symlink doesn't
    exist, an exception will be added in the list of errors raised in
    an Error exception at the end of the copy process.

    You can set the optional ignore_dangling_symlinks flag to true if you
    want to silence this exception. Notice that this has no effect on
    platforms that don't support os.symlink.

    The optional ignore argument is a callable. If given, it
    is called with the `src` parameter, which is the directory
    being visited by copytree(), and `names` which is the list of
    `src` contents, as returned by os.listdir():

        callable(src, names) -> ignored_names

    Since copytree() is called recursively, the callable will be
    called once for each directory that is copied. It returns a
    list of names relative to the `src` directory that should
    not be copied.

    The optional copy_function argument is a callable that will be used
    to copy each file. It will be called with the source path and the
    destination path as arguments. By default, copy2() is used, but any
    function that supports the same signature (like copy()) can be used.

    """
    names = os.listdir(src)
    if ignore is not None:
        ignored_names = ignore(src, names)
    else:
        ignored_names = set()

    os.makedirs(dst)
    errors = []
    for name in names:
        if name in ignored_names:
            continue
        srcname = os.path.join(src, name)
        dstname = os.path.join(dst, name)
        try:
            if os.path.islink(srcname):
                linkto = os.readlink(srcname)
                if symlinks:
                    os.symlink(linkto, dstname)
                else:
                    # ignore dangling symlink if the flag is on
                    if not os.path.exists(linkto) and ignore_dangling_symlinks:
                        continue
                    # otherwise let the copy occurs. copy2 will raise an error
                    copy_function(srcname, dstname)
            elif os.path.isdir(srcname):
                copytree(srcname, dstname, symlinks, ignore, copy_function)
            else:
                # Will raise a SpecialFileError for unsupported file types
                copy_function(srcname, dstname)
        # catch the Error from the recursive copytree so that we can
        # continue with other files
        except Error as err:
            errors.extend(err.args[0])
        except EnvironmentError as why:
            errors.append((srcname, dstname, str(why)))
    try:
        copystat(src, dst)
    except OSError as why:
        if WindowsError is not None and isinstance(why, WindowsError):
            # Copying file access times may fail on Windows
            pass
        else:
            errors.extend((src, dst, str(why)))
    if errors:
        raise Error(errors)

def rmtree(path, ignore_errors=False, onerror=None):
    """Recursively delete a directory tree.

    If ignore_errors is set, errors are ignored; otherwise, if onerror
    is set, it is called to handle the error with arguments (func,
    path, exc_info) where func is os.listdir, os.remove, or os.rmdir;
    path is the argument to that function that caused it to fail; and
    exc_info is a tuple returned by sys.exc_info().  If ignore_errors
    is false and onerror is None, an exception is raised.

    """
    if ignore_errors:
        def onerror(*args):
            pass
    elif onerror is None:
        def onerror(*args):
            raise
    try:
        if os.path.islink(path):
            # symlinks to directories are forbidden, see bug #1669
            raise OSError("Cannot call rmtree on a symbolic link")
    except OSError:
        onerror(os.path.islink, path, sys.exc_info())
        # can't continue even if onerror hook returns
        return
    names = []
    try:
        names = os.listdir(path)
    except os.error:
        onerror(os.listdir, path, sys.exc_info())
    for name in names:
        fullname = os.path.join(path, name)
        try:
            mode = os.lstat(fullname).st_mode
        except os.error:
            mode = 0
        if stat.S_ISDIR(mode):
            rmtree(fullname, ignore_errors, onerror)
        else:
            try:
                os.remove(fullname)
            except os.error:
                onerror(os.remove, fullname, sys.exc_info())
    try:
        os.rmdir(path)
    except os.error:
        onerror(os.rmdir, path, sys.exc_info())


def _basename(path):
    # A basename() variant which first strips the trailing slash, if present.
    # Thus we always get the last component of the path, even for directories.
    return os.path.basename(path.rstrip(os.path.sep))

def move(src, dst):
    """Recursively move a file or directory to another location. This is
    similar to the Unix "mv" command.

    If the destination is a directory or a symlink to a directory, the source
    is moved inside the directory. The destination path must not already
    exist.

    If the destination already exists but is not a directory, it may be
    overwritten depending on os.rename() semantics.

    If the destination is on our current filesystem, then rename() is used.
    Otherwise, src is copied to the destination and then removed.
    A lot more could be done here...  A look at a mv.c shows a lot of
    the issues this implementation glosses over.

    """
    real_dst = dst
    if os.path.isdir(dst):
        if _samefile(src, dst):
            # We might be on a case insensitive filesystem,
            # perform the rename anyway.
            os.rename(src, dst)
            return

        real_dst = os.path.join(dst, _basename(src))
        if os.path.exists(real_dst):
            raise Error("Destination path '%s' already exists" % real_dst)
    try:
        os.rename(src, real_dst)
    except OSError:
        if os.path.isdir(src):
            if _destinsrc(src, dst):
                raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst))
            copytree(src, real_dst, symlinks=True)
            rmtree(src)
        else:
            copy2(src, real_dst)
            os.unlink(src)

def _destinsrc(src, dst):
    src = abspath(src)
    dst = abspath(dst)
    if not src.endswith(os.path.sep):
        src += os.path.sep
    if not dst.endswith(os.path.sep):
        dst += os.path.sep
    return dst.startswith(src)

def _get_gid(name):
    """Returns a gid, given a group name."""
    if getgrnam is None or name is None:
        return None
    try:
        result = getgrnam(name)
    except KeyError:
        result = None
    if result is not None:
        return result[2]
    return None

def _get_uid(name):
    """Returns an uid, given a user name."""
    if getpwnam is None or name is None:
        return None
    try:
        result = getpwnam(name)
    except KeyError:
        result = None
    if result is not None:
        return result[2]
    return None

def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0,
                  owner=None, group=None, logger=None):
    """Create a (possibly compressed) tar file from all the files under
    'base_dir'.

    'compress' must be "gzip" (the default), "bzip2", or None.

    'owner' and 'group' can be used to define an owner and a group for the
    archive that is being built. If not provided, the current owner and group
    will be used.

    The output tar file will be named 'base_name' +  ".tar", possibly plus
    the appropriate compression extension (".gz", or ".bz2").

    Returns the output filename.
    """
    tar_compression = {'gzip': 'gz', None: ''}
    compress_ext = {'gzip': '.gz'}

    if _BZ2_SUPPORTED:
        tar_compression['bzip2'] = 'bz2'
        compress_ext['bzip2'] = '.bz2'

    # flags for compression program, each element of list will be an argument
    if compress is not None and compress not in compress_ext:
        raise ValueError("bad value for 'compress', or compression format not "
                         "supported : {0}".format(compress))

    archive_name = base_name + '.tar' + compress_ext.get(compress, '')
    archive_dir = os.path.dirname(archive_name)

    if not os.path.exists(archive_dir):
        if logger is not None:
            logger.info("creating %s", archive_dir)
        if not dry_run:
            os.makedirs(archive_dir)

    # creating the tarball
    if logger is not None:
        logger.info('Creating tar archive')

    uid = _get_uid(owner)
    gid = _get_gid(group)

    def _set_uid_gid(tarinfo):
        if gid is not None:
            tarinfo.gid = gid
            tarinfo.gname = group
        if uid is not None:
            tarinfo.uid = uid
            tarinfo.uname = owner
        return tarinfo

    if not dry_run:
        tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress])
        try:
            tar.add(base_dir, filter=_set_uid_gid)
        finally:
            tar.close()

    return archive_name

def _call_external_zip(base_dir, zip_filename, verbose=False, dry_run=False):
    # XXX see if we want to keep an external call here
    if verbose:
        zipoptions = "-r"
    else:
        zipoptions = "-rq"
    from distutils.errors import DistutilsExecError
    from distutils.spawn import spawn
    try:
        spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run)
    except DistutilsExecError:
        # XXX really should distinguish between "couldn't find
        # external 'zip' command" and "zip failed".
        raise ExecError("unable to create zip file '%s': "
            "could neither import the 'zipfile' module nor "
            "find a standalone zip utility") % zip_filename

def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None):
    """Create a zip file from all the files under 'base_dir'.

    The output zip file will be named 'base_name' + ".zip".  Uses either the
    "zipfile" Python module (if available) or the InfoZIP "zip" utility
    (if installed and found on the default search path).  If neither tool is
    available, raises ExecError.  Returns the name of the output zip
    file.
    """
    zip_filename = base_name + ".zip"
    archive_dir = os.path.dirname(base_name)

    if not os.path.exists(archive_dir):
        if logger is not None:
            logger.info("creating %s", archive_dir)
        if not dry_run:
            os.makedirs(archive_dir)

    # If zipfile module is not available, try spawning an external 'zip'
    # command.
    try:
        import zipfile
    except ImportError:
        zipfile = None

    if zipfile is None:
        _call_external_zip(base_dir, zip_filename, verbose, dry_run)
    else:
        if logger is not None:
            logger.info("creating '%s' and adding '%s' to it",
                        zip_filename, base_dir)

        if not dry_run:
            zip = zipfile.ZipFile(zip_filename, "w",
                                  compression=zipfile.ZIP_DEFLATED)

            for dirpath, dirnames, filenames in os.walk(base_dir):
                for name in filenames:
                    path = os.path.normpath(os.path.join(dirpath, name))
                    if os.path.isfile(path):
                        zip.write(path, path)
                        if logger is not None:
                            logger.info("adding '%s'", path)
            zip.close()

    return zip_filename

_ARCHIVE_FORMATS = {
    'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"),
    'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"),
    'tar':   (_make_tarball, [('compress', None)], "uncompressed tar file"),
    'zip':   (_make_zipfile, [], "ZIP file"),
    }

if _BZ2_SUPPORTED:
    _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')],
                                "bzip2'ed tar-file")

def get_archive_formats():
    """Returns a list of supported formats for archiving and unarchiving.

    Each element of the returned sequence is a tuple (name, description)
    """
    formats = [(name, registry[2]) for name, registry in
               _ARCHIVE_FORMATS.items()]
    formats.sort()
    return formats

def register_archive_format(name, function, extra_args=None, description=''):
    """Registers an archive format.

    name is the name of the format. function is the callable that will be
    used to create archives. If provided, extra_args is a sequence of
    (name, value) tuples that will be passed as arguments to the callable.
    description can be provided to describe the format, and will be returned
    by the get_archive_formats() function.
    """
    if extra_args is None:
        extra_args = []
    if not isinstance(function, collections.Callable):
        raise TypeError('The %s object is not callable' % function)
    if not isinstance(extra_args, (tuple, list)):
        raise TypeError('extra_args needs to be a sequence')
    for element in extra_args:
        if not isinstance(element, (tuple, list)) or len(element) !=2:
            raise TypeError('extra_args elements are : (arg_name, value)')

    _ARCHIVE_FORMATS[name] = (function, extra_args, description)

def unregister_archive_format(name):
    del _ARCHIVE_FORMATS[name]

def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0,
                 dry_run=0, owner=None, group=None, logger=None):
    """Create an archive file (eg. zip or tar).

    'base_name' is the name of the file to create, minus any format-specific
    extension; 'format' is the archive format: one of "zip", "tar", "bztar"
    or "gztar".

    'root_dir' is a directory that will be the root directory of the
    archive; ie. we typically chdir into 'root_dir' before creating the
    archive.  'base_dir' is the directory where we start archiving from;
    ie. 'base_dir' will be the common prefix of all files and
    directories in the archive.  'root_dir' and 'base_dir' both default
    to the current directory.  Returns the name of the archive file.

    'owner' and 'group' are used when creating a tar archive. By default,
    uses the current owner and group.
    """
    save_cwd = os.getcwd()
    if root_dir is not None:
        if logger is not None:
            logger.debug("changing into '%s'", root_dir)
        base_name = os.path.abspath(base_name)
        if not dry_run:
            os.chdir(root_dir)

    if base_dir is None:
        base_dir = os.curdir

    kwargs = {'dry_run': dry_run, 'logger': logger}

    try:
        format_info = _ARCHIVE_FORMATS[format]
    except KeyError:
        raise ValueError("unknown archive format '%s'" % format)

    func = format_info[0]
    for arg, val in format_info[1]:
        kwargs[arg] = val

    if format != 'zip':
        kwargs['owner'] = owner
        kwargs['group'] = group

    try:
        filename = func(base_name, base_dir, **kwargs)
    finally:
        if root_dir is not None:
            if logger is not None:
                logger.debug("changing back to '%s'", save_cwd)
            os.chdir(save_cwd)

    return filename


def get_unpack_formats():
    """Returns a list of supported formats for unpacking.

    Each element of the returned sequence is a tuple
    (name, extensions, description)
    """
    formats = [(name, info[0], info[3]) for name, info in
               _UNPACK_FORMATS.items()]
    formats.sort()
    return formats

def _check_unpack_options(extensions, function, extra_args):
    """Checks what gets registered as an unpacker."""
    # first make sure no other unpacker is registered for this extension
    existing_extensions = {}
    for name, info in _UNPACK_FORMATS.items():
        for ext in info[0]:
            existing_extensions[ext] = name

    for extension in extensions:
        if extension in existing_extensions:
            msg = '%s is already registered for "%s"'
            raise RegistryError(msg % (extension,
                                       existing_extensions[extension]))

    if not isinstance(function, collections.Callable):
        raise TypeError('The registered function must be a callable')


def register_unpack_format(name, extensions, function, extra_args=None,
                           description=''):
    """Registers an unpack format.

    `name` is the name of the format. `extensions` is a list of extensions
    corresponding to the format.

    `function` is the callable that will be
    used to unpack archives. The callable will receive archives to unpack.
    If it's unable to handle an archive, it needs to raise a ReadError
    exception.

    If provided, `extra_args` is a sequence of
    (name, value) tuples that will be passed as arguments to the callable.
    description can be provided to describe the format, and will be returned
    by the get_unpack_formats() function.
    """
    if extra_args is None:
        extra_args = []
    _check_unpack_options(extensions, function, extra_args)
    _UNPACK_FORMATS[name] = extensions, function, extra_args, description

def unregister_unpack_format(name):
    """Removes the pack format from the registery."""
    del _UNPACK_FORMATS[name]

def _ensure_directory(path):
    """Ensure that the parent directory of `path` exists"""
    dirname = os.path.dirname(path)
    if not os.path.isdir(dirname):
        os.makedirs(dirname)

def _unpack_zipfile(filename, extract_dir):
    """Unpack zip `filename` to `extract_dir`
    """
    try:
        import zipfile
    except ImportError:
        raise ReadError('zlib not supported, cannot unpack this archive.')

    if not zipfile.is_zipfile(filename):
        raise ReadError("%s is not a zip file" % filename)

    zip = zipfile.ZipFile(filename)
    try:
        for info in zip.infolist():
            name = info.filename

            # don't extract absolute paths or ones with .. in them
            if name.startswith('/') or '..' in name:
                continue

            target = os.path.join(extract_dir, *name.split('/'))
            if not target:
                continue

            _ensure_directory(target)
            if not name.endswith('/'):
                # file
                data = zip.read(info.filename)
                f = open(target, 'wb')
                try:
                    f.write(data)
                finally:
                    f.close()
                    del data
    finally:
        zip.close()

def _unpack_tarfile(filename, extract_dir):
    """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir`
    """
    try:
        tarobj = tarfile.open(filename)
    except tarfile.TarError:
        raise ReadError(
            "%s is not a compressed or uncompressed tar file" % filename)
    try:
        tarobj.extractall(extract_dir)
    finally:
        tarobj.close()

_UNPACK_FORMATS = {
    'gztar': (['.tar.gz', '.tgz'], _unpack_tarfile, [], "gzip'ed tar-file"),
    'tar':   (['.tar'], _unpack_tarfile, [], "uncompressed tar file"),
    'zip':   (['.zip'], _unpack_zipfile, [], "ZIP file")
    }

if _BZ2_SUPPORTED:
    _UNPACK_FORMATS['bztar'] = (['.bz2'], _unpack_tarfile, [],
                                "bzip2'ed tar-file")

def _find_unpack_format(filename):
    for name, info in _UNPACK_FORMATS.items():
        for extension in info[0]:
            if filename.endswith(extension):
                return name
    return None

def unpack_archive(filename, extract_dir=None, format=None):
    """Unpack an archive.

    `filename` is the name of the archive.

    `extract_dir` is the name of the target directory, where the archive
    is unpacked. If not provided, the current working directory is used.

    `format` is the archive format: one of "zip", "tar", or "gztar". Or any
    other registered format. If not provided, unpack_archive will use the
    filename extension and see if an unpacker was registered for that
    extension.

    In case none is found, a ValueError is raised.
    """
    if extract_dir is None:
        extract_dir = os.getcwd()

    if format is not None:
        try:
            format_info = _UNPACK_FORMATS[format]
        except KeyError:
            raise ValueError("Unknown unpack format '{0}'".format(format))

        func = format_info[1]
        func(filename, extract_dir, **dict(format_info[2]))
    else:
        # we need to look at the registered unpackers supported extensions
        format = _find_unpack_format(filename)
        if format is None:
            raise ReadError("Unknown archive format '{0}'".format(filename))

        func = _UNPACK_FORMATS[format][1]
        kwargs = dict(_UNPACK_FORMATS[format][2])
        func(filename, extract_dir, **kwargs)
site-packages/pip/_vendor/distlib/_backport/sysconfig.py000064400000064516151733463560017515 0ustar00# -*- coding: utf-8 -*-
#
# Copyright (C) 2012 The Python Software Foundation.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
"""Access to Python's configuration information."""

import codecs
import os
import re
import sys
from os.path import pardir, realpath
try:
    import configparser
except ImportError:
    import ConfigParser as configparser


__all__ = [
    'get_config_h_filename',
    'get_config_var',
    'get_config_vars',
    'get_makefile_filename',
    'get_path',
    'get_path_names',
    'get_paths',
    'get_platform',
    'get_python_version',
    'get_scheme_names',
    'parse_config_h',
]


def _safe_realpath(path):
    try:
        return realpath(path)
    except OSError:
        return path


if sys.executable:
    _PROJECT_BASE = os.path.dirname(_safe_realpath(sys.executable))
else:
    # sys.executable can be empty if argv[0] has been changed and Python is
    # unable to retrieve the real program name
    _PROJECT_BASE = _safe_realpath(os.getcwd())

if os.name == "nt" and "pcbuild" in _PROJECT_BASE[-8:].lower():
    _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir))
# PC/VS7.1
if os.name == "nt" and "\\pc\\v" in _PROJECT_BASE[-10:].lower():
    _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir))
# PC/AMD64
if os.name == "nt" and "\\pcbuild\\amd64" in _PROJECT_BASE[-14:].lower():
    _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir))


def is_python_build():
    for fn in ("Setup.dist", "Setup.local"):
        if os.path.isfile(os.path.join(_PROJECT_BASE, "Modules", fn)):
            return True
    return False

_PYTHON_BUILD = is_python_build()

_cfg_read = False

def _ensure_cfg_read():
    global _cfg_read
    if not _cfg_read:
        from ..resources import finder
        backport_package = __name__.rsplit('.', 1)[0]
        _finder = finder(backport_package)
        _cfgfile = _finder.find('sysconfig.cfg')
        assert _cfgfile, 'sysconfig.cfg exists'
        with _cfgfile.as_stream() as s:
            _SCHEMES.readfp(s)
        if _PYTHON_BUILD:
            for scheme in ('posix_prefix', 'posix_home'):
                _SCHEMES.set(scheme, 'include', '{srcdir}/Include')
                _SCHEMES.set(scheme, 'platinclude', '{projectbase}/.')

        _cfg_read = True


_SCHEMES = configparser.RawConfigParser()
_VAR_REPL = re.compile(r'\{([^{]*?)\}')

def _expand_globals(config):
    _ensure_cfg_read()
    if config.has_section('globals'):
        globals = config.items('globals')
    else:
        globals = tuple()

    sections = config.sections()
    for section in sections:
        if section == 'globals':
            continue
        for option, value in globals:
            if config.has_option(section, option):
                continue
            config.set(section, option, value)
    config.remove_section('globals')

    # now expanding local variables defined in the cfg file
    #
    for section in config.sections():
        variables = dict(config.items(section))

        def _replacer(matchobj):
            name = matchobj.group(1)
            if name in variables:
                return variables[name]
            return matchobj.group(0)

        for option, value in config.items(section):
            config.set(section, option, _VAR_REPL.sub(_replacer, value))

#_expand_globals(_SCHEMES)

 # FIXME don't rely on sys.version here, its format is an implementation detail
 # of CPython, use sys.version_info or sys.hexversion
_PY_VERSION = sys.version.split()[0]
_PY_VERSION_SHORT = sys.version[:3]
_PY_VERSION_SHORT_NO_DOT = _PY_VERSION[0] + _PY_VERSION[2]
_PREFIX = os.path.normpath(sys.prefix)
_EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
_CONFIG_VARS = None
_USER_BASE = None


def _subst_vars(path, local_vars):
    """In the string `path`, replace tokens like {some.thing} with the
    corresponding value from the map `local_vars`.

    If there is no corresponding value, leave the token unchanged.
    """
    def _replacer(matchobj):
        name = matchobj.group(1)
        if name in local_vars:
            return local_vars[name]
        elif name in os.environ:
            return os.environ[name]
        return matchobj.group(0)
    return _VAR_REPL.sub(_replacer, path)


def _extend_dict(target_dict, other_dict):
    target_keys = target_dict.keys()
    for key, value in other_dict.items():
        if key in target_keys:
            continue
        target_dict[key] = value


def _expand_vars(scheme, vars):
    res = {}
    if vars is None:
        vars = {}
    _extend_dict(vars, get_config_vars())

    for key, value in _SCHEMES.items(scheme):
        if os.name in ('posix', 'nt'):
            value = os.path.expanduser(value)
        res[key] = os.path.normpath(_subst_vars(value, vars))
    return res


def format_value(value, vars):
    def _replacer(matchobj):
        name = matchobj.group(1)
        if name in vars:
            return vars[name]
        return matchobj.group(0)
    return _VAR_REPL.sub(_replacer, value)


def _get_default_scheme():
    if os.name == 'posix':
        # the default scheme for posix is posix_prefix
        return 'posix_prefix'
    return os.name


def _getuserbase():
    env_base = os.environ.get("PYTHONUSERBASE", None)

    def joinuser(*args):
        return os.path.expanduser(os.path.join(*args))

    # what about 'os2emx', 'riscos' ?
    if os.name == "nt":
        base = os.environ.get("APPDATA") or "~"
        if env_base:
            return env_base
        else:
            return joinuser(base, "Python")

    if sys.platform == "darwin":
        framework = get_config_var("PYTHONFRAMEWORK")
        if framework:
            if env_base:
                return env_base
            else:
                return joinuser("~", "Library", framework, "%d.%d" %
                                sys.version_info[:2])

    if env_base:
        return env_base
    else:
        return joinuser("~", ".local")


def _parse_makefile(filename, vars=None):
    """Parse a Makefile-style file.

    A dictionary containing name/value pairs is returned.  If an
    optional dictionary is passed in as the second argument, it is
    used instead of a new dictionary.
    """
    # Regexes needed for parsing Makefile (and similar syntaxes,
    # like old-style Setup files).
    _variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)")
    _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)")
    _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}")

    if vars is None:
        vars = {}
    done = {}
    notdone = {}

    with codecs.open(filename, encoding='utf-8', errors="surrogateescape") as f:
        lines = f.readlines()

    for line in lines:
        if line.startswith('#') or line.strip() == '':
            continue
        m = _variable_rx.match(line)
        if m:
            n, v = m.group(1, 2)
            v = v.strip()
            # `$$' is a literal `$' in make
            tmpv = v.replace('$$', '')

            if "$" in tmpv:
                notdone[n] = v
            else:
                try:
                    v = int(v)
                except ValueError:
                    # insert literal `$'
                    done[n] = v.replace('$$', '$')
                else:
                    done[n] = v

    # do variable interpolation here
    variables = list(notdone.keys())

    # Variables with a 'PY_' prefix in the makefile. These need to
    # be made available without that prefix through sysconfig.
    # Special care is needed to ensure that variable expansion works, even
    # if the expansion uses the name without a prefix.
    renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS')

    while len(variables) > 0:
        for name in tuple(variables):
            value = notdone[name]
            m = _findvar1_rx.search(value) or _findvar2_rx.search(value)
            if m is not None:
                n = m.group(1)
                found = True
                if n in done:
                    item = str(done[n])
                elif n in notdone:
                    # get it on a subsequent round
                    found = False
                elif n in os.environ:
                    # do it like make: fall back to environment
                    item = os.environ[n]

                elif n in renamed_variables:
                    if (name.startswith('PY_') and
                        name[3:] in renamed_variables):
                        item = ""

                    elif 'PY_' + n in notdone:
                        found = False

                    else:
                        item = str(done['PY_' + n])

                else:
                    done[n] = item = ""

                if found:
                    after = value[m.end():]
                    value = value[:m.start()] + item + after
                    if "$" in after:
                        notdone[name] = value
                    else:
                        try:
                            value = int(value)
                        except ValueError:
                            done[name] = value.strip()
                        else:
                            done[name] = value
                        variables.remove(name)

                        if (name.startswith('PY_') and
                            name[3:] in renamed_variables):

                            name = name[3:]
                            if name not in done:
                                done[name] = value

            else:
                # bogus variable reference (e.g. "prefix=$/opt/python");
                # just drop it since we can't deal
                done[name] = value
                variables.remove(name)

    # strip spurious spaces
    for k, v in done.items():
        if isinstance(v, str):
            done[k] = v.strip()

    # save the results in the global dictionary
    vars.update(done)
    return vars


def get_makefile_filename():
    """Return the path of the Makefile."""
    if _PYTHON_BUILD:
        return os.path.join(_PROJECT_BASE, "Makefile")
    if hasattr(sys, 'abiflags'):
        config_dir_name = 'config-%s%s' % (_PY_VERSION_SHORT, sys.abiflags)
    else:
        config_dir_name = 'config'
    return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile')


def _init_posix(vars):
    """Initialize the module as appropriate for POSIX systems."""
    # load the installed Makefile:
    makefile = get_makefile_filename()
    try:
        _parse_makefile(makefile, vars)
    except IOError as e:
        msg = "invalid Python installation: unable to open %s" % makefile
        if hasattr(e, "strerror"):
            msg = msg + " (%s)" % e.strerror
        raise IOError(msg)
    # load the installed pyconfig.h:
    config_h = get_config_h_filename()
    try:
        with open(config_h) as f:
            parse_config_h(f, vars)
    except IOError as e:
        msg = "invalid Python installation: unable to open %s" % config_h
        if hasattr(e, "strerror"):
            msg = msg + " (%s)" % e.strerror
        raise IOError(msg)
    # On AIX, there are wrong paths to the linker scripts in the Makefile
    # -- these paths are relative to the Python source, but when installed
    # the scripts are in another directory.
    if _PYTHON_BUILD:
        vars['LDSHARED'] = vars['BLDSHARED']


def _init_non_posix(vars):
    """Initialize the module as appropriate for NT"""
    # set basic install directories
    vars['LIBDEST'] = get_path('stdlib')
    vars['BINLIBDEST'] = get_path('platstdlib')
    vars['INCLUDEPY'] = get_path('include')
    vars['SO'] = '.pyd'
    vars['EXE'] = '.exe'
    vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT
    vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable))

#
# public APIs
#


def parse_config_h(fp, vars=None):
    """Parse a config.h-style file.

    A dictionary containing name/value pairs is returned.  If an
    optional dictionary is passed in as the second argument, it is
    used instead of a new dictionary.
    """
    if vars is None:
        vars = {}
    define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n")
    undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n")

    while True:
        line = fp.readline()
        if not line:
            break
        m = define_rx.match(line)
        if m:
            n, v = m.group(1, 2)
            try:
                v = int(v)
            except ValueError:
                pass
            vars[n] = v
        else:
            m = undef_rx.match(line)
            if m:
                vars[m.group(1)] = 0
    return vars


def get_config_h_filename():
    """Return the path of pyconfig.h."""
    if _PYTHON_BUILD:
        if os.name == "nt":
            inc_dir = os.path.join(_PROJECT_BASE, "PC")
        else:
            inc_dir = _PROJECT_BASE
    else:
        inc_dir = get_path('platinclude')
    return os.path.join(inc_dir, 'pyconfig.h')


def get_scheme_names():
    """Return a tuple containing the schemes names."""
    return tuple(sorted(_SCHEMES.sections()))


def get_path_names():
    """Return a tuple containing the paths names."""
    # xxx see if we want a static list
    return _SCHEMES.options('posix_prefix')


def get_paths(scheme=_get_default_scheme(), vars=None, expand=True):
    """Return a mapping containing an install scheme.

    ``scheme`` is the install scheme name. If not provided, it will
    return the default scheme for the current platform.
    """
    _ensure_cfg_read()
    if expand:
        return _expand_vars(scheme, vars)
    else:
        return dict(_SCHEMES.items(scheme))


def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True):
    """Return a path corresponding to the scheme.

    ``scheme`` is the install scheme name.
    """
    return get_paths(scheme, vars, expand)[name]


def get_config_vars(*args):
    """With no arguments, return a dictionary of all configuration
    variables relevant for the current platform.

    On Unix, this means every variable defined in Python's installed Makefile;
    On Windows and Mac OS it's a much smaller set.

    With arguments, return a list of values that result from looking up
    each argument in the configuration variable dictionary.
    """
    global _CONFIG_VARS
    if _CONFIG_VARS is None:
        _CONFIG_VARS = {}
        # Normalized versions of prefix and exec_prefix are handy to have;
        # in fact, these are the standard versions used most places in the
        # distutils2 module.
        _CONFIG_VARS['prefix'] = _PREFIX
        _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX
        _CONFIG_VARS['py_version'] = _PY_VERSION
        _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT
        _CONFIG_VARS['py_version_nodot'] = _PY_VERSION[0] + _PY_VERSION[2]
        _CONFIG_VARS['base'] = _PREFIX
        _CONFIG_VARS['platbase'] = _EXEC_PREFIX
        _CONFIG_VARS['projectbase'] = _PROJECT_BASE
        try:
            _CONFIG_VARS['abiflags'] = sys.abiflags
        except AttributeError:
            # sys.abiflags may not be defined on all platforms.
            _CONFIG_VARS['abiflags'] = ''

        if os.name in ('nt', 'os2'):
            _init_non_posix(_CONFIG_VARS)
        if os.name == 'posix':
            _init_posix(_CONFIG_VARS)
        # Setting 'userbase' is done below the call to the
        # init function to enable using 'get_config_var' in
        # the init-function.
        if sys.version >= '2.6':
            _CONFIG_VARS['userbase'] = _getuserbase()

        if 'srcdir' not in _CONFIG_VARS:
            _CONFIG_VARS['srcdir'] = _PROJECT_BASE
        else:
            _CONFIG_VARS['srcdir'] = _safe_realpath(_CONFIG_VARS['srcdir'])

        # Convert srcdir into an absolute path if it appears necessary.
        # Normally it is relative to the build directory.  However, during
        # testing, for example, we might be running a non-installed python
        # from a different directory.
        if _PYTHON_BUILD and os.name == "posix":
            base = _PROJECT_BASE
            try:
                cwd = os.getcwd()
            except OSError:
                cwd = None
            if (not os.path.isabs(_CONFIG_VARS['srcdir']) and
                base != cwd):
                # srcdir is relative and we are not in the same directory
                # as the executable. Assume executable is in the build
                # directory and make srcdir absolute.
                srcdir = os.path.join(base, _CONFIG_VARS['srcdir'])
                _CONFIG_VARS['srcdir'] = os.path.normpath(srcdir)

        if sys.platform == 'darwin':
            kernel_version = os.uname()[2]  # Kernel version (8.4.3)
            major_version = int(kernel_version.split('.')[0])

            if major_version < 8:
                # On Mac OS X before 10.4, check if -arch and -isysroot
                # are in CFLAGS or LDFLAGS and remove them if they are.
                # This is needed when building extensions on a 10.3 system
                # using a universal build of python.
                for key in ('LDFLAGS', 'BASECFLAGS',
                        # a number of derived variables. These need to be
                        # patched up as well.
                        'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
                    flags = _CONFIG_VARS[key]
                    flags = re.sub('-arch\s+\w+\s', ' ', flags)
                    flags = re.sub('-isysroot [^ \t]*', ' ', flags)
                    _CONFIG_VARS[key] = flags
            else:
                # Allow the user to override the architecture flags using
                # an environment variable.
                # NOTE: This name was introduced by Apple in OSX 10.5 and
                # is used by several scripting languages distributed with
                # that OS release.
                if 'ARCHFLAGS' in os.environ:
                    arch = os.environ['ARCHFLAGS']
                    for key in ('LDFLAGS', 'BASECFLAGS',
                        # a number of derived variables. These need to be
                        # patched up as well.
                        'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):

                        flags = _CONFIG_VARS[key]
                        flags = re.sub('-arch\s+\w+\s', ' ', flags)
                        flags = flags + ' ' + arch
                        _CONFIG_VARS[key] = flags

                # If we're on OSX 10.5 or later and the user tries to
                # compiles an extension using an SDK that is not present
                # on the current machine it is better to not use an SDK
                # than to fail.
                #
                # The major usecase for this is users using a Python.org
                # binary installer  on OSX 10.6: that installer uses
                # the 10.4u SDK, but that SDK is not installed by default
                # when you install Xcode.
                #
                CFLAGS = _CONFIG_VARS.get('CFLAGS', '')
                m = re.search('-isysroot\s+(\S+)', CFLAGS)
                if m is not None:
                    sdk = m.group(1)
                    if not os.path.exists(sdk):
                        for key in ('LDFLAGS', 'BASECFLAGS',
                             # a number of derived variables. These need to be
                             # patched up as well.
                            'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):

                            flags = _CONFIG_VARS[key]
                            flags = re.sub('-isysroot\s+\S+(\s|$)', ' ', flags)
                            _CONFIG_VARS[key] = flags

    if args:
        vals = []
        for name in args:
            vals.append(_CONFIG_VARS.get(name))
        return vals
    else:
        return _CONFIG_VARS


def get_config_var(name):
    """Return the value of a single variable using the dictionary returned by
    'get_config_vars()'.

    Equivalent to get_config_vars().get(name)
    """
    return get_config_vars().get(name)


def get_platform():
    """Return a string that identifies the current platform.

    This is used mainly to distinguish platform-specific build directories and
    platform-specific built distributions.  Typically includes the OS name
    and version and the architecture (as supplied by 'os.uname()'),
    although the exact information included depends on the OS; eg. for IRIX
    the architecture isn't particularly important (IRIX only runs on SGI
    hardware), but for Linux the kernel version isn't particularly
    important.

    Examples of returned values:
       linux-i586
       linux-alpha (?)
       solaris-2.6-sun4u
       irix-5.3
       irix64-6.2

    Windows will return one of:
       win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc)
       win-ia64 (64bit Windows on Itanium)
       win32 (all others - specifically, sys.platform is returned)

    For other non-POSIX platforms, currently just returns 'sys.platform'.
    """
    if os.name == 'nt':
        # sniff sys.version for architecture.
        prefix = " bit ("
        i = sys.version.find(prefix)
        if i == -1:
            return sys.platform
        j = sys.version.find(")", i)
        look = sys.version[i+len(prefix):j].lower()
        if look == 'amd64':
            return 'win-amd64'
        if look == 'itanium':
            return 'win-ia64'
        return sys.platform

    if os.name != "posix" or not hasattr(os, 'uname'):
        # XXX what about the architecture? NT is Intel or Alpha,
        # Mac OS is M68k or PPC, etc.
        return sys.platform

    # Try to distinguish various flavours of Unix
    osname, host, release, version, machine = os.uname()

    # Convert the OS name to lowercase, remove '/' characters
    # (to accommodate BSD/OS), and translate spaces (for "Power Macintosh")
    osname = osname.lower().replace('/', '')
    machine = machine.replace(' ', '_')
    machine = machine.replace('/', '-')

    if osname[:5] == "linux":
        # At least on Linux/Intel, 'machine' is the processor --
        # i386, etc.
        # XXX what about Alpha, SPARC, etc?
        return  "%s-%s" % (osname, machine)
    elif osname[:5] == "sunos":
        if release[0] >= "5":           # SunOS 5 == Solaris 2
            osname = "solaris"
            release = "%d.%s" % (int(release[0]) - 3, release[2:])
        # fall through to standard osname-release-machine representation
    elif osname[:4] == "irix":              # could be "irix64"!
        return "%s-%s" % (osname, release)
    elif osname[:3] == "aix":
        return "%s-%s.%s" % (osname, version, release)
    elif osname[:6] == "cygwin":
        osname = "cygwin"
        rel_re = re.compile(r'[\d.]+')
        m = rel_re.match(release)
        if m:
            release = m.group()
    elif osname[:6] == "darwin":
        #
        # For our purposes, we'll assume that the system version from
        # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set
        # to. This makes the compatibility story a bit more sane because the
        # machine is going to compile and link as if it were
        # MACOSX_DEPLOYMENT_TARGET.
        cfgvars = get_config_vars()
        macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET')

        if True:
            # Always calculate the release of the running machine,
            # needed to determine if we can build fat binaries or not.

            macrelease = macver
            # Get the system version. Reading this plist is a documented
            # way to get the system version (see the documentation for
            # the Gestalt Manager)
            try:
                f = open('/System/Library/CoreServices/SystemVersion.plist')
            except IOError:
                # We're on a plain darwin box, fall back to the default
                # behaviour.
                pass
            else:
                try:
                    m = re.search(r'<key>ProductUserVisibleVersion</key>\s*'
                                  r'<string>(.*?)</string>', f.read())
                finally:
                    f.close()
                if m is not None:
                    macrelease = '.'.join(m.group(1).split('.')[:2])
                # else: fall back to the default behaviour

        if not macver:
            macver = macrelease

        if macver:
            release = macver
            osname = "macosx"

            if ((macrelease + '.') >= '10.4.' and
                '-arch' in get_config_vars().get('CFLAGS', '').strip()):
                # The universal build will build fat binaries, but not on
                # systems before 10.4
                #
                # Try to detect 4-way universal builds, those have machine-type
                # 'universal' instead of 'fat'.

                machine = 'fat'
                cflags = get_config_vars().get('CFLAGS')

                archs = re.findall('-arch\s+(\S+)', cflags)
                archs = tuple(sorted(set(archs)))

                if len(archs) == 1:
                    machine = archs[0]
                elif archs == ('i386', 'ppc'):
                    machine = 'fat'
                elif archs == ('i386', 'x86_64'):
                    machine = 'intel'
                elif archs == ('i386', 'ppc', 'x86_64'):
                    machine = 'fat3'
                elif archs == ('ppc64', 'x86_64'):
                    machine = 'fat64'
                elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'):
                    machine = 'universal'
                else:
                    raise ValueError(
                       "Don't know machine value for archs=%r" % (archs,))

            elif machine == 'i386':
                # On OSX the machine type returned by uname is always the
                # 32-bit variant, even if the executable architecture is
                # the 64-bit variant
                if sys.maxsize >= 2**32:
                    machine = 'x86_64'

            elif machine in ('PowerPC', 'Power_Macintosh'):
                # Pick a sane name for the PPC architecture.
                # See 'i386' case
                if sys.maxsize >= 2**32:
                    machine = 'ppc64'
                else:
                    machine = 'ppc'

    return "%s-%s-%s" % (osname, release, machine)


def get_python_version():
    return _PY_VERSION_SHORT


def _print_dict(title, data):
    for index, (key, value) in enumerate(sorted(data.items())):
        if index == 0:
            print('%s: ' % (title))
        print('\t%s = "%s"' % (key, value))


def _main():
    """Display all information sysconfig detains."""
    print('Platform: "%s"' % get_platform())
    print('Python version: "%s"' % get_python_version())
    print('Current installation scheme: "%s"' % _get_default_scheme())
    print()
    _print_dict('Paths', get_paths())
    print()
    _print_dict('Variables', get_config_vars())


if __name__ == '__main__':
    _main()
site-packages/pip/_vendor/distlib/_backport/misc.py000064400000001713151733463560016432 0ustar00# -*- coding: utf-8 -*-
#
# Copyright (C) 2012 The Python Software Foundation.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
"""Backports for individual classes and functions."""

import os
import sys

__all__ = ['cache_from_source', 'callable', 'fsencode']


try:
    from imp import cache_from_source
except ImportError:
    def cache_from_source(py_file, debug=__debug__):
        ext = debug and 'c' or 'o'
        return py_file + ext


try:
    callable = callable
except NameError:
    from collections import Callable

    def callable(obj):
        return isinstance(obj, Callable)


try:
    fsencode = os.fsencode
except AttributeError:
    def fsencode(filename):
        if isinstance(filename, bytes):
            return filename
        elif isinstance(filename, str):
            return filename.encode(sys.getfilesystemencoding())
        else:
            raise TypeError("expect bytes or str, not %s" %
                            type(filename).__name__)
site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg000064400000005071151733463560017613 0ustar00[posix_prefix]
# Configuration directories.  Some of these come straight out of the
# configure script.  They are for implementing the other variables, not to
# be used directly in [resource_locations].
confdir = /etc
datadir = /usr/share
libdir = /usr/lib
statedir = /var
# User resource directory
local = ~/.local/{distribution.name}

stdlib = {base}/lib/python{py_version_short}
platstdlib = {platbase}/lib/python{py_version_short}
purelib = {base}/lib/python{py_version_short}/site-packages
platlib = {platbase}/lib/python{py_version_short}/site-packages
include = {base}/include/python{py_version_short}{abiflags}
platinclude = {platbase}/include/python{py_version_short}{abiflags}
data = {base}

[posix_home]
stdlib = {base}/lib/python
platstdlib = {base}/lib/python
purelib = {base}/lib/python
platlib = {base}/lib/python
include = {base}/include/python
platinclude = {base}/include/python
scripts = {base}/bin
data = {base}

[nt]
stdlib = {base}/Lib
platstdlib = {base}/Lib
purelib = {base}/Lib/site-packages
platlib = {base}/Lib/site-packages
include = {base}/Include
platinclude = {base}/Include
scripts = {base}/Scripts
data = {base}

[os2]
stdlib = {base}/Lib
platstdlib = {base}/Lib
purelib = {base}/Lib/site-packages
platlib = {base}/Lib/site-packages
include = {base}/Include
platinclude = {base}/Include
scripts = {base}/Scripts
data = {base}

[os2_home]
stdlib = {userbase}/lib/python{py_version_short}
platstdlib = {userbase}/lib/python{py_version_short}
purelib = {userbase}/lib/python{py_version_short}/site-packages
platlib = {userbase}/lib/python{py_version_short}/site-packages
include = {userbase}/include/python{py_version_short}
scripts = {userbase}/bin
data = {userbase}

[nt_user]
stdlib = {userbase}/Python{py_version_nodot}
platstdlib = {userbase}/Python{py_version_nodot}
purelib = {userbase}/Python{py_version_nodot}/site-packages
platlib = {userbase}/Python{py_version_nodot}/site-packages
include = {userbase}/Python{py_version_nodot}/Include
scripts = {userbase}/Scripts
data = {userbase}

[posix_user]
stdlib = {userbase}/lib/python{py_version_short}
platstdlib = {userbase}/lib/python{py_version_short}
purelib = {userbase}/lib/python{py_version_short}/site-packages
platlib = {userbase}/lib/python{py_version_short}/site-packages
include = {userbase}/include/python{py_version_short}
scripts = {userbase}/bin
data = {userbase}

[osx_framework_user]
stdlib = {userbase}/lib/python
platstdlib = {userbase}/lib/python
purelib = {userbase}/lib/python/site-packages
platlib = {userbase}/lib/python/site-packages
include = {userbase}/include
scripts = {userbase}/bin
data = {userbase}
site-packages/pip/_vendor/distlib/manifest.py000064400000032271151733463560015344 0ustar00# -*- coding: utf-8 -*-
#
# Copyright (C) 2012-2013 Python Software Foundation.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
"""
Class representing the list of files in a distribution.

Equivalent to distutils.filelist, but fixes some problems.
"""
import fnmatch
import logging
import os
import re

from . import DistlibException
from .compat import fsdecode
from .util import convert_path


__all__ = ['Manifest']

logger = logging.getLogger(__name__)

# a \ followed by some spaces + EOL
_COLLAPSE_PATTERN = re.compile('\\\w*\n', re.M)
_COMMENTED_LINE = re.compile('#.*?(?=\n)|\n(?=$)', re.M | re.S)


class Manifest(object):
    """A list of files built by on exploring the filesystem and filtered by
    applying various patterns to what we find there.
    """

    def __init__(self, base=None):
        """
        Initialise an instance.

        :param base: The base directory to explore under.
        """
        self.base = os.path.abspath(os.path.normpath(base or os.getcwd()))
        self.prefix = self.base + os.sep
        self.allfiles = None
        self.files = set()

    #
    # Public API
    #

    def findall(self):
        """Find all files under the base and set ``allfiles`` to the absolute
        pathnames of files found.
        """
        from stat import S_ISREG, S_ISDIR, S_ISLNK

        self.allfiles = allfiles = []
        root = self.base
        stack = [root]
        pop = stack.pop
        push = stack.append

        while stack:
            root = pop()
            names = os.listdir(root)

            for name in names:
                fullname = os.path.join(root, name)

                # Avoid excess stat calls -- just one will do, thank you!
                stat = os.stat(fullname)
                mode = stat.st_mode
                if S_ISREG(mode):
                    allfiles.append(fsdecode(fullname))
                elif S_ISDIR(mode) and not S_ISLNK(mode):
                    push(fullname)

    def add(self, item):
        """
        Add a file to the manifest.

        :param item: The pathname to add. This can be relative to the base.
        """
        if not item.startswith(self.prefix):
            item = os.path.join(self.base, item)
        self.files.add(os.path.normpath(item))

    def add_many(self, items):
        """
        Add a list of files to the manifest.

        :param items: The pathnames to add. These can be relative to the base.
        """
        for item in items:
            self.add(item)

    def sorted(self, wantdirs=False):
        """
        Return sorted files in directory order
        """

        def add_dir(dirs, d):
            dirs.add(d)
            logger.debug('add_dir added %s', d)
            if d != self.base:
                parent, _ = os.path.split(d)
                assert parent not in ('', '/')
                add_dir(dirs, parent)

        result = set(self.files)    # make a copy!
        if wantdirs:
            dirs = set()
            for f in result:
                add_dir(dirs, os.path.dirname(f))
            result |= dirs
        return [os.path.join(*path_tuple) for path_tuple in
                sorted(os.path.split(path) for path in result)]

    def clear(self):
        """Clear all collected files."""
        self.files = set()
        self.allfiles = []

    def process_directive(self, directive):
        """
        Process a directive which either adds some files from ``allfiles`` to
        ``files``, or removes some files from ``files``.

        :param directive: The directive to process. This should be in a format
                     compatible with distutils ``MANIFEST.in`` files:

                     http://docs.python.org/distutils/sourcedist.html#commands
        """
        # Parse the line: split it up, make sure the right number of words
        # is there, and return the relevant words.  'action' is always
        # defined: it's the first word of the line.  Which of the other
        # three are defined depends on the action; it'll be either
        # patterns, (dir and patterns), or (dirpattern).
        action, patterns, thedir, dirpattern = self._parse_directive(directive)

        # OK, now we know that the action is valid and we have the
        # right number of words on the line for that action -- so we
        # can proceed with minimal error-checking.
        if action == 'include':
            for pattern in patterns:
                if not self._include_pattern(pattern, anchor=True):
                    logger.warning('no files found matching %r', pattern)

        elif action == 'exclude':
            for pattern in patterns:
                if not self._exclude_pattern(pattern, anchor=True):
                    logger.warning('no previously-included files '
                                   'found matching %r', pattern)

        elif action == 'global-include':
            for pattern in patterns:
                if not self._include_pattern(pattern, anchor=False):
                    logger.warning('no files found matching %r '
                                   'anywhere in distribution', pattern)

        elif action == 'global-exclude':
            for pattern in patterns:
                if not self._exclude_pattern(pattern, anchor=False):
                    logger.warning('no previously-included files '
                                   'matching %r found anywhere in '
                                   'distribution', pattern)

        elif action == 'recursive-include':
            for pattern in patterns:
                if not self._include_pattern(pattern, prefix=thedir):
                    logger.warning('no files found matching %r '
                                   'under directory %r', pattern, thedir)

        elif action == 'recursive-exclude':
            for pattern in patterns:
                if not self._exclude_pattern(pattern, prefix=thedir):
                    logger.warning('no previously-included files '
                                   'matching %r found under directory %r',
                                   pattern, thedir)

        elif action == 'graft':
            if not self._include_pattern(None, prefix=dirpattern):
                logger.warning('no directories found matching %r',
                               dirpattern)

        elif action == 'prune':
            if not self._exclude_pattern(None, prefix=dirpattern):
                logger.warning('no previously-included directories found '
                               'matching %r', dirpattern)
        else:   # pragma: no cover
            # This should never happen, as it should be caught in
            # _parse_template_line
            raise DistlibException(
                'invalid action %r' % action)

    #
    # Private API
    #

    def _parse_directive(self, directive):
        """
        Validate a directive.
        :param directive: The directive to validate.
        :return: A tuple of action, patterns, thedir, dir_patterns
        """
        words = directive.split()
        if len(words) == 1 and words[0] not in ('include', 'exclude',
                                                'global-include',
                                                'global-exclude',
                                                'recursive-include',
                                                'recursive-exclude',
                                                'graft', 'prune'):
            # no action given, let's use the default 'include'
            words.insert(0, 'include')

        action = words[0]
        patterns = thedir = dir_pattern = None

        if action in ('include', 'exclude',
                      'global-include', 'global-exclude'):
            if len(words) < 2:
                raise DistlibException(
                    '%r expects <pattern1> <pattern2> ...' % action)

            patterns = [convert_path(word) for word in words[1:]]

        elif action in ('recursive-include', 'recursive-exclude'):
            if len(words) < 3:
                raise DistlibException(
                    '%r expects <dir> <pattern1> <pattern2> ...' % action)

            thedir = convert_path(words[1])
            patterns = [convert_path(word) for word in words[2:]]

        elif action in ('graft', 'prune'):
            if len(words) != 2:
                raise DistlibException(
                    '%r expects a single <dir_pattern>' % action)

            dir_pattern = convert_path(words[1])

        else:
            raise DistlibException('unknown action %r' % action)

        return action, patterns, thedir, dir_pattern

    def _include_pattern(self, pattern, anchor=True, prefix=None,
                         is_regex=False):
        """Select strings (presumably filenames) from 'self.files' that
        match 'pattern', a Unix-style wildcard (glob) pattern.

        Patterns are not quite the same as implemented by the 'fnmatch'
        module: '*' and '?'  match non-special characters, where "special"
        is platform-dependent: slash on Unix; colon, slash, and backslash on
        DOS/Windows; and colon on Mac OS.

        If 'anchor' is true (the default), then the pattern match is more
        stringent: "*.py" will match "foo.py" but not "foo/bar.py".  If
        'anchor' is false, both of these will match.

        If 'prefix' is supplied, then only filenames starting with 'prefix'
        (itself a pattern) and ending with 'pattern', with anything in between
        them, will match.  'anchor' is ignored in this case.

        If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and
        'pattern' is assumed to be either a string containing a regex or a
        regex object -- no translation is done, the regex is just compiled
        and used as-is.

        Selected strings will be added to self.files.

        Return True if files are found.
        """
        # XXX docstring lying about what the special chars are?
        found = False
        pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex)

        # delayed loading of allfiles list
        if self.allfiles is None:
            self.findall()

        for name in self.allfiles:
            if pattern_re.search(name):
                self.files.add(name)
                found = True
        return found

    def _exclude_pattern(self, pattern, anchor=True, prefix=None,
                         is_regex=False):
        """Remove strings (presumably filenames) from 'files' that match
        'pattern'.

        Other parameters are the same as for 'include_pattern()', above.
        The list 'self.files' is modified in place. Return True if files are
        found.

        This API is public to allow e.g. exclusion of SCM subdirs, e.g. when
        packaging source distributions
        """
        found = False
        pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex)
        for f in list(self.files):
            if pattern_re.search(f):
                self.files.remove(f)
                found = True
        return found

    def _translate_pattern(self, pattern, anchor=True, prefix=None,
                           is_regex=False):
        """Translate a shell-like wildcard pattern to a compiled regular
        expression.

        Return the compiled regex.  If 'is_regex' true,
        then 'pattern' is directly compiled to a regex (if it's a string)
        or just returned as-is (assumes it's a regex object).
        """
        if is_regex:
            if isinstance(pattern, str):
                return re.compile(pattern)
            else:
                return pattern

        if pattern:
            pattern_re = self._glob_to_re(pattern)
        else:
            pattern_re = ''

        base = re.escape(os.path.join(self.base, ''))
        if prefix is not None:
            # ditch end of pattern character
            empty_pattern = self._glob_to_re('')
            prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)]
            sep = os.sep
            if os.sep == '\\':
                sep = r'\\'
            pattern_re = '^' + base + sep.join((prefix_re,
                                                '.*' + pattern_re))
        else:                               # no prefix -- respect anchor flag
            if anchor:
                pattern_re = '^' + base + pattern_re

        return re.compile(pattern_re)

    def _glob_to_re(self, pattern):
        """Translate a shell-like glob pattern to a regular expression.

        Return a string containing the regex.  Differs from
        'fnmatch.translate()' in that '*' does not match "special characters"
        (which are platform-specific).
        """
        pattern_re = fnmatch.translate(pattern)

        # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which
        # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix,
        # and by extension they shouldn't match such "special characters" under
        # any OS.  So change all non-escaped dots in the RE to match any
        # character except the special characters (currently: just os.sep).
        sep = os.sep
        if os.sep == '\\':
            # we're using a regex to manipulate a regex, so we need
            # to escape the backslash twice
            sep = r'\\\\'
        escaped = r'\1[^%s]' % sep
        pattern_re = re.sub(r'((?<!\\)(\\\\)*)\.', escaped, pattern_re)
        return pattern_re
site-packages/pip/_vendor/distlib/util.py000064400000144036151733463560014516 0ustar00#
# Copyright (C) 2012-2013 The Python Software Foundation.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
import codecs
from collections import deque
import contextlib
import csv
from glob import iglob as std_iglob
import io
import json
import logging
import os
import py_compile
import re
import shutil
import socket
import ssl
import subprocess
import sys
import tarfile
import tempfile
try:
    import threading
except ImportError:
    import dummy_threading as threading
import time

from . import DistlibException
from .compat import (string_types, text_type, shutil, raw_input, StringIO,
                     cache_from_source, urlopen, httplib, xmlrpclib, splittype,
                     HTTPHandler, HTTPSHandler as BaseHTTPSHandler,
                     BaseConfigurator, valid_ident, Container, configparser,
                     URLError, match_hostname, CertificateError, ZipFile)

logger = logging.getLogger(__name__)

#
# Requirement parsing code for name + optional constraints + optional extras
#
# e.g. 'foo >= 1.2, < 2.0 [bar, baz]'
#
# The regex can seem a bit hairy, so we build it up out of smaller pieces
# which are manageable.
#

COMMA = r'\s*,\s*'
COMMA_RE = re.compile(COMMA)

IDENT = r'(\w|[.-])+'
EXTRA_IDENT = r'(\*|:(\*|\w+):|' + IDENT + ')'
VERSPEC = IDENT + r'\*?'

RELOP = '([<>=!~]=)|[<>]'

#
# The first relop is optional - if absent, will be taken as '~='
#
BARE_CONSTRAINTS = ('(' + RELOP + r')?\s*(' + VERSPEC + ')(' + COMMA + '(' +
                    RELOP + r')\s*(' + VERSPEC + '))*')

DIRECT_REF = '(from\s+(?P<diref>.*))'

#
# Either the bare constraints or the bare constraints in parentheses
#
CONSTRAINTS = (r'\(\s*(?P<c1>' + BARE_CONSTRAINTS + '|' + DIRECT_REF +
               r')\s*\)|(?P<c2>' + BARE_CONSTRAINTS + '\s*)')

EXTRA_LIST = EXTRA_IDENT + '(' + COMMA + EXTRA_IDENT + ')*'
EXTRAS = r'\[\s*(?P<ex>' + EXTRA_LIST + r')?\s*\]'
REQUIREMENT = ('(?P<dn>'  + IDENT + r')\s*(' + EXTRAS + r'\s*)?(\s*' +
               CONSTRAINTS + ')?$')
REQUIREMENT_RE = re.compile(REQUIREMENT)

#
# Used to scan through the constraints
#
RELOP_IDENT = '(?P<op>' + RELOP + r')\s*(?P<vn>' + VERSPEC + ')'
RELOP_IDENT_RE = re.compile(RELOP_IDENT)

def parse_requirement(s):

    def get_constraint(m):
        d = m.groupdict()
        return d['op'], d['vn']

    result = None
    m = REQUIREMENT_RE.match(s)
    if m:
        d = m.groupdict()
        name = d['dn']
        cons = d['c1'] or d['c2']
        if not d['diref']:
            url = None
        else:
            # direct reference
            cons = None
            url = d['diref'].strip()
        if not cons:
            cons = None
            constr = ''
            rs = d['dn']
        else:
            if cons[0] not in '<>!=':
                cons = '~=' + cons
            iterator = RELOP_IDENT_RE.finditer(cons)
            cons = [get_constraint(m) for m in iterator]
            rs = '%s (%s)' % (name, ', '.join(['%s %s' % con for con in cons]))
        if not d['ex']:
            extras = None
        else:
            extras = COMMA_RE.split(d['ex'])
        result = Container(name=name, constraints=cons, extras=extras,
                           requirement=rs, source=s, url=url)
    return result


def get_resources_dests(resources_root, rules):
    """Find destinations for resources files"""

    def get_rel_path(base, path):
        # normalizes and returns a lstripped-/-separated path
        base = base.replace(os.path.sep, '/')
        path = path.replace(os.path.sep, '/')
        assert path.startswith(base)
        return path[len(base):].lstrip('/')


    destinations = {}
    for base, suffix, dest in rules:
        prefix = os.path.join(resources_root, base)
        for abs_base in iglob(prefix):
            abs_glob = os.path.join(abs_base, suffix)
            for abs_path in iglob(abs_glob):
                resource_file = get_rel_path(resources_root, abs_path)
                if dest is None:  # remove the entry if it was here
                    destinations.pop(resource_file, None)
                else:
                    rel_path = get_rel_path(abs_base, abs_path)
                    rel_dest = dest.replace(os.path.sep, '/').rstrip('/')
                    destinations[resource_file] = rel_dest + '/' + rel_path
    return destinations


def in_venv():
    if hasattr(sys, 'real_prefix'):
        # virtualenv venvs
        result = True
    else:
        # PEP 405 venvs
        result = sys.prefix != getattr(sys, 'base_prefix', sys.prefix)
    return result


def get_executable():
    if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__'
                                     in os.environ):
        result =  os.environ['__PYVENV_LAUNCHER__']
    else:
        result = sys.executable
    return result


def proceed(prompt, allowed_chars, error_prompt=None, default=None):
    p = prompt
    while True:
        s = raw_input(p)
        p = prompt
        if not s and default:
            s = default
        if s:
            c = s[0].lower()
            if c in allowed_chars:
                break
            if error_prompt:
                p = '%c: %s\n%s' % (c, error_prompt, prompt)
    return c


def extract_by_key(d, keys):
    if isinstance(keys, string_types):
        keys = keys.split()
    result = {}
    for key in keys:
        if key in d:
            result[key] = d[key]
    return result

def read_exports(stream):
    if sys.version_info[0] >= 3:
        # needs to be a text stream
        stream = codecs.getreader('utf-8')(stream)
    # Try to load as JSON, falling back on legacy format
    data = stream.read()
    stream = StringIO(data)
    try:
        data = json.load(stream)
        result = data['exports']
        for group, entries in result.items():
            for k, v in entries.items():
                s = '%s = %s' % (k, v)
                entry = get_export_entry(s)
                assert entry is not None
                entries[k] = entry
        return result
    except Exception:
        stream.seek(0, 0)
    cp = configparser.ConfigParser()
    if hasattr(cp, 'read_file'):
        cp.read_file(stream)
    else:
        cp.readfp(stream)
    result = {}
    for key in cp.sections():
        result[key] = entries = {}
        for name, value in cp.items(key):
            s = '%s = %s' % (name, value)
            entry = get_export_entry(s)
            assert entry is not None
            #entry.dist = self
            entries[name] = entry
    return result


def write_exports(exports, stream):
    if sys.version_info[0] >= 3:
        # needs to be a text stream
        stream = codecs.getwriter('utf-8')(stream)
    cp = configparser.ConfigParser()
    for k, v in exports.items():
        # TODO check k, v for valid values
        cp.add_section(k)
        for entry in v.values():
            if entry.suffix is None:
                s = entry.prefix
            else:
                s = '%s:%s' % (entry.prefix, entry.suffix)
            if entry.flags:
                s = '%s [%s]' % (s, ', '.join(entry.flags))
            cp.set(k, entry.name, s)
    cp.write(stream)


@contextlib.contextmanager
def tempdir():
    td = tempfile.mkdtemp()
    try:
        yield td
    finally:
        shutil.rmtree(td)

@contextlib.contextmanager
def chdir(d):
    cwd = os.getcwd()
    try:
        os.chdir(d)
        yield
    finally:
        os.chdir(cwd)


@contextlib.contextmanager
def socket_timeout(seconds=15):
    cto = socket.getdefaulttimeout()
    try:
        socket.setdefaulttimeout(seconds)
        yield
    finally:
        socket.setdefaulttimeout(cto)


class cached_property(object):
    def __init__(self, func):
        self.func = func
        #for attr in ('__name__', '__module__', '__doc__'):
        #    setattr(self, attr, getattr(func, attr, None))

    def __get__(self, obj, cls=None):
        if obj is None:
            return self
        value = self.func(obj)
        object.__setattr__(obj, self.func.__name__, value)
        #obj.__dict__[self.func.__name__] = value = self.func(obj)
        return value

def convert_path(pathname):
    """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.
    """
    if os.sep == '/':
        return pathname
    if not pathname:
        return pathname
    if pathname[0] == '/':
        raise ValueError("path '%s' cannot be absolute" % pathname)
    if pathname[-1] == '/':
        raise ValueError("path '%s' cannot end with '/'" % pathname)

    paths = pathname.split('/')
    while os.curdir in paths:
        paths.remove(os.curdir)
    if not paths:
        return os.curdir
    return os.path.join(*paths)


class FileOperator(object):
    def __init__(self, dry_run=False):
        self.dry_run = dry_run
        self.ensured = set()
        self._init_record()

    def _init_record(self):
        self.record = False
        self.files_written = set()
        self.dirs_created = set()

    def record_as_written(self, path):
        if self.record:
            self.files_written.add(path)

    def newer(self, source, target):
        """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".
        """
        if not os.path.exists(source):
            raise DistlibException("file '%r' does not exist" %
                                   os.path.abspath(source))
        if not os.path.exists(target):
            return True

        return os.stat(source).st_mtime > os.stat(target).st_mtime

    def copy_file(self, infile, outfile, check=True):
        """Copy a file respecting dry-run and force flags.
        """
        self.ensure_dir(os.path.dirname(outfile))
        logger.info('Copying %s to %s', infile, outfile)
        if not self.dry_run:
            msg = None
            if check:
                if os.path.islink(outfile):
                    msg = '%s is a symlink' % outfile
                elif os.path.exists(outfile) and not os.path.isfile(outfile):
                    msg = '%s is a non-regular file' % outfile
            if msg:
                raise ValueError(msg + ' which would be overwritten')
            shutil.copyfile(infile, outfile)
        self.record_as_written(outfile)

    def copy_stream(self, instream, outfile, encoding=None):
        assert not os.path.isdir(outfile)
        self.ensure_dir(os.path.dirname(outfile))
        logger.info('Copying stream %s to %s', instream, outfile)
        if not self.dry_run:
            if encoding is None:
                outstream = open(outfile, 'wb')
            else:
                outstream = codecs.open(outfile, 'w', encoding=encoding)
            try:
                shutil.copyfileobj(instream, outstream)
            finally:
                outstream.close()
        self.record_as_written(outfile)

    def write_binary_file(self, path, data):
        self.ensure_dir(os.path.dirname(path))
        if not self.dry_run:
            with open(path, 'wb') as f:
                f.write(data)
        self.record_as_written(path)

    def write_text_file(self, path, data, encoding):
        self.ensure_dir(os.path.dirname(path))
        if not self.dry_run:
            with open(path, 'wb') as f:
                f.write(data.encode(encoding))
        self.record_as_written(path)

    def set_mode(self, bits, mask, files):
        if os.name == 'posix':
            # Set the executable bits (owner, group, and world) on
            # all the files specified.
            for f in files:
                if self.dry_run:
                    logger.info("changing mode of %s", f)
                else:
                    mode = (os.stat(f).st_mode | bits) & mask
                    logger.info("changing mode of %s to %o", f, mode)
                    os.chmod(f, mode)

    set_executable_mode = lambda s, f: s.set_mode(0o555, 0o7777, f)

    def ensure_dir(self, path):
        path = os.path.abspath(path)
        if path not in self.ensured and not os.path.exists(path):
            self.ensured.add(path)
            d, f = os.path.split(path)
            self.ensure_dir(d)
            logger.info('Creating %s' % path)
            if not self.dry_run:
                os.mkdir(path)
            if self.record:
                self.dirs_created.add(path)

    def byte_compile(self, path, optimize=False, force=False, prefix=None):
        dpath = cache_from_source(path, not optimize)
        logger.info('Byte-compiling %s to %s', path, dpath)
        if not self.dry_run:
            if force or self.newer(path, dpath):
                if not prefix:
                    diagpath = None
                else:
                    assert path.startswith(prefix)
                    diagpath = path[len(prefix):]
            py_compile.compile(path, dpath, diagpath, True)     # raise error
        self.record_as_written(dpath)
        return dpath

    def ensure_removed(self, path):
        if os.path.exists(path):
            if os.path.isdir(path) and not os.path.islink(path):
                logger.debug('Removing directory tree at %s', path)
                if not self.dry_run:
                    shutil.rmtree(path)
                if self.record:
                    if path in self.dirs_created:
                        self.dirs_created.remove(path)
            else:
                if os.path.islink(path):
                    s = 'link'
                else:
                    s = 'file'
                logger.debug('Removing %s %s', s, path)
                if not self.dry_run:
                    os.remove(path)
                if self.record:
                    if path in self.files_written:
                        self.files_written.remove(path)

    def is_writable(self, path):
        result = False
        while not result:
            if os.path.exists(path):
                result = os.access(path, os.W_OK)
                break
            parent = os.path.dirname(path)
            if parent == path:
                break
            path = parent
        return result

    def commit(self):
        """
        Commit recorded changes, turn off recording, return
        changes.
        """
        assert self.record
        result = self.files_written, self.dirs_created
        self._init_record()
        return result

    def rollback(self):
        if not self.dry_run:
            for f in list(self.files_written):
                if os.path.exists(f):
                    os.remove(f)
            # dirs should all be empty now, except perhaps for
            # __pycache__ subdirs
            # reverse so that subdirs appear before their parents
            dirs = sorted(self.dirs_created, reverse=True)
            for d in dirs:
                flist = os.listdir(d)
                if flist:
                    assert flist == ['__pycache__']
                    sd = os.path.join(d, flist[0])
                    os.rmdir(sd)
                os.rmdir(d)     # should fail if non-empty
        self._init_record()

def resolve(module_name, dotted_path):
    if module_name in sys.modules:
        mod = sys.modules[module_name]
    else:
        mod = __import__(module_name)
    if dotted_path is None:
        result = mod
    else:
        parts = dotted_path.split('.')
        result = getattr(mod, parts.pop(0))
        for p in parts:
            result = getattr(result, p)
    return result


class ExportEntry(object):
    def __init__(self, name, prefix, suffix, flags):
        self.name = name
        self.prefix = prefix
        self.suffix = suffix
        self.flags = flags

    @cached_property
    def value(self):
        return resolve(self.prefix, self.suffix)

    def __repr__(self):
        return '<ExportEntry %s = %s:%s %s>' % (self.name, self.prefix,
                                                self.suffix, self.flags)

    def __eq__(self, other):
        if not isinstance(other, ExportEntry):
            result = False
        else:
            result = (self.name == other.name and
                      self.prefix == other.prefix and
                      self.suffix == other.suffix and
                      self.flags == other.flags)
        return result

    __hash__ = object.__hash__


ENTRY_RE = re.compile(r'''(?P<name>(\w|[-.])+)
                      \s*=\s*(?P<callable>(\w+)([:\.]\w+)*)
                      \s*(\[\s*(?P<flags>\w+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])?
                      ''', re.VERBOSE)


def get_export_entry(specification):
    m = ENTRY_RE.search(specification)
    if not m:
        result = None
        if '[' in specification or ']' in specification:
            raise DistlibException('Invalid specification '
                                   '%r' % specification)
    else:
        d = m.groupdict()
        name = d['name']
        path = d['callable']
        colons = path.count(':')
        if colons == 0:
            prefix, suffix = path, None
        else:
            if colons != 1:
                raise DistlibException('Invalid specification '
                                       '%r' % specification)
            prefix, suffix = path.split(':')
        flags = d['flags']
        if flags is None:
            if '[' in specification or ']' in specification:
                raise DistlibException('Invalid specification '
                                       '%r' % specification)
            flags = []
        else:
            flags = [f.strip() for f in flags.split(',')]
        result = ExportEntry(name, prefix, suffix, flags)
    return result


def get_cache_base(suffix=None):
    """
    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``.
    """
    if suffix is None:
        suffix = '.distlib'
    if os.name == 'nt' and 'LOCALAPPDATA' in os.environ:
        result = os.path.expandvars('$localappdata')
    else:
        # Assume posix, or old Windows
        result = os.path.expanduser('~')
    # we use 'isdir' instead of 'exists', because we want to
    # fail if there's a file with that name
    if os.path.isdir(result):
        usable = os.access(result, os.W_OK)
        if not usable:
            logger.warning('Directory exists but is not writable: %s', result)
    else:
        try:
            os.makedirs(result)
            usable = True
        except OSError:
            logger.warning('Unable to create %s', result, exc_info=True)
            usable = False
    if not usable:
        result = tempfile.mkdtemp()
        logger.warning('Default location unusable, using %s', result)
    return os.path.join(result, suffix)


def path_to_cache_dir(path):
    """
    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.
    """
    d, p = os.path.splitdrive(os.path.abspath(path))
    if d:
        d = d.replace(':', '---')
    p = p.replace(os.sep, '--')
    return d + p + '.cache'


def ensure_slash(s):
    if not s.endswith('/'):
        return s + '/'
    return s


def parse_credentials(netloc):
    username = password = None
    if '@' in netloc:
        prefix, netloc = netloc.split('@', 1)
        if ':' not in prefix:
            username = prefix
        else:
            username, password = prefix.split(':', 1)
    return username, password, netloc


def get_process_umask():
    result = os.umask(0o22)
    os.umask(result)
    return result

def is_string_sequence(seq):
    result = True
    i = None
    for i, s in enumerate(seq):
        if not isinstance(s, string_types):
            result = False
            break
    assert i is not None
    return result

PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-'
                                      '([a-z0-9_.+-]+)', re.I)
PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)')


def split_filename(filename, project_name=None):
    """
    Extract name, version, python version from a filename (no extension)

    Return name, version, pyver or None
    """
    result = None
    pyver = None
    m = PYTHON_VERSION.search(filename)
    if m:
        pyver = m.group(1)
        filename = filename[:m.start()]
    if project_name and len(filename) > len(project_name) + 1:
        m = re.match(re.escape(project_name) + r'\b', filename)
        if m:
            n = m.end()
            result = filename[:n], filename[n + 1:], pyver
    if result is None:
        m = PROJECT_NAME_AND_VERSION.match(filename)
        if m:
            result = m.group(1), m.group(3), pyver
    return result

# Allow spaces in name because of legacy dists like "Twisted Core"
NAME_VERSION_RE = re.compile(r'(?P<name>[\w .-]+)\s*'
                             r'\(\s*(?P<ver>[^\s)]+)\)$')

def parse_name_and_version(p):
    """
    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.
    """
    m = NAME_VERSION_RE.match(p)
    if not m:
        raise DistlibException('Ill-formed name/version string: \'%s\'' % p)
    d = m.groupdict()
    return d['name'].strip().lower(), d['ver']

def get_extras(requested, available):
    result = set()
    requested = set(requested or [])
    available = set(available or [])
    if '*' in requested:
        requested.remove('*')
        result |= available
    for r in requested:
        if r == '-':
            result.add(r)
        elif r.startswith('-'):
            unwanted = r[1:]
            if unwanted not in available:
                logger.warning('undeclared extra: %s' % unwanted)
            if unwanted in result:
                result.remove(unwanted)
        else:
            if r not in available:
                logger.warning('undeclared extra: %s' % r)
            result.add(r)
    return result
#
# Extended metadata functionality
#

def _get_external_data(url):
    result = {}
    try:
        # urlopen might fail if it runs into redirections,
        # because of Python issue #13696. Fixed in locators
        # using a custom redirect handler.
        resp = urlopen(url)
        headers = resp.info()
        if headers.get('Content-Type') != 'application/json':
            logger.debug('Unexpected response for JSON request')
        else:
            reader = codecs.getreader('utf-8')(resp)
            #data = reader.read().decode('utf-8')
            #result = json.loads(data)
            result = json.load(reader)
    except Exception as e:
        logger.exception('Failed to get external data for %s: %s', url, e)
    return result


def get_project_data(name):
    url = ('https://www.red-dove.com/pypi/projects/'
           '%s/%s/project.json' % (name[0].upper(), name))
    result = _get_external_data(url)
    return result

def get_package_data(name, version):
    url = ('https://www.red-dove.com/pypi/projects/'
           '%s/%s/package-%s.json' % (name[0].upper(), name, version))
    return _get_external_data(url)


class Cache(object):
    """
    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.
    """

    def __init__(self, base):
        """
        Initialise an instance.

        :param base: The base directory where the cache should be located.
        """
        # we use 'isdir' instead of 'exists', because we want to
        # fail if there's a file with that name
        if not os.path.isdir(base):
            os.makedirs(base)
        if (os.stat(base).st_mode & 0o77) != 0:
            logger.warning('Directory \'%s\' is not private', base)
        self.base = os.path.abspath(os.path.normpath(base))

    def prefix_to_dir(self, prefix):
        """
        Converts a resource prefix to a directory name in the cache.
        """
        return path_to_cache_dir(prefix)

    def clear(self):
        """
        Clear the cache.
        """
        not_removed = []
        for fn in os.listdir(self.base):
            fn = os.path.join(self.base, fn)
            try:
                if os.path.islink(fn) or os.path.isfile(fn):
                    os.remove(fn)
                elif os.path.isdir(fn):
                    shutil.rmtree(fn)
            except Exception:
                not_removed.append(fn)
        return not_removed


class EventMixin(object):
    """
    A very simple publish/subscribe system.
    """
    def __init__(self):
        self._subscribers = {}

    def add(self, event, subscriber, append=True):
        """
        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.
        """
        subs = self._subscribers
        if event not in subs:
            subs[event] = deque([subscriber])
        else:
            sq = subs[event]
            if append:
                sq.append(subscriber)
            else:
                sq.appendleft(subscriber)

    def remove(self, event, subscriber):
        """
        Remove a subscriber for an event.

        :param event: The name of an event.
        :param subscriber: The subscriber to be removed.
        """
        subs = self._subscribers
        if event not in subs:
            raise ValueError('No subscribers: %r' % event)
        subs[event].remove(subscriber)

    def get_subscribers(self, event):
        """
        Return an iterator for the subscribers for an event.
        :param event: The event to return subscribers for.
        """
        return iter(self._subscribers.get(event, ()))

    def publish(self, event, *args, **kwargs):
        """
        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.
        """
        result = []
        for subscriber in self.get_subscribers(event):
            try:
                value = subscriber(event, *args, **kwargs)
            except Exception:
                logger.exception('Exception during event publication')
                value = None
            result.append(value)
        logger.debug('publish %s: args = %s, kwargs = %s, result = %s',
                     event, args, kwargs, result)
        return result

#
# Simple sequencing
#
class Sequencer(object):
    def __init__(self):
        self._preds = {}
        self._succs = {}
        self._nodes = set()     # nodes with no preds/succs

    def add_node(self, node):
        self._nodes.add(node)

    def remove_node(self, node, edges=False):
        if node in self._nodes:
            self._nodes.remove(node)
        if edges:
            for p in set(self._preds.get(node, ())):
                self.remove(p, node)
            for s in set(self._succs.get(node, ())):
                self.remove(node, s)
            # Remove empties
            for k, v in list(self._preds.items()):
                if not v:
                    del self._preds[k]
            for k, v in list(self._succs.items()):
                if not v:
                    del self._succs[k]

    def add(self, pred, succ):
        assert pred != succ
        self._preds.setdefault(succ, set()).add(pred)
        self._succs.setdefault(pred, set()).add(succ)

    def remove(self, pred, succ):
        assert pred != succ
        try:
            preds = self._preds[succ]
            succs = self._succs[pred]
        except KeyError:
            raise ValueError('%r not a successor of anything' % succ)
        try:
            preds.remove(pred)
            succs.remove(succ)
        except KeyError:
            raise ValueError('%r not a successor of %r' % (succ, pred))

    def is_step(self, step):
        return (step in self._preds or step in self._succs or
                step in self._nodes)

    def get_steps(self, final):
        if not self.is_step(final):
            raise ValueError('Unknown: %r' % final)
        result = []
        todo = []
        seen = set()
        todo.append(final)
        while todo:
            step = todo.pop(0)
            if step in seen:
                # if a step was already seen,
                # move it to the end (so it will appear earlier
                # when reversed on return) ... but not for the
                # final step, as that would be confusing for
                # users
                if step != final:
                    result.remove(step)
                    result.append(step)
            else:
                seen.add(step)
                result.append(step)
                preds = self._preds.get(step, ())
                todo.extend(preds)
        return reversed(result)

    @property
    def strong_connections(self):
        #http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm
        index_counter = [0]
        stack = []
        lowlinks = {}
        index = {}
        result = []

        graph = self._succs

        def strongconnect(node):
            # set the depth index for this node to the smallest unused index
            index[node] = index_counter[0]
            lowlinks[node] = index_counter[0]
            index_counter[0] += 1
            stack.append(node)

            # Consider successors
            try:
                successors = graph[node]
            except Exception:
                successors = []
            for successor in successors:
                if successor not in lowlinks:
                    # Successor has not yet been visited
                    strongconnect(successor)
                    lowlinks[node] = min(lowlinks[node],lowlinks[successor])
                elif successor in stack:
                    # the successor is in the stack and hence in the current
                    # strongly connected component (SCC)
                    lowlinks[node] = min(lowlinks[node],index[successor])

            # If `node` is a root node, pop the stack and generate an SCC
            if lowlinks[node] == index[node]:
                connected_component = []

                while True:
                    successor = stack.pop()
                    connected_component.append(successor)
                    if successor == node: break
                component = tuple(connected_component)
                # storing the result
                result.append(component)

        for node in graph:
            if node not in lowlinks:
                strongconnect(node)

        return result

    @property
    def dot(self):
        result = ['digraph G {']
        for succ in self._preds:
            preds = self._preds[succ]
            for pred in preds:
                result.append('  %s -> %s;' % (pred, succ))
        for node in self._nodes:
            result.append('  %s;' % node)
        result.append('}')
        return '\n'.join(result)

#
# Unarchiving functionality for zip, tar, tgz, tbz, whl
#

ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip',
                      '.tgz', '.tbz', '.whl')

def unarchive(archive_filename, dest_dir, format=None, check=True):

    def check_path(path):
        if not isinstance(path, text_type):
            path = path.decode('utf-8')
        p = os.path.abspath(os.path.join(dest_dir, path))
        if not p.startswith(dest_dir) or p[plen] != os.sep:
            raise ValueError('path outside destination: %r' % p)

    dest_dir = os.path.abspath(dest_dir)
    plen = len(dest_dir)
    archive = None
    if format is None:
        if archive_filename.endswith(('.zip', '.whl')):
            format = 'zip'
        elif archive_filename.endswith(('.tar.gz', '.tgz')):
            format = 'tgz'
            mode = 'r:gz'
        elif archive_filename.endswith(('.tar.bz2', '.tbz')):
            format = 'tbz'
            mode = 'r:bz2'
        elif archive_filename.endswith('.tar'):
            format = 'tar'
            mode = 'r'
        else:
            raise ValueError('Unknown format for %r' % archive_filename)
    try:
        if format == 'zip':
            archive = ZipFile(archive_filename, 'r')
            if check:
                names = archive.namelist()
                for name in names:
                    check_path(name)
        else:
            archive = tarfile.open(archive_filename, mode)
            if check:
                names = archive.getnames()
                for name in names:
                    check_path(name)
        if format != 'zip' and sys.version_info[0] < 3:
            # See Python issue 17153. If the dest path contains Unicode,
            # tarfile extraction fails on Python 2.x if a member path name
            # contains non-ASCII characters - it leads to an implicit
            # bytes -> unicode conversion using ASCII to decode.
            for tarinfo in archive.getmembers():
                if not isinstance(tarinfo.name, text_type):
                    tarinfo.name = tarinfo.name.decode('utf-8')
        archive.extractall(dest_dir)

    finally:
        if archive:
            archive.close()


def zip_dir(directory):
    """zip a directory tree into a BytesIO object"""
    result = io.BytesIO()
    dlen = len(directory)
    with ZipFile(result, "w") as zf:
        for root, dirs, files in os.walk(directory):
            for name in files:
                full = os.path.join(root, name)
                rel = root[dlen:]
                dest = os.path.join(rel, name)
                zf.write(full, dest)
    return result

#
# Simple progress bar
#

UNITS = ('', 'K', 'M', 'G','T','P')


class Progress(object):
    unknown = 'UNKNOWN'

    def __init__(self, minval=0, maxval=100):
        assert maxval is None or maxval >= minval
        self.min = self.cur = minval
        self.max = maxval
        self.started = None
        self.elapsed = 0
        self.done = False

    def update(self, curval):
        assert self.min <= curval
        assert self.max is None or curval <= self.max
        self.cur = curval
        now = time.time()
        if self.started is None:
            self.started = now
        else:
            self.elapsed = now - self.started

    def increment(self, incr):
        assert incr >= 0
        self.update(self.cur + incr)

    def start(self):
        self.update(self.min)
        return self

    def stop(self):
        if self.max is not None:
            self.update(self.max)
        self.done = True

    @property
    def maximum(self):
        return self.unknown if self.max is None else self.max

    @property
    def percentage(self):
        if self.done:
            result = '100 %'
        elif self.max is None:
            result = ' ?? %'
        else:
            v = 100.0 * (self.cur - self.min) / (self.max - self.min)
            result = '%3d %%' % v
        return result

    def format_duration(self, duration):
        if (duration <= 0) and self.max is None or self.cur == self.min:
            result = '??:??:??'
        #elif duration < 1:
        #    result = '--:--:--'
        else:
            result = time.strftime('%H:%M:%S', time.gmtime(duration))
        return result

    @property
    def ETA(self):
        if self.done:
            prefix = 'Done'
            t = self.elapsed
            #import pdb; pdb.set_trace()
        else:
            prefix = 'ETA '
            if self.max is None:
                t = -1
            elif self.elapsed == 0 or (self.cur == self.min):
                t = 0
            else:
                #import pdb; pdb.set_trace()
                t = float(self.max - self.min)
                t /= self.cur - self.min
                t = (t - 1) * self.elapsed
        return '%s: %s' % (prefix, self.format_duration(t))

    @property
    def speed(self):
        if self.elapsed == 0:
            result = 0.0
        else:
            result = (self.cur - self.min) / self.elapsed
        for unit in UNITS:
            if result < 1000:
                break
            result /= 1000.0
        return '%d %sB/s' % (result, unit)

#
# Glob functionality
#

RICH_GLOB = re.compile(r'\{([^}]*)\}')
_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]')
_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$')


def iglob(path_glob):
    """Extended globbing function that supports ** and {opt1,opt2,opt3}."""
    if _CHECK_RECURSIVE_GLOB.search(path_glob):
        msg = """invalid glob %r: recursive glob "**" must be used alone"""
        raise ValueError(msg % path_glob)
    if _CHECK_MISMATCH_SET.search(path_glob):
        msg = """invalid glob %r: mismatching set marker '{' or '}'"""
        raise ValueError(msg % path_glob)
    return _iglob(path_glob)


def _iglob(path_glob):
    rich_path_glob = RICH_GLOB.split(path_glob, 1)
    if len(rich_path_glob) > 1:
        assert len(rich_path_glob) == 3, rich_path_glob
        prefix, set, suffix = rich_path_glob
        for item in set.split(','):
            for path in _iglob(''.join((prefix, item, suffix))):
                yield path
    else:
        if '**' not in path_glob:
            for item in std_iglob(path_glob):
                yield item
        else:
            prefix, radical = path_glob.split('**', 1)
            if prefix == '':
                prefix = '.'
            if radical == '':
                radical = '*'
            else:
                # we support both
                radical = radical.lstrip('/')
                radical = radical.lstrip('\\')
            for path, dir, files in os.walk(prefix):
                path = os.path.normpath(path)
                for fn in _iglob(os.path.join(path, radical)):
                    yield fn



#
# HTTPSConnection which verifies certificates/matches domains
#

class HTTPSConnection(httplib.HTTPSConnection):
    ca_certs = None # set this to the path to the certs file (.pem)
    check_domain = True # only used if ca_certs is not None

    # noinspection PyPropertyAccess
    def connect(self):
        sock = socket.create_connection((self.host, self.port), self.timeout)
        if getattr(self, '_tunnel_host', False):
            self.sock = sock
            self._tunnel()

        if not hasattr(ssl, 'SSLContext'):
            # For 2.x
            if self.ca_certs:
                cert_reqs = ssl.CERT_REQUIRED
            else:
                cert_reqs = ssl.CERT_NONE
            self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file,
                                        cert_reqs=cert_reqs,
                                        ssl_version=ssl.PROTOCOL_SSLv23,
                                        ca_certs=self.ca_certs)
        else:
            context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
            context.options |= ssl.OP_NO_SSLv2
            if self.cert_file:
                context.load_cert_chain(self.cert_file, self.key_file)
            kwargs = {}
            if self.ca_certs:
                context.verify_mode = ssl.CERT_REQUIRED
                context.load_verify_locations(cafile=self.ca_certs)
                if getattr(ssl, 'HAS_SNI', False):
                    kwargs['server_hostname'] = self.host
            self.sock = context.wrap_socket(sock, **kwargs)
        if self.ca_certs and self.check_domain:
            try:
                match_hostname(self.sock.getpeercert(), self.host)
                logger.debug('Host verified: %s', self.host)
            except CertificateError:
                self.sock.shutdown(socket.SHUT_RDWR)
                self.sock.close()
                raise

class HTTPSHandler(BaseHTTPSHandler):
    def __init__(self, ca_certs, check_domain=True):
        BaseHTTPSHandler.__init__(self)
        self.ca_certs = ca_certs
        self.check_domain = check_domain

    def _conn_maker(self, *args, **kwargs):
        """
        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.
        """
        result = HTTPSConnection(*args, **kwargs)
        if self.ca_certs:
            result.ca_certs = self.ca_certs
            result.check_domain = self.check_domain
        return result

    def https_open(self, req):
        try:
            return self.do_open(self._conn_maker, req)
        except URLError as e:
            if 'certificate verify failed' in str(e.reason):
                raise CertificateError('Unable to verify server certificate '
                                       'for %s' % req.host)
            else:
                raise

#
# To prevent against mixing HTTP traffic with HTTPS (examples: A Man-In-The-
# Middle proxy using HTTP listens on port 443, or an index mistakenly serves
# HTML containing a http://xyz link when it should be https://xyz),
# you can use the following handler class, which does not allow HTTP traffic.
#
# It works by inheriting from HTTPHandler - so build_opener won't add a
# handler for HTTP itself.
#
class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler):
    def http_open(self, req):
        raise URLError('Unexpected HTTP request on what should be a secure '
                       'connection: %s' % req)

#
# XML-RPC with timeouts
#

_ver_info = sys.version_info[:2]

if _ver_info == (2, 6):
    class HTTP(httplib.HTTP):
        def __init__(self, host='', port=None, **kwargs):
            if port == 0:   # 0 means use port 0, not the default port
                port = None
            self._setup(self._connection_class(host, port, **kwargs))


    class HTTPS(httplib.HTTPS):
        def __init__(self, host='', port=None, **kwargs):
            if port == 0:   # 0 means use port 0, not the default port
                port = None
            self._setup(self._connection_class(host, port, **kwargs))


class Transport(xmlrpclib.Transport):
    def __init__(self, timeout, use_datetime=0):
        self.timeout = timeout
        xmlrpclib.Transport.__init__(self, use_datetime)

    def make_connection(self, host):
        h, eh, x509 = self.get_host_info(host)
        if _ver_info == (2, 6):
            result = HTTP(h, timeout=self.timeout)
        else:
            if not self._connection or host != self._connection[0]:
                self._extra_headers = eh
                self._connection = host, httplib.HTTPConnection(h)
            result = self._connection[1]
        return result

class SafeTransport(xmlrpclib.SafeTransport):
    def __init__(self, timeout, use_datetime=0):
        self.timeout = timeout
        xmlrpclib.SafeTransport.__init__(self, use_datetime)

    def make_connection(self, host):
        h, eh, kwargs = self.get_host_info(host)
        if not kwargs:
            kwargs = {}
        kwargs['timeout'] = self.timeout
        if _ver_info == (2, 6):
            result = HTTPS(host, None, **kwargs)
        else:
            if not self._connection or host != self._connection[0]:
                self._extra_headers = eh
                self._connection = host, httplib.HTTPSConnection(h, None,
                                                                 **kwargs)
            result = self._connection[1]
        return result


class ServerProxy(xmlrpclib.ServerProxy):
    def __init__(self, uri, **kwargs):
        self.timeout = timeout = kwargs.pop('timeout', None)
        # The above classes only come into play if a timeout
        # is specified
        if timeout is not None:
            scheme, _ = splittype(uri)
            use_datetime = kwargs.get('use_datetime', 0)
            if scheme == 'https':
                tcls = SafeTransport
            else:
                tcls = Transport
            kwargs['transport'] = t = tcls(timeout, use_datetime=use_datetime)
            self.transport = t
        xmlrpclib.ServerProxy.__init__(self, uri, **kwargs)

#
# CSV functionality. This is provided because on 2.x, the csv module can't
# handle Unicode. However, we need to deal with Unicode in e.g. RECORD files.
#

def _csv_open(fn, mode, **kwargs):
    if sys.version_info[0] < 3:
        mode += 'b'
    else:
        kwargs['newline'] = ''
    return open(fn, mode, **kwargs)


class CSVBase(object):
    defaults = {
        'delimiter': str(','),      # The strs are used because we need native
        'quotechar': str('"'),      # str in the csv API (2.x won't take
        'lineterminator': str('\n') # Unicode)
    }

    def __enter__(self):
        return self

    def __exit__(self, *exc_info):
        self.stream.close()


class CSVReader(CSVBase):
    def __init__(self, **kwargs):
        if 'stream' in kwargs:
            stream = kwargs['stream']
            if sys.version_info[0] >= 3:
                # needs to be a text stream
                stream = codecs.getreader('utf-8')(stream)
            self.stream = stream
        else:
            self.stream = _csv_open(kwargs['path'], 'r')
        self.reader = csv.reader(self.stream, **self.defaults)

    def __iter__(self):
        return self

    def next(self):
        result = next(self.reader)
        if sys.version_info[0] < 3:
            for i, item in enumerate(result):
                if not isinstance(item, text_type):
                    result[i] = item.decode('utf-8')
        return result

    __next__ = next

class CSVWriter(CSVBase):
    def __init__(self, fn, **kwargs):
        self.stream = _csv_open(fn, 'w')
        self.writer = csv.writer(self.stream, **self.defaults)

    def writerow(self, row):
        if sys.version_info[0] < 3:
            r = []
            for item in row:
                if isinstance(item, text_type):
                    item = item.encode('utf-8')
                r.append(item)
            row = r
        self.writer.writerow(row)

#
#   Configurator functionality
#

class Configurator(BaseConfigurator):

    value_converters = dict(BaseConfigurator.value_converters)
    value_converters['inc'] = 'inc_convert'

    def __init__(self, config, base=None):
        super(Configurator, self).__init__(config)
        self.base = base or os.getcwd()

    def configure_custom(self, config):
        def convert(o):
            if isinstance(o, (list, tuple)):
                result = type(o)([convert(i) for i in o])
            elif isinstance(o, dict):
                if '()' in o:
                    result = self.configure_custom(o)
                else:
                    result = {}
                    for k in o:
                        result[k] = convert(o[k])
            else:
                result = self.convert(o)
            return result

        c = config.pop('()')
        if not callable(c):
            c = self.resolve(c)
        props = config.pop('.', None)
        # Check for valid identifiers
        args = config.pop('[]', ())
        if args:
            args = tuple([convert(o) for o in args])
        items = [(k, convert(config[k])) for k in config if valid_ident(k)]
        kwargs = dict(items)
        result = c(*args, **kwargs)
        if props:
            for n, v in props.items():
                setattr(result, n, convert(v))
        return result

    def __getitem__(self, key):
        result = self.config[key]
        if isinstance(result, dict) and '()' in result:
            self.config[key] = result = self.configure_custom(result)
        return result

    def inc_convert(self, value):
        """Default converter for the inc:// protocol."""
        if not os.path.isabs(value):
            value = os.path.join(self.base, value)
        with codecs.open(value, 'r', encoding='utf-8') as f:
            result = json.load(f)
        return result

#
# Mixin for running subprocesses and capturing their output
#

class SubprocessMixin(object):
    def __init__(self, verbose=False, progress=None):
        self.verbose = verbose
        self.progress = progress

    def reader(self, stream, context):
        """
        Read lines from a subprocess' output stream and either pass to a progress
        callable (if specified) or write progress information to sys.stderr.
        """
        progress = self.progress
        verbose = self.verbose
        while True:
            s = stream.readline()
            if not s:
                break
            if progress is not None:
                progress(s, context)
            else:
                if not verbose:
                    sys.stderr.write('.')
                else:
                    sys.stderr.write(s.decode('utf-8'))
                sys.stderr.flush()
        stream.close()

    def run_command(self, cmd, **kwargs):
        p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE, **kwargs)
        t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout'))
        t1.start()
        t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr'))
        t2.start()
        p.wait()
        t1.join()
        t2.join()
        if self.progress is not None:
            self.progress('done.', 'main')
        elif self.verbose:
            sys.stderr.write('done.\n')
        return p
site-packages/pip/_vendor/__pycache__/__init__.cpython-33.pyc000064400000000722151733463570020121 0ustar00�
7�Re
c@sdZddlmZdS(u�
pip._vendor is for vendoring dependencies of pip to prevent needing pip to
depend on something external.

Files inside of pip._vendor should be considered immutable and should only be
updated to versions from upstream.
i(uabsolute_importN(u__doc__u
__future__uabsolute_import(((u-/tmp/pip-zej_zi-build/pip/_vendor/__init__.pyu<module>ssite-packages/pip/_vendor/__pycache__/re-vendor.cpython-33.pyc000064400000003005151733463570020260 0ustar00�
7�Rec@s�ddlZddlZddlZddlZddlZejjejje��Z	dd�Z
dd�Zdd�Ze
dkr�eej�d	kr�e
�nejd
dkr�e�q�ejd
dkr�e�q�e
�ndS(iNcCstd�tjd�dS(Nu"Usage: re-vendor.py [clean|vendor]i(uprintusysuexit(((u./tmp/pip-zej_zi-build/pip/_vendor/re-vendor.pyuusage	s
uusagecCsqxNtjt�D]=}tjjt|�}tjj|�rtj|�qqWtjtjjtd��dS(Nusix.py(	uosulistdiruhereupathujoinuisdirushutilurmtreeuunlink(ufnudirname((u./tmp/pip-zej_zi-build/pip/_vendor/re-vendor.pyuclean
s
ucleancCsGtjddtddg�x$tjd�D]}tj|�q,WdS(Nuinstallu-tu-ru
vendor.txtu
*.egg-info(upipumainuhereuglobushutilurmtree(udirname((u./tmp/pip-zej_zi-build/pip/_vendor/re-vendor.pyuvendorsuvendoru__main__ii(uosusysupipuglobushutilupathuabspathudirnameu__file__uhereuusageucleanuvendoru__name__ulenuargv(((u./tmp/pip-zej_zi-build/pip/_vendor/re-vendor.pyu<module>s 


site-packages/pip/_vendor/__pycache__/pkg_resources.cpython-33.pyc000064400000407133151733463570021244 0ustar00�
7�Re��cn@sOdZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlmZyddlmZmZWn(ek
rddlmZmZYnXyeWn"ek
r;ddlmZYnXy$edd�ZddlmZWn:ek
r�eZdd	lmZe e d
d�Z!YnXddlm"Z"y&dd
lm#Z#m$Z$m%Z%e&Z'Wnek
r�e(Z'YnXddlm)Z*ddl+m,Z,m-Z-ej.ddfko8ej/j0dkrMddl1j2Z3ne Z3yddl4Z4Wnek
rwYnXddd�Z5iZ6dd�Z7dd�Z8dd�Z9dd�Z:dd�Z;dd �Z<d!d"�Z=d#d�Z>Z?d$d%�Z@d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjgEZAGdkdA�dAeB�ZCGdldB�dBeC�ZDGdmdC�dCeC�ZEGdndD�dDeC�ZFiZGejHdd�ZIdZJdoZKdpZLdZMdpZNdqdf�ZOdrd(�ZPgdsdt�ZQdudv�ZRdwdx�ZSejTdy�ZUejTdz�ZVeSZWd{dK�ZXd|d'�ZYeYZZd}d)�Z[d~d*�Z\e dd+�Z]d�d,�Z^Gd�dY�dY�Z_Gd�dZ�dZe_�Z`Gd�d<�d<ea�ZbGd�d;�d;ea�ZcecZdGd�dE�dEee�ZfGd�d=�d=�Zgd�d:�Zhd�dH�Zid�dI�Zjd�dN�Zkd�dO�ZlGd�d��d�ea�ZmemjnZoemjpZpGd�d`�d`�ZqeOeaeq�Gd�da�daeq�ZrGd�db�dber�ZseOete �es�e3e k	r|eOe3jues�nGd�d^�d^eq�Zvev�Zwd�d��ZxGd�dc�dcer�ZyeOejzey�Gd�d[�d[ev�Z{Gd�d\�d\es�Z|Gd�d]�d]ey�Z}e7d�d�i�d�dd�Z~e(d�d7�Ze(d�d��Z�e~ejze��e(d�d��Z�e~eae��e(d�d��Z�e~ej�e��e3e k	r�e~e3j�e��ne7d�d�i�e7d�d�i�d�de�Z�d�d��Z�d�d4�Z�e d�dg�Z�d�d��Z�e�ej�e��e�ejze��e3e k	rQe�e3j�e��nd�d��Z�e�eae��d�dS�Z�id�d��Z�d�d��Z�d�dL�Z�ejTd��j�Z�ejTd��j�Z�ejTd��j�Z�ejTd��j�Z�ejTd��j�Z�ejTd��j�Z�ejTd��j�Z�ejTd��j�Z�ejTd�ej�ej�B�j�Z�ejTd�ej��Z�id�d�6d�d�6d�d�6d�d�6d�d�6j�Z�d�d��Z�d�dG�Z�Gd�d@�d@ea�Z�d�d��Z�Gd�d>�d>ea�Z�Gd�d��d�e��Z�ie�d�6e�d�6e�d�6Z�d�d��Z�d�dF�Z�d�d��Z�Gd�d?�d?�Z�id�d�6d�d�6d�d�6d�d�6d�d�6d�d�6Z�d�d��Z�d�d��Z�d�dR�Z�d�dM�Z�d�d��Z�eg�Z�d�d��Z�e�e���ebj��Z�e7d�d5e��e�j�Z�e�j�Z�e�j�Z�e�jYZYeYZZe�d�d��ge�_�e�e�e�j�ej���dS(�uZ
Package resource API
--------------------

A resource is a logical file contained within a package, or a logical
subdirectory thereof.  The package resource API expects resource names
to have their path parts separated with ``/``, *not* whatever the local
path separator is.  Do not use os.path operations to manipulate resource
names being passed into the API.

The package resource API is designed to work with normal filesystem packages,
.egg files, and unpacked .egg files.  It can also work in a limited way with
.zip files and with custom PEP 302 loaders that support the ``get_data()``
method.
iN(uget_importer(uurlparseu
urlunparse(uImmutableSetcCs
|j�S(N(unext(uo((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu<lambda>-su<lambda>(uStringIO(uBytesIOcCsY|dkrt�}n|dkr-|}nttt|�j�|d�||�dS(Nuexec(uNoneuglobalsuexecucompileuopenuread(ufnuglobsulocs((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuexecfile2s
	uexecfile(uutime(umkdirurenameuunlink(uopen(uisdirusplitiucpythoni�cCs^tstd��nt|�\}}|rZ|rZt|�rZt|�t||�ndS(Nu*"os.mkdir" not supported on this platform.(u
WRITE_SUPPORTuIOErrorusplituisdiru_bypass_ensure_directoryumkdir(unameumodeudirnameufilename((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_bypass_ensure_directoryPs
u_bypass_ensure_directorycKs-t�j|�tjtj||��dS(N(uglobalsuupdateu_state_varsudictufromkeys(uvartypeukw((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_declare_state\su_declare_statecCsLi}t�}x6tj�D](\}}|d|||�||<qW|S(Nu_sget_(uglobalsu_state_varsuitems(ustateugukuv((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__getstate__`s
	 u__getstate__cCsJt�}x:|j�D],\}}|dt|||||�qW|S(Nu_sset_(uglobalsuitemsu_state_vars(ustateugukuv((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__setstate__gs	$u__setstate__cCs
|j�S(N(ucopy(uval((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
_sget_dictmsu
_sget_dictcCs|j�|j|�dS(N(uclearuupdate(ukeyuobustate((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
_sset_dictps
u
_sset_dictcCs
|j�S(N(u__getstate__(uval((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_sget_objecttsu_sget_objectcCs|j|�dS(N(u__setstate__(ukeyuobustate((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_sset_objectwsu_sset_objectcGsdS(N(uNone(uargs((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu<lambda>zscCs�t�}tj|�}|dk	r~tjdkr~y3ddjt�dd��|jd�f}Wq~t	k
rzYq~Xn|S(uZReturn this platform's maximum compatible version.

    distutils.util.get_platform() normally reports the minimum version
    of Mac OS X that would be required to *use* extensions produced by
    distutils.  But what we want when checking compatibility is to know the
    version of Mac OS X that we are *running*.  To allow usage of packages that
    explicitly require a newer version of Mac OS X, we must also know the
    current version of the OS.

    If this condition occurs for any other platform with a version in its
    platform strings, this function should be extended accordingly.
    udarwinumacosx-%s-%su.Nii(
uget_build_platformumacosVersionStringumatchuNoneusysuplatformujoinu_macosx_versugroupu
ValueError(uplatum((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_supported_platform}s
	3
uget_supported_platformurequireu
run_scriptuget_provideruget_distributionuload_entry_pointu
get_entry_mapuget_entry_infouiter_entry_pointsuresource_stringuresource_streamuresource_filenameuresource_listdiruresource_existsuresource_isdirudeclare_namespaceuworking_setuadd_activation_listenerufind_distributionsuset_extraction_pathucleanup_resourcesuget_default_cacheuEnvironmentu
WorkingSetuResourceManageruDistributionuRequirementu
EntryPointuResolutionErroruVersionConflictuDistributionNotFounduUnknownExtrauExtractionErroruparse_requirementsu
parse_versionu	safe_nameusafe_versionuget_platformucompatible_platformsuyield_linesusplit_sectionsu
safe_extrauto_filenameuinvalid_markeruevaluate_markeruensure_directoryunormalize_pathuEGG_DISTuBINARY_DISTuSOURCE_DISTu
CHECKOUT_DISTuDEVELOP_DISTuIMetadataProvideruIResourceProvideruFileMetadatauPathMetadatauEggMetadatau
EmptyProvideruempty_provideruNullProvideruEggProvideruDefaultProvideruZipProvideruregister_finderuregister_namespace_handleruregister_loader_typeufixup_namespace_packagesuget_importerurun_mainuAvailableDistributionscBs&|EeZdZdZdd�ZdS(uResolutionErroru.Abstract base for dependency resolution errorscCs|jjt|j�S(N(u	__class__u__name__urepruargs(uself((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__repr__�suResolutionError.__repr__N(u__name__u
__module__u__qualname__u__doc__u__repr__(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuResolutionError�scBs|EeZdZdZdS(uVersionConflictuAAn already-installed version conflicts with the requested versionN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuVersionConflict�scBs|EeZdZdZdS(uDistributionNotFoundu&A requested distribution was not foundN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuDistributionNotFound�scBs|EeZdZdZdS(uUnknownExtrau>Distribution doesn't have an "extra feature" of the given nameN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuUnknownExtra�siicCs|t|<dS(uRegister `provider_factory` to make providers for `loader_type`

    `loader_type` is the type or class of a PEP 302 ``module.__loader__``,
    and `provider_factory` is a function that, passed a *module* object,
    returns an ``IResourceProvider`` for that module.
    N(u_provider_factories(uloader_typeuprovider_factory((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuregister_loader_type�sc
Cs�t|t�r2tj|�p1tt|��dSytj|}Wn)tk
rnt	|�tj|}YnXt
|dd�}tt
|�|�S(u?Return an IResourceProvider for the named module or requirementiu
__loader__N(u
isinstanceuRequirementuworking_setufindurequireustrusysumodulesuKeyErroru
__import__ugetattruNoneu
_find_adapteru_provider_factories(umoduleOrRequmoduleuloader((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_provider�s#

cCs�|s�ddl}|j�d}|dkr�ddl}d}tjj|�r�t|d�r�|j|�}d|kr�|d}q�q�q�n|j|j	d��n|dS(Niuu0/System/Library/CoreServices/SystemVersion.plistu	readPlistuProductVersionu.(
uplatformumac_veruplistlibuosupathuexistsuhasattru	readPlistuappendusplit(u_cacheuplatformuversionuplistlibuplistu
plist_content((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_macosx_vers�su_macosx_verscCsidd6dd6j||�S(NuppcuPowerPCuPower_Macintosh(uget(umachine((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_macosx_arch�su_macosx_archcCs�yddlm}Wn"tk
r8ddlm}YnX|�}tjdkr�|jd�r�yTt�}tj	�dj
dd�}dt|d�t|d	�t|�fSWq�t
k
r�Yq�Xn|S(
u�Return this platform's string for platform-specific distributions

    XXX Currently this is the same as ``distutils.util.get_platform()``, but it
    needs some hacks for Linux and Mac OS X.
    i(uget_platformudarwinumacosx-iu u_umacosx-%d.%d-%si(u	sysconfiguget_platformuImportErrorudistutils.utilusysuplatformu
startswithu_macosx_versuosuunameureplaceuintu_macosx_archu
ValueError(uget_platformuplatuversionumachine((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_build_platform�s
		
uget_build_platformumacosx-(\d+)\.(\d+)-(.*)udarwin-(\d+)\.(\d+)\.(\d+)-(.*)c
CsO|d	ks$|d	ks$||kr(d
Stj|�}|rKtj|�}|s�tj|�}|r�t|jd��}d|jd�|jd�f}|dkr�|dks�|dkr�|dkr�d
SndS|jd�|jd�ks|jd�|jd�krdSt|jd��t|jd��krGdSd
SdS(u�Can code for the `provided` platform run on the `required` platform?

    Returns true if either platform is ``None``, or the platforms are equal.

    XXX Needs compatibility checks for Linux and other unixy OSes.
    iu%s.%siiu10.3iu10.4iNTF(uNoneuTrueumacosVersionStringumatchudarwinVersionStringuintugroupuFalse(uprovidedurequiredureqMacuprovMacu
provDarwinudversionumacosversion((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyucompatible_platformss*$"*cCsNtjd�j}|d}|j�||d<t|�dj||�dS(u@Locate distribution `dist_spec` and run its `script_name` scriptiu__name__iN(usysu	_getframeu	f_globalsuclearurequireu
run_script(u	dist_specuscript_nameunsuname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
run_scriptKs



cCsdt|t�r!tj|�}nt|t�r?t|�}nt|t�s`td|��n|S(u@Return a current distribution object for a Requirement or stringu-Expected string, Requirement, or Distribution(u
isinstanceu
basestringuRequirementuparseuget_provideruDistributionu	TypeError(udist((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_distributionUscCst|�j||�S(uDReturn `name` entry point of `group` for `dist` or raise ImportError(uget_distributionuload_entry_point(udistugroupuname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuload_entry_point]scCst|�j|�S(u=Return the entry point map for `group`, or the full entry map(uget_distributionu
get_entry_map(udistugroup((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
get_entry_mapascCst|�j||�S(u<Return the EntryPoint object for `group`+`name`, or ``None``(uget_distributionuget_entry_info(udistugroupuname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_entry_infoescBs\|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S(uIMetadataProvidercCsdS(u;Does the package's distribution contain the named metadata?N((uname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuhas_metadatalsuIMetadataProvider.has_metadatacCsdS(u'The named metadata resource as a stringN((uname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_metadataosuIMetadataProvider.get_metadatacCsdS(u�Yield named metadata resource as list of non-blank non-comment lines

       Leading and trailing whitespace is stripped from each line, and lines
       with ``#`` as the first non-blank character are omitted.N((uname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_metadata_linesrsu$IMetadataProvider.get_metadata_linescCsdS(u>Is the named metadata a directory?  (like ``os.path.isdir()``)N((uname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyumetadata_isdirxsu IMetadataProvider.metadata_isdircCsdS(u?List of metadata names in the directory (like ``os.listdir()``)N((uname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyumetadata_listdir{su"IMetadataProvider.metadata_listdircCsdS(u=Execute the named script in the supplied namespace dictionaryN((uscript_nameu	namespace((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
run_script~suIMetadataProvider.run_scriptN(	u__name__u
__module__u__qualname__uhas_metadatauget_metadatauget_metadata_linesumetadata_isdirumetadata_listdiru
run_script(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuIMetadataProviderjscBsb|EeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dS(uIResourceProvideru3An object that provides access to package resourcescCsdS(udReturn a true filesystem path for `resource_name`

        `manager` must be an ``IResourceManager``N((umanageru
resource_name((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_resource_filename�su'IResourceProvider.get_resource_filenamecCsdS(uiReturn a readable file-like object for `resource_name`

        `manager` must be an ``IResourceManager``N((umanageru
resource_name((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_resource_stream�su%IResourceProvider.get_resource_streamcCsdS(umReturn a string containing the contents of `resource_name`

        `manager` must be an ``IResourceManager``N((umanageru
resource_name((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_resource_string�su%IResourceProvider.get_resource_stringcCsdS(u,Does the package contain the named resource?N((u
resource_name((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuhas_resource�suIResourceProvider.has_resourcecCsdS(u>Is the named resource a directory?  (like ``os.path.isdir()``)N((u
resource_name((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuresource_isdir�su IResourceProvider.resource_isdircCsdS(u?List of resource names in the directory (like ``os.listdir()``)N((u
resource_name((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuresource_listdir�su"IResourceProvider.resource_listdirN(
u__name__u
__module__u__qualname__u__doc__uget_resource_filenameuget_resource_streamuget_resource_stringuhas_resourceuresource_isdiruresource_listdir(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuIResourceProvider�scBs|EeZdZdZd$dd�Zedd��Zedd��Zdd	�Z	d
d�Z
dd
�Zd$dd�Zdd�Z
dd�Zd$d%d&dd�Zd$d$d&dd�Zd$d$d%dd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$S('u
WorkingSetuDA collection of active distributions on sys.path (or a similar list)cCs^g|_i|_i|_g|_|dkr<tj}nx|D]}|j|�qCWdS(u?Create working set from list of path entries (default=sys.path)N(uentriesu
entry_keysuby_keyu	callbacksuNoneusysupathu	add_entry(uselfuentriesuentry((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__init__�s				
uWorkingSet.__init__cCsm|�}yddlm}Wntk
r5|SYnXy|j|�Wntk
rh|j|�SYnX|S(u1
        Prepare the master working set.
        i(u__requires__(u__main__u__requires__uImportErrorurequireuVersionConflictu_build_from_requirements(uclsuwsu__requires__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
_build_master�s	
	
uWorkingSet._build_mastercCs�|g�}t|�}|j|t��}x|D]}|j|�q4Wx0tjD]%}||jkrU|j|�qUqUW|jtjdd�<|S(uQ
        Build a working set from a requirement spec. Rewrites sys.path.
        N(uparse_requirementsuresolveuEnvironmentuaddusysupathuentriesu	add_entry(uclsureq_specuwsureqsudistsudistuentry((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_build_from_requirements�s
u#WorkingSet._build_from_requirementscCsT|jj|g�|jj|�x*t|d�D]}|j||d�q3WdS(u�Add a path item to ``.entries``, finding any distributions on it

        ``find_distributions(entry, True)`` is used to find distributions
        corresponding to the path entry, and they are added.  `entry` is
        always appended to ``.entries``, even if it is already present.
        (This is because ``sys.path`` can contain the same value more than
        once, and the ``.entries`` of the ``sys.path`` WorkingSet should always
        equal ``sys.path``.)
        NTF(u
entry_keysu
setdefaultuentriesuappendufind_distributionsuTrueuadduFalse(uselfuentryudist((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu	add_entry�s
uWorkingSet.add_entrycCs|jj|j�|kS(u9True if `dist` is the active distribution for its project(uby_keyugetukey(uselfudist((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__contains__�suWorkingSet.__contains__cCsG|jj|j�}|dk	r?||kr?t||��n|SdS(u�Find a distribution matching requirement `req`

        If there is an active distribution for the requested project, this
        returns it as long as it meets the version requirement specified by
        `req`.  But, if there is an active distribution for the project and it
        does *not* meet the `req` requirement, ``VersionConflict`` is raised.
        If there is no active distribution for the requested project, ``None``
        is returned.
        N(uby_keyugetukeyuNoneuVersionConflict(uselfurequdist((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyufind�s
uWorkingSet.findccsgx`|D]X}|j|�}|dkrGx4|j�D]}|Vq5Wq||kr||VqqWdS(uYield entry point objects from `group` matching `name`

        If `name` is None, yields all entry points in `group` from all
        distributions in the working set, otherwise only ones matching
        both `group` and `name` are yielded (in distribution order).
        N(u
get_entry_mapuNoneuvalues(uselfugroupunameudistuentriesuep((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuiter_entry_points�s
uWorkingSet.iter_entry_pointscCsQtjd�j}|d}|j�||d<|j|�dj||�dS(u?Locate distribution for `requires` and run `script_name` scriptiu__name__iN(usysu	_getframeu	f_globalsuclearurequireu
run_script(uselfurequiresuscript_nameunsuname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
run_script
s



uWorkingSet.run_scriptccspi}xc|jD]X}||jkr+qnx:|j|D]+}||kr9d||<|j|Vq9q9WqWdS(u�Yield distributions for non-duplicate projects in the working set

        The yield order is the order in which the items' path entries were
        added to the working set.
        iN(uentriesu
entry_keysuby_key(uselfuseenuitemukey((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__iter__s
uWorkingSet.__iter__cCs�|r|j|j|�n|dkr4|j}n|jj|g�}|jj|jg�}|r~|j|jkr~dS||j|j<|j|kr�|j|j�n|j|kr�|j|j�n|j	|�dS(uAdd `dist` to working set, associated with `entry`

        If `entry` is unspecified, it defaults to the ``.location`` of `dist`.
        On exit from this routine, `entry` is added to the end of the working
        set's ``.entries`` (if it wasn't already present).

        `dist` is only added to the working set if it's for a project that
        doesn't already have a distribution in the set, unless `replace=True`.
        If it's added, any callbacks registered with the ``subscribe()`` method
        will be called.
        N(
u	insert_onuentriesuNoneulocationu
entry_keysu
setdefaultukeyuby_keyuappendu
_added_new(uselfudistuentryuinsertureplaceukeysukeys2((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuadd#suWorkingSet.addcCs�t|�ddd�}i}i}g}xc|r�|jd�}||krUq.n|j|j�}	|	dkr?|jj|j�}	|	dks�|	|kr/|r/|}
|dkr�|	dkr�t|j�}q�tg�}tg�}
n|j	||
|�}	||j<|	dkr/t
|��q/n|j|	�n|	|kr]t|	|��n|j
|	j|j�ddd��d||<q.W|S(ueList all distributions needed to (recursively) meet `requirements`

        `requirements` must be a sequence of ``Requirement`` objects.  `env`,
        if supplied, should be an ``Environment`` instance.  If
        not supplied, it defaults to all distributions available within any
        entry or distribution in the working set.  `installer`, if supplied,
        will be invoked with each requirement that cannot be met by an
        already-installed distribution; it should return a ``Distribution`` or
        ``None``.

        Unless `replace_conflicting=True`, raises a VersionConflict exception if
        any requirements are found on the path that have the correct name but
        the wrong version.  Otherwise, if an `installer` is supplied it will be
        invoked to obtain the correct version of the requirement and activate
        it.
        Niii����i����T(ulistupopugetukeyuNoneuby_keyuEnvironmentuentriesu
WorkingSetu
best_matchuDistributionNotFounduappenduVersionConflictuextendurequiresuextrasuTrue(uselfurequirementsuenvu	installerureplace_conflictingu	processedubestuto_activateurequdistuws((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuresolve@s6	 &uWorkingSet.resolvecCsPt|�}|j�i}i}|dkrJt|j�}||7}n
||}|jg�}	tt|	j|��x�|D]�}
x�||
D]�}|j�g}y|	j	|||�}
Wn9t
k
r�tj�d}|||<|r�w�nPYq�Xtt|	j|
��|j
tj|
��Pq�Wq�Wt|�}|j�||fS(ubFind all activatable distributions in `plugin_env`

        Example usage::

            distributions, errors = working_set.find_plugins(
                Environment(plugin_dirlist)
            )
            map(working_set.add, distributions)  # add plugins+libs to sys.path
            print 'Could not load', errors        # display errors

        The `plugin_env` should be an ``Environment`` instance that contains
        only distributions that are in the project's "plugin directory" or
        directories. The `full_env`, if supplied, should be an ``Environment``
        contains all currently-available distributions.  If `full_env` is not
        supplied, one is created automatically from the ``WorkingSet`` this
        method is called on, which will typically mean that every directory on
        ``sys.path`` will be scanned for distributions.

        `installer` is a standard installer callback as used by the
        ``resolve()`` method. The `fallback` flag indicates whether we should
        attempt to resolve older versions of a plugin if the newest version
        cannot be resolved.

        This method returns a 2-tuple: (`distributions`, `error_info`), where
        `distributions` is a list of the distributions found in `plugin_env`
        that were loadable, along with any other distributions that are needed
        to resolve their dependencies.  `error_info` is a dictionary mapping
        unloadable plugin distributions to an exception instance describing the
        error that occurred. Usually this will be a ``DistributionNotFound`` or
        ``VersionConflict`` instance.
        iN(ulistusortuNoneuEnvironmentuentriesu	__class__umapuadduas_requirementuresolveuResolutionErrorusysuexc_infouupdateudictufromkeys(uselfu
plugin_envufull_envu	installerufallbackuplugin_projectsu
error_infou
distributionsuenvu
shadow_setuproject_nameudisturequ	resolveesuv((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyufind_plugins~s6"





	
uWorkingSet.find_pluginscGs7|jt|��}x|D]}|j|�qW|S(u�Ensure that distributions matching `requirements` are activated

        `requirements` must be a string or a (possibly-nested) sequence
        thereof, specifying the distributions and versions required.  The
        return value is a sequence of the distributions that needed to be
        activated to fulfill the requirements; all relevant distributions are
        included, even if they were already activated in this working set.
        (uresolveuparse_requirementsuadd(uselfurequirementsuneededudist((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyurequire�s	
uWorkingSet.requirecCsB||jkrdS|jj|�x|D]}||�q*WdS(uAInvoke `callback` for all distributions (including existing ones)N(u	callbacksuappend(uselfucallbackudist((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu	subscribe�s

uWorkingSet.subscribecCs"x|jD]}||�q
WdS(N(u	callbacks(uselfudistucallback((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
_added_new�suWorkingSet._added_newcCs<|jdd�|jj�|jj�|jdd�fS(N(uentriesu
entry_keysucopyuby_keyu	callbacks(uself((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__getstate__�s(uWorkingSet.__getstate__cCsZ|\}}}}|dd�|_|j�|_|j�|_|dd�|_dS(N(uentriesucopyu
entry_keysuby_keyu	callbacks(uselfue_k_b_cuentriesukeysuby_keyu	callbacks((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__setstate__�s
uWorkingSet.__setstate__NTF(u__name__u
__module__u__qualname__u__doc__uNoneu__init__uclassmethodu
_build_masteru_build_from_requirementsu	add_entryu__contains__ufinduiter_entry_pointsu
run_scriptu__iter__uTrueuFalseuadduresolveufind_pluginsurequireu	subscribeu
_added_newu__getstate__u__setstate__(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
WorkingSet�s(
=McBs�|EeZdZdZde�edd�Zdd�Zdd�Z	ddd	�Z
d
d�Zdd
�Zddd�Z
ddd�Zdd�Zdd�Zdd�ZdS(uEnvironmentu5Searchable snapshot of distributions on a search pathcCs5i|_i|_||_||_|j|�dS(u!Snapshot distributions available on a search path

        Any distributions found on `search_path` are added to the environment.
        `search_path` should be a sequence of ``sys.path`` items.  If not
        supplied, ``sys.path`` is used.

        `platform` is an optional string specifying the name of the platform
        that platform-specific distributions must be compatible with.  If
        unspecified, it defaults to the current platform.  `python` is an
        optional string naming the desired version of Python (e.g. ``'3.3'``);
        it defaults to the current version.

        You may explicitly set `platform` (and/or `python`) to ``None`` if you
        wish to map *all* distributions, not just those compatible with the
        running platform or Python version.
        N(u_distmapu_cacheuplatformupythonuscan(uselfusearch_pathuplatformupython((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__init__�s
				uEnvironment.__init__cCsC|jdks0|jdks0|j|jkoBt|j|j�S(u�Is distribution `dist` acceptable for this environment?

        The distribution must match the platform and python version
        requirements specified when this environment was created, or False
        is returned.
        N(upythonuNoneu
py_versionucompatible_platformsuplatform(uselfudist((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyucan_addsuEnvironment.can_addcCs|j|jj|�dS(u"Remove `dist` from the environmentN(u_distmapukeyuremove(uselfudist((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuremovesuEnvironment.removecCsQ|dkrtj}nx2|D]*}x!t|�D]}|j|�q2WqWdS(udScan `search_path` for distributions usable in this environment

        Any distributions found are added to the environment.
        `search_path` should be a sequence of ``sys.path`` items.  If not
        supplied, ``sys.path`` is used.  Only distributions conforming to
        the platform/python version defined at initialization are added.
        N(uNoneusysupathufind_distributionsuadd(uselfusearch_pathuitemudist((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuscans

uEnvironment.scancCs�y|j|SWn1tk
rB|j�}||jkr>gSYnX||jkrw|j|}|j|<t|�n|j|S(uKReturn a newest-to-oldest list of distributions for `project_name`
        (u_cacheuKeyErroruloweru_distmapu_sort_dists(uselfuproject_nameudists((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__getitem__.s
	
uEnvironment.__getitem__cCs|j|�r{|j�r{|jj|jg�}||kr{|j|�|j|jkrxt|j|j�qxq{ndS(u<Add `dist` if we ``can_add()`` it and it isn't already addedN(ucan_adduhas_versionu_distmapu
setdefaultukeyuappendu_cacheu_sort_dists(uselfudistudists((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuadd>s
uEnvironment.addcCsW|j|�}|dk	r|Sx%||jD]}||kr-|Sq-W|j||�S(u�Find distribution best matching `req` and usable on `working_set`

        This calls the ``find(req)`` method of the `working_set` to see if a
        suitable distribution is already active.  (This may raise
        ``VersionConflict`` if an unsuitable version of the project is already
        active in the specified `working_set`.)  If a suitable distribution
        isn't active, this method returns the newest distribution in the
        environment that meets the ``Requirement`` in `req`.  If no suitable
        distribution is found, and `installer` is supplied, then the result of
        calling the environment's ``obtain(req, installer)`` method will be
        returned.
        N(ufinduNoneukeyuobtain(uselfurequworking_setu	installerudist((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
best_matchGs
uEnvironment.best_matchcCs|dk	r||�SdS(u�Obtain a distribution matching `requirement` (e.g. via download)

        Obtain a distro that matches requirement (e.g. via download).  In the
        base ``Environment`` class, this routine just returns
        ``installer(requirement)``, unless `installer` is None, in which case
        None is returned instead.  This method is a hook that allows subclasses
        to attempt other ways of obtaining a distribution before falling back
        to the `installer` argument.N(uNone(uselfurequirementu	installer((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuobtain\s	uEnvironment.obtainccs0x)|jj�D]}||r|VqqWdS(u=Yield the unique project names of the available distributionsN(u_distmapukeys(uselfukey((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__iter__hs
uEnvironment.__iter__cCs{t|t�r|j|�nXt|t�rdxF|D](}x||D]}|j|�qFWq5Wntd|f��|S(u2In-place addition of a distribution or environmentuCan't add %r to environment(u
isinstanceuDistributionuadduEnvironmentu	TypeError(uselfuotheruprojectudist((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__iadd__ms
uEnvironment.__iadd__cCs@|jgdddd�}x||fD]}||7}q(W|S(u4Add an environment or distribution to an environmentuplatformupythonN(u	__class__uNone(uselfuotherunewuenv((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__add__ysuEnvironment.__add__N(u__name__u
__module__u__qualname__u__doc__uNoneuget_supported_platformuPY_MAJORu__init__ucan_adduremoveuscanu__getitem__uaddu
best_matchuobtainu__iter__u__iadd__u__add__(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuEnvironment�s	cBs|EeZdZdZdS(uExtractionErroruTAn error occurred extracting a resource

    The following attributes are available from instances of this exception:

    manager
        The resource manager that raised this exception

    cache_path
        The base directory for resource extraction

    original_error
        The exception instance that caused extraction to fail
    N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuExtractionError�s
cBs�|EeZdZdZdZdd�Zdd�Zdd�Zdd	�Z	d
d�Z
dd
�Zdd�Zdd�Z
fdd�Zedd��Zdd�Zdd�Zddd�ZdS(uResourceManageru'Manage resource extraction and packagescCs
i|_dS(N(ucached_files(uself((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__init__�suResourceManager.__init__cCst|�j|�S(uDoes the named resource exist?(uget_provideruhas_resource(uselfupackage_or_requirementu
resource_name((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuresource_exists�suResourceManager.resource_existscCst|�j|�S(u,Is the named resource an existing directory?(uget_provideruresource_isdir(uselfupackage_or_requirementu
resource_name((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuresource_isdir�suResourceManager.resource_isdircCst|�j||�S(u4Return a true filesystem path for specified resource(uget_provideruget_resource_filename(uselfupackage_or_requirementu
resource_name((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuresource_filename�su!ResourceManager.resource_filenamecCst|�j||�S(u9Return a readable file-like object for specified resource(uget_provideruget_resource_stream(uselfupackage_or_requirementu
resource_name((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuresource_stream�suResourceManager.resource_streamcCst|�j||�S(u%Return specified resource as a string(uget_provideruget_resource_string(uselfupackage_or_requirementu
resource_name((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuresource_string�suResourceManager.resource_stringcCst|�j|�S(u1List the contents of the named resource directory(uget_provideruresource_listdir(uselfupackage_or_requirementu
resource_name((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuresource_listdir�su ResourceManager.resource_listdircCs]tj�d}|jpt�}td||f�}||_||_||_|�dS(u5Give an error message for problems extracting file(s)iu}Can't extract file(s) to egg cache

The following error occurred while trying to extract file(s) to the Python egg
cache:

  %s

The Python egg cache directory is currently set to:

  %s

Perhaps your account does not have write access to this directory?  You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.
N(usysuexc_infouextraction_pathuget_default_cacheuExtractionErrorumanageru
cache_pathuoriginal_error(uselfuold_excu
cache_pathuerr((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuextraction_error�s			u ResourceManager.extraction_errorc
Cso|jpt�}tjj||d|�}yt|�Wn|j�YnX|j|�d|j|<|S(u�Return absolute location in cache for `archive_name` and `names`

        The parent directory of the resulting path will be created if it does
        not already exist.  `archive_name` should be the base filename of the
        enclosing egg (which may not be the name of the enclosing zipfile!),
        including its ".egg" extension.  `names`, if provided, should be a
        sequence of path name parts "under" the egg's extraction location.

        This method should only be called by resource providers that need to
        obtain an extraction location, and only for names they intend to
        extract, as it tracks the generated names for possible cleanup later.
        u-tmpi(	uextraction_pathuget_default_cacheuosupathujoinu_bypass_ensure_directoryuextraction_erroru_warn_unsafe_extraction_pathucached_files(uselfuarchive_nameunamesuextract_pathutarget_path((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_cache_path�s


uResourceManager.get_cache_pathcCswtjdkr*|jtjd�r*dStj|�j}|tj@sV|tj@rsd|}tj	|t
�ndS(uN
        If the default extraction path is overridden and set to an insecure
        location, such as /tmp, it opens up an opportunity for an attacker to
        replace an extracted file with an unauthorized payload. Warn the user
        if a known insecure location is used.

        See Distribute #375 for more details.
        untuwindirNu�%s is writable by group/others and vulnerable to attack when used with get_resource_filename. Consider a more secure location (set with .set_extraction_path or the PYTHON_EGG_CACHE environment variable).(uosunameu
startswithuenvironustatust_modeuS_IWOTHuS_IWGRPuwarningsuwarnuUserWarning(upathumodeumsg((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_warn_unsafe_extraction_path�s
&u,ResourceManager._warn_unsafe_extraction_pathcCs@tjdkr<tj|�jdBd@}tj||�ndS(u4Perform any platform-specific postprocessing of `tempname`

        This is where Mac header rewrites should be done; other platforms don't
        have anything special they should do.

        Resource providers should call this method ONLY after successfully
        extracting a compressed resource.  They must NOT call it on resources
        that are already in the filesystem.

        `tempname` is the current (temporary) name of the file, and `filename`
        is the name it will be renamed to by the caller after this routine
        returns.
        uposiximi�N(uosunameustatust_modeuchmod(uselfutempnameufilenameumode((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyupostprocess	suResourceManager.postprocesscCs%|jrtd��n||_dS(u�Set the base path where resources will be extracted to, if needed.

        If you do not call this routine before any extractions take place, the
        path defaults to the return value of ``get_default_cache()``.  (Which
        is based on the ``PYTHON_EGG_CACHE`` environment variable, with various
        platform-specific fallbacks.  See that routine's documentation for more
        details.)

        Resources are extracted to subdirectories of this path based upon
        information given by the ``IResourceProvider``.  You may set this to a
        temporary directory, but then you must call ``cleanup_resources()`` to
        delete the extracted files when done.  There is no guarantee that
        ``cleanup_resources()`` will be able to remove all extracted files.

        (Note: you may not change the extraction path for a given resource
        manager once resources have been extracted, unless you first call
        ``cleanup_resources()``.)
        u5Can't change extraction path, files already extractedN(ucached_filesu
ValueErroruextraction_path(uselfupath((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuset_extraction_paths	u#ResourceManager.set_extraction_pathcCsdS(uB
        Delete all extracted resource files and directories, returning a list
        of the file and directory names that could not be successfully removed.
        This function does not have any concurrency protection, so it should
        generally only be called when the extraction path is a temporary
        directory exclusive to a single process.  This method is not
        automatically called; you must call it explicitly or register it as an
        ``atexit`` function if you wish to ensure cleanup of a temporary
        directory used for extractions.
        N((uselfuforce((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyucleanup_resources7su!ResourceManager.cleanup_resourcesNF(u__name__u
__module__u__qualname__u__doc__uNoneuextraction_pathu__init__uresource_existsuresource_isdiruresource_filenameuresource_streamuresource_stringuresource_listdiruextraction_erroruget_cache_pathustaticmethodu_warn_unsafe_extraction_pathupostprocessuset_extraction_pathuFalseucleanup_resources(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuResourceManager�scCsytjdSWntk
r#YnXtjdkrCtjjd�Sd}dd|fd|fd|fdd|fg}x�|D]�\}}d}xn|D]5}|tjkr�tjj|tj|�}q�Pq�W|r�tjj||�}ntjj|d�Sq�Wtd
��dS(uDetermine the default cache location

    This returns the ``PYTHON_EGG_CACHE`` environment variable, if set.
    Otherwise, on Windows, it returns a "Python-Eggs" subdirectory of the
    "Application Data" directory.  On all other systems, it's "~/.python-eggs".
    uPYTHON_EGG_CACHEuntu~/.python-eggsuApplication DatauAPPDATAuUSERPROFILEu	HOMEDRIVEuHOMEPATHuHOMEuWINDIRuuPython-Eggsu3Please set the PYTHON_EGG_CACHE enviroment variableN(uAPPDATA((uAPPDATAN(uUSERPROFILE(u	HOMEDRIVEuHOMEPATH(uHOMEPATH(uHOME((uHOMEN(uWINDIR(	uosuenvironuKeyErrorunameupathu
expanduseruNoneujoinuRuntimeError(uapp_datau	app_homesukeysusubdirudirnameukey((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_default_cacheDs0
			
cCstjdd|�S(u�Convert an arbitrary string to a standard distribution name

    Any runs of non-alphanumeric/. characters are replaced with a single '-'.
    u[^A-Za-z0-9.]+u-(ureusub(uname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu	safe_namemscCs%|jdd�}tjdd|�S(u�Convert an arbitrary string to a standard version string

    Spaces become dots, and all other non-alphanumeric characters become
    dashes, with runs of multiple dashes condensed to a single dash.
    u u.u[^A-Za-z0-9.]+u-(ureplaceureusub(uversion((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyusafe_versionuscCstjdd|�j�S(u�Convert an arbitrary string to a standard 'extra' name

    Any runs of non-alphanumeric characters are replaced with a single '_',
    and the result is always lowercased.
    u[^A-Za-z0-9.]+u_(ureusubulower(uextra((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
safe_extrascCs|jdd�S(u|Convert a project or version name to its filename-escaped form

    Any '-' characters are currently replaced with '_'.
    u-u_(ureplace(uname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuto_filename�scBsM|EeZdZidd�d6dd�d6dd�d6dd�d	6ejd
6ejd6ejd6Zed
d��Z	e
dd��Zedd��Zedd��Z
edd��Zedd��Zedd��Zed$dd��Zedd��Zde�kr%eZned d!��Zed"d#��Zd$S(%uMarkerEvaluationcCstjS(N(uosuname(((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu<lambda>�suMarkerEvaluation.<lambda>uos_namecCstjS(N(usysuplatform(((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu<lambda>�susys_platformcCstjj�dS(Ni(usysuversionusplit(((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu<lambda>�supython_full_versioncCsdtjdtjdfS(Nu%s.%sii(usysuversion_info(((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu<lambda>�supython_versionuplatform_versionuplatform_machineupython_implementationcCsAy|j|�Wn)tk
r<|jtj�d�SYnXdS(u{
        Validate text as a PEP 426 environment marker; return an exception
        if invalid or False otherwise.
        iF(uevaluate_markeruSyntaxErrorunormalize_exceptionusysuexc_infouFalse(uclsutext((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuis_invalid_marker�s

u"MarkerEvaluation.is_invalid_markercCsEidd6dd6}d|_d|_|j|j|j�|_|S(u�
        Given a SyntaxError from a marker evaluation, normalize the error message:
         - Remove indications of filename and line number.
         - Replace platform-specific error messages with standard error messages.
        uinvalid syntaxuunexpected EOF while parsinguparenthesis is never closedN(uNoneufilenameulinenougetumsg(uexcusubs((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyunormalize_exception�s
		u$MarkerEvaluation.normalize_exceptioncs;tjtj��fdd�tdt��d�D��S(Ncs#g|]}�j�|��qS((u	interpret(u.0ui(uclsunodelist(u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
<listcomp>�s	u-MarkerEvaluation.and_test.<locals>.<listcomp>ii(u	functoolsureduceuoperatoruand_urangeulen(uclsunodelist((uclsunodelistu2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuand_test�suMarkerEvaluation.and_testcs;tjtj��fdd�tdt��d�D��S(Ncs#g|]}�j�|��qS((u	interpret(u.0ui(uclsunodelist(u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
<listcomp>�s	u)MarkerEvaluation.test.<locals>.<listcomp>ii(u	functoolsureduceuoperatoruor_urangeulen(uclsunodelist((uclsunodelistu2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyutest�suMarkerEvaluation.testcCsd|dd}|tjkrT|ddtjkrCtd��n|j|d�Std��dS(NiiiuEmpty parenthesesu5Language feature not supported in environment markers(utokenuLPARuRPARuSyntaxErroru	interpret(uclsunodelistut((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuatom�suMarkerEvaluation.atomc
Cs�t|�dkr!td��n|dd}|d}|dtjkr�t|d�dkr�|dkrwd}q�d	}q�ny|j|�}Wn(tk
r�tt|�d
��YnX||j|d�|j|d��S(Niu5Chained comparison not allowed in environment markersiiiiunotunot inuis notu, operator not allowed in environment markers(ulenuSyntaxErrorutokenuNAMEuget_opuKeyErrorurepruevaluate(uclsunodelistucompucop((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
comparison�s
	
uMarkerEvaluation.comparisoncCs�i|jtj6|jtj6|jtj6|jtj6dd�d6dd�d6tjd6tjd6}ttd�r�|j|tj	<n||S(	NcSs
||kS(N((uxuy((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu<lambda>�su)MarkerEvaluation.get_op.<locals>.<lambda>unot incSs
||kS(N((uxuy((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu<lambda>�suinu==u!=uor_test(
utestusymboluand_testuatomu
comparisonuoperatoruequneuhasattruor_test(uclsuopuops((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_op�s







uMarkerEvaluation.get_opcCs#|jtj|�jd�d�S(ur
        Evaluate a PEP 426 environment marker on CPython 2.4+.
        Return a boolean indicating the marker result in this environment.
        Raise SyntaxError if marker is invalid.

        This implementation uses the 'parser' module, which is not implemented on
        Jython and has been superseded by the 'ast' module in Python 2.6 and
        later.
        i(u	interpretuparseruexprutotuple(uclsutextuextra((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuevaluate_marker�su MarkerEvaluation.evaluate_markercCs�ddlm}|j�}x9|j�D]+}|jdd�}|j|�||<q)Wy|j||�}Wn5tk
r�tj	�d}t
|jd��YnX|S(u�
        Evaluate a PEP 426 environment marker using markerlib.
        Return a boolean indicating the marker result in this environment.
        Raise SyntaxError if marker is invalid.
        i(u
_markerlibu.u_i(upip._vendoru
_markerlibudefault_environmentukeysureplaceupopu	interpretu	NameErrorusysuexc_infouSyntaxErroruargs(uclsutextu
_markerlibuenvukeyunew_keyuresultue((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_markerlib_evaluate�s
u$MarkerEvaluation._markerlib_evaluateuparsercCsex t|�dkr"|d}qWy|j|d�}Wntk
rZtd��YnX||�S(Niiiu)Comparison or logical expression expected(ulenuget_opuKeyErroruSyntaxError(uclsunodelistuop((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu	interprets
uMarkerEvaluation.interpretcCs	x t|�dkr"|d}qW|d}|d}|tjkr�y|j|}Wn"tk
r{td|��YnX|�S|tjkr�|d}|dd�dks�|jd�s�|jd�s�d|kr�td	��n|dd�Std
��dS(NiiiuUnknown name %ru'"u"""u'''u\u1Only plain strings allowed in environment markersu5Language feature not supported in environment markersi����(ulenutokenuNAMEuvaluesuKeyErroruSyntaxErroruSTRINGu
startswith(uclsunodelistukindunameuopus((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuevaluates$



4uMarkerEvaluation.evaluateN(u__name__u
__module__u__qualname__uplatformuversionumachineupython_implementationuvaluesuclassmethoduis_invalid_markerustaticmethodunormalize_exceptionuand_testutestuatomu
comparisonuget_opuNoneuevaluate_markeru_markerlib_evaluateuglobalsu	interpretuevaluate(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuMarkerEvaluation�s,






			uMarkerEvaluationcBs"|EeZdZdZd(Zd(Zd(Zdd�Zdd�Z	dd�Z
dd	�Zd
d�Zdd
�Z
ejd)kr�dd�Zndd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(S(*uNullProvideruETry to implement resources and metadata for arbitrary PEP 302 loaderscCs:t|dd�|_tjjt|dd��|_dS(Nu
__loader__u__file__u(ugetattruNoneuloaderuosupathudirnameumodule_path(uselfumodule((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__init__:suNullProvider.__init__cCs|j|j|�S(N(u_fnumodule_path(uselfumanageru
resource_name((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_resource_filename>su"NullProvider.get_resource_filenamecCst|j||��S(N(uBytesIOuget_resource_string(uselfumanageru
resource_name((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_resource_streamAsu NullProvider.get_resource_streamcCs|j|j|j|��S(N(u_getu_fnumodule_path(uselfumanageru
resource_name((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_resource_stringDsu NullProvider.get_resource_stringcCs|j|j|j|��S(N(u_hasu_fnumodule_path(uselfu
resource_name((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuhas_resourceGsuNullProvider.has_resourcecCs%|jo$|j|j|j|��S(N(uegg_infou_hasu_fn(uselfuname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuhas_metadataJsuNullProvider.has_metadataicCs)|js
dS|j|j|j|��S(Nu(uegg_infou_getu_fn(uselfuname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_metadataNs	uNullProvider.get_metadatacCs2|js
dS|j|j|j|��jd�S(Nuuutf-8(uegg_infou_getu_fnudecode(uselfuname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_metadataSs	cCst|j|��S(N(uyield_linesuget_metadata(uselfuname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_metadata_linesXsuNullProvider.get_metadata_linescCs|j|j|j|��S(N(u_isdiru_fnumodule_path(uselfu
resource_name((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuresource_isdir[suNullProvider.resource_isdircCs%|jo$|j|j|j|��S(N(uegg_infou_isdiru_fn(uselfuname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyumetadata_isdir^suNullProvider.metadata_isdircCs|j|j|j|��S(N(u_listdiru_fnumodule_path(uselfu
resource_name((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuresource_listdirasuNullProvider.resource_listdircCs)|jr%|j|j|j|��SgS(N(uegg_infou_listdiru_fn(uselfuname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyumetadata_listdirds	uNullProvider.metadata_listdircCs�d|}|j|�s,td|��n|j|�jdd�}|jdd�}|j|j|�}||d<tjj|�r�t	|||�nWddl
m}t|�d|j
d�|f||<t||d	�}t|||�dS(
Nuscripts/uNo script named %ru
u
u
u__file__i(ucacheuexec(uhas_metadatauResolutionErroruget_metadataureplaceu_fnuegg_infouosupathuexistsuexecfileu	linecacheucacheulenusplitucompileuexec(uselfuscript_nameu	namespaceuscriptuscript_textuscript_filenameucacheuscript_code((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
run_scriptis

%uNullProvider.run_scriptcCstd��dS(Nu9Can't perform this operation for unregistered loader type(uNotImplementedError(uselfupath((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_has{suNullProvider._hascCstd��dS(Nu9Can't perform this operation for unregistered loader type(uNotImplementedError(uselfupath((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_isdir�suNullProvider._isdircCstd��dS(Nu9Can't perform this operation for unregistered loader type(uNotImplementedError(uselfupath((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_listdir�suNullProvider._listdircCs&|r"tjj||jd��S|S(Nu/(uosupathujoinusplit(uselfubaseu
resource_name((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_fn�suNullProvider._fncCs2t|jd�r"|jj|�Std��dS(Nuget_datau=Can't perform this operation for loaders without 'get_data()'(uhasattruloaderuget_datauNotImplementedError(uselfupath((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_get�suNullProvider._getN(i(u__name__u
__module__u__qualname__u__doc__uNoneuegg_nameuegg_infouloaderu__init__uget_resource_filenameuget_resource_streamuget_resource_stringuhas_resourceuhas_metadatausysuversion_infouget_metadatauget_metadata_linesuresource_isdirumetadata_isdiruresource_listdirumetadata_listdiru
run_scriptu_hasu_isdiru_listdiru_fnu_get(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuNullProvider3s0cBs2|EeZdZdZdd�Zdd�ZdS(uEggProvideru&Provider based on a virtual filesystemcCstj||�|j�dS(N(uNullProvideru__init__u
_setup_prefix(uselfumodule((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__init__�suEggProvider.__init__cCs�|j}d}x}||kr�|j�jd�rmtjj|�|_tjj|d�|_	||_
Pn|}tjj|�\}}qWdS(Nu.egguEGG-INFO(umodule_pathuNoneuloweruendswithuosupathubasenameuegg_nameujoinuegg_infouegg_rootusplit(uselfupathuoldubase((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
_setup_prefix�s		uEggProvider._setup_prefixN(u__name__u
__module__u__qualname__u__doc__u__init__u
_setup_prefix(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuEggProvider�scBsV|EeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�ZdS(
uDefaultProvideru6Provides access to package resources in the filesystemcCstjj|�S(N(uosupathuexists(uselfupath((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_has�suDefaultProvider._hascCstjj|�S(N(uosupathuisdir(uselfupath((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_isdir�suDefaultProvider._isdircCs
tj|�S(N(uosulistdir(uselfupath((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_listdir�suDefaultProvider._listdircCst|j|j|�d�S(Nurb(uopenu_fnumodule_path(uselfumanageru
resource_name((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_resource_stream�su#DefaultProvider.get_resource_streamc
Cs/t|d�}z|j�SWd|j�XdS(Nurb(uopenureaduclose(uselfupathustream((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_get�suDefaultProvider._getN(	u__name__u
__module__u__qualname__u__doc__u_hasu_isdiru_listdiruget_resource_streamu_get(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuDefaultProvider�scBsT|EeZdZdZdd�ZZdd�Zdd�ZdZ	dd�Z
dS(	u
EmptyProvideru.Provider that returns nothing for all requestscCsdS(NF(uFalse(uselfupath((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu<lambda>�suEmptyProvider.<lambda>cCsdS(Nu((uselfupath((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu<lambda>�scCsgS(N((uselfupath((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu<lambda>�scCsdS(N((uself((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__init__�suEmptyProvider.__init__N(u__name__u
__module__u__qualname__u__doc__u_isdiru_hasu_getu_listdiruNoneumodule_pathu__init__(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
EmptyProvider�sc
Cs�t�}tj|�}zYxR|j�D]D}|jdtj�}|j|�||<||dk	s(t	�q(WWd|j
�X|S(uf
    This builds a similar dictionary to the zipimport directory
    caches.  However instead of tuples, ZipInfo objects are stored.

    The translation of the tuple is as follows:
      * [0] - zipinfo.filename on stock pythons this needs "/" --> os.sep
              on pypy it is the same (one reason why distribute did work
              in some cases on pypy and win32).
      * [1] - zipinfo.compress_type
      * [2] - zipinfo.compress_size
      * [3] - zipinfo.file_size
      * [4] - len(utf-8 encoding of filename) if zipinfo & 0x800
              len(ascii encoding of filename) otherwise
      * [5] - (zipinfo.date_time[0] - 1980) << 9 |
               zipinfo.date_time[1] << 5 | zipinfo.date_time[2]
      * [6] - (zipinfo.date_time[3] - 1980) << 11 |
               zipinfo.date_time[4] << 5 | (zipinfo.date_time[5] // 2)
      * [7] - zipinfo.CRC
    u/N(udictuzipfileuZipFileunamelistureplaceuosusepugetinfouNoneuAssertionErroruclose(upathuzipinfouzfileuzitemuzpath((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyubuild_zipmanifest�s	ubuild_zipmanifestcBs�|EeZdZdZdZdd�Zdd�Zdd�Zdd	�Z	e
d
d��Zdd
�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�ZdS(uZipProvideru"Resource support for zips and eggscCs?tj||�t|jj�|_|jjtj|_dS(N(	uEggProvideru__init__ubuild_zipmanifestuloaderuarchiveuzipinfouosusepuzip_pre(uselfumodule((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__init__�suZipProvider.__init__cCsF|j|j�r)|t|j�d�Std||jf��dS(Nu%s is not a subpath of %s(u
startswithuzip_preulenuAssertionError(uselfufspath((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
_zipinfo_namesuZipProvider._zipinfo_namecCsj|j|}|j|jtj�rM|t|j�dd�jtj�Std||jf��dS(Niu%s is not a subpath of %s(uzip_preu
startswithuegg_rootuosusepulenusplituAssertionError(uselfuzip_pathufspath((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_partss

'uZipProvider._partscCs�|jstd��n|j|�}|j�}dj|j|��|kr~x*|D]}|j||j|��qXWn|j||�S(Nu5resource_filename() only supported for .egg, not .zipu/(uegg_nameuNotImplementedErroru_resource_to_zipu_get_eager_resourcesujoinu_partsu_extract_resourceu
_eager_to_zip(uselfumanageru
resource_nameuzip_pathueagersuname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_resource_filenames	
 u!ZipProvider.get_resource_filenamecCs/|j}|jd}tj|�}||fS(Niii����(iii����(u	file_sizeu	date_timeutimeumktime(uzip_statusizeu	date_timeu	timestamp((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_get_date_and_size"s	
uZipProvider._get_date_and_sizec
Cs�||j�kr^x9|j�|D]'}|j|tjj||��}q#Wtjj|�S|j|j|�\}}ts�t	d��ny)|j
|j|j|��}|j
||�r�|Stddtjj|��\}}	tj||jj|��tj|�t|	||f�|j|	|�yt|	|�Wnmtjk
r�tjj|�r�|j
||�r�|Stjdkr�t|�t|	|�|Sn�YnXWntjk
r�|j�YnX|S(Nu>"os.rename" and "os.unlink" are not supported on this platformu	.$extractudirunt(u_indexu_extract_resourceuosupathujoinudirnameu_get_date_and_sizeuzipinfou
WRITE_SUPPORTuIOErroruget_cache_pathuegg_nameu_partsu_is_currentu_mkstempuwriteuloaderuget_dataucloseuutimeupostprocessurenameuerroruisfileunameuunlinkuextraction_error(
uselfumanageruzip_pathunameulastu	timestampusizeu	real_pathuoutfutmpnam((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_extract_resource*s@$


uZipProvider._extract_resourcec	Cs�|j|j|�\}}tjj|�s2dStj|�}|j|ks_|j|krcdS|j	j
|�}t|d�}|j�}|j
�||kS(uK
        Return True if the file_path is current for this zip_path
        urbF(u_get_date_and_sizeuzipinfouosupathuisfileuFalseustatust_sizeust_mtimeuloaderuget_datauopenureaduclose(	uselfu	file_pathuzip_pathu	timestampusizeustatuzip_contentsufu
file_contents((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_is_current[s
uZipProvider._is_currentcCsa|jdkrZg}x6dD].}|j|�r|j|j|��qqW||_n|jS(Nunative_libs.txtueager_resources.txt(unative_libs.txtueager_resources.txt(ueagersuNoneuhas_metadatauextenduget_metadata_lines(uselfueagersuname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_get_eager_resourcesls
u ZipProvider._get_eager_resourcescCs�y|jSWn�tk
r�i}x�|jD]y}|jtj�}x^|r�tjj|dd��}||kr�||j|d�PqF|j�g||<qFWq+W||_|SYnXdS(Nii����i����(	u	_dirindexuAttributeErroruzipinfousplituosusepujoinuappendupop(uselfuindupathupartsuparent((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_indexus
		uZipProvider._indexcCs.|j|�}||jkp-||j�kS(N(u
_zipinfo_nameuzipinfou_index(uselfufspathuzip_path((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_has�suZipProvider._hascCs|j|�|j�kS(N(u
_zipinfo_nameu_index(uselfufspath((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_isdir�suZipProvider._isdircCs%t|j�j|j|�f��S(N(ulistu_indexugetu
_zipinfo_name(uselfufspath((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_listdir�suZipProvider._listdircCs|j|j|j|��S(N(u
_zipinfo_nameu_fnuegg_root(uselfu
resource_name((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
_eager_to_zip�suZipProvider._eager_to_zipcCs|j|j|j|��S(N(u
_zipinfo_nameu_fnumodule_path(uselfu
resource_name((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_resource_to_zip�suZipProvider._resource_to_zipN(u__name__u
__module__u__qualname__u__doc__uNoneueagersu__init__u
_zipinfo_nameu_partsuget_resource_filenameustaticmethodu_get_date_and_sizeu_extract_resourceu_is_currentu_get_eager_resourcesu_indexu_hasu_isdiru_listdiru
_eager_to_zipu_resource_to_zip(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuZipProvider�s 		
1	cBsJ|EeZdZdZdd�Zdd�Zdd�Zdd	�Zd
S(uFileMetadatau*Metadata handler for standalone PKG-INFO files

    Usage::

        metadata = FileMetadata("/path/to/PKG-INFO")

    This provider rejects all data and metadata requests except for PKG-INFO,
    which is treated as existing, and will be the contents of the file at
    the provided location.
    cCs
||_dS(N(upath(uselfupath((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__init__�suFileMetadata.__init__cCs
|dkS(NuPKG-INFO((uselfuname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuhas_metadata�suFileMetadata.has_metadatacCsH|dkr8t|jd�}|j�}|j�|Std��dS(NuPKG-INFOurUu(No metadata except PKG-INFO is available(uopenupathureaducloseuKeyError(uselfunameufumetadata((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_metadata�s
uFileMetadata.get_metadatacCst|j|��S(N(uyield_linesuget_metadata(uselfuname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_metadata_lines�suFileMetadata.get_metadata_linesN(u__name__u
__module__u__qualname__u__doc__u__init__uhas_metadatauget_metadatauget_metadata_lines(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuFileMetadata�s

cBs&|EeZdZdZdd�ZdS(uPathMetadatauqMetadata provider for egg directories

    Usage::

        # Development eggs:

        egg_info = "/path/to/PackageName.egg-info"
        base_dir = os.path.dirname(egg_info)
        metadata = PathMetadata(base_dir, egg_info)
        dist_name = os.path.splitext(os.path.basename(egg_info))[0]
        dist = Distribution(basedir,project_name=dist_name,metadata=metadata)

        # Unpacked egg directories:

        egg_path = "/path/to/PackageName-ver-pyver-etc.egg"
        metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO'))
        dist = Distribution.from_filename(egg_path, metadata=metadata)
    cCs||_||_dS(N(umodule_pathuegg_info(uselfupathuegg_info((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__init__�s	uPathMetadata.__init__N(u__name__u
__module__u__qualname__u__doc__u__init__(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuPathMetadata�scBs&|EeZdZdZdd�ZdS(uEggMetadatau Metadata provider for .egg filescCsrt|j�|_|jtj|_||_|jrXtjj	|j|j�|_
n|j|_
|j�dS(u-Create a metadata provider from a zipimporterN(ubuild_zipmanifestuarchiveuzipinfouosusepuzip_preuloaderuprefixupathujoinumodule_pathu
_setup_prefix(uselfuimporter((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__init__�s		!uEggMetadata.__init__N(u__name__u
__module__u__qualname__u__doc__u__init__(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuEggMetadata�sudictu_distribution_finderscCs|t|<dS(uxRegister `distribution_finder` to find distributions in sys.path items

    `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
    handler), and `distribution_finder` is a callable that, passed a path
    item and the importer instance, yields ``Distribution`` instances found on
    that path item.  See ``pkg_resources.find_on_path`` for an example.N(u_distribution_finders(u
importer_typeudistribution_finder((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuregister_finder�scCs+t|�}tt|�}||||�S(u.Yield distributions accessible via `path_item`(uget_importeru
_find_adapteru_distribution_finders(u	path_itemuonlyuimporterufinder((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyufind_distributions�sccs�|jjd�rdSt|�}|jd�rHtj|d|�Vn|rRdSxf|jd�D]U}|jd�rbtjj	||�}x(t
tj|�|�D]}|Vq�WqbqbWdS(u@
    Find eggs in zip files; possibly multiple nested eggs.
    u.whlNuPKG-INFOumetadatau/u.egg(
uarchiveuendswithuEggMetadatauhas_metadatauDistributionu
from_filenameuresource_listdiruosupathujoinufind_eggs_in_zipu	zipimportuzipimporter(uimporteru	path_itemuonlyumetadatausubitemusubpathudist((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyufind_eggs_in_zip�sufind_eggs_in_zipcCsfS(N((uimporteru	path_itemuonly((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyufind_nothingsufind_nothingccst|�}tjj|�rtj|tj�r|j�jd�rwtj	|dt
|tjj|d���Vqx�tj|�D]}}|j�}|jd�s�|jd�rtjj||�}tjj|�r�t
||�}nt
|�}tj|||dt�Vq�|r]|jd�r]x�ttjj||��D]}|VqKWq�|r�|jd�r�ttjj||��}z|j�}	Wd|j�XxU|	D]J}
|
j�s�q�nx.ttjj||
j���D]}|Vq�WPq�Wq�q�WndS(	u6Yield distributions accessible on a sys.path directoryu.eggumetadatauEGG-INFOu	.egg-infou
.dist-infou
precedenceu	.egg-linkN(u_normalize_cacheduosupathuisdiruaccessuR_OKuloweruendswithuDistributionu
from_filenameuPathMetadataujoinulistdiruFileMetadatau
from_locationuDEVELOP_DISTufind_distributionsuopenu	readlinesucloseustripurstrip(uimporteru	path_itemuonlyuentryulowerufullpathumetadataudistu
entry_fileuentry_linesulineuitem((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyufind_on_path
s:'	 "
(	ufind_on_pathu_namespace_handlersu_namespace_packagescCs|t|<dS(u�Register `namespace_handler` to declare namespace packages

    `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
    handler), and `namespace_handler` is a callable like this::

        def namespace_handler(importer,path_entry,moduleName,module):
            # return a path_entry to use for child packages

    Namespace handlers are only called if the importer object has already
    agreed that it can handle the relevant path item, and they should only
    return a subpath if the module __path__ does not already contain an
    equivalent subpath.  For an example namespace handler, see
    ``pkg_resources.file_ns_handler``.
    N(u_namespace_handlers(u
importer_typeunamespace_handler((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuregister_namespace_handler;scCs7t|�}|dkrdS|j|�}|dkr;dStjj|�}|dkr�tj|�}tj|<g|_t	|�n!t
|d�s�td|��ntt
|�}|||||�}|dk	r3|j}|j|�|j|�x3|D](}||jkr|jj|�qqWn|S(uEEnsure that named package includes a subpath of path_item (if needed)u__path__uNot a package:N(uget_importeruNoneufind_moduleusysumodulesugetuimpu
new_moduleu__path__u_set_parent_nsuhasattru	TypeErroru
_find_adapteru_namespace_handlersuappenduload_module(upackageNameu	path_itemuimporteruloaderumoduleuhandlerusubpathupath((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
_handle_nsLs.	
	


u
_handle_nscCstj�z�|tkrdStjd}}d|kr�dj|jd�dd��}t|�|tkr~t	|�nytj
|j}Wq�tk
r�t
d|��Yq�Xntj|g�j|�tj|g�x|D]}t||�q�WWdtj�XdS(u9Declare that package 'packageName' is a namespace packageNu.iuNot a package:i����(uimpuacquire_locku_namespace_packagesusysupathuNoneujoinusplitudeclare_namespaceu
__import__umodulesu__path__uAttributeErroru	TypeErroru
setdefaultuappendu
_handle_nsurelease_lock(upackageNameupathuparentu	path_item((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyudeclare_namespacegs&
"



c
Csbtj�zFx?tj|f�D]+}t||�}|r t||�q q WWdtj�XdS(uDEnsure that previously-declared namespace packages include path_itemN(uimpuacquire_locku_namespace_packagesugetu
_handle_nsufixup_namespace_packagesurelease_lock(u	path_itemuparentupackageusubpath((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyufixup_namespace_packages�s
cCs`tjj||jd�d�}t|�}x+|jD]}t|�|kr8Pq8q8W|SdS(uBCompute an ns-package subpath for a filesystem or zipfile importeru.iNi����(uosupathujoinusplitu_normalize_cachedu__path__(uimporteru	path_itemupackageNameumoduleusubpathu
normalizeduitem((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyufile_ns_handler�s"ufile_ns_handlercCsdS(N(uNone(uimporteru	path_itemupackageNameumodule((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyunull_ns_handler�sunull_ns_handlercCstjjtjj|��S(u1Normalize a file/dir name for comparison purposes(uosupathunormcaseurealpath(ufilename((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyunormalize_path�scCs=y||SWn*tk
r8t|�||<}|SYnXdS(N(uKeyErrorunormalize_path(ufilenameu_cacheuresult((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_normalize_cached�s

u_normalize_cachedcCsU|jd�}|j�}|rQdj|�}ttj||tj|�ndS(Nu.(usplitupopujoinusetattrusysumodules(upackageNameupartsunameuparent((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_set_parent_ns�s
u_set_parent_nsccs�t|t�rSxn|j�D]0}|j�}|r|jd�r|VqqWn-x*|D]"}xt|�D]}|VqmWqZWdS(uAYield non-empty/non-comment lines of a ``basestring`` or sequenceu#N(u
isinstanceu
basestringu
splitlinesustripu
startswithuyield_lines(ustrsususs((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuyield_lines�s
u
\s*(#.*)?$u\s*\\\s*(#.*)?$u\s*((\w|[-.])+)u!\s*(<=?|>=?|==|!=)\s*((\w|[-.])+)u\s*,u\s*\[u\s*\]u\w+(\.\w+)*$uL(?P<name>[^-]+)( -(?P<ver>[^-]+) (-py(?P<pyver>[^-]+) (-(?P<plat>.+))? )? )?u(\d+ | [a-z]+ | \.| -)ucupreupreviewufinal-u-urcu@udevccs{xotj|�D]^}t||�}|s|dkr>qn|dd�dkre|jd�Vqd|VqWdVdS(Nu.iu
0123456789iu*u*final(ucomponent_reusplitureplaceuzfill(usupart((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_parse_version_parts�s
u_parse_version_partscCs�g}x�t|j��D]�}|jd�r�|dkrdx'|r`|ddkr`|j�q=Wnx'|r�|ddkr�|j�qgWn|j|�qWt|�S(u�Convert a version string to a chronologically-sortable key

    This is a rough cross between distutils' StrictVersion and LooseVersion;
    if you give it versions that would work with StrictVersion, then it behaves
    the same; otherwise it acts like a slightly-smarter LooseVersion. It is
    *possible* to create pathological version coding schemes that will fool
    this parser, but they should be very rare in practice.

    The returned value will be a tuple of strings.  Numeric portions of the
    version are padded to 8 digits so they will compare numerically, but
    without relying on how numbers compare relative to strings.  Dots are
    dropped, but dashes are retained.  Trailing zeros between alpha segments
    or dashes are suppressed, so that e.g. "2.4.0" is considered the same as
    "2.4". Alphanumeric parts are lower-cased.

    The algorithm assumes that strings like "-" and any alpha string that
    alphabetically follows "final"  represents a "patch level".  So, "2.4-1"
    is assumed to be a branch or patch of "2.4", and therefore "2.4.1" is
    considered newer than "2.4-1", which in turn is newer than "2.4".

    Strings like "a", "b", "c", "alpha", "beta", "candidate" and so on (that
    come before "final" alphabetically) are assumed to be pre-release versions,
    so that the version "2.4" is considered newer than "2.4a1".

    Finally, to handle miscellaneous cases, the strings "pre", "preview", and
    "rc" are treated as if they were "c", i.e. as though they were release
    candidates, and therefore are not as new as a version string that does not
    contain them, and "dev" is replaced with an '@' so that it sorts lower than
    than any other pre-release tag.
    u*u*finaliu*final-u00000000i����i����(u_parse_version_partsuloweru
startswithupopuappendutuple(usupartsupart((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
parse_version�scBs�|EeZdZdZffddd�Zdd�Zdd�Zddddd	�Z	ddd
d�Z
eddd
��Zeddd��Z
eddd��ZdS(u
EntryPointu3Object representing an advertised importable objectcCsnt|�std|��n||_||_t|�|_tjddj|��j	|_	||_
dS(NuInvalid module nameux[%s]u,(uMODULEu
ValueErrorunameumodule_nameutupleuattrsuRequirementuparseujoinuextrasudist(uselfunameumodule_nameuattrsuextrasudist((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__init__s		"uEntryPoint.__init__cCsfd|j|jf}|jr<|ddj|j�7}n|jrb|ddj|j�7}n|S(Nu%s = %su:u.u [%s]u,(unameumodule_nameuattrsujoinuextras(uselfus((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__str__s		uEntryPoint.__str__cCsdt|�S(NuEntryPoint.parse(%r)(ustr(uself((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__repr__#suEntryPoint.__repr__cCs�|r|j||�nt|jt�t�dg�}xO|jD]D}yt||�}WqDtk
r�td||f��YqDXqDW|S(Nu__name__u%r has no %r attribute(urequireu
__import__umodule_nameuglobalsuattrsugetattruAttributeErroruImportError(uselfurequireuenvu	installeruentryuattr((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuload&s!
uEntryPoint.loadcCs]|jr%|jr%td|��ntttjtj|jj|j�||���dS(Nu&Can't require() without a distribution(	uextrasudistuUnknownExtraulistumapuworking_setuadduresolveurequires(uselfuenvu	installer((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyurequire0suEntryPoint.requirecCsy�f}}|jdd�\}}d|krz|jdd�\}}tjd|�}|jrnt�n|j}nd|kr�|jdd�\}}t|j��s�t�n|j�jd�}nWn!tk
r�td|��Yn#X||j�|j�|||�SdS(	uParse a single entry point from string `src`

        Entry point syntax follows the form::

            name = some.module:some.attr [extra1,extra2]

        The entry name and module name are required, but the ``:attrs`` and
        ``[extras]`` parts are optional
        u=iu[ux[u:u.u9EntryPoint must be in 'name=module:attrs [extras]' formatN(	usplituRequirementuparseuspecsu
ValueErroruextrasuMODULEurstripustrip(uclsusrcudistuattrsuextrasunameuvalueureq((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuparse6s&
			
uEntryPoint.parsecCs�t|�std|��ni}xZt|�D]L}|j||�}|j|krptd||j��n|||j<q1W|S(uParse an entry point groupuInvalid group nameuDuplicate entry point(uMODULEu
ValueErroruyield_linesuparseuname(uclsugroupulinesudistuthisulineuep((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuparse_groupVsuEntryPoint.parse_groupcCs�t|t�r|j�}nt|�}i}x~|D]v\}}|dkrj|s[q7ntd��n|j�}||kr�td|��n|j|||�||<q7W|S(u!Parse a map of entry point groupsu%Entry points must be listed in groupsuDuplicate group nameN(u
isinstanceudictuitemsusplit_sectionsuNoneu
ValueErrorustripuparse_group(uclsudataudistumapsugroupulines((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu	parse_mapcsuEntryPoint.parse_mapNT(u__name__u
__module__u__qualname__u__doc__uNoneu__init__u__str__u__repr__uTrueuloadurequireuclassmethoduparseuparse_groupu	parse_map(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
EntryPoints	
cCsE|s
dSt|�}|djd�rAt|dd�d�S|S(Nuiumd5=i����i����(u(uurlparseu
startswithu
urlunparse(ulocationuparsed((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_remove_md5_fragmentwsu_remove_md5_fragmentc	Bs�|EeZdZdZdZdAdAdAdAedAedd�Ze	dAdd��Z
edd��Zd	d
�Z
dd�Zd
d�Zdd�Zdd�Zdd�Zdd�Zedd��Zedd��Zedd��Zedd��Zfdd �Zd!d"�ZdAd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Ze	dAd-d.��Zd/d0�Z d1d2�Z!dAd3d4�Z"d5d6�Z#dAd7d8�Z$d9d:�Z%d;d<�Z&d=d>�Z'ed?d@��Z(dAS(BuDistributionu5Wrap an actual or potential sys.path entry w/metadatauPKG-INFOcCsjt|pd�|_|dk	r3t|�|_n||_||_||_||_|p`t	|_
dS(NuUnknown(u	safe_nameuproject_nameuNoneusafe_versionu_versionu
py_versionuplatformulocationu
precedenceuempty_provideru	_provider(uselfulocationumetadatauproject_nameuversionu
py_versionuplatformu
precedence((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__init__�s				uDistribution.__init__cKs�dgd\}}}}tjj|�\}}	|	j�tkr�t|�}
|
r||
jdddd�\}}}}nt|	j�}n|||d|d|d|d	||�S(
Niunameuverupyveruplatuproject_nameuversionu
py_versionuplatform(uNoneuosupathusplitextuloweru_distributionImpluEGG_NAMEugroup(uclsulocationubasenameumetadataukwuproject_nameuversionu
py_versionuplatformuextumatch((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
from_location�s!uDistribution.from_locationcCs7t|df�|j|jt|j�|j|jfS(Nuparsed_version(ugetattru
precedenceukeyu_remove_md5_fragmentulocationu
py_versionuplatform(uself((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu<lambda>�suDistribution.<lambda>cCs
t|j�S(N(uhashuhashcmp(uself((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__hash__�suDistribution.__hash__cCs|j|jkS(N(uhashcmp(uselfuother((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__lt__�suDistribution.__lt__cCs|j|jkS(N(uhashcmp(uselfuother((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__le__�suDistribution.__le__cCs|j|jkS(N(uhashcmp(uselfuother((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__gt__�suDistribution.__gt__cCs|j|jkS(N(uhashcmp(uselfuother((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__ge__�suDistribution.__ge__cCs&t||j�sdS|j|jkS(NF(u
isinstanceu	__class__uFalseuhashcmp(uselfuother((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__eq__�suDistribution.__eq__cCs||kS(N((uselfuother((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__ne__�suDistribution.__ne__cCs>y|jSWn,tk
r9|jj�|_}|SYnXdS(N(u_keyuAttributeErroruproject_nameulower(uselfukey((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyukey�s

uDistribution.keycCs>y|jSWn,tk
r9t|j�|_}|SYnXdS(N(u_parsed_versionuAttributeErroru
parse_versionuversion(uselfupv((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuparsed_version�s

uDistribution.parsed_versioncCs�y|jSWn�tk
r�xq|j|j�D]G}|j�jd�r.t|jdd�dj��|_|jSq.Wt	d|j|��YnXdS(Nuversion:u:iu(Missing 'Version:' header and/or %s file(
u_versionuAttributeErroru
_get_metadatauPKG_INFOuloweru
startswithusafe_versionusplitustripu
ValueError(uselfuline((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuversion�s
%uDistribution.versioncCs�y|jSWn�tk
r�igd6}|_x�dD]�}x�t|j|��D]�\}}|r�d|kr�|jdd�\}}t|�r�g}q�t|�s�g}q�nt|�p�d}n|j	|g�j
t|��qRWq6W|SYnXdS(Nurequires.txtudepends.txtu:i(urequires.txtudepends.txt(u_Distribution__dep_mapuAttributeErroruNoneusplit_sectionsu
_get_metadatausplituinvalid_markeruevaluate_markeru
safe_extrau
setdefaultuextenduparse_requirements(uselfudmunameuextraureqsumarker((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_dep_map�s 

"	'uDistribution._dep_mapcCs�|j}g}|j|jdf��xT|D]L}y|j|t|��Wq/tk
rztd||f��Yq/Xq/W|S(u@List of Requirements needed for this distro if `extras` are usedu%s has no such extra feature %rN(u_dep_mapuextendugetuNoneu
safe_extrauKeyErroruUnknownExtra(uselfuextrasudmudepsuext((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyurequires�s	

uDistribution.requiresccs5|j|�r1x|j|�D]}|VqWndS(N(uhas_metadatauget_metadata_lines(uselfunameuline((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
_get_metadata�suDistribution._get_metadatacCs~|dkrtj}n|j|�|tjkrzt|j�x6|jd�D]"}|tjkrQt|�qQqQWndS(u>Ensure distribution is importable on `path` (default=sys.path)unamespace_packages.txtN(	uNoneusysupathu	insert_onufixup_namespace_packagesulocationu
_get_metadataumodulesudeclare_namespace(uselfupathupkg((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuactivate	s

uDistribution.activatecCsOdt|j�t|j�|jp'tf}|jrK|d|j7}n|S(u@Return what this distribution's standard .egg filename should beu
%s-%s-py%su-(uto_filenameuproject_nameuversionu
py_versionuPY_MAJORuplatform(uselfufilename((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuegg_name	s	uDistribution.egg_namecCs(|jrd||jfSt|�SdS(Nu%s (%s)(ulocationustr(uself((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__repr__	s	uDistribution.__repr__cCsNyt|dd�}Wntk
r0d}YnX|p:d}d|j|fS(Nuversionu[unknown version]u%s %s(ugetattruNoneu
ValueErroruproject_name(uselfuversion((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__str__	s
uDistribution.__str__cCs.|jd�rt|��nt|j|�S(uADelegate all unrecognized public attributes to .metadata provideru_(u
startswithuAttributeErrorugetattru	_provider(uselfuattr((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__getattr__%	suDistribution.__getattr__cKs(|jt|�tjj|�||�S(N(u
from_locationu_normalize_cacheduosupathubasename(uclsufilenameumetadataukw((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
from_filename+	suDistribution.from_filenamecCstjd|j|jf�S(u?Return a ``Requirement`` that matches this distribution exactlyu%s==%s(uRequirementuparseuproject_nameuversion(uself((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuas_requirement2	suDistribution.as_requirementcCsD|j||�}|dkr:td||ff��n|j�S(u=Return the `name` entry point of `group` or raise ImportErroruEntry point %r not foundN(uget_entry_infouNoneuImportErroruload(uselfugroupunameuep((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuload_entry_point6	suDistribution.load_entry_pointcCsdy
|j}Wn4tk
rCtj|jd�|�}|_YnX|dk	r`|j|i�S|S(u=Return the entry point map for `group`, or the full entry mapuentry_points.txtN(u_ep_mapuAttributeErroru
EntryPointu	parse_mapu
_get_metadatauNoneuget(uselfugroupuep_map((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
get_entry_map=	s

!uDistribution.get_entry_mapcCs|j|�j|�S(u<Return the EntryPoint object for `group`+`name`, or ``None``(u
get_entry_mapuget(uselfugroupuname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuget_entry_infoI	suDistribution.get_entry_infoc	CsM|p|j}|sdSt|�}tjj|�}dd�|D�}x�t|�D]w\}}||krsPqW||krW|jtkrW|tjkr�|j	�n|j
||�|j
||�PqWqWW|tjkr�|j	�n|j|�dSxGy|j||d�}Wnt
k
r1PYqX||=||=|}qdS(u@Insert self.location in path before its nearest parent directoryNcSs(g|]}|rt|�p!|�qS((u_normalize_cached(u.0up((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
<listcomp>V	s	u*Distribution.insert_on.<locals>.<listcomp>i(ulocationu_normalize_cacheduosupathudirnameu	enumerateu
precedenceuEGG_DISTusysucheck_version_conflictuinsertuappenduindexu
ValueError(	uselfupathulocunlocubdirunpathupuitemunp((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu	insert_onM	s6



	uDistribution.insert_onc
Cs�|jdkrdStj|jd��}t|j�}x�|jd�D]�}|tjksJ||ksJ|tkr}qJn|dkr�qJnt	tj|dd�}|r�t|�j|�sJ|j|j�r�qJntd|||jf�qJWdS(	Nu
setuptoolsunamespace_packages.txtu
top_level.txtu
pkg_resourcesusiteu__file__uIModule %s was already imported from %s, but %s is being added to sys.path(u
pkg_resourcesu
setuptoolsusite(
ukeyudictufromkeysu
_get_metadataunormalize_pathulocationusysumodulesu_namespace_packagesugetattruNoneu
startswithu
issue_warning(uselfunspulocumodnameufn((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyucheck_version_conflictt	s"u#Distribution.check_version_conflictcCs<y|jWn*tk
r7tdt|��dSYnXdS(NuUnbuilt egg for FT(uversionu
ValueErroru
issue_warningurepruFalseuTrue(uself((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuhas_version�	s
	uDistribution.has_versioncKsMx*dD]"}|j|t||d	��qW|jd|j�|j|�S(
u@Copy this distribution, substituting in any changed keyword argsuproject_nameuversionu
py_versionuplatformulocationu
precedenceumetadata(uproject_nameuversionu
py_versionuplatformulocationu
precedenceN(u
setdefaultugetattruNoneu	_provideru	__class__(uselfukwuattr((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuclone�	s
 uDistribution.clonecCsdd�|jD�S(NcSsg|]}|r|�qS(((u.0udep((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
<listcomp>�	s	u'Distribution.extras.<locals>.<listcomp>(u_dep_map(uself((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuextras�	suDistribution.extrasN()u__name__u
__module__u__qualname__u__doc__uPKG_INFOuNoneuPY_MAJORuEGG_DISTu__init__uclassmethodu
from_locationupropertyuhashcmpu__hash__u__lt__u__le__u__gt__u__ge__u__eq__u__ne__ukeyuparsed_versionuversionu_dep_mapurequiresu
_get_metadatauactivateuegg_nameu__repr__u__str__u__getattr__u
from_filenameuas_requirementuload_entry_pointu
get_entry_mapuget_entry_infou	insert_onucheck_version_conflictuhas_versionucloneuextras(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuDistribution�sL		
	
'
cBsk|EeZdZdZdZejd�Zedd��Z	edd��Z
dd	�Zd
d�ZdS(
uDistInfoDistributionuGWrap an actual or potential sys.path entry w/metadata, .dist-info styleuMETADATAu([\(,])\s*(\d.*?)\s*([,\)])cCs\y|jSWnJtk
rWddlm}|�j|j|j��|_|jSYnXdS(uParse and cache metadatai(uParserN(u	_pkg_infouAttributeErroruemail.parseruParseruparsestruget_metadatauPKG_INFO(uselfuParser((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_parsed_pkg_info�	s
!u%DistInfoDistribution._parsed_pkg_infocCs:y|jSWn(tk
r5|j�|_|jSYnXdS(N(u_DistInfoDistribution__dep_mapuAttributeErroru_compute_dependencies(uself((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_dep_map�	s

uDistInfoDistribution._dep_mapcCsy|jdd�dg}|dj�}|dj�}tj|jd|�}|jdd�jdd�}||fS(u�Convert 'Foobar (1); baz' to ('Foobar ==1', 'baz')
        Split environment marker, add == prefix to version specifiers as
        necessary, and remove parenthesis.
        u;iuiu\1==\2\3u(u)(usplitustripureusubuEQEQureplace(uselfu
requires_distupartsudistversumark((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_preparse_requirement�	su*DistInfoDistribution._preparse_requirementc
sddlm}igd6}|_g�xc|jjd�pBgD]I}|j|�\}}tt|��}||�|_	�j
|�qCW�fdd�}t|d��}|dj|�xR|jjd�p�gD]8}	t
|	j��}	tt||	��|�||	<q�W|S(u+Recompute this distribution's dependencies.i(ucompileu
Requires-Distc3s6x/�D]'}|jdi|d6�r|VqqWdS(Nuoverrideuextra(u	marker_fn(uextraureq(ureqs(u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyureqs_for_extra�	s
uBDistInfoDistribution._compute_dependencies.<locals>.reqs_for_extrauProvides-ExtraN(upip._vendor._markerlibucompileuNoneu_DistInfoDistribution__dep_mapu_parsed_pkg_infouget_allu_preparse_requirementunextuparse_requirementsu	marker_fnuappendu	frozensetuextendu
safe_extraustripulist(
uselfucompile_markerudmurequdistversumarkuparsedureqs_for_extraucommonuextra((ureqsu2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_compute_dependencies�	s$u*DistInfoDistribution._compute_dependenciesN(
u__name__u
__module__u__qualname__u__doc__uPKG_INFOureucompileuEQEQupropertyu_parsed_pkg_infou_dep_mapu_preparse_requirementu_compute_dependencies(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuDistInfoDistribution�	s
uDistInfoDistributionu.eggu	.egg-infou
.dist-infoc
Os|d}t�}y-x&tj|�j|kr:|d7}qWWntk
rPYnXddlm}|d|d||�dS(Nii(uwarnu
stacklevel(uglobalsusysu	_getframeu	f_globalsu
ValueErroruwarningsuwarn(uargsukwuleveluguwarn((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
issue_warning�	s	
u
issue_warningc#stt|����fdd�}x��D]�}t|�}|sUtd|��n|jd�}|j�}g}t||�}|r�|j�}|tt||dd�\}}}n|tt	||dd�\}}}dd	�|D�}t
|||�Vq+Wd
S(
u�Yield ``Requirement`` objects for each specification in `strs`

    `strs` must be an instance of ``basestring``, or a (possibly-nested)
    iterable thereof.
    csLg}x|||�st||�rayt��}d}Wqatk
r]td��YqaXn|||�}|s�td|d|d||d���n|j|j|��|j�}t||�}|r�|j�}q	|||�s	td|d||d���q	q	W|||�}|r?|j�}n|||fS(Niu+\ must not appear on the last nonblank lineu	Expected u inuatuExpected ',' or end-of-list in(uCONTINUEunextu
StopIterationu
ValueErroruappendugroupuenduCOMMA(uITEMu
TERMINATORulineupugroupsu	item_nameuitemsumatch(ulines(u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu	scan_list�	s0

*#u%parse_requirements.<locals>.scan_listuMissing distribution speciu'extra' nameiuversion speccSs(g|]\}}|t|�f�qS((usafe_version(u.0uopuval((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
<listcomp>.
s	u&parse_requirements.<locals>.<listcomp>N(i(ii(uiteruyield_linesuDISTROu
ValueErrorugroupuenduOBRACKETuCBRACKETuVERSIONuLINE_ENDuRequirement(ustrsu	scan_listulineumatchuproject_nameupuextrasuspecs((ulinesu2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuparse_requirements�	s"!
$$cCsAdd�|D�}|j�dd�|D�|ddd�<dS(NcSsg|]}|j|f�qS((uhashcmp(u.0udist((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
<listcomp>3
s	u_sort_dists.<locals>.<listcomp>cSsg|]\}}|�qS(((u.0uhcud((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
<listcomp>5
s	ii����(usort(udistsutmp((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_sort_dists2
s
u_sort_distscBsn|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Ze	d
d��Z
dS(uRequirementcCs�|t|�|_}||j�|_|_dd�|D�}|j�dd�|D�|_|ttt	|��|_
|_|jtdd�|D��t|j�f|_
t|j
�|_dS(u>DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!cSs2g|](\}}t|�t|||f�qS((u
parse_versionu
state_machine(u.0uopuv((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
<listcomp>=
s	u(Requirement.__init__.<locals>.<listcomp>cSs(g|]\}}}}||f�qS(((u.0uparsedutransuopuver((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
<listcomp>?
s	cSs(g|]\}}}}||f�qS(((u.0uparsedutransuopuver((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
<listcomp>B
s	N(u	safe_nameuunsafe_nameuloweruproject_nameukeyusortuspecsutupleumapu
safe_extrauindexuextrasu	frozensetuhashCmpuhashu_Requirement__hash(uselfuproject_nameuspecsuextrasuindex((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__init__9
s
"uRequirement.__init__cCsXdjdd�|jD��}dj|j�}|rDd|}nd|j||fS(Nu,cSsg|]}dj|��qS(u(ujoin(u.0us((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
<listcomp>H
s	u'Requirement.__str__.<locals>.<listcomp>u[%s]u%s%s%s(ujoinuspecsuextrasuproject_name(uselfuspecsuextras((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__str__G
s

uRequirement.__str__cCst|t�o|j|jkS(N(u
isinstanceuRequirementuhashCmp(uselfuother((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__eq__M
suRequirement.__eq__c	Cst|t�r=|j|jkr%dS|jr[|j}q[nt|t�r[t|�}nd}dd�}x�|jD]{\}}}}||||�}|dkr�dS|dkr�dS|dkr�d}qw|dks�|dkrwd}qwqwW|dkrd}n|S(	NcSs||k||kS(N((uaub((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu<lambda>W
su*Requirement.__contains__.<locals>.<lambda>uFuTu+u-FT(
u
isinstanceuDistributionukeyuFalseuindexuparsed_versionu
basestringu
parse_versionuNoneuTrue(	uselfuitemulastucompareuparsedutransuopuveruaction((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__contains__P
s,		
	uRequirement.__contains__cCs|jS(N(u_Requirement__hash(uself((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__hash__d
suRequirement.__hash__cCsdt|�S(NuRequirement.parse(%r)(ustr(uself((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu__repr__g
suRequirement.__repr__cCsWtt|��}|rDt|�dkr2|dStd|��ntd|��dS(NiiuExpected only one requirementuNo requirements found(ulistuparse_requirementsulenu
ValueError(usureqs((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuparsei
suRequirement.parseN(u__name__u
__module__u__qualname__u__init__u__str__u__eq__u__contains__u__hash__u__repr__ustaticmethoduparse(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuRequirement8
su--Tu<uT-Tu<=uF+Fu>uT+Fu>=uT..u==uF++u!=cCs@t|t�s9Gdd�d|t�}|jdd�S|jS(u&Get an mro for a type or classic classcBs|EeZdZdS(u_get_mro.<locals>.clsN(u__name__u
__module__u__qualname__(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyucls�
suclsiN(u
isinstanceutypeuobjectu__mro__(ucls((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_get_mro}
su_get_mrocCsAx:tt|dt|���D]}||kr||SqWdS(u2Return an adapter factory for `ob` from `registry`u	__class__N(u_get_mrougetattrutype(uregistryuobut((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu
_find_adapter�
s%u
_find_adaptercCs8tjj|�}tjj|�s4tj|�ndS(u1Ensure that the parent directory of `path` existsN(uosupathudirnameuisdirumakedirs(upathudirname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyuensure_directory�
sccs�d}g}x�t|�D]|}|jd�r�|jd�rv|sI|rW||fVn|dd�j�}g}q�td|��q|j|�qW||fVdS(urSplit a string or iterable thereof into (section,content) pairs

    Each ``section`` is a stripped version of the section header ("[section]")
    and each ``content`` is a list of stripped lines excluding blank lines and
    comment-only lines.  If there are any such lines before the first section
    header, they're returned in a first ``section`` of ``None``.
    u[u]iuInvalid section headingNi����(uNoneuyield_linesu
startswithuendswithustripu
ValueErroruappend(ususectionucontentuline((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyusplit_sections�
s	cOsDddlm}tj}ztt_|||�SWd|t_XdS(Ni(umkstemp(utempfileumkstempuosuopenuos_open(uargsukwumkstempuold_open((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_mkstemp�
s		u_mkstempcCs@x9tt�D]+}|jd�s
tt|�||<q
q
WdS(Nu_(udiru_manageru
startswithugetattr(uguname((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu_initialize�
su_initializeuobjectcCs
|j�S(N(uactivate(udist((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu<lambda>�
s(�u__doc__usysuosutimeureuimpuzipfileu	zipimportuwarningsustatu	functoolsupkgutilutokenusymboluoperatoruplatformuget_importeruurlparseu
urlunparseuImportErroruurllib.parseu	frozensetu	NameErrorusetsuImmutableSetu
basestringunextu	cStringIOuStringIOuBytesIOustruiouNoneuexecfileuutimeumkdirurenameuunlinkuTrueu
WRITE_SUPPORTuFalseuopenuos_openuos.pathuisdirusplituversion_infouimplementationunameuimportlib._bootstrapu
_bootstrapuimportlib_bootstrapuparseru_bypass_ensure_directoryu_state_varsu_declare_stateu__getstate__u__setstate__u
_sget_dictu
_sset_dictu_sget_objectu_sset_objectu
_sget_noneu
_sset_noneuget_supported_platformu__all__u	ExceptionuResolutionErroruVersionConflictuDistributionNotFounduUnknownExtrau_provider_factoriesuversionuPY_MAJORuEGG_DISTuBINARY_DISTuSOURCE_DISTu
CHECKOUT_DISTuDEVELOP_DISTuregister_loader_typeuget_provideru_macosx_versu_macosx_archuget_build_platformucompileumacosVersionStringudarwinVersionStringuget_platformucompatible_platformsu
run_scripturun_mainuget_distributionuload_entry_pointu
get_entry_mapuget_entry_infouIMetadataProvideruIResourceProvideruobjectu
WorkingSetuEnvironmentuAvailableDistributionsuRuntimeErroruExtractionErroruResourceManageruget_default_cacheu	safe_nameusafe_versionu
safe_extrauto_filenameuMarkerEvaluationuis_invalid_markeruinvalid_markeruevaluate_markeruNullProvideruEggProvideruDefaultProviderutypeuSourceFileLoaderu
EmptyProvideruempty_providerubuild_zipmanifestuZipProvideruzipimporteruFileMetadatauPathMetadatauEggMetadatauregister_finderufind_distributionsufind_eggs_in_zipufind_nothingufind_on_pathuImpImporteru
FileFinderuregister_namespace_handleru
_handle_nsudeclare_namespaceufixup_namespace_packagesufile_ns_handlerunull_ns_handlerunormalize_pathu_normalize_cachedu_set_parent_nsuyield_linesumatchuLINE_ENDuCONTINUEuDISTROuVERSIONuCOMMAuOBRACKETuCBRACKETuMODULEuVERBOSEu
IGNORECASEuEGG_NAMEucomponent_reugetureplaceu_parse_version_partsu
parse_versionu
EntryPointu_remove_md5_fragmentuDistributionuDistInfoDistributionu_distributionImplu
issue_warninguparse_requirementsu_sort_distsuRequirementu
state_machineu_get_mrou
_find_adapteruensure_directoryusplit_sectionsu_mkstempu_manageru_initializeuglobalsu
_build_masteruworking_seturequireuiter_entry_pointsu	subscribeuadd_activation_listeneruentriesulistumapu	add_entryupath(((u2/tmp/pip-zej_zi-build/pip/_vendor/pkg_resources.pyu<module>s�




'

									1�Y��)
	�		c
	!�

( 

,)h	�!?
>:
	
					site-packages/pip/_vendor/__pycache__/six.cpython-33.pyc000064400000064611151733463570017174 0ustar00�
7�Re�[cA@sdZddlZddlZddlZdZdZejddkZejddkZer�e	fZ
efZe
fZe	ZeZejZn�efZ
eefZe
ejfZeZe	Zejjd�r�ed:�ZnWGd
d�de�Zyee��Wnek
r-ed<�ZYn
Xed>�Z[d
d�Zdd�ZGdd�de�Z Gdd�de �Z!Gdd�dej"�Z#Gdd�de �Z$Gdd�de#�Z%e$dddd�e$ddd d!d�e$d"ddd#d"�e$d$d%d d&d$�e$d'dd d(d'�e$d)d%d d*d)�e$d+d%d,d-�e$d.d%d/�e$ddd�e$d0d0d1�e$d*d%d d*d)�e$d2dd d3d2�e$d4ddd5d4�e!d d%�e!d6d7�e!d8d9�e!d:d;d<�e!d=d>d?�e!d@dAdB�e!dCdDdE�e!dFdGdH�e!dIdJdK�e!dLdMdN�e!dOdPdQ�e!dRdSdT�e!dUdUdV�e!dWdWdV�e!dXdXdV�e!dYdYdZ�e!d[d\�e!d]d^�e!d_d`�e!dadbda�e!dcdd�e!dedfdg�e!dhdidj�e!dkdldm�e!dndodp�e!dqdrds�e!dtdudv�e!dwdxdy�e!dzd{d|�e!d}d~d�e!d�d�d��e!d�d�dj�e!d�d�d��e!d�d�d��e!d�d�dp�e!d�e&d�d��e!d�e&d�d��e!d�e&d�e&d��e!d�d�d��e!d�d�d��e!d�d�d��e!d�d��g7Z'xKe'D]CZ(e)e%e(j*e(�e+e(e!�r:e(ej,e&d�e(j*<q:q:W[(e'e%_'e%e&d��Z-ej,e&d�<Gd�d��d�e#�Z.e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��gZ/x!e/D]Z(e)e.e(j*e(�q�W[(e/e._'e.e&d��ej,e&d�<ej,e&d�<Gd�d��d�e#�Z0e$d�d�d��e$d�d�d��e$d�d�d��gZ1x!e1D]Z(e)e0e(j*e(�qbW[(e1e0_'e0e&d��ej,e&d�<ej,e&d�<Gd�d��d�e#�Z2e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��g!Z3x!e3D]Z(e)e2e(j*e(�q�	W[(e3e2_'e2e&d��ej,e&d�<ej,e&d�<Gd�d��d�e#�Z4e$d�d�d��e$d�d�d��e$d�d�d��e$d�d�d��gZ5x!e5D]Z(e)e4e(j*e(�qy
W[(e5e4_'e4e&d��ej,e&d�<ej,e&d�<Gd�d��d�e#�Z6e$d�d�d��gZ7x!e7D]Z(e)e6e(j*e(�q�
W[(e7e6_'e6e&d��ej,e&d�<ej,e&d�<Gd�d��d�ej"�Z8e8e&d��ej,e&d�<d�d��Z9d�d��Z:er�d�Z;d�Z<d�Z=d�Z>d�Z?d�Z@d�ZAd�ZBd�ZCd�ZDn<d�Z;dZ<dZ=dZ>dZ?dZ@dZAdZBdZCdZDy
eEZFWneGk
rHd	d
�ZFYnXeFZEy
eHZHWneGk
rydd�ZHYnXer�d
d�ZIejJZKeZLn4dd�ZIdd�ZKGdd�de�ZLeHZHeeId�ejMe;�ZNejMe<�ZOejMe=�ZPejMe>�ZQejMe?�ZRejMe@�ZSdd�ZTdd�ZUdd�ZVdd�ZWerdd�ZXdd�ZYeZZ[ejddkr�
dd�Z\nej]ddd �Z\ej^d�Z_ej`ZaebZcddldZdedjeZeedjfZfnad!d�ZXd"d�ZYe[Z[eZZ\d#d$�Z_d%d&�Zad'd(�ZcddleZeeejeZeZfeeXd)�eeYd*�er�ege-jhd+�Zidd,d-�Zknddd.d/�Zieid0�ege-jhd1d�Zleldkr�d2d3�Zlneekd4�d5d6�Zmd7d8�ZndS(?u6Utilities for writing code that runs on Python 2 and 3iNu'Benjamin Peterson <benjamin@python.org>u1.6.1iiujavaiicBs |EeZdZdd�ZdS(uXcCsdS(Niil((uself((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu__len__8su	X.__len__N(u__name__u
__module__u__qualname__u__len__(u
__locals__((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyuX7suXi?cCs
||_dS(u Add documentation to a function.N(u__doc__(ufuncudoc((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu_add_docEsu_add_doccCst|�tj|S(u7Import module, returning the module after the last dot.(u
__import__usysumodules(uname((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu_import_moduleJs
u_import_modulecBs,|EeZdZdd�Zdd�ZdS(u
_LazyDescrcCs
||_dS(N(uname(uselfuname((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu__init__Rsu_LazyDescr.__init__cCsby|j�}Wn%tk
r7td|j��YnXt||j|�t|j|j�|S(Nu%s could not be imported (u_resolveuImportErroruAttributeErrorunameusetattrudelattru	__class__(uselfuobjutpuresult((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu__get__Us
u_LazyDescr.__get__N(u__name__u
__module__u__qualname__u__init__u__get__(u
__locals__((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu
_LazyDescrPsu
_LazyDescrcsA|EeZdZd�fdd�Zdd�Zdd�Z�S(uMovedModulecsJtt|�j|�tr=|dkr1|}n||_n	||_dS(N(usuperuMovedModuleu__init__uPY3uNoneumod(uselfunameuoldunew(u	__class__(u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu__init__cs	uMovedModule.__init__cCs
t|j�S(N(u_import_moduleumod(uself((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu_resolvelsuMovedModule._resolvec
Cs�|dkr-|jtjkr-t|��ny|j�}Wntk
r]t|��YnXt||�}t|||�|S(Nu__file__u__name__u__path__(u__file__u__name__u__path__(umodusysumodulesuAttributeErroru_resolveuImportErrorugetattrusetattr(uselfuattru_moduleuvalue((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu__getattr__os

uMovedModule.__getattr__N(u__name__u
__module__u__qualname__uNoneu__init__u_resolveu__getattr__(u
__locals__((u	__class__u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyuMovedModuleas	uMovedModulecs8|EeZdZ�fdd�Zdd�ZgZ�S(u_LazyModulecs)tt|�j|�|jj|_dS(N(usuperu_LazyModuleu__init__u	__class__u__doc__(uselfuname(u	__class__(u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu__init__�su_LazyModule.__init__cCs*ddg}|dd�|jD�7}|S(Nu__doc__u__name__cSsg|]}|j�qS((uname(u.0uattr((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu
<listcomp>�s	u'_LazyModule.__dir__.<locals>.<listcomp>(u_moved_attributes(uselfuattrs((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu__dir__�su_LazyModule.__dir__(u__name__u
__module__u__qualname__u__init__u__dir__u_moved_attributes(u
__locals__((u	__class__u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu_LazyModule�su_LazyModulecs8|EeZdZdd�fdd�Zdd�Z�S(uMovedAttributecs�tt|�j|�trp|dkr1|}n||_|dkrd|dkr[|}qd|}n||_n'||_|dkr�|}n||_dS(N(usuperuMovedAttributeu__init__uPY3uNoneumoduattr(uselfunameuold_modunew_moduold_attrunew_attr(u	__class__(u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu__init__�s						uMovedAttribute.__init__cCst|j�}t||j�S(N(u_import_moduleumodugetattruattr(uselfumodule((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu_resolve�suMovedAttribute._resolveN(u__name__u
__module__u__qualname__uNoneu__init__u_resolve(u
__locals__((u	__class__u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyuMovedAttribute�suMovedAttributecBs|EeZdZdZdS(u_MovedItemsuLazy loading of moved objectsN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu_MovedItems�su_MovedItemsu	cStringIOuiouStringIOufilteru	itertoolsubuiltinsuifilterufilterfalseuifilterfalseuinputu__builtin__u	raw_inputumapuimapurangeuxrangeu
reload_moduleuimpureloadureduceu	functoolsu
UserStringucollectionsuzipuizipuzip_longestuizip_longestuconfigparseruConfigParserucopyregucopy_regudbm_gnuugdbmudbm.gnuuhttp_cookiejaru	cookielibuhttp.cookiejaruhttp_cookiesuCookieuhttp.cookiesu
html_entitiesuhtmlentitydefsu
html.entitiesuhtml_parseru
HTMLParseruhtml.parseruhttp_clientuhttplibuhttp.clientuemail_mime_multipartuemail.MIMEMultipartuemail.mime.multipartuemail_mime_textuemail.MIMETextuemail.mime.textuemail_mime_baseuemail.MIMEBaseuemail.mime.baseuBaseHTTPServeruhttp.serveru
CGIHTTPServeruSimpleHTTPServerucPickleupickleuqueueuQueueureprlibureprusocketserveruSocketServeru_threaduthreadutkinteruTkinterutkinter_dialoguDialogutkinter.dialogutkinter_filedialogu
FileDialogutkinter.filedialogutkinter_scrolledtextuScrolledTextutkinter.scrolledtextutkinter_simpledialoguSimpleDialogutkinter.simpledialogutkinter_tixuTixutkinter.tixutkinter_ttkuttkutkinter.ttkutkinter_constantsuTkconstantsutkinter.constantsutkinter_dnduTkdndutkinter.dndutkinter_colorchooserutkColorChooserutkinter.colorchooserutkinter_commondialogutkCommonDialogutkinter.commondialogutkinter_tkfiledialogutkFileDialogutkinter_fontutkFontutkinter.fontutkinter_messageboxutkMessageBoxutkinter.messageboxutkinter_tksimpledialogutkSimpleDialoguurllib_parseu.moves.urllib_parseuurllib.parseuurllib_erroru.moves.urllib_erroruurllib.erroruurllibu
.moves.urllibuurllib_robotparserurobotparseruurllib.robotparseru
xmlrpc_clientu	xmlrpclibu
xmlrpc.clientu
xmlrpc_serveru
xmlrpc.serveruwinregu_winregu.moves.u.movescBs|EeZdZdZdS(uModule_six_moves_urllib_parseu7Lazy loading of moved objects in six.moves.urllib_parseN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyuModule_six_moves_urllib_parse�suModule_six_moves_urllib_parseuParseResultuurlparseuSplitResultuparse_qsu	parse_qslu	urldefraguurljoinuurlsplitu
urlunparseu
urlunsplituquoteu
quote_plusuunquoteuunquote_plusu	urlencodeu
splitqueryu.moves.urllib.parsecBs|EeZdZdZdS(uModule_six_moves_urllib_erroru7Lazy loading of moved objects in six.moves.urllib_errorN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyuModule_six_moves_urllib_errorsuModule_six_moves_urllib_erroruURLErroruurllib2u	HTTPErroruContentTooShortErroru.moves.urllib.errorcBs|EeZdZdZdS(uModule_six_moves_urllib_requestu9Lazy loading of moved objects in six.moves.urllib_requestN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyuModule_six_moves_urllib_request+suModule_six_moves_urllib_requestuurlopenuurllib.requestuinstall_openerubuild_openerupathname2urluurl2pathnameu
getproxiesuRequestuOpenerDirectoruHTTPDefaultErrorHandleruHTTPRedirectHandleruHTTPCookieProcessoruProxyHandleruBaseHandleruHTTPPasswordMgruHTTPPasswordMgrWithDefaultRealmuAbstractBasicAuthHandleruHTTPBasicAuthHandleruProxyBasicAuthHandleruAbstractDigestAuthHandleruHTTPDigestAuthHandleruProxyDigestAuthHandleruHTTPHandleruHTTPSHandleruFileHandleru
FTPHandleruCacheFTPHandleruUnknownHandleruHTTPErrorProcessoruurlretrieveu
urlcleanupu	URLopeneruFancyURLopeneruproxy_bypassu.moves.urllib.requestu.moves.urllib_requestcBs|EeZdZdZdS(u Module_six_moves_urllib_responseu:Lazy loading of moved objects in six.moves.urllib_responseN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu Module_six_moves_urllib_response[su Module_six_moves_urllib_responseuaddbaseuurllib.responseuaddclosehookuaddinfou
addinfourlu.moves.urllib.responseu.moves.urllib_responsecBs|EeZdZdZdS(u#Module_six_moves_urllib_robotparseru=Lazy loading of moved objects in six.moves.urllib_robotparserN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu#Module_six_moves_urllib_robotparsernsu#Module_six_moves_urllib_robotparseruRobotFileParseru.moves.urllib.robotparseru.moves.urllib_robotparsercBs{|EeZdZdZejedZejedZejedZejedZ	ejedZ
dd�Zd	S(
uModule_six_moves_urllibuICreate a six.moves.urllib namespace that resembles the Python 3 namespaceu.moves.urllib_parseu.moves.urllib_erroru.moves.urllib_requestu.moves.urllib_responseu.moves.urllib_robotparsercCsdddddgS(Nuparseuerrorurequesturesponseurobotparser((uself((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu__dir__�suModule_six_moves_urllib.__dir__N(u__name__u
__module__u__qualname__u__doc__usysumodulesuparseuerrorurequesturesponseurobotparseru__dir__(u
__locals__((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyuModule_six_moves_urllib~suModule_six_moves_urllibcCstt|j|�dS(uAdd an item to six.moves.N(usetattru_MovedItemsuname(umove((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyuadd_move�suadd_movecCs`ytt|�WnHtk
r[ytj|=Wn%tk
rVtd|f��YnXYnXdS(uRemove item from six.moves.uno such move, %rN(udelattru_MovedItemsuAttributeErrorumovesu__dict__uKeyError(uname((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyuremove_move�s

uremove_moveu__func__u__self__u__closure__u__code__u__defaults__u__globals__ukeysuvaluesuitemsulistsuim_funcuim_selfufunc_closureu	func_codeu
func_defaultsufunc_globalsuiterkeysu
itervaluesu	iteritemsu	iterlistscCs
|j�S(N(unext(uit((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyuadvance_iterator�suadvance_iteratorcCs tdd�t|�jD��S(Ncss|]}d|jkVqdS(u__call__N(u__dict__(u.0uklass((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu	<genexpr>�sucallable.<locals>.<genexpr>(uanyutypeu__mro__(uobj((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyucallable�sucallablecCs|S(N((uunbound((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyuget_unbound_function�suget_unbound_functioncCs|jS(N(uim_func(uunbound((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyuget_unbound_function�scCstj|||j�S(N(utypesu
MethodTypeu	__class__(ufuncuobj((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyucreate_bound_method�sucreate_bound_methodcBs |EeZdZdd�ZdS(uIteratorcCst|�j|�S(N(utypeu__next__(uself((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyunext�su
Iterator.nextN(u__name__u
__module__u__qualname__unext(u
__locals__((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyuIterator�suIteratoru3Get the function out of a possibly unbound functioncKstt|t�|��S(u1Return an iterator over the keys of a dictionary.(uiterugetattru	_iterkeys(udukw((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyuiterkeys�scKstt|t�|��S(u3Return an iterator over the values of a dictionary.(uiterugetattru_itervalues(udukw((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu
itervalues�scKstt|t�|��S(u?Return an iterator over the (key, value) pairs of a dictionary.(uiterugetattru
_iteritems(udukw((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu	iteritems�scKstt|t�|��S(uBReturn an iterator over the (key, [values]) pairs of a dictionary.(uiterugetattru
_iterlists(udukw((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu	iterlists�scCs
|jd�S(Nulatin-1(uencode(us((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyub�subcCs|S(N((us((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyuu�suucCs
t|f�S(N(ubytes(ui((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyuint2bytesuint2byteuto_bytesubigcCs|S(N((us((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyubscCst|jdd�d�S(Nu\\u\\\\uunicode_escape(uunicodeureplace(us((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyuuscCst|d�S(Ni(uord(ubs((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyubyte2intsubyte2intcCst||�S(N(uord(ubufui((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu
indexbytessu
indexbytescCsdd�|D�S(Ncss|]}t|�VqdS(N(uord(u.0ubyte((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu	<genexpr>suiterbytes.<locals>.<genexpr>((ubuf((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu	iterbytessu	iterbytesuByte literaluText literaluexeccCs+|j|k	r!|j|��n|�dS(N(u
__traceback__uwith_traceback(utpuvalueutb((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyureraise#sureraisecCse|dkrBtjd�}|j}|dkr<|j}n~n|dkrW|}ntd�dS(uExecute code in a namespace.iuexec _code_ in _globs_, _locs_N(uNoneusysu	_getframeu	f_globalsuf_localsuexec(u_code_u_globs_u_locs_uframe((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyuexec_)s		uexec_u9def reraise(tp, value, tb=None):
    raise tp, value, tb
uprintc
s�|jdtj���dkr%dS�fdd�}d}|jdd�}|dk	r�t|t�rsd
}q�t|t�s�t	d��q�n|jdd�}|dk	r�t|t�r�d
}q�t|t�s�t	d��q�n|rt	d	��n|s3x*|D]}t|t�r
d
}Pq
q
Wn|rTtd
�}td�}nd
}d}|dkru|}n|dkr�|}nx7t
|�D])\}	}|	r�||�n||�q�W||�dS(u4The new-style print function for Python 2.4 and 2.5.ufileNcs�t|t�st|�}nt�t�r�t|t�r��jdk	r�t�dd�}|dkrrd}n|j�j|�}n�j	|�dS(Nuerrorsustrict(
u
isinstanceu
basestringustrufileuunicodeuencodinguNoneugetattruencodeuwrite(udatauerrors(ufp(u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyuwriteBs	uprint_.<locals>.writeusepusep must be None or a stringuenduend must be None or a stringu$invalid keyword arguments to print()u
u FT(upopusysustdoutuNoneuFalseu
isinstanceuunicodeuTrueustru	TypeErroru	enumerate(
uargsukwargsuwriteuwant_unicodeusepuenduargunewlineuspaceui((ufpu(/tmp/pip-zej_zi-build/pip/_vendor/six.pyuprint_=sL		
		
uprint_uReraise an exception.cGs|d|i�S(u%Create a base class with a metaclass.uNewBase((umetaubases((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyuwith_metaclassusuwith_metaclasscs�fdd�}|S(u6Class decorator for creating a class with a metaclass.cs�|jj�}|jdd�|jdd�|jd�}|dk	r�t|t�re|g}nx|D]}|j|�qlWn�|j|j|�S(Nu__dict__u__weakref__u	__slots__(	u__dict__ucopyupopuNoneugetu
isinstanceustru__name__u	__bases__(uclsu	orig_varsuslotsu	slots_var(u	metaclass(u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyuwrapper{s
uadd_metaclass.<locals>.wrapper((u	metaclassuwrapper((u	metaclassu(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu
add_metaclassysu
add_metaclassli���li���ll����(ou__doc__uoperatorusysutypesu
__author__u__version__uversion_infouPY2uPY3ustrustring_typesuintu
integer_typesutypeuclass_typesu	text_typeubytesubinary_typeumaxsizeuMAXSIZEu
basestringulongu	ClassTypeuunicodeuplatformu
startswithuobjectuXulenu
OverflowErroru_add_docu_import_moduleu
_LazyDescruMovedModuleu
ModuleTypeu_LazyModuleuMovedAttributeu_MovedItemsu__name__u_moved_attributesuattrusetattrunameu
isinstanceumodulesumovesuModule_six_moves_urllib_parseu_urllib_parse_moved_attributesuModule_six_moves_urllib_erroru_urllib_error_moved_attributesuModule_six_moves_urllib_requestu _urllib_request_moved_attributesu Module_six_moves_urllib_responseu!_urllib_response_moved_attributesu#Module_six_moves_urllib_robotparseru$_urllib_robotparser_moved_attributesuModule_six_moves_urllibuadd_moveuremove_moveu
_meth_funcu
_meth_selfu
_func_closureu
_func_codeu_func_defaultsu
_func_globalsu	_iterkeysu_itervaluesu
_iteritemsu
_iterlistsunextuadvance_iteratoru	NameErrorucallableuget_unbound_functionu
MethodTypeucreate_bound_methoduIteratoru
attrgetteruget_method_functionuget_method_selfuget_function_closureuget_function_codeuget_function_defaultsuget_function_globalsuiterkeysu
itervaluesu	iteritemsu	iterlistsubuuuchruunichruint2byteumethodcalleru
itemgetterubyte2intugetitemu
indexbytesuiteru	iterbytesuiouStringIOuBytesIOugetattrubuiltinsuexec_uNoneureraiseuprint_uwith_metaclassu
add_metaclass(((u(/tmp/pip-zej_zi-build/pip/_vendor/six.pyu<module>s*				
$			
	
	*
	*
	*
	*
	*	



				



5
site-packages/pip/_vendor/six.py000064400000055646151733463570012723 0ustar00"""Utilities for writing code that runs on Python 2 and 3"""

# Copyright (c) 2010-2014 Benjamin Peterson
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

import operator
import sys
import types

__author__ = "Benjamin Peterson <benjamin@python.org>"
__version__ = "1.6.1"


# Useful for very coarse version differentiation.
PY2 = sys.version_info[0] == 2
PY3 = sys.version_info[0] == 3

if PY3:
    string_types = str,
    integer_types = int,
    class_types = type,
    text_type = str
    binary_type = bytes

    MAXSIZE = sys.maxsize
else:
    string_types = basestring,
    integer_types = (int, long)
    class_types = (type, types.ClassType)
    text_type = unicode
    binary_type = str

    if sys.platform.startswith("java"):
        # Jython always uses 32 bits.
        MAXSIZE = int((1 << 31) - 1)
    else:
        # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
        class X(object):
            def __len__(self):
                return 1 << 31
        try:
            len(X())
        except OverflowError:
            # 32-bit
            MAXSIZE = int((1 << 31) - 1)
        else:
            # 64-bit
            MAXSIZE = int((1 << 63) - 1)
        del X


def _add_doc(func, doc):
    """Add documentation to a function."""
    func.__doc__ = doc


def _import_module(name):
    """Import module, returning the module after the last dot."""
    __import__(name)
    return sys.modules[name]


class _LazyDescr(object):

    def __init__(self, name):
        self.name = name

    def __get__(self, obj, tp):
        try:
            result = self._resolve()
        except ImportError:
            # See the nice big comment in MovedModule.__getattr__.
            raise AttributeError("%s could not be imported " % self.name)
        setattr(obj, self.name, result) # Invokes __set__.
        # This is a bit ugly, but it avoids running this again.
        delattr(obj.__class__, self.name)
        return result


class MovedModule(_LazyDescr):

    def __init__(self, name, old, new=None):
        super(MovedModule, self).__init__(name)
        if PY3:
            if new is None:
                new = name
            self.mod = new
        else:
            self.mod = old

    def _resolve(self):
        return _import_module(self.mod)

    def __getattr__(self, attr):
        # It turns out many Python frameworks like to traverse sys.modules and
        # try to load various attributes. This causes problems if this is a
        # platform-specific module on the wrong platform, like _winreg on
        # Unixes. Therefore, we silently pretend unimportable modules do not
        # have any attributes. See issues #51, #53, #56, and #63 for the full
        # tales of woe.
        #
        # First, if possible, avoid loading the module just to look at __file__,
        # __name__, or __path__.
        if (attr in ("__file__", "__name__", "__path__") and
            self.mod not in sys.modules):
            raise AttributeError(attr)
        try:
            _module = self._resolve()
        except ImportError:
            raise AttributeError(attr)
        value = getattr(_module, attr)
        setattr(self, attr, value)
        return value


class _LazyModule(types.ModuleType):

    def __init__(self, name):
        super(_LazyModule, self).__init__(name)
        self.__doc__ = self.__class__.__doc__

    def __dir__(self):
        attrs = ["__doc__", "__name__"]
        attrs += [attr.name for attr in self._moved_attributes]
        return attrs

    # Subclasses should override this
    _moved_attributes = []


class MovedAttribute(_LazyDescr):

    def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
        super(MovedAttribute, self).__init__(name)
        if PY3:
            if new_mod is None:
                new_mod = name
            self.mod = new_mod
            if new_attr is None:
                if old_attr is None:
                    new_attr = name
                else:
                    new_attr = old_attr
            self.attr = new_attr
        else:
            self.mod = old_mod
            if old_attr is None:
                old_attr = name
            self.attr = old_attr

    def _resolve(self):
        module = _import_module(self.mod)
        return getattr(module, self.attr)



class _MovedItems(_LazyModule):
    """Lazy loading of moved objects"""


_moved_attributes = [
    MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
    MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
    MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"),
    MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
    MovedAttribute("map", "itertools", "builtins", "imap", "map"),
    MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
    MovedAttribute("reload_module", "__builtin__", "imp", "reload"),
    MovedAttribute("reduce", "__builtin__", "functools"),
    MovedAttribute("StringIO", "StringIO", "io"),
    MovedAttribute("UserString", "UserString", "collections"),
    MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
    MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
    MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"),

    MovedModule("builtins", "__builtin__"),
    MovedModule("configparser", "ConfigParser"),
    MovedModule("copyreg", "copy_reg"),
    MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
    MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
    MovedModule("http_cookies", "Cookie", "http.cookies"),
    MovedModule("html_entities", "htmlentitydefs", "html.entities"),
    MovedModule("html_parser", "HTMLParser", "html.parser"),
    MovedModule("http_client", "httplib", "http.client"),
    MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
    MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
    MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
    MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
    MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
    MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
    MovedModule("cPickle", "cPickle", "pickle"),
    MovedModule("queue", "Queue"),
    MovedModule("reprlib", "repr"),
    MovedModule("socketserver", "SocketServer"),
    MovedModule("_thread", "thread", "_thread"),
    MovedModule("tkinter", "Tkinter"),
    MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
    MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
    MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
    MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
    MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
    MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"),
    MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
    MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
    MovedModule("tkinter_colorchooser", "tkColorChooser",
                "tkinter.colorchooser"),
    MovedModule("tkinter_commondialog", "tkCommonDialog",
                "tkinter.commondialog"),
    MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
    MovedModule("tkinter_font", "tkFont", "tkinter.font"),
    MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
    MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
                "tkinter.simpledialog"),
    MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"),
    MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"),
    MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"),
    MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
    MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
    MovedModule("xmlrpc_server", "xmlrpclib", "xmlrpc.server"),
    MovedModule("winreg", "_winreg"),
]
for attr in _moved_attributes:
    setattr(_MovedItems, attr.name, attr)
    if isinstance(attr, MovedModule):
        sys.modules[__name__ + ".moves." + attr.name] = attr
del attr

_MovedItems._moved_attributes = _moved_attributes

moves = sys.modules[__name__ + ".moves"] = _MovedItems(__name__ + ".moves")


class Module_six_moves_urllib_parse(_LazyModule):
    """Lazy loading of moved objects in six.moves.urllib_parse"""


_urllib_parse_moved_attributes = [
    MovedAttribute("ParseResult", "urlparse", "urllib.parse"),
    MovedAttribute("SplitResult", "urlparse", "urllib.parse"),
    MovedAttribute("parse_qs", "urlparse", "urllib.parse"),
    MovedAttribute("parse_qsl", "urlparse", "urllib.parse"),
    MovedAttribute("urldefrag", "urlparse", "urllib.parse"),
    MovedAttribute("urljoin", "urlparse", "urllib.parse"),
    MovedAttribute("urlparse", "urlparse", "urllib.parse"),
    MovedAttribute("urlsplit", "urlparse", "urllib.parse"),
    MovedAttribute("urlunparse", "urlparse", "urllib.parse"),
    MovedAttribute("urlunsplit", "urlparse", "urllib.parse"),
    MovedAttribute("quote", "urllib", "urllib.parse"),
    MovedAttribute("quote_plus", "urllib", "urllib.parse"),
    MovedAttribute("unquote", "urllib", "urllib.parse"),
    MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
    MovedAttribute("urlencode", "urllib", "urllib.parse"),
    MovedAttribute("splitquery", "urllib", "urllib.parse"),
]
for attr in _urllib_parse_moved_attributes:
    setattr(Module_six_moves_urllib_parse, attr.name, attr)
del attr

Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes

sys.modules[__name__ + ".moves.urllib_parse"] = sys.modules[__name__ + ".moves.urllib.parse"] = Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse")


class Module_six_moves_urllib_error(_LazyModule):
    """Lazy loading of moved objects in six.moves.urllib_error"""


_urllib_error_moved_attributes = [
    MovedAttribute("URLError", "urllib2", "urllib.error"),
    MovedAttribute("HTTPError", "urllib2", "urllib.error"),
    MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
]
for attr in _urllib_error_moved_attributes:
    setattr(Module_six_moves_urllib_error, attr.name, attr)
del attr

Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes

sys.modules[__name__ + ".moves.urllib_error"] = sys.modules[__name__ + ".moves.urllib.error"] = Module_six_moves_urllib_error(__name__ + ".moves.urllib.error")


class Module_six_moves_urllib_request(_LazyModule):
    """Lazy loading of moved objects in six.moves.urllib_request"""


_urllib_request_moved_attributes = [
    MovedAttribute("urlopen", "urllib2", "urllib.request"),
    MovedAttribute("install_opener", "urllib2", "urllib.request"),
    MovedAttribute("build_opener", "urllib2", "urllib.request"),
    MovedAttribute("pathname2url", "urllib", "urllib.request"),
    MovedAttribute("url2pathname", "urllib", "urllib.request"),
    MovedAttribute("getproxies", "urllib", "urllib.request"),
    MovedAttribute("Request", "urllib2", "urllib.request"),
    MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
    MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
    MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
    MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
    MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
    MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
    MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
    MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
    MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
    MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
    MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
    MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
    MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
    MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
    MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
    MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
    MovedAttribute("FileHandler", "urllib2", "urllib.request"),
    MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
    MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
    MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
    MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
    MovedAttribute("urlretrieve", "urllib", "urllib.request"),
    MovedAttribute("urlcleanup", "urllib", "urllib.request"),
    MovedAttribute("URLopener", "urllib", "urllib.request"),
    MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
    MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
]
for attr in _urllib_request_moved_attributes:
    setattr(Module_six_moves_urllib_request, attr.name, attr)
del attr

Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes

sys.modules[__name__ + ".moves.urllib_request"] = sys.modules[__name__ + ".moves.urllib.request"] = Module_six_moves_urllib_request(__name__ + ".moves.urllib.request")


class Module_six_moves_urllib_response(_LazyModule):
    """Lazy loading of moved objects in six.moves.urllib_response"""


_urllib_response_moved_attributes = [
    MovedAttribute("addbase", "urllib", "urllib.response"),
    MovedAttribute("addclosehook", "urllib", "urllib.response"),
    MovedAttribute("addinfo", "urllib", "urllib.response"),
    MovedAttribute("addinfourl", "urllib", "urllib.response"),
]
for attr in _urllib_response_moved_attributes:
    setattr(Module_six_moves_urllib_response, attr.name, attr)
del attr

Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes

sys.modules[__name__ + ".moves.urllib_response"] = sys.modules[__name__ + ".moves.urllib.response"] = Module_six_moves_urllib_response(__name__ + ".moves.urllib.response")


class Module_six_moves_urllib_robotparser(_LazyModule):
    """Lazy loading of moved objects in six.moves.urllib_robotparser"""


_urllib_robotparser_moved_attributes = [
    MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
]
for attr in _urllib_robotparser_moved_attributes:
    setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
del attr

Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes

sys.modules[__name__ + ".moves.urllib_robotparser"] = sys.modules[__name__ + ".moves.urllib.robotparser"] = Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser")


class Module_six_moves_urllib(types.ModuleType):
    """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
    parse = sys.modules[__name__ + ".moves.urllib_parse"]
    error = sys.modules[__name__ + ".moves.urllib_error"]
    request = sys.modules[__name__ + ".moves.urllib_request"]
    response = sys.modules[__name__ + ".moves.urllib_response"]
    robotparser = sys.modules[__name__ + ".moves.urllib_robotparser"]

    def __dir__(self):
        return ['parse', 'error', 'request', 'response', 'robotparser']


sys.modules[__name__ + ".moves.urllib"] = Module_six_moves_urllib(__name__ + ".moves.urllib")


def add_move(move):
    """Add an item to six.moves."""
    setattr(_MovedItems, move.name, move)


def remove_move(name):
    """Remove item from six.moves."""
    try:
        delattr(_MovedItems, name)
    except AttributeError:
        try:
            del moves.__dict__[name]
        except KeyError:
            raise AttributeError("no such move, %r" % (name,))


if PY3:
    _meth_func = "__func__"
    _meth_self = "__self__"

    _func_closure = "__closure__"
    _func_code = "__code__"
    _func_defaults = "__defaults__"
    _func_globals = "__globals__"

    _iterkeys = "keys"
    _itervalues = "values"
    _iteritems = "items"
    _iterlists = "lists"
else:
    _meth_func = "im_func"
    _meth_self = "im_self"

    _func_closure = "func_closure"
    _func_code = "func_code"
    _func_defaults = "func_defaults"
    _func_globals = "func_globals"

    _iterkeys = "iterkeys"
    _itervalues = "itervalues"
    _iteritems = "iteritems"
    _iterlists = "iterlists"


try:
    advance_iterator = next
except NameError:
    def advance_iterator(it):
        return it.next()
next = advance_iterator


try:
    callable = callable
except NameError:
    def callable(obj):
        return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)


if PY3:
    def get_unbound_function(unbound):
        return unbound

    create_bound_method = types.MethodType

    Iterator = object
else:
    def get_unbound_function(unbound):
        return unbound.im_func

    def create_bound_method(func, obj):
        return types.MethodType(func, obj, obj.__class__)

    class Iterator(object):

        def next(self):
            return type(self).__next__(self)

    callable = callable
_add_doc(get_unbound_function,
         """Get the function out of a possibly unbound function""")


get_method_function = operator.attrgetter(_meth_func)
get_method_self = operator.attrgetter(_meth_self)
get_function_closure = operator.attrgetter(_func_closure)
get_function_code = operator.attrgetter(_func_code)
get_function_defaults = operator.attrgetter(_func_defaults)
get_function_globals = operator.attrgetter(_func_globals)


def iterkeys(d, **kw):
    """Return an iterator over the keys of a dictionary."""
    return iter(getattr(d, _iterkeys)(**kw))

def itervalues(d, **kw):
    """Return an iterator over the values of a dictionary."""
    return iter(getattr(d, _itervalues)(**kw))

def iteritems(d, **kw):
    """Return an iterator over the (key, value) pairs of a dictionary."""
    return iter(getattr(d, _iteritems)(**kw))

def iterlists(d, **kw):
    """Return an iterator over the (key, [values]) pairs of a dictionary."""
    return iter(getattr(d, _iterlists)(**kw))


if PY3:
    def b(s):
        return s.encode("latin-1")
    def u(s):
        return s
    unichr = chr
    if sys.version_info[1] <= 1:
        def int2byte(i):
            return bytes((i,))
    else:
        # This is about 2x faster than the implementation above on 3.2+
        int2byte = operator.methodcaller("to_bytes", 1, "big")
    byte2int = operator.itemgetter(0)
    indexbytes = operator.getitem
    iterbytes = iter
    import io
    StringIO = io.StringIO
    BytesIO = io.BytesIO
else:
    def b(s):
        return s
    # Workaround for standalone backslash
    def u(s):
        return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
    unichr = unichr
    int2byte = chr
    def byte2int(bs):
        return ord(bs[0])
    def indexbytes(buf, i):
        return ord(buf[i])
    def iterbytes(buf):
        return (ord(byte) for byte in buf)
    import StringIO
    StringIO = BytesIO = StringIO.StringIO
_add_doc(b, """Byte literal""")
_add_doc(u, """Text literal""")


if PY3:
    exec_ = getattr(moves.builtins, "exec")


    def reraise(tp, value, tb=None):
        if value.__traceback__ is not tb:
            raise value.with_traceback(tb)
        raise value

else:
    def exec_(_code_, _globs_=None, _locs_=None):
        """Execute code in a namespace."""
        if _globs_ is None:
            frame = sys._getframe(1)
            _globs_ = frame.f_globals
            if _locs_ is None:
                _locs_ = frame.f_locals
            del frame
        elif _locs_ is None:
            _locs_ = _globs_
        exec("""exec _code_ in _globs_, _locs_""")


    exec_("""def reraise(tp, value, tb=None):
    raise tp, value, tb
""")


print_ = getattr(moves.builtins, "print", None)
if print_ is None:
    def print_(*args, **kwargs):
        """The new-style print function for Python 2.4 and 2.5."""
        fp = kwargs.pop("file", sys.stdout)
        if fp is None:
            return
        def write(data):
            if not isinstance(data, basestring):
                data = str(data)
            # If the file has an encoding, encode unicode with it.
            if (isinstance(fp, file) and
                isinstance(data, unicode) and
                fp.encoding is not None):
                errors = getattr(fp, "errors", None)
                if errors is None:
                    errors = "strict"
                data = data.encode(fp.encoding, errors)
            fp.write(data)
        want_unicode = False
        sep = kwargs.pop("sep", None)
        if sep is not None:
            if isinstance(sep, unicode):
                want_unicode = True
            elif not isinstance(sep, str):
                raise TypeError("sep must be None or a string")
        end = kwargs.pop("end", None)
        if end is not None:
            if isinstance(end, unicode):
                want_unicode = True
            elif not isinstance(end, str):
                raise TypeError("end must be None or a string")
        if kwargs:
            raise TypeError("invalid keyword arguments to print()")
        if not want_unicode:
            for arg in args:
                if isinstance(arg, unicode):
                    want_unicode = True
                    break
        if want_unicode:
            newline = unicode("\n")
            space = unicode(" ")
        else:
            newline = "\n"
            space = " "
        if sep is None:
            sep = space
        if end is None:
            end = newline
        for i, arg in enumerate(args):
            if i:
                write(sep)
            write(arg)
        write(end)

_add_doc(reraise, """Reraise an exception.""")


def with_metaclass(meta, *bases):
    """Create a base class with a metaclass."""
    return meta("NewBase", bases, {})

def add_metaclass(metaclass):
    """Class decorator for creating a class with a metaclass."""
    def wrapper(cls):
        orig_vars = cls.__dict__.copy()
        orig_vars.pop('__dict__', None)
        orig_vars.pop('__weakref__', None)
        slots = orig_vars.get('__slots__')
        if slots is not None:
            if isinstance(slots, str):
                slots = [slots]
            for slots_var in slots:
                orig_vars.pop(slots_var)
        return metaclass(cls.__name__, cls.__bases__, orig_vars)
    return wrapper
site-packages/pip/_vendor/html5lib/ihatexml.py000064400000040305151733463570015435 0ustar00from __future__ import absolute_import, division, unicode_literals

import re
import warnings

from .constants import DataLossWarning

baseChar = """
[#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] |
[#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] |
[#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] |
[#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 |
[#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] |
[#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] |
[#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] |
[#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] |
[#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 |
[#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] |
[#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] |
[#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D |
[#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] |
[#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] |
[#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] |
[#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] |
[#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] |
[#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] |
[#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 |
[#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] |
[#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] |
[#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] |
[#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] |
[#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] |
[#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] |
[#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] |
[#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] |
[#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] |
[#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] |
[#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A |
#x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 |
#x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] |
#x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] |
[#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] |
[#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C |
#x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 |
[#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] |
[#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] |
[#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 |
[#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] |
[#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B |
#x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE |
[#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] |
[#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 |
[#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] |
[#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]"""

ideographic = """[#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]"""

combiningCharacter = """
[#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] |
[#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 |
[#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] |
[#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] |
#x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] |
[#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] |
[#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 |
#x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] |
[#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC |
[#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] |
#x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] |
[#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] |
[#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] |
[#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] |
[#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] |
[#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] |
#x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 |
[#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] |
#x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] |
[#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] |
[#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] |
#x3099 | #x309A"""

digit = """
[#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] |
[#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] |
[#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] |
[#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]"""

extender = """
#x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 |
#[#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]"""

letter = " | ".join([baseChar, ideographic])

# Without the
name = " | ".join([letter, digit, ".", "-", "_", combiningCharacter,
                   extender])
nameFirst = " | ".join([letter, "_"])

reChar = re.compile(r"#x([\d|A-F]{4,4})")
reCharRange = re.compile(r"\[#x([\d|A-F]{4,4})-#x([\d|A-F]{4,4})\]")


def charStringToList(chars):
    charRanges = [item.strip() for item in chars.split(" | ")]
    rv = []
    for item in charRanges:
        foundMatch = False
        for regexp in (reChar, reCharRange):
            match = regexp.match(item)
            if match is not None:
                rv.append([hexToInt(item) for item in match.groups()])
                if len(rv[-1]) == 1:
                    rv[-1] = rv[-1] * 2
                foundMatch = True
                break
        if not foundMatch:
            assert len(item) == 1

            rv.append([ord(item)] * 2)
    rv = normaliseCharList(rv)
    return rv


def normaliseCharList(charList):
    charList = sorted(charList)
    for item in charList:
        assert item[1] >= item[0]
    rv = []
    i = 0
    while i < len(charList):
        j = 1
        rv.append(charList[i])
        while i + j < len(charList) and charList[i + j][0] <= rv[-1][1] + 1:
            rv[-1][1] = charList[i + j][1]
            j += 1
        i += j
    return rv

# We don't really support characters above the BMP :(
max_unicode = int("FFFF", 16)


def missingRanges(charList):
    rv = []
    if charList[0] != 0:
        rv.append([0, charList[0][0] - 1])
    for i, item in enumerate(charList[:-1]):
        rv.append([item[1] + 1, charList[i + 1][0] - 1])
    if charList[-1][1] != max_unicode:
        rv.append([charList[-1][1] + 1, max_unicode])
    return rv


def listToRegexpStr(charList):
    rv = []
    for item in charList:
        if item[0] == item[1]:
            rv.append(escapeRegexp(chr(item[0])))
        else:
            rv.append(escapeRegexp(chr(item[0])) + "-" +
                      escapeRegexp(chr(item[1])))
    return "[%s]" % "".join(rv)


def hexToInt(hex_str):
    return int(hex_str, 16)


def escapeRegexp(string):
    specialCharacters = (".", "^", "$", "*", "+", "?", "{", "}",
                         "[", "]", "|", "(", ")", "-")
    for char in specialCharacters:
        string = string.replace(char, "\\" + char)

    return string

# output from the above
nonXmlNameBMPRegexp = re.compile('[\x00-,/:-@\\[-\\^`\\{-\xb6\xb8-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u02cf\u02d2-\u02ff\u0346-\u035f\u0362-\u0385\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482\u0487-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u0590\u05a2\u05ba\u05be\u05c0\u05c3\u05c5-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u063f\u0653-\u065f\u066a-\u066f\u06b8-\u06b9\u06bf\u06cf\u06d4\u06e9\u06ee-\u06ef\u06fa-\u0900\u0904\u093a-\u093b\u094e-\u0950\u0955-\u0957\u0964-\u0965\u0970-\u0980\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09bd\u09c5-\u09c6\u09c9-\u09ca\u09ce-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09f2-\u0a01\u0a03-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a58\u0a5d\u0a5f-\u0a65\u0a75-\u0a80\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0adf\u0ae1-\u0ae5\u0af0-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3b\u0b44-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b62-\u0b65\u0b70-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bd6\u0bd8-\u0be6\u0bf0-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3d\u0c45\u0c49\u0c4e-\u0c54\u0c57-\u0c5f\u0c62-\u0c65\u0c70-\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbd\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce2-\u0ce5\u0cf0-\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d3d\u0d44-\u0d45\u0d49\u0d4e-\u0d56\u0d58-\u0d5f\u0d62-\u0d65\u0d70-\u0e00\u0e2f\u0e3b-\u0e3f\u0e4f\u0e5a-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0f17\u0f1a-\u0f1f\u0f2a-\u0f34\u0f36\u0f38\u0f3a-\u0f3d\u0f48\u0f6a-\u0f70\u0f85\u0f8c-\u0f8f\u0f96\u0f98\u0fae-\u0fb0\u0fb8\u0fba-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u20cf\u20dd-\u20e0\u20e2-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3004\u3006\u3008-\u3020\u3030\u3036-\u3040\u3095-\u3098\u309b-\u309c\u309f-\u30a0\u30fb\u30ff-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]')

nonXmlNameFirstBMPRegexp = re.compile('[\x00-@\\[-\\^`\\{-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u0385\u0387\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u0640\u064b-\u0670\u06b8-\u06b9\u06bf\u06cf\u06d4\u06d6-\u06e4\u06e7-\u0904\u093a-\u093c\u093e-\u0957\u0962-\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09db\u09de\u09e2-\u09ef\u09f2-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a58\u0a5d\u0a5f-\u0a71\u0a75-\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abc\u0abe-\u0adf\u0ae1-\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3c\u0b3e-\u0b5b\u0b5e\u0b62-\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c5f\u0c62-\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cdd\u0cdf\u0ce2-\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d5f\u0d62-\u0e00\u0e2f\u0e31\u0e34-\u0e3f\u0e46-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eb1\u0eb4-\u0ebc\u0ebe-\u0ebf\u0ec5-\u0f3f\u0f48\u0f6a-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3006\u3008-\u3020\u302a-\u3040\u3095-\u30a0\u30fb-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]')

# Simpler things
nonPubidCharRegexp = re.compile("[^\x20\x0D\x0Aa-zA-Z0-9\-\'()+,./:=?;!*#@$_%]")


class InfosetFilter(object):
    replacementRegexp = re.compile(r"U[\dA-F]{5,5}")

    def __init__(self, replaceChars=None,
                 dropXmlnsLocalName=False,
                 dropXmlnsAttrNs=False,
                 preventDoubleDashComments=False,
                 preventDashAtCommentEnd=False,
                 replaceFormFeedCharacters=True,
                 preventSingleQuotePubid=False):

        self.dropXmlnsLocalName = dropXmlnsLocalName
        self.dropXmlnsAttrNs = dropXmlnsAttrNs

        self.preventDoubleDashComments = preventDoubleDashComments
        self.preventDashAtCommentEnd = preventDashAtCommentEnd

        self.replaceFormFeedCharacters = replaceFormFeedCharacters

        self.preventSingleQuotePubid = preventSingleQuotePubid

        self.replaceCache = {}

    def coerceAttribute(self, name, namespace=None):
        if self.dropXmlnsLocalName and name.startswith("xmlns:"):
            warnings.warn("Attributes cannot begin with xmlns", DataLossWarning)
            return None
        elif (self.dropXmlnsAttrNs and
              namespace == "http://www.w3.org/2000/xmlns/"):
            warnings.warn("Attributes cannot be in the xml namespace", DataLossWarning)
            return None
        else:
            return self.toXmlName(name)

    def coerceElement(self, name, namespace=None):
        return self.toXmlName(name)

    def coerceComment(self, data):
        if self.preventDoubleDashComments:
            while "--" in data:
                warnings.warn("Comments cannot contain adjacent dashes", DataLossWarning)
                data = data.replace("--", "- -")
        return data

    def coerceCharacters(self, data):
        if self.replaceFormFeedCharacters:
            for i in range(data.count("\x0C")):
                warnings.warn("Text cannot contain U+000C", DataLossWarning)
            data = data.replace("\x0C", " ")
        # Other non-xml characters
        return data

    def coercePubid(self, data):
        dataOutput = data
        for char in nonPubidCharRegexp.findall(data):
            warnings.warn("Coercing non-XML pubid", DataLossWarning)
            replacement = self.getReplacementCharacter(char)
            dataOutput = dataOutput.replace(char, replacement)
        if self.preventSingleQuotePubid and dataOutput.find("'") >= 0:
            warnings.warn("Pubid cannot contain single quote", DataLossWarning)
            dataOutput = dataOutput.replace("'", self.getReplacementCharacter("'"))
        return dataOutput

    def toXmlName(self, name):
        nameFirst = name[0]
        nameRest = name[1:]
        m = nonXmlNameFirstBMPRegexp.match(nameFirst)
        if m:
            warnings.warn("Coercing non-XML name", DataLossWarning)
            nameFirstOutput = self.getReplacementCharacter(nameFirst)
        else:
            nameFirstOutput = nameFirst

        nameRestOutput = nameRest
        replaceChars = set(nonXmlNameBMPRegexp.findall(nameRest))
        for char in replaceChars:
            warnings.warn("Coercing non-XML name", DataLossWarning)
            replacement = self.getReplacementCharacter(char)
            nameRestOutput = nameRestOutput.replace(char, replacement)
        return nameFirstOutput + nameRestOutput

    def getReplacementCharacter(self, char):
        if char in self.replaceCache:
            replacement = self.replaceCache[char]
        else:
            replacement = self.escapeChar(char)
        return replacement

    def fromXmlName(self, name):
        for item in set(self.replacementRegexp.findall(name)):
            name = name.replace(item, self.unescapeChar(item))
        return name

    def escapeChar(self, char):
        replacement = "U%05X" % ord(char)
        self.replaceCache[char] = replacement
        return replacement

    def unescapeChar(self, charcode):
        return chr(int(charcode[1:], 16))
site-packages/pip/_vendor/html5lib/filters/sanitizer.py000064400000000540151733463570017277 0ustar00from __future__ import absolute_import, division, unicode_literals

from . import _base
from ..sanitizer import HTMLSanitizerMixin


class Filter(_base.Filter, HTMLSanitizerMixin):
    def __iter__(self):
        for token in _base.Filter.__iter__(self):
            token = self.sanitize_token(token)
            if token:
                yield token
site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-33.pyc000064400000011161151733463570024255 0ustar00�
7�Re)c@sIddlmZmZmZddlmZGdd�dej�ZdS(i(uabsolute_importudivisionuunicode_literalsi(u_basecBsD|EeZdZdd�Zdd�Zdd�Zdd�Zd	S(
uFilterccsYd}}x:|jD]/}|dk	r7|||fVn|}|}qW||dfVdS(N(uNoneusource(uselfu	previous1u	previous2utoken((uB/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/optionaltags.pyusliders

u
Filter.sliderccs�x�|j�D]�\}}}|d}|dkra|dsV|j|d||�r�|Vq�q
|dkr�|j|d|�s�|Vq�q
|Vq
WdS(NutypeuStartTagudataunameuEndTag(uslideruis_optional_startuis_optional_end(uselfupreviousutokenunextutype((uB/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/optionaltags.pyu__iter__s

uFilter.__iter__cCs*|r|dpd}|dkr,|dkS|dkre|dkrHdS|dkr&|d	dkSn�|d
kr�|dkr�dS|dkr�|d	dkSdSn�|d
kr�|dkr�|d	dkSdSnW|dkr&|dkr|r|ddkr|d	dkrdS|d	dkSdSndS(NutypeuhtmluCommentuSpaceCharactersuheaduStartTaguEmptyTaguEndTagunameubodyuscriptustyleucolgroupucolutbodyutheadutfootutr(uCommentuSpaceCharacters(uStartTaguEmptyTagT(uCommentuSpaceCharactersF(uscriptustyle(uStartTaguEmptyTag(utbodyutheadutfoot(uNoneuTrueuFalse(uselfutagnameupreviousunextutype((uB/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/optionaltags.pyuis_optional_starts4
uFilter.is_optional_startcCs�|r|dpd}|d5kr,|d6kS|d7krk|d
krR|d|kS|dkpg|dkSn|d8kr�|d
kr�|dd9kS|dkr�|dkp�|dkSd:Sn�|dkr�|d;kr�|dd<kS|dkp�|dkSn�|d,kr8|d
kr|dd=kS|dkp4|dkSnI|d>krw|d
kr^|dd?kS|dkps|dkSn
|d/kr�|d@kr�d:S|d
kr�|dd/kSdASn�|dBkr|d
kr�|ddCkS|d1kr�|dkp�|dkSd:Sn~|d2krB|d
kr)|dd1kS|dkp>|dkSn?|dDkr�|d
krh|ddEkS|dkp}|dkSnd:S(FNutypeuhtmluheadubodyuCommentuSpaceCharactersuliuoptgrouputruStartTagunameuEndTagudtuddupuEmptyTaguaddressuarticleuasideu
blockquoteudatagridudialogudirudivudlufieldsetufooteruformuh1uh2uh3uh4uh5uh6uheaderuhrumenuunavuolupreusectionutableuuluoptionurturpucolgrouputheadutbodyutfootutduth(uhtmluheadubody(uCommentuSpaceCharacters(uliuoptgrouputr(udtudd(udtuddF(uStartTaguEmptyTag(uaddressuarticleuasideu
blockquoteudatagridudialogudirudivudlufieldsetufooteruformuh1uh2uh3uh4uh5uh6uheaderuhrumenuunavuolupupreusectionutableuul(uoptionuoptgroup(urturp(urturp(uCommentuSpaceCharactersT(utheadutbody(utbodyutfoot(utduth(utduth(uNoneuFalseuTrue(uselfutagnameunextutype((uB/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/optionaltags.pyuis_optional_endVsf

uFilter.is_optional_endN(u__name__u
__module__u__qualname__uslideru__iter__uis_optional_startuis_optional_end(u
__locals__((uB/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/optionaltags.pyuFilters	
9uFilterN(u
__future__uabsolute_importudivisionuunicode_literalsuu_baseuFilter(((uB/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/optionaltags.pyu<module>ssite-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-33.pyc000064400000003075151733463600026270 0ustar00�
7�Repc@s�ddlmZmZmZddlmZyddlmZWn"ek
rdddl	mZYnXGdd�dej
�Z
dS(i(uabsolute_importudivisionuunicode_literalsi(u_base(uOrderedDictcBs |EeZdZdd�ZdS(uFilterccs�x�tjj|�D]n}|ddkr|t�}x:t|dj�ddd��D]\}}|||<qUW||d<n|VqWdS(	NutypeuStartTaguEmptyTagudataukeycSs|dS(Ni((ux((uL/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/alphabeticalattributes.pyu<lambda>su!Filter.__iter__.<locals>.<lambda>(uStartTaguEmptyTag(u_baseuFilteru__iter__uOrderedDictusorteduitems(uselfutokenuattrsunameuvalue((uL/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/alphabeticalattributes.pyu__iter__s	
uFilter.__iter__N(u__name__u
__module__u__qualname__u__iter__(u
__locals__((uL/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/alphabeticalattributes.pyuFiltersuFilterN(u
__future__uabsolute_importudivisionuunicode_literalsuu_baseucollectionsuOrderedDictuImportErroruordereddictuFilter(((uL/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/alphabeticalattributes.pyu<module>s
site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-33.pyc000064400000000235151733463600023302 0ustar00�
7�Rec@sdS(N((((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/__init__.pyu<module>ssite-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-33.pyc000064400000007756151733463600022530 0ustar00�
7�Re�c@s�ddlmZmZmZddlmZeZddlmZddlm	Z	m
Z
mZddlmZdj
e�ZGd	d
�d
e�ZGdd�dej�Zd
S(i(uabsolute_importudivisionuunicode_literals(ugettexti(u_basei(u
cdataElementsurcdataElementsuvoidElements(uspaceCharactersucBs|EeZdZdS(u	LintErrorN(u__name__u
__module__u__qualname__(u
__locals__((u:/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/lint.pyu	LintError
su	LintErrorcBs |EeZdZdd�ZdS(uFilterc		cs�g}d}xqtjj|�D]]}|d}|d&kr!|d}|dkrqttd�i|d6��nt|t�s�ttd�i|d6��n|s�ttd	���n|dkr�|tkr�ttd
�i|d6��n<|dkr/|tkr/ttd�i|dd6��n|dkrK|j|�nx�|dD]�\}}t|t�s�ttd
�i|d6��n|s�ttd���nt|t�sVttd�i|d6��qVqVW|t	kr�d}qw|t
kr	d}qw|dkrwd}qwnV|dkr�|d}t|t�sfttd�i|d6��n|s�ttd	���n|tkr�ttd�i|d6��n|j�}||kr�ttd�i|d6|d6��nd}n�|dkr%|dkrwttd���qwnR|d'kr�|d}t|t�sjttd
�i|d6��n|s�ttd�i|d6��n|dkrw|jt
�}|r�ttd�i|d 6��q�qwn�|d!krK|d}|dkrttd"�i|d6��nt|t�swttd�i|d6��qwn,|d(krZnttd%�i|d6��|VqWdS()NuPCDATAutypeuStartTaguEmptyTagunameu2StartTag not in PCDATA content model flag: %(tag)sutagu!Tag name is not a string: %(tag)ruEmpty tag nameu0Void element reported as StartTag token: %(tag)su4Non-void element reported as EmptyTag token: %(tag)sudatau(Attribute name is not a string: %(name)ruEmpty attribute nameu*Attribute value is not a string: %(value)ruvalueuCDATAuRCDATAu	plaintextu	PLAINTEXTuEndTagu.Void element reported as EndTag token: %(tag)su4EndTag (%(end)s) does not match StartTag (%(start)s)uendustartuCommentu(Comment not in PCDATA content model flagu
CharactersuSpaceCharactersu%(type)s token with empty datau@Non-space character(s) found in SpaceCharacters token: %(token)rutokenuDoctypeu2Doctype not in PCDATA content model flag: %(name)su
ParseErroruSerializeErroruUnknown token type: %(type)s(uStartTaguEmptyTag(u
CharactersuSpaceCharacters(u
ParseErroruSerializeError(u_baseuFilteru__iter__u	LintErroru_u
isinstanceustruvoidElementsuappendu
cdataElementsurcdataElementsupopustripuspaceCharacters(	uselfu
open_elementsucontentModelFlagutokenutypeunameuvalueu
start_nameudata((u:/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/lint.pyu__iter__s�

   $ $		
  '	
  &
 #uFilter.__iter__N(u__name__u
__module__u__qualname__u__iter__(u
__locals__((u:/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/lint.pyuFiltersuFilterN(u
__future__uabsolute_importudivisionuunicode_literalsugettextu_uu_baseu	constantsu
cdataElementsurcdataElementsuvoidElementsuspaceCharactersujoinu	Exceptionu	LintErroruFilter(((u:/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/lint.pyu<module>ssite-packages/pip/_vendor/html5lib/filters/__pycache__/_base.cpython-33.pyc000064400000002440151733463600022614 0ustar00�
7�Rec@s6ddlmZmZmZGdd�de�ZdS(i(uabsolute_importudivisionuunicode_literalscBs8|EeZdZdd�Zdd�Zdd�ZdS(uFiltercCs
||_dS(N(usource(uselfusource((u;/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/_base.pyu__init__suFilter.__init__cCs
t|j�S(N(uiterusource(uself((u;/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/_base.pyu__iter__suFilter.__iter__cCst|j|�S(N(ugetattrusource(uselfuname((u;/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/_base.pyu__getattr__suFilter.__getattr__N(u__name__u
__module__u__qualname__u__init__u__iter__u__getattr__(u
__locals__((u;/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/_base.pyuFiltersuFilterN(u
__future__uabsolute_importudivisionuunicode_literalsuobjectuFilter(((u;/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/_base.pyu<module>ssite-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-33.pyc000064400000004640151733463600025542 0ustar00�
7�Re�
c@sIddlmZmZmZddlmZGdd�dej�ZdS(i(uabsolute_importudivisionuunicode_literalsi(u_basecBs,|EeZdZdd�Zdd�ZdS(uFiltercCs tjj||�||_dS(N(u_baseuFilteru__init__uencoding(uselfusourceuencoding((uI/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/inject_meta_charset.pyu__init__suFilter.__init__c
cs�d}|jdk}g}xvtjj|�D]b}|d}|dkrl|dj�dkrod}qon|dkr�|dj�dkr^d}xE|d	j�D]~\\}}}	|dk	r�q�q�|j�d
kr�|j|d	||f<d}Pq�|dkr�|	j�dkr�d}q�q�W|r�d|d	kr�d|j|d	d<d}q�qo|dj�dkro|roidd6dd6|d	d	6Vidd6dd6i|jd6d	6Vidd6dd6Vd}q.qon�|dkro|dj�dkro|ro|j	d�V|sBidd6dd6i|jd6d	6Vnx|r\|j	d�VqEWd}d}qon|dkr�|j
|�q.|Vq.WdS(Nupre_headutypeuStartTagunameuheaduin_headuEmptyTagumetaudataucharsetu
http-equivucontent-typeucontentutext/html; charset=%suEndTagiu	post_headFT(Nucontent(Nucontent(Nucharset(Nucharset(uencodinguNoneu_baseuFilteru__iter__uloweruFalseuitemsuTrueupopuappend(
uselfustateu
meta_foundupendingutokenutypeuhas_http_equiv_content_typeu	namespaceunameuvalue((uI/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/inject_meta_charset.pyu__iter__sX
#

		uFilter.__iter__N(u__name__u
__module__u__qualname__u__init__u__iter__(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/inject_meta_charset.pyuFiltersuFilterN(u
__future__uabsolute_importudivisionuunicode_literalsuu_baseuFilter(((uI/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/inject_meta_charset.pyu<module>ssite-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-33.pyc000064400000003613151733463600023702 0ustar00�
7�Revc@s�ddlmZmZmZddlZddlmZddlmZm	Z	dj
e	�Z	ejde	�ZGd	d
�d
ej
�Z
dd�ZdS(
i(uabsolute_importudivisionuunicode_literalsNi(u_basei(urcdataElementsuspaceCharactersuu[%s]+cBs<|EeZdZeddgee��Zdd�ZdS(uFilterupreutextareac
cs�d}x�tjj|�D]�}|d}|dkr[|sN|d|jkr[|d7}ns|dkrz|rz|d8}nT|r�|dkr�|dr�d	|d<n*|r�|d
kr�t|d�|d<n|VqWdS(NiutypeuStartTagunameiuEndTaguSpaceCharactersudatau u
Characters(u_baseuFilteru__iter__uspacePreserveElementsucollapse_spaces(uselfupreserveutokenutype((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/whitespace.pyu__iter__s



uFilter.__iter__N(u__name__u
__module__u__qualname__u	frozensetulisturcdataElementsuspacePreserveElementsu__iter__(u
__locals__((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/whitespace.pyuFiltersuFiltercCstjd|�S(Nu (uSPACES_REGEXusub(utext((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/whitespace.pyucollapse_spaces%sucollapse_spaces(u
__future__uabsolute_importudivisionuunicode_literalsureuu_baseu	constantsurcdataElementsuspaceCharactersujoinucompileuSPACES_REGEXuFilterucollapse_spaces(((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/whitespace.pyu<module>ssite-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-33.pyc000064400000002062151733463600023553 0ustar00�
7�Re`c@s\ddlmZmZmZddlmZddlmZGdd�deje�ZdS(	i(uabsolute_importudivisionuunicode_literalsi(u_basei(uHTMLSanitizerMixincBs |EeZdZdd�ZdS(uFilterccs>x7tjj|�D]#}|j|�}|r|VqqWdS(N(u_baseuFilteru__iter__usanitize_token(uselfutoken((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/sanitizer.pyu__iter__suFilter.__iter__N(u__name__u
__module__u__qualname__u__iter__(u
__locals__((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/sanitizer.pyuFiltersuFilterN(	u
__future__uabsolute_importudivisionuunicode_literalsuu_baseu	sanitizeruHTMLSanitizerMixinuFilter(((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/filters/sanitizer.pyu<module>ssite-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py000064400000001160151733463600022000 0ustar00from __future__ import absolute_import, division, unicode_literals

from . import _base

try:
    from collections import OrderedDict
except ImportError:
    from ordereddict import OrderedDict


class Filter(_base.Filter):
    def __iter__(self):
        for token in _base.Filter.__iter__(self):
            if token["type"] in ("StartTag", "EmptyTag"):
                attrs = OrderedDict()
                for name, value in sorted(token["data"].items(),
                                          key=lambda x: x[0]):
                    attrs[name] = value
                token["data"] = attrs
            yield token
site-packages/pip/_vendor/html5lib/filters/_base.py000064400000000436151733463600016336 0ustar00from __future__ import absolute_import, division, unicode_literals


class Filter(object):
    def __init__(self, source):
        self.source = source

    def __iter__(self):
        return iter(self.source)

    def __getattr__(self, name):
        return getattr(self.source, name)
site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py000064400000005272151733463600021263 0ustar00from __future__ import absolute_import, division, unicode_literals

from . import _base


class Filter(_base.Filter):
    def __init__(self, source, encoding):
        _base.Filter.__init__(self, source)
        self.encoding = encoding

    def __iter__(self):
        state = "pre_head"
        meta_found = (self.encoding is None)
        pending = []

        for token in _base.Filter.__iter__(self):
            type = token["type"]
            if type == "StartTag":
                if token["name"].lower() == "head":
                    state = "in_head"

            elif type == "EmptyTag":
                if token["name"].lower() == "meta":
                    # replace charset with actual encoding
                    has_http_equiv_content_type = False
                    for (namespace, name), value in token["data"].items():
                        if namespace is not None:
                            continue
                        elif name.lower() == 'charset':
                            token["data"][(namespace, name)] = self.encoding
                            meta_found = True
                            break
                        elif name == 'http-equiv' and value.lower() == 'content-type':
                            has_http_equiv_content_type = True
                    else:
                        if has_http_equiv_content_type and (None, "content") in token["data"]:
                            token["data"][(None, "content")] = 'text/html; charset=%s' % self.encoding
                            meta_found = True

                elif token["name"].lower() == "head" and not meta_found:
                    # insert meta into empty head
                    yield {"type": "StartTag", "name": "head",
                           "data": token["data"]}
                    yield {"type": "EmptyTag", "name": "meta",
                           "data": {(None, "charset"): self.encoding}}
                    yield {"type": "EndTag", "name": "head"}
                    meta_found = True
                    continue

            elif type == "EndTag":
                if token["name"].lower() == "head" and pending:
                    # insert meta into head (if necessary) and flush pending queue
                    yield pending.pop(0)
                    if not meta_found:
                        yield {"type": "EmptyTag", "name": "meta",
                               "data": {(None, "charset"): self.encoding}}
                    while pending:
                        yield pending.pop(0)
                    meta_found = True
                    state = "post_head"

            if state == "in_head":
                pending.append(token)
            else:
                yield token
site-packages/pip/_vendor/html5lib/filters/__init__.py000064400000000000151733463600017007 0ustar00site-packages/pip/_vendor/html5lib/filters/optionaltags.py000064400000024404151733463600017772 0ustar00from __future__ import absolute_import, division, unicode_literals

from . import _base


class Filter(_base.Filter):
    def slider(self):
        previous1 = previous2 = None
        for token in self.source:
            if previous1 is not None:
                yield previous2, previous1, token
            previous2 = previous1
            previous1 = token
        yield previous2, previous1, None

    def __iter__(self):
        for previous, token, next in self.slider():
            type = token["type"]
            if type == "StartTag":
                if (token["data"] or
                        not self.is_optional_start(token["name"], previous, next)):
                    yield token
            elif type == "EndTag":
                if not self.is_optional_end(token["name"], next):
                    yield token
            else:
                yield token

    def is_optional_start(self, tagname, previous, next):
        type = next and next["type"] or None
        if tagname in 'html':
            # An html element's start tag may be omitted if the first thing
            # inside the html element is not a space character or a comment.
            return type not in ("Comment", "SpaceCharacters")
        elif tagname == 'head':
            # A head element's start tag may be omitted if the first thing
            # inside the head element is an element.
            # XXX: we also omit the start tag if the head element is empty
            if type in ("StartTag", "EmptyTag"):
                return True
            elif type == "EndTag":
                return next["name"] == "head"
        elif tagname == 'body':
            # A body element's start tag may be omitted if the first thing
            # inside the body element is not a space character or a comment,
            # except if the first thing inside the body element is a script
            # or style element and the node immediately preceding the body
            # element is a head element whose end tag has been omitted.
            if type in ("Comment", "SpaceCharacters"):
                return False
            elif type == "StartTag":
                # XXX: we do not look at the preceding event, so we never omit
                # the body element's start tag if it's followed by a script or
                # a style element.
                return next["name"] not in ('script', 'style')
            else:
                return True
        elif tagname == 'colgroup':
            # A colgroup element's start tag may be omitted if the first thing
            # inside the colgroup element is a col element, and if the element
            # is not immediately preceeded by another colgroup element whose
            # end tag has been omitted.
            if type in ("StartTag", "EmptyTag"):
                # XXX: we do not look at the preceding event, so instead we never
                # omit the colgroup element's end tag when it is immediately
                # followed by another colgroup element. See is_optional_end.
                return next["name"] == "col"
            else:
                return False
        elif tagname == 'tbody':
            # A tbody element's start tag may be omitted if the first thing
            # inside the tbody element is a tr element, and if the element is
            # not immediately preceeded by a tbody, thead, or tfoot element
            # whose end tag has been omitted.
            if type == "StartTag":
                # omit the thead and tfoot elements' end tag when they are
                # immediately followed by a tbody element. See is_optional_end.
                if previous and previous['type'] == 'EndTag' and \
                        previous['name'] in ('tbody', 'thead', 'tfoot'):
                    return False
                return next["name"] == 'tr'
            else:
                return False
        return False

    def is_optional_end(self, tagname, next):
        type = next and next["type"] or None
        if tagname in ('html', 'head', 'body'):
            # An html element's end tag may be omitted if the html element
            # is not immediately followed by a space character or a comment.
            return type not in ("Comment", "SpaceCharacters")
        elif tagname in ('li', 'optgroup', 'tr'):
            # A li element's end tag may be omitted if the li element is
            # immediately followed by another li element or if there is
            # no more content in the parent element.
            # An optgroup element's end tag may be omitted if the optgroup
            # element is immediately followed by another optgroup element,
            # or if there is no more content in the parent element.
            # A tr element's end tag may be omitted if the tr element is
            # immediately followed by another tr element, or if there is
            # no more content in the parent element.
            if type == "StartTag":
                return next["name"] == tagname
            else:
                return type == "EndTag" or type is None
        elif tagname in ('dt', 'dd'):
            # A dt element's end tag may be omitted if the dt element is
            # immediately followed by another dt element or a dd element.
            # A dd element's end tag may be omitted if the dd element is
            # immediately followed by another dd element or a dt element,
            # or if there is no more content in the parent element.
            if type == "StartTag":
                return next["name"] in ('dt', 'dd')
            elif tagname == 'dd':
                return type == "EndTag" or type is None
            else:
                return False
        elif tagname == 'p':
            # A p element's end tag may be omitted if the p element is
            # immediately followed by an address, article, aside,
            # blockquote, datagrid, dialog, dir, div, dl, fieldset,
            # footer, form, h1, h2, h3, h4, h5, h6, header, hr, menu,
            # nav, ol, p, pre, section, table, or ul, element, or if
            # there is no more content in the parent element.
            if type in ("StartTag", "EmptyTag"):
                return next["name"] in ('address', 'article', 'aside',
                                        'blockquote', 'datagrid', 'dialog',
                                        'dir', 'div', 'dl', 'fieldset', 'footer',
                                        'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
                                        'header', 'hr', 'menu', 'nav', 'ol',
                                        'p', 'pre', 'section', 'table', 'ul')
            else:
                return type == "EndTag" or type is None
        elif tagname == 'option':
            # An option element's end tag may be omitted if the option
            # element is immediately followed by another option element,
            # or if it is immediately followed by an <code>optgroup</code>
            # element, or if there is no more content in the parent
            # element.
            if type == "StartTag":
                return next["name"] in ('option', 'optgroup')
            else:
                return type == "EndTag" or type is None
        elif tagname in ('rt', 'rp'):
            # An rt element's end tag may be omitted if the rt element is
            # immediately followed by an rt or rp element, or if there is
            # no more content in the parent element.
            # An rp element's end tag may be omitted if the rp element is
            # immediately followed by an rt or rp element, or if there is
            # no more content in the parent element.
            if type == "StartTag":
                return next["name"] in ('rt', 'rp')
            else:
                return type == "EndTag" or type is None
        elif tagname == 'colgroup':
            # A colgroup element's end tag may be omitted if the colgroup
            # element is not immediately followed by a space character or
            # a comment.
            if type in ("Comment", "SpaceCharacters"):
                return False
            elif type == "StartTag":
                # XXX: we also look for an immediately following colgroup
                # element. See is_optional_start.
                return next["name"] != 'colgroup'
            else:
                return True
        elif tagname in ('thead', 'tbody'):
            # A thead element's end tag may be omitted if the thead element
            # is immediately followed by a tbody or tfoot element.
            # A tbody element's end tag may be omitted if the tbody element
            # is immediately followed by a tbody or tfoot element, or if
            # there is no more content in the parent element.
            # A tfoot element's end tag may be omitted if the tfoot element
            # is immediately followed by a tbody element, or if there is no
            # more content in the parent element.
            # XXX: we never omit the end tag when the following element is
            # a tbody. See is_optional_start.
            if type == "StartTag":
                return next["name"] in ['tbody', 'tfoot']
            elif tagname == 'tbody':
                return type == "EndTag" or type is None
            else:
                return False
        elif tagname == 'tfoot':
            # A tfoot element's end tag may be omitted if the tfoot element
            # is immediately followed by a tbody element, or if there is no
            # more content in the parent element.
            # XXX: we never omit the end tag when the following element is
            # a tbody. See is_optional_start.
            if type == "StartTag":
                return next["name"] == 'tbody'
            else:
                return type == "EndTag" or type is None
        elif tagname in ('td', 'th'):
            # A td element's end tag may be omitted if the td element is
            # immediately followed by a td or th element, or if there is
            # no more content in the parent element.
            # A th element's end tag may be omitted if the th element is
            # immediately followed by a td or th element, or if there is
            # no more content in the parent element.
            if type == "StartTag":
                return next["name"] in ('td', 'th')
            else:
                return type == "EndTag" or type is None
        return False
site-packages/pip/_vendor/html5lib/filters/whitespace.py000064400000002166151733463600017423 0ustar00from __future__ import absolute_import, division, unicode_literals

import re

from . import _base
from ..constants import rcdataElements, spaceCharacters
spaceCharacters = "".join(spaceCharacters)

SPACES_REGEX = re.compile("[%s]+" % spaceCharacters)


class Filter(_base.Filter):

    spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements))

    def __iter__(self):
        preserve = 0
        for token in _base.Filter.__iter__(self):
            type = token["type"]
            if type == "StartTag" \
                    and (preserve or token["name"] in self.spacePreserveElements):
                preserve += 1

            elif type == "EndTag" and preserve:
                preserve -= 1

            elif not preserve and type == "SpaceCharacters" and token["data"]:
                # Test on token["data"] above to not introduce spaces where there were not
                token["data"] = " "

            elif not preserve and type == "Characters":
                token["data"] = collapse_spaces(token["data"])

            yield token


def collapse_spaces(text):
    return SPACES_REGEX.sub(' ', text)
site-packages/pip/_vendor/html5lib/filters/lint.py000064400000010322151733463600016226 0ustar00from __future__ import absolute_import, division, unicode_literals

from gettext import gettext
_ = gettext

from . import _base
from ..constants import cdataElements, rcdataElements, voidElements

from ..constants import spaceCharacters
spaceCharacters = "".join(spaceCharacters)


class LintError(Exception):
    pass


class Filter(_base.Filter):
    def __iter__(self):
        open_elements = []
        contentModelFlag = "PCDATA"
        for token in _base.Filter.__iter__(self):
            type = token["type"]
            if type in ("StartTag", "EmptyTag"):
                name = token["name"]
                if contentModelFlag != "PCDATA":
                    raise LintError(_("StartTag not in PCDATA content model flag: %(tag)s") % {"tag": name})
                if not isinstance(name, str):
                    raise LintError(_("Tag name is not a string: %(tag)r") % {"tag": name})
                if not name:
                    raise LintError(_("Empty tag name"))
                if type == "StartTag" and name in voidElements:
                    raise LintError(_("Void element reported as StartTag token: %(tag)s") % {"tag": name})
                elif type == "EmptyTag" and name not in voidElements:
                    raise LintError(_("Non-void element reported as EmptyTag token: %(tag)s") % {"tag": token["name"]})
                if type == "StartTag":
                    open_elements.append(name)
                for name, value in token["data"]:
                    if not isinstance(name, str):
                        raise LintError(_("Attribute name is not a string: %(name)r") % {"name": name})
                    if not name:
                        raise LintError(_("Empty attribute name"))
                    if not isinstance(value, str):
                        raise LintError(_("Attribute value is not a string: %(value)r") % {"value": value})
                if name in cdataElements:
                    contentModelFlag = "CDATA"
                elif name in rcdataElements:
                    contentModelFlag = "RCDATA"
                elif name == "plaintext":
                    contentModelFlag = "PLAINTEXT"

            elif type == "EndTag":
                name = token["name"]
                if not isinstance(name, str):
                    raise LintError(_("Tag name is not a string: %(tag)r") % {"tag": name})
                if not name:
                    raise LintError(_("Empty tag name"))
                if name in voidElements:
                    raise LintError(_("Void element reported as EndTag token: %(tag)s") % {"tag": name})
                start_name = open_elements.pop()
                if start_name != name:
                    raise LintError(_("EndTag (%(end)s) does not match StartTag (%(start)s)") % {"end": name, "start": start_name})
                contentModelFlag = "PCDATA"

            elif type == "Comment":
                if contentModelFlag != "PCDATA":
                    raise LintError(_("Comment not in PCDATA content model flag"))

            elif type in ("Characters", "SpaceCharacters"):
                data = token["data"]
                if not isinstance(data, str):
                    raise LintError(_("Attribute name is not a string: %(name)r") % {"name": data})
                if not data:
                    raise LintError(_("%(type)s token with empty data") % {"type": type})
                if type == "SpaceCharacters":
                    data = data.strip(spaceCharacters)
                    if data:
                        raise LintError(_("Non-space character(s) found in SpaceCharacters token: %(token)r") % {"token": data})

            elif type == "Doctype":
                name = token["name"]
                if contentModelFlag != "PCDATA":
                    raise LintError(_("Doctype not in PCDATA content model flag: %(name)s") % {"name": name})
                if not isinstance(name, str):
                    raise LintError(_("Tag name is not a string: %(tag)r") % {"tag": name})
                # XXX: what to do with token["data"] ?

            elif type in ("ParseError", "SerializeError"):
                pass

            else:
                raise LintError(_("Unknown token type: %(type)s") % {"type": type})

            yield token
site-packages/pip/_vendor/html5lib/treewalkers/lxmletree.py000064400000014107151733463600020146 0ustar00from __future__ import absolute_import, division, unicode_literals
from pip._vendor.six import text_type

from lxml import etree
from ..treebuilders.etree import tag_regexp

from gettext import gettext
_ = gettext

from . import _base

from .. import ihatexml


def ensure_str(s):
    if s is None:
        return None
    elif isinstance(s, text_type):
        return s
    else:
        return s.decode("utf-8", "strict")


class Root(object):
    def __init__(self, et):
        self.elementtree = et
        self.children = []
        if et.docinfo.internalDTD:
            self.children.append(Doctype(self,
                                         ensure_str(et.docinfo.root_name),
                                         ensure_str(et.docinfo.public_id),
                                         ensure_str(et.docinfo.system_url)))
        root = et.getroot()
        node = root

        while node.getprevious() is not None:
            node = node.getprevious()
        while node is not None:
            self.children.append(node)
            node = node.getnext()

        self.text = None
        self.tail = None

    def __getitem__(self, key):
        return self.children[key]

    def getnext(self):
        return None

    def __len__(self):
        return 1


class Doctype(object):
    def __init__(self, root_node, name, public_id, system_id):
        self.root_node = root_node
        self.name = name
        self.public_id = public_id
        self.system_id = system_id

        self.text = None
        self.tail = None

    def getnext(self):
        return self.root_node.children[1]


class FragmentRoot(Root):
    def __init__(self, children):
        self.children = [FragmentWrapper(self, child) for child in children]
        self.text = self.tail = None

    def getnext(self):
        return None


class FragmentWrapper(object):
    def __init__(self, fragment_root, obj):
        self.root_node = fragment_root
        self.obj = obj
        if hasattr(self.obj, 'text'):
            self.text = ensure_str(self.obj.text)
        else:
            self.text = None
        if hasattr(self.obj, 'tail'):
            self.tail = ensure_str(self.obj.tail)
        else:
            self.tail = None
        self.isstring = isinstance(obj, str) or isinstance(obj, bytes)
        # Support for bytes here is Py2
        if self.isstring:
            self.obj = ensure_str(self.obj)

    def __getattr__(self, name):
        return getattr(self.obj, name)

    def getnext(self):
        siblings = self.root_node.children
        idx = siblings.index(self)
        if idx < len(siblings) - 1:
            return siblings[idx + 1]
        else:
            return None

    def __getitem__(self, key):
        return self.obj[key]

    def __bool__(self):
        return bool(self.obj)

    def getparent(self):
        return None

    def __str__(self):
        return str(self.obj)

    def __unicode__(self):
        return str(self.obj)

    def __len__(self):
        return len(self.obj)


class TreeWalker(_base.NonRecursiveTreeWalker):
    def __init__(self, tree):
        if hasattr(tree, "getroot"):
            tree = Root(tree)
        elif isinstance(tree, list):
            tree = FragmentRoot(tree)
        _base.NonRecursiveTreeWalker.__init__(self, tree)
        self.filter = ihatexml.InfosetFilter()

    def getNodeDetails(self, node):
        if isinstance(node, tuple):  # Text node
            node, key = node
            assert key in ("text", "tail"), _("Text nodes are text or tail, found %s") % key
            return _base.TEXT, ensure_str(getattr(node, key))

        elif isinstance(node, Root):
            return (_base.DOCUMENT,)

        elif isinstance(node, Doctype):
            return _base.DOCTYPE, node.name, node.public_id, node.system_id

        elif isinstance(node, FragmentWrapper) and node.isstring:
            return _base.TEXT, node.obj

        elif node.tag == etree.Comment:
            return _base.COMMENT, ensure_str(node.text)

        elif node.tag == etree.Entity:
            return _base.ENTITY, ensure_str(node.text)[1:-1]  # strip &;

        else:
            # This is assumed to be an ordinary element
            match = tag_regexp.match(ensure_str(node.tag))
            if match:
                namespace, tag = match.groups()
            else:
                namespace = None
                tag = ensure_str(node.tag)
            attrs = {}
            for name, value in list(node.attrib.items()):
                name = ensure_str(name)
                value = ensure_str(value)
                match = tag_regexp.match(name)
                if match:
                    attrs[(match.group(1), match.group(2))] = value
                else:
                    attrs[(None, name)] = value
            return (_base.ELEMENT, namespace, self.filter.fromXmlName(tag),
                    attrs, len(node) > 0 or node.text)

    def getFirstChild(self, node):
        assert not isinstance(node, tuple), _("Text nodes have no children")

        assert len(node) or node.text, "Node has no children"
        if node.text:
            return (node, "text")
        else:
            return node[0]

    def getNextSibling(self, node):
        if isinstance(node, tuple):  # Text node
            node, key = node
            assert key in ("text", "tail"), _("Text nodes are text or tail, found %s") % key
            if key == "text":
                # XXX: we cannot use a "bool(node) and node[0] or None" construct here
                # because node[0] might evaluate to False if it has no child element
                if len(node):
                    return node[0]
                else:
                    return None
            else:  # tail
                return node.getnext()

        return (node, "tail") if node.tail else node.getnext()

    def getParentNode(self, node):
        if isinstance(node, tuple):  # Text node
            node, key = node
            assert key in ("text", "tail"), _("Text nodes are text or tail, found %s") % key
            if key == "text":
                return node
            # else: fallback to "normal" processing

        return node.getparent()
site-packages/pip/_vendor/html5lib/treewalkers/genshistream.py000064400000004346151733463600020642 0ustar00from __future__ import absolute_import, division, unicode_literals

from genshi.core import QName
from genshi.core import START, END, XML_NAMESPACE, DOCTYPE, TEXT
from genshi.core import START_NS, END_NS, START_CDATA, END_CDATA, PI, COMMENT

from . import _base

from ..constants import voidElements, namespaces


class TreeWalker(_base.TreeWalker):
    def __iter__(self):
        # Buffer the events so we can pass in the following one
        previous = None
        for event in self.tree:
            if previous is not None:
                for token in self.tokens(previous, event):
                    yield token
            previous = event

        # Don't forget the final event!
        if previous is not None:
            for token in self.tokens(previous, None):
                yield token

    def tokens(self, event, next):
        kind, data, pos = event
        if kind == START:
            tag, attribs = data
            name = tag.localname
            namespace = tag.namespace
            converted_attribs = {}
            for k, v in attribs:
                if isinstance(k, QName):
                    converted_attribs[(k.namespace, k.localname)] = v
                else:
                    converted_attribs[(None, k)] = v

            if namespace == namespaces["html"] and name in voidElements:
                for token in self.emptyTag(namespace, name, converted_attribs,
                                           not next or next[0] != END
                                           or next[1] != tag):
                    yield token
            else:
                yield self.startTag(namespace, name, converted_attribs)

        elif kind == END:
            name = data.localname
            namespace = data.namespace
            if name not in voidElements:
                yield self.endTag(namespace, name)

        elif kind == COMMENT:
            yield self.comment(data)

        elif kind == TEXT:
            for token in self.text(data):
                yield token

        elif kind == DOCTYPE:
            yield self.doctype(*data)

        elif kind in (XML_NAMESPACE, DOCTYPE, START_NS, END_NS,
                      START_CDATA, END_CDATA, PI):
            pass

        else:
            yield self.unknown(kind)
site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshistream.cpython-33.pyc000064400000005444151733463600025123 0ustar00�
7�Re�c@s�ddlmZmZmZddlmZddlmZmZmZm	Z	m
Z
ddlmZmZm
Z
mZmZmZddlmZddlmZmZGd	d
�d
ej�ZdS(i(uabsolute_importudivisionuunicode_literals(uQName(uSTARTuENDu
XML_NAMESPACEuDOCTYPEuTEXT(uSTART_NSuEND_NSuSTART_CDATAu	END_CDATAuPIuCOMMENTi(u_basei(uvoidElementsu
namespacescBs,|EeZdZdd�Zdd�ZdS(u
TreeWalkerccs�d}xH|jD]=}|dk	rGx"|j||�D]}|Vq5Wn|}qW|dk	r�x"|j|d�D]}|VqpWndS(N(uNoneutreeutokens(uselfupreviousueventutoken((uF/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/genshistream.pyu__iter__
s
uTreeWalker.__iter__c	cs�|\}}}|tkr
|\}}|j}|j}	i}
xL|D]D\}}t|t�rz||
|j|jf<qF||
d|f<qFW|	tdkr�|tkr�x]|j|	||
|p�|dt	kp�|d|k�D]}
|
Vq�Wq�|j
|	||
�Vn�|t	krN|j}|j}	|tkr�|j|	|�Vq�n�|tkrk|j
|�Vn}|tkr�xn|j|�D]}
|
Vq�WnO|tkr�|j|�Vn2|tttttttfkr�n|j|�VdS(Nuhtmlii(uSTARTu	localnameu	namespaceu
isinstanceuQNameuNoneu
namespacesuvoidElementsuemptyTaguENDustartTaguendTaguCOMMENTucommentuTEXTutextuDOCTYPEudoctypeu
XML_NAMESPACEuSTART_NSuEND_NSuSTART_CDATAu	END_CDATAuPIuunknown(uselfueventunextukindudatauposutaguattribsunameu	namespaceuconverted_attribsukuvutoken((uF/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/genshistream.pyutokenss@				uTreeWalker.tokensN(u__name__u
__module__u__qualname__u__iter__utokens(u
__locals__((uF/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/genshistream.pyu
TreeWalkersu
TreeWalkerN(u
__future__uabsolute_importudivisionuunicode_literalsugenshi.coreuQNameuSTARTuENDu
XML_NAMESPACEuDOCTYPEuTEXTuSTART_NSuEND_NSuSTART_CDATAu	END_CDATAuPIuCOMMENTuu_baseu	constantsuvoidElementsu
namespacesu
TreeWalker(((uF/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/genshistream.pyu<module>s(.site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/lxmletree.cpython-33.pyc000064400000026357151733463600024441 0ustar00�
7�ReGc@sddlmZmZmZddlmZddlmZddlm	Z	ddl
m
Z
e
Zddlm
Z
dd	lmZd
d�ZGdd
�d
e�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd�de
j�ZdS(i(uabsolute_importudivisionuunicode_literals(u	text_type(uetreei(u
tag_regexp(ugettexti(u_base(uihatexmlcCs7|dkrdSt|t�r#|S|jdd�SdS(Nuutf-8ustrict(uNoneu
isinstanceu	text_typeudecode(us((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyu
ensure_strs
u
ensure_strcBsD|EeZdZdd�Zdd�Zdd�Zdd�Zd	S(
uRootcCs�||_g|_|jjrd|jjt|t|jj�t|jj�t|jj	���n|j
�}|}x"|j�dk	r�|j�}qyWx,|dk	r�|jj|�|j
�}q�Wd|_d|_dS(N(uelementtreeuchildrenudocinfouinternalDTDuappenduDoctypeu
ensure_stru	root_nameu	public_idu
system_urlugetrootugetpreviousuNoneugetnextutextutail(uselfueturootunode((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyu__init__s 			u
Root.__init__cCs|j|S(N(uchildren(uselfukey((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyu__getitem__-suRoot.__getitem__cCsdS(N(uNone(uself((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyugetnext0suRoot.getnextcCsdS(Ni((uself((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyu__len__3suRoot.__len__N(u__name__u
__module__u__qualname__u__init__u__getitem__ugetnextu__len__(u
__locals__((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyuRootsuRootcBs,|EeZdZdd�Zdd�ZdS(uDoctypecCs:||_||_||_||_d|_d|_dS(N(u	root_nodeunameu	public_idu	system_iduNoneutextutail(uselfu	root_nodeunameu	public_idu	system_id((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyu__init__8s					uDoctype.__init__cCs|jjdS(Ni(u	root_nodeuchildren(uself((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyugetnextAsuDoctype.getnextN(u__name__u
__module__u__qualname__u__init__ugetnext(u
__locals__((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyuDoctype7s	uDoctypecBs,|EeZdZdd�Zdd�ZdS(uFragmentRootcs0�fdd�|D��_d�_�_dS(Ncsg|]}t�|��qS((uFragmentWrapper(u.0uchild(uself(uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyu
<listcomp>Gs	u)FragmentRoot.__init__.<locals>.<listcomp>(uchildrenuNoneutextutail(uselfuchildren((uselfuC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyu__init__FsuFragmentRoot.__init__cCsdS(N(uNone(uself((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyugetnextJsuFragmentRoot.getnextN(u__name__u
__module__u__qualname__u__init__ugetnext(u
__locals__((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyuFragmentRootEsuFragmentRootcBs�|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�ZdS(uFragmentWrappercCs�||_||_t|jd�r<t|jj�|_n	d|_t|jd�rot|jj�|_n	d|_t|t�p�t|t	�|_
|j
r�t|j�|_ndS(Nutextutail(u	root_nodeuobjuhasattru
ensure_strutextuNoneutailu
isinstanceustrubytesuisstring(uselfu
fragment_rootuobj((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyu__init__Os				!	uFragmentWrapper.__init__cCst|j|�S(N(ugetattruobj(uselfuname((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyu__getattr___suFragmentWrapper.__getattr__cCsE|jj}|j|�}|t|�dkr=||dSdSdS(Ni(u	root_nodeuchildrenuindexulenuNone(uselfusiblingsuidx((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyugetnextbs
uFragmentWrapper.getnextcCs|j|S(N(uobj(uselfukey((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyu__getitem__jsuFragmentWrapper.__getitem__cCs
t|j�S(N(ubooluobj(uself((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyu__bool__msuFragmentWrapper.__bool__cCsdS(N(uNone(uself((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyu	getparentpsuFragmentWrapper.getparentcCs
t|j�S(N(ustruobj(uself((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyu__str__ssuFragmentWrapper.__str__cCs
t|j�S(N(ustruobj(uself((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyu__unicode__vsuFragmentWrapper.__unicode__cCs
t|j�S(N(ulenuobj(uself((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyu__len__ysuFragmentWrapper.__len__N(u__name__u
__module__u__qualname__u__init__u__getattr__ugetnextu__getitem__u__bool__u	getparentu__str__u__unicode__u__len__(u
__locals__((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyuFragmentWrapperNsuFragmentWrappercBsP|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS(u
TreeWalkercCsbt|d�rt|�}nt|t�r<t|�}ntjj||�tj	�|_
dS(Nugetroot(uhasattruRootu
isinstanceulistuFragmentRootu_baseuNonRecursiveTreeWalkeru__init__uihatexmlu
InfosetFilterufilter(uselfutree((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyu__init__~suTreeWalker.__init__c	Cs0t|t�rY|\}}|dks=ttd�|��tjtt||��fSt|t�rrtj	fSt|t
�r�tj|j|j
|jfSt|t�r�|jr�tj|jfS|jtjkr�tjt|j�fS|jtjkrtjt|j�dd�fStjt|j��}|rR|j�\}}nd}t|j�}i}x�t|jj��D]n\}}t|�}t|�}tj|�}|r�|||j d�|j d�f<q�||d|f<q�Wtj!||j"j#|�|t$|�dkp(|jfSdS(	Nutextutailu%Text nodes are text or tail, found %siii(utextutaili����(%u
isinstanceutupleuAssertionErroru_u_baseuTEXTu
ensure_strugetattruRootuDOCUMENTuDoctypeuDOCTYPEunameu	public_idu	system_iduFragmentWrapperuisstringuobjutaguetreeuCommentuCOMMENTutextuEntityuENTITYu
tag_regexpumatchugroupsuNoneulistuattribuitemsugroupuELEMENTufilterufromXmlNameulen(	uselfunodeukeyumatchu	namespaceutaguattrsunameuvalue((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyugetNodeDetails�s:"
 "%uTreeWalker.getNodeDetailscCsbt|t�s"ttd���t|�sC|jsCtd��|jrV|dfS|dSdS(NuText nodes have no childrenuNode has no childrenutexti(u
isinstanceutupleuAssertionErroru_ulenutext(uselfunode((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyu
getFirstChild�s
"!	
uTreeWalker.getFirstChildcCs�t|t�rq|\}}|dks=ttd�|��|dkrdt|�r]|dSdSqq|j�Sn|jr�|dfS|j�S(Nutextutailu%Text nodes are text or tail, found %si(utextutail(u
isinstanceutupleuAssertionErroru_ulenuNoneugetnextutail(uselfunodeukey((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyugetNextSibling�s"
uTreeWalker.getNextSiblingcCsZt|t�rP|\}}|dks=ttd�|��|dkrP|Sn|j�S(Nutextutailu%Text nodes are text or tail, found %s(utextutail(u
isinstanceutupleuAssertionErroru_u	getparent(uselfunodeukey((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyu
getParentNode�s"uTreeWalker.getParentNodeN(u__name__u
__module__u__qualname__u__init__ugetNodeDetailsu
getFirstChildugetNextSiblingu
getParentNode(u
__locals__((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyu
TreeWalker}s
)	u
TreeWalkerN(u
__future__uabsolute_importudivisionuunicode_literalsupip._vendor.sixu	text_typeulxmluetreeutreebuilders.etreeu
tag_regexpugettextu_uu_baseuihatexmlu
ensure_struobjectuRootuDoctypeuFragmentRootuFragmentWrapperuNonRecursiveTreeWalkeru
TreeWalker(((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/lxmletree.pyu<module>s		/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-33.pyc000064400000005113151733463600024162 0ustar00�
7�Re	c@sWdZddlmZmZmZddlZddlmZiZddd�Z
dS(u�A collection of modules for iterating through different kinds of
tree, generating tokens identical to those produced by the tokenizer
module.

To create a tree walker for a new type of tree, you need to do
implement a tree walker object (called TreeWalker by convention) that
implements a 'serialize' method taking a tree as sole argument and
returning an iterator generating tokens.
i(uabsolute_importudivisionuunicode_literalsNi(u
default_etreecKs|j�}|tkr�|dkr[dt|f}t|�tj|}|jt|<q�|dkr�ddlm}|jt|<q�|dkr�ddlm	}|jt|<q�|d	kr�dd
lm
}|dkr�t}n|j
||�jSntj|�S(
u6Get a TreeWalker class for various types of tree with built-in support

    treeType - the name of the tree type required (case-insensitive). Supported
               values are:

                "dom" - The xml.dom.minidom DOM implementation
                "pulldom" - The xml.dom.pulldom event stream
                "etree" - A generic walker for tree implementations exposing an
                          elementtree-like interface (known to work with
                          ElementTree, cElementTree and lxml.etree).
                "lxml" - Optimized walker for lxml.etree
                "genshi" - a Genshi stream

    implementation - (Currently applies to the "etree" tree type only). A module
                      implementing the tree type e.g. xml.etree.ElementTree or
                      cElementTree.udomupulldomu%s.%sugenshii(ugenshistreamulxml(u	lxmletreeuetree(uetree(udomupulldomN(ulowerutreeWalkerCacheu__name__u
__import__usysumodulesu
TreeWalkeruugenshistreamu	lxmletreeuetreeuNoneu
default_etreeugetETreeModuleuget(utreeTypeuimplementationukwargsunameumodugenshistreamu	lxmletreeuetree((uB/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/__init__.pyu
getTreeWalkers&

	u
getTreeWalker(u__doc__u
__future__uabsolute_importudivisionuunicode_literalsusysuutilsu
default_etreeutreeWalkerCacheuNoneu
getTreeWalker(((uB/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/__init__.pyu<module>	s
site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/pulldom.cpython-33.pyc000064400000005214151733463600024101 0ustar00�
7�Re�c@s�ddlmZmZmZddlmZmZmZmZm	Z	ddl
mZddlm
Z
Gdd�dej�Zd	S(
i(uabsolute_importudivisionuunicode_literals(u
START_ELEMENTuEND_ELEMENTuCOMMENTuIGNORABLE_WHITESPACEu
CHARACTERSi(u_basei(uvoidElementscBs,|EeZdZdd�Zdd�ZdS(u
TreeWalkerccs	d}d}x�|jD]�}|dk	r�|dksD|d|kr�|d|kr]d}nx?|j||�D](}|V|ddkrp|d}qpqpWn|}qW|dks�|d|kr�x=|j|d�D]}|Vq�Wn|dk	rtd��ndS(NiutypeuEmptyTagu<Illformed DOM event stream: void element without END_ELEMENT(uNoneutreeutokensu
ValueError(uselfuignore_untilupreviousueventutoken((uA/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/pulldom.pyu__iter__s"	
uTreeWalker.__iter__c
cs�|\}}|tkr�|j}|j}i}xEt|jj��D].}|j|�}|j||j|jf<qFW|t	kr�xM|j
||||p�|d|k	�D]}	|	Vq�Wq}|j|||�Vn�|tkr|j}|j}|t	kr}|j
||�Vq}ne|tkr8|j|j�VnE|ttfkrox0|j|j�D]}	|	Vq]Wn|j|�VdS(Ni(u
START_ELEMENTunodeNameunamespaceURIulistu
attributesukeysugetAttributeNodeuvalueu	localNameuvoidElementsuemptyTagustartTaguEND_ELEMENTuendTaguCOMMENTucommentu	nodeValueuIGNORABLE_WHITESPACEu
CHARACTERSutextuunknown(
uselfueventunextutypeunodeunameu	namespaceuattrsuattrutoken((uA/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/pulldom.pyutokenss4				uTreeWalker.tokensN(u__name__u
__module__u__qualname__u__iter__utokens(u
__locals__((uA/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/pulldom.pyu
TreeWalkersu
TreeWalkerN(u
__future__uabsolute_importudivisionuunicode_literalsuxml.dom.pulldomu
START_ELEMENTuEND_ELEMENTuCOMMENTuIGNORABLE_WHITESPACEu
CHARACTERSuu_baseu	constantsuvoidElementsu
TreeWalker(((uA/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/pulldom.pyu<module>s(site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-33.pyc000064400000012242151733463600023530 0ustar00�
7�Rec@s�ddlmZmZmZyddlmZWnAek
rsyddlmZWnek
rneZYnXYnXddl	Z	e	j	Z
ddlZddlm
Z
ddlmZddlmZejd	�Zd
d�Zee�ZdS(i(uabsolute_importudivisionuunicode_literals(uOrderedDictN(u	text_typei(u_basei(umoduleFactoryFactoryu
{([^}]*)}(.*)cs>|}|jd�j�G�fdd�dtj�}t�S(NuasdcsP|EeZdZdZ�fdd�Zdd�Zdd�Zdd	�Zd
S(u#getETreeBuilder.<locals>.TreeWalkeru�Given the particular ElementTree representation, this implementation,
        to avoid using recursion, returns "nodes" as tuples with the following
        content:

        1. The current element

        2. The index of the element relative to its parent

        3. A stack of ancestor elements

        4. A flag "text", "tail" or None to indicate if the current node is a
           text node; either the text or tail of the current element (1)
        cs�t|t�rL|\}}}}|dkrCtjt||�fS|}nt|d�sj|j�}n|jdkr�tjfS|jdkr�tj	|j
|jd�|jd�fS|j�kr�tj|j
fSt
|j�tkstt
|j���tj|j�}|r0|j�\}}nd}|j}t�}	xmt|jj��D]V\}
}tj|
�}|r�||	|jd	�|jd
�f<q^||	d|
f<q^Wtj|||	t|�p�|j
fSdS(
Nutextutailutagu
DOCUMENT_ROOTuDOCUMENT_FRAGMENTu
<!DOCTYPE>upublicIdusystemIdii(utextutail(u
DOCUMENT_ROOTuDOCUMENT_FRAGMENT(u
isinstanceutupleu_baseuTEXTugetattruhasattrugetrootutaguDOCUMENTuDOCTYPEutextugetuCOMMENTutypeu	text_typeuAssertionErroru
tag_regexpumatchugroupsuNoneuOrderedDictulistuattribuitemsugroupuELEMENTulen(uselfunodeueltukeyuparentsuflagumatchu	namespaceutaguattrsunameuvalue(uElementTreeCommentType(u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/etree.pyugetNodeDetails)s8	
*		"%u2getETreeBuilder.<locals>.TreeWalker.getNodeDetailscSs�t|t�r$|\}}}}n|dgdf\}}}}|dkrRdS|jrk|||dfSt|�r�|j|�|dd|dfSdSdS(Nutextutaili(utextutail(u
isinstanceutupleuNoneutextulenuappend(uselfunodeuelementukeyuparentsuflag((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/etree.pyu
getFirstChildQs	
u1getETreeBuilder.<locals>.TreeWalker.getFirstChildcSs�t|t�r$|\}}}}ndS|dkrht|�ra|j|�|dd|dfSdSnc|jr�|dkr�|||dfS|t|d�dkr�|d|d|d|dfSdSdS(Nutextiutailii����i����(u
isinstanceutupleuNoneulenuappendutail(uselfunodeuelementukeyuparentsuflag((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/etree.pyugetNextSiblingbs
 u2getETreeBuilder.<locals>.TreeWalker.getNextSiblingcSs�t|t�r$|\}}}}ndS|dkrQ|s>|S|||dfSn9|j�}|sg|S|t|d�j|�|dfSdS(Nutextii����(u
isinstanceutupleuNoneupopulistuindex(uselfunodeuelementukeyuparentsuflaguparent((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/etree.pyu
getParentNodevsu1getETreeBuilder.<locals>.TreeWalker.getParentNodeN(u__name__u
__module__u__qualname__u__doc__ugetNodeDetailsu
getFirstChildugetNextSiblingu
getParentNode(u
__locals__(uElementTreeCommentType(u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/etree.pyu
TreeWalkers

(u
TreeWalker(uCommentutagu_baseuNonRecursiveTreeWalkerulocals(uElementTreeImplementationuElementTreeu
TreeWalker((uElementTreeCommentTypeu?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/etree.pyugetETreeBuildersmugetETreeBuilder(u
__future__uabsolute_importudivisionuunicode_literalsucollectionsuOrderedDictuImportErroruordereddictudictugettextu_ureupip._vendor.sixu	text_typeuu_baseuutilsumoduleFactoryFactoryucompileu
tag_regexpugetETreeBuilderugetETreeModule(((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/etree.pyu<module>s 

	ssite-packages/pip/_vendor/html5lib/treewalkers/__pycache__/_base.cpython-33.pyc000064400000024504151733463600023501 0ustar00�
7�Rec@sddlmZmZmZddlmZmZddlZejZddl	m
Z
e
jZe
j
Ze
jZe
jZe
jZe
jZdZddlmZmZdje�Zdd	d
�Zdd�ZGd
d�de�Z Gdd�de �Z!dS(i(uabsolute_importudivisionuunicode_literals(u	text_typeustring_typesN(uNodeu<#UNKNOWN#>i(uvoidElementsuspaceCharactersucCs>|dkr|rdSdSnt|t�r0|St|�SdS(u<Wrapper around six.text_type to convert None to empty stringuN(uNoneu
isinstanceu	text_type(usu
blank_if_none((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyuto_textsuto_textcCs|dkpt|t�S(u2Wrapper around isinstance(string_types) or is NoneN(uNoneu
isinstanceustring_types(ustring((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyuis_text_or_none"suis_text_or_nonecBs�|EeZdZdd�Zdd�Zdd�Zddd�Zd	d
�Zdd�Z	d
d�Z
dd�Zddddd�Zdd�Zdd�ZdS(u
TreeWalkercCs
||_dS(N(utree(uselfutree((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyu__init__(suTreeWalker.__init__cCs
t�dS(N(uNotImplementedError(uself((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyu__iter__+suTreeWalker.__iter__cCsidd6|d6S(NuSerializeErrorutypeudata((uselfumsg((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyuerror.suTreeWalker.errorccs�|dks-t|t�s-tt|���t|t�sNtt|���tdd�|j�D��sst�idd6t|d	�d6t|�d6|d6V|r�|j	t
d��VndS(
NcssT|]J\\}}}|dks0t|t�oKt|t�oKt|t�VqdS(N(uNoneu
isinstanceustring_types(u.0u	namespaceunameuvalue((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyu	<genexpr>4su&TreeWalker.emptyTag.<locals>.<genexpr>uEmptyTagutypeunameu	namespaceudatauVoid element has childrenF(uNoneu
isinstanceustring_typesuAssertionErrorutypeualluitemsuto_textuFalseuerroru_(uselfu	namespaceunameuattrsuhasChildren((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyuemptyTag1s-!
	uTreeWalker.emptyTagcCs�|dks-t|t�s-tt|���t|t�sNtt|���tdd�|j�D��sst�idd6t|�d6t|�d6t	dd�|j�D��d6S(	NcssT|]J\\}}}|dks0t|t�oKt|t�oKt|t�VqdS(N(uNoneu
isinstanceustring_types(u.0u	namespaceunameuvalue((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyu	<genexpr>Bsu&TreeWalker.startTag.<locals>.<genexpr>uStartTagutypeunameu	namespacecssE|];\\}}}t|d�t|�ft|d�fVqdS(NF(uto_textuFalse(u.0u	namespaceunameuvalue((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyu	<genexpr>Jsudata(
uNoneu
isinstanceustring_typesuAssertionErrorutypeualluitemsu	text_typeuto_textudict(uselfu	namespaceunameuattrs((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyustartTag?s-!


uTreeWalker.startTagcCs}|dks-t|t�s-tt|���t|t�sNtt|���idd6t|d�d6t|�d6id6S(NuEndTagutypeunameu	namespaceudataF(uNoneu
isinstanceustring_typesuAssertionErrorutypeuto_textuFalse(uselfu	namespaceuname((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyuendTagNs-!

uTreeWalker.endTagccs�t|t�s!tt|���t|�}|jt�}|dt|�t|��}|rxidd6|d6Vn|}|jt�}|t|�d�}|r�idd6|d6Vn|r�idd6|d6VndS(NuSpaceCharactersutypeudatau
Characters(	u
isinstanceustring_typesuAssertionErrorutypeuto_textulstripuspaceCharactersulenurstrip(uselfudataumiddleulefturight((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyutextWs! uTreeWalker.textcCs9t|t�s!tt|���idd6t|�d6S(NuCommentutypeudata(u
isinstanceustring_typesuAssertionErrorutypeu	text_type(uselfudata((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyucommentgs!uTreeWalker.commentcCs�t|�stt|���t|�s<tt|���t|�sZtt|���idd6t|�d6t|�d6t|�d6t|�d6S(NuDoctypeutypeunameupublicIdusystemIducorrect(uis_text_or_noneuAssertionErrorutypeuto_text(uselfunameupublicIdusystemIducorrect((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyudoctypels



uTreeWalker.doctypecCs9t|t�s!tt|���idd6t|�d6S(NuEntityutypeuname(u
isinstanceustring_typesuAssertionErrorutypeu	text_type(uselfuname((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyuentityws!uTreeWalker.entitycCs|jtd�|�S(NuUnknown node type: (uerroru_(uselfunodeType((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyuunknown|suTreeWalker.unknownNFT(u__name__u
__module__u__qualname__u__init__u__iter__uerroruFalseuemptyTagustartTaguendTagutextucommentuNoneuTrueudoctypeuentityuunknown(u
__locals__((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyu
TreeWalker's	u
TreeWalkercBsP|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS(uNonRecursiveTreeWalkercCs
t�dS(N(uNotImplementedError(uselfunode((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyugetNodeDetails�su%NonRecursiveTreeWalker.getNodeDetailscCs
t�dS(N(uNotImplementedError(uselfunode((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyu
getFirstChild�su$NonRecursiveTreeWalker.getFirstChildcCs
t�dS(N(uNotImplementedError(uselfunode((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyugetNextSibling�su%NonRecursiveTreeWalker.getNextSiblingcCs
t�dS(N(uNotImplementedError(uselfunode((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyu
getParentNode�su$NonRecursiveTreeWalker.getParentNodeccst|j}xd|dk	ro|j|�}|d|dd�}}d}|tkre|j|�Vn	|tkr�x�|j|�D]}|Vq�Wn�|tkr|\}}}}|t	kr�x%|j
||||�D]}|Vq�Wd}qn|j|||�Vni|tkr&|j
|d�VnH|tkrG|j|d�Vn'|tkr\d}n|j|d�V|r�|j|�}	nd}	|	dk	r�|	}qx�|dk	rk|j|�}|d|dd�}}|tkr|\}}}}|t	kr|j||�Vqn|j|kr4d}Pn|j|�}
|
dk	rY|
}Pq�|j|�}q�WqWdS(NiiFT(utreeuNoneugetNodeDetailsuFalseuDOCTYPEudoctypeuTEXTutextuELEMENTuvoidElementsuemptyTagustartTaguCOMMENTucommentuENTITYuentityuDOCUMENTuTrueuunknownu
getFirstChilduendTagugetNextSiblingu
getParentNode(uselfucurrentNodeudetailsutypeuhasChildrenutokenu	namespaceunameu
attributesu
firstChildunextSibling((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyu__iter__�sZ	
				uNonRecursiveTreeWalker.__iter__N(u__name__u
__module__u__qualname__ugetNodeDetailsu
getFirstChildugetNextSiblingu
getParentNodeu__iter__(u
__locals__((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyuNonRecursiveTreeWalker�s
uNonRecursiveTreeWalkerT("u
__future__uabsolute_importudivisionuunicode_literalsupip._vendor.sixu	text_typeustring_typesugettextu_uxml.domuNodeu
DOCUMENT_NODEuDOCUMENTuDOCUMENT_TYPE_NODEuDOCTYPEu	TEXT_NODEuTEXTuELEMENT_NODEuELEMENTuCOMMENT_NODEuCOMMENTuENTITY_NODEuENTITYuUNKNOWNu	constantsuvoidElementsuspaceCharactersujoinuTrueuto_textuis_text_or_noneuobjectu
TreeWalkeruNonRecursiveTreeWalker(((u?/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/_base.pyu<module>s"							
Ysite-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-33.pyc000064400000005032151733463600023202 0ustar00�
7�Re�c@snddlmZmZmZddlmZddlZejZddlm	Z	Gdd�de	j
�ZdS(i(uabsolute_importudivisionuunicode_literals(uNodeNi(u_basecBsD|EeZdZdd�Zdd�Zdd�Zdd�Zd	S(
u
TreeWalkercCsX|jtjkr.tj|j|j|jfS|jtjtj	fkrYtj
|jfS|jtjkr�i}xgt
|jj��D]P}|j|�}|jr�|j||j|jf<q�|j|d|jf<q�Wtj|j|j||j�fS|jtjkrtj|jfS|jtjtjfkrDtjfStj|jfSdS(N(unodeTypeuNodeuDOCUMENT_TYPE_NODEu_baseuDOCTYPEunameupublicIdusystemIdu	TEXT_NODEuCDATA_SECTION_NODEuTEXTu	nodeValueuELEMENT_NODEulistu
attributesukeysugetAttributeNodeunamespaceURIuvalueu	localNameuNoneuELEMENTunodeNameu
hasChildNodesuCOMMENT_NODEuCOMMENTu
DOCUMENT_NODEuDOCUMENT_FRAGMENT_NODEuDOCUMENTuUNKNOWN(uselfunodeuattrsuattr((u=/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/dom.pyugetNodeDetailss$	
uTreeWalker.getNodeDetailscCs|jS(N(u
firstChild(uselfunode((u=/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/dom.pyu
getFirstChild'suTreeWalker.getFirstChildcCs|jS(N(unextSibling(uselfunode((u=/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/dom.pyugetNextSibling*suTreeWalker.getNextSiblingcCs|jS(N(u
parentNode(uselfunode((u=/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/dom.pyu
getParentNode-suTreeWalker.getParentNodeN(u__name__u
__module__u__qualname__ugetNodeDetailsu
getFirstChildugetNextSiblingu
getParentNode(u
__locals__((u=/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/dom.pyu
TreeWalkersu
TreeWalker(u
__future__uabsolute_importudivisionuunicode_literalsuxml.domuNodeugettextu_uu_baseuNonRecursiveTreeWalkeru
TreeWalker(((u=/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treewalkers/dom.pyu<module>s
	site-packages/pip/_vendor/html5lib/treewalkers/_base.py000064400000015407151733463600017222 0ustar00from __future__ import absolute_import, division, unicode_literals
from pip._vendor.six import text_type, string_types

import gettext
_ = gettext.gettext

from xml.dom import Node

DOCUMENT = Node.DOCUMENT_NODE
DOCTYPE = Node.DOCUMENT_TYPE_NODE
TEXT = Node.TEXT_NODE
ELEMENT = Node.ELEMENT_NODE
COMMENT = Node.COMMENT_NODE
ENTITY = Node.ENTITY_NODE
UNKNOWN = "<#UNKNOWN#>"

from ..constants import voidElements, spaceCharacters
spaceCharacters = "".join(spaceCharacters)


def to_text(s, blank_if_none=True):
    """Wrapper around six.text_type to convert None to empty string"""
    if s is None:
        if blank_if_none:
            return ""
        else:
            return None
    elif isinstance(s, text_type):
        return s
    else:
        return text_type(s)


def is_text_or_none(string):
    """Wrapper around isinstance(string_types) or is None"""
    return string is None or isinstance(string, string_types)


class TreeWalker(object):
    def __init__(self, tree):
        self.tree = tree

    def __iter__(self):
        raise NotImplementedError

    def error(self, msg):
        return {"type": "SerializeError", "data": msg}

    def emptyTag(self, namespace, name, attrs, hasChildren=False):
        assert namespace is None or isinstance(namespace, string_types), type(namespace)
        assert isinstance(name, string_types), type(name)
        assert all((namespace is None or isinstance(namespace, string_types)) and
                   isinstance(name, string_types) and
                   isinstance(value, string_types)
                   for (namespace, name), value in attrs.items())

        yield {"type": "EmptyTag", "name": to_text(name, False),
               "namespace": to_text(namespace),
               "data": attrs}
        if hasChildren:
            yield self.error(_("Void element has children"))

    def startTag(self, namespace, name, attrs):
        assert namespace is None or isinstance(namespace, string_types), type(namespace)
        assert isinstance(name, string_types), type(name)
        assert all((namespace is None or isinstance(namespace, string_types)) and
                   isinstance(name, string_types) and
                   isinstance(value, string_types)
                   for (namespace, name), value in attrs.items())

        return {"type": "StartTag",
                "name": text_type(name),
                "namespace": to_text(namespace),
                "data": dict(((to_text(namespace, False), to_text(name)),
                              to_text(value, False))
                             for (namespace, name), value in attrs.items())}

    def endTag(self, namespace, name):
        assert namespace is None or isinstance(namespace, string_types), type(namespace)
        assert isinstance(name, string_types), type(namespace)

        return {"type": "EndTag",
                "name": to_text(name, False),
                "namespace": to_text(namespace),
                "data": {}}

    def text(self, data):
        assert isinstance(data, string_types), type(data)

        data = to_text(data)
        middle = data.lstrip(spaceCharacters)
        left = data[:len(data) - len(middle)]
        if left:
            yield {"type": "SpaceCharacters", "data": left}
        data = middle
        middle = data.rstrip(spaceCharacters)
        right = data[len(middle):]
        if middle:
            yield {"type": "Characters", "data": middle}
        if right:
            yield {"type": "SpaceCharacters", "data": right}

    def comment(self, data):
        assert isinstance(data, string_types), type(data)

        return {"type": "Comment", "data": text_type(data)}

    def doctype(self, name, publicId=None, systemId=None, correct=True):
        assert is_text_or_none(name), type(name)
        assert is_text_or_none(publicId), type(publicId)
        assert is_text_or_none(systemId), type(systemId)

        return {"type": "Doctype",
                "name": to_text(name),
                "publicId": to_text(publicId),
                "systemId": to_text(systemId),
                "correct": to_text(correct)}

    def entity(self, name):
        assert isinstance(name, string_types), type(name)

        return {"type": "Entity", "name": text_type(name)}

    def unknown(self, nodeType):
        return self.error(_("Unknown node type: ") + nodeType)


class NonRecursiveTreeWalker(TreeWalker):
    def getNodeDetails(self, node):
        raise NotImplementedError

    def getFirstChild(self, node):
        raise NotImplementedError

    def getNextSibling(self, node):
        raise NotImplementedError

    def getParentNode(self, node):
        raise NotImplementedError

    def __iter__(self):
        currentNode = self.tree
        while currentNode is not None:
            details = self.getNodeDetails(currentNode)
            type, details = details[0], details[1:]
            hasChildren = False

            if type == DOCTYPE:
                yield self.doctype(*details)

            elif type == TEXT:
                for token in self.text(*details):
                    yield token

            elif type == ELEMENT:
                namespace, name, attributes, hasChildren = details
                if name in voidElements:
                    for token in self.emptyTag(namespace, name, attributes,
                                               hasChildren):
                        yield token
                    hasChildren = False
                else:
                    yield self.startTag(namespace, name, attributes)

            elif type == COMMENT:
                yield self.comment(details[0])

            elif type == ENTITY:
                yield self.entity(details[0])

            elif type == DOCUMENT:
                hasChildren = True

            else:
                yield self.unknown(details[0])

            if hasChildren:
                firstChild = self.getFirstChild(currentNode)
            else:
                firstChild = None

            if firstChild is not None:
                currentNode = firstChild
            else:
                while currentNode is not None:
                    details = self.getNodeDetails(currentNode)
                    type, details = details[0], details[1:]
                    if type == ELEMENT:
                        namespace, name, attributes, hasChildren = details
                        if name not in voidElements:
                            yield self.endTag(namespace, name)
                    if self.tree is currentNode:
                        currentNode = None
                        break
                    nextSibling = self.getNextSibling(currentNode)
                    if nextSibling is not None:
                        currentNode = nextSibling
                        break
                    else:
                        currentNode = self.getParentNode(currentNode)
site-packages/pip/_vendor/html5lib/treewalkers/dom.py000064400000002661151733463600016726 0ustar00from __future__ import absolute_import, division, unicode_literals

from xml.dom import Node

import gettext
_ = gettext.gettext

from . import _base


class TreeWalker(_base.NonRecursiveTreeWalker):
    def getNodeDetails(self, node):
        if node.nodeType == Node.DOCUMENT_TYPE_NODE:
            return _base.DOCTYPE, node.name, node.publicId, node.systemId

        elif node.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
            return _base.TEXT, node.nodeValue

        elif node.nodeType == Node.ELEMENT_NODE:
            attrs = {}
            for attr in list(node.attributes.keys()):
                attr = node.getAttributeNode(attr)
                if attr.namespaceURI:
                    attrs[(attr.namespaceURI, attr.localName)] = attr.value
                else:
                    attrs[(None, attr.name)] = attr.value
            return (_base.ELEMENT, node.namespaceURI, node.nodeName,
                    attrs, node.hasChildNodes())

        elif node.nodeType == Node.COMMENT_NODE:
            return _base.COMMENT, node.nodeValue

        elif node.nodeType in (Node.DOCUMENT_NODE, Node.DOCUMENT_FRAGMENT_NODE):
            return (_base.DOCUMENT,)

        else:
            return _base.UNKNOWN, node.nodeType

    def getFirstChild(self, node):
        return node.firstChild

    def getNextSibling(self, node):
        return node.nextSibling

    def getParentNode(self, node):
        return node.parentNode
site-packages/pip/_vendor/html5lib/treewalkers/pulldom.py000064400000004376151733463600017630 0ustar00from __future__ import absolute_import, division, unicode_literals

from xml.dom.pulldom import START_ELEMENT, END_ELEMENT, \
    COMMENT, IGNORABLE_WHITESPACE, CHARACTERS

from . import _base

from ..constants import voidElements


class TreeWalker(_base.TreeWalker):
    def __iter__(self):
        ignore_until = None
        previous = None
        for event in self.tree:
            if previous is not None and \
                    (ignore_until is None or previous[1] is ignore_until):
                if previous[1] is ignore_until:
                    ignore_until = None
                for token in self.tokens(previous, event):
                    yield token
                    if token["type"] == "EmptyTag":
                        ignore_until = previous[1]
            previous = event
        if ignore_until is None or previous[1] is ignore_until:
            for token in self.tokens(previous, None):
                yield token
        elif ignore_until is not None:
            raise ValueError("Illformed DOM event stream: void element without END_ELEMENT")

    def tokens(self, event, next):
        type, node = event
        if type == START_ELEMENT:
            name = node.nodeName
            namespace = node.namespaceURI
            attrs = {}
            for attr in list(node.attributes.keys()):
                attr = node.getAttributeNode(attr)
                attrs[(attr.namespaceURI, attr.localName)] = attr.value
            if name in voidElements:
                for token in self.emptyTag(namespace,
                                           name,
                                           attrs,
                                           not next or next[1] is not node):
                    yield token
            else:
                yield self.startTag(namespace, name, attrs)

        elif type == END_ELEMENT:
            name = node.nodeName
            namespace = node.namespaceURI
            if name not in voidElements:
                yield self.endTag(namespace, name)

        elif type == COMMENT:
            yield self.comment(node.nodeValue)

        elif type in (IGNORABLE_WHITESPACE, CHARACTERS):
            for token in self.text(node.nodeValue):
                yield token

        else:
            yield self.unknown(type)
site-packages/pip/_vendor/html5lib/treewalkers/__init__.py000064400000004423151733463600017704 0ustar00"""A collection of modules for iterating through different kinds of
tree, generating tokens identical to those produced by the tokenizer
module.

To create a tree walker for a new type of tree, you need to do
implement a tree walker object (called TreeWalker by convention) that
implements a 'serialize' method taking a tree as sole argument and
returning an iterator generating tokens.
"""

from __future__ import absolute_import, division, unicode_literals

import sys

from ..utils import default_etree

treeWalkerCache = {}


def getTreeWalker(treeType, implementation=None, **kwargs):
    """Get a TreeWalker class for various types of tree with built-in support

    treeType - the name of the tree type required (case-insensitive). Supported
               values are:

                "dom" - The xml.dom.minidom DOM implementation
                "pulldom" - The xml.dom.pulldom event stream
                "etree" - A generic walker for tree implementations exposing an
                          elementtree-like interface (known to work with
                          ElementTree, cElementTree and lxml.etree).
                "lxml" - Optimized walker for lxml.etree
                "genshi" - a Genshi stream

    implementation - (Currently applies to the "etree" tree type only). A module
                      implementing the tree type e.g. xml.etree.ElementTree or
                      cElementTree."""

    treeType = treeType.lower()
    if treeType not in treeWalkerCache:
        if treeType in ("dom", "pulldom"):
            name = "%s.%s" % (__name__, treeType)
            __import__(name)
            mod = sys.modules[name]
            treeWalkerCache[treeType] = mod.TreeWalker
        elif treeType == "genshi":
            from . import genshistream
            treeWalkerCache[treeType] = genshistream.TreeWalker
        elif treeType == "lxml":
            from . import lxmletree
            treeWalkerCache[treeType] = lxmletree.TreeWalker
        elif treeType == "etree":
            from . import etree
            if implementation is None:
                implementation = default_etree
            # XXX: NEVER cache here, caching is done in the etree submodule
            return etree.getETreeModule(implementation, **kwargs).TreeWalker
    return treeWalkerCache.get(treeType)
site-packages/pip/_vendor/html5lib/treewalkers/etree.py000064400000011021151733463600017241 0ustar00from __future__ import absolute_import, division, unicode_literals

try:
    from collections import OrderedDict
except ImportError:
    try:
        from ordereddict import OrderedDict
    except ImportError:
        OrderedDict = dict
import gettext
_ = gettext.gettext

import re

from pip._vendor.six import text_type

from . import _base
from ..utils import moduleFactoryFactory

tag_regexp = re.compile("{([^}]*)}(.*)")


def getETreeBuilder(ElementTreeImplementation):
    ElementTree = ElementTreeImplementation
    ElementTreeCommentType = ElementTree.Comment("asd").tag

    class TreeWalker(_base.NonRecursiveTreeWalker):
        """Given the particular ElementTree representation, this implementation,
        to avoid using recursion, returns "nodes" as tuples with the following
        content:

        1. The current element

        2. The index of the element relative to its parent

        3. A stack of ancestor elements

        4. A flag "text", "tail" or None to indicate if the current node is a
           text node; either the text or tail of the current element (1)
        """
        def getNodeDetails(self, node):
            if isinstance(node, tuple):  # It might be the root Element
                elt, key, parents, flag = node
                if flag in ("text", "tail"):
                    return _base.TEXT, getattr(elt, flag)
                else:
                    node = elt

            if not(hasattr(node, "tag")):
                node = node.getroot()

            if node.tag in ("DOCUMENT_ROOT", "DOCUMENT_FRAGMENT"):
                return (_base.DOCUMENT,)

            elif node.tag == "<!DOCTYPE>":
                return (_base.DOCTYPE, node.text,
                        node.get("publicId"), node.get("systemId"))

            elif node.tag == ElementTreeCommentType:
                return _base.COMMENT, node.text

            else:
                assert type(node.tag) == text_type, type(node.tag)
                # This is assumed to be an ordinary element
                match = tag_regexp.match(node.tag)
                if match:
                    namespace, tag = match.groups()
                else:
                    namespace = None
                    tag = node.tag
                attrs = OrderedDict()
                for name, value in list(node.attrib.items()):
                    match = tag_regexp.match(name)
                    if match:
                        attrs[(match.group(1), match.group(2))] = value
                    else:
                        attrs[(None, name)] = value
                return (_base.ELEMENT, namespace, tag,
                        attrs, len(node) or node.text)

        def getFirstChild(self, node):
            if isinstance(node, tuple):
                element, key, parents, flag = node
            else:
                element, key, parents, flag = node, None, [], None

            if flag in ("text", "tail"):
                return None
            else:
                if element.text:
                    return element, key, parents, "text"
                elif len(element):
                    parents.append(element)
                    return element[0], 0, parents, None
                else:
                    return None

        def getNextSibling(self, node):
            if isinstance(node, tuple):
                element, key, parents, flag = node
            else:
                return None

            if flag == "text":
                if len(element):
                    parents.append(element)
                    return element[0], 0, parents, None
                else:
                    return None
            else:
                if element.tail and flag != "tail":
                    return element, key, parents, "tail"
                elif key < len(parents[-1]) - 1:
                    return parents[-1][key + 1], key + 1, parents, None
                else:
                    return None

        def getParentNode(self, node):
            if isinstance(node, tuple):
                element, key, parents, flag = node
            else:
                return None

            if flag == "text":
                if not parents:
                    return element
                else:
                    return element, key, parents, None
            else:
                parent = parents.pop()
                if not parents:
                    return parent
                else:
                    return parent, list(parents[-1]).index(parent), parents, None

    return locals()

getETreeModule = moduleFactoryFactory(getETreeBuilder)
site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py000064400000033317151733463600020452 0ustar00"""Module for supporting the lxml.etree library. The idea here is to use as much
of the native library as possible, without using fragile hacks like custom element
names that break between releases. The downside of this is that we cannot represent
all possible trees; specifically the following are known to cause problems:

Text or comments as siblings of the root element
Docypes with no name

When any of these things occur, we emit a DataLossWarning
"""

from __future__ import absolute_import, division, unicode_literals

import warnings
import re
import sys

from . import _base
from ..constants import DataLossWarning
from .. import constants
from . import etree as etree_builders
from .. import ihatexml

import lxml.etree as etree


fullTree = True
tag_regexp = re.compile("{([^}]*)}(.*)")

comment_type = etree.Comment("asd").tag


class DocumentType(object):
    def __init__(self, name, publicId, systemId):
        self.name = name
        self.publicId = publicId
        self.systemId = systemId


class Document(object):
    def __init__(self):
        self._elementTree = None
        self._childNodes = []

    def appendChild(self, element):
        self._elementTree.getroot().addnext(element._element)

    def _getChildNodes(self):
        return self._childNodes

    childNodes = property(_getChildNodes)


def testSerializer(element):
    rv = []
    finalText = None
    infosetFilter = ihatexml.InfosetFilter()

    def serializeElement(element, indent=0):
        if not hasattr(element, "tag"):
            if hasattr(element, "getroot"):
                # Full tree case
                rv.append("#document")
                if element.docinfo.internalDTD:
                    if not (element.docinfo.public_id or
                            element.docinfo.system_url):
                        dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name
                    else:
                        dtd_str = """<!DOCTYPE %s "%s" "%s">""" % (
                            element.docinfo.root_name,
                            element.docinfo.public_id,
                            element.docinfo.system_url)
                    rv.append("|%s%s" % (' ' * (indent + 2), dtd_str))
                next_element = element.getroot()
                while next_element.getprevious() is not None:
                    next_element = next_element.getprevious()
                while next_element is not None:
                    serializeElement(next_element, indent + 2)
                    next_element = next_element.getnext()
            elif isinstance(element, str) or isinstance(element, bytes):
                # Text in a fragment
                assert isinstance(element, str) or sys.version_info.major == 2
                rv.append("|%s\"%s\"" % (' ' * indent, element))
            else:
                # Fragment case
                rv.append("#document-fragment")
                for next_element in element:
                    serializeElement(next_element, indent + 2)
        elif element.tag == comment_type:
            rv.append("|%s<!-- %s -->" % (' ' * indent, element.text))
            if hasattr(element, "tail") and element.tail:
                rv.append("|%s\"%s\"" % (' ' * indent, element.tail))
        else:
            assert isinstance(element, etree._Element)
            nsmatch = etree_builders.tag_regexp.match(element.tag)
            if nsmatch is not None:
                ns = nsmatch.group(1)
                tag = nsmatch.group(2)
                prefix = constants.prefixes[ns]
                rv.append("|%s<%s %s>" % (' ' * indent, prefix,
                                          infosetFilter.fromXmlName(tag)))
            else:
                rv.append("|%s<%s>" % (' ' * indent,
                                       infosetFilter.fromXmlName(element.tag)))

            if hasattr(element, "attrib"):
                attributes = []
                for name, value in element.attrib.items():
                    nsmatch = tag_regexp.match(name)
                    if nsmatch is not None:
                        ns, name = nsmatch.groups()
                        name = infosetFilter.fromXmlName(name)
                        prefix = constants.prefixes[ns]
                        attr_string = "%s %s" % (prefix, name)
                    else:
                        attr_string = infosetFilter.fromXmlName(name)
                    attributes.append((attr_string, value))

                for name, value in sorted(attributes):
                    rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value))

            if element.text:
                rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text))
            indent += 2
            for child in element:
                serializeElement(child, indent)
            if hasattr(element, "tail") and element.tail:
                rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail))
    serializeElement(element, 0)

    if finalText is not None:
        rv.append("|%s\"%s\"" % (' ' * 2, finalText))

    return "\n".join(rv)


def tostring(element):
    """Serialize an element and its child nodes to a string"""
    rv = []
    finalText = None

    def serializeElement(element):
        if not hasattr(element, "tag"):
            if element.docinfo.internalDTD:
                if element.docinfo.doctype:
                    dtd_str = element.docinfo.doctype
                else:
                    dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name
                rv.append(dtd_str)
            serializeElement(element.getroot())

        elif element.tag == comment_type:
            rv.append("<!--%s-->" % (element.text,))

        else:
            # This is assumed to be an ordinary element
            if not element.attrib:
                rv.append("<%s>" % (element.tag,))
            else:
                attr = " ".join(["%s=\"%s\"" % (name, value)
                                 for name, value in element.attrib.items()])
                rv.append("<%s %s>" % (element.tag, attr))
            if element.text:
                rv.append(element.text)

            for child in element:
                serializeElement(child)

            rv.append("</%s>" % (element.tag,))

        if hasattr(element, "tail") and element.tail:
            rv.append(element.tail)

    serializeElement(element)

    if finalText is not None:
        rv.append("%s\"" % (' ' * 2, finalText))

    return "".join(rv)


class TreeBuilder(_base.TreeBuilder):
    documentClass = Document
    doctypeClass = DocumentType
    elementClass = None
    commentClass = None
    fragmentClass = Document
    implementation = etree

    def __init__(self, namespaceHTMLElements, fullTree=False):
        builder = etree_builders.getETreeModule(etree, fullTree=fullTree)
        infosetFilter = self.infosetFilter = ihatexml.InfosetFilter()
        self.namespaceHTMLElements = namespaceHTMLElements

        class Attributes(dict):
            def __init__(self, element, value={}):
                self._element = element
                dict.__init__(self, value)
                for key, value in self.items():
                    if isinstance(key, tuple):
                        name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1]))
                    else:
                        name = infosetFilter.coerceAttribute(key)
                    self._element._element.attrib[name] = value

            def __setitem__(self, key, value):
                dict.__setitem__(self, key, value)
                if isinstance(key, tuple):
                    name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1]))
                else:
                    name = infosetFilter.coerceAttribute(key)
                self._element._element.attrib[name] = value

        class Element(builder.Element):
            def __init__(self, name, namespace):
                name = infosetFilter.coerceElement(name)
                builder.Element.__init__(self, name, namespace=namespace)
                self._attributes = Attributes(self)

            def _setName(self, name):
                self._name = infosetFilter.coerceElement(name)
                self._element.tag = self._getETreeTag(
                    self._name, self._namespace)

            def _getName(self):
                return infosetFilter.fromXmlName(self._name)

            name = property(_getName, _setName)

            def _getAttributes(self):
                return self._attributes

            def _setAttributes(self, attributes):
                self._attributes = Attributes(self, attributes)

            attributes = property(_getAttributes, _setAttributes)

            def insertText(self, data, insertBefore=None):
                data = infosetFilter.coerceCharacters(data)
                builder.Element.insertText(self, data, insertBefore)

            def appendChild(self, child):
                builder.Element.appendChild(self, child)

        class Comment(builder.Comment):
            def __init__(self, data):
                data = infosetFilter.coerceComment(data)
                builder.Comment.__init__(self, data)

            def _setData(self, data):
                data = infosetFilter.coerceComment(data)
                self._element.text = data

            def _getData(self):
                return self._element.text

            data = property(_getData, _setData)

        self.elementClass = Element
        self.commentClass = builder.Comment
        # self.fragmentClass = builder.DocumentFragment
        _base.TreeBuilder.__init__(self, namespaceHTMLElements)

    def reset(self):
        _base.TreeBuilder.reset(self)
        self.insertComment = self.insertCommentInitial
        self.initial_comments = []
        self.doctype = None

    def testSerializer(self, element):
        return testSerializer(element)

    def getDocument(self):
        if fullTree:
            return self.document._elementTree
        else:
            return self.document._elementTree.getroot()

    def getFragment(self):
        fragment = []
        element = self.openElements[0]._element
        if element.text:
            fragment.append(element.text)
        fragment.extend(list(element))
        if element.tail:
            fragment.append(element.tail)
        return fragment

    def insertDoctype(self, token):
        name = token["name"]
        publicId = token["publicId"]
        systemId = token["systemId"]

        if not name:
            warnings.warn("lxml cannot represent empty doctype", DataLossWarning)
            self.doctype = None
        else:
            coercedName = self.infosetFilter.coerceElement(name)
            if coercedName != name:
                warnings.warn("lxml cannot represent non-xml doctype", DataLossWarning)

            doctype = self.doctypeClass(coercedName, publicId, systemId)
            self.doctype = doctype

    def insertCommentInitial(self, data, parent=None):
        self.initial_comments.append(data)

    def insertCommentMain(self, data, parent=None):
        if (parent == self.document and
                self.document._elementTree.getroot()[-1].tag == comment_type):
                warnings.warn("lxml cannot represent adjacent comments beyond the root elements", DataLossWarning)
        super(TreeBuilder, self).insertComment(data, parent)

    def insertRoot(self, token):
        """Create the document root"""
        # Because of the way libxml2 works, it doesn't seem to be possible to
        # alter information like the doctype after the tree has been parsed.
        # Therefore we need to use the built-in parser to create our iniial
        # tree, after which we can add elements like normal
        docStr = ""
        if self.doctype:
            assert self.doctype.name
            docStr += "<!DOCTYPE %s" % self.doctype.name
            if (self.doctype.publicId is not None or
                    self.doctype.systemId is not None):
                docStr += (' PUBLIC "%s" ' %
                           (self.infosetFilter.coercePubid(self.doctype.publicId or "")))
                if self.doctype.systemId:
                    sysid = self.doctype.systemId
                    if sysid.find("'") >= 0 and sysid.find('"') >= 0:
                        warnings.warn("DOCTYPE system cannot contain single and double quotes", DataLossWarning)
                        sysid = sysid.replace("'", 'U00027')
                    if sysid.find("'") >= 0:
                        docStr += '"%s"' % sysid
                    else:
                        docStr += "'%s'" % sysid
                else:
                    docStr += "''"
            docStr += ">"
            if self.doctype.name != token["name"]:
                warnings.warn("lxml cannot represent doctype with a different name to the root element", DataLossWarning)
        docStr += "<THIS_SHOULD_NEVER_APPEAR_PUBLICLY/>"
        root = etree.fromstring(docStr)

        # Append the initial comments:
        for comment_token in self.initial_comments:
            root.addprevious(etree.Comment(comment_token["data"]))

        # Create the root document and add the ElementTree to it
        self.document = self.documentClass()
        self.document._elementTree = root.getroottree()

        # Give the root element the right name
        name = token["name"]
        namespace = token.get("namespace", self.defaultNamespace)
        if namespace is None:
            etree_tag = name
        else:
            etree_tag = "{%s}%s" % (namespace, name)
        root.tag = etree_tag

        # Add the root element to the internal child/open data structures
        root_element = self.elementClass(name, namespace)
        root_element._element = root
        self.document._childNodes.append(root_element)
        self.openElements.append(root_element)

        # Reset to the default insert comment function
        self.insertComment = self.insertCommentMain
site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-33.pyc000064400000006726151733463600024336 0ustar00�
7�ReM
c@sKdZddlmZmZmZddlmZiZddd�Z	dS(u�A collection of modules for building different kinds of tree from
HTML documents.

To create a treebuilder for a new type of tree, you need to do
implement several things:

1) A set of classes for various types of elements: Document, Doctype,
Comment, Element. These must implement the interface of
_base.treebuilders.Node (although comment nodes have a different
signature for their constructor, see treebuilders.etree.Comment)
Textual content may also be implemented as another node type, or not, as
your tree implementation requires.

2) A treebuilder object (called TreeBuilder by convention) that
inherits from treebuilders._base.TreeBuilder. This has 4 required attributes:
documentClass - the class to use for the bottommost node of a document
elementClass - the class to use for HTML Elements
commentClass - the class to use for comments
doctypeClass - the class to use for doctypes
It also has one required method:
getDocument - Returns the root node of the complete document tree

3) If you wish to run the unit tests, you must also create a
testSerializer method on your treebuilder which accepts a node and
returns a string containing Node and its children serialized according
to the format used in the unittests
i(uabsolute_importudivisionuunicode_literalsi(u
default_etreecKs�|j�}|tkr�|dkrlddlm}|dkrYddlm}|}n|j||�jS|dkr�ddlm	}|jt|<q�|dkr�dd	lm
}|dkr�t}n|j||�jSt
d
|��ntj|�S(u�Get a TreeBuilder class for various types of tree with built-in support

    treeType - the name of the tree type required (case-insensitive). Supported
               values are:

               "dom" - A generic builder for DOM implementations, defaulting to
                       a xml.dom.minidom based implementation.
               "etree" - A generic builder for tree implementations exposing an
                         ElementTree-like interface, defaulting to
                         xml.etree.cElementTree if available and
                         xml.etree.ElementTree if not.
               "lxml" - A etree-based builder for lxml.etree, handling
                        limitations of lxml's implementation.

    implementation - (Currently applies to the "etree" and "dom" tree types). A
                      module implementing the tree type e.g.
                      xml.etree.ElementTree or xml.etree.cElementTree.udomi(udomi(uminidomulxml(u
etree_lxmluetree(uetreeuUnrecognised treebuilder "%s" N(ulowerutreeBuilderCacheuudomuNoneuxml.domuminidomugetDomModuleuTreeBuilderu
etree_lxmluetreeu
default_etreeugetETreeModuleu
ValueErroruget(utreeTypeuimplementationukwargsudomuminidomu
etree_lxmluetree((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/__init__.pyugetTreeBuilder$s$		ugetTreeBuilderN(
u__doc__u
__future__uabsolute_importudivisionuunicode_literalsuutilsu
default_etreeutreeBuilderCacheuNoneugetTreeBuilder(((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/__init__.pyu<module>ssite-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-33.pyc000064400000046016151733463600023677 0ustar00�
7�ReM1c@s�ddlmZmZmZddlmZddlZddlmZddlm	Z	ddlm
Z
dd	l
mZdd
lm
Z
ejd�Zedd
�Ze
e�ZdS(i(uabsolute_importudivisionuunicode_literals(u	text_typeNi(u_basei(uihatexml(u	constants(u
namespaces(umoduleFactoryFactoryu
{([^}]*)}(.*)c	s	���jd�j�G�fdd�dtj��G�fdd�d���G�fdd�d���G�fdd	�d	���G�fd
d�d����fdd
��	��fdd�}G��������	fdd�dtj�}t�S(Nuasdcs(|EeZdZd#�fdd�Zdd�Zdd�Zdd�Zeee�Z	d	d
�Z
dd�Zeee
�Zd
d�Z
dd�Zee
e�Zdd�Zdd�Zeee�Zdd�Zdd�Zdd�Zdd�Zd#dd�Zdd �Zd!d"�Zd#S($u getETreeBuilder.<locals>.Elementcs�||_||_�j|j||��|_|dkrUtd|jf|_n|j|jf|_d|_g|_	g|_
dS(Nuhtml(u_nameu
_namespaceuElementu_getETreeTagu_elementuNoneu
namespacesu	nameTupleuparentu_childNodesu_flags(uselfunameu	namespace(uElementTree(u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu__init__s				u)getETreeBuilder.<locals>.Element.__init__cSs)|dkr|}nd||f}|S(Nu{%s}%s(uNone(uselfunameu	namespaceu	etree_tag((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu_getETreeTag!s	u-getETreeBuilder.<locals>.Element._getETreeTagcSs+||_|j|j|j�|j_dS(N(u_nameu_getETreeTagu
_namespaceu_elementutag(uselfuname((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu_setName(s	u)getETreeBuilder.<locals>.Element._setNamecSs|jS(N(u_name(uself((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu_getName,su)getETreeBuilder.<locals>.Element._getNamecSs+||_|j|j|j�|j_dS(N(u
_namespaceu_getETreeTagu_nameu_elementutag(uselfu	namespace((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu
_setNamespace1s	u.getETreeBuilder.<locals>.Element._setNamespacecSs|jS(N(u
_namespace(uself((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu
_getNamespace5su.getETreeBuilder.<locals>.Element._getNamespacecSs
|jjS(N(u_elementuattrib(uself((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu_getAttributes:su/getETreeBuilder.<locals>.Element._getAttributescSs�x-t|jjj��D]}|jj|=qWx]|j�D]O\}}t|t�rsd|d|df}n|}|jj||�q=WdS(Nu{%s}%sii(ulistu_elementuattribukeysuitemsu
isinstanceutupleuset(uselfu
attributesukeyuvalueuname((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu_setAttributes=su/getETreeBuilder.<locals>.Element._setAttributescSs|jS(N(u_childNodes(uself((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu_getChildNodesKsu/getETreeBuilder.<locals>.Element._getChildNodescSs;|jdd�=g|_x|D]}|j|�q WdS(N(u_elementu_childNodesuinsertChild(uselfuvalueuelement((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu_setChildNodesNs	
u/getETreeBuilder.<locals>.Element._setChildNodescSst|jjpt|j��S(u,Return true if the node has children or text(uboolu_elementutextulen(uself((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu
hasContentVsu+getETreeBuilder.<locals>.Element.hasContentcSs0|jj|�|jj|j�||_dS(N(u_childNodesuappendu_elementuparent(uselfunode((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyuappendChildZsu,getETreeBuilder.<locals>.Element.appendChildcSs>t|j�j|j�}|jj||j�||_dS(N(ulistu_elementuindexuinsertuparent(uselfunodeurefNodeuindex((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyuinsertBefore_su-getETreeBuilder.<locals>.Element.insertBeforecSs |jj|j�d|_dS(N(u_elementuremoveuNoneuparent(uselfunode((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyuremoveChilddsu,getETreeBuilder.<locals>.Element.removeChildcSs-t|j�s?|jjs*d|j_n|jj|7_n�|dkr�|jdjsnd|jd_n|jdj|7_n�t|j�}|j|j�}|dkr�|j|djs�d|j|d_n|j|dj|7_n-|jjsd|j_n|jj|7_dS(Nuiii����i����i����(ulenu_elementutextuNoneutailulistuindex(uselfudatauinsertBeforeuchildrenuindex((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu
insertTexths"u+getETreeBuilder.<locals>.Element.insertTextcSsLt|�|j|j�}x*|jj�D]\}}||j|<q+W|S(N(utypeunameu	namespaceu
attributesuitems(uselfuelementunameuvalue((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu	cloneNodesu*getETreeBuilder.<locals>.Element.cloneNodecSs�|jr+|jdjj|jj7_nH|jjsFd|j_n|jjdk	rs|jj|jj7_nd|j_tjj||�dS(Niui����(u
childNodesu_elementutailutextuNoneu_baseuNodeureparentChildren(uselfu	newParent((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyureparentChildren�s	"u1getETreeBuilder.<locals>.Element.reparentChildrenN(u__name__u
__module__u__qualname__uNoneu__init__u_getETreeTagu_setNameu_getNameupropertyunameu
_setNamespaceu
_getNamespaceu	namespaceu_getAttributesu_setAttributesu
attributesu_getChildNodesu_setChildNodesu
childNodesu
hasContentuappendChilduinsertBeforeuremoveChildu
insertTextu	cloneNodeureparentChildren(u
__locals__(uElementTree(u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyuElements*
uElementcsM|EeZdZ�fdd�Zdd�Zdd�Zeee�ZdS(u getETreeBuilder.<locals>.Commentcs1�j|�|_d|_g|_g|_dS(N(uCommentu_elementuNoneuparentu_childNodesu_flags(uselfudata(uElementTree(u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu__init__�s		u)getETreeBuilder.<locals>.Comment.__init__cSs
|jjS(N(u_elementutext(uself((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu_getData�su)getETreeBuilder.<locals>.Comment._getDatacSs||j_dS(N(u_elementutext(uselfuvalue((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu_setData�su)getETreeBuilder.<locals>.Comment._setDataN(u__name__u
__module__u__qualname__u__init__u_getDatau_setDataupropertyudata(u
__locals__(uElementTree(u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyuComment�suCommentcst|EeZdZ�fdd�Zdd�Zdd�Zeee�Zdd�Zd	d
�Z	eee	�Z
dS(u%getETreeBuilder.<locals>.DocumentTypecs2�j|d�||j_||_||_dS(Nu
<!DOCTYPE>(u__init__u_elementutextupublicIdusystemId(uselfunameupublicIdusystemId(uElement(u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu__init__�s	u.getETreeBuilder.<locals>.DocumentType.__init__cSs|jjdd�S(NupublicIdu(u_elementuget(uself((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu_getPublicId�su2getETreeBuilder.<locals>.DocumentType._getPublicIdcSs&|dk	r"|jjd|�ndS(NupublicId(uNoneu_elementuset(uselfuvalue((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu_setPublicId�su2getETreeBuilder.<locals>.DocumentType._setPublicIdcSs|jjdd�S(NusystemIdu(u_elementuget(uself((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu_getSystemId�su2getETreeBuilder.<locals>.DocumentType._getSystemIdcSs&|dk	r"|jjd|�ndS(NusystemId(uNoneu_elementuset(uselfuvalue((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu_setSystemId�su2getETreeBuilder.<locals>.DocumentType._setSystemIdN(u__name__u
__module__u__qualname__u__init__u_getPublicIdu_setPublicIdupropertyupublicIdu_getSystemIdu_setSystemIdusystemId(u
__locals__(uElement(u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyuDocumentType�suDocumentTypecs&|EeZdZ�fdd�ZdS(u!getETreeBuilder.<locals>.Documentcs�j|d�dS(Nu
DOCUMENT_ROOT(u__init__(uself(uElement(u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu__init__�su*getETreeBuilder.<locals>.Document.__init__N(u__name__u
__module__u__qualname__u__init__(u
__locals__(uElement(u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyuDocument�suDocumentcs&|EeZdZ�fdd�ZdS(u)getETreeBuilder.<locals>.DocumentFragmentcs�j|d�dS(NuDOCUMENT_FRAGMENT(u__init__(uself(uElement(u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu__init__�su2getETreeBuilder.<locals>.DocumentFragment.__init__N(u__name__u
__module__u__qualname__u__init__(u
__locals__(uElement(u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyuDocumentFragment�suDocumentFragmentcs;g�d���fdd���|d�dj��S(Nics�t|d�s|j�}n|jdkr�|jd�sK|jd�r�|jd�p]d}|jd�prd}�jd|j||f�q0�jd|jf�n�|jdkrM�jd	�|jdk	r��jd
d|d|jf�n|jdk	rtd
��nt|d�r0t	|j
�r0td��q0n�|j�kr}�jdd||jf�n�t|jt�s�t
dt|j�|jf��tj|j�}|dkr�|j}n/|j�\}}tj|}d||f}�jdd||f�t|d�rg}x�|j
j�D]r\}}	tj|�}|dk	r�|j�\}}tj|}d||f}
n|}
|j|
|	f�qJWx?t|�D].\}}	�jdd|d||	f�q�Wn|jr0�jd
d|d|jf�n|d7}x|D]}�||�qAW|jr��jd
d|d|jf�ndS(Nutagu
<!DOCTYPE>upublicIdusystemIduu<!DOCTYPE %s "%s" "%s">u
<!DOCTYPE %s>u
DOCUMENT_ROOTu	#documentu|%s"%s"u iuDocument node cannot have tailuattribu$Document node cannot have attributesu|%s<!-- %s -->uExpected unicode, got %s, %su%s %su|%s<%s>u
|%s%s="%s"(uhasattrugetrootutagugetuappendutextuNoneutailu	TypeErrorulenuattribu
isinstanceu	text_typeuAssertionErrorutypeu
tag_regexpumatchugroupsu	constantsuprefixesuitemsusorted(uelementuindentupublicIdusystemIdunsmatchunameunsuprefixu
attributesuvalueuattr_stringuchild(uElementTreeCommentTypeurvuserializeElement(u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyuserializeElement�s^	
%!

)	%

	uAgetETreeBuilder.<locals>.testSerializer.<locals>.serializeElementu
(ujoin(uelement(uElementTreeCommentType(urvuserializeElementu@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyutestSerializer�s7
u'getETreeBuilder.<locals>.testSerializercsGg�tj�������fdd���|�dj��S(u4Serialize an element and its child nodes to a stringcsTt|�j�r!|j�}n|jdkr�|jd�sN|jd�r�|jd�p`d}|jd�pud}�jd|j||f�q4�jd|jf�n�|jdkrL|jdk	r��j|j�n|jdk	rt	d��nt
|d	�r.t|j�r.t	d
��nx|D]}�|�q5Wn�|j�kru�jd|jf�n�|js��jd�j
|j�f�nEd
j�fdd�|jj�D��}�jd|j|f�|jr�j|j�nx|D]}�|�q	W�jd|jf�|jrP�j|j�ndS(Nu
<!DOCTYPE>upublicIdusystemIduu<!DOCTYPE %s PUBLIC "%s" "%s">u
<!DOCTYPE %s>u
DOCUMENT_ROOTuDocument node cannot have tailuattribu$Document node cannot have attributesu	<!--%s-->u<%s>u cs/g|]%\}}d�j|�|f�qS(u%s="%s"(ufromXmlName(u.0unameuvalue(ufilter(u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu
<listcomp>#s	uOgetETreeBuilder.<locals>.tostring.<locals>.serializeElement.<locals>.<listcomp>u<%s %s>u</%s>(u
isinstanceuElementTreeugetrootutagugetuappendutextuNoneutailu	TypeErroruhasattrulenuattribufromXmlNameujoinuitems(uelementupublicIdusystemIduchilduattr(uElementTreeuElementTreeCommentTypeufilterurvuserializeElement(u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyuserializeElements@	
	#	
	u;getETreeBuilder.<locals>.tostring.<locals>.serializeElementu(uihatexmlu
InfosetFilterujoin(uelement(uElementTreeuElementTreeCommentType(ufilterurvuserializeElementu@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyutostrings
-
u!getETreeBuilder.<locals>.tostringcsh|EeZdZ�Z�Z�Z�Z�Z�Z�fdd�Z	�fdd�Z
dd�ZdS(u$getETreeBuilder.<locals>.TreeBuildercs
�|�S(N((uselfuelement(utestSerializer(u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyutestSerializer>su3getETreeBuilder.<locals>.TreeBuilder.testSerializercsP�r|jjS|jdk	r9|jjjd|j�S|jjjd�SdS(Nu{%s}htmluhtml(udocumentu_elementudefaultNamespaceuNoneufind(uself(ufullTree(u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyugetDocumentAs
u0getETreeBuilder.<locals>.TreeBuilder.getDocumentcSstjj|�jS(N(u_baseuTreeBuilderugetFragmentu_element(uself((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyugetFragmentKsu0getETreeBuilder.<locals>.TreeBuilder.getFragmentN(u__name__u
__module__u__qualname__u
documentClassudoctypeClassuelementClassucommentClassu
fragmentClassuimplementationutestSerializerugetDocumentugetFragment(u
__locals__(uCommentuDocumentuDocumentFragmentuDocumentTypeuElementuElementTreeImplementationufullTreeutestSerializer(u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyuTreeBuilder6s
uTreeBuilder(uCommentutagu_baseuNodeuTreeBuilderulocals(uElementTreeImplementationufullTreeutostringuTreeBuilder((
uCommentuDocumentuDocumentFragmentuDocumentTypeuElementuElementTreeuElementTreeCommentTypeuElementTreeImplementationufullTreeutestSerializeru@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyugetETreeBuilders}>64ugetETreeBuilder(u
__future__uabsolute_importudivisionuunicode_literalsupip._vendor.sixu	text_typeureuu_baseuihatexmlu	constantsu
namespacesuutilsumoduleFactoryFactoryucompileu
tag_regexpuFalseugetETreeBuilderugetETreeModule(((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree.pyu<module>s�Csite-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-33.pyc000064400000045757151733463600024746 0ustar00�
7�Re�6c@s-dZddlmZmZmZddlZddlZddlZddlm	Z	ddl
mZddlm
Z
dd	lmZ
dd
lmZddljZdZejd�Zejd�jZGd
d�de�ZGdd�de�Zdd�Zdd�ZGdd�de	j�ZdS(u�Module for supporting the lxml.etree library. The idea here is to use as much
of the native library as possible, without using fragile hacks like custom element
names that break between releases. The downside of this is that we cannot represent
all possible trees; specifically the following are known to cause problems:

Text or comments as siblings of the root element
Docypes with no name

When any of these things occur, we emit a DataLossWarning
i(uabsolute_importudivisionuunicode_literalsNi(u_basei(uDataLossWarning(u	constants(uetree(uihatexmlu
{([^}]*)}(.*)uasdcBs |EeZdZdd�ZdS(uDocumentTypecCs||_||_||_dS(N(unameupublicIdusystemId(uselfunameupublicIdusystemId((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu__init__"s		uDocumentType.__init__N(u__name__u
__module__u__qualname__u__init__(u
__locals__((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyuDocumentType!suDocumentTypecBsD|EeZdZdd�Zdd�Zdd�Zee�ZdS(uDocumentcCsd|_g|_dS(N(uNoneu_elementTreeu_childNodes(uself((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu__init__)s	uDocument.__init__cCs|jj�j|j�dS(N(u_elementTreeugetrootuaddnextu_element(uselfuelement((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyuappendChild-suDocument.appendChildcCs|jS(N(u_childNodes(uself((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu_getChildNodes0suDocument._getChildNodesN(u__name__u
__module__u__qualname__u__init__uappendChildu_getChildNodesupropertyu
childNodes(u
__locals__((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyuDocument(suDocumentcssg�d}tj��d���fdd���|d�|dk	rf�jdd|f�ndj��S(	Nic
sLt|d�s�t|d�r
�jd�|jjr�|jjpL|jjsbd|jj}n%d|jj|jj|jjf}�jdd|d|f�n|j�}x"|j�dk	r�|j�}q�Wx�|dk	r	�||d�|j
�}q�WqHt|t�s+t|t
�rpt|t�sRtjjdksRt��jd	d||f�qH�jd
�x�|D]}�||d�q�Wn�|jtkr�jdd||jf�t|d�rH|jrH�jd	d||jf�qHn=t|tj�s#t�tjj|j�}|dk	r�|jd
�}|jd�}tj|}�jdd||�j|�f�n'�jdd|�j|j�f�t|d�r�g}x�|jj �D]�\}	}
tj|	�}|dk	rM|j!�\}}	�j|	�}	tj|}d||	f}n�j|	�}|j||
f�q�Wx?t"|�D].\}	}
�jdd|d|	|
f�q�Wn|jr��jd	d|d|jf�n|d7}x|D]}�||�q�Wt|d�rH|jrH�jd	d|d|jf�ndS(Nutagugetrootu	#documentu
<!DOCTYPE %s>u<!DOCTYPE %s "%s" "%s">u|%s%su iu|%s"%s"u#document-fragmentu|%s<!-- %s -->utailiu
|%s<%s %s>u|%s<%s>uattribu%s %su
|%s%s="%s"(#uhasattruappendudocinfouinternalDTDu	public_idu
system_urlu	root_nameugetrootugetpreviousuNoneugetnextu
isinstanceustrubytesusysuversion_infoumajoruAssertionErrorutagucomment_typeutextutailuetreeu_Elementuetree_buildersu
tag_regexpumatchugroupu	constantsuprefixesufromXmlNameuattribuitemsugroupsusorted(
uelementuindentudtd_strunext_elementunsmatchunsutaguprefixu
attributesunameuvalueuattr_stringuchild(u
infosetFilterurvuserializeElement(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyuserializeElement;st
		"'

$

)	%

u(testSerializer.<locals>.serializeElementu|%s"%s"u iu
u  (uNoneuihatexmlu
InfosetFilteruappendujoin(uelementu	finalText((u
infosetFilterurvuserializeElementuE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyutestSerializer6sF
utestSerializercs^g�d}��fdd���|�|dk	rQ�jdd|f�ndj��S(	u4Serialize an element and its child nodes to a stringcsqt|d�si|jjrV|jjr6|jj}nd|jj}�j|�n�|j��n�|jtkr��jd|j	f�n�|j
s��jd|jf�n?djdd�|j
j�D��}�jd|j|f�|j	r�j|j	�nx|D]}�|�qW�jd	|jf�t|d
�rm|j
rm�j|j
�ndS(Nutagu
<!DOCTYPE %s>u	<!--%s-->u<%s>u cSs&g|]\}}d||f�qS(u%s="%s"((u.0unameuvalue((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu
<listcomp>�s	u6tostring.<locals>.serializeElement.<locals>.<listcomp>u<%s %s>u</%s>utail(uhasattrudocinfouinternalDTDudoctypeu	root_nameuappendugetrootutagucomment_typeutextuattribujoinuitemsutail(uelementudtd_struattruchild(urvuserializeElement(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyuserializeElement�s*		
u"tostring.<locals>.serializeElementu%s"u iuNu  (uNoneuappendujoin(uelementu	finalText((urvuserializeElementuE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyutostring�s 
utostringcs�|EeZdZeZeZdZdZ	eZ
eZddd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zdd
d�Zd�fdd�Zdd�Z�S(uTreeBuildercs�tjtd|��tj��|_||_G�fdd�dt��G���fdd�d�j�}G��fdd�d�j	�}||_
�j	|_tj
j||�dS(NufullTreecs;|EeZdZi�fdd�Z�fdd�ZdS(u(TreeBuilder.__init__.<locals>.Attributescs�||_tj||�xo|j�D]a\}}t|t�red|d�j|d�f}n�j|�}||jjj|<q&WdS(Nu{%s}%sii(u_elementudictu__init__uitemsu
isinstanceutupleucoerceAttributeuattrib(uselfuelementuvalueukeyuname(u
infosetFilter(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu__init__�s	$u1TreeBuilder.__init__.<locals>.Attributes.__init__csltj|||�t|t�rFd|d�j|d�f}n�j|�}||jjj|<dS(Nu{%s}%sii(udictu__setitem__u
isinstanceutupleucoerceAttributeu_elementuattrib(uselfukeyuvalueuname(u
infosetFilter(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu__setitem__�s
$u4TreeBuilder.__init__.<locals>.Attributes.__setitem__N(u__name__u
__module__u__qualname__u__init__u__setitem__(u
__locals__(u
infosetFilter(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu
Attributes�s
u
Attributescs�|EeZdZ���fdd�Z�fdd�Z�fdd�Zeee�Zdd�Z�fd	d
�Z	eee	�Z
d��fdd�Z�fd
d�Z
dS(u%TreeBuilder.__init__.<locals>.Elementcs;�j|�}�jj||d|��|�|_dS(Nu	namespace(u
coerceElementuElementu__init__u_attributes(uselfunameu	namespace(u
Attributesubuilderu
infosetFilter(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu__init__�su.TreeBuilder.__init__.<locals>.Element.__init__cs4�j|�|_|j|j|j�|j_dS(N(u
coerceElementu_nameu_getETreeTagu
_namespaceu_elementutag(uselfuname(u
infosetFilter(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu_setName�su.TreeBuilder.__init__.<locals>.Element._setNamecs�j|j�S(N(ufromXmlNameu_name(uself(u
infosetFilter(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu_getName�su.TreeBuilder.__init__.<locals>.Element._getNamecSs|jS(N(u_attributes(uself((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu_getAttributes�su4TreeBuilder.__init__.<locals>.Element._getAttributescs�||�|_dS(N(u_attributes(uselfu
attributes(u
Attributes(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu_setAttributes�su4TreeBuilder.__init__.<locals>.Element._setAttributescs)�j|�}�jj|||�dS(N(ucoerceCharactersuElementu
insertText(uselfudatauinsertBefore(ubuilderu
infosetFilter(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu
insertText�su0TreeBuilder.__init__.<locals>.Element.insertTextcs�jj||�dS(N(uElementuappendChild(uselfuchild(ubuilder(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyuappendChild�su1TreeBuilder.__init__.<locals>.Element.appendChildN(u__name__u
__module__u__qualname__u__init__u_setNameu_getNameupropertyunameu_getAttributesu_setAttributesu
attributesuNoneu
insertTextuappendChild(u
__locals__(u
Attributesubuilderu
infosetFilter(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyuElement�suElementcsV|EeZdZ��fdd�Z�fdd�Zdd�Zeee�ZdS(u%TreeBuilder.__init__.<locals>.Commentcs&�j|�}�jj||�dS(N(u
coerceCommentuCommentu__init__(uselfudata(ubuilderu
infosetFilter(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu__init__�su.TreeBuilder.__init__.<locals>.Comment.__init__cs�j|�}||j_dS(N(u
coerceCommentu_elementutext(uselfudata(u
infosetFilter(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu_setData�su.TreeBuilder.__init__.<locals>.Comment._setDatacSs
|jjS(N(u_elementutext(uself((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu_getData�su.TreeBuilder.__init__.<locals>.Comment._getDataN(u__name__u
__module__u__qualname__u__init__u_setDatau_getDataupropertyudata(u
__locals__(ubuilderu
infosetFilter(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyuComment�suComment(uetree_buildersugetETreeModuleuetreeuihatexmlu
InfosetFilteru
infosetFilterunamespaceHTMLElementsudictuElementuCommentuelementClassucommentClassu_baseuTreeBuilderu__init__(uselfunamespaceHTMLElementsufullTreeuElementuComment((u
Attributesubuilderu
infosetFilteruE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu__init__�s	%"	uTreeBuilder.__init__cCs2tjj|�|j|_g|_d|_dS(N(u_baseuTreeBuilderuresetuinsertCommentInitialu
insertCommentuinitial_commentsuNoneudoctype(uself((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyuresets	uTreeBuilder.resetcCs
t|�S(N(utestSerializer(uselfuelement((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyutestSerializersuTreeBuilder.testSerializercCs$tr|jjS|jjj�SdS(N(ufullTreeudocumentu_elementTreeugetroot(uself((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyugetDocuments
uTreeBuilder.getDocumentcCseg}|jdj}|jr2|j|j�n|jt|��|jra|j|j�n|S(Ni(uopenElementsu_elementutextuappenduextendulistutail(uselfufragmentuelement((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyugetFragments		uTreeBuilder.getFragmentcCs�|d}|d}|d}|s@tjdt�d|_nO|jj|�}||krqtjdt�n|j|||�}||_dS(NunameupublicIdusystemIdu#lxml cannot represent empty doctypeu%lxml cannot represent non-xml doctype(uwarningsuwarnuDataLossWarninguNoneudoctypeu
infosetFilteru
coerceElementudoctypeClass(uselfutokenunameupublicIdusystemIducoercedNameudoctype((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu
insertDoctype!s


uTreeBuilder.insertDoctypecCs|jj|�dS(N(uinitial_commentsuappend(uselfudatauparent((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyuinsertCommentInitial1su TreeBuilder.insertCommentInitialcs^||jkrA|jjj�djtkrAtjdt�ntt	|�j
||�dS(Niu@lxml cannot represent adjacent comments beyond the root elementsi����(udocumentu_elementTreeugetrootutagucomment_typeuwarningsuwarnuDataLossWarningusuperuTreeBuilderu
insertComment(uselfudatauparent(u	__class__(uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyuinsertCommentMain4suTreeBuilder.insertCommentMainc
Cscd}|jr`|jjs!t�|d|jj7}|jjdk	sY|jjdk	r*|d|jj|jjpwd�7}|jjr|jj}|jd�dkr�|jd�dkr�t	j
dt�|jdd�}n|jd�dkr|d	|7}q'|d
|7}q*|d7}n|d7}|jj|d
kr`t	j
dt�q`n|d7}t
j|�}x+|jD] }|jt
j|d��q�W|j�|_|j�|j_|d
}|jd|j�}|dkr�|}nd||f}||_|j||�}	||	_|jjj|	�|jj|	�|j|_dS(uCreate the document rootuu<!DOCTYPE %su
 PUBLIC "%s" u'iu"u6DOCTYPE system cannot contain single and double quotesuU00027u"%s"u'%s'u''u>unameuGlxml cannot represent doctype with a different name to the root elementu$<THIS_SHOULD_NEVER_APPEAR_PUBLICLY/>udatau	namespaceu{%s}%sN( udoctypeunameuAssertionErrorupublicIduNoneusystemIdu
infosetFilterucoercePubidufinduwarningsuwarnuDataLossWarningureplaceuetreeu
fromstringuinitial_commentsuaddpreviousuCommentu
documentClassudocumentugetroottreeu_elementTreeugetudefaultNamespaceutaguelementClassu_elementu_childNodesuappenduopenElementsuinsertCommentMainu
insertComment(
uselfutokenudocStrusysidurootu
comment_tokenunameu	namespaceu	etree_taguroot_element((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu
insertRoot:sJ	 *



			uTreeBuilder.insertRootNF(u__name__u
__module__u__qualname__uDocumentu
documentClassuDocumentTypeudoctypeClassuNoneuelementClassucommentClassu
fragmentClassuetreeuimplementationuFalseu__init__uresetutestSerializerugetDocumentugetFragmentu
insertDoctypeuinsertCommentInitialuinsertCommentMainu
insertRoot(u
__locals__((u	__class__uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyuTreeBuilder�sJ
uTreeBuilderT(u__doc__u
__future__uabsolute_importudivisionuunicode_literalsuwarningsureusysuu_baseu	constantsuDataLossWarninguetreeuetree_buildersuihatexmlu
lxml.etreeuTrueufullTreeucompileu
tag_regexpuCommentutagucomment_typeuobjectuDocumentTypeuDocumentutestSerializerutostringuTreeBuilder(((uE/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/etree_lxml.pyu<module>
s$S-site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/_base.cpython-33.pyc000064400000042306151733463600023642 0ustar00�
7�Re�5c@shddlmZmZmZddlmZddlmZmZm	Z	dZiee�dfd6eeee	ddfg�B�dfd6eeee	ddfe	ddfg�B�dfd	6ee	ddfe	dd
fg�dfd
6ee	ddfe	ddfg�dfd
6ZGdd�de�ZGdd�de�ZGdd�de�ZdS(i(uabsolute_importudivisionuunicode_literals(u	text_typei(uscopingElementsutableInsertModeElementsu
namespacesuhtmlubuttonuoluululistutableuoptgroupuoptionuselectcBs�|EeZdZdd�Zdd�Zdd�Zdd�Zdd	d
�Zdd�Z	d
d�Z
dd�Zdd�Zdd�Z
dS(uNodecCs:||_d|_d|_i|_g|_g|_dS(u6Node representing an item in the tree.
        name - The tag name associated with the node
        parent - The parent of the current node (or None for the document node)
        value - The value of the current node (applies to text nodes and
        comments
        attributes - a dict holding name, value pairs for attributes of the node
        childNodes - a list of child nodes of the current node. This must
        include all elements but not necessarily other node types
        _flags - A list of miscellaneous flags that can be set on the node
        N(unameuNoneuparentuvalueu
attributesu
childNodesu_flags(uselfuname((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu__init__s					u
Node.__init__cCsKdjdd�|jj�D��}|r<d|j|fSd|jSdS(Nu cSs&g|]\}}d||f�qS(u%s="%s"((u.0unameuvalue((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu
<listcomp>+s	u Node.__str__.<locals>.<listcomp>u<%s %s>u<%s>(ujoinu
attributesuitemsuname(uselfu
attributesStr((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu__str__*s
uNode.__str__cCsd|jS(Nu<%s>(uname(uself((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu__repr__3su
Node.__repr__cCs
t�dS(u3Insert node as a child of the current node
        N(uNotImplementedError(uselfunode((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyuappendChild6suNode.appendChildcCs
t�dS(u�Insert data as text in the current node, positioned before the
        start of node insertBefore or to the end of the node's text.
        N(uNotImplementedError(uselfudatauinsertBefore((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu
insertText;suNode.insertTextcCs
t�dS(u�Insert node as a child of the current node, before refNode in the
        list of child nodes. Raises ValueError if refNode is not a child of
        the current nodeN(uNotImplementedError(uselfunodeurefNode((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyuinsertBeforeAsuNode.insertBeforecCs
t�dS(u:Remove node from the children of the current node
        N(uNotImplementedError(uselfunode((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyuremoveChildGsuNode.removeChildcCs.x|jD]}|j|�q
Wg|_dS(u�Move all the children of the current node to newParent.
        This is needed so that trees that don't store text as nodes move the
        text in the correct way
        N(u
childNodesuappendChild(uselfu	newParentuchild((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyureparentChildrenLsuNode.reparentChildrencCs
t�dS(u�Return a shallow copy of the current node i.e. a node with the same
        name and attributes but with no parent or child nodes
        N(uNotImplementedError(uself((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu	cloneNodeVsuNode.cloneNodecCs
t�dS(uFReturn true if the node has children or text, false otherwise
        N(uNotImplementedError(uself((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu
hasContent\suNode.hasContentN(u__name__u
__module__u__qualname__u__init__u__str__u__repr__uappendChilduNoneu
insertTextuinsertBeforeuremoveChildureparentChildrenu	cloneNodeu
hasContent(u
__locals__((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyuNodes	
uNodecBs,|EeZdZdd�Zdd�ZdS(uActiveFormattingElementscCs�d}|tkrxj|ddd�D]R}|tkr<Pn|j||�r[|d7}n|dkr&|j|�Pq&q&Wntj||�dS(Niiii����(uMarkeru
nodesEqualuremoveulistuappend(uselfunodeu
equalCountuelement((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyuappendcs

uActiveFormattingElements.appendcCs0|j|jksdS|j|jks,dSdS(NFT(u	nameTupleuFalseu
attributesuTrue(uselfunode1unode2((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu
nodesEqualps
u#ActiveFormattingElements.nodesEqualN(u__name__u
__module__u__qualname__uappendu
nodesEqual(u
__locals__((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyuActiveFormattingElementsbs
uActiveFormattingElementscBsC|EeZdZdZd*Zd*Zd*Zd*Zd*Z	dd�Z
dd�Zd*dd�Zdd	�Z
d
d�Zdd
�Zdd�Zdd�Zd*dd�Zdd�Zdd�Zdd�Zeee�Zdd�Zdd�Zd*dd�Zd d!�Zd*d"d#�Zd$d%�Zd&d'�Zd(d)�Zd*S(+uTreeBuilderuBase treebuilder implementation
    documentClass - the class to use for the bottommost node of a document
    elementClass - the class to use for HTML Elements
    commentClass - the class to use for comments
    doctypeClass - the class to use for doctypes
    cCs)|rd|_n	d|_|j�dS(Nuhttp://www.w3.org/1999/xhtml(udefaultNamespaceuNoneureset(uselfunamespaceHTMLElements((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu__init__�s	uTreeBuilder.__init__cCsCg|_t�|_d|_d|_d|_|j�|_	dS(NF(
uopenElementsuActiveFormattingElementsuactiveFormattingElementsuNoneuheadPointeruformPointeruFalseuinsertFromTableu
documentClassudocument(uself((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyureset�s				uTreeBuilder.resetcCs�t|d�}t|\}}xZt|j�D]I}|j|krK|s]||kra|radS||j|kAr/dSq/Wds�t�dS(Nu	nameTupleTF(	uhasattrulistElementsMapureverseduopenElementsunameuTrueu	nameTupleuFalseuAssertionError(uselfutargetuvariantu	exactNodeulistElementsuinvertunode((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyuelementInScope�suTreeBuilder.elementInScopecCs |js
dSt|j�d}|j|}|tksH||jkrLdSxL|tkr�||jkr�|dkr�d}Pn|d8}|j|}qOWx~|d7}|j|}|j�}|jidd6|jd6|jd6|jd6�}||j|<||jd	kr�Pq�q�dS(
NiiuStartTagutypeunameu	namespaceudatai����i����(	uactiveFormattingElementsulenuMarkeruopenElementsu	cloneNodeu
insertElementunameu	namespaceu
attributes(uselfuiuentryucloneuelement((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu#reconstructActiveFormattingElements�s.	






u/TreeBuilder.reconstructActiveFormattingElementscCs>|jj�}x(|jr9|tkr9|jj�}qWdS(N(uactiveFormattingElementsupopuMarker(uselfuentry((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyuclearActiveFormattingElements�su)TreeBuilder.clearActiveFormattingElementscCsHxA|jddd�D])}|tkr-Pq|j|kr|SqWdS(u�Check if an element exists between the end of the active
        formatting elements and the last marker. If it does, return it, else
        return falseNii����F(uactiveFormattingElementsuMarkerunameuFalse(uselfunameuitem((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu!elementInActiveFormattingElements�su-TreeBuilder.elementInActiveFormattingElementscCs3|j|�}|jj|�|jj|�dS(N(u
createElementuopenElementsuappendudocumentuappendChild(uselfutokenuelement((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu
insertRoot�suTreeBuilder.insertRootcCsG|d}|d}|d}|j|||�}|jj|�dS(NunameupublicIdusystemId(udoctypeClassudocumentuappendChild(uselfutokenunameupublicIdusystemIdudoctype((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu
insertDoctype�s



uTreeBuilder.insertDoctypecCs:|dkr|jd}n|j|j|d��dS(Niudatai����(uNoneuopenElementsuappendChilducommentClass(uselfutokenuparent((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu
insertCommentsuTreeBuilder.insertCommentcCsB|d}|jd|j�}|j||�}|d|_|S(u.Create an element but don't insert it anywhereunameu	namespaceudata(ugetudefaultNamespaceuelementClassu
attributes(uselfutokenunameu	namespaceuelement((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu
createElements


uTreeBuilder.createElementcCs|jS(N(u_insertFromTable(uself((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu_getInsertFromTablesuTreeBuilder._getInsertFromTablecCs.||_|r|j|_n|j|_dS(usSwitch the function used to insert an element from the
        normal one to the misnested table one and back againN(u_insertFromTableuinsertElementTableu
insertElementuinsertElementNormal(uselfuvalue((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu_setInsertFromTables	uTreeBuilder._setInsertFromTablecCs�|d}t|t�s)td|��|jd|j�}|j||�}|d|_|jdj|�|jj	|�|S(NunameuElement %s not unicodeu	namespaceudataii����(
u
isinstanceu	text_typeuAssertionErrorugetudefaultNamespaceuelementClassu
attributesuopenElementsuappendChilduappend(uselfutokenunameu	namespaceuelement((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyuinsertElementNormals

uTreeBuilder.insertElementNormalcCs�|j|�}|jdjtkr2|j|�S|j�\}}|dkr`|j|�n|j||�|jj	|�|S(u-Create an element and insert it into the treeii����N(
u
createElementuopenElementsunameutableInsertModeElementsuinsertElementNormalugetTableMisnestedNodePositionuNoneuappendChilduinsertBeforeuappend(uselfutokenuelementuparentuinsertBefore((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyuinsertElementTable(s
uTreeBuilder.insertElementTablecCs{|dkr|jd}n|jsE|jrU|jdjtkrU|j|�n"|j�\}}|j||�dS(uInsert text data.iNi����i����(uNoneuopenElementsuinsertFromTableunameutableInsertModeElementsu
insertTextugetTableMisnestedNodePosition(uselfudatauparentuinsertBefore((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu
insertText8s
	uTreeBuilder.insertTextcCs�d}d}d}x7|jddd�D]}|jdkr)|}Pq)q)W|r�|jrm|j}|}q�|j|jj|�d}n
|jd}||fS(usGet the foster parent element, and sibling to insert before
        (or None) when inserting a misnested table nodeNiutableii����(uNoneuopenElementsunameuparentuindex(uselfu	lastTableufosterParentuinsertBeforeuelm((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyugetTableMisnestedNodePositionGs			
u)TreeBuilder.getTableMisnestedNodePositionc
CsO|jd
j}|td�krK||krK|jj�|j|�ndS(Niuddudtuliuoptionuoptgroupupurpurti����(uddudtuliuoptionuoptgroupupurpurt(uopenElementsunameu	frozensetupopugenerateImpliedEndTags(uselfuexcludeuname((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyugenerateImpliedEndTagsas

u"TreeBuilder.generateImpliedEndTagscCs|jS(uReturn the final tree(udocument(uself((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyugetDocumentksuTreeBuilder.getDocumentcCs$|j�}|jdj|�|S(uReturn the final fragmenti(u
fragmentClassuopenElementsureparentChildren(uselfufragment((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyugetFragmentosuTreeBuilder.getFragmentcCs
t�dS(uzSerialize the subtree of node in the format required by unit tests
        node - the node from which to start serializingN(uNotImplementedError(uselfunode((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyutestSerializervsuTreeBuilder.testSerializerN( u__name__u
__module__u__qualname__u__doc__uNoneu
documentClassuelementClassucommentClassudoctypeClassu
fragmentClassu__init__uresetuelementInScopeu#reconstructActiveFormattingElementsuclearActiveFormattingElementsu!elementInActiveFormattingElementsu
insertRootu
insertDoctypeu
insertCommentu
createElementu_getInsertFromTableu_setInsertFromTableupropertyuinsertFromTableuinsertElementNormaluinsertElementTableu
insertTextugetTableMisnestedNodePositionugenerateImpliedEndTagsugetDocumentugetFragmentutestSerializer(u
__locals__((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyuTreeBuilderzs6.	

uTreeBuilderNFT(u
__future__uabsolute_importudivisionuunicode_literalsupip._vendor.sixu	text_typeu	constantsuscopingElementsutableInsertModeElementsu
namespacesuNoneuMarkeru	frozensetuFalseusetuTrueulistElementsMapuobjectuNodeulistuActiveFormattingElementsuTreeBuilder(((u@/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/_base.pyu<module>s*! Ksite-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-33.pyc000064400000035667151733463610023365 0ustar00�
7�Re!c@s�ddlmZmZmZddlmZmZddlZddlm	Z	ddlm
Z
ddl
mZdd	lm
Z
d
d�Ze
e�ZdS(i(uabsolute_importudivisionuunicode_literals(uminidomuNodeNi(u_basei(u	constants(u
namespaces(umoduleFactoryFactorycsy��Gdd�dt��G��fdd�dtj��G����fdd�dtj�}dd��t�S(	NcBst|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS(ugetDomBuilder.<locals>.AttrListcSs
||_dS(N(uelement(uselfuelement((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyu__init__su(getDomBuilder.<locals>.AttrList.__init__cSst|jjj��j�S(N(ulistuelementu
attributesuitemsu__iter__(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyu__iter__su(getDomBuilder.<locals>.AttrList.__iter__cSs|jj||�dS(N(uelementusetAttribute(uselfunameuvalue((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyu__setitem__su+getDomBuilder.<locals>.AttrList.__setitem__cSstt|jjj���S(N(ulenulistuelementu
attributesuitems(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyu__len__su'getDomBuilder.<locals>.AttrList.__len__cSs#dd�t|jjj��D�S(NcSs$g|]}|d|df�qS(ii((u.0uitem((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyu
<listcomp>s	u9getDomBuilder.<locals>.AttrList.items.<locals>.<listcomp>(ulistuelementu
attributesuitems(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyuitemss	u%getDomBuilder.<locals>.AttrList.itemscSst|jjj��S(N(ulistuelementu
attributesukeys(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyukeys!su$getDomBuilder.<locals>.AttrList.keyscSs|jj|�S(N(uelementugetAttribute(uselfuname((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyu__getitem__$su+getDomBuilder.<locals>.AttrList.__getitem__cSs,t|t�rt�n|jj|�SdS(N(u
isinstanceutupleuNotImplementedErroruelementuhasAttribute(uselfuname((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyu__contains__'s	u,getDomBuilder.<locals>.AttrList.__contains__N(u__name__u
__module__u__qualname__u__init__u__iter__u__setitem__u__len__uitemsukeysu__getitem__u__contains__(u
__locals__((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyuAttrListsuAttrListcs�|EeZdZdd�Zedd��Zdd�Zddd�Zd	d
�Z	dd�Z
d
d�Z�fdd�Zdd�Z
eee
�Z�fdd�Zdd�Zdd�Zee�ZdS(u"getDomBuilder.<locals>.NodeBuildercSs#tjj||j�||_dS(N(u_baseuNodeu__init__unodeNameuelement(uselfuelement((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyu__init__.su+getDomBuilder.<locals>.NodeBuilder.__init__cSs"t|jd�r|jjp!dS(NunamespaceURI(uhasattruelementunamespaceURIuNone(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyu<lambda>2su+getDomBuilder.<locals>.NodeBuilder.<lambda>cSs ||_|jj|j�dS(N(uparentuelementuappendChild(uselfunode((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyuappendChild5s	u.getDomBuilder.<locals>.NodeBuilder.appendChildcSsH|jjj|�}|r4|jj||j�n|jj|�dS(N(uelementu
ownerDocumentucreateTextNodeuinsertBeforeuappendChild(uselfudatauinsertBeforeutext((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyu
insertText9su-getDomBuilder.<locals>.NodeBuilder.insertTextcSs&|jj|j|j�||_dS(N(uelementuinsertBeforeuparent(uselfunodeurefNode((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyuinsertBefore@su/getDomBuilder.<locals>.NodeBuilder.insertBeforecSs8|jj|jkr+|jj|j�nd|_dS(N(uelementu
parentNodeuremoveChilduNoneuparent(uselfunode((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyuremoveChildDsu.getDomBuilder.<locals>.NodeBuilder.removeChildcSsOx?|jj�rA|jj}|jj|�|jj|�qWg|_dS(N(uelementu
hasChildNodesu
firstChilduremoveChilduappendChildu
childNodes(uselfu	newParentuchild((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyureparentChildrenIs
u3getDomBuilder.<locals>.NodeBuilder.reparentChildrencs
�|j�S(N(uelement(uself(uAttrList(u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyu
getAttributesPsu0getDomBuilder.<locals>.NodeBuilder.getAttributescSs�|r�x�t|j��D]~\}}t|t�r�|ddk	r]|dd|d}n
|d}|jj|d||�q|jj||�qWndS(Niu:ii(ulistuitemsu
isinstanceutupleuNoneuelementusetAttributeNSusetAttribute(uselfu
attributesunameuvalueu
qualifiedName((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyu
setAttributesSs

	u0getDomBuilder.<locals>.NodeBuilder.setAttributescs�|jjd��S(NF(uelementu	cloneNodeuFalse(uself(uNodeBuilder(u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyu	cloneNodebsu,getDomBuilder.<locals>.NodeBuilder.cloneNodecSs
|jj�S(N(uelementu
hasChildNodes(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyu
hasContentesu-getDomBuilder.<locals>.NodeBuilder.hasContentcSs4|jdkr td|jfS|j|jfSdS(Nuhtml(u	namespaceuNoneu
namespacesuname(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyugetNameTuplehsu/getDomBuilder.<locals>.NodeBuilder.getNameTupleN(u__name__u
__module__u__qualname__u__init__upropertyu	namespaceuappendChilduNoneu
insertTextuinsertBeforeuremoveChildureparentChildrenu
getAttributesu
setAttributesu
attributesu	cloneNodeu
hasContentugetNameTupleu	nameTuple(u
__locals__(uAttrListuNodeBuilder(u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyuNodeBuilder-s
uNodeBuildercs�|EeZdZ�fdd�Z��fdd�Zd�fdd�Z�fdd�Z�fd	d
�Zdd�Z	�fd
d�Z
dd�Zdd�Zddd�Z
�ZdZdS(u"getDomBuilder.<locals>.TreeBuildercs+�j�jddd�|_tj|�S(N(ugetDOMImplementationucreateDocumentuNoneudomuweakrefuproxy(uself(uDom(u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyu
documentClassqsu0getDomBuilder.<locals>.TreeBuilder.documentClasscst|d}|d}|d}�j�}|j|||�}|jj�|���tkrp|j|_ndS(NunameupublicIdusystemId(ugetDOMImplementationucreateDocumentTypeudocumentuappendChilduminidomudomu
ownerDocument(uselfutokenunameupublicIdusystemIdudomimpludoctype(uDomuNodeBuilder(u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyu
insertDoctypeus


u0getDomBuilder.<locals>.TreeBuilder.insertDoctypecsO|dkr0|jdkr0|jj|�}n|jj||�}�|�S(N(uNoneudefaultNamespaceudomu
createElementucreateElementNS(uselfunameu	namespaceunode(uNodeBuilder(u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyuelementClass�su/getDomBuilder.<locals>.TreeBuilder.elementClasscs�|jj|��S(N(udomu
createComment(uselfudata(uNodeBuilder(u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyucommentClass�su/getDomBuilder.<locals>.TreeBuilder.commentClasscs�|jj��S(N(udomucreateDocumentFragment(uself(uNodeBuilder(u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyu
fragmentClass�su0getDomBuilder.<locals>.TreeBuilder.fragmentClasscSs|jj|j�dS(N(udomuappendChilduelement(uselfunode((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyuappendChild�su.getDomBuilder.<locals>.TreeBuilder.appendChildcs
�|�S(N((uselfuelement(utestSerializer(u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyutestSerializer�su1getDomBuilder.<locals>.TreeBuilder.testSerializercSs|jS(N(udom(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyugetDocument�su.getDomBuilder.<locals>.TreeBuilder.getDocumentcSstjj|�jS(N(u_baseuTreeBuilderugetFragmentuelement(uself((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyugetFragment�su.getDomBuilder.<locals>.TreeBuilder.getFragmentcSs�|}||kr+tjj|||�nwt|jd�r�tj|jjkr�t|jj�|j_|jjj	tj�q�n|jj
|jj|��dS(Nu_child_node_types(u_baseuTreeBuilderu
insertTextuhasattrudomuNodeu	TEXT_NODEu_child_node_typesulistuappenduappendChilducreateTextNode(uselfudatauparent((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyu
insertText�su-getDomBuilder.<locals>.TreeBuilder.insertTextN(u__name__u
__module__u__qualname__u
documentClassu
insertDoctypeuNoneuelementClassucommentClassu
fragmentClassuappendChildutestSerializerugetDocumentugetFragmentu
insertTextuimplementationuname(u
__locals__(uDomuDomImplementationuNodeBuilderutestSerializer(u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyuTreeBuilderpsuTreeBuildercsB|j�g�d��fdd���|d�dj��S(Nic	s�|jtjkr�|jr�|js-|jrr|jp9d}|jpHd}�jdd||j||f�q��jdd||jf�q��jdd|f�n�|jtjkr��jd�n�|jtjkr��jd�n�|jtj	kr%�jdd||j
f�nu|jtjkrX�jd	d||j
f�nBt|d
�r�|j
dk	r�dtj|j
|jf}n	|j}�jdd||f�|j�r�g}x�tt|j��D]r}|jj|�}|j}|j}|j
}	|	r8dtj|	|jf}n	|j}|j||f�q�Wx?t|�D].\}}�jd
d|d||f�qeWn|d7}x|jD]}
�|
|�q�WdS(Nuu|%s<!DOCTYPE %s "%s" "%s">u u|%s<!DOCTYPE %s>u|%s<!DOCTYPE >u	#documentu#document-fragmentu|%s<!-- %s -->u|%s"%s"unamespaceURIu%s %su|%s<%s>u
|%s%s="%s"i(unodeTypeuNodeuDOCUMENT_TYPE_NODEunameupublicIdusystemIduappendu
DOCUMENT_NODEuDOCUMENT_FRAGMENT_NODEuCOMMENT_NODEu	nodeValueu	TEXT_NODEuhasattrunamespaceURIuNoneu	constantsuprefixesunodeNameu
hasAttributesurangeulenu
attributesuitemuvalueu	localNameusortedu
childNodes(uelementuindentupublicIdusystemIdunameu
attributesuiuattruvalueunsuchild(urvuserializeElement(u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyuserializeElement�sN		!!!					)
u?getDomBuilder.<locals>.testSerializer.<locals>.serializeElementu
(u	normalizeujoin(uelement((urvuserializeElementu>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyutestSerializer�s

.
u%getDomBuilder.<locals>.testSerializer(uobjectu_baseuNodeuTreeBuilderulocals(uDomImplementationuTreeBuilder((uAttrListuDomuDomImplementationuNodeBuilderutestSerializeru>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyu
getDomBuilder
s"C(96u
getDomBuilder(u
__future__uabsolute_importudivisionuunicode_literalsuxml.domuminidomuNodeuweakrefuu_baseu	constantsu
namespacesuutilsumoduleFactoryFactoryu
getDomBuilderugetDomModule(((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treebuilders/dom.pyu<module>s�site-packages/pip/_vendor/html5lib/treebuilders/_base.py000064400000032617151733463610017366 0ustar00from __future__ import absolute_import, division, unicode_literals
from pip._vendor.six import text_type

from ..constants import scopingElements, tableInsertModeElements, namespaces

# The scope markers are inserted when entering object elements,
# marquees, table cells, and table captions, and are used to prevent formatting
# from "leaking" into tables, object elements, and marquees.
Marker = None

listElementsMap = {
    None: (frozenset(scopingElements), False),
    "button": (frozenset(scopingElements | set([(namespaces["html"], "button")])), False),
    "list": (frozenset(scopingElements | set([(namespaces["html"], "ol"),
                                              (namespaces["html"], "ul")])), False),
    "table": (frozenset([(namespaces["html"], "html"),
                         (namespaces["html"], "table")]), False),
    "select": (frozenset([(namespaces["html"], "optgroup"),
                          (namespaces["html"], "option")]), True)
}


class Node(object):
    def __init__(self, name):
        """Node representing an item in the tree.
        name - The tag name associated with the node
        parent - The parent of the current node (or None for the document node)
        value - The value of the current node (applies to text nodes and
        comments
        attributes - a dict holding name, value pairs for attributes of the node
        childNodes - a list of child nodes of the current node. This must
        include all elements but not necessarily other node types
        _flags - A list of miscellaneous flags that can be set on the node
        """
        self.name = name
        self.parent = None
        self.value = None
        self.attributes = {}
        self.childNodes = []
        self._flags = []

    def __str__(self):
        attributesStr = " ".join(["%s=\"%s\"" % (name, value)
                                  for name, value in
                                  self.attributes.items()])
        if attributesStr:
            return "<%s %s>" % (self.name, attributesStr)
        else:
            return "<%s>" % (self.name)

    def __repr__(self):
        return "<%s>" % (self.name)

    def appendChild(self, node):
        """Insert node as a child of the current node
        """
        raise NotImplementedError

    def insertText(self, data, insertBefore=None):
        """Insert data as text in the current node, positioned before the
        start of node insertBefore or to the end of the node's text.
        """
        raise NotImplementedError

    def insertBefore(self, node, refNode):
        """Insert node as a child of the current node, before refNode in the
        list of child nodes. Raises ValueError if refNode is not a child of
        the current node"""
        raise NotImplementedError

    def removeChild(self, node):
        """Remove node from the children of the current node
        """
        raise NotImplementedError

    def reparentChildren(self, newParent):
        """Move all the children of the current node to newParent.
        This is needed so that trees that don't store text as nodes move the
        text in the correct way
        """
        # XXX - should this method be made more general?
        for child in self.childNodes:
            newParent.appendChild(child)
        self.childNodes = []

    def cloneNode(self):
        """Return a shallow copy of the current node i.e. a node with the same
        name and attributes but with no parent or child nodes
        """
        raise NotImplementedError

    def hasContent(self):
        """Return true if the node has children or text, false otherwise
        """
        raise NotImplementedError


class ActiveFormattingElements(list):
    def append(self, node):
        equalCount = 0
        if node != Marker:
            for element in self[::-1]:
                if element == Marker:
                    break
                if self.nodesEqual(element, node):
                    equalCount += 1
                if equalCount == 3:
                    self.remove(element)
                    break
        list.append(self, node)

    def nodesEqual(self, node1, node2):
        if not node1.nameTuple == node2.nameTuple:
            return False

        if not node1.attributes == node2.attributes:
            return False

        return True


class TreeBuilder(object):
    """Base treebuilder implementation
    documentClass - the class to use for the bottommost node of a document
    elementClass - the class to use for HTML Elements
    commentClass - the class to use for comments
    doctypeClass - the class to use for doctypes
    """

    # Document class
    documentClass = None

    # The class to use for creating a node
    elementClass = None

    # The class to use for creating comments
    commentClass = None

    # The class to use for creating doctypes
    doctypeClass = None

    # Fragment class
    fragmentClass = None

    def __init__(self, namespaceHTMLElements):
        if namespaceHTMLElements:
            self.defaultNamespace = "http://www.w3.org/1999/xhtml"
        else:
            self.defaultNamespace = None
        self.reset()

    def reset(self):
        self.openElements = []
        self.activeFormattingElements = ActiveFormattingElements()

        # XXX - rename these to headElement, formElement
        self.headPointer = None
        self.formPointer = None

        self.insertFromTable = False

        self.document = self.documentClass()

    def elementInScope(self, target, variant=None):

        # If we pass a node in we match that. if we pass a string
        # match any node with that name
        exactNode = hasattr(target, "nameTuple")

        listElements, invert = listElementsMap[variant]

        for node in reversed(self.openElements):
            if (node.name == target and not exactNode or
                    node == target and exactNode):
                return True
            elif (invert ^ (node.nameTuple in listElements)):
                return False

        assert False  # We should never reach this point

    def reconstructActiveFormattingElements(self):
        # Within this algorithm the order of steps described in the
        # specification is not quite the same as the order of steps in the
        # code. It should still do the same though.

        # Step 1: stop the algorithm when there's nothing to do.
        if not self.activeFormattingElements:
            return

        # Step 2 and step 3: we start with the last element. So i is -1.
        i = len(self.activeFormattingElements) - 1
        entry = self.activeFormattingElements[i]
        if entry == Marker or entry in self.openElements:
            return

        # Step 6
        while entry != Marker and entry not in self.openElements:
            if i == 0:
                # This will be reset to 0 below
                i = -1
                break
            i -= 1
            # Step 5: let entry be one earlier in the list.
            entry = self.activeFormattingElements[i]

        while True:
            # Step 7
            i += 1

            # Step 8
            entry = self.activeFormattingElements[i]
            clone = entry.cloneNode()  # Mainly to get a new copy of the attributes

            # Step 9
            element = self.insertElement({"type": "StartTag",
                                          "name": clone.name,
                                          "namespace": clone.namespace,
                                          "data": clone.attributes})

            # Step 10
            self.activeFormattingElements[i] = element

            # Step 11
            if element == self.activeFormattingElements[-1]:
                break

    def clearActiveFormattingElements(self):
        entry = self.activeFormattingElements.pop()
        while self.activeFormattingElements and entry != Marker:
            entry = self.activeFormattingElements.pop()

    def elementInActiveFormattingElements(self, name):
        """Check if an element exists between the end of the active
        formatting elements and the last marker. If it does, return it, else
        return false"""

        for item in self.activeFormattingElements[::-1]:
            # Check for Marker first because if it's a Marker it doesn't have a
            # name attribute.
            if item == Marker:
                break
            elif item.name == name:
                return item
        return False

    def insertRoot(self, token):
        element = self.createElement(token)
        self.openElements.append(element)
        self.document.appendChild(element)

    def insertDoctype(self, token):
        name = token["name"]
        publicId = token["publicId"]
        systemId = token["systemId"]

        doctype = self.doctypeClass(name, publicId, systemId)
        self.document.appendChild(doctype)

    def insertComment(self, token, parent=None):
        if parent is None:
            parent = self.openElements[-1]
        parent.appendChild(self.commentClass(token["data"]))

    def createElement(self, token):
        """Create an element but don't insert it anywhere"""
        name = token["name"]
        namespace = token.get("namespace", self.defaultNamespace)
        element = self.elementClass(name, namespace)
        element.attributes = token["data"]
        return element

    def _getInsertFromTable(self):
        return self._insertFromTable

    def _setInsertFromTable(self, value):
        """Switch the function used to insert an element from the
        normal one to the misnested table one and back again"""
        self._insertFromTable = value
        if value:
            self.insertElement = self.insertElementTable
        else:
            self.insertElement = self.insertElementNormal

    insertFromTable = property(_getInsertFromTable, _setInsertFromTable)

    def insertElementNormal(self, token):
        name = token["name"]
        assert isinstance(name, text_type), "Element %s not unicode" % name
        namespace = token.get("namespace", self.defaultNamespace)
        element = self.elementClass(name, namespace)
        element.attributes = token["data"]
        self.openElements[-1].appendChild(element)
        self.openElements.append(element)
        return element

    def insertElementTable(self, token):
        """Create an element and insert it into the tree"""
        element = self.createElement(token)
        if self.openElements[-1].name not in tableInsertModeElements:
            return self.insertElementNormal(token)
        else:
            # We should be in the InTable mode. This means we want to do
            # special magic element rearranging
            parent, insertBefore = self.getTableMisnestedNodePosition()
            if insertBefore is None:
                parent.appendChild(element)
            else:
                parent.insertBefore(element, insertBefore)
            self.openElements.append(element)
        return element

    def insertText(self, data, parent=None):
        """Insert text data."""
        if parent is None:
            parent = self.openElements[-1]

        if (not self.insertFromTable or (self.insertFromTable and
                                         self.openElements[-1].name
                                         not in tableInsertModeElements)):
            parent.insertText(data)
        else:
            # We should be in the InTable mode. This means we want to do
            # special magic element rearranging
            parent, insertBefore = self.getTableMisnestedNodePosition()
            parent.insertText(data, insertBefore)

    def getTableMisnestedNodePosition(self):
        """Get the foster parent element, and sibling to insert before
        (or None) when inserting a misnested table node"""
        # The foster parent element is the one which comes before the most
        # recently opened table element
        # XXX - this is really inelegant
        lastTable = None
        fosterParent = None
        insertBefore = None
        for elm in self.openElements[::-1]:
            if elm.name == "table":
                lastTable = elm
                break
        if lastTable:
            # XXX - we should really check that this parent is actually a
            # node here
            if lastTable.parent:
                fosterParent = lastTable.parent
                insertBefore = lastTable
            else:
                fosterParent = self.openElements[
                    self.openElements.index(lastTable) - 1]
        else:
            fosterParent = self.openElements[0]
        return fosterParent, insertBefore

    def generateImpliedEndTags(self, exclude=None):
        name = self.openElements[-1].name
        # XXX td, th and tr are not actually needed
        if (name in frozenset(("dd", "dt", "li", "option", "optgroup", "p", "rp", "rt"))
                and name != exclude):
            self.openElements.pop()
            # XXX This is not entirely what the specification says. We should
            # investigate it more closely.
            self.generateImpliedEndTags(exclude)

    def getDocument(self):
        "Return the final tree"
        return self.document

    def getFragment(self):
        "Return the final fragment"
        # assert self.innerHTML
        fragment = self.fragmentClass()
        self.openElements[0].reparentChildren(fragment)
        return fragment

    def testSerializer(self, node):
        """Serialize the subtree of node in the format required by unit tests
        node - the node from which to start serializing"""
        raise NotImplementedError
site-packages/pip/_vendor/html5lib/treebuilders/dom.py000064400000020425151733463610017066 0ustar00from __future__ import absolute_import, division, unicode_literals


from xml.dom import minidom, Node
import weakref

from . import _base
from .. import constants
from ..constants import namespaces
from ..utils import moduleFactoryFactory


def getDomBuilder(DomImplementation):
    Dom = DomImplementation

    class AttrList(object):
        def __init__(self, element):
            self.element = element

        def __iter__(self):
            return list(self.element.attributes.items()).__iter__()

        def __setitem__(self, name, value):
            self.element.setAttribute(name, value)

        def __len__(self):
            return len(list(self.element.attributes.items()))

        def items(self):
            return [(item[0], item[1]) for item in
                    list(self.element.attributes.items())]

        def keys(self):
            return list(self.element.attributes.keys())

        def __getitem__(self, name):
            return self.element.getAttribute(name)

        def __contains__(self, name):
            if isinstance(name, tuple):
                raise NotImplementedError
            else:
                return self.element.hasAttribute(name)

    class NodeBuilder(_base.Node):
        def __init__(self, element):
            _base.Node.__init__(self, element.nodeName)
            self.element = element

        namespace = property(lambda self: hasattr(self.element, "namespaceURI")
                             and self.element.namespaceURI or None)

        def appendChild(self, node):
            node.parent = self
            self.element.appendChild(node.element)

        def insertText(self, data, insertBefore=None):
            text = self.element.ownerDocument.createTextNode(data)
            if insertBefore:
                self.element.insertBefore(text, insertBefore.element)
            else:
                self.element.appendChild(text)

        def insertBefore(self, node, refNode):
            self.element.insertBefore(node.element, refNode.element)
            node.parent = self

        def removeChild(self, node):
            if node.element.parentNode == self.element:
                self.element.removeChild(node.element)
            node.parent = None

        def reparentChildren(self, newParent):
            while self.element.hasChildNodes():
                child = self.element.firstChild
                self.element.removeChild(child)
                newParent.element.appendChild(child)
            self.childNodes = []

        def getAttributes(self):
            return AttrList(self.element)

        def setAttributes(self, attributes):
            if attributes:
                for name, value in list(attributes.items()):
                    if isinstance(name, tuple):
                        if name[0] is not None:
                            qualifiedName = (name[0] + ":" + name[1])
                        else:
                            qualifiedName = name[1]
                        self.element.setAttributeNS(name[2], qualifiedName,
                                                    value)
                    else:
                        self.element.setAttribute(
                            name, value)
        attributes = property(getAttributes, setAttributes)

        def cloneNode(self):
            return NodeBuilder(self.element.cloneNode(False))

        def hasContent(self):
            return self.element.hasChildNodes()

        def getNameTuple(self):
            if self.namespace is None:
                return namespaces["html"], self.name
            else:
                return self.namespace, self.name

        nameTuple = property(getNameTuple)

    class TreeBuilder(_base.TreeBuilder):
        def documentClass(self):
            self.dom = Dom.getDOMImplementation().createDocument(None, None, None)
            return weakref.proxy(self)

        def insertDoctype(self, token):
            name = token["name"]
            publicId = token["publicId"]
            systemId = token["systemId"]

            domimpl = Dom.getDOMImplementation()
            doctype = domimpl.createDocumentType(name, publicId, systemId)
            self.document.appendChild(NodeBuilder(doctype))
            if Dom == minidom:
                doctype.ownerDocument = self.dom

        def elementClass(self, name, namespace=None):
            if namespace is None and self.defaultNamespace is None:
                node = self.dom.createElement(name)
            else:
                node = self.dom.createElementNS(namespace, name)

            return NodeBuilder(node)

        def commentClass(self, data):
            return NodeBuilder(self.dom.createComment(data))

        def fragmentClass(self):
            return NodeBuilder(self.dom.createDocumentFragment())

        def appendChild(self, node):
            self.dom.appendChild(node.element)

        def testSerializer(self, element):
            return testSerializer(element)

        def getDocument(self):
            return self.dom

        def getFragment(self):
            return _base.TreeBuilder.getFragment(self).element

        def insertText(self, data, parent=None):
            data = data
            if parent != self:
                _base.TreeBuilder.insertText(self, data, parent)
            else:
                # HACK: allow text nodes as children of the document node
                if hasattr(self.dom, '_child_node_types'):
                    if not Node.TEXT_NODE in self.dom._child_node_types:
                        self.dom._child_node_types = list(self.dom._child_node_types)
                        self.dom._child_node_types.append(Node.TEXT_NODE)
                self.dom.appendChild(self.dom.createTextNode(data))

        implementation = DomImplementation
        name = None

    def testSerializer(element):
        element.normalize()
        rv = []

        def serializeElement(element, indent=0):
            if element.nodeType == Node.DOCUMENT_TYPE_NODE:
                if element.name:
                    if element.publicId or element.systemId:
                        publicId = element.publicId or ""
                        systemId = element.systemId or ""
                        rv.append("""|%s<!DOCTYPE %s "%s" "%s">""" %
                                  (' ' * indent, element.name, publicId, systemId))
                    else:
                        rv.append("|%s<!DOCTYPE %s>" % (' ' * indent, element.name))
                else:
                    rv.append("|%s<!DOCTYPE >" % (' ' * indent,))
            elif element.nodeType == Node.DOCUMENT_NODE:
                rv.append("#document")
            elif element.nodeType == Node.DOCUMENT_FRAGMENT_NODE:
                rv.append("#document-fragment")
            elif element.nodeType == Node.COMMENT_NODE:
                rv.append("|%s<!-- %s -->" % (' ' * indent, element.nodeValue))
            elif element.nodeType == Node.TEXT_NODE:
                rv.append("|%s\"%s\"" % (' ' * indent, element.nodeValue))
            else:
                if (hasattr(element, "namespaceURI") and
                        element.namespaceURI is not None):
                    name = "%s %s" % (constants.prefixes[element.namespaceURI],
                                      element.nodeName)
                else:
                    name = element.nodeName
                rv.append("|%s<%s>" % (' ' * indent, name))
                if element.hasAttributes():
                    attributes = []
                    for i in range(len(element.attributes)):
                        attr = element.attributes.item(i)
                        name = attr.nodeName
                        value = attr.value
                        ns = attr.namespaceURI
                        if ns:
                            name = "%s %s" % (constants.prefixes[ns], attr.localName)
                        else:
                            name = attr.nodeName
                        attributes.append((name, value))

                    for name, value in sorted(attributes):
                        rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value))
            indent += 2
            for child in element.childNodes:
                serializeElement(child, indent)
        serializeElement(element, 0)

        return "\n".join(rv)

    return locals()


# The actual means to get a module!
getDomModule = moduleFactoryFactory(getDomBuilder)
site-packages/pip/_vendor/html5lib/treebuilders/__init__.py000064400000006515151733463610020052 0ustar00"""A collection of modules for building different kinds of tree from
HTML documents.

To create a treebuilder for a new type of tree, you need to do
implement several things:

1) A set of classes for various types of elements: Document, Doctype,
Comment, Element. These must implement the interface of
_base.treebuilders.Node (although comment nodes have a different
signature for their constructor, see treebuilders.etree.Comment)
Textual content may also be implemented as another node type, or not, as
your tree implementation requires.

2) A treebuilder object (called TreeBuilder by convention) that
inherits from treebuilders._base.TreeBuilder. This has 4 required attributes:
documentClass - the class to use for the bottommost node of a document
elementClass - the class to use for HTML Elements
commentClass - the class to use for comments
doctypeClass - the class to use for doctypes
It also has one required method:
getDocument - Returns the root node of the complete document tree

3) If you wish to run the unit tests, you must also create a
testSerializer method on your treebuilder which accepts a node and
returns a string containing Node and its children serialized according
to the format used in the unittests
"""

from __future__ import absolute_import, division, unicode_literals

from ..utils import default_etree

treeBuilderCache = {}


def getTreeBuilder(treeType, implementation=None, **kwargs):
    """Get a TreeBuilder class for various types of tree with built-in support

    treeType - the name of the tree type required (case-insensitive). Supported
               values are:

               "dom" - A generic builder for DOM implementations, defaulting to
                       a xml.dom.minidom based implementation.
               "etree" - A generic builder for tree implementations exposing an
                         ElementTree-like interface, defaulting to
                         xml.etree.cElementTree if available and
                         xml.etree.ElementTree if not.
               "lxml" - A etree-based builder for lxml.etree, handling
                        limitations of lxml's implementation.

    implementation - (Currently applies to the "etree" and "dom" tree types). A
                      module implementing the tree type e.g.
                      xml.etree.ElementTree or xml.etree.cElementTree."""

    treeType = treeType.lower()
    if treeType not in treeBuilderCache:
        if treeType == "dom":
            from . import dom
            # Come up with a sane default (pref. from the stdlib)
            if implementation is None:
                from xml.dom import minidom
                implementation = minidom
            # NEVER cache here, caching is done in the dom submodule
            return dom.getDomModule(implementation, **kwargs).TreeBuilder
        elif treeType == "lxml":
            from . import etree_lxml
            treeBuilderCache[treeType] = etree_lxml.TreeBuilder
        elif treeType == "etree":
            from . import etree
            if implementation is None:
                implementation = default_etree
            # NEVER cache here, caching is done in the etree submodule
            return etree.getETreeModule(implementation, **kwargs).TreeBuilder
        else:
            raise ValueError("""Unrecognised treebuilder "%s" """ % treeType)
    return treeBuilderCache.get(treeType)
site-packages/pip/_vendor/html5lib/treebuilders/etree.py000064400000030515151733463610017414 0ustar00from __future__ import absolute_import, division, unicode_literals
from pip._vendor.six import text_type

import re

from . import _base
from .. import ihatexml
from .. import constants
from ..constants import namespaces
from ..utils import moduleFactoryFactory

tag_regexp = re.compile("{([^}]*)}(.*)")


def getETreeBuilder(ElementTreeImplementation, fullTree=False):
    ElementTree = ElementTreeImplementation
    ElementTreeCommentType = ElementTree.Comment("asd").tag

    class Element(_base.Node):
        def __init__(self, name, namespace=None):
            self._name = name
            self._namespace = namespace
            self._element = ElementTree.Element(self._getETreeTag(name,
                                                                  namespace))
            if namespace is None:
                self.nameTuple = namespaces["html"], self._name
            else:
                self.nameTuple = self._namespace, self._name
            self.parent = None
            self._childNodes = []
            self._flags = []

        def _getETreeTag(self, name, namespace):
            if namespace is None:
                etree_tag = name
            else:
                etree_tag = "{%s}%s" % (namespace, name)
            return etree_tag

        def _setName(self, name):
            self._name = name
            self._element.tag = self._getETreeTag(self._name, self._namespace)

        def _getName(self):
            return self._name

        name = property(_getName, _setName)

        def _setNamespace(self, namespace):
            self._namespace = namespace
            self._element.tag = self._getETreeTag(self._name, self._namespace)

        def _getNamespace(self):
            return self._namespace

        namespace = property(_getNamespace, _setNamespace)

        def _getAttributes(self):
            return self._element.attrib

        def _setAttributes(self, attributes):
            # Delete existing attributes first
            # XXX - there may be a better way to do this...
            for key in list(self._element.attrib.keys()):
                del self._element.attrib[key]
            for key, value in attributes.items():
                if isinstance(key, tuple):
                    name = "{%s}%s" % (key[2], key[1])
                else:
                    name = key
                self._element.set(name, value)

        attributes = property(_getAttributes, _setAttributes)

        def _getChildNodes(self):
            return self._childNodes

        def _setChildNodes(self, value):
            del self._element[:]
            self._childNodes = []
            for element in value:
                self.insertChild(element)

        childNodes = property(_getChildNodes, _setChildNodes)

        def hasContent(self):
            """Return true if the node has children or text"""
            return bool(self._element.text or len(self._element))

        def appendChild(self, node):
            self._childNodes.append(node)
            self._element.append(node._element)
            node.parent = self

        def insertBefore(self, node, refNode):
            index = list(self._element).index(refNode._element)
            self._element.insert(index, node._element)
            node.parent = self

        def removeChild(self, node):
            self._element.remove(node._element)
            node.parent = None

        def insertText(self, data, insertBefore=None):
            if not(len(self._element)):
                if not self._element.text:
                    self._element.text = ""
                self._element.text += data
            elif insertBefore is None:
                # Insert the text as the tail of the last child element
                if not self._element[-1].tail:
                    self._element[-1].tail = ""
                self._element[-1].tail += data
            else:
                # Insert the text before the specified node
                children = list(self._element)
                index = children.index(insertBefore._element)
                if index > 0:
                    if not self._element[index - 1].tail:
                        self._element[index - 1].tail = ""
                    self._element[index - 1].tail += data
                else:
                    if not self._element.text:
                        self._element.text = ""
                    self._element.text += data

        def cloneNode(self):
            element = type(self)(self.name, self.namespace)
            for name, value in self.attributes.items():
                element.attributes[name] = value
            return element

        def reparentChildren(self, newParent):
            if newParent.childNodes:
                newParent.childNodes[-1]._element.tail += self._element.text
            else:
                if not newParent._element.text:
                    newParent._element.text = ""
                if self._element.text is not None:
                    newParent._element.text += self._element.text
            self._element.text = ""
            _base.Node.reparentChildren(self, newParent)

    class Comment(Element):
        def __init__(self, data):
            # Use the superclass constructor to set all properties on the
            # wrapper element
            self._element = ElementTree.Comment(data)
            self.parent = None
            self._childNodes = []
            self._flags = []

        def _getData(self):
            return self._element.text

        def _setData(self, value):
            self._element.text = value

        data = property(_getData, _setData)

    class DocumentType(Element):
        def __init__(self, name, publicId, systemId):
            Element.__init__(self, "<!DOCTYPE>")
            self._element.text = name
            self.publicId = publicId
            self.systemId = systemId

        def _getPublicId(self):
            return self._element.get("publicId", "")

        def _setPublicId(self, value):
            if value is not None:
                self._element.set("publicId", value)

        publicId = property(_getPublicId, _setPublicId)

        def _getSystemId(self):
            return self._element.get("systemId", "")

        def _setSystemId(self, value):
            if value is not None:
                self._element.set("systemId", value)

        systemId = property(_getSystemId, _setSystemId)

    class Document(Element):
        def __init__(self):
            Element.__init__(self, "DOCUMENT_ROOT")

    class DocumentFragment(Element):
        def __init__(self):
            Element.__init__(self, "DOCUMENT_FRAGMENT")

    def testSerializer(element):
        rv = []

        def serializeElement(element, indent=0):
            if not(hasattr(element, "tag")):
                element = element.getroot()
            if element.tag == "<!DOCTYPE>":
                if element.get("publicId") or element.get("systemId"):
                    publicId = element.get("publicId") or ""
                    systemId = element.get("systemId") or ""
                    rv.append("""<!DOCTYPE %s "%s" "%s">""" %
                              (element.text, publicId, systemId))
                else:
                    rv.append("<!DOCTYPE %s>" % (element.text,))
            elif element.tag == "DOCUMENT_ROOT":
                rv.append("#document")
                if element.text is not None:
                    rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text))
                if element.tail is not None:
                    raise TypeError("Document node cannot have tail")
                if hasattr(element, "attrib") and len(element.attrib):
                    raise TypeError("Document node cannot have attributes")
            elif element.tag == ElementTreeCommentType:
                rv.append("|%s<!-- %s -->" % (' ' * indent, element.text))
            else:
                assert isinstance(element.tag, text_type), \
                    "Expected unicode, got %s, %s" % (type(element.tag), element.tag)
                nsmatch = tag_regexp.match(element.tag)

                if nsmatch is None:
                    name = element.tag
                else:
                    ns, name = nsmatch.groups()
                    prefix = constants.prefixes[ns]
                    name = "%s %s" % (prefix, name)
                rv.append("|%s<%s>" % (' ' * indent, name))

                if hasattr(element, "attrib"):
                    attributes = []
                    for name, value in element.attrib.items():
                        nsmatch = tag_regexp.match(name)
                        if nsmatch is not None:
                            ns, name = nsmatch.groups()
                            prefix = constants.prefixes[ns]
                            attr_string = "%s %s" % (prefix, name)
                        else:
                            attr_string = name
                        attributes.append((attr_string, value))

                    for name, value in sorted(attributes):
                        rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value))
                if element.text:
                    rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text))
            indent += 2
            for child in element:
                serializeElement(child, indent)
            if element.tail:
                rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail))
        serializeElement(element, 0)

        return "\n".join(rv)

    def tostring(element):
        """Serialize an element and its child nodes to a string"""
        rv = []
        filter = ihatexml.InfosetFilter()

        def serializeElement(element):
            if isinstance(element, ElementTree.ElementTree):
                element = element.getroot()

            if element.tag == "<!DOCTYPE>":
                if element.get("publicId") or element.get("systemId"):
                    publicId = element.get("publicId") or ""
                    systemId = element.get("systemId") or ""
                    rv.append("""<!DOCTYPE %s PUBLIC "%s" "%s">""" %
                              (element.text, publicId, systemId))
                else:
                    rv.append("<!DOCTYPE %s>" % (element.text,))
            elif element.tag == "DOCUMENT_ROOT":
                if element.text is not None:
                    rv.append(element.text)
                if element.tail is not None:
                    raise TypeError("Document node cannot have tail")
                if hasattr(element, "attrib") and len(element.attrib):
                    raise TypeError("Document node cannot have attributes")

                for child in element:
                    serializeElement(child)

            elif element.tag == ElementTreeCommentType:
                rv.append("<!--%s-->" % (element.text,))
            else:
                # This is assumed to be an ordinary element
                if not element.attrib:
                    rv.append("<%s>" % (filter.fromXmlName(element.tag),))
                else:
                    attr = " ".join(["%s=\"%s\"" % (
                        filter.fromXmlName(name), value)
                        for name, value in element.attrib.items()])
                    rv.append("<%s %s>" % (element.tag, attr))
                if element.text:
                    rv.append(element.text)

                for child in element:
                    serializeElement(child)

                rv.append("</%s>" % (element.tag,))

            if element.tail:
                rv.append(element.tail)

        serializeElement(element)

        return "".join(rv)

    class TreeBuilder(_base.TreeBuilder):
        documentClass = Document
        doctypeClass = DocumentType
        elementClass = Element
        commentClass = Comment
        fragmentClass = DocumentFragment
        implementation = ElementTreeImplementation

        def testSerializer(self, element):
            return testSerializer(element)

        def getDocument(self):
            if fullTree:
                return self.document._element
            else:
                if self.defaultNamespace is not None:
                    return self.document._element.find(
                        "{%s}html" % self.defaultNamespace)
                else:
                    return self.document._element.find("html")

        def getFragment(self):
            return _base.TreeBuilder.getFragment(self)._element

    return locals()


getETreeModule = moduleFactoryFactory(getETreeBuilder)
site-packages/pip/_vendor/html5lib/sanitizer.py000064400000040054151733463610015626 0ustar00from __future__ import absolute_import, division, unicode_literals

import re
from xml.sax.saxutils import escape, unescape

from .tokenizer import HTMLTokenizer
from .constants import tokenTypes


class HTMLSanitizerMixin(object):
    """ sanitization of XHTML+MathML+SVG and of inline style attributes."""

    acceptable_elements = ['a', 'abbr', 'acronym', 'address', 'area',
                           'article', 'aside', 'audio', 'b', 'big', 'blockquote', 'br', 'button',
                           'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup',
                           'command', 'datagrid', 'datalist', 'dd', 'del', 'details', 'dfn',
                           'dialog', 'dir', 'div', 'dl', 'dt', 'em', 'event-source', 'fieldset',
                           'figcaption', 'figure', 'footer', 'font', 'form', 'header', 'h1',
                           'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'input', 'ins',
                           'keygen', 'kbd', 'label', 'legend', 'li', 'm', 'map', 'menu', 'meter',
                           'multicol', 'nav', 'nextid', 'ol', 'output', 'optgroup', 'option',
                           'p', 'pre', 'progress', 'q', 's', 'samp', 'section', 'select',
                           'small', 'sound', 'source', 'spacer', 'span', 'strike', 'strong',
                           'sub', 'sup', 'table', 'tbody', 'td', 'textarea', 'time', 'tfoot',
                           'th', 'thead', 'tr', 'tt', 'u', 'ul', 'var', 'video']

    mathml_elements = ['maction', 'math', 'merror', 'mfrac', 'mi',
                       'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom',
                       'mprescripts', 'mroot', 'mrow', 'mspace', 'msqrt', 'mstyle', 'msub',
                       'msubsup', 'msup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder',
                       'munderover', 'none']

    svg_elements = ['a', 'animate', 'animateColor', 'animateMotion',
                    'animateTransform', 'clipPath', 'circle', 'defs', 'desc', 'ellipse',
                    'font-face', 'font-face-name', 'font-face-src', 'g', 'glyph', 'hkern',
                    'linearGradient', 'line', 'marker', 'metadata', 'missing-glyph',
                    'mpath', 'path', 'polygon', 'polyline', 'radialGradient', 'rect',
                    'set', 'stop', 'svg', 'switch', 'text', 'title', 'tspan', 'use']

    acceptable_attributes = ['abbr', 'accept', 'accept-charset', 'accesskey',
                             'action', 'align', 'alt', 'autocomplete', 'autofocus', 'axis',
                             'background', 'balance', 'bgcolor', 'bgproperties', 'border',
                             'bordercolor', 'bordercolordark', 'bordercolorlight', 'bottompadding',
                             'cellpadding', 'cellspacing', 'ch', 'challenge', 'char', 'charoff',
                             'choff', 'charset', 'checked', 'cite', 'class', 'clear', 'color',
                             'cols', 'colspan', 'compact', 'contenteditable', 'controls', 'coords',
                             'data', 'datafld', 'datapagesize', 'datasrc', 'datetime', 'default',
                             'delay', 'dir', 'disabled', 'draggable', 'dynsrc', 'enctype', 'end',
                             'face', 'for', 'form', 'frame', 'galleryimg', 'gutter', 'headers',
                             'height', 'hidefocus', 'hidden', 'high', 'href', 'hreflang', 'hspace',
                             'icon', 'id', 'inputmode', 'ismap', 'keytype', 'label', 'leftspacing',
                             'lang', 'list', 'longdesc', 'loop', 'loopcount', 'loopend',
                             'loopstart', 'low', 'lowsrc', 'max', 'maxlength', 'media', 'method',
                             'min', 'multiple', 'name', 'nohref', 'noshade', 'nowrap', 'open',
                             'optimum', 'pattern', 'ping', 'point-size', 'poster', 'pqg', 'preload',
                             'prompt', 'radiogroup', 'readonly', 'rel', 'repeat-max', 'repeat-min',
                             'replace', 'required', 'rev', 'rightspacing', 'rows', 'rowspan',
                             'rules', 'scope', 'selected', 'shape', 'size', 'span', 'src', 'start',
                             'step', 'style', 'summary', 'suppress', 'tabindex', 'target',
                             'template', 'title', 'toppadding', 'type', 'unselectable', 'usemap',
                             'urn', 'valign', 'value', 'variable', 'volume', 'vspace', 'vrml',
                             'width', 'wrap', 'xml:lang']

    mathml_attributes = ['actiontype', 'align', 'columnalign', 'columnalign',
                         'columnalign', 'columnlines', 'columnspacing', 'columnspan', 'depth',
                         'display', 'displaystyle', 'equalcolumns', 'equalrows', 'fence',
                         'fontstyle', 'fontweight', 'frame', 'height', 'linethickness', 'lspace',
                         'mathbackground', 'mathcolor', 'mathvariant', 'mathvariant', 'maxsize',
                         'minsize', 'other', 'rowalign', 'rowalign', 'rowalign', 'rowlines',
                         'rowspacing', 'rowspan', 'rspace', 'scriptlevel', 'selection',
                         'separator', 'stretchy', 'width', 'width', 'xlink:href', 'xlink:show',
                         'xlink:type', 'xmlns', 'xmlns:xlink']

    svg_attributes = ['accent-height', 'accumulate', 'additive', 'alphabetic',
                      'arabic-form', 'ascent', 'attributeName', 'attributeType',
                      'baseProfile', 'bbox', 'begin', 'by', 'calcMode', 'cap-height',
                      'class', 'clip-path', 'color', 'color-rendering', 'content', 'cx',
                      'cy', 'd', 'dx', 'dy', 'descent', 'display', 'dur', 'end', 'fill',
                      'fill-opacity', 'fill-rule', 'font-family', 'font-size',
                      'font-stretch', 'font-style', 'font-variant', 'font-weight', 'from',
                      'fx', 'fy', 'g1', 'g2', 'glyph-name', 'gradientUnits', 'hanging',
                      'height', 'horiz-adv-x', 'horiz-origin-x', 'id', 'ideographic', 'k',
                      'keyPoints', 'keySplines', 'keyTimes', 'lang', 'marker-end',
                      'marker-mid', 'marker-start', 'markerHeight', 'markerUnits',
                      'markerWidth', 'mathematical', 'max', 'min', 'name', 'offset',
                      'opacity', 'orient', 'origin', 'overline-position',
                      'overline-thickness', 'panose-1', 'path', 'pathLength', 'points',
                      'preserveAspectRatio', 'r', 'refX', 'refY', 'repeatCount',
                      'repeatDur', 'requiredExtensions', 'requiredFeatures', 'restart',
                      'rotate', 'rx', 'ry', 'slope', 'stemh', 'stemv', 'stop-color',
                      'stop-opacity', 'strikethrough-position', 'strikethrough-thickness',
                      'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap',
                      'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity',
                      'stroke-width', 'systemLanguage', 'target', 'text-anchor', 'to',
                      'transform', 'type', 'u1', 'u2', 'underline-position',
                      'underline-thickness', 'unicode', 'unicode-range', 'units-per-em',
                      'values', 'version', 'viewBox', 'visibility', 'width', 'widths', 'x',
                      'x-height', 'x1', 'x2', 'xlink:actuate', 'xlink:arcrole',
                      'xlink:href', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type',
                      'xml:base', 'xml:lang', 'xml:space', 'xmlns', 'xmlns:xlink', 'y',
                      'y1', 'y2', 'zoomAndPan']

    attr_val_is_uri = ['href', 'src', 'cite', 'action', 'longdesc', 'poster',
                       'xlink:href', 'xml:base']

    svg_attr_val_allows_ref = ['clip-path', 'color-profile', 'cursor', 'fill',
                               'filter', 'marker', 'marker-start', 'marker-mid', 'marker-end',
                               'mask', 'stroke']

    svg_allow_local_href = ['altGlyph', 'animate', 'animateColor',
                            'animateMotion', 'animateTransform', 'cursor', 'feImage', 'filter',
                            'linearGradient', 'pattern', 'radialGradient', 'textpath', 'tref',
                            'set', 'use']

    acceptable_css_properties = ['azimuth', 'background-color',
                                 'border-bottom-color', 'border-collapse', 'border-color',
                                 'border-left-color', 'border-right-color', 'border-top-color', 'clear',
                                 'color', 'cursor', 'direction', 'display', 'elevation', 'float', 'font',
                                 'font-family', 'font-size', 'font-style', 'font-variant', 'font-weight',
                                 'height', 'letter-spacing', 'line-height', 'overflow', 'pause',
                                 'pause-after', 'pause-before', 'pitch', 'pitch-range', 'richness',
                                 'speak', 'speak-header', 'speak-numeral', 'speak-punctuation',
                                 'speech-rate', 'stress', 'text-align', 'text-decoration', 'text-indent',
                                 'unicode-bidi', 'vertical-align', 'voice-family', 'volume',
                                 'white-space', 'width']

    acceptable_css_keywords = ['auto', 'aqua', 'black', 'block', 'blue',
                               'bold', 'both', 'bottom', 'brown', 'center', 'collapse', 'dashed',
                               'dotted', 'fuchsia', 'gray', 'green', '!important', 'italic', 'left',
                               'lime', 'maroon', 'medium', 'none', 'navy', 'normal', 'nowrap', 'olive',
                               'pointer', 'purple', 'red', 'right', 'solid', 'silver', 'teal', 'top',
                               'transparent', 'underline', 'white', 'yellow']

    acceptable_svg_properties = ['fill', 'fill-opacity', 'fill-rule',
                                 'stroke', 'stroke-width', 'stroke-linecap', 'stroke-linejoin',
                                 'stroke-opacity']

    acceptable_protocols = ['ed2k', 'ftp', 'http', 'https', 'irc',
                            'mailto', 'news', 'gopher', 'nntp', 'telnet', 'webcal',
                            'xmpp', 'callto', 'feed', 'urn', 'aim', 'rsync', 'tag',
                            'ssh', 'sftp', 'rtsp', 'afs']

    # subclasses may define their own versions of these constants
    allowed_elements = acceptable_elements + mathml_elements + svg_elements
    allowed_attributes = acceptable_attributes + mathml_attributes + svg_attributes
    allowed_css_properties = acceptable_css_properties
    allowed_css_keywords = acceptable_css_keywords
    allowed_svg_properties = acceptable_svg_properties
    allowed_protocols = acceptable_protocols

    # Sanitize the +html+, escaping all elements not in ALLOWED_ELEMENTS, and
    # stripping out all # attributes not in ALLOWED_ATTRIBUTES. Style
    # attributes are parsed, and a restricted set, # specified by
    # ALLOWED_CSS_PROPERTIES and ALLOWED_CSS_KEYWORDS, are allowed through.
    # attributes in ATTR_VAL_IS_URI are scanned, and only URI schemes specified
    # in ALLOWED_PROTOCOLS are allowed.
    #
    #   sanitize_html('<script> do_nasty_stuff() </script>')
    #    => &lt;script> do_nasty_stuff() &lt;/script>
    #   sanitize_html('<a href="javascript: sucker();">Click here for $100</a>')
    #    => <a>Click here for $100</a>
    def sanitize_token(self, token):

        # accommodate filters which use token_type differently
        token_type = token["type"]
        if token_type in list(tokenTypes.keys()):
            token_type = tokenTypes[token_type]

        if token_type in (tokenTypes["StartTag"], tokenTypes["EndTag"],
                          tokenTypes["EmptyTag"]):
            if token["name"] in self.allowed_elements:
                return self.allowed_token(token, token_type)
            else:
                return self.disallowed_token(token, token_type)
        elif token_type == tokenTypes["Comment"]:
            pass
        else:
            return token

    def allowed_token(self, token, token_type):
        if "data" in token:
            attrs = dict([(name, val) for name, val in
                          token["data"][::-1]
                          if name in self.allowed_attributes])
            for attr in self.attr_val_is_uri:
                if attr not in attrs:
                    continue
                val_unescaped = re.sub("[`\000-\040\177-\240\s]+", '',
                                       unescape(attrs[attr])).lower()
                # remove replacement characters from unescaped characters
                val_unescaped = val_unescaped.replace("\ufffd", "")
                if (re.match("^[a-z0-9][-+.a-z0-9]*:", val_unescaped) and
                    (val_unescaped.split(':')[0] not in
                     self.allowed_protocols)):
                    del attrs[attr]
            for attr in self.svg_attr_val_allows_ref:
                if attr in attrs:
                    attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)',
                                         ' ',
                                         unescape(attrs[attr]))
            if (token["name"] in self.svg_allow_local_href and
                'xlink:href' in attrs and re.search('^\s*[^#\s].*',
                                                    attrs['xlink:href'])):
                del attrs['xlink:href']
            if 'style' in attrs:
                attrs['style'] = self.sanitize_css(attrs['style'])
            token["data"] = [[name, val] for name, val in list(attrs.items())]
        return token

    def disallowed_token(self, token, token_type):
        if token_type == tokenTypes["EndTag"]:
            token["data"] = "</%s>" % token["name"]
        elif token["data"]:
            attrs = ''.join([' %s="%s"' % (k, escape(v)) for k, v in token["data"]])
            token["data"] = "<%s%s>" % (token["name"], attrs)
        else:
            token["data"] = "<%s>" % token["name"]
        if token.get("selfClosing"):
            token["data"] = token["data"][:-1] + "/>"

        if token["type"] in list(tokenTypes.keys()):
            token["type"] = "Characters"
        else:
            token["type"] = tokenTypes["Characters"]

        del token["name"]
        return token

    def sanitize_css(self, style):
        # disallow urls
        style = re.compile('url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style)

        # gauntlet
        if not re.match("""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style):
            return ''
        if not re.match("^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style):
            return ''

        clean = []
        for prop, value in re.findall("([-\w]+)\s*:\s*([^:;]*)", style):
            if not value:
                continue
            if prop.lower() in self.allowed_css_properties:
                clean.append(prop + ': ' + value + ';')
            elif prop.split('-')[0].lower() in ['background', 'border', 'margin',
                                                'padding']:
                for keyword in value.split():
                    if not keyword in self.acceptable_css_keywords and \
                            not re.match("^(#[0-9a-f]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword):
                        break
                else:
                    clean.append(prop + ': ' + value + ';')
            elif prop.lower() in self.allowed_svg_properties:
                clean.append(prop + ': ' + value + ';')

        return ' '.join(clean)


class HTMLSanitizer(HTMLTokenizer, HTMLSanitizerMixin):
    def __init__(self, stream, encoding=None, parseMeta=True, useChardet=True,
                 lowercaseElementName=False, lowercaseAttrName=False, parser=None):
        # Change case matching defaults as we only output lowercase html anyway
        # This solution doesn't seem ideal...
        HTMLTokenizer.__init__(self, stream, encoding, parseMeta, useChardet,
                               lowercaseElementName, lowercaseAttrName, parser=parser)

    def __iter__(self):
        for token in HTMLTokenizer.__iter__(self):
            token = self.sanitize_token(token)
            if token:
                yield token
site-packages/pip/_vendor/html5lib/__pycache__/ihatexml.cpython-33.pyc000064400000042214151733463610021712 0ustar00�
7�Re�@c@slddlmZmZmZddlZddlZddlmZdZdZ	dZ
dZd	Zd
j
ee	g�Zd
j
eeddd
e
eg�Zd
j
ed
g�Zejd�Zejd�Zdd�Zdd�Zedd�Zdd�Zdd�Zdd�Zdd�Zejd�Zejd�Zejd �ZGd!d"�d"e�Z dS(#i(uabsolute_importudivisionuunicode_literalsNi(uDataLossWarningu^
[#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] |
[#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] |
[#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] |
[#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 |
[#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] |
[#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] |
[#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] |
[#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] |
[#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 |
[#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] |
[#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] |
[#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D |
[#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] |
[#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] |
[#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] |
[#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] |
[#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] |
[#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] |
[#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 |
[#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] |
[#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] |
[#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] |
[#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] |
[#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] |
[#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] |
[#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] |
[#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] |
[#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] |
[#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] |
[#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A |
#x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 |
#x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] |
#x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] |
[#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] |
[#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C |
#x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 |
[#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] |
[#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] |
[#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 |
[#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] |
[#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B |
#x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE |
[#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] |
[#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 |
[#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] |
[#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]u*[#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]u�
[#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] |
[#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 |
[#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] |
[#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] |
#x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] |
[#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] |
[#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 |
#x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] |
[#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC |
[#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] |
#x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] |
[#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] |
[#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] |
[#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] |
[#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] |
[#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] |
#x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 |
[#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] |
#x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] |
[#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] |
[#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] |
#x3099 | #x309Au
[#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] |
[#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] |
[#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] |
[#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]u}
#x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 |
#[#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]u | u.u-u_u#x([\d|A-F]{4,4})u'\[#x([\d|A-F]{4,4})-#x([\d|A-F]{4,4})\]cCsdd�|jd�D�}g}x�|D]�}d}x�ttfD]v}|j|�}|dk	rB|jdd�|j�D��t|d�dkr�|d	d|d
<nd}PqBqBW|s)t|�dks�t
�|jt|�gd�q)q)Wt|�}|S(NcSsg|]}|j��qS((ustrip(u.0uitem((u6/tmp/pip-zej_zi-build/pip/_vendor/html5lib/ihatexml.pyu
<listcomp>hs	u$charStringToList.<locals>.<listcomp>u | cSsg|]}t|��qS((uhexToInt(u.0uitem((u6/tmp/pip-zej_zi-build/pip/_vendor/html5lib/ihatexml.pyu
<listcomp>os	iiFi����i����i����T(
usplituFalseureCharureCharRangeumatchuNoneuappendugroupsulenuTrueuAssertionErroruordunormaliseCharList(ucharsu
charRangesurvuitemu
foundMatchuregexpumatch((u6/tmp/pip-zej_zi-build/pip/_vendor/html5lib/ihatexml.pyucharStringToListgs"
 !ucharStringToListcCs�t|�}x(|D] }|d|dkst�qWg}d}x�|t|�kr�d}|j||�xb||t|�kr�|||d|dddkr�|||d|dd<|d7}qrW||7}qFW|S(Niii����i����(usorteduAssertionErrorulenuappend(ucharListuitemurvuiuj((u6/tmp/pip-zej_zi-build/pip/_vendor/html5lib/ihatexml.pyunormaliseCharList|s
=unormaliseCharListuFFFFicCs�g}|ddkr8|jd|dddg�nxOt|dd��D]7\}}|j|dd||dddg�qOW|ddtkr�|j|dddtg�n|S(Niii����i����i����(uappendu	enumerateumax_unicode(ucharListurvuiuitem((u6/tmp/pip-zej_zi-build/pip/_vendor/html5lib/ihatexml.pyu
missingRanges�s"#/"u
missingRangescCs�g}xw|D]o}|d|dkrG|jtt|d���q
|jtt|d��dtt|d���q
Wddj|�S(Niiu-u[%s]u(uappenduescapeRegexpuchrujoin(ucharListurvuitem((u6/tmp/pip-zej_zi-build/pip/_vendor/html5lib/ihatexml.pyulistToRegexpStr�s
 ulistToRegexpStrcCs
t|d�S(Ni(uint(uhex_str((u6/tmp/pip-zej_zi-build/pip/_vendor/html5lib/ihatexml.pyuhexToInt�suhexToIntcCs1d}x$|D]}|j|d|�}q
W|S(Nu.u^u$u*u+u?u{u}u[u]u|u(u)u-u\(u.u^u$u*u+u?u{u}u[u]u|u(u)u-(ureplace(ustringuspecialCharactersuchar((u6/tmp/pip-zej_zi-build/pip/_vendor/html5lib/ihatexml.pyuescapeRegexp�s

uescapeRegexpu�[-,/:-@\[-\^`\{-¶¸-¿×÷IJ-ijĿ-ŀʼnſDŽ-njDZ-dzǶ-ǹȘ-ɏʩ-ʺ˂-ˏ˒-˿͆-͟͢-΅΋΍΢Ϗϗ-ϙϛϝϟϡϴ-ЀЍѐѝ҂҇-ҏӅ-ӆӉ-ӊӍ-ӏӬ-ӭӶ-ӷӺ-԰՗-՘՚-ՠև-֐ֺ֢־׀׃ׅ-׏׫-ׯ׳-ؠػ-ؿٓ-ٟ٪-ٯڸ-ڹڿۏ۔۩ۮ-ۯۺ-ऀऄऺ-ऻॎ-ॐॕ-ॗ।-॥॰-ঀ঄঍-঎঑-঒঩঱঳-঵঺-঻ঽ৅-৆৉-৊ৎ-৖৘-৛৞৤-৥৲-ਁਃ-਄਋-਎਑-਒਩਱਴਷਺-਻਽੃-੆੉-੊੎-੘੝੟-੥ੵ-઀઄ઌ઎઒઩઱઴઺-઻૆૊૎-૟ૡ-૥૰-଀଄଍-଎଑-଒଩଱଴-ଵ଺-଻ୄ-୆୉-୊୎-୕୘-୛୞ୢ-୥୰-஁஄஋-஍஑஖-஘஛஝஠-஢஥-஧஫-஭ஶ஺-஽௃-௅௉௎-௖௘-௦௰-ఀఄ఍఑఩ఴ఺-ఽ౅౉౎-౔౗-౟ౢ-౥౰-ಁ಄಍಑಩಴಺-ಽ೅೉೎-೔೗-ೝ೟ೢ-೥೰-ഁഄ഍഑ഩഺ-ഽൄ-൅൉ൎ-ൖ൘-ൟൢ-൥൰-฀ฯ฻-฿๏๚-຀຃຅-ຆຉ຋-ຌຎ-ຓຘຠ຤຦ຨ-ຩຬຯ຺຾-຿໅໇໎-໏໚-༗༚-༟༪-༴༶༸༺-༽཈ཪ-཰྅ྌ-ྏྖ྘ྮ-ྰྸྺ-႟჆-჏ჷ-ჿᄁᄄᄈᄊᄍᄓ-ᄻᄽᄿᅁ-ᅋᅍᅏᅑ-ᅓᅖ-ᅘᅚ-ᅞᅢᅤᅦᅨᅪ-ᅬᅯ-ᅱᅴᅶ-ᆝᆟ-ᆧᆩ-ᆪᆬ-ᆭᆰ-ᆶᆹᆻᇃ-ᇪᇬ-ᇯᇱ-ᇸᇺ-᷿ẜ-ẟỺ-ỿ἖-἗἞-἟὆-὇὎-὏὘὚὜὞὾-὿᾵᾽᾿-῁῅῍-῏῔-῕῜-῟῭-῱῵´-⃏⃝-⃠⃢-℥℧-℩ℬ-ℭℯ-ⅿↃ-〄〆〈-〠〰〶-぀ゕ-゘゛-゜ゟ-゠・ヿ-㄄ㄭ-䷿龦-꯿힤-￿]u�[-@\[-\^`\{-¿×÷IJ-ijĿ-ŀʼnſDŽ-njDZ-dzǶ-ǹȘ-ɏʩ-ʺ˂-΅·΋΍΢Ϗϗ-ϙϛϝϟϡϴ-ЀЍѐѝ҂-ҏӅ-ӆӉ-ӊӍ-ӏӬ-ӭӶ-ӷӺ-԰՗-՘՚-ՠև-׏׫-ׯ׳-ؠػ-ـً-ٰڸ-ڹڿۏ۔ۖ-ۤۧ-ऄऺ-़ा-ॗॢ-঄঍-঎঑-঒঩঱঳-঵঺-৛৞ৢ-৯৲-਄਋-਎਑-਒਩਱਴਷਺-੘੝੟-ੱੵ-઄ઌ઎઒઩઱઴઺-઼ા-૟ૡ-଄଍-଎଑-଒଩଱଴-ଵ଺-଼ା-୛୞ୢ-஄஋-஍஑஖-஘஛஝஠-஢஥-஧஫-஭ஶ஺-ఄ఍఑఩ఴ఺-౟ౢ-಄಍಑಩಴಺-ೝ೟ೢ-ഄ഍഑ഩഺ-ൟൢ-฀ฯัิ-฿ๆ-຀຃຅-ຆຉ຋-ຌຎ-ຓຘຠ຤຦ຨ-ຩຬຯັິ-ຼ຾-຿໅-༿཈ཪ-႟჆-჏ჷ-ჿᄁᄄᄈᄊᄍᄓ-ᄻᄽᄿᅁ-ᅋᅍᅏᅑ-ᅓᅖ-ᅘᅚ-ᅞᅢᅤᅦᅨᅪ-ᅬᅯ-ᅱᅴᅶ-ᆝᆟ-ᆧᆩ-ᆪᆬ-ᆭᆰ-ᆶᆹᆻᇃ-ᇪᇬ-ᇯᇱ-ᇸᇺ-᷿ẜ-ẟỺ-ỿ἖-἗἞-἟὆-὇὎-὏὘὚὜὞὾-὿᾵᾽᾿-῁῅῍-῏῔-῕῜-῟῭-῱῵´-℥℧-℩ℬ-ℭℯ-ⅿↃ-〆〈-〠〪-぀ゕ-゠・-㄄ㄭ-䷿龦-꯿힤-￿]u#[^ 
a-zA-Z0-9\-'()+,./:=?;!*#@$_%]c	Bs�|EeZdZejd�Zddddddddd�Z	ddd�Z
ddd�Zdd	�Zd
d�Z
dd
�Zdd�Zdd�Zdd�Zdd�Zdd�ZdS(u
InfosetFilteru
U[\dA-F]{5,5}cCsC||_||_||_||_||_||_i|_dS(N(udropXmlnsLocalNameudropXmlnsAttrNsupreventDoubleDashCommentsupreventDashAtCommentEndureplaceFormFeedCharactersupreventSingleQuotePubidureplaceCache(uselfureplaceCharsudropXmlnsLocalNameudropXmlnsAttrNsupreventDoubleDashCommentsupreventDashAtCommentEndureplaceFormFeedCharactersupreventSingleQuotePubid((u6/tmp/pip-zej_zi-build/pip/_vendor/html5lib/ihatexml.pyu__init__�s						uInfosetFilter.__init__cCsf|jr,|jd�r,tjdt�dS|jrU|dkrUtjdt�dS|j|�SdS(Nuxmlns:u"Attributes cannot begin with xmlnsuhttp://www.w3.org/2000/xmlns/u)Attributes cannot be in the xml namespace(udropXmlnsLocalNameu
startswithuwarningsuwarnuDataLossWarninguNoneudropXmlnsAttrNsu	toXmlName(uselfunameu	namespace((u6/tmp/pip-zej_zi-build/pip/_vendor/html5lib/ihatexml.pyucoerceAttribute�s	uInfosetFilter.coerceAttributecCs
|j|�S(N(u	toXmlName(uselfunameu	namespace((u6/tmp/pip-zej_zi-build/pip/_vendor/html5lib/ihatexml.pyu
coerceElement�suInfosetFilter.coerceElementcCsE|jrAx5d|kr=tjdt�|jdd�}qWn|S(Nu--u'Comments cannot contain adjacent dashesu- -(upreventDoubleDashCommentsuwarningsuwarnuDataLossWarningureplace(uselfudata((u6/tmp/pip-zej_zi-build/pip/_vendor/html5lib/ihatexml.pyu
coerceComment�s
	uInfosetFilter.coerceCommentcCsR|jrNx-t|jd��D]}tjdt�qW|jdd�}n|S(NuuText cannot contain U+000Cu (ureplaceFormFeedCharactersurangeucountuwarningsuwarnuDataLossWarningureplace(uselfudataui((u6/tmp/pip-zej_zi-build/pip/_vendor/html5lib/ihatexml.pyucoerceCharacters�s
	uInfosetFilter.coerceCharacterscCs�|}xHtj|�D]7}tjdt�|j|�}|j||�}qW|jr�|jd�dkr�tjdt�|jd|jd��}n|S(NuCoercing non-XML pubidu'iu!Pubid cannot contain single quote(	unonPubidCharRegexpufindalluwarningsuwarnuDataLossWarningugetReplacementCharacterureplaceupreventSingleQuotePubidufind(uselfudatau
dataOutputucharureplacement((u6/tmp/pip-zej_zi-build/pip/_vendor/html5lib/ihatexml.pyucoercePubid�suInfosetFilter.coercePubidc
Cs�|d}|dd�}tj|�}|rQtjdt�|j|�}n|}|}ttj|��}x?|D]7}tjdt�|j|�}	|j	||	�}qyW||S(NiiuCoercing non-XML name(
unonXmlNameFirstBMPRegexpumatchuwarningsuwarnuDataLossWarningugetReplacementCharacterusetunonXmlNameBMPRegexpufindallureplace(
uselfunameu	nameFirstunameRestumunameFirstOutputunameRestOutputureplaceCharsucharureplacement((u6/tmp/pip-zej_zi-build/pip/_vendor/html5lib/ihatexml.pyu	toXmlName�s

uInfosetFilter.toXmlNamecCs2||jkr|j|}n|j|�}|S(N(ureplaceCacheu
escapeChar(uselfucharureplacement((u6/tmp/pip-zej_zi-build/pip/_vendor/html5lib/ihatexml.pyugetReplacementCharactersu%InfosetFilter.getReplacementCharactercCsBx;t|jj|��D]!}|j||j|��}qW|S(N(usetureplacementRegexpufindallureplaceuunescapeChar(uselfunameuitem((u6/tmp/pip-zej_zi-build/pip/_vendor/html5lib/ihatexml.pyufromXmlNamesuInfosetFilter.fromXmlNamecCs!dt|�}||j|<|S(NuU%05X(uordureplaceCache(uselfucharureplacement((u6/tmp/pip-zej_zi-build/pip/_vendor/html5lib/ihatexml.pyu
escapeChars
uInfosetFilter.escapeCharcCstt|dd�d��S(Nii(uchruint(uselfucharcode((u6/tmp/pip-zej_zi-build/pip/_vendor/html5lib/ihatexml.pyuunescapeCharsuInfosetFilter.unescapeCharNFT(u__name__u
__module__u__qualname__ureucompileureplacementRegexpuNoneuFalseuTrueu__init__ucoerceAttributeu
coerceElementu
coerceCommentucoerceCharactersucoercePubidu	toXmlNameugetReplacementCharacterufromXmlNameu
escapeCharuunescapeChar(u
__locals__((u6/tmp/pip-zej_zi-build/pip/_vendor/html5lib/ihatexml.pyu
InfosetFilter�s$u
InfosetFilter(!u
__future__uabsolute_importudivisionuunicode_literalsureuwarningsu	constantsuDataLossWarningubaseCharuideographicucombiningCharacterudigituextenderujoinuletterunameu	nameFirstucompileureCharureCharRangeucharStringToListunormaliseCharListuintumax_unicodeu
missingRangesulistToRegexpStruhexToIntuescapeRegexpunonXmlNameBMPRegexpunonXmlNameFirstBMPRegexpunonPubidCharRegexpuobjectu
InfosetFilter(((u6/tmp/pip-zej_zi-build/pip/_vendor/html5lib/ihatexml.pyu<module>s20	site-packages/pip/_vendor/html5lib/__pycache__/tokenizer.cpython-33.pyc000064400000207021151733463610022110 0ustar00�
7�Re�,c@s	ddlmZmZmZy
eZWnek
r:YnXddlmZddl	m
Z
ddl	mZddl	mZm
Z
ddl	mZmZmZddl	mZmZdd	l	mZdd
lmZddlmZee�ZGdd
�d
e�ZdS(i(uabsolute_importudivisionuunicode_literals(udequei(uspaceCharacters(uentities(uasciiLettersuasciiUpper2Lower(udigitsu	hexDigitsuEOF(u
tokenTypesu
tagTokenTypes(ureplacementCharacters(uHTMLInputStream(uTriec	s�|EeZdZdZd�d�d�d�d�d��fdd�Zdd�Zdd�Zd�d�dd	�Z
d
d�Zdd
�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�Zd2d3�Zd4d5�Z d6d7�Z!d8d9�Z"d:d;�Z#d<d=�Z$d>d?�Z%d@dA�Z&dBdC�Z'dDdE�Z(dFdG�Z)dHdI�Z*dJdK�Z+dLdM�Z,dNdO�Z-dPdQ�Z.dRdS�Z/dTdU�Z0dVdW�Z1dXdY�Z2dZd[�Z3d\d]�Z4d^d_�Z5d`da�Z6dbdc�Z7ddde�Z8dfdg�Z9dhdi�Z:djdk�Z;dldm�Z<dndo�Z=dpdq�Z>drds�Z?dtdu�Z@dvdw�ZAdxdy�ZBdzd{�ZCd|d}�ZDd~d�ZEd�d��ZFd�d��ZGd�d��ZHd�d��ZId�d��ZJd�d��ZKd�d��ZLd�d��ZMd�d��ZNd�d��ZO�S(�u
HTMLTokenizeru	 This class takes care of tokenizing HTML.

    * self.currentToken
      Holds the token that is currently being processed.

    * self.state
      Holds a reference to the method to be invoked... XXX

    * self.stream
      Points to HTMLInputStream object.
    cszt||||�|_||_||_||_d|_g|_|j|_	d|_
d|_t
t|�j�dS(NF(uHTMLInputStreamustreamuparserulowercaseElementNameulowercaseAttrNameuFalseu
escapeFlagu
lastFourCharsu	dataStateustateuescapeuNoneucurrentTokenusuperu
HTMLTokenizeru__init__(uselfustreamuencodingu	parseMetau
useChardetulowercaseElementNameulowercaseAttrNameuparser(u	__class__(u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyu__init__%s							uHTMLTokenizer.__init__ccs}tg�|_xg|j�rxx6|jjrVitdd6|jjjd�d6Vq!Wx|jrt|jj�VqZWqWdS(u� This is where the magic happens.

        We do our usually processing through the states and when we have a token
        to return we yield the token which pauses processing until the next token
        is requested.
        u
ParseErrorutypeiudataN(udequeu
tokenQueueustateustreamuerrorsu
tokenTypesupopupopleft(uself((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyu__iter__9s*uHTMLTokenizer.__iter__c	0Cs�t}d}|r!t}d}ng}|jj�}x8||krp|tk	rp|j|�|jj�}q9Wtdj|�|�}|tkr�t|}|j	jit
dd6dd6i|d6d	6�n�d
|ko�dkns�|dkr3d
}|j	jit
dd6dd6i|d6d	6�nsd|koJdknsd|kofdknsd|ko�dknsd|ko�dkns|tddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7dg#�krQ|j	jit
dd6dd6i|d6d	6�nyt|�}WnBt
k
r�|d8}td
|d?B�td9|d:@B�}YnX|d;kr�|j	jit
dd6d<d6�|jj|�n|S(=u�This function returns either U+FFFD or the character based on the
        decimal or hexadecimal representation. It also discards ";" if present.
        If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked.
        i
iuu
ParseErrorutypeu$illegal-codepoint-for-numeric-entityudatau	charAsIntudatavarsi�i��i��u�iiiiii�i�i�ii��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��	i��	i��
i��
i��i��i��i��i��
i��
i��i��i��i��i��ii�i�u;u numeric-entity-without-semicolon(udigitsu	hexDigitsustreamucharuEOFuappenduintujoinureplacementCharactersu
tokenQueueu
tokenTypesu	frozensetuchru
ValueErroruunget(	uselfuisHexualloweduradixu	charStackucu	charAsIntucharuv((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuconsumeNumberEntityIs`	



+u!HTMLTokenizer.consumeNumberEntityc	Cs�d}|jj�g}|dtks]|dtddfks]|dk	rt||dkrt|jj|d�n�|ddkrpd}|j|jj��|ddkr�d}|j|jj��n|r�|dt	ks�|r"|dt
kr"|jj|d�|j|�}qD|jjit
dd	6d
d6�|jj|j��ddj|�}n�xF|dtk	r�tjdj|��s�Pn|j|jj��qsWy2tjdj|dd���}t|�}Wntk
rd}YnX|dk	r�|dd
krG|jjit
dd	6dd6�n|dd
kr�|r�||tks�||t
ks�||dkr�|jj|j��ddj|�}qDt|}|jj|j��|dj||d��7}nK|jjit
dd	6dd6�|jj|j��ddj|�}|rf|jddd|7<n=|tkr{d}nd}|jjit
|d	6|d6�dS(Nu&iu<u#iuxuXu
ParseErrorutypeuexpected-numeric-entityudatauu;unamed-entity-without-semicolonu=uexpected-named-entityuSpaceCharactersu
CharactersFi����(uxuXTi����i����i����i����i����i����i����i����(ustreamucharuspaceCharactersuEOFuNoneuungetuFalseuappenduTrueu	hexDigitsudigitsuconsumeNumberEntityu
tokenQueueu
tokenTypesupopujoinuentitiesTrieuhas_keys_with_prefixulongest_prefixulenuKeyErroruasciiLettersuentitiesucurrentToken(	uselfuallowedCharu
fromAttributeuoutputu	charStackuhexu
entityNameuentityLengthu	tokenType((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyu
consumeEntity�sf)"

 	uHTMLTokenizer.consumeEntitycCs|jd|dd�dS(uIThis method replaces the need for "entityInAttributeValueState".
        uallowedCharu
fromAttributeNT(u
consumeEntityuTrue(uselfuallowedChar((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuprocessEntityInAttribute�su&HTMLTokenizer.processEntityInAttributecCs�|j}|dtkr�|jr<|djt�|d<n|dtdkr�|dr|jjitdd6dd6�n|dr�|jjitdd6dd6�q�q�n|jj|�|j|_	d	S(
u�This method is a generic handler for emitting the tags. It also sets
        the state to "data" because that's what's needed after a token has been
        emitted.
        utypeunameuEndTagudatau
ParseErroruattributes-in-end-taguselfClosinguself-closing-flag-on-end-tagN(
ucurrentTokenu
tagTokenTypesulowercaseElementNameu	translateuasciiUpper2Loweru
tokenTypesu
tokenQueueuappendu	dataStateustate(uselfutoken((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuemitCurrentToken�s		

uHTMLTokenizer.emitCurrentTokencCs(|jj�}|dkr*|j|_n�|dkrE|j|_n�|dkr�|jjitdd6dd6�|jjitdd6dd6�n�|tkr�d
S|t
kr�|jjitd	d6||jjt
d�d6�n8|jjd�}|jjitdd6||d6�dS(
Nu&u<uu
ParseErrorutypeuinvalid-codepointudatau
CharactersuSpaceCharactersFT(u&u<u(
ustreamucharuentityDataStateustateutagOpenStateu
tokenQueueuappendu
tokenTypesuEOFuFalseuspaceCharactersu
charsUntiluTrue(uselfudatauchars((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyu	dataState�s&!uHTMLTokenizer.dataStatecCs|j�|j|_dS(NT(u
consumeEntityu	dataStateustateuTrue(uself((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuentityDataStates
uHTMLTokenizer.entityDataStatecCs(|jj�}|dkr*|j|_n�|dkrE|j|_n�|tkrUdS|dkr�|jjit	dd6dd6�|jjit	dd6d	d6�n||t
kr�|jjit	d
d6||jjt
d�d6�n8|jjd
�}|jjit	dd6||d6�dS(Nu&u<uu
ParseErrorutypeuinvalid-codepointudatau
Charactersu�uSpaceCharactersFT(u&u<u(
ustreamucharucharacterReferenceInRcdataustateurcdataLessThanSignStateuEOFuFalseu
tokenQueueuappendu
tokenTypesuspaceCharactersu
charsUntiluTrue(uselfudatauchars((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyurcdataStates&!uHTMLTokenizer.rcdataStatecCs|j�|j|_dS(NT(u
consumeEntityurcdataStateustateuTrue(uself((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyucharacterReferenceInRcdata:s
u(HTMLTokenizer.characterReferenceInRcdatacCs�|jj�}|dkr*|j|_n�|dkr}|jjitdd6dd6�|jjitdd6dd6�nH|tkr�d	S|jj	d
�}|jjitdd6||d6�dS(Nu<uu
ParseErrorutypeuinvalid-codepointudatau
Charactersu�F(u<uT(ustreamucharurawtextLessThanSignStateustateu
tokenQueueuappendu
tokenTypesuEOFuFalseu
charsUntiluTrue(uselfudatauchars((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyurawtextState?suHTMLTokenizer.rawtextStatecCs�|jj�}|dkr*|j|_n�|dkr}|jjitdd6dd6�|jjitdd6dd6�nH|tkr�d	S|jj	d
�}|jjitdd6||d6�dS(Nu<uu
ParseErrorutypeuinvalid-codepointudatau
Charactersu�F(u<uT(ustreamucharuscriptDataLessThanSignStateustateu
tokenQueueuappendu
tokenTypesuEOFuFalseu
charsUntiluTrue(uselfudatauchars((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuscriptDataStateQsuHTMLTokenizer.scriptDataStatecCs�|jj�}|tkrdS|dkrr|jjitdd6dd6�|jjitdd6dd6�n2|jjitdd6||jjd�d6�d	S(
Nuu
ParseErrorutypeuinvalid-codepointudatau
Charactersu�FT(	ustreamucharuEOFuFalseu
tokenQueueuappendu
tokenTypesu
charsUntiluTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuplaintextStatecsuHTMLTokenizer.plaintextStatecCs�|jj�}|dkr*|j|_nr|dkrE|j|_nW|tkr�itdd6|d6gd6dd6dd6|_|j	|_n|d	kr�|j
jitd
d6dd6�|j
jitdd6d
d6�|j|_n�|dkr<|j
jitd
d6dd6�|jj
|�|j|_n`|j
jitd
d6dd6�|j
jitdd6dd6�|jj
|�|j|_dS(Nu!u/uStartTagutypeunameudatauselfClosinguselfClosingAcknowledgedu>u
ParseErroru'expected-tag-name-but-got-right-bracketu
Charactersu<>u?u'expected-tag-name-but-got-question-markuexpected-tag-nameu<FT(ustreamucharumarkupDeclarationOpenStateustateucloseTagOpenStateuasciiLettersu
tokenTypesuFalseucurrentTokenutagNameStateu
tokenQueueuappendu	dataStateuungetubogusCommentStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyutagOpenStaters6
""uHTMLTokenizer.tagOpenStatecCs?|jj�}|tkrSitdd6|d6gd6dd6|_|j|_n�|dkr�|jj	itdd6dd6�|j
|_n�|tkr�|jj	itdd6d	d6�|jj	itd
d6dd6�|j
|_nL|jj	itdd6dd6i|d6d
6�|jj|�|j
|_dS(NuEndTagutypeunameudatauselfClosingu>u
ParseErroru*expected-closing-tag-but-got-right-bracketu expected-closing-tag-but-got-eofu
Charactersu</u!expected-closing-tag-but-got-charudatavarsFT(ustreamucharuasciiLettersu
tokenTypesuFalseucurrentTokenutagNameStateustateu
tokenQueueuappendu	dataStateuEOFuungetubogusCommentStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyucloseTagOpenState�s("uHTMLTokenizer.closeTagOpenStatecCs�|jj�}|tkr*|j|_n�|dkrC|j�n�|tkr�|jjit	dd6dd6�|j
|_nn|dkr�|j|_nS|dkr�|jjit	dd6dd6�|jd	d
7<n|jd	|7<dS(Nu>u
ParseErrorutypeueof-in-tag-nameudatau/uuinvalid-codepointunameu�T(ustreamucharuspaceCharactersubeforeAttributeNameStateustateuemitCurrentTokenuEOFu
tokenQueueuappendu
tokenTypesu	dataStateuselfClosingStartTagStateucurrentTokenuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyutagNameState�s"
uHTMLTokenizer.tagNameStatecCsu|jj�}|dkr3d|_|j|_n>|jjitdd6dd6�|jj|�|j	|_dS(Nu/uu
Charactersutypeu<udataT(ustreamucharutemporaryBufferurcdataEndTagOpenStateustateu
tokenQueueuappendu
tokenTypesuungeturcdataStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyurcdataLessThanSignState�s	"u%HTMLTokenizer.rcdataLessThanSignStatecCs{|jj�}|tkr9|j|7_|j|_n>|jjitdd6dd6�|jj	|�|j
|_dS(Nu
Charactersutypeu</udataT(ustreamucharuasciiLettersutemporaryBufferurcdataEndTagNameStateustateu
tokenQueueuappendu
tokenTypesuungeturcdataStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyurcdataEndTagOpenState�s"u#HTMLTokenizer.rcdataEndTagOpenStatecCs�|jo(|jdj�|jj�k}|jj�}|tkr�|r�itdd6|jd6gd6d
d6|_|j|_	n|dkr�|r�itdd6|jd6gd6d
d6|_|j
|_	n�|dkr+|r+itdd6|jd6gd6d
d6|_|j�|j|_	nc|t
krI|j|7_nE|jjitdd6d	|jd6�|jj|�|j|_	dS(NunameuEndTagutypeudatauselfClosingu/u>u
Charactersu</FT(ucurrentTokenulowerutemporaryBufferustreamucharuspaceCharactersu
tokenTypesuFalseubeforeAttributeNameStateustateuselfClosingStartTagStateuemitCurrentTokenu	dataStateuasciiLettersu
tokenQueueuappenduungeturcdataStateuTrue(uselfuappropriateudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyurcdataEndTagNameState�s2+



u#HTMLTokenizer.rcdataEndTagNameStatecCsu|jj�}|dkr3d|_|j|_n>|jjitdd6dd6�|jj|�|j	|_dS(Nu/uu
Charactersutypeu<udataT(ustreamucharutemporaryBufferurawtextEndTagOpenStateustateu
tokenQueueuappendu
tokenTypesuungeturawtextStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyurawtextLessThanSignState�s	"u&HTMLTokenizer.rawtextLessThanSignStatecCs{|jj�}|tkr9|j|7_|j|_n>|jjitdd6dd6�|jj	|�|j
|_dS(Nu
Charactersutypeu</udataT(ustreamucharuasciiLettersutemporaryBufferurawtextEndTagNameStateustateu
tokenQueueuappendu
tokenTypesuungeturawtextStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyurawtextEndTagOpenStates"u$HTMLTokenizer.rawtextEndTagOpenStatecCs�|jo(|jdj�|jj�k}|jj�}|tkr�|r�itdd6|jd6gd6d
d6|_|j|_	n|dkr�|r�itdd6|jd6gd6d
d6|_|j
|_	n�|dkr+|r+itdd6|jd6gd6d
d6|_|j�|j|_	nc|t
krI|j|7_nE|jjitdd6d	|jd6�|jj|�|j|_	dS(NunameuEndTagutypeudatauselfClosingu/u>u
Charactersu</FT(ucurrentTokenulowerutemporaryBufferustreamucharuspaceCharactersu
tokenTypesuFalseubeforeAttributeNameStateustateuselfClosingStartTagStateuemitCurrentTokenu	dataStateuasciiLettersu
tokenQueueuappenduungeturawtextStateuTrue(uselfuappropriateudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyurawtextEndTagNameStates2+



u$HTMLTokenizer.rawtextEndTagNameStatecCs�|jj�}|dkr3d|_|j|_n{|dkrp|jjitdd6dd6�|j|_n>|jjitdd6dd6�|jj	|�|j
|_d	S(
Nu/uu!u
Charactersutypeu<!udatau<T(ustreamucharutemporaryBufferuscriptDataEndTagOpenStateustateu
tokenQueueuappendu
tokenTypesuscriptDataEscapeStartStateuungetuscriptDataStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuscriptDataLessThanSignState's	""u)HTMLTokenizer.scriptDataLessThanSignStatecCs{|jj�}|tkr9|j|7_|j|_n>|jjitdd6dd6�|jj	|�|j
|_dS(Nu
Charactersutypeu</udataT(ustreamucharuasciiLettersutemporaryBufferuscriptDataEndTagNameStateustateu
tokenQueueuappendu
tokenTypesuungetuscriptDataStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuscriptDataEndTagOpenState5s"u'HTMLTokenizer.scriptDataEndTagOpenStatecCs�|jo(|jdj�|jj�k}|jj�}|tkr�|r�itdd6|jd6gd6d
d6|_|j|_	n|dkr�|r�itdd6|jd6gd6d
d6|_|j
|_	n�|dkr+|r+itdd6|jd6gd6d
d6|_|j�|j|_	nc|t
krI|j|7_nE|jjitdd6d	|jd6�|jj|�|j|_	dS(NunameuEndTagutypeudatauselfClosingu/u>u
Charactersu</FT(ucurrentTokenulowerutemporaryBufferustreamucharuspaceCharactersu
tokenTypesuFalseubeforeAttributeNameStateustateuselfClosingStartTagStateuemitCurrentTokenu	dataStateuasciiLettersu
tokenQueueuappenduungetuscriptDataStateuTrue(uselfuappropriateudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuscriptDataEndTagNameState@s2+



u'HTMLTokenizer.scriptDataEndTagNameStatecCsl|jj�}|dkrL|jjitdd6dd6�|j|_n|jj|�|j|_dS(Nu-u
CharactersutypeudataT(
ustreamucharu
tokenQueueuappendu
tokenTypesuscriptDataEscapeStartDashStateustateuungetuscriptDataStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuscriptDataEscapeStartState\s"u(HTMLTokenizer.scriptDataEscapeStartStatecCsl|jj�}|dkrL|jjitdd6dd6�|j|_n|jj|�|j|_dS(Nu-u
CharactersutypeudataT(
ustreamucharu
tokenQueueuappendu
tokenTypesuscriptDataEscapedDashDashStateustateuungetuscriptDataStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuscriptDataEscapeStartDashStatefs"u,HTMLTokenizer.scriptDataEscapeStartDashStatecCs|jj�}|dkrL|jjitdd6dd6�|j|_n�|dkrg|j|_n�|dkr�|jjitdd6dd6�|jjitdd6d	d6�nS|tkr�|j	|_n8|jj
d
�}|jjitdd6||d6�dS(Nu-u
Charactersutypeudatau<uu
ParseErroruinvalid-codepointu�(u<u-uT(ustreamucharu
tokenQueueuappendu
tokenTypesuscriptDataEscapedDashStateustateu"scriptDataEscapedLessThanSignStateuEOFu	dataStateu
charsUntiluTrue(uselfudatauchars((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuscriptDataEscapedStateps""u$HTMLTokenizer.scriptDataEscapedStatecCs|jj�}|dkrL|jjitdd6dd6�|j|_n�|dkrg|j|_n�|dkr�|jjitdd6dd6�|jjitdd6d	d6�|j|_nI|t	kr�|j
|_n.|jjitdd6|d6�|j|_d
S(Nu-u
Charactersutypeudatau<uu
ParseErroruinvalid-codepointu�T(ustreamucharu
tokenQueueuappendu
tokenTypesuscriptDataEscapedDashDashStateustateu"scriptDataEscapedLessThanSignStateuscriptDataEscapedStateuEOFu	dataStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuscriptDataEscapedDashState�s"""u(HTMLTokenizer.scriptDataEscapedDashStatecCsD|jj�}|dkr@|jjitdd6dd6�n|dkr[|j|_n�|dkr�|jjitdd6dd6�|j|_n�|dkr�|jjitdd6d	d6�|jjitdd6d
d6�|j|_nI|t	kr|j
|_n.|jjitdd6|d6�|j|_dS(Nu-u
Charactersutypeudatau<u>uu
ParseErroruinvalid-codepointu�T(ustreamucharu
tokenQueueuappendu
tokenTypesu"scriptDataEscapedLessThanSignStateustateuscriptDataStateuscriptDataEscapedStateuEOFu	dataStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuscriptDataEscapedDashDashState�s&%""u,HTMLTokenizer.scriptDataEscapedDashDashStatecCs�|jj�}|dkr3d|_|j|_n�|tkr}|jjitdd6d|d6�||_|j	|_n>|jjitdd6dd6�|jj
|�|j|_dS(Nu/uu
Charactersutypeu<udataT(
ustreamucharutemporaryBufferu scriptDataEscapedEndTagOpenStateustateuasciiLettersu
tokenQueueuappendu
tokenTypesu scriptDataDoubleEscapeStartStateuungetuscriptDataEscapedStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyu"scriptDataEscapedLessThanSignState�s	&	"u0HTMLTokenizer.scriptDataEscapedLessThanSignStatecCsu|jj�}|tkr3||_|j|_n>|jjitdd6dd6�|jj	|�|j
|_dS(Nu
Charactersutypeu</udataT(ustreamucharuasciiLettersutemporaryBufferu scriptDataEscapedEndTagNameStateustateu
tokenQueueuappendu
tokenTypesuungetuscriptDataEscapedStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyu scriptDataEscapedEndTagOpenState�s	"u.HTMLTokenizer.scriptDataEscapedEndTagOpenStatecCs�|jo(|jdj�|jj�k}|jj�}|tkr�|r�itdd6|jd6gd6d
d6|_|j|_	n|dkr�|r�itdd6|jd6gd6d
d6|_|j
|_	n�|dkr+|r+itdd6|jd6gd6d
d6|_|j�|j|_	nc|t
krI|j|7_nE|jjitdd6d	|jd6�|jj|�|j|_	dS(NunameuEndTagutypeudatauselfClosingu/u>u
Charactersu</FT(ucurrentTokenulowerutemporaryBufferustreamucharuspaceCharactersu
tokenTypesuFalseubeforeAttributeNameStateustateuselfClosingStartTagStateuemitCurrentTokenu	dataStateuasciiLettersu
tokenQueueuappenduungetuscriptDataEscapedStateuTrue(uselfuappropriateudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyu scriptDataEscapedEndTagNameState�s2+



u.HTMLTokenizer.scriptDataEscapedEndTagNameStatecCs�|jj�}|ttd�Bkrz|jjitdd6|d6�|jj�dkrk|j	|_
q�|j|_
n\|tkr�|jjitdd6|d6�|j|7_n|jj
|�|j|_
dS(	Nu/u>u
Charactersutypeudatauscript(u/u>T(ustreamucharuspaceCharactersu	frozensetu
tokenQueueuappendu
tokenTypesutemporaryBufferuloweruscriptDataDoubleEscapedStateustateuscriptDataEscapedStateuasciiLettersuungetuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyu scriptDataDoubleEscapeStartState�s""u.HTMLTokenizer.scriptDataDoubleEscapeStartStatecCs?|jj�}|dkrL|jjitdd6dd6�|j|_n�|dkr�|jjitdd6dd6�|j|_n�|dkr�|jjitdd6dd6�|jjitdd6d	d6�n_|tkr|jjitdd6d
d6�|j	|_n"|jjitdd6|d6�dS(Nu-u
Charactersutypeudatau<uu
ParseErroruinvalid-codepointu�ueof-in-script-in-scriptT(ustreamucharu
tokenQueueuappendu
tokenTypesu scriptDataDoubleEscapedDashStateustateu(scriptDataDoubleEscapedLessThanSignStateuEOFu	dataStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuscriptDataDoubleEscapedState�s$"""u*HTMLTokenizer.scriptDataDoubleEscapedStatecCsW|jj�}|dkrL|jjitdd6dd6�|j|_n|dkr�|jjitdd6dd6�|j|_n�|dkr�|jjitdd6dd6�|jjitdd6d	d6�|j|_nk|t	kr%|jjitdd6d
d6�|j
|_n.|jjitdd6|d6�|j|_dS(Nu-u
Charactersutypeudatau<uu
ParseErroruinvalid-codepointu�ueof-in-script-in-scriptT(ustreamucharu
tokenQueueuappendu
tokenTypesu$scriptDataDoubleEscapedDashDashStateustateu(scriptDataDoubleEscapedLessThanSignStateuscriptDataDoubleEscapedStateuEOFu	dataStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyu scriptDataDoubleEscapedDashState	s("""u.HTMLTokenizer.scriptDataDoubleEscapedDashStatecCs�|jj�}|dkr@|jjitdd6dd6�nD|dkr}|jjitdd6dd6�|j|_n|dkr�|jjitdd6dd6�|j|_n�|dkr|jjitdd6d	d6�|jjitdd6d
d6�|j|_nk|t	krV|jjitdd6dd6�|j
|_n.|jjitdd6|d6�|j|_dS(
Nu-u
Charactersutypeudatau<u>uu
ParseErroruinvalid-codepointu�ueof-in-script-in-scriptT(ustreamucharu
tokenQueueuappendu
tokenTypesu(scriptDataDoubleEscapedLessThanSignStateustateuscriptDataStateuscriptDataDoubleEscapedStateuEOFu	dataStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyu$scriptDataDoubleEscapedDashDashState s,%"""u2HTMLTokenizer.scriptDataDoubleEscapedDashDashStatecCsu|jj�}|dkrU|jjitdd6dd6�d|_|j|_n|jj|�|j	|_dS(Nu/u
CharactersutypeudatauT(ustreamucharu
tokenQueueuappendu
tokenTypesutemporaryBufferuscriptDataDoubleEscapeEndStateustateuungetuscriptDataDoubleEscapedStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyu(scriptDataDoubleEscapedLessThanSignState9s"	u6HTMLTokenizer.scriptDataDoubleEscapedLessThanSignStatecCs�|jj�}|ttd�Bkrz|jjitdd6|d6�|jj�dkrk|j	|_
q�|j|_
n\|tkr�|jjitdd6|d6�|j|7_n|jj
|�|j|_
dS(	Nu/u>u
Charactersutypeudatauscript(u/u>T(ustreamucharuspaceCharactersu	frozensetu
tokenQueueuappendu
tokenTypesutemporaryBufferuloweruscriptDataEscapedStateustateuscriptDataDoubleEscapedStateuasciiLettersuungetuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuscriptDataDoubleEscapeEndStateDs""u,HTMLTokenizer.scriptDataDoubleEscapeEndStatecCs�|jj�}|tkr1|jjtd�nz|tkrf|jdj|dg�|j|_	nE|dkr|j
�n,|dkr�|j|_	n|dkr�|jjit
d	d
6dd6�|jdj|dg�|j|_	n�|dkrH|jjit
d	d
6d
d6�|jdjddg�|j|_	nc|tkr�|jjit
d	d
6dd6�|j|_	n&|jdj|dg�|j|_	dS(Nudatauu>u/u'u"u=u<u
ParseErrorutypeu#invalid-character-in-attribute-nameuuinvalid-codepointu�u#expected-attribute-name-but-got-eofT(u'u"u=u<(ustreamucharuspaceCharactersu
charsUntiluTrueuasciiLettersucurrentTokenuappenduattributeNameStateustateuemitCurrentTokenuselfClosingStartTagStateu
tokenQueueu
tokenTypesuEOFu	dataState(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyubeforeAttributeNameStateTs6
u&HTMLTokenizer.beforeAttributeNameStatecCs�|jj�}d}d}|dkr6|j|_n�|tkrw|jddd||jjtd�7<d}nG|dkr�d}n2|t	kr�|j
|_n|dkr�|j|_n�|dkr|jj
itdd	6d
d6�|jdddd7<d}n�|dkrb|jj
itdd	6dd6�|jddd|7<d}n\|tkr�|jj
itdd	6dd6�|j|_n|jddd|7<d}|r||jr�|jdddjt�|jddd<nxf|jddd�D]M\}}|jddd|kr|jj
itdd	6dd6�PqqW|r||j�q|ndS(Nu=udataiiu>u/uu
ParseErrorutypeuinvalid-codepointu�u'u"u<u#invalid-character-in-attribute-nameueof-in-attribute-nameuduplicate-attributeTFi����i����(u'u"u<i����i����i����i����i����i����(ustreamucharuTrueuFalseubeforeAttributeValueStateustateuasciiLettersucurrentTokenu
charsUntiluspaceCharactersuafterAttributeNameStateuselfClosingStartTagStateu
tokenQueueuappendu
tokenTypesuEOFu	dataStateulowercaseAttrNameu	translateuasciiUpper2LoweruemitCurrentToken(uselfudatauleavingThisStateu	emitTokenunameuvalue((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuattributeNameStatersT					0$u HTMLTokenizer.attributeNameStatecCs�|jj�}|tkr1|jjtd�n�|dkrL|j|_nz|dkre|j�na|tkr�|j	dj
|dg�|j|_n,|dkr�|j|_n|dkr|j
j
itdd6d	d6�|j	dj
d
dg�|j|_n�|dkrc|j
j
itdd6dd6�|j	dj
|dg�|j|_nc|tkr�|j
j
itdd6dd6�|j|_n&|j	dj
|dg�|j|_dS(Nu=u>udatauu/uu
ParseErrorutypeuinvalid-codepointu�u'u"u<u&invalid-character-after-attribute-nameuexpected-end-of-tag-but-got-eofT(u'u"u<(ustreamucharuspaceCharactersu
charsUntiluTrueubeforeAttributeValueStateustateuemitCurrentTokenuasciiLettersucurrentTokenuappenduattributeNameStateuselfClosingStartTagStateu
tokenQueueu
tokenTypesuEOFu	dataState(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuafterAttributeNameState�s:
u%HTMLTokenizer.afterAttributeNameStatecCs�|jj�}|tkr1|jjtd�n�|dkrL|j|_n�|dkrw|j|_|jj|�nd|dkr�|j	|_nI|dkr�|j
jitdd6dd6�|j
�n|d	kr#|j
jitdd6d
d6�|jdddd7<|j|_n�|dkry|j
jitdd6dd6�|jddd|7<|j|_nb|tkr�|j
jitdd6dd6�|j|_n%|jddd|7<|j|_dS(Nu"u&u'u>u
ParseErrorutypeu.expected-attribute-value-but-got-right-bracketudatauuinvalid-codepointiu�u=u<u`u"equals-in-unquoted-attribute-valueu$expected-attribute-value-but-got-eofTi����(u=u<u`i����i����(ustreamucharuspaceCharactersu
charsUntiluTrueuattributeValueDoubleQuotedStateustateuattributeValueUnQuotedStateuungetuattributeValueSingleQuotedStateu
tokenQueueuappendu
tokenTypesuemitCurrentTokenucurrentTokenuEOFu	dataState(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyubeforeAttributeValueState�s>
u'HTMLTokenizer.beforeAttributeValueStatecCs�|jj�}|dkr*|j|_n�|dkrF|jd�n�|dkr�|jjitdd6dd6�|jdddd	7<nf|t	kr�|jjitdd6d
d6�|j
|_n)|jddd||jjd
�7<dS(Nu"u&uu
ParseErrorutypeuinvalid-codepointudataiu�u#eof-in-attribute-value-double-quotei����i����(u"u&uT(
ustreamucharuafterAttributeValueStateustateuprocessEntityInAttributeu
tokenQueueuappendu
tokenTypesucurrentTokenuEOFu	dataStateu
charsUntiluTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuattributeValueDoubleQuotedState�s u-HTMLTokenizer.attributeValueDoubleQuotedStatecCs�|jj�}|dkr*|j|_n�|dkrF|jd�n�|dkr�|jjitdd6dd6�|jdddd	7<nf|t	kr�|jjitdd6d
d6�|j
|_n)|jddd||jjd
�7<dS(Nu'u&uu
ParseErrorutypeuinvalid-codepointudataiu�u#eof-in-attribute-value-single-quotei����i����(u'u&uT(
ustreamucharuafterAttributeValueStateustateuprocessEntityInAttributeu
tokenQueueuappendu
tokenTypesucurrentTokenuEOFu	dataStateu
charsUntiluTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuattributeValueSingleQuotedState�s u-HTMLTokenizer.attributeValueSingleQuotedStatecCsg|jj�}|tkr*|j|_n9|dkrF|jd�n|dkr_|j�n|dkr�|jjit	dd	6d
d6�|j
ddd|7<n�|d
kr�|jjit	dd	6dd6�|j
dddd7<np|tkr0|jjit	dd	6dd6�|j|_n3|j
ddd||jj
td�tB�7<dS(Nu&u>u"u'u=u<u`u
ParseErrorutypeu0unexpected-character-in-unquoted-attribute-valueudataiuuinvalid-codepointu�u eof-in-attribute-value-no-quotes(u"u'u=u<u`i����i����i����(u&u>u"u'u=u<u`uT(ustreamucharuspaceCharactersubeforeAttributeNameStateustateuprocessEntityInAttributeuemitCurrentTokenu
tokenQueueuappendu
tokenTypesucurrentTokenuEOFu	dataStateu
charsUntilu	frozensetuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuattributeValueUnQuotedStates,
u)HTMLTokenizer.attributeValueUnQuotedStatecCs�|jj�}|tkr*|j|_n�|dkrC|j�n�|dkr^|j|_n�|tkr�|jj	it
dd6dd6�|jj|�|j|_n>|jj	it
dd6dd6�|jj|�|j|_dS(	Nu>u/u
ParseErrorutypeu$unexpected-EOF-after-attribute-valueudatau*unexpected-character-after-attribute-valueT(ustreamucharuspaceCharactersubeforeAttributeNameStateustateuemitCurrentTokenuselfClosingStartTagStateuEOFu
tokenQueueuappendu
tokenTypesuungetu	dataStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuafterAttributeValueState*s"
u&HTMLTokenizer.afterAttributeValueStatecCs�|jj�}|dkr5d|jd<|j�n�|tkr�|jjitdd6dd6�|jj	|�|j
|_n>|jjitdd6dd6�|jj	|�|j|_dS(	Nu>uselfClosingu
ParseErrorutypeu#unexpected-EOF-after-solidus-in-tagudatau)unexpected-character-after-solidus-in-tagT(
ustreamucharuTrueucurrentTokenuemitCurrentTokenuEOFu
tokenQueueuappendu
tokenTypesuungetu	dataStateustateubeforeAttributeNameState(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuselfClosingStartTagState>s

u&HTMLTokenizer.selfClosingStartTagStatecCsc|jjd�}|jdd�}|jjitdd6|d6�|jj�|j|_dS(Nu>uu�uCommentutypeudataT(
ustreamu
charsUntilureplaceu
tokenQueueuappendu
tokenTypesucharu	dataStateustateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyubogusCommentStatePs	
uHTMLTokenizer.bogusCommentStatec	Cs0|jj�g}|ddkrv|j|jj��|ddkr�itdd6dd6|_|j|_d Sne|d!d"krd }x>d)D]6}|j|jj��|d*|kr�d+}Pq�q�W|r�itdd6dd6dd6dd6d d6|_|j
|_d Sn�|d,dkr�|jdk	r�|jjj
r�|jjj
d-j|jjjkr�d }xPddddddgD]6}|j|jj��|d.|kr�d+}Pq�q�W|r�|j|_d Sn|jjitdd6dd6�x |r|jj|j��qW|j|_d S(/Niu-uCommentutypeuudatauduDuouOucuCutuTuyuYupuPueuEuDoctypeunameupublicIdusystemIducorrectu[uAu
ParseErroruexpected-dashes-or-doctypei����i����Ti����(uduD(uouO(ucuC(utuT(uyuY(upuP(ueuE((uouO(ucuC(utuT(uyuY(upuP(ueuEi����Fi����i����i����(ustreamucharuappendu
tokenTypesucurrentTokenucommentStartStateustateuTrueuFalseuNoneudoctypeStateuparserutreeuopenElementsu	namespaceudefaultNamespaceucdataSectionStateu
tokenQueueuungetupopubogusCommentState(uselfu	charStackumatcheduexpected((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyumarkupDeclarationOpenState_sR

%	u(HTMLTokenizer.markupDeclarationOpenStatecCs-|jj�}|dkr*|j|_n�|dkrl|jjitdd6dd6�|jdd7<n�|dkr�|jjitdd6d	d6�|jj|j�|j|_nm|t	kr|jjitdd6d
d6�|jj|j�|j|_n|jd|7<|j
|_dS(Nu-uu
ParseErrorutypeuinvalid-codepointudatau�u>uincorrect-commentueof-in-commentT(ustreamucharucommentStartDashStateustateu
tokenQueueuappendu
tokenTypesucurrentTokenu	dataStateuEOFucommentStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyucommentStartState�s(uHTMLTokenizer.commentStartStatecCs1|jj�}|dkr*|j|_n|dkrl|jjitdd6dd6�|jdd7<n�|dkr�|jjitdd6d	d6�|jj|j�|j|_nq|t	kr|jjitdd6d
d6�|jj|j�|j|_n!|jdd|7<|j
|_dS(Nu-uu
ParseErrorutypeuinvalid-codepointudatau-�u>uincorrect-commentueof-in-commentT(ustreamucharucommentEndStateustateu
tokenQueueuappendu
tokenTypesucurrentTokenu	dataStateuEOFucommentStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyucommentStartDashState�s(u#HTMLTokenizer.commentStartDashStatecCs�|jj�}|dkr*|j|_n�|dkrl|jjitdd6dd6�|jdd7<nq|tkr�|jjitdd6dd6�|jj|j�|j	|_n!|jd||jj
d	�7<d
S(Nu-uu
ParseErrorutypeuinvalid-codepointudatau�ueof-in-comment(u-uT(ustreamucharucommentEndDashStateustateu
tokenQueueuappendu
tokenTypesucurrentTokenuEOFu	dataStateu
charsUntiluTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyucommentState�suHTMLTokenizer.commentStatecCs�|jj�}|dkr*|j|_n�|dkrx|jjitdd6dd6�|jdd7<|j|_nq|t	kr�|jjitdd6dd6�|jj|j�|j
|_n!|jdd|7<|j|_d	S(
Nu-uu
ParseErrorutypeuinvalid-codepointudatau-�ueof-in-comment-end-dashT(ustreamucharucommentEndStateustateu
tokenQueueuappendu
tokenTypesucurrentTokenucommentStateuEOFu	dataStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyucommentEndDashState�s u!HTMLTokenizer.commentEndDashStatecCs�|jj�}|dkr=|jj|j�|j|_n`|dkr�|jjitdd6dd6�|jdd7<|j|_n|dkr�|jjitdd6d	d6�|j	|_n�|d
kr
|jjitdd6dd6�|jd|7<n�|t
krZ|jjitdd6dd6�|jj|j�|j|_nC|jjitdd6d
d6�|jdd|7<|j|_dS(Nu>uu
ParseErrorutypeuinvalid-codepointudatau--�u!u,unexpected-bang-after-double-dash-in-commentu-u,unexpected-dash-after-double-dash-in-commentueof-in-comment-double-dashuunexpected-char-in-commentu--T(ustreamucharu
tokenQueueuappenducurrentTokenu	dataStateustateu
tokenTypesucommentStateucommentEndBangStateuEOFuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyucommentEndState�s6uHTMLTokenizer.commentEndStatecCs,|jj�}|dkr=|jj|j�|j|_n�|dkri|jdd7<|j|_n�|dkr�|jjitdd6dd6�|jdd	7<|j	|_nq|t
kr|jjitdd6d
d6�|jj|j�|j|_n!|jdd|7<|j	|_dS(Nu>u-udatau--!uu
ParseErrorutypeuinvalid-codepointu--!�ueof-in-comment-end-bang-stateT(ustreamucharu
tokenQueueuappenducurrentTokenu	dataStateustateucommentEndDashStateu
tokenTypesucommentStateuEOFuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyucommentEndBangState�s(u!HTMLTokenizer.commentEndBangStatecCs�|jj�}|tkr*|j|_n�|tkr�|jjitdd6dd6�d|j
d<|jj|j
�|j|_n>|jjitdd6dd6�|jj|�|j|_dS(	Nu
ParseErrorutypeu!expected-doctype-name-but-got-eofudataucorrectuneed-space-after-doctypeFT(ustreamucharuspaceCharactersubeforeDoctypeNameStateustateuEOFu
tokenQueueuappendu
tokenTypesuFalseucurrentTokenu	dataStateuungetuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyudoctypeStates
uHTMLTokenizer.doctypeStatecCs?|jj�}|tkrn|dkr{|jjitdd6dd6�d|jd<|jj|j�|j|_	n�|dkr�|jjitdd6dd6�d	|jd
<|j
|_	nv|tkr"|jjitdd6dd6�d|jd<|jj|j�|j|_	n||jd
<|j
|_	d
S(Nu>u
ParseErrorutypeu+expected-doctype-name-but-got-right-bracketudataucorrectuuinvalid-codepointu�unameu!expected-doctype-name-but-got-eofFT(
ustreamucharuspaceCharactersu
tokenQueueuappendu
tokenTypesuFalseucurrentTokenu	dataStateustateudoctypeNameStateuEOFuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyubeforeDoctypeNameState&s.



u$HTMLTokenizer.beforeDoctypeNameStatecCso|jj�}|tkrG|jdjt�|jd<|j|_n$|dkr�|jdjt�|jd<|jj	|j�|j
|_n�|dkr�|jj	itdd6dd6�|jdd7<|j|_n�|t
krZ|jj	itdd6d	d6�d|jd
<|jdjt�|jd<|jj	|j�|j
|_n|jd|7<dS(
Nunameu>uu
ParseErrorutypeuinvalid-codepointudatau�ueof-in-doctype-nameucorrectFT(ustreamucharuspaceCharactersucurrentTokenu	translateuasciiUpper2LoweruafterDoctypeNameStateustateu
tokenQueueuappendu	dataStateu
tokenTypesudoctypeNameStateuEOFuFalseuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyudoctypeNameState@s,
uHTMLTokenizer.doctypeNameStatecCs�|jj�}|tkrn�|dkrL|jj|j�|j|_n�|tkr�d|jd<|jj
|�|jjitdd6dd6�|jj|j�|j|_n|d krd!}x3d'D]+}|jj�}||kr�d}Pq�q�W|r{|j
|_d!Sna|d(kr{d!}x3d.D]+}|jj�}||kr3d}Pq3q3W|r{|j|_d!Sn|jj
|�|jjitdd6dd6i|d6d6�d|jd<|j|_d!S(/Nu>ucorrectu
ParseErrorutypeueof-in-doctypeudataupuPuuuUubuBuluLuiuIucuCusuSuyuYutuTueuEumuMu*expected-space-or-right-bracket-in-doctypeudatavarsF(upuPT(uuuU(ubuB(uluL(uiuI(ucuC((uuuU(ubuB(uluL(uiuI(ucuC(usuS(uyuY(usuS(utuT(ueuE(umuM((uyuY(usuS(utuT(ueuE(umuM(ustreamucharuspaceCharactersu
tokenQueueuappenducurrentTokenu	dataStateustateuEOFuFalseuungetu
tokenTypesuTrueuafterDoctypePublicKeywordStateuafterDoctypeSystemKeywordStateubogusDoctypeState(uselfudataumatcheduexpected((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuafterDoctypeNameStateYsT



u#HTMLTokenizer.afterDoctypeNameStatecCs�|jj�}|tkr*|j|_n�|d	krw|jjitdd6dd6�|jj|�|j|_ny|t	kr�|jjitdd6dd6�d
|jd<|jj|j�|j|_n|jj|�|j|_dS(Nu'u"u
ParseErrorutypeuunexpected-char-in-doctypeudataueof-in-doctypeucorrect(u'u"FT(ustreamucharuspaceCharactersu"beforeDoctypePublicIdentifierStateustateu
tokenQueueuappendu
tokenTypesuungetuEOFuFalseucurrentTokenu	dataStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuafterDoctypePublicKeywordState�s"
u,HTMLTokenizer.afterDoctypePublicKeywordStatecCsg|jj�}|tkrnE|dkrFd|jd<|j|_n|dkrnd|jd<|j|_n�|dkr�|jjit	dd6dd	6�d
|jd
<|jj|j�|j|_n�|tkr(|jjit	dd6dd	6�d
|jd
<|jj|j�|j|_n;|jjit	dd6dd	6�d
|jd
<|j
|_dS(Nu"uupublicIdu'u>u
ParseErrorutypeuunexpected-end-of-doctypeudataucorrectueof-in-doctypeuunexpected-char-in-doctypeFT(ustreamucharuspaceCharactersucurrentTokenu(doctypePublicIdentifierDoubleQuotedStateustateu(doctypePublicIdentifierSingleQuotedStateu
tokenQueueuappendu
tokenTypesuFalseu	dataStateuEOFubogusDoctypeStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyu"beforeDoctypePublicIdentifierState�s4




u0HTMLTokenizer.beforeDoctypePublicIdentifierStatecCs;|jj�}|dkr*|j|_n
|dkrl|jjitdd6dd6�|jdd7<n�|d	kr�|jjitdd6d
d6�d
|jd<|jj|j�|j	|_nn|t
kr&|jjitdd6dd6�d
|jd<|jj|j�|j	|_n|jd|7<dS(Nu"uu
ParseErrorutypeuinvalid-codepointudataupublicIdu�u>uunexpected-end-of-doctypeucorrectueof-in-doctypeFT(ustreamucharu!afterDoctypePublicIdentifierStateustateu
tokenQueueuappendu
tokenTypesucurrentTokenuFalseu	dataStateuEOFuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyu(doctypePublicIdentifierDoubleQuotedState�s*

u6HTMLTokenizer.doctypePublicIdentifierDoubleQuotedStatecCs;|jj�}|dkr*|j|_n
|dkrl|jjitdd6dd6�|jdd7<n�|d	kr�|jjitdd6d
d6�d
|jd<|jj|j�|j	|_nn|t
kr&|jjitdd6dd6�d
|jd<|jj|j�|j	|_n|jd|7<dS(Nu'uu
ParseErrorutypeuinvalid-codepointudataupublicIdu�u>uunexpected-end-of-doctypeucorrectueof-in-doctypeFT(ustreamucharu!afterDoctypePublicIdentifierStateustateu
tokenQueueuappendu
tokenTypesucurrentTokenuFalseu	dataStateuEOFuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyu(doctypePublicIdentifierSingleQuotedState�s*

u6HTMLTokenizer.doctypePublicIdentifierSingleQuotedStatecCs�|jj�}|tkr*|j|_nZ|dkrX|jj|j�|j|_n,|dkr�|jjit	dd6dd6�d|jd<|j
|_n�|d	kr�|jjit	dd6dd6�d|jd<|j|_n�|tkrI|jjit	dd6d
d6�d|jd<|jj|j�|j|_n;|jjit	dd6dd6�d|jd<|j|_d
S(Nu>u"u
ParseErrorutypeuunexpected-char-in-doctypeudatauusystemIdu'ueof-in-doctypeucorrectFT(ustreamucharuspaceCharactersu-betweenDoctypePublicAndSystemIdentifiersStateustateu
tokenQueueuappenducurrentTokenu	dataStateu
tokenTypesu(doctypeSystemIdentifierDoubleQuotedStateu(doctypeSystemIdentifierSingleQuotedStateuEOFuFalseubogusDoctypeStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyu!afterDoctypePublicIdentifierState�s6



u/HTMLTokenizer.afterDoctypePublicIdentifierStatecCs8|jj�}|tkrn|dkrL|jj|j�|j|_n�|dkrtd|jd<|j|_n�|dkr�d|jd<|j	|_n�|t
kr�|jjitdd6dd	6�d|jd
<|jj|j�|j|_n;|jjitdd6dd	6�d|jd
<|j
|_d
S(Nu>u"uusystemIdu'u
ParseErrorutypeueof-in-doctypeudataucorrectuunexpected-char-in-doctypeFT(ustreamucharuspaceCharactersu
tokenQueueuappenducurrentTokenu	dataStateustateu(doctypeSystemIdentifierDoubleQuotedStateu(doctypeSystemIdentifierSingleQuotedStateuEOFu
tokenTypesuFalseubogusDoctypeStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyu-betweenDoctypePublicAndSystemIdentifiersStates.



u;HTMLTokenizer.betweenDoctypePublicAndSystemIdentifiersStatecCs�|jj�}|tkr*|j|_n�|d	krw|jjitdd6dd6�|jj|�|j|_ny|t	kr�|jjitdd6dd6�d
|jd<|jj|j�|j|_n|jj|�|j|_dS(Nu'u"u
ParseErrorutypeuunexpected-char-in-doctypeudataueof-in-doctypeucorrect(u'u"FT(ustreamucharuspaceCharactersu"beforeDoctypeSystemIdentifierStateustateu
tokenQueueuappendu
tokenTypesuungetuEOFuFalseucurrentTokenu	dataStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyuafterDoctypeSystemKeywordState%s"
u,HTMLTokenizer.afterDoctypeSystemKeywordStatecCsg|jj�}|tkrnE|dkrFd|jd<|j|_n|dkrnd|jd<|j|_n�|dkr�|jjit	dd6dd	6�d|jd
<|jj|j�|j|_n�|tkr(|jjit	dd6dd	6�d|jd
<|jj|j�|j|_n;|jjit	dd6dd	6�d|jd
<|j
|_d
S(Nu"uusystemIdu'u>u
ParseErrorutypeuunexpected-char-in-doctypeudataucorrectueof-in-doctypeFT(ustreamucharuspaceCharactersucurrentTokenu(doctypeSystemIdentifierDoubleQuotedStateustateu(doctypeSystemIdentifierSingleQuotedStateu
tokenQueueuappendu
tokenTypesuFalseu	dataStateuEOFubogusDoctypeStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyu"beforeDoctypeSystemIdentifierState9s4




u0HTMLTokenizer.beforeDoctypeSystemIdentifierStatecCs;|jj�}|dkr*|j|_n
|dkrl|jjitdd6dd6�|jdd7<n�|d	kr�|jjitdd6d
d6�d
|jd<|jj|j�|j	|_nn|t
kr&|jjitdd6dd6�d
|jd<|jj|j�|j	|_n|jd|7<dS(Nu"uu
ParseErrorutypeuinvalid-codepointudatausystemIdu�u>uunexpected-end-of-doctypeucorrectueof-in-doctypeFT(ustreamucharu!afterDoctypeSystemIdentifierStateustateu
tokenQueueuappendu
tokenTypesucurrentTokenuFalseu	dataStateuEOFuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyu(doctypeSystemIdentifierDoubleQuotedStateVs*

u6HTMLTokenizer.doctypeSystemIdentifierDoubleQuotedStatecCs;|jj�}|dkr*|j|_n
|dkrl|jjitdd6dd6�|jdd7<n�|d	kr�|jjitdd6d
d6�d
|jd<|jj|j�|j	|_nn|t
kr&|jjitdd6dd6�d
|jd<|jj|j�|j	|_n|jd|7<dS(Nu'uu
ParseErrorutypeuinvalid-codepointudatausystemIdu�u>uunexpected-end-of-doctypeucorrectueof-in-doctypeFT(ustreamucharu!afterDoctypeSystemIdentifierStateustateu
tokenQueueuappendu
tokenTypesucurrentTokenuFalseu	dataStateuEOFuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyu(doctypeSystemIdentifierSingleQuotedStatens*

u6HTMLTokenizer.doctypeSystemIdentifierSingleQuotedStatecCs�|jj�}|tkrn�|dkrL|jj|j�|j|_n�|tkr�|jjit	dd6dd6�d|jd<|jj|j�|j|_n.|jjit	dd6dd6�|j|_d	S(
Nu>u
ParseErrorutypeueof-in-doctypeudataucorrectuunexpected-char-in-doctypeFT(
ustreamucharuspaceCharactersu
tokenQueueuappenducurrentTokenu	dataStateustateuEOFu
tokenTypesuFalseubogusDoctypeStateuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyu!afterDoctypeSystemIdentifierState�s 
u/HTMLTokenizer.afterDoctypeSystemIdentifierStatecCs|jj�}|dkr=|jj|j�|j|_n>|tkr{|jj|�|jj|j�|j|_ndS(Nu>T(
ustreamucharu
tokenQueueuappenducurrentTokenu	dataStateustateuEOFuungetuTrue(uselfudata((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyubogusDoctypeState�suHTMLTokenizer.bogusDoctypeStatecCseg}x�|j|jjd��|j|jjd��|jj�}|tkrZPq	|dkslt�|ddd�dkr�|ddd�|d<Pq	|j|�q	dj|�}|jd�}|dkr*x6t|�D](}|j	jit
d	d
6dd6�q�W|jdd
�}n|rU|j	jit
dd
6|d6�n|j|_
dS(Nu]u>iiu]]uuiu
ParseErrorutypeuinvalid-codepointudatau�u
Charactersi����i����i����i����i����T(uappendustreamu
charsUntilucharuEOFuAssertionErrorujoinucounturangeu
tokenQueueu
tokenTypesureplaceu	dataStateustateuTrue(uselfudataucharu	nullCountui((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyucdataSectionState�s0uHTMLTokenizer.cdataSectionStateNTF(Pu__name__u
__module__u__qualname__u__doc__uNoneuTrueu__init__u__iter__uconsumeNumberEntityuFalseu
consumeEntityuprocessEntityInAttributeuemitCurrentTokenu	dataStateuentityDataStateurcdataStateucharacterReferenceInRcdataurawtextStateuscriptDataStateuplaintextStateutagOpenStateucloseTagOpenStateutagNameStateurcdataLessThanSignStateurcdataEndTagOpenStateurcdataEndTagNameStateurawtextLessThanSignStateurawtextEndTagOpenStateurawtextEndTagNameStateuscriptDataLessThanSignStateuscriptDataEndTagOpenStateuscriptDataEndTagNameStateuscriptDataEscapeStartStateuscriptDataEscapeStartDashStateuscriptDataEscapedStateuscriptDataEscapedDashStateuscriptDataEscapedDashDashStateu"scriptDataEscapedLessThanSignStateu scriptDataEscapedEndTagOpenStateu scriptDataEscapedEndTagNameStateu scriptDataDoubleEscapeStartStateuscriptDataDoubleEscapedStateu scriptDataDoubleEscapedDashStateu$scriptDataDoubleEscapedDashDashStateu(scriptDataDoubleEscapedLessThanSignStateuscriptDataDoubleEscapeEndStateubeforeAttributeNameStateuattributeNameStateuafterAttributeNameStateubeforeAttributeValueStateuattributeValueDoubleQuotedStateuattributeValueSingleQuotedStateuattributeValueUnQuotedStateuafterAttributeValueStateuselfClosingStartTagStateubogusCommentStateumarkupDeclarationOpenStateucommentStartStateucommentStartDashStateucommentStateucommentEndDashStateucommentEndStateucommentEndBangStateudoctypeStateubeforeDoctypeNameStateudoctypeNameStateuafterDoctypeNameStateuafterDoctypePublicKeywordStateu"beforeDoctypePublicIdentifierStateu(doctypePublicIdentifierDoubleQuotedStateu(doctypePublicIdentifierSingleQuotedStateu!afterDoctypePublicIdentifierStateu-betweenDoctypePublicAndSystemIdentifiersStateuafterDoctypeSystemKeywordStateu"beforeDoctypeSystemIdentifierStateu(doctypeSystemIdentifierDoubleQuotedStateu(doctypeSystemIdentifierSingleQuotedStateu!afterDoctypeSystemIdentifierStateubogusDoctypeStateucdataSectionState(u
__locals__((u	__class__u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyu
HTMLTokenizers�	HP#

7 "-3u
HTMLTokenizerN(u
__future__uabsolute_importudivisionuunicode_literalsuunichruchru	NameErrorucollectionsudequeu	constantsuspaceCharactersuentitiesuasciiLettersuasciiUpper2Lowerudigitsu	hexDigitsuEOFu
tokenTypesu
tagTokenTypesureplacementCharactersuinputstreamuHTMLInputStreamutrieuTrieuentitiesTrieuobjectu
HTMLTokenizer(((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/tokenizer.pyu<module>s

site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-33.pyc000064400000002255151733463610021637 0ustar00�
7�Re�c@s�dZddlmZmZmZddlmZmZmZddl	m
Z
ddlmZddl
mZdd	d
ddd
gZdZdS(uM
HTML parsing library based on the WHATWG "HTML5"
specification. The parser is designed to be compatible with existing
HTML found in the wild and implements well-defined error recovery that
is largely compatible with modern desktop web browsers.

Example usage:

import html5lib
f = open("my_document.html")
tree = html5lib.parse(f)
i(uabsolute_importudivisionuunicode_literalsi(u
HTMLParseruparseu
parseFragment(ugetTreeBuilder(u
getTreeWalker(u	serializeu
HTMLParseruparseu
parseFragmentugetTreeBuilderu
getTreeWalkeru	serializeu1.0b3N(u__doc__u
__future__uabsolute_importudivisionuunicode_literalsuhtml5parseru
HTMLParseruparseu
parseFragmentutreebuildersugetTreeBuilderutreewalkersu
getTreeWalkeru
serializeru	serializeu__all__u__version__(((u6/tmp/pip-zej_zi-build/pip/_vendor/html5lib/__init__.pyu<module>ssite-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-33.pyc000064400000253063151733463620022122 0ustar00�
7�Re2UcP@s�TddlmZmZmZddlZddlZejZdZied�d6ed�d6ed�d6ed	�d
6ed�d6ed
�d6ed�d6ed�d6ed�d6ed�d6ed�d6ed�d6ed�d6ed�d6ed�d 6ed!�d"6ed#�d$6ed%�d&6ed'�d(6ed)�d*6ed+�d,6ed-�d.6ed/�d06ed1�d26ed3�d46ed5�d66ed7�d86ed9�d:6ed;�d<6ed=�d>6ed?�d@6edA�dB6edC�dD6edE�dF6edG�dH6edI�dJ6edK�dL6edM�dN6edO�dP6edQ�dR6edS�dT6edU�dV6edW�dX6edY�dZ6ed[�d\6edU�d]6edU�d^6ed_�d`6eda�db6edc�dd6ede�df6edg�dh6edi�dj6edk�dl6edm�dn6edo�dp6edq�dr6eds�dt6edu�dv6edw�dx6edy�dz6ed{�d|6ed}�d~6ed�d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6ed��d�6Z	id�d6dd6dd6dd6dd6d	d
6Z
ee
ddfe
ddfe
ddfe
dd
fe
ddfe
ddfe
ddfe
ddfe
ddfe
ddfe
ddfe
ddfe
ddfe
ddfe
ddfe
ddfe
ddff�Zee
ddfe
ddfe
ddfe
ddfe
ddfe
dd fe
dd!fe
dd"fe
dd#fe
dd$fe
dd%fe
dd&fe
dd'fe
dd(ff�Z
ee
dd)fe
ddfe
dd*fe
dd+fe
dd,fe
dd-fe
dd.fe
dd/fe
dd0fe
dd1fe
dd2fe
dd3fe
ddfe
dd4fe
dd5fe
dd6fe
dd7fe
dd8fe
dd9fe
dd:fe
dd;fe
dd<fe
dd=fe
dd>fe
dd?fe
dd@fe
ddAfe
ddBfe
ddCfe
ddDfe
ddEfe
ddFfe
ddGfe
ddHfe
ddIfe
ddJfe
ddKfe
ddLfe
ddMfe
ddfe
ddNfe
ddOfe
ddPfe
ddQfe
ddRfe
ddSfe
ddTfe
ddUfe
dd
fe
ddVfe
ddWfe
ddXfe
ddYfe
ddZfe
dd[fe
ddfe
dd\fe
dd]fe
dd^fe
dd_fe
dd`fe
ddafe
ddbfe
ddcfe
dddfe
ddfe
ddefe
ddfe
ddffe
ddgfe
ddfe
ddhfe
ddfe
ddife
ddjfe
ddkfe
ddlfe
ddffN�Zee
ddmfe
ddfe
ddfe
ddff�Zee
ddfe
ddfe
ddfe
ddfe
ddff�Ziddne
dfdo6ddpe
dfdq6ddre
dfds6ddte
dfdu6ddve
dfdw6dde
dfdx6ddye
dfdz6dd-e
dfd{6dd|e
dfd}6dd~e
dfd6dd
e
d
fd
6d
de
d
fd�6Zed�d��ej�D��Zed��Zed��Zeej�Zeej�Zeej�Zeej�Zeej�Zed�d��ejD��Z d�Z!ed��Z"ed��Z#ed��Z$ied��d�6ed��dd6ed��dP6ed��d�6ed��d�6ed��da6ed��d96ed��d�6ed��d76ed��dM6ed��dV6ed��d?6ed��d�6ed��d�6ed��d36ed��dQ6ed��dc6ed��d�6Z%d�Z&ed��Z'i�d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d6dd6dd6dd6dd6d�d	6d
d6dd
6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6d d!6d"d#6d$d%6d&d'6dd(6d)d*6d+d,6d-d.6d/d06d1d26d3d46d5d66d7d86d9d:6d;d<6d=d>6d?d@6dAdB6dCdD6dEdF6dGdH6dIdJ6dKdL6dMdN6dOdP6ddQ6dRdS6dTdU6dVdW6dXdY6dZd[6d\d]6d^d_6d`da6dbdc6ddde6dfdg6dhdi6djdk6dldm6dndo6dpdq6drds6dtdu6dvdw6dxdy6dzd{6d|d}6d~d6d?d�6dzd�6d�d�6d�d�6d�d�6d^d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6dd6dd6dd6dd6dd6d	d
6dd6d
d6dd6dd6dd6dd6dd6dd6dd6dd6dd 6d!d"6d#d$6d%d&6d'd(6d)d*6d+d,6d-d.6d/d06d1d26d3d46d5d66d7d86d3d96d:d;6d
d<6d=d>6d?d@6dAdB6dCdD6dEdF6dEdG6dHdI6dHdJ6dKdL6dMdN6dOdP6dQdR6dQdS6dOdT6dUdV6dWdX6d�dY6dZd[6d\d]6d^d_6d`da6dbdc6ddde6dfdg6dhdi6djdk6dldm6dndo6dpdq6dpdr6dsdt6dudv6dwdx6dydz6d{d|6d}d~6dd�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6dd6dd6dd6dd6dd	6d
d6dd
6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd 6dd!6d'd"6dd#6d�d$6d%d&6d'd(6d)d*6d+d,6d-d.6d/d06d1d26d3d46d5d66d7d86d9d:6d;d<6d=d>6d?d@6dAdB6dCdD6dEdF6dGdH6dIdJ6dKdL6dMdN6dOdP6dQdR6dSdT6dUdV6dWdX6dYdZ6d[d\6d]d^6d_d`6dadb6dcdd6dedf6dgdh6didj6dkdl6dmdn6dodp6dqdr6dsdt6dudv6dwdx6dydz6d{d|6d}d~6dd�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d1d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d9d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d6d�d6dd6dd6dd6dd	6d
d6dd
6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd 6d!d"6d#d$6d%d&6d'd(6d)d*6d+d,6d-d.6d/d06d1d26d3d46d5d66d7d86d9d:6d;d<6d=d>6d?d@6dAdB6dCdD6dEdF6d�dG6dHdI6dJdK6dLdM6dNdO6dPdQ6dRdS6dTdU6dVdW6dXdY6dZd[6d\d]6d^d_6d`da6dbdc6ddde6dfdg6d�dh6d�di6ddj6dkdl6dmdn6dodp6dqdr6dsdt6dudv6dwdx6dydz6d{d|6d}d~6dd�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6dd�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6dkd�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d6d�d6dd6dd6dd6dd	6d
d6dd
6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd 6dd!6d"d#6d$d%6d&d'6d(d)6d*d+6d,d-6d.d/6d0d16d2d36d4d56d6d76d8d96d:d;6d<d=6d>d?6d@dA6dBdC6dDdE6dFdG6dHdI6dJdK6dLdM6dLdN6dOdP6dQdR6dSdT6dUdV6dWdX6dYdZ6d[d\6d]d^6d_d`6dadb6dcdd6dde6dfdg6dhdi6djdk6dldm6dndo6dndp6dqdr6dsdt6dudv6dwdx6dydz6dyd{6djd|6djd}6d~d6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6dOd�6d�d�6d�d�6d�d�6d�d�6dGd�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6dd6dd6dd6dd6d^d6d	d
6d�d6dd
6dd6dd6dd6dd6dd6dd6dd6dd6d6d6dd6d d!6d�d"6d#d$6d%d&6d'd(6d)d*6d+d,6d-d.6d/d06d1d26d3d46d5d66d7d86d9d:6d;d<6d�d=6d�d>6d?d@6dAdB6dCdD6dEdF6dGdH6dIdJ6dKdL6dMdN6dOdP6dQdR6dSdT6dUdV6dWdX6dYdZ6d[d\6d]d^6d_d`6dadb6dcdd6dedf6dgdh6didj6dkdl6dmdn6dodp6dqdr6d7ds6dtdu6dvdw6dxdy6dzd{6d|d}6d~d6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6dd�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d
d�6d�d�6d=d�6d=d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d+d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d$d�6d$d�6d�d�6d�d�6d�d�6d&d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6dd6dd6dd6d�d6d�d6dd6d	d
6dd6dod
6dd6dCd6d�d6dd6dAd6dd6dEd6dd6dd6dd6dd6dd6dd 6d!d"6d#d$6d%d&6d'd(6d)d*6d+d,6d-d.6d/d06d1d26d3d46d5d66d7d86d9d:6d;d<6d=d>6d?d@6dAdB6dCdD6dEdF6dGdH6d/dI6d1dJ6dKdL6dMdN6dOdP6dOdQ6d3dR6dEdS6dKdT6dMdU6d3dV6dWdX6dYdZ6d�d[6d\d]6d^d_6d`da6d�db6dcdd6d�de6dfdg6dndh6didj6dkdl6dvdm6dZdn6dodp6dqdr6dsdt6dsdu6dvdw6dxdy6dzd{6d|d}6d�d~6d)d6dtd�6dtd�6d�d�6d�d�6dzd�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6dld�6d~d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6dod�6d�d�6d)d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d%d�6d�d�6dd�6d�d�6d�d�6d�d�6dqd�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d	d	6d	d	6d	d	6d	d	6d	d		6d
	d	6d
	d	6d
	d	6d�d	6d�d	6d�d	6d�d	6d�d	6d	d	6d	d	6d=d	6d	d	6d	d	6d	d	6d	d 	6d!	d"	6d~d#	6d�d$	6d%	d&	6d'	d(	6d'	d)	6d*	d+	6d*	d,	6d-	d.	6d/	d0	6d�d1	6d�d2	6d�d3	6d�d4	6d5	d6	6d7	d8	6d9	d:	6d;	d<	6d=	d>	6d?	d@	6dA	dB	6dC	dD	6dE	dF	6dG	dH	6dI	dJ	6dK	dL	6dM	dN	6d�dO	6dP	dQ	6dR	dS	6dT	dU	6dV	dW	6dV	dX	6dY	dZ	6d[	d\	6d[	d]	6d^	d_	6d`	da	6db	dc	6dd	de	6df	dg	6dh	di	6dh	dj	6dk	dl	6dm	dn	6do	dp	6dq	dr	6ds	dt	6du	dv	6dw	dx	6dy	dz	6d{	d|	6dd}	6d~	d	6d�	d�	6d�	d�	6d�d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6dd�	6dd�	6dd�	6dd�	6d!d�	6d!d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d'd�	6dd�	6d�	d�	6d�	d�	6dd�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6dpd�	6d�	d�	6d#d�	6d�	d�	6d�	d�	6dd�	6dd�6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6dd�	6d~	d�	6dd�	6d#d�	6d�	d�	6d�	d�	6d�d�	6d*d�	6dV	d�	6d3d�	6d�	d�	6d�d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d�	6d�	d
6d
d
6d
d
6d�	d
6d
d
6d
d	
6dcd

6d
d
6d
d
6d`d
6d
d
6d
d
6d
d
6d
d
6d
d
6d
d
6d�d
6d
d
6d
d
6d
d
6dWd
6d 
d!
6d"
d#
6d$
d%
6d&
d'
6d(
d)
6d*
d+
6dOd,
6djd-
6dOd.
6d/
d0
6d1
d2
6d3
d4
6d�d5
6d6
d7
6d8
d9
6d:
d;
6d/
d<
6d\d=
6d>
d?
6djd@
6d>
dA
6dB
dC
6dD
dE
6dF
dG
6dH
dI
6dJ
dK
6dL
dM
6dD
dN
6dO
dP
6dO
dQ
6dR
dS
6d�dT
6dU
dV
6dW
dX
6dY
dZ
6d[
d\
6d�d]
6dbd^
6d_
d`
6da
db
6dc
dd
6dc
de
6df
dg
6dh
di
6dj
dk
6dl
dm
6dn
do
6dp
dq
6dr
ds
6dt
du
6dv
dw
6dx
dy
6dz
d{
6d|
d}
6d~
d
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�d�
6d�d�
6d�
d�
6d�
d�
6d�d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�d�
6d�
d�
6d�d�
6d�
d�
6d�d�
6d�
d�
6d�
d�
6d�
d�
6d�d�
6d�d�
6d�
d�
6d�
d�
6d�	d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�d�
6d�
d�
6d�
d�
6d�
d�
6d�d�
6d�d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�d�
6d�
d�
6d�d�
6d�d�
6d�
d�
6d�d�
6d�d�
6dd�
6d�	d�
6d�
d�
6d�d�
6d�
d�
6d�d�
6d�d�
6d�d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�d�
6d�
d�
6d�d6d�d6dd6d�d6dd6d�d6dd	6d�d
6d�d6dd
6dd6dd6dd6d�
d6d�d6dd6dd6dd6dd6dd6dd6d d!6d d"6d#d$6d#d%6dd&6d'd(6d)d*6d+d,6d�d-6d�d.6d�d/6d0d16d�d26d�
d36d4d56d6d76d8d96d:d;6d<d=6d>d?6d�d@6dAdB6dAdC6d dD6dEdF6dGdH6d�dI6d�dJ6ddK6dLdM6dNdO6dPdQ6dRdS6dTdU6d�dV6d�dW6dXdY6dZd[6d�
d\6d�d]6d^d_6d`da6d�db6d�d�6dcdd6dedf6d�
dg6d�
dh6didj6dkdl6dmdn6dodp6dqdr6d�ds6d'dt6dudv6dwdx6dydz6dyd{6d|d}6d~d6d~d�6d�d�6d�d�6d�d�6d1d�6d1d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d"d�6d�d�6d�d�6d&d�6d&d�6d�d�6d|d�6d�d�6d�d�6d�d�6d�	d�6dd�6d�d�6d�d�6dd�6d�d�6dsd�6d�d�6d�d�6d�d�6d�d�6d�d�6dCd�6d�d�6d�d�6d�d�6d�d�6d[d�6d�d�6d�d�6d�d�6ddd�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d+d�6d)d�6d)d�6dKd�6dMd�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d7d�6d�d�6d�d�6dd�6dd�6d�d�6d/d�6d�d�6d9d�6d;d�6d;d�6d�d6dAd6d?d6d?d6dAd6dGd6dGd6dId6d=d6d=d	6d�d
6dd6d
d6dd6dd6dd6dd6dd6d�d6dd6dd6dd6dWd6dd6dd 6dWd!6dd"6d]d#6d]d$6dUd%6d_d&6dUd'6dOd(6dSd)6d�d*6d+d,6d-d.6d-d/6d5d06d1d26d3d46d5d56d6d76d8d96dkd:6dkd;6d<d=6d>d?6d3d@6d3dA6dBdC6dDdE6dFdG6dedH6didI6dgdJ6dedK6dgdL6d�dM6dNdO6dPdQ6dRdS6dNdT6dmdU6dqdV6ddW6d�dX6d�dY6dZd[6d�d\6d3d]6d�d^6d�d_6d�d`6d�da6d3db6dudc6dydd6dedf6dgdh6d}di6d{dj6d}dk6dgdl6ddm6d�dn6dodp6dqdr6d�ds6d�dt6d�du6dqdv6dEdw6dxdy6dxdz6dYd{6dOd|6dSd}6dmd~6dqd6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6dd�6dd�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d+d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6dAd�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d-d�6d�d�6d�d�6d�d�6d/d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d
6d�d
6d
d
6d
d
6d
d
6d1d
6d
d	
6d

d
6d

d
6d

d
6d�d
6d
d
6d
d
6d�d
6d
d
6d
d
6d�d
6d
d
6d
d
6d
d
6d
d 
6d�d!
6d"
d#
6d$
d%
6d&
d'
6d(
d)
6dd*
6d+
d,
6d-
d.
6dP	d/
6d0
d1
6d�	d2
6d3
d4
6d�	d5
6d6
d7
6d8
d9
6d~d:
6d;
d<
6d�d=
6d>
d?
6d@
dA
6d�dB
6d�dC
6dD
dE
6dF
dG
6d�dH
6dI
dJ
6dK
dL
6dM
dN
6dM
dO
6d�dP
6dQ
dR
6dS
dT
6d�dU
6d�dV
6d�dW
6dS
dX
6d�dY
6d�dZ
6d[
d\
6d]
d^
6d_
d`
6d�da
6db
dc
6d�dd
6d]
de
6d[
df
6d_
dg
6d�dh
6di
dj
6dk
dl
6dm
dn
6d�do
6d�dp
6d�dq
6dr
ds
6dt
du
6dv
dw
6dx
dy
6dz
d{
6d 
d|
6d}
d~
6d
d�
6d�
d�
6d5d�
6d�
d�
6d�
d�
6d	d�
6d�d�
6d�d�6dLd�
6d�d�
6d�
d�
6dfd�
6d�
d�
6d�
d�
6d�
d�
6dsd�
6d�
d�
6dd�
6d�
d�
6d�
d�
6dd�
6d�
d�
6d�
d�
6dd�
6d�
d�
6dd�
6d�
d�
6d�
d�
6d�
d�
6d�	d�
6d4d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�d�
6dd�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d#d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d5d�
6d5d�
6d�
d�
6dd�
6dNd�
6dd�
6dHd�
6d�
d�
6d�d�
6d�d�
6d�
d�
6d-d�
6d�
d�
6d�d�
6dCd�
6d�
d�
6d�
d�
6d�
d�
6dd�
6d�
d�
6d�d�
6dCd�
6d!d�
6d�d�
6d�
d�
6d�
d�
6d�
d�
6d�
d�
6d	d�
6d!d�
6d�d�
6d�
d�
6d�
d�
6d�
d6dd6dd6dd6d%d6dd	6d
d6dd
6dd6dd6dd6dd6d�
d6dd6dd6dPd6d�
d6d7d6d7d6d�
d6d d!6d"d#6d9d$6d)d%6d&d'6d(d)6d*d+6d,d-6d^d.6d�d/6d0d16d2d36d4d56d�d66d�d76d8d96d:d;6d<d=6d>d?6d@dA6dBdC6d�dD6dEdF6dGdH6d�dI6dJdK6dLdM6d�	dN6d�dO6d�dP6dQdR6dQdS6dTdU6dVdW6d�dX6d�dY6dZd[6d\d]6dy	d^6d_d`6dadb6dcdd6d"de6d�df6dgdh6dgdi6djdk6dldm6dldn6d�do6dpdq6d�dr6d�ds6dtdu6dvdw6dxdy6dzd{6d|d}6d~d6d�d�6d�d�6d�d�6d�d�6d�d�6d"d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6dwd�6d�d�6d�d�6d�d�6dyd�6d{d�6dyd�6d{d�6d}d�6dd�6d}d�6dd�6dud�6dud�6d�d�6d�d�6dd�6d�d�6d�d�6d�d�6d�d�6d�d�6dd�6d
	d�6d(
d�6d~d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d2d�6d�d�6d�d�6d>d�6d<d�6d@d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d6dd6dd6dd6d�d6d�d6d�d	6dd
6dd6dd
6dd6dd6dd6d�	d6d�d6d�d6dd6dd6dd6dd6dd6d�d 6d!d"6d#d$6d%d&6d�d'6d(d)6d*d+6d�d,6d�d-6d.d/6d0d16d0d26d�d36d�d46d�d56d�d66d�d76d8d96d8d:6drd;6d<d=6d<d>6d�d?6d@dA6dBdC6d"
dD6d�dE6d�dF6dGdH6dIdJ6dKdL6dMdN6dVdO6dPdQ6d�dR6dSdT6d�dU6dqdV6d�dW6dXdY6d"dZ6d9d[6d\d]6dXd^6d_d`6dadb6dcdd6dedf6dgdh6didj6dkdl6dmdn6dodp6ddq6d�dr6dds6d�dt6dudv6dwdx6dwdy6dkdz6d{d|6d}d~6dd�6dd�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d?d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6dzd�6dzd�6d�d�6d�d�6dkd�6d�d�6d�d�6d?d�6d�d�6d�d�6dd�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6dSd�6d#d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d
	d�6dx
d�6d�d�6d(
d�6d0
d�6d�d�6d�d�6d�
d�6dld�6d�d�6d�d�6d�d�6d�d�6d0d�6d�d�6d5d�6d�d�6d/d�6d�d�6d�d�6d�d�6d�d�6d$d�6d$d�6d�d�6d�d�6d{d�6d�d�6d�d�6d�d�6d5d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d6d�d6dd6dd6dd6dd	6dd
6d(d6d(d6d
d6d^d6d	d6d�d6dd6dd6d�d6d�d6dd6d�d6d�d6d0d6dd6dd6dd 6dd!6dd"6d�d#6d�d$6d%d&6dd'6dd(6dd)6dd*6d6d+6d,d-6d,d.6d/d06d1d26d3d46d5d66d5d76d8d96d:d;6d<d=6d>d?6d@dA6dBdC6dBdD6dEdF6dGdH6dIdJ6dKdL6dhdM6dNdO6dPdQ6dRdS6dTdU6dVdW6dXdY6dZd[6d\d]6Z(i#d^d6d�d_6d-	d`6dadb6dadb6d^dc6dK	dd6d�de6d�	df6d^dg6dZdh6d�di6d
dj6d^dk6dRdl6d�dm6dndo6d_dp6dqdr6dsdt6d�du6d7dv6d�dw6d5dx6d�dy6d�dz6d�d{6drd|6d�d}6d4d~6dd6d�d�6d�d�6dGd�6dYd�6Z)i�d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6dd6d�d6d�d6d�d�6d�d6d�d6d�d6d�d6dd6d�d	6d�d
6d�d6d�d6d�d
6d�d6d�d6d�d6d�d6d�d6d�d6d�d6d�d6d�d6d�d6d�d6d�d6d�d6d�d6d�d6d�d6d�d6d�d6d�d 6d�d!6d�d"6d�d#6d�d$6d�d%6d&d'6d(d)6d(d*6d+d,6d-d.6d-d/6d�d06d�d16d�d26d�d36d�d46d�d56d�d66d�d76d�d86d�d96d�d:6d�d;6d�d<6d�d=6d�d>6d�d?6d(d@6d�dA6d�dB6d�dC6d�dD6d�dE6d�dF6d�dG6d�dH6d�dI6d�dJ6d�dK6d(dL6d-dM6d�dN6d�dO6d�dP6dQdR6d�dS6d�dT6d�dU6d�dV6d�dW6d-dX6d�dY6d�dZ6d�d[6d�d\6d�d]6d(d^6d�d_6d-d`6d�da6d�db6d�dc6d�dd6d�de6d(df6d+dg6d�dh6d�di6d�dj6d�d�6d�dk6d�dl6d�dm6dndo6d�dp6d�dq6d�dr6dsdt6dudv6dwdx6dydz6d{d|6d}d~6dd�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6Z*idd�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6Z+ee+d�e+d�e+d�f�Z,ed�d��e
j�D��Z-d�e-d<Gd�d��d�e.�Z/Gd�d��d�e0�Z1dS(�i(uabsolute_importudivisionuunicode_literalsNu5Null character in input stream, replaced with U+FFFD.unull-characteruInvalid codepoint in stream.uinvalid-codepointu&Solidus (/) incorrectly placed in tag.uincorrectly-placed-solidusu.Incorrect CR newline entity, replaced with LF.uincorrect-cr-newline-entityu9Entity used with illegal number (windows-1252 reference).uillegal-windows-1252-entityuPNumeric entity couldn't be converted to character (codepoint U+%(charAsInt)08x).ucant-convert-numeric-entityuBNumeric entity represents an illegal codepoint: U+%(charAsInt)08x.u$illegal-codepoint-for-numeric-entityu#Numeric entity didn't end with ';'.u numeric-entity-without-semicolonu1Numeric entity expected. Got end of file instead.u#expected-numeric-entity-but-got-eofu'Numeric entity expected but none found.uexpected-numeric-entityu!Named entity didn't end with ';'.unamed-entity-without-semicolonu Named entity expected. Got none.uexpected-named-entityu'End tag contains unexpected attributes.uattributes-in-end-tagu.End tag contains unexpected self-closing flag.uself-closing-flag-on-end-tagu#Expected tag name. Got '>' instead.u'expected-tag-name-but-got-right-bracketuSExpected tag name. Got '?' instead. (HTML doesn't support processing instructions.)u'expected-tag-name-but-got-question-marku-Expected tag name. Got something else insteaduexpected-tag-nameu6Expected closing tag. Got '>' instead. Ignoring '</>'.u*expected-closing-tag-but-got-right-bracketu-Expected closing tag. Unexpected end of file.u expected-closing-tag-but-got-eofu<Expected closing tag. Unexpected character '%(data)s' found.u!expected-closing-tag-but-got-charu'Unexpected end of file in the tag name.ueof-in-tag-nameu8Unexpected end of file. Expected attribute name instead.u#expected-attribute-name-but-got-eofu)Unexpected end of file in attribute name.ueof-in-attribute-nameu#Invalid character in attribute nameu#invalid-character-in-attribute-nameu#Dropped duplicate attribute on tag.uduplicate-attributeu1Unexpected end of file. Expected = or end of tag.u$expected-end-of-tag-name-but-got-eofu1Unexpected end of file. Expected attribute value.u$expected-attribute-value-but-got-eofu*Expected attribute value. Got '>' instead.u.expected-attribute-value-but-got-right-bracketu"Unexpected = in unquoted attributeu"equals-in-unquoted-attribute-valueu*Unexpected character in unquoted attributeu0unexpected-character-in-unquoted-attribute-valueu*Unexpected character after attribute name.u&invalid-character-after-attribute-nameu+Unexpected character after attribute value.u*unexpected-character-after-attribute-valueu.Unexpected end of file in attribute value (").u#eof-in-attribute-value-double-quoteu.Unexpected end of file in attribute value (').u#eof-in-attribute-value-single-quoteu*Unexpected end of file in attribute value.u eof-in-attribute-value-no-quotesu)Unexpected end of file in tag. Expected >u#unexpected-EOF-after-solidus-in-tagu/Unexpected character after / in tag. Expected >u)unexpected-character-after-solidus-in-tagu&Expected '--' or 'DOCTYPE'. Not found.uexpected-dashes-or-doctypeu Unexpected ! after -- in commentu,unexpected-bang-after-double-dash-in-commentu$Unexpected space after -- in commentu-unexpected-space-after-double-dash-in-commentuIncorrect comment.uincorrect-commentu"Unexpected end of file in comment.ueof-in-commentu%Unexpected end of file in comment (-)ueof-in-comment-end-dashu+Unexpected '-' after '--' found in comment.u,unexpected-dash-after-double-dash-in-commentu'Unexpected end of file in comment (--).ueof-in-comment-double-dashueof-in-comment-end-space-stateueof-in-comment-end-bang-stateu&Unexpected character in comment found.uunexpected-char-in-commentu(No space after literal string 'DOCTYPE'.uneed-space-after-doctypeu.Unexpected > character. Expected DOCTYPE name.u+expected-doctype-name-but-got-right-bracketu.Unexpected end of file. Expected DOCTYPE name.u!expected-doctype-name-but-got-eofu'Unexpected end of file in DOCTYPE name.ueof-in-doctype-nameu"Unexpected end of file in DOCTYPE.ueof-in-doctypeu%Expected space or '>'. Got '%(data)s'u*expected-space-or-right-bracket-in-doctypeuUnexpected end of DOCTYPE.uunexpected-end-of-doctypeu Unexpected character in DOCTYPE.uunexpected-char-in-doctypeuXXX innerHTML EOFueof-in-innerhtmluUnexpected DOCTYPE. Ignored.uunexpected-doctypeu%html needs to be the first start tag.u
non-html-rootu)Unexpected End of file. Expected DOCTYPE.uexpected-doctype-but-got-eofuErroneous DOCTYPE.uunknown-doctypeu2Unexpected non-space characters. Expected DOCTYPE.uexpected-doctype-but-got-charsu2Unexpected start tag (%(name)s). Expected DOCTYPE.u"expected-doctype-but-got-start-tagu0Unexpected end tag (%(name)s). Expected DOCTYPE.u expected-doctype-but-got-end-tagu?Unexpected end tag (%(name)s) after the (implied) root element.uend-tag-after-implied-rootu4Unexpected end of file. Expected end tag (%(name)s).u&expected-named-closing-tag-but-got-eofu4Unexpected start tag head in existing head. Ignored.u!two-heads-are-not-better-than-oneu'Unexpected end tag (%(name)s). Ignored.uunexpected-end-tagu;Unexpected start tag (%(name)s) that can be in head. Moved.u#unexpected-start-tag-out-of-my-headu Unexpected start tag (%(name)s).uunexpected-start-taguMissing end tag (%(name)s).umissing-end-taguMissing end tags (%(name)s).umissing-end-tagsuCUnexpected start tag (%(startName)s) implies end tag (%(endName)s).u$unexpected-start-tag-implies-end-tagu@Unexpected start tag (%(originalName)s). Treated as %(newName)s.uunexpected-start-tag-treated-asu,Unexpected start tag %(name)s. Don't use it!udeprecated-tagu'Unexpected start tag %(name)s. Ignored.uunexpected-start-tag-ignoreduEUnexpected end tag (%(gotName)s). Missing end tag (%(expectedName)s).u$expected-one-end-tag-but-got-anotheru:End tag (%(name)s) seen too early. Expected other end tag.uend-tag-too-earlyuFUnexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s).uend-tag-too-early-namedu+End tag (%(name)s) seen too early. Ignored.uend-tag-too-early-ignoreduQEnd tag (%(name)s) violates step 1, paragraph 1 of the adoption agency algorithm.uadoption-agency-1.1uQEnd tag (%(name)s) violates step 1, paragraph 2 of the adoption agency algorithm.uadoption-agency-1.2uQEnd tag (%(name)s) violates step 1, paragraph 3 of the adoption agency algorithm.uadoption-agency-1.3uQEnd tag (%(name)s) violates step 4, paragraph 4 of the adoption agency algorithm.uadoption-agency-4.4u>Unexpected end tag (%(originalName)s). Treated as %(newName)s.uunexpected-end-tag-treated-asu'This element (%(name)s) has no end tag.u
no-end-tagu9Unexpected implied end tag (%(name)s) in the table phase.u#unexpected-implied-end-tag-in-tableu>Unexpected implied end tag (%(name)s) in the table body phase.u(unexpected-implied-end-tag-in-table-bodyuDUnexpected non-space characters in table context caused voodoo mode.u$unexpected-char-implies-table-voodoou3Unexpected input with type hidden in table context.u unexpected-hidden-input-in-tableu!Unexpected form in table context.uunexpected-form-in-tableuDUnexpected start tag (%(name)s) in table context caused voodoo mode.u)unexpected-start-tag-implies-table-voodoouBUnexpected end tag (%(name)s) in table context caused voodoo mode.u'unexpected-end-tag-implies-table-voodoouCUnexpected table cell start tag (%(name)s) in the table body phase.uunexpected-cell-in-table-bodyuFGot table cell end tag (%(name)s) while required end tags are missing.uunexpected-cell-end-tagu?Unexpected end tag (%(name)s) in the table body phase. Ignored.u unexpected-end-tag-in-table-bodyu=Unexpected implied end tag (%(name)s) in the table row phase.u'unexpected-implied-end-tag-in-table-rowu>Unexpected end tag (%(name)s) in the table row phase. Ignored.uunexpected-end-tag-in-table-rowuJUnexpected select start tag in the select phase treated as select end tag.uunexpected-select-in-selectu/Unexpected input start tag in the select phase.uunexpected-input-in-selectuBUnexpected start tag token (%(name)s in the select phase. Ignored.uunexpected-start-tag-in-selectu;Unexpected end tag (%(name)s) in the select phase. Ignored.uunexpected-end-tag-in-selectuKUnexpected table element start tag (%(name)s) in the select in table phase.u5unexpected-table-element-start-tag-in-select-in-tableuIUnexpected table element end tag (%(name)s) in the select in table phase.u3unexpected-table-element-end-tag-in-select-in-tableu8Unexpected non-space characters in the after body phase.uunexpected-char-after-bodyu>Unexpected start tag token (%(name)s) in the after body phase.uunexpected-start-tag-after-bodyu<Unexpected end tag token (%(name)s) in the after body phase.uunexpected-end-tag-after-bodyu@Unexpected characters in the frameset phase. Characters ignored.uunexpected-char-in-framesetuEUnexpected start tag token (%(name)s) in the frameset phase. Ignored.u unexpected-start-tag-in-framesetuFUnexpected end tag token (frameset) in the frameset phase (innerHTML).u)unexpected-frameset-in-frameset-innerhtmluCUnexpected end tag token (%(name)s) in the frameset phase. Ignored.uunexpected-end-tag-in-framesetuEUnexpected non-space characters in the after frameset phase. Ignored.uunexpected-char-after-framesetuEUnexpected start tag (%(name)s) in the after frameset phase. Ignored.u#unexpected-start-tag-after-framesetuCUnexpected end tag (%(name)s) in the after frameset phase. Ignored.u!unexpected-end-tag-after-framesetu(Unexpected end tag after body(innerHtml)u'unexpected-end-tag-after-body-innerhtmlu6Unexpected non-space characters. Expected end of file.uexpected-eof-but-got-charu6Unexpected start tag (%(name)s). Expected end of file.uexpected-eof-but-got-start-tagu4Unexpected end tag (%(name)s). Expected end of file.uexpected-eof-but-got-end-tagu/Unexpected end of file. Expected table content.ueof-in-tableu0Unexpected end of file. Expected select content.u
eof-in-selectu2Unexpected end of file. Expected frameset content.ueof-in-framesetu0Unexpected end of file. Expected script content.ueof-in-script-in-scriptu0Unexpected end of file. Expected foreign contentueof-in-foreign-landsu0Trailing solidus not allowed on element %(name)su&non-void-element-with-trailing-solidusu2Element %(name)s not allowed in a non-html contextu*unexpected-html-element-in-foreign-contentu*Unexpected end tag (%(name)s) before html.uunexpected-end-tag-before-htmlu0Undefined error (this sucks and should be fixed)uXXX-undefined-erroruhttp://www.w3.org/1999/xhtmluhtmlu"http://www.w3.org/1998/Math/MathMLumathmluhttp://www.w3.org/2000/svgusvguhttp://www.w3.org/1999/xlinkuxlinku$http://www.w3.org/XML/1998/namespaceuxmluhttp://www.w3.org/2000/xmlns/uxmlnsuappletucaptionumarqueeuobjectutableutduthumiumoumnumsumtextuannotation-xmlu
foreignObjectudescutitleuaububigucodeuemufontuiunobrususmallustrikeustronguttuuuaddressuareauarticleuasideubaseubasefontubgsoundu
blockquoteubodyubrubuttonucenterucolucolgroupucommanduddudetailsudirudivudludtuembedufieldsetufigureufooteruformuframeuframesetuh1uh2uh3uh4uh5uh6uheaduheaderuhruiframeuimageuimguinputuisindexuliulinkulistingumenuumetaunavunoembedunoframesunoscriptuolupuparamu	plaintextupreuscriptusectionuselectustyleutbodyutextareautfootutheadutruuluwbruxmpu
annotaion-xmluactuateu
xlink:actuateuarcroleu
xlink:arcroleuhrefu
xlink:hrefuroleu
xlink:roleushowu
xlink:showuxlink:titleutypeu
xlink:typeuxml:baseulanguxml:languspaceu	xml:spaceuxmlns:xlinkcCs1g|]'\}\}}}||f|f�qS(((u.0uqnameuprefixulocaluns((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/constants.pyu
<listcomp>�s	u
<listcomp>u	u
uu u
cCs.g|]$}t|�t|j��f�qS((uordulower(u.0uc((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/constants.pyu
<listcomp>�s	uevent-sourceusourceutracku
irrelevantuuscopeduismapuautoplayucontrolsuaudiouvideoudeferuasyncuopenumultipleudisabledudatagriduhiddenucheckedudefaultunoshadeu
autosubmitureadonlyuselecteduoptionuoptgroupu	autofocusurequireduoutputi� i��i i�i i& i  i! i�i0 i`i9 iRi}i i i i i" i i i�i"!iai: iSi~ixult;ugt;uamp;uapos;uquot;uÆuAEliguAElig;u&uAMPuAMP;uÁuAacuteuAacute;uĂuAbreve;uÂuAcircuAcirc;uАuAcy;u𝔄uAfr;uÀuAgraveuAgrave;uΑuAlpha;uĀuAmacr;u⩓uAnd;uĄuAogon;u𝔸uAopf;u⁡uApplyFunction;uÅuAringuAring;u𝒜uAscr;u≔uAssign;uÃuAtildeuAtilde;uÄuAumluAuml;u∖u
Backslash;u⫧uBarv;u⌆uBarwed;uБuBcy;u∵uBecause;uℬuBernoullis;uΒuBeta;u𝔅uBfr;u𝔹uBopf;u˘uBreve;uBscr;u≎uBumpeq;uЧuCHcy;u©uCOPYuCOPY;uĆuCacute;u⋒uCap;uⅅuCapitalDifferentialD;uℭuCayleys;uČuCcaron;uÇuCcediluCcedil;uĈuCcirc;u∰uCconint;uĊuCdot;u¸uCedilla;u·u
CenterDot;uCfr;uΧuChi;u⊙u
CircleDot;u⊖uCircleMinus;u⊕uCirclePlus;u⊗uCircleTimes;u∲uClockwiseContourIntegral;u”uCloseCurlyDoubleQuote;u’uCloseCurlyQuote;u∷uColon;u⩴uColone;u≡u
Congruent;u∯uConint;u∮uContourIntegral;uℂuCopf;u∐u
Coproduct;u∳u CounterClockwiseContourIntegral;u⨯uCross;u𝒞uCscr;u⋓uCup;u≍uCupCap;uDD;u⤑u	DDotrahd;uЂuDJcy;uЅuDScy;uЏuDZcy;u‡uDagger;u↡uDarr;u⫤uDashv;uĎuDcaron;uДuDcy;u∇uDel;uΔuDelta;u𝔇uDfr;u´uDiacriticalAcute;u˙uDiacriticalDot;u˝uDiacriticalDoubleAcute;u`uDiacriticalGrave;u˜uDiacriticalTilde;u⋄uDiamond;uⅆuDifferentialD;u𝔻uDopf;u¨uDot;u⃜uDotDot;u≐u	DotEqual;uDoubleContourIntegral;u
DoubleDot;u⇓uDoubleDownArrow;u⇐uDoubleLeftArrow;u⇔uDoubleLeftRightArrow;uDoubleLeftTee;u⟸uDoubleLongLeftArrow;u⟺uDoubleLongLeftRightArrow;u⟹uDoubleLongRightArrow;u⇒uDoubleRightArrow;u⊨uDoubleRightTee;u⇑uDoubleUpArrow;u⇕uDoubleUpDownArrow;u∥uDoubleVerticalBar;u↓u
DownArrow;u⤓u
DownArrowBar;u⇵uDownArrowUpArrow;ȗu
DownBreve;u⥐uDownLeftRightVector;u⥞uDownLeftTeeVector;u↽uDownLeftVector;u⥖uDownLeftVectorBar;u⥟uDownRightTeeVector;u⇁uDownRightVector;u⥗uDownRightVectorBar;u⊤uDownTee;u↧u
DownTeeArrow;u
Downarrow;u𝒟uDscr;uĐuDstrok;uŊuENG;uÐuETHuETH;uÉuEacuteuEacute;uĚuEcaron;uÊuEcircuEcirc;uЭuEcy;uĖuEdot;u𝔈uEfr;uÈuEgraveuEgrave;u∈uElement;uĒuEmacr;u◻uEmptySmallSquare;u▫uEmptyVerySmallSquare;uĘuEogon;u𝔼uEopf;uΕuEpsilon;u⩵uEqual;u≂uEqualTilde;u⇌uEquilibrium;uℰuEscr;u⩳uEsim;uΗuEta;uËuEumluEuml;u∃uExists;uⅇu
ExponentialE;uФuFcy;u𝔉uFfr;u◼uFilledSmallSquare;u▪uFilledVerySmallSquare;u𝔽uFopf;u∀uForAll;uℱuFouriertrf;uFscr;uЃuGJcy;u>uGTuGT;uΓuGamma;uϜuGammad;uĞuGbreve;uĢuGcedil;uĜuGcirc;uГuGcy;uĠuGdot;u𝔊uGfr;u⋙uGg;u𝔾uGopf;u≥u
GreaterEqual;u⋛uGreaterEqualLess;u≧uGreaterFullEqual;u⪢uGreaterGreater;u≷uGreaterLess;u⩾uGreaterSlantEqual;u≳u
GreaterTilde;u𝒢uGscr;u≫uGt;uЪuHARDcy;uˇuHacek;u^uHat;uĤuHcirc;uℌuHfr;uℋu
HilbertSpace;uℍuHopf;u─uHorizontalLine;uHscr;uĦuHstrok;u
HumpDownHump;u≏u
HumpEqual;uЕuIEcy;uIJuIJlig;uЁuIOcy;uÍuIacuteuIacute;uÎuIcircuIcirc;uИuIcy;uİuIdot;uℑuIfr;uÌuIgraveuIgrave;uIm;uĪuImacr;uⅈuImaginaryI;uImplies;u∬uInt;u∫u	Integral;u⋂u
Intersection;u⁣uInvisibleComma;u⁢uInvisibleTimes;uĮuIogon;u𝕀uIopf;uΙuIota;uℐuIscr;uĨuItilde;uІuIukcy;uÏuIumluIuml;uĴuJcirc;uЙuJcy;u𝔍uJfr;u𝕁uJopf;u𝒥uJscr;uЈuJsercy;uЄuJukcy;uХuKHcy;uЌuKJcy;uΚuKappa;uĶuKcedil;uКuKcy;u𝔎uKfr;u𝕂uKopf;u𝒦uKscr;uЉuLJcy;u<uLTuLT;uĹuLacute;uΛuLambda;u⟪uLang;uℒuLaplacetrf;u↞uLarr;uĽuLcaron;uĻuLcedil;uЛuLcy;u⟨uLeftAngleBracket;u←u
LeftArrow;u⇤u
LeftArrowBar;u⇆uLeftArrowRightArrow;u⌈uLeftCeiling;u⟦uLeftDoubleBracket;u⥡uLeftDownTeeVector;u⇃uLeftDownVector;u⥙uLeftDownVectorBar;u⌊u
LeftFloor;u↔uLeftRightArrow;u⥎uLeftRightVector;u⊣uLeftTee;u↤u
LeftTeeArrow;u⥚uLeftTeeVector;u⊲u
LeftTriangle;u⧏uLeftTriangleBar;u⊴uLeftTriangleEqual;u⥑uLeftUpDownVector;u⥠uLeftUpTeeVector;u↿u
LeftUpVector;u⥘uLeftUpVectorBar;u↼uLeftVector;u⥒uLeftVectorBar;u
Leftarrow;uLeftrightarrow;u⋚uLessEqualGreater;u≦uLessFullEqual;u≶uLessGreater;u⪡u	LessLess;u⩽uLessSlantEqual;u≲u
LessTilde;u𝔏uLfr;u⋘uLl;u⇚uLleftarrow;uĿuLmidot;u⟵uLongLeftArrow;u⟷uLongLeftRightArrow;u⟶uLongRightArrow;uLongleftarrow;uLongleftrightarrow;uLongrightarrow;u𝕃uLopf;u↙uLowerLeftArrow;u↘uLowerRightArrow;uLscr;u↰uLsh;uŁuLstrok;u≪uLt;u⤅uMap;uМuMcy;u uMediumSpace;uℳu
Mellintrf;u𝔐uMfr;u∓u
MinusPlus;u𝕄uMopf;uMscr;uΜuMu;uЊuNJcy;uŃuNacute;uŇuNcaron;uŅuNcedil;uНuNcy;u​uNegativeMediumSpace;uNegativeThickSpace;uNegativeThinSpace;uNegativeVeryThinSpace;uNestedGreaterGreater;uNestedLessLess;uNewLine;u𝔑uNfr;u⁠uNoBreak;u uNonBreakingSpace;uℕuNopf;u⫬uNot;u≢u
NotCongruent;u≭u
NotCupCap;u∦uNotDoubleVerticalBar;u∉uNotElement;u≠u	NotEqual;u≂̸uNotEqualTilde;u∄u
NotExists;u≯uNotGreater;u≱uNotGreaterEqual;u≧̸uNotGreaterFullEqual;u≫̸uNotGreaterGreater;u≹uNotGreaterLess;u⩾̸uNotGreaterSlantEqual;u≵uNotGreaterTilde;u≎̸uNotHumpDownHump;u≏̸u
NotHumpEqual;u⋪uNotLeftTriangle;u⧏̸uNotLeftTriangleBar;u⋬uNotLeftTriangleEqual;u≮uNotLess;u≰u
NotLessEqual;u≸uNotLessGreater;u≪̸uNotLessLess;u⩽̸uNotLessSlantEqual;u≴u
NotLessTilde;u⪢̸uNotNestedGreaterGreater;u⪡̸uNotNestedLessLess;u⊀uNotPrecedes;u⪯̸uNotPrecedesEqual;u⋠uNotPrecedesSlantEqual;u∌uNotReverseElement;u⋫uNotRightTriangle;u⧐̸uNotRightTriangleBar;u⋭uNotRightTriangleEqual;u⊏̸uNotSquareSubset;u⋢uNotSquareSubsetEqual;u⊐̸uNotSquareSuperset;u⋣uNotSquareSupersetEqual;u⊂⃒u
NotSubset;u⊈uNotSubsetEqual;u⊁uNotSucceeds;u⪰̸uNotSucceedsEqual;u⋡uNotSucceedsSlantEqual;u≿̸uNotSucceedsTilde;u⊃⃒uNotSuperset;u⊉uNotSupersetEqual;u≁u	NotTilde;u≄uNotTildeEqual;u≇uNotTildeFullEqual;u≉uNotTildeTilde;u∤uNotVerticalBar;u𝒩uNscr;uÑuNtildeuNtilde;uΝuNu;uŒuOElig;uÓuOacuteuOacute;uÔuOcircuOcirc;uОuOcy;uŐuOdblac;u𝔒uOfr;uÒuOgraveuOgrave;uŌuOmacr;uΩuOmega;uΟuOmicron;u𝕆uOopf;u“uOpenCurlyDoubleQuote;u‘uOpenCurlyQuote;u⩔uOr;u𝒪uOscr;uØuOslashuOslash;uÕuOtildeuOtilde;u⨷uOtimes;uÖuOumluOuml;u‾uOverBar;u⏞u
OverBrace;u⎴uOverBracket;u⏜uOverParenthesis;u∂u	PartialD;uПuPcy;u𝔓uPfr;uΦuPhi;uΠuPi;u±u
PlusMinus;uPoincareplane;uℙuPopf;u⪻uPr;u≺u	Precedes;u⪯uPrecedesEqual;u≼uPrecedesSlantEqual;u≾uPrecedesTilde;u″uPrime;u∏uProduct;uProportion;u∝u
Proportional;u𝒫uPscr;uΨuPsi;u"uQUOTuQUOT;u𝔔uQfr;uℚuQopf;u𝒬uQscr;u⤐uRBarr;u®uREGuREG;uŔuRacute;u⟫uRang;u↠uRarr;u⤖uRarrtl;uŘuRcaron;uŖuRcedil;uРuRcy;uℜuRe;u∋uReverseElement;u⇋uReverseEquilibrium;u⥯uReverseUpEquilibrium;uRfr;uΡuRho;u⟩uRightAngleBracket;u→uRightArrow;u⇥uRightArrowBar;u⇄uRightArrowLeftArrow;u⌉u
RightCeiling;u⟧uRightDoubleBracket;u⥝uRightDownTeeVector;u⇂uRightDownVector;u⥕uRightDownVectorBar;u⌋uRightFloor;u⊢u	RightTee;u↦uRightTeeArrow;u⥛uRightTeeVector;u⊳uRightTriangle;u⧐uRightTriangleBar;u⊵uRightTriangleEqual;u⥏uRightUpDownVector;u⥜uRightUpTeeVector;u↾uRightUpVector;u⥔uRightUpVectorBar;u⇀uRightVector;u⥓uRightVectorBar;uRightarrow;uℝuRopf;u⥰u
RoundImplies;u⇛uRrightarrow;uℛuRscr;u↱uRsh;u⧴uRuleDelayed;uЩuSHCHcy;uШuSHcy;uЬuSOFTcy;uŚuSacute;u⪼uSc;uŠuScaron;uŞuScedil;uŜuScirc;uСuScy;u𝔖uSfr;uShortDownArrow;uShortLeftArrow;uShortRightArrow;u↑u
ShortUpArrow;uΣuSigma;u∘uSmallCircle;u𝕊uSopf;u√uSqrt;u□uSquare;u⊓uSquareIntersection;u⊏u
SquareSubset;u⊑uSquareSubsetEqual;u⊐uSquareSuperset;u⊒uSquareSupersetEqual;u⊔uSquareUnion;u𝒮uSscr;u⋆uStar;u⋐uSub;uSubset;u⊆uSubsetEqual;u≻u	Succeeds;u⪰uSucceedsEqual;u≽uSucceedsSlantEqual;u≿uSucceedsTilde;u	SuchThat;u∑uSum;u⋑uSup;u⊃u	Superset;u⊇uSupersetEqual;uSupset;uÞuTHORNuTHORN;u™uTRADE;uЋuTSHcy;uЦuTScy;uTab;uΤuTau;uŤuTcaron;uŢuTcedil;uТuTcy;u𝔗uTfr;u∴u
Therefore;uΘuTheta;u  uThickSpace;u u
ThinSpace;u∼uTilde;u≃uTildeEqual;u≅uTildeFullEqual;u≈uTildeTilde;u𝕋uTopf;u⃛u
TripleDot;u𝒯uTscr;uŦuTstrok;uÚuUacuteuUacute;u↟uUarr;u⥉u	Uarrocir;uЎuUbrcy;uŬuUbreve;uÛuUcircuUcirc;uУuUcy;uŰuUdblac;u𝔘uUfr;uÙuUgraveuUgrave;uŪuUmacr;u_u	UnderBar;u⏟uUnderBrace;u⎵u
UnderBracket;u⏝uUnderParenthesis;u⋃uUnion;u⊎u
UnionPlus;uŲuUogon;u𝕌uUopf;uUpArrow;u⤒uUpArrowBar;u⇅uUpArrowDownArrow;u↕uUpDownArrow;u⥮uUpEquilibrium;u⊥uUpTee;u↥uUpTeeArrow;uUparrow;uUpdownarrow;u↖uUpperLeftArrow;u↗uUpperRightArrow;uϒuUpsi;uΥuUpsilon;uŮuUring;u𝒰uUscr;uŨuUtilde;uÜuUumluUuml;u⊫uVDash;u⫫uVbar;uВuVcy;u⊩uVdash;u⫦uVdashl;u⋁uVee;u‖uVerbar;uVert;u∣uVerticalBar;u|u
VerticalLine;u❘uVerticalSeparator;u≀uVerticalTilde;u uVeryThinSpace;u𝔙uVfr;u𝕍uVopf;u𝒱uVscr;u⊪uVvdash;uŴuWcirc;u⋀uWedge;u𝔚uWfr;u𝕎uWopf;u𝒲uWscr;u𝔛uXfr;uΞuXi;u𝕏uXopf;u𝒳uXscr;uЯuYAcy;uЇuYIcy;uЮuYUcy;uÝuYacuteuYacute;uŶuYcirc;uЫuYcy;u𝔜uYfr;u𝕐uYopf;u𝒴uYscr;uŸuYuml;uЖuZHcy;uŹuZacute;uŽuZcaron;uЗuZcy;uŻuZdot;uZeroWidthSpace;uΖuZeta;uℨuZfr;uℤuZopf;u𝒵uZscr;uáuaacuteuaacute;uăuabreve;u∾uac;u∾̳uacE;u∿uacd;uâuacircuacirc;uacuteuacute;uаuacy;uæuaeliguaelig;uaf;u𝔞uafr;uàuagraveuagrave;uℵualefsym;ualeph;uαualpha;uāuamacr;u⨿uamalg;uampu∧uand;u⩕uandand;u⩜uandd;u⩘u	andslope;u⩚uandv;u∠uang;u⦤uange;uangle;u∡uangmsd;u⦨u	angmsdaa;u⦩u	angmsdab;u⦪u	angmsdac;u⦫u	angmsdad;u⦬u	angmsdae;u⦭u	angmsdaf;u⦮u	angmsdag;u⦯u	angmsdah;u∟uangrt;u⊾uangrtvb;u⦝u	angrtvbd;u∢uangsph;uangst;u⍼uangzarr;uąuaogon;u𝕒uaopf;uap;u⩰uapE;u⩯uapacir;u≊uape;u≋uapid;u'uapprox;u	approxeq;uåuaringuaring;u𝒶uascr;u*uast;uasymp;uasympeq;uãuatildeuatilde;uäuaumluauml;u	awconint;u⨑uawint;u⫭ubNot;u≌u	backcong;u϶ubackepsilon;u‵u
backprime;u∽ubacksim;u⋍u
backsimeq;u⊽ubarvee;u⌅ubarwed;u	barwedge;ubbrk;u⎶u	bbrktbrk;ubcong;uбubcy;u„ubdquo;ubecaus;ubecause;u⦰ubemptyv;ubepsi;ubernou;uβubeta;uℶubeth;u≬ubetween;u𝔟ubfr;ubigcap;u◯ubigcirc;ubigcup;u⨀ubigodot;u⨁u	bigoplus;u⨂u
bigotimes;u⨆u	bigsqcup;u★ubigstar;u▽ubigtriangledown;u△ubigtriangleup;u⨄u	biguplus;ubigvee;u	bigwedge;u⤍ubkarow;u⧫u
blacklozenge;ublacksquare;u▴ublacktriangle;u▾ublacktriangledown;u◂ublacktriangleleft;u▸ublacktriangleright;u␣ublank;u▒ublk12;u░ublk14;u▓ublk34;u█ublock;u=⃥ubne;u≡⃥ubnequiv;u⌐ubnot;u𝕓ubopf;ubot;ubottom;u⋈ubowtie;u╗uboxDL;u╔uboxDR;u╖uboxDl;u╓uboxDr;u═uboxH;u╦uboxHD;u╩uboxHU;u╤uboxHd;u╧uboxHu;u╝uboxUL;u╚uboxUR;u╜uboxUl;u╙uboxUr;u║uboxV;u╬uboxVH;u╣uboxVL;u╠uboxVR;u╫uboxVh;u╢uboxVl;u╟uboxVr;u⧉uboxbox;u╕uboxdL;u╒uboxdR;u┐uboxdl;u┌uboxdr;uboxh;u╥uboxhD;u╨uboxhU;u┬uboxhd;u┴uboxhu;u⊟u	boxminus;u⊞uboxplus;u⊠u	boxtimes;u╛uboxuL;u╘uboxuR;u┘uboxul;u└uboxur;u│uboxv;u╪uboxvH;u╡uboxvL;u╞uboxvR;u┼uboxvh;u┤uboxvl;u├uboxvr;ubprime;ubreve;u¦ubrvbarubrvbar;u𝒷ubscr;u⁏ubsemi;ubsim;ubsime;u\ubsol;u⧅ubsolb;u⟈u	bsolhsub;u•ubull;ubullet;ubump;u⪮ubumpE;ubumpe;ubumpeq;ućucacute;u∩ucap;u⩄ucapand;u⩉u	capbrcup;u⩋ucapcap;u⩇ucapcup;u⩀ucapdot;u∩︀ucaps;u⁁ucaret;ucaron;u⩍uccaps;učuccaron;uçuccediluccedil;uĉuccirc;u⩌uccups;u⩐uccupssm;uċucdot;ucedilucedil;u⦲ucemptyv;u¢ucentucent;u
centerdot;u𝔠ucfr;uчuchcy;u✓ucheck;u
checkmark;uχuchi;u○ucir;u⧃ucirE;uˆucirc;u≗ucirceq;u↺ucirclearrowleft;u↻ucirclearrowright;u	circledR;uⓈu	circledS;u⊛ucircledast;u⊚ucircledcirc;u⊝ucircleddash;ucire;u⨐u	cirfnint;u⫯ucirmid;u⧂ucirscir;u♣uclubs;u	clubsuit;u:ucolon;ucolone;ucoloneq;u,ucomma;u@ucommat;u∁ucomp;ucompfn;ucomplement;u
complexes;ucong;u⩭ucongdot;uconint;u𝕔ucopf;ucoprod;ucopyucopy;u℗ucopysr;u↵ucrarr;u✗ucross;u𝒸ucscr;u⫏ucsub;u⫑ucsube;u⫐ucsup;u⫒ucsupe;u⋯uctdot;u⤸ucudarrl;u⤵ucudarrr;u⋞ucuepr;u⋟ucuesc;u↶ucularr;u⤽ucularrp;u∪ucup;u⩈u	cupbrcap;u⩆ucupcap;u⩊ucupcup;u⊍ucupdot;u⩅ucupor;u∪︀ucups;u↷ucurarr;u⤼ucurarrm;ucurlyeqprec;ucurlyeqsucc;u⋎u	curlyvee;u⋏ucurlywedge;u¤ucurrenucurren;ucurvearrowleft;ucurvearrowright;ucuvee;ucuwed;u	cwconint;u∱ucwint;u⌭ucylcty;udArr;u⥥udHar;u†udagger;uℸudaleth;udarr;u‐udash;udashv;u⤏udbkarow;udblac;uďudcaron;uдudcy;udd;uddagger;u⇊uddarr;u⩷uddotseq;u°udegudeg;uδudelta;u⦱udemptyv;u⥿udfisht;u𝔡udfr;udharl;udharr;udiam;udiamond;u♦udiamondsuit;udiams;udie;uϝudigamma;u⋲udisin;u÷udiv;udivideudivide;u⋇udivideontimes;udivonx;uђudjcy;u⌞udlcorn;u⌍udlcrop;u$udollar;u𝕕udopf;udot;udoteq;u≑u	doteqdot;u∸u	dotminus;u∔udotplus;u⊡u
dotsquare;udoublebarwedge;u
downarrow;udowndownarrows;udownharpoonleft;udownharpoonright;u	drbkarow;u⌟udrcorn;u⌌udrcrop;u𝒹udscr;uѕudscy;u⧶udsol;uđudstrok;u⋱udtdot;u▿udtri;udtrif;uduarr;uduhar;u⦦udwangle;uџudzcy;u⟿u	dzigrarr;ueDDot;ueDot;uéueacuteueacute;u⩮ueaster;uěuecaron;u≖uecir;uêuecircuecirc;u≕uecolon;uэuecy;uėuedot;uee;u≒uefDot;u𝔢uefr;u⪚ueg;uèuegraveuegrave;u⪖uegs;u⪘uegsdot;u⪙uel;u⏧u	elinters;uℓuell;u⪕uels;u⪗uelsdot;uēuemacr;u∅uempty;u	emptyset;uemptyv;u uemsp13;u uemsp14;u uemsp;uŋueng;u uensp;uęueogon;u𝕖ueopf;u⋕uepar;u⧣ueparsl;u⩱ueplus;uεuepsi;uepsilon;uϵuepsiv;ueqcirc;ueqcolon;ueqsim;ueqslantgtr;ueqslantless;u=uequals;u≟uequest;uequiv;u⩸uequivDD;u⧥u	eqvparsl;u≓uerDot;u⥱uerarr;uℯuescr;uesdot;uesim;uηueta;uðuethueth;uëueumlueuml;u€ueuro;u!uexcl;uexist;uexpectation;u
exponentiale;ufallingdotseq;uфufcy;u♀ufemale;uffiuffilig;uffufflig;uffluffllig;u𝔣uffr;ufiufilig;ufjufjlig;u♭uflat;uflufllig;u▱ufltns;uƒufnof;u𝕗ufopf;uforall;u⋔ufork;u⫙uforkv;u⨍u	fpartint;u½ufrac12ufrac12;u⅓ufrac13;u¼ufrac14ufrac14;u⅕ufrac15;u⅙ufrac16;u⅛ufrac18;u⅔ufrac23;u⅖ufrac25;u¾ufrac34ufrac34;u⅗ufrac35;u⅜ufrac38;u⅘ufrac45;u⅚ufrac56;u⅝ufrac58;u⅞ufrac78;u⁄ufrasl;u⌢ufrown;u𝒻ufscr;ugE;u⪌ugEl;uǵugacute;uγugamma;ugammad;u⪆ugap;uğugbreve;uĝugcirc;uгugcy;uġugdot;uge;ugel;ugeq;ugeqq;u	geqslant;uges;u⪩ugescc;u⪀ugesdot;u⪂ugesdoto;u⪄u	gesdotol;u⋛︀ugesl;u⪔ugesles;u𝔤ugfr;ugg;uggg;uℷugimel;uѓugjcy;ugl;u⪒uglE;u⪥ugla;u⪤uglj;u≩ugnE;u⪊ugnap;u	gnapprox;u⪈ugne;ugneq;ugneqq;u⋧ugnsim;u𝕘ugopf;ugrave;uℊugscr;ugsim;u⪎ugsime;u⪐ugsiml;ugtu⪧ugtcc;u⩺ugtcir;u⋗ugtdot;u⦕ugtlPar;u⩼ugtquest;u
gtrapprox;u⥸ugtrarr;ugtrdot;u
gtreqless;ugtreqqless;ugtrless;ugtrsim;u≩︀u
gvertneqq;ugvnE;uhArr;uhairsp;uhalf;uhamilt;uъuhardcy;uharr;u⥈uharrcir;u↭uharrw;uℏuhbar;uĥuhcirc;u♥uhearts;u
heartsuit;u…uhellip;u⊹uhercon;u𝔥uhfr;u⤥u	hksearow;u⤦u	hkswarow;u⇿uhoarr;u∻uhomtht;u↩uhookleftarrow;u↪uhookrightarrow;u𝕙uhopf;u―uhorbar;u𝒽uhscr;uhslash;uħuhstrok;u⁃uhybull;uhyphen;uíuiacuteuiacute;uic;uîuicircuicirc;uиuicy;uеuiecy;u¡uiexcluiexcl;uiff;u𝔦uifr;uìuigraveuigrave;uii;u⨌uiiiint;u∭uiiint;u⧜uiinfin;u℩uiiota;uijuijlig;uīuimacr;uimage;u	imagline;u	imagpart;uıuimath;u⊷uimof;uƵuimped;uin;u℅uincare;u∞uinfin;u⧝u	infintie;uinodot;uint;u⊺uintcal;u	integers;u	intercal;u⨗u	intlarhk;u⨼uintprod;uёuiocy;uįuiogon;u𝕚uiopf;uιuiota;uiprod;u¿uiquestuiquest;u𝒾uiscr;uisin;u⋹uisinE;u⋵uisindot;u⋴uisins;u⋳uisinsv;uisinv;uit;uĩuitilde;uіuiukcy;uïuiumluiuml;uĵujcirc;uйujcy;u𝔧ujfr;uȷujmath;u𝕛ujopf;u𝒿ujscr;uјujsercy;uєujukcy;uκukappa;uϰukappav;uķukcedil;uкukcy;u𝔨ukfr;uĸukgreen;uхukhcy;uќukjcy;u𝕜ukopf;u𝓀ukscr;ulAarr;ulArr;u⤛ulAtail;u⤎ulBarr;ulE;u⪋ulEg;u⥢ulHar;uĺulacute;u⦴u	laemptyv;ulagran;uλulambda;ulang;u⦑ulangd;ulangle;u⪅ulap;u«ulaquoulaquo;ularr;ularrb;u⤟ularrbfs;u⤝ularrfs;ularrhk;u↫ularrlp;u⤹ularrpl;u⥳ularrsim;u↢ularrtl;u⪫ulat;u⤙ulatail;u⪭ulate;u⪭︀ulates;u⤌ulbarr;u❲ulbbrk;u{ulbrace;u[ulbrack;u⦋ulbrke;u⦏ulbrksld;u⦍ulbrkslu;uľulcaron;uļulcedil;ulceil;ulcub;uлulcy;u⤶uldca;uldquo;uldquor;u⥧uldrdhar;u⥋u	ldrushar;u↲uldsh;u≤ule;u
leftarrow;uleftarrowtail;uleftharpoondown;uleftharpoonup;u⇇uleftleftarrows;uleftrightarrow;uleftrightarrows;uleftrightharpoons;uleftrightsquigarrow;u⋋uleftthreetimes;uleg;uleq;uleqq;u	leqslant;ules;u⪨ulescc;u⩿ulesdot;u⪁ulesdoto;u⪃u	lesdotor;u⋚︀ulesg;u⪓ulesges;ulessapprox;u⋖ulessdot;u
lesseqgtr;ulesseqqgtr;ulessgtr;ulesssim;u⥼ulfisht;ulfloor;u𝔩ulfr;ulg;u⪑ulgE;ulhard;ulharu;u⥪ulharul;u▄ulhblk;uљuljcy;ull;ullarr;u	llcorner;u⥫ullhard;u◺ulltri;uŀulmidot;u⎰ulmoust;ulmoustache;u≨ulnE;u⪉ulnap;u	lnapprox;u⪇ulne;ulneq;ulneqq;u⋦ulnsim;u⟬uloang;u⇽uloarr;ulobrk;ulongleftarrow;ulongleftrightarrow;u⟼ulongmapsto;ulongrightarrow;ulooparrowleft;u↬ulooparrowright;u⦅ulopar;u𝕝ulopf;u⨭uloplus;u⨴ulotimes;u∗ulowast;ulowbar;u◊uloz;ulozenge;ulozf;u(ulpar;u⦓ulparlt;ulrarr;u	lrcorner;ulrhar;u⥭ulrhard;u‎ulrm;u⊿ulrtri;u‹ulsaquo;u𝓁ulscr;ulsh;ulsim;u⪍ulsime;u⪏ulsimg;ulsqb;ulsquo;u‚ulsquor;ułulstrok;ultu⪦ultcc;u⩹ultcir;ultdot;ulthree;u⋉ultimes;u⥶ultlarr;u⩻ultquest;u⦖ultrPar;u◃ultri;ultrie;ultrif;u⥊u	lurdshar;u⥦uluruhar;u≨︀u
lvertneqq;ulvnE;u∺umDDot;u¯umacrumacr;u♂umale;u✠umalt;umaltese;umap;umapsto;umapstodown;umapstoleft;u	mapstoup;u▮umarker;u⨩umcomma;uмumcy;u—umdash;umeasuredangle;u𝔪umfr;u℧umho;uµumicroumicro;umid;umidast;u⫰umidcir;umiddotumiddot;u−uminus;uminusb;uminusd;u⨪uminusdu;u⫛umlcp;umldr;umnplus;u⊧umodels;u𝕞umopf;ump;u𝓂umscr;umstpos;uμumu;u⊸u	multimap;umumap;u⋙̸unGg;u≫⃒unGt;unGtv;u⇍unLeftarrow;u⇎unLeftrightarrow;u⋘̸unLl;u≪⃒unLt;unLtv;u⇏unRightarrow;u⊯unVDash;u⊮unVdash;unabla;uńunacute;u∠⃒unang;unap;u⩰̸unapE;u≋̸unapid;uʼnunapos;unapprox;u♮unatur;unatural;u	naturals;unbspunbsp;unbump;unbumpe;u⩃uncap;uňuncaron;uņuncedil;uncong;u⩭̸u	ncongdot;u⩂uncup;uнuncy;u–undash;une;u⇗uneArr;u⤤unearhk;unearr;unearrow;u≐̸unedot;unequiv;u⤨unesear;unesim;unexist;unexists;u𝔫unfr;ungE;unge;ungeq;ungeqq;u
ngeqslant;unges;ungsim;ungt;ungtr;unhArr;u↮unharr;u⫲unhpar;uni;u⋼unis;u⋺unisd;univ;uњunjcy;unlArr;u≦̸unlE;u↚unlarr;u‥unldr;unle;unleftarrow;unleftrightarrow;unleq;unleqq;u
nleqslant;unles;unless;unlsim;unlt;unltri;unltrie;unmid;u𝕟unopf;u¬unotunot;unotin;u⋹̸unotinE;u⋵̸u	notindot;unotinva;u⋷unotinvb;u⋶unotinvc;unotni;unotniva;u⋾unotnivb;u⋽unotnivc;unpar;u
nparallel;u⫽⃥unparsl;u∂̸unpart;u⨔unpolint;unpr;unprcue;unpre;unprec;unpreceq;unrArr;u↛unrarr;u⤳̸unrarrc;u↝̸unrarrw;unrightarrow;unrtri;unrtrie;unsc;unsccue;unsce;u𝓃unscr;u
nshortmid;unshortparallel;unsim;unsime;unsimeq;unsmid;unspar;unsqsube;unsqsupe;u⊄unsub;u⫅̸unsubE;unsube;unsubset;u
nsubseteq;unsubseteqq;unsucc;unsucceq;u⊅unsup;u⫆̸unsupE;unsupe;unsupset;u
nsupseteq;unsupseteqq;untgl;uñuntildeuntilde;untlg;untriangleleft;untrianglelefteq;untriangleright;untrianglerighteq;uνunu;u#unum;u№unumero;u unumsp;u⊭unvDash;u⤄unvHarr;u≍⃒unvap;u⊬unvdash;u≥⃒unvge;u>⃒unvgt;u⧞unvinfin;u⤂unvlArr;u≤⃒unvle;u<⃒unvlt;u⊴⃒unvltrie;u⤃unvrArr;u⊵⃒unvrtrie;u∼⃒unvsim;u⇖unwArr;u⤣unwarhk;unwarr;unwarrow;u⤧unwnear;uoS;uóuoacuteuoacute;uoast;uocir;uôuocircuocirc;uоuocy;uodash;uőuodblac;u⨸uodiv;uodot;u⦼uodsold;uœuoelig;u⦿uofcir;u𝔬uofr;u˛uogon;uòuograveuograve;u⧁uogt;u⦵uohbar;uohm;uoint;uolarr;u⦾uolcir;u⦻uolcross;uoline;u⧀uolt;uōuomacr;uωuomega;uοuomicron;u⦶uomid;uominus;u𝕠uoopf;u⦷uopar;u⦹uoperp;uoplus;u∨uor;uorarr;u⩝uord;uℴuorder;uorderof;uªuordfuordf;uºuordmuordm;u⊶uorigof;u⩖uoror;u⩗uorslope;u⩛uorv;uoscr;uøuoslashuoslash;u⊘uosol;uõuotildeuotilde;uotimes;u⨶u	otimesas;uöuoumluouml;u⌽uovbar;upar;u¶uparaupara;u	parallel;u⫳uparsim;u⫽uparsl;upart;uпupcy;u%upercnt;u.uperiod;u‰upermil;uperp;u‱upertenk;u𝔭upfr;uφuphi;uϕuphiv;uphmmat;u☎uphone;uπupi;u
pitchfork;uϖupiv;uplanck;uℎuplanckh;uplankv;u+uplus;u⨣u	plusacir;uplusb;u⨢upluscir;uplusdo;u⨥uplusdu;u⩲upluse;uplusmnuplusmn;u⨦uplussim;u⨧uplustwo;upm;u⨕u	pointint;u𝕡upopf;u£upoundupound;upr;u⪳uprE;u⪷uprap;uprcue;upre;uprec;uprecapprox;upreccurlyeq;upreceq;u⪹uprecnapprox;u⪵u	precneqq;u⋨u	precnsim;uprecsim;u′uprime;uprimes;uprnE;uprnap;uprnsim;uprod;u⌮u	profalar;u⌒u	profline;u⌓u	profsurf;uprop;upropto;uprsim;u⊰uprurel;u𝓅upscr;uψupsi;u upuncsp;u𝔮uqfr;uqint;u𝕢uqopf;u⁗uqprime;u𝓆uqscr;uquaternions;u⨖uquatint;u?uquest;uquesteq;uquoturAarr;urArr;u⤜urAtail;urBarr;u⥤urHar;u∽̱urace;uŕuracute;uradic;u⦳u	raemptyv;urang;u⦒urangd;u⦥urange;urangle;u»uraquouraquo;urarr;u⥵urarrap;urarrb;u⤠urarrbfs;u⤳urarrc;u⤞urarrfs;urarrhk;urarrlp;u⥅urarrpl;u⥴urarrsim;u↣urarrtl;u↝urarrw;u⤚uratail;u∶uratio;u
rationals;urbarr;u❳urbbrk;u}urbrace;u]urbrack;u⦌urbrke;u⦎urbrksld;u⦐urbrkslu;uřurcaron;uŗurcedil;urceil;urcub;uрurcy;u⤷urdca;u⥩urdldhar;urdquo;urdquor;u↳urdsh;ureal;urealine;u	realpart;ureals;u▭urect;uregureg;u⥽urfisht;urfloor;u𝔯urfr;urhard;urharu;u⥬urharul;uρurho;uϱurhov;urightarrow;urightarrowtail;urightharpoondown;urightharpoonup;urightleftarrows;urightleftharpoons;u⇉urightrightarrows;urightsquigarrow;u⋌urightthreetimes;u˚uring;u
risingdotseq;urlarr;urlhar;u‏urlm;u⎱urmoust;urmoustache;u⫮urnmid;u⟭uroang;u⇾uroarr;urobrk;u⦆uropar;u𝕣uropf;u⨮uroplus;u⨵urotimes;u)urpar;u⦔urpargt;u⨒u	rppolint;urrarr;u›ursaquo;u𝓇urscr;ursh;ursqb;ursquo;ursquor;urthree;u⋊urtimes;u▹urtri;urtrie;urtrif;u⧎u	rtriltri;u⥨uruluhar;u℞urx;uśusacute;usbquo;usc;u⪴uscE;u⪸uscap;ušuscaron;usccue;usce;uşuscedil;uŝuscirc;u⪶uscnE;u⪺uscnap;u⋩uscnsim;u⨓u	scpolint;uscsim;uсuscy;u⋅usdot;usdotb;u⩦usdote;u⇘useArr;usearhk;usearr;usearrow;u§usectusect;u;usemi;u⤩useswar;u	setminus;usetmn;u✶usext;u𝔰usfr;usfrown;u♯usharp;uщushchcy;uшushcy;u	shortmid;ushortparallel;u­ushyushy;uσusigma;uςusigmaf;usigmav;usim;u⩪usimdot;usime;usimeq;u⪞usimg;u⪠usimgE;u⪝usiml;u⪟usimlE;u≆usimne;u⨤usimplus;u⥲usimrarr;uslarr;usmallsetminus;u⨳usmashp;u⧤u	smeparsl;usmid;u⌣usmile;u⪪usmt;u⪬usmte;u⪬︀usmtes;uьusoftcy;u/usol;u⧄usolb;u⌿usolbar;u𝕤usopf;u♠uspades;u
spadesuit;uspar;usqcap;u⊓︀usqcaps;usqcup;u⊔︀usqcups;usqsub;usqsube;u	sqsubset;usqsubseteq;usqsup;usqsupe;u	sqsupset;usqsupseteq;usqu;usquare;usquarf;usquf;usrarr;u𝓈usscr;ussetmn;ussmile;usstarf;u☆ustar;ustarf;ustraightepsilon;ustraightphi;ustrns;u⊂usub;u⫅usubE;u⪽usubdot;usube;u⫃usubedot;u⫁usubmult;u⫋usubnE;u⊊usubne;u⪿usubplus;u⥹usubrarr;usubset;u	subseteq;u
subseteqq;u
subsetneq;usubsetneqq;u⫇usubsim;u⫕usubsub;u⫓usubsup;usucc;usuccapprox;usucccurlyeq;usucceq;usuccnapprox;u	succneqq;u	succnsim;usuccsim;usum;u♪usung;u¹usup1usup1;u²usup2usup2;u³usup3usup3;usup;u⫆usupE;u⪾usupdot;u⫘usupdsub;usupe;u⫄usupedot;u⟉usuphsol;u⫗usuphsub;u⥻usuplarr;u⫂usupmult;u⫌usupnE;u⊋usupne;u⫀usupplus;usupset;u	supseteq;u
supseteqq;u
supsetneq;usupsetneqq;u⫈usupsim;u⫔usupsub;u⫖usupsup;u⇙uswArr;uswarhk;uswarr;uswarrow;u⤪uswnwar;ußuszliguszlig;u⌖utarget;uτutau;utbrk;uťutcaron;uţutcedil;uтutcy;utdot;u⌕utelrec;u𝔱utfr;uthere4;u
therefore;uθutheta;uϑu	thetasym;uthetav;uthickapprox;u	thicksim;uthinsp;uthkap;uthksim;uþuthornuthorn;utilde;u×utimesutimes;utimesb;u⨱u	timesbar;u⨰utimesd;utint;utoea;utop;u⌶utopbot;u⫱utopcir;u𝕥utopf;u⫚utopfork;utosa;u‴utprime;utrade;u▵u	triangle;u
triangledown;u
triangleleft;utrianglelefteq;u≜u
triangleq;utriangleright;utrianglerighteq;u◬utridot;utrie;u⨺u	triminus;u⨹utriplus;u⧍utrisb;u⨻utritime;u⏢u	trpezium;u𝓉utscr;uцutscy;uћutshcy;uŧutstrok;utwixt;utwoheadleftarrow;utwoheadrightarrow;uuArr;u⥣uuHar;uúuuacuteuuacute;uuarr;uўuubrcy;uŭuubreve;uûuucircuucirc;uуuucy;uudarr;uűuudblac;uudhar;u⥾uufisht;u𝔲uufr;uùuugraveuugrave;uuharl;uuharr;u▀uuhblk;u⌜uulcorn;u	ulcorner;u⌏uulcrop;u◸uultri;uūuumacr;uumluuml;uųuuogon;u𝕦uuopf;uuparrow;uupdownarrow;uupharpoonleft;uupharpoonright;uuplus;uυuupsi;uupsih;uupsilon;u⇈uupuparrows;u⌝uurcorn;u	urcorner;u⌎uurcrop;uůuuring;u◹uurtri;u𝓊uuscr;u⋰uutdot;uũuutilde;uutri;uutrif;uuuarr;uüuuumluuuml;u⦧uuwangle;uvArr;u⫨uvBar;u⫩uvBarv;uvDash;u⦜uvangrt;uvarepsilon;u	varkappa;uvarnothing;uvarphi;uvarpi;u
varpropto;uvarr;uvarrho;u	varsigma;u⊊︀u
varsubsetneq;u⫋︀uvarsubsetneqq;u⊋︀u
varsupsetneq;u⫌︀uvarsupsetneqq;u	vartheta;uvartriangleleft;uvartriangleright;uвuvcy;uvdash;uvee;u⊻uveebar;u≚uveeeq;u⋮uvellip;uverbar;uvert;u𝔳uvfr;uvltri;uvnsub;uvnsup;u𝕧uvopf;uvprop;uvrtri;u𝓋uvscr;uvsubnE;uvsubne;uvsupnE;uvsupne;u⦚uvzigzag;uŵuwcirc;u⩟uwedbar;uwedge;u≙uwedgeq;u℘uweierp;u𝔴uwfr;u𝕨uwopf;uwp;uwr;uwreath;u𝓌uwscr;uxcap;uxcirc;uxcup;uxdtri;u𝔵uxfr;uxhArr;uxharr;uξuxi;uxlArr;uxlarr;uxmap;u⋻uxnis;uxodot;u𝕩uxopf;uxoplus;uxotime;uxrArr;uxrarr;u𝓍uxscr;uxsqcup;uxuplus;uxutri;uxvee;uxwedge;uýuyacuteuyacute;uяuyacy;uŷuycirc;uыuycy;u¥uyenuyen;u𝔶uyfr;uїuyicy;u𝕪uyopf;u𝓎uyscr;uюuyucy;uÿuyumluyuml;uźuzacute;užuzcaron;uзuzcy;użuzdot;uzeetrf;uζuzeta;u𝔷uzfr;uжuzhcy;u⇝uzigrarr;u𝕫uzopf;u𝓏uzscr;u‍uzwj;u‌uzwnj;u�i
i�ui�i�i�i�i�i�i�i�i�i�i�i�ui�i�ui�ui�i�i�i�i�i�i�i�i�i�i�i�i�ui�i�i�ucp437u437ucp850u850ucp852u852ucp855u855ucp857u857ucp860u860ucp861u861ucp862u862ucp863u863ucp865u865ucp866u866ucp869u869uasciiuansix341968uansix341986u	iso8859-6uarabicuasmo708ubig5u	big5hkscsugbkuchineseucp037ucp1026uptcp154ucp154ucp367ucp424ucp500ucp775uwindows-1252ucp819ucp864ucp936ucpgrucpisucsasciiucsbig5ucp949ucseuckrueuc_jpucseucpkdfmtjapaneseucsgb2312u	hp-roman8u
cshproman8ucsibm037u	csibm1026ucsibm424ucsibm500ucsibm855ucsibm857ucsibm860ucsibm861ucsibm863ucsibm864ucsibm865ucsibm866ucsibm869u
iso2022_jpucsiso2022jpuiso2022_jp_2ucsiso2022jp2u
iso2022_krucsiso2022krucsiso58gb231280ucsisolatin1u	iso8859-2ucsisolatin2u	iso8859-3ucsisolatin3u	iso8859-4ucsisolatin4uwindows-1254ucsisolatin5u
iso8859-10ucsisolatin6ucsisolatinarabicu	iso8859-5ucsisolatincyrillicu	iso8859-7ucsisolatingreeku	iso8859-8ucsisolatinhebrewukoi8-rucskoi8ru
csksc56011987u
cspc775balticucspc850multilingualucspc862latinhebrewucspc8codepage437ucspcp852u	csptcp154u	shift_jisu
csshiftjisuutf-7ucsunicode11utf7ucyrillicu
cyrillicasianu
ebcdiccpbeu
ebcdiccpcau
ebcdiccpchu
ebcdiccpheu
ebcdiccpnlu
ebcdiccpusu
ebcdiccpwtuecma114uecma118uelot928ueucjpueuckru'extendedunixcodepackedformatforjapaneseugb18030ugb2312ugb231280ugreekugreek8uhebrewuhproman8uhzuhzgb2312uibm037uibm1026uibm367uibm424uibm437uibm500uibm775uibm819uibm850uibm852uibm855uibm857uibm860uibm861uibm862uibm863uibm864uibm865uibm866uibm869u	iso2022jpu
iso2022jp2u	iso2022kru
iso646irv1991uiso646usuiso88591u	iso885910u
iso8859101992uiso885911987u
iso8859-13u	iso885913u
iso8859-14u	iso885914u
iso8859141998u
iso8859-15u	iso885915u
iso8859-16u	iso885916u
iso8859162001uiso88592uiso885921987uiso88593uiso885931988uiso88594uiso885941988uiso88595uiso885951988uiso88596uiso885961987uiso88597uiso885971987uiso88598uiso885981988uiso88599uiso885991989u	isocelticuisoir100uisoir101uisoir109uisoir110uisoir126uisoir127uisoir138uisoir144uisoir148uisoir149uisoir157uisoir199uisoir226uisoir58uisoir6ukoi8rukoi8-uukoi8uukoreanuksc5601uksc56011987uksc56011989ul1ul10ul2ul3ul4ul5ul6ul8ulatin1ulatin10ulatin2ulatin3ulatin4ulatin5ulatin6ulatin8ulatin9ums936umskanjiupt154ur8uroman8ushiftjisucp874utis620u
unicode11utf7uusuusasciiuutf-16uutf16u	utf-16-beuutf16beu	utf-16-leuutf16leuutf-8uutf8ucp1250uwindows1250ucp1251uwindows1251ucp1252uwindows1252ucp1253uwindows1253ucp1254uwindows1254ucp1255uwindows1255ucp1256uwindows1256ucp1257uwindows1257ucp1258uwindows1258u
windows936ux-x-big5uDoctypeiu
CharactersiuSpaceCharactersiuStartTagiuEndTagiuEmptyTagiuCommentiu
ParseErrorcCs"g|]\}}||f�qS(((u.0ukuv((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/constants.pyu
<listcomp>s	umathcBs|EeZdZdS(uDataLossWarningN(u__name__u
__module__u__qualname__(u
__locals__((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/constants.pyuDataLossWarningsuDataLossWarningcBs|EeZdZdS(uReparseExceptionN(u__name__u
__module__u__qualname__(u
__locals__((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/constants.pyuReparseExceptionsuReparseException(u	u
uu u
(utableutbodyutfootutheadutr(uh1uh2uh3uh4uh5uh6(ubaseucommanduevent-sourceulinkumetauhrubruimguembeduparamuareaucoluinputusourceutrack(utitleutextarea(ustyleuscriptuxmpuiframeunoembedunoframesunoscript(u
irrelevant(uscoped(uismap(uautoplayucontrols(uautoplayucontrols(udeferuasync(uopen(umultipleudisabled(uhiddenudisableducheckedudefault(u
autosubmit(udisabledureadonly(udisabledureadonlyuselected(udisabledureadonly(udisabledu	autofocus(udisabledureadonlyurequiredu	autofocusucheckeduismap(udisabledureadonlyu	autofocusumultiple(udisabledureadonly( i� i��i i�i i& i  i! i�i0 i`i9 iRi��i}i��i��i i i i i" i i i�i"!iai: iSi��i~ix(ult;ugt;uamp;uapos;uquot;(2u
__future__uabsolute_importudivisionuunicode_literalsustringugettextu_uNoneuEOFuEu
namespacesu	frozensetuscopingElementsuformattingElementsuspecialElementsuhtmlIntegrationPointElementsu"mathmlTextIntegrationPointElementsuadjustForeignAttributesudictuitemsuunadjustForeignAttributesuspaceCharactersutableInsertModeElementsuascii_lowercaseuasciiLowercaseuascii_uppercaseuasciiUppercaseu
ascii_lettersuasciiLettersudigitsu	hexdigitsu	hexDigitsuasciiUpper2LoweruheadingElementsuvoidElementsu
cdataElementsurcdataElementsubooleanAttributesuentitiesWindows1252uxmlEntitiesuentitiesureplacementCharactersu	encodingsu
tokenTypesu
tagTokenTypesuprefixesuUserWarninguDataLossWarningu	ExceptionuReparseException(((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/constants.pyu<module>s�	















































































































































































































































				





















site-packages/pip/_vendor/html5lib/__pycache__/inputstream.cpython-33.pyc000064400000103034151733463620022451 0ustar00�
7�Re�wc1@s�ddlmZmZmZddlmZddlZddlZddlm	Z	m
Z
mZmZddlm
Z
mZddlmZddlmZydd	lmZWnek
r�eZYnXydd
lmZWn(ek
r	Gdd�de�ZYnXed
d�e
D��Zedd�eD��Zedd�eD��Zeeddg�BZejd�Zeddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3g �Zejd4�Z iZ!Gd5d6�d6e�Z"ddEdEd7d8�Z%Gd9d:�d:e�Z&Gd;d<�d<e&�Z'Gd=d>�d>e(�Z)Gd?d@�d@e�Z*GdAdB�dBe�Z+dCdD�Z,dS(Fi(uabsolute_importudivisionuunicode_literals(u	text_typeNi(uEOFuspaceCharactersuasciiLettersuasciiUppercase(u	encodingsuReparseException(uutils(uStringIO(uBytesIO(uBufferedIOBasecBs|EeZdZdS(uBufferedIOBaseN(u__name__u
__module__u__qualname__(u
__locals__((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyuBufferedIOBasesuBufferedIOBasecCsg|]}|jd��qS(uascii(uencode(u.0uitem((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu
<listcomp>s	u
<listcomp>cCsg|]}|jd��qS(uascii(uencode(u.0uitem((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu
<listcomp>s	cCsg|]}|jd��qS(uascii(uencode(u.0uitem((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu
<listcomp>s	s>s<u�[---Ÿ�-�﷐-﷯￾￿🿾🿿𯿾𯿿𿿾𿿿񏿾񏿿񟿾񟿿񯿾񯿿񿿾񿿿򏿾򏿿򟿾򟿿򯿾򯿿򿿾򿿿󏿾󏿿󟿾󟿿󯿾󯿿󿿾󿿿􏿾􏿿]i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��	i��	i��
i��
i��i��i��i��i��
i��
i��i��i��i��i��i��u[	-
 -/:-@[-`{-~]cBsn|EeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dS(uBufferedStreamu�Buffering for streams that do not have buffering of their own

    The buffer is implemented as a list of chunks on the assumption that
    joining many strings will be slow since it is O(n**2)
    cCs%||_g|_ddg|_dS(Niii����(ustreamubufferuposition(uselfustream((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu__init__5s		uBufferedStream.__init__cCsPd}x2|jd|jd�D]}|t|�7}q!W||jd7}|S(Nii(ubufferupositionulen(uselfuposuchunk((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyutell:s
!uBufferedStream.tellcCsx||j�kst�|}d}x>t|j|�|krd|t|j|�8}|d7}q'W||g|_dS(Nii(u_bufferedBytesuAssertionErrorulenubufferuposition(uselfuposuoffsetui((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyuseekAsuBufferedStream.seekcCsp|js|j|�S|jdt|j�kr_|jdt|jd�kr_|j|�S|j|�SdS(Niii����(ubufferu_readStreamupositionulenu_readFromBuffer(uselfubytes((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyureadJs	
 
uBufferedStream.readcCstdd�|jD��S(NcSsg|]}t|��qS((ulen(u.0uitem((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu
<listcomp>Ts	u1BufferedStream._bufferedBytes.<locals>.<listcomp>(usumubuffer(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu_bufferedBytesSsuBufferedStream._bufferedBytescCsJ|jj|�}|jj|�|jdd7<t|�|jd<|S(Nii(ustreamureadubufferuappendupositionulen(uselfubytesudata((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu_readStreamVs
uBufferedStream._readStreamcCs%|}g}|jd}|jd}x�|t|j�kr�|dkr�|dks\t�|j|}|t|�|kr�|}|||g|_n/t|�|}|t|�g|_|d7}|j||||��||8}d}q)W|r|j|j|��ndj|�S(Niis(upositionulenubufferuAssertionErroruappendu_readStreamujoin(uselfubytesuremainingBytesurvubufferIndexubufferOffsetubufferedDataubytesToRead((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu_readFromBuffer]s&

$



uBufferedStream._readFromBufferN(u__name__u
__module__u__qualname__u__doc__u__init__utelluseekureadu_bufferedBytesu_readStreamu_readFromBuffer(u
__locals__((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyuBufferedStream.s		uBufferedStreamcCs{t|d�r*t|jd�t�}nt|t�}|rd|dk	rZtd��nt|�St||||�SdS(Nureadiu7Cannot explicitly set an encoding with a unicode string(uhasattru
isinstanceureadu	text_typeuNoneu	TypeErroruHTMLUnicodeInputStreamuHTMLBinaryInputStream(usourceuencodingu	parseMetauchardetu	isUnicode((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyuHTMLInputStreamxs
uHTMLInputStreamcBs�|EeZdZdZdZdd�Zdd�Zdd�Zd	d
�Zdd�Z	d
d�Z
ddd�Zdd�Z
dd�Zddd�Zdd�ZdS(uHTMLUnicodeInputStreamu�Provides a unicode stream of characters to the HTMLTokenizer.

    This class takes care of character encoding and removing or replacing
    incorrect byte-sequences and also provides column and line tracking.

    i(cCs�td�dkr3|j|_tjd�|_n|j|_tjd�|_dg|_d	|_|j	|�|_
|j�dS(
uInitialises the HTMLInputStream.

        HTMLInputStream(source, [encoding]) -> Normalized stream from source
        for use by html5lib.

        source can be either a file-object, local filename or a string.

        The optional encoding parameter must be a string that indicates
        the encoding.  If specified, that encoding will be used,
        regardless of any BOM or later declaration (such as in a meta
        element)

        parseMeta - Look for a <meta> element containing encoding information

        u􏿿iu	[�-�]u0([�-�](?![�-�])|(?<![�-�])[�-�])iuutf-8ucertainN(uutf-8ucertain(ulenucharacterErrorsUCS4ureportCharacterErrorsureucompileureplaceCharactersRegexpucharacterErrorsUCS2unewLinesucharEncodingu
openStreamu
dataStreamureset(uselfusource((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu__init__�s	uHTMLUnicodeInputStream.__init__cCsCd|_d|_d|_g|_d|_d|_d|_dS(Nui(uchunku	chunkSizeuchunkOffsetuerrorsuprevNumLinesuprevNumColsuNoneu_bufferedCharacter(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyureset�s						uHTMLUnicodeInputStream.resetcCs(t|d�r|}nt|�}|S(uvProduces a file object from source.

        source can be either a file object, local filename or a string.

        uread(uhasattruStringIO(uselfusourceustream((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu
openStream�s	u!HTMLUnicodeInputStream.openStreamcCst|j}|jdd|�}|j|}|jdd|�}|dkr\|j|}n||d}||fS(Nu
iii����(uchunkucountuprevNumLinesurfinduprevNumCols(uselfuoffsetuchunkunLinesupositionLineulastLinePosupositionColumn((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu	_position�s	
u HTMLUnicodeInputStream._positioncCs&|j|j�\}}|d|fS(u:Returns (line, col) of the current position in the stream.i(u	_positionuchunkOffset(uselfulineucol((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyuposition�suHTMLUnicodeInputStream.positioncCsL|j|jkr%|j�s%tSn|j}|j|}|d|_|S(uo Read one character from the stream or queue if available. Return
            EOF when EOF is reached.
        i(uchunkOffsetu	chunkSizeu	readChunkuEOFuchunk(uselfuchunkOffsetuchar((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyuchar�s	

uHTMLUnicodeInputStream.charcCs^|dkr|j}n|j|j�\|_|_d|_d|_d|_|jj	|�}|j
r�|j
|}d|_
n
|s�dSt|�dkr�t
|d�}|dks�d|ko�dknr�|d
|_
|dd�}q�n|j|�|jjd|�}|jdd	�}|jd
d	�}||_t|�|_dS(Nuiii
i�i��u�u
u
u
Fi����i����i����T(uNoneu_defaultChunkSizeu	_positionu	chunkSizeuprevNumLinesuprevNumColsuchunkuchunkOffsetu
dataStreamureadu_bufferedCharacteruFalseulenuordureportCharacterErrorsureplaceCharactersRegexpusubureplaceuTrue(uselfu	chunkSizeudataulastv((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu	readChunk�s0				
(

	u HTMLUnicodeInputStream.readChunkcCs:x3tttj|���D]}|jjd�qWdS(Nuinvalid-codepoint(urangeulenuinvalid_unicode_reufindalluerrorsuappend(uselfudataui((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyucharacterErrorsUCS4s"u*HTMLUnicodeInputStream.characterErrorsUCS4cCsd}x�tj|�D]�}|r(qnt|j��}|j�}tj|||d��r�tj|||d��}|t	kr�|j
jd�nd}q|dkr�|dkr�|t
|�dkr�|j
jd�qd}|j
jd�qWdS(Niuinvalid-codepointi�i��iFT(uFalseuinvalid_unicode_reufinditeruordugroupustartuutilsuisSurrogatePairusurrogatePairToCodepointunon_bmp_invalid_codepointsuerrorsuappenduTrueulen(uselfudatauskipumatchu	codepointuposuchar_val((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyucharacterErrorsUCS2s 	u*HTMLUnicodeInputStream.characterErrorsUCS2c
Cspyt||f}Wn�tk
r�x&|D]}t|�dks+t�q+Wdjdd�|D��}|s|d|}ntjd|�}t||f<YnXg}x�|j|j|j	�}|dkr�|j	|jkr-Pq-nE|j�}||jkr-|j
|j|j	|��||_	Pn|j
|j|j	d��|j�s�Pq�q�dj|�}	|	S(u� Returns a string of characters from the stream up to but not
        including any character in 'characters' or EOF. 'characters' must be
        a container that supports the 'in' method and iteration over its
        characters.
        i�ucSs g|]}dt|��qS(u\x%02x(uord(u.0uc((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu
<listcomp>>s	u5HTMLUnicodeInputStream.charsUntil.<locals>.<listcomp>u^%su[%s]+N(ucharsUntilRegExuKeyErroruorduAssertionErrorujoinureucompileumatchuchunkuchunkOffsetuNoneu	chunkSizeuenduappendu	readChunk(
uselfu
charactersuoppositeucharsucuregexurvumuendur((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu
charsUntil0s2


&	u!HTMLUnicodeInputStream.charsUntilcCso|dk	rk|jdkr=||j|_|jd7_qk|jd8_|j|j|kskt�ndS(Nii(uNoneuchunkOffsetuchunku	chunkSizeuAssertionError(uselfuchar((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyuunget_suHTMLUnicodeInputStream.ungetNF(u__name__u
__module__u__qualname__u__doc__u_defaultChunkSizeu__init__uresetu
openStreamu	_positionupositionucharuNoneu	readChunkucharacterErrorsUCS4ucharacterErrorsUCS2uFalseu
charsUntiluunget(u
__locals__((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyuHTMLUnicodeInputStream�s!(/uHTMLUnicodeInputStreamcBs}|EeZdZdZddddd�Zdd�Zdd�Zdddd	�Z	d
d�Z
dd
�Zdd�ZdS(uHTMLBinaryInputStreamu�Provides a unicode stream of characters to the HTMLTokenizer.

    This class takes care of character encoding and removing or replacing
    incorrect byte-sequences and also provides column and line tracking.

    cCs�|j|�|_tj||j�t|�df|_d|_d|_d|_|jddkr�|j
||�|_n|j�dS(uInitialises the HTMLInputStream.

        HTMLInputStream(source, [encoding]) -> Normalized stream from source
        for use by html5lib.

        source can be either a file-object, local filename or a string.

        The optional encoding parameter must be a string that indicates
        the encoding.  If specified, that encoding will be used,
        regardless of any BOM or later declaration (such as in a meta
        element)

        parseMeta - Look for a <meta> element containing encoding information

        ucertainiiduwindows-1252iN(u
openStreamu	rawStreamuHTMLUnicodeInputStreamu__init__u	codecNameucharEncodingunumBytesMetaunumBytesChardetudefaultEncodinguNoneudetectEncodingureset(uselfusourceuencodingu	parseMetauchardet((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu__init__xs			uHTMLBinaryInputStream.__init__cCs6tj|jd�|jd�|_tj|�dS(Niureplace(ucodecsu	getreaderucharEncodingu	rawStreamu
dataStreamuHTMLUnicodeInputStreamureset(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyureset�suHTMLBinaryInputStream.resetc	CsVt|d�r|}nt|�}y|j|j��Wnt|�}YnX|S(uvProduces a file object from source.

        source can be either a file object, local filename or a string.

        uread(uhasattruBytesIOuseekutelluBufferedStream(uselfusourceustream((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu
openStream�s	u HTMLBinaryInputStream.openStreamc
Cs�|j�}d}|dkr9|r9|j�}d}n|dkr:|r:d}y�yddlm}Wn"tk
r�ddlm}YnXg}|�}x[|js�|jj	|j
�}t|t�s�t
�|s�Pn|j|�|j|�q�W|j�|jd}|jjd�Wq:tk
r6Yq:Xn|dkrXd}|j}nidd6}	|j�|	kr�|	|j�}n||fS(Nucertainu	tentativei(uUniversalDetectoruencodinguwindows-1252u
iso-8859-1(u	detectBOMuNoneudetectEncodingMetaucharade.universaldetectoruUniversalDetectoruImportErroruchardet.universaldetectorudoneu	rawStreamureadunumBytesChardetu
isinstanceubytesuAssertionErroruappendufeeducloseuresultuseekudefaultEncodingulower(
uselfu	parseMetauchardetuencodingu
confidenceuUniversalDetectorubuffersudetectorubufferuencodingSub((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyudetectEncoding�sB	
	




u$HTMLBinaryInputStream.detectEncodingcCs�|jddkst�t|�}|d	kr:d}n|dkrJdS||jdkrv|jddf|_nF|jjd�|j�|df|_td|jd|f��dS(
Niucertainuutf-16u	utf-16-beu	utf-16-leuutf-8iuEncoding changed from %s to %s(uutf-16u	utf-16-beu	utf-16-le(ucharEncodinguAssertionErroru	codecNameuNoneu	rawStreamuseekuresetuReparseException(uselfunewEncoding((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyuchangeEncoding�s	
u$HTMLBinaryInputStream.changeEncodingcCs�idtj6dtj6dtj6dtj6dtj6}|jjd�}t|t	�s_t
�|j|dd��}d}|s�|j|�}d}|s�|j|dd	��}d	}q�n|jj|r�|p�d
�|S(u�Attempts to detect at BOM at the start of the stream. If
        an encoding can be determined from the BOM return the name of the
        encoding otherwise return Noneuutf-8u	utf-16-leu	utf-16-beu	utf-32-leu	utf-32-beiNiii(
ucodecsuBOM_UTF8uBOM_UTF16_LEuBOM_UTF16_BEuBOM_UTF32_LEuBOM_UTF32_BEu	rawStreamureadu
isinstanceubytesuAssertionErrorugetuseek(uselfubomDictustringuencodinguseek((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu	detectBOM�s 
uHTMLBinaryInputStream.detectBOMcCsk|jj|j�}t|t�s*t�t|�}|jjd�|j�}|dkrgd}n|S(u9Report the encoding declared by the meta element
        iuutf-16u	utf-16-beu	utf-16-leuutf-8(uutf-16u	utf-16-beu	utf-16-le(	u	rawStreamureadunumBytesMetau
isinstanceubytesuAssertionErroruEncodingParseruseekugetEncoding(uselfubufferuparseruencoding((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyudetectEncodingMetas	u(HTMLBinaryInputStream.detectEncodingMetaNT(
u__name__u
__module__u__qualname__u__doc__uNoneuTrueu__init__uresetu
openStreamudetectEncodinguchangeEncodingu	detectBOMudetectEncodingMeta(u
__locals__((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyuHTMLBinaryInputStreamps(-uHTMLBinaryInputStreamcBs�|EeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zeee
�Z
dd�Zee�Zedd�Zdd�Zdd�Zdd�ZdS(u
EncodingBytesu�String-like object with an associated position and various extra methods
    If the position is ever greater than the string length then an exception is
    raisedcCs+t|t�st�tj||j��S(N(u
isinstanceubytesuAssertionErroru__new__ulower(uselfuvalue((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu__new__&suEncodingBytes.__new__cCs
d|_dS(Nii����(u	_position(uselfuvalue((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu__init__*suEncodingBytes.__init__cCs|S(N((uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu__iter__-suEncodingBytes.__iter__cCsV|jd}|_|t|�kr/t�n|dkrDt�n|||d�S(Nii(u	_positionulenu
StopIterationu	TypeError(uselfup((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu__next__0s		uEncodingBytes.__next__cCs
|j�S(N(u__next__(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyunext8suEncodingBytes.nextcCs\|j}|t|�kr$t�n|dkr9t�n|d|_}|||d�S(Nii(u	_positionulenu
StopIterationu	TypeError(uselfup((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyuprevious<s			uEncodingBytes.previouscCs+|jt|�krt�n||_dS(N(u	_positionulenu
StopIteration(uselfuposition((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyusetPositionEs	uEncodingBytes.setPositioncCs<|jt|�krt�n|jdkr4|jSdSdS(Ni(u	_positionulenu
StopIterationuNone(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyugetPositionJs
	uEncodingBytes.getPositioncCs||j|jd�S(Ni(uposition(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyugetCurrentByteTsuEncodingBytes.getCurrentBytecCsf|j}xM|t|�krX|||d�}||krK||_|S|d7}qW||_dS(uSkip past a list of charactersiN(upositionulenu	_positionuNone(uselfucharsupuc((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyuskipYs			uEncodingBytes.skipcCsf|j}xM|t|�krX|||d�}||krK||_|S|d7}qW||_dS(Ni(upositionulenu	_positionuNone(uselfucharsupuc((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu	skipUntiles			uEncodingBytes.skipUntilcCsT|j}|||t|��}|j|�}|rP|jt|�7_n|S(u�Look for a sequence of bytes at the start of a string. If the bytes
        are found return True and advance the position to the byte after the
        match. Otherwise return False and leave the position alone(upositionulenu
startswith(uselfubytesupudataurv((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu
matchBytesps	uEncodingBytes.matchBytescCsn||jd�j|�}|dkrd|jdkrCd|_n|j|t|�d7_dSt�dS(u�Look for the next sequence of bytes matching a given sequence. If
        a match is found advance the position to the last byte of the matchNiii����i����T(upositionufindu	_positionulenuTrueu
StopIteration(uselfubytesunewPosition((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyujumpTo{suEncodingBytes.jumpToN(u__name__u
__module__u__qualname__u__doc__u__new__u__init__u__iter__u__next__unextuprevioususetPositionugetPositionupropertyupositionugetCurrentByteucurrentByteuspaceCharactersBytesuskipu	skipUntilu
matchBytesujumpTo(u
__locals__((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu
EncodingBytes"s 	u
EncodingBytescBs�|EeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�ZdS(uEncodingParseru?Mini parser for detecting character encoding from meta elementscCst|�|_d|_dS(u3string - the data to work on for encoding detectionN(u
EncodingBytesudatauNoneuencoding(uselfudata((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu__init__�suEncodingParser.__init__c
Cs�d|jfd|jfd|jfd|jfd|jfd|jff}xw|jD]l}d}xS|D]K\}}|jj|�rky|�}PWq�tk
r�d}PYq�XqkqkW|sXPqXqXW|j
S(	Ns<!--s<metas</s<!s<?s<TF(u
handleCommentu
handleMetauhandlePossibleEndTaguhandleOtheruhandlePossibleStartTagudatauTrueu
matchBytesu
StopIterationuFalseuencoding(uselfumethodDispatchubyteukeepParsingukeyumethod((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyugetEncoding�s&	

uEncodingParser.getEncodingcCs|jjd�S(uSkip over commentss-->(udataujumpTo(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu
handleComment�suEncodingParser.handleCommentcCsD|jjtkrdSd}d}x|j�}|dkrAdS|ddkr�|ddk}|r=|dk	r=||_dSq%|ddkr�|d}t|�}|dk	r=||_dSq%|ddkr%t	t
|d��}|j�}|dk	r=t|�}|dk	r:|r.||_dS|}q:q=q%q%dS(	Nis
http-equiviscontent-typescharsetscontentTF(udataucurrentByteuspaceCharactersBytesuTrueuFalseuNoneugetAttributeuencodingu	codecNameuContentAttrParseru
EncodingBytesuparse(uselfu	hasPragmaupendingEncodinguattrutentativeEncodingucodecu
contentParser((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu
handleMeta�s:	
		uEncodingParser.handleMetacCs
|jd�S(NF(uhandlePossibleTaguFalse(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyuhandlePossibleStartTag�su%EncodingParser.handlePossibleStartTagcCst|j�|jd�S(NT(unextudatauhandlePossibleTaguTrue(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyuhandlePossibleEndTag�s
u#EncodingParser.handlePossibleEndTagcCs�|j}|jtkr9|r5|j�|j�ndS|jt�}|dkra|j�n+|j�}x|dk	r�|j�}qpWdS(Ns<T(
udataucurrentByteuasciiLettersBytesupreviousuhandleOtheruTrueu	skipUntiluspacesAngleBracketsugetAttributeuNone(uselfuendTagudataucuattr((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyuhandlePossibleTag�s	


u EncodingParser.handlePossibleTagcCs|jjd�S(Ns>(udataujumpTo(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyuhandleOther�suEncodingParser.handleOthercCs�|j}|jttdg�B�}|dksIt|�dksIt�|d	krYdSg}g}x�|dkr~|r~Pnz|tkr�|j�}Pn^|d
kr�dj|�dfS|tkr�|j	|j
��n|dkr�dS|j	|�t|�}qh|dkr0|j�dj|�dfSt|�|j�}|dkr�|}x�t|�}||kr�t|�dj|�dj|�fS|tkr�|j	|j
��q[|j	|�q[n^|dkr�dj|�dfS|tkr|j	|j
��n|dkrdS|j	|�xvt|�}|t
krcdj|�dj|�fS|tkr�|j	|j
��q/|dkr�dS|j	|�q/dS(u_Return a name,value pair for the next attribute in the stream,
        if one is found, or Nones/is>s=ss's"N(s>N(s/s>(s's"(udatauskipuspaceCharactersBytesu	frozensetuNoneulenuAssertionErrorujoinuasciiUppercaseBytesuappendulowerunextuprevioususpacesAngleBrackets(uselfudataucuattrNameu	attrValueu	quoteChar((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyugetAttribute�sh	$




uEncodingParser.getAttributeN(
u__name__u
__module__u__qualname__u__doc__u__init__ugetEncodingu
handleCommentu
handleMetauhandlePossibleStartTaguhandlePossibleEndTaguhandlePossibleTaguhandleOtherugetAttribute(u
__locals__((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyuEncodingParser�s$uEncodingParsercBs,|EeZdZdd�Zdd�ZdS(uContentAttrParsercCs"t|t�st�||_dS(N(u
isinstanceubytesuAssertionErrorudata(uselfudata((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu__init__?suContentAttrParser.__init__cCsNy1|jjd�|jjd7_|jj�|jjdksHdS|jjd7_|jj�|jjdkr�|jj}|jjd7_|jj}|jj|�r�|j||jj�SdSn]|jj}y+|jjt�|j||jj�SWn#tk
r/|j|d�SYnXWntk
rIdSYnXdS(Nscharsetis=s"s'(s"s'(	udataujumpToupositionuskipucurrentByteuNoneu	skipUntiluspaceCharactersBytesu
StopIteration(uselfu	quoteMarkuoldPosition((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyuparseCs.



uContentAttrParser.parseN(u__name__u
__module__u__qualname__u__init__uparse(u
__locals__((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyuContentAttrParser>suContentAttrParsercCstt|t�r>y|jd�}Wq>tk
r:dSYq>Xn|rltjd|�j�}tj	|d�SdSdS(u{Return the python codec name corresponding to an encoding or None if the
    string doesn't correspond to a valid encoding.uasciiuN(
u
isinstanceubytesudecodeuUnicodeDecodeErroruNoneuascii_punctuation_reusubuloweru	encodingsuget(uencodingu
canonicalName((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu	codecNamees
u	codecNameT(-u
__future__uabsolute_importudivisionuunicode_literalsupip._vendor.sixu	text_typeucodecsureu	constantsuEOFuspaceCharactersuasciiLettersuasciiUppercaseu	encodingsuReparseExceptionuuutilsuiouStringIOuBytesIOuImportErroruBufferedIOBaseuobjectu	frozensetuspaceCharactersBytesuasciiLettersBytesuasciiUppercaseBytesuspacesAngleBracketsucompileuinvalid_unicode_reusetunon_bmp_invalid_codepointsuascii_punctuation_reucharsUntilRegExuBufferedStreamuNoneuTrueuHTMLInputStreamuHTMLUnicodeInputStreamuHTMLBinaryInputStreamubytesu
EncodingBytesuEncodingParseruContentAttrParseru	codecName(((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/inputstream.pyu<module>sJ"

J��g�'site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-33.pyc000064400000503222151733463620022347 0ustar00�
7�Re%�c@s�ddlmZmZmZddlmZddlZddlmZddlm	Z	ddlm
Z
ddlmZdd	lm
Z
dd
lmZddlmZmZddlmZdd
lmZddlmZmZddlmZmZmZddlmZmZddlmZdeedd�Zddeedd�Zdd�Z Gdd�de!�Z"dd�Z#dee$dd �Z%Gd!d"�d"e&�Z'dS(#i(uabsolute_importudivisionuunicode_literals(uwith_metaclassNi(uinputstream(u	tokenizer(utreebuilders(uMarker(uutils(u	constants(uspaceCharactersuasciiUpper2Lower(uspecialElements(uheadingElements(u
cdataElementsurcdataElements(u
tokenTypesuReparseExceptionu
namespaces(uhtmlIntegrationPointElementsu"mathmlTextIntegrationPointElements(uadjustForeignAttributesuetreecCs4tj|�}t|d|�}|j|d|�S(u.Parse a string or file-like object into a treeunamespaceHTMLElementsuencoding(utreebuildersugetTreeBuilderu
HTMLParseruparse(udocutreebuilderuencodingunamespaceHTMLElementsutbup((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuparsesuparseudivcCs:tj|�}t|d|�}|j|d|d|�S(NunamespaceHTMLElementsu	containeruencoding(utreebuildersugetTreeBuilderu
HTMLParseru
parseFragment(udocu	containerutreebuilderuencodingunamespaceHTMLElementsutbup((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
parseFragmentsu
parseFragmentcs G�fdd�dt�}|S(Ncs&|EeZdZ�fdd�ZdS(u-method_decorator_metaclass.<locals>.Decoratedcs^xE|j�D]7\}}t|tj�r:�|�}n|||<q
Wtj||||�S(N(uitemsu
isinstanceutypesuFunctionTypeutypeu__new__(umetau	classnameubasesu	classDictu
attributeNameu	attribute(ufunction(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__new__(s
u5method_decorator_metaclass.<locals>.Decorated.__new__N(u__name__u
__module__u__qualname__u__new__(u
__locals__(ufunction(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu	Decorated'su	Decorated(utype(ufunctionu	Decorated((ufunctionu9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyumethod_decorator_metaclass&sumethod_decorator_metaclasscBs"|EeZdZdZd&ejd'd(d'dd�Z	d'dd&d(d(dd�Z
dd�Zd	d
�Zdd�Z
d
d�Zdd�Zd&d(d(dd�Zdd&d'd(dd�Zdidd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&S()u
HTMLParseruZHTML parser. Generates a tree structure from a stream of (possibly
        malformed) HTMLcsz|�_|dkr'tjd�}n||��_|�_g�_t�fdd�t|�j	�D���_
dS(u�
        strict - raise an exception when a parse error is encountered

        tree - a treebuilder class controlling the type of tree that will be
        returned. Built in treebuilders can be accessed through
        html5lib.treebuilders.getTreeBuilder(treeType)

        tokenizer - a class that provides a stream of tokens to the treebuilder.
        This may be replaced for e.g. a sanitizer which converts some tags to
        text
        uetreecs.g|]$\}}||��j�f�qS((utree(u.0unameucls(uself(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
<listcomp>Ms	u'HTMLParser.__init__.<locals>.<listcomp>N(ustrictuNoneutreebuildersugetTreeBuilderutreeutokenizer_classuerrorsudictu	getPhasesuitemsuphases(uselfutreeu	tokenizerustrictunamespaceHTMLElementsudebug((uselfu9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__init__6s			uHTMLParser.__init__udivcKs�||_||_|j|d|d|d|d||�|_|j�x1y|j�PWqLtk
ry|j�YqLXqLdS(Nuencodingu	parseMetau
useChardetuparser(u
innerHTMLModeu	containerutokenizer_classu	tokenizeruresetumainLoopuReparseException(uselfustreamu	innerHTMLu	containeruencodingu	parseMetau
useChardetukwargs((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu_parsePs		


uHTMLParser._parsecCs|jj�d|_g|_g|_d|_|jr�|jj	�|_
|j
tkrp|jj
|j_nH|j
tkr�|jj|j_n$|j
dkr�|jj|j_n|jd|_|jj�|j�nd|_
|jd|_d|_d|_d|_dS(Nu	no quirksu	plaintextu
beforeHtmluinitialFT(utreeuresetuFalseu
firstStartTaguerrorsulogu
compatModeu
innerHTMLModeu	containeruloweru	innerHTMLu
cdataElementsu	tokenizerurcdataStateustateurcdataElementsurawtextStateuplaintextStateuphasesuphaseuinsertHtmlElementuresetInsertionModeuNoneu	lastPhaseubeforeRCDataPhaseuTrueu
framesetOK(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuresetbs*
					

			uHTMLParser.resetcCse|jdkrK|jtdkrKd|jkoJ|jdjt�dkS|j|jftkSdS(Nuannotation-xmlumathmluencodingu	text/htmluapplication/xhtml+xml(u	text/htmluapplication/xhtml+xml(unameu	namespaceu
namespacesu
attributesu	translateuasciiUpper2LoweruhtmlIntegrationPointElements(uselfuelement((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuisHTMLIntegrationPoint�s
u!HTMLParser.isHTMLIntegrationPointcCs|j|jftkS(N(u	namespaceunameu"mathmlTextIntegrationPointElements(uselfuelement((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuisMathMLTextIntegrationPoint�su'HTMLParser.isMathMLTextIntegrationPointcCs*td}td}td}td}td}td}td}x�|j�D]y}|}	x+|	dk	r�|jjr�|jjdnd}
|
r�|
jnd}|
r�|
jnd}|	d	}
|
|kr�|j|	d
|	jdi��d}	qbt	|jj�dks�||jj
ks�|j|
�rl|
|krZ|d
tddg�ks�|
||fks�|t
dkr�|dkr�|d
dks�|j|
�r�|
|||fkr�|j}n
|jd}|
|kr�|j|	�}	qb|
|kr|j|	�}	qb|
|kr/|j|	�}	qb|
|krM|j|	�}	qb|
|krk|j|	�}	qb|
|krb|j|	�}	qbqbW|
|krS|drS|drS|jdi|d
d
6�qSqSWd}g}xG|r%|j|j�|jj�}|r�|j|ks"t�q�q�WdS(Nu
CharactersuSpaceCharactersuStartTaguEndTaguCommentuDoctypeu
ParseErroriutypeudataudatavarsiunameumglyphu
malignmarkumathmluannotation-xmlusvguinForeignContentuselfClosinguselfClosingAcknowledgedu&non-void-element-with-trailing-solidusi����T(u
tokenTypesunormalizedTokensuNoneutreeuopenElementsu	namespaceunameu
parseErrorugetulenudefaultNamespaceuisMathMLTextIntegrationPointu	frozensetu
namespacesuisHTMLIntegrationPointuphaseuphasesuprocessCharactersuprocessSpaceCharactersuprocessStartTagu
processEndTaguprocessCommentuprocessDoctypeuTrueuappendu
processEOFuAssertionError(uselfuCharactersTokenuSpaceCharactersTokenu
StartTagTokenuEndTagTokenuCommentTokenuDoctypeTokenuParseErrorTokenutokenu	new_tokenucurrentNodeucurrentNodeNamespaceucurrentNodeNameutypeuphaseu	reprocessuphases((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyumainLoop�sj






"
 	
		uHTMLParser.mainLoopccs&x|jD]}|j|�Vq
WdS(N(u	tokenizerunormalizeToken(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyunormalizedTokens�suHTMLParser.normalizedTokensc
Cs2|j|ddd|d|d|�|jj�S(ufParse a HTML document into a well-formed tree

        stream - a filelike object or string containing the HTML to be parsed

        The optional encoding parameter must be a string that indicates
        the encoding.  If specified, that encoding will be used,
        regardless of any BOM or later declaration (such as in a meta
        element)
        u	innerHTMLuencodingu	parseMetau
useChardetF(u_parseuFalseutreeugetDocument(uselfustreamuencodingu	parseMetau
useChardet((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuparse�s

uHTMLParser.parsecCs)|j|dd|d|�|jj�S(u�Parse a HTML fragment into a well-formed tree fragment

        container - name of the element we're setting the innerHTML property
        if set to None, default to 'div'

        stream - a filelike object or string containing the HTML to be parsed

        The optional encoding parameter must be a string that indicates
        the encoding.  If specified, that encoding will be used,
        regardless of any BOM or later declaration (such as in a meta
        element)
        u	containeruencodingT(u_parseuTrueutreeugetFragment(uselfustreamu	containeruencodingu	parseMetau
useChardet((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
parseFragment�suHTMLParser.parseFragmentuXXX-undefined-errorcCs;|jj|jjj�||f�|jr7t�ndS(N(uerrorsuappendu	tokenizerustreamupositionustrictu
ParseError(uselfu	errorcodeudatavars((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
parseError�s%	uHTMLParser.parseErrorcCs<|dtdkr8t|dddd��|d<n|S(u3 HTML5 specific normalizations to the token stream utypeuStartTagudataNii����(u
tokenTypesudict(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyunormalizeToken�s$uHTMLParser.normalizeTokencCsbidd6}xN|j�D]@\}}||dkr|d||d|<|d|=qqWdS(Nu
definitionURLu
definitionurludata(uitems(uselfutokenureplacementsukuv((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuadjustMathMLAttributess

u!HTMLParser.adjustMathMLAttributescCsi>dd6dd6dd6dd6d	d
6dd6d
d6dd6dd6dd6dd6dd6dd6dd6dd6dd 6d!d"6d#d$6d%d&6d'd(6d)d*6d+d,6d-d.6d/d06d1d26d3d46d5d66d7d86d9d:6d;d<6d=d>6d?d@6dAdB6dCdD6dEdF6dGdH6dIdJ6dKdL6dMdN6dOdP6dQdR6dSdT6dUdV6dWdX6dYdZ6d[d\6d]d^6d_d`6dadb6dcdd6dedf6dgdh6didj6dkdl6dmdn6dodp6dqdr6dsdt6dudv6dwdx6dydz6d{d|6}xXt|d}j��D]@}||kr�||}|d}||d}|<|d}|=q�q�WdS(~Nu
attributeNameu
attributenameu
attributeTypeu
attributetypeu
baseFrequencyu
basefrequencyubaseProfileubaseprofileucalcModeucalcmodeu
clipPathUnitsu
clippathunitsucontentScriptTypeucontentscripttypeucontentStyleTypeucontentstyletypeudiffuseConstantudiffuseconstantuedgeModeuedgemodeuexternalResourcesRequireduexternalresourcesrequiredu	filterResu	filterresufilterUnitsufilterunitsuglyphRefuglyphrefugradientTransformugradienttransformu
gradientUnitsu
gradientunitsukernelMatrixukernelmatrixukernelUnitLengthukernelunitlengthu	keyPointsu	keypointsu
keySplinesu
keysplinesukeyTimesukeytimesulengthAdjustulengthadjustulimitingConeAngleulimitingconeangleumarkerHeightumarkerheightumarkerUnitsumarkerunitsumarkerWidthumarkerwidthumaskContentUnitsumaskcontentunitsu	maskUnitsu	maskunitsu
numOctavesu
numoctavesu
pathLengthu
pathlengthupatternContentUnitsupatterncontentunitsupatternTransformupatterntransformupatternUnitsupatternunitsu	pointsAtXu	pointsatxu	pointsAtYu	pointsatyu	pointsAtZu	pointsatzu
preserveAlphau
preservealphaupreserveAspectRatioupreserveaspectratiouprimitiveUnitsuprimitiveunitsurefXurefxurefYurefyurepeatCounturepeatcountu	repeatDuru	repeatdururequiredExtensionsurequiredextensionsurequiredFeaturesurequiredfeaturesuspecularConstantuspecularconstantuspecularExponentuspecularexponentuspreadMethoduspreadmethodustartOffsetustartoffsetustdDeviationustddeviationustitchTilesustitchtilesusurfaceScaleusurfacescaleusystemLanguageusystemlanguageutableValuesutablevaluesutargetXutargetxutargetYutargetyu
textLengthu
textlengthuviewBoxuviewboxu
viewTargetu
viewtargetuxChannelSelectoruxchannelselectoruyChannelSelectoruychannelselectoru
zoomAndPanu
zoomandpanudata(ulistukeys(uselfutokenureplacementsuoriginalNameusvgName((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuadjustSVGAttributes	s�

uHTMLParser.adjustSVGAttributescCs_t}xR|dj�D]@}||kr||}|d||d|<|d|=qqWdS(Nudata(uadjustForeignAttributesMapukeys(uselfutokenureplacementsuoriginalNameuforeignName((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuadjustForeignAttributesPs
u"HTMLParser.adjustForeignAttributescCs|jj�dS(N(uparseruphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyureparseTokenNormalYsuHTMLParser.reparseTokenNormalcCs]d}idd6dd6dd6dd6dd	6dd
6dd6dd
6dd6dd6dd6dd6dd6dd6}x�|jjddd�D]�}|j}d}||jjdkr�|js�t�d}|j}n|dkr�|js�t�n|r|j|jj	krq�n||kr5|j
||}Pq�|r�|j
d}Pq�q�W||_dS(NuinSelectuselectuinCellutduthuinRowutruinTableBodyutbodyutheadutfootu	inCaptionucaptionu
inColumnGroupucolgroupuinTableutableuinBodyuheadubodyu
inFramesetuframesetu
beforeHeaduhtmliiFi����T(uselectucolgroupuheaduhtml(uFalseutreeuopenElementsunameuNoneu	innerHTMLuAssertionErroruTrueu	namespaceudefaultNamespaceuphasesuphase(uselfulastunewModesunodeunodeNameu	new_phase((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuresetInsertionMode\sD
 	
uHTMLParser.resetInsertionModecCsu|dkst�|jj|�|dkrC|jj|j_n|jj|j_|j|_|j	d|_dS(uYGeneric RCDATA/RAWTEXT Parsing algorithm
        contentType - RCDATA or RAWTEXT
        uRAWTEXTuRCDATAutextN(uRAWTEXTuRCDATA(
uAssertionErrorutreeu
insertElementu	tokenizerurawtextStateustateurcdataStateuphaseu
originalPhaseuphases(uselfutokenucontentType((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuparseRCDataRawtext�suHTMLParser.parseRCDataRawtextNFT(u__name__u
__module__u__qualname__u__doc__uNoneu	tokenizeru
HTMLTokenizeruFalseuTrueu__init__u_parseuresetuisHTMLIntegrationPointuisMathMLTextIntegrationPointumainLoopunormalizedTokensuparseu
parseFragmentu
parseErrorunormalizeTokenuadjustMathMLAttributesuadjustSVGAttributesuadjustForeignAttributesureparseTokenNormaluresetInsertionModeuparseRCDataRawtext(u
__locals__((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
HTMLParser2s*	"
@G	,u
HTMLParsercs7dd�}dd�}Gdd�dt|||����Gdd�d��}Gd	d
�d
��}G�fdd�d��}G�fd
d�d��}G�fdd�d��}G�fdd�d��}G�fdd�d��}	G�fdd�d��}
G�fdd�d��}G�fdd�d��}G�fdd�d��}
G�fdd�d��}G�fdd �d ��}G�fd!d"�d"��}G�fd#d$�d$��}G�fd%d&�d&��}G�fd'd(�d(��}G�fd)d*�d*��}G�fd+d,�d,��}G�fd-d.�d.��}G�fd/d0�d0��}G�fd1d2�d2��}i|d36|d46|d56|d66|d76|d86|	d96|
d:6|d;6|d<6|
d=6|d>6|d?6|d@6|dA6|dB6|dC6|dD6|dE6|dF6|dG6|dH6S(INcs;tdd�tjj�D�����fdd�}|S(u4Logger that records which phase processes each tokencss!|]\}}||fVqdS(N((u.0ukeyuvalue((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu	<genexpr>�su)getPhases.<locals>.log.<locals>.<genexpr>c
s��jjd�r�t|�dkr�|d}yi�|dd6}Wn�YnX|dtjkry|d|d<n|jjj|jjj	j|jj
jj|jj�j|f��|||�S�|||�SdS(Nuprocessiutypeuname(u__name__u
startswithulenu	constantsu
tagTokenTypesuparseruloguappendu	tokenizerustateuphaseu	__class__(uselfuargsukwargsutokenuinfo(ufunctionu
type_names(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuwrapped�s$
	
u'getPhases.<locals>.log.<locals>.wrapped(udictu	constantsu
tokenTypesuitems(ufunctionuwrapped((ufunctionu
type_namesu9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyulog�sugetPhases.<locals>.logcSs|rt|�StSdS(N(umethod_decorator_metaclassutype(u
use_metaclassumetaclass_func((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyugetMetaclass�s
ugetPhases.<locals>.getMetaclasscBs�|EeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�ZdS(ugetPhases.<locals>.PhaseuNBase class for helper object that implements each phase of processing
        cSs||_||_dS(N(uparserutree(uselfuparserutree((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__init__�s	u!getPhases.<locals>.Phase.__init__cSs
t�dS(N(uNotImplementedError(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEOF�su#getPhases.<locals>.Phase.processEOFcSs!|jj||jjd�dS(Nii����(utreeu
insertCommentuopenElements(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessComment�su'getPhases.<locals>.Phase.processCommentcSs|jjd�dS(Nuunexpected-doctype(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessDoctype�su'getPhases.<locals>.Phase.processDoctypecSs|jj|d�dS(Nudata(utreeu
insertText(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharacters�su*getPhases.<locals>.Phase.processCharacterscSs|jj|d�dS(Nudata(utreeu
insertText(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessSpaceCharacters�su/getPhases.<locals>.Phase.processSpaceCharacterscSs|j|d|�S(Nuname(ustartTagHandler(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessStartTag�su(getPhases.<locals>.Phase.processStartTagcSs�|jjr0|ddkr0|jjd�nxQ|dj�D]?\}}||jjdjkrA||jjdj|<qAqAWd|j_dS(Nunameuhtmlu
non-html-rootudataiF(uparseru
firstStartTagu
parseErroruitemsutreeuopenElementsu
attributesuFalse(uselfutokenuattruvalue((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagHtml�su%getPhases.<locals>.Phase.startTagHtmlcSs|j|d|�S(Nuname(u
endTagHandler(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEndTag�su&getPhases.<locals>.Phase.processEndTagN(
u__name__u
__module__u__qualname__u__doc__u__init__u
processEOFuprocessCommentuprocessDoctypeuprocessCharactersuprocessSpaceCharactersuprocessStartTagustartTagHtmlu
processEndTag(u
__locals__((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuPhase�s
uPhasecBst|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS(ugetPhases.<locals>.InitialPhasecSsdS(N((uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessSpaceCharacters�su6getPhases.<locals>.InitialPhase.processSpaceCharacterscSs|jj||jj�dS(N(utreeu
insertCommentudocument(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessComment�su.getPhases.<locals>.InitialPhase.processCommentc=Ssu|d}|d}|d}|d}|dksX|dk	sX|dk	rk|dkrk|jjd�n|dkr�d}n|jj|�|dkr�|jt�}n|s|ddks|jdJ�s|dKks|jdL�r�|dks|r"|j�dDkr"dE|j_	n9|jdM�sL|jdN�r[|dk	r[dH|j_	n|jj
dI|j_dS(ONunameupublicIdusystemIducorrectuhtmluabout:legacy-compatuunknown-doctypeuu*+//silmaril//dtd html pro v0r11 19970101//u4-//advasoft ltd//dtd html 3.0 aswedit + extensions//u*-//as//dtd html 3.0 aswedit + extensions//u-//ietf//dtd html 2.0 level 1//u-//ietf//dtd html 2.0 level 2//u&-//ietf//dtd html 2.0 strict level 1//u&-//ietf//dtd html 2.0 strict level 2//u-//ietf//dtd html 2.0 strict//u-//ietf//dtd html 2.0//u-//ietf//dtd html 2.1e//u-//ietf//dtd html 3.0//u-//ietf//dtd html 3.2 final//u-//ietf//dtd html 3.2//u-//ietf//dtd html 3//u-//ietf//dtd html level 0//u-//ietf//dtd html level 1//u-//ietf//dtd html level 2//u-//ietf//dtd html level 3//u"-//ietf//dtd html strict level 0//u"-//ietf//dtd html strict level 1//u"-//ietf//dtd html strict level 2//u"-//ietf//dtd html strict level 3//u-//ietf//dtd html strict//u-//ietf//dtd html//u(-//metrius//dtd metrius presentational//u5-//microsoft//dtd internet explorer 2.0 html strict//u.-//microsoft//dtd internet explorer 2.0 html//u0-//microsoft//dtd internet explorer 2.0 tables//u5-//microsoft//dtd internet explorer 3.0 html strict//u.-//microsoft//dtd internet explorer 3.0 html//u0-//microsoft//dtd internet explorer 3.0 tables//u#-//netscape comm. corp.//dtd html//u*-//netscape comm. corp.//dtd strict html//u*-//o'reilly and associates//dtd html 2.0//u3-//o'reilly and associates//dtd html extended 1.0//u;-//o'reilly and associates//dtd html extended relaxed 1.0//uN-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//uE-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//u$-//spyglass//dtd html 2.0 extended//u+-//sq//dtd html 2.0 hotmetal + extensions//u--//sun microsystems corp.//dtd hotjava html//u4-//sun microsystems corp.//dtd hotjava strict html//u-//w3c//dtd html 3 1995-03-24//u-//w3c//dtd html 3.2 draft//u-//w3c//dtd html 3.2 final//u-//w3c//dtd html 3.2//u-//w3c//dtd html 3.2s draft//u-//w3c//dtd html 4.0 frameset//u#-//w3c//dtd html 4.0 transitional//u(-//w3c//dtd html experimental 19960712//u&-//w3c//dtd html experimental 970421//u-//w3c//dtd w3 html//u-//w3o//dtd w3 html 3.0//u#-//webtechs//dtd mozilla html 2.0//u-//webtechs//dtd mozilla html//u$-//w3o//dtd w3 html strict 3.0//en//u"-/w3c/dtd html 4.0 transitional/enu -//w3c//dtd html 4.01 frameset//u$-//w3c//dtd html 4.01 transitional//u:http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtduquirksu -//w3c//dtd xhtml 1.0 frameset//u$-//w3c//dtd xhtml 1.0 transitional//ulimited quirksu
beforeHtml(7u*+//silmaril//dtd html pro v0r11 19970101//u4-//advasoft ltd//dtd html 3.0 aswedit + extensions//u*-//as//dtd html 3.0 aswedit + extensions//u-//ietf//dtd html 2.0 level 1//u-//ietf//dtd html 2.0 level 2//u&-//ietf//dtd html 2.0 strict level 1//u&-//ietf//dtd html 2.0 strict level 2//u-//ietf//dtd html 2.0 strict//u-//ietf//dtd html 2.0//u-//ietf//dtd html 2.1e//u-//ietf//dtd html 3.0//u-//ietf//dtd html 3.2 final//u-//ietf//dtd html 3.2//u-//ietf//dtd html 3//u-//ietf//dtd html level 0//u-//ietf//dtd html level 1//u-//ietf//dtd html level 2//u-//ietf//dtd html level 3//u"-//ietf//dtd html strict level 0//u"-//ietf//dtd html strict level 1//u"-//ietf//dtd html strict level 2//u"-//ietf//dtd html strict level 3//u-//ietf//dtd html strict//u-//ietf//dtd html//u(-//metrius//dtd metrius presentational//u5-//microsoft//dtd internet explorer 2.0 html strict//u.-//microsoft//dtd internet explorer 2.0 html//u0-//microsoft//dtd internet explorer 2.0 tables//u5-//microsoft//dtd internet explorer 3.0 html strict//u.-//microsoft//dtd internet explorer 3.0 html//u0-//microsoft//dtd internet explorer 3.0 tables//u#-//netscape comm. corp.//dtd html//u*-//netscape comm. corp.//dtd strict html//u*-//o'reilly and associates//dtd html 2.0//u3-//o'reilly and associates//dtd html extended 1.0//u;-//o'reilly and associates//dtd html extended relaxed 1.0//uN-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//uE-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//u$-//spyglass//dtd html 2.0 extended//u+-//sq//dtd html 2.0 hotmetal + extensions//u--//sun microsystems corp.//dtd hotjava html//u4-//sun microsystems corp.//dtd hotjava strict html//u-//w3c//dtd html 3 1995-03-24//u-//w3c//dtd html 3.2 draft//u-//w3c//dtd html 3.2 final//u-//w3c//dtd html 3.2//u-//w3c//dtd html 3.2s draft//u-//w3c//dtd html 4.0 frameset//u#-//w3c//dtd html 4.0 transitional//u(-//w3c//dtd html experimental 19960712//u&-//w3c//dtd html experimental 970421//u-//w3c//dtd w3 html//u-//w3o//dtd w3 html 3.0//u#-//webtechs//dtd mozilla html 2.0//u-//webtechs//dtd mozilla html//(u$-//w3o//dtd w3 html strict 3.0//en//u"-/w3c/dtd html 4.0 transitional/enuhtml(u -//w3c//dtd html 4.01 frameset//u$-//w3c//dtd html 4.01 transitional//(u -//w3c//dtd xhtml 1.0 frameset//u$-//w3c//dtd xhtml 1.0 transitional//(u -//w3c//dtd html 4.01 frameset//u$-//w3c//dtd html 4.01 transitional//(uNoneuparseru
parseErrorutreeu
insertDoctypeu	translateuasciiUpper2Loweru
startswithuloweru
compatModeuphasesuphase(uselfutokenunameupublicIdusystemIducorrect((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessDoctype�s�



						u.getPhases.<locals>.InitialPhase.processDoctypecSs&d|j_|jjd|j_dS(Nuquirksu
beforeHtml(uparseru
compatModeuphasesuphase(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuanythingElseJsu,getPhases.<locals>.InitialPhase.anythingElsecSs|jjd�|j�|S(Nuexpected-doctype-but-got-chars(uparseru
parseErroruanythingElse(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharactersNs
u1getPhases.<locals>.InitialPhase.processCharacterscSs,|jjdi|dd6�|j�|S(Nu"expected-doctype-but-got-start-taguname(uparseru
parseErroruanythingElse(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessStartTagSs
u/getPhases.<locals>.InitialPhase.processStartTagcSs,|jjdi|dd6�|j�|S(Nu expected-doctype-but-got-end-taguname(uparseru
parseErroruanythingElse(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEndTagYs
u-getPhases.<locals>.InitialPhase.processEndTagcSs|jjd�|j�dS(Nuexpected-doctype-but-got-eofT(uparseru
parseErroruanythingElseuTrue(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEOF_s
u*getPhases.<locals>.InitialPhase.processEOFN(u__name__u
__module__u__qualname__uprocessSpaceCharactersuprocessCommentuprocessDoctypeuanythingElseuprocessCharactersuprocessStartTagu
processEndTagu
processEOF(u
__locals__((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuInitialPhase�s`uInitialPhasecBsh|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dS(u"getPhases.<locals>.BeforeHtmlPhasecSs3|jjtdd��|jjd|j_dS(NuhtmluStartTagu
beforeHead(utreeu
insertRootuimpliedTagTokenuparseruphasesuphase(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuinsertHtmlElementfsu4getPhases.<locals>.BeforeHtmlPhase.insertHtmlElementcSs|j�dS(NT(uinsertHtmlElementuTrue(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEOFks
u-getPhases.<locals>.BeforeHtmlPhase.processEOFcSs|jj||jj�dS(N(utreeu
insertCommentudocument(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCommentosu1getPhases.<locals>.BeforeHtmlPhase.processCommentcSsdS(N((uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessSpaceCharactersrsu9getPhases.<locals>.BeforeHtmlPhase.processSpaceCharacterscSs|j�|S(N(uinsertHtmlElement(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharactersus
u4getPhases.<locals>.BeforeHtmlPhase.processCharacterscSs-|ddkrd|j_n|j�|S(NunameuhtmlT(uTrueuparseru
firstStartTaguinsertHtmlElement(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessStartTagys
u2getPhases.<locals>.BeforeHtmlPhase.processStartTagcSsC|ddkr1|jjdi|dd6�n|j�|SdS(Nunameuheadubodyuhtmlubruunexpected-end-tag-before-html(uheadubodyuhtmlubr(uparseru
parseErroruinsertHtmlElement(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEndTags

u0getPhases.<locals>.BeforeHtmlPhase.processEndTagN(
u__name__u
__module__u__qualname__uinsertHtmlElementu
processEOFuprocessCommentuprocessSpaceCharactersuprocessCharactersuprocessStartTagu
processEndTag(u
__locals__((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuBeforeHtmlPhasedsuBeforeHtmlPhasecs�|EeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�ZdS(u"getPhases.<locals>.BeforeHeadPhasecs}�j|||�tjd|jfd|jfg�|_|j|j_tjd|jfg�|_	|j
|j	_dS(Nuhtmluheadubodyubr(uheadubodyuhtmlubr(u__init__uutilsuMethodDispatcherustartTagHtmlustartTagHeadustartTagHandleru
startTagOtherudefaultuendTagImplyHeadu
endTagHandleruendTagOther(uselfuparserutree(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__init__�su+getPhases.<locals>.BeforeHeadPhase.__init__cSs|jtdd��dS(NuheaduStartTagT(ustartTagHeaduimpliedTagTokenuTrue(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEOF�su-getPhases.<locals>.BeforeHeadPhase.processEOFcSsdS(N((uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessSpaceCharacters�su9getPhases.<locals>.BeforeHeadPhase.processSpaceCharacterscSs|jtdd��|S(NuheaduStartTag(ustartTagHeaduimpliedTagToken(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharacters�su4getPhases.<locals>.BeforeHeadPhase.processCharacterscSs|jjdj|�S(NuinBody(uparseruphasesuprocessStartTag(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagHtml�su/getPhases.<locals>.BeforeHeadPhase.startTagHtmlcSs@|jj|�|jjd|j_|jjd|j_dS(NiuinHeadi����(utreeu
insertElementuopenElementsuheadPointeruparseruphasesuphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagHead�su/getPhases.<locals>.BeforeHeadPhase.startTagHeadcSs|jtdd��|S(NuheaduStartTag(ustartTagHeaduimpliedTagToken(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagOther�su0getPhases.<locals>.BeforeHeadPhase.startTagOthercSs|jtdd��|S(NuheaduStartTag(ustartTagHeaduimpliedTagToken(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagImplyHead�su2getPhases.<locals>.BeforeHeadPhase.endTagImplyHeadcSs"|jjdi|dd6�dS(Nuend-tag-after-implied-rootuname(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagOther�su.getPhases.<locals>.BeforeHeadPhase.endTagOtherN(u__name__u
__module__u__qualname__u__init__u
processEOFuprocessSpaceCharactersuprocessCharactersustartTagHtmlustartTagHeadu
startTagOtheruendTagImplyHeaduendTagOther(u
__locals__(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuBeforeHeadPhase�suBeforeHeadPhasecs�|EeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�ZdS( ugetPhases.<locals>.InHeadPhasec
s��j|||�tjd|jfd|jfd|jfd|jfd|jfd|jfd
|j	fg�|_
|j|j
_tjd
|j
fd|jfg�|_|j|j_dS(Nuhtmlutitleunoscriptunoframesustyleuscriptubaseubasefontubgsounducommandulinkumetauheadubrubody(unoscriptunoframesustyle(ubaseubasefontubgsounducommandulink(ubruhtmlubody(u__init__uutilsuMethodDispatcherustartTagHtmlu
startTagTitleustartTagNoScriptNoFramesStyleustartTagScriptustartTagBaseLinkCommandustartTagMetaustartTagHeadustartTagHandleru
startTagOtherudefaultu
endTagHeaduendTagHtmlBodyBru
endTagHandleruendTagOther(uselfuparserutree(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__init__�s	u'getPhases.<locals>.InHeadPhase.__init__cSs|j�dS(NT(uanythingElseuTrue(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEOF�s
u)getPhases.<locals>.InHeadPhase.processEOFcSs|j�|S(N(uanythingElse(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharacters�s
u0getPhases.<locals>.InHeadPhase.processCharacterscSs|jjdj|�S(NuinBody(uparseruphasesuprocessStartTag(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagHtml�su+getPhases.<locals>.InHeadPhase.startTagHtmlcSs|jjd�dS(Nu!two-heads-are-not-better-than-one(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagHead�su+getPhases.<locals>.InHeadPhase.startTagHeadcSs.|jj|�|jjj�d|d<dS(NuselfClosingAcknowledgedT(utreeu
insertElementuopenElementsupopuTrue(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagBaseLinkCommand�su6getPhases.<locals>.InHeadPhase.startTagBaseLinkCommandcSs�|jj|�|jjj�d
|d<|d}|jjjjddkr�d|kry|jjjj	|d�q�d|kr�d|kr�|dj
�dkr�tj|dj
d	��}tj|�}|j�}|jjjj	|�q�ndS(NuselfClosingAcknowledgedudataiu	tentativeucharsetucontentu
http-equivucontent-typeuutf-8T(utreeu
insertElementuopenElementsupopuTrueuparseru	tokenizerustreamucharEncodinguchangeEncodinguloweruinputstreamu
EncodingBytesuencodeuContentAttrParseruparse(uselfutokenu
attributesudatauparserucodec((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagMeta�s

u+getPhases.<locals>.InHeadPhase.startTagMetacSs|jj|d�dS(NuRCDATA(uparseruparseRCDataRawtext(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagTitle�su,getPhases.<locals>.InHeadPhase.startTagTitlecSs|jj|d�dS(NuRAWTEXT(uparseruparseRCDataRawtext(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagNoScriptNoFramesStyle�su<getPhases.<locals>.InHeadPhase.startTagNoScriptNoFramesStylecSsT|jj|�|jjj|jj_|jj|j_|jjd|j_dS(Nutext(	utreeu
insertElementuparseru	tokenizeruscriptDataStateustateuphaseu
originalPhaseuphases(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagScript�su-getPhases.<locals>.InHeadPhase.startTagScriptcSs|j�|S(N(uanythingElse(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagOthers
u,getPhases.<locals>.InHeadPhase.startTagOthercSsQ|jjjj�}|jdks7td|j��|jjd|j_dS(NuheaduExpected head got %su	afterHead(uparserutreeuopenElementsupopunameuAssertionErroruphasesuphase(uselfutokenunode((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
endTagHeads"u)getPhases.<locals>.InHeadPhase.endTagHeadcSs|j�|S(N(uanythingElse(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagHtmlBodyBr
s
u/getPhases.<locals>.InHeadPhase.endTagHtmlBodyBrcSs"|jjdi|dd6�dS(Nuunexpected-end-taguname(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagOthersu*getPhases.<locals>.InHeadPhase.endTagOthercSs|jtd��dS(Nuhead(u
endTagHeaduimpliedTagToken(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuanythingElsesu+getPhases.<locals>.InHeadPhase.anythingElseN(u__name__u
__module__u__qualname__u__init__u
processEOFuprocessCharactersustartTagHtmlustartTagHeadustartTagBaseLinkCommandustartTagMetau
startTagTitleustartTagNoScriptNoFramesStyleustartTagScriptu
startTagOtheru
endTagHeaduendTagHtmlBodyBruendTagOtheruanythingElse(u
__locals__(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuInHeadPhase�suInHeadPhasecs�|EeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�ZdS(u!getPhases.<locals>.AfterHeadPhasec
s��j|||�tjd|jfd|jfd|jfd|jfd
|jfg�|_|j	|j_
tjd|jfg�|_|j
|j_
dS(Nuhtmlubodyuframesetubaseubasefontubgsoundulinkumetaunoframesuscriptustyleutitleuheadubr(	ubaseubasefontubgsoundulinkumetaunoframesuscriptustyleutitle(ubodyuhtmlubr(u__init__uutilsuMethodDispatcherustartTagHtmlustartTagBodyustartTagFramesetustartTagFromHeadustartTagHeadustartTagHandleru
startTagOtherudefaultuendTagHtmlBodyBru
endTagHandleruendTagOther(uselfuparserutree(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__init__s		u*getPhases.<locals>.AfterHeadPhase.__init__cSs|j�dS(NT(uanythingElseuTrue(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEOF*s
u,getPhases.<locals>.AfterHeadPhase.processEOFcSs|j�|S(N(uanythingElse(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharacters.s
u3getPhases.<locals>.AfterHeadPhase.processCharacterscSs|jjdj|�S(NuinBody(uparseruphasesuprocessStartTag(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagHtml2su.getPhases.<locals>.AfterHeadPhase.startTagHtmlcSs6d|j_|jj|�|jjd|j_dS(NuinBodyF(uFalseuparseru
framesetOKutreeu
insertElementuphasesuphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagBody5su.getPhases.<locals>.AfterHeadPhase.startTagBodycSs*|jj|�|jjd|j_dS(Nu
inFrameset(utreeu
insertElementuparseruphasesuphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagFrameset:su2getPhases.<locals>.AfterHeadPhase.startTagFramesetcSs�|jjdi|dd6�|jjj|jj�|jjdj|�xG|jjddd�D],}|jdkrh|jjj	|�PqhqhWdS(Nu#unexpected-start-tag-out-of-my-headunameuinHeadiuheadi����(
uparseru
parseErrorutreeuopenElementsuappenduheadPointeruphasesuprocessStartTagunameuremove(uselfutokenunode((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagFromHead>s u2getPhases.<locals>.AfterHeadPhase.startTagFromHeadcSs"|jjdi|dd6�dS(Nuunexpected-start-taguname(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagHeadHsu.getPhases.<locals>.AfterHeadPhase.startTagHeadcSs|j�|S(N(uanythingElse(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagOtherKs
u/getPhases.<locals>.AfterHeadPhase.startTagOthercSs|j�|S(N(uanythingElse(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagHtmlBodyBrOs
u2getPhases.<locals>.AfterHeadPhase.endTagHtmlBodyBrcSs"|jjdi|dd6�dS(Nuunexpected-end-taguname(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagOtherSsu-getPhases.<locals>.AfterHeadPhase.endTagOthercSs?|jjtdd��|jjd|j_d|j_dS(NubodyuStartTaguinBodyT(utreeu
insertElementuimpliedTagTokenuparseruphasesuphaseuTrueu
framesetOK(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuanythingElseVsu.getPhases.<locals>.AfterHeadPhase.anythingElseN(u__name__u
__module__u__qualname__u__init__u
processEOFuprocessCharactersustartTagHtmlustartTagBodyustartTagFramesetustartTagFromHeadustartTagHeadu
startTagOtheruendTagHtmlBodyBruendTagOtheruanythingElse(u
__locals__(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuAfterHeadPhases
uAfterHeadPhasecsr|EeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zd;d<�Z d=d>�Z!d?d@�Z"dAdB�Z#dCdD�Z$dEdF�Z%dGdH�Z&dIdJ�Z'dKdL�Z(dMdN�Z)dOdP�Z*dQdR�Z+dSdT�Z,dUdV�Z-dWdX�Z.dYdZ�Z/d[d\�Z0d]d^�Z1d_d`�Z2dadb�Z3dcdd�Z4deS(fugetPhases.<locals>.InBodyPhasec+s]�j|||�|j|_tjd|jfdd|jfd|jfd
|jfde|j	ft
|jfdf|jfd'|j
fdg|jfd+|jfd,|jfdh|jfd9|jfd:|jfdi|jfd>|jfd?|jfdj|jfdk|jfdI|jfdJ|jfdK|jfdL|jfdM|jfdN|jfdl|jfdQ|j fdm|j!fdn|j"fdV|j#fdW|j$fdo|j%fg �|_&|j'|j&_(tjd|j)fd|j*fdp|j+fd'|j,fd!|j-fdq|j.ft
|j/fdr|j0fds|j1fdA|j2fg
�|_3|j4|j3_(dS(tNuhtmlubaseubasefontubgsounducommandulinkumetaunoframesuscriptustyleutitleubodyuframesetuaddressuarticleuasideu
blockquoteucenterudetailsudirudivudlufieldsetu
figcaptionufigureufooteruheaderuhgroupumainumenuunavuolupusectionusummaryuulupreulistinguformuliuddudtu	plaintextuaububigucodeuemufontuiususmallustrikeustronguttuuunobrubuttonuappletumarqueeuobjectuxmputableuareaubruembeduimgukeygenuwbruparamusourceutrackuinputuhruimageuisindexutextareauiframeunoembedunoscriptuselecturpurtuoptionuoptgroupumathusvgucaptionucolucolgroupuframeuheadutbodyutdutfootuthutheadutrudialog(
ubaseubasefontubgsounducommandulinkumetaunoframesuscriptustyleutitle(uaddressuarticleuasideu
blockquoteucenterudetailsudetailsudirudivudlufieldsetu
figcaptionufigureufooteruheaderuhgroupumainumenuunavuolupusectionusummaryuul(upreulisting(uliuddudt(ububigucodeuemufontuiususmallustrikeustronguttuu(uappletumarqueeuobject(uareaubruembeduimgukeygenuwbr(uparamusourceutrack(unoembedunoframesunoscript(urpurt(uoptionuoptgroup(ucaptionucolucolgroupuframeuheadutbodyutdutfootuthutheadutr(uaddressuarticleuasideu
blockquoteubuttonucenterudetailsudialogudirudivudlufieldsetu
figcaptionufigureufooteruheaderuhgroupulistingumainumenuunavuolupreusectionusummaryuul(uddudtuli(uaububigucodeuemufontuiunobrususmallustrikeustronguttuu(uappletumarqueeuobject(5u__init__uprocessSpaceCharactersuprocessSpaceCharactersNonPreuutilsuMethodDispatcherustartTagHtmlustartTagProcessInHeadustartTagBodyustartTagFramesetustartTagClosePuheadingElementsustartTagHeadingustartTagPreListingustartTagFormustartTagListItemustartTagPlaintextu	startTagAustartTagFormattingustartTagNobrustartTagButtonustartTagAppletMarqueeObjectustartTagXmpu
startTagTableustartTagVoidFormattingustartTagParamSourceu
startTagInputu
startTagHru
startTagImageustartTagIsIndexustartTagTextareaustartTagIFrameustartTagRawtextustartTagSelectustartTagRpRtustartTagOptustartTagMathustartTagSvgustartTagMisplacedustartTagHandleru
startTagOtherudefaultu
endTagBodyu
endTagHtmluendTagBlocku
endTagFormuendTagPuendTagListItemu
endTagHeadinguendTagFormattinguendTagAppletMarqueeObjectuendTagBru
endTagHandleruendTagOther(uselfuparserutree(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__init__^s|			u'getPhases.<locals>.InBodyPhase.__init__cSs�|j|jks$|j|jkr(dSt|j�t|j�krJdSt|jj��}t|jj��}x-t||�D]\}}||kr�dSq�WdS(NFT(	unameu	namespaceuFalseulenu
attributesusorteduitemsuzipuTrue(uselfunode1unode2uattributes1uattributes2uattr1uattr2((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuisMatchingFormattingElement�s$u:getPhases.<locals>.InBodyPhase.isMatchingFormattingElementcSs�|jj|�|jjd}g}xS|jjddd�D]8}|tkrVPq@|j||�r@|j|�q@q@Wt|�dks�t�t|�dkr�|jjj	|d�n|jjj|�dS(Niii����i����i����(
utreeu
insertElementuopenElementsuactiveFormattingElementsuMarkeruisMatchingFormattingElementuappendulenuAssertionErroruremove(uselfutokenuelementumatchingElementsunode((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuaddFormattingElement�s u3getPhases.<locals>.InBodyPhase.addFormattingElementc
SsWtd�}xD|jjddd�D])}|j|kr&|jjd�Pq&q&WdS(Nuddudtuliuputbodyutdutfootuthutheadutrubodyuhtmliu expected-closing-tag-but-got-eof(uddudtuliuputbodyutdutfootuthutheadutrubodyuhtmli����(u	frozensetutreeuopenElementsunameuparseru
parseError(uselfuallowed_elementsunode((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEOF�s	 u)getPhases.<locals>.InBodyPhase.processEOFcSs�|d}|j|_|jd�rh|jjdjdkrh|jjd	j�rh|dd�}n|r�|jj�|jj|�ndS(
Nudatau
iupreulistingutextareai����(upreulistingutextareai����(	uprocessSpaceCharactersNonPreuprocessSpaceCharactersu
startswithutreeuopenElementsunameu
hasContentu#reconstructActiveFormattingElementsu
insertText(uselfutokenudata((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu!processSpaceCharactersDropNewline�s

u@getPhases.<locals>.InBodyPhase.processSpaceCharactersDropNewlinecSsq|ddkrdS|jj�|jj|d�|jjrmtdd�|dD��rmd|j_ndS(NudataucSsg|]}|tk�qS((uspaceCharacters(u.0uchar((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
<listcomp>�s	uDgetPhases.<locals>.InBodyPhase.processCharacters.<locals>.<listcomp>F(utreeu#reconstructActiveFormattingElementsu
insertTextuparseru
framesetOKuanyuFalse(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharacters�s
u0getPhases.<locals>.InBodyPhase.processCharacterscSs%|jj�|jj|d�dS(Nudata(utreeu#reconstructActiveFormattingElementsu
insertText(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessSpaceCharacters�s
u5getPhases.<locals>.InBodyPhase.processSpaceCharacterscSs|jjdj|�S(NuinHead(uparseruphasesuprocessStartTag(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagProcessInHead�su4getPhases.<locals>.InBodyPhase.startTagProcessInHeadcSs�|jjdidd6�t|jj�dksK|jjdjdkr`|jjs�t�n`d|j_	xQ|dj
�D]?\}}||jjdjkr}||jjdj|<q}q}WdS(Nuunexpected-start-tagubodyunameiudataF(uparseru
parseErrorulenutreeuopenElementsunameu	innerHTMLuAssertionErroruFalseu
framesetOKuitemsu
attributes(uselfutokenuattruvalue((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagBody�su+getPhases.<locals>.InBodyPhase.startTagBodycSs|jjdidd6�t|jj�dksK|jjdjdkr`|jjs�t�n�|jjson�|jjdj	r�|jjdj	j
|jjd�nx-|jjdjdkr�|jjj�q�W|jj|�|jj
d|j_dS(	Nuunexpected-start-taguframesetunameiubodyuhtmlu
inFrameseti����(uparseru
parseErrorulenutreeuopenElementsunameu	innerHTMLuAssertionErroru
framesetOKuparenturemoveChildupopu
insertElementuphasesuphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagFrameset�s1'u/getPhases.<locals>.InBodyPhase.startTagFramesetcSsB|jjddd�r.|jtd��n|jj|�dS(Nupuvariantubutton(utreeuelementInScopeuendTagPuimpliedTagTokenu
insertElement(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagClosePsu-getPhases.<locals>.InBodyPhase.startTagClosePcSsZ|jjddd�r.|jtd��n|jj|�d|j_|j|_	dS(NupuvariantubuttonF(
utreeuelementInScopeuendTagPuimpliedTagTokenu
insertElementuFalseuparseru
framesetOKu!processSpaceCharactersDropNewlineuprocessSpaceCharacters(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagPreListings
u1getPhases.<locals>.InBodyPhase.startTagPreListingcSs�|jjr)|jjdidd6�nT|jjddd�rW|jtd��n|jj|�|jjd|j_dS(	Nuunexpected-start-taguformunameupuvariantubuttonii����(	utreeuformPointeruparseru
parseErroruelementInScopeuendTagPuimpliedTagTokenu
insertElementuopenElements(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagFormsu+getPhases.<locals>.InBodyPhase.startTagFormcSsd|j_idgd6ddgd6ddgd6}||d}xnt|jj�D]Z}|j|kr�|jjjt	|jd��Pn|j
tkrW|jdkrWPqWqWW|jjdd	d
�r�|jjjt	dd��n|jj
|�dS(
NuliudtuddunameuEndTaguaddressudivupuvariantubuttonF(uaddressudivup(uFalseuparseru
framesetOKureversedutreeuopenElementsunameuphaseu
processEndTaguimpliedTagTokenu	nameTupleuspecialElementsuelementInScopeu
insertElement(uselfutokenustopNamesMapu	stopNamesunode((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagListItems"

u/getPhases.<locals>.InBodyPhase.startTagListItemcSsZ|jjddd�r.|jtd��n|jj|�|jjj|jj_dS(Nupuvariantubutton(	utreeuelementInScopeuendTagPuimpliedTagTokenu
insertElementuparseru	tokenizeruplaintextStateustate(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagPlaintext1su0getPhases.<locals>.InBodyPhase.startTagPlaintextcSs�|jjddd�r.|jtd��n|jjdjtkrx|jjdi|dd6�|jjj	�n|jj
|�dS(Nupuvariantubuttoniuunexpected-start-tagunamei����(utreeuelementInScopeuendTagPuimpliedTagTokenuopenElementsunameuheadingElementsuparseru
parseErrorupopu
insertElement(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagHeading7su.getPhases.<locals>.InBodyPhase.startTagHeadingcSs�|jjd�}|r�|jjdidd6dd6�|jtd��||jjkrt|jjj|�n||jjkr�|jjj|�q�n|jj	�|j
|�dS(Nuau$unexpected-start-tag-implies-end-tagu	startNameuendName(utreeu!elementInActiveFormattingElementsuparseru
parseErroruendTagFormattinguimpliedTagTokenuopenElementsuremoveuactiveFormattingElementsu#reconstructActiveFormattingElementsuaddFormattingElement(uselfutokenuafeAElement((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu	startTagA?s
u(getPhases.<locals>.InBodyPhase.startTagAcSs|jj�|j|�dS(N(utreeu#reconstructActiveFormattingElementsuaddFormattingElement(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagFormattingLs
u1getPhases.<locals>.InBodyPhase.startTagFormattingcSst|jj�|jjd�rc|jjdidd6dd6�|jtd��|jj�n|j|�dS(Nunobru$unexpected-start-tag-implies-end-tagu	startNameuendName(utreeu#reconstructActiveFormattingElementsuelementInScopeuparseru
parseErroru
processEndTaguimpliedTagTokenuaddFormattingElement(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagNobrPs
u+getPhases.<locals>.InBodyPhase.startTagNobrcSsw|jjd�rJ|jjdidd6dd6�|jtd��|S|jj�|jj|�d|j_	dS(Nubuttonu$unexpected-start-tag-implies-end-tagu	startNameuendNameF(
utreeuelementInScopeuparseru
parseErroru
processEndTaguimpliedTagTokenu#reconstructActiveFormattingElementsu
insertElementuFalseu
framesetOK(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagButtonZs
u-getPhases.<locals>.InBodyPhase.startTagButtoncSs@|jj�|jj|�|jjjt�d|j_dS(NF(	utreeu#reconstructActiveFormattingElementsu
insertElementuactiveFormattingElementsuappenduMarkeruFalseuparseru
framesetOK(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagAppletMarqueeObjectes
u:getPhases.<locals>.InBodyPhase.startTagAppletMarqueeObjectcSs^|jjddd�r.|jtd��n|jj�d|j_|jj|d�dS(NupuvariantubuttonuRAWTEXTF(	utreeuelementInScopeuendTagPuimpliedTagTokenu#reconstructActiveFormattingElementsuFalseuparseru
framesetOKuparseRCDataRawtext(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagXmpks

u*getPhases.<locals>.InBodyPhase.startTagXmpcSsy|jjdkrC|jjddd�rC|jtd��qCn|jj|�d|j_|jj	d|j_
dS(NuquirksupuvariantubuttonuinTableF(uparseru
compatModeutreeuelementInScopeu
processEndTaguimpliedTagTokenu
insertElementuFalseu
framesetOKuphasesuphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagTablersu,getPhases.<locals>.InBodyPhase.startTagTablecSsG|jj�|jj|�|jjj�d|d<d|j_dS(NuselfClosingAcknowledgedTF(	utreeu#reconstructActiveFormattingElementsu
insertElementuopenElementsupopuTrueuFalseuparseru
framesetOK(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagVoidFormattingzs


u5getPhases.<locals>.InBodyPhase.startTagVoidFormattingcSsY|jj}|j|�d|dkrU|ddjt�dkrU||j_ndS(Nutypeudatauhidden(uparseru
framesetOKustartTagVoidFormattingu	translateuasciiUpper2Lower(uselfutokenu
framesetOK((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagInput�s

u,getPhases.<locals>.InBodyPhase.startTagInputcSs.|jj|�|jjj�d|d<dS(NuselfClosingAcknowledgedT(utreeu
insertElementuopenElementsupopuTrue(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagParamSource�su2getPhases.<locals>.InBodyPhase.startTagParamSourcecSsh|jjddd�r.|jtd��n|jj|�|jjj�d|d<d|j	_
dS(NupuvariantubuttonuselfClosingAcknowledgedTF(utreeuelementInScopeuendTagPuimpliedTagTokenu
insertElementuopenElementsupopuTrueuFalseuparseru
framesetOK(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagHr�s
u)getPhases.<locals>.InBodyPhase.startTagHrc	SsO|jjdidd6dd6�|jtddd|dd	|d	��dS(
Nuunexpected-start-tag-treated-asuimageuoriginalNameuimgunewNameuStartTagu
attributesudatauselfClosing(uparseru
parseErroruprocessStartTaguimpliedTagToken(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagImage�s

u,getPhases.<locals>.InBodyPhase.startTagImagec	Ss�|jjdidd6�|jjr*dSi}d|dkrU|dd|d<n|jtddd|��|jtd	d��|jtd
d��d|dkr�|dd}nd}|jitd
d6|d6�|dj�}d|kr	|d=nd|kr|d=nd|d<|jtddd|d|d��|j	td
��|jtd	d��|j	td��dS(Nudeprecated-taguisindexunameuactionudatauformuStartTagu
attributesuhrulabelupromptu3This is a searchable index. Enter search keywords: u
CharactersutypeuinputuselfClosing(
uparseru
parseErrorutreeuformPointeruprocessStartTaguimpliedTagTokenuprocessCharactersu
tokenTypesucopyu
processEndTag(uselfutokenu
form_attrsupromptu
attributes((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagIsIndex�s6



u.getPhases.<locals>.InBodyPhase.startTagIsIndexcSsD|jj|�|jjj|jj_|j|_d|j_	dS(NF(
utreeu
insertElementuparseru	tokenizerurcdataStateustateu!processSpaceCharactersDropNewlineuprocessSpaceCharactersuFalseu
framesetOK(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagTextarea�su/getPhases.<locals>.InBodyPhase.startTagTextareacSsd|j_|j|�dS(NF(uFalseuparseru
framesetOKustartTagRawtext(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagIFrame�su-getPhases.<locals>.InBodyPhase.startTagIFramecSs|jj|d�dS(u8iframe, noembed noframes, noscript(if scripting enabled)uRAWTEXTN(uparseruparseRCDataRawtext(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagRawtext�su.getPhases.<locals>.InBodyPhase.startTagRawtextcSsY|jjdjdkr5|jjjtd��n|jj�|jjj|�dS(Niuoptioni����(	utreeuopenElementsunameuparseruphaseu
processEndTaguimpliedTagTokenu#reconstructActiveFormattingElementsu
insertElement(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagOpt�s
u*getPhases.<locals>.InBodyPhase.startTagOptcSs�|jj�|jj|�d	|j_|jj|jjd|jjd|jjd|jjd|jjd|jjdfkr�|jjd|j_n|jjd|j_dS(
NuinTableu	inCaptionu
inColumnGroupuinTableBodyuinRowuinCelluinSelectInTableuinSelectF(utreeu#reconstructActiveFormattingElementsu
insertElementuFalseuparseru
framesetOKuphaseuphases(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagSelect�s




u-getPhases.<locals>.InBodyPhase.startTagSelectcSs_|jjd�rK|jj�|jjdjdkrK|jj�qKn|jj|�dS(Nurubyii����(utreeuelementInScopeugenerateImpliedEndTagsuopenElementsunameuparseru
parseErroru
insertElement(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagRpRt�s

u+getPhases.<locals>.InBodyPhase.startTagRpRtcSsv|jj�|jj|�|jj|�td|d<|jj|�|drr|jjj�d|d<ndS(Numathmlu	namespaceuselfClosinguselfClosingAcknowledgedT(
utreeu#reconstructActiveFormattingElementsuparseruadjustMathMLAttributesuadjustForeignAttributesu
namespacesu
insertElementuopenElementsupopuTrue(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagMath�s

u+getPhases.<locals>.InBodyPhase.startTagMathcSsv|jj�|jj|�|jj|�td|d<|jj|�|drr|jjj�d|d<ndS(Nusvgu	namespaceuselfClosinguselfClosingAcknowledgedT(
utreeu#reconstructActiveFormattingElementsuparseruadjustSVGAttributesuadjustForeignAttributesu
namespacesu
insertElementuopenElementsupopuTrue(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagSvg�s

u*getPhases.<locals>.InBodyPhase.startTagSvgcSs"|jjdi|dd6�dS(u5 Elements that should be children of other elements that have a
            different insertion mode; here they are ignored
            "caption", "col", "colgroup", "frame", "frameset", "head",
            "option", "optgroup", "tbody", "td", "tfoot", "th", "thead",
            "tr", "noscript"
            uunexpected-start-tag-ignoredunameN(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagMisplaced�su0getPhases.<locals>.InBodyPhase.startTagMisplacedcSs!|jj�|jj|�dS(N(utreeu#reconstructActiveFormattingElementsu
insertElement(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagOthers
u,getPhases.<locals>.InBodyPhase.startTagOthercSs�|jjddd�sa|jtdd��|jjdidd6�|jtdd��n�|jjd�|jjd	j	dkr�|jjdidd6�n|jjj
�}x%|j	dkr�|jjj
�}q�WdS(
NupuvariantubuttonuStartTaguunexpected-end-tagunameuEndTagii����(utreeuelementInScopeustartTagClosePuimpliedTagTokenuparseru
parseErroruendTagPugenerateImpliedEndTagsuopenElementsunameupop(uselfutokenunode((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagPsu&getPhases.<locals>.InBodyPhase.endTagPcSs�|jjd�s#|jj�dS|jjdjdkr�x^|jjdd�D]C}|jtd�krS|jjdidd6|jd6�PqSqSWn|jjd|j_dS(Nubodyiiuddudtuliuoptgroupuoptionupurpurtutbodyutdutfootuthutheadutruhtmlu$expected-one-end-tag-but-got-anotheruexpectedNameugotNameu	afterBodyi����(uddudtuliuoptgroupuoptionupurpurtutbodyutdutfootuthutheadutrubodyuhtml(	utreeuelementInScopeuparseru
parseErroruopenElementsunameu	frozensetuphasesuphase(uselfutokenunode((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
endTagBodys
		u)getPhases.<locals>.InBodyPhase.endTagBodycSs-|jjd�r)|jtd��|SdS(Nubody(utreeuelementInScopeu
endTagBodyuimpliedTagToken(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
endTagHtml+su)getPhases.<locals>.InBodyPhase.endTagHtmlcSs�|ddkr|j|_n|jj|d�}|rK|jj�n|jjdj|dkr�|jjdi|dd6�n|r�|jjj	�}x,|j|dkr�|jjj	�}q�WndS(Nunameupreiuend-tag-too-earlyi����(
uprocessSpaceCharactersNonPreuprocessSpaceCharactersutreeuelementInScopeugenerateImpliedEndTagsuopenElementsunameuparseru
parseErrorupop(uselfutokenuinScopeunode((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagBlock1s!u*getPhases.<locals>.InBodyPhase.endTagBlockcSs�|jj}d|j_|dks7|jj|�rT|jjdidd6�nS|jj�|jjd|kr�|jjdidd6�n|jjj|�dS(Nuunexpected-end-taguformunameiuend-tag-too-early-ignoredi����(	utreeuformPointeruNoneuelementInScopeuparseru
parseErrorugenerateImpliedEndTagsuopenElementsuremove(uselfutokenunode((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
endTagForm?s
u)getPhases.<locals>.InBodyPhase.endTagFormcSs�|ddkrd}nd}|jj|dd|�s\|jjdi|dd6�n�|jjd|d�|jjd	j|dkr�|jjdi|dd6�n|jjj�}x)|j|dkr�|jjj�}q�WdS(
Nunameuliulistuvariantuunexpected-end-taguexcludeiuend-tag-too-earlyi����(	uNoneutreeuelementInScopeuparseru
parseErrorugenerateImpliedEndTagsuopenElementsunameupop(uselfutokenuvariantunode((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagListItemLs	!	u-getPhases.<locals>.InBodyPhase.endTagListItemcSs�x1tD])}|jj|�r|jj�PqqW|jjdj|dkrr|jjdi|dd6�nx^tD]V}|jj|�ry|jjj�}x%|jtkr�|jjj�}q�WPqyqyWdS(Niunameuend-tag-too-earlyi����(	uheadingElementsutreeuelementInScopeugenerateImpliedEndTagsuopenElementsunameuparseru
parseErrorupop(uselfutokenuitem((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
endTagHeading]s

!
u,getPhases.<locals>.InBodyPhase.endTagHeadingc	Ss9d}x,|dkr4|d7}|jj|d�}|sd||jjkru|jj|j�ru|j|�dS||jjkr�|jjdi|dd6�|jjj	|�dS|jj|j�s�|jjdi|dd6�dS||jjdkr*|jjdi|dd6�n|jjj
|�}d}x7|jj|d�D]}|jt
kr\|}Pq\q\W|dkr�|jjj�}x"||kr�|jjj�}q�W|jjj	|�dS|jj|d}|jjj
|�}|}	}
d}|jjj
|
�}x|d	kr?|d7}|d8}|jj|}
|
|jjkr�|jjj	|
�q*n|
|kr�Pn|	|kr�|jjj
|
�d}n|
j�}
|
|jj|jjj
|
�<|
|jj|jjj
|
�<|
}
|	jr)|	jj|	�n|
j|	�|
}	q*W|	jr\|	jj|	�n|jtd�kr�|jj�\}}|j|	|�n
|j|	�|j�}
|j|
�|j|
�|jjj	|�|jjj||
�|jjj	|�|jjj|jjj
|�d|
�q	WdS(u)The much-feared adoption agency algorithmiiiunameNuadoption-agency-1.2uadoption-agency-4.4uadoption-agency-1.3iutableutbodyutfootutheadutri����(utableutbodyutfootutheadutr(utreeu!elementInActiveFormattingElementsuopenElementsuelementInScopeunameuendTagOtheruparseru
parseErroruactiveFormattingElementsuremoveuindexuNoneu	nameTupleuspecialElementsupopu	cloneNodeuparenturemoveChilduappendChildu	frozensetugetTableMisnestedNodePositionuinsertBeforeureparentChildrenuinsert(uselfutokenuouterLoopCounteruformattingElementuafeIndexu
furthestBlockuelementucommonAncestorubookmarkulastNodeunodeuinnerLoopCounteruindexucloneuparentuinsertBefore((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagFormattingls�

	

!



	

	


u/getPhases.<locals>.InBodyPhase.endTagFormattingcSs�|jj|d�r&|jj�n|jjdj|dkrd|jjdi|dd6�n|jj|d�r�|jjj�}x)|j|dkr�|jjj�}q�W|jj�ndS(Nunameiuend-tag-too-earlyi����(	utreeuelementInScopeugenerateImpliedEndTagsuopenElementsunameuparseru
parseErrorupopuclearActiveFormattingElements(uselfutokenuelement((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagAppletMarqueeObjects!u8getPhases.<locals>.InBodyPhase.endTagAppletMarqueeObjectcSs[|jjdidd6dd6�|jj�|jjtdd��|jjj�dS(Nuunexpected-end-tag-treated-asubruoriginalNameu
br elementunewNameuStartTag(uparseru
parseErrorutreeu#reconstructActiveFormattingElementsu
insertElementuimpliedTagTokenuopenElementsupop(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagBrs

u'getPhases.<locals>.InBodyPhase.endTagBrcSs�x�|jjddd�D]�}|j|dkr�|jjd|d�|jjdj|dkr�|jjdi|dd6�nx|jjj�|kr�q�WPq|jtkr|jjdi|dd6�PqqWdS(Niunameuexcludeuunexpected-end-tagi����i����(	utreeuopenElementsunameugenerateImpliedEndTagsuparseru
parseErrorupopu	nameTupleuspecialElements(uselfutokenunode((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagOther"s !u*getPhases.<locals>.InBodyPhase.endTagOtherN(5u__name__u
__module__u__qualname__u__init__uisMatchingFormattingElementuaddFormattingElementu
processEOFu!processSpaceCharactersDropNewlineuprocessCharactersuprocessSpaceCharactersustartTagProcessInHeadustartTagBodyustartTagFramesetustartTagClosePustartTagPreListingustartTagFormustartTagListItemustartTagPlaintextustartTagHeadingu	startTagAustartTagFormattingustartTagNobrustartTagButtonustartTagAppletMarqueeObjectustartTagXmpu
startTagTableustartTagVoidFormattingu
startTagInputustartTagParamSourceu
startTagHru
startTagImageustartTagIsIndexustartTagTextareaustartTagIFrameustartTagRawtextustartTagOptustartTagSelectustartTagRpRtustartTagMathustartTagSvgustartTagMisplacedu
startTagOtheruendTagPu
endTagBodyu
endTagHtmluendTagBlocku
endTagFormuendTagListItemu
endTagHeadinguendTagFormattinguendTagAppletMarqueeObjectuendTagBruendTagOther(u
__locals__(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuInBodyPhase[sdF

	

 	

�uInBodyPhasecsb|EeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S(ugetPhases.<locals>.TextPhasecse�j|||�tjg�|_|j|j_tjd|jfg�|_|j|j_dS(Nuscript(	u__init__uutilsuMethodDispatcherustartTagHandleru
startTagOtherudefaultuendTagScriptu
endTagHandleruendTagOther(uselfuparserutree(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__init__1su%getPhases.<locals>.TextPhase.__init__cSs|jj|d�dS(Nudata(utreeu
insertText(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharacters9su.getPhases.<locals>.TextPhase.processCharacterscSsM|jjdi|jjdjd6�|jjj�|jj|j_dS(Nu&expected-named-closing-tag-but-got-eofiunamei����T(	uparseru
parseErrorutreeuopenElementsunameupopu
originalPhaseuphaseuTrue(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEOF<s
u'getPhases.<locals>.TextPhase.processEOFcSsdstd|d��dS(Nu4Tried to process start tag %s in RCDATA/RAWTEXT modeunameF(uFalseuAssertionError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagOtherCsu*getPhases.<locals>.TextPhase.startTagOthercSs=|jjj�}|jdks't�|jj|j_dS(Nuscript(utreeuopenElementsupopunameuAssertionErroruparseru
originalPhaseuphase(uselfutokenunode((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagScriptFsu)getPhases.<locals>.TextPhase.endTagScriptcSs&|jjj�|jj|j_dS(N(utreeuopenElementsupopuparseru
originalPhaseuphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagOtherMsu(getPhases.<locals>.TextPhase.endTagOtherN(	u__name__u
__module__u__qualname__u__init__uprocessCharactersu
processEOFu
startTagOtheruendTagScriptuendTagOther(u
__locals__(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu	TextPhase0su	TextPhasecs�|EeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'S((ugetPhases.<locals>.InTablePhasec
s��j|||�tjd|jfd|jfd|jfd|jfd|jfd|jfd|j	fd|j
fd|jfd|jfg
�|_
|j|j
_tjd|jfd|jfg�|_|j|j_dS(Nuhtmlucaptionucolgroupucolutbodyutfootutheadutduthutrutableustyleuscriptuinputuformubody(utbodyutfootuthead(utduthutr(ustyleuscript(ubodyucaptionucolucolgroupuhtmlutbodyutdutfootuthutheadutr(u__init__uutilsuMethodDispatcherustartTagHtmlustartTagCaptionustartTagColgroupustartTagColustartTagRowGroupustartTagImplyTbodyu
startTagTableustartTagStyleScriptu
startTagInputustartTagFormustartTagHandleru
startTagOtherudefaultuendTagTableuendTagIgnoreu
endTagHandleruendTagOther(uselfuparserutree(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__init__Ss$u(getPhases.<locals>.InTablePhase.__init__cSs4x-|jjdjdkr/|jjj�qWdS(Niutableuhtmli����(utableuhtml(utreeuopenElementsunameupop(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuclearStackToTableContextksu8getPhases.<locals>.InTablePhase.clearStackToTableContextcSsB|jjdjdkr,|jjd�n|jjs>t�dS(Niuhtmlueof-in-tablei����(utreeuopenElementsunameuparseru
parseErroru	innerHTMLuAssertionError(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEOFtsu*getPhases.<locals>.InTablePhase.processEOFcSsH|jj}|jjd|j_||jj_|jjj|�dS(NuinTableText(uparseruphaseuphasesu
originalPhaseuprocessSpaceCharacters(uselfutokenu
originalPhase((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessSpaceCharacters{su6getPhases.<locals>.InTablePhase.processSpaceCharacterscSsH|jj}|jjd|j_||jj_|jjj|�dS(NuinTableText(uparseruphaseuphasesu
originalPhaseuprocessCharacters(uselfutokenu
originalPhase((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharacters�su1getPhases.<locals>.InTablePhase.processCharacterscSs3d|j_|jjdj|�d|j_dS(NuinBodyTF(uTrueutreeuinsertFromTableuparseruphasesuprocessCharactersuFalse(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
insertText�su*getPhases.<locals>.InTablePhase.insertTextcSsG|j�|jjjt�|jj|�|jjd|j_dS(Nu	inCaption(	uclearStackToTableContextutreeuactiveFormattingElementsuappenduMarkeru
insertElementuparseruphasesuphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagCaption�s
u/getPhases.<locals>.InTablePhase.startTagCaptioncSs4|j�|jj|�|jjd|j_dS(Nu
inColumnGroup(uclearStackToTableContextutreeu
insertElementuparseruphasesuphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagColgroup�s
u0getPhases.<locals>.InTablePhase.startTagColgroupcSs|jtdd��|S(NucolgroupuStartTag(ustartTagColgroupuimpliedTagToken(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagCol�su+getPhases.<locals>.InTablePhase.startTagColcSs4|j�|jj|�|jjd|j_dS(NuinTableBody(uclearStackToTableContextutreeu
insertElementuparseruphasesuphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagRowGroup�s
u0getPhases.<locals>.InTablePhase.startTagRowGroupcSs|jtdd��|S(NutbodyuStartTag(ustartTagRowGroupuimpliedTagToken(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagImplyTbody�su2getPhases.<locals>.InTablePhase.startTagImplyTbodycSsN|jjdidd6dd6�|jjjtd��|jjsJ|SdS(Nu$unexpected-start-tag-implies-end-tagutableu	startNameuendName(uparseru
parseErroruphaseu
processEndTaguimpliedTagTokenu	innerHTML(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagTable�s
u-getPhases.<locals>.InTablePhase.startTagTablecSs|jjdj|�S(NuinHead(uparseruphasesuprocessStartTag(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagStyleScript�su3getPhases.<locals>.InTablePhase.startTagStyleScriptcSsqd|dkr`|ddjt�dkr`|jjd�|jj|�|jjj�n
|j|�dS(Nutypeudatauhiddenu unexpected-hidden-input-in-table(	u	translateuasciiUpper2Loweruparseru
parseErrorutreeu
insertElementuopenElementsupopu
startTagOther(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagInput�su-getPhases.<locals>.InTablePhase.startTagInputcSs_|jjd�|jjdkr[|jj|�|jjd|j_|jjj�ndS(Nuunexpected-form-in-tableii����(uparseru
parseErrorutreeuformPointeruNoneu
insertElementuopenElementsupop(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagForm�s
u,getPhases.<locals>.InTablePhase.startTagFormcSsQ|jjdi|dd6�d|j_|jjdj|�d|j_dS(Nu)unexpected-start-tag-implies-table-voodoounameuinBodyTF(uparseru
parseErroruTrueutreeuinsertFromTableuphasesuprocessStartTaguFalse(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagOther�su-getPhases.<locals>.InTablePhase.startTagOthercSs�|jjddd�r�|jj�|jjdjdkro|jjdidd6|jjdjd6�nx-|jjd	jdkr�|jjj�qrW|jjj�|jj�n|jj	s�t
�|jj�dS(
Nutableuvariantiuend-tag-too-early-namedugotNameuexpectedNamei����i����i����(utreeuelementInScopeugenerateImpliedEndTagsuopenElementsunameuparseru
parseErrorupopuresetInsertionModeu	innerHTMLuAssertionError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagTable�s

u+getPhases.<locals>.InTablePhase.endTagTablecSs"|jjdi|dd6�dS(Nuunexpected-end-taguname(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagIgnore�su,getPhases.<locals>.InTablePhase.endTagIgnorecSsQ|jjdi|dd6�d|j_|jjdj|�d|j_dS(Nu'unexpected-end-tag-implies-table-voodoounameuinBodyTF(uparseru
parseErroruTrueutreeuinsertFromTableuphasesu
processEndTaguFalse(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagOther�su+getPhases.<locals>.InTablePhase.endTagOtherN(u__name__u
__module__u__qualname__u__init__uclearStackToTableContextu
processEOFuprocessSpaceCharactersuprocessCharactersu
insertTextustartTagCaptionustartTagColgroupustartTagColustartTagRowGroupustartTagImplyTbodyu
startTagTableustartTagStyleScriptu
startTagInputustartTagFormu
startTagOtheruendTagTableuendTagIgnoreuendTagOther(u
__locals__(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuInTablePhaseQs&	
uInTablePhasecsz|EeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS(u#getPhases.<locals>.InTableTextPhasecs)�j|||�d|_g|_dS(N(u__init__uNoneu
originalPhaseucharacterTokens(uselfuparserutree(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__init__�s	u,getPhases.<locals>.InTableTextPhase.__init__cSs�djdd�|jD��}tdd�|D��rjitdd6|d6}|jjdj|�n|r�|jj|�ng|_dS(	NucSsg|]}|d�qS(udata((u.0uitem((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
<listcomp>�s	uGgetPhases.<locals>.InTableTextPhase.flushCharacters.<locals>.<listcomp>cSsg|]}|tk�qS((uspaceCharacters(u.0uitem((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
<listcomp>�s	u
CharactersutypeudatauinTable(ujoinucharacterTokensuanyu
tokenTypesuparseruphasesu
insertTextutree(uselfudatautoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuflushCharacters�su3getPhases.<locals>.InTableTextPhase.flushCharacterscSs|j�|j|j_|S(N(uflushCharactersu
originalPhaseuparseruphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessComment�s
u2getPhases.<locals>.InTableTextPhase.processCommentcSs|j�|j|j_dS(NT(uflushCharactersu
originalPhaseuparseruphaseuTrue(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEOF�s
u.getPhases.<locals>.InTableTextPhase.processEOFcSs(|ddkrdS|jj|�dS(Nudatau(ucharacterTokensuappend(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharacters�su5getPhases.<locals>.InTableTextPhase.processCharacterscSs|jj|�dS(N(ucharacterTokensuappend(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessSpaceCharacterssu:getPhases.<locals>.InTableTextPhase.processSpaceCharacterscSs|j�|j|j_|S(N(uflushCharactersu
originalPhaseuparseruphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessStartTags
u3getPhases.<locals>.InTableTextPhase.processStartTagcSs|j�|j|j_|S(N(uflushCharactersu
originalPhaseuparseruphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEndTag
s
u1getPhases.<locals>.InTableTextPhase.processEndTagN(u__name__u
__module__u__qualname__u__init__uflushCharactersuprocessCommentu
processEOFuprocessCharactersuprocessSpaceCharactersuprocessStartTagu
processEndTag(u
__locals__(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuInTableTextPhase�s	uInTableTextPhasecs�|EeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�ZdS(u!getPhases.<locals>.InCaptionPhasec
s��j|||�tjd|jfd
|jfg�|_|j|j_tjd|jfd|j	fd|j
fg�|_|j|j_dS(Nuhtmlucaptionucolucolgrouputbodyutdutfootuthutheadutrutableubody(	ucaptionucolucolgrouputbodyutdutfootuthutheadutr(
ubodyucolucolgroupuhtmlutbodyutdutfootuthutheadutr(
u__init__uutilsuMethodDispatcherustartTagHtmlustartTagTableElementustartTagHandleru
startTagOtherudefaultu
endTagCaptionuendTagTableuendTagIgnoreu
endTagHandleruendTagOther(uselfuparserutree(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__init__su*getPhases.<locals>.InCaptionPhase.__init__cSs|jjddd�S(Nucaptionuvariantutable(utreeuelementInScope(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuignoreEndTagCaption#su5getPhases.<locals>.InCaptionPhase.ignoreEndTagCaptioncSs|jjdj�dS(NuinBody(uparseruphasesu
processEOF(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEOF&su,getPhases.<locals>.InCaptionPhase.processEOFcSs|jjdj|�S(NuinBody(uparseruphasesuprocessCharacters(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharacters)su3getPhases.<locals>.InCaptionPhase.processCharacterscSs@|jj�|j�}|jjjtd��|s<|SdS(Nucaption(uparseru
parseErroruignoreEndTagCaptionuphaseu
processEndTaguimpliedTagToken(uselfutokenuignoreEndTag((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagTableElement,s

u6getPhases.<locals>.InCaptionPhase.startTagTableElementcSs|jjdj|�S(NuinBody(uparseruphasesuprocessStartTag(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagOther4su/getPhases.<locals>.InCaptionPhase.startTagOthercSs�|j�s�|jj�|jjdjdkrc|jjdidd6|jjdjd6�nx-|jjd	jdkr�|jjj�qfW|jjj�|jj�|jj	d|j_
n|jjs�t�|jj�dS(
Niucaptionu$expected-one-end-tag-but-got-anotherugotNameuexpectedNameuinTablei����i����i����(
uignoreEndTagCaptionutreeugenerateImpliedEndTagsuopenElementsunameuparseru
parseErrorupopuclearActiveFormattingElementsuphasesuphaseu	innerHTMLuAssertionError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
endTagCaption7s


u/getPhases.<locals>.InCaptionPhase.endTagCaptioncSs@|jj�|j�}|jjjtd��|s<|SdS(Nucaption(uparseru
parseErroruignoreEndTagCaptionuphaseu
processEndTaguimpliedTagToken(uselfutokenuignoreEndTag((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagTableIs

u-getPhases.<locals>.InCaptionPhase.endTagTablecSs"|jjdi|dd6�dS(Nuunexpected-end-taguname(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagIgnorePsu.getPhases.<locals>.InCaptionPhase.endTagIgnorecSs|jjdj|�S(NuinBody(uparseruphasesu
processEndTag(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagOtherSsu-getPhases.<locals>.InCaptionPhase.endTagOtherN(
u__name__u
__module__u__qualname__u__init__uignoreEndTagCaptionu
processEOFuprocessCharactersustartTagTableElementu
startTagOtheru
endTagCaptionuendTagTableuendTagIgnoreuendTagOther(u
__locals__(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuInCaptionPhasesuInCaptionPhasecs�|EeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�ZdS(u%getPhases.<locals>.InColumnGroupPhasecs��j|||�tjd|jfd|jfg�|_|j|j_tjd|jfd|j	fg�|_
|j|j
_dS(Nuhtmlucolucolgroup(u__init__uutilsuMethodDispatcherustartTagHtmlustartTagColustartTagHandleru
startTagOtherudefaultuendTagColgroupu	endTagColu
endTagHandleruendTagOther(uselfuparserutree(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__init__Ysu.getPhases.<locals>.InColumnGroupPhase.__init__cSs|jjdjdkS(Niuhtmli����(utreeuopenElementsuname(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuignoreEndTagColgrouphsu:getPhases.<locals>.InColumnGroupPhase.ignoreEndTagColgroupcSs\|jjdjdkr/|jjs+t�dS|j�}|jtd��|sXdSdS(Niuhtmlucolgroupi����T(
utreeuopenElementsunameuparseru	innerHTMLuAssertionErroruignoreEndTagColgroupuendTagColgroupuimpliedTagTokenuTrue(uselfuignoreEndTag((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEOFksu0getPhases.<locals>.InColumnGroupPhase.processEOFcSs-|j�}|jtd��|s)|SdS(Nucolgroup(uignoreEndTagColgroupuendTagColgroupuimpliedTagToken(uselfutokenuignoreEndTag((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharactersusu7getPhases.<locals>.InColumnGroupPhase.processCharacterscSs$|jj|�|jjj�dS(N(utreeu
insertElementuopenElementsupop(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagCol{su1getPhases.<locals>.InColumnGroupPhase.startTagColcSs-|j�}|jtd��|s)|SdS(Nucolgroup(uignoreEndTagColgroupuendTagColgroupuimpliedTagToken(uselfutokenuignoreEndTag((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagOthersu3getPhases.<locals>.InColumnGroupPhase.startTagOthercSsX|j�r.|jjst�|jj�n&|jjj�|jjd|j_	dS(NuinTable(
uignoreEndTagColgroupuparseru	innerHTMLuAssertionErroru
parseErrorutreeuopenElementsupopuphasesuphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagColgroup�s
u4getPhases.<locals>.InColumnGroupPhase.endTagColgroupcSs|jjdidd6�dS(Nu
no-end-tagucoluname(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu	endTagCol�su/getPhases.<locals>.InColumnGroupPhase.endTagColcSs-|j�}|jtd��|s)|SdS(Nucolgroup(uignoreEndTagColgroupuendTagColgroupuimpliedTagToken(uselfutokenuignoreEndTag((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagOther�su1getPhases.<locals>.InColumnGroupPhase.endTagOtherN(u__name__u
__module__u__qualname__u__init__uignoreEndTagColgroupu
processEOFuprocessCharactersustartTagColu
startTagOtheruendTagColgroupu	endTagColuendTagOther(u
__locals__(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuInColumnGroupPhaseVs
	uInColumnGroupPhasecs�|EeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�ZdS(u#getPhases.<locals>.InTableBodyPhasecs��j|||�tjd|jfd|jfd
|jfd|jfg�|_|j|j_	tjd|j
fd|jfd|jfg�|_
|j|j
_	dS(Nuhtmlutrutduthucaptionucolucolgrouputbodyutfootutheadutableubody(utduth(ucaptionucolucolgrouputbodyutfootuthead(utbodyutfootuthead(ubodyucaptionucolucolgroupuhtmlutduthutr(u__init__uutilsuMethodDispatcherustartTagHtmlu
startTagTrustartTagTableCellustartTagTableOtherustartTagHandleru
startTagOtherudefaultuendTagTableRowGroupuendTagTableuendTagIgnoreu
endTagHandleruendTagOther(uselfuparserutree(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__init__�su,getPhases.<locals>.InTableBodyPhase.__init__cSsbx-|jjdjdkr/|jjj�qW|jjdjdkr^|jjs^t�ndS(	Niutbodyutfootutheaduhtmli����(utbodyutfootutheaduhtmli����(utreeuopenElementsunameupopuparseru	innerHTMLuAssertionError(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuclearStackToTableBodyContext�s
	u@getPhases.<locals>.InTableBodyPhase.clearStackToTableBodyContextcSs|jjdj�dS(NuinTable(uparseruphasesu
processEOF(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEOF�su.getPhases.<locals>.InTableBodyPhase.processEOFcSs|jjdj|�S(NuinTable(uparseruphasesuprocessSpaceCharacters(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessSpaceCharacters�su:getPhases.<locals>.InTableBodyPhase.processSpaceCharacterscSs|jjdj|�S(NuinTable(uparseruphasesuprocessCharacters(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharacters�su5getPhases.<locals>.InTableBodyPhase.processCharacterscSs4|j�|jj|�|jjd|j_dS(NuinRow(uclearStackToTableBodyContextutreeu
insertElementuparseruphasesuphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagTr�s
u.getPhases.<locals>.InTableBodyPhase.startTagTrcSs8|jjdi|dd6�|jtdd��|S(Nuunexpected-cell-in-table-bodyunameutruStartTag(uparseru
parseErroru
startTagTruimpliedTagToken(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagTableCell�su5getPhases.<locals>.InTableBodyPhase.startTagTableCellcSs�|jjddd�sH|jjddd�sH|jjddd�rv|j�|jt|jjdj��|S|jjs�t	�|jj
�dS(Nutbodyuvariantutableutheadutfootii����(utreeuelementInScopeuclearStackToTableBodyContextuendTagTableRowGroupuimpliedTagTokenuopenElementsunameuparseru	innerHTMLuAssertionErroru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagTableOther�s
u6getPhases.<locals>.InTableBodyPhase.startTagTableOthercSs|jjdj|�S(NuinTable(uparseruphasesuprocessStartTag(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagOther�su1getPhases.<locals>.InTableBodyPhase.startTagOthercSsq|jj|ddd�rO|j�|jjj�|jjd|j_n|jjdi|dd6�dS(NunameuvariantutableuinTableu unexpected-end-tag-in-table-body(	utreeuelementInScopeuclearStackToTableBodyContextuopenElementsupopuparseruphasesuphaseu
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagTableRowGroup�s
u7getPhases.<locals>.InTableBodyPhase.endTagTableRowGroupcSs�|jjddd�sH|jjddd�sH|jjddd�rv|j�|jt|jjdj��|S|jjs�t	�|jj
�dS(Nutbodyuvariantutableutheadutfootii����(utreeuelementInScopeuclearStackToTableBodyContextuendTagTableRowGroupuimpliedTagTokenuopenElementsunameuparseru	innerHTMLuAssertionErroru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagTable�s
u/getPhases.<locals>.InTableBodyPhase.endTagTablecSs"|jjdi|dd6�dS(Nu unexpected-end-tag-in-table-bodyuname(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagIgnore�su0getPhases.<locals>.InTableBodyPhase.endTagIgnorecSs|jjdj|�S(NuinTable(uparseruphasesu
processEndTag(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagOther�su/getPhases.<locals>.InTableBodyPhase.endTagOtherN(u__name__u
__module__u__qualname__u__init__uclearStackToTableBodyContextu
processEOFuprocessSpaceCharactersuprocessCharactersu
startTagTrustartTagTableCellustartTagTableOtheru
startTagOtheruendTagTableRowGroupuendTagTableuendTagIgnoreuendTagOther(u
__locals__(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuInTableBodyPhase�s
	
uInTableBodyPhasecs�|EeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�ZdS(ugetPhases.<locals>.InRowPhasecs��j|||�tjd|jfd
|jfd|jfg�|_|j|j_tjd
|j	fd|j
fd|jfd|jfg�|_
|j|j
_dS(Nuhtmlutduthucaptionucolucolgrouputbodyutfootutheadutrutableubody(utduth(ucaptionucolucolgrouputbodyutfootutheadutr(utbodyutfootuthead(ubodyucaptionucolucolgroupuhtmlutduth(u__init__uutilsuMethodDispatcherustartTagHtmlustartTagTableCellustartTagTableOtherustartTagHandleru
startTagOtherudefaultuendTagTruendTagTableuendTagTableRowGroupuendTagIgnoreu
endTagHandleruendTagOther(uselfuparserutree(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__init__�su&getPhases.<locals>.InRowPhase.__init__cSs[xT|jjdjdkrV|jjdi|jjdjd6�|jjj�qWdS(	Niutruhtmlu'unexpected-implied-end-tag-in-table-rowunamei����(utruhtmli����(utreeuopenElementsunameuparseru
parseErrorupop(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuclearStackToTableRowContextsu9getPhases.<locals>.InRowPhase.clearStackToTableRowContextcSs|jjddd�S(Nutruvariantutable(utreeuelementInScope(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuignoreEndTagTrsu,getPhases.<locals>.InRowPhase.ignoreEndTagTrcSs|jjdj�dS(NuinTable(uparseruphasesu
processEOF(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEOFsu(getPhases.<locals>.InRowPhase.processEOFcSs|jjdj|�S(NuinTable(uparseruphasesuprocessSpaceCharacters(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessSpaceCharacterssu4getPhases.<locals>.InRowPhase.processSpaceCharacterscSs|jjdj|�S(NuinTable(uparseruphasesuprocessCharacters(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharacterssu/getPhases.<locals>.InRowPhase.processCharacterscSsG|j�|jj|�|jjd|j_|jjjt�dS(NuinCell(	uclearStackToTableRowContextutreeu
insertElementuparseruphasesuphaseuactiveFormattingElementsuappenduMarker(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagTableCell"s
u/getPhases.<locals>.InRowPhase.startTagTableCellcSs-|j�}|jtd��|s)|SdS(Nutr(uignoreEndTagTruendTagTruimpliedTagToken(uselfutokenuignoreEndTag((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagTableOther(su0getPhases.<locals>.InRowPhase.startTagTableOthercSs|jjdj|�S(NuinTable(uparseruphasesuprocessStartTag(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagOther/su+getPhases.<locals>.InRowPhase.startTagOthercSsb|j�s?|j�|jjj�|jjd|j_n|jjsQt	�|jj
�dS(NuinTableBody(uignoreEndTagTruclearStackToTableRowContextutreeuopenElementsupopuparseruphasesuphaseu	innerHTMLuAssertionErroru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagTr2s
u&getPhases.<locals>.InRowPhase.endTagTrcSs-|j�}|jtd��|s)|SdS(Nutr(uignoreEndTagTruendTagTruimpliedTagToken(uselfutokenuignoreEndTag((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagTable<su)getPhases.<locals>.InRowPhase.endTagTablecSsD|jj|ddd�r3|jtd��|S|jj�dS(Nunameuvariantutableutr(utreeuelementInScopeuendTagTruimpliedTagTokenuparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagTableRowGroupDsu1getPhases.<locals>.InRowPhase.endTagTableRowGroupcSs"|jjdi|dd6�dS(Nuunexpected-end-tag-in-table-rowuname(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagIgnoreKsu*getPhases.<locals>.InRowPhase.endTagIgnorecSs|jjdj|�S(NuinTable(uparseruphasesu
processEndTag(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagOtherOsu)getPhases.<locals>.InRowPhase.endTagOtherN(u__name__u
__module__u__qualname__u__init__uclearStackToTableRowContextuignoreEndTagTru
processEOFuprocessSpaceCharactersuprocessCharactersustartTagTableCellustartTagTableOtheru
startTagOtheruendTagTruendTagTableuendTagTableRowGroupuendTagIgnoreuendTagOther(u
__locals__(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
InRowPhase�s
u
InRowPhasecs�|EeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�ZdS(ugetPhases.<locals>.InCellPhasecs��j|||�tjd|jfd
|jfg�|_|j|j_tjd|jfd|j	fd|j
fg�|_|j|j_dS(Nuhtmlucaptionucolucolgrouputbodyutdutfootuthutheadutrubodyutable(	ucaptionucolucolgrouputbodyutdutfootuthutheadutr(utduth(ubodyucaptionucolucolgroupuhtml(utableutbodyutfootutheadutr(
u__init__uutilsuMethodDispatcherustartTagHtmlustartTagTableOtherustartTagHandleru
startTagOtherudefaultuendTagTableCelluendTagIgnoreuendTagImplyu
endTagHandleruendTagOther(uselfuparserutree(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__init__Tsu'getPhases.<locals>.InCellPhase.__init__cSs`|jjddd�r.|jtd��n.|jjddd�r\|jtd��ndS(Nutduvariantutableuth(utreeuelementInScopeuendTagTableCelluimpliedTagToken(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu	closeCellesu(getPhases.<locals>.InCellPhase.closeCellcSs|jjdj�dS(NuinBody(uparseruphasesu
processEOF(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEOFlsu)getPhases.<locals>.InCellPhase.processEOFcSs|jjdj|�S(NuinBody(uparseruphasesuprocessCharacters(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharactersosu0getPhases.<locals>.InCellPhase.processCharacterscSsa|jjddd�s0|jjddd�r>|j�|S|jjsPt�|jj�dS(Nutduvariantutableuth(utreeuelementInScopeu	closeCelluparseru	innerHTMLuAssertionErroru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagTableOtherrs
u1getPhases.<locals>.InCellPhase.startTagTableOthercSs|jjdj|�S(NuinBody(uparseruphasesuprocessStartTag(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagOther|su,getPhases.<locals>.InCellPhase.startTagOthercSs�|jj|ddd�r�|jj|d�|jjdj|dkr�|jjdi|dd6�x?|jjj�}|j|dkrnPqnqnn|jjj�|jj�|jj	d|j_
n|jjdi|dd6�dS(	Nunameuvariantutableiuunexpected-cell-end-taguinRowuunexpected-end-tagi����(utreeuelementInScopeugenerateImpliedEndTagsuopenElementsunameuparseru
parseErrorupopuclearActiveFormattingElementsuphasesuphase(uselfutokenunode((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagTableCells

u.getPhases.<locals>.InCellPhase.endTagTableCellcSs"|jjdi|dd6�dS(Nuunexpected-end-taguname(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagIgnore�su+getPhases.<locals>.InCellPhase.endTagIgnorecSs;|jj|ddd�r*|j�|S|jj�dS(Nunameuvariantutable(utreeuelementInScopeu	closeCelluparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagImply�s
u*getPhases.<locals>.InCellPhase.endTagImplycSs|jjdj|�S(NuinBody(uparseruphasesu
processEndTag(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagOther�su*getPhases.<locals>.InCellPhase.endTagOtherN(
u__name__u
__module__u__qualname__u__init__u	closeCellu
processEOFuprocessCharactersustartTagTableOtheru
startTagOtheruendTagTableCelluendTagIgnoreuendTagImplyuendTagOther(u
__locals__(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuInCellPhaseRs
uInCellPhasecs�|EeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�ZdS(u getPhases.<locals>.InSelectPhasecs��j|||�tjd|jfd|jfd|jfd|jfd	|jfd|jfg�|_	|j
|j	_tjd|jfd|j
fd|jfg�|_|j|j_dS(
Nuhtmluoptionuoptgroupuselectuinputukeygenutextareauscript(uinputukeygenutextarea(u__init__uutilsuMethodDispatcherustartTagHtmlustartTagOptionustartTagOptgroupustartTagSelectu
startTagInputustartTagScriptustartTagHandleru
startTagOtherudefaultuendTagOptionuendTagOptgroupuendTagSelectu
endTagHandleruendTagOther(uselfuparserutree(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__init__�su)getPhases.<locals>.InSelectPhase.__init__cSsB|jjdjdkr,|jjd�n|jjs>t�dS(Niuhtmlu
eof-in-selecti����(utreeuopenElementsunameuparseru
parseErroru	innerHTMLuAssertionError(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEOF�su+getPhases.<locals>.InSelectPhase.processEOFcSs,|ddkrdS|jj|d�dS(Nudatau(utreeu
insertText(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharacters�su2getPhases.<locals>.InSelectPhase.processCharacterscSs@|jjdjdkr,|jjj�n|jj|�dS(Niuoptioni����(utreeuopenElementsunameupopu
insertElement(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagOption�su/getPhases.<locals>.InSelectPhase.startTagOptioncSsl|jjdjdkr,|jjj�n|jjdjdkrX|jjj�n|jj|�dS(Niuoptionuoptgroupi����i����(utreeuopenElementsunameupopu
insertElement(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagOptgroup�s
u1getPhases.<locals>.InSelectPhase.startTagOptgroupcSs'|jjd�|jtd��dS(Nuunexpected-select-in-selectuselect(uparseru
parseErroruendTagSelectuimpliedTagToken(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagSelect�su/getPhases.<locals>.InSelectPhase.startTagSelectcSsU|jjd�|jjddd�r?|jtd��|S|jjsQt�dS(Nuunexpected-input-in-selectuselectuvariant(uparseru
parseErrorutreeuelementInScopeuendTagSelectuimpliedTagTokenu	innerHTMLuAssertionError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagInput�s
u.getPhases.<locals>.InSelectPhase.startTagInputcSs|jjdj|�S(NuinHead(uparseruphasesuprocessStartTag(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagScript�su/getPhases.<locals>.InSelectPhase.startTagScriptcSs"|jjdi|dd6�dS(Nuunexpected-start-tag-in-selectuname(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagOther�su.getPhases.<locals>.InSelectPhase.startTagOthercSsJ|jjdjdkr,|jjj�n|jjdidd6�dS(Niuoptionuunexpected-end-tag-in-selectunamei����(utreeuopenElementsunameupopuparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagOption�su-getPhases.<locals>.InSelectPhase.endTagOptioncSs�|jjdjdkrE|jjdjdkrE|jjj�n|jjd	jdkrq|jjj�n|jjdidd6�dS(
Niuoptioniuoptgroupuunexpected-end-tag-in-selectunamei����i����i����(utreeuopenElementsunameupopuparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagOptgroup�su/getPhases.<locals>.InSelectPhase.endTagOptgroupcSs�|jjddd�rb|jjj�}x%|jdkrQ|jjj�}q-W|jj�n|jjstt�|jj	�dS(Nuselectuvariant(
utreeuelementInScopeuopenElementsupopunameuparseruresetInsertionModeu	innerHTMLuAssertionErroru
parseError(uselfutokenunode((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagSelect�su-getPhases.<locals>.InSelectPhase.endTagSelectcSs"|jjdi|dd6�dS(Nuunexpected-end-tag-in-selectuname(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagOther�su,getPhases.<locals>.InSelectPhase.endTagOtherN(u__name__u
__module__u__qualname__u__init__u
processEOFuprocessCharactersustartTagOptionustartTagOptgroupustartTagSelectu
startTagInputustartTagScriptu
startTagOtheruendTagOptionuendTagOptgroupuendTagSelectuendTagOther(u
__locals__(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
InSelectPhase�s
u
InSelectPhasecsn|EeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dS(u'getPhases.<locals>.InSelectInTablePhasec	sq�j|||�tjd	|jfg�|_|j|j_tjd
|jfg�|_|j	|j_dS(Nucaptionutableutbodyutfootutheadutrutduth(ucaptionutableutbodyutfootutheadutrutduth(ucaptionutableutbodyutfootutheadutrutduth(
u__init__uutilsuMethodDispatcheru
startTagTableustartTagHandleru
startTagOtherudefaultuendTagTableu
endTagHandleruendTagOther(uselfuparserutree(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__init__	su0getPhases.<locals>.InSelectInTablePhase.__init__cSs|jjdj�dS(NuinSelect(uparseruphasesu
processEOF(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEOF	su2getPhases.<locals>.InSelectInTablePhase.processEOFcSs|jjdj|�S(NuinSelect(uparseruphasesuprocessCharacters(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharacters	su9getPhases.<locals>.InSelectInTablePhase.processCharacterscSs5|jjdi|dd6�|jtd��|S(Nu5unexpected-table-element-start-tag-in-select-in-tableunameuselect(uparseru
parseErroruendTagOtheruimpliedTagToken(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagTable	su5getPhases.<locals>.InSelectInTablePhase.startTagTablecSs|jjdj|�S(NuinSelect(uparseruphasesuprocessStartTag(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagOther	su5getPhases.<locals>.InSelectInTablePhase.startTagOthercSsU|jjdi|dd6�|jj|ddd�rQ|jtd��|SdS(Nu3unexpected-table-element-end-tag-in-select-in-tableunameuvariantutableuselect(uparseru
parseErrorutreeuelementInScopeuendTagOtheruimpliedTagToken(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagTable 	su3getPhases.<locals>.InSelectInTablePhase.endTagTablecSs|jjdj|�S(NuinSelect(uparseruphasesu
processEndTag(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagOther&	su3getPhases.<locals>.InSelectInTablePhase.endTagOtherN(
u__name__u
__module__u__qualname__u__init__u
processEOFuprocessCharactersu
startTagTableu
startTagOtheruendTagTableuendTagOther(u
__locals__(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuInSelectInTablePhase	suInSelectInTablePhasec-s�|EeZdZeddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,g,�Z�fd-d.�Zd/d0�Z�fd1d2�Zd3d4�Zd5d6�Z	d7S(8u(getPhases.<locals>.InForeignContentPhaseububigu
blockquoteubodyubrucenterucodeuddudivudludtuemuembeduh1uh2uh3uh4uh5uh6uheaduhruiuimguliulistingumenuumetaunobruolupupreurubyususmalluspanustrongustrikeusubusuputableuttuuuuluvarcs�j|||�dS(N(u__init__(uselfuparserutree(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__init__3	su1getPhases.<locals>.InForeignContentPhase.__init__cSs+i$dd6dd6dd6dd6d	d
6dd6d
d6dd6dd6dd6dd6dd6dd6dd6dd6dd 6d!d"6d#d$6d%d&6d'd(6d)d*6d+d,6d-d.6d/d06d1d26d3d46d5d66d7d86d9d:6d;d<6d=d>6d?d@6dAdB6dCdD6dEdF6dGdH6}|dI|kr'||dI|dI<ndS(JNualtGlyphualtglyphualtGlyphDefualtglyphdefualtGlyphItemualtglyphitemuanimateColoruanimatecoloru
animateMotionu
animatemotionuanimateTransformuanimatetransformuclipPathuclippathufeBlendufeblendu
feColorMatrixu
fecolormatrixufeComponentTransferufecomponenttransferufeCompositeufecompositeufeConvolveMatrixufeconvolvematrixufeDiffuseLightingufediffuselightingufeDisplacementMapufedisplacementmapufeDistantLightufedistantlightufeFloodufefloodufeFuncAufefuncaufeFuncBufefuncbufeFuncGufefuncgufeFuncRufefuncrufeGaussianBlurufegaussianblurufeImageufeimageufeMergeufemergeufeMergeNodeufemergenodeufeMorphologyufemorphologyufeOffsetufeoffsetufePointLightufepointlightufeSpecularLightingufespecularlightingufeSpotLightufespotlightufeTileufetileufeTurbulenceufeturbulenceu
foreignObjectu
foreignobjectuglyphRefuglyphrefulinearGradientulineargradienturadialGradienturadialgradientutextPathutextpathuname((uselfutokenureplacements((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuadjustSVGTagNames6	sL

u:getPhases.<locals>.InForeignContentPhase.adjustSVGTagNamescsi|ddkrd|d<n8|jjrUtdd�|dD��rUd|j_n�j||�dS(Nudatauu�css|]}|tkVqdS(N(uspaceCharacters(u.0uchar((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu	<genexpr>c	suMgetPhases.<locals>.InForeignContentPhase.processCharacters.<locals>.<genexpr>F(uparseru
framesetOKuanyuFalseuprocessCharacters(uselfutoken(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharacters_	s
u:getPhases.<locals>.InForeignContentPhase.processCharacterscSs�|jjd}|d|jks\|ddkr�t|dj��tdddg�@r�|jjdi|dd6�xm|jjdj|jjkr�|jj	|jjd�r�|jj
|jjd�r�|jjj�q}W|S|jtd	kr|jj
|�n3|jtd
krG|j|�|jj|�n|jj|�|j|d<|jj|�|dr�|jjj�d|d
<ndS(Niunameufontudataucolorufaceusizeu*unexpected-html-element-in-foreign-contentumathmlusvgu	namespaceuselfClosinguselfClosingAcknowledgedi����i����i����i����T(utreeuopenElementsubreakoutElementsusetukeysuparseru
parseErroru	namespaceudefaultNamespaceuisHTMLIntegrationPointuisMathMLTextIntegrationPointupopu
namespacesuadjustMathMLAttributesuadjustSVGTagNamesuadjustSVGAttributesuadjustForeignAttributesu
insertElementuTrue(uselfutokenucurrentNode((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessStartTagg	s.)


u8getPhases.<locals>.InForeignContentPhase.processStartTagcSsJt|jj�d}|jjd}|j|dkrZ|jjdi|dd6�nx�|jjt�|dkr�|jj|jj	dkr�|jjj
�|jjj|j_nx.|jjj�|kr�|jjs�t
�q�Wd}Pn|d8}|jj|}|j|jjkr-q]q]|jjj|�}Pq]|S(Niunameuunexpected-end-taguinTableTexti����(ulenutreeuopenElementsunameuparseru
parseErroru	translateuasciiUpper2LoweruphaseuphasesuflushCharactersu
originalPhaseupopuAssertionErroruNoneu	namespaceudefaultNamespaceu
processEndTag(uselfutokenu	nodeIndexunodeu	new_token((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEndTag�	s(!
u6getPhases.<locals>.InForeignContentPhase.processEndTagN(
u__name__u
__module__u__qualname__u	frozensetubreakoutElementsu__init__uadjustSVGTagNamesuprocessCharactersuprocessStartTagu
processEndTag(u
__locals__(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuInForeignContentPhase)	s)uInForeignContentPhasecsz|EeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS(u!getPhases.<locals>.AfterBodyPhasecsq�j|||�tjd|jfg�|_|j|j_tjd|jfg�|_|j	|j_dS(Nuhtml(
u__init__uutilsuMethodDispatcherustartTagHtmlustartTagHandleru
startTagOtherudefaultu
endTagHtmlu
endTagHandleruendTagOther(uselfuparserutree(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__init__�	su*getPhases.<locals>.AfterBodyPhase.__init__cSsdS(N((uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEOF�	su,getPhases.<locals>.AfterBodyPhase.processEOFcSs!|jj||jjd�dS(Ni(utreeu
insertCommentuopenElements(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessComment�	su0getPhases.<locals>.AfterBodyPhase.processCommentcSs*|jjd�|jjd|j_|S(Nuunexpected-char-after-bodyuinBody(uparseru
parseErroruphasesuphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharacters�	su3getPhases.<locals>.AfterBodyPhase.processCharacterscSs|jjdj|�S(NuinBody(uparseruphasesuprocessStartTag(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagHtml�	su.getPhases.<locals>.AfterBodyPhase.startTagHtmlcSs8|jjdi|dd6�|jjd|j_|S(Nuunexpected-start-tag-after-bodyunameuinBody(uparseru
parseErroruphasesuphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagOther�	su/getPhases.<locals>.AfterBodyPhase.startTagOthercSs9|jjr|jjd�n|jjd|j_dS(Nu'unexpected-end-tag-after-body-innerhtmluafterAfterBody(uparseru	innerHTMLu
parseErroruphasesuphase(uselfuname((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
endTagHtml�	su,getPhases.<locals>.AfterBodyPhase.endTagHtmlcSs8|jjdi|dd6�|jjd|j_|S(Nuunexpected-end-tag-after-bodyunameuinBody(uparseru
parseErroruphasesuphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagOther�	su-getPhases.<locals>.AfterBodyPhase.endTagOtherN(u__name__u
__module__u__qualname__u__init__u
processEOFuprocessCommentuprocessCharactersustartTagHtmlu
startTagOtheru
endTagHtmluendTagOther(u
__locals__(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuAfterBodyPhase�	suAfterBodyPhasecs�|EeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�ZdS(u"getPhases.<locals>.InFramesetPhasecs��j|||�tjd|jfd|jfd|jfd|jfg�|_|j|j_	tjd|j
fg�|_|j|j_	dS(Nuhtmluframesetuframeunoframes(
u__init__uutilsuMethodDispatcherustartTagHtmlustartTagFramesetu
startTagFrameustartTagNoframesustartTagHandleru
startTagOtherudefaultuendTagFramesetu
endTagHandleruendTagOther(uselfuparserutree(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__init__�	su+getPhases.<locals>.InFramesetPhase.__init__cSsB|jjdjdkr,|jjd�n|jjs>t�dS(Niuhtmlueof-in-frameseti����(utreeuopenElementsunameuparseru
parseErroru	innerHTMLuAssertionError(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEOF�	su-getPhases.<locals>.InFramesetPhase.processEOFcSs|jjd�dS(Nuunexpected-char-in-frameset(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharacters�	su4getPhases.<locals>.InFramesetPhase.processCharacterscSs|jj|�dS(N(utreeu
insertElement(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagFrameset�	su3getPhases.<locals>.InFramesetPhase.startTagFramesetcSs$|jj|�|jjj�dS(N(utreeu
insertElementuopenElementsupop(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagFrame�	su0getPhases.<locals>.InFramesetPhase.startTagFramecSs|jjdj|�S(NuinBody(uparseruphasesuprocessStartTag(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagNoframes�	su3getPhases.<locals>.InFramesetPhase.startTagNoframescSs"|jjdi|dd6�dS(Nu unexpected-start-tag-in-framesetuname(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagOther�	su0getPhases.<locals>.InFramesetPhase.startTagOthercSs|jjdjdkr,|jjd�n|jjj�|jjr{|jjdjdkr{|jjd|j_ndS(Niuhtmlu)unexpected-frameset-in-frameset-innerhtmluframesetu
afterFrameseti����i����(	utreeuopenElementsunameuparseru
parseErrorupopu	innerHTMLuphasesuphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagFrameset�	s
u1getPhases.<locals>.InFramesetPhase.endTagFramesetcSs"|jjdi|dd6�dS(Nuunexpected-end-tag-in-framesetuname(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagOther
su.getPhases.<locals>.InFramesetPhase.endTagOtherN(u__name__u
__module__u__qualname__u__init__u
processEOFuprocessCharactersustartTagFramesetu
startTagFrameustartTagNoframesu
startTagOtheruendTagFramesetuendTagOther(u
__locals__(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuInFramesetPhase�	suInFramesetPhasecsn|EeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dS(u%getPhases.<locals>.AfterFramesetPhasecs}�j|||�tjd|jfd|jfg�|_|j|j_tjd|jfg�|_	|j
|j	_dS(Nuhtmlunoframes(u__init__uutilsuMethodDispatcherustartTagHtmlustartTagNoframesustartTagHandleru
startTagOtherudefaultu
endTagHtmlu
endTagHandleruendTagOther(uselfuparserutree(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__init__
su.getPhases.<locals>.AfterFramesetPhase.__init__cSsdS(N((uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEOF
su0getPhases.<locals>.AfterFramesetPhase.processEOFcSs|jjd�dS(Nuunexpected-char-after-frameset(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharacters
su7getPhases.<locals>.AfterFramesetPhase.processCharacterscSs|jjdj|�S(NuinHead(uparseruphasesuprocessStartTag(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagNoframes
su6getPhases.<locals>.AfterFramesetPhase.startTagNoframescSs"|jjdi|dd6�dS(Nu#unexpected-start-tag-after-framesetuname(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagOther
su3getPhases.<locals>.AfterFramesetPhase.startTagOthercSs|jjd|j_dS(NuafterAfterFrameset(uparseruphasesuphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
endTagHtml"
su0getPhases.<locals>.AfterFramesetPhase.endTagHtmlcSs"|jjdi|dd6�dS(Nu!unexpected-end-tag-after-framesetuname(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuendTagOther%
su1getPhases.<locals>.AfterFramesetPhase.endTagOtherN(
u__name__u
__module__u__qualname__u__init__u
processEOFuprocessCharactersustartTagNoframesu
startTagOtheru
endTagHtmluendTagOther(u
__locals__(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuAfterFramesetPhase
suAfterFramesetPhasecsz|EeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS(u&getPhases.<locals>.AfterAfterBodyPhasecsD�j|||�tjd|jfg�|_|j|j_dS(Nuhtml(u__init__uutilsuMethodDispatcherustartTagHtmlustartTagHandleru
startTagOtherudefault(uselfuparserutree(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__init__*
su/getPhases.<locals>.AfterAfterBodyPhase.__init__cSsdS(N((uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEOF2
su1getPhases.<locals>.AfterAfterBodyPhase.processEOFcSs|jj||jj�dS(N(utreeu
insertCommentudocument(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessComment5
su5getPhases.<locals>.AfterAfterBodyPhase.processCommentcSs|jjdj|�S(NuinBody(uparseruphasesuprocessSpaceCharacters(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessSpaceCharacters8
su=getPhases.<locals>.AfterAfterBodyPhase.processSpaceCharacterscSs*|jjd�|jjd|j_|S(Nuexpected-eof-but-got-charuinBody(uparseru
parseErroruphasesuphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharacters;
su8getPhases.<locals>.AfterAfterBodyPhase.processCharacterscSs|jjdj|�S(NuinBody(uparseruphasesuprocessStartTag(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagHtml@
su3getPhases.<locals>.AfterAfterBodyPhase.startTagHtmlcSs8|jjdi|dd6�|jjd|j_|S(Nuexpected-eof-but-got-start-tagunameuinBody(uparseru
parseErroruphasesuphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagOtherC
su4getPhases.<locals>.AfterAfterBodyPhase.startTagOthercSs8|jjdi|dd6�|jjd|j_|S(Nuexpected-eof-but-got-end-tagunameuinBody(uparseru
parseErroruphasesuphase(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEndTagI
su4getPhases.<locals>.AfterAfterBodyPhase.processEndTagN(u__name__u
__module__u__qualname__u__init__u
processEOFuprocessCommentuprocessSpaceCharactersuprocessCharactersustartTagHtmlu
startTagOtheru
processEndTag(u
__locals__(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuAfterAfterBodyPhase)
suAfterAfterBodyPhasecs�|EeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�ZdS(u*getPhases.<locals>.AfterAfterFramesetPhasecsP�j|||�tjd|jfd|jfg�|_|j|j_dS(Nuhtmlunoframes(u__init__uutilsuMethodDispatcherustartTagHtmlustartTagNoFramesustartTagHandleru
startTagOtherudefault(uselfuparserutree(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu__init__P
s
u3getPhases.<locals>.AfterAfterFramesetPhase.__init__cSsdS(N((uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEOFY
su5getPhases.<locals>.AfterAfterFramesetPhase.processEOFcSs|jj||jj�dS(N(utreeu
insertCommentudocument(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessComment\
su9getPhases.<locals>.AfterAfterFramesetPhase.processCommentcSs|jjdj|�S(NuinBody(uparseruphasesuprocessSpaceCharacters(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessSpaceCharacters_
suAgetPhases.<locals>.AfterAfterFramesetPhase.processSpaceCharacterscSs|jjd�dS(Nuexpected-eof-but-got-char(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuprocessCharactersb
su<getPhases.<locals>.AfterAfterFramesetPhase.processCharacterscSs|jjdj|�S(NuinBody(uparseruphasesuprocessStartTag(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagHtmle
su7getPhases.<locals>.AfterAfterFramesetPhase.startTagHtmlcSs|jjdj|�S(NuinHead(uparseruphasesuprocessStartTag(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyustartTagNoFramesh
su;getPhases.<locals>.AfterAfterFramesetPhase.startTagNoFramescSs"|jjdi|dd6�dS(Nuexpected-eof-but-got-start-taguname(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
startTagOtherk
su8getPhases.<locals>.AfterAfterFramesetPhase.startTagOthercSs"|jjdi|dd6�dS(Nuexpected-eof-but-got-end-taguname(uparseru
parseError(uselfutoken((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
processEndTago
su8getPhases.<locals>.AfterAfterFramesetPhase.processEndTagN(u__name__u
__module__u__qualname__u__init__u
processEOFuprocessCommentuprocessSpaceCharactersuprocessCharactersustartTagHtmlustartTagNoFramesu
startTagOtheru
processEndTag(u
__locals__(uPhase(u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuAfterAfterFramesetPhaseO
s	uAfterAfterFramesetPhaseuinitialu
beforeHtmlu
beforeHeaduinHeadu	afterHeaduinBodyutextuinTableuinTableTextu	inCaptionu
inColumnGroupuinTableBodyuinRowuinCelluinSelectuinSelectInTableuinForeignContentu	afterBodyu
inFramesetu
afterFramesetuafterAfterBodyuafterAfterFrameset(uwith_metaclass(udebugulogugetMetaclassuInitialPhaseuBeforeHtmlPhaseuBeforeHeadPhaseuInHeadPhaseuAfterHeadPhaseuInBodyPhaseu	TextPhaseuInTablePhaseuInTableTextPhaseuInCaptionPhaseuInColumnGroupPhaseuInTableBodyPhaseu
InRowPhaseuInCellPhaseu
InSelectPhaseuInSelectInTablePhaseuInForeignContentPhaseuAfterBodyPhaseuInFramesetPhaseuAfterFramesetPhaseuAfterAfterBodyPhaseuAfterAfterFramesetPhase((uPhaseu9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu	getPhases�sd%)�#.cC���!�-GAbYLd's/9%&$u	getPhasesuEndTagcCs9|dkri}nit|d6|d6|d6|d6S(NutypeunameudatauselfClosing(uNoneu
tokenTypes(unameutypeu
attributesuselfClosing((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyuimpliedTagToken�
s	uimpliedTagTokencBs|EeZdZdZdS(u
ParseErroruError in parsed documentN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu
ParseError�
su
ParseError((u
__future__uabsolute_importudivisionuunicode_literalsupip._vendor.sixuwith_metaclassutypesuuinputstreamu	tokenizerutreebuildersutreebuilders._baseuMarkeruutilsu	constantsuspaceCharactersuasciiUpper2LoweruspecialElementsuheadingElementsu
cdataElementsurcdataElementsu
tokenTypesuReparseExceptionu
namespacesuhtmlIntegrationPointElementsu"mathmlTextIntegrationPointElementsuadjustForeignAttributesuadjustForeignAttributesMapuNoneuTrueuparseu
parseFragmentumethod_decorator_metaclassuobjectu
HTMLParseru	getPhasesuFalseuimpliedTagTokenu	Exceptionu
ParseError(((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/html5parser.pyu<module>sD	�i���������site-packages/pip/_vendor/html5lib/__pycache__/utils.cpython-33.pyc000064400000007107151733463620021242 0ustar00�
7�Re�	c
@s�ddlmZmZmZddlmZyddljjZ	Wn$e
k
rhddljjZ	YnXdddddgZ
Gd	d�de�Zd
d�Zdd�Zdd�ZdS(
i(uabsolute_importudivisionuunicode_literals(u
ModuleTypeNu
default_etreeuMethodDispatcheruisSurrogatePairusurrogatePairToCodepointumoduleFactoryFactorycBs5|EeZdZdZfdd�Zdd�ZdS(uMethodDispatcherupDict with 2 special properties:

    On initiation, keys that are lists, sets or tuples are converted to
    multiple keys so accessing any one of the items in the original
    list-like object returns the matching value

    md = MethodDispatcher({("foo", "bar"):"baz"})
    md["foo"] == "baz"

    A default value which can be set through the default attribute.
    cCs�g}xl|D]d\}}t|�ttttfkr^x7|D]}|j||f�q>Wq
|j||f�q
Wtj||�d|_	dS(N(
utypeulistutupleu	frozensetusetuappendudictu__init__uNoneudefault(uselfuitemsu_dictEntriesunameuvalueuitem((u3/tmp/pip-zej_zi-build/pip/_vendor/html5lib/utils.pyu__init__s
uMethodDispatcher.__init__cCstj|||j�S(N(udictugetudefault(uselfukey((u3/tmp/pip-zej_zi-build/pip/_vendor/html5lib/utils.pyu__getitem__*suMethodDispatcher.__getitem__N(u__name__u
__module__u__qualname__u__doc__u__init__u__getitem__(u
__locals__((u3/tmp/pip-zej_zi-build/pip/_vendor/html5lib/utils.pyuMethodDispatcherscCsht|�dkogt|d�dkogt|d�dkogt|d�dkogt|d�dkS(Niii�i��ii�i��(ulenuord(udata((u3/tmp/pip-zej_zi-build/pip/_vendor/html5lib/utils.pyuisSurrogatePair1s,cCs2dt|d�ddt|d�d}|S(Niii�iii�(uord(udatauchar_val((u3/tmp/pip-zej_zi-build/pip/_vendor/html5lib/utils.pyusurrogatePairToCodepoint7scsi���fdd�}|S(Ncs�ttjtd��r(d|j}n
d|j}|�krI�|St|�}�|||�}|jj|�|�|<|SdS(Nuu_%s_factorys_%s_factory(u
isinstanceu
ModuleTypeu__name__utypeu__dict__uupdate(u
baseModuleuargsukwargsunameumoduobjs(ufactoryumoduleCache(u3/tmp/pip-zej_zi-build/pip/_vendor/html5lib/utils.pyu
moduleFactoryCs

u+moduleFactoryFactory.<locals>.moduleFactory((ufactoryu
moduleFactory((ufactoryumoduleCacheu3/tmp/pip-zej_zi-build/pip/_vendor/html5lib/utils.pyumoduleFactoryFactory@s(u
__future__uabsolute_importudivisionuunicode_literalsutypesu
ModuleTypeuxml.etree.cElementTreeuetreeucElementTreeu
default_etreeuImportErroruxml.etree.ElementTreeuElementTreeu__all__udictuMethodDispatcheruisSurrogatePairusurrogatePairToCodepointumoduleFactoryFactory(((u3/tmp/pip-zej_zi-build/pip/_vendor/html5lib/utils.pyu<module>s
	"	site-packages/pip/_vendor/html5lib/__pycache__/sanitizer.cpython-33.pyc000064400000036722151733463620022117 0ustar00�
7�Re,@c@s�ddlmZmZmZddlZddlmZmZddlm	Z	ddl
mZGdd�de�Z
Gd	d
�d
e	e
�ZdS(i(uabsolute_importudivisionuunicode_literalsN(uescapeuunescapei(u
HTMLTokenizer(u
tokenTypesc�BsC|EeZdZdZdddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcddgcZdedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dgZdd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�g#Zdd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dd�d�d�d�d�d�d�d)d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d8d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddRdddddddddd�ddddddd d!d"d#d$d%d&d'g�Zd(d�d)d)d)d*d+d,d-d.d/d0d1d2d3d4d�d�d5d6d7d8d9d9d:d;d<d=d=d=d>d?dd@dAdBdCdDd%d%dEdFdGdHdIg-ZdJdKdLdMdNdOdPdQdRdSdTdUdVdWd�dXd�dYdZd[d\d]d^d_d`d.dad�dbdcdddedfdgdhdidjdkdldmdndodpdqdrd�dsdtd�dudvdwdxdyd�dzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dd�d�d�dd�d�d�d�d�d�d�d�d�d�d�d%d�d�d�d�d�d�d�dEd�dFd�dGd�d'd�dHdId�d�d�d�g�Z	d�ddd�d�d�dEd�gZ
dXd�d�dbd�d�d|d{dzd�d�gZd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�gZd�d�d�d�d�d�d�d�d�d�d�d�d.d�d�d(dedfdhdidjd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d"d�d%g.Z
d�d�d�d�d�d�d�d�d�dd�d�d�d�d�d�d�d�d�d�d�ddddd�ddddddd	d
ddd
ddg'Zdbdcddd�d�d�d�d�gZdddddddddddddddddd d!d"d#d$gZeeeZeee	Ze
ZeZeZeZd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-S(.uHTMLSanitizerMixinuA sanitization of XHTML+MathML+SVG and of inline style attributes.uauabbruacronymuaddressuareauarticleuasideuaudioububigu
blockquoteubrubuttonucanvasucaptionucenteruciteucodeucolucolgroupucommandudatagridudatalistuddudeludetailsudfnudialogudirudivudludtuemuevent-sourceufieldsetu
figcaptionufigureufooterufontuformuheaderuh1uh2uh3uh4uh5uh6uhruiuimguinputuinsukeygenukbdulabelulegenduliumumapumenuumeterumulticolunavunextiduoluoutputuoptgroupuoptionupupreuprogressuqususampusectionuselectusmallusoundusourceuspaceruspanustrikeustrongusubusuputableutbodyutdutextareautimeutfootuthutheadutruttuuuuluvaruvideoumactionumathumerrorumfracumiu
mmultiscriptsumnumoumoverumpaddedumphantomumprescriptsumrootumrowumspaceumsqrtumstyleumsubumsubsupumsupumtableumtdumtextumtrumunderu
munderoverunoneuanimateuanimateColoru
animateMotionuanimateTransformuclipPathucircleudefsudescuellipseu	font-faceufont-face-nameu
font-face-srcuguglyphuhkernulinearGradientulineumarkerumetadatau
missing-glyphumpathupathupolygonupolylineuradialGradienturectusetustopusvguswitchutextutitleutspanuuseuacceptuaccept-charsetu	accesskeyuactionualignualtuautocompleteu	autofocusuaxisu
backgroundubalanceubgcolorubgpropertiesuborderubordercolorubordercolordarkubordercolorlightu
bottompaddingucellpaddingucellspacinguchu	challengeucharucharoffuchoffucharsetucheckeduclassuclearucolorucolsucolspanucompactucontenteditableucontrolsucoordsudataudatafldudatapagesizeudatasrcudatetimeudefaultudelayudisabledu	draggableudynsrcuenctypeuendufaceuforuframeu
galleryimgugutteruheadersuheightu	hidefocusuhiddenuhighuhrefuhreflanguhspaceuiconuidu	inputmodeuismapukeytypeuleftspacingulangulistulongdesculoopu	loopcountuloopendu	loopstartulowulowsrcumaxu	maxlengthumediaumethoduminumultipleunameunohrefunoshadeunowrapuopenuoptimumupatternupingu
point-sizeuposterupqgupreloadupromptu
radiogroupureadonlyurelu
repeat-maxu
repeat-minureplaceurequiredurevurightspacingurowsurowspanurulesuscopeuselectedushapeusizeusrcustartustepustyleusummaryusuppressutabindexutargetutemplateu
toppaddingutypeuunselectableuusemapuurnuvalignuvalueuvariableuvolumeuvspaceuvrmluwidthuwrapuxml:langu
actiontypeucolumnalignucolumnlinesu
columnspacingu
columnspanudepthudisplayudisplaystyleuequalcolumnsu	equalrowsufenceu	fontstyleu
fontweightu
linethicknessulspaceumathbackgroundu	mathcolorumathvariantumaxsizeuminsizeuotherurowalignurowlinesu
rowspacingurspaceuscriptlevelu	selectionu	separatorustretchyu
xlink:hrefu
xlink:showu
xlink:typeuxmlnsuxmlns:xlinku
accent-heightu
accumulateuadditiveu
alphabeticuarabic-formuascentu
attributeNameu
attributeTypeubaseProfileubboxubeginubyucalcModeu
cap-heightu	clip-pathucolor-renderingucontentucxucyududxudyudescentudurufillufill-opacityu	fill-ruleufont-familyu	font-sizeufont-stretchu
font-styleufont-variantufont-weightufromufxufyug1ug2u
glyph-nameu
gradientUnitsuhanginguhoriz-adv-xuhoriz-origin-xuideographicuku	keyPointsu
keySplinesukeyTimesu
marker-endu
marker-midumarker-startumarkerHeightumarkerUnitsumarkerWidthumathematicaluoffsetuopacityuorientuoriginuoverline-positionuoverline-thicknessupanose-1u
pathLengthupointsupreserveAspectRatioururefXurefYurepeatCountu	repeatDururequiredExtensionsurequiredFeaturesurestarturotateurxuryuslopeustemhustemvu
stop-colorustop-opacityustrikethrough-positionustrikethrough-thicknessustrokeustroke-dasharrayustroke-dashoffsetustroke-linecapustroke-linejoinustroke-miterlimitustroke-opacityustroke-widthusystemLanguageutext-anchorutou	transformuu1uu2uunderline-positionuunderline-thicknessuunicodeu
unicode-rangeuunits-per-emuvaluesuversionuviewBoxu
visibilityuwidthsuxux-heightux1ux2u
xlink:actuateu
xlink:arcroleu
xlink:roleuxlink:titleuxml:baseu	xml:spaceuyuy1uy2u
zoomAndPanu
color-profileucursorufilterumaskualtGlyphufeImageutextpathutrefuazimuthubackground-coloruborder-bottom-coloruborder-collapseuborder-coloruborder-left-coloruborder-right-coloruborder-top-coloru	directionu	elevationufloatuletter-spacinguline-heightuoverflowupauseupause-afterupause-beforeupitchupitch-rangeurichnessuspeakuspeak-headeru
speak-numeraluspeak-punctuationuspeech-rateustressu
text-alignutext-decorationutext-indentuunicode-bidiuvertical-alignuvoice-familyuwhite-spaceuautouaquaublackublockublueuboldubothubottomubrownucollapseudashedudottedufuchsiaugrayugreenu
!importantuitaliculeftulimeumaroonumediumunavyunormaluoliveupointerupurpleuredurightusolidusilverutealutoputransparentu	underlineuwhiteuyellowued2kuftpuhttpuhttpsuircumailtounewsugopherunntputelnetuwebcaluxmppucalltoufeeduaimursyncutagusshusftpurtspuafscCs�|d}|ttj��kr/t|}n|tdtdtdfkr�|d|jkrs|j||�S|j||�Sn|tdkr�n|SdS(NutypeuStartTaguEndTaguEmptyTagunameuComment(ulistu
tokenTypesukeysuallowed_elementsu
allowed_tokenudisallowed_token(uselfutokenu
token_type((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/sanitizer.pyusanitize_token�s

u!HTMLSanitizerMixin.sanitize_tokencs�d|kr�t�fdd�|dddd�D��}x��jD]�}||kr^qFntjddt||��j�}|jdd�}tjd|�rF|jd	�d
�j	krF||=qFqFWxC�j
D]8}||kr�tjddt||��||<q�q�W|d
�jkrVd|krVtjd|d�rV|d=nd|kr|�j
|d�|d<ndd�t|j��D�|d<n|S(Nudatacs1g|]'\}}|�jkr||f�qS((uallowed_attributes(u.0unameuval(uself(u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/sanitizer.pyu
<listcomp>�s		u4HTMLSanitizerMixin.allowed_token.<locals>.<listcomp>iu
[`- - \s]+uu�u^[a-z0-9][-+.a-z0-9]*:u:iuurl\s*\(\s*[^#\s][^)]+?\)u unameu
xlink:hrefu^\s*[^#\s].*ustylecSs"g|]\}}||g�qS(((u.0unameuval((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/sanitizer.pyu
<listcomp>�s	i����(udictuattr_val_is_uriureusubuunescapeulowerureplaceumatchusplituallowed_protocolsusvg_attr_val_allows_refusvg_allow_local_hrefusearchusanitize_cssulistuitems(uselfutokenu
token_typeuattrsuattru
val_unescaped((uselfu7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/sanitizer.pyu
allowed_token�s4	

&u HTMLSanitizerMixin.allowed_tokencCs�|tdkr%d|d|d<nW|drjdjdd�|dD��}d|d|f|d<nd	|d|d<|jd
�r�|ddd�d|d<n|d
ttj��kr�d|d
<ntd|d
<|d=|S(NuEndTagu</%s>unameudataucSs,g|]"\}}d|t|�f�qS(u %s="%s"(uescape(u.0ukuv((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/sanitizer.pyu
<listcomp>�s	u7HTMLSanitizerMixin.disallowed_token.<locals>.<listcomp>u<%s%s>u<%s>uselfClosingiu/>utypeu
Charactersi����(u
tokenTypesujoinugetulistukeys(uselfutokenu
token_typeuattrs((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/sanitizer.pyudisallowed_token�s
 
u#HTMLSanitizerMixin.disallowed_tokencCsctjd�jd|�}tjd|�s1dStjd|�sGdSg}xtjd|�D]�\}}|sxq`n|j�|jkr�|j|d|d�q`|jd	�d
j�dkr!x�|j�D],}||j	kr�tjd|�r�Pq�q�W|j|d|d�q`|j�|j
kr`|j|d|d�q`q`Wdj|�S(Nuurl\s*\(\s*[^\s)]+?\s*\)\s*u u@^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$uu ^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$u([-\w]+)\s*:\s*([^:;]*)u: u;u-iu
backgrounduborderumarginupaddingu\^(#[0-9a-f]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$(u
backgrounduborderumarginupadding(ureucompileusubumatchufindalluloweruallowed_css_propertiesuappendusplituacceptable_css_keywordsuallowed_svg_propertiesujoin(uselfustyleucleanupropuvalueukeyword((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/sanitizer.pyusanitize_css�s*	 uHTMLSanitizerMixin.sanitize_cssN(u__name__u
__module__u__qualname__u__doc__uacceptable_elementsumathml_elementsusvg_elementsuacceptable_attributesumathml_attributesusvg_attributesuattr_val_is_uriusvg_attr_val_allows_refusvg_allow_local_hrefuacceptable_css_propertiesuacceptable_css_keywordsuacceptable_svg_propertiesuacceptable_protocolsuallowed_elementsuallowed_attributesuallowed_css_propertiesuallowed_css_keywordsuallowed_svg_propertiesuallowed_protocolsusanitize_tokenu
allowed_tokenudisallowed_tokenusanitize_css(u
__locals__((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/sanitizer.pyuHTMLSanitizerMixin
s						
uHTMLSanitizerMixincBs>|EeZdZdddddddd�Zdd�ZdS(u
HTMLSanitizerc
Cs)tj|||||||d|�dS(Nuparser(u
HTMLTokenizeru__init__(uselfustreamuencodingu	parseMetau
useChardetulowercaseElementNameulowercaseAttrNameuparser((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/sanitizer.pyu__init__suHTMLSanitizer.__init__ccs;x4tj|�D]#}|j|�}|r|VqqWdS(N(u
HTMLTokenizeru__iter__usanitize_token(uselfutoken((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/sanitizer.pyu__iter__suHTMLSanitizer.__iter__NTF(u__name__u
__module__u__qualname__uNoneuTrueuFalseu__init__u__iter__(u
__locals__((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/sanitizer.pyu
HTMLSanitizers	u
HTMLSanitizer(u
__future__uabsolute_importudivisionuunicode_literalsureuxml.sax.saxutilsuescapeuunescapeu	tokenizeru
HTMLTokenizeru	constantsu
tokenTypesuobjectuHTMLSanitizerMixinu
HTMLSanitizer(((u7/tmp/pip-zej_zi-build/pip/_vendor/html5lib/sanitizer.pyu<module>s�site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-33.pyc000064400000000242151733463620024315 0ustar00�
7�Rec@sdS(N((((uC/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treeadapters/__init__.pyu<module>ssite-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-33.pyc000064400000003631151733463620023356 0ustar00�
7�Re}c@s�ddlmZmZmZddlmZddlmZmZiZ	x6ej
�D](\ZZZ
edk	rUe
e	e<qUqUWdd�ZdS(i(uabsolute_importudivisionuunicode_literals(uAttributesNSImpli(uadjustForeignAttributesuunadjustForeignAttributescCs�|j�x*tj�D]\}}|j||�qWx|D]}|d}|dkr`q>q>|dkr�t|dt�}|j|d|df|d|�|dkrJ|j|d|df|d�qJq>|dkr	|j|d|df|d�q>|dkr)|j|d�q>|dkr8q>ds>t
d��q>Wx'tj�D]\}}|j|�q[W|j�d
S(u8Call SAX-like content handler based on treewalker walkerutypeuDoctypeuStartTaguEmptyTagudatau	namespaceunameuEndTagu
CharactersuSpaceCharactersuCommentuUnknown token typeN(uStartTaguEmptyTag(u
CharactersuSpaceCharactersF(
u
startDocumentuprefix_mappinguitemsustartPrefixMappinguAttributesNSImpluunadjustForeignAttributesustartElementNSuendElementNSu
charactersuFalseuAssertionErroruendPrefixMappinguendDocument(uwalkeruhandleruprefixu	namespaceutokenutypeuattrs((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treeadapters/sax.pyuto_sax
s6



	uto_saxN(u
__future__uabsolute_importudivisionuunicode_literalsuxml.sax.xmlreaderuAttributesNSImplu	constantsuadjustForeignAttributesuunadjustForeignAttributesuprefix_mappinguvaluesuprefixu	localNameu	namespaceuNoneuto_sax(((u>/tmp/pip-zej_zi-build/pip/_vendor/html5lib/treeadapters/sax.pyu<module>ssite-packages/pip/_vendor/html5lib/treeadapters/sax.py000064400000003175151733463620017100 0ustar00from __future__ import absolute_import, division, unicode_literals

from xml.sax.xmlreader import AttributesNSImpl

from ..constants import adjustForeignAttributes, unadjustForeignAttributes

prefix_mapping = {}
for prefix, localName, namespace in adjustForeignAttributes.values():
    if prefix is not None:
        prefix_mapping[prefix] = namespace


def to_sax(walker, handler):
    """Call SAX-like content handler based on treewalker walker"""
    handler.startDocument()
    for prefix, namespace in prefix_mapping.items():
        handler.startPrefixMapping(prefix, namespace)

    for token in walker:
        type = token["type"]
        if type == "Doctype":
            continue
        elif type in ("StartTag", "EmptyTag"):
            attrs = AttributesNSImpl(token["data"],
                                     unadjustForeignAttributes)
            handler.startElementNS((token["namespace"], token["name"]),
                                   token["name"],
                                   attrs)
            if type == "EmptyTag":
                handler.endElementNS((token["namespace"], token["name"]),
                                     token["name"])
        elif type == "EndTag":
            handler.endElementNS((token["namespace"], token["name"]),
                                 token["name"])
        elif type in ("Characters", "SpaceCharacters"):
            handler.characters(token["data"])
        elif type == "Comment":
            pass
        else:
            assert False, "Unknown token type"

    for prefix, namespace in prefix_mapping.items():
        handler.endPrefixMapping(prefix)
    handler.endDocument()
site-packages/pip/_vendor/html5lib/treeadapters/__init__.py000064400000000000151733463620020024 0ustar00site-packages/pip/_vendor/html5lib/constants.py000064400000252462151733463620015643 0ustar00from __future__ import absolute_import, division, unicode_literals

import string
import gettext
_ = gettext.gettext

EOF = None

E = {
    "null-character":
        _("Null character in input stream, replaced with U+FFFD."),
    "invalid-codepoint":
        _("Invalid codepoint in stream."),
    "incorrectly-placed-solidus":
        _("Solidus (/) incorrectly placed in tag."),
    "incorrect-cr-newline-entity":
        _("Incorrect CR newline entity, replaced with LF."),
    "illegal-windows-1252-entity":
        _("Entity used with illegal number (windows-1252 reference)."),
    "cant-convert-numeric-entity":
        _("Numeric entity couldn't be converted to character "
          "(codepoint U+%(charAsInt)08x)."),
    "illegal-codepoint-for-numeric-entity":
        _("Numeric entity represents an illegal codepoint: "
          "U+%(charAsInt)08x."),
    "numeric-entity-without-semicolon":
        _("Numeric entity didn't end with ';'."),
    "expected-numeric-entity-but-got-eof":
        _("Numeric entity expected. Got end of file instead."),
    "expected-numeric-entity":
        _("Numeric entity expected but none found."),
    "named-entity-without-semicolon":
        _("Named entity didn't end with ';'."),
    "expected-named-entity":
        _("Named entity expected. Got none."),
    "attributes-in-end-tag":
        _("End tag contains unexpected attributes."),
    'self-closing-flag-on-end-tag':
        _("End tag contains unexpected self-closing flag."),
    "expected-tag-name-but-got-right-bracket":
        _("Expected tag name. Got '>' instead."),
    "expected-tag-name-but-got-question-mark":
        _("Expected tag name. Got '?' instead. (HTML doesn't "
          "support processing instructions.)"),
    "expected-tag-name":
        _("Expected tag name. Got something else instead"),
    "expected-closing-tag-but-got-right-bracket":
        _("Expected closing tag. Got '>' instead. Ignoring '</>'."),
    "expected-closing-tag-but-got-eof":
        _("Expected closing tag. Unexpected end of file."),
    "expected-closing-tag-but-got-char":
        _("Expected closing tag. Unexpected character '%(data)s' found."),
    "eof-in-tag-name":
        _("Unexpected end of file in the tag name."),
    "expected-attribute-name-but-got-eof":
        _("Unexpected end of file. Expected attribute name instead."),
    "eof-in-attribute-name":
        _("Unexpected end of file in attribute name."),
    "invalid-character-in-attribute-name":
        _("Invalid character in attribute name"),
    "duplicate-attribute":
        _("Dropped duplicate attribute on tag."),
    "expected-end-of-tag-name-but-got-eof":
        _("Unexpected end of file. Expected = or end of tag."),
    "expected-attribute-value-but-got-eof":
        _("Unexpected end of file. Expected attribute value."),
    "expected-attribute-value-but-got-right-bracket":
        _("Expected attribute value. Got '>' instead."),
    'equals-in-unquoted-attribute-value':
        _("Unexpected = in unquoted attribute"),
    'unexpected-character-in-unquoted-attribute-value':
        _("Unexpected character in unquoted attribute"),
    "invalid-character-after-attribute-name":
        _("Unexpected character after attribute name."),
    "unexpected-character-after-attribute-value":
        _("Unexpected character after attribute value."),
    "eof-in-attribute-value-double-quote":
        _("Unexpected end of file in attribute value (\")."),
    "eof-in-attribute-value-single-quote":
        _("Unexpected end of file in attribute value (')."),
    "eof-in-attribute-value-no-quotes":
        _("Unexpected end of file in attribute value."),
    "unexpected-EOF-after-solidus-in-tag":
        _("Unexpected end of file in tag. Expected >"),
    "unexpected-character-after-solidus-in-tag":
        _("Unexpected character after / in tag. Expected >"),
    "expected-dashes-or-doctype":
        _("Expected '--' or 'DOCTYPE'. Not found."),
    "unexpected-bang-after-double-dash-in-comment":
        _("Unexpected ! after -- in comment"),
    "unexpected-space-after-double-dash-in-comment":
        _("Unexpected space after -- in comment"),
    "incorrect-comment":
        _("Incorrect comment."),
    "eof-in-comment":
        _("Unexpected end of file in comment."),
    "eof-in-comment-end-dash":
        _("Unexpected end of file in comment (-)"),
    "unexpected-dash-after-double-dash-in-comment":
        _("Unexpected '-' after '--' found in comment."),
    "eof-in-comment-double-dash":
        _("Unexpected end of file in comment (--)."),
    "eof-in-comment-end-space-state":
        _("Unexpected end of file in comment."),
    "eof-in-comment-end-bang-state":
        _("Unexpected end of file in comment."),
    "unexpected-char-in-comment":
        _("Unexpected character in comment found."),
    "need-space-after-doctype":
        _("No space after literal string 'DOCTYPE'."),
    "expected-doctype-name-but-got-right-bracket":
        _("Unexpected > character. Expected DOCTYPE name."),
    "expected-doctype-name-but-got-eof":
        _("Unexpected end of file. Expected DOCTYPE name."),
    "eof-in-doctype-name":
        _("Unexpected end of file in DOCTYPE name."),
    "eof-in-doctype":
        _("Unexpected end of file in DOCTYPE."),
    "expected-space-or-right-bracket-in-doctype":
        _("Expected space or '>'. Got '%(data)s'"),
    "unexpected-end-of-doctype":
        _("Unexpected end of DOCTYPE."),
    "unexpected-char-in-doctype":
        _("Unexpected character in DOCTYPE."),
    "eof-in-innerhtml":
        _("XXX innerHTML EOF"),
    "unexpected-doctype":
        _("Unexpected DOCTYPE. Ignored."),
    "non-html-root":
        _("html needs to be the first start tag."),
    "expected-doctype-but-got-eof":
        _("Unexpected End of file. Expected DOCTYPE."),
    "unknown-doctype":
        _("Erroneous DOCTYPE."),
    "expected-doctype-but-got-chars":
        _("Unexpected non-space characters. Expected DOCTYPE."),
    "expected-doctype-but-got-start-tag":
        _("Unexpected start tag (%(name)s). Expected DOCTYPE."),
    "expected-doctype-but-got-end-tag":
        _("Unexpected end tag (%(name)s). Expected DOCTYPE."),
    "end-tag-after-implied-root":
        _("Unexpected end tag (%(name)s) after the (implied) root element."),
    "expected-named-closing-tag-but-got-eof":
        _("Unexpected end of file. Expected end tag (%(name)s)."),
    "two-heads-are-not-better-than-one":
        _("Unexpected start tag head in existing head. Ignored."),
    "unexpected-end-tag":
        _("Unexpected end tag (%(name)s). Ignored."),
    "unexpected-start-tag-out-of-my-head":
        _("Unexpected start tag (%(name)s) that can be in head. Moved."),
    "unexpected-start-tag":
        _("Unexpected start tag (%(name)s)."),
    "missing-end-tag":
        _("Missing end tag (%(name)s)."),
    "missing-end-tags":
        _("Missing end tags (%(name)s)."),
    "unexpected-start-tag-implies-end-tag":
        _("Unexpected start tag (%(startName)s) "
          "implies end tag (%(endName)s)."),
    "unexpected-start-tag-treated-as":
        _("Unexpected start tag (%(originalName)s). Treated as %(newName)s."),
    "deprecated-tag":
        _("Unexpected start tag %(name)s. Don't use it!"),
    "unexpected-start-tag-ignored":
        _("Unexpected start tag %(name)s. Ignored."),
    "expected-one-end-tag-but-got-another":
        _("Unexpected end tag (%(gotName)s). "
          "Missing end tag (%(expectedName)s)."),
    "end-tag-too-early":
        _("End tag (%(name)s) seen too early. Expected other end tag."),
    "end-tag-too-early-named":
        _("Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s)."),
    "end-tag-too-early-ignored":
        _("End tag (%(name)s) seen too early. Ignored."),
    "adoption-agency-1.1":
        _("End tag (%(name)s) violates step 1, "
          "paragraph 1 of the adoption agency algorithm."),
    "adoption-agency-1.2":
        _("End tag (%(name)s) violates step 1, "
          "paragraph 2 of the adoption agency algorithm."),
    "adoption-agency-1.3":
        _("End tag (%(name)s) violates step 1, "
          "paragraph 3 of the adoption agency algorithm."),
    "adoption-agency-4.4":
        _("End tag (%(name)s) violates step 4, "
          "paragraph 4 of the adoption agency algorithm."),
    "unexpected-end-tag-treated-as":
        _("Unexpected end tag (%(originalName)s). Treated as %(newName)s."),
    "no-end-tag":
        _("This element (%(name)s) has no end tag."),
    "unexpected-implied-end-tag-in-table":
        _("Unexpected implied end tag (%(name)s) in the table phase."),
    "unexpected-implied-end-tag-in-table-body":
        _("Unexpected implied end tag (%(name)s) in the table body phase."),
    "unexpected-char-implies-table-voodoo":
        _("Unexpected non-space characters in "
          "table context caused voodoo mode."),
    "unexpected-hidden-input-in-table":
        _("Unexpected input with type hidden in table context."),
    "unexpected-form-in-table":
        _("Unexpected form in table context."),
    "unexpected-start-tag-implies-table-voodoo":
        _("Unexpected start tag (%(name)s) in "
          "table context caused voodoo mode."),
    "unexpected-end-tag-implies-table-voodoo":
        _("Unexpected end tag (%(name)s) in "
          "table context caused voodoo mode."),
    "unexpected-cell-in-table-body":
        _("Unexpected table cell start tag (%(name)s) "
          "in the table body phase."),
    "unexpected-cell-end-tag":
        _("Got table cell end tag (%(name)s) "
          "while required end tags are missing."),
    "unexpected-end-tag-in-table-body":
        _("Unexpected end tag (%(name)s) in the table body phase. Ignored."),
    "unexpected-implied-end-tag-in-table-row":
        _("Unexpected implied end tag (%(name)s) in the table row phase."),
    "unexpected-end-tag-in-table-row":
        _("Unexpected end tag (%(name)s) in the table row phase. Ignored."),
    "unexpected-select-in-select":
        _("Unexpected select start tag in the select phase "
          "treated as select end tag."),
    "unexpected-input-in-select":
        _("Unexpected input start tag in the select phase."),
    "unexpected-start-tag-in-select":
        _("Unexpected start tag token (%(name)s in the select phase. "
          "Ignored."),
    "unexpected-end-tag-in-select":
        _("Unexpected end tag (%(name)s) in the select phase. Ignored."),
    "unexpected-table-element-start-tag-in-select-in-table":
        _("Unexpected table element start tag (%(name)s) in the select in table phase."),
    "unexpected-table-element-end-tag-in-select-in-table":
        _("Unexpected table element end tag (%(name)s) in the select in table phase."),
    "unexpected-char-after-body":
        _("Unexpected non-space characters in the after body phase."),
    "unexpected-start-tag-after-body":
        _("Unexpected start tag token (%(name)s)"
          " in the after body phase."),
    "unexpected-end-tag-after-body":
        _("Unexpected end tag token (%(name)s)"
          " in the after body phase."),
    "unexpected-char-in-frameset":
        _("Unexpected characters in the frameset phase. Characters ignored."),
    "unexpected-start-tag-in-frameset":
        _("Unexpected start tag token (%(name)s)"
          " in the frameset phase. Ignored."),
    "unexpected-frameset-in-frameset-innerhtml":
        _("Unexpected end tag token (frameset) "
          "in the frameset phase (innerHTML)."),
    "unexpected-end-tag-in-frameset":
        _("Unexpected end tag token (%(name)s)"
          " in the frameset phase. Ignored."),
    "unexpected-char-after-frameset":
        _("Unexpected non-space characters in the "
          "after frameset phase. Ignored."),
    "unexpected-start-tag-after-frameset":
        _("Unexpected start tag (%(name)s)"
          " in the after frameset phase. Ignored."),
    "unexpected-end-tag-after-frameset":
        _("Unexpected end tag (%(name)s)"
          " in the after frameset phase. Ignored."),
    "unexpected-end-tag-after-body-innerhtml":
        _("Unexpected end tag after body(innerHtml)"),
    "expected-eof-but-got-char":
        _("Unexpected non-space characters. Expected end of file."),
    "expected-eof-but-got-start-tag":
        _("Unexpected start tag (%(name)s)"
          ". Expected end of file."),
    "expected-eof-but-got-end-tag":
        _("Unexpected end tag (%(name)s)"
          ". Expected end of file."),
    "eof-in-table":
        _("Unexpected end of file. Expected table content."),
    "eof-in-select":
        _("Unexpected end of file. Expected select content."),
    "eof-in-frameset":
        _("Unexpected end of file. Expected frameset content."),
    "eof-in-script-in-script":
        _("Unexpected end of file. Expected script content."),
    "eof-in-foreign-lands":
        _("Unexpected end of file. Expected foreign content"),
    "non-void-element-with-trailing-solidus":
        _("Trailing solidus not allowed on element %(name)s"),
    "unexpected-html-element-in-foreign-content":
        _("Element %(name)s not allowed in a non-html context"),
    "unexpected-end-tag-before-html":
        _("Unexpected end tag (%(name)s) before html."),
    "XXX-undefined-error":
        _("Undefined error (this sucks and should be fixed)"),
}

namespaces = {
    "html": "http://www.w3.org/1999/xhtml",
    "mathml": "http://www.w3.org/1998/Math/MathML",
    "svg": "http://www.w3.org/2000/svg",
    "xlink": "http://www.w3.org/1999/xlink",
    "xml": "http://www.w3.org/XML/1998/namespace",
    "xmlns": "http://www.w3.org/2000/xmlns/"
}

scopingElements = frozenset((
    (namespaces["html"], "applet"),
    (namespaces["html"], "caption"),
    (namespaces["html"], "html"),
    (namespaces["html"], "marquee"),
    (namespaces["html"], "object"),
    (namespaces["html"], "table"),
    (namespaces["html"], "td"),
    (namespaces["html"], "th"),
    (namespaces["mathml"], "mi"),
    (namespaces["mathml"], "mo"),
    (namespaces["mathml"], "mn"),
    (namespaces["mathml"], "ms"),
    (namespaces["mathml"], "mtext"),
    (namespaces["mathml"], "annotation-xml"),
    (namespaces["svg"], "foreignObject"),
    (namespaces["svg"], "desc"),
    (namespaces["svg"], "title"),
))

formattingElements = frozenset((
    (namespaces["html"], "a"),
    (namespaces["html"], "b"),
    (namespaces["html"], "big"),
    (namespaces["html"], "code"),
    (namespaces["html"], "em"),
    (namespaces["html"], "font"),
    (namespaces["html"], "i"),
    (namespaces["html"], "nobr"),
    (namespaces["html"], "s"),
    (namespaces["html"], "small"),
    (namespaces["html"], "strike"),
    (namespaces["html"], "strong"),
    (namespaces["html"], "tt"),
    (namespaces["html"], "u")
))

specialElements = frozenset((
    (namespaces["html"], "address"),
    (namespaces["html"], "applet"),
    (namespaces["html"], "area"),
    (namespaces["html"], "article"),
    (namespaces["html"], "aside"),
    (namespaces["html"], "base"),
    (namespaces["html"], "basefont"),
    (namespaces["html"], "bgsound"),
    (namespaces["html"], "blockquote"),
    (namespaces["html"], "body"),
    (namespaces["html"], "br"),
    (namespaces["html"], "button"),
    (namespaces["html"], "caption"),
    (namespaces["html"], "center"),
    (namespaces["html"], "col"),
    (namespaces["html"], "colgroup"),
    (namespaces["html"], "command"),
    (namespaces["html"], "dd"),
    (namespaces["html"], "details"),
    (namespaces["html"], "dir"),
    (namespaces["html"], "div"),
    (namespaces["html"], "dl"),
    (namespaces["html"], "dt"),
    (namespaces["html"], "embed"),
    (namespaces["html"], "fieldset"),
    (namespaces["html"], "figure"),
    (namespaces["html"], "footer"),
    (namespaces["html"], "form"),
    (namespaces["html"], "frame"),
    (namespaces["html"], "frameset"),
    (namespaces["html"], "h1"),
    (namespaces["html"], "h2"),
    (namespaces["html"], "h3"),
    (namespaces["html"], "h4"),
    (namespaces["html"], "h5"),
    (namespaces["html"], "h6"),
    (namespaces["html"], "head"),
    (namespaces["html"], "header"),
    (namespaces["html"], "hr"),
    (namespaces["html"], "html"),
    (namespaces["html"], "iframe"),
    # Note that image is commented out in the spec as "this isn't an
    # element that can end up on the stack, so it doesn't matter,"
    (namespaces["html"], "image"),
    (namespaces["html"], "img"),
    (namespaces["html"], "input"),
    (namespaces["html"], "isindex"),
    (namespaces["html"], "li"),
    (namespaces["html"], "link"),
    (namespaces["html"], "listing"),
    (namespaces["html"], "marquee"),
    (namespaces["html"], "menu"),
    (namespaces["html"], "meta"),
    (namespaces["html"], "nav"),
    (namespaces["html"], "noembed"),
    (namespaces["html"], "noframes"),
    (namespaces["html"], "noscript"),
    (namespaces["html"], "object"),
    (namespaces["html"], "ol"),
    (namespaces["html"], "p"),
    (namespaces["html"], "param"),
    (namespaces["html"], "plaintext"),
    (namespaces["html"], "pre"),
    (namespaces["html"], "script"),
    (namespaces["html"], "section"),
    (namespaces["html"], "select"),
    (namespaces["html"], "style"),
    (namespaces["html"], "table"),
    (namespaces["html"], "tbody"),
    (namespaces["html"], "td"),
    (namespaces["html"], "textarea"),
    (namespaces["html"], "tfoot"),
    (namespaces["html"], "th"),
    (namespaces["html"], "thead"),
    (namespaces["html"], "title"),
    (namespaces["html"], "tr"),
    (namespaces["html"], "ul"),
    (namespaces["html"], "wbr"),
    (namespaces["html"], "xmp"),
    (namespaces["svg"], "foreignObject")
))

htmlIntegrationPointElements = frozenset((
    (namespaces["mathml"], "annotaion-xml"),
    (namespaces["svg"], "foreignObject"),
    (namespaces["svg"], "desc"),
    (namespaces["svg"], "title")
))

mathmlTextIntegrationPointElements = frozenset((
    (namespaces["mathml"], "mi"),
    (namespaces["mathml"], "mo"),
    (namespaces["mathml"], "mn"),
    (namespaces["mathml"], "ms"),
    (namespaces["mathml"], "mtext")
))

adjustForeignAttributes = {
    "xlink:actuate": ("xlink", "actuate", namespaces["xlink"]),
    "xlink:arcrole": ("xlink", "arcrole", namespaces["xlink"]),
    "xlink:href": ("xlink", "href", namespaces["xlink"]),
    "xlink:role": ("xlink", "role", namespaces["xlink"]),
    "xlink:show": ("xlink", "show", namespaces["xlink"]),
    "xlink:title": ("xlink", "title", namespaces["xlink"]),
    "xlink:type": ("xlink", "type", namespaces["xlink"]),
    "xml:base": ("xml", "base", namespaces["xml"]),
    "xml:lang": ("xml", "lang", namespaces["xml"]),
    "xml:space": ("xml", "space", namespaces["xml"]),
    "xmlns": (None, "xmlns", namespaces["xmlns"]),
    "xmlns:xlink": ("xmlns", "xlink", namespaces["xmlns"])
}

unadjustForeignAttributes = dict([((ns, local), qname) for qname, (prefix, local, ns) in
                                  adjustForeignAttributes.items()])

spaceCharacters = frozenset((
    "\t",
    "\n",
    "\u000C",
    " ",
    "\r"
))

tableInsertModeElements = frozenset((
    "table",
    "tbody",
    "tfoot",
    "thead",
    "tr"
))

asciiLowercase = frozenset(string.ascii_lowercase)
asciiUppercase = frozenset(string.ascii_uppercase)
asciiLetters = frozenset(string.ascii_letters)
digits = frozenset(string.digits)
hexDigits = frozenset(string.hexdigits)

asciiUpper2Lower = dict([(ord(c), ord(c.lower()))
                         for c in string.ascii_uppercase])

# Heading elements need to be ordered
headingElements = (
    "h1",
    "h2",
    "h3",
    "h4",
    "h5",
    "h6"
)

voidElements = frozenset((
    "base",
    "command",
    "event-source",
    "link",
    "meta",
    "hr",
    "br",
    "img",
    "embed",
    "param",
    "area",
    "col",
    "input",
    "source",
    "track"
))

cdataElements = frozenset(('title', 'textarea'))

rcdataElements = frozenset((
    'style',
    'script',
    'xmp',
    'iframe',
    'noembed',
    'noframes',
    'noscript'
))

booleanAttributes = {
    "": frozenset(("irrelevant",)),
    "style": frozenset(("scoped",)),
    "img": frozenset(("ismap",)),
    "audio": frozenset(("autoplay", "controls")),
    "video": frozenset(("autoplay", "controls")),
    "script": frozenset(("defer", "async")),
    "details": frozenset(("open",)),
    "datagrid": frozenset(("multiple", "disabled")),
    "command": frozenset(("hidden", "disabled", "checked", "default")),
    "hr": frozenset(("noshade")),
    "menu": frozenset(("autosubmit",)),
    "fieldset": frozenset(("disabled", "readonly")),
    "option": frozenset(("disabled", "readonly", "selected")),
    "optgroup": frozenset(("disabled", "readonly")),
    "button": frozenset(("disabled", "autofocus")),
    "input": frozenset(("disabled", "readonly", "required", "autofocus", "checked", "ismap")),
    "select": frozenset(("disabled", "readonly", "autofocus", "multiple")),
    "output": frozenset(("disabled", "readonly")),
}

# entitiesWindows1252 has to be _ordered_ and needs to have an index. It
# therefore can't be a frozenset.
entitiesWindows1252 = (
    8364,   # 0x80  0x20AC  EURO SIGN
    65533,  # 0x81          UNDEFINED
    8218,   # 0x82  0x201A  SINGLE LOW-9 QUOTATION MARK
    402,    # 0x83  0x0192  LATIN SMALL LETTER F WITH HOOK
    8222,   # 0x84  0x201E  DOUBLE LOW-9 QUOTATION MARK
    8230,   # 0x85  0x2026  HORIZONTAL ELLIPSIS
    8224,   # 0x86  0x2020  DAGGER
    8225,   # 0x87  0x2021  DOUBLE DAGGER
    710,    # 0x88  0x02C6  MODIFIER LETTER CIRCUMFLEX ACCENT
    8240,   # 0x89  0x2030  PER MILLE SIGN
    352,    # 0x8A  0x0160  LATIN CAPITAL LETTER S WITH CARON
    8249,   # 0x8B  0x2039  SINGLE LEFT-POINTING ANGLE QUOTATION MARK
    338,    # 0x8C  0x0152  LATIN CAPITAL LIGATURE OE
    65533,  # 0x8D          UNDEFINED
    381,    # 0x8E  0x017D  LATIN CAPITAL LETTER Z WITH CARON
    65533,  # 0x8F          UNDEFINED
    65533,  # 0x90          UNDEFINED
    8216,   # 0x91  0x2018  LEFT SINGLE QUOTATION MARK
    8217,   # 0x92  0x2019  RIGHT SINGLE QUOTATION MARK
    8220,   # 0x93  0x201C  LEFT DOUBLE QUOTATION MARK
    8221,   # 0x94  0x201D  RIGHT DOUBLE QUOTATION MARK
    8226,   # 0x95  0x2022  BULLET
    8211,   # 0x96  0x2013  EN DASH
    8212,   # 0x97  0x2014  EM DASH
    732,    # 0x98  0x02DC  SMALL TILDE
    8482,   # 0x99  0x2122  TRADE MARK SIGN
    353,    # 0x9A  0x0161  LATIN SMALL LETTER S WITH CARON
    8250,   # 0x9B  0x203A  SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
    339,    # 0x9C  0x0153  LATIN SMALL LIGATURE OE
    65533,  # 0x9D          UNDEFINED
    382,    # 0x9E  0x017E  LATIN SMALL LETTER Z WITH CARON
    376     # 0x9F  0x0178  LATIN CAPITAL LETTER Y WITH DIAERESIS
)

xmlEntities = frozenset(('lt;', 'gt;', 'amp;', 'apos;', 'quot;'))

entities = {
    "AElig": "\xc6",
    "AElig;": "\xc6",
    "AMP": "&",
    "AMP;": "&",
    "Aacute": "\xc1",
    "Aacute;": "\xc1",
    "Abreve;": "\u0102",
    "Acirc": "\xc2",
    "Acirc;": "\xc2",
    "Acy;": "\u0410",
    "Afr;": "\U0001d504",
    "Agrave": "\xc0",
    "Agrave;": "\xc0",
    "Alpha;": "\u0391",
    "Amacr;": "\u0100",
    "And;": "\u2a53",
    "Aogon;": "\u0104",
    "Aopf;": "\U0001d538",
    "ApplyFunction;": "\u2061",
    "Aring": "\xc5",
    "Aring;": "\xc5",
    "Ascr;": "\U0001d49c",
    "Assign;": "\u2254",
    "Atilde": "\xc3",
    "Atilde;": "\xc3",
    "Auml": "\xc4",
    "Auml;": "\xc4",
    "Backslash;": "\u2216",
    "Barv;": "\u2ae7",
    "Barwed;": "\u2306",
    "Bcy;": "\u0411",
    "Because;": "\u2235",
    "Bernoullis;": "\u212c",
    "Beta;": "\u0392",
    "Bfr;": "\U0001d505",
    "Bopf;": "\U0001d539",
    "Breve;": "\u02d8",
    "Bscr;": "\u212c",
    "Bumpeq;": "\u224e",
    "CHcy;": "\u0427",
    "COPY": "\xa9",
    "COPY;": "\xa9",
    "Cacute;": "\u0106",
    "Cap;": "\u22d2",
    "CapitalDifferentialD;": "\u2145",
    "Cayleys;": "\u212d",
    "Ccaron;": "\u010c",
    "Ccedil": "\xc7",
    "Ccedil;": "\xc7",
    "Ccirc;": "\u0108",
    "Cconint;": "\u2230",
    "Cdot;": "\u010a",
    "Cedilla;": "\xb8",
    "CenterDot;": "\xb7",
    "Cfr;": "\u212d",
    "Chi;": "\u03a7",
    "CircleDot;": "\u2299",
    "CircleMinus;": "\u2296",
    "CirclePlus;": "\u2295",
    "CircleTimes;": "\u2297",
    "ClockwiseContourIntegral;": "\u2232",
    "CloseCurlyDoubleQuote;": "\u201d",
    "CloseCurlyQuote;": "\u2019",
    "Colon;": "\u2237",
    "Colone;": "\u2a74",
    "Congruent;": "\u2261",
    "Conint;": "\u222f",
    "ContourIntegral;": "\u222e",
    "Copf;": "\u2102",
    "Coproduct;": "\u2210",
    "CounterClockwiseContourIntegral;": "\u2233",
    "Cross;": "\u2a2f",
    "Cscr;": "\U0001d49e",
    "Cup;": "\u22d3",
    "CupCap;": "\u224d",
    "DD;": "\u2145",
    "DDotrahd;": "\u2911",
    "DJcy;": "\u0402",
    "DScy;": "\u0405",
    "DZcy;": "\u040f",
    "Dagger;": "\u2021",
    "Darr;": "\u21a1",
    "Dashv;": "\u2ae4",
    "Dcaron;": "\u010e",
    "Dcy;": "\u0414",
    "Del;": "\u2207",
    "Delta;": "\u0394",
    "Dfr;": "\U0001d507",
    "DiacriticalAcute;": "\xb4",
    "DiacriticalDot;": "\u02d9",
    "DiacriticalDoubleAcute;": "\u02dd",
    "DiacriticalGrave;": "`",
    "DiacriticalTilde;": "\u02dc",
    "Diamond;": "\u22c4",
    "DifferentialD;": "\u2146",
    "Dopf;": "\U0001d53b",
    "Dot;": "\xa8",
    "DotDot;": "\u20dc",
    "DotEqual;": "\u2250",
    "DoubleContourIntegral;": "\u222f",
    "DoubleDot;": "\xa8",
    "DoubleDownArrow;": "\u21d3",
    "DoubleLeftArrow;": "\u21d0",
    "DoubleLeftRightArrow;": "\u21d4",
    "DoubleLeftTee;": "\u2ae4",
    "DoubleLongLeftArrow;": "\u27f8",
    "DoubleLongLeftRightArrow;": "\u27fa",
    "DoubleLongRightArrow;": "\u27f9",
    "DoubleRightArrow;": "\u21d2",
    "DoubleRightTee;": "\u22a8",
    "DoubleUpArrow;": "\u21d1",
    "DoubleUpDownArrow;": "\u21d5",
    "DoubleVerticalBar;": "\u2225",
    "DownArrow;": "\u2193",
    "DownArrowBar;": "\u2913",
    "DownArrowUpArrow;": "\u21f5",
    "DownBreve;": "\u0311",
    "DownLeftRightVector;": "\u2950",
    "DownLeftTeeVector;": "\u295e",
    "DownLeftVector;": "\u21bd",
    "DownLeftVectorBar;": "\u2956",
    "DownRightTeeVector;": "\u295f",
    "DownRightVector;": "\u21c1",
    "DownRightVectorBar;": "\u2957",
    "DownTee;": "\u22a4",
    "DownTeeArrow;": "\u21a7",
    "Downarrow;": "\u21d3",
    "Dscr;": "\U0001d49f",
    "Dstrok;": "\u0110",
    "ENG;": "\u014a",
    "ETH": "\xd0",
    "ETH;": "\xd0",
    "Eacute": "\xc9",
    "Eacute;": "\xc9",
    "Ecaron;": "\u011a",
    "Ecirc": "\xca",
    "Ecirc;": "\xca",
    "Ecy;": "\u042d",
    "Edot;": "\u0116",
    "Efr;": "\U0001d508",
    "Egrave": "\xc8",
    "Egrave;": "\xc8",
    "Element;": "\u2208",
    "Emacr;": "\u0112",
    "EmptySmallSquare;": "\u25fb",
    "EmptyVerySmallSquare;": "\u25ab",
    "Eogon;": "\u0118",
    "Eopf;": "\U0001d53c",
    "Epsilon;": "\u0395",
    "Equal;": "\u2a75",
    "EqualTilde;": "\u2242",
    "Equilibrium;": "\u21cc",
    "Escr;": "\u2130",
    "Esim;": "\u2a73",
    "Eta;": "\u0397",
    "Euml": "\xcb",
    "Euml;": "\xcb",
    "Exists;": "\u2203",
    "ExponentialE;": "\u2147",
    "Fcy;": "\u0424",
    "Ffr;": "\U0001d509",
    "FilledSmallSquare;": "\u25fc",
    "FilledVerySmallSquare;": "\u25aa",
    "Fopf;": "\U0001d53d",
    "ForAll;": "\u2200",
    "Fouriertrf;": "\u2131",
    "Fscr;": "\u2131",
    "GJcy;": "\u0403",
    "GT": ">",
    "GT;": ">",
    "Gamma;": "\u0393",
    "Gammad;": "\u03dc",
    "Gbreve;": "\u011e",
    "Gcedil;": "\u0122",
    "Gcirc;": "\u011c",
    "Gcy;": "\u0413",
    "Gdot;": "\u0120",
    "Gfr;": "\U0001d50a",
    "Gg;": "\u22d9",
    "Gopf;": "\U0001d53e",
    "GreaterEqual;": "\u2265",
    "GreaterEqualLess;": "\u22db",
    "GreaterFullEqual;": "\u2267",
    "GreaterGreater;": "\u2aa2",
    "GreaterLess;": "\u2277",
    "GreaterSlantEqual;": "\u2a7e",
    "GreaterTilde;": "\u2273",
    "Gscr;": "\U0001d4a2",
    "Gt;": "\u226b",
    "HARDcy;": "\u042a",
    "Hacek;": "\u02c7",
    "Hat;": "^",
    "Hcirc;": "\u0124",
    "Hfr;": "\u210c",
    "HilbertSpace;": "\u210b",
    "Hopf;": "\u210d",
    "HorizontalLine;": "\u2500",
    "Hscr;": "\u210b",
    "Hstrok;": "\u0126",
    "HumpDownHump;": "\u224e",
    "HumpEqual;": "\u224f",
    "IEcy;": "\u0415",
    "IJlig;": "\u0132",
    "IOcy;": "\u0401",
    "Iacute": "\xcd",
    "Iacute;": "\xcd",
    "Icirc": "\xce",
    "Icirc;": "\xce",
    "Icy;": "\u0418",
    "Idot;": "\u0130",
    "Ifr;": "\u2111",
    "Igrave": "\xcc",
    "Igrave;": "\xcc",
    "Im;": "\u2111",
    "Imacr;": "\u012a",
    "ImaginaryI;": "\u2148",
    "Implies;": "\u21d2",
    "Int;": "\u222c",
    "Integral;": "\u222b",
    "Intersection;": "\u22c2",
    "InvisibleComma;": "\u2063",
    "InvisibleTimes;": "\u2062",
    "Iogon;": "\u012e",
    "Iopf;": "\U0001d540",
    "Iota;": "\u0399",
    "Iscr;": "\u2110",
    "Itilde;": "\u0128",
    "Iukcy;": "\u0406",
    "Iuml": "\xcf",
    "Iuml;": "\xcf",
    "Jcirc;": "\u0134",
    "Jcy;": "\u0419",
    "Jfr;": "\U0001d50d",
    "Jopf;": "\U0001d541",
    "Jscr;": "\U0001d4a5",
    "Jsercy;": "\u0408",
    "Jukcy;": "\u0404",
    "KHcy;": "\u0425",
    "KJcy;": "\u040c",
    "Kappa;": "\u039a",
    "Kcedil;": "\u0136",
    "Kcy;": "\u041a",
    "Kfr;": "\U0001d50e",
    "Kopf;": "\U0001d542",
    "Kscr;": "\U0001d4a6",
    "LJcy;": "\u0409",
    "LT": "<",
    "LT;": "<",
    "Lacute;": "\u0139",
    "Lambda;": "\u039b",
    "Lang;": "\u27ea",
    "Laplacetrf;": "\u2112",
    "Larr;": "\u219e",
    "Lcaron;": "\u013d",
    "Lcedil;": "\u013b",
    "Lcy;": "\u041b",
    "LeftAngleBracket;": "\u27e8",
    "LeftArrow;": "\u2190",
    "LeftArrowBar;": "\u21e4",
    "LeftArrowRightArrow;": "\u21c6",
    "LeftCeiling;": "\u2308",
    "LeftDoubleBracket;": "\u27e6",
    "LeftDownTeeVector;": "\u2961",
    "LeftDownVector;": "\u21c3",
    "LeftDownVectorBar;": "\u2959",
    "LeftFloor;": "\u230a",
    "LeftRightArrow;": "\u2194",
    "LeftRightVector;": "\u294e",
    "LeftTee;": "\u22a3",
    "LeftTeeArrow;": "\u21a4",
    "LeftTeeVector;": "\u295a",
    "LeftTriangle;": "\u22b2",
    "LeftTriangleBar;": "\u29cf",
    "LeftTriangleEqual;": "\u22b4",
    "LeftUpDownVector;": "\u2951",
    "LeftUpTeeVector;": "\u2960",
    "LeftUpVector;": "\u21bf",
    "LeftUpVectorBar;": "\u2958",
    "LeftVector;": "\u21bc",
    "LeftVectorBar;": "\u2952",
    "Leftarrow;": "\u21d0",
    "Leftrightarrow;": "\u21d4",
    "LessEqualGreater;": "\u22da",
    "LessFullEqual;": "\u2266",
    "LessGreater;": "\u2276",
    "LessLess;": "\u2aa1",
    "LessSlantEqual;": "\u2a7d",
    "LessTilde;": "\u2272",
    "Lfr;": "\U0001d50f",
    "Ll;": "\u22d8",
    "Lleftarrow;": "\u21da",
    "Lmidot;": "\u013f",
    "LongLeftArrow;": "\u27f5",
    "LongLeftRightArrow;": "\u27f7",
    "LongRightArrow;": "\u27f6",
    "Longleftarrow;": "\u27f8",
    "Longleftrightarrow;": "\u27fa",
    "Longrightarrow;": "\u27f9",
    "Lopf;": "\U0001d543",
    "LowerLeftArrow;": "\u2199",
    "LowerRightArrow;": "\u2198",
    "Lscr;": "\u2112",
    "Lsh;": "\u21b0",
    "Lstrok;": "\u0141",
    "Lt;": "\u226a",
    "Map;": "\u2905",
    "Mcy;": "\u041c",
    "MediumSpace;": "\u205f",
    "Mellintrf;": "\u2133",
    "Mfr;": "\U0001d510",
    "MinusPlus;": "\u2213",
    "Mopf;": "\U0001d544",
    "Mscr;": "\u2133",
    "Mu;": "\u039c",
    "NJcy;": "\u040a",
    "Nacute;": "\u0143",
    "Ncaron;": "\u0147",
    "Ncedil;": "\u0145",
    "Ncy;": "\u041d",
    "NegativeMediumSpace;": "\u200b",
    "NegativeThickSpace;": "\u200b",
    "NegativeThinSpace;": "\u200b",
    "NegativeVeryThinSpace;": "\u200b",
    "NestedGreaterGreater;": "\u226b",
    "NestedLessLess;": "\u226a",
    "NewLine;": "\n",
    "Nfr;": "\U0001d511",
    "NoBreak;": "\u2060",
    "NonBreakingSpace;": "\xa0",
    "Nopf;": "\u2115",
    "Not;": "\u2aec",
    "NotCongruent;": "\u2262",
    "NotCupCap;": "\u226d",
    "NotDoubleVerticalBar;": "\u2226",
    "NotElement;": "\u2209",
    "NotEqual;": "\u2260",
    "NotEqualTilde;": "\u2242\u0338",
    "NotExists;": "\u2204",
    "NotGreater;": "\u226f",
    "NotGreaterEqual;": "\u2271",
    "NotGreaterFullEqual;": "\u2267\u0338",
    "NotGreaterGreater;": "\u226b\u0338",
    "NotGreaterLess;": "\u2279",
    "NotGreaterSlantEqual;": "\u2a7e\u0338",
    "NotGreaterTilde;": "\u2275",
    "NotHumpDownHump;": "\u224e\u0338",
    "NotHumpEqual;": "\u224f\u0338",
    "NotLeftTriangle;": "\u22ea",
    "NotLeftTriangleBar;": "\u29cf\u0338",
    "NotLeftTriangleEqual;": "\u22ec",
    "NotLess;": "\u226e",
    "NotLessEqual;": "\u2270",
    "NotLessGreater;": "\u2278",
    "NotLessLess;": "\u226a\u0338",
    "NotLessSlantEqual;": "\u2a7d\u0338",
    "NotLessTilde;": "\u2274",
    "NotNestedGreaterGreater;": "\u2aa2\u0338",
    "NotNestedLessLess;": "\u2aa1\u0338",
    "NotPrecedes;": "\u2280",
    "NotPrecedesEqual;": "\u2aaf\u0338",
    "NotPrecedesSlantEqual;": "\u22e0",
    "NotReverseElement;": "\u220c",
    "NotRightTriangle;": "\u22eb",
    "NotRightTriangleBar;": "\u29d0\u0338",
    "NotRightTriangleEqual;": "\u22ed",
    "NotSquareSubset;": "\u228f\u0338",
    "NotSquareSubsetEqual;": "\u22e2",
    "NotSquareSuperset;": "\u2290\u0338",
    "NotSquareSupersetEqual;": "\u22e3",
    "NotSubset;": "\u2282\u20d2",
    "NotSubsetEqual;": "\u2288",
    "NotSucceeds;": "\u2281",
    "NotSucceedsEqual;": "\u2ab0\u0338",
    "NotSucceedsSlantEqual;": "\u22e1",
    "NotSucceedsTilde;": "\u227f\u0338",
    "NotSuperset;": "\u2283\u20d2",
    "NotSupersetEqual;": "\u2289",
    "NotTilde;": "\u2241",
    "NotTildeEqual;": "\u2244",
    "NotTildeFullEqual;": "\u2247",
    "NotTildeTilde;": "\u2249",
    "NotVerticalBar;": "\u2224",
    "Nscr;": "\U0001d4a9",
    "Ntilde": "\xd1",
    "Ntilde;": "\xd1",
    "Nu;": "\u039d",
    "OElig;": "\u0152",
    "Oacute": "\xd3",
    "Oacute;": "\xd3",
    "Ocirc": "\xd4",
    "Ocirc;": "\xd4",
    "Ocy;": "\u041e",
    "Odblac;": "\u0150",
    "Ofr;": "\U0001d512",
    "Ograve": "\xd2",
    "Ograve;": "\xd2",
    "Omacr;": "\u014c",
    "Omega;": "\u03a9",
    "Omicron;": "\u039f",
    "Oopf;": "\U0001d546",
    "OpenCurlyDoubleQuote;": "\u201c",
    "OpenCurlyQuote;": "\u2018",
    "Or;": "\u2a54",
    "Oscr;": "\U0001d4aa",
    "Oslash": "\xd8",
    "Oslash;": "\xd8",
    "Otilde": "\xd5",
    "Otilde;": "\xd5",
    "Otimes;": "\u2a37",
    "Ouml": "\xd6",
    "Ouml;": "\xd6",
    "OverBar;": "\u203e",
    "OverBrace;": "\u23de",
    "OverBracket;": "\u23b4",
    "OverParenthesis;": "\u23dc",
    "PartialD;": "\u2202",
    "Pcy;": "\u041f",
    "Pfr;": "\U0001d513",
    "Phi;": "\u03a6",
    "Pi;": "\u03a0",
    "PlusMinus;": "\xb1",
    "Poincareplane;": "\u210c",
    "Popf;": "\u2119",
    "Pr;": "\u2abb",
    "Precedes;": "\u227a",
    "PrecedesEqual;": "\u2aaf",
    "PrecedesSlantEqual;": "\u227c",
    "PrecedesTilde;": "\u227e",
    "Prime;": "\u2033",
    "Product;": "\u220f",
    "Proportion;": "\u2237",
    "Proportional;": "\u221d",
    "Pscr;": "\U0001d4ab",
    "Psi;": "\u03a8",
    "QUOT": "\"",
    "QUOT;": "\"",
    "Qfr;": "\U0001d514",
    "Qopf;": "\u211a",
    "Qscr;": "\U0001d4ac",
    "RBarr;": "\u2910",
    "REG": "\xae",
    "REG;": "\xae",
    "Racute;": "\u0154",
    "Rang;": "\u27eb",
    "Rarr;": "\u21a0",
    "Rarrtl;": "\u2916",
    "Rcaron;": "\u0158",
    "Rcedil;": "\u0156",
    "Rcy;": "\u0420",
    "Re;": "\u211c",
    "ReverseElement;": "\u220b",
    "ReverseEquilibrium;": "\u21cb",
    "ReverseUpEquilibrium;": "\u296f",
    "Rfr;": "\u211c",
    "Rho;": "\u03a1",
    "RightAngleBracket;": "\u27e9",
    "RightArrow;": "\u2192",
    "RightArrowBar;": "\u21e5",
    "RightArrowLeftArrow;": "\u21c4",
    "RightCeiling;": "\u2309",
    "RightDoubleBracket;": "\u27e7",
    "RightDownTeeVector;": "\u295d",
    "RightDownVector;": "\u21c2",
    "RightDownVectorBar;": "\u2955",
    "RightFloor;": "\u230b",
    "RightTee;": "\u22a2",
    "RightTeeArrow;": "\u21a6",
    "RightTeeVector;": "\u295b",
    "RightTriangle;": "\u22b3",
    "RightTriangleBar;": "\u29d0",
    "RightTriangleEqual;": "\u22b5",
    "RightUpDownVector;": "\u294f",
    "RightUpTeeVector;": "\u295c",
    "RightUpVector;": "\u21be",
    "RightUpVectorBar;": "\u2954",
    "RightVector;": "\u21c0",
    "RightVectorBar;": "\u2953",
    "Rightarrow;": "\u21d2",
    "Ropf;": "\u211d",
    "RoundImplies;": "\u2970",
    "Rrightarrow;": "\u21db",
    "Rscr;": "\u211b",
    "Rsh;": "\u21b1",
    "RuleDelayed;": "\u29f4",
    "SHCHcy;": "\u0429",
    "SHcy;": "\u0428",
    "SOFTcy;": "\u042c",
    "Sacute;": "\u015a",
    "Sc;": "\u2abc",
    "Scaron;": "\u0160",
    "Scedil;": "\u015e",
    "Scirc;": "\u015c",
    "Scy;": "\u0421",
    "Sfr;": "\U0001d516",
    "ShortDownArrow;": "\u2193",
    "ShortLeftArrow;": "\u2190",
    "ShortRightArrow;": "\u2192",
    "ShortUpArrow;": "\u2191",
    "Sigma;": "\u03a3",
    "SmallCircle;": "\u2218",
    "Sopf;": "\U0001d54a",
    "Sqrt;": "\u221a",
    "Square;": "\u25a1",
    "SquareIntersection;": "\u2293",
    "SquareSubset;": "\u228f",
    "SquareSubsetEqual;": "\u2291",
    "SquareSuperset;": "\u2290",
    "SquareSupersetEqual;": "\u2292",
    "SquareUnion;": "\u2294",
    "Sscr;": "\U0001d4ae",
    "Star;": "\u22c6",
    "Sub;": "\u22d0",
    "Subset;": "\u22d0",
    "SubsetEqual;": "\u2286",
    "Succeeds;": "\u227b",
    "SucceedsEqual;": "\u2ab0",
    "SucceedsSlantEqual;": "\u227d",
    "SucceedsTilde;": "\u227f",
    "SuchThat;": "\u220b",
    "Sum;": "\u2211",
    "Sup;": "\u22d1",
    "Superset;": "\u2283",
    "SupersetEqual;": "\u2287",
    "Supset;": "\u22d1",
    "THORN": "\xde",
    "THORN;": "\xde",
    "TRADE;": "\u2122",
    "TSHcy;": "\u040b",
    "TScy;": "\u0426",
    "Tab;": "\t",
    "Tau;": "\u03a4",
    "Tcaron;": "\u0164",
    "Tcedil;": "\u0162",
    "Tcy;": "\u0422",
    "Tfr;": "\U0001d517",
    "Therefore;": "\u2234",
    "Theta;": "\u0398",
    "ThickSpace;": "\u205f\u200a",
    "ThinSpace;": "\u2009",
    "Tilde;": "\u223c",
    "TildeEqual;": "\u2243",
    "TildeFullEqual;": "\u2245",
    "TildeTilde;": "\u2248",
    "Topf;": "\U0001d54b",
    "TripleDot;": "\u20db",
    "Tscr;": "\U0001d4af",
    "Tstrok;": "\u0166",
    "Uacute": "\xda",
    "Uacute;": "\xda",
    "Uarr;": "\u219f",
    "Uarrocir;": "\u2949",
    "Ubrcy;": "\u040e",
    "Ubreve;": "\u016c",
    "Ucirc": "\xdb",
    "Ucirc;": "\xdb",
    "Ucy;": "\u0423",
    "Udblac;": "\u0170",
    "Ufr;": "\U0001d518",
    "Ugrave": "\xd9",
    "Ugrave;": "\xd9",
    "Umacr;": "\u016a",
    "UnderBar;": "_",
    "UnderBrace;": "\u23df",
    "UnderBracket;": "\u23b5",
    "UnderParenthesis;": "\u23dd",
    "Union;": "\u22c3",
    "UnionPlus;": "\u228e",
    "Uogon;": "\u0172",
    "Uopf;": "\U0001d54c",
    "UpArrow;": "\u2191",
    "UpArrowBar;": "\u2912",
    "UpArrowDownArrow;": "\u21c5",
    "UpDownArrow;": "\u2195",
    "UpEquilibrium;": "\u296e",
    "UpTee;": "\u22a5",
    "UpTeeArrow;": "\u21a5",
    "Uparrow;": "\u21d1",
    "Updownarrow;": "\u21d5",
    "UpperLeftArrow;": "\u2196",
    "UpperRightArrow;": "\u2197",
    "Upsi;": "\u03d2",
    "Upsilon;": "\u03a5",
    "Uring;": "\u016e",
    "Uscr;": "\U0001d4b0",
    "Utilde;": "\u0168",
    "Uuml": "\xdc",
    "Uuml;": "\xdc",
    "VDash;": "\u22ab",
    "Vbar;": "\u2aeb",
    "Vcy;": "\u0412",
    "Vdash;": "\u22a9",
    "Vdashl;": "\u2ae6",
    "Vee;": "\u22c1",
    "Verbar;": "\u2016",
    "Vert;": "\u2016",
    "VerticalBar;": "\u2223",
    "VerticalLine;": "|",
    "VerticalSeparator;": "\u2758",
    "VerticalTilde;": "\u2240",
    "VeryThinSpace;": "\u200a",
    "Vfr;": "\U0001d519",
    "Vopf;": "\U0001d54d",
    "Vscr;": "\U0001d4b1",
    "Vvdash;": "\u22aa",
    "Wcirc;": "\u0174",
    "Wedge;": "\u22c0",
    "Wfr;": "\U0001d51a",
    "Wopf;": "\U0001d54e",
    "Wscr;": "\U0001d4b2",
    "Xfr;": "\U0001d51b",
    "Xi;": "\u039e",
    "Xopf;": "\U0001d54f",
    "Xscr;": "\U0001d4b3",
    "YAcy;": "\u042f",
    "YIcy;": "\u0407",
    "YUcy;": "\u042e",
    "Yacute": "\xdd",
    "Yacute;": "\xdd",
    "Ycirc;": "\u0176",
    "Ycy;": "\u042b",
    "Yfr;": "\U0001d51c",
    "Yopf;": "\U0001d550",
    "Yscr;": "\U0001d4b4",
    "Yuml;": "\u0178",
    "ZHcy;": "\u0416",
    "Zacute;": "\u0179",
    "Zcaron;": "\u017d",
    "Zcy;": "\u0417",
    "Zdot;": "\u017b",
    "ZeroWidthSpace;": "\u200b",
    "Zeta;": "\u0396",
    "Zfr;": "\u2128",
    "Zopf;": "\u2124",
    "Zscr;": "\U0001d4b5",
    "aacute": "\xe1",
    "aacute;": "\xe1",
    "abreve;": "\u0103",
    "ac;": "\u223e",
    "acE;": "\u223e\u0333",
    "acd;": "\u223f",
    "acirc": "\xe2",
    "acirc;": "\xe2",
    "acute": "\xb4",
    "acute;": "\xb4",
    "acy;": "\u0430",
    "aelig": "\xe6",
    "aelig;": "\xe6",
    "af;": "\u2061",
    "afr;": "\U0001d51e",
    "agrave": "\xe0",
    "agrave;": "\xe0",
    "alefsym;": "\u2135",
    "aleph;": "\u2135",
    "alpha;": "\u03b1",
    "amacr;": "\u0101",
    "amalg;": "\u2a3f",
    "amp": "&",
    "amp;": "&",
    "and;": "\u2227",
    "andand;": "\u2a55",
    "andd;": "\u2a5c",
    "andslope;": "\u2a58",
    "andv;": "\u2a5a",
    "ang;": "\u2220",
    "ange;": "\u29a4",
    "angle;": "\u2220",
    "angmsd;": "\u2221",
    "angmsdaa;": "\u29a8",
    "angmsdab;": "\u29a9",
    "angmsdac;": "\u29aa",
    "angmsdad;": "\u29ab",
    "angmsdae;": "\u29ac",
    "angmsdaf;": "\u29ad",
    "angmsdag;": "\u29ae",
    "angmsdah;": "\u29af",
    "angrt;": "\u221f",
    "angrtvb;": "\u22be",
    "angrtvbd;": "\u299d",
    "angsph;": "\u2222",
    "angst;": "\xc5",
    "angzarr;": "\u237c",
    "aogon;": "\u0105",
    "aopf;": "\U0001d552",
    "ap;": "\u2248",
    "apE;": "\u2a70",
    "apacir;": "\u2a6f",
    "ape;": "\u224a",
    "apid;": "\u224b",
    "apos;": "'",
    "approx;": "\u2248",
    "approxeq;": "\u224a",
    "aring": "\xe5",
    "aring;": "\xe5",
    "ascr;": "\U0001d4b6",
    "ast;": "*",
    "asymp;": "\u2248",
    "asympeq;": "\u224d",
    "atilde": "\xe3",
    "atilde;": "\xe3",
    "auml": "\xe4",
    "auml;": "\xe4",
    "awconint;": "\u2233",
    "awint;": "\u2a11",
    "bNot;": "\u2aed",
    "backcong;": "\u224c",
    "backepsilon;": "\u03f6",
    "backprime;": "\u2035",
    "backsim;": "\u223d",
    "backsimeq;": "\u22cd",
    "barvee;": "\u22bd",
    "barwed;": "\u2305",
    "barwedge;": "\u2305",
    "bbrk;": "\u23b5",
    "bbrktbrk;": "\u23b6",
    "bcong;": "\u224c",
    "bcy;": "\u0431",
    "bdquo;": "\u201e",
    "becaus;": "\u2235",
    "because;": "\u2235",
    "bemptyv;": "\u29b0",
    "bepsi;": "\u03f6",
    "bernou;": "\u212c",
    "beta;": "\u03b2",
    "beth;": "\u2136",
    "between;": "\u226c",
    "bfr;": "\U0001d51f",
    "bigcap;": "\u22c2",
    "bigcirc;": "\u25ef",
    "bigcup;": "\u22c3",
    "bigodot;": "\u2a00",
    "bigoplus;": "\u2a01",
    "bigotimes;": "\u2a02",
    "bigsqcup;": "\u2a06",
    "bigstar;": "\u2605",
    "bigtriangledown;": "\u25bd",
    "bigtriangleup;": "\u25b3",
    "biguplus;": "\u2a04",
    "bigvee;": "\u22c1",
    "bigwedge;": "\u22c0",
    "bkarow;": "\u290d",
    "blacklozenge;": "\u29eb",
    "blacksquare;": "\u25aa",
    "blacktriangle;": "\u25b4",
    "blacktriangledown;": "\u25be",
    "blacktriangleleft;": "\u25c2",
    "blacktriangleright;": "\u25b8",
    "blank;": "\u2423",
    "blk12;": "\u2592",
    "blk14;": "\u2591",
    "blk34;": "\u2593",
    "block;": "\u2588",
    "bne;": "=\u20e5",
    "bnequiv;": "\u2261\u20e5",
    "bnot;": "\u2310",
    "bopf;": "\U0001d553",
    "bot;": "\u22a5",
    "bottom;": "\u22a5",
    "bowtie;": "\u22c8",
    "boxDL;": "\u2557",
    "boxDR;": "\u2554",
    "boxDl;": "\u2556",
    "boxDr;": "\u2553",
    "boxH;": "\u2550",
    "boxHD;": "\u2566",
    "boxHU;": "\u2569",
    "boxHd;": "\u2564",
    "boxHu;": "\u2567",
    "boxUL;": "\u255d",
    "boxUR;": "\u255a",
    "boxUl;": "\u255c",
    "boxUr;": "\u2559",
    "boxV;": "\u2551",
    "boxVH;": "\u256c",
    "boxVL;": "\u2563",
    "boxVR;": "\u2560",
    "boxVh;": "\u256b",
    "boxVl;": "\u2562",
    "boxVr;": "\u255f",
    "boxbox;": "\u29c9",
    "boxdL;": "\u2555",
    "boxdR;": "\u2552",
    "boxdl;": "\u2510",
    "boxdr;": "\u250c",
    "boxh;": "\u2500",
    "boxhD;": "\u2565",
    "boxhU;": "\u2568",
    "boxhd;": "\u252c",
    "boxhu;": "\u2534",
    "boxminus;": "\u229f",
    "boxplus;": "\u229e",
    "boxtimes;": "\u22a0",
    "boxuL;": "\u255b",
    "boxuR;": "\u2558",
    "boxul;": "\u2518",
    "boxur;": "\u2514",
    "boxv;": "\u2502",
    "boxvH;": "\u256a",
    "boxvL;": "\u2561",
    "boxvR;": "\u255e",
    "boxvh;": "\u253c",
    "boxvl;": "\u2524",
    "boxvr;": "\u251c",
    "bprime;": "\u2035",
    "breve;": "\u02d8",
    "brvbar": "\xa6",
    "brvbar;": "\xa6",
    "bscr;": "\U0001d4b7",
    "bsemi;": "\u204f",
    "bsim;": "\u223d",
    "bsime;": "\u22cd",
    "bsol;": "\\",
    "bsolb;": "\u29c5",
    "bsolhsub;": "\u27c8",
    "bull;": "\u2022",
    "bullet;": "\u2022",
    "bump;": "\u224e",
    "bumpE;": "\u2aae",
    "bumpe;": "\u224f",
    "bumpeq;": "\u224f",
    "cacute;": "\u0107",
    "cap;": "\u2229",
    "capand;": "\u2a44",
    "capbrcup;": "\u2a49",
    "capcap;": "\u2a4b",
    "capcup;": "\u2a47",
    "capdot;": "\u2a40",
    "caps;": "\u2229\ufe00",
    "caret;": "\u2041",
    "caron;": "\u02c7",
    "ccaps;": "\u2a4d",
    "ccaron;": "\u010d",
    "ccedil": "\xe7",
    "ccedil;": "\xe7",
    "ccirc;": "\u0109",
    "ccups;": "\u2a4c",
    "ccupssm;": "\u2a50",
    "cdot;": "\u010b",
    "cedil": "\xb8",
    "cedil;": "\xb8",
    "cemptyv;": "\u29b2",
    "cent": "\xa2",
    "cent;": "\xa2",
    "centerdot;": "\xb7",
    "cfr;": "\U0001d520",
    "chcy;": "\u0447",
    "check;": "\u2713",
    "checkmark;": "\u2713",
    "chi;": "\u03c7",
    "cir;": "\u25cb",
    "cirE;": "\u29c3",
    "circ;": "\u02c6",
    "circeq;": "\u2257",
    "circlearrowleft;": "\u21ba",
    "circlearrowright;": "\u21bb",
    "circledR;": "\xae",
    "circledS;": "\u24c8",
    "circledast;": "\u229b",
    "circledcirc;": "\u229a",
    "circleddash;": "\u229d",
    "cire;": "\u2257",
    "cirfnint;": "\u2a10",
    "cirmid;": "\u2aef",
    "cirscir;": "\u29c2",
    "clubs;": "\u2663",
    "clubsuit;": "\u2663",
    "colon;": ":",
    "colone;": "\u2254",
    "coloneq;": "\u2254",
    "comma;": ",",
    "commat;": "@",
    "comp;": "\u2201",
    "compfn;": "\u2218",
    "complement;": "\u2201",
    "complexes;": "\u2102",
    "cong;": "\u2245",
    "congdot;": "\u2a6d",
    "conint;": "\u222e",
    "copf;": "\U0001d554",
    "coprod;": "\u2210",
    "copy": "\xa9",
    "copy;": "\xa9",
    "copysr;": "\u2117",
    "crarr;": "\u21b5",
    "cross;": "\u2717",
    "cscr;": "\U0001d4b8",
    "csub;": "\u2acf",
    "csube;": "\u2ad1",
    "csup;": "\u2ad0",
    "csupe;": "\u2ad2",
    "ctdot;": "\u22ef",
    "cudarrl;": "\u2938",
    "cudarrr;": "\u2935",
    "cuepr;": "\u22de",
    "cuesc;": "\u22df",
    "cularr;": "\u21b6",
    "cularrp;": "\u293d",
    "cup;": "\u222a",
    "cupbrcap;": "\u2a48",
    "cupcap;": "\u2a46",
    "cupcup;": "\u2a4a",
    "cupdot;": "\u228d",
    "cupor;": "\u2a45",
    "cups;": "\u222a\ufe00",
    "curarr;": "\u21b7",
    "curarrm;": "\u293c",
    "curlyeqprec;": "\u22de",
    "curlyeqsucc;": "\u22df",
    "curlyvee;": "\u22ce",
    "curlywedge;": "\u22cf",
    "curren": "\xa4",
    "curren;": "\xa4",
    "curvearrowleft;": "\u21b6",
    "curvearrowright;": "\u21b7",
    "cuvee;": "\u22ce",
    "cuwed;": "\u22cf",
    "cwconint;": "\u2232",
    "cwint;": "\u2231",
    "cylcty;": "\u232d",
    "dArr;": "\u21d3",
    "dHar;": "\u2965",
    "dagger;": "\u2020",
    "daleth;": "\u2138",
    "darr;": "\u2193",
    "dash;": "\u2010",
    "dashv;": "\u22a3",
    "dbkarow;": "\u290f",
    "dblac;": "\u02dd",
    "dcaron;": "\u010f",
    "dcy;": "\u0434",
    "dd;": "\u2146",
    "ddagger;": "\u2021",
    "ddarr;": "\u21ca",
    "ddotseq;": "\u2a77",
    "deg": "\xb0",
    "deg;": "\xb0",
    "delta;": "\u03b4",
    "demptyv;": "\u29b1",
    "dfisht;": "\u297f",
    "dfr;": "\U0001d521",
    "dharl;": "\u21c3",
    "dharr;": "\u21c2",
    "diam;": "\u22c4",
    "diamond;": "\u22c4",
    "diamondsuit;": "\u2666",
    "diams;": "\u2666",
    "die;": "\xa8",
    "digamma;": "\u03dd",
    "disin;": "\u22f2",
    "div;": "\xf7",
    "divide": "\xf7",
    "divide;": "\xf7",
    "divideontimes;": "\u22c7",
    "divonx;": "\u22c7",
    "djcy;": "\u0452",
    "dlcorn;": "\u231e",
    "dlcrop;": "\u230d",
    "dollar;": "$",
    "dopf;": "\U0001d555",
    "dot;": "\u02d9",
    "doteq;": "\u2250",
    "doteqdot;": "\u2251",
    "dotminus;": "\u2238",
    "dotplus;": "\u2214",
    "dotsquare;": "\u22a1",
    "doublebarwedge;": "\u2306",
    "downarrow;": "\u2193",
    "downdownarrows;": "\u21ca",
    "downharpoonleft;": "\u21c3",
    "downharpoonright;": "\u21c2",
    "drbkarow;": "\u2910",
    "drcorn;": "\u231f",
    "drcrop;": "\u230c",
    "dscr;": "\U0001d4b9",
    "dscy;": "\u0455",
    "dsol;": "\u29f6",
    "dstrok;": "\u0111",
    "dtdot;": "\u22f1",
    "dtri;": "\u25bf",
    "dtrif;": "\u25be",
    "duarr;": "\u21f5",
    "duhar;": "\u296f",
    "dwangle;": "\u29a6",
    "dzcy;": "\u045f",
    "dzigrarr;": "\u27ff",
    "eDDot;": "\u2a77",
    "eDot;": "\u2251",
    "eacute": "\xe9",
    "eacute;": "\xe9",
    "easter;": "\u2a6e",
    "ecaron;": "\u011b",
    "ecir;": "\u2256",
    "ecirc": "\xea",
    "ecirc;": "\xea",
    "ecolon;": "\u2255",
    "ecy;": "\u044d",
    "edot;": "\u0117",
    "ee;": "\u2147",
    "efDot;": "\u2252",
    "efr;": "\U0001d522",
    "eg;": "\u2a9a",
    "egrave": "\xe8",
    "egrave;": "\xe8",
    "egs;": "\u2a96",
    "egsdot;": "\u2a98",
    "el;": "\u2a99",
    "elinters;": "\u23e7",
    "ell;": "\u2113",
    "els;": "\u2a95",
    "elsdot;": "\u2a97",
    "emacr;": "\u0113",
    "empty;": "\u2205",
    "emptyset;": "\u2205",
    "emptyv;": "\u2205",
    "emsp13;": "\u2004",
    "emsp14;": "\u2005",
    "emsp;": "\u2003",
    "eng;": "\u014b",
    "ensp;": "\u2002",
    "eogon;": "\u0119",
    "eopf;": "\U0001d556",
    "epar;": "\u22d5",
    "eparsl;": "\u29e3",
    "eplus;": "\u2a71",
    "epsi;": "\u03b5",
    "epsilon;": "\u03b5",
    "epsiv;": "\u03f5",
    "eqcirc;": "\u2256",
    "eqcolon;": "\u2255",
    "eqsim;": "\u2242",
    "eqslantgtr;": "\u2a96",
    "eqslantless;": "\u2a95",
    "equals;": "=",
    "equest;": "\u225f",
    "equiv;": "\u2261",
    "equivDD;": "\u2a78",
    "eqvparsl;": "\u29e5",
    "erDot;": "\u2253",
    "erarr;": "\u2971",
    "escr;": "\u212f",
    "esdot;": "\u2250",
    "esim;": "\u2242",
    "eta;": "\u03b7",
    "eth": "\xf0",
    "eth;": "\xf0",
    "euml": "\xeb",
    "euml;": "\xeb",
    "euro;": "\u20ac",
    "excl;": "!",
    "exist;": "\u2203",
    "expectation;": "\u2130",
    "exponentiale;": "\u2147",
    "fallingdotseq;": "\u2252",
    "fcy;": "\u0444",
    "female;": "\u2640",
    "ffilig;": "\ufb03",
    "fflig;": "\ufb00",
    "ffllig;": "\ufb04",
    "ffr;": "\U0001d523",
    "filig;": "\ufb01",
    "fjlig;": "fj",
    "flat;": "\u266d",
    "fllig;": "\ufb02",
    "fltns;": "\u25b1",
    "fnof;": "\u0192",
    "fopf;": "\U0001d557",
    "forall;": "\u2200",
    "fork;": "\u22d4",
    "forkv;": "\u2ad9",
    "fpartint;": "\u2a0d",
    "frac12": "\xbd",
    "frac12;": "\xbd",
    "frac13;": "\u2153",
    "frac14": "\xbc",
    "frac14;": "\xbc",
    "frac15;": "\u2155",
    "frac16;": "\u2159",
    "frac18;": "\u215b",
    "frac23;": "\u2154",
    "frac25;": "\u2156",
    "frac34": "\xbe",
    "frac34;": "\xbe",
    "frac35;": "\u2157",
    "frac38;": "\u215c",
    "frac45;": "\u2158",
    "frac56;": "\u215a",
    "frac58;": "\u215d",
    "frac78;": "\u215e",
    "frasl;": "\u2044",
    "frown;": "\u2322",
    "fscr;": "\U0001d4bb",
    "gE;": "\u2267",
    "gEl;": "\u2a8c",
    "gacute;": "\u01f5",
    "gamma;": "\u03b3",
    "gammad;": "\u03dd",
    "gap;": "\u2a86",
    "gbreve;": "\u011f",
    "gcirc;": "\u011d",
    "gcy;": "\u0433",
    "gdot;": "\u0121",
    "ge;": "\u2265",
    "gel;": "\u22db",
    "geq;": "\u2265",
    "geqq;": "\u2267",
    "geqslant;": "\u2a7e",
    "ges;": "\u2a7e",
    "gescc;": "\u2aa9",
    "gesdot;": "\u2a80",
    "gesdoto;": "\u2a82",
    "gesdotol;": "\u2a84",
    "gesl;": "\u22db\ufe00",
    "gesles;": "\u2a94",
    "gfr;": "\U0001d524",
    "gg;": "\u226b",
    "ggg;": "\u22d9",
    "gimel;": "\u2137",
    "gjcy;": "\u0453",
    "gl;": "\u2277",
    "glE;": "\u2a92",
    "gla;": "\u2aa5",
    "glj;": "\u2aa4",
    "gnE;": "\u2269",
    "gnap;": "\u2a8a",
    "gnapprox;": "\u2a8a",
    "gne;": "\u2a88",
    "gneq;": "\u2a88",
    "gneqq;": "\u2269",
    "gnsim;": "\u22e7",
    "gopf;": "\U0001d558",
    "grave;": "`",
    "gscr;": "\u210a",
    "gsim;": "\u2273",
    "gsime;": "\u2a8e",
    "gsiml;": "\u2a90",
    "gt": ">",
    "gt;": ">",
    "gtcc;": "\u2aa7",
    "gtcir;": "\u2a7a",
    "gtdot;": "\u22d7",
    "gtlPar;": "\u2995",
    "gtquest;": "\u2a7c",
    "gtrapprox;": "\u2a86",
    "gtrarr;": "\u2978",
    "gtrdot;": "\u22d7",
    "gtreqless;": "\u22db",
    "gtreqqless;": "\u2a8c",
    "gtrless;": "\u2277",
    "gtrsim;": "\u2273",
    "gvertneqq;": "\u2269\ufe00",
    "gvnE;": "\u2269\ufe00",
    "hArr;": "\u21d4",
    "hairsp;": "\u200a",
    "half;": "\xbd",
    "hamilt;": "\u210b",
    "hardcy;": "\u044a",
    "harr;": "\u2194",
    "harrcir;": "\u2948",
    "harrw;": "\u21ad",
    "hbar;": "\u210f",
    "hcirc;": "\u0125",
    "hearts;": "\u2665",
    "heartsuit;": "\u2665",
    "hellip;": "\u2026",
    "hercon;": "\u22b9",
    "hfr;": "\U0001d525",
    "hksearow;": "\u2925",
    "hkswarow;": "\u2926",
    "hoarr;": "\u21ff",
    "homtht;": "\u223b",
    "hookleftarrow;": "\u21a9",
    "hookrightarrow;": "\u21aa",
    "hopf;": "\U0001d559",
    "horbar;": "\u2015",
    "hscr;": "\U0001d4bd",
    "hslash;": "\u210f",
    "hstrok;": "\u0127",
    "hybull;": "\u2043",
    "hyphen;": "\u2010",
    "iacute": "\xed",
    "iacute;": "\xed",
    "ic;": "\u2063",
    "icirc": "\xee",
    "icirc;": "\xee",
    "icy;": "\u0438",
    "iecy;": "\u0435",
    "iexcl": "\xa1",
    "iexcl;": "\xa1",
    "iff;": "\u21d4",
    "ifr;": "\U0001d526",
    "igrave": "\xec",
    "igrave;": "\xec",
    "ii;": "\u2148",
    "iiiint;": "\u2a0c",
    "iiint;": "\u222d",
    "iinfin;": "\u29dc",
    "iiota;": "\u2129",
    "ijlig;": "\u0133",
    "imacr;": "\u012b",
    "image;": "\u2111",
    "imagline;": "\u2110",
    "imagpart;": "\u2111",
    "imath;": "\u0131",
    "imof;": "\u22b7",
    "imped;": "\u01b5",
    "in;": "\u2208",
    "incare;": "\u2105",
    "infin;": "\u221e",
    "infintie;": "\u29dd",
    "inodot;": "\u0131",
    "int;": "\u222b",
    "intcal;": "\u22ba",
    "integers;": "\u2124",
    "intercal;": "\u22ba",
    "intlarhk;": "\u2a17",
    "intprod;": "\u2a3c",
    "iocy;": "\u0451",
    "iogon;": "\u012f",
    "iopf;": "\U0001d55a",
    "iota;": "\u03b9",
    "iprod;": "\u2a3c",
    "iquest": "\xbf",
    "iquest;": "\xbf",
    "iscr;": "\U0001d4be",
    "isin;": "\u2208",
    "isinE;": "\u22f9",
    "isindot;": "\u22f5",
    "isins;": "\u22f4",
    "isinsv;": "\u22f3",
    "isinv;": "\u2208",
    "it;": "\u2062",
    "itilde;": "\u0129",
    "iukcy;": "\u0456",
    "iuml": "\xef",
    "iuml;": "\xef",
    "jcirc;": "\u0135",
    "jcy;": "\u0439",
    "jfr;": "\U0001d527",
    "jmath;": "\u0237",
    "jopf;": "\U0001d55b",
    "jscr;": "\U0001d4bf",
    "jsercy;": "\u0458",
    "jukcy;": "\u0454",
    "kappa;": "\u03ba",
    "kappav;": "\u03f0",
    "kcedil;": "\u0137",
    "kcy;": "\u043a",
    "kfr;": "\U0001d528",
    "kgreen;": "\u0138",
    "khcy;": "\u0445",
    "kjcy;": "\u045c",
    "kopf;": "\U0001d55c",
    "kscr;": "\U0001d4c0",
    "lAarr;": "\u21da",
    "lArr;": "\u21d0",
    "lAtail;": "\u291b",
    "lBarr;": "\u290e",
    "lE;": "\u2266",
    "lEg;": "\u2a8b",
    "lHar;": "\u2962",
    "lacute;": "\u013a",
    "laemptyv;": "\u29b4",
    "lagran;": "\u2112",
    "lambda;": "\u03bb",
    "lang;": "\u27e8",
    "langd;": "\u2991",
    "langle;": "\u27e8",
    "lap;": "\u2a85",
    "laquo": "\xab",
    "laquo;": "\xab",
    "larr;": "\u2190",
    "larrb;": "\u21e4",
    "larrbfs;": "\u291f",
    "larrfs;": "\u291d",
    "larrhk;": "\u21a9",
    "larrlp;": "\u21ab",
    "larrpl;": "\u2939",
    "larrsim;": "\u2973",
    "larrtl;": "\u21a2",
    "lat;": "\u2aab",
    "latail;": "\u2919",
    "late;": "\u2aad",
    "lates;": "\u2aad\ufe00",
    "lbarr;": "\u290c",
    "lbbrk;": "\u2772",
    "lbrace;": "{",
    "lbrack;": "[",
    "lbrke;": "\u298b",
    "lbrksld;": "\u298f",
    "lbrkslu;": "\u298d",
    "lcaron;": "\u013e",
    "lcedil;": "\u013c",
    "lceil;": "\u2308",
    "lcub;": "{",
    "lcy;": "\u043b",
    "ldca;": "\u2936",
    "ldquo;": "\u201c",
    "ldquor;": "\u201e",
    "ldrdhar;": "\u2967",
    "ldrushar;": "\u294b",
    "ldsh;": "\u21b2",
    "le;": "\u2264",
    "leftarrow;": "\u2190",
    "leftarrowtail;": "\u21a2",
    "leftharpoondown;": "\u21bd",
    "leftharpoonup;": "\u21bc",
    "leftleftarrows;": "\u21c7",
    "leftrightarrow;": "\u2194",
    "leftrightarrows;": "\u21c6",
    "leftrightharpoons;": "\u21cb",
    "leftrightsquigarrow;": "\u21ad",
    "leftthreetimes;": "\u22cb",
    "leg;": "\u22da",
    "leq;": "\u2264",
    "leqq;": "\u2266",
    "leqslant;": "\u2a7d",
    "les;": "\u2a7d",
    "lescc;": "\u2aa8",
    "lesdot;": "\u2a7f",
    "lesdoto;": "\u2a81",
    "lesdotor;": "\u2a83",
    "lesg;": "\u22da\ufe00",
    "lesges;": "\u2a93",
    "lessapprox;": "\u2a85",
    "lessdot;": "\u22d6",
    "lesseqgtr;": "\u22da",
    "lesseqqgtr;": "\u2a8b",
    "lessgtr;": "\u2276",
    "lesssim;": "\u2272",
    "lfisht;": "\u297c",
    "lfloor;": "\u230a",
    "lfr;": "\U0001d529",
    "lg;": "\u2276",
    "lgE;": "\u2a91",
    "lhard;": "\u21bd",
    "lharu;": "\u21bc",
    "lharul;": "\u296a",
    "lhblk;": "\u2584",
    "ljcy;": "\u0459",
    "ll;": "\u226a",
    "llarr;": "\u21c7",
    "llcorner;": "\u231e",
    "llhard;": "\u296b",
    "lltri;": "\u25fa",
    "lmidot;": "\u0140",
    "lmoust;": "\u23b0",
    "lmoustache;": "\u23b0",
    "lnE;": "\u2268",
    "lnap;": "\u2a89",
    "lnapprox;": "\u2a89",
    "lne;": "\u2a87",
    "lneq;": "\u2a87",
    "lneqq;": "\u2268",
    "lnsim;": "\u22e6",
    "loang;": "\u27ec",
    "loarr;": "\u21fd",
    "lobrk;": "\u27e6",
    "longleftarrow;": "\u27f5",
    "longleftrightarrow;": "\u27f7",
    "longmapsto;": "\u27fc",
    "longrightarrow;": "\u27f6",
    "looparrowleft;": "\u21ab",
    "looparrowright;": "\u21ac",
    "lopar;": "\u2985",
    "lopf;": "\U0001d55d",
    "loplus;": "\u2a2d",
    "lotimes;": "\u2a34",
    "lowast;": "\u2217",
    "lowbar;": "_",
    "loz;": "\u25ca",
    "lozenge;": "\u25ca",
    "lozf;": "\u29eb",
    "lpar;": "(",
    "lparlt;": "\u2993",
    "lrarr;": "\u21c6",
    "lrcorner;": "\u231f",
    "lrhar;": "\u21cb",
    "lrhard;": "\u296d",
    "lrm;": "\u200e",
    "lrtri;": "\u22bf",
    "lsaquo;": "\u2039",
    "lscr;": "\U0001d4c1",
    "lsh;": "\u21b0",
    "lsim;": "\u2272",
    "lsime;": "\u2a8d",
    "lsimg;": "\u2a8f",
    "lsqb;": "[",
    "lsquo;": "\u2018",
    "lsquor;": "\u201a",
    "lstrok;": "\u0142",
    "lt": "<",
    "lt;": "<",
    "ltcc;": "\u2aa6",
    "ltcir;": "\u2a79",
    "ltdot;": "\u22d6",
    "lthree;": "\u22cb",
    "ltimes;": "\u22c9",
    "ltlarr;": "\u2976",
    "ltquest;": "\u2a7b",
    "ltrPar;": "\u2996",
    "ltri;": "\u25c3",
    "ltrie;": "\u22b4",
    "ltrif;": "\u25c2",
    "lurdshar;": "\u294a",
    "luruhar;": "\u2966",
    "lvertneqq;": "\u2268\ufe00",
    "lvnE;": "\u2268\ufe00",
    "mDDot;": "\u223a",
    "macr": "\xaf",
    "macr;": "\xaf",
    "male;": "\u2642",
    "malt;": "\u2720",
    "maltese;": "\u2720",
    "map;": "\u21a6",
    "mapsto;": "\u21a6",
    "mapstodown;": "\u21a7",
    "mapstoleft;": "\u21a4",
    "mapstoup;": "\u21a5",
    "marker;": "\u25ae",
    "mcomma;": "\u2a29",
    "mcy;": "\u043c",
    "mdash;": "\u2014",
    "measuredangle;": "\u2221",
    "mfr;": "\U0001d52a",
    "mho;": "\u2127",
    "micro": "\xb5",
    "micro;": "\xb5",
    "mid;": "\u2223",
    "midast;": "*",
    "midcir;": "\u2af0",
    "middot": "\xb7",
    "middot;": "\xb7",
    "minus;": "\u2212",
    "minusb;": "\u229f",
    "minusd;": "\u2238",
    "minusdu;": "\u2a2a",
    "mlcp;": "\u2adb",
    "mldr;": "\u2026",
    "mnplus;": "\u2213",
    "models;": "\u22a7",
    "mopf;": "\U0001d55e",
    "mp;": "\u2213",
    "mscr;": "\U0001d4c2",
    "mstpos;": "\u223e",
    "mu;": "\u03bc",
    "multimap;": "\u22b8",
    "mumap;": "\u22b8",
    "nGg;": "\u22d9\u0338",
    "nGt;": "\u226b\u20d2",
    "nGtv;": "\u226b\u0338",
    "nLeftarrow;": "\u21cd",
    "nLeftrightarrow;": "\u21ce",
    "nLl;": "\u22d8\u0338",
    "nLt;": "\u226a\u20d2",
    "nLtv;": "\u226a\u0338",
    "nRightarrow;": "\u21cf",
    "nVDash;": "\u22af",
    "nVdash;": "\u22ae",
    "nabla;": "\u2207",
    "nacute;": "\u0144",
    "nang;": "\u2220\u20d2",
    "nap;": "\u2249",
    "napE;": "\u2a70\u0338",
    "napid;": "\u224b\u0338",
    "napos;": "\u0149",
    "napprox;": "\u2249",
    "natur;": "\u266e",
    "natural;": "\u266e",
    "naturals;": "\u2115",
    "nbsp": "\xa0",
    "nbsp;": "\xa0",
    "nbump;": "\u224e\u0338",
    "nbumpe;": "\u224f\u0338",
    "ncap;": "\u2a43",
    "ncaron;": "\u0148",
    "ncedil;": "\u0146",
    "ncong;": "\u2247",
    "ncongdot;": "\u2a6d\u0338",
    "ncup;": "\u2a42",
    "ncy;": "\u043d",
    "ndash;": "\u2013",
    "ne;": "\u2260",
    "neArr;": "\u21d7",
    "nearhk;": "\u2924",
    "nearr;": "\u2197",
    "nearrow;": "\u2197",
    "nedot;": "\u2250\u0338",
    "nequiv;": "\u2262",
    "nesear;": "\u2928",
    "nesim;": "\u2242\u0338",
    "nexist;": "\u2204",
    "nexists;": "\u2204",
    "nfr;": "\U0001d52b",
    "ngE;": "\u2267\u0338",
    "nge;": "\u2271",
    "ngeq;": "\u2271",
    "ngeqq;": "\u2267\u0338",
    "ngeqslant;": "\u2a7e\u0338",
    "nges;": "\u2a7e\u0338",
    "ngsim;": "\u2275",
    "ngt;": "\u226f",
    "ngtr;": "\u226f",
    "nhArr;": "\u21ce",
    "nharr;": "\u21ae",
    "nhpar;": "\u2af2",
    "ni;": "\u220b",
    "nis;": "\u22fc",
    "nisd;": "\u22fa",
    "niv;": "\u220b",
    "njcy;": "\u045a",
    "nlArr;": "\u21cd",
    "nlE;": "\u2266\u0338",
    "nlarr;": "\u219a",
    "nldr;": "\u2025",
    "nle;": "\u2270",
    "nleftarrow;": "\u219a",
    "nleftrightarrow;": "\u21ae",
    "nleq;": "\u2270",
    "nleqq;": "\u2266\u0338",
    "nleqslant;": "\u2a7d\u0338",
    "nles;": "\u2a7d\u0338",
    "nless;": "\u226e",
    "nlsim;": "\u2274",
    "nlt;": "\u226e",
    "nltri;": "\u22ea",
    "nltrie;": "\u22ec",
    "nmid;": "\u2224",
    "nopf;": "\U0001d55f",
    "not": "\xac",
    "not;": "\xac",
    "notin;": "\u2209",
    "notinE;": "\u22f9\u0338",
    "notindot;": "\u22f5\u0338",
    "notinva;": "\u2209",
    "notinvb;": "\u22f7",
    "notinvc;": "\u22f6",
    "notni;": "\u220c",
    "notniva;": "\u220c",
    "notnivb;": "\u22fe",
    "notnivc;": "\u22fd",
    "npar;": "\u2226",
    "nparallel;": "\u2226",
    "nparsl;": "\u2afd\u20e5",
    "npart;": "\u2202\u0338",
    "npolint;": "\u2a14",
    "npr;": "\u2280",
    "nprcue;": "\u22e0",
    "npre;": "\u2aaf\u0338",
    "nprec;": "\u2280",
    "npreceq;": "\u2aaf\u0338",
    "nrArr;": "\u21cf",
    "nrarr;": "\u219b",
    "nrarrc;": "\u2933\u0338",
    "nrarrw;": "\u219d\u0338",
    "nrightarrow;": "\u219b",
    "nrtri;": "\u22eb",
    "nrtrie;": "\u22ed",
    "nsc;": "\u2281",
    "nsccue;": "\u22e1",
    "nsce;": "\u2ab0\u0338",
    "nscr;": "\U0001d4c3",
    "nshortmid;": "\u2224",
    "nshortparallel;": "\u2226",
    "nsim;": "\u2241",
    "nsime;": "\u2244",
    "nsimeq;": "\u2244",
    "nsmid;": "\u2224",
    "nspar;": "\u2226",
    "nsqsube;": "\u22e2",
    "nsqsupe;": "\u22e3",
    "nsub;": "\u2284",
    "nsubE;": "\u2ac5\u0338",
    "nsube;": "\u2288",
    "nsubset;": "\u2282\u20d2",
    "nsubseteq;": "\u2288",
    "nsubseteqq;": "\u2ac5\u0338",
    "nsucc;": "\u2281",
    "nsucceq;": "\u2ab0\u0338",
    "nsup;": "\u2285",
    "nsupE;": "\u2ac6\u0338",
    "nsupe;": "\u2289",
    "nsupset;": "\u2283\u20d2",
    "nsupseteq;": "\u2289",
    "nsupseteqq;": "\u2ac6\u0338",
    "ntgl;": "\u2279",
    "ntilde": "\xf1",
    "ntilde;": "\xf1",
    "ntlg;": "\u2278",
    "ntriangleleft;": "\u22ea",
    "ntrianglelefteq;": "\u22ec",
    "ntriangleright;": "\u22eb",
    "ntrianglerighteq;": "\u22ed",
    "nu;": "\u03bd",
    "num;": "#",
    "numero;": "\u2116",
    "numsp;": "\u2007",
    "nvDash;": "\u22ad",
    "nvHarr;": "\u2904",
    "nvap;": "\u224d\u20d2",
    "nvdash;": "\u22ac",
    "nvge;": "\u2265\u20d2",
    "nvgt;": ">\u20d2",
    "nvinfin;": "\u29de",
    "nvlArr;": "\u2902",
    "nvle;": "\u2264\u20d2",
    "nvlt;": "<\u20d2",
    "nvltrie;": "\u22b4\u20d2",
    "nvrArr;": "\u2903",
    "nvrtrie;": "\u22b5\u20d2",
    "nvsim;": "\u223c\u20d2",
    "nwArr;": "\u21d6",
    "nwarhk;": "\u2923",
    "nwarr;": "\u2196",
    "nwarrow;": "\u2196",
    "nwnear;": "\u2927",
    "oS;": "\u24c8",
    "oacute": "\xf3",
    "oacute;": "\xf3",
    "oast;": "\u229b",
    "ocir;": "\u229a",
    "ocirc": "\xf4",
    "ocirc;": "\xf4",
    "ocy;": "\u043e",
    "odash;": "\u229d",
    "odblac;": "\u0151",
    "odiv;": "\u2a38",
    "odot;": "\u2299",
    "odsold;": "\u29bc",
    "oelig;": "\u0153",
    "ofcir;": "\u29bf",
    "ofr;": "\U0001d52c",
    "ogon;": "\u02db",
    "ograve": "\xf2",
    "ograve;": "\xf2",
    "ogt;": "\u29c1",
    "ohbar;": "\u29b5",
    "ohm;": "\u03a9",
    "oint;": "\u222e",
    "olarr;": "\u21ba",
    "olcir;": "\u29be",
    "olcross;": "\u29bb",
    "oline;": "\u203e",
    "olt;": "\u29c0",
    "omacr;": "\u014d",
    "omega;": "\u03c9",
    "omicron;": "\u03bf",
    "omid;": "\u29b6",
    "ominus;": "\u2296",
    "oopf;": "\U0001d560",
    "opar;": "\u29b7",
    "operp;": "\u29b9",
    "oplus;": "\u2295",
    "or;": "\u2228",
    "orarr;": "\u21bb",
    "ord;": "\u2a5d",
    "order;": "\u2134",
    "orderof;": "\u2134",
    "ordf": "\xaa",
    "ordf;": "\xaa",
    "ordm": "\xba",
    "ordm;": "\xba",
    "origof;": "\u22b6",
    "oror;": "\u2a56",
    "orslope;": "\u2a57",
    "orv;": "\u2a5b",
    "oscr;": "\u2134",
    "oslash": "\xf8",
    "oslash;": "\xf8",
    "osol;": "\u2298",
    "otilde": "\xf5",
    "otilde;": "\xf5",
    "otimes;": "\u2297",
    "otimesas;": "\u2a36",
    "ouml": "\xf6",
    "ouml;": "\xf6",
    "ovbar;": "\u233d",
    "par;": "\u2225",
    "para": "\xb6",
    "para;": "\xb6",
    "parallel;": "\u2225",
    "parsim;": "\u2af3",
    "parsl;": "\u2afd",
    "part;": "\u2202",
    "pcy;": "\u043f",
    "percnt;": "%",
    "period;": ".",
    "permil;": "\u2030",
    "perp;": "\u22a5",
    "pertenk;": "\u2031",
    "pfr;": "\U0001d52d",
    "phi;": "\u03c6",
    "phiv;": "\u03d5",
    "phmmat;": "\u2133",
    "phone;": "\u260e",
    "pi;": "\u03c0",
    "pitchfork;": "\u22d4",
    "piv;": "\u03d6",
    "planck;": "\u210f",
    "planckh;": "\u210e",
    "plankv;": "\u210f",
    "plus;": "+",
    "plusacir;": "\u2a23",
    "plusb;": "\u229e",
    "pluscir;": "\u2a22",
    "plusdo;": "\u2214",
    "plusdu;": "\u2a25",
    "pluse;": "\u2a72",
    "plusmn": "\xb1",
    "plusmn;": "\xb1",
    "plussim;": "\u2a26",
    "plustwo;": "\u2a27",
    "pm;": "\xb1",
    "pointint;": "\u2a15",
    "popf;": "\U0001d561",
    "pound": "\xa3",
    "pound;": "\xa3",
    "pr;": "\u227a",
    "prE;": "\u2ab3",
    "prap;": "\u2ab7",
    "prcue;": "\u227c",
    "pre;": "\u2aaf",
    "prec;": "\u227a",
    "precapprox;": "\u2ab7",
    "preccurlyeq;": "\u227c",
    "preceq;": "\u2aaf",
    "precnapprox;": "\u2ab9",
    "precneqq;": "\u2ab5",
    "precnsim;": "\u22e8",
    "precsim;": "\u227e",
    "prime;": "\u2032",
    "primes;": "\u2119",
    "prnE;": "\u2ab5",
    "prnap;": "\u2ab9",
    "prnsim;": "\u22e8",
    "prod;": "\u220f",
    "profalar;": "\u232e",
    "profline;": "\u2312",
    "profsurf;": "\u2313",
    "prop;": "\u221d",
    "propto;": "\u221d",
    "prsim;": "\u227e",
    "prurel;": "\u22b0",
    "pscr;": "\U0001d4c5",
    "psi;": "\u03c8",
    "puncsp;": "\u2008",
    "qfr;": "\U0001d52e",
    "qint;": "\u2a0c",
    "qopf;": "\U0001d562",
    "qprime;": "\u2057",
    "qscr;": "\U0001d4c6",
    "quaternions;": "\u210d",
    "quatint;": "\u2a16",
    "quest;": "?",
    "questeq;": "\u225f",
    "quot": "\"",
    "quot;": "\"",
    "rAarr;": "\u21db",
    "rArr;": "\u21d2",
    "rAtail;": "\u291c",
    "rBarr;": "\u290f",
    "rHar;": "\u2964",
    "race;": "\u223d\u0331",
    "racute;": "\u0155",
    "radic;": "\u221a",
    "raemptyv;": "\u29b3",
    "rang;": "\u27e9",
    "rangd;": "\u2992",
    "range;": "\u29a5",
    "rangle;": "\u27e9",
    "raquo": "\xbb",
    "raquo;": "\xbb",
    "rarr;": "\u2192",
    "rarrap;": "\u2975",
    "rarrb;": "\u21e5",
    "rarrbfs;": "\u2920",
    "rarrc;": "\u2933",
    "rarrfs;": "\u291e",
    "rarrhk;": "\u21aa",
    "rarrlp;": "\u21ac",
    "rarrpl;": "\u2945",
    "rarrsim;": "\u2974",
    "rarrtl;": "\u21a3",
    "rarrw;": "\u219d",
    "ratail;": "\u291a",
    "ratio;": "\u2236",
    "rationals;": "\u211a",
    "rbarr;": "\u290d",
    "rbbrk;": "\u2773",
    "rbrace;": "}",
    "rbrack;": "]",
    "rbrke;": "\u298c",
    "rbrksld;": "\u298e",
    "rbrkslu;": "\u2990",
    "rcaron;": "\u0159",
    "rcedil;": "\u0157",
    "rceil;": "\u2309",
    "rcub;": "}",
    "rcy;": "\u0440",
    "rdca;": "\u2937",
    "rdldhar;": "\u2969",
    "rdquo;": "\u201d",
    "rdquor;": "\u201d",
    "rdsh;": "\u21b3",
    "real;": "\u211c",
    "realine;": "\u211b",
    "realpart;": "\u211c",
    "reals;": "\u211d",
    "rect;": "\u25ad",
    "reg": "\xae",
    "reg;": "\xae",
    "rfisht;": "\u297d",
    "rfloor;": "\u230b",
    "rfr;": "\U0001d52f",
    "rhard;": "\u21c1",
    "rharu;": "\u21c0",
    "rharul;": "\u296c",
    "rho;": "\u03c1",
    "rhov;": "\u03f1",
    "rightarrow;": "\u2192",
    "rightarrowtail;": "\u21a3",
    "rightharpoondown;": "\u21c1",
    "rightharpoonup;": "\u21c0",
    "rightleftarrows;": "\u21c4",
    "rightleftharpoons;": "\u21cc",
    "rightrightarrows;": "\u21c9",
    "rightsquigarrow;": "\u219d",
    "rightthreetimes;": "\u22cc",
    "ring;": "\u02da",
    "risingdotseq;": "\u2253",
    "rlarr;": "\u21c4",
    "rlhar;": "\u21cc",
    "rlm;": "\u200f",
    "rmoust;": "\u23b1",
    "rmoustache;": "\u23b1",
    "rnmid;": "\u2aee",
    "roang;": "\u27ed",
    "roarr;": "\u21fe",
    "robrk;": "\u27e7",
    "ropar;": "\u2986",
    "ropf;": "\U0001d563",
    "roplus;": "\u2a2e",
    "rotimes;": "\u2a35",
    "rpar;": ")",
    "rpargt;": "\u2994",
    "rppolint;": "\u2a12",
    "rrarr;": "\u21c9",
    "rsaquo;": "\u203a",
    "rscr;": "\U0001d4c7",
    "rsh;": "\u21b1",
    "rsqb;": "]",
    "rsquo;": "\u2019",
    "rsquor;": "\u2019",
    "rthree;": "\u22cc",
    "rtimes;": "\u22ca",
    "rtri;": "\u25b9",
    "rtrie;": "\u22b5",
    "rtrif;": "\u25b8",
    "rtriltri;": "\u29ce",
    "ruluhar;": "\u2968",
    "rx;": "\u211e",
    "sacute;": "\u015b",
    "sbquo;": "\u201a",
    "sc;": "\u227b",
    "scE;": "\u2ab4",
    "scap;": "\u2ab8",
    "scaron;": "\u0161",
    "sccue;": "\u227d",
    "sce;": "\u2ab0",
    "scedil;": "\u015f",
    "scirc;": "\u015d",
    "scnE;": "\u2ab6",
    "scnap;": "\u2aba",
    "scnsim;": "\u22e9",
    "scpolint;": "\u2a13",
    "scsim;": "\u227f",
    "scy;": "\u0441",
    "sdot;": "\u22c5",
    "sdotb;": "\u22a1",
    "sdote;": "\u2a66",
    "seArr;": "\u21d8",
    "searhk;": "\u2925",
    "searr;": "\u2198",
    "searrow;": "\u2198",
    "sect": "\xa7",
    "sect;": "\xa7",
    "semi;": ";",
    "seswar;": "\u2929",
    "setminus;": "\u2216",
    "setmn;": "\u2216",
    "sext;": "\u2736",
    "sfr;": "\U0001d530",
    "sfrown;": "\u2322",
    "sharp;": "\u266f",
    "shchcy;": "\u0449",
    "shcy;": "\u0448",
    "shortmid;": "\u2223",
    "shortparallel;": "\u2225",
    "shy": "\xad",
    "shy;": "\xad",
    "sigma;": "\u03c3",
    "sigmaf;": "\u03c2",
    "sigmav;": "\u03c2",
    "sim;": "\u223c",
    "simdot;": "\u2a6a",
    "sime;": "\u2243",
    "simeq;": "\u2243",
    "simg;": "\u2a9e",
    "simgE;": "\u2aa0",
    "siml;": "\u2a9d",
    "simlE;": "\u2a9f",
    "simne;": "\u2246",
    "simplus;": "\u2a24",
    "simrarr;": "\u2972",
    "slarr;": "\u2190",
    "smallsetminus;": "\u2216",
    "smashp;": "\u2a33",
    "smeparsl;": "\u29e4",
    "smid;": "\u2223",
    "smile;": "\u2323",
    "smt;": "\u2aaa",
    "smte;": "\u2aac",
    "smtes;": "\u2aac\ufe00",
    "softcy;": "\u044c",
    "sol;": "/",
    "solb;": "\u29c4",
    "solbar;": "\u233f",
    "sopf;": "\U0001d564",
    "spades;": "\u2660",
    "spadesuit;": "\u2660",
    "spar;": "\u2225",
    "sqcap;": "\u2293",
    "sqcaps;": "\u2293\ufe00",
    "sqcup;": "\u2294",
    "sqcups;": "\u2294\ufe00",
    "sqsub;": "\u228f",
    "sqsube;": "\u2291",
    "sqsubset;": "\u228f",
    "sqsubseteq;": "\u2291",
    "sqsup;": "\u2290",
    "sqsupe;": "\u2292",
    "sqsupset;": "\u2290",
    "sqsupseteq;": "\u2292",
    "squ;": "\u25a1",
    "square;": "\u25a1",
    "squarf;": "\u25aa",
    "squf;": "\u25aa",
    "srarr;": "\u2192",
    "sscr;": "\U0001d4c8",
    "ssetmn;": "\u2216",
    "ssmile;": "\u2323",
    "sstarf;": "\u22c6",
    "star;": "\u2606",
    "starf;": "\u2605",
    "straightepsilon;": "\u03f5",
    "straightphi;": "\u03d5",
    "strns;": "\xaf",
    "sub;": "\u2282",
    "subE;": "\u2ac5",
    "subdot;": "\u2abd",
    "sube;": "\u2286",
    "subedot;": "\u2ac3",
    "submult;": "\u2ac1",
    "subnE;": "\u2acb",
    "subne;": "\u228a",
    "subplus;": "\u2abf",
    "subrarr;": "\u2979",
    "subset;": "\u2282",
    "subseteq;": "\u2286",
    "subseteqq;": "\u2ac5",
    "subsetneq;": "\u228a",
    "subsetneqq;": "\u2acb",
    "subsim;": "\u2ac7",
    "subsub;": "\u2ad5",
    "subsup;": "\u2ad3",
    "succ;": "\u227b",
    "succapprox;": "\u2ab8",
    "succcurlyeq;": "\u227d",
    "succeq;": "\u2ab0",
    "succnapprox;": "\u2aba",
    "succneqq;": "\u2ab6",
    "succnsim;": "\u22e9",
    "succsim;": "\u227f",
    "sum;": "\u2211",
    "sung;": "\u266a",
    "sup1": "\xb9",
    "sup1;": "\xb9",
    "sup2": "\xb2",
    "sup2;": "\xb2",
    "sup3": "\xb3",
    "sup3;": "\xb3",
    "sup;": "\u2283",
    "supE;": "\u2ac6",
    "supdot;": "\u2abe",
    "supdsub;": "\u2ad8",
    "supe;": "\u2287",
    "supedot;": "\u2ac4",
    "suphsol;": "\u27c9",
    "suphsub;": "\u2ad7",
    "suplarr;": "\u297b",
    "supmult;": "\u2ac2",
    "supnE;": "\u2acc",
    "supne;": "\u228b",
    "supplus;": "\u2ac0",
    "supset;": "\u2283",
    "supseteq;": "\u2287",
    "supseteqq;": "\u2ac6",
    "supsetneq;": "\u228b",
    "supsetneqq;": "\u2acc",
    "supsim;": "\u2ac8",
    "supsub;": "\u2ad4",
    "supsup;": "\u2ad6",
    "swArr;": "\u21d9",
    "swarhk;": "\u2926",
    "swarr;": "\u2199",
    "swarrow;": "\u2199",
    "swnwar;": "\u292a",
    "szlig": "\xdf",
    "szlig;": "\xdf",
    "target;": "\u2316",
    "tau;": "\u03c4",
    "tbrk;": "\u23b4",
    "tcaron;": "\u0165",
    "tcedil;": "\u0163",
    "tcy;": "\u0442",
    "tdot;": "\u20db",
    "telrec;": "\u2315",
    "tfr;": "\U0001d531",
    "there4;": "\u2234",
    "therefore;": "\u2234",
    "theta;": "\u03b8",
    "thetasym;": "\u03d1",
    "thetav;": "\u03d1",
    "thickapprox;": "\u2248",
    "thicksim;": "\u223c",
    "thinsp;": "\u2009",
    "thkap;": "\u2248",
    "thksim;": "\u223c",
    "thorn": "\xfe",
    "thorn;": "\xfe",
    "tilde;": "\u02dc",
    "times": "\xd7",
    "times;": "\xd7",
    "timesb;": "\u22a0",
    "timesbar;": "\u2a31",
    "timesd;": "\u2a30",
    "tint;": "\u222d",
    "toea;": "\u2928",
    "top;": "\u22a4",
    "topbot;": "\u2336",
    "topcir;": "\u2af1",
    "topf;": "\U0001d565",
    "topfork;": "\u2ada",
    "tosa;": "\u2929",
    "tprime;": "\u2034",
    "trade;": "\u2122",
    "triangle;": "\u25b5",
    "triangledown;": "\u25bf",
    "triangleleft;": "\u25c3",
    "trianglelefteq;": "\u22b4",
    "triangleq;": "\u225c",
    "triangleright;": "\u25b9",
    "trianglerighteq;": "\u22b5",
    "tridot;": "\u25ec",
    "trie;": "\u225c",
    "triminus;": "\u2a3a",
    "triplus;": "\u2a39",
    "trisb;": "\u29cd",
    "tritime;": "\u2a3b",
    "trpezium;": "\u23e2",
    "tscr;": "\U0001d4c9",
    "tscy;": "\u0446",
    "tshcy;": "\u045b",
    "tstrok;": "\u0167",
    "twixt;": "\u226c",
    "twoheadleftarrow;": "\u219e",
    "twoheadrightarrow;": "\u21a0",
    "uArr;": "\u21d1",
    "uHar;": "\u2963",
    "uacute": "\xfa",
    "uacute;": "\xfa",
    "uarr;": "\u2191",
    "ubrcy;": "\u045e",
    "ubreve;": "\u016d",
    "ucirc": "\xfb",
    "ucirc;": "\xfb",
    "ucy;": "\u0443",
    "udarr;": "\u21c5",
    "udblac;": "\u0171",
    "udhar;": "\u296e",
    "ufisht;": "\u297e",
    "ufr;": "\U0001d532",
    "ugrave": "\xf9",
    "ugrave;": "\xf9",
    "uharl;": "\u21bf",
    "uharr;": "\u21be",
    "uhblk;": "\u2580",
    "ulcorn;": "\u231c",
    "ulcorner;": "\u231c",
    "ulcrop;": "\u230f",
    "ultri;": "\u25f8",
    "umacr;": "\u016b",
    "uml": "\xa8",
    "uml;": "\xa8",
    "uogon;": "\u0173",
    "uopf;": "\U0001d566",
    "uparrow;": "\u2191",
    "updownarrow;": "\u2195",
    "upharpoonleft;": "\u21bf",
    "upharpoonright;": "\u21be",
    "uplus;": "\u228e",
    "upsi;": "\u03c5",
    "upsih;": "\u03d2",
    "upsilon;": "\u03c5",
    "upuparrows;": "\u21c8",
    "urcorn;": "\u231d",
    "urcorner;": "\u231d",
    "urcrop;": "\u230e",
    "uring;": "\u016f",
    "urtri;": "\u25f9",
    "uscr;": "\U0001d4ca",
    "utdot;": "\u22f0",
    "utilde;": "\u0169",
    "utri;": "\u25b5",
    "utrif;": "\u25b4",
    "uuarr;": "\u21c8",
    "uuml": "\xfc",
    "uuml;": "\xfc",
    "uwangle;": "\u29a7",
    "vArr;": "\u21d5",
    "vBar;": "\u2ae8",
    "vBarv;": "\u2ae9",
    "vDash;": "\u22a8",
    "vangrt;": "\u299c",
    "varepsilon;": "\u03f5",
    "varkappa;": "\u03f0",
    "varnothing;": "\u2205",
    "varphi;": "\u03d5",
    "varpi;": "\u03d6",
    "varpropto;": "\u221d",
    "varr;": "\u2195",
    "varrho;": "\u03f1",
    "varsigma;": "\u03c2",
    "varsubsetneq;": "\u228a\ufe00",
    "varsubsetneqq;": "\u2acb\ufe00",
    "varsupsetneq;": "\u228b\ufe00",
    "varsupsetneqq;": "\u2acc\ufe00",
    "vartheta;": "\u03d1",
    "vartriangleleft;": "\u22b2",
    "vartriangleright;": "\u22b3",
    "vcy;": "\u0432",
    "vdash;": "\u22a2",
    "vee;": "\u2228",
    "veebar;": "\u22bb",
    "veeeq;": "\u225a",
    "vellip;": "\u22ee",
    "verbar;": "|",
    "vert;": "|",
    "vfr;": "\U0001d533",
    "vltri;": "\u22b2",
    "vnsub;": "\u2282\u20d2",
    "vnsup;": "\u2283\u20d2",
    "vopf;": "\U0001d567",
    "vprop;": "\u221d",
    "vrtri;": "\u22b3",
    "vscr;": "\U0001d4cb",
    "vsubnE;": "\u2acb\ufe00",
    "vsubne;": "\u228a\ufe00",
    "vsupnE;": "\u2acc\ufe00",
    "vsupne;": "\u228b\ufe00",
    "vzigzag;": "\u299a",
    "wcirc;": "\u0175",
    "wedbar;": "\u2a5f",
    "wedge;": "\u2227",
    "wedgeq;": "\u2259",
    "weierp;": "\u2118",
    "wfr;": "\U0001d534",
    "wopf;": "\U0001d568",
    "wp;": "\u2118",
    "wr;": "\u2240",
    "wreath;": "\u2240",
    "wscr;": "\U0001d4cc",
    "xcap;": "\u22c2",
    "xcirc;": "\u25ef",
    "xcup;": "\u22c3",
    "xdtri;": "\u25bd",
    "xfr;": "\U0001d535",
    "xhArr;": "\u27fa",
    "xharr;": "\u27f7",
    "xi;": "\u03be",
    "xlArr;": "\u27f8",
    "xlarr;": "\u27f5",
    "xmap;": "\u27fc",
    "xnis;": "\u22fb",
    "xodot;": "\u2a00",
    "xopf;": "\U0001d569",
    "xoplus;": "\u2a01",
    "xotime;": "\u2a02",
    "xrArr;": "\u27f9",
    "xrarr;": "\u27f6",
    "xscr;": "\U0001d4cd",
    "xsqcup;": "\u2a06",
    "xuplus;": "\u2a04",
    "xutri;": "\u25b3",
    "xvee;": "\u22c1",
    "xwedge;": "\u22c0",
    "yacute": "\xfd",
    "yacute;": "\xfd",
    "yacy;": "\u044f",
    "ycirc;": "\u0177",
    "ycy;": "\u044b",
    "yen": "\xa5",
    "yen;": "\xa5",
    "yfr;": "\U0001d536",
    "yicy;": "\u0457",
    "yopf;": "\U0001d56a",
    "yscr;": "\U0001d4ce",
    "yucy;": "\u044e",
    "yuml": "\xff",
    "yuml;": "\xff",
    "zacute;": "\u017a",
    "zcaron;": "\u017e",
    "zcy;": "\u0437",
    "zdot;": "\u017c",
    "zeetrf;": "\u2128",
    "zeta;": "\u03b6",
    "zfr;": "\U0001d537",
    "zhcy;": "\u0436",
    "zigrarr;": "\u21dd",
    "zopf;": "\U0001d56b",
    "zscr;": "\U0001d4cf",
    "zwj;": "\u200d",
    "zwnj;": "\u200c",
}

replacementCharacters = {
    0x0: "\uFFFD",
    0x0d: "\u000D",
    0x80: "\u20AC",
    0x81: "\u0081",
    0x81: "\u0081",
    0x82: "\u201A",
    0x83: "\u0192",
    0x84: "\u201E",
    0x85: "\u2026",
    0x86: "\u2020",
    0x87: "\u2021",
    0x88: "\u02C6",
    0x89: "\u2030",
    0x8A: "\u0160",
    0x8B: "\u2039",
    0x8C: "\u0152",
    0x8D: "\u008D",
    0x8E: "\u017D",
    0x8F: "\u008F",
    0x90: "\u0090",
    0x91: "\u2018",
    0x92: "\u2019",
    0x93: "\u201C",
    0x94: "\u201D",
    0x95: "\u2022",
    0x96: "\u2013",
    0x97: "\u2014",
    0x98: "\u02DC",
    0x99: "\u2122",
    0x9A: "\u0161",
    0x9B: "\u203A",
    0x9C: "\u0153",
    0x9D: "\u009D",
    0x9E: "\u017E",
    0x9F: "\u0178",
}

encodings = {
    '437': 'cp437',
    '850': 'cp850',
    '852': 'cp852',
    '855': 'cp855',
    '857': 'cp857',
    '860': 'cp860',
    '861': 'cp861',
    '862': 'cp862',
    '863': 'cp863',
    '865': 'cp865',
    '866': 'cp866',
    '869': 'cp869',
    'ansix341968': 'ascii',
    'ansix341986': 'ascii',
    'arabic': 'iso8859-6',
    'ascii': 'ascii',
    'asmo708': 'iso8859-6',
    'big5': 'big5',
    'big5hkscs': 'big5hkscs',
    'chinese': 'gbk',
    'cp037': 'cp037',
    'cp1026': 'cp1026',
    'cp154': 'ptcp154',
    'cp367': 'ascii',
    'cp424': 'cp424',
    'cp437': 'cp437',
    'cp500': 'cp500',
    'cp775': 'cp775',
    'cp819': 'windows-1252',
    'cp850': 'cp850',
    'cp852': 'cp852',
    'cp855': 'cp855',
    'cp857': 'cp857',
    'cp860': 'cp860',
    'cp861': 'cp861',
    'cp862': 'cp862',
    'cp863': 'cp863',
    'cp864': 'cp864',
    'cp865': 'cp865',
    'cp866': 'cp866',
    'cp869': 'cp869',
    'cp936': 'gbk',
    'cpgr': 'cp869',
    'cpis': 'cp861',
    'csascii': 'ascii',
    'csbig5': 'big5',
    'cseuckr': 'cp949',
    'cseucpkdfmtjapanese': 'euc_jp',
    'csgb2312': 'gbk',
    'cshproman8': 'hp-roman8',
    'csibm037': 'cp037',
    'csibm1026': 'cp1026',
    'csibm424': 'cp424',
    'csibm500': 'cp500',
    'csibm855': 'cp855',
    'csibm857': 'cp857',
    'csibm860': 'cp860',
    'csibm861': 'cp861',
    'csibm863': 'cp863',
    'csibm864': 'cp864',
    'csibm865': 'cp865',
    'csibm866': 'cp866',
    'csibm869': 'cp869',
    'csiso2022jp': 'iso2022_jp',
    'csiso2022jp2': 'iso2022_jp_2',
    'csiso2022kr': 'iso2022_kr',
    'csiso58gb231280': 'gbk',
    'csisolatin1': 'windows-1252',
    'csisolatin2': 'iso8859-2',
    'csisolatin3': 'iso8859-3',
    'csisolatin4': 'iso8859-4',
    'csisolatin5': 'windows-1254',
    'csisolatin6': 'iso8859-10',
    'csisolatinarabic': 'iso8859-6',
    'csisolatincyrillic': 'iso8859-5',
    'csisolatingreek': 'iso8859-7',
    'csisolatinhebrew': 'iso8859-8',
    'cskoi8r': 'koi8-r',
    'csksc56011987': 'cp949',
    'cspc775baltic': 'cp775',
    'cspc850multilingual': 'cp850',
    'cspc862latinhebrew': 'cp862',
    'cspc8codepage437': 'cp437',
    'cspcp852': 'cp852',
    'csptcp154': 'ptcp154',
    'csshiftjis': 'shift_jis',
    'csunicode11utf7': 'utf-7',
    'cyrillic': 'iso8859-5',
    'cyrillicasian': 'ptcp154',
    'ebcdiccpbe': 'cp500',
    'ebcdiccpca': 'cp037',
    'ebcdiccpch': 'cp500',
    'ebcdiccphe': 'cp424',
    'ebcdiccpnl': 'cp037',
    'ebcdiccpus': 'cp037',
    'ebcdiccpwt': 'cp037',
    'ecma114': 'iso8859-6',
    'ecma118': 'iso8859-7',
    'elot928': 'iso8859-7',
    'eucjp': 'euc_jp',
    'euckr': 'cp949',
    'extendedunixcodepackedformatforjapanese': 'euc_jp',
    'gb18030': 'gb18030',
    'gb2312': 'gbk',
    'gb231280': 'gbk',
    'gbk': 'gbk',
    'greek': 'iso8859-7',
    'greek8': 'iso8859-7',
    'hebrew': 'iso8859-8',
    'hproman8': 'hp-roman8',
    'hzgb2312': 'hz',
    'ibm037': 'cp037',
    'ibm1026': 'cp1026',
    'ibm367': 'ascii',
    'ibm424': 'cp424',
    'ibm437': 'cp437',
    'ibm500': 'cp500',
    'ibm775': 'cp775',
    'ibm819': 'windows-1252',
    'ibm850': 'cp850',
    'ibm852': 'cp852',
    'ibm855': 'cp855',
    'ibm857': 'cp857',
    'ibm860': 'cp860',
    'ibm861': 'cp861',
    'ibm862': 'cp862',
    'ibm863': 'cp863',
    'ibm864': 'cp864',
    'ibm865': 'cp865',
    'ibm866': 'cp866',
    'ibm869': 'cp869',
    'iso2022jp': 'iso2022_jp',
    'iso2022jp2': 'iso2022_jp_2',
    'iso2022kr': 'iso2022_kr',
    'iso646irv1991': 'ascii',
    'iso646us': 'ascii',
    'iso88591': 'windows-1252',
    'iso885910': 'iso8859-10',
    'iso8859101992': 'iso8859-10',
    'iso885911987': 'windows-1252',
    'iso885913': 'iso8859-13',
    'iso885914': 'iso8859-14',
    'iso8859141998': 'iso8859-14',
    'iso885915': 'iso8859-15',
    'iso885916': 'iso8859-16',
    'iso8859162001': 'iso8859-16',
    'iso88592': 'iso8859-2',
    'iso885921987': 'iso8859-2',
    'iso88593': 'iso8859-3',
    'iso885931988': 'iso8859-3',
    'iso88594': 'iso8859-4',
    'iso885941988': 'iso8859-4',
    'iso88595': 'iso8859-5',
    'iso885951988': 'iso8859-5',
    'iso88596': 'iso8859-6',
    'iso885961987': 'iso8859-6',
    'iso88597': 'iso8859-7',
    'iso885971987': 'iso8859-7',
    'iso88598': 'iso8859-8',
    'iso885981988': 'iso8859-8',
    'iso88599': 'windows-1254',
    'iso885991989': 'windows-1254',
    'isoceltic': 'iso8859-14',
    'isoir100': 'windows-1252',
    'isoir101': 'iso8859-2',
    'isoir109': 'iso8859-3',
    'isoir110': 'iso8859-4',
    'isoir126': 'iso8859-7',
    'isoir127': 'iso8859-6',
    'isoir138': 'iso8859-8',
    'isoir144': 'iso8859-5',
    'isoir148': 'windows-1254',
    'isoir149': 'cp949',
    'isoir157': 'iso8859-10',
    'isoir199': 'iso8859-14',
    'isoir226': 'iso8859-16',
    'isoir58': 'gbk',
    'isoir6': 'ascii',
    'koi8r': 'koi8-r',
    'koi8u': 'koi8-u',
    'korean': 'cp949',
    'ksc5601': 'cp949',
    'ksc56011987': 'cp949',
    'ksc56011989': 'cp949',
    'l1': 'windows-1252',
    'l10': 'iso8859-16',
    'l2': 'iso8859-2',
    'l3': 'iso8859-3',
    'l4': 'iso8859-4',
    'l5': 'windows-1254',
    'l6': 'iso8859-10',
    'l8': 'iso8859-14',
    'latin1': 'windows-1252',
    'latin10': 'iso8859-16',
    'latin2': 'iso8859-2',
    'latin3': 'iso8859-3',
    'latin4': 'iso8859-4',
    'latin5': 'windows-1254',
    'latin6': 'iso8859-10',
    'latin8': 'iso8859-14',
    'latin9': 'iso8859-15',
    'ms936': 'gbk',
    'mskanji': 'shift_jis',
    'pt154': 'ptcp154',
    'ptcp154': 'ptcp154',
    'r8': 'hp-roman8',
    'roman8': 'hp-roman8',
    'shiftjis': 'shift_jis',
    'tis620': 'cp874',
    'unicode11utf7': 'utf-7',
    'us': 'ascii',
    'usascii': 'ascii',
    'utf16': 'utf-16',
    'utf16be': 'utf-16-be',
    'utf16le': 'utf-16-le',
    'utf8': 'utf-8',
    'windows1250': 'cp1250',
    'windows1251': 'cp1251',
    'windows1252': 'cp1252',
    'windows1253': 'cp1253',
    'windows1254': 'cp1254',
    'windows1255': 'cp1255',
    'windows1256': 'cp1256',
    'windows1257': 'cp1257',
    'windows1258': 'cp1258',
    'windows936': 'gbk',
    'x-x-big5': 'big5'}

tokenTypes = {
    "Doctype": 0,
    "Characters": 1,
    "SpaceCharacters": 2,
    "StartTag": 3,
    "EndTag": 4,
    "EmptyTag": 5,
    "Comment": 6,
    "ParseError": 7
}

tagTokenTypes = frozenset((tokenTypes["StartTag"], tokenTypes["EndTag"],
                           tokenTypes["EmptyTag"]))


prefixes = dict([(v, k) for k, v in namespaces.items()])
prefixes["http://www.w3.org/1998/Math/MathML"] = "math"


class DataLossWarning(UserWarning):
    pass


class ReparseException(Exception):
    pass
site-packages/pip/_vendor/html5lib/html5parser.py000064400000344445151733463620016100 0ustar00from __future__ import absolute_import, division, unicode_literals
from pip._vendor.six import with_metaclass

import types

from . import inputstream
from . import tokenizer

from . import treebuilders
from .treebuilders._base import Marker

from . import utils
from . import constants
from .constants import spaceCharacters, asciiUpper2Lower
from .constants import specialElements
from .constants import headingElements
from .constants import cdataElements, rcdataElements
from .constants import tokenTypes, ReparseException, namespaces
from .constants import htmlIntegrationPointElements, mathmlTextIntegrationPointElements
from .constants import adjustForeignAttributes as adjustForeignAttributesMap


def parse(doc, treebuilder="etree", encoding=None,
          namespaceHTMLElements=True):
    """Parse a string or file-like object into a tree"""
    tb = treebuilders.getTreeBuilder(treebuilder)
    p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements)
    return p.parse(doc, encoding=encoding)


def parseFragment(doc, container="div", treebuilder="etree", encoding=None,
                  namespaceHTMLElements=True):
    tb = treebuilders.getTreeBuilder(treebuilder)
    p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements)
    return p.parseFragment(doc, container=container, encoding=encoding)


def method_decorator_metaclass(function):
    class Decorated(type):
        def __new__(meta, classname, bases, classDict):
            for attributeName, attribute in classDict.items():
                if isinstance(attribute, types.FunctionType):
                    attribute = function(attribute)

                classDict[attributeName] = attribute
            return type.__new__(meta, classname, bases, classDict)
    return Decorated


class HTMLParser(object):
    """HTML parser. Generates a tree structure from a stream of (possibly
        malformed) HTML"""

    def __init__(self, tree=None, tokenizer=tokenizer.HTMLTokenizer,
                 strict=False, namespaceHTMLElements=True, debug=False):
        """
        strict - raise an exception when a parse error is encountered

        tree - a treebuilder class controlling the type of tree that will be
        returned. Built in treebuilders can be accessed through
        html5lib.treebuilders.getTreeBuilder(treeType)

        tokenizer - a class that provides a stream of tokens to the treebuilder.
        This may be replaced for e.g. a sanitizer which converts some tags to
        text
        """

        # Raise an exception on the first error encountered
        self.strict = strict

        if tree is None:
            tree = treebuilders.getTreeBuilder("etree")
        self.tree = tree(namespaceHTMLElements)
        self.tokenizer_class = tokenizer
        self.errors = []

        self.phases = dict([(name, cls(self, self.tree)) for name, cls in
                            getPhases(debug).items()])

    def _parse(self, stream, innerHTML=False, container="div",
               encoding=None, parseMeta=True, useChardet=True, **kwargs):

        self.innerHTMLMode = innerHTML
        self.container = container
        self.tokenizer = self.tokenizer_class(stream, encoding=encoding,
                                              parseMeta=parseMeta,
                                              useChardet=useChardet,
                                              parser=self, **kwargs)
        self.reset()

        while True:
            try:
                self.mainLoop()
                break
            except ReparseException:
                self.reset()

    def reset(self):
        self.tree.reset()
        self.firstStartTag = False
        self.errors = []
        self.log = []  # only used with debug mode
        # "quirks" / "limited quirks" / "no quirks"
        self.compatMode = "no quirks"

        if self.innerHTMLMode:
            self.innerHTML = self.container.lower()

            if self.innerHTML in cdataElements:
                self.tokenizer.state = self.tokenizer.rcdataState
            elif self.innerHTML in rcdataElements:
                self.tokenizer.state = self.tokenizer.rawtextState
            elif self.innerHTML == 'plaintext':
                self.tokenizer.state = self.tokenizer.plaintextState
            else:
                # state already is data state
                # self.tokenizer.state = self.tokenizer.dataState
                pass
            self.phase = self.phases["beforeHtml"]
            self.phase.insertHtmlElement()
            self.resetInsertionMode()
        else:
            self.innerHTML = False
            self.phase = self.phases["initial"]

        self.lastPhase = None

        self.beforeRCDataPhase = None

        self.framesetOK = True

    def isHTMLIntegrationPoint(self, element):
        if (element.name == "annotation-xml" and
                element.namespace == namespaces["mathml"]):
            return ("encoding" in element.attributes and
                    element.attributes["encoding"].translate(
                        asciiUpper2Lower) in
                    ("text/html", "application/xhtml+xml"))
        else:
            return (element.namespace, element.name) in htmlIntegrationPointElements

    def isMathMLTextIntegrationPoint(self, element):
        return (element.namespace, element.name) in mathmlTextIntegrationPointElements

    def mainLoop(self):
        CharactersToken = tokenTypes["Characters"]
        SpaceCharactersToken = tokenTypes["SpaceCharacters"]
        StartTagToken = tokenTypes["StartTag"]
        EndTagToken = tokenTypes["EndTag"]
        CommentToken = tokenTypes["Comment"]
        DoctypeToken = tokenTypes["Doctype"]
        ParseErrorToken = tokenTypes["ParseError"]

        for token in self.normalizedTokens():
            new_token = token
            while new_token is not None:
                currentNode = self.tree.openElements[-1] if self.tree.openElements else None
                currentNodeNamespace = currentNode.namespace if currentNode else None
                currentNodeName = currentNode.name if currentNode else None

                type = new_token["type"]

                if type == ParseErrorToken:
                    self.parseError(new_token["data"], new_token.get("datavars", {}))
                    new_token = None
                else:
                    if (len(self.tree.openElements) == 0 or
                        currentNodeNamespace == self.tree.defaultNamespace or
                        (self.isMathMLTextIntegrationPoint(currentNode) and
                         ((type == StartTagToken and
                           token["name"] not in frozenset(["mglyph", "malignmark"])) or
                          type in (CharactersToken, SpaceCharactersToken))) or
                        (currentNodeNamespace == namespaces["mathml"] and
                         currentNodeName == "annotation-xml" and
                         token["name"] == "svg") or
                        (self.isHTMLIntegrationPoint(currentNode) and
                         type in (StartTagToken, CharactersToken, SpaceCharactersToken))):
                        phase = self.phase
                    else:
                        phase = self.phases["inForeignContent"]

                    if type == CharactersToken:
                        new_token = phase.processCharacters(new_token)
                    elif type == SpaceCharactersToken:
                        new_token = phase.processSpaceCharacters(new_token)
                    elif type == StartTagToken:
                        new_token = phase.processStartTag(new_token)
                    elif type == EndTagToken:
                        new_token = phase.processEndTag(new_token)
                    elif type == CommentToken:
                        new_token = phase.processComment(new_token)
                    elif type == DoctypeToken:
                        new_token = phase.processDoctype(new_token)

            if (type == StartTagToken and token["selfClosing"]
                    and not token["selfClosingAcknowledged"]):
                self.parseError("non-void-element-with-trailing-solidus",
                                {"name": token["name"]})

        # When the loop finishes it's EOF
        reprocess = True
        phases = []
        while reprocess:
            phases.append(self.phase)
            reprocess = self.phase.processEOF()
            if reprocess:
                assert self.phase not in phases

    def normalizedTokens(self):
        for token in self.tokenizer:
            yield self.normalizeToken(token)

    def parse(self, stream, encoding=None, parseMeta=True, useChardet=True):
        """Parse a HTML document into a well-formed tree

        stream - a filelike object or string containing the HTML to be parsed

        The optional encoding parameter must be a string that indicates
        the encoding.  If specified, that encoding will be used,
        regardless of any BOM or later declaration (such as in a meta
        element)
        """
        self._parse(stream, innerHTML=False, encoding=encoding,
                    parseMeta=parseMeta, useChardet=useChardet)
        return self.tree.getDocument()

    def parseFragment(self, stream, container="div", encoding=None,
                      parseMeta=False, useChardet=True):
        """Parse a HTML fragment into a well-formed tree fragment

        container - name of the element we're setting the innerHTML property
        if set to None, default to 'div'

        stream - a filelike object or string containing the HTML to be parsed

        The optional encoding parameter must be a string that indicates
        the encoding.  If specified, that encoding will be used,
        regardless of any BOM or later declaration (such as in a meta
        element)
        """
        self._parse(stream, True, container=container, encoding=encoding)
        return self.tree.getFragment()

    def parseError(self, errorcode="XXX-undefined-error", datavars={}):
        # XXX The idea is to make errorcode mandatory.
        self.errors.append((self.tokenizer.stream.position(), errorcode, datavars))
        if self.strict:
            raise ParseError

    def normalizeToken(self, token):
        """ HTML5 specific normalizations to the token stream """

        if token["type"] == tokenTypes["StartTag"]:
            token["data"] = dict(token["data"][::-1])

        return token

    def adjustMathMLAttributes(self, token):
        replacements = {"definitionurl": "definitionURL"}
        for k, v in replacements.items():
            if k in token["data"]:
                token["data"][v] = token["data"][k]
                del token["data"][k]

    def adjustSVGAttributes(self, token):
        replacements = {
            "attributename": "attributeName",
            "attributetype": "attributeType",
            "basefrequency": "baseFrequency",
            "baseprofile": "baseProfile",
            "calcmode": "calcMode",
            "clippathunits": "clipPathUnits",
            "contentscripttype": "contentScriptType",
            "contentstyletype": "contentStyleType",
            "diffuseconstant": "diffuseConstant",
            "edgemode": "edgeMode",
            "externalresourcesrequired": "externalResourcesRequired",
            "filterres": "filterRes",
            "filterunits": "filterUnits",
            "glyphref": "glyphRef",
            "gradienttransform": "gradientTransform",
            "gradientunits": "gradientUnits",
            "kernelmatrix": "kernelMatrix",
            "kernelunitlength": "kernelUnitLength",
            "keypoints": "keyPoints",
            "keysplines": "keySplines",
            "keytimes": "keyTimes",
            "lengthadjust": "lengthAdjust",
            "limitingconeangle": "limitingConeAngle",
            "markerheight": "markerHeight",
            "markerunits": "markerUnits",
            "markerwidth": "markerWidth",
            "maskcontentunits": "maskContentUnits",
            "maskunits": "maskUnits",
            "numoctaves": "numOctaves",
            "pathlength": "pathLength",
            "patterncontentunits": "patternContentUnits",
            "patterntransform": "patternTransform",
            "patternunits": "patternUnits",
            "pointsatx": "pointsAtX",
            "pointsaty": "pointsAtY",
            "pointsatz": "pointsAtZ",
            "preservealpha": "preserveAlpha",
            "preserveaspectratio": "preserveAspectRatio",
            "primitiveunits": "primitiveUnits",
            "refx": "refX",
            "refy": "refY",
            "repeatcount": "repeatCount",
            "repeatdur": "repeatDur",
            "requiredextensions": "requiredExtensions",
            "requiredfeatures": "requiredFeatures",
            "specularconstant": "specularConstant",
            "specularexponent": "specularExponent",
            "spreadmethod": "spreadMethod",
            "startoffset": "startOffset",
            "stddeviation": "stdDeviation",
            "stitchtiles": "stitchTiles",
            "surfacescale": "surfaceScale",
            "systemlanguage": "systemLanguage",
            "tablevalues": "tableValues",
            "targetx": "targetX",
            "targety": "targetY",
            "textlength": "textLength",
            "viewbox": "viewBox",
            "viewtarget": "viewTarget",
            "xchannelselector": "xChannelSelector",
            "ychannelselector": "yChannelSelector",
            "zoomandpan": "zoomAndPan"
        }
        for originalName in list(token["data"].keys()):
            if originalName in replacements:
                svgName = replacements[originalName]
                token["data"][svgName] = token["data"][originalName]
                del token["data"][originalName]

    def adjustForeignAttributes(self, token):
        replacements = adjustForeignAttributesMap

        for originalName in token["data"].keys():
            if originalName in replacements:
                foreignName = replacements[originalName]
                token["data"][foreignName] = token["data"][originalName]
                del token["data"][originalName]

    def reparseTokenNormal(self, token):
        self.parser.phase()

    def resetInsertionMode(self):
        # The name of this method is mostly historical. (It's also used in the
        # specification.)
        last = False
        newModes = {
            "select": "inSelect",
            "td": "inCell",
            "th": "inCell",
            "tr": "inRow",
            "tbody": "inTableBody",
            "thead": "inTableBody",
            "tfoot": "inTableBody",
            "caption": "inCaption",
            "colgroup": "inColumnGroup",
            "table": "inTable",
            "head": "inBody",
            "body": "inBody",
            "frameset": "inFrameset",
            "html": "beforeHead"
        }
        for node in self.tree.openElements[::-1]:
            nodeName = node.name
            new_phase = None
            if node == self.tree.openElements[0]:
                assert self.innerHTML
                last = True
                nodeName = self.innerHTML
            # Check for conditions that should only happen in the innerHTML
            # case
            if nodeName in ("select", "colgroup", "head", "html"):
                assert self.innerHTML

            if not last and node.namespace != self.tree.defaultNamespace:
                continue

            if nodeName in newModes:
                new_phase = self.phases[newModes[nodeName]]
                break
            elif last:
                new_phase = self.phases["inBody"]
                break

        self.phase = new_phase

    def parseRCDataRawtext(self, token, contentType):
        """Generic RCDATA/RAWTEXT Parsing algorithm
        contentType - RCDATA or RAWTEXT
        """
        assert contentType in ("RAWTEXT", "RCDATA")

        self.tree.insertElement(token)

        if contentType == "RAWTEXT":
            self.tokenizer.state = self.tokenizer.rawtextState
        else:
            self.tokenizer.state = self.tokenizer.rcdataState

        self.originalPhase = self.phase

        self.phase = self.phases["text"]


def getPhases(debug):
    def log(function):
        """Logger that records which phase processes each token"""
        type_names = dict((value, key) for key, value in
                          constants.tokenTypes.items())

        def wrapped(self, *args, **kwargs):
            if function.__name__.startswith("process") and len(args) > 0:
                token = args[0]
                try:
                    info = {"type": type_names[token['type']]}
                except:
                    raise
                if token['type'] in constants.tagTokenTypes:
                    info["name"] = token['name']

                self.parser.log.append((self.parser.tokenizer.state.__name__,
                                        self.parser.phase.__class__.__name__,
                                        self.__class__.__name__,
                                        function.__name__,
                                        info))
                return function(self, *args, **kwargs)
            else:
                return function(self, *args, **kwargs)
        return wrapped

    def getMetaclass(use_metaclass, metaclass_func):
        if use_metaclass:
            return method_decorator_metaclass(metaclass_func)
        else:
            return type

    class Phase(with_metaclass(getMetaclass(debug, log))):
        """Base class for helper object that implements each phase of processing
        """

        def __init__(self, parser, tree):
            self.parser = parser
            self.tree = tree

        def processEOF(self):
            raise NotImplementedError

        def processComment(self, token):
            # For most phases the following is correct. Where it's not it will be
            # overridden.
            self.tree.insertComment(token, self.tree.openElements[-1])

        def processDoctype(self, token):
            self.parser.parseError("unexpected-doctype")

        def processCharacters(self, token):
            self.tree.insertText(token["data"])

        def processSpaceCharacters(self, token):
            self.tree.insertText(token["data"])

        def processStartTag(self, token):
            return self.startTagHandler[token["name"]](token)

        def startTagHtml(self, token):
            if not self.parser.firstStartTag and token["name"] == "html":
                self.parser.parseError("non-html-root")
            # XXX Need a check here to see if the first start tag token emitted is
            # this token... If it's not, invoke self.parser.parseError().
            for attr, value in token["data"].items():
                if attr not in self.tree.openElements[0].attributes:
                    self.tree.openElements[0].attributes[attr] = value
            self.parser.firstStartTag = False

        def processEndTag(self, token):
            return self.endTagHandler[token["name"]](token)

    class InitialPhase(Phase):
        def processSpaceCharacters(self, token):
            pass

        def processComment(self, token):
            self.tree.insertComment(token, self.tree.document)

        def processDoctype(self, token):
            name = token["name"]
            publicId = token["publicId"]
            systemId = token["systemId"]
            correct = token["correct"]

            if (name != "html" or publicId is not None or
                    systemId is not None and systemId != "about:legacy-compat"):
                self.parser.parseError("unknown-doctype")

            if publicId is None:
                publicId = ""

            self.tree.insertDoctype(token)

            if publicId != "":
                publicId = publicId.translate(asciiUpper2Lower)

            if (not correct or token["name"] != "html"
                or publicId.startswith(
                    ("+//silmaril//dtd html pro v0r11 19970101//",
                     "-//advasoft ltd//dtd html 3.0 aswedit + extensions//",
                     "-//as//dtd html 3.0 aswedit + extensions//",
                     "-//ietf//dtd html 2.0 level 1//",
                     "-//ietf//dtd html 2.0 level 2//",
                     "-//ietf//dtd html 2.0 strict level 1//",
                     "-//ietf//dtd html 2.0 strict level 2//",
                     "-//ietf//dtd html 2.0 strict//",
                     "-//ietf//dtd html 2.0//",
                     "-//ietf//dtd html 2.1e//",
                     "-//ietf//dtd html 3.0//",
                     "-//ietf//dtd html 3.2 final//",
                     "-//ietf//dtd html 3.2//",
                     "-//ietf//dtd html 3//",
                     "-//ietf//dtd html level 0//",
                     "-//ietf//dtd html level 1//",
                     "-//ietf//dtd html level 2//",
                     "-//ietf//dtd html level 3//",
                     "-//ietf//dtd html strict level 0//",
                     "-//ietf//dtd html strict level 1//",
                     "-//ietf//dtd html strict level 2//",
                     "-//ietf//dtd html strict level 3//",
                     "-//ietf//dtd html strict//",
                     "-//ietf//dtd html//",
                     "-//metrius//dtd metrius presentational//",
                     "-//microsoft//dtd internet explorer 2.0 html strict//",
                     "-//microsoft//dtd internet explorer 2.0 html//",
                     "-//microsoft//dtd internet explorer 2.0 tables//",
                     "-//microsoft//dtd internet explorer 3.0 html strict//",
                     "-//microsoft//dtd internet explorer 3.0 html//",
                     "-//microsoft//dtd internet explorer 3.0 tables//",
                     "-//netscape comm. corp.//dtd html//",
                     "-//netscape comm. corp.//dtd strict html//",
                     "-//o'reilly and associates//dtd html 2.0//",
                     "-//o'reilly and associates//dtd html extended 1.0//",
                     "-//o'reilly and associates//dtd html extended relaxed 1.0//",
                     "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//",
                     "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//",
                     "-//spyglass//dtd html 2.0 extended//",
                     "-//sq//dtd html 2.0 hotmetal + extensions//",
                     "-//sun microsystems corp.//dtd hotjava html//",
                     "-//sun microsystems corp.//dtd hotjava strict html//",
                     "-//w3c//dtd html 3 1995-03-24//",
                     "-//w3c//dtd html 3.2 draft//",
                     "-//w3c//dtd html 3.2 final//",
                     "-//w3c//dtd html 3.2//",
                     "-//w3c//dtd html 3.2s draft//",
                     "-//w3c//dtd html 4.0 frameset//",
                     "-//w3c//dtd html 4.0 transitional//",
                     "-//w3c//dtd html experimental 19960712//",
                     "-//w3c//dtd html experimental 970421//",
                     "-//w3c//dtd w3 html//",
                     "-//w3o//dtd w3 html 3.0//",
                     "-//webtechs//dtd mozilla html 2.0//",
                     "-//webtechs//dtd mozilla html//"))
                or publicId in
                    ("-//w3o//dtd w3 html strict 3.0//en//",
                     "-/w3c/dtd html 4.0 transitional/en",
                     "html")
                or publicId.startswith(
                    ("-//w3c//dtd html 4.01 frameset//",
                     "-//w3c//dtd html 4.01 transitional//")) and
                    systemId is None
                    or systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"):
                self.parser.compatMode = "quirks"
            elif (publicId.startswith(
                    ("-//w3c//dtd xhtml 1.0 frameset//",
                     "-//w3c//dtd xhtml 1.0 transitional//"))
                  or publicId.startswith(
                      ("-//w3c//dtd html 4.01 frameset//",
                       "-//w3c//dtd html 4.01 transitional//")) and
                  systemId is not None):
                self.parser.compatMode = "limited quirks"

            self.parser.phase = self.parser.phases["beforeHtml"]

        def anythingElse(self):
            self.parser.compatMode = "quirks"
            self.parser.phase = self.parser.phases["beforeHtml"]

        def processCharacters(self, token):
            self.parser.parseError("expected-doctype-but-got-chars")
            self.anythingElse()
            return token

        def processStartTag(self, token):
            self.parser.parseError("expected-doctype-but-got-start-tag",
                                   {"name": token["name"]})
            self.anythingElse()
            return token

        def processEndTag(self, token):
            self.parser.parseError("expected-doctype-but-got-end-tag",
                                   {"name": token["name"]})
            self.anythingElse()
            return token

        def processEOF(self):
            self.parser.parseError("expected-doctype-but-got-eof")
            self.anythingElse()
            return True

    class BeforeHtmlPhase(Phase):
        # helper methods
        def insertHtmlElement(self):
            self.tree.insertRoot(impliedTagToken("html", "StartTag"))
            self.parser.phase = self.parser.phases["beforeHead"]

        # other
        def processEOF(self):
            self.insertHtmlElement()
            return True

        def processComment(self, token):
            self.tree.insertComment(token, self.tree.document)

        def processSpaceCharacters(self, token):
            pass

        def processCharacters(self, token):
            self.insertHtmlElement()
            return token

        def processStartTag(self, token):
            if token["name"] == "html":
                self.parser.firstStartTag = True
            self.insertHtmlElement()
            return token

        def processEndTag(self, token):
            if token["name"] not in ("head", "body", "html", "br"):
                self.parser.parseError("unexpected-end-tag-before-html",
                                       {"name": token["name"]})
            else:
                self.insertHtmlElement()
                return token

    class BeforeHeadPhase(Phase):
        def __init__(self, parser, tree):
            Phase.__init__(self, parser, tree)

            self.startTagHandler = utils.MethodDispatcher([
                ("html", self.startTagHtml),
                ("head", self.startTagHead)
            ])
            self.startTagHandler.default = self.startTagOther

            self.endTagHandler = utils.MethodDispatcher([
                (("head", "body", "html", "br"), self.endTagImplyHead)
            ])
            self.endTagHandler.default = self.endTagOther

        def processEOF(self):
            self.startTagHead(impliedTagToken("head", "StartTag"))
            return True

        def processSpaceCharacters(self, token):
            pass

        def processCharacters(self, token):
            self.startTagHead(impliedTagToken("head", "StartTag"))
            return token

        def startTagHtml(self, token):
            return self.parser.phases["inBody"].processStartTag(token)

        def startTagHead(self, token):
            self.tree.insertElement(token)
            self.tree.headPointer = self.tree.openElements[-1]
            self.parser.phase = self.parser.phases["inHead"]

        def startTagOther(self, token):
            self.startTagHead(impliedTagToken("head", "StartTag"))
            return token

        def endTagImplyHead(self, token):
            self.startTagHead(impliedTagToken("head", "StartTag"))
            return token

        def endTagOther(self, token):
            self.parser.parseError("end-tag-after-implied-root",
                                   {"name": token["name"]})

    class InHeadPhase(Phase):
        def __init__(self, parser, tree):
            Phase.__init__(self, parser, tree)

            self.startTagHandler = utils.MethodDispatcher([
                ("html", self.startTagHtml),
                ("title", self.startTagTitle),
                (("noscript", "noframes", "style"), self.startTagNoScriptNoFramesStyle),
                ("script", self.startTagScript),
                (("base", "basefont", "bgsound", "command", "link"),
                 self.startTagBaseLinkCommand),
                ("meta", self.startTagMeta),
                ("head", self.startTagHead)
            ])
            self.startTagHandler.default = self.startTagOther

            self. endTagHandler = utils.MethodDispatcher([
                ("head", self.endTagHead),
                (("br", "html", "body"), self.endTagHtmlBodyBr)
            ])
            self.endTagHandler.default = self.endTagOther

        # the real thing
        def processEOF(self):
            self.anythingElse()
            return True

        def processCharacters(self, token):
            self.anythingElse()
            return token

        def startTagHtml(self, token):
            return self.parser.phases["inBody"].processStartTag(token)

        def startTagHead(self, token):
            self.parser.parseError("two-heads-are-not-better-than-one")

        def startTagBaseLinkCommand(self, token):
            self.tree.insertElement(token)
            self.tree.openElements.pop()
            token["selfClosingAcknowledged"] = True

        def startTagMeta(self, token):
            self.tree.insertElement(token)
            self.tree.openElements.pop()
            token["selfClosingAcknowledged"] = True

            attributes = token["data"]
            if self.parser.tokenizer.stream.charEncoding[1] == "tentative":
                if "charset" in attributes:
                    self.parser.tokenizer.stream.changeEncoding(attributes["charset"])
                elif ("content" in attributes and
                      "http-equiv" in attributes and
                      attributes["http-equiv"].lower() == "content-type"):
                    # Encoding it as UTF-8 here is a hack, as really we should pass
                    # the abstract Unicode string, and just use the
                    # ContentAttrParser on that, but using UTF-8 allows all chars
                    # to be encoded and as a ASCII-superset works.
                    data = inputstream.EncodingBytes(attributes["content"].encode("utf-8"))
                    parser = inputstream.ContentAttrParser(data)
                    codec = parser.parse()
                    self.parser.tokenizer.stream.changeEncoding(codec)

        def startTagTitle(self, token):
            self.parser.parseRCDataRawtext(token, "RCDATA")

        def startTagNoScriptNoFramesStyle(self, token):
            # Need to decide whether to implement the scripting-disabled case
            self.parser.parseRCDataRawtext(token, "RAWTEXT")

        def startTagScript(self, token):
            self.tree.insertElement(token)
            self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState
            self.parser.originalPhase = self.parser.phase
            self.parser.phase = self.parser.phases["text"]

        def startTagOther(self, token):
            self.anythingElse()
            return token

        def endTagHead(self, token):
            node = self.parser.tree.openElements.pop()
            assert node.name == "head", "Expected head got %s" % node.name
            self.parser.phase = self.parser.phases["afterHead"]

        def endTagHtmlBodyBr(self, token):
            self.anythingElse()
            return token

        def endTagOther(self, token):
            self.parser.parseError("unexpected-end-tag", {"name": token["name"]})

        def anythingElse(self):
            self.endTagHead(impliedTagToken("head"))

    # XXX If we implement a parser for which scripting is disabled we need to
    # implement this phase.
    #
    # class InHeadNoScriptPhase(Phase):
    class AfterHeadPhase(Phase):
        def __init__(self, parser, tree):
            Phase.__init__(self, parser, tree)

            self.startTagHandler = utils.MethodDispatcher([
                ("html", self.startTagHtml),
                ("body", self.startTagBody),
                ("frameset", self.startTagFrameset),
                (("base", "basefont", "bgsound", "link", "meta", "noframes", "script",
                  "style", "title"),
                 self.startTagFromHead),
                ("head", self.startTagHead)
            ])
            self.startTagHandler.default = self.startTagOther
            self.endTagHandler = utils.MethodDispatcher([(("body", "html", "br"),
                                                          self.endTagHtmlBodyBr)])
            self.endTagHandler.default = self.endTagOther

        def processEOF(self):
            self.anythingElse()
            return True

        def processCharacters(self, token):
            self.anythingElse()
            return token

        def startTagHtml(self, token):
            return self.parser.phases["inBody"].processStartTag(token)

        def startTagBody(self, token):
            self.parser.framesetOK = False
            self.tree.insertElement(token)
            self.parser.phase = self.parser.phases["inBody"]

        def startTagFrameset(self, token):
            self.tree.insertElement(token)
            self.parser.phase = self.parser.phases["inFrameset"]

        def startTagFromHead(self, token):
            self.parser.parseError("unexpected-start-tag-out-of-my-head",
                                   {"name": token["name"]})
            self.tree.openElements.append(self.tree.headPointer)
            self.parser.phases["inHead"].processStartTag(token)
            for node in self.tree.openElements[::-1]:
                if node.name == "head":
                    self.tree.openElements.remove(node)
                    break

        def startTagHead(self, token):
            self.parser.parseError("unexpected-start-tag", {"name": token["name"]})

        def startTagOther(self, token):
            self.anythingElse()
            return token

        def endTagHtmlBodyBr(self, token):
            self.anythingElse()
            return token

        def endTagOther(self, token):
            self.parser.parseError("unexpected-end-tag", {"name": token["name"]})

        def anythingElse(self):
            self.tree.insertElement(impliedTagToken("body", "StartTag"))
            self.parser.phase = self.parser.phases["inBody"]
            self.parser.framesetOK = True

    class InBodyPhase(Phase):
        # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody
        # the really-really-really-very crazy mode
        def __init__(self, parser, tree):
            Phase.__init__(self, parser, tree)

            # Keep a ref to this for special handling of whitespace in <pre>
            self.processSpaceCharactersNonPre = self.processSpaceCharacters

            self.startTagHandler = utils.MethodDispatcher([
                ("html", self.startTagHtml),
                (("base", "basefont", "bgsound", "command", "link", "meta",
                  "noframes", "script", "style", "title"),
                 self.startTagProcessInHead),
                ("body", self.startTagBody),
                ("frameset", self.startTagFrameset),
                (("address", "article", "aside", "blockquote", "center", "details",
                  "details", "dir", "div", "dl", "fieldset", "figcaption", "figure",
                  "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p",
                  "section", "summary", "ul"),
                 self.startTagCloseP),
                (headingElements, self.startTagHeading),
                (("pre", "listing"), self.startTagPreListing),
                ("form", self.startTagForm),
                (("li", "dd", "dt"), self.startTagListItem),
                ("plaintext", self.startTagPlaintext),
                ("a", self.startTagA),
                (("b", "big", "code", "em", "font", "i", "s", "small", "strike",
                  "strong", "tt", "u"), self.startTagFormatting),
                ("nobr", self.startTagNobr),
                ("button", self.startTagButton),
                (("applet", "marquee", "object"), self.startTagAppletMarqueeObject),
                ("xmp", self.startTagXmp),
                ("table", self.startTagTable),
                (("area", "br", "embed", "img", "keygen", "wbr"),
                 self.startTagVoidFormatting),
                (("param", "source", "track"), self.startTagParamSource),
                ("input", self.startTagInput),
                ("hr", self.startTagHr),
                ("image", self.startTagImage),
                ("isindex", self.startTagIsIndex),
                ("textarea", self.startTagTextarea),
                ("iframe", self.startTagIFrame),
                (("noembed", "noframes", "noscript"), self.startTagRawtext),
                ("select", self.startTagSelect),
                (("rp", "rt"), self.startTagRpRt),
                (("option", "optgroup"), self.startTagOpt),
                (("math"), self.startTagMath),
                (("svg"), self.startTagSvg),
                (("caption", "col", "colgroup", "frame", "head",
                  "tbody", "td", "tfoot", "th", "thead",
                  "tr"), self.startTagMisplaced)
            ])
            self.startTagHandler.default = self.startTagOther

            self.endTagHandler = utils.MethodDispatcher([
                ("body", self.endTagBody),
                ("html", self.endTagHtml),
                (("address", "article", "aside", "blockquote", "button", "center",
                  "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure",
                  "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre",
                  "section", "summary", "ul"), self.endTagBlock),
                ("form", self.endTagForm),
                ("p", self.endTagP),
                (("dd", "dt", "li"), self.endTagListItem),
                (headingElements, self.endTagHeading),
                (("a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small",
                  "strike", "strong", "tt", "u"), self.endTagFormatting),
                (("applet", "marquee", "object"), self.endTagAppletMarqueeObject),
                ("br", self.endTagBr),
            ])
            self.endTagHandler.default = self.endTagOther

        def isMatchingFormattingElement(self, node1, node2):
            if node1.name != node2.name or node1.namespace != node2.namespace:
                return False
            elif len(node1.attributes) != len(node2.attributes):
                return False
            else:
                attributes1 = sorted(node1.attributes.items())
                attributes2 = sorted(node2.attributes.items())
                for attr1, attr2 in zip(attributes1, attributes2):
                    if attr1 != attr2:
                        return False
            return True

        # helper
        def addFormattingElement(self, token):
            self.tree.insertElement(token)
            element = self.tree.openElements[-1]

            matchingElements = []
            for node in self.tree.activeFormattingElements[::-1]:
                if node is Marker:
                    break
                elif self.isMatchingFormattingElement(node, element):
                    matchingElements.append(node)

            assert len(matchingElements) <= 3
            if len(matchingElements) == 3:
                self.tree.activeFormattingElements.remove(matchingElements[-1])
            self.tree.activeFormattingElements.append(element)

        # the real deal
        def processEOF(self):
            allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td",
                                          "tfoot", "th", "thead", "tr", "body",
                                          "html"))
            for node in self.tree.openElements[::-1]:
                if node.name not in allowed_elements:
                    self.parser.parseError("expected-closing-tag-but-got-eof")
                    break
            # Stop parsing

        def processSpaceCharactersDropNewline(self, token):
            # Sometimes (start of <pre>, <listing>, and <textarea> blocks) we
            # want to drop leading newlines
            data = token["data"]
            self.processSpaceCharacters = self.processSpaceCharactersNonPre
            if (data.startswith("\n") and
                self.tree.openElements[-1].name in ("pre", "listing", "textarea")
                    and not self.tree.openElements[-1].hasContent()):
                data = data[1:]
            if data:
                self.tree.reconstructActiveFormattingElements()
                self.tree.insertText(data)

        def processCharacters(self, token):
            if token["data"] == "\u0000":
                # The tokenizer should always emit null on its own
                return
            self.tree.reconstructActiveFormattingElements()
            self.tree.insertText(token["data"])
            # This must be bad for performance
            if (self.parser.framesetOK and
                any([char not in spaceCharacters
                     for char in token["data"]])):
                self.parser.framesetOK = False

        def processSpaceCharacters(self, token):
            self.tree.reconstructActiveFormattingElements()
            self.tree.insertText(token["data"])

        def startTagProcessInHead(self, token):
            return self.parser.phases["inHead"].processStartTag(token)

        def startTagBody(self, token):
            self.parser.parseError("unexpected-start-tag", {"name": "body"})
            if (len(self.tree.openElements) == 1
                    or self.tree.openElements[1].name != "body"):
                assert self.parser.innerHTML
            else:
                self.parser.framesetOK = False
                for attr, value in token["data"].items():
                    if attr not in self.tree.openElements[1].attributes:
                        self.tree.openElements[1].attributes[attr] = value

        def startTagFrameset(self, token):
            self.parser.parseError("unexpected-start-tag", {"name": "frameset"})
            if (len(self.tree.openElements) == 1 or self.tree.openElements[1].name != "body"):
                assert self.parser.innerHTML
            elif not self.parser.framesetOK:
                pass
            else:
                if self.tree.openElements[1].parent:
                    self.tree.openElements[1].parent.removeChild(self.tree.openElements[1])
                while self.tree.openElements[-1].name != "html":
                    self.tree.openElements.pop()
                self.tree.insertElement(token)
                self.parser.phase = self.parser.phases["inFrameset"]

        def startTagCloseP(self, token):
            if self.tree.elementInScope("p", variant="button"):
                self.endTagP(impliedTagToken("p"))
            self.tree.insertElement(token)

        def startTagPreListing(self, token):
            if self.tree.elementInScope("p", variant="button"):
                self.endTagP(impliedTagToken("p"))
            self.tree.insertElement(token)
            self.parser.framesetOK = False
            self.processSpaceCharacters = self.processSpaceCharactersDropNewline

        def startTagForm(self, token):
            if self.tree.formPointer:
                self.parser.parseError("unexpected-start-tag", {"name": "form"})
            else:
                if self.tree.elementInScope("p", variant="button"):
                    self.endTagP(impliedTagToken("p"))
                self.tree.insertElement(token)
                self.tree.formPointer = self.tree.openElements[-1]

        def startTagListItem(self, token):
            self.parser.framesetOK = False

            stopNamesMap = {"li": ["li"],
                            "dt": ["dt", "dd"],
                            "dd": ["dt", "dd"]}
            stopNames = stopNamesMap[token["name"]]
            for node in reversed(self.tree.openElements):
                if node.name in stopNames:
                    self.parser.phase.processEndTag(
                        impliedTagToken(node.name, "EndTag"))
                    break
                if (node.nameTuple in specialElements and
                        node.name not in ("address", "div", "p")):
                    break

            if self.tree.elementInScope("p", variant="button"):
                self.parser.phase.processEndTag(
                    impliedTagToken("p", "EndTag"))

            self.tree.insertElement(token)

        def startTagPlaintext(self, token):
            if self.tree.elementInScope("p", variant="button"):
                self.endTagP(impliedTagToken("p"))
            self.tree.insertElement(token)
            self.parser.tokenizer.state = self.parser.tokenizer.plaintextState

        def startTagHeading(self, token):
            if self.tree.elementInScope("p", variant="button"):
                self.endTagP(impliedTagToken("p"))
            if self.tree.openElements[-1].name in headingElements:
                self.parser.parseError("unexpected-start-tag", {"name": token["name"]})
                self.tree.openElements.pop()
            self.tree.insertElement(token)

        def startTagA(self, token):
            afeAElement = self.tree.elementInActiveFormattingElements("a")
            if afeAElement:
                self.parser.parseError("unexpected-start-tag-implies-end-tag",
                                       {"startName": "a", "endName": "a"})
                self.endTagFormatting(impliedTagToken("a"))
                if afeAElement in self.tree.openElements:
                    self.tree.openElements.remove(afeAElement)
                if afeAElement in self.tree.activeFormattingElements:
                    self.tree.activeFormattingElements.remove(afeAElement)
            self.tree.reconstructActiveFormattingElements()
            self.addFormattingElement(token)

        def startTagFormatting(self, token):
            self.tree.reconstructActiveFormattingElements()
            self.addFormattingElement(token)

        def startTagNobr(self, token):
            self.tree.reconstructActiveFormattingElements()
            if self.tree.elementInScope("nobr"):
                self.parser.parseError("unexpected-start-tag-implies-end-tag",
                                       {"startName": "nobr", "endName": "nobr"})
                self.processEndTag(impliedTagToken("nobr"))
                # XXX Need tests that trigger the following
                self.tree.reconstructActiveFormattingElements()
            self.addFormattingElement(token)

        def startTagButton(self, token):
            if self.tree.elementInScope("button"):
                self.parser.parseError("unexpected-start-tag-implies-end-tag",
                                       {"startName": "button", "endName": "button"})
                self.processEndTag(impliedTagToken("button"))
                return token
            else:
                self.tree.reconstructActiveFormattingElements()
                self.tree.insertElement(token)
                self.parser.framesetOK = False

        def startTagAppletMarqueeObject(self, token):
            self.tree.reconstructActiveFormattingElements()
            self.tree.insertElement(token)
            self.tree.activeFormattingElements.append(Marker)
            self.parser.framesetOK = False

        def startTagXmp(self, token):
            if self.tree.elementInScope("p", variant="button"):
                self.endTagP(impliedTagToken("p"))
            self.tree.reconstructActiveFormattingElements()
            self.parser.framesetOK = False
            self.parser.parseRCDataRawtext(token, "RAWTEXT")

        def startTagTable(self, token):
            if self.parser.compatMode != "quirks":
                if self.tree.elementInScope("p", variant="button"):
                    self.processEndTag(impliedTagToken("p"))
            self.tree.insertElement(token)
            self.parser.framesetOK = False
            self.parser.phase = self.parser.phases["inTable"]

        def startTagVoidFormatting(self, token):
            self.tree.reconstructActiveFormattingElements()
            self.tree.insertElement(token)
            self.tree.openElements.pop()
            token["selfClosingAcknowledged"] = True
            self.parser.framesetOK = False

        def startTagInput(self, token):
            framesetOK = self.parser.framesetOK
            self.startTagVoidFormatting(token)
            if ("type" in token["data"] and
                    token["data"]["type"].translate(asciiUpper2Lower) == "hidden"):
                # input type=hidden doesn't change framesetOK
                self.parser.framesetOK = framesetOK

        def startTagParamSource(self, token):
            self.tree.insertElement(token)
            self.tree.openElements.pop()
            token["selfClosingAcknowledged"] = True

        def startTagHr(self, token):
            if self.tree.elementInScope("p", variant="button"):
                self.endTagP(impliedTagToken("p"))
            self.tree.insertElement(token)
            self.tree.openElements.pop()
            token["selfClosingAcknowledged"] = True
            self.parser.framesetOK = False

        def startTagImage(self, token):
            # No really...
            self.parser.parseError("unexpected-start-tag-treated-as",
                                   {"originalName": "image", "newName": "img"})
            self.processStartTag(impliedTagToken("img", "StartTag",
                                                 attributes=token["data"],
                                                 selfClosing=token["selfClosing"]))

        def startTagIsIndex(self, token):
            self.parser.parseError("deprecated-tag", {"name": "isindex"})
            if self.tree.formPointer:
                return
            form_attrs = {}
            if "action" in token["data"]:
                form_attrs["action"] = token["data"]["action"]
            self.processStartTag(impliedTagToken("form", "StartTag",
                                                 attributes=form_attrs))
            self.processStartTag(impliedTagToken("hr", "StartTag"))
            self.processStartTag(impliedTagToken("label", "StartTag"))
            # XXX Localization ...
            if "prompt" in token["data"]:
                prompt = token["data"]["prompt"]
            else:
                prompt = "This is a searchable index. Enter search keywords: "
            self.processCharacters(
                {"type": tokenTypes["Characters"], "data": prompt})
            attributes = token["data"].copy()
            if "action" in attributes:
                del attributes["action"]
            if "prompt" in attributes:
                del attributes["prompt"]
            attributes["name"] = "isindex"
            self.processStartTag(impliedTagToken("input", "StartTag",
                                                 attributes=attributes,
                                                 selfClosing=
                                                 token["selfClosing"]))
            self.processEndTag(impliedTagToken("label"))
            self.processStartTag(impliedTagToken("hr", "StartTag"))
            self.processEndTag(impliedTagToken("form"))

        def startTagTextarea(self, token):
            self.tree.insertElement(token)
            self.parser.tokenizer.state = self.parser.tokenizer.rcdataState
            self.processSpaceCharacters = self.processSpaceCharactersDropNewline
            self.parser.framesetOK = False

        def startTagIFrame(self, token):
            self.parser.framesetOK = False
            self.startTagRawtext(token)

        def startTagRawtext(self, token):
            """iframe, noembed noframes, noscript(if scripting enabled)"""
            self.parser.parseRCDataRawtext(token, "RAWTEXT")

        def startTagOpt(self, token):
            if self.tree.openElements[-1].name == "option":
                self.parser.phase.processEndTag(impliedTagToken("option"))
            self.tree.reconstructActiveFormattingElements()
            self.parser.tree.insertElement(token)

        def startTagSelect(self, token):
            self.tree.reconstructActiveFormattingElements()
            self.tree.insertElement(token)
            self.parser.framesetOK = False
            if self.parser.phase in (self.parser.phases["inTable"],
                                     self.parser.phases["inCaption"],
                                     self.parser.phases["inColumnGroup"],
                                     self.parser.phases["inTableBody"],
                                     self.parser.phases["inRow"],
                                     self.parser.phases["inCell"]):
                self.parser.phase = self.parser.phases["inSelectInTable"]
            else:
                self.parser.phase = self.parser.phases["inSelect"]

        def startTagRpRt(self, token):
            if self.tree.elementInScope("ruby"):
                self.tree.generateImpliedEndTags()
                if self.tree.openElements[-1].name != "ruby":
                    self.parser.parseError()
            self.tree.insertElement(token)

        def startTagMath(self, token):
            self.tree.reconstructActiveFormattingElements()
            self.parser.adjustMathMLAttributes(token)
            self.parser.adjustForeignAttributes(token)
            token["namespace"] = namespaces["mathml"]
            self.tree.insertElement(token)
            # Need to get the parse error right for the case where the token
            # has a namespace not equal to the xmlns attribute
            if token["selfClosing"]:
                self.tree.openElements.pop()
                token["selfClosingAcknowledged"] = True

        def startTagSvg(self, token):
            self.tree.reconstructActiveFormattingElements()
            self.parser.adjustSVGAttributes(token)
            self.parser.adjustForeignAttributes(token)
            token["namespace"] = namespaces["svg"]
            self.tree.insertElement(token)
            # Need to get the parse error right for the case where the token
            # has a namespace not equal to the xmlns attribute
            if token["selfClosing"]:
                self.tree.openElements.pop()
                token["selfClosingAcknowledged"] = True

        def startTagMisplaced(self, token):
            """ Elements that should be children of other elements that have a
            different insertion mode; here they are ignored
            "caption", "col", "colgroup", "frame", "frameset", "head",
            "option", "optgroup", "tbody", "td", "tfoot", "th", "thead",
            "tr", "noscript"
            """
            self.parser.parseError("unexpected-start-tag-ignored", {"name": token["name"]})

        def startTagOther(self, token):
            self.tree.reconstructActiveFormattingElements()
            self.tree.insertElement(token)

        def endTagP(self, token):
            if not self.tree.elementInScope("p", variant="button"):
                self.startTagCloseP(impliedTagToken("p", "StartTag"))
                self.parser.parseError("unexpected-end-tag", {"name": "p"})
                self.endTagP(impliedTagToken("p", "EndTag"))
            else:
                self.tree.generateImpliedEndTags("p")
                if self.tree.openElements[-1].name != "p":
                    self.parser.parseError("unexpected-end-tag", {"name": "p"})
                node = self.tree.openElements.pop()
                while node.name != "p":
                    node = self.tree.openElements.pop()

        def endTagBody(self, token):
            if not self.tree.elementInScope("body"):
                self.parser.parseError()
                return
            elif self.tree.openElements[-1].name != "body":
                for node in self.tree.openElements[2:]:
                    if node.name not in frozenset(("dd", "dt", "li", "optgroup",
                                                   "option", "p", "rp", "rt",
                                                   "tbody", "td", "tfoot",
                                                   "th", "thead", "tr", "body",
                                                   "html")):
                        # Not sure this is the correct name for the parse error
                        self.parser.parseError(
                            "expected-one-end-tag-but-got-another",
                            {"expectedName": "body", "gotName": node.name})
                        break
            self.parser.phase = self.parser.phases["afterBody"]

        def endTagHtml(self, token):
            # We repeat the test for the body end tag token being ignored here
            if self.tree.elementInScope("body"):
                self.endTagBody(impliedTagToken("body"))
                return token

        def endTagBlock(self, token):
            # Put us back in the right whitespace handling mode
            if token["name"] == "pre":
                self.processSpaceCharacters = self.processSpaceCharactersNonPre
            inScope = self.tree.elementInScope(token["name"])
            if inScope:
                self.tree.generateImpliedEndTags()
            if self.tree.openElements[-1].name != token["name"]:
                self.parser.parseError("end-tag-too-early", {"name": token["name"]})
            if inScope:
                node = self.tree.openElements.pop()
                while node.name != token["name"]:
                    node = self.tree.openElements.pop()

        def endTagForm(self, token):
            node = self.tree.formPointer
            self.tree.formPointer = None
            if node is None or not self.tree.elementInScope(node):
                self.parser.parseError("unexpected-end-tag",
                                       {"name": "form"})
            else:
                self.tree.generateImpliedEndTags()
                if self.tree.openElements[-1] != node:
                    self.parser.parseError("end-tag-too-early-ignored",
                                           {"name": "form"})
                self.tree.openElements.remove(node)

        def endTagListItem(self, token):
            if token["name"] == "li":
                variant = "list"
            else:
                variant = None
            if not self.tree.elementInScope(token["name"], variant=variant):
                self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
            else:
                self.tree.generateImpliedEndTags(exclude=token["name"])
                if self.tree.openElements[-1].name != token["name"]:
                    self.parser.parseError(
                        "end-tag-too-early",
                        {"name": token["name"]})
                node = self.tree.openElements.pop()
                while node.name != token["name"]:
                    node = self.tree.openElements.pop()

        def endTagHeading(self, token):
            for item in headingElements:
                if self.tree.elementInScope(item):
                    self.tree.generateImpliedEndTags()
                    break
            if self.tree.openElements[-1].name != token["name"]:
                self.parser.parseError("end-tag-too-early", {"name": token["name"]})

            for item in headingElements:
                if self.tree.elementInScope(item):
                    item = self.tree.openElements.pop()
                    while item.name not in headingElements:
                        item = self.tree.openElements.pop()
                    break

        def endTagFormatting(self, token):
            """The much-feared adoption agency algorithm"""
            # http://svn.whatwg.org/webapps/complete.html#adoptionAgency revision 7867
            # XXX Better parseError messages appreciated.

            # Step 1
            outerLoopCounter = 0

            # Step 2
            while outerLoopCounter < 8:

                # Step 3
                outerLoopCounter += 1

                # Step 4:

                # Let the formatting element be the last element in
                # the list of active formatting elements that:
                # - is between the end of the list and the last scope
                # marker in the list, if any, or the start of the list
                # otherwise, and
                # - has the same tag name as the token.
                formattingElement = self.tree.elementInActiveFormattingElements(
                    token["name"])
                if (not formattingElement or
                    (formattingElement in self.tree.openElements and
                     not self.tree.elementInScope(formattingElement.name))):
                    # If there is no such node, then abort these steps
                    # and instead act as described in the "any other
                    # end tag" entry below.
                    self.endTagOther(token)
                    return

                # Otherwise, if there is such a node, but that node is
                # not in the stack of open elements, then this is a
                # parse error; remove the element from the list, and
                # abort these steps.
                elif formattingElement not in self.tree.openElements:
                    self.parser.parseError("adoption-agency-1.2", {"name": token["name"]})
                    self.tree.activeFormattingElements.remove(formattingElement)
                    return

                # Otherwise, if there is such a node, and that node is
                # also in the stack of open elements, but the element
                # is not in scope, then this is a parse error; ignore
                # the token, and abort these steps.
                elif not self.tree.elementInScope(formattingElement.name):
                    self.parser.parseError("adoption-agency-4.4", {"name": token["name"]})
                    return

                # Otherwise, there is a formatting element and that
                # element is in the stack and is in scope. If the
                # element is not the current node, this is a parse
                # error. In any case, proceed with the algorithm as
                # written in the following steps.
                else:
                    if formattingElement != self.tree.openElements[-1]:
                        self.parser.parseError("adoption-agency-1.3", {"name": token["name"]})

                # Step 5:

                # Let the furthest block be the topmost node in the
                # stack of open elements that is lower in the stack
                # than the formatting element, and is an element in
                # the special category. There might not be one.
                afeIndex = self.tree.openElements.index(formattingElement)
                furthestBlock = None
                for element in self.tree.openElements[afeIndex:]:
                    if element.nameTuple in specialElements:
                        furthestBlock = element
                        break

                # Step 6:

                # If there is no furthest block, then the UA must
                # first pop all the nodes from the bottom of the stack
                # of open elements, from the current node up to and
                # including the formatting element, then remove the
                # formatting element from the list of active
                # formatting elements, and finally abort these steps.
                if furthestBlock is None:
                    element = self.tree.openElements.pop()
                    while element != formattingElement:
                        element = self.tree.openElements.pop()
                    self.tree.activeFormattingElements.remove(element)
                    return

                # Step 7
                commonAncestor = self.tree.openElements[afeIndex - 1]

                # Step 8:
                # The bookmark is supposed to help us identify where to reinsert
                # nodes in step 15. We have to ensure that we reinsert nodes after
                # the node before the active formatting element. Note the bookmark
                # can move in step 9.7
                bookmark = self.tree.activeFormattingElements.index(formattingElement)

                # Step 9
                lastNode = node = furthestBlock
                innerLoopCounter = 0

                index = self.tree.openElements.index(node)
                while innerLoopCounter < 3:
                    innerLoopCounter += 1
                    # Node is element before node in open elements
                    index -= 1
                    node = self.tree.openElements[index]
                    if node not in self.tree.activeFormattingElements:
                        self.tree.openElements.remove(node)
                        continue
                    # Step 9.6
                    if node == formattingElement:
                        break
                    # Step 9.7
                    if lastNode == furthestBlock:
                        bookmark = self.tree.activeFormattingElements.index(node) + 1
                    # Step 9.8
                    clone = node.cloneNode()
                    # Replace node with clone
                    self.tree.activeFormattingElements[
                        self.tree.activeFormattingElements.index(node)] = clone
                    self.tree.openElements[
                        self.tree.openElements.index(node)] = clone
                    node = clone
                    # Step 9.9
                    # Remove lastNode from its parents, if any
                    if lastNode.parent:
                        lastNode.parent.removeChild(lastNode)
                    node.appendChild(lastNode)
                    # Step 9.10
                    lastNode = node

                # Step 10
                # Foster parent lastNode if commonAncestor is a
                # table, tbody, tfoot, thead, or tr we need to foster
                # parent the lastNode
                if lastNode.parent:
                    lastNode.parent.removeChild(lastNode)

                if commonAncestor.name in frozenset(("table", "tbody", "tfoot", "thead", "tr")):
                    parent, insertBefore = self.tree.getTableMisnestedNodePosition()
                    parent.insertBefore(lastNode, insertBefore)
                else:
                    commonAncestor.appendChild(lastNode)

                # Step 11
                clone = formattingElement.cloneNode()

                # Step 12
                furthestBlock.reparentChildren(clone)

                # Step 13
                furthestBlock.appendChild(clone)

                # Step 14
                self.tree.activeFormattingElements.remove(formattingElement)
                self.tree.activeFormattingElements.insert(bookmark, clone)

                # Step 15
                self.tree.openElements.remove(formattingElement)
                self.tree.openElements.insert(
                    self.tree.openElements.index(furthestBlock) + 1, clone)

        def endTagAppletMarqueeObject(self, token):
            if self.tree.elementInScope(token["name"]):
                self.tree.generateImpliedEndTags()
            if self.tree.openElements[-1].name != token["name"]:
                self.parser.parseError("end-tag-too-early", {"name": token["name"]})

            if self.tree.elementInScope(token["name"]):
                element = self.tree.openElements.pop()
                while element.name != token["name"]:
                    element = self.tree.openElements.pop()
                self.tree.clearActiveFormattingElements()

        def endTagBr(self, token):
            self.parser.parseError("unexpected-end-tag-treated-as",
                                   {"originalName": "br", "newName": "br element"})
            self.tree.reconstructActiveFormattingElements()
            self.tree.insertElement(impliedTagToken("br", "StartTag"))
            self.tree.openElements.pop()

        def endTagOther(self, token):
            for node in self.tree.openElements[::-1]:
                if node.name == token["name"]:
                    self.tree.generateImpliedEndTags(exclude=token["name"])
                    if self.tree.openElements[-1].name != token["name"]:
                        self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
                    while self.tree.openElements.pop() != node:
                        pass
                    break
                else:
                    if node.nameTuple in specialElements:
                        self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
                        break

    class TextPhase(Phase):
        def __init__(self, parser, tree):
            Phase.__init__(self, parser, tree)
            self.startTagHandler = utils.MethodDispatcher([])
            self.startTagHandler.default = self.startTagOther
            self.endTagHandler = utils.MethodDispatcher([
                ("script", self.endTagScript)])
            self.endTagHandler.default = self.endTagOther

        def processCharacters(self, token):
            self.tree.insertText(token["data"])

        def processEOF(self):
            self.parser.parseError("expected-named-closing-tag-but-got-eof",
                                   {"name": self.tree.openElements[-1].name})
            self.tree.openElements.pop()
            self.parser.phase = self.parser.originalPhase
            return True

        def startTagOther(self, token):
            assert False, "Tried to process start tag %s in RCDATA/RAWTEXT mode" % token['name']

        def endTagScript(self, token):
            node = self.tree.openElements.pop()
            assert node.name == "script"
            self.parser.phase = self.parser.originalPhase
            # The rest of this method is all stuff that only happens if
            # document.write works

        def endTagOther(self, token):
            self.tree.openElements.pop()
            self.parser.phase = self.parser.originalPhase

    class InTablePhase(Phase):
        # http://www.whatwg.org/specs/web-apps/current-work/#in-table
        def __init__(self, parser, tree):
            Phase.__init__(self, parser, tree)
            self.startTagHandler = utils.MethodDispatcher([
                ("html", self.startTagHtml),
                ("caption", self.startTagCaption),
                ("colgroup", self.startTagColgroup),
                ("col", self.startTagCol),
                (("tbody", "tfoot", "thead"), self.startTagRowGroup),
                (("td", "th", "tr"), self.startTagImplyTbody),
                ("table", self.startTagTable),
                (("style", "script"), self.startTagStyleScript),
                ("input", self.startTagInput),
                ("form", self.startTagForm)
            ])
            self.startTagHandler.default = self.startTagOther

            self.endTagHandler = utils.MethodDispatcher([
                ("table", self.endTagTable),
                (("body", "caption", "col", "colgroup", "html", "tbody", "td",
                  "tfoot", "th", "thead", "tr"), self.endTagIgnore)
            ])
            self.endTagHandler.default = self.endTagOther

        # helper methods
        def clearStackToTableContext(self):
            # "clear the stack back to a table context"
            while self.tree.openElements[-1].name not in ("table", "html"):
                # self.parser.parseError("unexpected-implied-end-tag-in-table",
                #  {"name":  self.tree.openElements[-1].name})
                self.tree.openElements.pop()
            # When the current node is <html> it's an innerHTML case

        # processing methods
        def processEOF(self):
            if self.tree.openElements[-1].name != "html":
                self.parser.parseError("eof-in-table")
            else:
                assert self.parser.innerHTML
            # Stop parsing

        def processSpaceCharacters(self, token):
            originalPhase = self.parser.phase
            self.parser.phase = self.parser.phases["inTableText"]
            self.parser.phase.originalPhase = originalPhase
            self.parser.phase.processSpaceCharacters(token)

        def processCharacters(self, token):
            originalPhase = self.parser.phase
            self.parser.phase = self.parser.phases["inTableText"]
            self.parser.phase.originalPhase = originalPhase
            self.parser.phase.processCharacters(token)

        def insertText(self, token):
            # If we get here there must be at least one non-whitespace character
            # Do the table magic!
            self.tree.insertFromTable = True
            self.parser.phases["inBody"].processCharacters(token)
            self.tree.insertFromTable = False

        def startTagCaption(self, token):
            self.clearStackToTableContext()
            self.tree.activeFormattingElements.append(Marker)
            self.tree.insertElement(token)
            self.parser.phase = self.parser.phases["inCaption"]

        def startTagColgroup(self, token):
            self.clearStackToTableContext()
            self.tree.insertElement(token)
            self.parser.phase = self.parser.phases["inColumnGroup"]

        def startTagCol(self, token):
            self.startTagColgroup(impliedTagToken("colgroup", "StartTag"))
            return token

        def startTagRowGroup(self, token):
            self.clearStackToTableContext()
            self.tree.insertElement(token)
            self.parser.phase = self.parser.phases["inTableBody"]

        def startTagImplyTbody(self, token):
            self.startTagRowGroup(impliedTagToken("tbody", "StartTag"))
            return token

        def startTagTable(self, token):
            self.parser.parseError("unexpected-start-tag-implies-end-tag",
                                   {"startName": "table", "endName": "table"})
            self.parser.phase.processEndTag(impliedTagToken("table"))
            if not self.parser.innerHTML:
                return token

        def startTagStyleScript(self, token):
            return self.parser.phases["inHead"].processStartTag(token)

        def startTagInput(self, token):
            if ("type" in token["data"] and
                    token["data"]["type"].translate(asciiUpper2Lower) == "hidden"):
                self.parser.parseError("unexpected-hidden-input-in-table")
                self.tree.insertElement(token)
                # XXX associate with form
                self.tree.openElements.pop()
            else:
                self.startTagOther(token)

        def startTagForm(self, token):
            self.parser.parseError("unexpected-form-in-table")
            if self.tree.formPointer is None:
                self.tree.insertElement(token)
                self.tree.formPointer = self.tree.openElements[-1]
                self.tree.openElements.pop()

        def startTagOther(self, token):
            self.parser.parseError("unexpected-start-tag-implies-table-voodoo", {"name": token["name"]})
            # Do the table magic!
            self.tree.insertFromTable = True
            self.parser.phases["inBody"].processStartTag(token)
            self.tree.insertFromTable = False

        def endTagTable(self, token):
            if self.tree.elementInScope("table", variant="table"):
                self.tree.generateImpliedEndTags()
                if self.tree.openElements[-1].name != "table":
                    self.parser.parseError("end-tag-too-early-named",
                                           {"gotName": "table",
                                            "expectedName": self.tree.openElements[-1].name})
                while self.tree.openElements[-1].name != "table":
                    self.tree.openElements.pop()
                self.tree.openElements.pop()
                self.parser.resetInsertionMode()
            else:
                # innerHTML case
                assert self.parser.innerHTML
                self.parser.parseError()

        def endTagIgnore(self, token):
            self.parser.parseError("unexpected-end-tag", {"name": token["name"]})

        def endTagOther(self, token):
            self.parser.parseError("unexpected-end-tag-implies-table-voodoo", {"name": token["name"]})
            # Do the table magic!
            self.tree.insertFromTable = True
            self.parser.phases["inBody"].processEndTag(token)
            self.tree.insertFromTable = False

    class InTableTextPhase(Phase):
        def __init__(self, parser, tree):
            Phase.__init__(self, parser, tree)
            self.originalPhase = None
            self.characterTokens = []

        def flushCharacters(self):
            data = "".join([item["data"] for item in self.characterTokens])
            if any([item not in spaceCharacters for item in data]):
                token = {"type": tokenTypes["Characters"], "data": data}
                self.parser.phases["inTable"].insertText(token)
            elif data:
                self.tree.insertText(data)
            self.characterTokens = []

        def processComment(self, token):
            self.flushCharacters()
            self.parser.phase = self.originalPhase
            return token

        def processEOF(self):
            self.flushCharacters()
            self.parser.phase = self.originalPhase
            return True

        def processCharacters(self, token):
            if token["data"] == "\u0000":
                return
            self.characterTokens.append(token)

        def processSpaceCharacters(self, token):
            # pretty sure we should never reach here
            self.characterTokens.append(token)
    #        assert False

        def processStartTag(self, token):
            self.flushCharacters()
            self.parser.phase = self.originalPhase
            return token

        def processEndTag(self, token):
            self.flushCharacters()
            self.parser.phase = self.originalPhase
            return token

    class InCaptionPhase(Phase):
        # http://www.whatwg.org/specs/web-apps/current-work/#in-caption
        def __init__(self, parser, tree):
            Phase.__init__(self, parser, tree)

            self.startTagHandler = utils.MethodDispatcher([
                ("html", self.startTagHtml),
                (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th",
                  "thead", "tr"), self.startTagTableElement)
            ])
            self.startTagHandler.default = self.startTagOther

            self.endTagHandler = utils.MethodDispatcher([
                ("caption", self.endTagCaption),
                ("table", self.endTagTable),
                (("body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th",
                  "thead", "tr"), self.endTagIgnore)
            ])
            self.endTagHandler.default = self.endTagOther

        def ignoreEndTagCaption(self):
            return not self.tree.elementInScope("caption", variant="table")

        def processEOF(self):
            self.parser.phases["inBody"].processEOF()

        def processCharacters(self, token):
            return self.parser.phases["inBody"].processCharacters(token)

        def startTagTableElement(self, token):
            self.parser.parseError()
            # XXX Have to duplicate logic here to find out if the tag is ignored
            ignoreEndTag = self.ignoreEndTagCaption()
            self.parser.phase.processEndTag(impliedTagToken("caption"))
            if not ignoreEndTag:
                return token

        def startTagOther(self, token):
            return self.parser.phases["inBody"].processStartTag(token)

        def endTagCaption(self, token):
            if not self.ignoreEndTagCaption():
                # AT this code is quite similar to endTagTable in "InTable"
                self.tree.generateImpliedEndTags()
                if self.tree.openElements[-1].name != "caption":
                    self.parser.parseError("expected-one-end-tag-but-got-another",
                                           {"gotName": "caption",
                                            "expectedName": self.tree.openElements[-1].name})
                while self.tree.openElements[-1].name != "caption":
                    self.tree.openElements.pop()
                self.tree.openElements.pop()
                self.tree.clearActiveFormattingElements()
                self.parser.phase = self.parser.phases["inTable"]
            else:
                # innerHTML case
                assert self.parser.innerHTML
                self.parser.parseError()

        def endTagTable(self, token):
            self.parser.parseError()
            ignoreEndTag = self.ignoreEndTagCaption()
            self.parser.phase.processEndTag(impliedTagToken("caption"))
            if not ignoreEndTag:
                return token

        def endTagIgnore(self, token):
            self.parser.parseError("unexpected-end-tag", {"name": token["name"]})

        def endTagOther(self, token):
            return self.parser.phases["inBody"].processEndTag(token)

    class InColumnGroupPhase(Phase):
        # http://www.whatwg.org/specs/web-apps/current-work/#in-column

        def __init__(self, parser, tree):
            Phase.__init__(self, parser, tree)

            self.startTagHandler = utils.MethodDispatcher([
                ("html", self.startTagHtml),
                ("col", self.startTagCol)
            ])
            self.startTagHandler.default = self.startTagOther

            self.endTagHandler = utils.MethodDispatcher([
                ("colgroup", self.endTagColgroup),
                ("col", self.endTagCol)
            ])
            self.endTagHandler.default = self.endTagOther

        def ignoreEndTagColgroup(self):
            return self.tree.openElements[-1].name == "html"

        def processEOF(self):
            if self.tree.openElements[-1].name == "html":
                assert self.parser.innerHTML
                return
            else:
                ignoreEndTag = self.ignoreEndTagColgroup()
                self.endTagColgroup(impliedTagToken("colgroup"))
                if not ignoreEndTag:
                    return True

        def processCharacters(self, token):
            ignoreEndTag = self.ignoreEndTagColgroup()
            self.endTagColgroup(impliedTagToken("colgroup"))
            if not ignoreEndTag:
                return token

        def startTagCol(self, token):
            self.tree.insertElement(token)
            self.tree.openElements.pop()

        def startTagOther(self, token):
            ignoreEndTag = self.ignoreEndTagColgroup()
            self.endTagColgroup(impliedTagToken("colgroup"))
            if not ignoreEndTag:
                return token

        def endTagColgroup(self, token):
            if self.ignoreEndTagColgroup():
                # innerHTML case
                assert self.parser.innerHTML
                self.parser.parseError()
            else:
                self.tree.openElements.pop()
                self.parser.phase = self.parser.phases["inTable"]

        def endTagCol(self, token):
            self.parser.parseError("no-end-tag", {"name": "col"})

        def endTagOther(self, token):
            ignoreEndTag = self.ignoreEndTagColgroup()
            self.endTagColgroup(impliedTagToken("colgroup"))
            if not ignoreEndTag:
                return token

    class InTableBodyPhase(Phase):
        # http://www.whatwg.org/specs/web-apps/current-work/#in-table0
        def __init__(self, parser, tree):
            Phase.__init__(self, parser, tree)
            self.startTagHandler = utils.MethodDispatcher([
                ("html", self.startTagHtml),
                ("tr", self.startTagTr),
                (("td", "th"), self.startTagTableCell),
                (("caption", "col", "colgroup", "tbody", "tfoot", "thead"),
                 self.startTagTableOther)
            ])
            self.startTagHandler.default = self.startTagOther

            self.endTagHandler = utils.MethodDispatcher([
                (("tbody", "tfoot", "thead"), self.endTagTableRowGroup),
                ("table", self.endTagTable),
                (("body", "caption", "col", "colgroup", "html", "td", "th",
                  "tr"), self.endTagIgnore)
            ])
            self.endTagHandler.default = self.endTagOther

        # helper methods
        def clearStackToTableBodyContext(self):
            while self.tree.openElements[-1].name not in ("tbody", "tfoot",
                                                          "thead", "html"):
                # self.parser.parseError("unexpected-implied-end-tag-in-table",
                #  {"name": self.tree.openElements[-1].name})
                self.tree.openElements.pop()
            if self.tree.openElements[-1].name == "html":
                assert self.parser.innerHTML

        # the rest
        def processEOF(self):
            self.parser.phases["inTable"].processEOF()

        def processSpaceCharacters(self, token):
            return self.parser.phases["inTable"].processSpaceCharacters(token)

        def processCharacters(self, token):
            return self.parser.phases["inTable"].processCharacters(token)

        def startTagTr(self, token):
            self.clearStackToTableBodyContext()
            self.tree.insertElement(token)
            self.parser.phase = self.parser.phases["inRow"]

        def startTagTableCell(self, token):
            self.parser.parseError("unexpected-cell-in-table-body",
                                   {"name": token["name"]})
            self.startTagTr(impliedTagToken("tr", "StartTag"))
            return token

        def startTagTableOther(self, token):
            # XXX AT Any ideas on how to share this with endTagTable?
            if (self.tree.elementInScope("tbody", variant="table") or
                self.tree.elementInScope("thead", variant="table") or
                    self.tree.elementInScope("tfoot", variant="table")):
                self.clearStackToTableBodyContext()
                self.endTagTableRowGroup(
                    impliedTagToken(self.tree.openElements[-1].name))
                return token
            else:
                # innerHTML case
                assert self.parser.innerHTML
                self.parser.parseError()

        def startTagOther(self, token):
            return self.parser.phases["inTable"].processStartTag(token)

        def endTagTableRowGroup(self, token):
            if self.tree.elementInScope(token["name"], variant="table"):
                self.clearStackToTableBodyContext()
                self.tree.openElements.pop()
                self.parser.phase = self.parser.phases["inTable"]
            else:
                self.parser.parseError("unexpected-end-tag-in-table-body",
                                       {"name": token["name"]})

        def endTagTable(self, token):
            if (self.tree.elementInScope("tbody", variant="table") or
                self.tree.elementInScope("thead", variant="table") or
                    self.tree.elementInScope("tfoot", variant="table")):
                self.clearStackToTableBodyContext()
                self.endTagTableRowGroup(
                    impliedTagToken(self.tree.openElements[-1].name))
                return token
            else:
                # innerHTML case
                assert self.parser.innerHTML
                self.parser.parseError()

        def endTagIgnore(self, token):
            self.parser.parseError("unexpected-end-tag-in-table-body",
                                   {"name": token["name"]})

        def endTagOther(self, token):
            return self.parser.phases["inTable"].processEndTag(token)

    class InRowPhase(Phase):
        # http://www.whatwg.org/specs/web-apps/current-work/#in-row
        def __init__(self, parser, tree):
            Phase.__init__(self, parser, tree)
            self.startTagHandler = utils.MethodDispatcher([
                ("html", self.startTagHtml),
                (("td", "th"), self.startTagTableCell),
                (("caption", "col", "colgroup", "tbody", "tfoot", "thead",
                  "tr"), self.startTagTableOther)
            ])
            self.startTagHandler.default = self.startTagOther

            self.endTagHandler = utils.MethodDispatcher([
                ("tr", self.endTagTr),
                ("table", self.endTagTable),
                (("tbody", "tfoot", "thead"), self.endTagTableRowGroup),
                (("body", "caption", "col", "colgroup", "html", "td", "th"),
                 self.endTagIgnore)
            ])
            self.endTagHandler.default = self.endTagOther

        # helper methods (XXX unify this with other table helper methods)
        def clearStackToTableRowContext(self):
            while self.tree.openElements[-1].name not in ("tr", "html"):
                self.parser.parseError("unexpected-implied-end-tag-in-table-row",
                                       {"name": self.tree.openElements[-1].name})
                self.tree.openElements.pop()

        def ignoreEndTagTr(self):
            return not self.tree.elementInScope("tr", variant="table")

        # the rest
        def processEOF(self):
            self.parser.phases["inTable"].processEOF()

        def processSpaceCharacters(self, token):
            return self.parser.phases["inTable"].processSpaceCharacters(token)

        def processCharacters(self, token):
            return self.parser.phases["inTable"].processCharacters(token)

        def startTagTableCell(self, token):
            self.clearStackToTableRowContext()
            self.tree.insertElement(token)
            self.parser.phase = self.parser.phases["inCell"]
            self.tree.activeFormattingElements.append(Marker)

        def startTagTableOther(self, token):
            ignoreEndTag = self.ignoreEndTagTr()
            self.endTagTr(impliedTagToken("tr"))
            # XXX how are we sure it's always ignored in the innerHTML case?
            if not ignoreEndTag:
                return token

        def startTagOther(self, token):
            return self.parser.phases["inTable"].processStartTag(token)

        def endTagTr(self, token):
            if not self.ignoreEndTagTr():
                self.clearStackToTableRowContext()
                self.tree.openElements.pop()
                self.parser.phase = self.parser.phases["inTableBody"]
            else:
                # innerHTML case
                assert self.parser.innerHTML
                self.parser.parseError()

        def endTagTable(self, token):
            ignoreEndTag = self.ignoreEndTagTr()
            self.endTagTr(impliedTagToken("tr"))
            # Reprocess the current tag if the tr end tag was not ignored
            # XXX how are we sure it's always ignored in the innerHTML case?
            if not ignoreEndTag:
                return token

        def endTagTableRowGroup(self, token):
            if self.tree.elementInScope(token["name"], variant="table"):
                self.endTagTr(impliedTagToken("tr"))
                return token
            else:
                self.parser.parseError()

        def endTagIgnore(self, token):
            self.parser.parseError("unexpected-end-tag-in-table-row",
                                   {"name": token["name"]})

        def endTagOther(self, token):
            return self.parser.phases["inTable"].processEndTag(token)

    class InCellPhase(Phase):
        # http://www.whatwg.org/specs/web-apps/current-work/#in-cell
        def __init__(self, parser, tree):
            Phase.__init__(self, parser, tree)
            self.startTagHandler = utils.MethodDispatcher([
                ("html", self.startTagHtml),
                (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th",
                  "thead", "tr"), self.startTagTableOther)
            ])
            self.startTagHandler.default = self.startTagOther

            self.endTagHandler = utils.MethodDispatcher([
                (("td", "th"), self.endTagTableCell),
                (("body", "caption", "col", "colgroup", "html"), self.endTagIgnore),
                (("table", "tbody", "tfoot", "thead", "tr"), self.endTagImply)
            ])
            self.endTagHandler.default = self.endTagOther

        # helper
        def closeCell(self):
            if self.tree.elementInScope("td", variant="table"):
                self.endTagTableCell(impliedTagToken("td"))
            elif self.tree.elementInScope("th", variant="table"):
                self.endTagTableCell(impliedTagToken("th"))

        # the rest
        def processEOF(self):
            self.parser.phases["inBody"].processEOF()

        def processCharacters(self, token):
            return self.parser.phases["inBody"].processCharacters(token)

        def startTagTableOther(self, token):
            if (self.tree.elementInScope("td", variant="table") or
                    self.tree.elementInScope("th", variant="table")):
                self.closeCell()
                return token
            else:
                # innerHTML case
                assert self.parser.innerHTML
                self.parser.parseError()

        def startTagOther(self, token):
            return self.parser.phases["inBody"].processStartTag(token)

        def endTagTableCell(self, token):
            if self.tree.elementInScope(token["name"], variant="table"):
                self.tree.generateImpliedEndTags(token["name"])
                if self.tree.openElements[-1].name != token["name"]:
                    self.parser.parseError("unexpected-cell-end-tag",
                                           {"name": token["name"]})
                    while True:
                        node = self.tree.openElements.pop()
                        if node.name == token["name"]:
                            break
                else:
                    self.tree.openElements.pop()
                self.tree.clearActiveFormattingElements()
                self.parser.phase = self.parser.phases["inRow"]
            else:
                self.parser.parseError("unexpected-end-tag", {"name": token["name"]})

        def endTagIgnore(self, token):
            self.parser.parseError("unexpected-end-tag", {"name": token["name"]})

        def endTagImply(self, token):
            if self.tree.elementInScope(token["name"], variant="table"):
                self.closeCell()
                return token
            else:
                # sometimes innerHTML case
                self.parser.parseError()

        def endTagOther(self, token):
            return self.parser.phases["inBody"].processEndTag(token)

    class InSelectPhase(Phase):
        def __init__(self, parser, tree):
            Phase.__init__(self, parser, tree)

            self.startTagHandler = utils.MethodDispatcher([
                ("html", self.startTagHtml),
                ("option", self.startTagOption),
                ("optgroup", self.startTagOptgroup),
                ("select", self.startTagSelect),
                (("input", "keygen", "textarea"), self.startTagInput),
                ("script", self.startTagScript)
            ])
            self.startTagHandler.default = self.startTagOther

            self.endTagHandler = utils.MethodDispatcher([
                ("option", self.endTagOption),
                ("optgroup", self.endTagOptgroup),
                ("select", self.endTagSelect)
            ])
            self.endTagHandler.default = self.endTagOther

        # http://www.whatwg.org/specs/web-apps/current-work/#in-select
        def processEOF(self):
            if self.tree.openElements[-1].name != "html":
                self.parser.parseError("eof-in-select")
            else:
                assert self.parser.innerHTML

        def processCharacters(self, token):
            if token["data"] == "\u0000":
                return
            self.tree.insertText(token["data"])

        def startTagOption(self, token):
            # We need to imply </option> if <option> is the current node.
            if self.tree.openElements[-1].name == "option":
                self.tree.openElements.pop()
            self.tree.insertElement(token)

        def startTagOptgroup(self, token):
            if self.tree.openElements[-1].name == "option":
                self.tree.openElements.pop()
            if self.tree.openElements[-1].name == "optgroup":
                self.tree.openElements.pop()
            self.tree.insertElement(token)

        def startTagSelect(self, token):
            self.parser.parseError("unexpected-select-in-select")
            self.endTagSelect(impliedTagToken("select"))

        def startTagInput(self, token):
            self.parser.parseError("unexpected-input-in-select")
            if self.tree.elementInScope("select", variant="select"):
                self.endTagSelect(impliedTagToken("select"))
                return token
            else:
                assert self.parser.innerHTML

        def startTagScript(self, token):
            return self.parser.phases["inHead"].processStartTag(token)

        def startTagOther(self, token):
            self.parser.parseError("unexpected-start-tag-in-select",
                                   {"name": token["name"]})

        def endTagOption(self, token):
            if self.tree.openElements[-1].name == "option":
                self.tree.openElements.pop()
            else:
                self.parser.parseError("unexpected-end-tag-in-select",
                                       {"name": "option"})

        def endTagOptgroup(self, token):
            # </optgroup> implicitly closes <option>
            if (self.tree.openElements[-1].name == "option" and
                    self.tree.openElements[-2].name == "optgroup"):
                self.tree.openElements.pop()
            # It also closes </optgroup>
            if self.tree.openElements[-1].name == "optgroup":
                self.tree.openElements.pop()
            # But nothing else
            else:
                self.parser.parseError("unexpected-end-tag-in-select",
                                       {"name": "optgroup"})

        def endTagSelect(self, token):
            if self.tree.elementInScope("select", variant="select"):
                node = self.tree.openElements.pop()
                while node.name != "select":
                    node = self.tree.openElements.pop()
                self.parser.resetInsertionMode()
            else:
                # innerHTML case
                assert self.parser.innerHTML
                self.parser.parseError()

        def endTagOther(self, token):
            self.parser.parseError("unexpected-end-tag-in-select",
                                   {"name": token["name"]})

    class InSelectInTablePhase(Phase):
        def __init__(self, parser, tree):
            Phase.__init__(self, parser, tree)

            self.startTagHandler = utils.MethodDispatcher([
                (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"),
                 self.startTagTable)
            ])
            self.startTagHandler.default = self.startTagOther

            self.endTagHandler = utils.MethodDispatcher([
                (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"),
                 self.endTagTable)
            ])
            self.endTagHandler.default = self.endTagOther

        def processEOF(self):
            self.parser.phases["inSelect"].processEOF()

        def processCharacters(self, token):
            return self.parser.phases["inSelect"].processCharacters(token)

        def startTagTable(self, token):
            self.parser.parseError("unexpected-table-element-start-tag-in-select-in-table", {"name": token["name"]})
            self.endTagOther(impliedTagToken("select"))
            return token

        def startTagOther(self, token):
            return self.parser.phases["inSelect"].processStartTag(token)

        def endTagTable(self, token):
            self.parser.parseError("unexpected-table-element-end-tag-in-select-in-table", {"name": token["name"]})
            if self.tree.elementInScope(token["name"], variant="table"):
                self.endTagOther(impliedTagToken("select"))
                return token

        def endTagOther(self, token):
            return self.parser.phases["inSelect"].processEndTag(token)

    class InForeignContentPhase(Phase):
        breakoutElements = frozenset(["b", "big", "blockquote", "body", "br",
                                      "center", "code", "dd", "div", "dl", "dt",
                                      "em", "embed", "h1", "h2", "h3",
                                      "h4", "h5", "h6", "head", "hr", "i", "img",
                                      "li", "listing", "menu", "meta", "nobr",
                                      "ol", "p", "pre", "ruby", "s", "small",
                                      "span", "strong", "strike", "sub", "sup",
                                      "table", "tt", "u", "ul", "var"])

        def __init__(self, parser, tree):
            Phase.__init__(self, parser, tree)

        def adjustSVGTagNames(self, token):
            replacements = {"altglyph": "altGlyph",
                            "altglyphdef": "altGlyphDef",
                            "altglyphitem": "altGlyphItem",
                            "animatecolor": "animateColor",
                            "animatemotion": "animateMotion",
                            "animatetransform": "animateTransform",
                            "clippath": "clipPath",
                            "feblend": "feBlend",
                            "fecolormatrix": "feColorMatrix",
                            "fecomponenttransfer": "feComponentTransfer",
                            "fecomposite": "feComposite",
                            "feconvolvematrix": "feConvolveMatrix",
                            "fediffuselighting": "feDiffuseLighting",
                            "fedisplacementmap": "feDisplacementMap",
                            "fedistantlight": "feDistantLight",
                            "feflood": "feFlood",
                            "fefunca": "feFuncA",
                            "fefuncb": "feFuncB",
                            "fefuncg": "feFuncG",
                            "fefuncr": "feFuncR",
                            "fegaussianblur": "feGaussianBlur",
                            "feimage": "feImage",
                            "femerge": "feMerge",
                            "femergenode": "feMergeNode",
                            "femorphology": "feMorphology",
                            "feoffset": "feOffset",
                            "fepointlight": "fePointLight",
                            "fespecularlighting": "feSpecularLighting",
                            "fespotlight": "feSpotLight",
                            "fetile": "feTile",
                            "feturbulence": "feTurbulence",
                            "foreignobject": "foreignObject",
                            "glyphref": "glyphRef",
                            "lineargradient": "linearGradient",
                            "radialgradient": "radialGradient",
                            "textpath": "textPath"}

            if token["name"] in replacements:
                token["name"] = replacements[token["name"]]

        def processCharacters(self, token):
            if token["data"] == "\u0000":
                token["data"] = "\uFFFD"
            elif (self.parser.framesetOK and
                  any(char not in spaceCharacters for char in token["data"])):
                self.parser.framesetOK = False
            Phase.processCharacters(self, token)

        def processStartTag(self, token):
            currentNode = self.tree.openElements[-1]
            if (token["name"] in self.breakoutElements or
                (token["name"] == "font" and
                 set(token["data"].keys()) & set(["color", "face", "size"]))):
                self.parser.parseError("unexpected-html-element-in-foreign-content",
                                       {"name": token["name"]})
                while (self.tree.openElements[-1].namespace !=
                       self.tree.defaultNamespace and
                       not self.parser.isHTMLIntegrationPoint(self.tree.openElements[-1]) and
                       not self.parser.isMathMLTextIntegrationPoint(self.tree.openElements[-1])):
                    self.tree.openElements.pop()
                return token

            else:
                if currentNode.namespace == namespaces["mathml"]:
                    self.parser.adjustMathMLAttributes(token)
                elif currentNode.namespace == namespaces["svg"]:
                    self.adjustSVGTagNames(token)
                    self.parser.adjustSVGAttributes(token)
                self.parser.adjustForeignAttributes(token)
                token["namespace"] = currentNode.namespace
                self.tree.insertElement(token)
                if token["selfClosing"]:
                    self.tree.openElements.pop()
                    token["selfClosingAcknowledged"] = True

        def processEndTag(self, token):
            nodeIndex = len(self.tree.openElements) - 1
            node = self.tree.openElements[-1]
            if node.name != token["name"]:
                self.parser.parseError("unexpected-end-tag", {"name": token["name"]})

            while True:
                if node.name.translate(asciiUpper2Lower) == token["name"]:
                    # XXX this isn't in the spec but it seems necessary
                    if self.parser.phase == self.parser.phases["inTableText"]:
                        self.parser.phase.flushCharacters()
                        self.parser.phase = self.parser.phase.originalPhase
                    while self.tree.openElements.pop() != node:
                        assert self.tree.openElements
                    new_token = None
                    break
                nodeIndex -= 1

                node = self.tree.openElements[nodeIndex]
                if node.namespace != self.tree.defaultNamespace:
                    continue
                else:
                    new_token = self.parser.phase.processEndTag(token)
                    break
            return new_token

    class AfterBodyPhase(Phase):
        def __init__(self, parser, tree):
            Phase.__init__(self, parser, tree)

            self.startTagHandler = utils.MethodDispatcher([
                ("html", self.startTagHtml)
            ])
            self.startTagHandler.default = self.startTagOther

            self.endTagHandler = utils.MethodDispatcher([("html", self.endTagHtml)])
            self.endTagHandler.default = self.endTagOther

        def processEOF(self):
            # Stop parsing
            pass

        def processComment(self, token):
            # This is needed because data is to be appended to the <html> element
            # here and not to whatever is currently open.
            self.tree.insertComment(token, self.tree.openElements[0])

        def processCharacters(self, token):
            self.parser.parseError("unexpected-char-after-body")
            self.parser.phase = self.parser.phases["inBody"]
            return token

        def startTagHtml(self, token):
            return self.parser.phases["inBody"].processStartTag(token)

        def startTagOther(self, token):
            self.parser.parseError("unexpected-start-tag-after-body",
                                   {"name": token["name"]})
            self.parser.phase = self.parser.phases["inBody"]
            return token

        def endTagHtml(self, name):
            if self.parser.innerHTML:
                self.parser.parseError("unexpected-end-tag-after-body-innerhtml")
            else:
                self.parser.phase = self.parser.phases["afterAfterBody"]

        def endTagOther(self, token):
            self.parser.parseError("unexpected-end-tag-after-body",
                                   {"name": token["name"]})
            self.parser.phase = self.parser.phases["inBody"]
            return token

    class InFramesetPhase(Phase):
        # http://www.whatwg.org/specs/web-apps/current-work/#in-frameset
        def __init__(self, parser, tree):
            Phase.__init__(self, parser, tree)

            self.startTagHandler = utils.MethodDispatcher([
                ("html", self.startTagHtml),
                ("frameset", self.startTagFrameset),
                ("frame", self.startTagFrame),
                ("noframes", self.startTagNoframes)
            ])
            self.startTagHandler.default = self.startTagOther

            self.endTagHandler = utils.MethodDispatcher([
                ("frameset", self.endTagFrameset)
            ])
            self.endTagHandler.default = self.endTagOther

        def processEOF(self):
            if self.tree.openElements[-1].name != "html":
                self.parser.parseError("eof-in-frameset")
            else:
                assert self.parser.innerHTML

        def processCharacters(self, token):
            self.parser.parseError("unexpected-char-in-frameset")

        def startTagFrameset(self, token):
            self.tree.insertElement(token)

        def startTagFrame(self, token):
            self.tree.insertElement(token)
            self.tree.openElements.pop()

        def startTagNoframes(self, token):
            return self.parser.phases["inBody"].processStartTag(token)

        def startTagOther(self, token):
            self.parser.parseError("unexpected-start-tag-in-frameset",
                                   {"name": token["name"]})

        def endTagFrameset(self, token):
            if self.tree.openElements[-1].name == "html":
                # innerHTML case
                self.parser.parseError("unexpected-frameset-in-frameset-innerhtml")
            else:
                self.tree.openElements.pop()
            if (not self.parser.innerHTML and
                    self.tree.openElements[-1].name != "frameset"):
                # If we're not in innerHTML mode and the the current node is not a
                # "frameset" element (anymore) then switch.
                self.parser.phase = self.parser.phases["afterFrameset"]

        def endTagOther(self, token):
            self.parser.parseError("unexpected-end-tag-in-frameset",
                                   {"name": token["name"]})

    class AfterFramesetPhase(Phase):
        # http://www.whatwg.org/specs/web-apps/current-work/#after3
        def __init__(self, parser, tree):
            Phase.__init__(self, parser, tree)

            self.startTagHandler = utils.MethodDispatcher([
                ("html", self.startTagHtml),
                ("noframes", self.startTagNoframes)
            ])
            self.startTagHandler.default = self.startTagOther

            self.endTagHandler = utils.MethodDispatcher([
                ("html", self.endTagHtml)
            ])
            self.endTagHandler.default = self.endTagOther

        def processEOF(self):
            # Stop parsing
            pass

        def processCharacters(self, token):
            self.parser.parseError("unexpected-char-after-frameset")

        def startTagNoframes(self, token):
            return self.parser.phases["inHead"].processStartTag(token)

        def startTagOther(self, token):
            self.parser.parseError("unexpected-start-tag-after-frameset",
                                   {"name": token["name"]})

        def endTagHtml(self, token):
            self.parser.phase = self.parser.phases["afterAfterFrameset"]

        def endTagOther(self, token):
            self.parser.parseError("unexpected-end-tag-after-frameset",
                                   {"name": token["name"]})

    class AfterAfterBodyPhase(Phase):
        def __init__(self, parser, tree):
            Phase.__init__(self, parser, tree)

            self.startTagHandler = utils.MethodDispatcher([
                ("html", self.startTagHtml)
            ])
            self.startTagHandler.default = self.startTagOther

        def processEOF(self):
            pass

        def processComment(self, token):
            self.tree.insertComment(token, self.tree.document)

        def processSpaceCharacters(self, token):
            return self.parser.phases["inBody"].processSpaceCharacters(token)

        def processCharacters(self, token):
            self.parser.parseError("expected-eof-but-got-char")
            self.parser.phase = self.parser.phases["inBody"]
            return token

        def startTagHtml(self, token):
            return self.parser.phases["inBody"].processStartTag(token)

        def startTagOther(self, token):
            self.parser.parseError("expected-eof-but-got-start-tag",
                                   {"name": token["name"]})
            self.parser.phase = self.parser.phases["inBody"]
            return token

        def processEndTag(self, token):
            self.parser.parseError("expected-eof-but-got-end-tag",
                                   {"name": token["name"]})
            self.parser.phase = self.parser.phases["inBody"]
            return token

    class AfterAfterFramesetPhase(Phase):
        def __init__(self, parser, tree):
            Phase.__init__(self, parser, tree)

            self.startTagHandler = utils.MethodDispatcher([
                ("html", self.startTagHtml),
                ("noframes", self.startTagNoFrames)
            ])
            self.startTagHandler.default = self.startTagOther

        def processEOF(self):
            pass

        def processComment(self, token):
            self.tree.insertComment(token, self.tree.document)

        def processSpaceCharacters(self, token):
            return self.parser.phases["inBody"].processSpaceCharacters(token)

        def processCharacters(self, token):
            self.parser.parseError("expected-eof-but-got-char")

        def startTagHtml(self, token):
            return self.parser.phases["inBody"].processStartTag(token)

        def startTagNoFrames(self, token):
            return self.parser.phases["inHead"].processStartTag(token)

        def startTagOther(self, token):
            self.parser.parseError("expected-eof-but-got-start-tag",
                                   {"name": token["name"]})

        def processEndTag(self, token):
            self.parser.parseError("expected-eof-but-got-end-tag",
                                   {"name": token["name"]})

    return {
        "initial": InitialPhase,
        "beforeHtml": BeforeHtmlPhase,
        "beforeHead": BeforeHeadPhase,
        "inHead": InHeadPhase,
        # XXX "inHeadNoscript": InHeadNoScriptPhase,
        "afterHead": AfterHeadPhase,
        "inBody": InBodyPhase,
        "text": TextPhase,
        "inTable": InTablePhase,
        "inTableText": InTableTextPhase,
        "inCaption": InCaptionPhase,
        "inColumnGroup": InColumnGroupPhase,
        "inTableBody": InTableBodyPhase,
        "inRow": InRowPhase,
        "inCell": InCellPhase,
        "inSelect": InSelectPhase,
        "inSelectInTable": InSelectInTablePhase,
        "inForeignContent": InForeignContentPhase,
        "afterBody": AfterBodyPhase,
        "inFrameset": InFramesetPhase,
        "afterFrameset": AfterFramesetPhase,
        "afterAfterBody": AfterAfterBodyPhase,
        "afterAfterFrameset": AfterAfterFramesetPhase,
        # XXX after after frameset
    }


def impliedTagToken(name, type="EndTag", attributes=None,
                    selfClosing=False):
    if attributes is None:
        attributes = {}
    return {"type": tokenTypes[type], "name": name, "data": attributes,
            "selfClosing": selfClosing}


class ParseError(Exception):
    """Error in parsed document"""
    pass
site-packages/pip/_vendor/html5lib/__init__.py000064400000001312151733463620015350 0ustar00"""
HTML parsing library based on the WHATWG "HTML5"
specification. The parser is designed to be compatible with existing
HTML found in the wild and implements well-defined error recovery that
is largely compatible with modern desktop web browsers.

Example usage:

import html5lib
f = open("my_document.html")
tree = html5lib.parse(f)
"""

from __future__ import absolute_import, division, unicode_literals

from .html5parser import HTMLParser, parse, parseFragment
from .treebuilders import getTreeBuilder
from .treewalkers import getTreeWalker
from .serializer import serialize

__all__ = ["HTMLParser", "parse", "parseFragment", "getTreeBuilder",
           "getTreeWalker", "serialize"]
__version__ = "1.0b3"
site-packages/pip/_vendor/html5lib/trie/py.py000064400000003357151733463620015217 0ustar00from __future__ import absolute_import, division, unicode_literals
from pip._vendor.six import text_type

from bisect import bisect_left

from ._base import Trie as ABCTrie


class Trie(ABCTrie):
    def __init__(self, data):
        if not all(isinstance(x, text_type) for x in data.keys()):
            raise TypeError("All keys must be strings")

        self._data = data
        self._keys = sorted(data.keys())
        self._cachestr = ""
        self._cachepoints = (0, len(data))

    def __contains__(self, key):
        return key in self._data

    def __len__(self):
        return len(self._data)

    def __iter__(self):
        return iter(self._data)

    def __getitem__(self, key):
        return self._data[key]

    def keys(self, prefix=None):
        if prefix is None or prefix == "" or not self._keys:
            return set(self._keys)

        if prefix.startswith(self._cachestr):
            lo, hi = self._cachepoints
            start = i = bisect_left(self._keys, prefix, lo, hi)
        else:
            start = i = bisect_left(self._keys, prefix)

        keys = set()
        if start == len(self._keys):
            return keys

        while self._keys[i].startswith(prefix):
            keys.add(self._keys[i])
            i += 1

        self._cachestr = prefix
        self._cachepoints = (start, i)

        return keys

    def has_keys_with_prefix(self, prefix):
        if prefix in self._data:
            return True

        if prefix.startswith(self._cachestr):
            lo, hi = self._cachepoints
            i = bisect_left(self._keys, prefix, lo, hi)
        else:
            i = bisect_left(self._keys, prefix)

        if i == len(self._keys):
            return False

        return self._keys[i].startswith(prefix)
site-packages/pip/_vendor/html5lib/trie/__pycache__/__init__.cpython-33.pyc000064400000000742151733463630022603 0ustar00�
7�Re�c@seddlmZmZmZddlmZeZyddlmZWne	k
rZYnXeZdS(i(uabsolute_importudivisionuunicode_literalsi(uTrieN(
u
__future__uabsolute_importudivisionuunicode_literalsupyuTrieuPyTrieudatrieuDATrieuImportError(((u;/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/__init__.pyu<module>s
site-packages/pip/_vendor/html5lib/trie/__pycache__/_base.cpython-33.pyc000064400000004421151733463630022113 0ustar00�
7�Re�c@sFddlmZmZmZddlmZGdd�de�ZdS(i(uabsolute_importudivisionuunicode_literals(uMappingcsS|EeZdZdZd
�fdd�Zdd�Zdd�Zdd	�Z�S(uTrieuAbstract base class for triescsBt�j�}�dkr%t|�St�fdd�|D��S(Ncs%g|]}|j��r|�qS((u
startswith(u.0ux(uprefix(u8/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/_base.pyu
<listcomp>s	uTrie.keys.<locals>.<listcomp>(usuperukeysuNoneuset(uselfuprefixukeys(u	__class__(uprefixu8/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/_base.pyukeys	s
u	Trie.keyscCs.x'|j�D]}|j|�r
dSq
WdS(NTF(ukeysu
startswithuTrueuFalse(uselfuprefixukey((u8/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/_base.pyuhas_keys_with_prefixsuTrie.has_keys_with_prefixcCsj||kr|SxGtdt|�d�D],}|d|�|kr*|d|�Sq*Wt|��dS(Ni(urangeulenuKeyError(uselfuprefixui((u8/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/_base.pyulongest_prefixs uTrie.longest_prefixcCs|j|�}|||fS(N(ulongest_prefix(uselfuprefixulprefix((u8/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/_base.pyulongest_prefix_item#suTrie.longest_prefix_itemN(	u__name__u
__module__u__qualname__u__doc__uNoneukeysuhas_keys_with_prefixulongest_prefixulongest_prefix_item(u
__locals__((u	__class__u8/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/_base.pyuTries
	
uTrieN(u
__future__uabsolute_importudivisionuunicode_literalsucollectionsuMappinguTrie(((u8/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/_base.pyu<module>ssite-packages/pip/_vendor/html5lib/trie/__pycache__/datrie.cpython-33.pyc000064400000006342151733463630022316 0ustar00�
7�Re�c@sfddlmZmZmZddlmZddlmZddl	mZ
Gdd�de
�ZdS(i(uabsolute_importudivisionuunicode_literals(uTrie(u	text_typeicBs�|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zddd�Z	d
d�Z
dd�Zdd�ZdS(uTriecCs�t�}xP|j�D]B}t|t�s:td��nx|D]}|j|�qAWqWtdj|��|_x'|j	�D]\}}||j|<q�WdS(NuAll keys must be stringsu(
usetukeysu
isinstanceu	text_typeu	TypeErroruadduDATrieujoinu_datauitems(uselfudataucharsukeyucharuvalue((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/datrie.pyu__init__
s	
u
Trie.__init__cCs
||jkS(N(u_data(uselfukey((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/datrie.pyu__contains__suTrie.__contains__cCs
t|j�S(N(ulenu_data(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/datrie.pyu__len__suTrie.__len__cCs
t��dS(N(uNotImplementedError(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/datrie.pyu__iter__su
Trie.__iter__cCs|j|S(N(u_data(uselfukey((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/datrie.pyu__getitem__suTrie.__getitem__cCs|jj|�S(N(u_dataukeys(uselfuprefix((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/datrie.pyukeys"su	Trie.keyscCs|jj|�S(N(u_datauhas_keys_with_prefix(uselfuprefix((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/datrie.pyuhas_keys_with_prefix%suTrie.has_keys_with_prefixcCs|jj|�S(N(u_dataulongest_prefix(uselfuprefix((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/datrie.pyulongest_prefix(suTrie.longest_prefixcCs|jj|�S(N(u_dataulongest_prefix_item(uselfuprefix((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/datrie.pyulongest_prefix_item+suTrie.longest_prefix_itemN(
u__name__u
__module__u__qualname__u__init__u__contains__u__len__u__iter__u__getitem__uNoneukeysuhas_keys_with_prefixulongest_prefixulongest_prefix_item(u
__locals__((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/datrie.pyuTrie	suTrieN(u
__future__uabsolute_importudivisionuunicode_literalsudatrieuTrieuDATrieupip._vendor.sixu	text_typeu_baseuABCTrie(((u9/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/datrie.pyu<module>ssite-packages/pip/_vendor/html5lib/trie/__pycache__/py.cpython-33.pyc000064400000006675151733463630021507 0ustar00�
7�Re�c@sfddlmZmZmZddlmZddlmZddlm	Z
Gdd�de
�Z	dS(	i(uabsolute_importudivisionuunicode_literals(u	text_type(ubisect_lefti(uTriecBsk|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zddd�Z	d
d�Z
dS(uTriecCsntdd�|j�D��s.td��n||_t|j��|_d|_dt|�f|_dS(Ncss|]}t|t�VqdS(N(u
isinstanceu	text_type(u.0ux((u5/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/py.pyu	<genexpr>su Trie.__init__.<locals>.<genexpr>uAll keys must be stringsui(	uallukeysu	TypeErroru_datausortedu_keysu	_cachestrulenu_cachepoints(uselfudata((u5/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/py.pyu__init__
s		u
Trie.__init__cCs
||jkS(N(u_data(uselfukey((u5/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/py.pyu__contains__suTrie.__contains__cCs
t|j�S(N(ulenu_data(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/py.pyu__len__suTrie.__len__cCs
t|j�S(N(uiteru_data(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/py.pyu__iter__su
Trie.__iter__cCs|j|S(N(u_data(uselfukey((u5/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/py.pyu__getitem__suTrie.__getitem__cCs�|dks"|dks"|jr/t|j�S|j|j�ro|j\}}t|j|||�}}nt|j|�}}t�}|t|j�kr�|Sx8|j|j|�r�|j|j|�|d7}q�W||_||f|_|S(Nui(	uNoneu_keysusetu
startswithu	_cachestru_cachepointsubisect_leftulenuadd(uselfuprefixulouhiustartuiukeys((u5/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/py.pyukeyss"
		u	Trie.keyscCs�||jkrdS|j|j�rO|j\}}t|j|||�}nt|j|�}|t|j�krzdS|j|j|�S(NTF(	u_datauTrueu
startswithu	_cachestru_cachepointsubisect_leftu_keysulenuFalse(uselfuprefixulouhiui((u5/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/py.pyuhas_keys_with_prefix6suTrie.has_keys_with_prefixN(u__name__u
__module__u__qualname__u__init__u__contains__u__len__u__iter__u__getitem__uNoneukeysuhas_keys_with_prefix(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/py.pyuTrie	s	uTrieN(u
__future__uabsolute_importudivisionuunicode_literalsupip._vendor.sixu	text_typeubisectubisect_leftu_baseuTrieuABCTrie(((u5/tmp/pip-zej_zi-build/pip/_vendor/html5lib/trie/py.pyu<module>ssite-packages/pip/_vendor/html5lib/trie/_base.py000064400000001637151733463630015640 0ustar00from __future__ import absolute_import, division, unicode_literals

from collections import Mapping


class Trie(Mapping):
    """Abstract base class for tries"""

    def keys(self, prefix=None):
        keys = super().keys()

        if prefix is None:
            return set(keys)

        # Python 2.6: no set comprehensions
        return set([x for x in keys if x.startswith(prefix)])

    def has_keys_with_prefix(self, prefix):
        for key in self.keys():
            if key.startswith(prefix):
                return True

        return False

    def longest_prefix(self, prefix):
        if prefix in self:
            return prefix

        for i in range(1, len(prefix) + 1):
            if prefix[:-i] in self:
                return prefix[:-i]

        raise KeyError(prefix)

    def longest_prefix_item(self, prefix):
        lprefix = self.longest_prefix(prefix)
        return (lprefix, self[lprefix])
site-packages/pip/_vendor/html5lib/trie/datrie.py000064400000002232151733463630016027 0ustar00from __future__ import absolute_import, division, unicode_literals

from datrie import Trie as DATrie
from pip._vendor.six import text_type

from ._base import Trie as ABCTrie


class Trie(ABCTrie):
    def __init__(self, data):
        chars = set()
        for key in data.keys():
            if not isinstance(key, text_type):
                raise TypeError("All keys must be strings")
            for char in key:
                chars.add(char)

        self._data = DATrie("".join(chars))
        for key, value in data.items():
            self._data[key] = value

    def __contains__(self, key):
        return key in self._data

    def __len__(self):
        return len(self._data)

    def __iter__(self):
        raise NotImplementedError()

    def __getitem__(self, key):
        return self._data[key]

    def keys(self, prefix=None):
        return self._data.keys(prefix)

    def has_keys_with_prefix(self, prefix):
        return self._data.has_keys_with_prefix(prefix)

    def longest_prefix(self, prefix):
        return self._data.longest_prefix(prefix)

    def longest_prefix_item(self, prefix):
        return self._data.longest_prefix_item(prefix)
site-packages/pip/_vendor/html5lib/trie/__init__.py000064400000000324151733463630016316 0ustar00from __future__ import absolute_import, division, unicode_literals

from .py import Trie as PyTrie

Trie = PyTrie

try:
    from .datrie import Trie as DATrie
except ImportError:
    pass
else:
    Trie = DATrie
site-packages/pip/_vendor/html5lib/tokenizer.py000064400000226201151733463630015632 0ustar00from __future__ import absolute_import, division, unicode_literals

try:
    chr = unichr # flake8: noqa
except NameError:
    pass

from collections import deque

from .constants import spaceCharacters
from .constants import entities
from .constants import asciiLetters, asciiUpper2Lower
from .constants import digits, hexDigits, EOF
from .constants import tokenTypes, tagTokenTypes
from .constants import replacementCharacters

from .inputstream import HTMLInputStream

from .trie import Trie

entitiesTrie = Trie(entities)


class HTMLTokenizer(object):
    """ This class takes care of tokenizing HTML.

    * self.currentToken
      Holds the token that is currently being processed.

    * self.state
      Holds a reference to the method to be invoked... XXX

    * self.stream
      Points to HTMLInputStream object.
    """

    def __init__(self, stream, encoding=None, parseMeta=True, useChardet=True,
                 lowercaseElementName=True, lowercaseAttrName=True, parser=None):

        self.stream = HTMLInputStream(stream, encoding, parseMeta, useChardet)
        self.parser = parser

        # Perform case conversions?
        self.lowercaseElementName = lowercaseElementName
        self.lowercaseAttrName = lowercaseAttrName

        # Setup the initial tokenizer state
        self.escapeFlag = False
        self.lastFourChars = []
        self.state = self.dataState
        self.escape = False

        # The current token being created
        self.currentToken = None
        super(HTMLTokenizer, self).__init__()

    def __iter__(self):
        """ This is where the magic happens.

        We do our usually processing through the states and when we have a token
        to return we yield the token which pauses processing until the next token
        is requested.
        """
        self.tokenQueue = deque([])
        # Start processing. When EOF is reached self.state will return False
        # instead of True and the loop will terminate.
        while self.state():
            while self.stream.errors:
                yield {"type": tokenTypes["ParseError"], "data": self.stream.errors.pop(0)}
            while self.tokenQueue:
                yield self.tokenQueue.popleft()

    def consumeNumberEntity(self, isHex):
        """This function returns either U+FFFD or the character based on the
        decimal or hexadecimal representation. It also discards ";" if present.
        If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked.
        """

        allowed = digits
        radix = 10
        if isHex:
            allowed = hexDigits
            radix = 16

        charStack = []

        # Consume all the characters that are in range while making sure we
        # don't hit an EOF.
        c = self.stream.char()
        while c in allowed and c is not EOF:
            charStack.append(c)
            c = self.stream.char()

        # Convert the set of characters consumed to an int.
        charAsInt = int("".join(charStack), radix)

        # Certain characters get replaced with others
        if charAsInt in replacementCharacters:
            char = replacementCharacters[charAsInt]
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "illegal-codepoint-for-numeric-entity",
                                    "datavars": {"charAsInt": charAsInt}})
        elif ((0xD800 <= charAsInt <= 0xDFFF) or
              (charAsInt > 0x10FFFF)):
            char = "\uFFFD"
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "illegal-codepoint-for-numeric-entity",
                                    "datavars": {"charAsInt": charAsInt}})
        else:
            # Should speed up this check somehow (e.g. move the set to a constant)
            if ((0x0001 <= charAsInt <= 0x0008) or
                (0x000E <= charAsInt <= 0x001F) or
                (0x007F <= charAsInt <= 0x009F) or
                (0xFDD0 <= charAsInt <= 0xFDEF) or
                charAsInt in frozenset([0x000B, 0xFFFE, 0xFFFF, 0x1FFFE,
                                        0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE,
                                        0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE,
                                        0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE,
                                        0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE,
                                        0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE,
                                        0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE,
                                        0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE,
                                        0xFFFFF, 0x10FFFE, 0x10FFFF])):
                self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                        "data":
                                        "illegal-codepoint-for-numeric-entity",
                                        "datavars": {"charAsInt": charAsInt}})
            try:
                # Try/except needed as UCS-2 Python builds' unichar only works
                # within the BMP.
                char = chr(charAsInt)
            except ValueError:
                v = charAsInt - 0x10000
                char = chr(0xD800 | (v >> 10)) + chr(0xDC00 | (v & 0x3FF))

        # Discard the ; if present. Otherwise, put it back on the queue and
        # invoke parseError on parser.
        if c != ";":
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "numeric-entity-without-semicolon"})
            self.stream.unget(c)

        return char

    def consumeEntity(self, allowedChar=None, fromAttribute=False):
        # Initialise to the default output for when no entity is matched
        output = "&"

        charStack = [self.stream.char()]
        if (charStack[0] in spaceCharacters or charStack[0] in (EOF, "<", "&")
                or (allowedChar is not None and allowedChar == charStack[0])):
            self.stream.unget(charStack[0])

        elif charStack[0] == "#":
            # Read the next character to see if it's hex or decimal
            hex = False
            charStack.append(self.stream.char())
            if charStack[-1] in ("x", "X"):
                hex = True
                charStack.append(self.stream.char())

            # charStack[-1] should be the first digit
            if (hex and charStack[-1] in hexDigits) \
                    or (not hex and charStack[-1] in digits):
                # At least one digit found, so consume the whole number
                self.stream.unget(charStack[-1])
                output = self.consumeNumberEntity(hex)
            else:
                # No digits found
                self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                        "data": "expected-numeric-entity"})
                self.stream.unget(charStack.pop())
                output = "&" + "".join(charStack)

        else:
            # At this point in the process might have named entity. Entities
            # are stored in the global variable "entities".
            #
            # Consume characters and compare to these to a substring of the
            # entity names in the list until the substring no longer matches.
            while (charStack[-1] is not EOF):
                if not entitiesTrie.has_keys_with_prefix("".join(charStack)):
                    break
                charStack.append(self.stream.char())

            # At this point we have a string that starts with some characters
            # that may match an entity
            # Try to find the longest entity the string will match to take care
            # of &noti for instance.
            try:
                entityName = entitiesTrie.longest_prefix("".join(charStack[:-1]))
                entityLength = len(entityName)
            except KeyError:
                entityName = None

            if entityName is not None:
                if entityName[-1] != ";":
                    self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                            "named-entity-without-semicolon"})
                if (entityName[-1] != ";" and fromAttribute and
                    (charStack[entityLength] in asciiLetters or
                     charStack[entityLength] in digits or
                     charStack[entityLength] == "=")):
                    self.stream.unget(charStack.pop())
                    output = "&" + "".join(charStack)
                else:
                    output = entities[entityName]
                    self.stream.unget(charStack.pop())
                    output += "".join(charStack[entityLength:])
            else:
                self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                        "expected-named-entity"})
                self.stream.unget(charStack.pop())
                output = "&" + "".join(charStack)

        if fromAttribute:
            self.currentToken["data"][-1][1] += output
        else:
            if output in spaceCharacters:
                tokenType = "SpaceCharacters"
            else:
                tokenType = "Characters"
            self.tokenQueue.append({"type": tokenTypes[tokenType], "data": output})

    def processEntityInAttribute(self, allowedChar):
        """This method replaces the need for "entityInAttributeValueState".
        """
        self.consumeEntity(allowedChar=allowedChar, fromAttribute=True)

    def emitCurrentToken(self):
        """This method is a generic handler for emitting the tags. It also sets
        the state to "data" because that's what's needed after a token has been
        emitted.
        """
        token = self.currentToken
        # Add token to the queue to be yielded
        if (token["type"] in tagTokenTypes):
            if self.lowercaseElementName:
                token["name"] = token["name"].translate(asciiUpper2Lower)
            if token["type"] == tokenTypes["EndTag"]:
                if token["data"]:
                    self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                            "data": "attributes-in-end-tag"})
                if token["selfClosing"]:
                    self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                            "data": "self-closing-flag-on-end-tag"})
        self.tokenQueue.append(token)
        self.state = self.dataState

    # Below are the various tokenizer states worked out.
    def dataState(self):
        data = self.stream.char()
        if data == "&":
            self.state = self.entityDataState
        elif data == "<":
            self.state = self.tagOpenState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.tokenQueue.append({"type": tokenTypes["Characters"],
                                    "data": "\u0000"})
        elif data is EOF:
            # Tokenization ends.
            return False
        elif data in spaceCharacters:
            # Directly after emitting a token you switch back to the "data
            # state". At that point spaceCharacters are important so they are
            # emitted separately.
            self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data":
                                    data + self.stream.charsUntil(spaceCharacters, True)})
            # No need to update lastFourChars here, since the first space will
            # have already been appended to lastFourChars and will have broken
            # any <!-- or --> sequences
        else:
            chars = self.stream.charsUntil(("&", "<", "\u0000"))
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data":
                                    data + chars})
        return True

    def entityDataState(self):
        self.consumeEntity()
        self.state = self.dataState
        return True

    def rcdataState(self):
        data = self.stream.char()
        if data == "&":
            self.state = self.characterReferenceInRcdata
        elif data == "<":
            self.state = self.rcdataLessThanSignState
        elif data == EOF:
            # Tokenization ends.
            return False
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.tokenQueue.append({"type": tokenTypes["Characters"],
                                    "data": "\uFFFD"})
        elif data in spaceCharacters:
            # Directly after emitting a token you switch back to the "data
            # state". At that point spaceCharacters are important so they are
            # emitted separately.
            self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data":
                                    data + self.stream.charsUntil(spaceCharacters, True)})
            # No need to update lastFourChars here, since the first space will
            # have already been appended to lastFourChars and will have broken
            # any <!-- or --> sequences
        else:
            chars = self.stream.charsUntil(("&", "<", "\u0000"))
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data":
                                    data + chars})
        return True

    def characterReferenceInRcdata(self):
        self.consumeEntity()
        self.state = self.rcdataState
        return True

    def rawtextState(self):
        data = self.stream.char()
        if data == "<":
            self.state = self.rawtextLessThanSignState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.tokenQueue.append({"type": tokenTypes["Characters"],
                                    "data": "\uFFFD"})
        elif data == EOF:
            # Tokenization ends.
            return False
        else:
            chars = self.stream.charsUntil(("<", "\u0000"))
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data":
                                    data + chars})
        return True

    def scriptDataState(self):
        data = self.stream.char()
        if data == "<":
            self.state = self.scriptDataLessThanSignState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.tokenQueue.append({"type": tokenTypes["Characters"],
                                    "data": "\uFFFD"})
        elif data == EOF:
            # Tokenization ends.
            return False
        else:
            chars = self.stream.charsUntil(("<", "\u0000"))
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data":
                                    data + chars})
        return True

    def plaintextState(self):
        data = self.stream.char()
        if data == EOF:
            # Tokenization ends.
            return False
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.tokenQueue.append({"type": tokenTypes["Characters"],
                                    "data": "\uFFFD"})
        else:
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data":
                                    data + self.stream.charsUntil("\u0000")})
        return True

    def tagOpenState(self):
        data = self.stream.char()
        if data == "!":
            self.state = self.markupDeclarationOpenState
        elif data == "/":
            self.state = self.closeTagOpenState
        elif data in asciiLetters:
            self.currentToken = {"type": tokenTypes["StartTag"],
                                 "name": data, "data": [],
                                 "selfClosing": False,
                                 "selfClosingAcknowledged": False}
            self.state = self.tagNameState
        elif data == ">":
            # XXX In theory it could be something besides a tag name. But
            # do we really care?
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "expected-tag-name-but-got-right-bracket"})
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<>"})
            self.state = self.dataState
        elif data == "?":
            # XXX In theory it could be something besides a tag name. But
            # do we really care?
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "expected-tag-name-but-got-question-mark"})
            self.stream.unget(data)
            self.state = self.bogusCommentState
        else:
            # XXX
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "expected-tag-name"})
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
            self.stream.unget(data)
            self.state = self.dataState
        return True

    def closeTagOpenState(self):
        data = self.stream.char()
        if data in asciiLetters:
            self.currentToken = {"type": tokenTypes["EndTag"], "name": data,
                                 "data": [], "selfClosing": False}
            self.state = self.tagNameState
        elif data == ">":
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "expected-closing-tag-but-got-right-bracket"})
            self.state = self.dataState
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "expected-closing-tag-but-got-eof"})
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"})
            self.state = self.dataState
        else:
            # XXX data can be _'_...
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "expected-closing-tag-but-got-char",
                                    "datavars": {"data": data}})
            self.stream.unget(data)
            self.state = self.bogusCommentState
        return True

    def tagNameState(self):
        data = self.stream.char()
        if data in spaceCharacters:
            self.state = self.beforeAttributeNameState
        elif data == ">":
            self.emitCurrentToken()
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-tag-name"})
            self.state = self.dataState
        elif data == "/":
            self.state = self.selfClosingStartTagState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.currentToken["name"] += "\uFFFD"
        else:
            self.currentToken["name"] += data
            # (Don't use charsUntil here, because tag names are
            # very short and it's faster to not do anything fancy)
        return True

    def rcdataLessThanSignState(self):
        data = self.stream.char()
        if data == "/":
            self.temporaryBuffer = ""
            self.state = self.rcdataEndTagOpenState
        else:
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
            self.stream.unget(data)
            self.state = self.rcdataState
        return True

    def rcdataEndTagOpenState(self):
        data = self.stream.char()
        if data in asciiLetters:
            self.temporaryBuffer += data
            self.state = self.rcdataEndTagNameState
        else:
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"})
            self.stream.unget(data)
            self.state = self.rcdataState
        return True

    def rcdataEndTagNameState(self):
        appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower()
        data = self.stream.char()
        if data in spaceCharacters and appropriate:
            self.currentToken = {"type": tokenTypes["EndTag"],
                                 "name": self.temporaryBuffer,
                                 "data": [], "selfClosing": False}
            self.state = self.beforeAttributeNameState
        elif data == "/" and appropriate:
            self.currentToken = {"type": tokenTypes["EndTag"],
                                 "name": self.temporaryBuffer,
                                 "data": [], "selfClosing": False}
            self.state = self.selfClosingStartTagState
        elif data == ">" and appropriate:
            self.currentToken = {"type": tokenTypes["EndTag"],
                                 "name": self.temporaryBuffer,
                                 "data": [], "selfClosing": False}
            self.emitCurrentToken()
            self.state = self.dataState
        elif data in asciiLetters:
            self.temporaryBuffer += data
        else:
            self.tokenQueue.append({"type": tokenTypes["Characters"],
                                    "data": "</" + self.temporaryBuffer})
            self.stream.unget(data)
            self.state = self.rcdataState
        return True

    def rawtextLessThanSignState(self):
        data = self.stream.char()
        if data == "/":
            self.temporaryBuffer = ""
            self.state = self.rawtextEndTagOpenState
        else:
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
            self.stream.unget(data)
            self.state = self.rawtextState
        return True

    def rawtextEndTagOpenState(self):
        data = self.stream.char()
        if data in asciiLetters:
            self.temporaryBuffer += data
            self.state = self.rawtextEndTagNameState
        else:
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"})
            self.stream.unget(data)
            self.state = self.rawtextState
        return True

    def rawtextEndTagNameState(self):
        appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower()
        data = self.stream.char()
        if data in spaceCharacters and appropriate:
            self.currentToken = {"type": tokenTypes["EndTag"],
                                 "name": self.temporaryBuffer,
                                 "data": [], "selfClosing": False}
            self.state = self.beforeAttributeNameState
        elif data == "/" and appropriate:
            self.currentToken = {"type": tokenTypes["EndTag"],
                                 "name": self.temporaryBuffer,
                                 "data": [], "selfClosing": False}
            self.state = self.selfClosingStartTagState
        elif data == ">" and appropriate:
            self.currentToken = {"type": tokenTypes["EndTag"],
                                 "name": self.temporaryBuffer,
                                 "data": [], "selfClosing": False}
            self.emitCurrentToken()
            self.state = self.dataState
        elif data in asciiLetters:
            self.temporaryBuffer += data
        else:
            self.tokenQueue.append({"type": tokenTypes["Characters"],
                                    "data": "</" + self.temporaryBuffer})
            self.stream.unget(data)
            self.state = self.rawtextState
        return True

    def scriptDataLessThanSignState(self):
        data = self.stream.char()
        if data == "/":
            self.temporaryBuffer = ""
            self.state = self.scriptDataEndTagOpenState
        elif data == "!":
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<!"})
            self.state = self.scriptDataEscapeStartState
        else:
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
            self.stream.unget(data)
            self.state = self.scriptDataState
        return True

    def scriptDataEndTagOpenState(self):
        data = self.stream.char()
        if data in asciiLetters:
            self.temporaryBuffer += data
            self.state = self.scriptDataEndTagNameState
        else:
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"})
            self.stream.unget(data)
            self.state = self.scriptDataState
        return True

    def scriptDataEndTagNameState(self):
        appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower()
        data = self.stream.char()
        if data in spaceCharacters and appropriate:
            self.currentToken = {"type": tokenTypes["EndTag"],
                                 "name": self.temporaryBuffer,
                                 "data": [], "selfClosing": False}
            self.state = self.beforeAttributeNameState
        elif data == "/" and appropriate:
            self.currentToken = {"type": tokenTypes["EndTag"],
                                 "name": self.temporaryBuffer,
                                 "data": [], "selfClosing": False}
            self.state = self.selfClosingStartTagState
        elif data == ">" and appropriate:
            self.currentToken = {"type": tokenTypes["EndTag"],
                                 "name": self.temporaryBuffer,
                                 "data": [], "selfClosing": False}
            self.emitCurrentToken()
            self.state = self.dataState
        elif data in asciiLetters:
            self.temporaryBuffer += data
        else:
            self.tokenQueue.append({"type": tokenTypes["Characters"],
                                    "data": "</" + self.temporaryBuffer})
            self.stream.unget(data)
            self.state = self.scriptDataState
        return True

    def scriptDataEscapeStartState(self):
        data = self.stream.char()
        if data == "-":
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
            self.state = self.scriptDataEscapeStartDashState
        else:
            self.stream.unget(data)
            self.state = self.scriptDataState
        return True

    def scriptDataEscapeStartDashState(self):
        data = self.stream.char()
        if data == "-":
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
            self.state = self.scriptDataEscapedDashDashState
        else:
            self.stream.unget(data)
            self.state = self.scriptDataState
        return True

    def scriptDataEscapedState(self):
        data = self.stream.char()
        if data == "-":
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
            self.state = self.scriptDataEscapedDashState
        elif data == "<":
            self.state = self.scriptDataEscapedLessThanSignState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.tokenQueue.append({"type": tokenTypes["Characters"],
                                    "data": "\uFFFD"})
        elif data == EOF:
            self.state = self.dataState
        else:
            chars = self.stream.charsUntil(("<", "-", "\u0000"))
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data":
                                    data + chars})
        return True

    def scriptDataEscapedDashState(self):
        data = self.stream.char()
        if data == "-":
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
            self.state = self.scriptDataEscapedDashDashState
        elif data == "<":
            self.state = self.scriptDataEscapedLessThanSignState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.tokenQueue.append({"type": tokenTypes["Characters"],
                                    "data": "\uFFFD"})
            self.state = self.scriptDataEscapedState
        elif data == EOF:
            self.state = self.dataState
        else:
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
            self.state = self.scriptDataEscapedState
        return True

    def scriptDataEscapedDashDashState(self):
        data = self.stream.char()
        if data == "-":
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
        elif data == "<":
            self.state = self.scriptDataEscapedLessThanSignState
        elif data == ">":
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"})
            self.state = self.scriptDataState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.tokenQueue.append({"type": tokenTypes["Characters"],
                                    "data": "\uFFFD"})
            self.state = self.scriptDataEscapedState
        elif data == EOF:
            self.state = self.dataState
        else:
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
            self.state = self.scriptDataEscapedState
        return True

    def scriptDataEscapedLessThanSignState(self):
        data = self.stream.char()
        if data == "/":
            self.temporaryBuffer = ""
            self.state = self.scriptDataEscapedEndTagOpenState
        elif data in asciiLetters:
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<" + data})
            self.temporaryBuffer = data
            self.state = self.scriptDataDoubleEscapeStartState
        else:
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
            self.stream.unget(data)
            self.state = self.scriptDataEscapedState
        return True

    def scriptDataEscapedEndTagOpenState(self):
        data = self.stream.char()
        if data in asciiLetters:
            self.temporaryBuffer = data
            self.state = self.scriptDataEscapedEndTagNameState
        else:
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"})
            self.stream.unget(data)
            self.state = self.scriptDataEscapedState
        return True

    def scriptDataEscapedEndTagNameState(self):
        appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower()
        data = self.stream.char()
        if data in spaceCharacters and appropriate:
            self.currentToken = {"type": tokenTypes["EndTag"],
                                 "name": self.temporaryBuffer,
                                 "data": [], "selfClosing": False}
            self.state = self.beforeAttributeNameState
        elif data == "/" and appropriate:
            self.currentToken = {"type": tokenTypes["EndTag"],
                                 "name": self.temporaryBuffer,
                                 "data": [], "selfClosing": False}
            self.state = self.selfClosingStartTagState
        elif data == ">" and appropriate:
            self.currentToken = {"type": tokenTypes["EndTag"],
                                 "name": self.temporaryBuffer,
                                 "data": [], "selfClosing": False}
            self.emitCurrentToken()
            self.state = self.dataState
        elif data in asciiLetters:
            self.temporaryBuffer += data
        else:
            self.tokenQueue.append({"type": tokenTypes["Characters"],
                                    "data": "</" + self.temporaryBuffer})
            self.stream.unget(data)
            self.state = self.scriptDataEscapedState
        return True

    def scriptDataDoubleEscapeStartState(self):
        data = self.stream.char()
        if data in (spaceCharacters | frozenset(("/", ">"))):
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
            if self.temporaryBuffer.lower() == "script":
                self.state = self.scriptDataDoubleEscapedState
            else:
                self.state = self.scriptDataEscapedState
        elif data in asciiLetters:
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
            self.temporaryBuffer += data
        else:
            self.stream.unget(data)
            self.state = self.scriptDataEscapedState
        return True

    def scriptDataDoubleEscapedState(self):
        data = self.stream.char()
        if data == "-":
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
            self.state = self.scriptDataDoubleEscapedDashState
        elif data == "<":
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
            self.state = self.scriptDataDoubleEscapedLessThanSignState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.tokenQueue.append({"type": tokenTypes["Characters"],
                                    "data": "\uFFFD"})
        elif data == EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-script-in-script"})
            self.state = self.dataState
        else:
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
        return True

    def scriptDataDoubleEscapedDashState(self):
        data = self.stream.char()
        if data == "-":
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
            self.state = self.scriptDataDoubleEscapedDashDashState
        elif data == "<":
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
            self.state = self.scriptDataDoubleEscapedLessThanSignState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.tokenQueue.append({"type": tokenTypes["Characters"],
                                    "data": "\uFFFD"})
            self.state = self.scriptDataDoubleEscapedState
        elif data == EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-script-in-script"})
            self.state = self.dataState
        else:
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
            self.state = self.scriptDataDoubleEscapedState
        return True

    def scriptDataDoubleEscapedDashDashState(self):
        data = self.stream.char()
        if data == "-":
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"})
        elif data == "<":
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"})
            self.state = self.scriptDataDoubleEscapedLessThanSignState
        elif data == ">":
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"})
            self.state = self.scriptDataState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.tokenQueue.append({"type": tokenTypes["Characters"],
                                    "data": "\uFFFD"})
            self.state = self.scriptDataDoubleEscapedState
        elif data == EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-script-in-script"})
            self.state = self.dataState
        else:
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
            self.state = self.scriptDataDoubleEscapedState
        return True

    def scriptDataDoubleEscapedLessThanSignState(self):
        data = self.stream.char()
        if data == "/":
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "/"})
            self.temporaryBuffer = ""
            self.state = self.scriptDataDoubleEscapeEndState
        else:
            self.stream.unget(data)
            self.state = self.scriptDataDoubleEscapedState
        return True

    def scriptDataDoubleEscapeEndState(self):
        data = self.stream.char()
        if data in (spaceCharacters | frozenset(("/", ">"))):
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
            if self.temporaryBuffer.lower() == "script":
                self.state = self.scriptDataEscapedState
            else:
                self.state = self.scriptDataDoubleEscapedState
        elif data in asciiLetters:
            self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data})
            self.temporaryBuffer += data
        else:
            self.stream.unget(data)
            self.state = self.scriptDataDoubleEscapedState
        return True

    def beforeAttributeNameState(self):
        data = self.stream.char()
        if data in spaceCharacters:
            self.stream.charsUntil(spaceCharacters, True)
        elif data in asciiLetters:
            self.currentToken["data"].append([data, ""])
            self.state = self.attributeNameState
        elif data == ">":
            self.emitCurrentToken()
        elif data == "/":
            self.state = self.selfClosingStartTagState
        elif data in ("'", '"', "=", "<"):
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "invalid-character-in-attribute-name"})
            self.currentToken["data"].append([data, ""])
            self.state = self.attributeNameState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.currentToken["data"].append(["\uFFFD", ""])
            self.state = self.attributeNameState
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "expected-attribute-name-but-got-eof"})
            self.state = self.dataState
        else:
            self.currentToken["data"].append([data, ""])
            self.state = self.attributeNameState
        return True

    def attributeNameState(self):
        data = self.stream.char()
        leavingThisState = True
        emitToken = False
        if data == "=":
            self.state = self.beforeAttributeValueState
        elif data in asciiLetters:
            self.currentToken["data"][-1][0] += data +\
                self.stream.charsUntil(asciiLetters, True)
            leavingThisState = False
        elif data == ">":
            # XXX If we emit here the attributes are converted to a dict
            # without being checked and when the code below runs we error
            # because data is a dict not a list
            emitToken = True
        elif data in spaceCharacters:
            self.state = self.afterAttributeNameState
        elif data == "/":
            self.state = self.selfClosingStartTagState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.currentToken["data"][-1][0] += "\uFFFD"
            leavingThisState = False
        elif data in ("'", '"', "<"):
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data":
                                    "invalid-character-in-attribute-name"})
            self.currentToken["data"][-1][0] += data
            leavingThisState = False
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "eof-in-attribute-name"})
            self.state = self.dataState
        else:
            self.currentToken["data"][-1][0] += data
            leavingThisState = False

        if leavingThisState:
            # Attributes are not dropped at this stage. That happens when the
            # start tag token is emitted so values can still be safely appended
            # to attributes, but we do want to report the parse error in time.
            if self.lowercaseAttrName:
                self.currentToken["data"][-1][0] = (
                    self.currentToken["data"][-1][0].translate(asciiUpper2Lower))
            for name, value in self.currentToken["data"][:-1]:
                if self.currentToken["data"][-1][0] == name:
                    self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                            "duplicate-attribute"})
                    break
            # XXX Fix for above XXX
            if emitToken:
                self.emitCurrentToken()
        return True

    def afterAttributeNameState(self):
        data = self.stream.char()
        if data in spaceCharacters:
            self.stream.charsUntil(spaceCharacters, True)
        elif data == "=":
            self.state = self.beforeAttributeValueState
        elif data == ">":
            self.emitCurrentToken()
        elif data in asciiLetters:
            self.currentToken["data"].append([data, ""])
            self.state = self.attributeNameState
        elif data == "/":
            self.state = self.selfClosingStartTagState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.currentToken["data"].append(["\uFFFD", ""])
            self.state = self.attributeNameState
        elif data in ("'", '"', "<"):
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "invalid-character-after-attribute-name"})
            self.currentToken["data"].append([data, ""])
            self.state = self.attributeNameState
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "expected-end-of-tag-but-got-eof"})
            self.state = self.dataState
        else:
            self.currentToken["data"].append([data, ""])
            self.state = self.attributeNameState
        return True

    def beforeAttributeValueState(self):
        data = self.stream.char()
        if data in spaceCharacters:
            self.stream.charsUntil(spaceCharacters, True)
        elif data == "\"":
            self.state = self.attributeValueDoubleQuotedState
        elif data == "&":
            self.state = self.attributeValueUnQuotedState
            self.stream.unget(data)
        elif data == "'":
            self.state = self.attributeValueSingleQuotedState
        elif data == ">":
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "expected-attribute-value-but-got-right-bracket"})
            self.emitCurrentToken()
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.currentToken["data"][-1][1] += "\uFFFD"
            self.state = self.attributeValueUnQuotedState
        elif data in ("=", "<", "`"):
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "equals-in-unquoted-attribute-value"})
            self.currentToken["data"][-1][1] += data
            self.state = self.attributeValueUnQuotedState
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "expected-attribute-value-but-got-eof"})
            self.state = self.dataState
        else:
            self.currentToken["data"][-1][1] += data
            self.state = self.attributeValueUnQuotedState
        return True

    def attributeValueDoubleQuotedState(self):
        data = self.stream.char()
        if data == "\"":
            self.state = self.afterAttributeValueState
        elif data == "&":
            self.processEntityInAttribute('"')
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.currentToken["data"][-1][1] += "\uFFFD"
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-attribute-value-double-quote"})
            self.state = self.dataState
        else:
            self.currentToken["data"][-1][1] += data +\
                self.stream.charsUntil(("\"", "&", "\u0000"))
        return True

    def attributeValueSingleQuotedState(self):
        data = self.stream.char()
        if data == "'":
            self.state = self.afterAttributeValueState
        elif data == "&":
            self.processEntityInAttribute("'")
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.currentToken["data"][-1][1] += "\uFFFD"
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-attribute-value-single-quote"})
            self.state = self.dataState
        else:
            self.currentToken["data"][-1][1] += data +\
                self.stream.charsUntil(("'", "&", "\u0000"))
        return True

    def attributeValueUnQuotedState(self):
        data = self.stream.char()
        if data in spaceCharacters:
            self.state = self.beforeAttributeNameState
        elif data == "&":
            self.processEntityInAttribute(">")
        elif data == ">":
            self.emitCurrentToken()
        elif data in ('"', "'", "=", "<", "`"):
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "unexpected-character-in-unquoted-attribute-value"})
            self.currentToken["data"][-1][1] += data
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.currentToken["data"][-1][1] += "\uFFFD"
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-attribute-value-no-quotes"})
            self.state = self.dataState
        else:
            self.currentToken["data"][-1][1] += data + self.stream.charsUntil(
                frozenset(("&", ">", '"', "'", "=", "<", "`", "\u0000")) | spaceCharacters)
        return True

    def afterAttributeValueState(self):
        data = self.stream.char()
        if data in spaceCharacters:
            self.state = self.beforeAttributeNameState
        elif data == ">":
            self.emitCurrentToken()
        elif data == "/":
            self.state = self.selfClosingStartTagState
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "unexpected-EOF-after-attribute-value"})
            self.stream.unget(data)
            self.state = self.dataState
        else:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "unexpected-character-after-attribute-value"})
            self.stream.unget(data)
            self.state = self.beforeAttributeNameState
        return True

    def selfClosingStartTagState(self):
        data = self.stream.char()
        if data == ">":
            self.currentToken["selfClosing"] = True
            self.emitCurrentToken()
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data":
                                    "unexpected-EOF-after-solidus-in-tag"})
            self.stream.unget(data)
            self.state = self.dataState
        else:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "unexpected-character-after-solidus-in-tag"})
            self.stream.unget(data)
            self.state = self.beforeAttributeNameState
        return True

    def bogusCommentState(self):
        # Make a new comment token and give it as value all the characters
        # until the first > or EOF (charsUntil checks for EOF automatically)
        # and emit it.
        data = self.stream.charsUntil(">")
        data = data.replace("\u0000", "\uFFFD")
        self.tokenQueue.append(
            {"type": tokenTypes["Comment"], "data": data})

        # Eat the character directly after the bogus comment which is either a
        # ">" or an EOF.
        self.stream.char()
        self.state = self.dataState
        return True

    def markupDeclarationOpenState(self):
        charStack = [self.stream.char()]
        if charStack[-1] == "-":
            charStack.append(self.stream.char())
            if charStack[-1] == "-":
                self.currentToken = {"type": tokenTypes["Comment"], "data": ""}
                self.state = self.commentStartState
                return True
        elif charStack[-1] in ('d', 'D'):
            matched = True
            for expected in (('o', 'O'), ('c', 'C'), ('t', 'T'),
                             ('y', 'Y'), ('p', 'P'), ('e', 'E')):
                charStack.append(self.stream.char())
                if charStack[-1] not in expected:
                    matched = False
                    break
            if matched:
                self.currentToken = {"type": tokenTypes["Doctype"],
                                     "name": "",
                                     "publicId": None, "systemId": None,
                                     "correct": True}
                self.state = self.doctypeState
                return True
        elif (charStack[-1] == "[" and
              self.parser is not None and
              self.parser.tree.openElements and
              self.parser.tree.openElements[-1].namespace != self.parser.tree.defaultNamespace):
            matched = True
            for expected in ["C", "D", "A", "T", "A", "["]:
                charStack.append(self.stream.char())
                if charStack[-1] != expected:
                    matched = False
                    break
            if matched:
                self.state = self.cdataSectionState
                return True

        self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                "expected-dashes-or-doctype"})

        while charStack:
            self.stream.unget(charStack.pop())
        self.state = self.bogusCommentState
        return True

    def commentStartState(self):
        data = self.stream.char()
        if data == "-":
            self.state = self.commentStartDashState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.currentToken["data"] += "\uFFFD"
        elif data == ">":
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "incorrect-comment"})
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-comment"})
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        else:
            self.currentToken["data"] += data
            self.state = self.commentState
        return True

    def commentStartDashState(self):
        data = self.stream.char()
        if data == "-":
            self.state = self.commentEndState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.currentToken["data"] += "-\uFFFD"
        elif data == ">":
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "incorrect-comment"})
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-comment"})
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        else:
            self.currentToken["data"] += "-" + data
            self.state = self.commentState
        return True

    def commentState(self):
        data = self.stream.char()
        if data == "-":
            self.state = self.commentEndDashState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.currentToken["data"] += "\uFFFD"
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "eof-in-comment"})
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        else:
            self.currentToken["data"] += data + \
                self.stream.charsUntil(("-", "\u0000"))
        return True

    def commentEndDashState(self):
        data = self.stream.char()
        if data == "-":
            self.state = self.commentEndState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.currentToken["data"] += "-\uFFFD"
            self.state = self.commentState
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-comment-end-dash"})
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        else:
            self.currentToken["data"] += "-" + data
            self.state = self.commentState
        return True

    def commentEndState(self):
        data = self.stream.char()
        if data == ">":
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.currentToken["data"] += "--\uFFFD"
            self.state = self.commentState
        elif data == "!":
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "unexpected-bang-after-double-dash-in-comment"})
            self.state = self.commentEndBangState
        elif data == "-":
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "unexpected-dash-after-double-dash-in-comment"})
            self.currentToken["data"] += data
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-comment-double-dash"})
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        else:
            # XXX
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "unexpected-char-in-comment"})
            self.currentToken["data"] += "--" + data
            self.state = self.commentState
        return True

    def commentEndBangState(self):
        data = self.stream.char()
        if data == ">":
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        elif data == "-":
            self.currentToken["data"] += "--!"
            self.state = self.commentEndDashState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.currentToken["data"] += "--!\uFFFD"
            self.state = self.commentState
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-comment-end-bang-state"})
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        else:
            self.currentToken["data"] += "--!" + data
            self.state = self.commentState
        return True

    def doctypeState(self):
        data = self.stream.char()
        if data in spaceCharacters:
            self.state = self.beforeDoctypeNameState
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "expected-doctype-name-but-got-eof"})
            self.currentToken["correct"] = False
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        else:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "need-space-after-doctype"})
            self.stream.unget(data)
            self.state = self.beforeDoctypeNameState
        return True

    def beforeDoctypeNameState(self):
        data = self.stream.char()
        if data in spaceCharacters:
            pass
        elif data == ">":
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "expected-doctype-name-but-got-right-bracket"})
            self.currentToken["correct"] = False
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.currentToken["name"] = "\uFFFD"
            self.state = self.doctypeNameState
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "expected-doctype-name-but-got-eof"})
            self.currentToken["correct"] = False
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        else:
            self.currentToken["name"] = data
            self.state = self.doctypeNameState
        return True

    def doctypeNameState(self):
        data = self.stream.char()
        if data in spaceCharacters:
            self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower)
            self.state = self.afterDoctypeNameState
        elif data == ">":
            self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower)
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.currentToken["name"] += "\uFFFD"
            self.state = self.doctypeNameState
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-doctype-name"})
            self.currentToken["correct"] = False
            self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower)
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        else:
            self.currentToken["name"] += data
        return True

    def afterDoctypeNameState(self):
        data = self.stream.char()
        if data in spaceCharacters:
            pass
        elif data == ">":
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        elif data is EOF:
            self.currentToken["correct"] = False
            self.stream.unget(data)
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-doctype"})
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        else:
            if data in ("p", "P"):
                matched = True
                for expected in (("u", "U"), ("b", "B"), ("l", "L"),
                                 ("i", "I"), ("c", "C")):
                    data = self.stream.char()
                    if data not in expected:
                        matched = False
                        break
                if matched:
                    self.state = self.afterDoctypePublicKeywordState
                    return True
            elif data in ("s", "S"):
                matched = True
                for expected in (("y", "Y"), ("s", "S"), ("t", "T"),
                                 ("e", "E"), ("m", "M")):
                    data = self.stream.char()
                    if data not in expected:
                        matched = False
                        break
                if matched:
                    self.state = self.afterDoctypeSystemKeywordState
                    return True

            # All the characters read before the current 'data' will be
            # [a-zA-Z], so they're garbage in the bogus doctype and can be
            # discarded; only the latest character might be '>' or EOF
            # and needs to be ungetted
            self.stream.unget(data)
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "expected-space-or-right-bracket-in-doctype", "datavars":
                                    {"data": data}})
            self.currentToken["correct"] = False
            self.state = self.bogusDoctypeState

        return True

    def afterDoctypePublicKeywordState(self):
        data = self.stream.char()
        if data in spaceCharacters:
            self.state = self.beforeDoctypePublicIdentifierState
        elif data in ("'", '"'):
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "unexpected-char-in-doctype"})
            self.stream.unget(data)
            self.state = self.beforeDoctypePublicIdentifierState
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-doctype"})
            self.currentToken["correct"] = False
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        else:
            self.stream.unget(data)
            self.state = self.beforeDoctypePublicIdentifierState
        return True

    def beforeDoctypePublicIdentifierState(self):
        data = self.stream.char()
        if data in spaceCharacters:
            pass
        elif data == "\"":
            self.currentToken["publicId"] = ""
            self.state = self.doctypePublicIdentifierDoubleQuotedState
        elif data == "'":
            self.currentToken["publicId"] = ""
            self.state = self.doctypePublicIdentifierSingleQuotedState
        elif data == ">":
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "unexpected-end-of-doctype"})
            self.currentToken["correct"] = False
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-doctype"})
            self.currentToken["correct"] = False
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        else:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "unexpected-char-in-doctype"})
            self.currentToken["correct"] = False
            self.state = self.bogusDoctypeState
        return True

    def doctypePublicIdentifierDoubleQuotedState(self):
        data = self.stream.char()
        if data == "\"":
            self.state = self.afterDoctypePublicIdentifierState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.currentToken["publicId"] += "\uFFFD"
        elif data == ">":
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "unexpected-end-of-doctype"})
            self.currentToken["correct"] = False
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-doctype"})
            self.currentToken["correct"] = False
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        else:
            self.currentToken["publicId"] += data
        return True

    def doctypePublicIdentifierSingleQuotedState(self):
        data = self.stream.char()
        if data == "'":
            self.state = self.afterDoctypePublicIdentifierState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.currentToken["publicId"] += "\uFFFD"
        elif data == ">":
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "unexpected-end-of-doctype"})
            self.currentToken["correct"] = False
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-doctype"})
            self.currentToken["correct"] = False
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        else:
            self.currentToken["publicId"] += data
        return True

    def afterDoctypePublicIdentifierState(self):
        data = self.stream.char()
        if data in spaceCharacters:
            self.state = self.betweenDoctypePublicAndSystemIdentifiersState
        elif data == ">":
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        elif data == '"':
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "unexpected-char-in-doctype"})
            self.currentToken["systemId"] = ""
            self.state = self.doctypeSystemIdentifierDoubleQuotedState
        elif data == "'":
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "unexpected-char-in-doctype"})
            self.currentToken["systemId"] = ""
            self.state = self.doctypeSystemIdentifierSingleQuotedState
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-doctype"})
            self.currentToken["correct"] = False
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        else:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "unexpected-char-in-doctype"})
            self.currentToken["correct"] = False
            self.state = self.bogusDoctypeState
        return True

    def betweenDoctypePublicAndSystemIdentifiersState(self):
        data = self.stream.char()
        if data in spaceCharacters:
            pass
        elif data == ">":
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        elif data == '"':
            self.currentToken["systemId"] = ""
            self.state = self.doctypeSystemIdentifierDoubleQuotedState
        elif data == "'":
            self.currentToken["systemId"] = ""
            self.state = self.doctypeSystemIdentifierSingleQuotedState
        elif data == EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-doctype"})
            self.currentToken["correct"] = False
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        else:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "unexpected-char-in-doctype"})
            self.currentToken["correct"] = False
            self.state = self.bogusDoctypeState
        return True

    def afterDoctypeSystemKeywordState(self):
        data = self.stream.char()
        if data in spaceCharacters:
            self.state = self.beforeDoctypeSystemIdentifierState
        elif data in ("'", '"'):
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "unexpected-char-in-doctype"})
            self.stream.unget(data)
            self.state = self.beforeDoctypeSystemIdentifierState
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-doctype"})
            self.currentToken["correct"] = False
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        else:
            self.stream.unget(data)
            self.state = self.beforeDoctypeSystemIdentifierState
        return True

    def beforeDoctypeSystemIdentifierState(self):
        data = self.stream.char()
        if data in spaceCharacters:
            pass
        elif data == "\"":
            self.currentToken["systemId"] = ""
            self.state = self.doctypeSystemIdentifierDoubleQuotedState
        elif data == "'":
            self.currentToken["systemId"] = ""
            self.state = self.doctypeSystemIdentifierSingleQuotedState
        elif data == ">":
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "unexpected-char-in-doctype"})
            self.currentToken["correct"] = False
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-doctype"})
            self.currentToken["correct"] = False
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        else:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "unexpected-char-in-doctype"})
            self.currentToken["correct"] = False
            self.state = self.bogusDoctypeState
        return True

    def doctypeSystemIdentifierDoubleQuotedState(self):
        data = self.stream.char()
        if data == "\"":
            self.state = self.afterDoctypeSystemIdentifierState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.currentToken["systemId"] += "\uFFFD"
        elif data == ">":
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "unexpected-end-of-doctype"})
            self.currentToken["correct"] = False
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-doctype"})
            self.currentToken["correct"] = False
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        else:
            self.currentToken["systemId"] += data
        return True

    def doctypeSystemIdentifierSingleQuotedState(self):
        data = self.stream.char()
        if data == "'":
            self.state = self.afterDoctypeSystemIdentifierState
        elif data == "\u0000":
            self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                    "data": "invalid-codepoint"})
            self.currentToken["systemId"] += "\uFFFD"
        elif data == ">":
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "unexpected-end-of-doctype"})
            self.currentToken["correct"] = False
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-doctype"})
            self.currentToken["correct"] = False
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        else:
            self.currentToken["systemId"] += data
        return True

    def afterDoctypeSystemIdentifierState(self):
        data = self.stream.char()
        if data in spaceCharacters:
            pass
        elif data == ">":
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        elif data is EOF:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "eof-in-doctype"})
            self.currentToken["correct"] = False
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        else:
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "unexpected-char-in-doctype"})
            self.state = self.bogusDoctypeState
        return True

    def bogusDoctypeState(self):
        data = self.stream.char()
        if data == ">":
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        elif data is EOF:
            # XXX EMIT
            self.stream.unget(data)
            self.tokenQueue.append(self.currentToken)
            self.state = self.dataState
        else:
            pass
        return True

    def cdataSectionState(self):
        data = []
        while True:
            data.append(self.stream.charsUntil("]"))
            data.append(self.stream.charsUntil(">"))
            char = self.stream.char()
            if char == EOF:
                break
            else:
                assert char == ">"
                if data[-1][-2:] == "]]":
                    data[-1] = data[-1][:-2]
                    break
                else:
                    data.append(char)

        data = "".join(data)
        # Deal with null here rather than in the parser
        nullCount = data.count("\u0000")
        if nullCount > 0:
            for i in range(nullCount):
                self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                        "data": "invalid-codepoint"})
            data = data.replace("\u0000", "\uFFFD")
        if data:
            self.tokenQueue.append({"type": tokenTypes["Characters"],
                                    "data": data})
        self.state = self.dataState
        return True
site-packages/pip/_vendor/html5lib/inputstream.py000064400000073654151733463640016210 0ustar00from __future__ import absolute_import, division, unicode_literals
from pip._vendor.six import text_type

import codecs
import re

from .constants import EOF, spaceCharacters, asciiLetters, asciiUppercase
from .constants import encodings, ReparseException
from . import utils

from io import StringIO

try:
    from io import BytesIO
except ImportError:
    BytesIO = StringIO

try:
    from io import BufferedIOBase
except ImportError:
    class BufferedIOBase(object):
        pass

# Non-unicode versions of constants for use in the pre-parser
spaceCharactersBytes = frozenset([item.encode("ascii") for item in spaceCharacters])
asciiLettersBytes = frozenset([item.encode("ascii") for item in asciiLetters])
asciiUppercaseBytes = frozenset([item.encode("ascii") for item in asciiUppercase])
spacesAngleBrackets = spaceCharactersBytes | frozenset([b">", b"<"])

invalid_unicode_re = re.compile("[\u0001-\u0008\u000B\u000E-\u001F\u007F-\u009F\uD800-\uDFFF\uFDD0-\uFDEF\uFFFE\uFFFF\U0001FFFE\U0001FFFF\U0002FFFE\U0002FFFF\U0003FFFE\U0003FFFF\U0004FFFE\U0004FFFF\U0005FFFE\U0005FFFF\U0006FFFE\U0006FFFF\U0007FFFE\U0007FFFF\U0008FFFE\U0008FFFF\U0009FFFE\U0009FFFF\U000AFFFE\U000AFFFF\U000BFFFE\U000BFFFF\U000CFFFE\U000CFFFF\U000DFFFE\U000DFFFF\U000EFFFE\U000EFFFF\U000FFFFE\U000FFFFF\U0010FFFE\U0010FFFF]")

non_bmp_invalid_codepoints = set([0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE,
                                  0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF,
                                  0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE,
                                  0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF,
                                  0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE,
                                  0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF,
                                  0x10FFFE, 0x10FFFF])

ascii_punctuation_re = re.compile("[\u0009-\u000D\u0020-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u007E]")

# Cache for charsUntil()
charsUntilRegEx = {}


class BufferedStream(object):
    """Buffering for streams that do not have buffering of their own

    The buffer is implemented as a list of chunks on the assumption that
    joining many strings will be slow since it is O(n**2)
    """

    def __init__(self, stream):
        self.stream = stream
        self.buffer = []
        self.position = [-1, 0]  # chunk number, offset

    def tell(self):
        pos = 0
        for chunk in self.buffer[:self.position[0]]:
            pos += len(chunk)
        pos += self.position[1]
        return pos

    def seek(self, pos):
        assert pos <= self._bufferedBytes()
        offset = pos
        i = 0
        while len(self.buffer[i]) < offset:
            offset -= len(self.buffer[i])
            i += 1
        self.position = [i, offset]

    def read(self, bytes):
        if not self.buffer:
            return self._readStream(bytes)
        elif (self.position[0] == len(self.buffer) and
              self.position[1] == len(self.buffer[-1])):
            return self._readStream(bytes)
        else:
            return self._readFromBuffer(bytes)

    def _bufferedBytes(self):
        return sum([len(item) for item in self.buffer])

    def _readStream(self, bytes):
        data = self.stream.read(bytes)
        self.buffer.append(data)
        self.position[0] += 1
        self.position[1] = len(data)
        return data

    def _readFromBuffer(self, bytes):
        remainingBytes = bytes
        rv = []
        bufferIndex = self.position[0]
        bufferOffset = self.position[1]
        while bufferIndex < len(self.buffer) and remainingBytes != 0:
            assert remainingBytes > 0
            bufferedData = self.buffer[bufferIndex]

            if remainingBytes <= len(bufferedData) - bufferOffset:
                bytesToRead = remainingBytes
                self.position = [bufferIndex, bufferOffset + bytesToRead]
            else:
                bytesToRead = len(bufferedData) - bufferOffset
                self.position = [bufferIndex, len(bufferedData)]
                bufferIndex += 1
            rv.append(bufferedData[bufferOffset:bufferOffset + bytesToRead])
            remainingBytes -= bytesToRead

            bufferOffset = 0

        if remainingBytes:
            rv.append(self._readStream(remainingBytes))

        return b"".join(rv)


def HTMLInputStream(source, encoding=None, parseMeta=True, chardet=True):
    if hasattr(source, "read"):
        isUnicode = isinstance(source.read(0), text_type)
    else:
        isUnicode = isinstance(source, text_type)

    if isUnicode:
        if encoding is not None:
            raise TypeError("Cannot explicitly set an encoding with a unicode string")

        return HTMLUnicodeInputStream(source)
    else:
        return HTMLBinaryInputStream(source, encoding, parseMeta, chardet)


class HTMLUnicodeInputStream(object):
    """Provides a unicode stream of characters to the HTMLTokenizer.

    This class takes care of character encoding and removing or replacing
    incorrect byte-sequences and also provides column and line tracking.

    """

    _defaultChunkSize = 10240

    def __init__(self, source):
        """Initialises the HTMLInputStream.

        HTMLInputStream(source, [encoding]) -> Normalized stream from source
        for use by html5lib.

        source can be either a file-object, local filename or a string.

        The optional encoding parameter must be a string that indicates
        the encoding.  If specified, that encoding will be used,
        regardless of any BOM or later declaration (such as in a meta
        element)

        parseMeta - Look for a <meta> element containing encoding information

        """

        # Craziness
        if len("\U0010FFFF") == 1:
            self.reportCharacterErrors = self.characterErrorsUCS4
            self.replaceCharactersRegexp = re.compile("[\uD800-\uDFFF]")
        else:
            self.reportCharacterErrors = self.characterErrorsUCS2
            self.replaceCharactersRegexp = re.compile("([\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF])")

        # List of where new lines occur
        self.newLines = [0]

        self.charEncoding = ("utf-8", "certain")
        self.dataStream = self.openStream(source)

        self.reset()

    def reset(self):
        self.chunk = ""
        self.chunkSize = 0
        self.chunkOffset = 0
        self.errors = []

        # number of (complete) lines in previous chunks
        self.prevNumLines = 0
        # number of columns in the last line of the previous chunk
        self.prevNumCols = 0

        # Deal with CR LF and surrogates split over chunk boundaries
        self._bufferedCharacter = None

    def openStream(self, source):
        """Produces a file object from source.

        source can be either a file object, local filename or a string.

        """
        # Already a file object
        if hasattr(source, 'read'):
            stream = source
        else:
            stream = StringIO(source)

        return stream

    def _position(self, offset):
        chunk = self.chunk
        nLines = chunk.count('\n', 0, offset)
        positionLine = self.prevNumLines + nLines
        lastLinePos = chunk.rfind('\n', 0, offset)
        if lastLinePos == -1:
            positionColumn = self.prevNumCols + offset
        else:
            positionColumn = offset - (lastLinePos + 1)
        return (positionLine, positionColumn)

    def position(self):
        """Returns (line, col) of the current position in the stream."""
        line, col = self._position(self.chunkOffset)
        return (line + 1, col)

    def char(self):
        """ Read one character from the stream or queue if available. Return
            EOF when EOF is reached.
        """
        # Read a new chunk from the input stream if necessary
        if self.chunkOffset >= self.chunkSize:
            if not self.readChunk():
                return EOF

        chunkOffset = self.chunkOffset
        char = self.chunk[chunkOffset]
        self.chunkOffset = chunkOffset + 1

        return char

    def readChunk(self, chunkSize=None):
        if chunkSize is None:
            chunkSize = self._defaultChunkSize

        self.prevNumLines, self.prevNumCols = self._position(self.chunkSize)

        self.chunk = ""
        self.chunkSize = 0
        self.chunkOffset = 0

        data = self.dataStream.read(chunkSize)

        # Deal with CR LF and surrogates broken across chunks
        if self._bufferedCharacter:
            data = self._bufferedCharacter + data
            self._bufferedCharacter = None
        elif not data:
            # We have no more data, bye-bye stream
            return False

        if len(data) > 1:
            lastv = ord(data[-1])
            if lastv == 0x0D or 0xD800 <= lastv <= 0xDBFF:
                self._bufferedCharacter = data[-1]
                data = data[:-1]

        self.reportCharacterErrors(data)

        # Replace invalid characters
        # Note U+0000 is dealt with in the tokenizer
        data = self.replaceCharactersRegexp.sub("\ufffd", data)

        data = data.replace("\r\n", "\n")
        data = data.replace("\r", "\n")

        self.chunk = data
        self.chunkSize = len(data)

        return True

    def characterErrorsUCS4(self, data):
        for i in range(len(invalid_unicode_re.findall(data))):
            self.errors.append("invalid-codepoint")

    def characterErrorsUCS2(self, data):
        # Someone picked the wrong compile option
        # You lose
        skip = False
        for match in invalid_unicode_re.finditer(data):
            if skip:
                continue
            codepoint = ord(match.group())
            pos = match.start()
            # Pretty sure there should be endianness issues here
            if utils.isSurrogatePair(data[pos:pos + 2]):
                # We have a surrogate pair!
                char_val = utils.surrogatePairToCodepoint(data[pos:pos + 2])
                if char_val in non_bmp_invalid_codepoints:
                    self.errors.append("invalid-codepoint")
                skip = True
            elif (codepoint >= 0xD800 and codepoint <= 0xDFFF and
                  pos == len(data) - 1):
                self.errors.append("invalid-codepoint")
            else:
                skip = False
                self.errors.append("invalid-codepoint")

    def charsUntil(self, characters, opposite=False):
        """ Returns a string of characters from the stream up to but not
        including any character in 'characters' or EOF. 'characters' must be
        a container that supports the 'in' method and iteration over its
        characters.
        """

        # Use a cache of regexps to find the required characters
        try:
            chars = charsUntilRegEx[(characters, opposite)]
        except KeyError:
            if __debug__:
                for c in characters:
                    assert(ord(c) < 128)
            regex = "".join(["\\x%02x" % ord(c) for c in characters])
            if not opposite:
                regex = "^%s" % regex
            chars = charsUntilRegEx[(characters, opposite)] = re.compile("[%s]+" % regex)

        rv = []

        while True:
            # Find the longest matching prefix
            m = chars.match(self.chunk, self.chunkOffset)
            if m is None:
                # If nothing matched, and it wasn't because we ran out of chunk,
                # then stop
                if self.chunkOffset != self.chunkSize:
                    break
            else:
                end = m.end()
                # If not the whole chunk matched, return everything
                # up to the part that didn't match
                if end != self.chunkSize:
                    rv.append(self.chunk[self.chunkOffset:end])
                    self.chunkOffset = end
                    break
            # If the whole remainder of the chunk matched,
            # use it all and read the next chunk
            rv.append(self.chunk[self.chunkOffset:])
            if not self.readChunk():
                # Reached EOF
                break

        r = "".join(rv)
        return r

    def unget(self, char):
        # Only one character is allowed to be ungotten at once - it must
        # be consumed again before any further call to unget
        if char is not None:
            if self.chunkOffset == 0:
                # unget is called quite rarely, so it's a good idea to do
                # more work here if it saves a bit of work in the frequently
                # called char and charsUntil.
                # So, just prepend the ungotten character onto the current
                # chunk:
                self.chunk = char + self.chunk
                self.chunkSize += 1
            else:
                self.chunkOffset -= 1
                assert self.chunk[self.chunkOffset] == char


class HTMLBinaryInputStream(HTMLUnicodeInputStream):
    """Provides a unicode stream of characters to the HTMLTokenizer.

    This class takes care of character encoding and removing or replacing
    incorrect byte-sequences and also provides column and line tracking.

    """

    def __init__(self, source, encoding=None, parseMeta=True, chardet=True):
        """Initialises the HTMLInputStream.

        HTMLInputStream(source, [encoding]) -> Normalized stream from source
        for use by html5lib.

        source can be either a file-object, local filename or a string.

        The optional encoding parameter must be a string that indicates
        the encoding.  If specified, that encoding will be used,
        regardless of any BOM or later declaration (such as in a meta
        element)

        parseMeta - Look for a <meta> element containing encoding information

        """
        # Raw Stream - for unicode objects this will encode to utf-8 and set
        #              self.charEncoding as appropriate
        self.rawStream = self.openStream(source)

        HTMLUnicodeInputStream.__init__(self, self.rawStream)

        self.charEncoding = (codecName(encoding), "certain")

        # Encoding Information
        # Number of bytes to use when looking for a meta element with
        # encoding information
        self.numBytesMeta = 512
        # Number of bytes to use when using detecting encoding using chardet
        self.numBytesChardet = 100
        # Encoding to use if no other information can be found
        self.defaultEncoding = "windows-1252"

        # Detect encoding iff no explicit "transport level" encoding is supplied
        if (self.charEncoding[0] is None):
            self.charEncoding = self.detectEncoding(parseMeta, chardet)

        # Call superclass
        self.reset()

    def reset(self):
        self.dataStream = codecs.getreader(self.charEncoding[0])(self.rawStream,
                                                                 'replace')
        HTMLUnicodeInputStream.reset(self)

    def openStream(self, source):
        """Produces a file object from source.

        source can be either a file object, local filename or a string.

        """
        # Already a file object
        if hasattr(source, 'read'):
            stream = source
        else:
            stream = BytesIO(source)

        try:
            stream.seek(stream.tell())
        except:
            stream = BufferedStream(stream)

        return stream

    def detectEncoding(self, parseMeta=True, chardet=True):
        # First look for a BOM
        # This will also read past the BOM if present
        encoding = self.detectBOM()
        confidence = "certain"
        # If there is no BOM need to look for meta elements with encoding
        # information
        if encoding is None and parseMeta:
            encoding = self.detectEncodingMeta()
            confidence = "tentative"
        # Guess with chardet, if avaliable
        if encoding is None and chardet:
            confidence = "tentative"
            try:
                try:
                    from charade.universaldetector import UniversalDetector
                except ImportError:
                    from chardet.universaldetector import UniversalDetector
                buffers = []
                detector = UniversalDetector()
                while not detector.done:
                    buffer = self.rawStream.read(self.numBytesChardet)
                    assert isinstance(buffer, bytes)
                    if not buffer:
                        break
                    buffers.append(buffer)
                    detector.feed(buffer)
                detector.close()
                encoding = detector.result['encoding']
                self.rawStream.seek(0)
            except ImportError:
                pass
        # If all else fails use the default encoding
        if encoding is None:
            confidence = "tentative"
            encoding = self.defaultEncoding

        # Substitute for equivalent encodings:
        encodingSub = {"iso-8859-1": "windows-1252"}

        if encoding.lower() in encodingSub:
            encoding = encodingSub[encoding.lower()]

        return encoding, confidence

    def changeEncoding(self, newEncoding):
        assert self.charEncoding[1] != "certain"
        newEncoding = codecName(newEncoding)
        if newEncoding in ("utf-16", "utf-16-be", "utf-16-le"):
            newEncoding = "utf-8"
        if newEncoding is None:
            return
        elif newEncoding == self.charEncoding[0]:
            self.charEncoding = (self.charEncoding[0], "certain")
        else:
            self.rawStream.seek(0)
            self.reset()
            self.charEncoding = (newEncoding, "certain")
            raise ReparseException("Encoding changed from %s to %s" % (self.charEncoding[0], newEncoding))

    def detectBOM(self):
        """Attempts to detect at BOM at the start of the stream. If
        an encoding can be determined from the BOM return the name of the
        encoding otherwise return None"""
        bomDict = {
            codecs.BOM_UTF8: 'utf-8',
            codecs.BOM_UTF16_LE: 'utf-16-le', codecs.BOM_UTF16_BE: 'utf-16-be',
            codecs.BOM_UTF32_LE: 'utf-32-le', codecs.BOM_UTF32_BE: 'utf-32-be'
        }

        # Go to beginning of file and read in 4 bytes
        string = self.rawStream.read(4)
        assert isinstance(string, bytes)

        # Try detecting the BOM using bytes from the string
        encoding = bomDict.get(string[:3])         # UTF-8
        seek = 3
        if not encoding:
            # Need to detect UTF-32 before UTF-16
            encoding = bomDict.get(string)         # UTF-32
            seek = 4
            if not encoding:
                encoding = bomDict.get(string[:2])  # UTF-16
                seek = 2

        # Set the read position past the BOM if one was found, otherwise
        # set it to the start of the stream
        self.rawStream.seek(encoding and seek or 0)

        return encoding

    def detectEncodingMeta(self):
        """Report the encoding declared by the meta element
        """
        buffer = self.rawStream.read(self.numBytesMeta)
        assert isinstance(buffer, bytes)
        parser = EncodingParser(buffer)
        self.rawStream.seek(0)
        encoding = parser.getEncoding()

        if encoding in ("utf-16", "utf-16-be", "utf-16-le"):
            encoding = "utf-8"

        return encoding


class EncodingBytes(bytes):
    """String-like object with an associated position and various extra methods
    If the position is ever greater than the string length then an exception is
    raised"""
    def __new__(self, value):
        assert isinstance(value, bytes)
        return bytes.__new__(self, value.lower())

    def __init__(self, value):
        self._position = -1

    def __iter__(self):
        return self

    def __next__(self):
        p = self._position = self._position + 1
        if p >= len(self):
            raise StopIteration
        elif p < 0:
            raise TypeError
        return self[p:p + 1]

    def next(self):
        # Py2 compat
        return self.__next__()

    def previous(self):
        p = self._position
        if p >= len(self):
            raise StopIteration
        elif p < 0:
            raise TypeError
        self._position = p = p - 1
        return self[p:p + 1]

    def setPosition(self, position):
        if self._position >= len(self):
            raise StopIteration
        self._position = position

    def getPosition(self):
        if self._position >= len(self):
            raise StopIteration
        if self._position >= 0:
            return self._position
        else:
            return None

    position = property(getPosition, setPosition)

    def getCurrentByte(self):
        return self[self.position:self.position + 1]

    currentByte = property(getCurrentByte)

    def skip(self, chars=spaceCharactersBytes):
        """Skip past a list of characters"""
        p = self.position               # use property for the error-checking
        while p < len(self):
            c = self[p:p + 1]
            if c not in chars:
                self._position = p
                return c
            p += 1
        self._position = p
        return None

    def skipUntil(self, chars):
        p = self.position
        while p < len(self):
            c = self[p:p + 1]
            if c in chars:
                self._position = p
                return c
            p += 1
        self._position = p
        return None

    def matchBytes(self, bytes):
        """Look for a sequence of bytes at the start of a string. If the bytes
        are found return True and advance the position to the byte after the
        match. Otherwise return False and leave the position alone"""
        p = self.position
        data = self[p:p + len(bytes)]
        rv = data.startswith(bytes)
        if rv:
            self.position += len(bytes)
        return rv

    def jumpTo(self, bytes):
        """Look for the next sequence of bytes matching a given sequence. If
        a match is found advance the position to the last byte of the match"""
        newPosition = self[self.position:].find(bytes)
        if newPosition > -1:
            # XXX: This is ugly, but I can't see a nicer way to fix this.
            if self._position == -1:
                self._position = 0
            self._position += (newPosition + len(bytes) - 1)
            return True
        else:
            raise StopIteration


class EncodingParser(object):
    """Mini parser for detecting character encoding from meta elements"""

    def __init__(self, data):
        """string - the data to work on for encoding detection"""
        self.data = EncodingBytes(data)
        self.encoding = None

    def getEncoding(self):
        methodDispatch = (
            (b"<!--", self.handleComment),
            (b"<meta", self.handleMeta),
            (b"</", self.handlePossibleEndTag),
            (b"<!", self.handleOther),
            (b"<?", self.handleOther),
            (b"<", self.handlePossibleStartTag))
        for byte in self.data:
            keepParsing = True
            for key, method in methodDispatch:
                if self.data.matchBytes(key):
                    try:
                        keepParsing = method()
                        break
                    except StopIteration:
                        keepParsing = False
                        break
            if not keepParsing:
                break

        return self.encoding

    def handleComment(self):
        """Skip over comments"""
        return self.data.jumpTo(b"-->")

    def handleMeta(self):
        if self.data.currentByte not in spaceCharactersBytes:
            # if we have <meta not followed by a space so just keep going
            return True
        # We have a valid meta element we want to search for attributes
        hasPragma = False
        pendingEncoding = None
        while True:
            # Try to find the next attribute after the current position
            attr = self.getAttribute()
            if attr is None:
                return True
            else:
                if attr[0] == b"http-equiv":
                    hasPragma = attr[1] == b"content-type"
                    if hasPragma and pendingEncoding is not None:
                        self.encoding = pendingEncoding
                        return False
                elif attr[0] == b"charset":
                    tentativeEncoding = attr[1]
                    codec = codecName(tentativeEncoding)
                    if codec is not None:
                        self.encoding = codec
                        return False
                elif attr[0] == b"content":
                    contentParser = ContentAttrParser(EncodingBytes(attr[1]))
                    tentativeEncoding = contentParser.parse()
                    if tentativeEncoding is not None:
                        codec = codecName(tentativeEncoding)
                        if codec is not None:
                            if hasPragma:
                                self.encoding = codec
                                return False
                            else:
                                pendingEncoding = codec

    def handlePossibleStartTag(self):
        return self.handlePossibleTag(False)

    def handlePossibleEndTag(self):
        next(self.data)
        return self.handlePossibleTag(True)

    def handlePossibleTag(self, endTag):
        data = self.data
        if data.currentByte not in asciiLettersBytes:
            # If the next byte is not an ascii letter either ignore this
            # fragment (possible start tag case) or treat it according to
            # handleOther
            if endTag:
                data.previous()
                self.handleOther()
            return True

        c = data.skipUntil(spacesAngleBrackets)
        if c == b"<":
            # return to the first step in the overall "two step" algorithm
            # reprocessing the < byte
            data.previous()
        else:
            # Read all attributes
            attr = self.getAttribute()
            while attr is not None:
                attr = self.getAttribute()
        return True

    def handleOther(self):
        return self.data.jumpTo(b">")

    def getAttribute(self):
        """Return a name,value pair for the next attribute in the stream,
        if one is found, or None"""
        data = self.data
        # Step 1 (skip chars)
        c = data.skip(spaceCharactersBytes | frozenset([b"/"]))
        assert c is None or len(c) == 1
        # Step 2
        if c in (b">", None):
            return None
        # Step 3
        attrName = []
        attrValue = []
        # Step 4 attribute name
        while True:
            if c == b"=" and attrName:
                break
            elif c in spaceCharactersBytes:
                # Step 6!
                c = data.skip()
                break
            elif c in (b"/", b">"):
                return b"".join(attrName), b""
            elif c in asciiUppercaseBytes:
                attrName.append(c.lower())
            elif c is None:
                return None
            else:
                attrName.append(c)
            # Step 5
            c = next(data)
        # Step 7
        if c != b"=":
            data.previous()
            return b"".join(attrName), b""
        # Step 8
        next(data)
        # Step 9
        c = data.skip()
        # Step 10
        if c in (b"'", b'"'):
            # 10.1
            quoteChar = c
            while True:
                # 10.2
                c = next(data)
                # 10.3
                if c == quoteChar:
                    next(data)
                    return b"".join(attrName), b"".join(attrValue)
                # 10.4
                elif c in asciiUppercaseBytes:
                    attrValue.append(c.lower())
                # 10.5
                else:
                    attrValue.append(c)
        elif c == b">":
            return b"".join(attrName), b""
        elif c in asciiUppercaseBytes:
            attrValue.append(c.lower())
        elif c is None:
            return None
        else:
            attrValue.append(c)
        # Step 11
        while True:
            c = next(data)
            if c in spacesAngleBrackets:
                return b"".join(attrName), b"".join(attrValue)
            elif c in asciiUppercaseBytes:
                attrValue.append(c.lower())
            elif c is None:
                return None
            else:
                attrValue.append(c)


class ContentAttrParser(object):
    def __init__(self, data):
        assert isinstance(data, bytes)
        self.data = data

    def parse(self):
        try:
            # Check if the attr name is charset
            # otherwise return
            self.data.jumpTo(b"charset")
            self.data.position += 1
            self.data.skip()
            if not self.data.currentByte == b"=":
                # If there is no = sign keep looking for attrs
                return None
            self.data.position += 1
            self.data.skip()
            # Look for an encoding between matching quote marks
            if self.data.currentByte in (b'"', b"'"):
                quoteMark = self.data.currentByte
                self.data.position += 1
                oldPosition = self.data.position
                if self.data.jumpTo(quoteMark):
                    return self.data[oldPosition:self.data.position]
                else:
                    return None
            else:
                # Unquoted value
                oldPosition = self.data.position
                try:
                    self.data.skipUntil(spaceCharactersBytes)
                    return self.data[oldPosition:self.data.position]
                except StopIteration:
                    # Return the whole remaining value
                    return self.data[oldPosition:]
        except StopIteration:
            return None


def codecName(encoding):
    """Return the python codec name corresponding to an encoding or None if the
    string doesn't correspond to a valid encoding."""
    if isinstance(encoding, bytes):
        try:
            encoding = encoding.decode("ascii")
        except UnicodeDecodeError:
            return None
    if encoding:
        canonicalName = ascii_punctuation_re.sub("", encoding).lower()
        return encodings.get(canonicalName, None)
    else:
        return None
site-packages/pip/_vendor/html5lib/serializer/__pycache__/__init__.cpython-33.pyc000064400000001713151733463640024011 0ustar00�
7�Re�c@sUddlmZmZmZddlmZddlmZddd
dd	�Z	d
S(i(uabsolute_importudivisionuunicode_literalsi(utreewalkersi(uHTMLSerializeruetreeuhtmlcKsLtj|�}|dkr*t|�}ntd��|j||�|�S(Nuhtmlutype must be html(utreewalkersu
getTreeWalkeruHTMLSerializeru
ValueErrorurender(uinpututreeuformatuencodinguserializer_optsuwalkerus((uA/tmp/pip-zej_zi-build/pip/_vendor/html5lib/serializer/__init__.pyu	serializes
u	serializeN(
u
__future__uabsolute_importudivisionuunicode_literalsuutreewalkersuhtmlserializeruHTMLSerializeruNoneu	serialize(((uA/tmp/pip-zej_zi-build/pip/_vendor/html5lib/serializer/__init__.pyu<module>ssite-packages/pip/_vendor/html5lib/serializer/__pycache__/htmlserializer.cpython-33.pyc000064400000030537151733463640025316 0ustar00�
7�Rem2c@s$ddlmZmZmZddlmZddlZejZyddlm	Z	Wne
k
riYnXddlmZm
Z
mZddlmZmZmZddlmZdd	lmZd
je�ZyddlmZmZWne
k
rdZYn�Xd
ZiZed�dkZx�eej��D]�\Z Z!er[ee!�dks7erzee!�dkrzq7ne!dkr7ee!�dkr�ej"e!�Z!ne#e!�Z!e!eks�e j$�r�e ee!<q�q7q7Wdd�Z%eee%�[Gdd�de&�Z'dd�Z(dS(i(uabsolute_importudivisionuunicode_literals(u	text_typeN(ureducei(uvoidElementsubooleanAttributesuspaceCharacters(urcdataElementsuentitiesuxmlEntities(uutils(uescapeu(uregister_erroruxmlcharrefreplace_errorsustrictuhtmlentityreplaceu􏿿iu&c
Cs�t|ttf�r�g}g}d}x�t|j|j|j��D]�\}}|red}qGn||j}tj	|j|t
|j|dg���r�tj|j||d��}d}nt
|�}|j|�qGWx�|D]x}tj|�}	|	rE|jd�|j|	�|	jd�sf|jd�qfq�|jdt|�dd��q�Wdj|�|jfSt|�SdS(Niu&u;u&#x%s;uFT(u
isinstanceuUnicodeEncodeErroruUnicodeTranslateErroruFalseu	enumerateuobjectustartuenduutilsuisSurrogatePairuminusurrogatePairToCodepointuTrueuorduappenduencode_entity_mapugetuendswithuhexujoinuxmlcharrefreplace_errors(
uexcuresu
codepointsuskipuiucuindexu	codepointucpue((uG/tmp/pip-zej_zi-build/pip/_vendor/html5lib/serializer/htmlserializer.pyuhtmlentityreplace_errors*s0,
/ 	


%uhtmlentityreplace_errorscBs�|EeZdZdZdZdZdZdZ	dZ
dZdZdZ
dZdZdZdZdZd Zdd�Zdd�Zdd�Zddd�Zddd�Zddd�ZdS(!uHTMLSerializeru"uquote_attr_valuesu
quote_charuuse_best_quote_charuomit_optional_tagsuminimize_boolean_attributesuuse_trailing_solidususpace_before_trailing_solidusuescape_lt_in_attrsu
escape_rcdatauresolve_entitiesualphabetical_attributesuinject_meta_charsetustrip_whitespaceusanitizec	Ksgd|krd|_nx6|jD]+}t|||j|t||���q"Wg|_d|_dS(u�Initialize HTMLSerializer.

        Keyword options (default given first unless specified) include:

        inject_meta_charset=True|False
          Whether it insert a meta element to define the character set of the
          document.
        quote_attr_values=True|False
          Whether to quote attribute values that don't require quoting
          per HTML5 parsing rules.
        quote_char=u'"'|u"'"
          Use given quote character for attribute quoting. Default is to
          use double quote unless attribute value contains a double quote,
          in which case single quotes are used instead.
        escape_lt_in_attrs=False|True
          Whether to escape < in attribute values.
        escape_rcdata=False|True
          Whether to escape characters that need to be escaped within normal
          elements within rcdata elements such as style.
        resolve_entities=True|False
          Whether to resolve named character entities that appear in the
          source tree. The XML predefined entities &lt; &gt; &amp; &quot; &apos;
          are unaffected by this setting.
        strip_whitespace=False|True
          Whether to remove semantically meaningless whitespace. (This
          compresses all whitespace to a single space except within pre.)
        minimize_boolean_attributes=True|False
          Shortens boolean attributes to give just the attribute value,
          for example <input disabled="disabled"> becomes <input disabled>.
        use_trailing_solidus=False|True
          Includes a close-tag slash at the end of the start tag of void
          elements (empty elements whose end tag is forbidden). E.g. <hr/>.
        space_before_trailing_solidus=True|False
          Places a space immediately before the closing slash in a tag
          using a trailing solidus. E.g. <hr />. Requires use_trailing_solidus.
        sanitize=False|True
          Strip all unsafe or unknown constructs from output.
          See `html5lib user documentation`_
        omit_optional_tags=True|False
          Omit start/end tags that are optional.
        alphabetical_attributes=False|True
          Reorder attributes to be in alphabetical order.

        .. _html5lib user documentation: http://code.google.com/p/html5lib/wiki/UserDocumentation
        u
quote_charNF(uFalseuuse_best_quote_charuoptionsusetattrugetugetattruerrorsustrict(uselfukwargsuattr((uG/tmp/pip-zej_zi-build/pip/_vendor/html5lib/serializer/htmlserializer.pyu__init__ks.)	uHTMLSerializer.__init__cCs9t|t�st�|jr1|j|jt�S|SdS(N(u
isinstanceu	text_typeuAssertionErroruencodinguencodeuunicode_encode_errors(uselfustring((uG/tmp/pip-zej_zi-build/pip/_vendor/html5lib/serializer/htmlserializer.pyuencode�s	uHTMLSerializer.encodecCs9t|t�st�|jr1|j|jd�S|SdS(Nustrict(u
isinstanceu	text_typeuAssertionErroruencodinguencode(uselfustring((uG/tmp/pip-zej_zi-build/pip/_vendor/html5lib/serializer/htmlserializer.pyuencodeStrict�s	uHTMLSerializer.encodeStrictc#sI||_d2}g|_|rI|jrIddlm}|||�}n|jrqddlm}||�}n|jr�ddl	m}||�}n|j
r�ddlm}||�}n|jr�ddl
m}||�}nxY|D]Q}|d}|dkr�d|d}|dr9|d|d7}n|d	rP|d
7}n|d	r�|d	jd�dkr�|d	jd
�dkr�|jtd��nd
}nd}|d||d	|f7}n|d7}|j|�Vq�|d3krm|dks|rR|r=|djd�dkr=|jtd��n|j|d�VqA|jt|d��Vq�|d4kr�|d}	|jd|	�V|	tkr�|jr�d5}n|r�|jtd��nx�|dj�D]�\\}
}}|}
|�|jd�V|j|
�V|js[|
tj|	t��kr�|
tjdt��kr�|jd�V|jsy�r�d5}n"t�fdd�tdd2�}�jd d!��|j r��jd"d#��n|r�|j!}|j"r1d
�kr
d�kr
d}q1d�kr1d
�kr1d
}q1n|d
krR�jd
d$��n�jdd%��|j|�V|j��V|j|�Vq�|j��Vq�q�W|	t#kr�|j$r�|j%r�|jd&�Vq�|jd'�Vn|jd�Vq�|d(krS|d}	|	tkr"d2}n|r>|jtd��n|jd)|	�Vq�|d*kr�|d}|jd+�dkr�|jtd,��n|jd-|d�Vq�|d.kr0|d}	|	d/}|t&kr�|jtd0|	��n|j'r|t(krt&|}n
d1|	}|j|�Vq�|j|d�q�WdS(6Ni(uFilterutypeuDoctypeu<!DOCTYPE %sunameupublicIdu PUBLIC "%s"usystemIdu SYSTEMu"iu'uASystem identifer contains both single and double quote charactersu %s%s%su>u
CharactersuSpaceCharactersudatau</uUnexpected </ in CDATAuStartTaguEmptyTagu<%su+Unexpected child element of a CDATA elementu uu=cs|p|�kS(N((uxuy(uv(uG/tmp/pip-zej_zi-build/pip/_vendor/html5lib/serializer/htmlserializer.pyu<lambda>�su*HTMLSerializer.serialize.<locals>.<lambda>u>"'=u&u&amp;u<u&lt;u&#39;u&quot;u /u/uEndTagu</%s>uCommentu--uComment contains --u	<!--%s-->uEntityu;uEntity %s not recognizedu&%s;F(u
CharactersuSpaceCharacters(uStartTaguEmptyTagT()uencodinguFalseuerrorsuinject_meta_charsetufilters.inject_meta_charsetuFilterustrip_whitespaceufilters.whitespaceusanitizeufilters.sanitizeruomit_optional_tagsufilters.optionaltagsualphabetical_attributesufilters.alphabeticalattributesufinduserializeErroru_uencodeStrictuencodeuescapeurcdataElementsu
escape_rcdatauTrueuitemsuminimize_boolean_attributesubooleanAttributesugetutupleuquote_attr_valuesureduceuspaceCharactersureplaceuescape_lt_in_attrsu
quote_charuuse_best_quote_charuvoidElementsuuse_trailing_solidususpace_before_trailing_solidusuentitiesuresolve_entitiesuxmlEntities(uselfu
treewalkeruencodinguin_cdatauFilterutokenutypeudoctypeu
quote_charunameuattr_namespaceu	attr_nameu
attr_valueuku
quote_attrudataukey((uvuG/tmp/pip-zej_zi-build/pip/_vendor/html5lib/serializer/htmlserializer.pyu	serialize�s�						





	

	#
						
	




uHTMLSerializer.serializecCsE|r%djt|j||���Sdjt|j|���SdS(Nsu(ujoinulistu	serialize(uselfu
treewalkeruencoding((uG/tmp/pip-zej_zi-build/pip/_vendor/html5lib/serializer/htmlserializer.pyurender1suHTMLSerializer.renderuXXX ERROR MESSAGE NEEDEDcCs&|jj|�|jr"t�ndS(N(uerrorsuappendustrictuSerializeError(uselfudata((uG/tmp/pip-zej_zi-build/pip/_vendor/html5lib/serializer/htmlserializer.pyuserializeError7s	uHTMLSerializer.serializeErrorNFT(uquote_attr_valuesu
quote_charuuse_best_quote_charuomit_optional_tagsuminimize_boolean_attributesuuse_trailing_solidususpace_before_trailing_solidusuescape_lt_in_attrsu
escape_rcdatauresolve_entitiesualphabetical_attributesuinject_meta_charsetustrip_whitespaceusanitize(u__name__u
__module__u__qualname__uFalseuquote_attr_valuesu
quote_charuTrueuuse_best_quote_charuomit_optional_tagsuminimize_boolean_attributesuuse_trailing_solidususpace_before_trailing_solidusuescape_lt_in_attrsu
escape_rcdatauresolve_entitiesualphabetical_attributesuinject_meta_charsetustrip_whitespaceusanitizeuoptionsu__init__uencodeuencodeStrictuNoneu	serializeurenderuserializeError(u
__locals__((uG/tmp/pip-zej_zi-build/pip/_vendor/html5lib/serializer/htmlserializer.pyuHTMLSerializerLs45�uHTMLSerializercCsdS(uError in serialized treeN((u	Exception((uG/tmp/pip-zej_zi-build/pip/_vendor/html5lib/serializer/htmlserializer.pyuSerializeError>suSerializeError()u
__future__uabsolute_importudivisionuunicode_literalsupip._vendor.sixu	text_typeugettextu_u	functoolsureduceuImportErroru	constantsuvoidElementsubooleanAttributesuspaceCharactersurcdataElementsuentitiesuxmlEntitiesuuutilsuxml.sax.saxutilsuescapeujoinucodecsuregister_erroruxmlcharrefreplace_errorsuunicode_encode_errorsuencode_entity_mapulenuis_ucs4ulistuitemsukuvusurrogatePairToCodepointuorduisloweruhtmlentityreplace_errorsuobjectuHTMLSerializeruSerializeError(((uG/tmp/pip-zej_zi-build/pip/_vendor/html5lib/serializer/htmlserializer.pyu<module>sD	


�site-packages/pip/_vendor/html5lib/serializer/__init__.py000064400000000752151733463640017532 0ustar00from __future__ import absolute_import, division, unicode_literals

from .. import treewalkers

from .htmlserializer import HTMLSerializer


def serialize(input, tree="etree", format="html", encoding=None,
              **serializer_opts):
    # XXX: Should we cache this?
    walker = treewalkers.getTreeWalker(tree)
    if format == "html":
        s = HTMLSerializer(**serializer_opts)
    else:
        raise ValueError("type must be html")
    return s.render(walker(input), encoding)
site-packages/pip/_vendor/html5lib/serializer/htmlserializer.py000064400000031155151733463640021032 0ustar00from __future__ import absolute_import, division, unicode_literals
from pip._vendor.six import text_type

import gettext
_ = gettext.gettext

try:
    from functools import reduce
except ImportError:
    pass

from ..constants import voidElements, booleanAttributes, spaceCharacters
from ..constants import rcdataElements, entities, xmlEntities
from .. import utils
from xml.sax.saxutils import escape

spaceCharacters = "".join(spaceCharacters)

try:
    from codecs import register_error, xmlcharrefreplace_errors
except ImportError:
    unicode_encode_errors = "strict"
else:
    unicode_encode_errors = "htmlentityreplace"

    encode_entity_map = {}
    is_ucs4 = len("\U0010FFFF") == 1
    for k, v in list(entities.items()):
        # skip multi-character entities
        if ((is_ucs4 and len(v) > 1) or
                (not is_ucs4 and len(v) > 2)):
            continue
        if v != "&":
            if len(v) == 2:
                v = utils.surrogatePairToCodepoint(v)
            else:
                v = ord(v)
            if not v in encode_entity_map or k.islower():
                # prefer &lt; over &LT; and similarly for &amp;, &gt;, etc.
                encode_entity_map[v] = k

    def htmlentityreplace_errors(exc):
        if isinstance(exc, (UnicodeEncodeError, UnicodeTranslateError)):
            res = []
            codepoints = []
            skip = False
            for i, c in enumerate(exc.object[exc.start:exc.end]):
                if skip:
                    skip = False
                    continue
                index = i + exc.start
                if utils.isSurrogatePair(exc.object[index:min([exc.end, index + 2])]):
                    codepoint = utils.surrogatePairToCodepoint(exc.object[index:index + 2])
                    skip = True
                else:
                    codepoint = ord(c)
                codepoints.append(codepoint)
            for cp in codepoints:
                e = encode_entity_map.get(cp)
                if e:
                    res.append("&")
                    res.append(e)
                    if not e.endswith(";"):
                        res.append(";")
                else:
                    res.append("&#x%s;" % (hex(cp)[2:]))
            return ("".join(res), exc.end)
        else:
            return xmlcharrefreplace_errors(exc)

    register_error(unicode_encode_errors, htmlentityreplace_errors)

    del register_error


class HTMLSerializer(object):

    # attribute quoting options
    quote_attr_values = False
    quote_char = '"'
    use_best_quote_char = True

    # tag syntax options
    omit_optional_tags = True
    minimize_boolean_attributes = True
    use_trailing_solidus = False
    space_before_trailing_solidus = True

    # escaping options
    escape_lt_in_attrs = False
    escape_rcdata = False
    resolve_entities = True

    # miscellaneous options
    alphabetical_attributes = False
    inject_meta_charset = True
    strip_whitespace = False
    sanitize = False

    options = ("quote_attr_values", "quote_char", "use_best_quote_char",
               "omit_optional_tags", "minimize_boolean_attributes",
               "use_trailing_solidus", "space_before_trailing_solidus",
               "escape_lt_in_attrs", "escape_rcdata", "resolve_entities",
               "alphabetical_attributes", "inject_meta_charset",
               "strip_whitespace", "sanitize")

    def __init__(self, **kwargs):
        """Initialize HTMLSerializer.

        Keyword options (default given first unless specified) include:

        inject_meta_charset=True|False
          Whether it insert a meta element to define the character set of the
          document.
        quote_attr_values=True|False
          Whether to quote attribute values that don't require quoting
          per HTML5 parsing rules.
        quote_char=u'"'|u"'"
          Use given quote character for attribute quoting. Default is to
          use double quote unless attribute value contains a double quote,
          in which case single quotes are used instead.
        escape_lt_in_attrs=False|True
          Whether to escape < in attribute values.
        escape_rcdata=False|True
          Whether to escape characters that need to be escaped within normal
          elements within rcdata elements such as style.
        resolve_entities=True|False
          Whether to resolve named character entities that appear in the
          source tree. The XML predefined entities &lt; &gt; &amp; &quot; &apos;
          are unaffected by this setting.
        strip_whitespace=False|True
          Whether to remove semantically meaningless whitespace. (This
          compresses all whitespace to a single space except within pre.)
        minimize_boolean_attributes=True|False
          Shortens boolean attributes to give just the attribute value,
          for example <input disabled="disabled"> becomes <input disabled>.
        use_trailing_solidus=False|True
          Includes a close-tag slash at the end of the start tag of void
          elements (empty elements whose end tag is forbidden). E.g. <hr/>.
        space_before_trailing_solidus=True|False
          Places a space immediately before the closing slash in a tag
          using a trailing solidus. E.g. <hr />. Requires use_trailing_solidus.
        sanitize=False|True
          Strip all unsafe or unknown constructs from output.
          See `html5lib user documentation`_
        omit_optional_tags=True|False
          Omit start/end tags that are optional.
        alphabetical_attributes=False|True
          Reorder attributes to be in alphabetical order.

        .. _html5lib user documentation: http://code.google.com/p/html5lib/wiki/UserDocumentation
        """
        if 'quote_char' in kwargs:
            self.use_best_quote_char = False
        for attr in self.options:
            setattr(self, attr, kwargs.get(attr, getattr(self, attr)))
        self.errors = []
        self.strict = False

    def encode(self, string):
        assert(isinstance(string, text_type))
        if self.encoding:
            return string.encode(self.encoding, unicode_encode_errors)
        else:
            return string

    def encodeStrict(self, string):
        assert(isinstance(string, text_type))
        if self.encoding:
            return string.encode(self.encoding, "strict")
        else:
            return string

    def serialize(self, treewalker, encoding=None):
        self.encoding = encoding
        in_cdata = False
        self.errors = []

        if encoding and self.inject_meta_charset:
            from ..filters.inject_meta_charset import Filter
            treewalker = Filter(treewalker, encoding)
        # WhitespaceFilter should be used before OptionalTagFilter
        # for maximum efficiently of this latter filter
        if self.strip_whitespace:
            from ..filters.whitespace import Filter
            treewalker = Filter(treewalker)
        if self.sanitize:
            from ..filters.sanitizer import Filter
            treewalker = Filter(treewalker)
        if self.omit_optional_tags:
            from ..filters.optionaltags import Filter
            treewalker = Filter(treewalker)
        # Alphabetical attributes must be last, as other filters
        # could add attributes and alter the order
        if self.alphabetical_attributes:
            from ..filters.alphabeticalattributes import Filter
            treewalker = Filter(treewalker)

        for token in treewalker:
            type = token["type"]
            if type == "Doctype":
                doctype = "<!DOCTYPE %s" % token["name"]

                if token["publicId"]:
                    doctype += ' PUBLIC "%s"' % token["publicId"]
                elif token["systemId"]:
                    doctype += " SYSTEM"
                if token["systemId"]:
                    if token["systemId"].find('"') >= 0:
                        if token["systemId"].find("'") >= 0:
                            self.serializeError(_("System identifer contains both single and double quote characters"))
                        quote_char = "'"
                    else:
                        quote_char = '"'
                    doctype += " %s%s%s" % (quote_char, token["systemId"], quote_char)

                doctype += ">"
                yield self.encodeStrict(doctype)

            elif type in ("Characters", "SpaceCharacters"):
                if type == "SpaceCharacters" or in_cdata:
                    if in_cdata and token["data"].find("</") >= 0:
                        self.serializeError(_("Unexpected </ in CDATA"))
                    yield self.encode(token["data"])
                else:
                    yield self.encode(escape(token["data"]))

            elif type in ("StartTag", "EmptyTag"):
                name = token["name"]
                yield self.encodeStrict("<%s" % name)
                if name in rcdataElements and not self.escape_rcdata:
                    in_cdata = True
                elif in_cdata:
                    self.serializeError(_("Unexpected child element of a CDATA element"))
                for (attr_namespace, attr_name), attr_value in token["data"].items():
                    # TODO: Add namespace support here
                    k = attr_name
                    v = attr_value
                    yield self.encodeStrict(' ')

                    yield self.encodeStrict(k)
                    if not self.minimize_boolean_attributes or \
                        (k not in booleanAttributes.get(name, tuple())
                         and k not in booleanAttributes.get("", tuple())):
                        yield self.encodeStrict("=")
                        if self.quote_attr_values or not v:
                            quote_attr = True
                        else:
                            quote_attr = reduce(lambda x, y: x or (y in v),
                                                spaceCharacters + ">\"'=", False)
                        v = v.replace("&", "&amp;")
                        if self.escape_lt_in_attrs:
                            v = v.replace("<", "&lt;")
                        if quote_attr:
                            quote_char = self.quote_char
                            if self.use_best_quote_char:
                                if "'" in v and '"' not in v:
                                    quote_char = '"'
                                elif '"' in v and "'" not in v:
                                    quote_char = "'"
                            if quote_char == "'":
                                v = v.replace("'", "&#39;")
                            else:
                                v = v.replace('"', "&quot;")
                            yield self.encodeStrict(quote_char)
                            yield self.encode(v)
                            yield self.encodeStrict(quote_char)
                        else:
                            yield self.encode(v)
                if name in voidElements and self.use_trailing_solidus:
                    if self.space_before_trailing_solidus:
                        yield self.encodeStrict(" /")
                    else:
                        yield self.encodeStrict("/")
                yield self.encode(">")

            elif type == "EndTag":
                name = token["name"]
                if name in rcdataElements:
                    in_cdata = False
                elif in_cdata:
                    self.serializeError(_("Unexpected child element of a CDATA element"))
                yield self.encodeStrict("</%s>" % name)

            elif type == "Comment":
                data = token["data"]
                if data.find("--") >= 0:
                    self.serializeError(_("Comment contains --"))
                yield self.encodeStrict("<!--%s-->" % token["data"])

            elif type == "Entity":
                name = token["name"]
                key = name + ";"
                if not key in entities:
                    self.serializeError(_("Entity %s not recognized" % name))
                if self.resolve_entities and key not in xmlEntities:
                    data = entities[key]
                else:
                    data = "&%s;" % name
                yield self.encodeStrict(data)

            else:
                self.serializeError(token["data"])

    def render(self, treewalker, encoding=None):
        if encoding:
            return b"".join(list(self.serialize(treewalker, encoding)))
        else:
            return "".join(list(self.serialize(treewalker)))

    def serializeError(self, data="XXX ERROR MESSAGE NEEDED"):
        # XXX The idea is to make data mandatory.
        self.errors.append(data)
        if self.strict:
            raise SerializeError


def SerializeError(Exception):
    """Error in serialized tree"""
    pass
site-packages/pip/_vendor/html5lib/utils.py000064400000004761151733463640014766 0ustar00from __future__ import absolute_import, division, unicode_literals

from types import ModuleType

try:
    import xml.etree.cElementTree as default_etree
except ImportError:
    import xml.etree.ElementTree as default_etree


__all__ = ["default_etree", "MethodDispatcher", "isSurrogatePair",
           "surrogatePairToCodepoint", "moduleFactoryFactory"]


class MethodDispatcher(dict):
    """Dict with 2 special properties:

    On initiation, keys that are lists, sets or tuples are converted to
    multiple keys so accessing any one of the items in the original
    list-like object returns the matching value

    md = MethodDispatcher({("foo", "bar"):"baz"})
    md["foo"] == "baz"

    A default value which can be set through the default attribute.
    """

    def __init__(self, items=()):
        # Using _dictEntries instead of directly assigning to self is about
        # twice as fast. Please do careful performance testing before changing
        # anything here.
        _dictEntries = []
        for name, value in items:
            if type(name) in (list, tuple, frozenset, set):
                for item in name:
                    _dictEntries.append((item, value))
            else:
                _dictEntries.append((name, value))
        dict.__init__(self, _dictEntries)
        self.default = None

    def __getitem__(self, key):
        return dict.get(self, key, self.default)


# Some utility functions to dal with weirdness around UCS2 vs UCS4
# python builds

def isSurrogatePair(data):
    return (len(data) == 2 and
            ord(data[0]) >= 0xD800 and ord(data[0]) <= 0xDBFF and
            ord(data[1]) >= 0xDC00 and ord(data[1]) <= 0xDFFF)


def surrogatePairToCodepoint(data):
    char_val = (0x10000 + (ord(data[0]) - 0xD800) * 0x400 +
                (ord(data[1]) - 0xDC00))
    return char_val

# Module Factory Factory (no, this isn't Java, I know)
# Here to stop this being duplicated all over the place.


def moduleFactoryFactory(factory):
    moduleCache = {}

    def moduleFactory(baseModule, *args, **kwargs):
        if isinstance(ModuleType.__name__, type("")):
            name = "_%s_factory" % baseModule.__name__
        else:
            name = b"_%s_factory" % baseModule.__name__

        if name in moduleCache:
            return moduleCache[name]
        else:
            mod = ModuleType(name)
            objs = factory(baseModule, *args, **kwargs)
            mod.__dict__.update(objs)
            moduleCache[name] = mod
            return mod

    return moduleFactory
site-packages/pip/_vendor/requests/compat.py000064400000004774151733463640015250 0ustar00# -*- coding: utf-8 -*-

"""
pythoncompat
"""

from .packages import chardet

import sys

# -------
# Pythons
# -------

# Syntax sugar.
_ver = sys.version_info

#: Python 2.x?
is_py2 = (_ver[0] == 2)

#: Python 3.x?
is_py3 = (_ver[0] == 3)

#: Python 3.0.x
is_py30 = (is_py3 and _ver[1] == 0)

#: Python 3.1.x
is_py31 = (is_py3 and _ver[1] == 1)

#: Python 3.2.x
is_py32 = (is_py3 and _ver[1] == 2)

#: Python 3.3.x
is_py33 = (is_py3 and _ver[1] == 3)

#: Python 3.4.x
is_py34 = (is_py3 and _ver[1] == 4)

#: Python 2.7.x
is_py27 = (is_py2 and _ver[1] == 7)

#: Python 2.6.x
is_py26 = (is_py2 and _ver[1] == 6)

#: Python 2.5.x
is_py25 = (is_py2 and _ver[1] == 5)

#: Python 2.4.x
is_py24 = (is_py2 and _ver[1] == 4)   # I'm assuming this is not by choice.


# ---------
# Platforms
# ---------


# Syntax sugar.
_ver = sys.version.lower()

is_pypy = ('pypy' in _ver)
is_jython = ('jython' in _ver)
is_ironpython = ('iron' in _ver)

# Assume CPython, if nothing else.
is_cpython = not any((is_pypy, is_jython, is_ironpython))

# Windows-based system.
is_windows = 'win32' in str(sys.platform).lower()

# Standard Linux 2+ system.
is_linux = ('linux' in str(sys.platform).lower())
is_osx = ('darwin' in str(sys.platform).lower())
is_hpux = ('hpux' in str(sys.platform).lower())   # Complete guess.
is_solaris = ('solar==' in str(sys.platform).lower())   # Complete guess.

try:
    import simplejson as json
except ImportError:
    import json

# ---------
# Specifics
# ---------

if is_py2:
    from urllib import quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, proxy_bypass
    from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag
    from urllib2 import parse_http_list
    import cookielib
    from Cookie import Morsel
    from StringIO import StringIO
    from .packages.urllib3.packages.ordered_dict import OrderedDict
    from httplib import IncompleteRead

    builtin_str = str
    bytes = str
    str = unicode
    basestring = basestring
    numeric_types = (int, long, float)


elif is_py3:
    from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag
    from urllib.request import parse_http_list, getproxies, proxy_bypass
    from http import cookiejar as cookielib
    from http.cookies import Morsel
    from io import StringIO
    from collections import OrderedDict
    from http.client import IncompleteRead

    builtin_str = str
    str = str
    bytes = bytes
    basestring = (str, bytes)
    numeric_types = (int, float)
site-packages/pip/_vendor/requests/certs.py000064400000001040151733463640015064 0ustar00#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
certs.py
~~~~~~~~

This module returns the preferred default CA certificate bundle.

If you are packaging Requests, e.g., for a Linux distribution or a managed
environment, you can change the definition of where() to return a separately
packaged CA bundle.
"""

import os.path


def where():
    """Return the preferred certificate bundle."""
    # vendored bundle inside Requests
    return os.path.join(os.path.dirname(__file__), 'cacert.pem')

if __name__ == '__main__':
    print(where())
site-packages/pip/_vendor/requests/models.py000064400000063504151733463640015244 0ustar00# -*- coding: utf-8 -*-

"""
requests.models
~~~~~~~~~~~~~~~

This module contains the primary objects that power Requests.
"""

import collections
import datetime

from io import BytesIO, UnsupportedOperation
from .hooks import default_hooks
from .structures import CaseInsensitiveDict

from .auth import HTTPBasicAuth
from .cookies import cookiejar_from_dict, get_cookie_header
from .packages.urllib3.fields import RequestField
from .packages.urllib3.filepost import encode_multipart_formdata
from .packages.urllib3.util import parse_url
from .packages.urllib3.exceptions import DecodeError
from .exceptions import (
    HTTPError, RequestException, MissingSchema, InvalidURL,
    ChunkedEncodingError, ContentDecodingError)
from .utils import (
    guess_filename, get_auth_from_url, requote_uri,
    stream_decode_response_unicode, to_key_val_list, parse_header_links,
    iter_slices, guess_json_utf, super_len, to_native_string)
from .compat import (
    cookielib, urlunparse, urlsplit, urlencode, str, bytes, StringIO,
    is_py2, chardet, json, builtin_str, basestring, IncompleteRead)
from .status_codes import codes

#: The set of HTTP status codes that indicate an automatically
#: processable redirect.
REDIRECT_STATI = (
    codes.moved,  # 301
    codes.found,  # 302
    codes.other,  # 303
    codes.temporary_moved,  # 307
)
DEFAULT_REDIRECT_LIMIT = 30
CONTENT_CHUNK_SIZE = 10 * 1024
ITER_CHUNK_SIZE = 512


class RequestEncodingMixin(object):
    @property
    def path_url(self):
        """Build the path URL to use."""

        url = []

        p = urlsplit(self.url)

        path = p.path
        if not path:
            path = '/'

        url.append(path)

        query = p.query
        if query:
            url.append('?')
            url.append(query)

        return ''.join(url)

    @staticmethod
    def _encode_params(data):
        """Encode parameters in a piece of data.

        Will successfully encode parameters when passed as a dict or a list of
        2-tuples. Order is retained if data is a list of 2-tuples but arbitrary
        if parameters are supplied as a dict.
        """

        if isinstance(data, (str, bytes)):
            return data
        elif hasattr(data, 'read'):
            return data
        elif hasattr(data, '__iter__'):
            result = []
            for k, vs in to_key_val_list(data):
                if isinstance(vs, basestring) or not hasattr(vs, '__iter__'):
                    vs = [vs]
                for v in vs:
                    if v is not None:
                        result.append(
                            (k.encode('utf-8') if isinstance(k, str) else k,
                             v.encode('utf-8') if isinstance(v, str) else v))
            return urlencode(result, doseq=True)
        else:
            return data

    @staticmethod
    def _encode_files(files, data):
        """Build the body for a multipart/form-data request.

        Will successfully encode files when passed as a dict or a list of
        2-tuples. Order is retained if data is a list of 2-tuples but arbitrary
        if parameters are supplied as a dict.

        """
        if (not files):
            raise ValueError("Files must be provided.")
        elif isinstance(data, basestring):
            raise ValueError("Data must not be a string.")

        new_fields = []
        fields = to_key_val_list(data or {})
        files = to_key_val_list(files or {})

        for field, val in fields:
            if isinstance(val, basestring) or not hasattr(val, '__iter__'):
                val = [val]
            for v in val:
                if v is not None:
                    # Don't call str() on bytestrings: in Py3 it all goes wrong.
                    if not isinstance(v, bytes):
                        v = str(v)

                    new_fields.append(
                        (field.decode('utf-8') if isinstance(field, bytes) else field,
                         v.encode('utf-8') if isinstance(v, str) else v))

        for (k, v) in files:
            # support for explicit filename
            ft = None
            fh = None
            if isinstance(v, (tuple, list)):
                if len(v) == 2:
                    fn, fp = v
                elif len(v) == 3:
                    fn, fp, ft = v
                else:
                    fn, fp, ft, fh = v
            else:
                fn = guess_filename(v) or k
                fp = v
            if isinstance(fp, str):
                fp = StringIO(fp)
            if isinstance(fp, bytes):
                fp = BytesIO(fp)

            rf = RequestField(name=k, data=fp.read(),
                              filename=fn, headers=fh)
            rf.make_multipart(content_type=ft)
            new_fields.append(rf)

        body, content_type = encode_multipart_formdata(new_fields)

        return body, content_type


class RequestHooksMixin(object):
    def register_hook(self, event, hook):
        """Properly register a hook."""

        if event not in self.hooks:
            raise ValueError('Unsupported event specified, with event name "%s"' % (event))

        if isinstance(hook, collections.Callable):
            self.hooks[event].append(hook)
        elif hasattr(hook, '__iter__'):
            self.hooks[event].extend(h for h in hook if isinstance(h, collections.Callable))

    def deregister_hook(self, event, hook):
        """Deregister a previously registered hook.
        Returns True if the hook existed, False if not.
        """

        try:
            self.hooks[event].remove(hook)
            return True
        except ValueError:
            return False


class Request(RequestHooksMixin):
    """A user-created :class:`Request <Request>` object.

    Used to prepare a :class:`PreparedRequest <PreparedRequest>`, which is sent to the server.

    :param method: HTTP method to use.
    :param url: URL to send.
    :param headers: dictionary of headers to send.
    :param files: dictionary of {filename: fileobject} files to multipart upload.
    :param data: the body to attach the request. If a dictionary is provided, form-encoding will take place.
    :param params: dictionary of URL parameters to append to the URL.
    :param auth: Auth handler or (user, pass) tuple.
    :param cookies: dictionary or CookieJar of cookies to attach to this request.
    :param hooks: dictionary of callback hooks, for internal usage.

    Usage::

      >>> import requests
      >>> req = requests.Request('GET', 'http://httpbin.org/get')
      >>> req.prepare()
      <PreparedRequest [GET]>

    """
    def __init__(self,
        method=None,
        url=None,
        headers=None,
        files=None,
        data=None,
        params=None,
        auth=None,
        cookies=None,
        hooks=None):

        # Default empty dicts for dict params.
        data = [] if data is None else data
        files = [] if files is None else files
        headers = {} if headers is None else headers
        params = {} if params is None else params
        hooks = {} if hooks is None else hooks

        self.hooks = default_hooks()
        for (k, v) in list(hooks.items()):
            self.register_hook(event=k, hook=v)

        self.method = method
        self.url = url
        self.headers = headers
        self.files = files
        self.data = data
        self.params = params
        self.auth = auth
        self.cookies = cookies

    def __repr__(self):
        return '<Request [%s]>' % (self.method)

    def prepare(self):
        """Constructs a :class:`PreparedRequest <PreparedRequest>` for transmission and returns it."""
        p = PreparedRequest()
        p.prepare(
            method=self.method,
            url=self.url,
            headers=self.headers,
            files=self.files,
            data=self.data,
            params=self.params,
            auth=self.auth,
            cookies=self.cookies,
            hooks=self.hooks,
        )
        return p


class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
    """The fully mutable :class:`PreparedRequest <PreparedRequest>` object,
    containing the exact bytes that will be sent to the server.

    Generated from either a :class:`Request <Request>` object or manually.

    Usage::

      >>> import requests
      >>> req = requests.Request('GET', 'http://httpbin.org/get')
      >>> r = req.prepare()
      <PreparedRequest [GET]>

      >>> s = requests.Session()
      >>> s.send(r)
      <Response [200]>

    """

    def __init__(self):
        #: HTTP verb to send to the server.
        self.method = None
        #: HTTP URL to send the request to.
        self.url = None
        #: dictionary of HTTP headers.
        self.headers = None
        # The `CookieJar` used to create the Cookie header will be stored here
        # after prepare_cookies is called
        self._cookies = None
        #: request body to send to the server.
        self.body = None
        #: dictionary of callback hooks, for internal usage.
        self.hooks = default_hooks()

    def prepare(self, method=None, url=None, headers=None, files=None,
                data=None, params=None, auth=None, cookies=None, hooks=None):
        """Prepares the entire request with the given parameters."""

        self.prepare_method(method)
        self.prepare_url(url, params)
        self.prepare_headers(headers)
        self.prepare_cookies(cookies)
        self.prepare_body(data, files)
        self.prepare_auth(auth, url)
        # Note that prepare_auth must be last to enable authentication schemes
        # such as OAuth to work on a fully prepared request.

        # This MUST go after prepare_auth. Authenticators could add a hook
        self.prepare_hooks(hooks)

    def __repr__(self):
        return '<PreparedRequest [%s]>' % (self.method)

    def copy(self):
        p = PreparedRequest()
        p.method = self.method
        p.url = self.url
        p.headers = self.headers.copy()
        p._cookies = self._cookies.copy()
        p.body = self.body
        p.hooks = self.hooks
        return p

    def prepare_method(self, method):
        """Prepares the given HTTP method."""
        self.method = method
        if self.method is not None:
            self.method = self.method.upper()

    def prepare_url(self, url, params):
        """Prepares the given HTTP URL."""
        #: Accept objects that have string representations.
        try:
            url = unicode(url)
        except NameError:
            # We're on Python 3.
            url = str(url)
        except UnicodeDecodeError:
            pass

        # Don't do any URL preparation for oddball schemes
        if ':' in url and not url.lower().startswith('http'):
            self.url = url
            return

        # Support for unicode domain names and paths.
        scheme, auth, host, port, path, query, fragment = parse_url(url)

        if not scheme:
            raise MissingSchema("Invalid URL {0!r}: No schema supplied. "
                                "Perhaps you meant http://{0}?".format(url))

        if not host:
            raise InvalidURL("Invalid URL %r: No host supplied" % url)

        # Only want to apply IDNA to the hostname
        try:
            host = host.encode('idna').decode('utf-8')
        except UnicodeError:
            raise InvalidURL('URL has an invalid label.')

        # Carefully reconstruct the network location
        netloc = auth or ''
        if netloc:
            netloc += '@'
        netloc += host
        if port:
            netloc += ':' + str(port)

        # Bare domains aren't valid URLs.
        if not path:
            path = '/'

        if is_py2:
            if isinstance(scheme, str):
                scheme = scheme.encode('utf-8')
            if isinstance(netloc, str):
                netloc = netloc.encode('utf-8')
            if isinstance(path, str):
                path = path.encode('utf-8')
            if isinstance(query, str):
                query = query.encode('utf-8')
            if isinstance(fragment, str):
                fragment = fragment.encode('utf-8')

        enc_params = self._encode_params(params)
        if enc_params:
            if query:
                query = '%s&%s' % (query, enc_params)
            else:
                query = enc_params

        url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment]))
        self.url = url

    def prepare_headers(self, headers):
        """Prepares the given HTTP headers."""

        if headers:
            self.headers = CaseInsensitiveDict((to_native_string(name), value) for name, value in headers.items())
        else:
            self.headers = CaseInsensitiveDict()

    def prepare_body(self, data, files):
        """Prepares the given HTTP body data."""

        # Check if file, fo, generator, iterator.
        # If not, run through normal process.

        # Nottin' on you.
        body = None
        content_type = None
        length = None

        is_stream = all([
            hasattr(data, '__iter__'),
            not isinstance(data, (basestring, list, tuple, dict))
        ])

        try:
            length = super_len(data)
        except (TypeError, AttributeError, UnsupportedOperation):
            length = None

        if is_stream:
            body = data

            if files:
                raise NotImplementedError('Streamed bodies and files are mutually exclusive.')

            if length is not None:
                self.headers['Content-Length'] = builtin_str(length)
            else:
                self.headers['Transfer-Encoding'] = 'chunked'
        else:
            # Multi-part file uploads.
            if files:
                (body, content_type) = self._encode_files(files, data)
            else:
                if data:
                    body = self._encode_params(data)
                    if isinstance(data, str) or isinstance(data, builtin_str) or hasattr(data, 'read'):
                        content_type = None
                    else:
                        content_type = 'application/x-www-form-urlencoded'

            self.prepare_content_length(body)

            # Add content-type if it wasn't explicitly provided.
            if (content_type) and (not 'content-type' in self.headers):
                self.headers['Content-Type'] = content_type

        self.body = body

    def prepare_content_length(self, body):
        if hasattr(body, 'seek') and hasattr(body, 'tell'):
            body.seek(0, 2)
            self.headers['Content-Length'] = builtin_str(body.tell())
            body.seek(0, 0)
        elif body is not None:
            l = super_len(body)
            if l:
                self.headers['Content-Length'] = builtin_str(l)
        elif self.method not in ('GET', 'HEAD'):
            self.headers['Content-Length'] = '0'

    def prepare_auth(self, auth, url=''):
        """Prepares the given HTTP auth data."""

        # If no Auth is explicitly provided, extract it from the URL first.
        if auth is None:
            url_auth = get_auth_from_url(self.url)
            auth = url_auth if any(url_auth) else None

        if auth:
            if isinstance(auth, tuple) and len(auth) == 2:
                # special-case basic HTTP auth
                auth = HTTPBasicAuth(*auth)

            # Allow auth to make its changes.
            r = auth(self)

            # Update self to reflect the auth changes.
            self.__dict__.update(r.__dict__)

            # Recompute Content-Length
            self.prepare_content_length(self.body)

    def prepare_cookies(self, cookies):
        """Prepares the given HTTP cookie data."""

        if isinstance(cookies, cookielib.CookieJar):
            self._cookies = cookies
        else:
            self._cookies = cookiejar_from_dict(cookies)

        cookie_header = get_cookie_header(self._cookies, self)
        if cookie_header is not None:
            self.headers['Cookie'] = cookie_header

    def prepare_hooks(self, hooks):
        """Prepares the given hooks."""
        for event in hooks:
            self.register_hook(event, hooks[event])


class Response(object):
    """The :class:`Response <Response>` object, which contains a
    server's response to an HTTP request.
    """

    __attrs__ = [
        '_content',
        'status_code',
        'headers',
        'url',
        'history',
        'encoding',
        'reason',
        'cookies',
        'elapsed',
        'request',
    ]

    def __init__(self):
        super(Response, self).__init__()

        self._content = False
        self._content_consumed = False

        #: Integer Code of responded HTTP Status, e.g. 404 or 200.
        self.status_code = None

        #: Case-insensitive Dictionary of Response Headers.
        #: For example, ``headers['content-encoding']`` will return the
        #: value of a ``'Content-Encoding'`` response header.
        self.headers = CaseInsensitiveDict()

        #: File-like object representation of response (for advanced usage).
        #: Use of ``raw`` requires that ``stream=True`` be set on the request.
        # This requirement does not apply for use internally to Requests.
        self.raw = None

        #: Final URL location of Response.
        self.url = None

        #: Encoding to decode with when accessing r.text.
        self.encoding = None

        #: A list of :class:`Response <Response>` objects from
        #: the history of the Request. Any redirect responses will end
        #: up here. The list is sorted from the oldest to the most recent request.
        self.history = []

        #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK".
        self.reason = None

        #: A CookieJar of Cookies the server sent back.
        self.cookies = cookiejar_from_dict({})

        #: The amount of time elapsed between sending the request
        #: and the arrival of the response (as a timedelta)
        self.elapsed = datetime.timedelta(0)

    def __getstate__(self):
        # Consume everything; accessing the content attribute makes
        # sure the content has been fully read.
        if not self._content_consumed:
            self.content

        return dict(
            (attr, getattr(self, attr, None))
            for attr in self.__attrs__
        )

    def __setstate__(self, state):
        for name, value in state.items():
            setattr(self, name, value)

        # pickled objects do not have .raw
        setattr(self, '_content_consumed', True)
        setattr(self, 'raw', None)

    def __repr__(self):
        return '<Response [%s]>' % (self.status_code)

    def __bool__(self):
        """Returns true if :attr:`status_code` is 'OK'."""
        return self.ok

    def __nonzero__(self):
        """Returns true if :attr:`status_code` is 'OK'."""
        return self.ok

    def __iter__(self):
        """Allows you to use a response as an iterator."""
        return self.iter_content(128)

    @property
    def ok(self):
        try:
            self.raise_for_status()
        except RequestException:
            return False
        return True

    @property
    def is_redirect(self):
        """True if this Response is a well-formed HTTP redirect that could have
        been processed automatically (by :meth:`Session.resolve_redirects`).
        """
        return ('location' in self.headers and self.status_code in REDIRECT_STATI)

    @property
    def apparent_encoding(self):
        """The apparent encoding, provided by the chardet library"""
        return chardet.detect(self.content)['encoding']

    def iter_content(self, chunk_size=1, decode_unicode=False):
        """Iterates over the response data.  When stream=True is set on the
        request, this avoids reading the content at once into memory for
        large responses.  The chunk size is the number of bytes it should
        read into memory.  This is not necessarily the length of each item
        returned as decoding can take place.

        If decode_unicode is True, content will be decoded using the best
        available encoding based on the response.
        """
        def generate():
            try:
                # Special case for urllib3.
                try:
                    for chunk in self.raw.stream(chunk_size, decode_content=True):
                        yield chunk
                except IncompleteRead as e:
                    raise ChunkedEncodingError(e)
                except DecodeError as e:
                    raise ContentDecodingError(e)
            except AttributeError:
                # Standard file-like object.
                while True:
                    chunk = self.raw.read(chunk_size)
                    if not chunk:
                        break
                    yield chunk

            self._content_consumed = True

        # simulate reading small chunks of the content
        reused_chunks = iter_slices(self._content, chunk_size)

        stream_chunks = generate()

        chunks = reused_chunks if self._content_consumed else stream_chunks

        if decode_unicode:
            chunks = stream_decode_response_unicode(chunks, self)

        return chunks

    def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None):
        """Iterates over the response data, one line at a time.  When
        stream=True is set on the request, this avoids reading the
        content at once into memory for large responses.
        """

        pending = None

        for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode):

            if pending is not None:
                chunk = pending + chunk
            lines = chunk.splitlines()

            if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]:
                pending = lines.pop()
            else:
                pending = None

            for line in lines:
                yield line

        if pending is not None:
            yield pending

    @property
    def content(self):
        """Content of the response, in bytes."""

        if self._content is False:
            # Read the contents.
            try:
                if self._content_consumed:
                    raise RuntimeError(
                        'The content for this response was already consumed')

                if self.status_code == 0:
                    self._content = None
                else:
                    self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes()

            except AttributeError:
                self._content = None

        self._content_consumed = True
        # don't need to release the connection; that's been handled by urllib3
        # since we exhausted the data.
        return self._content

    @property
    def text(self):
        """Content of the response, in unicode.

        If Response.encoding is None, encoding will be guessed using
        ``chardet``.

        The encoding of the response content is determined based solely on HTTP
        headers, following RFC 2616 to the letter. If you can take advantage of
        non-HTTP knowledge to make a better guess at the encoding, you should
        set ``r.encoding`` appropriately before accessing this property.
        """

        # Try charset from content-type
        content = None
        encoding = self.encoding

        if not self.content:
            return str('')

        # Fallback to auto-detected encoding.
        if self.encoding is None:
            encoding = self.apparent_encoding

        # Decode unicode from given encoding.
        try:
            content = str(self.content, encoding, errors='replace')
        except (LookupError, TypeError):
            # A LookupError is raised if the encoding was not found which could
            # indicate a misspelling or similar mistake.
            #
            # A TypeError can be raised if encoding is None
            #
            # So we try blindly encoding.
            content = str(self.content, errors='replace')

        return content

    def json(self, **kwargs):
        """Returns the json-encoded content of a response, if any.

        :param \*\*kwargs: Optional arguments that ``json.loads`` takes.
        """

        if not self.encoding and len(self.content) > 3:
            # No encoding set. JSON RFC 4627 section 3 states we should expect
            # UTF-8, -16 or -32. Detect which one to use; If the detection or
            # decoding fails, fall back to `self.text` (using chardet to make
            # a best guess).
            encoding = guess_json_utf(self.content)
            if encoding is not None:
                try:
                    return json.loads(self.content.decode(encoding), **kwargs)
                except UnicodeDecodeError:
                    # Wrong UTF codec detected; usually because it's not UTF-8
                    # but some other 8-bit codec.  This is an RFC violation,
                    # and the server didn't bother to tell us what codec *was*
                    # used.
                    pass
        return json.loads(self.text, **kwargs)

    @property
    def links(self):
        """Returns the parsed header links of the response, if any."""

        header = self.headers.get('link')

        # l = MultiDict()
        l = {}

        if header:
            links = parse_header_links(header)

            for link in links:
                key = link.get('rel') or link.get('url')
                l[key] = link

        return l

    def raise_for_status(self):
        """Raises stored :class:`HTTPError`, if one occurred."""

        http_error_msg = ''

        if 400 <= self.status_code < 500:
            http_error_msg = '%s Client Error: %s' % (self.status_code, self.reason)

        elif 500 <= self.status_code < 600:
            http_error_msg = '%s Server Error: %s' % (self.status_code, self.reason)

        if http_error_msg:
            raise HTTPError(http_error_msg, response=self)

    def close(self):
        """Releases the connection back to the pool. Once this method has been
        called the underlying ``raw`` object must not be accessed again.

        *Note: Should not normally need to be called explicitly.*
        """
        return self.raw.release_conn()
site-packages/pip/_vendor/requests/__pycache__/structures.cpython-33.pyc000064400000017521151733463640022463 0ustar00�
7�Re�
c@swdZddlZddlZddlmZGdd�de�ZGdd�dej�ZGdd	�d	e	�Z
dS(
uP
requests.structures
~~~~~~~~~~~~~~~~~~~

Data structures that power Requests.

iN(uislicecBsJ|EeZdZdZdd�Zdd�Zdd�Zdd	�Zd
S(u
IteratorProxyudocstring for IteratorProxycCs
||_dS(N(ui(uselfui((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyu__init__suIteratorProxy.__init__cCs|jS(N(ui(uself((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyu__iter__suIteratorProxy.__iter__cCsjt|jd�rt|j�St|jd�r;|jjSt|jd�rftj|jj��jSdS(Nu__len__ulenufileno(uhasattruiulenuosufstatufilenoust_size(uself((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyu__len__s

uIteratorProxy.__len__cCsdjt|jd|��S(Nu(ujoinuisliceuiuNone(uselfun((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyuread!suIteratorProxy.readN(u__name__u
__module__u__qualname__u__doc__u__init__u__iter__u__len__uread(u
__locals__((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyu
IteratorProxys
u
IteratorProxycBs�|EeZdZdZddd�Zdd�Zdd�Zdd	�Zd
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dd�ZdS(uCaseInsensitiveDictu�
    A case-insensitive ``dict``-like object.

    Implements all methods and operations of
    ``collections.MutableMapping`` as well as dict's ``copy``. Also
    provides ``lower_items``.

    All keys are expected to be strings. The structure remembers the
    case of the last key to be set, and ``iter(instance)``,
    ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()``
    will contain case-sensitive keys. However, querying and contains
    testing is case insensitive:

        cid = CaseInsensitiveDict()
        cid['Accept'] = 'application/json'
        cid['aCCEPT'] == 'application/json'  # True
        list(cid) == ['Accept']  # True

    For example, ``headers['content-encoding']`` will return the
    value of a ``'Content-Encoding'`` response header, regardless
    of how the header name was originally stored.

    If the constructor, ``.update``, or equality comparison
    operations are given keys that have equal ``.lower()``s, the
    behavior is undefined.

    cKs5t�|_|dkr!i}n|j||�dS(N(udictu_storeuNoneuupdate(uselfudataukwargs((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyu__init__As	uCaseInsensitiveDict.__init__cCs||f|j|j�<dS(N(u_storeulower(uselfukeyuvalue((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyu__setitem__GsuCaseInsensitiveDict.__setitem__cCs|j|j�dS(Ni(u_storeulower(uselfukey((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyu__getitem__LsuCaseInsensitiveDict.__getitem__cCs|j|j�=dS(N(u_storeulower(uselfukey((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyu__delitem__OsuCaseInsensitiveDict.__delitem__cCsdd�|jj�D�S(Ncss|]\}}|VqdS(N((u.0ucasedkeyumappedvalue((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyu	<genexpr>Ssu/CaseInsensitiveDict.__iter__.<locals>.<genexpr>(u_storeuvalues(uself((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyu__iter__RsuCaseInsensitiveDict.__iter__cCs
t|j�S(N(ulenu_store(uself((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyu__len__UsuCaseInsensitiveDict.__len__cCsdd�|jj�D�S(u.Like iteritems(), but with all lowercase keys.css%|]\}}||dfVqdS(iN((u.0ulowerkeyukeyval((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyu	<genexpr>[su2CaseInsensitiveDict.lower_items.<locals>.<genexpr>(u_storeuitems(uself((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyulower_itemsXs	uCaseInsensitiveDict.lower_itemscCsGt|tj�r!t|�}ntSt|j��t|j��kS(N(u
isinstanceucollectionsuMappinguCaseInsensitiveDictuNotImplementedudictulower_items(uselfuother((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyu__eq__`suCaseInsensitiveDict.__eq__cCst|jj��S(N(uCaseInsensitiveDictu_storeuvalues(uself((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyucopyisuCaseInsensitiveDict.copycCstt|j���S(N(ustrudictuitems(uself((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyu__repr__lsuCaseInsensitiveDict.__repr__N(u__name__u
__module__u__qualname__u__doc__uNoneu__init__u__setitem__u__getitem__u__delitem__u__iter__u__len__ulower_itemsu__eq__ucopyu__repr__(u
__locals__((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyuCaseInsensitiveDict%s	uCaseInsensitiveDictcsV|EeZdZdZd
�fdd�Zdd�Zdd�Zd
dd	�Z�S(u
LookupDictuDictionary lookup object.cs ||_tt|�j�dS(N(unameusuperu
LookupDictu__init__(uselfuname(u	__class__(u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyu__init__rs	uLookupDict.__init__cCsd|jS(Nu
<lookup '%s'>(uname(uself((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyu__repr__vsuLookupDict.__repr__cCs|jj|d�S(N(u__dict__ugetuNone(uselfukey((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyu__getitem__ysuLookupDict.__getitem__cCs|jj||�S(N(u__dict__uget(uselfukeyudefault((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyuget~suLookupDict.getN(	u__name__u
__module__u__qualname__u__doc__uNoneu__init__u__repr__u__getitem__uget(u
__locals__((u	__class__u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyu
LookupDictos
u
LookupDict(u__doc__uosucollectionsu	itertoolsuisliceuobjectu
IteratorProxyuMutableMappinguCaseInsensitiveDictudictu
LookupDict(((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/structures.pyu<module>	sJsite-packages/pip/_vendor/requests/__pycache__/compat.cpython-33.pyc000064400000005501151733463640021516 0ustar00�
7�Re�	c@s�dZddlmZddlZejZeddkZeddkZeo^eddkZeoteddkZ	eo�eddkZ
eo�eddkZeo�eddkZeo�eddkZ
eo�edd	kZeo�edd
kZeoeddkZejj�ZdekZdekZd
ekZeeeef�Zdeej�j�kZdeej�j�kZdeej�j�kZdeej�j�kZdeej�j�kZyddlZ Wne!k
rddl Z YnXer�ddl"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)ddl*m*Z*m+Z+m,Z,m-Z-m.Z.ddl/m0Z0ddl1Z1ddl2m3Z3ddl4m4Z4ddl5m6Z6ddl7m8Z8eZ9eZ:e;Ze<Z<e=e>e?fZ@n�er�ddlAm*Z*m+Z+m,Z,m-Z-m'Z'm#Z#m$Z$m%Z%m&Z&m.Z.ddlBm0Z0m(Z(m)Z)ddlCmDZ1ddlEm3Z3ddlFm4Z4ddlGm6Z6ddlHm8Z8eZ9eZe:Z:ee:fZ<e=e?fZ@ndS(u
pythoncompat
i(uchardetiNiiiiiiupypyujythonuironuwin32ulinuxudarwinuhpuxusolar==(uquoteuunquoteu
quote_plusuunquote_plusu	urlencodeu
getproxiesuproxy_bypass(uurlparseu
urlunparseuurljoinuurlsplitu	urldefrag(uparse_http_list(uMorsel(uStringIO(uOrderedDict(uIncompleteRead(
uurlparseu
urlunparseuurljoinuurlsplitu	urlencodeuquoteuunquoteu
quote_plusuunquote_plusu	urldefrag(uparse_http_listu
getproxiesuproxy_bypass(u	cookiejar(Iu__doc__upackagesuchardetusysuversion_infou_veruis_py2uis_py3uis_py30uis_py31uis_py32uis_py33uis_py34uis_py27uis_py26uis_py25uis_py24uversionuloweruis_pypyu	is_jythonu
is_ironpythonuanyu
is_cpythonustruplatformu
is_windowsuis_linuxuis_osxuis_hpuxu
is_solarisu
simplejsonujsonuImportErroruurllibuquoteuunquoteu
quote_plusuunquote_plusu	urlencodeu
getproxiesuproxy_bypassuurlparseu
urlunparseuurljoinuurlsplitu	urldefraguurllib2uparse_http_listu	cookielibuCookieuMorseluStringIOu&packages.urllib3.packages.ordered_dictuOrderedDictuhttplibuIncompleteReadubuiltin_strubytesuunicodeu
basestringuintulongufloatu
numeric_typesuurllib.parseuurllib.requestuhttpu	cookiejaruhttp.cookiesuioucollectionsuhttp.client(((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/compat.pyu<module>sn		
4(Fsite-packages/pip/_vendor/requests/__pycache__/api.cpython-33.pyc000064400000013124151733463640021004 0ustar00�
7�Re�c@s�dZddlmZdd�Zdd�Zdd�Zd	d
�Zddd�Zdd
d�Z	ddd�Z
dd�ZdS(u�
requests.api
~~~~~~~~~~~~

This module implements the Requests API.

:copyright: (c) 2012 by Kenneth Reitz.
:license: Apache2, see LICENSE for more details.

i(usessionscKs%tj�}|jd|d||�S(u%Constructs and sends a :class:`Request <Request>`.
    Returns :class:`Response <Response>` object.

    :param method: method for the new :class:`Request` object.
    :param url: URL for the new :class:`Request` object.
    :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
    :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`.
    :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`.
    :param files: (optional) Dictionary of 'name': file-like-objects (or {'name': ('filename', fileobj)}) for multipart encoding upload.
    :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth.
    :param timeout: (optional) Float describing the timeout of the request in seconds.
    :param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
    :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy.
    :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided.
    :param stream: (optional) if ``False``, the response content will be immediately downloaded.
    :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair.

    Usage::

      >>> import requests
      >>> req = requests.request('GET', 'http://httpbin.org/get')
      <Response [200]>
    umethoduurl(usessionsuSessionurequest(umethoduurlukwargsusession((u1/tmp/pip-zej_zi-build/pip/_vendor/requests/api.pyurequestsurequestcKs |jdd�td||�S(u�Sends a GET request. Returns :class:`Response` object.

    :param url: URL for the new :class:`Request` object.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    uallow_redirectsugetT(u
setdefaultuTrueurequest(uurlukwargs((u1/tmp/pip-zej_zi-build/pip/_vendor/requests/api.pyuget/sugetcKs |jdd�td||�S(u�Sends a OPTIONS request. Returns :class:`Response` object.

    :param url: URL for the new :class:`Request` object.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    uallow_redirectsuoptionsT(u
setdefaultuTrueurequest(uurlukwargs((u1/tmp/pip-zej_zi-build/pip/_vendor/requests/api.pyuoptions:suoptionscKs |jdd�td||�S(u�Sends a HEAD request. Returns :class:`Response` object.

    :param url: URL for the new :class:`Request` object.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    uallow_redirectsuheadF(u
setdefaultuFalseurequest(uurlukwargs((u1/tmp/pip-zej_zi-build/pip/_vendor/requests/api.pyuheadEsuheadcKstd|d||�S(u(Sends a POST request. Returns :class:`Response` object.

    :param url: URL for the new :class:`Request` object.
    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    upostudata(urequest(uurludataukwargs((u1/tmp/pip-zej_zi-build/pip/_vendor/requests/api.pyupostPsupostcKstd|d||�S(u'Sends a PUT request. Returns :class:`Response` object.

    :param url: URL for the new :class:`Request` object.
    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    uputudata(urequest(uurludataukwargs((u1/tmp/pip-zej_zi-build/pip/_vendor/requests/api.pyuput[suputcKstd|d||�S(u)Sends a PATCH request. Returns :class:`Response` object.

    :param url: URL for the new :class:`Request` object.
    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    upatchudata(urequest(uurludataukwargs((u1/tmp/pip-zej_zi-build/pip/_vendor/requests/api.pyupatchfsupatchcKstd||�S(u�Sends a DELETE request. Returns :class:`Response` object.

    :param url: URL for the new :class:`Request` object.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    udelete(urequest(uurlukwargs((u1/tmp/pip-zej_zi-build/pip/_vendor/requests/api.pyudeleteqsudeleteN(u__doc__uusessionsurequestugetuoptionsuheaduNoneupostuputupatchudelete(((u1/tmp/pip-zej_zi-build/pip/_vendor/requests/api.pyu<module>ssite-packages/pip/_vendor/requests/__pycache__/__init__.cpython-33.pyc000064400000005425151733463650022000 0ustar00�
7�Re@c@s�dZdZdZdZdZdZdZyddlmZej	�Wne
k
r\YnXdd	lmZdd
l
mZmZmZddlmZmZmZmZmZmZmZmZddlmZmZdd
lmZddlm Z m!Z!m"Z"m#Z#m$Z$m%Z%ddl&Z&yddl&m'Z'Wn+e
k
rdGdd�de&j(�Z'YnXe&j)e*�j+e'��dS(u�
requests HTTP library
~~~~~~~~~~~~~~~~~~~~~

Requests is an HTTP library, written in Python, for human beings. Basic GET
usage:

   >>> import requests
   >>> r = requests.get('http://python.org')
   >>> r.status_code
   200
   >>> 'Python is a programming language' in r.content
   True

... or POST:

   >>> payload = dict(key1='value1', key2='value2')
   >>> r = requests.post("http://httpbin.org/post", data=payload)
   >>> print(r.text)
   {
     ...
     "form": {
       "key2": "value2",
       "key1": "value1"
     },
     ...
   }

The other HTTP methods are supported - see `requests.api`. Full documentation
is at <http://python-requests.org>.

:copyright: (c) 2014 by Kenneth Reitz.
:license: Apache 2.0, see LICENSE for more details.

urequestsu2.3.0iu
Kenneth Reitzu
Apache 2.0uCopyright 2014 Kenneth Reitzi(u	pyopenssl(uutils(uRequestuResponseuPreparedRequest(urequestugetuheadupostupatchuputudeleteuoptions(usessionuSession(ucodes(uRequestExceptionuTimeoutuURLRequireduTooManyRedirectsu	HTTPErroruConnectionErroriN(uNullHandlercBs |EeZdZdd�ZdS(uNullHandlercCsdS(N((uselfurecord((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/__init__.pyuemitJsuNullHandler.emitN(u__name__u
__module__u__qualname__uemit(u
__locals__((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/__init__.pyuNullHandlerIsuNullHandler(,u__doc__u	__title__u__version__u	__build__u
__author__u__license__u
__copyright__upackages.urllib3.contribu	pyopenssluinject_into_urllib3uImportErroruuutilsumodelsuRequestuResponseuPreparedRequestuapiurequestugetuheadupostupatchuputudeleteuoptionsusessionsusessionuSessionustatus_codesucodesu
exceptionsuRequestExceptionuTimeoutuURLRequireduTooManyRedirectsu	HTTPErroruConnectionErrorulogginguNullHandleruHandleru	getLoggeru__name__u
addHandler(((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/__init__.pyu<module>*s.
:.
site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-33.pyc000064400000040042151733463650022036 0ustar00�
7�Re9c@s�dZddlZddlmZddlmZmZddlmZddl	m
Zddlm
Z
mZmZmZdd	lmZmZmZmZdd
lmZddlmZddlmZdd
lmZddlmZddlmZ ddl!m"Z"ddl#m$Z$m
Z
mZmZddl%m&Z&dZ(dZ)dZ*Gdd�de+�Z,Gdd�de,�Z-dS(u�
requests.adapters
~~~~~~~~~~~~~~~~~

This module contains the transport adapters that Requests uses to define
and maintain connections.
iNi(uResponse(uPoolManageruproxy_from_url(uHTTPResponse(uTimeout(uurlparseu
basestringu	urldefraguunquote(uDEFAULT_CA_BUNDLE_PATHuget_encoding_from_headersuprepend_scheme_if_neededuget_auth_from_url(uCaseInsensitiveDict(u
MaxRetryError(uTimeoutError(uSSLError(u	HTTPError(u
ProxyError(uextract_cookies_to_jar(uConnectionErroruTimeoutuSSLErroru
ProxyError(u_basic_auth_stri
csD|EeZdZdZ�fdd�Zdd�Zdd�Z�S(uBaseAdapteruThe Base Transport Adaptercstt|�j�dS(N(usuperuBaseAdapteru__init__(uself(u	__class__(u6/tmp/pip-zej_zi-build/pip/_vendor/requests/adapters.pyu__init__&suBaseAdapter.__init__cCs
t�dS(N(uNotImplementedError(uself((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/adapters.pyusend)suBaseAdapter.sendcCs
t�dS(N(uNotImplementedError(uself((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/adapters.pyuclose,suBaseAdapter.close(u__name__u
__module__u__qualname__u__doc__u__init__usenduclose(u
__locals__((u	__class__u6/tmp/pip-zej_zi-build/pip/_vendor/requests/adapters.pyuBaseAdapter#suBaseAdaptercs�|EeZdZdZdddddgZeeee�fdd�Zd	d
�Z	dd�Z
ed
d�Zdd�Zdd�Z
ddd�Zdd�Zdd�Zdd�Zdd�Zd dd!dddd�Z�S("uHTTPAdapteru�The built-in HTTP Adapter for urllib3.

    Provides a general-case interface for Requests sessions to contact HTTP and
    HTTPS urls by implementing the Transport Adapter interface. This class will
    usually be created by the :class:`Session <Session>` class under the
    covers.

    :param pool_connections: The number of urllib3 connection pools to cache.
    :param pool_maxsize: The maximum number of connections to save in the pool.
    :param int max_retries: The maximum number of retries each connection
        should attempt. Note, this applies only to failed connections and
        timeouts, never to requests where the server returns a response.
    :param pool_block: Whether the connection pool should block for connections.

    Usage::

      >>> import requests
      >>> s = requests.Session()
      >>> a = requests.adapters.HTTPAdapter(max_retries=3)
      >>> s.mount('http://', a)
    umax_retriesuconfigu_pool_connectionsu
_pool_maxsizeu_pool_blockcsc||_i|_i|_tt|�j�||_||_||_|j	||d|�dS(Nublock(
umax_retriesuconfigu
proxy_managerusuperuHTTPAdapteru__init__u_pool_connectionsu
_pool_maxsizeu_pool_blockuinit_poolmanager(uselfupool_connectionsupool_maxsizeumax_retriesu
pool_block(u	__class__(u6/tmp/pip-zej_zi-build/pip/_vendor/requests/adapters.pyu__init__Is						uHTTPAdapter.__init__cs t�fdd��jD��S(Nc3s'|]}|t�|d�fVqdS(N(ugetattruNone(u.0uattr(uself(u6/tmp/pip-zej_zi-build/pip/_vendor/requests/adapters.pyu	<genexpr>Ysu+HTTPAdapter.__getstate__.<locals>.<genexpr>(udictu	__attrs__(uself((uselfu6/tmp/pip-zej_zi-build/pip/_vendor/requests/adapters.pyu__getstate__XsuHTTPAdapter.__getstate__cCsbi|_i|_x*|j�D]\}}t|||�qW|j|j|jd|j�dS(Nublock(u
proxy_manageruconfiguitemsusetattruinit_poolmanageru_pool_connectionsu
_pool_maxsizeu_pool_block(uselfustateuattruvalue((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/adapters.pyu__setstate__\s		uHTTPAdapter.__setstate__cCs=||_||_||_td|d|d|�|_dS(u�Initializes a urllib3 PoolManager. This method should not be called
        from user code, and is only exposed for use when subclassing the
        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.

        :param connections: The number of urllib3 connection pools to cache.
        :param maxsize: The maximum number of connections to save in the pool.
        :param block: Block when no free connections are available.
        u	num_poolsumaxsizeublockN(u_pool_connectionsu
_pool_maxsizeu_pool_blockuPoolManagerupoolmanager(uselfuconnectionsumaxsizeublock((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/adapters.pyuinit_poolmanagerhs

			uHTTPAdapter.init_poolmanagercCs�|j�jd�ro|rod}|dk	r6|}n|sEt}n|sZtd��nd|_||_nd|_d|_|r�t|t	�s�|d|_
|d|_q�||_
ndS(	u�Verify a SSL certificate. This method should not be called from user
        code, and is only exposed for use when subclassing the
        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.

        :param conn: The urllib3 connection object associated with the cert.
        :param url: The requested URL.
        :param verify: Whether we should actually verify the certificate.
        :param cert: The SSL certificate to verify.
        uhttpsu4Could not find a suitable SSL CA certificate bundle.u
CERT_REQUIREDu	CERT_NONEiiNT(uloweru
startswithuNoneuTrueuDEFAULT_CA_BUNDLE_PATHu	Exceptionu	cert_reqsuca_certsu
isinstanceu
basestringu	cert_fileukey_file(uselfuconnuurluverifyucertucert_loc((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/adapters.pyucert_verifyys"
					
uHTTPAdapter.cert_verifycCs�t�}t|dd�|_tt|di��|_t|j�|_||_|jj	|_	t
|jt�r�|jj
d�|_n|j|_t|j||�||_||_|S(u�Builds a :class:`Response <requests.Response>` object from a urllib3
        response. This should not be called from user code, and is only exposed
        for use when subclassing the
        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`

        :param req: The :class:`PreparedRequest <PreparedRequest>` used to generate the response.
        :param resp: The urllib3 response object.
        ustatusuheadersuutf-8N(uResponseugetattruNoneustatus_codeuCaseInsensitiveDictuheadersuget_encoding_from_headersuencodingurawureasonu
isinstanceuurlubytesudecodeuextract_cookies_to_jarucookiesurequestu
connection(uselfurequrespuresponse((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/adapters.pyubuild_response�s					uHTTPAdapter.build_responsecCs�|p	i}|jt|j��j�}|r�t|d�}|j|�}||jkr�t|d|d|jd|j	d|j
�|j|<n|j|j|�}n*t|�}|j�}|j
j|�}|S(ueReturns a urllib3 connection for the given URL. This should not be
        called from user code, and is only exposed for use when subclassing the
        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.

        :param url: The URL to connect to.
        :param proxies: (optional) A Requests-style dictionary of proxies used on this request.
        uhttpu
proxy_headersu	num_poolsumaxsizeublock(ugetuurlparseuloweruschemeuprepend_scheme_if_neededu
proxy_headersu
proxy_manageruproxy_from_urlu_pool_connectionsu
_pool_maxsizeu_pool_blockuconnection_from_urlugeturlupoolmanager(uselfuurluproxiesuproxyu
proxy_headersuconnuparsed((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/adapters.pyuget_connection�s"		uHTTPAdapter.get_connectioncCs|jj�dS(u�Disposes of any internal state.

        Currently, this just closes the PoolManager, which closes pooled
        connections.
        N(upoolmanageruclear(uself((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/adapters.pyuclose�suHTTPAdapter.closecCsd|p	i}t|j�j}|j|�}|rW|dkrWt|j�\}}n	|j}|S(uObtain the url to use when making the final request.

        If the message is being sent through a HTTP proxy, the full URL has to
        be used. Otherwise, we should only use the path portion of the URL.

        This should not be called from user code, and is only exposed for use
        when subclassing the
        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.

        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
        :param proxies: A dictionary of schemes to proxy URLs.
        uhttps(uurlparseuurluschemeugetu	urldefragupath_url(uselfurequestuproxiesuschemeuproxyuurlu_((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/adapters.pyurequest_url�s
	uHTTPAdapter.request_urlcKsdS(u"Add any headers needed by the connection. As of v2.0 this does
        nothing by default, but is left for overriding by users that subclass
        the :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.

        This should not be called from user code, and is only exposed for use
        when subclassing the
        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.

        :param request: The :class:`PreparedRequest <PreparedRequest>` to add headers to.
        :param kwargs: The keyword arguments from the call to send().
        N((uselfurequestukwargs((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/adapters.pyuadd_headerssuHTTPAdapter.add_headerscCs>i}t|�\}}|r:|r:t||�|d<n|S(u3Returns a dictionary of the headers to add to any request sent
        through a proxy. This works with urllib3 magic to ensure that they are
        correctly sent to the proxy, rather than in a tunnelled request if
        CONNECT is being used.

        This should not be called from user code, and is only exposed for use
        when subclassing the
        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.

        :param proxies: The url of the proxy being used for this request.
        :param kwargs: Optional additional keyword arguments.
        uProxy-Authorization(uget_auth_from_urlu_basic_auth_str(uselfuproxyuheadersuusernameupassword((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/adapters.pyu
proxy_headerss
uHTTPAdapter.proxy_headerscCsZ|j|j|�}|j||j||�|j||�}|j|�|jdkphd|jk}	td|d|�}y�|	s�|j	d|j
d|d|jd|jddd	dd
dddd|jd
|�
}
nPt
|d�r�|j}n|jd
|�}y�|j|j
|dd�x-|jj�D]\}}
|j||
�q:W|j�xd|jD]Y}|jtt|��dd�jd��|jd�|j|�|jd�qnW|jd�|j�}tj|d|d|d
ddd�}
Wn|j��YnX|j|�Wntjk
rn}zt |d|��WYdd}~Xn�t!k
r�}zt |d|��WYdd}~Xn�t"k
r�}zt#|��WYdd}~Xnvt$t%fk
rI}zPt&|t$�rt'|d|��n't&|t(�r4t)|d|��n�WYdd}~XnX|j*||
�S(uSends PreparedRequest object. Returns Response object.

        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
        :param stream: (optional) Whether to stream the request content.
        :param timeout: (optional) The timeout on the request.
        :param verify: (optional) Whether to verify SSL certificates.
        :param cert: (optional) Any user-provided SSL certificate to be trusted.
        :param proxies: (optional) The proxies dictionary to apply to the request.
        uContent-Lengthuconnectureadumethoduurlubodyuheadersuredirectuassert_same_hostupreload_contentudecode_contenturetriesutimeoutu
proxy_pooluskip_accept_encodingiNuutf-8s
s0

upoolu
connectionurequestFT(+uget_connectionuurlucert_verifyurequest_urluadd_headersubodyuNoneuheadersuTimeoutSauceuurlopenumethoduFalseumax_retriesuhasattru
proxy_poolu	_get_connu
putrequestuTrueuitemsu	putheaderu
endheadersusenduhexulenuencodeugetresponseuHTTPResponseufrom_httplibucloseu	_put_connusocketuerroruConnectionErroru
MaxRetryErroru_ProxyErroru
ProxyErroru	_SSLErroru
_HTTPErroru
isinstanceuSSLErroruTimeoutErroruTimeoutubuild_response(uselfurequestustreamutimeoutuverifyucertuproxiesuconnuurluchunkedurespulow_connuheaderuvalueuiurusockerrue((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/adapters.pyusend&sv
					
,




$$uHTTPAdapter.sendNFT(u__name__u
__module__u__qualname__u__doc__u	__attrs__uDEFAULT_POOLSIZEuDEFAULT_RETRIESuDEFAULT_POOLBLOCKu__init__u__getstate__u__setstate__uinit_poolmanagerucert_verifyubuild_responseuNoneuget_connectionucloseurequest_urluadd_headersu
proxy_headersuFalseuTrueusend(u
__locals__((u	__class__u6/tmp/pip-zej_zi-build/pip/_vendor/requests/adapters.pyuHTTPAdapter0s"	
%$ uHTTPAdapterF(.u__doc__usocketumodelsuResponseupackages.urllib3.poolmanageruPoolManageruproxy_from_urlupackages.urllib3.responseuHTTPResponseupackages.urllib3.utiluTimeoutuTimeoutSauceucompatuurlparseu
basestringu	urldefraguunquoteuutilsuDEFAULT_CA_BUNDLE_PATHuget_encoding_from_headersuprepend_scheme_if_neededuget_auth_from_urlu
structuresuCaseInsensitiveDictupackages.urllib3.exceptionsu
MaxRetryErroruTimeoutErroruSSLErroru	_SSLErroru	HTTPErroru
_HTTPErroru
ProxyErroru_ProxyErrorucookiesuextract_cookies_to_jaru
exceptionsuConnectionErroruauthu_basic_auth_struFalseuDEFAULT_POOLBLOCKuDEFAULT_POOLSIZEuDEFAULT_RETRIESuobjectuBaseAdapteruHTTPAdapter(((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/adapters.pyu<module>	s*"""
site-packages/pip/_vendor/requests/__pycache__/auth.cpython-33.pyc000064400000021233151733463650021175 0ustar00�
7�Re�c@s�dZddlZddlZddlZddlZddlmZddlmZm	Z	ddl
mZddlm
Z
dZd	Zd
d�ZGdd
�d
e�ZGdd�de�ZGdd�de�ZGdd�de�ZdS(u]
requests.auth
~~~~~~~~~~~~~

This module contains the authentication handlers for Requests.
iN(u	b64encodei(uurlparseustr(uextract_cookies_to_jar(uparse_dict_headeru!application/x-www-form-urlencodedumultipart/form-datacCs0dtd||fjd��j�jd�S(uReturns a Basic Auth string.uBasic u%s:%sulatin1(u	b64encodeuencodeustripudecode(uusernameupassword((u2/tmp/pip-zej_zi-build/pip/_vendor/requests/auth.pyu_basic_auth_strsu_basic_auth_strcBs&|EeZdZdZdd�ZdS(uAuthBaseu4Base class that all auth implementations derive fromcCstd��dS(NuAuth hooks must be callable.(uNotImplementedError(uselfur((u2/tmp/pip-zej_zi-build/pip/_vendor/requests/auth.pyu__call__"suAuthBase.__call__N(u__name__u
__module__u__qualname__u__doc__u__call__(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/requests/auth.pyuAuthBasesuAuthBasecBs2|EeZdZdZdd�Zdd�ZdS(u
HTTPBasicAuthu?Attaches HTTP Basic Authentication to the given Request object.cCs||_||_dS(N(uusernameupassword(uselfuusernameupassword((u2/tmp/pip-zej_zi-build/pip/_vendor/requests/auth.pyu__init__(s	uHTTPBasicAuth.__init__cCs t|j|j�|jd<|S(Nu
Authorization(u_basic_auth_struusernameupassworduheaders(uselfur((u2/tmp/pip-zej_zi-build/pip/_vendor/requests/auth.pyu__call__,suHTTPBasicAuth.__call__N(u__name__u
__module__u__qualname__u__doc__u__init__u__call__(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/requests/auth.pyu
HTTPBasicAuth&su
HTTPBasicAuthcBs&|EeZdZdZdd�ZdS(u
HTTPProxyAuthu=Attaches HTTP Proxy Authentication to a given Request object.cCs t|j|j�|jd<|S(NuProxy-Authorization(u_basic_auth_struusernameupassworduheaders(uselfur((u2/tmp/pip-zej_zi-build/pip/_vendor/requests/auth.pyu__call__3suHTTPProxyAuth.__call__N(u__name__u
__module__u__qualname__u__doc__u__call__(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/requests/auth.pyu
HTTPProxyAuth1su
HTTPProxyAuthcBsJ|EeZdZdZdd�Zdd�Zdd�Zdd	�Zd
S(uHTTPDigestAuthu@Attaches HTTP Digest Authentication to the given Request object.cCs:||_||_d|_d|_i|_d|_dS(Nui(uusernameupasswordu
last_nonceunonce_countuchaluNoneupos(uselfuusernameupassword((u2/tmp/pip-zej_zi-build/pip/_vendor/requests/auth.pyu__init__:s					uHTTPDigestAuth.__init__cs6|jd}|jd}|jjd�}|jjd�}|jjd�}|dkred}n|j�}|dks�|dkr�dd	�}	|	�n!|d
kr�dd�}
|
�n�fd
d�}�dkr�dSd}t|�}
|
j}|
jr|d|
j7}nd|j||jf}d||f}�|�}�|�}||j	kr{|j
d7_
n	d|_
d|j
}t|j
�jd�}||jd�7}|t
j�jd�7}|tjd�7}tj|�j�dd�}d|||||f}|dkrH�d|||f�}n|dkrp||d||f�}n7|dks�d|jd�kr�|||�}ndS||_	d|j||||f}|r�|d|7}n|r�|d|7}n|r|d|7}n|r.|d||f7}nd|S( Nurealmunonceuqopu	algorithmuopaqueuMD5uMD5-SESScSs4t|t�r!|jd�}ntj|�j�S(Nuutf-8(u
isinstanceustruencodeuhashlibumd5u	hexdigest(ux((u2/tmp/pip-zej_zi-build/pip/_vendor/requests/auth.pyumd5_utf8Psu4HTTPDigestAuth.build_digest_header.<locals>.md5_utf8uSHAcSs4t|t�r!|jd�}ntj|�j�S(Nuutf-8(u
isinstanceustruencodeuhashlibusha1u	hexdigest(ux((u2/tmp/pip-zej_zi-build/pip/_vendor/requests/auth.pyusha_utf8Vsu4HTTPDigestAuth.build_digest_header.<locals>.sha_utf8cs�d||f�S(Nu%s:%s((usud(u	hash_utf8(u2/tmp/pip-zej_zi-build/pip/_vendor/requests/auth.pyu<lambda>\su4HTTPDigestAuth.build_digest_header.<locals>.<lambda>u?u%s:%s:%su%s:%siu%08xuutf-8iiu%s:%s:%s:%s:%suauthu,u>username="%s", realm="%s", nonce="%s", uri="%s", response="%s"u
, opaque="%s"u, algorithm="%s"u
, digest="%s"u , qop="auth", nc=%s, cnonce="%s"u	Digest %s(uchalugetuNoneuupperuurlparseupathuqueryuusernameupasswordu
last_nonceunonce_countustruencodeutimeuctimeuosuurandomuhashlibusha1u	hexdigestusplit(uselfumethoduurlurealmunonceuqopu	algorithmuopaqueu
_algorithmumd5_utf8usha_utf8uKDuentdigup_parsedupathuA1uA2uHA1uHA2uncvalueusucnonceunoncebiturespdigubase((u	hash_utf8u2/tmp/pip-zej_zi-build/pip/_vendor/requests/auth.pyubuild_digest_headerBsn

						
!	u"HTTPDigestAuth.build_digest_headercKsk|jdk	r(|jjj|j�nt|dd�}|jjdd�}d|j�krW|dkrWt	|d|d�t
jddt
j�}t
|jd|d	d��|_|j|jj�|jj�}t|j|j|j�|j|j�|j|j|j�|jd
<|jj||�}|jj|�||_|St	|dd�|S(u:Takes the given response and tries digest-auth, if needed.u
num_401_callsiuwww-authenticateuudigestiudigest uflagsucountu
AuthorizationN(uposuNoneurequestubodyuseekugetattruheadersugetulowerusetattrureucompileu
IGNORECASEuparse_dict_headerusubuchalucontenturawurelease_connucopyuextract_cookies_to_jaru_cookiesuprepare_cookiesubuild_digest_headerumethoduurlu
connectionusenduhistoryuappend(uselfurukwargsu
num_401_callsus_authupatuprepu_r((u2/tmp/pip-zej_zi-build/pip/_vendor/requests/auth.pyu
handle_401�s*!
	uHTTPDigestAuth.handle_401cCsm|jr+|j|j|j�|jd<ny|jj�|_Wntk
rUYnX|j	d|j
�|S(Nu
Authorizationuresponse(u
last_nonceubuild_digest_headerumethoduurluheadersubodyutelluposuAttributeErroru
register_hooku
handle_401(uselfur((u2/tmp/pip-zej_zi-build/pip/_vendor/requests/auth.pyu__call__�s	"
uHTTPDigestAuth.__call__N(u__name__u
__module__u__qualname__u__doc__u__init__ubuild_digest_headeru
handle_401u__call__(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/requests/auth.pyuHTTPDigestAuth8s
S#uHTTPDigestAuth(u__doc__uosureutimeuhashlibubase64u	b64encodeucompatuurlparseustrucookiesuextract_cookies_to_jaruutilsuparse_dict_headeruCONTENT_TYPE_FORM_URLENCODEDuCONTENT_TYPE_MULTI_PARTu_basic_auth_struobjectuAuthBaseu
HTTPBasicAuthu
HTTPProxyAuthuHTTPDigestAuth(((u2/tmp/pip-zej_zi-build/pip/_vendor/requests/auth.pyu<module>ssite-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-33.pyc000064400000013100151733463650022407 0ustar00�
7�ReUc@sDdZddlmZGdd�de�ZGdd�de�ZGdd�de�ZGd	d
�d
e�ZGdd�de�ZGd
d�de�Z	Gdd�de�Z
Gdd�de�ZGdd�dee�Z
Gdd�dee�ZGdd�dee�ZGdd�de�ZGdd�dee�ZdS(ua
requests.exceptions
~~~~~~~~~~~~~~~~~~~

This module contains the set of Requests' exceptions.

i(u	HTTPErrorcs,|EeZdZdZ�fdd�Z�S(uRequestExceptionuOThere was an ambiguous exception that occurred while handling your
    request.cs�|jdd�}||_|jdd�|_|dk	rg|jrgt|d�rg|jj|_ntt|�j||�dS(uT
        Initialize RequestException with `request` and `response` objects.
        uresponseurequestN(upopuNoneuresponseurequestuhasattrusuperuRequestExceptionu__init__(uselfuargsukwargsuresponse(u	__class__(u8/tmp/pip-zej_zi-build/pip/_vendor/requests/exceptions.pyu__init__s	uRequestException.__init__(u__name__u
__module__u__qualname__u__doc__u__init__(u
__locals__((u	__class__u8/tmp/pip-zej_zi-build/pip/_vendor/requests/exceptions.pyuRequestException
suRequestExceptioncBs|EeZdZdZdS(u	HTTPErroruAn HTTP error occurred.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/exceptions.pyu	HTTPErrorsu	HTTPErrorcBs|EeZdZdZdS(uConnectionErroruA Connection error occurred.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/exceptions.pyuConnectionError"suConnectionErrorcBs|EeZdZdZdS(u
ProxyErroruA proxy error occurred.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/exceptions.pyu
ProxyError&su
ProxyErrorcBs|EeZdZdZdS(uSSLErroruAn SSL error occurred.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/exceptions.pyuSSLError*suSSLErrorcBs|EeZdZdZdS(uTimeoutuThe request timed out.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/exceptions.pyuTimeout.suTimeoutcBs|EeZdZdZdS(uURLRequiredu*A valid URL is required to make a request.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/exceptions.pyuURLRequired2suURLRequiredcBs|EeZdZdZdS(uTooManyRedirectsuToo many redirects.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/exceptions.pyuTooManyRedirects6suTooManyRedirectscBs|EeZdZdZdS(u
MissingSchemau/The URL schema (e.g. http or https) is missing.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/exceptions.pyu
MissingSchema:su
MissingSchemacBs|EeZdZdZdS(u
InvalidSchemau"See defaults.py for valid schemas.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/exceptions.pyu
InvalidSchema>su
InvalidSchemacBs|EeZdZdZdS(u
InvalidURLu' The URL provided was somehow invalid. N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/exceptions.pyu
InvalidURLBsu
InvalidURLcBs|EeZdZdZdS(uChunkedEncodingErroru?The server declared chunked encoding but sent an invalid chunk.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/exceptions.pyuChunkedEncodingErrorFsuChunkedEncodingErrorcBs|EeZdZdZdS(uContentDecodingErroru!Failed to decode response contentN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/exceptions.pyuContentDecodingErrorJsuContentDecodingErrorN(u__doc__upackages.urllib3.exceptionsu	HTTPErroru
BaseHTTPErroruIOErroruRequestExceptionuConnectionErroru
ProxyErroruSSLErroruTimeoutuURLRequireduTooManyRedirectsu
ValueErroru
MissingSchemau
InvalidSchemau
InvalidURLuChunkedEncodingErroruContentDecodingError(((u8/tmp/pip-zej_zi-build/pip/_vendor/requests/exceptions.pyu<module>	ssite-packages/pip/_vendor/requests/__pycache__/models.cpython-33.pyc000064400000071754151733463650021534 0ustar00�
7�ReDgc@s;dZddlZddlZddlmZmZddlmZddlm	Z	ddl
mZddlm
Z
mZdd	lmZdd
lmZddlmZddlmZdd
lmZmZmZmZmZmZddlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(ddl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6ddl7m8Z8e8j9e8j:e8j;e8j<fZ=dZ>dZ?dZ@Gdd�deA�ZBGdd�deA�ZCGdd�deC�ZDGdd�deBeC�ZEGdd�deA�ZFdS( u`
requests.models
~~~~~~~~~~~~~~~

This module contains the primary objects that power Requests.
iN(uBytesIOuUnsupportedOperationi(u
default_hooks(uCaseInsensitiveDict(u
HTTPBasicAuth(ucookiejar_from_dictuget_cookie_header(uRequestField(uencode_multipart_formdata(u	parse_url(uDecodeError(u	HTTPErroruRequestExceptionu
MissingSchemau
InvalidURLuChunkedEncodingErroruContentDecodingError(
uguess_filenameuget_auth_from_urlurequote_uriustream_decode_response_unicodeuto_key_val_listuparse_header_linksuiter_slicesuguess_json_utfu	super_lenuto_native_string(
u	cookielibu
urlunparseuurlsplitu	urlencodeustrubytesuStringIOuis_py2uchardetujsonubuiltin_stru
basestringuIncompleteRead(ucodesii
iicBsJ|EeZdZedd��Zedd��Zedd��ZdS(uRequestEncodingMixincCssg}t|j�}|j}|s-d}n|j|�|j}|rf|jd�|j|�ndj|�S(uBuild the path URL to use.u/u?u(uurlsplituurlupathuappenduqueryujoin(uselfuurlupupathuquery((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyupath_url1s		
	
uRequestEncodingMixin.path_urlcCst|ttf�r|St|d�r,|St|d�rg}x�t|�D]�\}}t|t�syt|d�r�|g}nxl|D]d}|dk	r�|jt|t�r�|jd�n|t|t�r�|jd�n|f�q�q�WqNWt	|dd�S|SdS(u�Encode parameters in a piece of data.

        Will successfully encode parameters when passed as a dict or a list of
        2-tuples. Order is retained if data is a list of 2-tuples but arbitrary
        if parameters are supplied as a dict.
        ureadu__iter__uutf-8udoseqNT(u
isinstanceustrubytesuhasattruto_key_val_listu
basestringuNoneuappenduencodeu	urlencodeuTrue(udatauresultukuvsuv((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyu_encode_paramsFs 	
!3u#RequestEncodingMixin._encode_paramsc
Csr|std��nt|t�r3td��ng}t|pEi�}t|pWi�}x�|D]�\}}t|t�s�t|d�r�|g}nx�|D]�}|dk	r�t|t�s�t|�}n|jt|t�r�|j	d�n|t|t�r|j
d�n|f�q�q�WqdWx'|D]\}}d}d}	t|ttf�r�t
|�dkr�|\}
}q�t
|�dkr�|\}
}}q�|\}
}}}	nt|�p�|}
|}t|t�r�t|�}nt|t�rt|�}ntd|d|j�d	|
d
|	�}|jd|�|j|�q3Wt|�\}
}|
|fS(
uBuild the body for a multipart/form-data request.

        Will successfully encode files when passed as a dict or a list of
        2-tuples. Order is retained if data is a list of 2-tuples but arbitrary
        if parameters are supplied as a dict.

        uFiles must be provided.uData must not be a string.u__iter__uutf-8iiunameudataufilenameuheadersucontent_typeN(u
ValueErroru
isinstanceu
basestringuto_key_val_listuhasattruNoneubytesustruappendudecodeuencodeutupleulistulenuguess_filenameuStringIOuBytesIOuRequestFieldureadumake_multipartuencode_multipart_formdata(ufilesudatau
new_fieldsufieldsufielduvaluvukuftufhufnufpurfubodyucontent_type((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyu
_encode_filesasL	
!3u"RequestEncodingMixin._encode_filesN(u__name__u
__module__u__qualname__upropertyupath_urlustaticmethodu_encode_paramsu
_encode_files(u
__locals__((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyuRequestEncodingMixin0suRequestEncodingMixincBs,|EeZdZdd�Zdd�ZdS(uRequestHooksMixincCs�||jkr"td|��nt|tj�rK|j|j|�n3t|d�r~|j|jdd�|D��ndS(uProperly register a hook.u1Unsupported event specified, with event name "%s"u__iter__css'|]}t|tj�r|VqdS(N(u
isinstanceucollectionsuCallable(u.0uh((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyu	<genexpr>�su2RequestHooksMixin.register_hook.<locals>.<genexpr>N(uhooksu
ValueErroru
isinstanceucollectionsuCallableuappenduhasattruextend(uselfueventuhook((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyu
register_hook�suRequestHooksMixin.register_hookcCs9y|j|j|�dSWntk
r4dSYnXdS(uiDeregister a previously registered hook.
        Returns True if the hook existed, False if not.
        NTF(uhooksuremoveuTrueu
ValueErroruFalse(uselfueventuhook((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyuderegister_hook�s

u!RequestHooksMixin.deregister_hookN(u__name__u
__module__u__qualname__u
register_hookuderegister_hook(u
__locals__((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyuRequestHooksMixin�suRequestHooksMixincBsY|EeZdZdZddddddddddd�	Zdd�Zdd�ZdS(	uRequestuA user-created :class:`Request <Request>` object.

    Used to prepare a :class:`PreparedRequest <PreparedRequest>`, which is sent to the server.

    :param method: HTTP method to use.
    :param url: URL to send.
    :param headers: dictionary of headers to send.
    :param files: dictionary of {filename: fileobject} files to multipart upload.
    :param data: the body to attach the request. If a dictionary is provided, form-encoding will take place.
    :param params: dictionary of URL parameters to append to the URL.
    :param auth: Auth handler or (user, pass) tuple.
    :param cookies: dictionary or CookieJar of cookies to attach to this request.
    :param hooks: dictionary of callback hooks, for internal usage.

    Usage::

      >>> import requests
      >>> req = requests.Request('GET', 'http://httpbin.org/get')
      >>> req.prepare()
      <PreparedRequest [GET]>

    c
Cs	|dkrgn|}|dkr*gn|}|dkrBin|}|dkrZin|}|	dkrrin|	}	t�|_x6t|	j��D]"\}
}|jd|
d|�q�W||_||_||_||_	||_
||_||_||_
dS(Nueventuhook(uNoneu
default_hooksuhooksulistuitemsu
register_hookumethoduurluheadersufilesudatauparamsuauthucookies(uselfumethoduurluheadersufilesudatauparamsuauthucookiesuhooksukuv((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyu__init__�s 							uRequest.__init__cCsd|jS(Nu<Request [%s]>(umethod(uself((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyu__repr__�suRequest.__repr__cCsht�}|jd|jd|jd|jd|jd|jd|jd|jd|j	d	|j
�	|S(
uXConstructs a :class:`PreparedRequest <PreparedRequest>` for transmission and returns it.umethoduurluheadersufilesudatauparamsuauthucookiesuhooks(uPreparedRequestuprepareumethoduurluheadersufilesudatauparamsuauthucookiesuhooks(uselfup((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyuprepare�s										
uRequest.prepareN(u__name__u
__module__u__qualname__u__doc__uNoneu__init__u__repr__uprepare(u
__locals__((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyuRequest�suRequestcBs�|EeZdZdZdd�Zddddddddddd�	Zdd�Zdd	�Zd
d�Z	dd
�Z
dd�Zdd�Zdd�Z
ddd�Zdd�Zdd�ZdS(uPreparedRequestu�The fully mutable :class:`PreparedRequest <PreparedRequest>` object,
    containing the exact bytes that will be sent to the server.

    Generated from either a :class:`Request <Request>` object or manually.

    Usage::

      >>> import requests
      >>> req = requests.Request('GET', 'http://httpbin.org/get')
      >>> r = req.prepare()
      <PreparedRequest [GET]>

      >>> s = requests.Session()
      >>> s.send(r)
      <Response [200]>

    cCs=d|_d|_d|_d|_d|_t�|_dS(N(uNoneumethoduurluheadersu_cookiesubodyu
default_hooksuhooks(uself((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyu__init__s					uPreparedRequest.__init__c

Csh|j|�|j||�|j|�|j|�|j||�|j||�|j|	�dS(u6Prepares the entire request with the given parameters.N(uprepare_methoduprepare_urluprepare_headersuprepare_cookiesuprepare_bodyuprepare_authu
prepare_hooks(
uselfumethoduurluheadersufilesudatauparamsuauthucookiesuhooks((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyuprepare!s


uPreparedRequest.preparecCsd|jS(Nu<PreparedRequest [%s]>(umethod(uself((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyu__repr__1suPreparedRequest.__repr__cCsat�}|j|_|j|_|jj�|_|jj�|_|j|_|j|_|S(N(uPreparedRequestumethoduurluheadersucopyu_cookiesubodyuhooks(uselfup((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyucopy4s	uPreparedRequest.copycCs1||_|jdk	r-|jj�|_ndS(uPrepares the given HTTP method.N(umethoduNoneuupper(uselfumethod((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyuprepare_method>s	uPreparedRequest.prepare_methodcCsqyt|�}Wn/tk
r0t|�}Yntk
rAYnXd|krq|j�jd�rq||_dSt|�\}}}}}}}	|s�tdj	|���n|s�t
d|��ny|jd�jd�}Wnt
k
rt
d��YnX|pd	}
|
r%|
d
7}
n|
|7}
|rL|
dt|�7}
n|s[d}ntr	t|t�r�|jd�}nt|
t�r�|
jd�}
nt|t�r�|jd�}nt|t�r�|jd�}nt|	t�r	|	jd�}	q	n|j|�}|r@|r7d||f}q@|}ntt||
|d||	g��}||_dS(
uPrepares the given HTTP URL.u:uhttpNuDInvalid URL {0!r}: No schema supplied. Perhaps you meant http://{0}?u Invalid URL %r: No host supplieduidnauutf-8uURL has an invalid label.uu@u/u%s&%s(uunicodeu	NameErrorustruUnicodeDecodeErroruloweru
startswithuurlu	parse_urlu
MissingSchemauformatu
InvalidURLuencodeudecodeuUnicodeErroruis_py2u
isinstanceu_encode_paramsurequote_uriu
urlunparseuNone(uselfuurluparamsuschemeuauthuhostuportupathuqueryufragmentunetlocu
enc_params((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyuprepare_urlDsZ

"	!	


		$uPreparedRequest.prepare_urlcCs;|r+tdd�|j�D��|_nt�|_dS(u Prepares the given HTTP headers.css'|]\}}t|�|fVqdS(N(uto_native_string(u.0unameuvalue((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyu	<genexpr>�su2PreparedRequest.prepare_headers.<locals>.<genexpr>N(uCaseInsensitiveDictuitemsuheaders(uselfuheaders((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyuprepare_headers�s%uPreparedRequest.prepare_headerscCs~d
}d
}d
}tt|d�t|ttttf�g�}yt|�}Wn!t	t
tfk
rvd
}YnX|r�|}|r�td��n|d
k	r�t
|�|jd<qqd|jd<n�|r�|j||�\}}nT|r?|j|�}t|t�s-t|t
�s-t|d�r6d
}q?d}n|j|�|rqd|jkrq||jd	<n||_d
S(u"Prepares the given HTTP body data.u__iter__u1Streamed bodies and files are mutually exclusive.uContent-LengthuchunkeduTransfer-Encodingureadu!application/x-www-form-urlencodeducontent-typeuContent-TypeN(uNoneualluhasattru
isinstanceu
basestringulistutupleudictu	super_lenu	TypeErroruAttributeErroruUnsupportedOperationuNotImplementedErrorubuiltin_struheadersu
_encode_filesu_encode_paramsustruprepare_content_lengthubody(uselfudataufilesubodyucontent_typeulengthu	is_stream((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyuprepare_body�s8"-		
uPreparedRequest.prepare_bodycCs�t|d�rZt|d�rZ|jdd�t|j��|jd<|jdd�nV|dk	r�t|�}|r�t|�|jd<q�n|jd	kr�d|jd<ndS(
NuseekutelliiuContent-LengthuGETuHEADu0(uGETuHEAD(uhasattruseekubuiltin_strutelluheadersuNoneu	super_lenumethod(uselfubodyul((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyuprepare_content_length�su&PreparedRequest.prepare_content_lengthucCs�|dkr6t|j�}t|�r-|nd}n|r�t|t�rlt|�dkrlt|�}n||�}|jj	|j�|j
|j�ndS(u"Prepares the given HTTP auth data.iN(uNoneuget_auth_from_urluurluanyu
isinstanceutupleulenu
HTTPBasicAuthu__dict__uupdateuprepare_content_lengthubody(uselfuauthuurluurl_authur((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyuprepare_auth�s!uPreparedRequest.prepare_authcCs_t|tj�r||_nt|�|_t|j|�}|dk	r[||jd<ndS(u$Prepares the given HTTP cookie data.uCookieN(u
isinstanceu	cookielibu	CookieJaru_cookiesucookiejar_from_dictuget_cookie_headeruNoneuheaders(uselfucookiesu
cookie_header((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyuprepare_cookies�suPreparedRequest.prepare_cookiescCs)x"|D]}|j|||�qWdS(uPrepares the given hooks.N(u
register_hook(uselfuhooksuevent((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyu
prepare_hooks�s
uPreparedRequest.prepare_hooksN(u__name__u
__module__u__qualname__u__doc__u__init__uNoneuprepareu__repr__ucopyuprepare_methoduprepare_urluprepare_headersuprepare_bodyuprepare_content_lengthuprepare_authuprepare_cookiesu
prepare_hooks(u
__locals__((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyuPreparedRequest�s
B3uPreparedRequestc
sL|EeZdZdZdddddddd	d
dg
Z�fdd
�Zdd�Zdd�Zdd�Zdd�Z	dd�Z
dd�Zedd��Z
edd��Zedd��Zd d1d!d"�Zed2d#d$�Zed%d&��Zed'd(��Zd)d*�Zed+d,��Zd-d.�Zd/d0�Z�S(3uResponseuhThe :class:`Response <Response>` object, which contains a
    server's response to an HTTP request.
    u_contentustatus_codeuheadersuurluhistoryuencodingureasonucookiesuelapsedurequestcs�tt|�j�d|_d|_d|_t�|_	d|_
d|_d|_g|_
d|_ti�|_tjd�|_dS(NiF(usuperuResponseu__init__uFalseu_contentu_content_consumeduNoneustatus_codeuCaseInsensitiveDictuheadersurawuurluencodinguhistoryureasonucookiejar_from_dictucookiesudatetimeu	timedeltauelapsed(uself(u	__class__(u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyu__init__s								uResponse.__init__cs3�js�jnt�fdd��jD��S(Nc3s'|]}|t�|d�fVqdS(N(ugetattruNone(u.0uattr(uself(u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyu	<genexpr>6su(Response.__getstate__.<locals>.<genexpr>(u_content_consumeducontentudictu	__attrs__(uself((uselfu4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyu__getstate__/s
	
uResponse.__getstate__cCsQx*|j�D]\}}t|||�q
Wt|dd�t|dd�dS(Nu_content_consumedurawT(uitemsusetattruTrueuNone(uselfustateunameuvalue((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyu__setstate__:suResponse.__setstate__cCsd|jS(Nu<Response [%s]>(ustatus_code(uself((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyu__repr__BsuResponse.__repr__cCs|jS(u,Returns true if :attr:`status_code` is 'OK'.(uok(uself((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyu__bool__EsuResponse.__bool__cCs|jS(u,Returns true if :attr:`status_code` is 'OK'.(uok(uself((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyu__nonzero__IsuResponse.__nonzero__cCs
|jd�S(u,Allows you to use a response as an iterator.i�(uiter_content(uself((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyu__iter__MsuResponse.__iter__cCs+y|j�Wntk
r&dSYnXdS(NFT(uraise_for_statusuRequestExceptionuFalseuTrue(uself((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyuokQs

	uResponse.okcCsd|jko|jtkS(u�True if this Response is a well-formed HTTP redirect that could have
        been processed automatically (by :meth:`Session.resolve_redirects`).
        ulocation(uheadersustatus_codeuREDIRECT_STATI(uself((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyuis_redirectYsuResponse.is_redirectcCstj|j�dS(u6The apparent encoding, provided by the chardet libraryuencoding(uchardetudetectucontent(uself((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyuapparent_encoding`suResponse.apparent_encodingicsa��fdd�}t�j��}|�}�jr?|n|}|r]t|��}n|S(u�Iterates over the response data.  When stream=True is set on the
        request, this avoids reading the content at once into memory for
        large responses.  The chunk size is the number of bytes it should
        read into memory.  This is not necessarily the length of each item
        returned as decoding can take place.

        If decode_unicode is True, content will be decoded using the best
        available encoding based on the response.
        c3s�y�y,x%�jj�dd�D]}|VqWWnatk
rb}zt|��WYdd}~Xn1tk
r�}zt|��WYdd}~XnXWn9tk
r�x$�jj��}|s�Pn|Vq�YnXd�_	dS(Nudecode_contentT(
urawustreamuTrueuIncompleteReaduChunkedEncodingErroruDecodeErroruContentDecodingErroruAttributeErrorureadu_content_consumed(uchunkue(u
chunk_sizeuself(u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyugenerateos
#

u'Response.iter_content.<locals>.generate(uiter_slicesu_contentu_content_consumedustream_decode_response_unicode(uselfu
chunk_sizeudecode_unicodeugenerateu
reused_chunksu
stream_chunksuchunks((u
chunk_sizeuselfu4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyuiter_contentes
	uResponse.iter_contentccs�d}x�|jd|d|�D]�}|dk	r>||}n|j�}|r�|dr�|r�|dd|dkr�|j�}nd}x|D]}|Vq�WqW|dk	r�|VndS(	u�Iterates over the response data, one line at a time.  When
        stream=True is set on the request, this avoids reading the
        content at once into memory for large responses.
        u
chunk_sizeudecode_unicodeiNi����i����i����i����(uNoneuiter_contentu
splitlinesupop(uselfu
chunk_sizeudecode_unicodeupendinguchunkulinesuline((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyu
iter_lines�s
.

uResponse.iter_linescCs�|jdkr�y^|jr*td��n|jdkrEd|_n't�j|jt	��pft�|_Wq�t
k
r�d|_Yq�Xnd|_|jS(u"Content of the response, in bytes.u2The content for this response was already consumediFNT(u_contentuFalseu_content_consumeduRuntimeErrorustatus_codeuNoneubytesujoinuiter_contentuCONTENT_CHUNK_SIZEuAttributeErroruTrue(uself((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyucontent�s	+
	uResponse.contentcCs�d}|j}|js"td�S|jdkr=|j}nyt|j|dd�}Wn-ttfk
r�t|jdd�}YnX|S(u�Content of the response, in unicode.

        If Response.encoding is None, encoding will be guessed using
        ``chardet``.

        The encoding of the response content is determined based solely on HTTP
        headers, following RFC 2616 to the letter. If you can take advantage of
        non-HTTP knowledge to make a better guess at the encoding, you should
        set ``r.encoding`` appropriately before accessing this property.
        uuerrorsureplaceN(uNoneuencodingucontentustruapparent_encodinguLookupErroru	TypeError(uselfucontentuencoding((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyutext�s		
u
Response.textcKs�|jrut|j�dkrut|j�}|dk	ruy tj|jj|�|�SWqrtk
rnYqrXquntj|j	|�S(u�Returns the json-encoded content of a response, if any.

        :param \*\*kwargs: Optional arguments that ``json.loads`` takes.
        iN(
uencodingulenucontentuguess_json_utfuNoneujsonuloadsudecodeuUnicodeDecodeErrorutext(uselfukwargsuencoding((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyujson�s 
u
Response.jsoncCsj|jjd�}i}|rft|�}x9|D].}|jd�pR|jd�}|||<q1Wn|S(u8Returns the parsed header links of the response, if any.ulinkureluurl(uheadersugetuparse_header_links(uselfuheaderululinksulinkukey((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyulinks�s
uResponse.linkscCs�d}d|jko dknr>d|j|jf}n8d|jkoXdknrvd|j|jf}n|r�t|d|��ndS(	u2Raises stored :class:`HTTPError`, if one occurred.ui�i�u%s Client Error: %siXu%s Server Error: %suresponseN(ustatus_codeureasonu	HTTPError(uselfuhttp_error_msg((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyuraise_for_statussuResponse.raise_for_statuscCs
|jj�S(u�Releases the connection back to the pool. Once this method has been
        called the underlying ``raw`` object must not be accessed again.

        *Note: Should not normally need to be called explicitly.*
        (urawurelease_conn(uself((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyuclosesuResponse.closeFN(u__name__u
__module__u__qualname__u__doc__u	__attrs__u__init__u__getstate__u__setstate__u__repr__u__bool__u__nonzero__u__iter__upropertyuokuis_redirectuapparent_encodinguFalseuiter_contentuITER_CHUNK_SIZEuNoneu
iter_linesucontentutextujsonulinksuraise_for_statusuclose(u
__locals__((u	__class__u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyuResponse�s:	(*&uResponsei((Gu__doc__ucollectionsudatetimeuiouBytesIOuUnsupportedOperationuhooksu
default_hooksu
structuresuCaseInsensitiveDictuauthu
HTTPBasicAuthucookiesucookiejar_from_dictuget_cookie_headerupackages.urllib3.fieldsuRequestFieldupackages.urllib3.filepostuencode_multipart_formdataupackages.urllib3.utilu	parse_urlupackages.urllib3.exceptionsuDecodeErroru
exceptionsu	HTTPErroruRequestExceptionu
MissingSchemau
InvalidURLuChunkedEncodingErroruContentDecodingErroruutilsuguess_filenameuget_auth_from_urlurequote_uriustream_decode_response_unicodeuto_key_val_listuparse_header_linksuiter_slicesuguess_json_utfu	super_lenuto_native_stringucompatu	cookielibu
urlunparseuurlsplitu	urlencodeustrubytesuStringIOuis_py2uchardetujsonubuiltin_stru
basestringuIncompleteReadustatus_codesucodesumovedufounduotherutemporary_moveduREDIRECT_STATIuDEFAULT_REDIRECT_LIMITuCONTENT_CHUNK_SIZEuITER_CHUNK_SIZEuobjectuRequestEncodingMixinuRequestHooksMixinuRequestuPreparedRequestuResponse(((u4/tmp/pip-zej_zi-build/pip/_vendor/requests/models.pyu<module>s6.FXmJ�site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-33.pyc000064400000054357151733463650022117 0ustar00�
7�ReWc@s�dZddlZddlmZddlmZddlmZddlmZm	Z	m
Z
mZmZddl
mZmZmZmZdd	lmZmZmZdd
lmZmZddlmZmZmZddlmZmZm Z m!Z!dd
l"m#Z#ddl$m%Z%ddlm&Z&m'Z'm(Z(m)Z)m*Z*ddl+m,Z,ddlm-Z-e	dd�Z.e	dd�Z/Gdd�de0�Z1Gdd�de1�Z2dd�Z3dS(u�
requests.session
~~~~~~~~~~~~~~~~

This module provides a Session object to manage and persist settings across
requests (cookies, auth, proxies).

iN(uMapping(udatetimei(u_basic_auth_str(u	cookielibuOrderedDictuurljoinuurlparseubuiltin_str(ucookiejar_from_dictuextract_cookies_to_jaruRequestsCookieJaru
merge_cookies(uRequestuPreparedRequestuDEFAULT_REDIRECT_LIMIT(u
default_hooksu
dispatch_hook(uto_key_val_listudefault_headersuto_native_string(uTooManyRedirectsu
InvalidSchemauChunkedEncodingErroruContentDecodingError(uCaseInsensitiveDict(uHTTPAdapter(urequote_uriuget_environ_proxiesuget_netrc_authushould_bypass_proxiesuget_auth_from_url(ucodes(uREDIRECT_STATIcCs�|dkr|S|dkr |St|t�o;t|t�sB|S|t|��}|jt|��x0|j�D]"\}}|dkrt||=qtqtWtdd�|j�D��}|S(u�
    Determines appropriate setting for a given request, taking into account the
    explicit setting on that request, and the setting in the session. If a
    setting is a dictionary, they will be merged together using `dict_class`
    css-|]#\}}|dk	r||fVqdS(N(uNone(u.0ukuv((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu	<genexpr>Csu merge_setting.<locals>.<genexpr>N(uNoneu
isinstanceuMappinguto_key_val_listuupdateuitemsudict(urequest_settingusession_settingu
dict_classumerged_settingukuv((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu
merge_setting'su
merge_settingcCsZ|dks!|jd�gkr%|S|dksF|jd�gkrJ|St|||�S(u�
    Properly merges both requests and session hooks.

    This is necessary because when request_hooks == {'response': []}, the
    merge breaks Session hooks entirely.
    uresponseN(uNoneugetu
merge_setting(u
request_hooksu
session_hooksu
dict_class((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyumerge_hooksHs
!!umerge_hookscBsG|EeZdZddd	dddd�Zdd�Zdd�ZdS(
uSessionRedirectMixinc!cs�d}x�|jr�|j�}	y|jWn.tttfk
rY|jjdd�YnX||j	krt
d|j	��n|j�|jd}
|j
}|
jd�r�t|j�}d|j|
f}
nt|
�}
|
j�}
t|
�jst|jt|
��}
nt|
�}
t|
�|	_|jtjkrW|dkrWd}n|jtjkr~|dkr~d}n|jtjkr�|d	kr�d}n||	_
|jtjtjfkr�d
|	jkr�|	jd
=nd|	_n|	j}y|d=Wnt k
rYnXt!|	j"|	|j�|	j"j#|j$�|	j%|	j"�|j&|	|�}|j'|	|�|	}|j(|d|d
|d|d|d|dd�}t!|j$|	|j�|d7}|Vq	WdS(u6Receives a Response. Returns a generator of Responses.iudecode_contentuExceeded %s redirects.ulocationu//u%s:%suHEADuGETuPOSTuContent-LengthuCookieustreamutimeoutuverifyucertuproxiesuallow_redirectsiNF()uis_redirectucopyucontentuChunkedEncodingErroruContentDecodingErroruRuntimeErrorurawureaduFalseu
max_redirectsuTooManyRedirectsucloseuheadersumethodu
startswithuurlparseuurluschemeugeturlunetlocuurljoinurequote_uriuto_native_stringustatus_codeucodesu	see_otherufoundumovedu	temporaryuresumeuNoneubodyuKeyErroruextract_cookies_to_jaru_cookiesuupdateucookiesuprepare_cookiesurebuild_proxiesurebuild_authusend(uselfurespurequstreamutimeoutuverifyucertuproxiesuiuprepared_requestuurlumethoduparsed_rurluparseduheaders((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyuresolve_redirectsYsn

					
	
	
u&SessionRedirectMixin.resolve_redirectscCs�|j}|j}d|kr[t|jj�}t|�}|j|jkr[|d=q[n|jrpt|�nd}|dk	r�|j|�ndS(u�
        When being redirected we may want to strip authentication from the
        request to avoid leaking credentials. This method intelligently removes
        and reapplies authentication where possible to avoid credential loss.
        u
AuthorizationN(	uheadersuurluurlparseurequestuhostnameu	trust_envuget_netrc_authuNoneuprepare_auth(uselfuprepared_requesturesponseuheadersuurluoriginal_parseduredirect_parsedunew_auth((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyurebuild_auth�s		
u!SessionRedirectMixin.rebuild_authc
Cs|j}|j}t|�j}|dk	r9|j�ni}|jr�t|�r�t|�}|j	|�}|r�|j
|||�q�nd|kr�|d=nyt||�\}	}
Wntk
r�d\}	}
YnX|	r|
rt
|	|
�|d<n|S(u�
        This method re-evaluates the proxy configuration by considering the
        environment variables. If we are redirected to a URL covered by
        NO_PROXY, we strip the proxy configuration. Otherwise, we set missing
        proxy keys for this URL (in case they were stripped by a previous
        redirect).

        This method also replaces the Proxy-Authorization header where
        necessary.
        uProxy-AuthorizationN(NN(uheadersuurluurlparseuschemeuNoneucopyu	trust_envushould_bypass_proxiesuget_environ_proxiesugetu
setdefaultuget_auth_from_urluKeyErroru_basic_auth_str(uselfuprepared_requestuproxiesuheadersuurluschemeunew_proxiesuenviron_proxiesuproxyuusernameupassword((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyurebuild_proxies�s$		

u$SessionRedirectMixin.rebuild_proxiesNFT(	u__name__u
__module__u__qualname__uFalseuNoneuTrueuresolve_redirectsurebuild_authurebuild_proxies(u
__locals__((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyuSessionRedirectMixinXsauSessionRedirectMixincBsR|EeZdZdZdddddddd	d
ddd
ddgZdd�Zdd�Zdd�Zdd�Zd4d4d4d4d4d4d4d5d4d4d4d4d4dd�
Zdd�Zdd�Z
dd�Zd4d d!�Zd4d"d#�Zd4d$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�Zd2d3�Zd4S(6uSessionu�A Requests session.

    Provides cookie persistence, connection-pooling, and configuration.

    Basic Usage::

      >>> import requests
      >>> s = requests.Session()
      >>> s.get('http://httpbin.org/get')
      200
    uheadersucookiesuauthutimeoutuproxiesuhooksuparamsuverifyucertuprefetchuadaptersustreamu	trust_envu
max_redirectscCs�t�|_d|_i|_t�|_i|_d|_	d|_d|_t
|_d|_ti�|_t�|_|jdt��|jdt��dS(Nuhttps://uhttp://FT(udefault_headersuheadersuNoneuauthuproxiesu
default_hooksuhooksuparamsuFalseustreamuTrueuverifyucertuDEFAULT_REDIRECT_LIMITu
max_redirectsu	trust_envucookiejar_from_dictucookiesuOrderedDictuadaptersumountuHTTPAdapter(uself((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu__init__s								uSession.__init__cCs|S(N((uself((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu	__enter__?suSession.__enter__cGs|j�dS(N(uclose(uselfuargs((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu__exit__BsuSession.__exit__cCs!|jpi}t|tj�s0t|�}nttt�|j�|�}|j}|jr�|r�|jr�t	|j
�}nt�}|jd|j
j�d|j
d|jd|jdt|j|jdt�dt|j|j�dt||j�d	|d
t|j|j��	|S(ubConstructs a :class:`PreparedRequest <PreparedRequest>` for
        transmission and returns it. The :class:`PreparedRequest` has settings
        merged from the :class:`Request <Request>` instance and those of the
        :class:`Session`.

        :param request: :class:`Request` instance to prepare with this
            session's settings.
        umethoduurlufilesudatauheadersu
dict_classuparamsuauthucookiesuhooks(ucookiesu
isinstanceu	cookielibu	CookieJarucookiejar_from_dictu
merge_cookiesuRequestsCookieJaruauthu	trust_envuget_netrc_authuurluPreparedRequestuprepareumethoduupperufilesudatau
merge_settinguheadersuCaseInsensitiveDictuparamsumerge_hooksuhooks(uselfurequestucookiesumerged_cookiesuauthup((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyuprepare_requestEs(							uSession.prepare_requestcCs�t|�}td|j�d|d|d|d|p9id|pEid|d|d	|�	}|j|�}|pui}|jrt|�p�i}x*|j�D]\}}|j||�q�W|r�|dk	r�t	j
jd
�}n|r|dk	rt	j
jd�}qnt||j
�}t|
|j�}
t||j�}t||j�}i|
d6|	d
6|d6|d6|d6|
d6}|j||�}|S(u4Constructs a :class:`Request <Request>`, prepares it and sends it.
        Returns :class:`Response <Response>` object.

        :param method: method for the new :class:`Request` object.
        :param url: URL for the new :class:`Request` object.
        :param params: (optional) Dictionary or bytes to be sent in the query
            string for the :class:`Request`.
        :param data: (optional) Dictionary or bytes to send in the body of the
            :class:`Request`.
        :param headers: (optional) Dictionary of HTTP Headers to send with the
            :class:`Request`.
        :param cookies: (optional) Dict or CookieJar object to send with the
            :class:`Request`.
        :param files: (optional) Dictionary of 'filename': file-like-objects
            for multipart encoding upload.
        :param auth: (optional) Auth tuple or callable to enable
            Basic/Digest/Custom HTTP Auth.
        :param timeout: (optional) Float describing the timeout of the
            request in seconds.
        :param allow_redirects: (optional) Boolean. Set to True by default.
        :param proxies: (optional) Dictionary mapping protocol to the URL of
            the proxy.
        :param stream: (optional) whether to immediately download the response
            content. Defaults to ``False``.
        :param verify: (optional) if ``True``, the SSL cert will be verified.
            A CA_BUNDLE path can also be provided.
        :param cert: (optional) if String, path to ssl client cert file (.pem).
            If Tuple, ('cert', 'key') pair.
        umethoduurluheadersufilesudatauparamsuauthucookiesuhooksuREQUESTS_CA_BUNDLEuCURL_CA_BUNDLEustreamutimeoutuverifyucertuproxiesuallow_redirectsF(ubuiltin_struRequestuupperuprepare_requestu	trust_envuget_environ_proxiesuitemsu
setdefaultuFalseuosuenvironugetu
merge_settinguproxiesustreamuverifyucertusend(uselfumethoduurluparamsudatauheadersucookiesufilesuauthutimeoutuallow_redirectsuproxiesuhooksustreamuverifyucerturequprepuenv_proxiesukuvusend_kwargsuresp((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyurequestlsD,		
uSession.requestcKs#|jdd�|jd||�S(u�Sends a GET request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        uallow_redirectsuGETT(u
setdefaultuTrueurequest(uselfuurlukwargs((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyuget�suSession.getcKs#|jdd�|jd||�S(u�Sends a OPTIONS request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        uallow_redirectsuOPTIONST(u
setdefaultuTrueurequest(uselfuurlukwargs((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyuoptions�suSession.optionscKs#|jdd�|jd||�S(u�Sends a HEAD request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        uallow_redirectsuHEADF(u
setdefaultuFalseurequest(uselfuurlukwargs((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyuhead�suSession.headcKs|jd|d||�S(u8Sends a POST request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        uPOSTudata(urequest(uselfuurludataukwargs((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyupost�suSession.postcKs|jd|d||�S(u7Sends a PUT request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        uPUTudata(urequest(uselfuurludataukwargs((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyuput�suSession.putcKs|jd|d||�S(u9Sends a PATCH request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        uPATCHudata(urequest(uselfuurludataukwargs((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyupatch�su
Session.patchcKs|jd||�S(u�Sends a DELETE request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        uDELETE(urequest(uselfuurlukwargs((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyudeletesuSession.deletec
Ks|jd|j�|jd|j�|jd|j�|jd|j�t|t�sjtd��n|jdd
�}|j
d�}|j
d�}|j
d�}|j
d�}|j
d�}|j}	|jd|j
�}
tj�}|
j||�}tj�||_td	|	||�}|jrdx-|jD]}
t|j|
j|
j�q>Wnt|j||j�|j||d|d|d|d|d|�}|r�d
d�|D�ng}|r�|jd|�|j�}||_n|s|jn|S(uSend a given PreparedRequest.ustreamuverifyucertuproxiesu#You can only send PreparedRequests.uallow_redirectsutimeoutuurluresponsecSsg|]}|�qS(((u.0uresp((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu
<listcomp>Is	u Session.send.<locals>.<listcomp>iT(u
setdefaultustreamuverifyucertuproxiesu
isinstanceuPreparedRequestu
ValueErrorupopuTrueugetuhooksuget_adapteruurludatetimeuutcnowusenduelapsedu
dispatch_hookuhistoryuextract_cookies_to_jarucookiesurequesturawuresolve_redirectsuinsertucontent(uselfurequestukwargsuallow_redirectsustreamutimeoutuverifyucertuproxiesuhooksuadapterustartururespugenuhistory((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyusendsH		 	
uSession.sendcCsMx6|jj�D]%\}}|j�j|�r|SqWtd|��dS(u>Returns the appropriate connnection adapter for the given URL.u*No connection adapters were found for '%s'N(uadaptersuitemsuloweru
startswithu
InvalidSchema(uselfuurluprefixuadapter((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyuget_adapterXsuSession.get_adaptercCs(x!|jj�D]}|j�qWdS(u+Closes all adapters and as such the sessionN(uadaptersuvaluesuclose(uselfuv((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyuclosebsu
Session.closecsW||j�<�fdd�|jD�}x'|D]}|jj|�|j|<q0WdS(ukRegisters a connection adapter to a prefix.

        Adapters are sorted in descending order by key length.cs.g|]$}t|�t��kr|�qS((ulen(u.0uk(uprefix(u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu
<listcomp>ms	u!Session.mount.<locals>.<listcomp>N(uadaptersupop(uselfuprefixuadapterukeys_to_moveukey((uprefixu6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyumountgs

u
Session.mountcs t�fdd��jD��S(Nc3s'|]}|t�|d�fVqdS(N(ugetattruNone(u.0uattr(uself(u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu	<genexpr>ssu'Session.__getstate__.<locals>.<genexpr>(udictu	__attrs__(uself((uselfu6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu__getstate__rsuSession.__getstate__cCs1x*|j�D]\}}t|||�q
WdS(N(uitemsusetattr(uselfustateuattruvalue((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu__setstate__usuSession.__setstate__NT(u__name__u
__module__u__qualname__u__doc__u	__attrs__u__init__u	__enter__u__exit__uprepare_requestuNoneuTrueurequestugetuoptionsuheadupostuputupatchudeleteusenduget_adapterucloseumountu__getstate__u__setstate__(u
__locals__((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyuSession�sD3(S





	G
uSessioncCst�S(u2Returns a :class:`Session` for context-management.(uSession(((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyusessionzsusession(4u__doc__uosucollectionsuMappingudatetimeuauthu_basic_auth_strucompatu	cookielibuOrderedDictuurljoinuurlparseubuiltin_strucookiesucookiejar_from_dictuextract_cookies_to_jaruRequestsCookieJaru
merge_cookiesumodelsuRequestuPreparedRequestuDEFAULT_REDIRECT_LIMITuhooksu
default_hooksu
dispatch_hookuutilsuto_key_val_listudefault_headersuto_native_stringu
exceptionsuTooManyRedirectsu
InvalidSchemauChunkedEncodingErroruContentDecodingErroru
structuresuCaseInsensitiveDictuadaptersuHTTPAdapterurequote_uriuget_environ_proxiesuget_netrc_authushould_bypass_proxiesuget_auth_from_urlustatus_codesucodesuREDIRECT_STATIu
merge_settingumerge_hooksuobjectuSessionRedirectMixinuSessionusession(((u6/tmp/pip-zej_zi-build/pip/_vendor/requests/sessions.pyu<module>
s*(""(!���site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-33.pyc000064400000013467151733463650022746 0ustar00�
7�Re@c@scddlmZiBd�d6d�d6d�d6d�d	6d�d6d�d6d�d6d�d6d�d6d�d6d�d 6d�d#6d�d(6d�d*6d�d,6d�d.6d�d26d�d46d�d76d�d96d�d;6d�d=6d�dA6d�dD6d�dG6d�dI6d�dL6d�dN6d�dQ6d�dT6d�dV6d�dZ6d�d]6d�d_6d�da6d�dc6d�df6d�dh6d�dj6d�dn6d�dr6d�dt6d�dx6d�d{6d�d}6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6d�d�6Zed�d��Zxieej��D]U\ZZxFeD]>Ze	eee�ej
d��se	eej�e�qqWqWd�S(�i(u
LookupDictucontinueiduswitching_protocolsieu
processingifu
checkpointiguuri_too_longurequest_uri_too_longizuokuokayuall_okuall_okayuall_goodu\o/u✓i�ucreatedi�uacceptedi�unon_authoritative_infounon_authoritative_informationi�u
no_contenti�u
reset_contentureseti�upartial_contentupartiali�umulti_statusumultiple_statusumulti_statiumultiple_statii�ualready_reportedi�uim_usedi�umultiple_choicesi,umoved_permanentlyumovedu\o-i-ufoundi.u	see_otheruotheri/unot_modifiedi0u	use_proxyi1uswitch_proxyi2utemporary_redirectutemporary_movedu	temporaryi3uresume_incompleteuresumei4ubad_requestubadi�uunauthorizedi�upayment_requiredupaymenti�u	forbiddeni�u	not_foundu-o-i�umethod_not_allowedunot_allowedi�unot_acceptablei�uproxy_authentication_requiredu
proxy_authuproxy_authenticationi�urequest_timeoututimeouti�uconflicti�ugonei�ulength_requiredi�uprecondition_failedupreconditioni�urequest_entity_too_largei�urequest_uri_too_largei�uunsupported_media_typeuunsupported_mediau
media_typei�urequested_range_not_satisfiableurequested_rangeurange_not_satisfiablei�uexpectation_failedi�uim_a_teapotuteapotu
i_am_a_teapoti�uunprocessable_entityu
unprocessablei�ulockedi�ufailed_dependencyu
dependencyi�uunordered_collectionu	unorderedi�uupgrade_requireduupgradei�uprecondition_requiredi�utoo_many_requestsutoo_manyi�uheader_fields_too_largeufields_too_largei�uno_responseunonei�u
retry_withuretryi�u$blocked_by_windows_parental_controlsuparental_controlsi�uunavailable_for_legal_reasonsu
legal_reasonsi�uclient_closed_requesti�uinternal_server_erroruserver_erroru/o\u✗i�unot_implementedi�ubad_gatewayi�uservice_unavailableuunavailablei�ugateway_timeouti�uhttp_version_not_supporteduhttp_versioni�uvariant_also_negotiatesi�uinsufficient_storagei�ubandwidth_limit_exceededu	bandwidthi�unot_extendedi�unameustatus_codesu\N(ucontinue(uswitching_protocols(u
processing(u
checkpoint(uuri_too_longurequest_uri_too_long(uokuokayuall_okuall_okayuall_goodu\o/u✓(ucreated(uaccepted(unon_authoritative_infounon_authoritative_information(u
no_content(u
reset_contentureset(upartial_contentupartial(umulti_statusumultiple_statusumulti_statiumultiple_stati(ualready_reported(uim_used(umultiple_choices(umoved_permanentlyumovedu\o-(ufound(u	see_otheruother(unot_modified(u	use_proxy(uswitch_proxy(utemporary_redirectutemporary_movedu	temporary(uresume_incompleteuresume(ubad_requestubad(uunauthorized(upayment_requiredupayment(u	forbidden(u	not_foundu-o-(umethod_not_allowedunot_allowed(unot_acceptable(uproxy_authentication_requiredu
proxy_authuproxy_authentication(urequest_timeoututimeout(uconflict(ugone(ulength_required(uprecondition_faileduprecondition(urequest_entity_too_large(urequest_uri_too_large(uunsupported_media_typeuunsupported_mediau
media_type(urequested_range_not_satisfiableurequested_rangeurange_not_satisfiable(uexpectation_failed(uim_a_teapotuteapotu
i_am_a_teapot(uunprocessable_entityu
unprocessable(ulocked(ufailed_dependencyu
dependency(uunordered_collectionu	unordered(uupgrade_requireduupgrade(uprecondition_requireduprecondition(utoo_many_requestsutoo_many(uheader_fields_too_largeufields_too_large(uno_responseunone(u
retry_withuretry(u$blocked_by_windows_parental_controlsuparental_controls(uunavailable_for_legal_reasonsu
legal_reasons(uclient_closed_request(uinternal_server_erroruserver_erroru/o\u✗(unot_implemented(ubad_gateway(uservice_unavailableuunavailable(ugateway_timeout(uhttp_version_not_supporteduhttp_version(uvariant_also_negotiates(uinsufficient_storage(ubandwidth_limit_exceededu	bandwidth(unot_extended(u
structuresu
LookupDictu_codesucodesulistuitemsucodeutitlesutitleusetattru
startswithuupper(((u:/tmp/pip-zej_zi-build/pip/_vendor/requests/status_codes.pyu<module>s�

site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-33.pyc000064400000060340151733463650021672 0ustar00�
7�Re.Ac
@s:dZddlZddlZddlmZmZmZmZyddlZeWne	k
rtddl
ZYnXGdd�de�ZGdd�de�Z
d	d
�Zdd�Zddd
d�ZGdd�de�ZGdd�dejej�Zdd�Zdd�Zdddd�Zdd�ZdS(u�
Compatibility code to be able to use `cookielib.CookieJar` with requests.

requests.utils imports from here, so be careful with imports.
iNi(u	cookielibuurlparseu
urlunparseuMorselcBs�|EeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
ddd�Zdd�Z
dd�Zdd�Zedd��Zedd��Zedd��ZdS(uMockRequestu�Wraps a `requests.Request` to mimic a `urllib2.Request`.

    The code in `cookielib.CookieJar` expects this interface in order to correctly
    manage cookie policies, i.e., determine whether a cookie can be set, given the
    domains of the request and the cookie.

    The original request object is read-only. The client is responsible for collecting
    the new headers via `get_new_headers()` and interpreting them appropriately. You
    probably want `get_cookie_header`, defined below.
    cCs.||_i|_t|jj�j|_dS(N(u_ru_new_headersuurlparseuurluschemeutype(uselfurequest((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyu__init__!s		uMockRequest.__init__cCs|jS(N(utype(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuget_type&suMockRequest.get_typecCst|jj�jS(N(uurlparseu_ruurlunetloc(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuget_host)suMockRequest.get_hostcCs
|j�S(N(uget_host(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuget_origin_req_host,suMockRequest.get_origin_req_hostcCsl|jjjd�s|jjS|jjd}t|jj�}t|j||j|j|j	|j
g�S(NuHost(u_ruheadersugetuurluurlparseu
urlunparseuschemeupathuparamsuqueryufragment(uselfuhostuparsed((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuget_full_url/s
uMockRequest.get_full_urlcCsdS(NT(uTrue(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuis_unverifiable=suMockRequest.is_unverifiablecCs||jjkp||jkS(N(u_ruheadersu_new_headers(uselfuname((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyu
has_header@suMockRequest.has_headercCs%|jjj||jj||��S(N(u_ruheadersugetu_new_headers(uselfunameudefault((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyu
get_headerCsuMockRequest.get_headercCstd��dS(uMcookielib has no legitimate use for this method; add it back if you find one.u=Cookie headers should be added with add_unredirected_header()N(uNotImplementedError(uselfukeyuval((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyu
add_headerFsuMockRequest.add_headercCs||j|<dS(N(u_new_headers(uselfunameuvalue((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuadd_unredirected_headerJsu#MockRequest.add_unredirected_headercCs|jS(N(u_new_headers(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuget_new_headersMsuMockRequest.get_new_headerscCs
|j�S(N(uis_unverifiable(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuunverifiablePsuMockRequest.unverifiablecCs
|j�S(N(uget_origin_req_host(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuorigin_req_hostTsuMockRequest.origin_req_hostcCs
|j�S(N(uget_host(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuhostXsuMockRequest.hostN(u__name__u
__module__u__qualname__u__doc__u__init__uget_typeuget_hostuget_origin_req_hostuget_full_urluis_unverifiableu
has_headeruNoneu
get_headeru
add_headeruadd_unredirected_headeruget_new_headersupropertyuunverifiableuorigin_req_hostuhost(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuMockRequests
uMockRequestcBs>|EeZdZdZdd�Zdd�Zdd�ZdS(	uMockResponseu�Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`.

    ...what? Basically, expose the parsed HTTP headers from the server response
    the way `cookielib` expects to see them.
    cCs
||_dS(u�Make a MockResponse for `cookielib` to read.

        :param headers: a httplib.HTTPMessage or analogous carrying the headers
        N(u_headers(uselfuheaders((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyu__init__dsuMockResponse.__init__cCs|jS(N(u_headers(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuinfoksuMockResponse.infocCs|jj|�dS(N(u_headersu
getheaders(uselfuname((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyu
getheadersnsuMockResponse.getheadersN(u__name__u
__module__u__qualname__u__doc__u__init__uinfou
getheaders(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuMockResponse]suMockResponsecCsNt|d�o|jsdSt|�}t|jj�}|j||�dS(u�Extract the cookies from the response into a CookieJar.

    :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar)
    :param request: our own requests.Request object
    :param response: urllib3.HTTPResponse object
    u_original_responseN(uhasattru_original_responseuMockRequestuMockResponseumsguextract_cookies(ujarurequesturesponseurequres((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuextract_cookies_to_jarrs	uextract_cookies_to_jarcCs,t|�}|j|�|j�jd�S(uOProduce an appropriate Cookie header string to be sent with `request`, or None.uCookie(uMockRequestuadd_cookie_headeruget_new_headersuget(ujarurequestur((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuget_cookie_header�s
uget_cookie_headercCs�g}x{|D]s}|j|kr
|dks=||jkr�|dksX||jkr}|j|j|j|jf�q}q�q
q
Wx*|D]"\}}}|j|||�q�WdS(ukUnsets a cookie by name, by default over all domains and paths.

    Wraps CookieJar.clear(), is O(n).
    N(unameuNoneudomainupathuappenduclear(u	cookiejarunameudomainupathu
clearablesucookie((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuremove_cookie_by_name�s
,uremove_cookie_by_namecBs|EeZdZdZdS(uCookieConflictErroru�There are two cookies that meet the criteria specified in the cookie jar.
    Use .get and .set and include domain and path args in order to be more specific.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuCookieConflictError�suCookieConflictErrorcsI|EeZdZdZd.d.d.dd�Zdd�Zdd�Zdd	�Zd
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zd.d.dd�Zdd�Zdd�Zdd�Z�fd d!�Z�fd"d#�Zd.d.d$d%�Zd.d.d&d'�Zd(d)�Zd*d+�Zd,d-�Z�S(/uRequestsCookieJaru�Compatibility class; is a cookielib.CookieJar, but exposes a dict interface.

    This is the CookieJar we create by default for requests and sessions that
    don't specify one, since some clients may expect response.cookies and
    session.cookies to support dict operations.

    Don't use the dict interface internally; it's just for compatibility with
    with external client code. All `requests` code should work out of the box
    with externally provided instances of CookieJar, e.g., LWPCookieJar and
    FileCookieJar.

    Caution: dictionary operations that are normally O(1) may be O(n).

    Unlike a regular CookieJar, this class is pickleable.
    cCs4y|j|||�SWntk
r/|SYnXdS(u�Dict-like get() that also supports optional domain and path args in
        order to resolve naming collisions from using one cookie jar over
        multiple domains. Caution: operation is O(n), not O(1).N(u_find_no_duplicatesuKeyError(uselfunameudefaultudomainupath((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuget�s
uRequestsCookieJar.getcKs||dkr;t||d|jd�d|jd��dSt|t�rYt|�}nt|||�}|j|�|S(u�Dict-like set() that also supports optional domain and path args in
        order to resolve naming collisions from using one cookie jar over
        multiple domains.udomainupathN(uNoneuremove_cookie_by_nameugetu
isinstanceuMorselumorsel_to_cookieu
create_cookieu
set_cookie(uselfunameuvalueukwargsuc((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuset�s+
uRequestsCookieJar.setccs#xt|�D]}|jVq
WdS(uyDict-like iterkeys() that returns an iterator of names of cookies from the jar.
        See itervalues() and iteritems().N(uiteruname(uselfucookie((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuiterkeys�suRequestsCookieJar.iterkeyscCst|j��S(uhDict-like keys() that returns a list of names of cookies from the jar.
        See values() and items().(ulistuiterkeys(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyukeys�suRequestsCookieJar.keysccs#xt|�D]}|jVq
WdS(uzDict-like itervalues() that returns an iterator of values of cookies from the jar.
        See iterkeys() and iteritems().N(uiteruvalue(uselfucookie((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyu
itervalues�suRequestsCookieJar.itervaluescCst|j��S(uiDict-like values() that returns a list of values of cookies from the jar.
        See keys() and items().(ulistu
itervalues(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuvalues�suRequestsCookieJar.valuesccs,x%t|�D]}|j|jfVq
WdS(uzDict-like iteritems() that returns an iterator of name-value tuples from the jar.
        See iterkeys() and itervalues().N(uiterunameuvalue(uselfucookie((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyu	iteritems�suRequestsCookieJar.iteritemscCst|j��S(u�Dict-like items() that returns a list of name-value tuples from the jar.
        See keys() and values(). Allows client-code to call "dict(RequestsCookieJar)
        and get a vanilla python dict of key value pairs.(ulistu	iteritems(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuitems�suRequestsCookieJar.itemscCsCg}x6t|�D](}|j|kr|j|j�qqW|S(u2Utility method to list all the domains in the jar.(uiterudomainuappend(uselfudomainsucookie((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyulist_domains�s
uRequestsCookieJar.list_domainscCsCg}x6t|�D](}|j|kr|j|j�qqW|S(u0Utility method to list all the paths in the jar.(uiterupathuappend(uselfupathsucookie((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyu
list_paths�s
uRequestsCookieJar.list_pathscCsSg}xFt|�D]8}|jdk	r;|j|kr;dS|j|j�qWdS(uWReturns True if there are multiple domains in the jar.
        Returns False otherwise.NTF(uiterudomainuNoneuTrueuappenduFalse(uselfudomainsucookie((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyumultiple_domains�su"RequestsCookieJar.multiple_domainscCsji}x]t|�D]O}|dks4|j|kr|dksO|j|kr|j||j<qqW|S(u�Takes as an argument an optional domain and path and returns a plain old
        Python dict of name-value pairs of cookies that meet the requirements.N(uiteruNoneudomainupathuvalueuname(uselfudomainupathu
dictionaryucookie((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuget_dicts'uRequestsCookieJar.get_dictcCs
|j|�S(u�Dict-like __getitem__() for compatibility with client code. Throws exception
        if there are more than one cookie with name. In that case, use the more
        explicit get() method instead. Caution: operation is O(n), not O(1).(u_find_no_duplicates(uselfuname((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyu__getitem__suRequestsCookieJar.__getitem__cCs|j||�dS(u�Dict-like __setitem__ for compatibility with client code. Throws exception
        if there is already a cookie of that name in the jar. In that case, use the more
        explicit set() method instead.N(uset(uselfunameuvalue((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyu__setitem__suRequestsCookieJar.__setitem__cCst||�dS(uSDeletes a cookie given a name. Wraps cookielib.CookieJar's remove_cookie_by_name().N(uremove_cookie_by_name(uselfuname((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyu__delitem__suRequestsCookieJar.__delitem__csmt|jd�rQ|jjd�rQ|jjd�rQ|jjdd�|_ntt|�j|||�S(Nu
startswithu"u\"u(uhasattruvalueu
startswithuendswithureplaceusuperuRequestsCookieJaru
set_cookie(uselfucookieuargsukwargs(u	__class__(u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyu
set_cookie!s6uRequestsCookieJar.set_cookiecsMt|tj�r3x4|D]}|j|�qWntt|�j|�dS(uAUpdates this jar with cookies from another CookieJar or dict-likeN(u
isinstanceu	cookielibu	CookieJaru
set_cookieusuperuRequestsCookieJaruupdate(uselfuotherucookie(u	__class__(u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuupdate&s
uRequestsCookieJar.updatecCs�xft|�D]X}|j|kr
|dks=|j|kre|dksX|j|krb|jSqeq
q
Wtd|||f��dS(u6Requests uses this method internally to get cookie values. Takes as args name
        and optional domain and path. Returns a cookie.value. If there are conflicting cookies,
        _find arbitrarily chooses one. See _find_no_duplicates if you want an exception thrown
        if there are conflicting cookies.uname=%r, domain=%r, path=%rN(uiterunameuNoneudomainupathuvalueuKeyError(uselfunameudomainupathucookie((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyu_find.suRequestsCookieJar._findcCs�d}x�t|�D]|}|j|kr|dksC|j|kr�|dks^|j|kr�|dk	r}td|��n|j}q�q�qqW|r�|Std|||f��dS(uA__get_item__ and get call _find_no_duplicates -- never used in Requests internally.
        Takes as args name and optional domain and path. Returns a cookie.value.
        Throws KeyError if cookie is not found and CookieConflictError if there are
        multiple cookies that match name and optionally domain and path.u(There are multiple cookies with name, %runame=%r, domain=%r, path=%rN(uNoneuiterunameudomainupathuCookieConflictErroruvalueuKeyError(uselfunameudomainupathutoReturnucookie((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyu_find_no_duplicates;su%RequestsCookieJar._find_no_duplicatescCs |jj�}|jd�|S(u4Unlike a normal CookieJar, this class is pickleable.u
_cookies_lock(u__dict__ucopyupop(uselfustate((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyu__getstate__Ms
uRequestsCookieJar.__getstate__cCs5|jj|�d|jkr1tj�|_ndS(u4Unlike a normal CookieJar, this class is pickleable.u
_cookies_lockN(u__dict__uupdateu	threadinguRLocku
_cookies_lock(uselfustate((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyu__setstate__TsuRequestsCookieJar.__setstate__cCst�}|j|�|S(u(Return a copy of this RequestsCookieJar.(uRequestsCookieJaruupdate(uselfunew_cj((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyucopyZs	
uRequestsCookieJar.copyN(u__name__u
__module__u__qualname__u__doc__uNoneugetusetuiterkeysukeysu
itervaluesuvaluesu	iteritemsuitemsulist_domainsu
list_pathsumultiple_domainsuget_dictu__getitem__u__setitem__u__delitem__u
set_cookieuupdateu_findu_find_no_duplicatesu__getstate__u__setstate__ucopy(u
__locals__((u	__class__u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyuRequestsCookieJar�s.	


uRequestsCookieJarcKstddd|d|dddddd	d
dddddd
ddddidd6dd�
}t|�t|�}|r�d}t|t|���n|j|�t|d�|d<t|d�|d<|dj	d�|d<t|d�|d<t
j|�S(u�Make a cookie from underspecified parameters.

    By default, the pair of `name` and `value` will be set for the domain ''
    and sent on every request (this is sometimes called a "supercookie").
    uversioniunameuvalueuportudomainuupathu/usecureuexpiresudiscarducommentucomment_urlurestuHttpOnlyurfc2109u4create_cookie() got unexpected keyword arguments: %suport_specifiedudomain_specifiedu.udomain_initial_dotupath_specifiedNFT(udictuNoneuFalseuTrueusetu	TypeErrorulistuupdateuboolu
startswithu	cookielibuCookie(unameuvalueukwargsuresultubadargsuerr((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyu
create_cookieas0
	
u
create_cookiecCs�d}|dr'tj�|d}n9|dr`d}tjtj|d|��tj}ntd|ddt|d�ddd|dd|d|jd	|d	d
ddi|dd
6dddt|d�d|j	d|dp�d�
S(uBConvert a Morsel object into a Cookie containing the one k/v pair.umax-ageuexpiresu%a, %d-%b-%Y %H:%M:%S GMTucommentucomment_urludiscardudomainunameupathuporturestuhttponlyuHttpOnlyurfc2109usecureuvalueuversioniNF(
uNoneutimeumktimeustrptimeutimezoneu
create_cookieubooluFalseukeyuvalue(umorseluexpiresu
time_template((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyumorsel_to_cookie�s*

#

	
	umorsel_to_cookiecCs~|dkrt�}n|dk	rzdd�|D�}x@|D]5}|sV||kr>|jt|||��q>q>Wn|S(u-Returns a CookieJar from a key/value dictionary.

    :param cookie_dict: Dict of key/values to insert into CookieJar.
    :param cookiejar: (optional) A cookiejar to add the cookies to.
    :param overwrite: (optional) If False, will not replace cookies
        already in the jar with new ones.
    cSsg|]}|j�qS((uname(u.0ucookie((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyu
<listcomp>�s	u'cookiejar_from_dict.<locals>.<listcomp>N(uNoneuRequestsCookieJaru
set_cookieu
create_cookie(ucookie_dictu	cookiejaru	overwriteunames_from_jaruname((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyucookiejar_from_dict�s
$ucookiejar_from_dictcCs�t|tj�s!td��nt|t�rKt|d|dd�}nYt|tj�r�y|j|�Wq�tk
r�x|D]}|j	|�q�WYq�Xn|S(u�Add cookies to cookiejar and returns a merged CookieJar.

    :param cookiejar: CookieJar object to add the cookies to.
    :param cookies: Dictionary or CookieJar object to be added.
    u!You can only merge into CookieJaru	cookiejaru	overwriteF(
u
isinstanceu	cookielibu	CookieJaru
ValueErrorudictucookiejar_from_dictuFalseuupdateuAttributeErroru
set_cookie(u	cookiejarucookiesu
cookie_in_jar((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyu
merge_cookies�s

u
merge_cookiesT(u__doc__utimeucollectionsucompatu	cookielibuurlparseu
urlunparseuMorselu	threadinguImportErrorudummy_threadinguobjectuMockRequestuMockResponseuextract_cookies_to_jaruget_cookie_headeruNoneuremove_cookie_by_nameuRuntimeErroruCookieConflictErroru	CookieJaruMutableMappinguRequestsCookieJaru
create_cookieumorsel_to_cookieuTrueucookiejar_from_dictu
merge_cookies(((u5/tmp/pip-zej_zi-build/pip/_vendor/requests/cookies.pyu<module>s&"
H�#site-packages/pip/_vendor/requests/__pycache__/certs.cpython-33.pyc000064400000001504151733463650021353 0ustar00�
7�Re c@s>dZddlZdd�Zedkr:ee��ndS(u
certs.py
~~~~~~~~

This module returns the preferred default CA certificate bundle.

If you are packaging Requests, e.g., for a Linux distribution or a managed
environment, you can change the definition of where() to return a separately
packaged CA bundle.
iNcCstjjtjjt�d�S(u(Return the preferred certificate bundle.u
cacert.pem(uosupathujoinudirnameu__file__(((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/certs.pyuwheresuwhereu__main__(u__doc__uos.pathuosuwhereu__name__uprint(((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/certs.pyu<module>
ssite-packages/pip/_vendor/requests/__pycache__/utils.cpython-33.pyc000064400000053672151733463650021410 0ustar00�
7�ReNc@s�dZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZddlm
Z
ddlmZddlmZmZmZmZmZmZmZmZmZmZmZddlmZmZdd	lm Z dd
l!m"Z"efZ#dRZ$e
j%�Z&d
d�Z'dd�Z(dd�Z)dd�Z*dd�Z+dd�Z,dd�Z-dd�Z.dSdd�Z0dd �Z1d!d"�Z2d#d$�Z3d%d&�Z4d'd(�Z5d)d*�Z6d+d,�Z7e8d-d.�Z9d/d0�Z:d1d2�Z;d3d4�Z<d5d6�Z=d7d8�Z>d9d:�Z?d;d<�Z@d=d>�ZAd?d@dA�ZBdBdC�ZCdDdE�ZDdFjEdG�ZFeFdHZGeFdIZHdJdK�ZIdLdM�ZJdNdO�ZKdGdPdQ�ZLdS(Tu�
requests.utils
~~~~~~~~~~~~~~

This module provides utility functions that are used within Requests
that are also useful for external consumption.

iNi(u__version__(ucerts(uparse_http_list(uquoteuurlparseubytesustruOrderedDictuunquoteuis_py2ubuiltin_stru
getproxiesuproxy_bypassu
urlunparse(uRequestsCookieJarucookiejar_from_dict(uCaseInsensitiveDict(u
InvalidURLu.netrcu_netrccCs"t|d�r|j�}n|S(u/Returns an internal sequence dictionary update.uitems(uhasattruitems(ud((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyudict_to_sequence'sudict_to_sequencecCs�t|d�rt|�St|d�r/|jSt|d�ryy|j�}Wntjk
reYqyXtj|�jSnt|d�r�t|j��SdS(Nu__len__ulenufilenougetvalue(	uhasattrulenufilenouiouUnsupportedOperationuosufstatust_sizeugetvalue(uoufileno((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyu	super_len0s
u	super_lenc
Cs8yddlm}m}d}xbtD]Z}ytjjdj|��}Wntk
rcdSYnXtjj	|�r&|}Pq&q&W|dkr�dSt
|�}|jjd�d}yG||�j
|�}|r�|dr�dnd}	||	|dfSWn|tfk
rYnXWnttfk
r3YnXdS(u;Returns the Requests tuple auth for a given url from netrc.i(unetrcuNetrcParseErroru~/{0}Nu:ii(unetrcuNetrcParseErroruNoneuNETRC_FILESuosupathu
expanduseruformatuKeyErroruexistsuurlparseunetlocusplituauthenticatorsuIOErroruImportErroruAttributeError(
uurlunetrcuNetrcParseErroru
netrc_pathufulocuriuhostu_netrculogin_i((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyuget_netrc_authDs0

		uget_netrc_authcCsLt|dd�}|rH|ddkrH|ddkrHtjj|�SdS(u0Tries to guess the filename of the given object.unameiu<iu>Ni����(ugetattruNoneuosupathubasename(uobjuname((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyuguess_filenamers&uguess_filenamecCsD|dkrdSt|ttttf�r:td��nt|�S(u�Take an object and test to see if it can be represented as a
    dictionary. Unless it can not be represented as such, return an
    OrderedDict, e.g.,

    ::

        >>> from_key_val_list([('key', 'val')])
        OrderedDict([('key', 'val')])
        >>> from_key_val_list('string')
        ValueError: need more than 1 value to unpack
        >>> from_key_val_list({'key': 'val'})
        OrderedDict([('key', 'val')])
    u+cannot encode objects that are not 2-tuplesN(uNoneu
isinstanceustrubytesubooluintu
ValueErroruOrderedDict(uvalue((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyufrom_key_val_listys
ufrom_key_val_listcCse|dkrdSt|ttttf�r:td��nt|tj�r[|j	�}nt
|�S(uzTake an object and test to see if it can be represented as a
    dictionary. If it can be, return a list of tuples, e.g.,

    ::

        >>> to_key_val_list([('key', 'val')])
        [('key', 'val')]
        >>> to_key_val_list({'key': 'val'})
        [('key', 'val')]
        >>> to_key_val_list('string')
        ValueError: cannot encode objects that are not 2-tuples.
    u+cannot encode objects that are not 2-tuplesN(uNoneu
isinstanceustrubytesubooluintu
ValueErrorucollectionsuMappinguitemsulist(uvalue((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyuto_key_val_list�s
uto_key_val_listcCswg}xjt|�D]\}|dd�|dd�koDdknrbt|dd��}n|j|�qW|S(u�Parse lists as described by RFC 2068 Section 2.

    In particular, parse comma-separated lists where the elements of
    the list may include quoted-strings.  A quoted-string could
    contain a comma.  A non-quoted string could have quotes in the
    middle.  Quotes are removed automatically after parsing.

    It basically works like :func:`parse_set_header` just that items
    may appear multiple times and case sensitivity is preserved.

    The return value is a standard :class:`list`:

    >>> parse_list_header('token, "quoted value"')
    ['token', 'quoted value']

    To create a header from the :class:`list` again, use the
    :func:`dump_header` function.

    :param value: a string with a list header.
    :return: :class:`list`
    Niu"i����i����(u_parse_list_headeruunquote_header_valueuappend(uvalueuresultuitem((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyuparse_list_header�s0uparse_list_headercCs�i}x�t|�D]�}d|kr5d||<qn|jdd�\}}|dd�|dd�koxdknr�t|dd��}n|||<qW|S(uMParse lists of key, value pairs as described by RFC 2068 Section 2 and
    convert them into a python dict:

    >>> d = parse_dict_header('foo="is a fish", bar="as well"')
    >>> type(d) is dict
    True
    >>> sorted(d.items())
    [('bar', 'as well'), ('foo', 'is a fish')]

    If there is no value for a key it will be `None`:

    >>> parse_dict_header('key_without_value')
    {'key_without_value': None}

    To create a header from the :class:`dict` again, use the
    :func:`dump_header` function.

    :param value: a string with a dict header.
    :return: :class:`dict`
    u=iNu"i����i����(u_parse_list_headeruNoneusplituunquote_header_value(uvalueuresultuitemuname((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyuparse_dict_header�s
0uparse_dict_headercCsz|rv|d|d	ko%dknrv|dd
�}|sW|dd�dkrv|jdd�jdd�Sn|S(u�Unquotes a header value.  (Reversal of :func:`quote_header_value`).
    This does not use the real unquoting but what browsers are actually
    using for quoting.

    :param value: the header value to unquote.
    iiu"Niu\\u\u\"i����i����(ureplace(uvalueuis_filename((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyuunquote_header_value�s
*uunquote_header_valuecCs+i}x|D]}|j||j<q
W|S(uoReturns a key/value dictionary from a CookieJar.

    :param cj: CookieJar object to extract cookies from.
    (uvalueuname(ucjucookie_dictucookie((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyudict_from_cookiejars
udict_from_cookiejarcCst|�}|j|�|S(u�Returns a CookieJar from a key/value dictionary.

    :param cj: CookieJar to insert cookies into.
    :param cookie_dict: Dict of key/values to insert into CookieJar.
    (ucookiejar_from_dictuupdate(ucjucookie_dictucj2((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyuadd_dict_to_cookiejars
uadd_dict_to_cookiejarcCsftjddtj�}tjddtj�}tjd�}|j|�|j|�|j|�S(ulReturns encodings from given content string.

    :param content: bytestring to extract encodings from.
    u!<meta.*?charset=["\']*(.+?)["\'>]uflagsu+<meta.*?content=["\']*;?charset=(.+?)["\'>]u$^<\?xml.*?encoding=["\']*(.+?)["\'>](ureucompileuIufindall(ucontentu
charset_reu	pragma_reuxml_re((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyuget_encodings_from_contents
uget_encodings_from_contentcCs_|jd�}|sdStj|�\}}d|krK|djd�Sd|kr[dSdS(umReturns encodings from given HTTP Header Dict.

    :param headers: dictionary to extract encoding from.
    ucontent-typeucharsetu'"utextu
ISO-8859-1N(ugetuNoneucgiuparse_headerustrip(uheadersucontent_typeuparams((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyuget_encoding_from_headers,suget_encoding_from_headersccs�|jdkr)x|D]}|VqWdStj|j�dd�}x+|D]#}|j|�}|rK|VqKqKW|jddd�}|r�|VndS(uStream decodes a iterator.NuerrorsureplacesufinalT(uencodinguNoneucodecsugetincrementaldecoderudecodeuTrue(uiteratoruruitemudecoderuchunkurv((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyustream_decode_response_unicode@s
	
ustream_decode_response_unicodeccs@d}x3|t|�kr;||||�V||7}q	WdS(u Iterate over slices of a string.iN(ulen(ustringuslice_lengthupos((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyuiter_slicesRsuiter_slicescCs�g}t|j�}|rTyt|j|�SWqTtk
rP|j|�YqTXnyt|j|dd�SWntk
r�|jSYnXdS(uReturns the requested content back in unicode.

    :param r: Response object to get unicode content from.

    Tried:

    1. charset from content-type

    2. every encodings from ``<meta ... charset=XXX>``

    3. fall back and replace all unicode characters

    uerrorsureplaceN(uget_encoding_from_headersuheadersustrucontentuUnicodeErroruappendu	TypeError(urutried_encodingsuencoding((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyuget_unicode_from_responseZs

uget_unicode_from_responseu4ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzu0123456789-._~cCs�|jd�}x�tdt|��D]�}||dd�}t|�dkr�|j�r�ytt|d��}Wn"tk
r�td|��YnX|tkr�|||dd�||<q�d||||<q%d||||<q%Wdj	|�S(	u�Un-escape any percent-escape sequences in a URI that are unreserved
    characters. This leaves all reserved, illegal and non-ASCII bytes encoded.
    u%iiiiu%Invalid percent-escape sequence: '%s'Nu(
uspliturangeulenuisalnumuchruintu
ValueErroru
InvalidURLuUNRESERVED_SETujoin(uuriupartsuiuhuc((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyuunquote_unreserved�s
uunquote_unreservedcCstt|�dd�S(u�Re-quote the given URI.

    This function passes the given URI through an unquote/quote cycle to
    ensure that it is fully and consistently quoted.
    usafeu!#$%&'()*+,/:;=?@[]~(uquoteuunquote_unreserved(uuri((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyurequote_uri�s	urequote_uricCs�tjdtj|��d}|jd�\}}tjdtjtt|����d}tjdtj|��d|@}||@||@kS(u�
    This function allows you to check if on IP belongs to a network subnet
    Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24
             returns False if ip = 192.168.1.1 and net = 192.168.100.0/24
    u=Liu/(ustructuunpackusocketu	inet_atonusplitudotted_netmaskuint(uipunetuipaddrunetaddrubitsunetmaskunetwork((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyuaddress_in_network�s
+#uaddress_in_networkcCs/ddd|>dA}tjtjd|��S(ut
    Converts mask from /xx format to xxx.xxx.xxx.xxx
    Example: if mask is 24 function returns 255.255.255.0
    l��ii u>I(usocketu	inet_ntoaustructupack(umaskubits((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyudotted_netmask�sudotted_netmaskcCs1ytj|�Wntjk
r,dSYnXdS(NFT(usocketu	inet_atonuerroruFalseuTrue(u	string_ip((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyuis_ipv4_address�s
	uis_ipv4_addresscCs�|jd�dkr�yt|jd�d�}Wntk
rJdSYnX|dksc|dkrgdSytj|jd�d�Wq�tjk
r�dSYq�XndSdS(u9Very simple check of the cidr format in no_proxy variableu/ii iFT(	ucountuintusplitu
ValueErroruFalseusocketu	inet_atonuerroruTrue(ustring_networkumask((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyu
is_valid_cidr�s
	u
is_valid_cidrcCs"dd�}|d�}t|�j}|r�|jdd�jd�}|jd�d}t|�r�xs|D](}t|�rnt||�r�d	SqnqnWq�x@|D]5}|j|�s�|jd�dj|�r�d	Sq�Wnyt	|�}Wn!t
tjfk
rd
}YnX|rd	Sd
S(u:
    Returns whether we should bypass proxies or not.
    cSs(tjj|�p'tjj|j��S(N(uosuenvironugetuupper(uk((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyu<lambda>�su'should_bypass_proxies.<locals>.<lambda>uno_proxyu uu,u:iTF(uurlparseunetlocureplaceusplituis_ipv4_addressu
is_valid_cidruaddress_in_networkuTrueuendswithuproxy_bypassu	TypeErrorusocketugaierroruFalse(uurlu	get_proxyuno_proxyunetlocuipuproxy_ipuhostubypass((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyushould_bypass_proxies�s*

+ushould_bypass_proxiescCst|�riSt�SdS(u%Return a dict of environment proxies.N(ushould_bypass_proxiesu
getproxies(uurl((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyuget_environ_proxiessuget_environ_proxiesupython-requestscCs8tj�}|dkr'tj�}n�|dkr�dtjjtjjtjjf}tjjdkr�dj	|tjjg�}q�n<|dkr�tj�}n!|dkr�tj�}nd}ytj
�}tj�}Wntk
rd}d}YnXd	j	d
|t
fd
||fd
||fg�S(u4Return a string representing the default user agent.uCPythonuPyPyu%s.%s.%sufinaluuJythonu
IronPythonuUnknownu u%s/%s(uplatformupython_implementationupython_versionusysupypy_version_infoumajoruminorumicroureleaselevelujoinusystemureleaseuIOErroru__version__(unameu_implementationu_implementation_versionup_systemu	p_release((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyudefault_user_agent
s.	!

udefault_user_agentcCs+tit�d6djd�d6dd6�S(	Nu
User-Agentu, ugzipudeflateuAccept-Encodingu*/*uAccept(ugzipudeflate(uCaseInsensitiveDictudefault_user_agentujoin(((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyudefault_headers)s
udefault_headersc	Cs�g}d}x�|jd�D]�}y|jdd�\}}Wntk
r_|d}}YnXi}|jd�|d<xb|jd�D]Q}y|jd�\}}Wntk
r�PYnX|j|�||j|�<q�W|j|�qW|S(	u�Return a dict of parsed link headers proxies.

    i.e. Link: <http:/.../front.jpeg>; rel=front; type="image/jpeg",<http://.../back.jpeg>; rel=back;type="image/jpeg"

    u '"u,u;iuu<> '"uurlu=(usplitu
ValueErrorustripuappend(	uvalueulinksu
replace_charsuvaluurluparamsulinkuparamukey((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyuparse_header_links1s"

 uparse_header_linksuuasciiiicCs|dd�}|tjtjfkr,dS|dd�tjkrIdS|dd�tjtjfkrodS|jt�}|dkr�dS|dkr�|ddd�tkr�d	S|d
dd�tkr�dSn|dkr|dd�t	kr�dS|d
d�t	krd
SndS(Niuutf-32iu	utf-8-sigiuutf-16iuutf-8u	utf-16-beiu	utf-16-leu	utf-32-beu	utf-32-le(ucodecsuBOM_UTF32_LEuBOM32_BEuBOM_UTF8uBOM_UTF16_LEuBOM_UTF16_BEucountu_nullu_null2u_null3uNone(udatausampleu	nullcount((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyuguess_json_utfYs*"uguess_json_utfcCsSt||�\}}}}}}|s7||}}nt||||||f�S(u�Given a URL that may or may not have a scheme, prepend the given scheme.
    Does not replace a present scheme with the one provided as an argument.(uurlparseu
urlunparse(uurlu
new_schemeuschemeunetlocupathuparamsuqueryufragment((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyuprepend_scheme_if_neededvs!uprepend_scheme_if_neededcCsSt|�}y"t|j�t|j�f}Wnttfk
rNd}YnX|S(u_Given a url with authentication components, extract them into a tuple of
    username,password.u(uu(uurlparseuunquoteuusernameupassworduAttributeErroru	TypeError(uurluparseduauth((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyuget_auth_from_url�s"uget_auth_from_urlcCsId}t|t�r|}n'tr6|j|�}n|j|�}|S(u�
    Given a string object, regardless of type, returns a representation of that
    string in the native string type, encoding and decoding where necessary.
    This assumes ASCII unless told otherwise.
    N(uNoneu
isinstanceubuiltin_struis_py2uencodeudecode(ustringuencodinguout((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyuto_native_string�s	uto_native_string(u.netrcu_netrcF(Mu__doc__ucgiucodecsucollectionsuiouosuplatformureusysusocketustructuu__version__ucertsucompatuparse_http_listu_parse_list_headeruquoteuurlparseubytesustruOrderedDictuunquoteuis_py2ubuiltin_stru
getproxiesuproxy_bypassu
urlunparseucookiesuRequestsCookieJarucookiejar_from_dictu
structuresuCaseInsensitiveDictu
exceptionsu
InvalidURLu_hush_pyflakesuNETRC_FILESuwhereuDEFAULT_CA_BUNDLE_PATHudict_to_sequenceu	super_lenuget_netrc_authuguess_filenameufrom_key_val_listuto_key_val_listuparse_list_headeruparse_dict_headeruFalseuunquote_header_valueudict_from_cookiejaruadd_dict_to_cookiejaruget_encodings_from_contentuget_encoding_from_headersustream_decode_response_unicodeuiter_slicesuget_unicode_from_responseu	frozensetuUNRESERVED_SETuunquote_unreservedurequote_uriuaddress_in_networkudotted_netmaskuis_ipv4_addressu
is_valid_cidrushould_bypass_proxiesuget_environ_proxiesudefault_user_agentudefault_headersuparse_header_linksuencodeu_nullu_null2u_null3uguess_json_utfuprepend_scheme_if_neededuget_auth_from_urluto_native_string(((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/utils.pyu<module>
srL		.""

	-#


site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-33.pyc000064400000002200151733463650021350 0ustar00�
7�Re4c@s+dZdgZdd�Zdd�ZdS(u�
requests.hooks
~~~~~~~~~~~~~~

This module provides the capabilities for the Requests hooks system.

Available hooks:

``response``:
    The response generated from a Request.

uresponsecCs%i}xtD]}g||<q
W|S(N(uHOOKS(uhooksuevent((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/hooks.pyu
default_hookss
u
default_hookscKs�|pt�}||kr}|j|�}t|d�rE|g}nx5|D]*}|||�}|dk	rL|}qLqLWn|S(u6Dispatches a hook dictionary on a given piece of data.u__call__N(udictugetuhasattruNone(ukeyuhooksu	hook_dataukwargsuhooku
_hook_data((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/hooks.pyu
dispatch_hooks
u
dispatch_hookN(u__doc__uHOOKSu
default_hooksu
dispatch_hook(((u3/tmp/pip-zej_zi-build/pip/_vendor/requests/hooks.pyu<module>s		site-packages/pip/_vendor/requests/status_codes.py000064400000006100151733463650016447 0ustar00# -*- coding: utf-8 -*-

from .structures import LookupDict

_codes = {

    # Informational.
    100: ('continue',),
    101: ('switching_protocols',),
    102: ('processing',),
    103: ('checkpoint',),
    122: ('uri_too_long', 'request_uri_too_long'),
    200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'),
    201: ('created',),
    202: ('accepted',),
    203: ('non_authoritative_info', 'non_authoritative_information'),
    204: ('no_content',),
    205: ('reset_content', 'reset'),
    206: ('partial_content', 'partial'),
    207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'),
    208: ('already_reported',),
    226: ('im_used',),

    # Redirection.
    300: ('multiple_choices',),
    301: ('moved_permanently', 'moved', '\\o-'),
    302: ('found',),
    303: ('see_other', 'other'),
    304: ('not_modified',),
    305: ('use_proxy',),
    306: ('switch_proxy',),
    307: ('temporary_redirect', 'temporary_moved', 'temporary'),
    308: ('resume_incomplete', 'resume'),

    # Client Error.
    400: ('bad_request', 'bad'),
    401: ('unauthorized',),
    402: ('payment_required', 'payment'),
    403: ('forbidden',),
    404: ('not_found', '-o-'),
    405: ('method_not_allowed', 'not_allowed'),
    406: ('not_acceptable',),
    407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'),
    408: ('request_timeout', 'timeout'),
    409: ('conflict',),
    410: ('gone',),
    411: ('length_required',),
    412: ('precondition_failed', 'precondition'),
    413: ('request_entity_too_large',),
    414: ('request_uri_too_large',),
    415: ('unsupported_media_type', 'unsupported_media', 'media_type'),
    416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'),
    417: ('expectation_failed',),
    418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'),
    422: ('unprocessable_entity', 'unprocessable'),
    423: ('locked',),
    424: ('failed_dependency', 'dependency'),
    425: ('unordered_collection', 'unordered'),
    426: ('upgrade_required', 'upgrade'),
    428: ('precondition_required', 'precondition'),
    429: ('too_many_requests', 'too_many'),
    431: ('header_fields_too_large', 'fields_too_large'),
    444: ('no_response', 'none'),
    449: ('retry_with', 'retry'),
    450: ('blocked_by_windows_parental_controls', 'parental_controls'),
    451: ('unavailable_for_legal_reasons', 'legal_reasons'),
    499: ('client_closed_request',),

    # Server Error.
    500: ('internal_server_error', 'server_error', '/o\\', '✗'),
    501: ('not_implemented',),
    502: ('bad_gateway',),
    503: ('service_unavailable', 'unavailable'),
    504: ('gateway_timeout',),
    505: ('http_version_not_supported', 'http_version'),
    506: ('variant_also_negotiates',),
    507: ('insufficient_storage',),
    509: ('bandwidth_limit_exceeded', 'bandwidth'),
    510: ('not_extended',),
}

codes = LookupDict(name='status_codes')

for (code, titles) in list(_codes.items()):
    for title in titles:
        setattr(codes, title, code)
        if not title.startswith('\\'):
            setattr(codes, title.upper(), code)
site-packages/pip/_vendor/requests/structures.py000064400000006725151733463650016207 0ustar00# -*- coding: utf-8 -*-

"""
requests.structures
~~~~~~~~~~~~~~~~~~~

Data structures that power Requests.

"""

import os
import collections
from itertools import islice


class IteratorProxy(object):
    """docstring for IteratorProxy"""
    def __init__(self, i):
        self.i = i
        # self.i = chain.from_iterable(i)

    def __iter__(self):
        return self.i

    def __len__(self):
        if hasattr(self.i, '__len__'):
            return len(self.i)
        if hasattr(self.i, 'len'):
            return self.i.len
        if hasattr(self.i, 'fileno'):
            return os.fstat(self.i.fileno()).st_size

    def read(self, n):
        return "".join(islice(self.i, None, n))


class CaseInsensitiveDict(collections.MutableMapping):
    """
    A case-insensitive ``dict``-like object.

    Implements all methods and operations of
    ``collections.MutableMapping`` as well as dict's ``copy``. Also
    provides ``lower_items``.

    All keys are expected to be strings. The structure remembers the
    case of the last key to be set, and ``iter(instance)``,
    ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()``
    will contain case-sensitive keys. However, querying and contains
    testing is case insensitive:

        cid = CaseInsensitiveDict()
        cid['Accept'] = 'application/json'
        cid['aCCEPT'] == 'application/json'  # True
        list(cid) == ['Accept']  # True

    For example, ``headers['content-encoding']`` will return the
    value of a ``'Content-Encoding'`` response header, regardless
    of how the header name was originally stored.

    If the constructor, ``.update``, or equality comparison
    operations are given keys that have equal ``.lower()``s, the
    behavior is undefined.

    """
    def __init__(self, data=None, **kwargs):
        self._store = dict()
        if data is None:
            data = {}
        self.update(data, **kwargs)

    def __setitem__(self, key, value):
        # Use the lowercased key for lookups, but store the actual
        # key alongside the value.
        self._store[key.lower()] = (key, value)

    def __getitem__(self, key):
        return self._store[key.lower()][1]

    def __delitem__(self, key):
        del self._store[key.lower()]

    def __iter__(self):
        return (casedkey for casedkey, mappedvalue in self._store.values())

    def __len__(self):
        return len(self._store)

    def lower_items(self):
        """Like iteritems(), but with all lowercase keys."""
        return (
            (lowerkey, keyval[1])
            for (lowerkey, keyval)
            in self._store.items()
        )

    def __eq__(self, other):
        if isinstance(other, collections.Mapping):
            other = CaseInsensitiveDict(other)
        else:
            return NotImplemented
        # Compare insensitively
        return dict(self.lower_items()) == dict(other.lower_items())

    # Copy is required
    def copy(self):
        return CaseInsensitiveDict(self._store.values())

    def __repr__(self):
        return str(dict(self.items()))

class LookupDict(dict):
    """Dictionary lookup object."""

    def __init__(self, name=None):
        self.name = name
        super(LookupDict, self).__init__()

    def __repr__(self):
        return '<lookup \'%s\'>' % (self.name)

    def __getitem__(self, key):
        # We allow fall-through here, so values default to None

        return self.__dict__.get(key, None)

    def get(self, key, default=None):
        return self.__dict__.get(key, default)
site-packages/pip/_vendor/requests/sessions.py000064400000053422151733463650015626 0ustar00# -*- coding: utf-8 -*-

"""
requests.session
~~~~~~~~~~~~~~~~

This module provides a Session object to manage and persist settings across
requests (cookies, auth, proxies).

"""
import os
from collections import Mapping
from datetime import datetime

from .auth import _basic_auth_str
from .compat import cookielib, OrderedDict, urljoin, urlparse, builtin_str
from .cookies import (
    cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies)
from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT
from .hooks import default_hooks, dispatch_hook
from .utils import to_key_val_list, default_headers, to_native_string
from .exceptions import (
    TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError)
from .structures import CaseInsensitiveDict

from .adapters import HTTPAdapter

from .utils import (
    requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies,
    get_auth_from_url
)

from .status_codes import codes

# formerly defined here, reexposed here for backward compatibility
from .models import REDIRECT_STATI


def merge_setting(request_setting, session_setting, dict_class=OrderedDict):
    """
    Determines appropriate setting for a given request, taking into account the
    explicit setting on that request, and the setting in the session. If a
    setting is a dictionary, they will be merged together using `dict_class`
    """

    if session_setting is None:
        return request_setting

    if request_setting is None:
        return session_setting

    # Bypass if not a dictionary (e.g. verify)
    if not (
            isinstance(session_setting, Mapping) and
            isinstance(request_setting, Mapping)
    ):
        return request_setting

    merged_setting = dict_class(to_key_val_list(session_setting))
    merged_setting.update(to_key_val_list(request_setting))

    # Remove keys that are set to None.
    for (k, v) in request_setting.items():
        if v is None:
            del merged_setting[k]

    merged_setting = dict((k, v) for (k, v) in merged_setting.items() if v is not None)

    return merged_setting


def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict):
    """
    Properly merges both requests and session hooks.

    This is necessary because when request_hooks == {'response': []}, the
    merge breaks Session hooks entirely.
    """
    if session_hooks is None or session_hooks.get('response') == []:
        return request_hooks

    if request_hooks is None or request_hooks.get('response') == []:
        return session_hooks

    return merge_setting(request_hooks, session_hooks, dict_class)


class SessionRedirectMixin(object):
    def resolve_redirects(self, resp, req, stream=False, timeout=None,
                          verify=True, cert=None, proxies=None):
        """Receives a Response. Returns a generator of Responses."""

        i = 0

        while resp.is_redirect:
            prepared_request = req.copy()

            try:
                resp.content  # Consume socket so it can be released
            except (ChunkedEncodingError, ContentDecodingError, RuntimeError):
                resp.raw.read(decode_content=False)

            if i >= self.max_redirects:
                raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects)

            # Release the connection back into the pool.
            resp.close()

            url = resp.headers['location']
            method = req.method

            # Handle redirection without scheme (see: RFC 1808 Section 4)
            if url.startswith('//'):
                parsed_rurl = urlparse(resp.url)
                url = '%s:%s' % (parsed_rurl.scheme, url)

            # The scheme should be lower case...
            parsed = urlparse(url)
            url = parsed.geturl()

            # Facilitate non-RFC2616-compliant 'location' headers
            # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource')
            # Compliant with RFC3986, we percent encode the url.
            if not urlparse(url).netloc:
                url = urljoin(resp.url, requote_uri(url))
            else:
                url = requote_uri(url)

            prepared_request.url = to_native_string(url)

            # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4
            if (resp.status_code == codes.see_other and
                    method != 'HEAD'):
                method = 'GET'

            # Do what the browsers do, despite standards...
            # First, turn 302s into GETs.
            if resp.status_code == codes.found and method != 'HEAD':
                method = 'GET'

            # Second, if a POST is responded to with a 301, turn it into a GET.
            # This bizarre behaviour is explained in Issue 1704.
            if resp.status_code == codes.moved and method == 'POST':
                method = 'GET'

            prepared_request.method = method

            # https://github.com/kennethreitz/requests/issues/1084
            if resp.status_code not in (codes.temporary, codes.resume):
                if 'Content-Length' in prepared_request.headers:
                    del prepared_request.headers['Content-Length']

                prepared_request.body = None

            headers = prepared_request.headers
            try:
                del headers['Cookie']
            except KeyError:
                pass

            extract_cookies_to_jar(prepared_request._cookies, prepared_request, resp.raw)
            prepared_request._cookies.update(self.cookies)
            prepared_request.prepare_cookies(prepared_request._cookies)

            # Rebuild auth and proxy information.
            proxies = self.rebuild_proxies(prepared_request, proxies)
            self.rebuild_auth(prepared_request, resp)

            # Override the original request.
            req = prepared_request

            resp = self.send(
                req,
                stream=stream,
                timeout=timeout,
                verify=verify,
                cert=cert,
                proxies=proxies,
                allow_redirects=False,
            )

            extract_cookies_to_jar(self.cookies, prepared_request, resp.raw)

            i += 1
            yield resp

    def rebuild_auth(self, prepared_request, response):
        """
        When being redirected we may want to strip authentication from the
        request to avoid leaking credentials. This method intelligently removes
        and reapplies authentication where possible to avoid credential loss.
        """
        headers = prepared_request.headers
        url = prepared_request.url

        if 'Authorization' in headers:
            # If we get redirected to a new host, we should strip out any
            # authentication headers.
            original_parsed = urlparse(response.request.url)
            redirect_parsed = urlparse(url)

            if (original_parsed.hostname != redirect_parsed.hostname):
                del headers['Authorization']

        # .netrc might have more auth for us on our new host.
        new_auth = get_netrc_auth(url) if self.trust_env else None
        if new_auth is not None:
            prepared_request.prepare_auth(new_auth)

        return

    def rebuild_proxies(self, prepared_request, proxies):
        """
        This method re-evaluates the proxy configuration by considering the
        environment variables. If we are redirected to a URL covered by
        NO_PROXY, we strip the proxy configuration. Otherwise, we set missing
        proxy keys for this URL (in case they were stripped by a previous
        redirect).

        This method also replaces the Proxy-Authorization header where
        necessary.
        """
        headers = prepared_request.headers
        url = prepared_request.url
        scheme = urlparse(url).scheme
        new_proxies = proxies.copy() if proxies is not None else {}

        if self.trust_env and not should_bypass_proxies(url):
            environ_proxies = get_environ_proxies(url)

            proxy = environ_proxies.get(scheme)

            if proxy:
                new_proxies.setdefault(scheme, environ_proxies[scheme])

        if 'Proxy-Authorization' in headers:
            del headers['Proxy-Authorization']

        try:
            username, password = get_auth_from_url(new_proxies[scheme])
        except KeyError:
            username, password = None, None

        if username and password:
            headers['Proxy-Authorization'] = _basic_auth_str(username, password)

        return new_proxies


class Session(SessionRedirectMixin):
    """A Requests session.

    Provides cookie persistence, connection-pooling, and configuration.

    Basic Usage::

      >>> import requests
      >>> s = requests.Session()
      >>> s.get('http://httpbin.org/get')
      200
    """

    __attrs__ = [
        'headers', 'cookies', 'auth', 'timeout', 'proxies', 'hooks',
        'params', 'verify', 'cert', 'prefetch', 'adapters', 'stream',
        'trust_env', 'max_redirects']

    def __init__(self):

        #: A case-insensitive dictionary of headers to be sent on each
        #: :class:`Request <Request>` sent from this
        #: :class:`Session <Session>`.
        self.headers = default_headers()

        #: Default Authentication tuple or object to attach to
        #: :class:`Request <Request>`.
        self.auth = None

        #: Dictionary mapping protocol to the URL of the proxy (e.g.
        #: {'http': 'foo.bar:3128'}) to be used on each
        #: :class:`Request <Request>`.
        self.proxies = {}

        #: Event-handling hooks.
        self.hooks = default_hooks()

        #: Dictionary of querystring data to attach to each
        #: :class:`Request <Request>`. The dictionary values may be lists for
        #: representing multivalued query parameters.
        self.params = {}

        #: Stream response content default.
        self.stream = False

        #: SSL Verification default.
        self.verify = True

        #: SSL certificate default.
        self.cert = None

        #: Maximum number of redirects allowed. If the request exceeds this
        #: limit, a :class:`TooManyRedirects` exception is raised.
        self.max_redirects = DEFAULT_REDIRECT_LIMIT

        #: Should we trust the environment?
        self.trust_env = True

        #: A CookieJar containing all currently outstanding cookies set on this
        #: session. By default it is a
        #: :class:`RequestsCookieJar <requests.cookies.RequestsCookieJar>`, but
        #: may be any other ``cookielib.CookieJar`` compatible object.
        self.cookies = cookiejar_from_dict({})

        # Default connection adapters.
        self.adapters = OrderedDict()
        self.mount('https://', HTTPAdapter())
        self.mount('http://', HTTPAdapter())

    def __enter__(self):
        return self

    def __exit__(self, *args):
        self.close()

    def prepare_request(self, request):
        """Constructs a :class:`PreparedRequest <PreparedRequest>` for
        transmission and returns it. The :class:`PreparedRequest` has settings
        merged from the :class:`Request <Request>` instance and those of the
        :class:`Session`.

        :param request: :class:`Request` instance to prepare with this
            session's settings.
        """
        cookies = request.cookies or {}

        # Bootstrap CookieJar.
        if not isinstance(cookies, cookielib.CookieJar):
            cookies = cookiejar_from_dict(cookies)

        # Merge with session cookies
        merged_cookies = merge_cookies(
            merge_cookies(RequestsCookieJar(), self.cookies), cookies)


        # Set environment's basic authentication if not explicitly set.
        auth = request.auth
        if self.trust_env and not auth and not self.auth:
            auth = get_netrc_auth(request.url)

        p = PreparedRequest()
        p.prepare(
            method=request.method.upper(),
            url=request.url,
            files=request.files,
            data=request.data,
            headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict),
            params=merge_setting(request.params, self.params),
            auth=merge_setting(auth, self.auth),
            cookies=merged_cookies,
            hooks=merge_hooks(request.hooks, self.hooks),
        )
        return p

    def request(self, method, url,
        params=None,
        data=None,
        headers=None,
        cookies=None,
        files=None,
        auth=None,
        timeout=None,
        allow_redirects=True,
        proxies=None,
        hooks=None,
        stream=None,
        verify=None,
        cert=None):
        """Constructs a :class:`Request <Request>`, prepares it and sends it.
        Returns :class:`Response <Response>` object.

        :param method: method for the new :class:`Request` object.
        :param url: URL for the new :class:`Request` object.
        :param params: (optional) Dictionary or bytes to be sent in the query
            string for the :class:`Request`.
        :param data: (optional) Dictionary or bytes to send in the body of the
            :class:`Request`.
        :param headers: (optional) Dictionary of HTTP Headers to send with the
            :class:`Request`.
        :param cookies: (optional) Dict or CookieJar object to send with the
            :class:`Request`.
        :param files: (optional) Dictionary of 'filename': file-like-objects
            for multipart encoding upload.
        :param auth: (optional) Auth tuple or callable to enable
            Basic/Digest/Custom HTTP Auth.
        :param timeout: (optional) Float describing the timeout of the
            request in seconds.
        :param allow_redirects: (optional) Boolean. Set to True by default.
        :param proxies: (optional) Dictionary mapping protocol to the URL of
            the proxy.
        :param stream: (optional) whether to immediately download the response
            content. Defaults to ``False``.
        :param verify: (optional) if ``True``, the SSL cert will be verified.
            A CA_BUNDLE path can also be provided.
        :param cert: (optional) if String, path to ssl client cert file (.pem).
            If Tuple, ('cert', 'key') pair.
        """

        method = builtin_str(method)

        # Create the Request.
        req = Request(
            method = method.upper(),
            url = url,
            headers = headers,
            files = files,
            data = data or {},
            params = params or {},
            auth = auth,
            cookies = cookies,
            hooks = hooks,
        )
        prep = self.prepare_request(req)

        proxies = proxies or {}

        # Gather clues from the surrounding environment.
        if self.trust_env:
            # Set environment's proxies.
            env_proxies = get_environ_proxies(url) or {}
            for (k, v) in env_proxies.items():
                proxies.setdefault(k, v)

            # Look for configuration.
            if not verify and verify is not False:
                verify = os.environ.get('REQUESTS_CA_BUNDLE')

            # Curl compatibility.
            if not verify and verify is not False:
                verify = os.environ.get('CURL_CA_BUNDLE')

        # Merge all the kwargs.
        proxies = merge_setting(proxies, self.proxies)
        stream = merge_setting(stream, self.stream)
        verify = merge_setting(verify, self.verify)
        cert = merge_setting(cert, self.cert)

        # Send the request.
        send_kwargs = {
            'stream': stream,
            'timeout': timeout,
            'verify': verify,
            'cert': cert,
            'proxies': proxies,
            'allow_redirects': allow_redirects,
        }
        resp = self.send(prep, **send_kwargs)

        return resp

    def get(self, url, **kwargs):
        """Sends a GET request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        """

        kwargs.setdefault('allow_redirects', True)
        return self.request('GET', url, **kwargs)

    def options(self, url, **kwargs):
        """Sends a OPTIONS request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        """

        kwargs.setdefault('allow_redirects', True)
        return self.request('OPTIONS', url, **kwargs)

    def head(self, url, **kwargs):
        """Sends a HEAD request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        """

        kwargs.setdefault('allow_redirects', False)
        return self.request('HEAD', url, **kwargs)

    def post(self, url, data=None, **kwargs):
        """Sends a POST request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        """

        return self.request('POST', url, data=data, **kwargs)

    def put(self, url, data=None, **kwargs):
        """Sends a PUT request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        """

        return self.request('PUT', url, data=data, **kwargs)

    def patch(self, url, data=None, **kwargs):
        """Sends a PATCH request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        """

        return self.request('PATCH', url,  data=data, **kwargs)

    def delete(self, url, **kwargs):
        """Sends a DELETE request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        """

        return self.request('DELETE', url, **kwargs)

    def send(self, request, **kwargs):
        """Send a given PreparedRequest."""
        # Set defaults that the hooks can utilize to ensure they always have
        # the correct parameters to reproduce the previous request.
        kwargs.setdefault('stream', self.stream)
        kwargs.setdefault('verify', self.verify)
        kwargs.setdefault('cert', self.cert)
        kwargs.setdefault('proxies', self.proxies)

        # It's possible that users might accidentally send a Request object.
        # Guard against that specific failure case.
        if not isinstance(request, PreparedRequest):
            raise ValueError('You can only send PreparedRequests.')

        # Set up variables needed for resolve_redirects and dispatching of hooks
        allow_redirects = kwargs.pop('allow_redirects', True)
        stream = kwargs.get('stream')
        timeout = kwargs.get('timeout')
        verify = kwargs.get('verify')
        cert = kwargs.get('cert')
        proxies = kwargs.get('proxies')
        hooks = request.hooks

        # Get the appropriate adapter to use
        adapter = self.get_adapter(url=request.url)

        # Start time (approximately) of the request
        start = datetime.utcnow()

        # Send the request
        r = adapter.send(request, **kwargs)

        # Total elapsed time of the request (approximately)
        r.elapsed = datetime.utcnow() - start

        # Response manipulation hooks
        r = dispatch_hook('response', hooks, r, **kwargs)

        # Persist cookies
        if r.history:

            # If the hooks create history then we want those cookies too
            for resp in r.history:
                extract_cookies_to_jar(self.cookies, resp.request, resp.raw)

        extract_cookies_to_jar(self.cookies, request, r.raw)

        # Redirect resolving generator.
        gen = self.resolve_redirects(r, request,
            stream=stream,
            timeout=timeout,
            verify=verify,
            cert=cert,
            proxies=proxies)

        # Resolve redirects if allowed.
        history = [resp for resp in gen] if allow_redirects else []

        # Shuffle things around if there's history.
        if history:
            # Insert the first (original) request at the start
            history.insert(0, r)
            # Get the last request made
            r = history.pop()
            r.history = history

        if not stream:
            r.content

        return r

    def get_adapter(self, url):
        """Returns the appropriate connnection adapter for the given URL."""
        for (prefix, adapter) in self.adapters.items():

            if url.lower().startswith(prefix):
                return adapter

        # Nothing matches :-/
        raise InvalidSchema("No connection adapters were found for '%s'" % url)

    def close(self):
        """Closes all adapters and as such the session"""
        for v in self.adapters.values():
            v.close()

    def mount(self, prefix, adapter):
        """Registers a connection adapter to a prefix.

        Adapters are sorted in descending order by key length."""

        self.adapters[prefix] = adapter
        keys_to_move = [k for k in self.adapters if len(k) < len(prefix)]

        for key in keys_to_move:
            self.adapters[key] = self.adapters.pop(key)

    def __getstate__(self):
        return dict((attr, getattr(self, attr, None)) for attr in self.__attrs__)

    def __setstate__(self, state):
        for attr, value in state.items():
            setattr(self, attr, value)


def session():
    """Returns a :class:`Session` for context-management."""

    return Session()
site-packages/pip/_vendor/requests/api.py000064400000010370151733463650014524 0ustar00# -*- coding: utf-8 -*-

"""
requests.api
~~~~~~~~~~~~

This module implements the Requests API.

:copyright: (c) 2012 by Kenneth Reitz.
:license: Apache2, see LICENSE for more details.

"""

from . import sessions


def request(method, url, **kwargs):
    """Constructs and sends a :class:`Request <Request>`.
    Returns :class:`Response <Response>` object.

    :param method: method for the new :class:`Request` object.
    :param url: URL for the new :class:`Request` object.
    :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
    :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`.
    :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`.
    :param files: (optional) Dictionary of 'name': file-like-objects (or {'name': ('filename', fileobj)}) for multipart encoding upload.
    :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth.
    :param timeout: (optional) Float describing the timeout of the request in seconds.
    :param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
    :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy.
    :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided.
    :param stream: (optional) if ``False``, the response content will be immediately downloaded.
    :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair.

    Usage::

      >>> import requests
      >>> req = requests.request('GET', 'http://httpbin.org/get')
      <Response [200]>
    """

    session = sessions.Session()
    return session.request(method=method, url=url, **kwargs)


def get(url, **kwargs):
    """Sends a GET request. Returns :class:`Response` object.

    :param url: URL for the new :class:`Request` object.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    """

    kwargs.setdefault('allow_redirects', True)
    return request('get', url, **kwargs)


def options(url, **kwargs):
    """Sends a OPTIONS request. Returns :class:`Response` object.

    :param url: URL for the new :class:`Request` object.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    """

    kwargs.setdefault('allow_redirects', True)
    return request('options', url, **kwargs)


def head(url, **kwargs):
    """Sends a HEAD request. Returns :class:`Response` object.

    :param url: URL for the new :class:`Request` object.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    """

    kwargs.setdefault('allow_redirects', False)
    return request('head', url, **kwargs)


def post(url, data=None, **kwargs):
    """Sends a POST request. Returns :class:`Response` object.

    :param url: URL for the new :class:`Request` object.
    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    """

    return request('post', url, data=data, **kwargs)


def put(url, data=None, **kwargs):
    """Sends a PUT request. Returns :class:`Response` object.

    :param url: URL for the new :class:`Request` object.
    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    """

    return request('put', url, data=data, **kwargs)


def patch(url, data=None, **kwargs):
    """Sends a PATCH request. Returns :class:`Response` object.

    :param url: URL for the new :class:`Request` object.
    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    """

    return request('patch', url,  data=data, **kwargs)


def delete(url, **kwargs):
    """Sends a DELETE request. Returns :class:`Response` object.

    :param url: URL for the new :class:`Request` object.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    """

    return request('delete', url, **kwargs)
site-packages/pip/_vendor/requests/__init__.py000064400000003500151733463650015507 0ustar00# -*- coding: utf-8 -*-

#   __
#  /__)  _  _     _   _ _/   _
# / (   (- (/ (/ (- _)  /  _)
#          /

"""
requests HTTP library
~~~~~~~~~~~~~~~~~~~~~

Requests is an HTTP library, written in Python, for human beings. Basic GET
usage:

   >>> import requests
   >>> r = requests.get('http://python.org')
   >>> r.status_code
   200
   >>> 'Python is a programming language' in r.content
   True

... or POST:

   >>> payload = dict(key1='value1', key2='value2')
   >>> r = requests.post("http://httpbin.org/post", data=payload)
   >>> print(r.text)
   {
     ...
     "form": {
       "key2": "value2",
       "key1": "value1"
     },
     ...
   }

The other HTTP methods are supported - see `requests.api`. Full documentation
is at <http://python-requests.org>.

:copyright: (c) 2014 by Kenneth Reitz.
:license: Apache 2.0, see LICENSE for more details.

"""

__title__ = 'requests'
__version__ = '2.3.0'
__build__ = 0x020300
__author__ = 'Kenneth Reitz'
__license__ = 'Apache 2.0'
__copyright__ = 'Copyright 2014 Kenneth Reitz'

# Attempt to enable urllib3's SNI support, if possible
try:
    from .packages.urllib3.contrib import pyopenssl
    pyopenssl.inject_into_urllib3()
except ImportError:
    pass

from . import utils
from .models import Request, Response, PreparedRequest
from .api import request, get, head, post, patch, put, delete, options
from .sessions import session, Session
from .status_codes import codes
from .exceptions import (
    RequestException, Timeout, URLRequired,
    TooManyRedirects, HTTPError, ConnectionError
)

# Set default logging handler to avoid "No handler found" warnings.
import logging
try:  # Python 2.7+
    from logging import NullHandler
except ImportError:
    class NullHandler(logging.Handler):
        def emit(self, record):
            pass

logging.getLogger(__name__).addHandler(NullHandler())
site-packages/pip/_vendor/requests/auth.py000064400000013753151733463650014724 0ustar00# -*- coding: utf-8 -*-

"""
requests.auth
~~~~~~~~~~~~~

This module contains the authentication handlers for Requests.
"""

import os
import re
import time
import hashlib

from base64 import b64encode

from .compat import urlparse, str
from .cookies import extract_cookies_to_jar
from .utils import parse_dict_header

CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded'
CONTENT_TYPE_MULTI_PART = 'multipart/form-data'


def _basic_auth_str(username, password):
    """Returns a Basic Auth string."""

    return 'Basic ' + b64encode(('%s:%s' % (username, password)).encode('latin1')).strip().decode('latin1')


class AuthBase(object):
    """Base class that all auth implementations derive from"""

    def __call__(self, r):
        raise NotImplementedError('Auth hooks must be callable.')


class HTTPBasicAuth(AuthBase):
    """Attaches HTTP Basic Authentication to the given Request object."""
    def __init__(self, username, password):
        self.username = username
        self.password = password

    def __call__(self, r):
        r.headers['Authorization'] = _basic_auth_str(self.username, self.password)
        return r


class HTTPProxyAuth(HTTPBasicAuth):
    """Attaches HTTP Proxy Authentication to a given Request object."""
    def __call__(self, r):
        r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password)
        return r


class HTTPDigestAuth(AuthBase):
    """Attaches HTTP Digest Authentication to the given Request object."""
    def __init__(self, username, password):
        self.username = username
        self.password = password
        self.last_nonce = ''
        self.nonce_count = 0
        self.chal = {}
        self.pos = None

    def build_digest_header(self, method, url):

        realm = self.chal['realm']
        nonce = self.chal['nonce']
        qop = self.chal.get('qop')
        algorithm = self.chal.get('algorithm')
        opaque = self.chal.get('opaque')

        if algorithm is None:
            _algorithm = 'MD5'
        else:
            _algorithm = algorithm.upper()
        # lambdas assume digest modules are imported at the top level
        if _algorithm == 'MD5' or _algorithm == 'MD5-SESS':
            def md5_utf8(x):
                if isinstance(x, str):
                    x = x.encode('utf-8')
                return hashlib.md5(x).hexdigest()
            hash_utf8 = md5_utf8
        elif _algorithm == 'SHA':
            def sha_utf8(x):
                if isinstance(x, str):
                    x = x.encode('utf-8')
                return hashlib.sha1(x).hexdigest()
            hash_utf8 = sha_utf8

        KD = lambda s, d: hash_utf8("%s:%s" % (s, d))

        if hash_utf8 is None:
            return None

        # XXX not implemented yet
        entdig = None
        p_parsed = urlparse(url)
        path = p_parsed.path
        if p_parsed.query:
            path += '?' + p_parsed.query

        A1 = '%s:%s:%s' % (self.username, realm, self.password)
        A2 = '%s:%s' % (method, path)

        HA1 = hash_utf8(A1)
        HA2 = hash_utf8(A2)

        if nonce == self.last_nonce:
            self.nonce_count += 1
        else:
            self.nonce_count = 1
        ncvalue = '%08x' % self.nonce_count
        s = str(self.nonce_count).encode('utf-8')
        s += nonce.encode('utf-8')
        s += time.ctime().encode('utf-8')
        s += os.urandom(8)

        cnonce = (hashlib.sha1(s).hexdigest()[:16])
        noncebit = "%s:%s:%s:%s:%s" % (nonce, ncvalue, cnonce, qop, HA2)
        if _algorithm == 'MD5-SESS':
            HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce))

        if qop is None:
            respdig = KD(HA1, "%s:%s" % (nonce, HA2))
        elif qop == 'auth' or 'auth' in qop.split(','):
            respdig = KD(HA1, noncebit)
        else:
            # XXX handle auth-int.
            return None

        self.last_nonce = nonce

        # XXX should the partial digests be encoded too?
        base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \
               'response="%s"' % (self.username, realm, nonce, path, respdig)
        if opaque:
            base += ', opaque="%s"' % opaque
        if algorithm:
            base += ', algorithm="%s"' % algorithm
        if entdig:
            base += ', digest="%s"' % entdig
        if qop:
            base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce)

        return 'Digest %s' % (base)

    def handle_401(self, r, **kwargs):
        """Takes the given response and tries digest-auth, if needed."""

        if self.pos is not None:
            # Rewind the file position indicator of the body to where
            # it was to resend the request.
            r.request.body.seek(self.pos)
        num_401_calls = getattr(self, 'num_401_calls', 1)
        s_auth = r.headers.get('www-authenticate', '')

        if 'digest' in s_auth.lower() and num_401_calls < 2:

            setattr(self, 'num_401_calls', num_401_calls + 1)
            pat = re.compile(r'digest ', flags=re.IGNORECASE)
            self.chal = parse_dict_header(pat.sub('', s_auth, count=1))

            # Consume content and release the original connection
            # to allow our new request to reuse the same one.
            r.content
            r.raw.release_conn()
            prep = r.request.copy()
            extract_cookies_to_jar(prep._cookies, r.request, r.raw)
            prep.prepare_cookies(prep._cookies)

            prep.headers['Authorization'] = self.build_digest_header(
                prep.method, prep.url)
            _r = r.connection.send(prep, **kwargs)
            _r.history.append(r)
            _r.request = prep

            return _r

        setattr(self, 'num_401_calls', 1)
        return r

    def __call__(self, r):
        # If we have a saved nonce, skip the 401
        if self.last_nonce:
            r.headers['Authorization'] = self.build_digest_header(r.method, r.url)
        try:
            self.pos = r.body.tell()
        except AttributeError:
            pass
        r.register_hook('response', self.handle_401)
        return r
site-packages/pip/_vendor/requests/hooks.py000064400000001464151733463650015102 0ustar00# -*- coding: utf-8 -*-

"""
requests.hooks
~~~~~~~~~~~~~~

This module provides the capabilities for the Requests hooks system.

Available hooks:

``response``:
    The response generated from a Request.

"""


HOOKS = ['response']


def default_hooks():
    hooks = {}
    for event in HOOKS:
        hooks[event] = []
    return hooks

# TODO: response is the only one


def dispatch_hook(key, hooks, hook_data, **kwargs):
    """Dispatches a hook dictionary on a given piece of data."""

    hooks = hooks or dict()

    if key in hooks:
        hooks = hooks.get(key)

        if hasattr(hooks, '__call__'):
            hooks = [hooks]

        for hook in hooks:
            _hook_data = hook(hook_data, **kwargs)
            if _hook_data is not None:
                hook_data = _hook_data

    return hook_data
site-packages/pip/_vendor/requests/adapters.py000064400000034420151733463650015560 0ustar00# -*- coding: utf-8 -*-

"""
requests.adapters
~~~~~~~~~~~~~~~~~

This module contains the transport adapters that Requests uses to define
and maintain connections.
"""

import socket

from .models import Response
from .packages.urllib3.poolmanager import PoolManager, proxy_from_url
from .packages.urllib3.response import HTTPResponse
from .packages.urllib3.util import Timeout as TimeoutSauce
from .compat import urlparse, basestring, urldefrag, unquote
from .utils import (DEFAULT_CA_BUNDLE_PATH, get_encoding_from_headers,
                    prepend_scheme_if_needed, get_auth_from_url)
from .structures import CaseInsensitiveDict
from .packages.urllib3.exceptions import MaxRetryError
from .packages.urllib3.exceptions import TimeoutError
from .packages.urllib3.exceptions import SSLError as _SSLError
from .packages.urllib3.exceptions import HTTPError as _HTTPError
from .packages.urllib3.exceptions import ProxyError as _ProxyError
from .cookies import extract_cookies_to_jar
from .exceptions import ConnectionError, Timeout, SSLError, ProxyError
from .auth import _basic_auth_str

DEFAULT_POOLBLOCK = False
DEFAULT_POOLSIZE = 10
DEFAULT_RETRIES = 0


class BaseAdapter(object):
    """The Base Transport Adapter"""

    def __init__(self):
        super(BaseAdapter, self).__init__()

    def send(self):
        raise NotImplementedError

    def close(self):
        raise NotImplementedError


class HTTPAdapter(BaseAdapter):
    """The built-in HTTP Adapter for urllib3.

    Provides a general-case interface for Requests sessions to contact HTTP and
    HTTPS urls by implementing the Transport Adapter interface. This class will
    usually be created by the :class:`Session <Session>` class under the
    covers.

    :param pool_connections: The number of urllib3 connection pools to cache.
    :param pool_maxsize: The maximum number of connections to save in the pool.
    :param int max_retries: The maximum number of retries each connection
        should attempt. Note, this applies only to failed connections and
        timeouts, never to requests where the server returns a response.
    :param pool_block: Whether the connection pool should block for connections.

    Usage::

      >>> import requests
      >>> s = requests.Session()
      >>> a = requests.adapters.HTTPAdapter(max_retries=3)
      >>> s.mount('http://', a)
    """
    __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize',
                 '_pool_block']

    def __init__(self, pool_connections=DEFAULT_POOLSIZE,
                 pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES,
                 pool_block=DEFAULT_POOLBLOCK):
        self.max_retries = max_retries
        self.config = {}
        self.proxy_manager = {}

        super(HTTPAdapter, self).__init__()

        self._pool_connections = pool_connections
        self._pool_maxsize = pool_maxsize
        self._pool_block = pool_block

        self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block)

    def __getstate__(self):
        return dict((attr, getattr(self, attr, None)) for attr in
                    self.__attrs__)

    def __setstate__(self, state):
        # Can't handle by adding 'proxy_manager' to self.__attrs__ because
        # because self.poolmanager uses a lambda function, which isn't pickleable.
        self.proxy_manager = {}
        self.config = {}

        for attr, value in state.items():
            setattr(self, attr, value)

        self.init_poolmanager(self._pool_connections, self._pool_maxsize,
                              block=self._pool_block)

    def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK):
        """Initializes a urllib3 PoolManager. This method should not be called
        from user code, and is only exposed for use when subclassing the
        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.

        :param connections: The number of urllib3 connection pools to cache.
        :param maxsize: The maximum number of connections to save in the pool.
        :param block: Block when no free connections are available.
        """
        # save these values for pickling
        self._pool_connections = connections
        self._pool_maxsize = maxsize
        self._pool_block = block

        self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize,
                                       block=block)

    def cert_verify(self, conn, url, verify, cert):
        """Verify a SSL certificate. This method should not be called from user
        code, and is only exposed for use when subclassing the
        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.

        :param conn: The urllib3 connection object associated with the cert.
        :param url: The requested URL.
        :param verify: Whether we should actually verify the certificate.
        :param cert: The SSL certificate to verify.
        """
        if url.lower().startswith('https') and verify:

            cert_loc = None

            # Allow self-specified cert location.
            if verify is not True:
                cert_loc = verify

            if not cert_loc:
                cert_loc = DEFAULT_CA_BUNDLE_PATH

            if not cert_loc:
                raise Exception("Could not find a suitable SSL CA certificate bundle.")

            conn.cert_reqs = 'CERT_REQUIRED'
            conn.ca_certs = cert_loc
        else:
            conn.cert_reqs = 'CERT_NONE'
            conn.ca_certs = None

        if cert:
            if not isinstance(cert, basestring):
                conn.cert_file = cert[0]
                conn.key_file = cert[1]
            else:
                conn.cert_file = cert

    def build_response(self, req, resp):
        """Builds a :class:`Response <requests.Response>` object from a urllib3
        response. This should not be called from user code, and is only exposed
        for use when subclassing the
        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`

        :param req: The :class:`PreparedRequest <PreparedRequest>` used to generate the response.
        :param resp: The urllib3 response object.
        """
        response = Response()

        # Fallback to None if there's no status_code, for whatever reason.
        response.status_code = getattr(resp, 'status', None)

        # Make headers case-insensitive.
        response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {}))

        # Set encoding.
        response.encoding = get_encoding_from_headers(response.headers)
        response.raw = resp
        response.reason = response.raw.reason

        if isinstance(req.url, bytes):
            response.url = req.url.decode('utf-8')
        else:
            response.url = req.url

        # Add new cookies from the server.
        extract_cookies_to_jar(response.cookies, req, resp)

        # Give the Response some context.
        response.request = req
        response.connection = self

        return response

    def get_connection(self, url, proxies=None):
        """Returns a urllib3 connection for the given URL. This should not be
        called from user code, and is only exposed for use when subclassing the
        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.

        :param url: The URL to connect to.
        :param proxies: (optional) A Requests-style dictionary of proxies used on this request.
        """
        proxies = proxies or {}
        proxy = proxies.get(urlparse(url.lower()).scheme)

        if proxy:
            proxy = prepend_scheme_if_needed(proxy, 'http')
            proxy_headers = self.proxy_headers(proxy)

            if not proxy in self.proxy_manager:
                self.proxy_manager[proxy] = proxy_from_url(
                                                proxy,
                                                proxy_headers=proxy_headers,
                                                num_pools=self._pool_connections,
                                                maxsize=self._pool_maxsize,
                                                block=self._pool_block)

            conn = self.proxy_manager[proxy].connection_from_url(url)
        else:
            # Only scheme should be lower case
            parsed = urlparse(url)
            url = parsed.geturl()
            conn = self.poolmanager.connection_from_url(url)

        return conn

    def close(self):
        """Disposes of any internal state.

        Currently, this just closes the PoolManager, which closes pooled
        connections.
        """
        self.poolmanager.clear()

    def request_url(self, request, proxies):
        """Obtain the url to use when making the final request.

        If the message is being sent through a HTTP proxy, the full URL has to
        be used. Otherwise, we should only use the path portion of the URL.

        This should not be called from user code, and is only exposed for use
        when subclassing the
        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.

        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
        :param proxies: A dictionary of schemes to proxy URLs.
        """
        proxies = proxies or {}
        scheme = urlparse(request.url).scheme
        proxy = proxies.get(scheme)

        if proxy and scheme != 'https':
            url, _ = urldefrag(request.url)
        else:
            url = request.path_url

        return url

    def add_headers(self, request, **kwargs):
        """Add any headers needed by the connection. As of v2.0 this does
        nothing by default, but is left for overriding by users that subclass
        the :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.

        This should not be called from user code, and is only exposed for use
        when subclassing the
        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.

        :param request: The :class:`PreparedRequest <PreparedRequest>` to add headers to.
        :param kwargs: The keyword arguments from the call to send().
        """
        pass

    def proxy_headers(self, proxy):
        """Returns a dictionary of the headers to add to any request sent
        through a proxy. This works with urllib3 magic to ensure that they are
        correctly sent to the proxy, rather than in a tunnelled request if
        CONNECT is being used.

        This should not be called from user code, and is only exposed for use
        when subclassing the
        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.

        :param proxies: The url of the proxy being used for this request.
        :param kwargs: Optional additional keyword arguments.
        """
        headers = {}
        username, password = get_auth_from_url(proxy)

        if username and password:
            headers['Proxy-Authorization'] = _basic_auth_str(username,
                                                             password)

        return headers

    def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None):
        """Sends PreparedRequest object. Returns Response object.

        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
        :param stream: (optional) Whether to stream the request content.
        :param timeout: (optional) The timeout on the request.
        :param verify: (optional) Whether to verify SSL certificates.
        :param cert: (optional) Any user-provided SSL certificate to be trusted.
        :param proxies: (optional) The proxies dictionary to apply to the request.
        """

        conn = self.get_connection(request.url, proxies)

        self.cert_verify(conn, request.url, verify, cert)
        url = self.request_url(request, proxies)
        self.add_headers(request)

        chunked = not (request.body is None or 'Content-Length' in request.headers)

        timeout = TimeoutSauce(connect=timeout, read=timeout)

        try:
            if not chunked:
                resp = conn.urlopen(
                    method=request.method,
                    url=url,
                    body=request.body,
                    headers=request.headers,
                    redirect=False,
                    assert_same_host=False,
                    preload_content=False,
                    decode_content=False,
                    retries=self.max_retries,
                    timeout=timeout
                )

            # Send the request.
            else:
                if hasattr(conn, 'proxy_pool'):
                    conn = conn.proxy_pool

                low_conn = conn._get_conn(timeout=timeout)

                try:
                    low_conn.putrequest(request.method,
                                        url,
                                        skip_accept_encoding=True)

                    for header, value in request.headers.items():
                        low_conn.putheader(header, value)

                    low_conn.endheaders()

                    for i in request.body:
                        low_conn.send(hex(len(i))[2:].encode('utf-8'))
                        low_conn.send(b'\r\n')
                        low_conn.send(i)
                        low_conn.send(b'\r\n')
                    low_conn.send(b'0\r\n\r\n')

                    r = low_conn.getresponse()
                    resp = HTTPResponse.from_httplib(
                        r,
                        pool=conn,
                        connection=low_conn,
                        preload_content=False,
                        decode_content=False
                    )
                except:
                    # If we hit any problems here, clean up the connection.
                    # Then, reraise so that we can handle the actual exception.
                    low_conn.close()
                    raise
                else:
                    # All is well, return the connection to the pool.
                    conn._put_conn(low_conn)

        except socket.error as sockerr:
            raise ConnectionError(sockerr, request=request)

        except MaxRetryError as e:
            raise ConnectionError(e, request=request)

        except _ProxyError as e:
            raise ProxyError(e)

        except (_SSLError, _HTTPError) as e:
            if isinstance(e, _SSLError):
                raise SSLError(e, request=request)
            elif isinstance(e, TimeoutError):
                raise Timeout(e, request=request)
            else:
                raise

        return self.build_response(request, resp)
site-packages/pip/_vendor/requests/cookies.py000064400000040456151733463650015417 0ustar00# -*- coding: utf-8 -*-

"""
Compatibility code to be able to use `cookielib.CookieJar` with requests.

requests.utils imports from here, so be careful with imports.
"""

import time
import collections
from .compat import cookielib, urlparse, urlunparse, Morsel

try:
    import threading
    # grr, pyflakes: this fixes "redefinition of unused 'threading'"
    threading
except ImportError:
    import dummy_threading as threading


class MockRequest(object):
    """Wraps a `requests.Request` to mimic a `urllib2.Request`.

    The code in `cookielib.CookieJar` expects this interface in order to correctly
    manage cookie policies, i.e., determine whether a cookie can be set, given the
    domains of the request and the cookie.

    The original request object is read-only. The client is responsible for collecting
    the new headers via `get_new_headers()` and interpreting them appropriately. You
    probably want `get_cookie_header`, defined below.
    """

    def __init__(self, request):
        self._r = request
        self._new_headers = {}
        self.type = urlparse(self._r.url).scheme

    def get_type(self):
        return self.type

    def get_host(self):
        return urlparse(self._r.url).netloc

    def get_origin_req_host(self):
        return self.get_host()

    def get_full_url(self):
        # Only return the response's URL if the user hadn't set the Host
        # header
        if not self._r.headers.get('Host'):
            return self._r.url
        # If they did set it, retrieve it and reconstruct the expected domain
        host = self._r.headers['Host']
        parsed = urlparse(self._r.url)
        # Reconstruct the URL as we expect it
        return urlunparse([
            parsed.scheme, host, parsed.path, parsed.params, parsed.query,
            parsed.fragment
        ])

    def is_unverifiable(self):
        return True

    def has_header(self, name):
        return name in self._r.headers or name in self._new_headers

    def get_header(self, name, default=None):
        return self._r.headers.get(name, self._new_headers.get(name, default))

    def add_header(self, key, val):
        """cookielib has no legitimate use for this method; add it back if you find one."""
        raise NotImplementedError("Cookie headers should be added with add_unredirected_header()")

    def add_unredirected_header(self, name, value):
        self._new_headers[name] = value

    def get_new_headers(self):
        return self._new_headers

    @property
    def unverifiable(self):
        return self.is_unverifiable()

    @property
    def origin_req_host(self):
        return self.get_origin_req_host()

    @property
    def host(self):
        return self.get_host()


class MockResponse(object):
    """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`.

    ...what? Basically, expose the parsed HTTP headers from the server response
    the way `cookielib` expects to see them.
    """

    def __init__(self, headers):
        """Make a MockResponse for `cookielib` to read.

        :param headers: a httplib.HTTPMessage or analogous carrying the headers
        """
        self._headers = headers

    def info(self):
        return self._headers

    def getheaders(self, name):
        self._headers.getheaders(name)


def extract_cookies_to_jar(jar, request, response):
    """Extract the cookies from the response into a CookieJar.

    :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar)
    :param request: our own requests.Request object
    :param response: urllib3.HTTPResponse object
    """
    if not (hasattr(response, '_original_response') and
            response._original_response):
        return
    # the _original_response field is the wrapped httplib.HTTPResponse object,
    req = MockRequest(request)
    # pull out the HTTPMessage with the headers and put it in the mock:
    res = MockResponse(response._original_response.msg)
    jar.extract_cookies(res, req)


def get_cookie_header(jar, request):
    """Produce an appropriate Cookie header string to be sent with `request`, or None."""
    r = MockRequest(request)
    jar.add_cookie_header(r)
    return r.get_new_headers().get('Cookie')


def remove_cookie_by_name(cookiejar, name, domain=None, path=None):
    """Unsets a cookie by name, by default over all domains and paths.

    Wraps CookieJar.clear(), is O(n).
    """
    clearables = []
    for cookie in cookiejar:
        if cookie.name == name:
            if domain is None or domain == cookie.domain:
                if path is None or path == cookie.path:
                    clearables.append((cookie.domain, cookie.path, cookie.name))

    for domain, path, name in clearables:
        cookiejar.clear(domain, path, name)


class CookieConflictError(RuntimeError):
    """There are two cookies that meet the criteria specified in the cookie jar.
    Use .get and .set and include domain and path args in order to be more specific."""


class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping):
    """Compatibility class; is a cookielib.CookieJar, but exposes a dict interface.

    This is the CookieJar we create by default for requests and sessions that
    don't specify one, since some clients may expect response.cookies and
    session.cookies to support dict operations.

    Don't use the dict interface internally; it's just for compatibility with
    with external client code. All `requests` code should work out of the box
    with externally provided instances of CookieJar, e.g., LWPCookieJar and
    FileCookieJar.

    Caution: dictionary operations that are normally O(1) may be O(n).

    Unlike a regular CookieJar, this class is pickleable.
    """

    def get(self, name, default=None, domain=None, path=None):
        """Dict-like get() that also supports optional domain and path args in
        order to resolve naming collisions from using one cookie jar over
        multiple domains. Caution: operation is O(n), not O(1)."""
        try:
            return self._find_no_duplicates(name, domain, path)
        except KeyError:
            return default

    def set(self, name, value, **kwargs):
        """Dict-like set() that also supports optional domain and path args in
        order to resolve naming collisions from using one cookie jar over
        multiple domains."""
        # support client code that unsets cookies by assignment of a None value:
        if value is None:
            remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path'))
            return

        if isinstance(value, Morsel):
            c = morsel_to_cookie(value)
        else:
            c = create_cookie(name, value, **kwargs)
        self.set_cookie(c)
        return c

    def iterkeys(self):
        """Dict-like iterkeys() that returns an iterator of names of cookies from the jar.
        See itervalues() and iteritems()."""
        for cookie in iter(self):
            yield cookie.name

    def keys(self):
        """Dict-like keys() that returns a list of names of cookies from the jar.
        See values() and items()."""
        return list(self.iterkeys())

    def itervalues(self):
        """Dict-like itervalues() that returns an iterator of values of cookies from the jar.
        See iterkeys() and iteritems()."""
        for cookie in iter(self):
            yield cookie.value

    def values(self):
        """Dict-like values() that returns a list of values of cookies from the jar.
        See keys() and items()."""
        return list(self.itervalues())

    def iteritems(self):
        """Dict-like iteritems() that returns an iterator of name-value tuples from the jar.
        See iterkeys() and itervalues()."""
        for cookie in iter(self):
            yield cookie.name, cookie.value

    def items(self):
        """Dict-like items() that returns a list of name-value tuples from the jar.
        See keys() and values(). Allows client-code to call "dict(RequestsCookieJar)
        and get a vanilla python dict of key value pairs."""
        return list(self.iteritems())

    def list_domains(self):
        """Utility method to list all the domains in the jar."""
        domains = []
        for cookie in iter(self):
            if cookie.domain not in domains:
                domains.append(cookie.domain)
        return domains

    def list_paths(self):
        """Utility method to list all the paths in the jar."""
        paths = []
        for cookie in iter(self):
            if cookie.path not in paths:
                paths.append(cookie.path)
        return paths

    def multiple_domains(self):
        """Returns True if there are multiple domains in the jar.
        Returns False otherwise."""
        domains = []
        for cookie in iter(self):
            if cookie.domain is not None and cookie.domain in domains:
                return True
            domains.append(cookie.domain)
        return False  # there is only one domain in jar

    def get_dict(self, domain=None, path=None):
        """Takes as an argument an optional domain and path and returns a plain old
        Python dict of name-value pairs of cookies that meet the requirements."""
        dictionary = {}
        for cookie in iter(self):
            if (domain is None or cookie.domain == domain) and (path is None
                                                or cookie.path == path):
                dictionary[cookie.name] = cookie.value
        return dictionary

    def __getitem__(self, name):
        """Dict-like __getitem__() for compatibility with client code. Throws exception
        if there are more than one cookie with name. In that case, use the more
        explicit get() method instead. Caution: operation is O(n), not O(1)."""

        return self._find_no_duplicates(name)

    def __setitem__(self, name, value):
        """Dict-like __setitem__ for compatibility with client code. Throws exception
        if there is already a cookie of that name in the jar. In that case, use the more
        explicit set() method instead."""

        self.set(name, value)

    def __delitem__(self, name):
        """Deletes a cookie given a name. Wraps cookielib.CookieJar's remove_cookie_by_name()."""
        remove_cookie_by_name(self, name)

    def set_cookie(self, cookie, *args, **kwargs):
        if hasattr(cookie.value, 'startswith') and cookie.value.startswith('"') and cookie.value.endswith('"'):
            cookie.value = cookie.value.replace('\\"', '')
        return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs)

    def update(self, other):
        """Updates this jar with cookies from another CookieJar or dict-like"""
        if isinstance(other, cookielib.CookieJar):
            for cookie in other:
                self.set_cookie(cookie)
        else:
            super(RequestsCookieJar, self).update(other)

    def _find(self, name, domain=None, path=None):
        """Requests uses this method internally to get cookie values. Takes as args name
        and optional domain and path. Returns a cookie.value. If there are conflicting cookies,
        _find arbitrarily chooses one. See _find_no_duplicates if you want an exception thrown
        if there are conflicting cookies."""
        for cookie in iter(self):
            if cookie.name == name:
                if domain is None or cookie.domain == domain:
                    if path is None or cookie.path == path:
                        return cookie.value

        raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))

    def _find_no_duplicates(self, name, domain=None, path=None):
        """__get_item__ and get call _find_no_duplicates -- never used in Requests internally.
        Takes as args name and optional domain and path. Returns a cookie.value.
        Throws KeyError if cookie is not found and CookieConflictError if there are
        multiple cookies that match name and optionally domain and path."""
        toReturn = None
        for cookie in iter(self):
            if cookie.name == name:
                if domain is None or cookie.domain == domain:
                    if path is None or cookie.path == path:
                        if toReturn is not None:  # if there are multiple cookies that meet passed in criteria
                            raise CookieConflictError('There are multiple cookies with name, %r' % (name))
                        toReturn = cookie.value  # we will eventually return this as long as no cookie conflict

        if toReturn:
            return toReturn
        raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))

    def __getstate__(self):
        """Unlike a normal CookieJar, this class is pickleable."""
        state = self.__dict__.copy()
        # remove the unpickleable RLock object
        state.pop('_cookies_lock')
        return state

    def __setstate__(self, state):
        """Unlike a normal CookieJar, this class is pickleable."""
        self.__dict__.update(state)
        if '_cookies_lock' not in self.__dict__:
            self._cookies_lock = threading.RLock()

    def copy(self):
        """Return a copy of this RequestsCookieJar."""
        new_cj = RequestsCookieJar()
        new_cj.update(self)
        return new_cj


def create_cookie(name, value, **kwargs):
    """Make a cookie from underspecified parameters.

    By default, the pair of `name` and `value` will be set for the domain ''
    and sent on every request (this is sometimes called a "supercookie").
    """
    result = dict(
        version=0,
        name=name,
        value=value,
        port=None,
        domain='',
        path='/',
        secure=False,
        expires=None,
        discard=True,
        comment=None,
        comment_url=None,
        rest={'HttpOnly': None},
        rfc2109=False,)

    badargs = set(kwargs) - set(result)
    if badargs:
        err = 'create_cookie() got unexpected keyword arguments: %s'
        raise TypeError(err % list(badargs))

    result.update(kwargs)
    result['port_specified'] = bool(result['port'])
    result['domain_specified'] = bool(result['domain'])
    result['domain_initial_dot'] = result['domain'].startswith('.')
    result['path_specified'] = bool(result['path'])

    return cookielib.Cookie(**result)


def morsel_to_cookie(morsel):
    """Convert a Morsel object into a Cookie containing the one k/v pair."""

    expires = None
    if morsel['max-age']:
        expires = time.time() + morsel['max-age']
    elif morsel['expires']:
        time_template = '%a, %d-%b-%Y %H:%M:%S GMT'
        expires = time.mktime(
            time.strptime(morsel['expires'], time_template)) - time.timezone
    return create_cookie(
        comment=morsel['comment'],
        comment_url=bool(morsel['comment']),
        discard=False,
        domain=morsel['domain'],
        expires=expires,
        name=morsel.key,
        path=morsel['path'],
        port=None,
        rest={'HttpOnly': morsel['httponly']},
        rfc2109=False,
        secure=bool(morsel['secure']),
        value=morsel.value,
        version=morsel['version'] or 0,
    )


def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True):
    """Returns a CookieJar from a key/value dictionary.

    :param cookie_dict: Dict of key/values to insert into CookieJar.
    :param cookiejar: (optional) A cookiejar to add the cookies to.
    :param overwrite: (optional) If False, will not replace cookies
        already in the jar with new ones.
    """
    if cookiejar is None:
        cookiejar = RequestsCookieJar()

    if cookie_dict is not None:
        names_from_jar = [cookie.name for cookie in cookiejar]
        for name in cookie_dict:
            if overwrite or (name not in names_from_jar):
                cookiejar.set_cookie(create_cookie(name, cookie_dict[name]))

    return cookiejar


def merge_cookies(cookiejar, cookies):
    """Add cookies to cookiejar and returns a merged CookieJar.

    :param cookiejar: CookieJar object to add the cookies to.
    :param cookies: Dictionary or CookieJar object to be added.
    """
    if not isinstance(cookiejar, cookielib.CookieJar):
        raise ValueError('You can only merge into CookieJar')
    
    if isinstance(cookies, dict):
        cookiejar = cookiejar_from_dict(
            cookies, cookiejar=cookiejar, overwrite=False)
    elif isinstance(cookies, cookielib.CookieJar):
        try:
            cookiejar.update(cookies)
        except AttributeError:
            for cookie_in_jar in cookies:
                cookiejar.set_cookie(cookie_in_jar)

    return cookiejar
site-packages/pip/_vendor/requests/exceptions.py000064400000003525151733463660016141 0ustar00# -*- coding: utf-8 -*-

"""
requests.exceptions
~~~~~~~~~~~~~~~~~~~

This module contains the set of Requests' exceptions.

"""
from .packages.urllib3.exceptions import HTTPError as BaseHTTPError


class RequestException(IOError):
    """There was an ambiguous exception that occurred while handling your
    request."""

    def __init__(self, *args, **kwargs):
        """
        Initialize RequestException with `request` and `response` objects.
        """
        response = kwargs.pop('response', None)
        self.response = response
        self.request = kwargs.pop('request', None)
        if (response is not None and not self.request and
                hasattr(response, 'request')):
            self.request = self.response.request
        super(RequestException, self).__init__(*args, **kwargs)


class HTTPError(RequestException):
    """An HTTP error occurred."""


class ConnectionError(RequestException):
    """A Connection error occurred."""


class ProxyError(ConnectionError):
    """A proxy error occurred."""


class SSLError(ConnectionError):
    """An SSL error occurred."""


class Timeout(RequestException):
    """The request timed out."""


class URLRequired(RequestException):
    """A valid URL is required to make a request."""


class TooManyRedirects(RequestException):
    """Too many redirects."""


class MissingSchema(RequestException, ValueError):
    """The URL schema (e.g. http or https) is missing."""


class InvalidSchema(RequestException, ValueError):
    """See defaults.py for valid schemas."""


class InvalidURL(RequestException, ValueError):
    """ The URL provided was somehow invalid. """


class ChunkedEncodingError(RequestException):
    """The server declared chunked encoding but sent an invalid chunk."""


class ContentDecodingError(RequestException, BaseHTTPError):
    """Failed to decode response content"""
site-packages/pip/_vendor/requests/cacert.pem000064400001132322151733463660015351 0ustar00# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc.
# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc.
# Label: "GTE CyberTrust Global Root"
# Serial: 421
# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db
# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74
# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36
-----BEGIN CERTIFICATE-----
MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD
VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv
bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv
b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV
UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH
iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS
r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4
04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r
GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9
3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P
lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
-----END CERTIFICATE-----

# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division
# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division
# Label: "Thawte Server CA"
# Serial: 1
# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d
# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c
# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9
-----BEGIN CERTIFICATE-----
MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx
FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm
MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx
MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3
dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl
cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3
DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD
gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91
yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX
L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj
EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG
7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e
QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ
qdq5snUb9kLy78fyGPmJvKP/iiMucEc=
-----END CERTIFICATE-----

# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division
# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division
# Label: "Thawte Premium Server CA"
# Serial: 1
# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a
# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a
# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72
-----BEGIN CERTIFICATE-----
MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
-----END CERTIFICATE-----

# Issuer: O=Equifax OU=Equifax Secure Certificate Authority
# Subject: O=Equifax OU=Equifax Secure Certificate Authority
# Label: "Equifax Secure CA"
# Serial: 903804111
# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4
# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a
# SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78
-----BEGIN CERTIFICATE-----
MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
-----END CERTIFICATE-----

# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
# Label: "Verisign Class 3 Public Primary Certification Authority"
# Serial: 149843929435818692848040365716851702463
# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67
# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2
# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70
-----BEGIN CERTIFICATE-----
MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
-----END CERTIFICATE-----

# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network
# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network
# Label: "Verisign Class 3 Public Primary Certification Authority - G2"
# Serial: 167285380242319648451154478808036881606
# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9
# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f
# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b
-----BEGIN CERTIFICATE-----
MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg
UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4
pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0
13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID
AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk
U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i
F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY
oJ2daZH9
-----END CERTIFICATE-----

# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
# Label: "GlobalSign Root CA"
# Serial: 4835703278459707669005204
# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a
# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c
# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99
-----BEGIN CERTIFICATE-----
MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
-----END CERTIFICATE-----

# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
# Label: "GlobalSign Root CA - R2"
# Serial: 4835703278459682885658125
# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30
# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe
# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e
-----BEGIN CERTIFICATE-----
MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
-----END CERTIFICATE-----

# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority
# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority
# Label: "ValiCert Class 1 VA"
# Serial: 1
# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb
# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e
# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04
-----BEGIN CERTIFICATE-----
MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy
NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y
LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+
TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y
TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0
LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW
I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw
nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI
-----END CERTIFICATE-----

# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority
# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority
# Label: "ValiCert Class 2 VA"
# Serial: 1
# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87
# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6
# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b
-----BEGIN CERTIFICATE-----
MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy
NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY
dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9
WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS
v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v
UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu
IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
-----END CERTIFICATE-----

# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority
# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority
# Label: "RSA Root Certificate 1"
# Serial: 1
# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72
# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb
# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a
-----BEGIN CERTIFICATE-----
MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy
NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD
cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs
2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY
JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE
Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ
n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A
PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu
-----END CERTIFICATE-----

# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
# Label: "Verisign Class 3 Public Primary Certification Authority - G3"
# Serial: 206684696279472310254277870180966723415
# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09
# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6
# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44
-----BEGIN CERTIFICATE-----
MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
-----END CERTIFICATE-----

# Issuer: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
# Subject: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
# Label: "Verisign Class 4 Public Primary Certification Authority - G3"
# Serial: 314531972711909413743075096039378935511
# MD5 Fingerprint: db:c8:f2:27:2e:b1:ea:6a:29:23:5d:fe:56:3e:33:df
# SHA1 Fingerprint: c8:ec:8c:87:92:69:cb:4b:ab:39:e9:8d:7e:57:67:f3:14:95:73:9d
# SHA256 Fingerprint: e3:89:36:0d:0f:db:ae:b3:d2:50:58:4b:47:30:31:4e:22:2f:39:c1:56:a0:20:14:4e:8d:96:05:61:79:15:06
-----BEGIN CERTIFICATE-----
MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1
GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ
+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd
U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm
NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY
ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/
ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1
CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq
g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c
2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/
bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
-----END CERTIFICATE-----

# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
# Label: "Entrust.net Secure Server CA"
# Serial: 927650371
# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee
# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39
# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50
-----BEGIN CERTIFICATE-----
MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
-----END CERTIFICATE-----

# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
# Label: "Entrust.net Premium 2048 Secure Server CA"
# Serial: 946069240
# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90
# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31
# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77
-----BEGIN CERTIFICATE-----
MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3
MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub
j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo
U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b
u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+
bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er
fF6adulZkMV8gzURZVE=
-----END CERTIFICATE-----

# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
# Label: "Baltimore CyberTrust Root"
# Serial: 33554617
# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4
# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74
# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb
-----BEGIN CERTIFICATE-----
MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
-----END CERTIFICATE-----

# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc.
# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc.
# Label: "Equifax Secure Global eBusiness CA"
# Serial: 1
# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc
# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45
# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07
-----BEGIN CERTIFICATE-----
MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc
MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT
ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw
MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj
dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l
c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC
UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc
58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/
o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH
MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr
aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA
A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA
Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv
8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
-----END CERTIFICATE-----

# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc.
# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc.
# Label: "Equifax Secure eBusiness CA 1"
# Serial: 4
# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d
# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41
# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73
-----BEGIN CERTIFICATE-----
MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc
MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT
ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw
MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j
LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ
KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo
RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu
WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw
Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD
AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK
eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM
zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+
WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN
/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==
-----END CERTIFICATE-----

# Issuer: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network
# Subject: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network
# Label: "AddTrust Low-Value Services Root"
# Serial: 1
# MD5 Fingerprint: 1e:42:95:02:33:92:6b:b9:5f:c0:7f:da:d6:b2:4b:fc
# SHA1 Fingerprint: cc:ab:0e:a0:4c:23:01:d6:69:7b:dd:37:9f:cd:12:eb:24:e3:94:9d
# SHA256 Fingerprint: 8c:72:09:27:9a:c0:4e:27:5e:16:d0:7f:d3:b7:75:e8:01:54:b5:96:80:46:e3:1f:52:dd:25:76:63:24:e9:a7
-----BEGIN CERTIFICATE-----
MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU
MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw
MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD
VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul
CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n
tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl
dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch
PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC
+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O
BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E
BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl
MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk
ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB
IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X
7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz
43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl
pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA
WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
-----END CERTIFICATE-----

# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
# Label: "AddTrust External Root"
# Serial: 1
# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f
# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68
# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2
-----BEGIN CERTIFICATE-----
MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
-----END CERTIFICATE-----

# Issuer: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network
# Subject: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network
# Label: "AddTrust Public Services Root"
# Serial: 1
# MD5 Fingerprint: c1:62:3e:23:c5:82:73:9c:03:59:4b:2b:e9:77:49:7f
# SHA1 Fingerprint: 2a:b6:28:48:5e:78:fb:f3:ad:9e:79:10:dd:6b:df:99:72:2c:96:e5
# SHA256 Fingerprint: 07:91:ca:07:49:b2:07:82:aa:d3:c7:d7:bd:0c:df:c9:48:58:35:84:3e:b2:d7:99:60:09:ce:43:ab:6c:69:27
-----BEGIN CERTIFICATE-----
MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU
MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx
MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB
ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV
BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV
6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX
GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP
dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH
1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF
62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW
BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw
AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL
MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU
cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv
b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6
IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/
iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh
4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm
XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
-----END CERTIFICATE-----

# Issuer: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network
# Subject: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network
# Label: "AddTrust Qualified Certificates Root"
# Serial: 1
# MD5 Fingerprint: 27:ec:39:47:cd:da:5a:af:e2:9a:01:65:21:a9:4c:bb
# SHA1 Fingerprint: 4d:23:78:ec:91:95:39:b5:00:7f:75:8f:03:3b:21:1e:c5:4d:8b:cf
# SHA256 Fingerprint: 80:95:21:08:05:db:4b:bc:35:5e:44:28:d8:fd:6e:c2:cd:e3:ab:5f:b9:7a:99:42:98:8e:b8:f4:dc:d0:60:16
-----BEGIN CERTIFICATE-----
MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU
MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1
MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK
EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh
BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq
xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G
87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i
2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U
WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1
0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G
A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T
AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr
pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL
ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm
aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv
hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm
hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3
P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y
iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no
xqE=
-----END CERTIFICATE-----

# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
# Label: "Entrust Root Certification Authority"
# Serial: 1164660820
# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4
# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9
# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c
-----BEGIN CERTIFICATE-----
MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
0vdXcDazv/wor3ElhVsT/h5/WrQ8
-----END CERTIFICATE-----

# Issuer: O=RSA Security Inc OU=RSA Security 2048 V3
# Subject: O=RSA Security Inc OU=RSA Security 2048 V3
# Label: "RSA Security 2048 v3"
# Serial: 13297492616345471454730593562152402946
# MD5 Fingerprint: 77:0d:19:b1:21:fd:00:42:9c:3e:0c:a5:dd:0b:02:8e
# SHA1 Fingerprint: 25:01:90:19:cf:fb:d9:99:1c:b7:68:25:74:8d:94:5f:30:93:95:42
# SHA256 Fingerprint: af:8b:67:62:a1:e5:28:22:81:61:a9:5d:5c:55:9e:e2:66:27:8f:75:d7:9e:83:01:89:a5:03:50:6a:bd:6b:4c
-----BEGIN CERTIFICATE-----
MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6
MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp
dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX
BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy
MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp
eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg
/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl
wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh
AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2
PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu
AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR
MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc
HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/
Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+
f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO
rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch
6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3
7CAFYd4=
-----END CERTIFICATE-----

# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc.
# Subject: CN=GeoTrust Global CA O=GeoTrust Inc.
# Label: "GeoTrust Global CA"
# Serial: 144470
# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5
# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12
# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a
-----BEGIN CERTIFICATE-----
MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
-----END CERTIFICATE-----

# Issuer: CN=GeoTrust Global CA 2 O=GeoTrust Inc.
# Subject: CN=GeoTrust Global CA 2 O=GeoTrust Inc.
# Label: "GeoTrust Global CA 2"
# Serial: 1
# MD5 Fingerprint: 0e:40:a7:6c:de:03:5d:8f:d1:0f:e4:d1:8d:f9:6c:a9
# SHA1 Fingerprint: a9:e9:78:08:14:37:58:88:f2:05:19:b0:6d:2b:0d:2b:60:16:90:7d
# SHA256 Fingerprint: ca:2d:82:a0:86:77:07:2f:8a:b6:76:4f:f0:35:67:6c:fe:3e:5e:32:5e:01:21:72:df:3f:92:09:6d:b7:9b:85
-----BEGIN CERTIFICATE-----
MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW
MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs
IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg
R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A
PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8
Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL
TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL
5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7
S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe
2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap
EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td
EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv
/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN
A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0
abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF
I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz
4iIprn2DQKi6bA==
-----END CERTIFICATE-----

# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc.
# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc.
# Label: "GeoTrust Universal CA"
# Serial: 1
# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48
# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79
# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12
-----BEGIN CERTIFICATE-----
MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW
MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy
c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE
BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0
IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV
VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8
cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT
QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh
F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v
c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w
mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd
VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX
teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ
f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe
Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+
nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB
/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY
MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG
9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX
IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn
ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z
uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN
Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja
QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW
koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9
ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt
DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm
bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw=
-----END CERTIFICATE-----

# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
# Label: "GeoTrust Universal CA 2"
# Serial: 1
# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7
# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79
# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b
-----BEGIN CERTIFICATE-----
MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW
MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy
c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD
VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1
c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81
WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG
FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq
XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL
se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb
KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd
IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73
y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt
hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc
QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4
Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV
HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ
KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ
L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr
Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo
ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY
T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz
GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m
1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV
OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH
6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX
QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
-----END CERTIFICATE-----

# Issuer: CN=America Online Root Certification Authority 1 O=America Online Inc.
# Subject: CN=America Online Root Certification Authority 1 O=America Online Inc.
# Label: "America Online Root Certification Authority 1"
# Serial: 1
# MD5 Fingerprint: 14:f1:08:ad:9d:fa:64:e2:89:e7:1c:cf:a8:ad:7d:5e
# SHA1 Fingerprint: 39:21:c1:15:c1:5d:0e:ca:5c:cb:5b:c4:f0:7d:21:d8:05:0b:56:6a
# SHA256 Fingerprint: 77:40:73:12:c6:3a:15:3d:5b:c0:0b:4e:51:75:9c:df:da:c2:37:dc:2a:33:b6:79:46:e9:8e:9b:fa:68:0a:e3
-----BEGIN CERTIFICATE-----
MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc
MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP
bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2
MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft
ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk
hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym
1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW
OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb
2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko
O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw
AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU
AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF
Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb
LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir
oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C
MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
-----END CERTIFICATE-----

# Issuer: CN=America Online Root Certification Authority 2 O=America Online Inc.
# Subject: CN=America Online Root Certification Authority 2 O=America Online Inc.
# Label: "America Online Root Certification Authority 2"
# Serial: 1
# MD5 Fingerprint: d6:ed:3c:ca:e2:66:0f:af:10:43:0d:77:9b:04:09:bf
# SHA1 Fingerprint: 85:b5:ff:67:9b:0c:79:96:1f:c8:6e:44:22:00:46:13:db:17:92:84
# SHA256 Fingerprint: 7d:3b:46:5a:60:14:e5:26:c0:af:fc:ee:21:27:d2:31:17:27:ad:81:1c:26:84:2d:00:6a:f3:73:06:cc:80:bd
-----BEGIN CERTIFICATE-----
MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc
MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP
bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2
MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft
ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP
ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC
206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci
KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2
JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9
BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e
Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B
PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67
Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq
Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ
o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3
+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj
YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj
FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn
xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2
LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc
obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8
CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe
IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA
DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F
AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX
Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb
AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl
Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw
RY8mkaKO/qk=
-----END CERTIFICATE-----

# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association
# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association
# Label: "Visa eCommerce Root"
# Serial: 25952180776285836048024890241505565794
# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02
# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62
# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22
-----BEGIN CERTIFICATE-----
MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr
MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl
cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw
CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h
dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l
cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h
2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E
lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV
ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq
299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t
vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL
dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF
AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR
zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3
LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd
7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw
++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
398znM/jra6O1I7mT1GvFpLgXPYHDw==
-----END CERTIFICATE-----

# Issuer: CN=Certum CA O=Unizeto Sp. z o.o.
# Subject: CN=Certum CA O=Unizeto Sp. z o.o.
# Label: "Certum Root CA"
# Serial: 65568
# MD5 Fingerprint: 2c:8f:9f:66:1d:18:90:b1:47:26:9d:8e:86:82:8c:a9
# SHA1 Fingerprint: 62:52:dc:40:f7:11:43:a2:2f:de:9e:f7:34:8e:06:42:51:b1:81:18
# SHA256 Fingerprint: d8:e0:fe:bc:1d:b2:e3:8d:00:94:0f:37:d2:7d:41:34:4d:99:3e:73:4b:99:d5:65:6d:97:78:d4:d8:14:36:24
-----BEGIN CERTIFICATE-----
MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM
MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD
QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM
MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD
QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E
jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo
ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI
ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu
Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg
AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7
HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA
uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa
TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg
xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q
CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x
O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs
6GAqm4VKQPNriiTsBhYscw==
-----END CERTIFICATE-----

# Issuer: CN=AAA Certificate Services O=Comodo CA Limited
# Subject: CN=AAA Certificate Services O=Comodo CA Limited
# Label: "Comodo AAA Services root"
# Serial: 1
# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0
# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49
# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4
-----BEGIN CERTIFICATE-----
MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
-----END CERTIFICATE-----

# Issuer: CN=Secure Certificate Services O=Comodo CA Limited
# Subject: CN=Secure Certificate Services O=Comodo CA Limited
# Label: "Comodo Secure Services root"
# Serial: 1
# MD5 Fingerprint: d3:d9:bd:ae:9f:ac:67:24:b3:c8:1b:52:e1:b9:a9:bd
# SHA1 Fingerprint: 4a:65:d5:f4:1d:ef:39:b8:b8:90:4a:4a:d3:64:81:33:cf:c7:a1:d1
# SHA256 Fingerprint: bd:81:ce:3b:4f:65:91:d1:1a:67:b5:fc:7a:47:fd:ef:25:52:1b:f9:aa:4e:18:b9:e3:df:2e:34:a7:80:3b:e8
-----BEGIN CERTIFICATE-----
MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb
MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp
ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow
fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV
BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM
cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S
HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996
CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk
3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz
6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV
HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv
Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw
Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww
DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0
5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI
gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ
aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl
izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk=
-----END CERTIFICATE-----

# Issuer: CN=Trusted Certificate Services O=Comodo CA Limited
# Subject: CN=Trusted Certificate Services O=Comodo CA Limited
# Label: "Comodo Trusted Services root"
# Serial: 1
# MD5 Fingerprint: 91:1b:3f:6e:cd:9e:ab:ee:07:fe:1f:71:d2:b3:61:27
# SHA1 Fingerprint: e1:9f:e3:0e:8b:84:60:9e:80:9b:17:0d:72:a8:c5:ba:6e:14:09:bd
# SHA256 Fingerprint: 3f:06:e5:56:81:d4:96:f5:be:16:9e:b5:38:9f:9f:2b:8f:f6:1e:17:08:df:68:81:72:48:49:cd:5d:27:cb:69
-----BEGIN CERTIFICATE-----
MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb
MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0
aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla
MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD
VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW
fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt
TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL
fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW
1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7
kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G
A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD
VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v
ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo
dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu
Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/
HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS
jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+
xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn
dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi
-----END CERTIFICATE-----

# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority
# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority
# Label: "QuoVadis Root CA"
# Serial: 985026699
# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24
# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9
# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73
-----BEGIN CERTIFICATE-----
MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC
TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0
aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0
aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz
MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw
IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR
dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp
li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D
rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ
WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug
F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU
xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC
Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv
dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw
ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl
IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh
c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy
ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI
KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T
KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq
y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p
dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD
VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL
MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk
fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8
7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R
cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y
mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW
xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK
SnQ2+Q==
-----END CERTIFICATE-----

# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited
# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited
# Label: "QuoVadis Root CA 2"
# Serial: 1289
# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b
# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7
# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86
-----BEGIN CERTIFICATE-----
MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV
BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa
GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg
Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J
WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB
rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp
+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1
ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i
Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz
PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og
/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH
oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI
yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud
EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2
A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL
MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f
BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn
g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl
fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K
WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha
B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc
hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR
TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD
mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z
ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y
4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza
8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
-----END CERTIFICATE-----

# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited
# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited
# Label: "QuoVadis Root CA 3"
# Serial: 1478
# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf
# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85
# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35
-----BEGIN CERTIFICATE-----
MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV
BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM
V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB
4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr
H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd
8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv
vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT
mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe
btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc
T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt
WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ
c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A
4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD
VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG
CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0
aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu
dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw
czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G
A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC
TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg
Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0
7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem
d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd
+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B
4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN
t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x
DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57
k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s
zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j
Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT
mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK
4SVhM7JZG+Ju1zdXtg2pEto=
-----END CERTIFICATE-----

# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1
# Subject: O=SECOM Trust.net OU=Security Communication RootCA1
# Label: "Security Communication Root CA"
# Serial: 0
# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a
# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7
# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c
-----BEGIN CERTIFICATE-----
MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY
MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t
dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5
WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD
VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8
9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ
DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9
Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N
QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ
xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G
A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T
AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG
kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr
Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5
Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU
JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot
RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw==
-----END CERTIFICATE-----

# Issuer: CN=Sonera Class2 CA O=Sonera
# Subject: CN=Sonera Class2 CA O=Sonera
# Label: "Sonera Class 2 Root CA"
# Serial: 29
# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb
# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27
# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27
-----BEGIN CERTIFICATE-----
MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP
MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx
MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV
BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o
Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt
5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s
3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej
vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu
8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw
DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG
MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil
zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/
3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD
FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6
Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2
ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M
-----END CERTIFICATE-----

# Issuer: CN=Staat der Nederlanden Root CA O=Staat der Nederlanden
# Subject: CN=Staat der Nederlanden Root CA O=Staat der Nederlanden
# Label: "Staat der Nederlanden Root CA"
# Serial: 10000010
# MD5 Fingerprint: 60:84:7c:5a:ce:db:0c:d4:cb:a7:e9:fe:02:c6:a9:c0
# SHA1 Fingerprint: 10:1d:fa:3f:d5:0b:cb:bb:9b:b5:60:0c:19:55:a4:1a:f4:73:3a:04
# SHA256 Fingerprint: d4:1d:82:9e:8c:16:59:82:2a:f9:3f:ce:62:bf:fc:de:26:4f:c8:4e:8b:95:0c:5f:f2:75:d0:52:35:46:95:a3
-----BEGIN CERTIFICATE-----
MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO
TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh
dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy
MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk
ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn
ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71
9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO
hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U
tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o
BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh
SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww
OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv
cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA
7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k
/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm
eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6
u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy
7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
-----END CERTIFICATE-----

# Issuer: O=TDC Internet OU=TDC Internet Root CA
# Subject: O=TDC Internet OU=TDC Internet Root CA
# Label: "TDC Internet Root CA"
# Serial: 986490188
# MD5 Fingerprint: 91:f4:03:55:20:a1:f8:63:2c:62:de:ac:fb:61:1c:8e
# SHA1 Fingerprint: 21:fc:bd:8e:7f:6c:af:05:1b:d1:b3:43:ec:a8:e7:61:47:f2:0f:8a
# SHA256 Fingerprint: 48:98:c6:88:8c:0c:ff:b0:d3:e3:1a:ca:8a:37:d4:e3:51:5f:f7:46:d0:26:35:d8:66:46:cf:a0:a3:18:5a:e7
-----BEGIN CERTIFICATE-----
MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE
SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg
Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV
BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl
cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA
vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu
Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a
0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1
4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN
eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD
R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG
A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu
dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME
Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3
WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw
HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ
KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO
Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX
wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+
2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89
9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0
jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38
aQNiuJkFBT1reBK9sG9l
-----END CERTIFICATE-----

# Issuer: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com
# Subject: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com
# Label: "UTN DATACorp SGC Root CA"
# Serial: 91374294542884689855167577680241077609
# MD5 Fingerprint: b3:a5:3e:77:21:6d:ac:4a:c0:c9:fb:d5:41:3d:ca:06
# SHA1 Fingerprint: 58:11:9f:0e:12:82:87:ea:50:fd:d9:87:45:6f:4f:78:dc:fa:d6:d4
# SHA256 Fingerprint: 85:fb:2f:91:dd:12:27:5a:01:45:b6:36:53:4f:84:02:4a:d6:8b:69:b8:ee:88:68:4f:f7:11:37:58:05:b3:48
-----BEGIN CERTIFICATE-----
MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB
kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw
IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG
EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD
VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu
dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6
E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ
D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK
4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq
lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW
bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB
o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT
MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js
LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr
BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB
AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj
j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH
KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv
2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3
mfnGV/TJVTl4uix5yaaIK/QI
-----END CERTIFICATE-----

# Issuer: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com
# Subject: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com
# Label: "UTN USERFirst Hardware Root CA"
# Serial: 91374294542884704022267039221184531197
# MD5 Fingerprint: 4c:56:41:e5:0d:bb:2b:e8:ca:a3:ed:18:08:ad:43:39
# SHA1 Fingerprint: 04:83:ed:33:99:ac:36:08:05:87:22:ed:bc:5e:46:00:e3:be:f9:d7
# SHA256 Fingerprint: 6e:a5:47:41:d0:04:66:7e:ed:1b:48:16:63:4a:a3:a7:9e:6e:4b:96:95:0f:82:79:da:fc:8d:9b:d8:81:21:37
-----BEGIN CERTIFICATE-----
MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB
lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt
SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG
A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe
MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v
d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh
cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn
0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ
M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a
MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd
oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI
DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy
oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD
VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0
dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy
bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF
BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli
CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE
CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t
3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS
KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA==
-----END CERTIFICATE-----

# Issuer: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org
# Subject: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org
# Label: "Camerfirma Chambers of Commerce Root"
# Serial: 0
# MD5 Fingerprint: b0:01:ee:14:d9:af:29:18:94:76:8e:f1:69:33:2a:84
# SHA1 Fingerprint: 6e:3a:55:a4:19:0c:19:5c:93:84:3c:c0:db:72:2e:31:30:61:f0:b1
# SHA256 Fingerprint: 0c:25:8a:12:a5:67:4a:ef:25:f2:8b:a7:dc:fa:ec:ee:a3:48:e5:41:e6:f5:cc:4e:e6:3b:71:b3:61:60:6a:c3
-----BEGIN CERTIFICATE-----
MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn
MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL
ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg
b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa
MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB
ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw
IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B
AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb
unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d
BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq
7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3
0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX
roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG
A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j
aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p
26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA
BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud
EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN
BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB
AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd
p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi
1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc
XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0
eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu
tGWaIZDgqtCYvDi1czyL+Nw=
-----END CERTIFICATE-----

# Issuer: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org
# Subject: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org
# Label: "Camerfirma Global Chambersign Root"
# Serial: 0
# MD5 Fingerprint: c5:e6:7b:bf:06:d0:4f:43:ed:c4:7a:65:8a:fb:6b:19
# SHA1 Fingerprint: 33:9b:6b:14:50:24:9b:55:7a:01:87:72:84:d9:e0:2f:c3:d2:d8:e9
# SHA256 Fingerprint: ef:3c:b4:17:fc:8e:bf:6f:97:87:6c:9e:4e:ce:39:de:1e:a5:fe:64:91:41:d1:02:8b:7d:11:c0:b2:29:8c:ed
-----BEGIN CERTIFICATE-----
MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn
MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL
ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo
YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9
MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy
NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G
A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA
A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0
Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s
QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV
eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795
B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh
z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T
AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i
ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w
TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH
MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD
VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE
VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B
AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM
bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi
ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG
VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c
ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/
AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
-----END CERTIFICATE-----

# Issuer: CN=NetLock Kozjegyzoi (Class A) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok
# Subject: CN=NetLock Kozjegyzoi (Class A) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok
# Label: "NetLock Notary (Class A) Root"
# Serial: 259
# MD5 Fingerprint: 86:38:6d:5e:49:63:6c:85:5c:db:6d:dc:94:b7:d0:f7
# SHA1 Fingerprint: ac:ed:5f:65:53:fd:25:ce:01:5f:1f:7a:48:3b:6a:74:9f:61:78:c6
# SHA256 Fingerprint: 7f:12:cd:5f:7e:5e:29:0e:c7:d8:51:79:d5:b7:2c:20:a5:be:75:08:ff:db:5b:f8:1a:b9:68:4a:7f:c9:f6:67
-----BEGIN CERTIFICATE-----
MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV
MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe
TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0
dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB
KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0
N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC
dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu
MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL
b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD
zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi
3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8
WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY
Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi
NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC
ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4
QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0
YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz
aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm
ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg
ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs
amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv
IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3
Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6
ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1
YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg
dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs
b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G
CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO
xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP
0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ
QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk
f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK
8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI
-----END CERTIFICATE-----

# Issuer: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok
# Subject: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok
# Label: "NetLock Business (Class B) Root"
# Serial: 105
# MD5 Fingerprint: 39:16:aa:b9:6a:41:e1:14:69:df:9e:6c:3b:72:dc:b6
# SHA1 Fingerprint: 87:9f:4b:ee:05:df:98:58:3b:e3:60:d6:33:e7:0d:3f:fe:98:71:af
# SHA256 Fingerprint: 39:df:7b:68:2b:7b:93:8f:84:71:54:81:cc:de:8d:60:d8:f2:2e:c5:98:87:7d:0a:aa:c1:2b:59:18:2b:03:12
-----BEGIN CERTIFICATE-----
MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx
ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0
b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD
EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05
OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G
A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh
Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l
dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG
SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK
gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX
iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc
Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E
BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G
SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu
b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh
bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv
Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln
aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0
IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph
biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo
ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP
UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj
YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo
dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA
bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06
sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa
n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS
NitjrFgBazMpUIaD8QFI
-----END CERTIFICATE-----

# Issuer: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok
# Subject: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok
# Label: "NetLock Express (Class C) Root"
# Serial: 104
# MD5 Fingerprint: 4f:eb:f1:f0:70:c2:80:63:5d:58:9f:da:12:3c:a9:c4
# SHA1 Fingerprint: e3:92:51:2f:0a:cf:f5:05:df:f6:de:06:7f:75:37:e1:65:ea:57:4b
# SHA256 Fingerprint: 0b:5e:ed:4e:84:64:03:cf:55:e0:65:84:84:40:ed:2a:82:75:8b:f5:b9:aa:1f:25:3d:46:13:cf:a0:80:ff:3f
-----BEGIN CERTIFICATE-----
MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx
ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0
b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD
EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X
DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw
DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u
c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr
TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN
BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA
OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC
2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW
RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P
AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW
ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0
YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz
b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO
ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB
IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs
b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s
YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg
a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g
SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0
aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg
YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg
Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY
ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g
pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4
Fp1hBWeAyNDYpQcCNJgEjTME1A==
-----END CERTIFICATE-----

# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
# Label: "XRamp Global CA Root"
# Serial: 107108908803651509692980124233745014957
# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1
# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6
# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2
-----BEGIN CERTIFICATE-----
MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB
gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk
MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY
UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx
NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3
dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy
dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6
38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP
KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q
DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4
qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa
JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi
PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P
BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs
jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0
eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD
ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR
vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa
IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
O+7ETPTsJ3xCwnR8gooJybQDJbw=
-----END CERTIFICATE-----

# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
# Label: "Go Daddy Class 2 CA"
# Serial: 0
# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67
# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4
# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4
-----BEGIN CERTIFICATE-----
MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
ReYNnyicsbkqWletNw+vHX/bvZ8=
-----END CERTIFICATE-----

# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
# Label: "Starfield Class 2 CA"
# Serial: 0
# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24
# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a
# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58
-----BEGIN CERTIFICATE-----
MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl
MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp
U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw
NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE
ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp
ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3
DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf
8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN
+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0
X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa
K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA
1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G
A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR
zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0
YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD
bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w
DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3
L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D
eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp
VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY
WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=
-----END CERTIFICATE-----

# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
# Label: "StartCom Certification Authority"
# Serial: 1
# MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16
# SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f
# SHA256 Fingerprint: c7:66:a9:be:f2:d4:07:1c:86:3a:31:aa:49:20:e8:13:b2:d1:98:60:8c:b7:b7:cf:e2:11:43:b8:36:df:09:ea
-----BEGIN CERTIFICATE-----
MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW
MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9
MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j
ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js
LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM
BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0
Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy
dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh
cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh
YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg
dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp
bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ
YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT
TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ
9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8
jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW
FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz
ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1
ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L
EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu
L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC
O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V
um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh
NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=
-----END CERTIFICATE-----

# Issuer: O=Government Root Certification Authority
# Subject: O=Government Root Certification Authority
# Label: "Taiwan GRCA"
# Serial: 42023070807708724159991140556527066870
# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e
# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9
# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3
-----BEGIN CERTIFICATE-----
MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/
MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj
YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow
PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp
Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR
IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q
gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy
yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts
F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2
jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx
ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC
VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK
YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH
EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN
Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud
DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE
MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK
UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf
qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK
ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE
JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7
hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1
EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm
nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX
udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz
ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe
LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl
pYYsfPQS
-----END CERTIFICATE-----

# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
# Label: "Firmaprofesional Root CA"
# Serial: 1
# MD5 Fingerprint: 11:92:79:40:3c:b1:83:40:e5:ab:66:4a:67:92:80:df
# SHA1 Fingerprint: a9:62:8f:4b:98:a9:1b:48:35:ba:d2:c1:46:32:86:bb:66:64:6a:8c
# SHA256 Fingerprint: c1:cf:0b:52:09:64:35:e3:f1:b7:1d:aa:ec:45:5a:23:11:c8:40:4f:55:83:a9:e2:13:c6:9d:85:7d:94:33:05
-----BEGIN CERTIFICATE-----
MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx
IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1
dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w
HhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTELMAkGA1UEBhMCRVMx
IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1
dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5u
Cp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdY
rv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3z
hxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPay
BQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcL
iam8NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcb
AgMBAAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv
bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0
MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E
FgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQADggEBAEdz/o0n
VPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq
u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36m
hoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzfl
ZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp
QWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5
quGnM/b9Sh/22WA=
-----END CERTIFICATE-----

# Issuer: CN=Swisscom Root CA 1 O=Swisscom OU=Digital Certificate Services
# Subject: CN=Swisscom Root CA 1 O=Swisscom OU=Digital Certificate Services
# Label: "Swisscom Root CA 1"
# Serial: 122348795730808398873664200247279986742
# MD5 Fingerprint: f8:38:7c:77:88:df:2c:16:68:2e:c2:e2:52:4b:b8:f9
# SHA1 Fingerprint: 5f:3a:fc:0a:8b:64:f6:86:67:34:74:df:7e:a9:a2:fe:f9:fa:7a:51
# SHA256 Fingerprint: 21:db:20:12:36:60:bb:2e:d4:18:20:5d:a1:1e:e7:a8:5a:65:e2:bc:6e:55:b5:af:7e:78:99:c8:a2:66:d9:2e
-----BEGIN CERTIFICATE-----
MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk
MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0
YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg
Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT
AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp
Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN
BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9
m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih
FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/
TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F
EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco
kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu
HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF
vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo
19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC
L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW
bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX
JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw
FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc
K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf
ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik
Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB
sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e
3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR
ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip
mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH
b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf
rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms
hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y
zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6
MBr1mmz0DlP5OlvRHA==
-----END CERTIFICATE-----

# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
# Label: "DigiCert Assured ID Root CA"
# Serial: 17154717934120587862167794914071425081
# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72
# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43
# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c
-----BEGIN CERTIFICATE-----
MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
-----END CERTIFICATE-----

# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
# Label: "DigiCert Global Root CA"
# Serial: 10944719598952040374951832963794454346
# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e
# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36
# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61
-----BEGIN CERTIFICATE-----
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
-----END CERTIFICATE-----

# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
# Label: "DigiCert High Assurance EV Root CA"
# Serial: 3553400076410547919724730734378100087
# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a
# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25
# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
+OkuE6N36B9K
-----END CERTIFICATE-----

# Issuer: CN=Class 2 Primary CA O=Certplus
# Subject: CN=Class 2 Primary CA O=Certplus
# Label: "Certplus Class 2 Primary CA"
# Serial: 177770208045934040241468760488327595043
# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b
# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb
# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb
-----BEGIN CERTIFICATE-----
MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw
PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz
cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9
MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz
IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ
ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR
VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL
kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd
EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas
H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0
HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud
DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4
QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu
Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/
AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8
yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR
FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA
ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB
kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
l7+ijrRU
-----END CERTIFICATE-----

# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co.
# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co.
# Label: "DST Root CA X3"
# Serial: 91299735575339953335919266965803778155
# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5
# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13
# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39
-----BEGIN CERTIFICATE-----
MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
-----END CERTIFICATE-----

# Issuer: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES
# Subject: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES
# Label: "DST ACES CA X6"
# Serial: 17771143917277623872238992636097467865
# MD5 Fingerprint: 21:d8:4c:82:2b:99:09:33:a2:eb:14:24:8d:8e:5f:e8
# SHA1 Fingerprint: 40:54:da:6f:1c:3f:40:74:ac:ed:0f:ec:cd:db:79:d1:53:fb:90:1d
# SHA256 Fingerprint: 76:7c:95:5a:76:41:2c:89:af:68:8e:90:a1:c7:0f:55:6c:fd:6b:60:25:db:ea:10:41:6d:7e:b6:83:1f:8c:40
-----BEGIN CERTIFICATE-----
MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb
MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx
ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w
MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD
VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx
FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu
ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7
gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH
fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a
ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT
ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF
MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk
c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto
dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt
aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI
hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk
QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/
h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR
rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2
9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis=
-----END CERTIFICATE-----

# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=(c) 2005 TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş.
# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=(c) 2005 TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş.
# Label: "TURKTRUST Certificate Services Provider Root 1"
# Serial: 1
# MD5 Fingerprint: f1:6a:22:18:c9:cd:df:ce:82:1d:1d:b7:78:5c:a9:a5
# SHA1 Fingerprint: 79:98:a3:08:e1:4d:65:85:e6:c2:1e:15:3a:71:9f:ba:5a:d3:4a:d9
# SHA256 Fingerprint: 44:04:e3:3b:5e:14:0d:cf:99:80:51:fd:fc:80:28:c7:c8:16:15:c5:ee:73:7b:11:1b:58:82:33:a9:b5:35:a0
-----BEGIN CERTIFICATE-----
MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc
UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx
c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg
MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8
dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz
MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy
dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD
VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg
xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu
xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7
XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k
heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J
YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C
urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1
JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51
b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV
9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7
kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh
fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA
aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS
RGQDJereW26fyfJOrN3H
-----END CERTIFICATE-----

# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Kasım 2005
# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Kasım 2005
# Label: "TURKTRUST Certificate Services Provider Root 2"
# Serial: 1
# MD5 Fingerprint: 37:a5:6e:d4:b1:25:84:97:b7:fd:56:15:7a:f9:a2:00
# SHA1 Fingerprint: b4:35:d4:e1:11:9d:1c:66:90:a7:49:eb:b3:94:bd:63:7b:a7:82:b7
# SHA256 Fingerprint: c4:70:cf:54:7e:23:02:b9:77:fb:29:dd:71:a8:9a:7b:6c:1f:60:77:7b:03:29:f5:60:17:f3:28:bf:4f:6b:e6
-----BEGIN CERTIFICATE-----
MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc
UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx
c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS
S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg
SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3
WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv
bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU
UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw
bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe
LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef
J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh
R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ
Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX
JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p
zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S
Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq
ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz
gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH
uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS
y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI=
-----END CERTIFICATE-----

# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG
# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG
# Label: "SwissSign Gold CA - G2"
# Serial: 13492815561806991280
# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93
# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61
# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95
-----BEGIN CERTIFICATE-----
MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln
biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF
MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT
d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8
76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+
bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c
6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE
emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd
MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt
MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y
MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y
FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi
aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM
gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB
qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7
lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn
8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6
45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO
UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5
O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC
bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv
GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a
77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC
hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3
92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp
Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w
ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt
Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
-----END CERTIFICATE-----

# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG
# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG
# Label: "SwissSign Silver CA - G2"
# Serial: 5700383053117599563
# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13
# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb
# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5
-----BEGIN CERTIFICATE-----
MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE
BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu
IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow
RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY
U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv
Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br
YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF
nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH
6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt
eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/
c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ
MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH
HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf
jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6
5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB
rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU
F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c
wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB
AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp
WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9
xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ
2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ
IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8
aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X
em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR
dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/
OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+
hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy
tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
-----END CERTIFICATE-----

# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
# Label: "GeoTrust Primary Certification Authority"
# Serial: 32798226551256963324313806436981982369
# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf
# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96
# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c
-----BEGIN CERTIFICATE-----
MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY
MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx
MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp
ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9
AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA
ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0
7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W
kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI
mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ
KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1
6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl
4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K
oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj
UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU
AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
-----END CERTIFICATE-----

# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
# Label: "thawte Primary Root CA"
# Serial: 69529181992039203566298953787712940909
# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12
# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81
# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f
-----BEGIN CERTIFICATE-----
MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
jVaMaA==
-----END CERTIFICATE-----

# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only
# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only
# Label: "VeriSign Class 3 Public Primary Certification Authority - G5"
# Serial: 33037644167568058970164719475676101450
# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c
# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5
# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df
-----BEGIN CERTIFICATE-----
MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
-----END CERTIFICATE-----

# Issuer: CN=SecureTrust CA O=SecureTrust Corporation
# Subject: CN=SecureTrust CA O=SecureTrust Corporation
# Label: "SecureTrust CA"
# Serial: 17199774589125277788362757014266862032
# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1
# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11
# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73
-----BEGIN CERTIFICATE-----
MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI
MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz
MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv
cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz
Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO
0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao
wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj
7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS
8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT
BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg
JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC
NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3
6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/
3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm
D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS
CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
-----END CERTIFICATE-----

# Issuer: CN=Secure Global CA O=SecureTrust Corporation
# Subject: CN=Secure Global CA O=SecureTrust Corporation
# Label: "Secure Global CA"
# Serial: 9751836167731051554232119481456978597
# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de
# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b
# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69
-----BEGIN CERTIFICATE-----
MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK
MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx
MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg
Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ
iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa
/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ
jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI
HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7
sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w
gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF
MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw
KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG
AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L
URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO
H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm
I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY
iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
-----END CERTIFICATE-----

# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited
# Subject: CN=COMODO Certification Authority O=COMODO CA Limited
# Label: "COMODO Certification Authority"
# Serial: 104350513648249232941998508985834464573
# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75
# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b
# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66
-----BEGIN CERTIFICATE-----
MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI
2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8
Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY
SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd
BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
ZQ==
-----END CERTIFICATE-----

# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
# Label: "Network Solutions Certificate Authority"
# Serial: 116697915152937497490437556386812487904
# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e
# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce
# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c
-----BEGIN CERTIFICATE-----
MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi
MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp
dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV
UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO
ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz
c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP
OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl
mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF
BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4
qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw
gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB
BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu
bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp
dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8
6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/
h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH
/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN
pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
-----END CERTIFICATE-----

# Issuer: CN=WellsSecure Public Root Certificate Authority O=Wells Fargo WellsSecure OU=Wells Fargo Bank NA
# Subject: CN=WellsSecure Public Root Certificate Authority O=Wells Fargo WellsSecure OU=Wells Fargo Bank NA
# Label: "WellsSecure Public Root Certificate Authority"
# Serial: 1
# MD5 Fingerprint: 15:ac:a5:c2:92:2d:79:bc:e8:7f:cb:67:ed:02:cf:36
# SHA1 Fingerprint: e7:b4:f6:9d:61:ec:90:69:db:7e:90:a7:40:1a:3c:f4:7d:4f:e8:ee
# SHA256 Fingerprint: a7:12:72:ae:aa:a3:cf:e8:72:7f:7f:b3:9f:0f:b3:d1:e5:42:6e:90:60:b0:6e:e6:f1:3e:9a:3c:58:33:cd:43
-----BEGIN CERTIFICATE-----
MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx
IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs
cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v
dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0
MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl
bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD
DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r
WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU
Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs
HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj
z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf
SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl
AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG
KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P
AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j
BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC
VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX
ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB
ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd
/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB
A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn
k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9
iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv
2G0xffX8oRAHh84vWdw+WNs=
-----END CERTIFICATE-----

# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited
# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited
# Label: "COMODO ECC Certification Authority"
# Serial: 41578283867086692638256921589707938090
# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23
# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11
# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7
-----BEGIN CERTIFICATE-----
MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL
MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT
IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw
MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy
ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N
T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv
biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR
FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J
cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW
BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm
fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv
GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
-----END CERTIFICATE-----

# Issuer: CN=IGC/A O=PM/SGDN OU=DCSSI
# Subject: CN=IGC/A O=PM/SGDN OU=DCSSI
# Label: "IGC/A"
# Serial: 245102874772
# MD5 Fingerprint: 0c:7f:dd:6a:f4:2a:b9:c8:9b:bd:20:7e:a9:db:5c:37
# SHA1 Fingerprint: 60:d6:89:74:b5:c2:65:9e:8a:0f:c1:88:7c:88:d2:46:69:1b:18:2c
# SHA256 Fingerprint: b9:be:a7:86:0a:96:2e:a3:61:1d:ab:97:ab:6d:a3:e2:1c:10:68:b9:7d:55:57:5e:d0:e1:12:79:c1:1c:89:32
-----BEGIN CERTIFICATE-----
MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT
AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ
TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG
9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw
MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM
BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO
MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2
LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI
s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2
xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4
u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b
F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx
Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd
PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV
HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx
NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF
AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ
L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY
YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a
NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R
0982gaEbeC9xs/FZTEYYKKuF0mBWWg==
-----END CERTIFICATE-----

# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1
# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1
# Label: "Security Communication EV RootCA1"
# Serial: 0
# MD5 Fingerprint: 22:2d:a6:01:ea:7c:0a:f7:f0:6c:56:43:3f:77:76:d3
# SHA1 Fingerprint: fe:b8:c4:32:dc:f9:76:9a:ce:ae:3d:d8:90:8f:fd:28:86:65:64:7d
# SHA256 Fingerprint: a2:2d:ba:68:1e:97:37:6e:2d:39:7d:72:8a:ae:3a:9b:62:96:b9:fd:ba:60:bc:2e:11:f6:47:f2:c6:75:fb:37
-----BEGIN CERTIFICATE-----
MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl
MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh
U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz
MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N
IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11
bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE
RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO
zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5
bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF
MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1
VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC
OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G
CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW
tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ
q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb
EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+
Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O
VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
-----END CERTIFICATE-----

# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed
# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed
# Label: "OISTE WISeKey Global Root GA CA"
# Serial: 86718877871133159090080555911823548314
# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93
# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9
# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5
-----BEGIN CERTIFICATE-----
MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB
ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly
aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w
NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G
A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD
VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX
SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR
VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2
w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF
mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg
4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9
4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw
DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw
EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx
SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2
ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8
vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi
Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ
/L7fCg0=
-----END CERTIFICATE-----

# Issuer: CN=Microsec e-Szigno Root CA O=Microsec Ltd. OU=e-Szigno CA
# Subject: CN=Microsec e-Szigno Root CA O=Microsec Ltd. OU=e-Szigno CA
# Label: "Microsec e-Szigno Root CA"
# Serial: 272122594155480254301341951808045322001
# MD5 Fingerprint: f0:96:b6:2f:c5:10:d5:67:8e:83:25:32:e8:5e:2e:e5
# SHA1 Fingerprint: 23:88:c9:d3:71:cc:9e:96:3d:ff:7d:3c:a7:ce:fc:d6:25:ec:19:0d
# SHA256 Fingerprint: 32:7a:3d:76:1a:ba:de:a0:34:eb:99:84:06:27:5c:b1:a4:77:6e:fd:ae:2f:df:6d:01:68:ea:1c:4f:55:67:d0
-----BEGIN CERTIFICATE-----
MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAw
cjELMAkGA1UEBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNy
b3NlYyBMdGQuMRQwEgYDVQQLEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9z
ZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0MDYxMjI4NDRaFw0xNzA0MDYxMjI4
NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEWMBQGA1UEChMN
TWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMTGU1p
Y3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2u
uO/TEdyB5s87lozWbxXGd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+
LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/NoqdNAoI/gqyFxuEPkEeZlApxcpMqyabA
vjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjcQR/Ji3HWVBTji1R4P770
Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJPqW+jqpx
62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcB
AQRbMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3Aw
LQYIKwYBBQUHMAKGIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAP
BgNVHRMBAf8EBTADAQH/MIIBcwYDVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIB
AQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3LmUtc3ppZ25vLmh1L1NaU1ov
MIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0AdAB2AOEAbgB5
ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABT
AHoAbwBsAGcA4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABh
ACAAcwB6AGUAcgBpAG4AdAAgAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABo
AHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMAegBpAGcAbgBvAC4AaAB1AC8AUwBa
AFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6Ly93d3cuZS1zemln
bm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NOPU1p
Y3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxP
PU1pY3Jvc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZv
Y2F0aW9uTGlzdDtiaW5hcnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuB
EGluZm9AZS1zemlnbm8uaHWkdzB1MSMwIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWdu
w7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhTWjEWMBQGA1UEChMNTWlj
cm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhVMIGsBgNV
HSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJI
VTERMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDAS
BgNVBAsTC2UtU3ppZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBS
b290IENBghEAzLjnv04pGv2i3GalHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS
8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMTnGZjWS7KXHAM/IO8VbH0jgds
ZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FEaGAHQzAxQmHl
7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfR
hUZLphK3dehKyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/
MPMMNz7UwiiAc7EBt51alhQBS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
-----END CERTIFICATE-----

# Issuer: CN=Certigna O=Dhimyotis
# Subject: CN=Certigna O=Dhimyotis
# Label: "Certigna"
# Serial: 18364802974209362175
# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff
# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97
# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d
-----BEGIN CERTIFICATE-----
MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV
BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X
DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ
BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4
QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny
gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw
zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q
130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2
JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw
DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw
ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT
AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj
AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG
9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h
bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc
fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu
HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w
t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
-----END CERTIFICATE-----

# Issuer: CN=AC Raíz Certicámara S.A. O=Sociedad Cameral de Certificación Digital - Certicámara S.A.
# Subject: CN=AC Raíz Certicámara S.A. O=Sociedad Cameral de Certificación Digital - Certicámara S.A.
# Label: "AC Ra\xC3\xADz Certic\xC3\xA1mara S.A."
# Serial: 38908203973182606954752843738508300
# MD5 Fingerprint: 93:2a:3e:f6:fd:23:69:0d:71:20:d4:2b:47:99:2b:a6
# SHA1 Fingerprint: cb:a1:c5:f8:b0:e3:5e:b8:b9:45:12:d3:f9:34:a2:e9:06:10:d3:36
# SHA256 Fingerprint: a6:c5:1e:0d:a5:ca:0a:93:09:d2:e4:c0:e4:0c:2a:f9:10:7a:ae:82:03:85:7f:e1:98:e3:e7:69:e3:43:08:5c
-----BEGIN CERTIFICATE-----
MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx
CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp
ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa
QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw
NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft
ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu
QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq
hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG
qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL
fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ
Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4
Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ
54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b
MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j
ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej
YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt
A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF
rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ
pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB
lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy
YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50
7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs
YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6
xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc
unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/
Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp
ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42
gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0
jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+
XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD
W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/
RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r
MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk
BYn8eNZcLCZDqQ==
-----END CERTIFICATE-----

# Issuer: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA
# Subject: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA
# Label: "TC TrustCenter Class 2 CA II"
# Serial: 941389028203453866782103406992443
# MD5 Fingerprint: ce:78:33:5c:59:78:01:6e:18:ea:b9:36:a0:b9:2e:23
# SHA1 Fingerprint: ae:50:83:ed:7c:f4:5c:bc:8f:61:c6:21:fe:68:5d:79:42:21:15:6e
# SHA256 Fingerprint: e6:b8:f8:76:64:85:f8:07:ae:7f:8d:ac:16:70:46:1f:07:c0:a1:3e:ef:3a:1f:f7:17:53:8d:7a:ba:d3:91:b4
-----BEGIN CERTIFICATE-----
MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL
MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV
BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0
Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1
OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i
SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc
VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf
tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg
uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J
XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK
8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99
5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud
EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3
kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy
dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6
Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz
JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290
Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS
GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt
ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8
au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV
hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI
dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ==
-----END CERTIFICATE-----

# Issuer: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA
# Subject: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA
# Label: "TC TrustCenter Class 3 CA II"
# Serial: 1506523511417715638772220530020799
# MD5 Fingerprint: 56:5f:aa:80:61:12:17:f6:67:21:e6:2b:6d:61:56:8e
# SHA1 Fingerprint: 80:25:ef:f4:6e:70:c8:d4:72:24:65:84:fe:40:3b:8a:8d:6a:db:f5
# SHA256 Fingerprint: 8d:a0:84:fc:f9:9c:e0:77:22:f8:9b:32:05:93:98:06:fa:5c:b8:11:e1:c8:13:f6:a1:08:c7:d3:36:b3:40:8e
-----BEGIN CERTIFICATE-----
MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL
MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV
BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0
Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1
OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i
SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc
VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW
Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q
Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2
1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq
ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1
Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud
EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX
XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy
dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6
Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz
JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290
Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN
irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8
TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6
g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB
95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj
S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A==
-----END CERTIFICATE-----

# Issuer: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA
# Subject: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA
# Label: "TC TrustCenter Universal CA I"
# Serial: 601024842042189035295619584734726
# MD5 Fingerprint: 45:e1:a5:72:c5:a9:36:64:40:9e:f5:e4:58:84:67:8c
# SHA1 Fingerprint: 6b:2f:34:ad:89:58:be:62:fd:b0:6b:5c:ce:bb:9d:d9:4f:4e:39:f3
# SHA256 Fingerprint: eb:f3:c0:2a:87:89:b1:fb:7d:51:19:95:d6:63:b7:29:06:d9:13:ce:0d:5e:10:56:8a:8a:77:e2:58:61:67:e7
-----BEGIN CERTIFICATE-----
MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL
MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV
BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1
c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx
MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg
R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD
VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR
JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T
fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu
jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z
wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ
fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD
VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO
BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G
CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1
7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn
8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs
ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/
2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
-----END CERTIFICATE-----

# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center
# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center
# Label: "Deutsche Telekom Root CA 2"
# Serial: 38
# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08
# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf
# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3
-----BEGIN CERTIFICATE-----
MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc
MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj
IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB
IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE
RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl
U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290
IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU
ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC
QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr
rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S
NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc
QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH
txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP
BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC
AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp
tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa
IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl
6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+
xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
Cm26OWMohpLzGITY+9HPBVZkVw==
-----END CERTIFICATE-----

# Issuer: CN=ComSign Secured CA O=ComSign
# Subject: CN=ComSign Secured CA O=ComSign
# Label: "ComSign Secured CA"
# Serial: 264725503855295744117309814499492384489
# MD5 Fingerprint: 40:01:25:06:8d:21:43:6a:0e:43:00:9c:e7:43:f3:d5
# SHA1 Fingerprint: f9:cd:0e:2c:da:76:24:c1:8f:bd:f0:f0:ab:b6:45:b8:f7:fe:d5:7a
# SHA256 Fingerprint: 50:79:41:c7:44:60:a0:b4:70:86:22:0d:4e:99:32:57:2a:b5:d1:b5:bb:cb:89:80:ab:1c:b1:76:51:a8:44:d2
-----BEGIN CERTIFICATE-----
MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAw
PDEbMBkGA1UEAxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWdu
MQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwx
GzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBDQTEQMA4GA1UEChMHQ29tU2lnbjEL
MAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGtWhf
HZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs49oh
gHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sW
v+bznkqH7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ue
Mv5WJDmyVIRD9YTC2LxBkMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr
9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d19guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt
6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUwAwEB/zBEBgNVHR8EPTA7
MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29tU2lnblNl
Y3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58
ADsAj8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkq
hkiG9w0BAQUFAAOCAQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7p
iL1DRYHjZiM/EoZNGeQFsOY3wo3aBijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtC
dsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtpFhpFfTMDZflScZAmlaxMDPWL
kz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP51qJThRv4zdL
hfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz
OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==
-----END CERTIFICATE-----

# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc
# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc
# Label: "Cybertrust Global Root"
# Serial: 4835703278459682877484360
# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1
# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6
# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3
-----BEGIN CERTIFICATE-----
MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG
A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh
bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE
ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS
b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5
7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS
J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y
HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP
t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz
FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY
XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/
MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw
hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js
MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA
A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj
Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx
XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o
omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc
A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
WL1WMRJOEcgh4LMRkWXbtKaIOM5V
-----END CERTIFICATE-----

# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority
# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority
# Label: "ePKI Root Certification Authority"
# Serial: 28956088682735189655030529057352760477
# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3
# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0
# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5
-----BEGIN CERTIFICATE-----
MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe
MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0
ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw
IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL
SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF
AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH
SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh
ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X
DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1
TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ
fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA
sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU
WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS
nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH
dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip
NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC
AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF
MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB
uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl
PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP
JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/
gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2
j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6
5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB
o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS
/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z
Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE
W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D
hNQ+IIX3Sj0rnP0qCglN6oH4EZw=
-----END CERTIFICATE-----

# Issuer: CN=TÜBİTAK UEKAE Kök Sertifika Hizmet Sağlayıcısı - Sürüm 3 O=Türkiye Bilimsel ve Teknolojik Araştırma Kurumu - TÜBİTAK OU=Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü - UEKAE/Kamu Sertifikasyon Merkezi
# Subject: CN=TÜBİTAK UEKAE Kök Sertifika Hizmet Sağlayıcısı - Sürüm 3 O=Türkiye Bilimsel ve Teknolojik Araştırma Kurumu - TÜBİTAK OU=Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü - UEKAE/Kamu Sertifikasyon Merkezi
# Label: "T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3"
# Serial: 17
# MD5 Fingerprint: ed:41:f5:8c:50:c5:2b:9c:73:e6:ee:6c:eb:c2:a8:26
# SHA1 Fingerprint: 1b:4b:39:61:26:27:6b:64:91:a2:68:6d:d7:02:43:21:2d:1f:1d:96
# SHA256 Fingerprint: e4:c7:34:30:d7:a5:b5:09:25:df:43:37:0a:0d:21:6e:9a:79:b9:d6:db:83:73:a0:c6:9e:b1:cc:31:c7:c5:2a
-----BEGIN CERTIFICATE-----
MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS
MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp
bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw
VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy
YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy
dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2
ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe
Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx
GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls
aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU
QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh
xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0
aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr
IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h
gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK
O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO
fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw
lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID
AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/
BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP
NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t
wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM
7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh
gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n
oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs
yZyQ2uypQjyttgI=
-----END CERTIFICATE-----

# Issuer: CN=Buypass Class 2 CA 1 O=Buypass AS-983163327
# Subject: CN=Buypass Class 2 CA 1 O=Buypass AS-983163327
# Label: "Buypass Class 2 CA 1"
# Serial: 1
# MD5 Fingerprint: b8:08:9a:f0:03:cc:1b:0d:c8:6c:0b:76:a1:75:64:23
# SHA1 Fingerprint: a0:a1:ab:90:c9:fc:84:7b:3b:12:61:e8:97:7d:5f:d3:22:61:d3:cc
# SHA256 Fingerprint: 0f:4e:9c:dd:26:4b:02:55:50:d1:70:80:63:40:21:4f:e9:44:34:c9:b0:2f:69:7e:c7:10:fc:5f:ea:fb:5e:38
-----BEGIN CERTIFICATE-----
MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd
MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg
Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL
MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD
VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0
ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX
l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB
HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B
5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3
WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD
AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP
gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+
DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu
BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs
h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk
LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
-----END CERTIFICATE-----

# Issuer: CN=Buypass Class 3 CA 1 O=Buypass AS-983163327
# Subject: CN=Buypass Class 3 CA 1 O=Buypass AS-983163327
# Label: "Buypass Class 3 CA 1"
# Serial: 2
# MD5 Fingerprint: df:3c:73:59:81:e7:39:50:81:04:4c:34:a2:cb:b3:7b
# SHA1 Fingerprint: 61:57:3a:11:df:0e:d8:7e:d5:92:65:22:ea:d0:56:d7:44:b3:23:71
# SHA256 Fingerprint: b7:b1:2b:17:1f:82:1d:aa:99:0c:d0:fe:50:87:b1:28:44:8b:a8:e5:18:4f:84:c5:1e:02:b5:c8:fb:96:2b:24
-----BEGIN CERTIFICATE-----
MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd
MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg
Q2xhc3MgMyBDQSAxMB4XDTA1MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzEL
MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD
VQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKxifZg
isRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//z
NIqeKNc0n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI
+MkcVyzwPX6UvCWThOiaAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2R
hzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+
mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
AwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0PAQH/BAQD
AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFP
Bdy7pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27s
EzNxZy5p+qksP2bAEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2
mSlf56oBzKwzqBwKu5HEA6BvtjT5htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yC
e/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQjel/wroQk5PMr+4okoyeYZdow
dXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915
-----END CERTIFICATE-----

# Issuer: CN=EBG Elektronik Sertifika Hizmet Sağlayıcısı O=EBG Bilişim Teknolojileri ve Hizmetleri A.Ş.
# Subject: CN=EBG Elektronik Sertifika Hizmet Sağlayıcısı O=EBG Bilişim Teknolojileri ve Hizmetleri A.Ş.
# Label: "EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1"
# Serial: 5525761995591021570
# MD5 Fingerprint: 2c:20:26:9d:cb:1a:4a:00:85:b5:b7:5a:ae:c2:01:37
# SHA1 Fingerprint: 8c:96:ba:eb:dd:2b:07:07:48:ee:30:32:66:a0:f3:98:6e:7c:ae:58
# SHA256 Fingerprint: 35:ae:5b:dd:d8:f7:ae:63:5c:ff:ba:56:82:a8:f0:0b:95:f4:84:62:c7:10:8e:e9:a0:e5:29:2b:07:4a:af:b2
-----BEGIN CERTIFICATE-----
MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNV
BAMML0VCRyBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx
c8SxMTcwNQYDVQQKDC5FQkcgQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXpt
ZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAeFw0wNjA4MTcwMDIxMDlaFw0xNjA4
MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25payBTZXJ0aWZpa2Eg
SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2ltIFRl
a25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIi
MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h
4fuXd7hxlugTlkaDT7byX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAk
tiHq6yOU/im/+4mRDGSaBUorzAzu8T2bgmmkTPiab+ci2hC6X5L8GCcKqKpE+i4s
tPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfreYteIAbTdgtsApWjluTL
dlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZTqNGFav4
c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8Um
TDGyY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z
+kI2sSXFCjEmN1ZnuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0O
Lna9XvNRiYuoP1Vzv9s6xiQFlpJIqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMW
OeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vmExH8nYQKE3vwO9D8owrXieqW
fo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0Nokb+Clsi7n2
l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgw
FoAU587GT/wWZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+
8ygjdsZs93/mQJ7ANtyVDR2tFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI
6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgmzJNSroIBk5DKd8pNSe/iWtkqvTDO
TLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64kXPBfrAowzIpAoHME
wfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqTbCmY
Iai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJn
xk1Gj7sURT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4Q
DgZxGhBM/nV+/x5XOULK1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9q
Kd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11t
hie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQY9iJSrSq3RZj9W6+YKH4
7ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9AahH3eU7
QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT
-----END CERTIFICATE-----

# Issuer: O=certSIGN OU=certSIGN ROOT CA
# Subject: O=certSIGN OU=certSIGN ROOT CA
# Label: "certSIGN ROOT CA"
# Serial: 35210227249154
# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17
# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b
# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb
-----BEGIN CERTIFICATE-----
MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT
AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD
QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP
MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do
0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ
UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d
RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ
OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv
JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C
AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O
BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ
LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY
MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ
44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I
Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw
i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN
9u6wWk5JRFRYX0KD
-----END CERTIFICATE-----

# Issuer: CN=CNNIC ROOT O=CNNIC
# Subject: CN=CNNIC ROOT O=CNNIC
# Label: "CNNIC ROOT"
# Serial: 1228079105
# MD5 Fingerprint: 21:bc:82:ab:49:c4:13:3b:4b:b2:2b:5c:6b:90:9c:19
# SHA1 Fingerprint: 8b:af:4c:9b:1d:f0:2a:92:f7:da:12:8e:b9:1b:ac:f4:98:60:4b:6f
# SHA256 Fingerprint: e2:83:93:77:3d:a8:45:a6:79:f2:08:0c:c7:fb:44:a3:b7:a1:c3:79:2c:b7:eb:77:29:fd:cb:6a:8d:99:ae:a7
-----BEGIN CERTIFICATE-----
MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD
TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2
MDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF
Q05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh
IhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6
dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO
V/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC
GHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN
v7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB
AQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB
Af8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO
76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK
OOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH
ugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi
yJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL
buXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj
2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE=
-----END CERTIFICATE-----

# Issuer: O=Japanese Government OU=ApplicationCA
# Subject: O=Japanese Government OU=ApplicationCA
# Label: "ApplicationCA - Japanese Government"
# Serial: 49
# MD5 Fingerprint: 7e:23:4e:5b:a7:a5:b4:25:e9:00:07:74:11:62:ae:d6
# SHA1 Fingerprint: 7f:8a:b0:cf:d0:51:87:6a:66:f3:36:0f:47:c8:8d:8c:d3:35:fc:74
# SHA256 Fingerprint: 2d:47:43:7d:e1:79:51:21:5a:12:f3:c5:8e:51:c7:29:a5:80:26:ef:1f:cc:0a:5f:b3:d9:dc:01:2f:60:0d:19
-----BEGIN CERTIFICATE-----
MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc
MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp
b25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT
AkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs
aWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H
j6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K
f5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55
IrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw
FO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht
QWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm
/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ
k/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ
MRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC
seODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
ggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ
hyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+
eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U
DNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj
B1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
rosot4LKGAfmt1t06SAZf7IbiVQ=
-----END CERTIFICATE-----

# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
# Label: "GeoTrust Primary Certification Authority - G3"
# Serial: 28809105769928564313984085209975885599
# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05
# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd
# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4
-----BEGIN CERTIFICATE-----
MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB
mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT
MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ
BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0
BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz
+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm
hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn
5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W
JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL
DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC
huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB
AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB
zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN
kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH
SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G
spki4cErx5z481+oghLrGREt
-----END CERTIFICATE-----

# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
# Label: "thawte Primary Root CA - G2"
# Serial: 71758320672825410020661621085256472406
# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f
# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12
# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57
-----BEGIN CERTIFICATE-----
MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL
MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp
IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi
BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw
MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig
YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v
dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/
BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6
papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E
BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K
DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3
KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox
XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
-----END CERTIFICATE-----

# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
# Label: "thawte Primary Root CA - G3"
# Serial: 127614157056681299805556476275995414779
# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31
# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2
# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c
-----BEGIN CERTIFICATE-----
MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB
rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV
BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa
Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl
LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u
MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl
ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm
gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8
YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf
b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9
9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S
zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk
OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV
HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA
2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW
oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c
KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM
m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu
MdRAGmI0Nj81Aa6sY6A=
-----END CERTIFICATE-----

# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
# Label: "GeoTrust Primary Certification Authority - G2"
# Serial: 80682863203381065782177908751794619243
# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a
# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0
# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66
-----BEGIN CERTIFICATE-----
MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL
MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj
KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2
MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV
BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw
NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV
BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL
So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal
tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG
CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT
qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz
rD6ogRLQy7rQkgu2npaqBA+K
-----END CERTIFICATE-----

# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
# Label: "VeriSign Universal Root Certification Authority"
# Serial: 85209574734084581917763752644031726877
# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19
# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54
# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c
-----BEGIN CERTIFICATE-----
MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB
vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp
U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W
ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX
MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0
IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y
IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh
bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF
9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH
H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H
LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN
/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT
rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud
EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw
WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs
exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4
sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+
seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz
4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+
BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR
lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3
7M2CYfE45k+XmCpajQ==
-----END CERTIFICATE-----

# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only
# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only
# Label: "VeriSign Class 3 Public Primary Certification Authority - G4"
# Serial: 63143484348153506665311985501458640051
# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41
# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a
# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79
-----BEGIN CERTIFICATE-----
MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL
MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln
biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG
A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp
U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg
SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln
biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm
GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve
fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw
AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ
aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj
aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW
kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC
4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga
FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
-----END CERTIFICATE-----

# Issuer: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services)
# Subject: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services)
# Label: "NetLock Arany (Class Gold) Főtanúsítvány"
# Serial: 80544274841616
# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88
# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91
# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98
-----BEGIN CERTIFICATE-----
MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG
EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3
MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl
cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR
dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB
pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM
b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm
aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz
IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT
lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz
AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5
VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG
ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2
BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG
AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M
U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh
bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C
+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F
uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2
XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
-----END CERTIFICATE-----

# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden
# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden
# Label: "Staat der Nederlanden Root CA - G2"
# Serial: 10000012
# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a
# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16
# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f
-----BEGIN CERTIFICATE-----
MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO
TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh
dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX
DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl
ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv
b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291
qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp
uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU
Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE
pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp
5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M
UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN
GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy
5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv
6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK
eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6
B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/
BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov
L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG
SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS
CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen
5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897
IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK
gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL
+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL
vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm
bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk
N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC
Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z
ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ==
-----END CERTIFICATE-----

# Issuer: CN=CA Disig O=Disig a.s.
# Subject: CN=CA Disig O=Disig a.s.
# Label: "CA Disig"
# Serial: 1
# MD5 Fingerprint: 3f:45:96:39:e2:50:87:f7:bb:fe:98:0c:3c:20:98:e6
# SHA1 Fingerprint: 2a:c8:d5:8b:57:ce:bf:2f:49:af:f2:fc:76:8f:51:14:62:90:7a:41
# SHA256 Fingerprint: 92:bf:51:19:ab:ec:ca:d0:b1:33:2d:c4:e1:d0:5f:ba:75:b5:67:90:44:ee:0c:a2:6e:93:1f:74:4f:2f:33:cf
-----BEGIN CERTIFICATE-----
MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzET
MBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UE
AxMIQ0EgRGlzaWcwHhcNMDYwMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQsw
CQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcg
YS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgmGErE
Nx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnX
mjxUizkDPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYD
XcDtab86wYqg6I7ZuUUohwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhW
S8+2rT+MitcE5eN4TPWGqvWP+j1scaMtymfraHtuM6kMgiioTGohQBUgDCZbg8Kp
FhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8wgfwwDwYDVR0TAQH/BAUw
AwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0PAQH/BAQD
AgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cu
ZGlzaWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5z
ay9jYS9jcmwvY2FfZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2sv
Y2EvY3JsL2NhX2Rpc2lnLmNybDAaBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEw
DQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59tWDYcPQuBDRIrRhCA/ec8J9B6
yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3mkkp7M5+cTxq
EEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeB
EicTXxChds6KezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFN
PGO+I++MzVpQuGhU+QqZMxEA4Z7CRneC9VkGjCFMhwnN5ag=
-----END CERTIFICATE-----

# Issuer: CN=Juur-SK O=AS Sertifitseerimiskeskus
# Subject: CN=Juur-SK O=AS Sertifitseerimiskeskus
# Label: "Juur-SK"
# Serial: 999181308
# MD5 Fingerprint: aa:8e:5d:d9:f8:db:0a:58:b7:8d:26:87:6c:82:35:55
# SHA1 Fingerprint: 40:9d:4b:d9:17:b5:5c:27:b6:9b:64:cb:98:22:44:0d:cd:09:b8:89
# SHA256 Fingerprint: ec:c3:e9:c3:40:75:03:be:e0:91:aa:95:2f:41:34:8f:f8:8b:aa:86:3b:22:64:be:fa:c8:07:90:15:74:e9:39
-----BEGIN CERTIFICATE-----
MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcN
AQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZp
dHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMw
MVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQsw
CQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEQ
MA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOB
SvZiF3tfTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkz
ABpTpyHhOEvWgxutr2TC+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvH
LCu3GFH+4Hv2qEivbDtPL+/40UceJlfwUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMP
PbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDaTpxt4brNj3pssAki14sL
2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQFMAMBAf8w
ggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwIC
MIHDHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDk
AGwAagBhAHMAdABhAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0
AHMAZQBlAHIAaQBtAGkAcwBrAGUAcwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABz
AGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABrAGkAbgBuAGkAdABhAG0AaQBz
AGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nwcy8wKwYDVR0f
BCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcY
P2/v6X2+MA4GA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOi
CfP+JmeaUOTDBS8rNXiRTHyoERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+g
kcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyLabVAyJRld/JXIWY7zoVAtjNjGr95
HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678IIbsSt4beDI3poHS
na9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkhMp6q
qIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0Z
TbvGRNs2yyqcjg==
-----END CERTIFICATE-----

# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post
# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post
# Label: "Hongkong Post Root CA 1"
# Serial: 1000
# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca
# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58
# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2
-----BEGIN CERTIFICATE-----
MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx
FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg
Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG
A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr
b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ
jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn
PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh
ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9
nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h
q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED
MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC
mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3
7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB
oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs
EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO
fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi
AmvZWg==
-----END CERTIFICATE-----

# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc.
# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc.
# Label: "SecureSign RootCA11"
# Serial: 1
# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26
# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3
# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12
-----BEGIN CERTIFICATE-----
MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr
MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG
A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0
MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp
Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD
QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz
i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8
h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV
MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9
UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni
8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC
h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD
VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB
AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm
KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ
X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr
QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5
pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN
QSdJQO7e5iNEOdyhIta6A/I=
-----END CERTIFICATE-----

# Issuer: CN=ACEDICOM Root O=EDICOM OU=PKI
# Subject: CN=ACEDICOM Root O=EDICOM OU=PKI
# Label: "ACEDICOM Root"
# Serial: 7029493972724711941
# MD5 Fingerprint: 42:81:a0:e2:1c:e3:55:10:de:55:89:42:65:96:22:e6
# SHA1 Fingerprint: e0:b4:32:2e:b2:f6:a5:68:b6:54:53:84:48:18:4a:50:36:87:43:84
# SHA256 Fingerprint: 03:95:0f:b4:9a:53:1f:3e:19:91:94:23:98:df:a9:e0:ea:32:d7:ba:1c:dd:9b:c8:5d:b5:7e:d9:40:0b:43:4a
-----BEGIN CERTIFICATE-----
MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE
AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x
CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW
MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF
RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC
AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7
09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7
XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P
Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK
t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb
X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28
MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU
fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI
2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH
K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae
ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP
BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ
MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw
RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv
bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm
fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3
gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe
I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i
5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi
ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn
MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ
o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6
zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN
GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt
r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK
Z05phkOTOPu220+DkdRgfks+KzgHVZhepA==
-----END CERTIFICATE-----

# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
# Label: "Verisign Class 3 Public Primary Certification Authority"
# Serial: 80507572722862485515306429940691309246
# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4
# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b
# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05
-----BEGIN CERTIFICATE-----
MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG
A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i
2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ
2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ
-----END CERTIFICATE-----

# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd.
# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd.
# Label: "Microsec e-Szigno Root CA 2009"
# Serial: 14014712776195784473
# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1
# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e
# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78
-----BEGIN CERTIFICATE-----
MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD
VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0
ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G
CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y
OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx
FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp
Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP
kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc
cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U
fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7
N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC
xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1
+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM
Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG
SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h
mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk
ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c
2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t
HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW
-----END CERTIFICATE-----

# Issuer: CN=e-Guven Kok Elektronik Sertifika Hizmet Saglayicisi O=Elektronik Bilgi Guvenligi A.S.
# Subject: CN=e-Guven Kok Elektronik Sertifika Hizmet Saglayicisi O=Elektronik Bilgi Guvenligi A.S.
# Label: "E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi"
# Serial: 91184789765598910059173000485363494069
# MD5 Fingerprint: 3d:41:29:cb:1e:aa:11:74:cd:5d:b0:62:af:b0:43:5b
# SHA1 Fingerprint: dd:e1:d2:a9:01:80:2e:1d:87:5e:84:b3:80:7e:4b:b1:fd:99:41:34
# SHA256 Fingerprint: e6:09:07:84:65:a4:19:78:0c:b6:ac:4c:1c:0b:fb:46:53:d9:d9:cc:6e:b3:94:6e:b7:f3:d6:99:97:ba:d5:98
-----BEGIN CERTIFICATE-----
MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1
MQswCQYDVQQGEwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxp
Z2kgQS5TLjE8MDoGA1UEAxMzZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZp
a2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3MDEwNDExMzI0OFoXDTE3MDEwNDEx
MzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0cm9uaWsgQmlsZ2kg
R3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9uaWsg
U2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdU
MZTe1RK6UxYC6lhj71vY8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlT
L/jDj/6z/P2douNffb7tC+Bg62nsM+3YjfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H
5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAIJjjcJRFHLfO6IxClv7wC
90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk9Ok0oSy1
c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/
BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoE
VtstxNulMA0GCSqGSIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLP
qk/CaOv/gKlR6D1id4k9CnU58W5dF4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S
/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwqD2fK/A+JYZ1lpTzlvBNbCNvj
/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4Vwpm+Vganf2X
KWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq
fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX
-----END CERTIFICATE-----

# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
# Label: "GlobalSign Root CA - R3"
# Serial: 4835703278459759426209954
# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28
# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad
# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b
-----BEGIN CERTIFICATE-----
MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G
A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp
Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4
MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG
A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8
RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT
gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm
KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd
QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ
XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw
DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o
LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU
RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp
jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK
6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX
mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs
Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH
WD9f
-----END CERTIFICATE-----

# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068"
# Serial: 6047274297262753887
# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3
# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa
# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef
-----BEGIN CERTIFICATE-----
MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE
BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h
cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy
MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg
Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi
MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9
thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM
cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG
L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i
NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h
X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b
m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy
Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja
EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T
KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF
6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh
OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD
VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD
VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv
ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl
AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF
661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9
am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1
ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481
PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS
3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k
SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF
3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM
ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g
StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz
Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB
jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
-----END CERTIFICATE-----

# Issuer: CN=Izenpe.com O=IZENPE S.A.
# Subject: CN=Izenpe.com O=IZENPE S.A.
# Label: "Izenpe.com"
# Serial: 917563065490389241595536686991402621
# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73
# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19
# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f
-----BEGIN CERTIFICATE-----
MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4
MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6
ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD
VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j
b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq
scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO
xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H
LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX
uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD
yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+
JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q
rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN
BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L
hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB
QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+
HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu
Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg
QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB
BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA
A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb
laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56
awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo
JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw
LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT
VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk
LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb
UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/
QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+
naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls
QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
-----END CERTIFICATE-----

# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A.
# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A.
# Label: "Chambers of Commerce Root - 2008"
# Serial: 11806822484801597146
# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7
# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c
# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0
-----BEGIN CERTIFICATE-----
MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD
VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz
IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz
MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj
dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw
EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp
MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G
CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9
28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq
VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q
DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR
5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL
ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a
Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl
UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s
+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5
Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx
hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV
HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1
+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN
YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t
L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy
ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt
IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV
HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w
DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW
PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF
5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1
glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH
FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2
pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD
xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG
tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq
jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De
fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ
d0jQ
-----END CERTIFICATE-----

# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A.
# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A.
# Label: "Global Chambersign Root - 2008"
# Serial: 14541511773111788494
# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3
# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c
# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca
-----BEGIN CERTIFICATE-----
MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD
VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx
MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy
cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG
A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl
BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI
hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed
KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7
G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2
zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4
ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG
HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2
Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V
yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e
beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r
6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog
zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW
BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr
ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp
ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk
cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt
YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC
CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow
KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI
hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ
UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz
X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x
fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz
a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd
Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd
SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O
AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso
M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge
v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
-----END CERTIFICATE-----

# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
# Label: "Go Daddy Root Certificate Authority - G2"
# Serial: 0
# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01
# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b
# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
4uJEvlz36hz1
-----END CERTIFICATE-----

# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
# Label: "Starfield Root Certificate Authority - G2"
# Serial: 0
# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96
# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e
# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5
-----BEGIN CERTIFICATE-----
MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx
EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs
ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw
MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj
aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp
Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg
nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1
HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N
Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN
dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0
HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G
CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU
sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3
4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg
8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1
mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
-----END CERTIFICATE-----

# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
# Label: "Starfield Services Root Certificate Authority - G2"
# Serial: 0
# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2
# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f
# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5
-----BEGIN CERTIFICATE-----
MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD
VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy
ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy
dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p
OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2
8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K
Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe
hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk
6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw
DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q
AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI
bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB
ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z
qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn
0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN
sSi6
-----END CERTIFICATE-----

# Issuer: CN=AffirmTrust Commercial O=AffirmTrust
# Subject: CN=AffirmTrust Commercial O=AffirmTrust
# Label: "AffirmTrust Commercial"
# Serial: 8608355977964138876
# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7
# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7
# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7
-----BEGIN CERTIFICATE-----
MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL
MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP
Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr
ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL
MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1
yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr
VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/
nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG
XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj
vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt
Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g
N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC
nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
-----END CERTIFICATE-----

# Issuer: CN=AffirmTrust Networking O=AffirmTrust
# Subject: CN=AffirmTrust Networking O=AffirmTrust
# Label: "AffirmTrust Networking"
# Serial: 8957382827206547757
# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f
# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f
# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b
-----BEGIN CERTIFICATE-----
MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL
MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y
YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua
kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL
QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp
6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG
yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i
QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO
tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu
QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ
Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u
olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48
x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
-----END CERTIFICATE-----

# Issuer: CN=AffirmTrust Premium O=AffirmTrust
# Subject: CN=AffirmTrust Premium O=AffirmTrust
# Label: "AffirmTrust Premium"
# Serial: 7893706540734352110
# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57
# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27
# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a
-----BEGIN CERTIFICATE-----
MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE
BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz
dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG
A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U
cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf
qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ
JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ
+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS
s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5
HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7
70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG
V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S
qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S
5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia
C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX
OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE
FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2
KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B
8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ
MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc
0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ
u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF
u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH
YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8
GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO
RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e
KeC2uAloGRwYQw==
-----END CERTIFICATE-----

# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust
# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust
# Label: "AffirmTrust Premium ECC"
# Serial: 8401224907861490260
# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d
# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb
# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23
-----BEGIN CERTIFICATE-----
MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC
VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ
cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ
BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt
VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D
0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9
ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G
A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G
A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs
aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I
flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==
-----END CERTIFICATE-----

# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority
# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority
# Label: "Certum Trusted Network CA"
# Serial: 279744
# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78
# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e
# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e
-----BEGIN CERTIFICATE-----
MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM
MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D
ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU
cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3
WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg
Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw
IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH
UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM
TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU
BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM
kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x
AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV
HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y
sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL
I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8
J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY
VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
-----END CERTIFICATE-----

# Issuer: CN=Certinomis - Autorité Racine O=Certinomis OU=0002 433998903
# Subject: CN=Certinomis - Autorité Racine O=Certinomis OU=0002 433998903
# Label: "Certinomis - Autorité Racine"
# Serial: 1
# MD5 Fingerprint: 7f:30:78:8c:03:e3:ca:c9:0a:e2:c9:ea:1e:aa:55:1a
# SHA1 Fingerprint: 2e:14:da:ec:28:f0:fa:1e:8e:38:9a:4e:ab:eb:26:c0:0a:d3:83:c3
# SHA256 Fingerprint: fc:bf:e2:88:62:06:f7:2b:27:59:3c:8b:07:02:97:e1:2d:76:9e:d1:0e:d7:93:07:05:a8:09:8e:ff:c1:4d:17
-----BEGIN CERTIFICATE-----
MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET
MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk
BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4
Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl
cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0
aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
ADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY
F1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N
8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe
rP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K
/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu
7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC
28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6
lSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E
nn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB
0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09
5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj
WzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN
jLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ
KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s
ov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM
OH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q
619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn
2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj
o3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v
nxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG
5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq
pdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb
dsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0
BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5
-----END CERTIFICATE-----

# Issuer: CN=Root CA Generalitat Valenciana O=Generalitat Valenciana OU=PKIGVA
# Subject: CN=Root CA Generalitat Valenciana O=Generalitat Valenciana OU=PKIGVA
# Label: "Root CA Generalitat Valenciana"
# Serial: 994436456
# MD5 Fingerprint: 2c:8c:17:5e:b1:54:ab:93:17:b5:36:5a:db:d1:c6:f2
# SHA1 Fingerprint: a0:73:e5:c5:bd:43:61:0d:86:4c:21:13:0a:85:58:57:cc:9c:ea:46
# SHA256 Fingerprint: 8c:4e:df:d0:43:48:f3:22:96:9e:7e:29:a4:cd:4d:ca:00:46:55:06:1c:16:e1:b0:76:42:2e:f3:42:ad:63:0e
-----BEGIN CERTIFICATE-----
MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJF
UzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJ
R1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcN
MDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3WjBoMQswCQYDVQQGEwJFUzEfMB0G
A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScw
JQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+
WmmmO3I2F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKj
SgbwJ/BXufjpTjJ3Cj9BZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGl
u6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQD0EbtFpKd71ng+CT516nDOeB0/RSrFOy
A8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXteJajCq+TA81yc477OMUxk
Hl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMBAAGjggM7
MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBr
aS5ndmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIIC
IwYKKwYBBAG/VQIBADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8A
cgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIA
YQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIAYQBsAGkAdABhAHQAIABWAGEA
bABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQByAGEAYwBpAPMA
bgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMA
aQBvAG4AYQBtAGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQA
ZQAgAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEA
YwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBuAHQAcgBhACAAZQBuACAAbABhACAA
ZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcA
LgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0dHA6
Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+y
eAT8MIGVBgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQsw
CQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0G
A1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVu
Y2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRhTvW1yEICKrNcda3Fbcrn
lD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdzCkj+IHLt
b8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg
9J63NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XF
ducTZnV+ZfsBn5OHiJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmC
IoaZM3Fa6hlXPZHNqcCjbgcTpsnt+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
-----END CERTIFICATE-----

# Issuer: CN=A-Trust-nQual-03 O=A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH OU=A-Trust-nQual-03
# Subject: CN=A-Trust-nQual-03 O=A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH OU=A-Trust-nQual-03
# Label: "A-Trust-nQual-03"
# Serial: 93214
# MD5 Fingerprint: 49:63:ae:27:f4:d5:95:3d:d8:db:24:86:b8:9c:07:53
# SHA1 Fingerprint: d3:c0:63:f2:19:ed:07:3e:34:ad:5d:75:0b:32:76:29:ff:d5:9a:f2
# SHA256 Fingerprint: 79:3c:bf:45:59:b9:fd:e3:8a:b2:2d:f1:68:69:f6:98:81:ae:14:c4:b0:13:9a:c7:88:a7:8a:1a:fc:ca:02:fb
-----BEGIN CERTIFICATE-----
MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJB
VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp
bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5R
dWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5RdWFsLTAzMB4XDTA1MDgxNzIyMDAw
MFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgwRgYDVQQKDD9BLVRy
dXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0ZW52
ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMM
EEEtVHJ1c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
AQCtPWFuA/OQO8BBC4SAzewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUj
lUC5B3ilJfYKvUWG6Nm9wASOhURh73+nyfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZ
znF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPESU7l0+m0iKsMrmKS1GWH
2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4iHQF63n1
k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs
2e3Vcuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYD
VR0OBAoECERqlWdVeRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC
AQEAVdRU0VlIXLOThaq/Yy/kgM40ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fG
KOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmrsQd7TZjTXLDR8KdCoLXEjq/+
8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZdJXDRZslo+S4R
FGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS
mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmE
DNuxUCAKGkq6ahq97BvIxYSazQ==
-----END CERTIFICATE-----

# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA
# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA
# Label: "TWCA Root Certification Authority"
# Serial: 1
# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79
# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48
# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44
-----BEGIN CERTIFICATE-----
MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES
MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU
V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz
WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO
LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm
aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE
AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH
K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX
RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z
rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx
3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq
hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC
MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls
XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D
lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn
aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ
YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
-----END CERTIFICATE-----

# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2
# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2
# Label: "Security Communication RootCA2"
# Serial: 0
# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43
# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74
# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6
-----BEGIN CERTIFICATE-----
MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl
MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe
U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX
DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy
dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj
YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV
OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr
zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM
VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ
hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO
ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw
awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs
OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF
coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc
okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8
t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy
1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/
SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
-----END CERTIFICATE-----

# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority
# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority
# Label: "Hellenic Academic and Research Institutions RootCA 2011"
# Serial: 0
# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9
# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d
# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71
-----BEGIN CERTIFICATE-----
MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix
RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1
dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p
YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw
NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK
EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl
cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz
dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ
fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns
bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD
75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP
FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV
HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp
5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu
b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA
A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p
6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7
dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys
Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI
l7WdmplNsDz4SgCbZN2fOUvRJ9e4
-----END CERTIFICATE-----

# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
# Label: "Actalis Authentication Root CA"
# Serial: 6271844772424770508
# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6
# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac
# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66
-----BEGIN CERTIFICATE-----
MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE
BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w
MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC
SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1
ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv
UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX
4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9
KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/
gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb
rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ
51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F
be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe
KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F
v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn
fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7
jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz
ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL
e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70
jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz
WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V
SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j
pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX
X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok
fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R
K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU
ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU
LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT
LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
-----END CERTIFICATE-----

# Issuer: O=Trustis Limited OU=Trustis FPS Root CA
# Subject: O=Trustis Limited OU=Trustis FPS Root CA
# Label: "Trustis FPS Root CA"
# Serial: 36053640375399034304724988975563710553
# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d
# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04
# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d
-----BEGIN CERTIFICATE-----
MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF
MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL
ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx
MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc
MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+
AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH
iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj
vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA
0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB
OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/
BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E
FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01
GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW
zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4
1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE
f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F
jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN
ZetX2fNXlrtIzYE=
-----END CERTIFICATE-----

# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
# Label: "StartCom Certification Authority"
# Serial: 45
# MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16
# SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0
# SHA256 Fingerprint: e1:78:90:ee:09:a3:fb:f4:f4:8b:9c:41:4a:17:d6:37:b7:a5:06:47:e9:bc:75:23:22:72:7f:cc:17:42:a9:11
-----BEGIN CERTIFICATE-----
MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW
MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9
MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul
F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC
ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w
ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk
aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0
YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg
c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0
aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93
d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG
CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1
dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF
wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS
Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst
0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc
pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl
CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF
P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK
1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm
KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ
8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm
fyWl8kgAwKQB2j8=
-----END CERTIFICATE-----

# Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd.
# Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd.
# Label: "StartCom Certification Authority G2"
# Serial: 59
# MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64
# SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17
# SHA256 Fingerprint: c7:ba:65:67:de:93:a7:98:ae:1f:aa:79:1e:71:2d:37:8f:ae:1f:93:c4:39:7f:ea:44:1b:b7:cb:e6:fd:59:95
-----BEGIN CERTIFICATE-----
MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW
MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm
aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1
OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG
A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G
CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ
JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD
vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo
D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/
Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW
RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK
HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN
nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM
0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i
UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9
Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg
TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL
BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K
2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX
UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl
6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK
9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ
HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI
wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY
XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l
IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo
hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr
so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI
-----END CERTIFICATE-----

# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327
# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327
# Label: "Buypass Class 2 Root CA"
# Serial: 2
# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29
# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99
# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48
-----BEGIN CERTIFICATE-----
MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow
TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr
6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV
L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91
1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx
MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ
QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB
arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr
Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi
FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS
P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN
9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP
AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz
uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h
9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t
OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo
+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7
KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2
DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us
H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ
I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7
5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h
3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz
Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA=
-----END CERTIFICATE-----

# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327
# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327
# Label: "Buypass Class 3 Root CA"
# Serial: 2
# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec
# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57
# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d
-----BEGIN CERTIFICATE-----
MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow
TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y
ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E
N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9
tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX
0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c
/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X
KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY
zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS
O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D
34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP
K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3
AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv
Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj
QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS
IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2
HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa
O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv
033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u
dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE
kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41
3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD
u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq
4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc=
-----END CERTIFICATE-----

# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
# Label: "T-TeleSec GlobalRoot Class 3"
# Serial: 1
# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef
# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1
# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd
-----BEGIN CERTIFICATE-----
MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1
OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN
8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/
RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4
hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5
ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM
EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj
QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1
A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy
WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ
1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30
6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT
91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p
TpPDpFQUWw==
-----END CERTIFICATE-----

# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus
# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus
# Label: "EE Certification Centre Root CA"
# Serial: 112324828676200291871926431888494945866
# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f
# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7
# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76
-----BEGIN CERTIFICATE-----
MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1
MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1
czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG
CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy
MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl
ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS
b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB
AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy
euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO
bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw
WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d
MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE
1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD
VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/
zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB
BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF
BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV
v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG
E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW
iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v
GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0=
-----END CERTIFICATE-----

# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Aralık 2007
# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Aralık 2007
# Label: "TURKTRUST Certificate Services Provider Root 2007"
# Serial: 1
# MD5 Fingerprint: 2b:70:20:56:86:82:a0:18:c8:07:53:12:28:70:21:72
# SHA1 Fingerprint: f1:7f:6f:b6:31:dc:99:e3:a3:c8:7f:fe:1c:f1:81:10:88:d9:60:33
# SHA256 Fingerprint: 97:8c:d9:66:f2:fa:a0:7b:a7:aa:95:00:d9:c0:2e:9d:77:f2:cd:ad:a6:ad:6b:a7:4a:f4:b9:1c:66:59:3c:50
-----BEGIN CERTIFICATE-----
MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc
UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx
c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS
S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg
SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx
OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry
b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC
VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE
sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F
ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY
KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG
+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG
HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P
IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M
733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk
Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G
CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW
AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5
mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa
XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ
qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9
-----END CERTIFICATE-----

# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH
# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH
# Label: "D-TRUST Root Class 3 CA 2 2009"
# Serial: 623603
# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f
# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0
# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1
-----BEGIN CERTIFICATE-----
MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF
MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD
bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha
ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM
HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03
UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42
tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R
ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM
lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp
/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G
A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G
A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj
dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy
MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl
cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js
L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL
BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni
acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K
zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8
PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y
Johw1+qRzT65ysCQblrGXnRl11z+o+I=
-----END CERTIFICATE-----

# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH
# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH
# Label: "D-TRUST Root Class 3 CA 2 EV 2009"
# Serial: 623604
# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6
# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83
# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81
-----BEGIN CERTIFICATE-----
MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF
MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD
bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw
NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV
BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn
ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0
3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z
qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR
p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8
HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw
ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea
HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw
Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh
c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E
RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt
dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku
Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp
3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF
CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na
xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX
KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1
-----END CERTIFICATE-----

# Issuer: CN=Autoridad de Certificacion Raiz del Estado Venezolano O=Sistema Nacional de Certificacion Electronica OU=Superintendencia de Servicios de Certificacion Electronica
# Subject: CN=PSCProcert O=Sistema Nacional de Certificacion Electronica OU=Proveedor de Certificados PROCERT
# Label: "PSCProcert"
# Serial: 11
# MD5 Fingerprint: e6:24:e9:12:01:ae:0c:de:8e:85:c4:ce:a3:12:dd:ec
# SHA1 Fingerprint: 70:c1:8d:74:b4:28:81:0a:e4:fd:a5:75:d7:01:9f:99:b0:3d:50:74
# SHA256 Fingerprint: 3c:fc:3c:14:d1:f6:84:ff:17:e3:8c:43:ca:44:0c:00:b9:67:ec:93:3e:8b:fe:06:4c:a1:d7:2c:90:f2:ad:b0
-----BEGIN CERTIFICATE-----
MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1
dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s
YW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz
dHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0
aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh
IGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ
KoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEw
MFoXDTIwMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHBy
b2NlcnQubmV0LnZlMQ8wDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGEx
KjAoBgNVBAsTIVByb3ZlZWRvciBkZSBDZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQG
A1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9u
aWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIwDQYJKoZI
hvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo9
7BVCwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74
BCXfgI8Qhd19L3uA3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38G
ieU89RLAu9MLmV+QfI4tL3czkkohRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9
JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmOEO8GqQKJ/+MMbpfg353bIdD0
PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG20qCZyFSTXai2
0b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH
0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/
6mnbVSKVUyqUtd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1m
v6JpIzi4mWCZDlZTOpx+FIywBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7
K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvpr2uKGcfLFFb14dq12fy/czja+eev
bqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/AgEBMDcGA1UdEgQw
MC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0w
MB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFD
gBStuyIdxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0
b3JpZGFkIGRlIENlcnRpZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xh
bm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0
cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRp
ZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEg
ZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkq
hkiG9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQD
AgEGME0GA1UdEQRGMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0w
MDAwMDKgGwYFYIZeAgKgEgwQUklGLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEag
RKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9sY3IvQ0VSVElGSUNBRE8t
UkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNyYWl6LnN1c2Nl
cnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v
Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsG
AQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcN
AQELBQADggIBACtZ6yKZu4SqT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS
1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmNg7+mvTV+LFwxNG9s2/NkAZiqlCxB
3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4quxtxj7mkoP3Yldmv
Wb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1n8Gh
HVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHm
pHmJWhSnFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXz
sOfIt+FTvZLm8wyWuevo5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bE
qCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq3TNWOByyrYDT13K9mmyZY+gAu0F2Bbdb
mRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5poLWccret9W6aAjtmcz9
opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3YeMLEYC/H
YvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km
-----END CERTIFICATE-----

# Issuer: CN=China Internet Network Information Center EV Certificates Root O=China Internet Network Information Center
# Subject: CN=China Internet Network Information Center EV Certificates Root O=China Internet Network Information Center
# Label: "China Internet Network Information Center EV Certificates Root"
# Serial: 1218379777
# MD5 Fingerprint: 55:5d:63:00:97:bd:6a:97:f5:67:ab:4b:fb:6e:63:15
# SHA1 Fingerprint: 4f:99:aa:93:fb:2b:d1:37:26:a1:99:4a:ce:7f:f0:05:f2:93:5d:1e
# SHA256 Fingerprint: 1c:01:c6:f4:db:b2:fe:fc:22:55:8b:2b:ca:32:56:3f:49:84:4a:cf:c3:2b:7b:e4:b0:ff:59:9f:9e:8c:7a:f7
-----BEGIN CERTIFICATE-----
MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC
Q04xMjAwBgNVBAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24g
Q2VudGVyMUcwRQYDVQQDDD5DaGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0
aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMgUm9vdDAeFw0xMDA4MzEwNzExMjVa
Fw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAGA1UECgwpQ2hpbmEg
SW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMMPkNo
aW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRp
ZmljYXRlcyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z
7r07eKpkQ0H1UN+U8i6yjUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//
DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV98YPjUesWgbdYavi7NifFy2cyjw1l1Vx
zUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2HklY0bBoQCxfVWhyXWIQ8
hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23KzhmBsUs
4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54u
gQEC7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oY
NJKiyoOCWTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E
FgQUfHJLOcfA22KlT5uqGDSSosqDglkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3
j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd50XPFtQO3WKwMVC/GVhMPMdoG
52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM7+czV0I664zB
echNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws
ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrI
zo9uoV1/A3U05K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATy
wy39FCqQmbkHzJ8=
-----END CERTIFICATE-----

# Issuer: CN=Swisscom Root CA 2 O=Swisscom OU=Digital Certificate Services
# Subject: CN=Swisscom Root CA 2 O=Swisscom OU=Digital Certificate Services
# Label: "Swisscom Root CA 2"
# Serial: 40698052477090394928831521023204026294
# MD5 Fingerprint: 5b:04:69:ec:a5:83:94:63:18:a7:86:d0:e4:f2:6e:19
# SHA1 Fingerprint: 77:47:4f:c6:30:e4:0f:4c:47:64:3f:84:ba:b8:c6:95:4a:8a:41:ec
# SHA256 Fingerprint: f0:9b:12:2c:71:14:f4:a0:9b:d4:ea:4f:4a:99:d5:58:b4:6e:4c:25:cd:81:14:0d:29:c0:56:13:91:4c:38:41
-----BEGIN CERTIFICATE-----
MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBk
MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0
YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg
Q0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2MjUwNzM4MTRaMGQxCzAJBgNVBAYT
AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp
Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIICIjAN
BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvEr
jw0DzpPMLgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r
0rk0X2s682Q2zsKwzxNoysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f
2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJwDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVP
ACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpHWrumnf2U5NGKpV+GY3aF
y6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1aSgJA/MTA
tukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL
6yxSNLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0
uPoTXGiTOmekl9AbmbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrAL
acywlKinh/LTSlDcX3KwFnUey7QYYpqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velh
k6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3qPyZ7iVNTA6z00yPhOgpD/0Q
VAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw
FDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O
BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqh
b97iEoHF8TwuMA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4R
fbgZPnm3qKhyN2abGu2sEzsOv2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv
/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ82YqZh6NM4OKb3xuqFp1mrjX2lhI
REeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLzo9v/tdhZsnPdTSpx
srpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcsa0vv
aGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciAT
woCqISxxOQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99n
Bjx8Oto0QuFmtEYE3saWmA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5W
t6NlUe07qxS/TFED6F+KBZvuim6c779o+sjaC+NCydAXFJy3SuCvkychVSa1ZC+N
8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TCrvJcwhbtkj6EPnNgiLx2
9CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX5OfNeOI5
wSsSnqaeG8XmDtkx2Q==
-----END CERTIFICATE-----

# Issuer: CN=Swisscom Root EV CA 2 O=Swisscom OU=Digital Certificate Services
# Subject: CN=Swisscom Root EV CA 2 O=Swisscom OU=Digital Certificate Services
# Label: "Swisscom Root EV CA 2"
# Serial: 322973295377129385374608406479535262296
# MD5 Fingerprint: 7b:30:34:9f:dd:0a:4b:6b:35:ca:31:51:28:5d:ae:ec
# SHA1 Fingerprint: e7:a1:90:29:d3:d5:52:dc:0d:0f:c6:92:d3:ea:88:0d:15:2e:1a:6b
# SHA256 Fingerprint: d9:5f:ea:3c:a4:ee:dc:e7:4c:d7:6e:75:fc:6d:1f:f6:2c:44:1f:0f:a8:bc:77:f0:34:b1:9e:5d:b2:58:01:5d
-----BEGIN CERTIFICATE-----
MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAw
ZzELMAkGA1UEBhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdp
dGFsIENlcnRpZmljYXRlIFNlcnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290
IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcNMzEwNjI1MDg0NTA4WjBnMQswCQYD
VQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2Vy
dGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYgQ0Eg
MjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7Bx
UglgRCgzo3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD
1ycfMQ4jFrclyxy0uYAyXhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPH
oCE2G3pXKSinLr9xJZDzRINpUKTk4RtiGZQJo/PDvO/0vezbE53PnUgJUmfANykR
HvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8LiqG12W0OfvrSdsyaGOx9/
5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaHZa0zKcQv
idm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHL
OdAGalNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaC
NYGu+HuB5ur+rPQam3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f
46Fq9mDU5zXNysRojddxyNMkM3OxbPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCB
UWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDixzgHcgplwLa7JSnaFp6LNYth
7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/BAQDAgGGMB0G
A1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED
MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWB
bj2ITY1x0kbBbkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6x
XCX5145v9Ydkn+0UjrgEjihLj6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98T
PLr+flaYC/NUn81ETm484T4VvwYmneTwkLbUwp4wLh/vx3rEUMfqe9pQy3omywC0
Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7XwgiG/W9mR4U9s70
WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH59yL
Gn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm
7JFe3VE/23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4S
nr8PyQUQ3nqjsTzyP6WqJ3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VN
vBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyAHmBR3NdUIR7KYndP+tiPsys6DXhyyWhB
WkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/giuMod89a2GQ+fYWVq6nTI
fI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuWl8PVP3wb
I+2ksx0WckNLIOFZfsLorSa/ovc=
-----END CERTIFICATE-----

# Issuer: CN=CA Disig Root R1 O=Disig a.s.
# Subject: CN=CA Disig Root R1 O=Disig a.s.
# Label: "CA Disig Root R1"
# Serial: 14052245610670616104
# MD5 Fingerprint: be:ec:11:93:9a:f5:69:21:bc:d7:c1:c0:67:89:cc:2a
# SHA1 Fingerprint: 8e:1c:74:f8:a6:20:b9:e5:8a:f4:61:fa:ec:2b:47:56:51:1a:52:c6
# SHA256 Fingerprint: f9:6f:23:f4:c3:e7:9c:07:7a:46:98:8d:5a:f5:90:06:76:a0:f0:39:cb:64:5d:d1:75:49:b2:16:c8:24:40:ce
-----BEGIN CERTIFICATE-----
MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV
BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu
MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy
MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx
EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw
ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk
D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o
OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A
fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe
IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n
oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK
/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj
rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD
3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE
7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC
yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd
qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI
hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR
xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA
SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo
HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB
emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC
AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb
7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x
DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk
F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF
a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT
Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL
-----END CERTIFICATE-----

# Issuer: CN=CA Disig Root R2 O=Disig a.s.
# Subject: CN=CA Disig Root R2 O=Disig a.s.
# Label: "CA Disig Root R2"
# Serial: 10572350602393338211
# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03
# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71
# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03
-----BEGIN CERTIFICATE-----
MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV
BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu
MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy
MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx
EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw
ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe
NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH
PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I
x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe
QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR
yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO
QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912
H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ
QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD
i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs
nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1
rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI
hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf
GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb
lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka
+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal
TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i
nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3
gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr
G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os
zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x
L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL
-----END CERTIFICATE-----

# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV
# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV
# Label: "ACCVRAIZ1"
# Serial: 6828503384748696800
# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02
# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17
# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13
-----BEGIN CERTIFICATE-----
MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE
AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw
CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ
BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND
VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb
qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY
HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo
G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA
lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr
IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/
0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH
k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47
4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO
m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa
cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl
uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI
KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls
ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG
AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT
VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG
CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA
cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA
QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA
7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA
cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA
QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA
czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu
aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt
aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud
DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF
BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp
D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU
JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m
AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD
vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms
tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH
7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA
h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF
d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H
pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7
-----END CERTIFICATE-----

# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA
# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA
# Label: "TWCA Global Root CA"
# Serial: 3262
# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96
# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65
# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b
-----BEGIN CERTIFICATE-----
MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx
EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT
VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5
NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT
B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG
SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF
10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz
0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh
MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH
zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc
46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2
yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi
laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP
oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA
BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE
qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm
4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL
1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF
H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo
RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+
nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh
15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW
6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW
nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j
wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz
aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy
KwbQBM0=
-----END CERTIFICATE-----
site-packages/pip/_vendor/requests/packages/__pycache__/__init__.cpython-33.pyc000064400000000450151733463660023550 0ustar00�
7�Re>c@s$ddlmZddlmZdS(i(uabsolute_importi(uurllib3N(u
__future__uabsolute_importuuurllib3(((u?/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/__init__.pyu<module>ssite-packages/pip/_vendor/requests/packages/urllib3/connection.py000064400000014605151733463660021252 0ustar00# urllib3/connection.py
# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
#
# This module is part of urllib3 and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php

import sys
import socket
from socket import timeout as SocketTimeout

try: # Python 3
    from http.client import HTTPConnection as _HTTPConnection, HTTPException
except ImportError:
    from httplib import HTTPConnection as _HTTPConnection, HTTPException

class DummyConnection(object):
    "Used to detect a failed ConnectionCls import."
    pass

try: # Compiled with SSL?
    ssl = None
    HTTPSConnection = DummyConnection

    class BaseSSLError(BaseException):
        pass

    try: # Python 3
        from http.client import HTTPSConnection as _HTTPSConnection
    except ImportError:
        from httplib import HTTPSConnection as _HTTPSConnection

    import ssl
    BaseSSLError = ssl.SSLError

except (ImportError, AttributeError): # Platform-specific: No SSL.
    pass

from .exceptions import (
    ConnectTimeoutError,
)
from .packages.ssl_match_hostname import match_hostname
from .packages import six
from .util import (
    assert_fingerprint,
    resolve_cert_reqs,
    resolve_ssl_version,
    ssl_wrap_socket,
)


port_by_scheme = {
    'http': 80,
    'https': 443,
}


class HTTPConnection(_HTTPConnection, object):
    """
    Based on httplib.HTTPConnection but provides an extra constructor
    backwards-compatibility layer between older and newer Pythons.
    """

    default_port = port_by_scheme['http']

    # By default, disable Nagle's Algorithm.
    tcp_nodelay = 1

    def __init__(self, *args, **kw):
        if six.PY3:  # Python 3
            kw.pop('strict', None)
        if sys.version_info < (2, 7):  # Python 2.6 and older
            kw.pop('source_address', None)

        # Pre-set source_address in case we have an older Python like 2.6.
        self.source_address = kw.get('source_address')

        # Superclass also sets self.source_address in Python 2.7+.
        _HTTPConnection.__init__(self, *args, **kw)  

    def _new_conn(self):
        """ Establish a socket connection and set nodelay settings on it.

        :return: a new socket connection
        """
        extra_args = []
        if self.source_address:  # Python 2.7+
            extra_args.append(self.source_address)

        conn = socket.create_connection(
            (self.host, self.port), self.timeout, *extra_args)
        conn.setsockopt(
            socket.IPPROTO_TCP, socket.TCP_NODELAY, self.tcp_nodelay)

        return conn

    def _prepare_conn(self, conn):
        self.sock = conn
        # the _tunnel_host attribute was added in python 2.6.3 (via
        # http://hg.python.org/cpython/rev/0f57b30a152f) so pythons 2.6(0-2) do
        # not have them.
        if getattr(self, '_tunnel_host', None):
            # TODO: Fix tunnel so it doesn't depend on self.sock state.
            self._tunnel()

    def connect(self):
        conn = self._new_conn()
        self._prepare_conn(conn)


class HTTPSConnection(HTTPConnection):
    default_port = port_by_scheme['https']

    def __init__(self, host, port=None, key_file=None, cert_file=None,
                 strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, **kw):

        HTTPConnection.__init__(self, host, port, strict=strict,
                                timeout=timeout, **kw)

        self.key_file = key_file
        self.cert_file = cert_file

        # Required property for Google AppEngine 1.9.0 which otherwise causes
        # HTTPS requests to go out as HTTP. (See Issue #356)
        self._protocol = 'https'

    def connect(self):
        conn = self._new_conn()
        self._prepare_conn(conn)
        self.sock = ssl.wrap_socket(conn, self.key_file, self.cert_file)


class VerifiedHTTPSConnection(HTTPSConnection):
    """
    Based on httplib.HTTPSConnection but wraps the socket with
    SSL certification.
    """
    cert_reqs = None
    ca_certs = None
    ssl_version = None
    conn_kw = {}

    def set_cert(self, key_file=None, cert_file=None,
                 cert_reqs=None, ca_certs=None,
                 assert_hostname=None, assert_fingerprint=None):

        self.key_file = key_file
        self.cert_file = cert_file
        self.cert_reqs = cert_reqs
        self.ca_certs = ca_certs
        self.assert_hostname = assert_hostname
        self.assert_fingerprint = assert_fingerprint

    def connect(self):
        # Add certificate verification

        try:
            sock = socket.create_connection(
                address=(self.host, self.port), timeout=self.timeout,
                **self.conn_kw)
        except SocketTimeout:
            raise ConnectTimeoutError(
                self, "Connection to %s timed out. (connect timeout=%s)" %
                (self.host, self.timeout))

        sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY,
                        self.tcp_nodelay)

        resolved_cert_reqs = resolve_cert_reqs(self.cert_reqs)
        resolved_ssl_version = resolve_ssl_version(self.ssl_version)

        hostname = self.host
        if getattr(self, '_tunnel_host', None):
            # _tunnel_host was added in Python 2.6.3
            # (See: http://hg.python.org/cpython/rev/0f57b30a152f)

            self.sock = sock
            # Calls self._set_hostport(), so self.host is
            # self._tunnel_host below.
            self._tunnel()

            # Override the host with the one we're requesting data from.
            hostname = self._tunnel_host

        # Wrap socket using verification with the root certs in
        # trusted_root_certs
        self.sock = ssl_wrap_socket(sock, self.key_file, self.cert_file,
                                    cert_reqs=resolved_cert_reqs,
                                    ca_certs=self.ca_certs,
                                    server_hostname=hostname,
                                    ssl_version=resolved_ssl_version)

        if resolved_cert_reqs != ssl.CERT_NONE:
            if self.assert_fingerprint:
                assert_fingerprint(self.sock.getpeercert(binary_form=True),
                                   self.assert_fingerprint)
            elif self.assert_hostname is not False:
                match_hostname(self.sock.getpeercert(),
                               self.assert_hostname or hostname)


if ssl:
    # Make a copy for testing.
    UnverifiedHTTPSConnection = HTTPSConnection
    HTTPSConnection = VerifiedHTTPSConnection
site-packages/pip/_vendor/requests/packages/urllib3/_collections.py000064400000014635151733463660021573 0ustar00# urllib3/_collections.py
# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
#
# This module is part of urllib3 and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php

from collections import Mapping, MutableMapping
try:
    from threading import RLock
except ImportError: # Platform-specific: No threads available
    class RLock:
        def __enter__(self):
            pass

        def __exit__(self, exc_type, exc_value, traceback):
            pass


try: # Python 2.7+
    from collections import OrderedDict
except ImportError:
    from .packages.ordered_dict import OrderedDict
from .packages.six import itervalues


__all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict']


_Null = object()


class RecentlyUsedContainer(MutableMapping):
    """
    Provides a thread-safe dict-like container which maintains up to
    ``maxsize`` keys while throwing away the least-recently-used keys beyond
    ``maxsize``.

    :param maxsize:
        Maximum number of recent elements to retain.

    :param dispose_func:
        Every time an item is evicted from the container,
        ``dispose_func(value)`` is called.  Callback which will get called
    """

    ContainerCls = OrderedDict

    def __init__(self, maxsize=10, dispose_func=None):
        self._maxsize = maxsize
        self.dispose_func = dispose_func

        self._container = self.ContainerCls()
        self.lock = RLock()

    def __getitem__(self, key):
        # Re-insert the item, moving it to the end of the eviction line.
        with self.lock:
            item = self._container.pop(key)
            self._container[key] = item
            return item

    def __setitem__(self, key, value):
        evicted_value = _Null
        with self.lock:
            # Possibly evict the existing value of 'key'
            evicted_value = self._container.get(key, _Null)
            self._container[key] = value

            # If we didn't evict an existing value, we might have to evict the
            # least recently used item from the beginning of the container.
            if len(self._container) > self._maxsize:
                _key, evicted_value = self._container.popitem(last=False)

        if self.dispose_func and evicted_value is not _Null:
            self.dispose_func(evicted_value)

    def __delitem__(self, key):
        with self.lock:
            value = self._container.pop(key)

        if self.dispose_func:
            self.dispose_func(value)

    def __len__(self):
        with self.lock:
            return len(self._container)

    def __iter__(self):
        raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.')

    def clear(self):
        with self.lock:
            # Copy pointers to all values, then wipe the mapping
            # under Python 2, this copies the list of values twice :-|
            values = list(self._container.values())
            self._container.clear()

        if self.dispose_func:
            for value in values:
                self.dispose_func(value)

    def keys(self):
        with self.lock:
            return self._container.keys()


class HTTPHeaderDict(MutableMapping):
    """
    :param headers:
        An iterable of field-value pairs. Must not contain multiple field names
        when compared case-insensitively.

    :param kwargs:
        Additional field-value pairs to pass in to ``dict.update``.

    A ``dict`` like container for storing HTTP Headers.

    Field names are stored and compared case-insensitively in compliance with
    RFC 2616. Iteration provides the first case-sensitive key seen for each
    case-insensitive pair.

    Using ``__setitem__`` syntax overwrites fields that compare equal
    case-insensitively in order to maintain ``dict``'s api. For fields that
    compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add``
    in a loop.

    If multiple fields that are equal case-insensitively are passed to the
    constructor or ``.update``, the behavior is undefined and some will be
    lost.

    >>> headers = HTTPHeaderDict()
    >>> headers.add('Set-Cookie', 'foo=bar')
    >>> headers.add('set-cookie', 'baz=quxx')
    >>> headers['content-length'] = '7'
    >>> headers['SET-cookie']
    'foo=bar, baz=quxx'
    >>> headers['Content-Length']
    '7'

    If you want to access the raw headers with their original casing
    for debugging purposes you can access the private ``._data`` attribute
    which is a normal python ``dict`` that maps the case-insensitive key to a
    list of tuples stored as (case-sensitive-original-name, value). Using the
    structure from above as our example:

    >>> headers._data
    {'set-cookie': [('Set-Cookie', 'foo=bar'), ('set-cookie', 'baz=quxx')],
    'content-length': [('content-length', '7')]}
    """

    def __init__(self, headers=None, **kwargs):
        self._data = {}
        if headers is None:
            headers = {}
        self.update(headers, **kwargs)

    def add(self, key, value):
        """Adds a (name, value) pair, doesn't overwrite the value if it already
        exists.

        >>> headers = HTTPHeaderDict(foo='bar')
        >>> headers.add('Foo', 'baz')
        >>> headers['foo']
        'bar, baz'
        """
        self._data.setdefault(key.lower(), []).append((key, value))

    def getlist(self, key):
        """Returns a list of all the values for the named field. Returns an
        empty list if the key doesn't exist."""
        return self[key].split(', ') if key in self else []

    def copy(self):
        h = HTTPHeaderDict()
        for key in self._data:
            for rawkey, value in self._data[key]:
                h.add(rawkey, value)
        return h

    def __eq__(self, other):
        if not isinstance(other, Mapping):
            return False
        other = HTTPHeaderDict(other)
        return dict((k1, self[k1]) for k1 in self._data) == \
                dict((k2, other[k2]) for k2 in other._data)

    def __getitem__(self, key):
        values = self._data[key.lower()]
        return ', '.join(value[1] for value in values)

    def __setitem__(self, key, value):
        self._data[key.lower()] = [(key, value)]

    def __delitem__(self, key):
        del self._data[key.lower()]

    def __len__(self):
        return len(self._data)

    def __iter__(self):
        for headers in itervalues(self._data):
            yield headers[0][0]

    def __repr__(self):
        return '%s(%r)' % (self.__class__.__name__, dict(self.items()))
site-packages/pip/_vendor/requests/packages/urllib3/contrib/__pycache__/pyopenssl.cpython-33.pyc000064400000033174151733463660027072 0ustar00�
7�Re�:c@s�dZddlmZddlmZddlZddlm	Z
ddlmZm
Z
ddlmZmZddlZddlZddlmZd	d
lmZd	dlmZdd
gZeZiejjej6ejjej6ejjej 6Z!iejj"ej#6ejj$ej%6ejj$ejj&ej'6Z(dddZ)ejZ*ej+Z,dd�Z-dd
�Z.Gdd�de�Zdd�Z/Gdd�de�Z0Gdd�de1�Z2dd�Z3dddddddd�Z+dS(u�SSL with SNI_-support for Python 2. Follow these instructions if you would
like to verify SSL certificates in Python 2. Note, the default libraries do
*not* do certificate checking; you need to do additional work to validate
certificates yourself.

This needs the following packages installed:

* pyOpenSSL (tested with 0.13)
* ndg-httpsclient (tested with 0.3.2)
* pyasn1 (tested with 0.1.6)

You can install them with the following command:

    pip install pyopenssl ndg-httpsclient pyasn1

To activate certificate checking, call
:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code
before you begin making HTTP requests. This can be done in a ``sitecustomize``
module, or at any other time before your application begins using ``urllib3``,
like this::

    try:
        import urllib3.contrib.pyopenssl
        urllib3.contrib.pyopenssl.inject_into_urllib3()
    except ImportError:
        pass

Now you can use :mod:`urllib3` as you normally would, and it will support SNI
when the required modules are installed.

Activating this module also has the positive side effect of disabling SSL/TLS
encryption in Python 2 (see `CRIME attack`_).

If you want to configure the default list of supported cipher suites, you can
set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable.

Module Variables
----------------

:var DEFAULT_SSL_CIPHER_LIST: The list of supported SSL/TLS cipher suites.
    Default: ``ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:
    ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS``

.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication
.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit)

i(uSUBJ_ALT_NAME_SUPPORT(uSubjectAltNameN(udecoder(uunivu
constraint(u_fileobjectutimeout(uStringIOi(u
connection(uutiluinject_into_urllib3uextract_from_urllib3u,ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:uAECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:u!aNULL:!MD5:!DSScCstt_tt_dS(u7Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.N(ussl_wrap_socketu
connectionuHAS_SNIuutil(((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.pyuinject_into_urllib3fs	cCstt_tt_dS(u4Undo monkey-patching by :func:`inject_into_urllib3`.N(uorig_connection_ssl_wrap_socketu
connectionussl_wrap_socketuorig_util_HAS_SNIuutiluHAS_SNI(((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.pyuextract_from_urllib3ms	cBs6|EeZdZdZejjejdd�ZdS(uSubjectAltNameu0ASN.1 implementation for subjectAltNames supportiiN(	u__name__u
__module__u__qualname__u__doc__uunivu
SequenceOfusizeSpecu
constraintuValueSizeConstraint(u
__locals__((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.pyuSubjectAltNameus	uSubjectAltNamecCsg}ts|St�}x�t|j��D]�}|j|�}|j�}|dkr_q,n|j�}tj|d|�}x�|D]x}t	|t�s�q�nxZtt
|��D]F}	|j|	�}
|
j�dkr�q�n|j
t|
j���q�Wq�Wq,W|S(NusubjectAltNameuasn1SpecudNSName(uSUBJ_ALT_NAME_SUPPORTuSubjectAltNameurangeuget_extension_countu
get_extensionuget_short_nameuget_datauder_decoderudecodeu
isinstanceulenugetComponentByPositionugetNameuappendustrugetComponent(u	peer_certudns_nameu
general_namesuiuextuext_nameuext_datudecoded_datunameuentryu	component((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.pyuget_subj_alt_name�s*		
%uget_subj_alt_namecBs>|EeZdZdd�Zd	dd�Zd
dd�ZdS(u
fileobjectcCsFtj|jggg|jj��\}}}|sBt��ndS(N(uselectu_socku
gettimeoututimeout(uselfurduwdued((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.pyu_wait_for_sock�sufileobject._wait_for_sockic	
Cs�t|j|j�}|j}|jdd�|dkr�t�|_xXy|jj|�}Wn%tj	j
k
r�|j�wIYnX|s�Pn|j|�qI|j
�S|j�}||kr|jd�|j|�}t�|_|jj|j��|St�|_x�||}y|jj|�}Wn%tj	j
k
r[|j�wYnX|sfPnt|�}||kr�|r�|S||kr�|j|�~Pn||ks�td||f��|j|�||7}~q|j
�SdS(Niiurecv(%d) returned %d bytes(umaxu	_rbufsizeudefault_bufsizeu_rbufuseekuStringIOu_sockurecvuOpenSSLuSSLu
WantReadErroru_wait_for_sockuwriteugetvalueutellureadulenuAssertionError(	uselfusizeurbufsizeubufudataubuf_lenurvuleftun((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.pyuread�sX	





"

ufileobject.readcCs|j}|jdd�|j�dkr�|jd�|j|�}|jd�sht|�|kr�t�|_|jj|j��|S~n|dkr@|j	dkr_|jd�|j�g}t�|_d}|jj}xfy:x3|dkr$|d�}|sPn|j
|�q�WWn%tjjk
rM|j�w�YnXPq�dj|�S|jdd�t�|_x�y|jj|j	�}Wn%tjjk
r�|j�w~YnX|s�Pn|jd�}|dkr&|d7}|j|d|��|jj||d��~Pn|j|�q~|j�S|jdd�|j�}||kr�|jd�|j|�}	t�|_|jj|j��|	St�|_xJy|jj|j	�}Wn%tjjk
r�|j�w�YnX|sPn||}
|jdd|
�}|dkr�|d7}|jj||d��|rt|j|d|��Pq�|d|�Snt|�}||kr�|r�|S||
kr�|j|d|
��|jj||
d��Pn|j|�||7}q�|j�SdS(Niiu
iu(u_rbufuseekutellureadlineuendswithulenuStringIOuwriteureadu	_rbufsizeuNoneu_sockurecvuappenduOpenSSLuSSLu
WantReadErroru_wait_for_sockujoinufindugetvalue(uselfusizeubufublineubuffersudataurecvunlubuf_lenurvuleftun((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.pyureadline�s�	
!











ufileobject.readlineNi����i����(u__name__u
__module__u__qualname__u_wait_for_sockureadureadline(u
__locals__((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.pyu
fileobject�sDu
fileobjectcBst|EeZdZdZdd�Zdd�Zddd�Zd	d
�Zdd�Zd
d�Z	ddd�ZdS(u
WrappedSocketu@API-compatibility wrapper for Python OpenSSL's Connection-class.cCs||_||_dS(N(u
connectionusocket(uselfu
connectionusocket((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.pyu__init__Ss	uWrappedSocket.__init__cCs
|jj�S(N(usocketufileno(uself((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.pyufilenoWsuWrappedSocket.filenoicCst|j||�S(N(u
fileobjectu
connection(uselfumodeubufsize((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.pyumakefileZsuWrappedSocket.makefilecCs|jj|�S(N(usocketu
settimeout(uselfutimeout((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.pyu
settimeout]suWrappedSocket.settimeoutcCs|jj|�S(N(u
connectionusendall(uselfudata((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.pyusendall`suWrappedSocket.sendallcCs
|jj�S(N(u
connectionushutdown(uself((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.pyuclosecsuWrappedSocket.closecCsr|jj�}|s|S|r8tjjtjj|�Sid|j�jfffd6dd�t|�D�d6S(Nu
commonNameusubjectcSsg|]}d|f�qS(uDNS((u.0uvalue((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.pyu
<listcomp>vs	u-WrappedSocket.getpeercert.<locals>.<listcomp>usubjectAltName(	u
connectionuget_peer_certificateuOpenSSLucryptoudump_certificateu
FILETYPE_ASN1uget_subjectuCNuget_subj_alt_name(uselfubinary_formux509((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.pyugetpeercertfs			uWrappedSocket.getpeercertNi����F(u__name__u
__module__u__qualname__u__doc__u__init__ufilenoumakefileu
settimeoutusendallucloseuFalseugetpeercert(u
__locals__((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.pyu
WrappedSocketPsu
WrappedSocketcCs
|dkS(Ni((ucnxux509uerr_nou	err_depthureturn_code((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.pyu_verify_callback|su_verify_callbackcCs�tjjt|�}|r,|j|�n|rB|j|�n|tjkrh|jt	|t
�n|r�y|j|d�Wq�tjj
k
r�}ztjd||��WYdd}~Xq�Xn
|j�d}	|j|	�|jt�tjj||�}
|
j|�|
j�x�y|
j�Wnmtjjk
rctj|ggg�w"Yn=tjj
k
r�}ztjd|��WYdd}~XnXPq"t|
|�S(Nubad ca_certs: %riu
bad handshake(uOpenSSLuSSLuContextu_openssl_versionsuuse_certificate_fileuuse_privatekey_fileusslu	CERT_NONEu
set_verifyu_openssl_verifyu_verify_callbackuload_verify_locationsuNoneuErroruSSLErroruset_default_verify_pathsuset_optionsuset_cipher_listuDEFAULT_SSL_CIPHER_LISTu
Connectionuset_tlsext_host_nameuset_connect_stateudo_handshakeu
WantReadErroruselectu
WrappedSocket(usockukeyfileucertfileu	cert_reqsuca_certsuserver_hostnameussl_versionuctxueuOP_NO_COMPRESSIONucnx((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.pyussl_wrap_socket�s:,




%ussl_wrap_socket(5u__doc__u%ndg.httpsclient.ssl_peer_verificationuSUBJ_ALT_NAME_SUPPORTundg.httpsclient.subj_alt_nameuSubjectAltNameuBaseSubjectAltNameuOpenSSL.SSLuOpenSSLupyasn1.codec.derudecoderuder_decoderupyasn1.typeuunivu
constraintusocketu_fileobjectutimeoutussluselectu	cStringIOuStringIOuu
connectionuutilu__all__uHAS_SNIuSSLu
SSLv23_METHODuPROTOCOL_SSLv23uSSLv3_METHODuPROTOCOL_SSLv3uTLSv1_METHODuPROTOCOL_TLSv1u_openssl_versionsuVERIFY_NONEu	CERT_NONEuVERIFY_PEERu
CERT_OPTIONALuVERIFY_FAIL_IF_NO_PEER_CERTu
CERT_REQUIREDu_openssl_verifyuDEFAULT_SSL_CIPHER_LISTuorig_util_HAS_SNIussl_wrap_socketuorig_connection_ssl_wrap_socketuinject_into_urllib3uextract_from_urllib3uget_subj_alt_nameu
fileobjectuobjectu
WrappedSocketu_verify_callbackuNone(((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.pyu<module>/sH			�,	site-packages/pip/_vendor/requests/packages/urllib3/contrib/__pycache__/__init__.cpython-33.pyc000064400000000256151733463660026570 0ustar00�
7�Rec@sdS(N((((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/__init__.pyu<module>ssite-packages/pip/_vendor/requests/packages/urllib3/contrib/__pycache__/ntlmpool.cpython-33.pyc000064400000010701151733463660026671 0ustar00�
7�Re�c@s�dZyddlmZWn"ek
r>ddlmZYnXddlmZddlmZddlm	Z	ee
�ZGdd�de	�ZdS(	u
NTLM authenticating pool, contributed by erikcederstran

Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10
i(uHTTPSConnection(u	getLogger(untlm(uHTTPSConnectionPoolcs_|EeZdZdZdZ�fdd�Zdd�Zd
d
ddd�fdd	�Z	�S(uNTLMConnectionPooluQ
    Implements an NTLM authentication version of an urllib3 connection pool
    uhttpscsjtt|�j||�||_||_|jdd�}|dj�|_|d|_||_	dS(u�
        authurl is a random URL on the server that is protected by NTLM.
        user is the Windows user, probably in the DOMAIN\username format.
        pw is the password for the user.
        u\iiN(
usuperuNTLMConnectionPoolu__init__uauthurlurawuserusplituupperudomainuuserupw(uselfuuserupwuauthurluargsukwargsu
user_parts(u	__class__(uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/ntlmpool.pyu__init__!s		
uNTLMConnectionPool.__init__c
Cs�|jd7_tjd|j|j|jf�i}d|d<d}d}td|jd|j�}d	tj|j	�||<tjd
|�|j
d|jd|�|j�}t
|j��}tjd|j|jf�tjd
|�tjd|jd��d|_||jd�}d}x7|D]/}	|	dd�dkr<|	dd�}q<q<W|dkr�td|||f��ntj|�\}
}tj|
|j|j|j|�}d	|||<tjd
|�|j
d|jd|�|j�}tjd|j|jf�tjd
t
|j���tjd|j�dd��|jdkr�|jdkr�td��ntd|j|jf��nd|_tjd�|S(Niu3Starting NTLM HTTPS connection no. %d: https://%s%su
Keep-Aliveu
Connectionu
Authorizationuwww-authenticateuhostuportuNTLM %suRequest headers: %suGETuResponse status: %s %suResponse headers: %suResponse data: %s [...]idu, iuNTLM u!Unexpected %s response header: %si�i�u3Server rejected request: wrong username or passworduWrong server response: %s %suConnection established(unum_connectionsulogudebuguhostuauthurluHTTPSConnectionuportuntlmucreate_NTLM_NEGOTIATE_MESSAGEurawuserurequestuNoneugetresponseudictu
getheadersustatusureasonureadufpusplitu	Exceptionuparse_NTLM_CHALLENGE_MESSAGEu create_NTLM_AUTHENTICATE_MESSAGEuuserudomainupw(
uselfuheadersu
req_headeruresp_headeruconnuresureshdruauth_header_valuesuauth_header_valueusuServerChallengeuNegotiateFlagsuauth_msg((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/ntlmpool.pyu	_new_conn/s\	
	
		!	
uNTLMConnectionPool._new_connicsG|dkri}nd|d<tt|�j|||||||�S(Nu
Keep-Aliveu
Connection(uNoneusuperuNTLMConnectionPooluurlopen(uselfumethoduurlubodyuheadersuretriesuredirectuassert_same_host(u	__class__(uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/ntlmpool.pyuurlopenps	
uNTLMConnectionPool.urlopenNT(
u__name__u
__module__u__qualname__u__doc__uschemeu__init__u	_new_connuNoneuTrueuurlopen(u
__locals__((u	__class__uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/ntlmpool.pyuNTLMConnectionPoolsA	uNTLMConnectionPoolN(
u__doc__uhttp.clientuHTTPSConnectionuImportErroruhttplibuloggingu	getLoggeruntlmuurllib3uHTTPSConnectionPoolu__name__uloguNTLMConnectionPool(((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/contrib/ntlmpool.pyu<module>s
site-packages/pip/_vendor/requests/packages/urllib3/contrib/ntlmpool.py000064400000011205151733463660022410 0ustar00# urllib3/contrib/ntlmpool.py
# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
#
# This module is part of urllib3 and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php

"""
NTLM authenticating pool, contributed by erikcederstran

Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10
"""

try:
    from http.client import HTTPSConnection
except ImportError:
    from httplib import HTTPSConnection
from logging import getLogger
from ntlm import ntlm

from urllib3 import HTTPSConnectionPool


log = getLogger(__name__)


class NTLMConnectionPool(HTTPSConnectionPool):
    """
    Implements an NTLM authentication version of an urllib3 connection pool
    """

    scheme = 'https'

    def __init__(self, user, pw, authurl, *args, **kwargs):
        """
        authurl is a random URL on the server that is protected by NTLM.
        user is the Windows user, probably in the DOMAIN\\username format.
        pw is the password for the user.
        """
        super(NTLMConnectionPool, self).__init__(*args, **kwargs)
        self.authurl = authurl
        self.rawuser = user
        user_parts = user.split('\\', 1)
        self.domain = user_parts[0].upper()
        self.user = user_parts[1]
        self.pw = pw

    def _new_conn(self):
        # Performs the NTLM handshake that secures the connection. The socket
        # must be kept open while requests are performed.
        self.num_connections += 1
        log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s' %
                  (self.num_connections, self.host, self.authurl))

        headers = {}
        headers['Connection'] = 'Keep-Alive'
        req_header = 'Authorization'
        resp_header = 'www-authenticate'

        conn = HTTPSConnection(host=self.host, port=self.port)

        # Send negotiation message
        headers[req_header] = (
            'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser))
        log.debug('Request headers: %s' % headers)
        conn.request('GET', self.authurl, None, headers)
        res = conn.getresponse()
        reshdr = dict(res.getheaders())
        log.debug('Response status: %s %s' % (res.status, res.reason))
        log.debug('Response headers: %s' % reshdr)
        log.debug('Response data: %s [...]' % res.read(100))

        # Remove the reference to the socket, so that it can not be closed by
        # the response object (we want to keep the socket open)
        res.fp = None

        # Server should respond with a challenge message
        auth_header_values = reshdr[resp_header].split(', ')
        auth_header_value = None
        for s in auth_header_values:
            if s[:5] == 'NTLM ':
                auth_header_value = s[5:]
        if auth_header_value is None:
            raise Exception('Unexpected %s response header: %s' %
                            (resp_header, reshdr[resp_header]))

        # Send authentication message
        ServerChallenge, NegotiateFlags = \
            ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value)
        auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge,
                                                         self.user,
                                                         self.domain,
                                                         self.pw,
                                                         NegotiateFlags)
        headers[req_header] = 'NTLM %s' % auth_msg
        log.debug('Request headers: %s' % headers)
        conn.request('GET', self.authurl, None, headers)
        res = conn.getresponse()
        log.debug('Response status: %s %s' % (res.status, res.reason))
        log.debug('Response headers: %s' % dict(res.getheaders()))
        log.debug('Response data: %s [...]' % res.read()[:100])
        if res.status != 200:
            if res.status == 401:
                raise Exception('Server rejected request: wrong '
                                'username or password')
            raise Exception('Wrong server response: %s %s' %
                            (res.status, res.reason))

        res.fp = None
        log.debug('Connection established')
        return conn

    def urlopen(self, method, url, body=None, headers=None, retries=3,
                redirect=True, assert_same_host=True):
        if headers is None:
            headers = {}
        headers['Connection'] = 'Keep-Alive'
        return super(NTLMConnectionPool, self).urlopen(method, url, body,
                                                       headers, retries,
                                                       redirect,
                                                       assert_same_host)
site-packages/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.py000064400000035356151733463660022615 0ustar00'''SSL with SNI_-support for Python 2. Follow these instructions if you would
like to verify SSL certificates in Python 2. Note, the default libraries do
*not* do certificate checking; you need to do additional work to validate
certificates yourself.

This needs the following packages installed:

* pyOpenSSL (tested with 0.13)
* ndg-httpsclient (tested with 0.3.2)
* pyasn1 (tested with 0.1.6)

You can install them with the following command:

    pip install pyopenssl ndg-httpsclient pyasn1

To activate certificate checking, call
:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code
before you begin making HTTP requests. This can be done in a ``sitecustomize``
module, or at any other time before your application begins using ``urllib3``,
like this::

    try:
        import urllib3.contrib.pyopenssl
        urllib3.contrib.pyopenssl.inject_into_urllib3()
    except ImportError:
        pass

Now you can use :mod:`urllib3` as you normally would, and it will support SNI
when the required modules are installed.

Activating this module also has the positive side effect of disabling SSL/TLS
encryption in Python 2 (see `CRIME attack`_).

If you want to configure the default list of supported cipher suites, you can
set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable.

Module Variables
----------------

:var DEFAULT_SSL_CIPHER_LIST: The list of supported SSL/TLS cipher suites.
    Default: ``ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:
    ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS``

.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication
.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit)

'''

from ndg.httpsclient.ssl_peer_verification import SUBJ_ALT_NAME_SUPPORT
from ndg.httpsclient.subj_alt_name import SubjectAltName as BaseSubjectAltName
import OpenSSL.SSL
from pyasn1.codec.der import decoder as der_decoder
from pyasn1.type import univ, constraint
from socket import _fileobject, timeout
import ssl
import select
from cStringIO import StringIO

from .. import connection
from .. import util

__all__ = ['inject_into_urllib3', 'extract_from_urllib3']

# SNI only *really* works if we can read the subjectAltName of certificates.
HAS_SNI = SUBJ_ALT_NAME_SUPPORT

# Map from urllib3 to PyOpenSSL compatible parameter-values.
_openssl_versions = {
    ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD,
    ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD,
    ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD,
}
_openssl_verify = {
    ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE,
    ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER,
    ssl.CERT_REQUIRED: OpenSSL.SSL.VERIFY_PEER
                       + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT,
}

# A secure default.
# Sources for more information on TLS ciphers:
#
# - https://wiki.mozilla.org/Security/Server_Side_TLS
# - https://www.ssllabs.com/projects/best-practices/index.html
# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
#
# The general intent is:
# - Prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE),
# - prefer ECDHE over DHE for better performance,
# - prefer any AES-GCM over any AES-CBC for better performance and security,
# - use 3DES as fallback which is secure but slow,
# - disable NULL authentication, MD5 MACs and DSS for security reasons.
DEFAULT_SSL_CIPHER_LIST = "ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:" + \
    "ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:" + \
    "!aNULL:!MD5:!DSS"


orig_util_HAS_SNI = util.HAS_SNI
orig_connection_ssl_wrap_socket = connection.ssl_wrap_socket


def inject_into_urllib3():
    'Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.'

    connection.ssl_wrap_socket = ssl_wrap_socket
    util.HAS_SNI = HAS_SNI


def extract_from_urllib3():
    'Undo monkey-patching by :func:`inject_into_urllib3`.'

    connection.ssl_wrap_socket = orig_connection_ssl_wrap_socket
    util.HAS_SNI = orig_util_HAS_SNI


### Note: This is a slightly bug-fixed version of same from ndg-httpsclient.
class SubjectAltName(BaseSubjectAltName):
    '''ASN.1 implementation for subjectAltNames support'''

    # There is no limit to how many SAN certificates a certificate may have,
    #   however this needs to have some limit so we'll set an arbitrarily high
    #   limit.
    sizeSpec = univ.SequenceOf.sizeSpec + \
        constraint.ValueSizeConstraint(1, 1024)


### Note: This is a slightly bug-fixed version of same from ndg-httpsclient.
def get_subj_alt_name(peer_cert):
    # Search through extensions
    dns_name = []
    if not SUBJ_ALT_NAME_SUPPORT:
        return dns_name

    general_names = SubjectAltName()
    for i in range(peer_cert.get_extension_count()):
        ext = peer_cert.get_extension(i)
        ext_name = ext.get_short_name()
        if ext_name != 'subjectAltName':
            continue

        # PyOpenSSL returns extension data in ASN.1 encoded form
        ext_dat = ext.get_data()
        decoded_dat = der_decoder.decode(ext_dat,
                                         asn1Spec=general_names)

        for name in decoded_dat:
            if not isinstance(name, SubjectAltName):
                continue
            for entry in range(len(name)):
                component = name.getComponentByPosition(entry)
                if component.getName() != 'dNSName':
                    continue
                dns_name.append(str(component.getComponent()))

    return dns_name


class fileobject(_fileobject):

    def _wait_for_sock(self):
        rd, wd, ed = select.select([self._sock], [], [],
                                   self._sock.gettimeout())
        if not rd:
            raise timeout()


    def read(self, size=-1):
        # Use max, disallow tiny reads in a loop as they are very inefficient.
        # We never leave read() with any leftover data from a new recv() call
        # in our internal buffer.
        rbufsize = max(self._rbufsize, self.default_bufsize)
        # Our use of StringIO rather than lists of string objects returned by
        # recv() minimizes memory usage and fragmentation that occurs when
        # rbufsize is large compared to the typical return value of recv().
        buf = self._rbuf
        buf.seek(0, 2)  # seek end
        if size < 0:
            # Read until EOF
            self._rbuf = StringIO()  # reset _rbuf.  we consume it via buf.
            while True:
                try:
                    data = self._sock.recv(rbufsize)
                except OpenSSL.SSL.WantReadError:
                    self._wait_for_sock()
                    continue
                if not data:
                    break
                buf.write(data)
            return buf.getvalue()
        else:
            # Read until size bytes or EOF seen, whichever comes first
            buf_len = buf.tell()
            if buf_len >= size:
                # Already have size bytes in our buffer?  Extract and return.
                buf.seek(0)
                rv = buf.read(size)
                self._rbuf = StringIO()
                self._rbuf.write(buf.read())
                return rv

            self._rbuf = StringIO()  # reset _rbuf.  we consume it via buf.
            while True:
                left = size - buf_len
                # recv() will malloc the amount of memory given as its
                # parameter even though it often returns much less data
                # than that.  The returned data string is short lived
                # as we copy it into a StringIO and free it.  This avoids
                # fragmentation issues on many platforms.
                try:
                    data = self._sock.recv(left)
                except OpenSSL.SSL.WantReadError:
                    self._wait_for_sock()
                    continue
                if not data:
                    break
                n = len(data)
                if n == size and not buf_len:
                    # Shortcut.  Avoid buffer data copies when:
                    # - We have no data in our buffer.
                    # AND
                    # - Our call to recv returned exactly the
                    #   number of bytes we were asked to read.
                    return data
                if n == left:
                    buf.write(data)
                    del data  # explicit free
                    break
                assert n <= left, "recv(%d) returned %d bytes" % (left, n)
                buf.write(data)
                buf_len += n
                del data  # explicit free
                #assert buf_len == buf.tell()
            return buf.getvalue()

    def readline(self, size=-1):
        buf = self._rbuf
        buf.seek(0, 2)  # seek end
        if buf.tell() > 0:
            # check if we already have it in our buffer
            buf.seek(0)
            bline = buf.readline(size)
            if bline.endswith('\n') or len(bline) == size:
                self._rbuf = StringIO()
                self._rbuf.write(buf.read())
                return bline
            del bline
        if size < 0:
            # Read until \n or EOF, whichever comes first
            if self._rbufsize <= 1:
                # Speed up unbuffered case
                buf.seek(0)
                buffers = [buf.read()]
                self._rbuf = StringIO()  # reset _rbuf.  we consume it via buf.
                data = None
                recv = self._sock.recv
                while True:
                    try:
                        while data != "\n":
                            data = recv(1)
                            if not data:
                                break
                            buffers.append(data)
                    except OpenSSL.SSL.WantReadError:
                        self._wait_for_sock()
                        continue
                    break
                return "".join(buffers)

            buf.seek(0, 2)  # seek end
            self._rbuf = StringIO()  # reset _rbuf.  we consume it via buf.
            while True:
                try:
                    data = self._sock.recv(self._rbufsize)
                except OpenSSL.SSL.WantReadError:
                    self._wait_for_sock()
                    continue
                if not data:
                    break
                nl = data.find('\n')
                if nl >= 0:
                    nl += 1
                    buf.write(data[:nl])
                    self._rbuf.write(data[nl:])
                    del data
                    break
                buf.write(data)
            return buf.getvalue()
        else:
            # Read until size bytes or \n or EOF seen, whichever comes first
            buf.seek(0, 2)  # seek end
            buf_len = buf.tell()
            if buf_len >= size:
                buf.seek(0)
                rv = buf.read(size)
                self._rbuf = StringIO()
                self._rbuf.write(buf.read())
                return rv
            self._rbuf = StringIO()  # reset _rbuf.  we consume it via buf.
            while True:
                try:
                    data = self._sock.recv(self._rbufsize)
                except OpenSSL.SSL.WantReadError:
                    self._wait_for_sock()
                    continue
                if not data:
                    break
                left = size - buf_len
                # did we just receive a newline?
                nl = data.find('\n', 0, left)
                if nl >= 0:
                    nl += 1
                    # save the excess data to _rbuf
                    self._rbuf.write(data[nl:])
                    if buf_len:
                        buf.write(data[:nl])
                        break
                    else:
                        # Shortcut.  Avoid data copy through buf when returning
                        # a substring of our first recv().
                        return data[:nl]
                n = len(data)
                if n == size and not buf_len:
                    # Shortcut.  Avoid data copy through buf when
                    # returning exactly all of our first recv().
                    return data
                if n >= left:
                    buf.write(data[:left])
                    self._rbuf.write(data[left:])
                    break
                buf.write(data)
                buf_len += n
                #assert buf_len == buf.tell()
            return buf.getvalue()


class WrappedSocket(object):
    '''API-compatibility wrapper for Python OpenSSL's Connection-class.'''

    def __init__(self, connection, socket):
        self.connection = connection
        self.socket = socket

    def fileno(self):
        return self.socket.fileno()

    def makefile(self, mode, bufsize=-1):
        return fileobject(self.connection, mode, bufsize)

    def settimeout(self, timeout):
        return self.socket.settimeout(timeout)

    def sendall(self, data):
        return self.connection.sendall(data)

    def close(self):
        return self.connection.shutdown()

    def getpeercert(self, binary_form=False):
        x509 = self.connection.get_peer_certificate()

        if not x509:
            return x509

        if binary_form:
            return OpenSSL.crypto.dump_certificate(
                OpenSSL.crypto.FILETYPE_ASN1,
                x509)

        return {
            'subject': (
                (('commonName', x509.get_subject().CN),),
            ),
            'subjectAltName': [
                ('DNS', value)
                for value in get_subj_alt_name(x509)
            ]
        }


def _verify_callback(cnx, x509, err_no, err_depth, return_code):
    return err_no == 0


def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None,
                    ca_certs=None, server_hostname=None,
                    ssl_version=None):
    ctx = OpenSSL.SSL.Context(_openssl_versions[ssl_version])
    if certfile:
        ctx.use_certificate_file(certfile)
    if keyfile:
        ctx.use_privatekey_file(keyfile)
    if cert_reqs != ssl.CERT_NONE:
        ctx.set_verify(_openssl_verify[cert_reqs], _verify_callback)
    if ca_certs:
        try:
            ctx.load_verify_locations(ca_certs, None)
        except OpenSSL.SSL.Error as e:
            raise ssl.SSLError('bad ca_certs: %r' % ca_certs, e)
    else:
        ctx.set_default_verify_paths()

    # Disable TLS compression to migitate CRIME attack (issue #309)
    OP_NO_COMPRESSION = 0x20000
    ctx.set_options(OP_NO_COMPRESSION)

    # Set list of supported ciphersuites.
    ctx.set_cipher_list(DEFAULT_SSL_CIPHER_LIST)

    cnx = OpenSSL.SSL.Connection(ctx, sock)
    cnx.set_tlsext_host_name(server_hostname)
    cnx.set_connect_state()
    while True:
        try:
            cnx.do_handshake()
        except OpenSSL.SSL.WantReadError:
            select.select([sock], [], [])
            continue
        except OpenSSL.SSL.Error as e:
            raise ssl.SSLError('bad handshake', e)
        break

    return WrappedSocket(cnx, sock)
site-packages/pip/_vendor/requests/packages/urllib3/contrib/__init__.py000064400000000000151733463660022272 0ustar00site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/_collections.cpython-33.pyc000064400000026733151733463660026056 0ustar00�
7�Re�c@s�ddlmZmZyddlmZWn%ek
rQGdd�d�ZYnXyddlmZWn"ek
r�ddlmZYnXddlm	Z	dd	gZ
e�ZGd
d�de�Z
Gdd	�d	e�ZdS(
i(uMappinguMutableMapping(uRLockcBs,|EeZdZdd�Zdd�ZdS(uRLockcCsdS(N((uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyu	__enter__suRLock.__enter__cCsdS(N((uselfuexc_typeu	exc_valueu	traceback((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyu__exit__suRLock.__exit__N(u__name__u
__module__u__qualname__u	__enter__u__exit__(u
__locals__((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyuRLocksuRLock(uOrderedDicti(u
itervaluesuRecentlyUsedContaineruHTTPHeaderDictcBs�|EeZdZdZeZdddd�Zdd�Zdd�Z	d	d
�Z
dd�Zd
d�Zdd�Z
dd�ZdS(uRecentlyUsedContaineru�
    Provides a thread-safe dict-like container which maintains up to
    ``maxsize`` keys while throwing away the least-recently-used keys beyond
    ``maxsize``.

    :param maxsize:
        Maximum number of recent elements to retain.

    :param dispose_func:
        Every time an item is evicted from the container,
        ``dispose_func(value)`` is called.  Callback which will get called
    i
cCs1||_||_|j�|_t�|_dS(N(u_maxsizeudispose_funcuContainerClsu
_containeruRLockulock(uselfumaxsizeudispose_func((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyu__init__0s		uRecentlyUsedContainer.__init__c
Cs7|j�(|jj|�}||j|<|SWdQXdS(N(ulocku
_containerupop(uselfukeyuitem((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyu__getitem__7s

u!RecentlyUsedContainer.__getitem__c
Cs�t}|j�]|jj|t�}||j|<t|j�|jkrh|jjdd�\}}nWdQX|jr�|tk	r�|j|�ndS(NulastF(	u_Nullulocku
_containerugetulenu_maxsizeupopitemuFalseudispose_func(uselfukeyuvalueu
evicted_valueu_key((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyu__setitem__>s

$u!RecentlyUsedContainer.__setitem__c	Cs?|j�|jj|�}WdQX|jr;|j|�ndS(N(ulocku
_containerupopudispose_func(uselfukeyuvalue((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyu__delitem__Ms
	u!RecentlyUsedContainer.__delitem__c	Cs!|j�t|j�SWdQXdS(N(ulockulenu
_container(uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyu__len__Ts
uRecentlyUsedContainer.__len__cCstd��dS(Nu7Iteration over this class is unlikely to be threadsafe.(uNotImplementedError(uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyu__iter__XsuRecentlyUsedContainer.__iter__c	Cs`|j�'t|jj��}|jj�WdQX|jr\x|D]}|j|�qBWndS(N(ulockulistu
_containeruvaluesuclearudispose_func(uselfuvaluesuvalue((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyuclear[s
	
uRecentlyUsedContainer.clearcCs!|j�|jj�SWdQXdS(N(ulocku
_containerukeys(uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyukeysfs
uRecentlyUsedContainer.keysN(u__name__u
__module__u__qualname__u__doc__uOrderedDictuContainerClsuNoneu__init__u__getitem__u__setitem__u__delitem__u__len__u__iter__uclearukeys(u
__locals__((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyuRecentlyUsedContainer scBs�|EeZdZdZddd�Zdd�Zdd�Zdd	�Zd
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�ZdS(uHTTPHeaderDictuZ
    :param headers:
        An iterable of field-value pairs. Must not contain multiple field names
        when compared case-insensitively.

    :param kwargs:
        Additional field-value pairs to pass in to ``dict.update``.

    A ``dict`` like container for storing HTTP Headers.

    Field names are stored and compared case-insensitively in compliance with
    RFC 2616. Iteration provides the first case-sensitive key seen for each
    case-insensitive pair.

    Using ``__setitem__`` syntax overwrites fields that compare equal
    case-insensitively in order to maintain ``dict``'s api. For fields that
    compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add``
    in a loop.

    If multiple fields that are equal case-insensitively are passed to the
    constructor or ``.update``, the behavior is undefined and some will be
    lost.

    >>> headers = HTTPHeaderDict()
    >>> headers.add('Set-Cookie', 'foo=bar')
    >>> headers.add('set-cookie', 'baz=quxx')
    >>> headers['content-length'] = '7'
    >>> headers['SET-cookie']
    'foo=bar, baz=quxx'
    >>> headers['Content-Length']
    '7'

    If you want to access the raw headers with their original casing
    for debugging purposes you can access the private ``._data`` attribute
    which is a normal python ``dict`` that maps the case-insensitive key to a
    list of tuples stored as (case-sensitive-original-name, value). Using the
    structure from above as our example:

    >>> headers._data
    {'set-cookie': [('Set-Cookie', 'foo=bar'), ('set-cookie', 'baz=quxx')],
    'content-length': [('content-length', '7')]}
    cKs2i|_|dkri}n|j||�dS(N(u_datauNoneuupdate(uselfuheadersukwargs((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyu__init__�s		uHTTPHeaderDict.__init__cCs,|jj|j�g�j||f�dS(u�Adds a (name, value) pair, doesn't overwrite the value if it already
        exists.

        >>> headers = HTTPHeaderDict(foo='bar')
        >>> headers.add('Foo', 'baz')
        >>> headers['foo']
        'bar, baz'
        N(u_datau
setdefaultuloweruappend(uselfukeyuvalue((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyuadd�s	uHTTPHeaderDict.addcCs!||kr||jd�SgS(umReturns a list of all the values for the named field. Returns an
        empty list if the key doesn't exist.u, (usplit(uselfukey((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyugetlist�suHTTPHeaderDict.getlistcCsOt�}x?|jD]4}x+|j|D]\}}|j||�q'WqW|S(N(uHTTPHeaderDictu_datauadd(uselfuhukeyurawkeyuvalue((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyucopy�s
	uHTTPHeaderDict.copycsat�t�sdSt���t�fdd��jD��t�fdd��jD��kS(Nc3s|]}|�|fVqdS(N((u.0uk1(uself(uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyu	<genexpr>�su(HTTPHeaderDict.__eq__.<locals>.<genexpr>c3s|]}|�|fVqdS(N((u.0uk2(uother(uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyu	<genexpr>�sF(u
isinstanceuMappinguFalseuHTTPHeaderDictudictu_data(uselfuother((uotheruselfuK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyu__eq__�s
uHTTPHeaderDict.__eq__cCs-|j|j�}djdd�|D��S(Nu, css|]}|dVqdS(iN((u.0uvalue((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyu	<genexpr>�su-HTTPHeaderDict.__getitem__.<locals>.<genexpr>(u_dataulowerujoin(uselfukeyuvalues((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyu__getitem__�suHTTPHeaderDict.__getitem__cCs ||fg|j|j�<dS(N(u_dataulower(uselfukeyuvalue((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyu__setitem__�suHTTPHeaderDict.__setitem__cCs|j|j�=dS(N(u_dataulower(uselfukey((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyu__delitem__�suHTTPHeaderDict.__delitem__cCs
t|j�S(N(ulenu_data(uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyu__len__�suHTTPHeaderDict.__len__ccs+x$t|j�D]}|ddVqWdS(Ni(u
itervaluesu_data(uselfuheaders((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyu__iter__�suHTTPHeaderDict.__iter__cCs d|jjt|j��fS(Nu%s(%r)(u	__class__u__name__udictuitems(uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyu__repr__�suHTTPHeaderDict.__repr__N(u__name__u
__module__u__qualname__u__doc__uNoneu__init__uaddugetlistucopyu__eq__u__getitem__u__setitem__u__delitem__u__len__u__iter__u__repr__(u
__locals__((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyuHTTPHeaderDictks*N(ucollectionsuMappinguMutableMappingu	threadinguRLockuImportErroruOrderedDictupackages.ordered_dictupackages.sixu
itervaluesu__all__uobjectu_NulluRecentlyUsedContaineruHTTPHeaderDict(((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/_collections.pyu<module>s

	Ksite-packages/pip/_vendor/requests/packages/urllib3/__pycache__/request.cpython-33.pyc000064400000014660151733463660025065 0ustar00�
7�Re�c@slyddlmZWn"ek
r8ddlmZYnXddlmZdgZGdd�de�ZdS(i(u	urlencodei(uencode_multipart_formdatauRequestMethodscBs�|EeZdZdZeddddg�Zddd�Zdddddd	�Z	ddd
d�Z
ddd
�Zdddddd�ZdS(uRequestMethodsu�
    Convenience mixin for classes who implement a :meth:`urlopen` method, such
    as :class:`~urllib3.connectionpool.HTTPConnectionPool` and
    :class:`~urllib3.poolmanager.PoolManager`.

    Provides behavior for making common types of HTTP request methods and
    decides which type of request field encoding to use.

    Specifically,

    :meth:`.request_encode_url` is for sending requests whose fields are encoded
    in the URL (such as GET, HEAD, DELETE).

    :meth:`.request_encode_body` is for sending requests whose fields are
    encoded in the *body* of the request using multipart or www-form-urlencoded
    (such as for POST, PUT, PATCH).

    :meth:`.request` is for making any kind of request, it will look up the
    appropriate encoding format and use one of the above two methods to make
    the request.

    Initializer parameters:

    :param headers:
        Headers to include with all requests, unless other headers are given
        explicitly.
    uDELETEuGETuHEADuOPTIONScCs|p	i|_dS(N(uheaders(uselfuheaders((uF/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/request.pyu__init__1suRequestMethods.__init__cKstd��dS(NuMClasses extending RequestMethods must implement their own ``urlopen`` method.(uNotImplemented(uselfumethoduurlubodyuheadersuencode_multipartumultipart_boundaryukw((uF/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/request.pyuurlopen4suRequestMethods.urlopencKs]|j�}||jkr:|j||d|d||�S|j||d|d||�SdS(u�
        Make a request using :meth:`urlopen` with the appropriate encoding of
        ``fields`` based on the ``method`` used.

        This is a convenience method that requires the least amount of manual
        effort. It can be used in most situations, while still having the option
        to drop down to more specific methods when necessary, such as
        :meth:`request_encode_url`, :meth:`request_encode_body`,
        or even the lowest level :meth:`urlopen`.
        ufieldsuheadersN(uupperu_encode_url_methodsurequest_encode_urlurequest_encode_body(uselfumethoduurlufieldsuheadersu
urlopen_kw((uF/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/request.pyurequest:suRequestMethods.requestcKs0|r|dt|�7}n|j|||�S(u�
        Make a request using :meth:`urlopen` with the ``fields`` encoded in
        the url. This is useful for request methods like GET, HEAD, DELETE, etc.
        u?(u	urlencodeuurlopen(uselfumethoduurlufieldsu
urlopen_kw((uF/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/request.pyurequest_encode_urlPsu!RequestMethods.request_encode_urlc	Ks�|r't|pid|�\}}	nt|p3i�d}}	|dkrX|j}ni|	d6}
|
j|�|j||d|d|
|�S(u�
        Make a request using :meth:`urlopen` with the ``fields`` encoded in
        the body. This is useful for request methods like POST, PUT, PATCH, etc.

        When ``encode_multipart=True`` (default), then
        :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode the
        payload with the appropriate content type. Otherwise
        :meth:`urllib.urlencode` is used with the
        'application/x-www-form-urlencoded' content type.

        Multipart encoding must be used when posting files, and it's reasonably
        safe to use it in other times too. However, it may break request signing,
        such as with OAuth.

        Supports an optional ``fields`` parameter of key/value strings AND
        key/filetuple. A filetuple is a (filename, data, MIME type) tuple where
        the MIME type is optional. For example: ::

            fields = {
                'foo': 'bar',
                'fakefile': ('foofile.txt', 'contents of foofile'),
                'realfile': ('barfile.txt', open('realfile').read()),
                'typedfile': ('bazfile.bin', open('bazfile').read(),
                              'image/jpeg'),
                'nonamefile': 'contents of nonamefile field',
            }

        When uploading a file, providing a filename (the first parameter of the
        tuple) is optional but recommended to best mimick behavior of browsers.

        Note that if ``headers`` are supplied, the 'Content-Type' header will be
        overwritten because it depends on the dynamic random boundary string
        which is used to compose the body of the request. The random boundary
        string can be explicitly set with the ``multipart_boundary`` parameter.
        uboundaryu!application/x-www-form-urlencodeduContent-TypeubodyuheadersN(uencode_multipart_formdatau	urlencodeuNoneuheadersuupdateuurlopen(uselfumethoduurlufieldsuheadersuencode_multipartumultipart_boundaryu
urlopen_kwubodyucontent_typeuheaders_((uF/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/request.pyurequest_encode_bodyYs&


u"RequestMethods.request_encode_bodyNT(
u__name__u
__module__u__qualname__u__doc__usetu_encode_url_methodsuNoneu__init__uTrueuurlopenurequesturequest_encode_urlurequest_encode_body(u
__locals__((uF/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/request.pyuRequestMethodss	N(	uurllib.parseu	urlencodeuImportErroruurllibufilepostuencode_multipart_formdatau__all__uobjectuRequestMethods(((uF/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/request.pyu<module>s
	site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/connection.cpython-33.pyc000064400000020013151733463670025522 0ustar00�
7�Re�c@s�ddlZddlZddlmZyddlmZmZWn(ek
rlddl	mZmZYnXGdd�de
�ZytdZ
eZGdd�de�ZyddlmZWn"ek
r�ddl	mZYnXddl
Z
e
jZWneefk
rYnXd	d
lmZd	dlmZd	dlmZd	d
lmZmZmZmZidd6dd6ZGdd�dee
�ZGdd�de�ZGdd�de�Z e
r�eZ!e ZndS(iN(utimeout(uHTTPConnectionu
HTTPExceptioncBs|EeZdZdZdS(uDummyConnectionu-Used to detect a failed ConnectionCls import.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connection.pyuDummyConnectionsuDummyConnectioncBs|EeZdZdS(uBaseSSLErrorN(u__name__u
__module__u__qualname__(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connection.pyuBaseSSLErrorsuBaseSSLError(uHTTPSConnectioni(uConnectTimeoutError(umatch_hostname(usix(uassert_fingerprinturesolve_cert_reqsuresolve_ssl_versionussl_wrap_socketiPuhttpi�uhttpscBsZ|EeZdZdZedZdZdd�Zdd�Zdd	�Z	d
d�Z
dS(
uHTTPConnectionu�
    Based on httplib.HTTPConnection but provides an extra constructor
    backwards-compatibility layer between older and newer Pythons.
    uhttpicOsgtjr|jdd�ntjdkr>|jdd�n|jd�|_tj	|||�dS(Nustrictiiusource_address(ii(
usixuPY3upopuNoneusysuversion_infougetusource_addressu_HTTPConnectionu__init__(uselfuargsukw((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connection.pyu__init__Ds	uHTTPConnection.__init__cCsfg}|jr"|j|j�ntj|j|jf|j|�}|jtjtj	|j
�|S(uq Establish a socket connection and set nodelay settings on it.

        :return: a new socket connection
        (usource_addressuappendusocketucreate_connectionuhostuportutimeoutu
setsockoptuIPPROTO_TCPuTCP_NODELAYutcp_nodelay(uselfu
extra_argsuconn((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connection.pyu	_new_connPs	uHTTPConnection._new_conncCs,||_t|dd�r(|j�ndS(Nu_tunnel_host(usockugetattruNoneu_tunnel(uselfuconn((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connection.pyu
_prepare_conn`s	uHTTPConnection._prepare_conncCs|j�}|j|�dS(N(u	_new_connu
_prepare_conn(uselfuconn((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connection.pyuconnectisuHTTPConnection.connectN(u__name__u
__module__u__qualname__u__doc__uport_by_schemeudefault_portutcp_nodelayu__init__u	_new_connu
_prepare_connuconnect(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connection.pyuHTTPConnection9s
	uHTTPConnectioncBsH|EeZdZedZddddejdd�Zdd�Z	dS(uHTTPSConnectionuhttpsc	KsAtj|||d|d||�||_||_d|_dS(Nustrictutimeoutuhttps(uHTTPConnectionu__init__ukey_fileu	cert_fileu	_protocol(uselfuhostuportukey_fileu	cert_fileustrictutimeoutukw((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connection.pyu__init__qs

		uHTTPSConnection.__init__cCs;|j�}|j|�tj||j|j�|_dS(N(u	_new_connu
_prepare_connussluwrap_socketukey_fileu	cert_fileusock(uselfuconn((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connection.pyuconnect~s
uHTTPSConnection.connectN(
u__name__u
__module__u__qualname__uport_by_schemeudefault_portuNoneusocketu_GLOBAL_DEFAULT_TIMEOUTu__init__uconnect(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connection.pyuHTTPSConnectionns
	uHTTPSConnectioncBs\|EeZdZdZdZdZdZiZdddddddd�Z	dd�Z
dS(uVerifiedHTTPSConnectionu[
    Based on httplib.HTTPSConnection but wraps the socket with
    SSL certification.
    cCs:||_||_||_||_||_||_dS(N(ukey_fileu	cert_fileu	cert_reqsuca_certsuassert_hostnameuassert_fingerprint(uselfukey_fileu	cert_fileu	cert_reqsuca_certsuassert_hostnameuassert_fingerprint((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connection.pyuset_cert�s					u VerifiedHTTPSConnection.set_certcCs�y1tjd|j|jfd|j|j�}Wn1tk
rdt|d|j|jf��YnX|jtj	tj
|j�t|j
�}t|j�}|j}t|dd�r�||_|j�|j}nt||j|jd|d|jd|d|�|_|tjkr}|jrIt|jjd	d
�|j�q}|jdk	r}t |jj�|jps|�q}ndS(Nuaddressutimeoutu0Connection to %s timed out. (connect timeout=%s)u_tunnel_hostu	cert_reqsuca_certsuserver_hostnameussl_versionubinary_formTF(!usocketucreate_connectionuhostuportutimeoutuconn_kwu
SocketTimeoutuConnectTimeoutErroru
setsockoptuIPPROTO_TCPuTCP_NODELAYutcp_nodelayuresolve_cert_reqsu	cert_reqsuresolve_ssl_versionussl_versionugetattruNoneusocku_tunnelu_tunnel_hostussl_wrap_socketukey_fileu	cert_fileuca_certsusslu	CERT_NONEuassert_fingerprintugetpeercertuTrueuassert_hostnameuFalseumatch_hostname(uselfusockuresolved_cert_reqsuresolved_ssl_versionuhostname((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connection.pyuconnect�s:	

		
		
uVerifiedHTTPSConnection.connectN(u__name__u
__module__u__qualname__u__doc__uNoneu	cert_reqsuca_certsussl_versionuconn_kwuset_certuconnect(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connection.pyuVerifiedHTTPSConnection�s	uVerifiedHTTPSConnection("usysusocketutimeoutu
SocketTimeoutuhttp.clientuHTTPConnectionu_HTTPConnectionu
HTTPExceptionuImportErroruhttplibuobjectuDummyConnectionuNoneussluHTTPSConnectionu
BaseExceptionuBaseSSLErroru_HTTPSConnectionuSSLErroruAttributeErroru
exceptionsuConnectTimeoutErrorupackages.ssl_match_hostnameumatch_hostnameupackagesusixuutiluassert_fingerprinturesolve_cert_reqsuresolve_ssl_versionussl_wrap_socketuport_by_schemeuVerifiedHTTPSConnectionuUnverifiedHTTPSConnection(((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connection.pyu<module>s@


"
5Esite-packages/pip/_vendor/requests/packages/urllib3/__pycache__/response.cpython-33.pyc000064400000030760151733463670025233 0ustar00�
7�Rek(c@s�ddlZddlZddlZddlmZddlmZddlmZ	m
Z
ddlmZej
e�ZGdd�de�Zd	d
�ZGdd�dej�ZdS(
iNi(uHTTPHeaderDict(uDecodeError(ustring_typesubinary_type(uis_fp_closedcBs8|EeZdZdd�Zdd�Zdd�ZdS(uDeflateDecodercCs(d|_t�|_tj�|_dS(NT(uTrueu
_first_tryubinary_typeu_datauzlibu
decompressobju_obj(uself((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/response.pyu__init__s	uDeflateDecoder.__init__cCst|j|�S(N(ugetattru_obj(uselfuname((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/response.pyu__getattr__suDeflateDecoder.__getattr__cCs�|js|jj|�S|j|7_y|jj|�SWnUtjk
r�d|_tjtj�|_z|j|j�SWdd|_XYnXdS(NF(
u
_first_tryu_obju
decompressu_datauzlibuerroruFalseu
decompressobju	MAX_WBITSuNone(uselfudata((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/response.pyu
decompresss		uDeflateDecoder.decompressN(u__name__u
__module__u__qualname__u__init__u__getattr__u
decompress(u
__locals__((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/response.pyuDeflateDecodersuDeflateDecodercCs'|dkr tjdtj�St�S(Nugzipi(uzlibu
decompressobju	MAX_WBITSuDeflateDecoder(umode((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/response.pyu_get_decoder/su_get_decoderc
Bs4|EeZdZdZddgZdddddgZd	d+d
d
d+d
d,d,d+d+d+dd�Zd
d�Z	dd�Z
edd��Zdd�Z
d+d+d-dd�Zd.d+dd�Zedd��Zdd�Zd+dd �Zd!d"�Zed#d$��Zd%d&�Zd'd(�Zd)d*�Zd+S(/uHTTPResponseu
    HTTP Response container.

    Backwards-compatible to httplib's HTTPResponse but the response ``body`` is
    loaded and decoded on-demand when the ``data`` property is accessed.

    Extra parameters for behaviour not present in httplib.HTTPResponse:

    :param preload_content:
        If True, the response's body will be preloaded during construction.

    :param decode_content:
        If True, attempts to decode specific content-encoding's based on headers
        (like 'gzip' and 'deflate') will be skipped and raw data will be used
        instead.

    :param original_response:
        When this HTTPResponse wrapper is generated from an httplib.HTTPResponse
        object, it's convenient to include the original for debug purposes. It's
        otherwise unused.
    ugzipudeflatei-i.i/i3i4uicCs�t�|_|r%|jj|�n||_||_||_||_||_d|_	|rvt
|t�rv|nd|_d|_
|	|_d|_|
|_||_t|d�r�||_
n|r�|jr�|jd|�|_ndS(Niureadudecode_content(uHTTPHeaderDictuheadersuupdateustatusuversionureasonustrictudecode_contentuNoneu_decoderu
isinstanceu
basestringu_bodyu_fpu_original_responseu_fp_bytes_readu_poolu_connectionuhasattruread(uselfubodyuheadersustatusuversionureasonustrictupreload_contentudecode_contentuoriginal_responseupoolu
connection((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/response.pyu__init__Ps&						$					uHTTPResponse.__init__cCs&|j|jkr"|jjd�SdS(u
        Should we redirect and where to?

        :returns: Truthy redirect location string if we got a redirect status
            code and valid location. ``None`` if redirect status and no
            location. ``False`` if not a redirect status code.
        ulocationF(ustatusuREDIRECT_STATUSESuheadersugetuFalse(uself((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/response.pyuget_redirect_locationlsu"HTTPResponse.get_redirect_locationcCs8|js|jrdS|jj|j�d|_dS(N(u_poolu_connectionu	_put_connuNone(uself((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/response.pyurelease_connysuHTTPResponse.release_conncCs-|jr|jS|jr)|jdd�SdS(Nu
cache_contentT(u_bodyu_fpureaduTrue(uself((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/response.pyudata�s		uHTTPResponse.datacCs|jS(u�
        Obtain the number of bytes pulled over the wire so far. May differ from
        the amount of content returned by :meth:``HTTPResponse.read`` if bytes
        are encoded on the wire (e.g, compressed).
        (u_fp_bytes_read(uself((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/response.pyutell�suHTTPResponse.tellc	Cs�|jjdd�j�}|jdkrN||jkrNt|�|_qNn|dkrf|j}n|jdkrydSd}zD|dkr�|jj
�}d}nAd}|jj
|�}|dkr�|r�|jj�d}n|j
t|�7_
y(|r#|jr#|jj|�}nWnAttjfk
rg}ztd||��WYdd}~XnX|r�|r�|jr�|jjt��}|||jj�7}n|r�||_n|SWd|jr�|jj�r�|j�nXdS(uP
        Similar to :meth:`httplib.HTTPResponse.read`, but with two additional
        parameters: ``decode_content`` and ``cache_content``.

        :param amt:
            How much of the content to read. If specified, caching is skipped
            because it doesn't make sense to cache partial content as the full
            response.

        :param decode_content:
            If True, will attempt to decode the body based on the
            'content-encoding' header.

        :param cache_content:
            If True, will save the returned data such that the same result is
            returned despite of the state of the underlying file object. This
            is useful if you want the ``.data`` property to continue working
            after having ``.read()`` the file object. (Overridden if ``amt`` is
            set.)
        ucontent-encodinguNiuEReceived response with content-encoding: %s, but failed to decode it.FT(uheadersugetuloweru_decoderuNoneuCONTENT_DECODERSu_get_decoderudecode_contentu_fpuFalseureaduTrueucloseu_fp_bytes_readulenu
decompressuIOErroruzlibuerroruDecodeErrorubinary_typeuflushu_bodyu_original_responseuisclosedurelease_conn(	uselfuamtudecode_contentu
cache_contentucontent_encodingu
flush_decoderudataueubuf((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/response.pyuread�sF	
	uHTTPResponse.readiiccs@x9t|j�s;|jd|d|�}|r|VqqWdS(u_
        A generator wrapper for the read() method. A call will block until
        ``amt`` bytes have been read from the connection or until the
        connection is closed.

        :param amt:
            How much of the content to read. The generator will return up to
            much data per iteration, but may return less. This is particularly
            likely when using compressed data. However, the empty string will
            never be returned.

        :param decode_content:
            If True, will attempt to decode the body based on the
            'content-encoding' header.
        uamtudecode_contentN(uis_fp_closedu_fpuread(uselfuamtudecode_contentudata((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/response.pyustream�suHTTPResponse.streamcKs�t�}x*|j�D]\}}|j||�qWt|dd�}|d|d|d|jd|jd|jd|d||�S(	u
        Given an :class:`httplib.HTTPResponse` instance ``r``, return a
        corresponding :class:`urllib3.response.HTTPResponse` object.

        Remaining parameters are passed to the HTTPResponse constructor, along
        with ``original_response=r``.
        ustrictiubodyuheadersustatusuversionureasonuoriginal_response(uHTTPHeaderDictu
getheadersuaddugetattrustatusuversionureason(uResponseClsururesponse_kwuheadersukuvustrict((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/response.pyufrom_httplib�s
				uHTTPResponse.from_httplibcCs|jS(N(uheaders(uself((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/response.pyu
getheaderssuHTTPResponse.getheaderscCs|jj||�S(N(uheadersuget(uselfunameudefault((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/response.pyu	getheadersuHTTPResponse.getheadercCs|js|jj�ndS(N(uclosedu_fpuclose(uself((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/response.pyucloses	uHTTPResponse.closecCsV|jdkrdSt|jd�r/|jjSt|jd�rN|jj�SdSdS(NucloseduisclosedT(u_fpuNoneuTrueuhasattrucloseduisclosed(uself((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/response.pyucloseds

uHTTPResponse.closedcCsM|jdkrtd��n+t|jd�r=|jj�Std��dS(Nu-HTTPResponse has no file to get a fileno fromufilenouPThe file-like object  this HTTPResponse is wrapped around has no file descriptor(u_fpuNoneuIOErroruhasattrufileno(uself((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/response.pyufileno&s

uHTTPResponse.filenocCs2|jdk	r.t|jd�r.|jj�SdS(Nuflush(u_fpuNoneuhasattruflush(uself((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/response.pyuflush/s!uHTTPResponse.flushcCsdS(NT(uTrue(uself((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/response.pyureadable3suHTTPResponse.readableNTFi(u__name__u
__module__u__qualname__u__doc__uCONTENT_DECODERSuREDIRECT_STATUSESuNoneuTrueu__init__uget_redirect_locationurelease_connupropertyudatautelluFalseureadustreamuclassmethodufrom_httplibu
getheadersu	getheaderucloseuclosedufilenouflushureadable(u
__locals__((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/response.pyuHTTPResponse6s(	
	N	uHTTPResponse(ulogginguzlibuiou_collectionsuHTTPHeaderDictu
exceptionsuDecodeErrorupackages.sixustring_typesu
basestringubinary_typeuutiluis_fp_closedu	getLoggeru__name__uloguobjectuDeflateDecoderu_get_decoderuIOBaseuHTTPResponse(((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/response.pyu<module>ssite-packages/pip/_vendor/requests/packages/urllib3/__pycache__/fields.cpython-33.pyc000064400000016634151733463670024647 0ustar00�
7�ReXc@s]ddlZddlZddlmZddd�Zdd�ZGd	d
�d
e�ZdS(iNi(usixuapplication/octet-streamcCs!|rtj|�dp|S|S(u�
    Guess the "Content-Type" of a file.

    :param filename:
        The filename to guess the "Content-Type" of using :mod:`mimetypes`.
    :param default:
        If no "Content-Type" can be guessed, default to `default`.
    i(u	mimetypesu
guess_type(ufilenameudefault((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/fields.pyuguess_content_type
s	uguess_content_typecs�t�fdd�dD��s\d|�f}y|jd�Wntk
rTYq\X|Sntjsw�jd��ntjj�d��d|�f��S(u�
    Helper function to format and quote a single header parameter.

    Particularly useful for header parameters which might contain
    non-ASCII values, like file names. This follows RFC 2231, as
    suggested by RFC 2388 Section 4.4.

    :param name:
        The name of the parameter, a string expected to be ASCII only.
    :param value:
        The value of the parameter, provided as a unicode string.
    c3s|]}|�kVqdS(N((u.0uch(uvalue(uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/fields.pyu	<genexpr>(su&format_header_param.<locals>.<genexpr>u"\
u%s="%s"uasciiuutf-8u%s*=%s(uanyuencodeuUnicodeEncodeErrorusixuPY3uemailuutilsuencode_rfc2231(unameuvalueuresult((uvalueuE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/fields.pyuformat_header_params

	uformat_header_paramcBsw|EeZdZdZdddd�Zedd��Zdd�Zdd	�Z	d
d�Z
ddddd
�ZdS(uRequestFielduK
    A data container for request body parameters.

    :param name:
        The name of this request field.
    :param data:
        The data/value body.
    :param filename:
        An optional filename of the request field.
    :param headers:
        An optional dict-like object of headers to initially use for the field.
    cCs@||_||_||_i|_|r<t|�|_ndS(N(u_nameu	_filenameudatauheadersudict(uselfunameudataufilenameuheaders((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/fields.pyu__init__Ds				uRequestField.__init__cCs�t|t�rNt|�dkr3|\}}}q`|\}}t|�}nd}d}|}|||d|�}|jd|�|S(u�
        A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters.

        Supports constructing :class:`~urllib3.fields.RequestField` from parameter
        of key/value strings AND key/filetuple. A filetuple is a (filename, data, MIME type)
        tuple where the MIME type is optional. For example: ::

            'foo': 'bar',
            'fakefile': ('foofile.txt', 'contents of foofile'),
            'realfile': ('barfile.txt', open('realfile').read()),
            'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'),
            'nonamefile': 'contents of nonamefile field',

        Field names and filenames must be unicode.
        iufilenameucontent_typeN(u
isinstanceutupleulenuguess_content_typeuNoneumake_multipart(uclsu	fieldnameuvalueufilenameudataucontent_typeu
request_param((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/fields.pyufrom_tuplesLsuRequestField.from_tuplescCs
t||�S(u
        Overridable helper function to format a single header parameter.

        :param name:
            The name of the parameter, a string expected to be ASCII only.
        :param value:
            The value of the parameter, provided as a unicode string.
        (uformat_header_param(uselfunameuvalue((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/fields.pyu_render_partms	uRequestField._render_partcCspg}|}t|t�r*|j�}nx6|D].\}}|r1|j|j||��q1q1Wdj|�S(uO
        Helper function to format and quote a single header.

        Useful for single headers that are composed of multiple items. E.g.,
        'Content-Disposition' fields.

        :param header_parts:
            A sequence of (k, v) typles or a :class:`dict` of (k, v) to format as
            `k1="v1"; k2="v2"; ...`.
        u; (u
isinstanceudictuitemsuappendu_render_partujoin(uselfuheader_partsupartsuiterableunameuvalue((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/fields.pyu
_render_partsxs uRequestField._render_partscCs�g}dddg}xD|D]<}|jj|d�r|jd||j|f�qqWxL|jj�D];\}}||krl|r�|jd||f�q�qlqlW|jd�dj|�S(u=
        Renders the headers for this request field.
        uContent-DispositionuContent-TypeuContent-Locationu%s: %su
F(uheadersugetuFalseuappenduitemsujoin(uselfulinesu	sort_keysusort_keyuheader_nameuheader_value((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/fields.pyurender_headers�s
%!
uRequestField.render_headersc
Csr|p	d|jd<|jddjd|jd|jfd|jff�g�7<||jd<||jd<d	S(
u|
        Makes this request field into a multipart request field.

        This method overrides "Content-Disposition", "Content-Type" and
        "Content-Location" headers to the request parameter.

        :param content_type:
            The 'Content-Type' of the request body.
        :param content_location:
            The 'Content-Location' of the request body.

        u	form-datauContent-Dispositionu; uunameufilenameuContent-TypeuContent-LocationN(uheadersujoinu
_render_partsu_nameu	_filename(uselfucontent_dispositionucontent_typeucontent_location((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/fields.pyumake_multipart�s
A
uRequestField.make_multipartN(u__name__u
__module__u__qualname__u__doc__uNoneu__init__uclassmethodufrom_tuplesu_render_partu
_render_partsurender_headersumake_multipart(u
__locals__((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/fields.pyuRequestField7s!uRequestField(	uemail.utilsuemailu	mimetypesupackagesusixuguess_content_typeuformat_header_paramuobjectuRequestField(((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/fields.pyu<module>s
site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/__init__.cpython-33.pyc000064400000004756151733463670025142 0ustar00�
7�Re�c@sdZdZdZdZddlmZmZmZddlm	Z	ddl
mZddlm
Z
mZmZdd	lmZdd
lmZmZmZddlZydd
lmZWn+ek
r�Gdd�dej�ZYnXeje�je��ejdd�Z[dS(u8
urllib3 - Thread-safe connection pooling and re-using.
u(Andrey Petrov (andrey.petrov@shazow.net)uMITudevi(uHTTPConnectionPooluHTTPSConnectionPooluconnection_from_url(u
exceptions(uencode_multipart_formdata(uPoolManageruProxyManageruproxy_from_url(uHTTPResponse(umake_headersuget_hostuTimeoutiN(uNullHandlercBs |EeZdZdd�ZdS(uNullHandlercCsdS(N((uselfurecord((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/__init__.pyuemit#suNullHandler.emitN(u__name__u
__module__u__qualname__uemit(u
__locals__((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/__init__.pyuNullHandler"suNullHandlercCs`tjt�}tj�}|jtjd��|j|�|j|�|jdt�|S(u�
    Helper for quickly adding a StreamHandler to the logger. Useful for
    debugging.

    Returns the handler after adding it.
    u%%(asctime)s %(levelname)s %(message)su-Added an stderr logging handler to logger: %s(	uloggingu	getLoggeru__name__u
StreamHandlerusetFormatteru	Formatteru
addHandlerusetLeveludebug(uleveluloggeruhandler((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/__init__.pyuadd_stderr_logger(s	

uadd_stderr_logger(u__doc__u
__author__u__license__u__version__uconnectionpooluHTTPConnectionPooluHTTPSConnectionPooluconnection_from_urluu
exceptionsufilepostuencode_multipart_formdataupoolmanageruPoolManageruProxyManageruproxy_from_urluresponseuHTTPResponseuutilumake_headersuget_hostuTimeoutulogginguNullHandleruImportErroruHandleru	getLoggeru__name__u
addHandleruDEBUGuadd_stderr_logger(((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/__init__.pyu<module>	s"
site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/exceptions.cpython-33.pyc000064400000021703151733463670025553 0ustar00�
7�Re$
c@sjGdd�de�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd	�d	e�ZGd
d�de�ZGdd
�d
e�ZGdd�de�ZGdd�de�Z	Gdd�de�Z
Gdd�de�ZGdd�dee�ZGdd�de�Z
Gdd�de�ZGdd�de�ZGdd�dee�Zd S(!cBs|EeZdZdZdS(u	HTTPErroru#Base exception used by this module.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyu	HTTPError
su	HTTPErrorcBs2|EeZdZdZdd�Zdd�ZdS(u	PoolErroru/Base exception for errors caused within a pool.cCs'||_tj|d||f�dS(Nu%s: %s(upoolu	HTTPErroru__init__(uselfupoolumessage((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyu__init__s	uPoolError.__init__cCs
|jdfS(N(NN(u	__class__uNone(uself((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyu
__reduce__suPoolError.__reduce__N(u__name__u
__module__u__qualname__u__doc__u__init__u
__reduce__(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyu	PoolErrorsu	PoolErrorcBs2|EeZdZdZdd�Zdd�ZdS(uRequestErroru8Base exception for PoolErrors that have associated URLs.cCs ||_tj|||�dS(N(uurlu	PoolErroru__init__(uselfupooluurlumessage((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyu__init__s	uRequestError.__init__cCs|jd|jdffS(N(u	__class__uNoneuurl(uself((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyu
__reduce__ suRequestError.__reduce__N(u__name__u
__module__u__qualname__u__doc__u__init__u
__reduce__(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyuRequestErrorsuRequestErrorcBs|EeZdZdZdS(uSSLErroru9Raised when SSL certificate fails in an HTTPS connection.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyuSSLError%suSSLErrorcBs|EeZdZdZdS(u
ProxyErroru,Raised when the connection to a proxy fails.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyu
ProxyError*su
ProxyErrorcBs|EeZdZdZdS(uConnectionErroru&Raised when a normal connection fails.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyuConnectionError/suConnectionErrorcBs|EeZdZdZdS(uDecodeErroru;Raised when automatic decoding based on Content-Type fails.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyuDecodeError4suDecodeErrorcBs)|EeZdZdZddd�ZdS(u
MaxRetryErroru6Raised when the maximum number of retries is exceeded.cCsZ||_d|}|r6|dt|�|f7}n
|d7}tj||||�dS(Nu!Max retries exceeded with url: %su (Caused by %s: %s)u (Caused by redirect)(ureasonutypeuRequestErroru__init__(uselfupooluurlureasonumessage((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyu__init__>s	

uMaxRetryError.__init__N(u__name__u
__module__u__qualname__u__doc__uNoneu__init__(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyu
MaxRetryError;su
MaxRetryErrorcBs)|EeZdZdZddd�ZdS(uHostChangedErroru?Raised when an existing pool gets a request for a foreign host.icCs-d|}tj||||�||_dS(Nu)Tried to open a foreign host with url: %s(uRequestErroru__init__uretries(uselfupooluurluretriesumessage((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyu__init__Ms
uHostChangedError.__init__N(u__name__u
__module__u__qualname__u__doc__u__init__(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyuHostChangedErrorJsuHostChangedErrorcBs|EeZdZdZdS(uTimeoutStateErroru3 Raised when passing an invalid state to a timeout N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyuTimeoutStateErrorSsuTimeoutStateErrorcBs|EeZdZdZdS(uTimeoutErroru� Raised when a socket timeout error occurs.

    Catching this error will catch both :exc:`ReadTimeoutErrors
    <ReadTimeoutError>` and :exc:`ConnectTimeoutErrors <ConnectTimeoutError>`.
    N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyuTimeoutErrorXsuTimeoutErrorcBs|EeZdZdZdS(uReadTimeoutErroruFRaised when a socket timeout occurs while receiving data from a serverN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyuReadTimeoutErrorasuReadTimeoutErrorcBs|EeZdZdZdS(uConnectTimeoutErroru@Raised when a socket timeout occurs while connecting to a serverN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyuConnectTimeoutErrorhsuConnectTimeoutErrorcBs|EeZdZdZdS(uEmptyPoolErroruCRaised when a pool runs out of connections and no more are allowed.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyuEmptyPoolErrormsuEmptyPoolErrorcBs|EeZdZdZdS(uClosedPoolErroruCRaised when a request enters a pool after the pool has been closed.N(u__name__u
__module__u__qualname__u__doc__(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyuClosedPoolErrorrsuClosedPoolErrorcBs&|EeZdZdZdd�ZdS(uLocationParseErroru=Raised when get_host or similar fails to parse the URL input.cCs'd|}tj||�||_dS(NuFailed to parse: %s(u	HTTPErroru__init__ulocation(uselfulocationumessage((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyu__init__zs
uLocationParseError.__init__N(u__name__u
__module__u__qualname__u__doc__u__init__(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyuLocationParseErrorwsuLocationParseErrorN(u	Exceptionu	HTTPErroru	PoolErroruRequestErroruSSLErroru
ProxyErroruConnectionErroruDecodeErroru
MaxRetryErroruHostChangedErroruTimeoutStateErroruTimeoutErroruReadTimeoutErroruConnectTimeoutErroruEmptyPoolErroruClosedPoolErroru
ValueErroruLocationParseError(((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/exceptions.pyu<module>
s		site-packages/pip/_vendor/requests/packages/urllib3/__pycache__/poolmanager.cpython-33.pyc000064400000025622151733463670025702 0ustar00�
7�Re#c
@sddlZyddlmZWn"ek
rDddlmZYnXddlmZddlmZm	Z	ddlm
Z
ddlmZddl
mZd	d
dgZied6e	d
6Zeje�ZdZGdd	�d	e�ZGdd
�d
e�Zdd�ZdS(iN(uurljoini(uRecentlyUsedContainer(uHTTPConnectionPooluHTTPSConnectionPool(uport_by_scheme(uRequestMethods(u	parse_urluPoolManageruProxyManageruproxy_from_urluhttpuhttpsukey_fileu	cert_fileu	cert_reqsuca_certsussl_versioncBsw|EeZdZdZdZdddd�Zdd�Zdd�Zdd	d
d�Z	dd
�Z
ddd�ZdS(uPoolManageru&
    Allows for arbitrary requests while transparently keeping track of
    necessary connection pools for you.

    :param num_pools:
        Number of connection pools to cache before discarding the least
        recently used pool.

    :param headers:
        Headers to include with all requests, unless other headers are given
        explicitly.

    :param \**connection_pool_kw:
        Additional parameters are used to create fresh
        :class:`urllib3.connectionpool.ConnectionPool` instances.

    Example: ::

        >>> manager = PoolManager(num_pools=2)
        >>> r = manager.request('GET', 'http://google.com/')
        >>> r = manager.request('GET', 'http://google.com/mail')
        >>> r = manager.request('GET', 'http://yahoo.com/')
        >>> len(manager.pools)
        2

    i
cKs8tj||�||_t|ddd��|_dS(Nudispose_funccSs
|j�S(N(uclose(up((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/poolmanager.pyu<lambda>Esu&PoolManager.__init__.<locals>.<lambda>(uRequestMethodsu__init__uconnection_pool_kwuRecentlyUsedContainerupools(uselfu	num_poolsuheadersuconnection_pool_kw((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/poolmanager.pyu__init__As		uPoolManager.__init__cCsbt|}|j}|dkrR|jj�}x!tD]}|j|d�q5Wn||||�S(u
        Create a new :class:`ConnectionPool` based on host, port and scheme.

        This method is used to actually create the connection pools handed out
        by :meth:`connection_from_url` and companion methods. It is intended
        to be overridden for customization.
        uhttpN(upool_classes_by_schemeuconnection_pool_kwucopyuSSL_KEYWORDSupopuNone(uselfuschemeuhostuportupool_clsukwargsukw((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/poolmanager.pyu	_new_poolGs
	
uPoolManager._new_poolcCs|jj�dS(u�
        Empty our store of pools and direct them all to close.

        This will not affect in-flight connections, but they will not be
        re-used after completion.
        N(upoolsuclear(uself((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/poolmanager.pyuclearXsuPoolManager.clearuhttpc
Cs�|p	d}|p!tj|d�}|||f}|jj�C|jj|�}|r\|S|j|||�}||j|<WdQX|S(u�
        Get a :class:`ConnectionPool` based on the host, port, and scheme.

        If ``port`` isn't given, it will be derived from the ``scheme`` using
        ``urllib3.connectionpool.port_by_scheme``.
        uhttpiPN(uport_by_schemeugetupoolsulocku	_new_pool(uselfuhostuportuschemeupool_keyupool((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/poolmanager.pyuconnection_from_hostas
u PoolManager.connection_from_hostcCs.t|�}|j|jd|jd|j�S(u*
        Similar to :func:`urllib3.connectionpool.connection_from_url` but
        doesn't pass any additional parameters to the
        :class:`urllib3.connectionpool.ConnectionPool` constructor.

        Additional parameters are taken from the :class:`.PoolManager`
        constructor.
        uportuscheme(u	parse_urluconnection_from_hostuhostuportuscheme(uselfuurluu((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/poolmanager.pyuconnection_from_url{s	uPoolManager.connection_from_urlc	Ks?t|�}|j|jd|jd|j�}d
|d<d
|d<d|kr`|j|d<n|jdk	r�|jdkr�|j	|||�}n|j	||j
|�}|o�|j�}|s�|St||�}|j
dkr�d}ntjd	||f�|jd
d�d|d
<||d<|j	|||�S(u]
        Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen`
        with custom cross-host redirect logic and only sends the request-uri
        portion of the ``url``.

        The given ``url`` parameter must be absolute, such that an appropriate
        :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it.
        uportuschemeuassert_same_hosturedirectuheadersuhttpi/uGETuRedirecting %s -> %suretriesiiFN(u	parse_urluconnection_from_hostuhostuportuschemeuFalseuheadersuproxyuNoneuurlopenurequest_uriuget_redirect_locationuurljoinustatusuloguinfouget(	uselfumethoduurluredirectukwuuuconnuresponseuredirect_location((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/poolmanager.pyuurlopen�s&	$

	
uPoolManager.urlopenNT(
u__name__u
__module__u__qualname__u__doc__uNoneuproxyu__init__u	_new_pooluclearuconnection_from_hostuconnection_from_urluTrueuurlopen(u
__locals__((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/poolmanager.pyuPoolManager#s	csq|EeZdZdZddd�fdd�Zdd�fdd�Zddd	�Zd
�fd
d�Z	�S(uProxyManageruw
    Behaves just like :class:`PoolManager`, but sends all requests through
    the defined proxy, using the CONNECT method for HTTPS URLs.

    :param proxy_url:
        The URL of the proxy to be used.

    :param proxy_headers:
        A dictionary contaning headers that will be sent to the proxy. In case
        of HTTP they are being sent with each request, while in the
        HTTPS/CONNECT case they are sent only once. Could be used for proxy
        authentication.

    Example:
        >>> proxy = urllib3.ProxyManager('http://localhost:3128/')
        >>> r1 = proxy.request('GET', 'http://google.com/')
        >>> r2 = proxy.request('GET', 'http://httpbin.org/')
        >>> len(proxy.pools)
        1
        >>> r3 = proxy.request('GET', 'https://httpbin.org/')
        >>> r4 = proxy.request('GET', 'https://twitter.com/')
        >>> len(proxy.pools)
        3

    i
cs�t|t�r.d|j|j|jf}nt|�}|jsmtj|jd�}|jd|�}n||_	|pi|_
|j	jd	ks�td|j	j��|j	|d<|j
|d<tt
|�j|||�dS(
Nu
%s://%s:%iiPuportuhttpuhttpsuNot supported proxy scheme %su_proxyu_proxy_headers(uhttpuhttps(u
isinstanceuHTTPConnectionPooluschemeuhostuportu	parse_urluport_by_schemeugetu_replaceuproxyu
proxy_headersuAssertionErrorusuperuProxyManageru__init__(uselfu	proxy_urlu	num_poolsuheadersu
proxy_headersuconnection_pool_kwuproxyuport(u	__class__(uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/poolmanager.pyu__init__�s		

uProxyManager.__init__uhttpcsV|dkr(tt|�j|||�Stt|�j|jj|jj|jj�S(Nuhttps(usuperuProxyManageruconnection_from_hostuproxyuhostuportuscheme(uselfuhostuportuscheme(u	__class__(uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/poolmanager.pyuconnection_from_host�s

u!ProxyManager.connection_from_hostcCsIidd6}t|�j}|r/||d<n|rE|j|�n|S(u�
        Sets headers needed by proxies: specifically, the Accept and Host
        headers. Only sets headers not provided by the user.
        u*/*uAcceptuHost(u	parse_urlunetlocuupdate(uselfuurluheadersuheaders_unetloc((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/poolmanager.pyu_set_proxy_headers�s

uProxyManager._set_proxy_headerscsbt|�}|jdkrC|j||jd|j��|d<ntt|�j||||�S(u@Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute.uhttpuheaders(u	parse_urluschemeu_set_proxy_headersugetuheadersusuperuProxyManageruurlopen(uselfumethoduurluredirectukwuu(u	__class__(uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/poolmanager.pyuurlopen�s
uProxyManager.urlopenNT(
u__name__u
__module__u__qualname__u__doc__uNoneu__init__uconnection_from_hostu_set_proxy_headersuTrueuurlopen(u
__locals__((u	__class__uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/poolmanager.pyuProxyManager�scKstd||�S(Nu	proxy_url(uProxyManager(uurlukw((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/poolmanager.pyuproxy_from_urls(ukey_fileu	cert_fileu	cert_reqsuca_certsussl_version(ulogginguurllib.parseuurljoinuImportErroruurlparseu_collectionsuRecentlyUsedContaineruconnectionpooluHTTPConnectionPooluHTTPSConnectionPooluport_by_schemeurequestuRequestMethodsuutilu	parse_urlu__all__upool_classes_by_schemeu	getLoggeru__name__uloguSSL_KEYWORDSuPoolManageruProxyManageruproxy_from_url(((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/poolmanager.pyu<module>s&

�Ssite-packages/pip/_vendor/requests/packages/urllib3/__pycache__/filepost.cpython-33.pyc000064400000007250151733463670025220 0ustar00�
7�Re�	c@s�ddlZddlZddlmZddlmZddlmZddlm	Z	ddl
mZejd�d	Z
d
d�Zdd
�Zdd�Zddd�ZdS(iN(uuuid4(uBytesIOi(usix(ub(uRequestFielduutf-8icCs
t�jS(uM
    Our embarassingly-simple replacement for mimetools.choose_boundary.
    (uuuid4uhex(((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/filepost.pyuchoose_boundarysuchoose_boundaryccsgt|t�r!tj|�}nt|�}x3|D]+}t|t�rQ|Vq4tj|�Vq4WdS(u�
    Iterate over fields.

    Supports list of (k, v) tuples and dicts, and lists of
    :class:`~urllib3.fields.RequestField`.

    N(u
isinstanceudictusixu	iteritemsuiteruRequestFieldufrom_tuples(ufieldsuiufield((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/filepost.pyuiter_field_objectss
uiter_field_objectscCs:t|t�r)dd�tj|�D�Sdd�|D�S(u-
    .. deprecated:: 1.6

    Iterate over fields.

    The addition of :class:`~urllib3.fields.RequestField` makes this function
    obsolete. Instead, use :func:`iter_field_objects`, which returns
    :class:`~urllib3.fields.RequestField` objects.

    Supports list of (k, v) tuples and dicts.
    css!|]\}}||fVqdS(N((u.0ukuv((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/filepost.pyu	<genexpr><suiter_fields.<locals>.<genexpr>css!|]\}}||fVqdS(N((u.0ukuv((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/filepost.pyu	<genexpr>>s(u
isinstanceudictusixu	iteritems(ufields((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/filepost.pyuiter_fields/suiter_fieldscCst�}|dkr!t�}nx�t|�D]�}|jtd|��t|�j|j��|j}t	|t
�r�t|�}nt	|tj
�r�t|�j|�n
|j|�|jd�q.W|jtd|��td|�}|j�|fS(uJ
    Encode a dictionary of ``fields`` using the multipart/form-data MIME format.

    :param fields:
        Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`).

    :param boundary:
        If not specified, then a random boundary will be generated using
        :func:`mimetools.choose_boundary`.
    u--%s
s
u--%s--
u multipart/form-data; boundary=%sN(uBytesIOuNoneuchoose_boundaryuiter_field_objectsuwriteubuwriterurender_headersudatau
isinstanceuintustrusixu	text_typeugetvalue(ufieldsuboundaryubodyufieldudataucontent_type((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/filepost.pyuencode_multipart_formdataAs 		
uencode_multipart_formdata(ucodecsu	mimetypesuuuiduuuid4uiouBytesIOupackagesusixupackages.sixubufieldsuRequestFieldulookupuwriteruchoose_boundaryuiter_field_objectsuiter_fieldsuNoneuencode_multipart_formdata(((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/filepost.pyu<module>ssite-packages/pip/_vendor/requests/packages/urllib3/__pycache__/connectionpool.cpython-33.pyc000064400000057544151733463670026437 0ustar00�
7�Reic
@sddlZddlZddlZddlmZmZddlZy ddlm	Z	m
Z
mZWn:ek
r�ddl
m	Z	m
Z
mZddl
ZYnXddlmZmZmZmZmZmZmZmZmZmZmZddlmZddlmZddlm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&dd	l'm(Z(dd
l)m*Z*ddl+m,Z,m-Z-m.Z.ej/j0Z0ej1e2�Z3e4�Z5Gdd
�d
e4�Z6e7ej8ej9g�Z:Gdd�de6e(�Z;Gdd�de;�Z<dd�Z=dS(iN(uerrorutimeout(u	LifoQueueuEmptyuFulli(uClosedPoolErroruConnectionErroruConnectTimeoutErroruEmptyPoolErroruHostChangedErroruLocationParseErroru
MaxRetryErroruSSLErroruTimeoutErroruReadTimeoutErroru
ProxyError(uCertificateError(usix(uport_by_schemeuDummyConnectionuHTTPConnectionuHTTPSConnectionuVerifiedHTTPSConnectionu
HTTPExceptionuBaseSSLError(uRequestMethods(uHTTPResponse(uget_hostuis_connection_droppeduTimeoutcBsA|EeZdZdZdZeZddd�Zdd�Z	dS(uConnectionPooluz
    Base class for all connection pools, such as
    :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`.
    cCs@|dkrt|��n|jd�}||_||_dS(Nu[](uNoneuLocationParseErrorustripuhostuport(uselfuhostuport((uM/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connectionpool.pyu__init__Ds
	uConnectionPool.__init__cCs dt|�j|j|jfS(Nu%s(host=%r, port=%r)(utypeu__name__uhostuport(uself((uM/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connectionpool.pyu__str__NsuConnectionPool.__str__N(
u__name__u
__module__u__qualname__u__doc__uNoneuschemeu	LifoQueueuQueueClsu__init__u__str__(u
__locals__((uM/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connectionpool.pyuConnectionPool;s

uConnectionPoolc
Bs�|EeZdZdZdZeZdde	j
ddddddd�Zdd�Zddd	�Z
d
d�Zdd
�Zedd�Zdd�Zdd�Zdddddedddd�ZdS(uHTTPConnectionPoolu5
    Thread-safe connection pool for one host.

    :param host:
        Host used for this HTTP Connection (e.g. "localhost"), passed into
        :class:`httplib.HTTPConnection`.

    :param port:
        Port used for this HTTP Connection (None is equivalent to 80), passed
        into :class:`httplib.HTTPConnection`.

    :param strict:
        Causes BadStatusLine to be raised if the status line can't be parsed
        as a valid HTTP/1.0 or 1.1 status line, passed into
        :class:`httplib.HTTPConnection`.

        .. note::
           Only works in Python 2. This parameter is ignored in Python 3.

    :param timeout:
        Socket timeout in seconds for each individual connection. This can
        be a float or integer, which sets the timeout for the HTTP request,
        or an instance of :class:`urllib3.util.Timeout` which gives you more
        fine-grained control over request timeouts. After the constructor has
        been parsed, this is always a `urllib3.util.Timeout` object.

    :param maxsize:
        Number of connections to save that can be reused. More than 1 is useful
        in multithreaded situations. If ``block`` is set to false, more
        connections will be created but they will not be saved once they've
        been used.

    :param block:
        If set to True, no more than ``maxsize`` connections will be used at
        a time. When no free connections are available, the call will block
        until a connection has been released. This is a useful side effect for
        particular multithreaded situations where one does not want to use more
        than maxsize connections per host to prevent flooding.

    :param headers:
        Headers to include with all requests, unless other headers are given
        explicitly.

    :param _proxy:
        Parsed proxy URL, should not be used directly, instead, see
        :class:`urllib3.connectionpool.ProxyManager`"

    :param _proxy_headers:
        A dictionary with proxy headers, should not be used directly,
        instead, see :class:`urllib3.connectionpool.ProxyManager`"
    uhttpic
Ks�tj|||�tj||�||_t|t�sMtj|�}n||_|j|�|_	||_
||_|	p�i|_x$t
|�D]}|j	jd�q�Wd|_d|_tjdkr�|
jdd�n|
|_dS(Niiiusource_address(ii(uConnectionPoolu__init__uRequestMethodsustrictu
isinstanceuTimeoutu
from_floatutimeoutuQueueClsupoolublockuproxyu
proxy_headersuxrangeuputuNoneunum_connectionsunum_requestsusysuversion_infoupopuconn_kw(uselfuhostuportustrictutimeoutumaxsizeublockuheadersu_proxyu_proxy_headersuconn_kwu_((uM/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connectionpool.pyu__init__�s"						uHTTPConnectionPool.__init__c
Cs�|jd7_tjd|j|jf�|jd|jd|jd|jjd|j|j	�}|j
dk	r�d|_n|S(	u9
        Return a fresh :class:`HTTPConnection`.
        iu%Starting new HTTP connection (%d): %suhostuportutimeoutustrictiN(
unum_connectionsuloguinfouhostu
ConnectionClsuportutimeoutuconnect_timeoutustrictuconn_kwuproxyuNoneutcp_nodelay(uselfuconn((uM/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connectionpool.pyu	_new_conn�s	uHTTPConnectionPool._new_conncCs�d}y"|jjd|jd|�}WnMtk
rKt|d��Yn-tk
rw|jrst|d��nYnX|r�t|�r�t	j
d|j�|j�n|p�|j
�S(u�
        Get a connection. Will return a pooled connection if one is available.

        If no connections are available and :prop:`.block` is ``False``, then a
        fresh connection is returned.

        :param timeout:
            Seconds to wait before giving up and raising
            :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and
            :prop:`.block` is ``True``.
        ublockutimeoutuPool is closed.u>Pool reached maximum size and no more connections are allowed.u Resetting dropped connection: %sN(uNoneupoolugetublockuAttributeErroruClosedPoolErroruEmptyuEmptyPoolErroruis_connection_droppeduloguinfouhostucloseu	_new_conn(uselfutimeoutuconn((uM/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connectionpool.pyu	_get_conn�s"

	
uHTTPConnectionPool._get_conncCsoy|jj|dd�dSWn7tk
r2Yn&tk
rWtjd|j�YnX|rk|j�ndS(u�
        Put a connection back into the pool.

        :param conn:
            Connection object for the current host and port as returned by
            :meth:`._new_conn` or :meth:`._get_conn`.

        If the pool is already full, the connection is closed and discarded
        because we exceeded maxsize. If connections are discarded frequently,
        then maxsize should be increased.

        If the pool is closed, then the connection will be closed and discarded.
        ublockNu2Connection pool is full, discarding connection: %sF(	upooluputuFalseuAttributeErroruFulluloguwarninguhostuclose(uselfuconn((uM/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connectionpool.pyu	_put_conn�s

uHTTPConnectionPool._put_conncCsC|tkr|jj�St|t�r2|j�Stj|�SdS(u< Helper that always returns a :class:`urllib3.util.Timeout` N(u_Defaultutimeoutucloneu
isinstanceuTimeoutu
from_float(uselfutimeout((uM/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connectionpool.pyu_get_timeout�s


uHTTPConnectionPool._get_timeoutcKsH|jd7_|j|�}y-|j�|j|_|j|||�Wn1tk
r~t|d|j|jf��YnX|j	}t
|d�r�|dkr�t||d|��n|tj
kr�|jjtj��q�|jj|�ny;y|jdd�}Wntk
r0|j�}YnXWn�tk
r\t||d|��Yn�tk
r�}	zAdt|	�ks�dt|	�kr�t||d	��n�WYd
d
}	~	XnPtk
r}	z0|	jtkr�t||d|��n�WYd
d
}	~	XnXt|dd�}
tjd
|||
|j|jf�|S(u
        Perform a request on a given urllib connection object taken from our
        pool.

        :param conn:
            a connection from one of our connection pools

        :param timeout:
            Socket timeout in seconds for the request. This can be a
            float or integer, which will set the same timeout value for
            the socket connect and the socket read, or an instance of
            :class:`urllib3.util.Timeout`, which gives you more fine-grained
            control over your timeouts.
        iu0Connection to %s timed out. (connect timeout=%s)usockiu!Read timed out. (read timeout=%s)u	bufferingu	timed outudid not complete (read)uRead timed out.Nu
_http_vsn_struHTTP/?u"%s %s %s" %s %sT(unum_requestsu_get_timeoutu
start_connectuconnect_timeoututimeouturequestu
SocketTimeoutuConnectTimeoutErroruhosturead_timeoutuhasattruReadTimeoutErroruTimeoutuDEFAULT_TIMEOUTusocku
settimeoutusocketugetdefaulttimeoutugetresponseuTrueu	TypeErroruBaseSSLErrorustruSocketErroruerrnou_blocking_errnosugetattrulogudebugustatusulength(uselfuconnumethoduurlutimeoutuhttplib_request_kwutimeout_objuread_timeoutuhttplib_responseueuhttp_version((uM/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connectionpool.pyu
_make_request
sV

	

u HTTPConnectionPool._make_requestcCs[|jd}|_y/x(|jdd�}|r|j�qqWntk
rVYnXdS(uD
        Close all pooled connections and disable the pool.
        ublockNF(upooluNoneugetuFalseucloseuEmpty(uselfuold_pooluconn((uM/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connectionpool.pyucloseas
uHTTPConnectionPool.closecCs�|jd�rdSt|�\}}}|jrJ|rJtj|�}n(|jrr|tj|�krrd}n|||f|j|j|jfkS(uj
        Check if the given ``url`` is a member of the same host as this
        connection pool.
        u/TN(	u
startswithuTrueuget_hostuportuport_by_schemeugetuNoneuschemeuhost(uselfuurluschemeuhostuport((uM/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connectionpool.pyuis_same_hostqs	uHTTPConnectionPool.is_same_hostic'Ks]|dkr|j}n|dkrB|dk	rBt||��n|
dkrc|jdd�}
n|r�|j|�r�t|||d��nd}|jdkr�|j	�}|j
|j�nd}
z�yh|jd|	�}|j
|||d|d|d|�}|
o|}tj|d|d	||�}Wn!tk
rZt|d
��Ynttfk
r�}zd}
t|��WYdd}~Xn�tttfk
rZ}z�|r�|j�d}n|sBt|t�r��nt|t�r|jrtd|��n|dkr-td
|��nt|||��n|}
WYdd}~XnXWd|
ru|j|�nX|s�tjd||
|f�|j |||||d||d|d|	d|
|�S|o�|j!�}|rY|dk	rY|j"dkr
d}ntj#d||f�|j |||||d||d|d|	d|
|�S|S(u�
        Get a connection from the pool and perform an HTTP request. This is the
        lowest level call for making a request, so you'll need to specify all
        the raw details.

        .. note::

           More commonly, it's appropriate to use a convenience method provided
           by :class:`.RequestMethods`, such as :meth:`request`.

        .. note::

           `release_conn` will only behave as expected if
           `preload_content=False` because we want to make
           `preload_content=False` the default behaviour someday soon without
           breaking backwards compatibility.

        :param method:
            HTTP request method (such as GET, POST, PUT, etc.)

        :param body:
            Data to send in the request body (useful for creating
            POST requests, see HTTPConnectionPool.post_url for
            more convenience).

        :param headers:
            Dictionary of custom headers to send, such as User-Agent,
            If-None-Match, etc. If None, pool headers are used. If provided,
            these headers completely replace any pool-specific headers.

        :param retries:
            Number of retries to allow before raising a MaxRetryError exception.
            If `False`, then retries are disabled and any exception is raised
            immediately.

        :param redirect:
            If True, automatically handle redirects (status codes 301, 302,
            303, 307, 308). Each redirect counts as a retry. Disabling retries
            will disable redirect, too.

        :param assert_same_host:
            If ``True``, will make sure that the host of the pool requests is
            consistent else will raise HostChangedError. When False, you can
            use the pool on an HTTP proxy and request foreign hosts.

        :param timeout:
            If specified, overrides the default timeout for this one
            request. It may be a float (in seconds) or an instance of
            :class:`urllib3.util.Timeout`.

        :param pool_timeout:
            If set and the pool is set to block=True, then this method will
            block for ``pool_timeout`` seconds and raise EmptyPoolError if no
            connection is available within the time period.

        :param release_conn:
            If False, then the urlopen call will not release the connection
            back into the pool once a response is received (but will release if
            you read the entire contents of the response such as when
            `preload_content=True`). This is useful if you're not preloading
            the response's content immediately. You will need to call
            ``r.release_conn()`` on the response ``r`` to return the connection
            back into the pool. If None, it takes the value of
            ``response_kw.get('preload_content', True)``.

        :param \**response_kw:
            Additional parameters are passed to
            :meth:`urllib3.response.HTTPResponse.from_httplib`
        iupreload_contentiuhttputimeoutubodyuheadersupoolu
connectionu"No pool connections are available.NuCannot connect to proxy.uConnection failed.uARetrying (%d attempts remain) after connection broken by '%r': %supool_timeouturelease_conni/uGETuRedirecting %s -> %sFT($uNoneuheadersuFalseu
MaxRetryErrorugetuTrueuis_same_hostuHostChangedErroruschemeucopyuupdateu
proxy_headersu	_get_connu
_make_requestuHTTPResponseufrom_httplibuEmptyuEmptyPoolErroruBaseSSLErroruCertificateErroruSSLErroruTimeoutErroru
HTTPExceptionuSocketErrorucloseu
isinstanceuproxyu
ProxyErroruConnectionErroru	_put_connuloguwarninguurlopenuget_redirect_locationustatusuinfo(uselfumethoduurlubodyuheadersuretriesuredirectuassert_same_hostutimeoutupool_timeouturelease_connuresponse_kwuconnuerruhttplib_responseu
response_connuresponseueuredirect_location((uM/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connectionpool.pyuurlopen�sxH



			
	
uHTTPConnectionPool.urlopenNFT(u__name__u
__module__u__qualname__u__doc__uschemeuHTTPConnectionu
ConnectionClsuNoneuFalseuTimeoutuDEFAULT_TIMEOUTu__init__u	_new_connu	_get_connu	_put_connu_get_timeoutu_Defaultu
_make_requestucloseuis_same_hostuTrueuurlopen(u
__locals__((uM/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connectionpool.pyuHTTPConnectionPoolUs 3!W		uHTTPConnectionPoolcBsw|EeZdZdZdZeZd
dd
ddd
d
d
d
d
d
d
d
d
d
dd�Z	dd�Z
dd	�Zd
S(uHTTPSConnectionPoolu�
    Same as :class:`.HTTPConnectionPool`, but HTTPS.

    When Python is compiled with the :mod:`ssl` module, then
    :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates,
    instead of :class:`.HTTPSConnection`.

    :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``,
    ``assert_hostname`` and ``host`` in this order to verify connections.
    If ``assert_hostname`` is False, no verification is done.

    The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs`` and
    ``ssl_version`` are only used if :mod:`ssl` is available and are fed into
    :meth:`urllib3.util.ssl_wrap_socket` to upgrade the connection socket
    into an SSL socket.
    uhttpsicKs�tjdkr"|jdd�ntj||||||||||	|�
|
|_||_||_|
|_	||_
||_||_||_
dS(Niiusource_address(ii(usysuversion_infoupopuNoneuHTTPConnectionPoolu__init__ukey_fileu	cert_fileu	cert_reqsuca_certsussl_versionuassert_hostnameuassert_fingerprintuconn_kw(uselfuhostuportustrictutimeoutumaxsizeublockuheadersu_proxyu_proxy_headersukey_fileu	cert_fileu	cert_reqsuca_certsussl_versionuassert_hostnameuassert_fingerprintuconn_kw((uM/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connectionpool.pyu__init__Ws								uHTTPSConnectionPool.__init__c
Cs�t|t�rj|jd|jd|jd|jd|jd|jd|j�|j	|_	|j
|_
n|jdk	r�y
|j
}Wntk
r�|j}YnX||j|j|j�|j�n|S(u�
        Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket`
        and establish the tunnel if proxy is used.
        ukey_fileu	cert_fileu	cert_reqsuca_certsuassert_hostnameuassert_fingerprintN(u
isinstanceuVerifiedHTTPSConnectionuset_certukey_fileu	cert_fileu	cert_reqsuca_certsuassert_hostnameuassert_fingerprintussl_versionuconn_kwuproxyuNoneu
set_tunneluAttributeErroru_set_tunneluhostuportu
proxy_headersuconnect(uselfuconnu
set_tunnel((uM/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connectionpool.pyu
_prepare_connns"				



u!HTTPSConnectionPool._prepare_connc	Cs|jd7_tjd|j|jf�|jsE|jtkrTtd��n|j}|j}|jd	k	r�|jj}|jj}ni}t
js�|j|d<n|j
|j�|jd|d|d|jj|�}|jd	k	rd|_n|j|�S(
uB
        Return a fresh :class:`httplib.HTTPSConnection`.
        iu&Starting new HTTPS connection (%d): %suCCan't connect to HTTPS URL because the SSL module is not available.ustrictuhostuportutimeoutiN(unum_connectionsuloguinfouhostu
ConnectionClsuDummyConnectionuSSLErroruportuproxyuNoneusixuPY3ustrictuupdateuconn_kwutimeoutuconnect_timeoututcp_nodelayu
_prepare_conn(uselfuactual_hostuactual_portuextra_paramsuconn((uM/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connectionpool.pyu	_new_conn�s(						uHTTPSConnectionPool._new_connNF(u__name__u
__module__u__qualname__u__doc__uschemeuHTTPSConnectionu
ConnectionClsuNoneuFalseu__init__u
_prepare_connu	_new_conn(u
__locals__((uM/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connectionpool.pyuHTTPSConnectionPoolBs		uHTTPSConnectionPoolcKsKt|�\}}}|dkr4t|d||�St|d||�SdS(u�
    Given a url, return an :class:`.ConnectionPool` instance of its host.

    This is a shortcut for not having to parse out the scheme, host, and port
    of the url before creating an :class:`.ConnectionPool` instance.

    :param url:
        Absolute URL string that must include the scheme. Port is optional.

    :param \**kw:
        Passes additional parameters to the constructor of the appropriate
        :class:`.ConnectionPool`. Useful for specifying things like
        timeout, maxsize, headers, etc.

    Example: ::

        >>> conn = connection_from_url('http://google.com/')
        >>> r = conn.request('GET', '/')
    uhttpsuportN(uget_hostuHTTPSConnectionPooluHTTPConnectionPool(uurlukwuschemeuhostuport((uM/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connectionpool.pyuconnection_from_url�suconnection_from_url(>usysuerrnouloggingusocketuerroruSocketErrorutimeoutu
SocketTimeoutuqueueu	LifoQueueuEmptyuFulluImportErroruQueueu_u
exceptionsuClosedPoolErroruConnectionErroruConnectTimeoutErroruEmptyPoolErroruHostChangedErroruLocationParseErroru
MaxRetryErroruSSLErroruTimeoutErroruReadTimeoutErroru
ProxyErrorupackages.ssl_match_hostnameuCertificateErrorupackagesusixu
connectionuport_by_schemeuDummyConnectionuHTTPConnectionuHTTPSConnectionuVerifiedHTTPSConnectionu
HTTPExceptionuBaseSSLErrorurequestuRequestMethodsuresponseuHTTPResponseuutiluget_hostuis_connection_droppeduTimeoutumovesuxrangeu	getLoggeru__name__uloguobjectu_DefaultuConnectionPoolusetuEAGAINuEWOULDBLOCKu_blocking_errnosuHTTPConnectionPooluHTTPSConnectionPooluconnection_from_url(((uM/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/connectionpool.pyu<module>s2 
L
4	��lsite-packages/pip/_vendor/requests/packages/urllib3/response.py000064400000024153151733463670020751 0ustar00# urllib3/response.py
# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
#
# This module is part of urllib3 and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php


import logging
import zlib
import io

from ._collections import HTTPHeaderDict
from .exceptions import DecodeError
from .packages.six import string_types as basestring, binary_type
from .util import is_fp_closed


log = logging.getLogger(__name__)


class DeflateDecoder(object):

    def __init__(self):
        self._first_try = True
        self._data = binary_type()
        self._obj = zlib.decompressobj()

    def __getattr__(self, name):
        return getattr(self._obj, name)

    def decompress(self, data):
        if not self._first_try:
            return self._obj.decompress(data)

        self._data += data
        try:
            return self._obj.decompress(data)
        except zlib.error:
            self._first_try = False
            self._obj = zlib.decompressobj(-zlib.MAX_WBITS)
            try:
                return self.decompress(self._data)
            finally:
                self._data = None


def _get_decoder(mode):
    if mode == 'gzip':
        return zlib.decompressobj(16 + zlib.MAX_WBITS)

    return DeflateDecoder()


class HTTPResponse(io.IOBase):
    """
    HTTP Response container.

    Backwards-compatible to httplib's HTTPResponse but the response ``body`` is
    loaded and decoded on-demand when the ``data`` property is accessed.

    Extra parameters for behaviour not present in httplib.HTTPResponse:

    :param preload_content:
        If True, the response's body will be preloaded during construction.

    :param decode_content:
        If True, attempts to decode specific content-encoding's based on headers
        (like 'gzip' and 'deflate') will be skipped and raw data will be used
        instead.

    :param original_response:
        When this HTTPResponse wrapper is generated from an httplib.HTTPResponse
        object, it's convenient to include the original for debug purposes. It's
        otherwise unused.
    """

    CONTENT_DECODERS = ['gzip', 'deflate']
    REDIRECT_STATUSES = [301, 302, 303, 307, 308]

    def __init__(self, body='', headers=None, status=0, version=0, reason=None,
                 strict=0, preload_content=True, decode_content=True,
                 original_response=None, pool=None, connection=None):

        self.headers = HTTPHeaderDict()
        if headers:
            self.headers.update(headers)
        self.status = status
        self.version = version
        self.reason = reason
        self.strict = strict
        self.decode_content = decode_content

        self._decoder = None
        self._body = body if body and isinstance(body, basestring) else None
        self._fp = None
        self._original_response = original_response
        self._fp_bytes_read = 0

        self._pool = pool
        self._connection = connection

        if hasattr(body, 'read'):
            self._fp = body

        if preload_content and not self._body:
            self._body = self.read(decode_content=decode_content)

    def get_redirect_location(self):
        """
        Should we redirect and where to?

        :returns: Truthy redirect location string if we got a redirect status
            code and valid location. ``None`` if redirect status and no
            location. ``False`` if not a redirect status code.
        """
        if self.status in self.REDIRECT_STATUSES:
            return self.headers.get('location')

        return False

    def release_conn(self):
        if not self._pool or not self._connection:
            return

        self._pool._put_conn(self._connection)
        self._connection = None

    @property
    def data(self):
        # For backwords-compat with earlier urllib3 0.4 and earlier.
        if self._body:
            return self._body

        if self._fp:
            return self.read(cache_content=True)

    def tell(self):
        """
        Obtain the number of bytes pulled over the wire so far. May differ from
        the amount of content returned by :meth:``HTTPResponse.read`` if bytes
        are encoded on the wire (e.g, compressed).
        """
        return self._fp_bytes_read

    def read(self, amt=None, decode_content=None, cache_content=False):
        """
        Similar to :meth:`httplib.HTTPResponse.read`, but with two additional
        parameters: ``decode_content`` and ``cache_content``.

        :param amt:
            How much of the content to read. If specified, caching is skipped
            because it doesn't make sense to cache partial content as the full
            response.

        :param decode_content:
            If True, will attempt to decode the body based on the
            'content-encoding' header.

        :param cache_content:
            If True, will save the returned data such that the same result is
            returned despite of the state of the underlying file object. This
            is useful if you want the ``.data`` property to continue working
            after having ``.read()`` the file object. (Overridden if ``amt`` is
            set.)
        """
        # Note: content-encoding value should be case-insensitive, per RFC 2616
        # Section 3.5
        content_encoding = self.headers.get('content-encoding', '').lower()
        if self._decoder is None:
            if content_encoding in self.CONTENT_DECODERS:
                self._decoder = _get_decoder(content_encoding)
        if decode_content is None:
            decode_content = self.decode_content

        if self._fp is None:
            return

        flush_decoder = False

        try:
            if amt is None:
                # cStringIO doesn't like amt=None
                data = self._fp.read()
                flush_decoder = True
            else:
                cache_content = False
                data = self._fp.read(amt)
                if amt != 0 and not data:  # Platform-specific: Buggy versions of Python.
                    # Close the connection when no data is returned
                    #
                    # This is redundant to what httplib/http.client _should_
                    # already do.  However, versions of python released before
                    # December 15, 2012 (http://bugs.python.org/issue16298) do not
                    # properly close the connection in all cases. There is no harm
                    # in redundantly calling close.
                    self._fp.close()
                    flush_decoder = True

            self._fp_bytes_read += len(data)

            try:
                if decode_content and self._decoder:
                    data = self._decoder.decompress(data)
            except (IOError, zlib.error) as e:
                raise DecodeError(
                    "Received response with content-encoding: %s, but "
                    "failed to decode it." % content_encoding,
                    e)

            if flush_decoder and decode_content and self._decoder:
                buf = self._decoder.decompress(binary_type())
                data += buf + self._decoder.flush()

            if cache_content:
                self._body = data

            return data

        finally:
            if self._original_response and self._original_response.isclosed():
                self.release_conn()

    def stream(self, amt=2**16, decode_content=None):
        """
        A generator wrapper for the read() method. A call will block until
        ``amt`` bytes have been read from the connection or until the
        connection is closed.

        :param amt:
            How much of the content to read. The generator will return up to
            much data per iteration, but may return less. This is particularly
            likely when using compressed data. However, the empty string will
            never be returned.

        :param decode_content:
            If True, will attempt to decode the body based on the
            'content-encoding' header.
        """
        while not is_fp_closed(self._fp):
            data = self.read(amt=amt, decode_content=decode_content)

            if data:
                yield data


    @classmethod
    def from_httplib(ResponseCls, r, **response_kw):
        """
        Given an :class:`httplib.HTTPResponse` instance ``r``, return a
        corresponding :class:`urllib3.response.HTTPResponse` object.

        Remaining parameters are passed to the HTTPResponse constructor, along
        with ``original_response=r``.
        """

        headers = HTTPHeaderDict()
        for k, v in r.getheaders():
            headers.add(k, v)

        # HTTPResponse objects in Python 3 don't have a .strict attribute
        strict = getattr(r, 'strict', 0)
        return ResponseCls(body=r,
                           headers=headers,
                           status=r.status,
                           version=r.version,
                           reason=r.reason,
                           strict=strict,
                           original_response=r,
                           **response_kw)

    # Backwards-compatibility methods for httplib.HTTPResponse
    def getheaders(self):
        return self.headers

    def getheader(self, name, default=None):
        return self.headers.get(name, default)

    # Overrides from io.IOBase
    def close(self):
        if not self.closed:
            self._fp.close()

    @property
    def closed(self):
        if self._fp is None:
            return True
        elif hasattr(self._fp, 'closed'):
            return self._fp.closed
        elif hasattr(self._fp, 'isclosed'):  # Python 2
            return self._fp.isclosed()
        else:
            return True

    def fileno(self):
        if self._fp is None:
            raise IOError("HTTPResponse has no file to get a fileno from")
        elif hasattr(self._fp, "fileno"):
            return self._fp.fileno()
        else:
            raise IOError("The file-like object  this HTTPResponse is wrapped "
                          "around has no file descriptor")

    def flush(self):
        if self._fp is not None and hasattr(self._fp, 'flush'):
            return self._fp.flush()

    def readable(self):
        return True
site-packages/pip/_vendor/requests/packages/urllib3/fields.py000064400000013530151733463700020350 0ustar00# urllib3/fields.py
# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
#
# This module is part of urllib3 and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php

import email.utils
import mimetypes

from .packages import six


def guess_content_type(filename, default='application/octet-stream'):
    """
    Guess the "Content-Type" of a file.

    :param filename:
        The filename to guess the "Content-Type" of using :mod:`mimetypes`.
    :param default:
        If no "Content-Type" can be guessed, default to `default`.
    """
    if filename:
        return mimetypes.guess_type(filename)[0] or default
    return default


def format_header_param(name, value):
    """
    Helper function to format and quote a single header parameter.

    Particularly useful for header parameters which might contain
    non-ASCII values, like file names. This follows RFC 2231, as
    suggested by RFC 2388 Section 4.4.

    :param name:
        The name of the parameter, a string expected to be ASCII only.
    :param value:
        The value of the parameter, provided as a unicode string.
    """
    if not any(ch in value for ch in '"\\\r\n'):
        result = '%s="%s"' % (name, value)
        try:
            result.encode('ascii')
        except UnicodeEncodeError:
            pass
        else:
            return result
    if not six.PY3:  # Python 2:
        value = value.encode('utf-8')
    value = email.utils.encode_rfc2231(value, 'utf-8')
    value = '%s*=%s' % (name, value)
    return value


class RequestField(object):
    """
    A data container for request body parameters.

    :param name:
        The name of this request field.
    :param data:
        The data/value body.
    :param filename:
        An optional filename of the request field.
    :param headers:
        An optional dict-like object of headers to initially use for the field.
    """
    def __init__(self, name, data, filename=None, headers=None):
        self._name = name
        self._filename = filename
        self.data = data
        self.headers = {}
        if headers:
            self.headers = dict(headers)

    @classmethod
    def from_tuples(cls, fieldname, value):
        """
        A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters.

        Supports constructing :class:`~urllib3.fields.RequestField` from parameter
        of key/value strings AND key/filetuple. A filetuple is a (filename, data, MIME type)
        tuple where the MIME type is optional. For example: ::

            'foo': 'bar',
            'fakefile': ('foofile.txt', 'contents of foofile'),
            'realfile': ('barfile.txt', open('realfile').read()),
            'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'),
            'nonamefile': 'contents of nonamefile field',

        Field names and filenames must be unicode.
        """
        if isinstance(value, tuple):
            if len(value) == 3:
                filename, data, content_type = value
            else:
                filename, data = value
                content_type = guess_content_type(filename)
        else:
            filename = None
            content_type = None
            data = value

        request_param = cls(fieldname, data, filename=filename)
        request_param.make_multipart(content_type=content_type)

        return request_param

    def _render_part(self, name, value):
        """
        Overridable helper function to format a single header parameter.

        :param name:
            The name of the parameter, a string expected to be ASCII only.
        :param value:
            The value of the parameter, provided as a unicode string.
        """
        return format_header_param(name, value)

    def _render_parts(self, header_parts):
        """
        Helper function to format and quote a single header.

        Useful for single headers that are composed of multiple items. E.g.,
        'Content-Disposition' fields.

        :param header_parts:
            A sequence of (k, v) typles or a :class:`dict` of (k, v) to format as
            `k1="v1"; k2="v2"; ...`.
        """
        parts = []
        iterable = header_parts
        if isinstance(header_parts, dict):
            iterable = header_parts.items()

        for name, value in iterable:
            if value:
                parts.append(self._render_part(name, value))

        return '; '.join(parts)

    def render_headers(self):
        """
        Renders the headers for this request field.
        """
        lines = []

        sort_keys = ['Content-Disposition', 'Content-Type', 'Content-Location']
        for sort_key in sort_keys:
            if self.headers.get(sort_key, False):
                lines.append('%s: %s' % (sort_key, self.headers[sort_key]))

        for header_name, header_value in self.headers.items():
            if header_name not in sort_keys:
                if header_value:
                    lines.append('%s: %s' % (header_name, header_value))

        lines.append('\r\n')
        return '\r\n'.join(lines)

    def make_multipart(self, content_disposition=None, content_type=None, content_location=None):
        """
        Makes this request field into a multipart request field.

        This method overrides "Content-Disposition", "Content-Type" and
        "Content-Location" headers to the request parameter.

        :param content_type:
            The 'Content-Type' of the request body.
        :param content_location:
            The 'Content-Location' of the request body.

        """
        self.headers['Content-Disposition'] = content_disposition or 'form-data'
        self.headers['Content-Disposition'] += '; '.join(['', self._render_parts((('name', self._name), ('filename', self._filename)))])
        self.headers['Content-Type'] = content_type
        self.headers['Content-Location'] = content_location
site-packages/pip/_vendor/requests/packages/urllib3/__init__.py000064400000003245151733463700020643 0ustar00# urllib3/__init__.py
# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
#
# This module is part of urllib3 and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php

"""
urllib3 - Thread-safe connection pooling and re-using.
"""

__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)'
__license__ = 'MIT'
__version__ = 'dev'


from .connectionpool import (
    HTTPConnectionPool,
    HTTPSConnectionPool,
    connection_from_url
)

from . import exceptions
from .filepost import encode_multipart_formdata
from .poolmanager import PoolManager, ProxyManager, proxy_from_url
from .response import HTTPResponse
from .util import make_headers, get_host, Timeout


# Set default logging handler to avoid "No handler found" warnings.
import logging
try:  # Python 2.7+
    from logging import NullHandler
except ImportError:
    class NullHandler(logging.Handler):
        def emit(self, record):
            pass

logging.getLogger(__name__).addHandler(NullHandler())

def add_stderr_logger(level=logging.DEBUG):
    """
    Helper for quickly adding a StreamHandler to the logger. Useful for
    debugging.

    Returns the handler after adding it.
    """
    # This method needs to be in this __init__.py to get the __name__ correct
    # even if urllib3 is vendored within another package.
    logger = logging.getLogger(__name__)
    handler = logging.StreamHandler()
    handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s'))
    logger.addHandler(handler)
    logger.setLevel(level)
    logger.debug('Added an stderr logging handler to logger: %s' % __name__)
    return handler

# ... Clean up.
del NullHandler
site-packages/pip/_vendor/requests/packages/urllib3/connectionpool.py000064400000064430151733463700022140 0ustar00# urllib3/connectionpool.py
# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
#
# This module is part of urllib3 and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php

import sys
import errno
import logging

from socket import error as SocketError, timeout as SocketTimeout
import socket

try: # Python 3
    from queue import LifoQueue, Empty, Full
except ImportError:
    from Queue import LifoQueue, Empty, Full
    import Queue as _  # Platform-specific: Windows


from .exceptions import (
    ClosedPoolError,
    ConnectionError,
    ConnectTimeoutError,
    EmptyPoolError,
    HostChangedError,
    LocationParseError,
    MaxRetryError,
    SSLError,
    TimeoutError,
    ReadTimeoutError,
    ProxyError,
)
from .packages.ssl_match_hostname import CertificateError
from .packages import six
from .connection import (
    port_by_scheme,
    DummyConnection,
    HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection,
    HTTPException, BaseSSLError,
)
from .request import RequestMethods
from .response import HTTPResponse
from .util import (
    get_host,
    is_connection_dropped,
    Timeout,
)


xrange = six.moves.xrange

log = logging.getLogger(__name__)

_Default = object()

## Pool objects

class ConnectionPool(object):
    """
    Base class for all connection pools, such as
    :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`.
    """

    scheme = None
    QueueCls = LifoQueue

    def __init__(self, host, port=None):
        if host is None:
            raise LocationParseError(host)

        # httplib doesn't like it when we include brackets in ipv6 addresses
        host = host.strip('[]')

        self.host = host
        self.port = port

    def __str__(self):
        return '%s(host=%r, port=%r)' % (type(self).__name__,
                                         self.host, self.port)

# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252
_blocking_errnos = set([errno.EAGAIN, errno.EWOULDBLOCK])

class HTTPConnectionPool(ConnectionPool, RequestMethods):
    """
    Thread-safe connection pool for one host.

    :param host:
        Host used for this HTTP Connection (e.g. "localhost"), passed into
        :class:`httplib.HTTPConnection`.

    :param port:
        Port used for this HTTP Connection (None is equivalent to 80), passed
        into :class:`httplib.HTTPConnection`.

    :param strict:
        Causes BadStatusLine to be raised if the status line can't be parsed
        as a valid HTTP/1.0 or 1.1 status line, passed into
        :class:`httplib.HTTPConnection`.

        .. note::
           Only works in Python 2. This parameter is ignored in Python 3.

    :param timeout:
        Socket timeout in seconds for each individual connection. This can
        be a float or integer, which sets the timeout for the HTTP request,
        or an instance of :class:`urllib3.util.Timeout` which gives you more
        fine-grained control over request timeouts. After the constructor has
        been parsed, this is always a `urllib3.util.Timeout` object.

    :param maxsize:
        Number of connections to save that can be reused. More than 1 is useful
        in multithreaded situations. If ``block`` is set to false, more
        connections will be created but they will not be saved once they've
        been used.

    :param block:
        If set to True, no more than ``maxsize`` connections will be used at
        a time. When no free connections are available, the call will block
        until a connection has been released. This is a useful side effect for
        particular multithreaded situations where one does not want to use more
        than maxsize connections per host to prevent flooding.

    :param headers:
        Headers to include with all requests, unless other headers are given
        explicitly.

    :param _proxy:
        Parsed proxy URL, should not be used directly, instead, see
        :class:`urllib3.connectionpool.ProxyManager`"

    :param _proxy_headers:
        A dictionary with proxy headers, should not be used directly,
        instead, see :class:`urllib3.connectionpool.ProxyManager`"
    """

    scheme = 'http'
    ConnectionCls = HTTPConnection

    def __init__(self, host, port=None, strict=False,
                 timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False,
                 headers=None, _proxy=None, _proxy_headers=None, **conn_kw):
        ConnectionPool.__init__(self, host, port)
        RequestMethods.__init__(self, headers)

        self.strict = strict

        # This is for backwards compatibility and can be removed once a timeout
        # can only be set to a Timeout object
        if not isinstance(timeout, Timeout):
            timeout = Timeout.from_float(timeout)

        self.timeout = timeout

        self.pool = self.QueueCls(maxsize)
        self.block = block

        self.proxy = _proxy
        self.proxy_headers = _proxy_headers or {}

        # Fill the queue up so that doing get() on it will block properly
        for _ in xrange(maxsize):
            self.pool.put(None)

        # These are mostly for testing and debugging purposes.
        self.num_connections = 0
        self.num_requests = 0

        if sys.version_info < (2, 7):  # Python 2.6 and older
            conn_kw.pop('source_address', None)
        self.conn_kw = conn_kw

    def _new_conn(self):
        """
        Return a fresh :class:`HTTPConnection`.
        """
        self.num_connections += 1
        log.info("Starting new HTTP connection (%d): %s" %
                 (self.num_connections, self.host))

        conn = self.ConnectionCls(host=self.host, port=self.port,
                                  timeout=self.timeout.connect_timeout,
                                  strict=self.strict, **self.conn_kw)
        if self.proxy is not None:
            # Enable Nagle's algorithm for proxies, to avoid packet
            # fragmentation.
            conn.tcp_nodelay = 0
        return conn

    def _get_conn(self, timeout=None):
        """
        Get a connection. Will return a pooled connection if one is available.

        If no connections are available and :prop:`.block` is ``False``, then a
        fresh connection is returned.

        :param timeout:
            Seconds to wait before giving up and raising
            :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and
            :prop:`.block` is ``True``.
        """
        conn = None
        try:
            conn = self.pool.get(block=self.block, timeout=timeout)

        except AttributeError: # self.pool is None
            raise ClosedPoolError(self, "Pool is closed.")

        except Empty:
            if self.block:
                raise EmptyPoolError(self,
                                     "Pool reached maximum size and no more "
                                     "connections are allowed.")
            pass  # Oh well, we'll create a new connection then

        # If this is a persistent connection, check if it got disconnected
        if conn and is_connection_dropped(conn):
            log.info("Resetting dropped connection: %s" % self.host)
            conn.close()

        return conn or self._new_conn()

    def _put_conn(self, conn):
        """
        Put a connection back into the pool.

        :param conn:
            Connection object for the current host and port as returned by
            :meth:`._new_conn` or :meth:`._get_conn`.

        If the pool is already full, the connection is closed and discarded
        because we exceeded maxsize. If connections are discarded frequently,
        then maxsize should be increased.

        If the pool is closed, then the connection will be closed and discarded.
        """
        try:
            self.pool.put(conn, block=False)
            return # Everything is dandy, done.
        except AttributeError:
            # self.pool is None.
            pass
        except Full:
            # This should never happen if self.block == True
            log.warning(
                "Connection pool is full, discarding connection: %s" %
                self.host)

        # Connection never got put back into the pool, close it.
        if conn:
            conn.close()

    def _get_timeout(self, timeout):
        """ Helper that always returns a :class:`urllib3.util.Timeout` """
        if timeout is _Default:
            return self.timeout.clone()

        if isinstance(timeout, Timeout):
            return timeout.clone()
        else:
            # User passed us an int/float. This is for backwards compatibility,
            # can be removed later
            return Timeout.from_float(timeout)

    def _make_request(self, conn, method, url, timeout=_Default,
                      **httplib_request_kw):
        """
        Perform a request on a given urllib connection object taken from our
        pool.

        :param conn:
            a connection from one of our connection pools

        :param timeout:
            Socket timeout in seconds for the request. This can be a
            float or integer, which will set the same timeout value for
            the socket connect and the socket read, or an instance of
            :class:`urllib3.util.Timeout`, which gives you more fine-grained
            control over your timeouts.
        """
        self.num_requests += 1

        timeout_obj = self._get_timeout(timeout)

        try:
            timeout_obj.start_connect()
            conn.timeout = timeout_obj.connect_timeout
            # conn.request() calls httplib.*.request, not the method in
            # urllib3.request. It also calls makefile (recv) on the socket.
            conn.request(method, url, **httplib_request_kw)
        except SocketTimeout:
            raise ConnectTimeoutError(
                self, "Connection to %s timed out. (connect timeout=%s)" %
                (self.host, timeout_obj.connect_timeout))

        # Reset the timeout for the recv() on the socket
        read_timeout = timeout_obj.read_timeout

        # App Engine doesn't have a sock attr
        if hasattr(conn, 'sock'):
            # In Python 3 socket.py will catch EAGAIN and return None when you
            # try and read into the file pointer created by http.client, which
            # instead raises a BadStatusLine exception. Instead of catching
            # the exception and assuming all BadStatusLine exceptions are read
            # timeouts, check for a zero timeout before making the request.
            if read_timeout == 0:
                raise ReadTimeoutError(
                    self, url,
                    "Read timed out. (read timeout=%s)" % read_timeout)
            if read_timeout is Timeout.DEFAULT_TIMEOUT:
                conn.sock.settimeout(socket.getdefaulttimeout())
            else: # None or a value
                conn.sock.settimeout(read_timeout)

        # Receive the response from the server
        try:
            try: # Python 2.7+, use buffering of HTTP responses
                httplib_response = conn.getresponse(buffering=True)
            except TypeError: # Python 2.6 and older
                httplib_response = conn.getresponse()
        except SocketTimeout:
            raise ReadTimeoutError(
                self, url, "Read timed out. (read timeout=%s)" % read_timeout)

        except BaseSSLError as e:
            # Catch possible read timeouts thrown as SSL errors. If not the
            # case, rethrow the original. We need to do this because of:
            # http://bugs.python.org/issue10272
            if 'timed out' in str(e) or \
               'did not complete (read)' in str(e):  # Python 2.6
                raise ReadTimeoutError(self, url, "Read timed out.")

            raise

        except SocketError as e: # Platform-specific: Python 2
            # See the above comment about EAGAIN in Python 3. In Python 2 we
            # have to specifically catch it and throw the timeout error
            if e.errno in _blocking_errnos:
                raise ReadTimeoutError(
                    self, url,
                    "Read timed out. (read timeout=%s)" % read_timeout)

            raise

        # AppEngine doesn't have a version attr.
        http_version = getattr(conn, '_http_vsn_str', 'HTTP/?')
        log.debug("\"%s %s %s\" %s %s" % (method, url, http_version,
                                          httplib_response.status,
                                          httplib_response.length))
        return httplib_response

    def close(self):
        """
        Close all pooled connections and disable the pool.
        """
        # Disable access to the pool
        old_pool, self.pool = self.pool, None

        try:
            while True:
                conn = old_pool.get(block=False)
                if conn:
                    conn.close()

        except Empty:
            pass # Done.

    def is_same_host(self, url):
        """
        Check if the given ``url`` is a member of the same host as this
        connection pool.
        """
        if url.startswith('/'):
            return True

        # TODO: Add optional support for socket.gethostbyname checking.
        scheme, host, port = get_host(url)

        # Use explicit default port for comparison when none is given
        if self.port and not port:
            port = port_by_scheme.get(scheme)
        elif not self.port and port == port_by_scheme.get(scheme):
            port = None

        return (scheme, host, port) == (self.scheme, self.host, self.port)

    def urlopen(self, method, url, body=None, headers=None, retries=3,
                redirect=True, assert_same_host=True, timeout=_Default,
                pool_timeout=None, release_conn=None, **response_kw):
        """
        Get a connection from the pool and perform an HTTP request. This is the
        lowest level call for making a request, so you'll need to specify all
        the raw details.

        .. note::

           More commonly, it's appropriate to use a convenience method provided
           by :class:`.RequestMethods`, such as :meth:`request`.

        .. note::

           `release_conn` will only behave as expected if
           `preload_content=False` because we want to make
           `preload_content=False` the default behaviour someday soon without
           breaking backwards compatibility.

        :param method:
            HTTP request method (such as GET, POST, PUT, etc.)

        :param body:
            Data to send in the request body (useful for creating
            POST requests, see HTTPConnectionPool.post_url for
            more convenience).

        :param headers:
            Dictionary of custom headers to send, such as User-Agent,
            If-None-Match, etc. If None, pool headers are used. If provided,
            these headers completely replace any pool-specific headers.

        :param retries:
            Number of retries to allow before raising a MaxRetryError exception.
            If `False`, then retries are disabled and any exception is raised
            immediately.

        :param redirect:
            If True, automatically handle redirects (status codes 301, 302,
            303, 307, 308). Each redirect counts as a retry. Disabling retries
            will disable redirect, too.

        :param assert_same_host:
            If ``True``, will make sure that the host of the pool requests is
            consistent else will raise HostChangedError. When False, you can
            use the pool on an HTTP proxy and request foreign hosts.

        :param timeout:
            If specified, overrides the default timeout for this one
            request. It may be a float (in seconds) or an instance of
            :class:`urllib3.util.Timeout`.

        :param pool_timeout:
            If set and the pool is set to block=True, then this method will
            block for ``pool_timeout`` seconds and raise EmptyPoolError if no
            connection is available within the time period.

        :param release_conn:
            If False, then the urlopen call will not release the connection
            back into the pool once a response is received (but will release if
            you read the entire contents of the response such as when
            `preload_content=True`). This is useful if you're not preloading
            the response's content immediately. You will need to call
            ``r.release_conn()`` on the response ``r`` to return the connection
            back into the pool. If None, it takes the value of
            ``response_kw.get('preload_content', True)``.

        :param \**response_kw:
            Additional parameters are passed to
            :meth:`urllib3.response.HTTPResponse.from_httplib`
        """
        if headers is None:
            headers = self.headers

        if retries < 0 and retries is not False:
            raise MaxRetryError(self, url)

        if release_conn is None:
            release_conn = response_kw.get('preload_content', True)

        # Check host
        if assert_same_host and not self.is_same_host(url):
            raise HostChangedError(self, url, retries - 1)

        conn = None

        # Merge the proxy headers. Only do this in HTTP. We have to copy the
        # headers dict so we can safely change it without those changes being
        # reflected in anyone else's copy.
        if self.scheme == 'http':
            headers = headers.copy()
            headers.update(self.proxy_headers)

        # Must keep the exception bound to a separate variable or else Python 3
        # complains about UnboundLocalError.
        err = None

        try:
            # Request a connection from the queue
            conn = self._get_conn(timeout=pool_timeout)

            # Make the request on the httplib connection object
            httplib_response = self._make_request(conn, method, url,
                                                  timeout=timeout,
                                                  body=body, headers=headers)

            # If we're going to release the connection in ``finally:``, then
            # the request doesn't need to know about the connection. Otherwise
            # it will also try to release it and we'll have a double-release
            # mess.
            response_conn = not release_conn and conn

            # Import httplib's response into our own wrapper object
            response = HTTPResponse.from_httplib(httplib_response,
                                                 pool=self,
                                                 connection=response_conn,
                                                 **response_kw)

            # else:
            #     The connection will be put back into the pool when
            #     ``response.release_conn()`` is called (implicitly by
            #     ``response.read()``)

        except Empty:
            # Timed out by queue.
            raise EmptyPoolError(self, "No pool connections are available.")

        except (BaseSSLError, CertificateError) as e:
            # Release connection unconditionally because there is no way to
            # close it externally in case of exception.
            release_conn = True
            raise SSLError(e)

        except (TimeoutError, HTTPException, SocketError) as e:
            if conn:
                # Discard the connection for these exceptions. It will be
                # be replaced during the next _get_conn() call.
                conn.close()
                conn = None

            if not retries:
                if isinstance(e, TimeoutError):
                    # TimeoutError is exempt from MaxRetryError-wrapping.
                    # FIXME: ... Not sure why. Add a reason here.
                    raise

                # Wrap unexpected exceptions with the most appropriate
                # module-level exception and re-raise.
                if isinstance(e, SocketError) and self.proxy:
                    raise ProxyError('Cannot connect to proxy.', e)

                if retries is False:
                    raise ConnectionError('Connection failed.', e)

                raise MaxRetryError(self, url, e)

            # Keep track of the error for the retry warning.
            err = e

        finally:
            if release_conn:
                # Put the connection back to be reused. If the connection is
                # expired then it will be None, which will get replaced with a
                # fresh connection during _get_conn.
                self._put_conn(conn)

        if not conn:
            # Try again
            log.warning("Retrying (%d attempts remain) after connection "
                        "broken by '%r': %s" % (retries, err, url))
            return self.urlopen(method, url, body, headers, retries - 1,
                                redirect, assert_same_host,
                                timeout=timeout, pool_timeout=pool_timeout,
                                release_conn=release_conn, **response_kw)

        # Handle redirect?
        redirect_location = redirect and response.get_redirect_location()
        if redirect_location and retries is not False:
            if response.status == 303:
                method = 'GET'
            log.info("Redirecting %s -> %s" % (url, redirect_location))
            return self.urlopen(method, redirect_location, body, headers,
                                retries - 1, redirect, assert_same_host,
                                timeout=timeout, pool_timeout=pool_timeout,
                                release_conn=release_conn, **response_kw)

        return response


class HTTPSConnectionPool(HTTPConnectionPool):
    """
    Same as :class:`.HTTPConnectionPool`, but HTTPS.

    When Python is compiled with the :mod:`ssl` module, then
    :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates,
    instead of :class:`.HTTPSConnection`.

    :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``,
    ``assert_hostname`` and ``host`` in this order to verify connections.
    If ``assert_hostname`` is False, no verification is done.

    The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs`` and
    ``ssl_version`` are only used if :mod:`ssl` is available and are fed into
    :meth:`urllib3.util.ssl_wrap_socket` to upgrade the connection socket
    into an SSL socket.
    """

    scheme = 'https'
    ConnectionCls = HTTPSConnection

    def __init__(self, host, port=None,
                 strict=False, timeout=None, maxsize=1,
                 block=False, headers=None,
                 _proxy=None, _proxy_headers=None,
                 key_file=None, cert_file=None, cert_reqs=None,
                 ca_certs=None, ssl_version=None,
                 assert_hostname=None, assert_fingerprint=None,
                 **conn_kw):

        if sys.version_info < (2, 7):  # Python 2.6 or older
            conn_kw.pop('source_address', None)

        HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize,
                                    block, headers, _proxy, _proxy_headers, **conn_kw)
        self.key_file = key_file
        self.cert_file = cert_file
        self.cert_reqs = cert_reqs
        self.ca_certs = ca_certs
        self.ssl_version = ssl_version
        self.assert_hostname = assert_hostname
        self.assert_fingerprint = assert_fingerprint
        self.conn_kw = conn_kw

    def _prepare_conn(self, conn):
        """
        Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket`
        and establish the tunnel if proxy is used.
        """

        if isinstance(conn, VerifiedHTTPSConnection):
            conn.set_cert(key_file=self.key_file,
                          cert_file=self.cert_file,
                          cert_reqs=self.cert_reqs,
                          ca_certs=self.ca_certs,
                          assert_hostname=self.assert_hostname,
                          assert_fingerprint=self.assert_fingerprint)
            conn.ssl_version = self.ssl_version
            conn.conn_kw = self.conn_kw

        if self.proxy is not None:
            # Python 2.7+
            try:
                set_tunnel = conn.set_tunnel
            except AttributeError:  # Platform-specific: Python 2.6
                set_tunnel = conn._set_tunnel
            set_tunnel(self.host, self.port, self.proxy_headers)
            # Establish tunnel connection early, because otherwise httplib
            # would improperly set Host: header to proxy's IP:port.
            conn.connect()

        return conn

    def _new_conn(self):
        """
        Return a fresh :class:`httplib.HTTPSConnection`.
        """
        self.num_connections += 1
        log.info("Starting new HTTPS connection (%d): %s"
                 % (self.num_connections, self.host))

        if not self.ConnectionCls or self.ConnectionCls is DummyConnection:
            # Platform-specific: Python without ssl
            raise SSLError("Can't connect to HTTPS URL because the SSL "
                           "module is not available.")

        actual_host = self.host
        actual_port = self.port
        if self.proxy is not None:
            actual_host = self.proxy.host
            actual_port = self.proxy.port

        extra_params = {}
        if not six.PY3:  # Python 2
            extra_params['strict'] = self.strict
        extra_params.update(self.conn_kw)

        conn = self.ConnectionCls(host=actual_host, port=actual_port,
                                  timeout=self.timeout.connect_timeout,
                                  **extra_params)
        if self.proxy is not None:
            # Enable Nagle's algorithm for proxies, to avoid packet
            # fragmentation.
            conn.tcp_nodelay = 0

        return self._prepare_conn(conn)


def connection_from_url(url, **kw):
    """
    Given a url, return an :class:`.ConnectionPool` instance of its host.

    This is a shortcut for not having to parse out the scheme, host, and port
    of the url before creating an :class:`.ConnectionPool` instance.

    :param url:
        Absolute URL string that must include the scheme. Port is optional.

    :param \**kw:
        Passes additional parameters to the constructor of the appropriate
        :class:`.ConnectionPool`. Useful for specifying things like
        timeout, maxsize, headers, etc.

    Example: ::

        >>> conn = connection_from_url('http://google.com/')
        >>> r = conn.request('GET', '/')
    """
    scheme, host, port = get_host(url)
    if scheme == 'https':
        return HTTPSConnectionPool(host, port=port, **kw)
    else:
        return HTTPConnectionPool(host, port=port, **kw)
site-packages/pip/_vendor/requests/packages/urllib3/request.py000064400000013260151733463700020572 0ustar00# urllib3/request.py
# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
#
# This module is part of urllib3 and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php

try:
    from urllib.parse import urlencode
except ImportError:
    from urllib import urlencode

from .filepost import encode_multipart_formdata


__all__ = ['RequestMethods']


class RequestMethods(object):
    """
    Convenience mixin for classes who implement a :meth:`urlopen` method, such
    as :class:`~urllib3.connectionpool.HTTPConnectionPool` and
    :class:`~urllib3.poolmanager.PoolManager`.

    Provides behavior for making common types of HTTP request methods and
    decides which type of request field encoding to use.

    Specifically,

    :meth:`.request_encode_url` is for sending requests whose fields are encoded
    in the URL (such as GET, HEAD, DELETE).

    :meth:`.request_encode_body` is for sending requests whose fields are
    encoded in the *body* of the request using multipart or www-form-urlencoded
    (such as for POST, PUT, PATCH).

    :meth:`.request` is for making any kind of request, it will look up the
    appropriate encoding format and use one of the above two methods to make
    the request.

    Initializer parameters:

    :param headers:
        Headers to include with all requests, unless other headers are given
        explicitly.
    """

    _encode_url_methods = set(['DELETE', 'GET', 'HEAD', 'OPTIONS'])

    def __init__(self, headers=None):
        self.headers = headers or {}

    def urlopen(self, method, url, body=None, headers=None,
                encode_multipart=True, multipart_boundary=None,
                **kw): # Abstract
        raise NotImplemented("Classes extending RequestMethods must implement "
                             "their own ``urlopen`` method.")

    def request(self, method, url, fields=None, headers=None, **urlopen_kw):
        """
        Make a request using :meth:`urlopen` with the appropriate encoding of
        ``fields`` based on the ``method`` used.

        This is a convenience method that requires the least amount of manual
        effort. It can be used in most situations, while still having the option
        to drop down to more specific methods when necessary, such as
        :meth:`request_encode_url`, :meth:`request_encode_body`,
        or even the lowest level :meth:`urlopen`.
        """
        method = method.upper()

        if method in self._encode_url_methods:
            return self.request_encode_url(method, url, fields=fields,
                                            headers=headers,
                                            **urlopen_kw)
        else:
            return self.request_encode_body(method, url, fields=fields,
                                             headers=headers,
                                             **urlopen_kw)

    def request_encode_url(self, method, url, fields=None, **urlopen_kw):
        """
        Make a request using :meth:`urlopen` with the ``fields`` encoded in
        the url. This is useful for request methods like GET, HEAD, DELETE, etc.
        """
        if fields:
            url += '?' + urlencode(fields)
        return self.urlopen(method, url, **urlopen_kw)

    def request_encode_body(self, method, url, fields=None, headers=None,
                            encode_multipart=True, multipart_boundary=None,
                            **urlopen_kw):
        """
        Make a request using :meth:`urlopen` with the ``fields`` encoded in
        the body. This is useful for request methods like POST, PUT, PATCH, etc.

        When ``encode_multipart=True`` (default), then
        :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode the
        payload with the appropriate content type. Otherwise
        :meth:`urllib.urlencode` is used with the
        'application/x-www-form-urlencoded' content type.

        Multipart encoding must be used when posting files, and it's reasonably
        safe to use it in other times too. However, it may break request signing,
        such as with OAuth.

        Supports an optional ``fields`` parameter of key/value strings AND
        key/filetuple. A filetuple is a (filename, data, MIME type) tuple where
        the MIME type is optional. For example: ::

            fields = {
                'foo': 'bar',
                'fakefile': ('foofile.txt', 'contents of foofile'),
                'realfile': ('barfile.txt', open('realfile').read()),
                'typedfile': ('bazfile.bin', open('bazfile').read(),
                              'image/jpeg'),
                'nonamefile': 'contents of nonamefile field',
            }

        When uploading a file, providing a filename (the first parameter of the
        tuple) is optional but recommended to best mimick behavior of browsers.

        Note that if ``headers`` are supplied, the 'Content-Type' header will be
        overwritten because it depends on the dynamic random boundary string
        which is used to compose the body of the request. The random boundary
        string can be explicitly set with the ``multipart_boundary`` parameter.
        """
        if encode_multipart:
            body, content_type = encode_multipart_formdata(fields or {},
                                    boundary=multipart_boundary)
        else:
            body, content_type = (urlencode(fields or {}),
                                    'application/x-www-form-urlencoded')

        if headers is None:
            headers = self.headers

        headers_ = {'Content-Type': content_type}
        headers_.update(headers)

        return self.urlopen(method, url, body=body, headers=headers_,
                            **urlopen_kw)
site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py000064400000010213151733463700021012 0ustar00from binascii import hexlify, unhexlify
from hashlib import md5, sha1

from ..exceptions import SSLError


try:  # Test for SSL features
    SSLContext = None
    HAS_SNI = False

    import ssl
    from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23
    from ssl import SSLContext  # Modern SSL?
    from ssl import HAS_SNI  # Has SNI?
except ImportError:
    pass


def assert_fingerprint(cert, fingerprint):
    """
    Checks if given fingerprint matches the supplied certificate.

    :param cert:
        Certificate as bytes object.
    :param fingerprint:
        Fingerprint as string of hexdigits, can be interspersed by colons.
    """

    # Maps the length of a digest to a possible hash function producing
    # this digest.
    hashfunc_map = {
        16: md5,
        20: sha1
    }

    fingerprint = fingerprint.replace(':', '').lower()

    digest_length, rest = divmod(len(fingerprint), 2)

    if rest or digest_length not in hashfunc_map:
        raise SSLError('Fingerprint is of invalid length.')

    # We need encode() here for py32; works on py2 and p33.
    fingerprint_bytes = unhexlify(fingerprint.encode())

    hashfunc = hashfunc_map[digest_length]

    cert_digest = hashfunc(cert).digest()

    if not cert_digest == fingerprint_bytes:
        raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".'
                       .format(hexlify(fingerprint_bytes),
                               hexlify(cert_digest)))


def resolve_cert_reqs(candidate):
    """
    Resolves the argument to a numeric constant, which can be passed to
    the wrap_socket function/method from the ssl module.
    Defaults to :data:`ssl.CERT_NONE`.
    If given a string it is assumed to be the name of the constant in the
    :mod:`ssl` module or its abbrevation.
    (So you can specify `REQUIRED` instead of `CERT_REQUIRED`.
    If it's neither `None` nor a string we assume it is already the numeric
    constant which can directly be passed to wrap_socket.
    """
    if candidate is None:
        return CERT_NONE

    if isinstance(candidate, str):
        res = getattr(ssl, candidate, None)
        if res is None:
            res = getattr(ssl, 'CERT_' + candidate)
        return res

    return candidate


def resolve_ssl_version(candidate):
    """
    like resolve_cert_reqs
    """
    if candidate is None:
        return PROTOCOL_SSLv23

    if isinstance(candidate, str):
        res = getattr(ssl, candidate, None)
        if res is None:
            res = getattr(ssl, 'PROTOCOL_' + candidate)
        return res

    return candidate


if SSLContext is not None:  # Python 3.2+
    def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None,
                        ca_certs=None, server_hostname=None,
                        ssl_version=None):
        """
        All arguments except `server_hostname` have the same meaning as for
        :func:`ssl.wrap_socket`

        :param server_hostname:
            Hostname of the expected certificate
        """
        context = SSLContext(ssl_version)
        context.verify_mode = cert_reqs

        # Disable TLS compression to migitate CRIME attack (issue #309)
        OP_NO_COMPRESSION = 0x20000
        context.options |= OP_NO_COMPRESSION

        if ca_certs:
            try:
                context.load_verify_locations(ca_certs)
            # Py32 raises IOError
            # Py33 raises FileNotFoundError
            except Exception as e:  # Reraise as SSLError
                raise SSLError(e)
        if certfile:
            # FIXME: This block needs a test.
            context.load_cert_chain(certfile, keyfile)
        if HAS_SNI:  # Platform-specific: OpenSSL with enabled SNI
            return context.wrap_socket(sock, server_hostname=server_hostname)
        return context.wrap_socket(sock)

else:  # Python 3.1 and earlier
    def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None,
                        ca_certs=None, server_hostname=None,
                        ssl_version=None):
        return wrap_socket(sock, keyfile=keyfile, certfile=certfile,
                           ca_certs=ca_certs, cert_reqs=cert_reqs,
                           ssl_version=ssl_version)
site-packages/pip/_vendor/requests/packages/urllib3/util/connection.py000064400000002504151733463700022215 0ustar00from socket import error as SocketError
try:
    from select import poll, POLLIN
except ImportError:  # `poll` doesn't exist on OSX and other platforms
    poll = False
    try:
        from select import select
    except ImportError:  # `select` doesn't exist on AppEngine.
        select = False

def is_connection_dropped(conn):  # Platform-specific
    """
    Returns True if the connection is dropped and should be closed.

    :param conn:
        :class:`httplib.HTTPConnection` object.

    Note: For platforms like AppEngine, this will always return ``False`` to
    let the platform handle connection recycling transparently for us.
    """
    sock = getattr(conn, 'sock', False)
    if sock is False:  # Platform-specific: AppEngine
        return False
    if sock is None:  # Connection already closed (such as by httplib).
        return False

    if not poll:
        if not select:  # Platform-specific: AppEngine
            return False

        try:
            return select([sock], [], [], 0.0)[0]
        except SocketError:
            return True

    # This version is better on platforms that support it.
    p = poll()
    p.register(sock, POLLIN)
    for (fno, ev) in p.poll(0.0):
        if fno == sock.fileno():
            # Either data is buffered (bad), or the connection is dropped.
            return True



site-packages/pip/_vendor/requests/packages/urllib3/util/url.py000064400000010261151733463700020657 0ustar00from collections import namedtuple

from ..exceptions import LocationParseError


class Url(namedtuple('Url', ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'])):
    """
    Datastructure for representing an HTTP URL. Used as a return value for
    :func:`parse_url`.
    """
    slots = ()

    def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, query=None, fragment=None):
        return super(Url, cls).__new__(cls, scheme, auth, host, port, path, query, fragment)

    @property
    def hostname(self):
        """For backwards-compatibility with urlparse. We're nice like that."""
        return self.host

    @property
    def request_uri(self):
        """Absolute path including the query string."""
        uri = self.path or '/'

        if self.query is not None:
            uri += '?' + self.query

        return uri

    @property
    def netloc(self):
        """Network location including host and port"""
        if self.port:
            return '%s:%d' % (self.host, self.port)
        return self.host


def split_first(s, delims):
    """
    Given a string and an iterable of delimiters, split on the first found
    delimiter. Return two split parts and the matched delimiter.

    If not found, then the first part is the full input string.

    Example: ::

        >>> split_first('foo/bar?baz', '?/=')
        ('foo', 'bar?baz', '/')
        >>> split_first('foo/bar?baz', '123')
        ('foo/bar?baz', '', None)

    Scales linearly with number of delims. Not ideal for large number of delims.
    """
    min_idx = None
    min_delim = None
    for d in delims:
        idx = s.find(d)
        if idx < 0:
            continue

        if min_idx is None or idx < min_idx:
            min_idx = idx
            min_delim = d

    if min_idx is None or min_idx < 0:
        return s, '', None

    return s[:min_idx], s[min_idx+1:], min_delim


def parse_url(url):
    """
    Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is
    performed to parse incomplete urls. Fields not provided will be None.

    Partly backwards-compatible with :mod:`urlparse`.

    Example: ::

        >>> parse_url('http://google.com/mail/')
        Url(scheme='http', host='google.com', port=None, path='/', ...)
        >>> parse_url('google.com:80')
        Url(scheme=None, host='google.com', port=80, path=None, ...)
        >>> parse_url('/foo?bar')
        Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...)
    """

    # While this code has overlap with stdlib's urlparse, it is much
    # simplified for our needs and less annoying.
    # Additionally, this implementations does silly things to be optimal
    # on CPython.

    scheme = None
    auth = None
    host = None
    port = None
    path = None
    fragment = None
    query = None

    # Scheme
    if '://' in url:
        scheme, url = url.split('://', 1)

    # Find the earliest Authority Terminator
    # (http://tools.ietf.org/html/rfc3986#section-3.2)
    url, path_, delim = split_first(url, ['/', '?', '#'])

    if delim:
        # Reassemble the path
        path = delim + path_

    # Auth
    if '@' in url:
        # Last '@' denotes end of auth part
        auth, url = url.rsplit('@', 1)

    # IPv6
    if url and url[0] == '[':
        host, url = url.split(']', 1)
        host += ']'

    # Port
    if ':' in url:
        _host, port = url.split(':', 1)

        if not host:
            host = _host

        if port:
            # If given, ports must be integers.
            if not port.isdigit():
                raise LocationParseError(url)
            port = int(port)
        else:
            # Blank ports are cool, too. (rfc3986#section-3.2.3)
            port = None

    elif not host and url:
        host = url

    if not path:
        return Url(scheme, auth, host, port, path, query, fragment)

    # Fragment
    if '#' in path:
        path, fragment = path.split('#', 1)

    # Query
    if '?' in path:
        path, query = path.split('?', 1)

    return Url(scheme, auth, host, port, path, query, fragment)


def get_host(url):
    """
    Deprecated. Use :func:`.parse_url` instead.
    """
    p = parse_url(url)
    return p.scheme or 'http', p.hostname, p.port
site-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/url.cpython-33.pyc000064400000012070151733463700025140 0ustar00�
7�Re�c@s|ddlmZddlmZGdd�deddddd	d
ddg��Zd
d�Zdd�Zdd�ZdS(i(u
namedtuplei(uLocationParseErrorc
s}|EeZdZdZfZd
d
d
d
d
d
d
�fdd�Zedd��Zedd��Z	edd	��Z
�S(uUrlug
    Datastructure for representing an HTTP URL. Used as a return value for
    :func:`parse_url`.
    c	s+tt|�j||||||||�S(N(usuperuUrlu__new__(uclsuschemeuauthuhostuportupathuqueryufragment(u	__class__(uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/url.pyu__new__
suUrl.__new__cCs|jS(u@For backwards-compatibility with urlparse. We're nice like that.(uhost(uself((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/url.pyuhostnamesuUrl.hostnamecCs6|jpd}|jdk	r2|d|j7}n|S(u)Absolute path including the query string.u/u?N(upathuqueryuNone(uselfuuri((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/url.pyurequest_urisuUrl.request_uricCs$|jrd|j|jfS|jS(u(Network location including host and portu%s:%d(uportuhost(uself((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/url.pyunetlocs	u
Url.netlocN(u__name__u
__module__u__qualname__u__doc__uslotsuNoneu__new__upropertyuhostnameurequest_uriunetloc(u
__locals__((u	__class__uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/url.pyuUrls'
uUrluschemeuauthuhostuportupathuqueryufragmentcCs�d}d}xV|D]N}|j|�}|dkr:qn|dksR||kr|}|}qqW|dks}|dkr�|ddfS|d|�||dd�|fS(u�
    Given a string and an iterable of delimiters, split on the first found
    delimiter. Return two split parts and the matched delimiter.

    If not found, then the first part is the full input string.

    Example: ::

        >>> split_first('foo/bar?baz', '?/=')
        ('foo', 'bar?baz', '/')
        >>> split_first('foo/bar?baz', '123')
        ('foo/bar?baz', '', None)

    Scales linearly with number of delims. Not ideal for large number of delims.
    iuNi(uNoneufind(usudelimsumin_idxu	min_delimuduidx((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/url.pyusplit_first's


usplit_firstc
Cs�d}d}d}d}d}d}d}d|krQ|jdd�\}}nt|dddg�\}}}	|	r�|	|}nd|kr�|jdd�\}}n|r�|ddkr�|jd	d�\}}|d	7}nd
|krS|jd
d�\}
}|s|
}n|rJ|j�s;t|��nt|�}qid}n|ri|ri|}n|s�t|||||||�Sd|kr�|jdd�\}}nd|kr�|jdd�\}}nt|||||||�S(u7
    Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is
    performed to parse incomplete urls. Fields not provided will be None.

    Partly backwards-compatible with :mod:`urlparse`.

    Example: ::

        >>> parse_url('http://google.com/mail/')
        Url(scheme='http', host='google.com', port=None, path='/', ...)
        >>> parse_url('google.com:80')
        Url(scheme=None, host='google.com', port=80, path=None, ...)
        >>> parse_url('/foo?bar')
        Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...)
    u://iu/u?u#u@iu[u]u:N(uNoneusplitusplit_firstursplituisdigituLocationParseErroruintuUrl(uurluschemeuauthuhostuportupathufragmentuqueryupath_udelimu_host((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/url.pyu	parse_urlHsF!

		
	u	parse_urlcCs(t|�}|jpd|j|jfS(u5
    Deprecated. Use :func:`.parse_url` instead.
    uhttp(u	parse_urluschemeuhostnameuport(uurlup((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/url.pyuget_host�suget_hostN(ucollectionsu
namedtupleu
exceptionsuLocationParseErroruUrlusplit_firstu	parse_urluget_host(((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/url.pyu<module>s
4!!Usite-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/request.cpython-33.pyc000064400000004077151733463700026036 0ustar00�
7�Re�c@sEddlmZddlmZdZddddddd�ZdS(i(u	b64encodei(usixugzip,deflatecCs�i}|rRt|t�rn't|t�r?dj|�}nt}||d<n|re||d<n|rxd|d<n|r�dttj|��jd�|d<n|r�dttj|��jd�|d	<n|S(
u�
    Shortcuts for generating request headers.

    :param keep_alive:
        If ``True``, adds 'connection: keep-alive' header.

    :param accept_encoding:
        Can be a boolean, list, or string.
        ``True`` translates to 'gzip,deflate'.
        List will get joined by comma.
        String will be used as provided.

    :param user_agent:
        String representing the user-agent you want, such as
        "python-urllib3/0.6"

    :param basic_auth:
        Colon-separated username:password string for 'authorization: basic ...'
        auth header.

    :param proxy_basic_auth:
        Colon-separated username:password string for 'proxy-authorization: basic ...'
        auth header.

    Example: ::

        >>> make_headers(keep_alive=True, user_agent="Batman/1.0")
        {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'}
        >>> make_headers(accept_encoding=True)
        {'accept-encoding': 'gzip,deflate'}
    u,uaccept-encodingu
user-agentu
keep-aliveu
connectionuBasic uutf-8u
authorizationuproxy-authorization(	u
isinstanceustrulistujoinuACCEPT_ENCODINGu	b64encodeusixubudecode(u
keep_aliveuaccept_encodingu
user_agentu
basic_authuproxy_basic_authuheaders((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/request.pyumake_headers	s&!


&&umake_headersN(ubase64u	b64encodeupackagesusixuACCEPT_ENCODINGuNoneumake_headers(((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/request.pyu<module>s	site-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/connection.cpython-33.pyc000064400000002576151733463700026507 0ustar00�
7�ReDc@s�ddlmZyddlmZmZWnGek
rsdZyddlmZWnek
rndZYnXYnXdd�ZdS(i(uerror(upolluPOLLIN(uselectcCs�t|dd�}|dkr"dS|dkr2dSts|tsBdSyt|gggd�dSWq|tk
rxdSYq|Xnt�}|j|t�x3|jd�D]"\}}||j	�kr�dSq�WdS(u 
    Returns True if the connection is dropped and should be closed.

    :param conn:
        :class:`httplib.HTTPConnection` object.

    Note: For platforms like AppEngine, this will always return ``False`` to
    let the platform handle connection recycling transparently for us.
    usockgiNFT(
ugetattruFalseuNoneupolluselectuSocketErroruTrueuregisteruPOLLINufileno(uconnusockupufnouev((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/connection.pyuis_connection_droppeds"

	uis_connection_droppedNF(	usocketuerroruSocketErroruselectupolluPOLLINuImportErroruFalseuis_connection_dropped(((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/connection.pyu<module>s

site-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/response.cpython-33.pyc000064400000001120151733463700026166 0ustar00�
7�Rebc@sdd�ZdS(cCs#t|d�r|jdkS|jS(ut
    Checks whether a given file-like object is closed.

    :param obj:
        The file-like object to check.
    ufpN(uhasattrufpuNoneuclosed(uobj((uL/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/response.pyuis_fp_closeds
uis_fp_closedN(uis_fp_closed(((uL/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/response.pyu<module>ssite-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/__init__.cpython-33.pyc000064400000001663151733463700026103 0ustar00�
7�Renc@s�ddlmZddlmZddlmZddlmZmZm	Z	m
Z
mZmZddl
mZmZddlmZmZmZmZdS(i(uis_connection_dropped(umake_headers(uis_fp_closed(u
SSLContextuHAS_SNIuassert_fingerprinturesolve_cert_reqsuresolve_ssl_versionussl_wrap_socket(ucurrent_timeuTimeout(uget_hostu	parse_urlusplit_firstuUrlN(u
connectionuis_connection_droppedurequestumake_headersuresponseuis_fp_closedussl_u
SSLContextuHAS_SNIuassert_fingerprinturesolve_cert_reqsuresolve_ssl_versionussl_wrap_socketutimeoutucurrent_timeuTimeoutuurluget_hostu	parse_urlusplit_firstuUrl(((uL/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/__init__.pyu<module>s
.site-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/ssl_.cpython-33.pyc000064400000010754151733463700025305 0ustar00�
7�Re�c@sddlmZmZddlmZmZddlmZyXdZ	dZddlZddlm
Z
mZmZddlm	Z	ddlmZWnek
r�YnXd	d
�Zdd�Zd
d�Ze	dk	r�dddddddd�Zndddddddd�ZdS(i(uhexlifyu	unhexlify(umd5usha1i(uSSLErrorN(uwrap_socketu	CERT_NONEuPROTOCOL_SSLv23(u
SSLContext(uHAS_SNIcCs�itd6td6}|jdd�j�}tt|�d�\}}|sY||krhtd��nt|j��}||}||�j	�}||ks�tdj
t|�t|����ndS(	u�
    Checks if given fingerprint matches the supplied certificate.

    :param cert:
        Certificate as bytes object.
    :param fingerprint:
        Fingerprint as string of hexdigits, can be interspersed by colons.
    iiu:uiu!Fingerprint is of invalid length.u6Fingerprints did not match. Expected "{0}", got "{1}".N(umd5usha1ureplaceulowerudivmodulenuSSLErroru	unhexlifyuencodeudigestuformatuhexlify(ucertufingerprintuhashfunc_mapu
digest_lengthurestufingerprint_bytesuhashfuncucert_digest((uH/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/ssl_.pyuassert_fingerprints

		uassert_fingerprintcCs[|dkrtSt|t�rWtt|d�}|dkrSttd|�}n|S|S(u�
    Resolves the argument to a numeric constant, which can be passed to
    the wrap_socket function/method from the ssl module.
    Defaults to :data:`ssl.CERT_NONE`.
    If given a string it is assumed to be the name of the constant in the
    :mod:`ssl` module or its abbrevation.
    (So you can specify `REQUIRED` instead of `CERT_REQUIRED`.
    If it's neither `None` nor a string we assume it is already the numeric
    constant which can directly be passed to wrap_socket.
    uCERT_N(uNoneu	CERT_NONEu
isinstanceustrugetattrussl(u	candidateures((uH/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/ssl_.pyuresolve_cert_reqs8suresolve_cert_reqscCs[|dkrtSt|t�rWtt|d�}|dkrSttd|�}n|S|S(u 
    like resolve_cert_reqs
    u	PROTOCOL_N(uNoneuPROTOCOL_SSLv23u
isinstanceustrugetattrussl(u	candidateures((uH/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/ssl_.pyuresolve_ssl_versionOsuresolve_ssl_versionc
Cs�t|�}||_d}|j|O_|rxy|j|�Wqxtk
rt}	zt|	��WYdd}	~	XqxXn|r�|j||�ntr�|j|d|�S|j|�S(u�
        All arguments except `server_hostname` have the same meaning as for
        :func:`ssl.wrap_socket`

        :param server_hostname:
            Hostname of the expected certificate
        iNuserver_hostname(	u
SSLContextuverify_modeuoptionsuload_verify_locationsu	ExceptionuSSLErroruload_cert_chainuHAS_SNIuwrap_socket(
usockukeyfileucertfileu	cert_reqsuca_certsuserver_hostnameussl_versionucontextuOP_NO_COMPRESSIONue((uH/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/ssl_.pyussl_wrap_socket`s
	"ussl_wrap_socketcCs(t|d|d|d|d|d|�S(Nukeyfileucertfileuca_certsu	cert_reqsussl_version(uwrap_socket(usockukeyfileucertfileu	cert_reqsuca_certsuserver_hostnameussl_version((uH/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/ssl_.pyussl_wrap_socket�sF(ubinasciiuhexlifyu	unhexlifyuhashlibumd5usha1u
exceptionsuSSLErroruNoneu
SSLContextuFalseuHAS_SNIussluwrap_socketu	CERT_NONEuPROTOCOL_SSLv23uImportErroruassert_fingerprinturesolve_cert_reqsuresolve_ssl_versionussl_wrap_socket(((uH/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/ssl_.pyu<module>s*
%		site-packages/pip/_vendor/requests/packages/urllib3/util/__pycache__/timeout.cpython-33.pyc000064400000024372151733463700026034 0ustar00�
7�Re$c@s[ddlmZddlZddlmZdd�Ze�ZGdd�de�ZdS(	i(u_GLOBAL_DEFAULT_TIMEOUTNi(uTimeoutStateErrorcCs
tj�S(uQ
    Retrieve the current time, this function is mocked out in unit testing.
    (utime(((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/timeout.pyucurrent_timesucurrent_timecBs�|EeZdZdZeZdeedd�Zdd�Z	e
dd��Ze
dd	��Zd
d�Z
dd
�Zdd�Zedd��Zedd��ZdS(uTimeoutu
    Utility object for storing timeout values.

    Example usage:

    .. code-block:: python

        timeout = urllib3.util.Timeout(connect=2.0, read=7.0)
        pool = HTTPConnectionPool('www.google.com', 80, timeout=timeout)
        pool.request(...) # Etc, etc

    :param connect:
        The maximum amount of time to wait for a connection attempt to a server
        to succeed. Omitting the parameter will default the connect timeout to
        the system default, probably `the global default timeout in socket.py
        <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_.
        None will set an infinite timeout for connection attempts.

    :type connect: integer, float, or None

    :param read:
        The maximum amount of time to wait between consecutive
        read operations for a response from the server. Omitting
        the parameter will default the read timeout to the system
        default, probably `the global default timeout in socket.py
        <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_.
        None will set an infinite timeout.

    :type read: integer, float, or None

    :param total:
        This combines the connect and read timeouts into one; the read timeout
        will be set to the time leftover from the connect attempt. In the
        event that both a connect timeout and a total are specified, or a read
        timeout and a total are specified, the shorter timeout will be applied.

        Defaults to None.

    :type total: integer, float, or None

    .. note::

        Many factors can affect the total amount of time for urllib3 to return
        an HTTP response. Specifically, Python's DNS resolver does not obey the
        timeout specified on the socket. Other factors that can affect total
        request time include high CPU load, high swap, the program running at a
        low priority level, or other behaviors. The observed running time for
        urllib3 to return a response may be greater than the value passed to
        `total`.

        In addition, the read and total timeouts only measure the time between
        read operations on the socket connecting the client and the server,
        not the total amount of time for the request to return a complete
        response. For most requests, the timeout is raised because the server
        has not sent the first byte in the specified time. This is not always
        the case; if a server streams one byte every fifteen seconds, a timeout
        of 20 seconds will not ever trigger, even though the request will
        take several minutes to complete.

        If your goal is to cut off any request after a set amount of wall clock
        time, consider having a second "watcher" thread to cut off a slow
        request.
    cCsL|j|d�|_|j|d�|_|j|d�|_d|_dS(Nuconnectureadutotal(u_validate_timeoutu_connectu_readutotaluNoneu_start_connect(uselfutotaluconnecturead((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/timeout.pyu__init__WsuTimeout.__init__cCs&dt|�j|j|j|jfS(Nu!%s(connect=%r, read=%r, total=%r)(utypeu__name__u_connectu_readutotal(uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/timeout.pyu__str__]suTimeout.__str__cCs�|tkr|jS|dks.||jkr2|Syt|�Wn.ttfk
rptd||f��YnXy)|dkr�td||f��nWn(tk
r�td||f��YnX|S(ut Check that a timeout attribute is valid

        :param value: The timeout value to validate
        :param name: The name of the timeout attribute to validate. This is used
            for clear error messages
        :return: the value
        :raises ValueError: if the type is not an integer or a float, or if it
            is a numeric value less than zero
        u8Timeout value %s was %s, but it must be an int or float.iuXAttempted to set %s timeout to %s, but the timeout cannot be set to a value less than 0.N(u_DefaultuDEFAULT_TIMEOUTuNoneufloatu	TypeErroru
ValueError(uclsuvalueuname((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/timeout.pyu_validate_timeoutbs"
uTimeout._validate_timeoutcCstd|d|�S(u� Create a new Timeout from a legacy timeout value.

        The timeout value used by httplib.py sets the same timeout on the
        connect(), and recv() socket requests. This creates a :class:`Timeout`
        object that sets the individual timeouts to the ``timeout`` value passed
        to this function.

        :param timeout: The legacy timeout value
        :type timeout: integer, float, sentinel default object, or None
        :return: a Timeout object
        :rtype: :class:`Timeout`
        ureaduconnect(uTimeout(uclsutimeout((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/timeout.pyu
from_float�suTimeout.from_floatcCs"td|jd|jd|j�S(u Create a copy of the timeout object

        Timeout properties are stored per-pool but each request needs a fresh
        Timeout object to ensure each one has its own start/stop configured.

        :return: a copy of the timeout object
        :rtype: :class:`Timeout`
        uconnectureadutotal(uTimeoutu_connectu_readutotal(uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/timeout.pyuclone�su
Timeout.clonecCs1|jdk	rtd��nt�|_|jS(u� Start the timeout clock, used during a connect() attempt

        :raises urllib3.exceptions.TimeoutStateError: if you attempt
            to start a timer that has been started already.
        u'Timeout timer has already been started.N(u_start_connectuNoneuTimeoutStateErrorucurrent_time(uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/timeout.pyu
start_connect�suTimeout.start_connectcCs,|jdkrtd��nt�|jS(u Gets the time elapsed since the call to :meth:`start_connect`.

        :return: the elapsed time
        :rtype: float
        :raises urllib3.exceptions.TimeoutStateError: if you attempt
            to get duration for a timer that hasn't been started.
        u:Can't get connect duration for timer that has not started.N(u_start_connectuNoneuTimeoutStateErrorucurrent_time(uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/timeout.pyuget_connect_duration�suTimeout.get_connect_durationcCsQ|jdkr|jS|jdks7|j|jkr>|jSt|j|j�S(u% Get the value to use when setting a connection timeout.

        This will be a positive float or integer, the value None
        (never timeout), or the default system timeout.

        :return: the connect timeout
        :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None
        N(utotaluNoneu_connectuDEFAULT_TIMEOUTumin(uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/timeout.pyuconnect_timeout�s

!uTimeout.connect_timeoutcCs�|jdk	r~|j|jk	r~|jdk	r~|j|jk	r~|jdkrX|jStdt|j|j�|j��S|jdk	r�|j|jk	r�td|j|j��S|jSdS(u� Get the value for the read timeout.

        This assumes some time has elapsed in the connection timeout and
        computes the read timeout appropriately.

        If self.total is set, the read timeout is dependent on the amount of
        time taken by the connect timeout. If the connection time has not been
        established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be
        raised.

        :return: the value to use for the read timeout
        :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None
        :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect`
            has not yet been called on this object.
        iN(utotaluNoneuDEFAULT_TIMEOUTu_readu_start_connectumaxuminuget_connect_duration(uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/timeout.pyuread_timeout�s
!uTimeout.read_timeoutN(u__name__u
__module__u__qualname__u__doc__u_GLOBAL_DEFAULT_TIMEOUTuDEFAULT_TIMEOUTuNoneu_Defaultu__init__u__str__uclassmethodu_validate_timeoutu
from_floatucloneu
start_connectuget_connect_durationupropertyuconnect_timeouturead_timeout(u
__locals__((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/timeout.pyuTimeouts?"
uTimeout(	usocketu_GLOBAL_DEFAULT_TIMEOUTutimeu
exceptionsuTimeoutStateErrorucurrent_timeuobjectu_DefaultuTimeout(((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/util/timeout.pyu<module>s
	site-packages/pip/_vendor/requests/packages/urllib3/util/response.py000064400000000542151733463700021714 0ustar00def is_fp_closed(obj):
    """
    Checks whether a given file-like object is closed.

    :param obj:
        The file-like object to check.
    """
    if hasattr(obj, 'fp'):
        # Object is a container for another file-like object that gets released
        # on exhaustion (e.g. HTTPResponse)
        return obj.fp is None

    return obj.closed
site-packages/pip/_vendor/requests/packages/urllib3/util/timeout.py000064400000022024151733463700021543 0ustar00from socket import _GLOBAL_DEFAULT_TIMEOUT
import time

from ..exceptions import TimeoutStateError


def current_time():
    """
    Retrieve the current time, this function is mocked out in unit testing.
    """
    return time.time()


_Default = object()
# The default timeout to use for socket connections. This is the attribute used
# by httplib to define the default timeout


class Timeout(object):
    """
    Utility object for storing timeout values.

    Example usage:

    .. code-block:: python

        timeout = urllib3.util.Timeout(connect=2.0, read=7.0)
        pool = HTTPConnectionPool('www.google.com', 80, timeout=timeout)
        pool.request(...) # Etc, etc

    :param connect:
        The maximum amount of time to wait for a connection attempt to a server
        to succeed. Omitting the parameter will default the connect timeout to
        the system default, probably `the global default timeout in socket.py
        <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_.
        None will set an infinite timeout for connection attempts.

    :type connect: integer, float, or None

    :param read:
        The maximum amount of time to wait between consecutive
        read operations for a response from the server. Omitting
        the parameter will default the read timeout to the system
        default, probably `the global default timeout in socket.py
        <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_.
        None will set an infinite timeout.

    :type read: integer, float, or None

    :param total:
        This combines the connect and read timeouts into one; the read timeout
        will be set to the time leftover from the connect attempt. In the
        event that both a connect timeout and a total are specified, or a read
        timeout and a total are specified, the shorter timeout will be applied.

        Defaults to None.

    :type total: integer, float, or None

    .. note::

        Many factors can affect the total amount of time for urllib3 to return
        an HTTP response. Specifically, Python's DNS resolver does not obey the
        timeout specified on the socket. Other factors that can affect total
        request time include high CPU load, high swap, the program running at a
        low priority level, or other behaviors. The observed running time for
        urllib3 to return a response may be greater than the value passed to
        `total`.

        In addition, the read and total timeouts only measure the time between
        read operations on the socket connecting the client and the server,
        not the total amount of time for the request to return a complete
        response. For most requests, the timeout is raised because the server
        has not sent the first byte in the specified time. This is not always
        the case; if a server streams one byte every fifteen seconds, a timeout
        of 20 seconds will not ever trigger, even though the request will
        take several minutes to complete.

        If your goal is to cut off any request after a set amount of wall clock
        time, consider having a second "watcher" thread to cut off a slow
        request.
    """

    #: A sentinel object representing the default timeout value
    DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT

    def __init__(self, total=None, connect=_Default, read=_Default):
        self._connect = self._validate_timeout(connect, 'connect')
        self._read = self._validate_timeout(read, 'read')
        self.total = self._validate_timeout(total, 'total')
        self._start_connect = None

    def __str__(self):
        return '%s(connect=%r, read=%r, total=%r)' % (
            type(self).__name__, self._connect, self._read, self.total)


    @classmethod
    def _validate_timeout(cls, value, name):
        """ Check that a timeout attribute is valid

        :param value: The timeout value to validate
        :param name: The name of the timeout attribute to validate. This is used
            for clear error messages
        :return: the value
        :raises ValueError: if the type is not an integer or a float, or if it
            is a numeric value less than zero
        """
        if value is _Default:
            return cls.DEFAULT_TIMEOUT

        if value is None or value is cls.DEFAULT_TIMEOUT:
            return value

        try:
            float(value)
        except (TypeError, ValueError):
            raise ValueError("Timeout value %s was %s, but it must be an "
                             "int or float." % (name, value))

        try:
            if value < 0:
                raise ValueError("Attempted to set %s timeout to %s, but the "
                                 "timeout cannot be set to a value less "
                                 "than 0." % (name, value))
        except TypeError: # Python 3
            raise ValueError("Timeout value %s was %s, but it must be an "
                             "int or float." % (name, value))

        return value

    @classmethod
    def from_float(cls, timeout):
        """ Create a new Timeout from a legacy timeout value.

        The timeout value used by httplib.py sets the same timeout on the
        connect(), and recv() socket requests. This creates a :class:`Timeout`
        object that sets the individual timeouts to the ``timeout`` value passed
        to this function.

        :param timeout: The legacy timeout value
        :type timeout: integer, float, sentinel default object, or None
        :return: a Timeout object
        :rtype: :class:`Timeout`
        """
        return Timeout(read=timeout, connect=timeout)

    def clone(self):
        """ Create a copy of the timeout object

        Timeout properties are stored per-pool but each request needs a fresh
        Timeout object to ensure each one has its own start/stop configured.

        :return: a copy of the timeout object
        :rtype: :class:`Timeout`
        """
        # We can't use copy.deepcopy because that will also create a new object
        # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to
        # detect the user default.
        return Timeout(connect=self._connect, read=self._read,
                       total=self.total)

    def start_connect(self):
        """ Start the timeout clock, used during a connect() attempt

        :raises urllib3.exceptions.TimeoutStateError: if you attempt
            to start a timer that has been started already.
        """
        if self._start_connect is not None:
            raise TimeoutStateError("Timeout timer has already been started.")
        self._start_connect = current_time()
        return self._start_connect

    def get_connect_duration(self):
        """ Gets the time elapsed since the call to :meth:`start_connect`.

        :return: the elapsed time
        :rtype: float
        :raises urllib3.exceptions.TimeoutStateError: if you attempt
            to get duration for a timer that hasn't been started.
        """
        if self._start_connect is None:
            raise TimeoutStateError("Can't get connect duration for timer "
                                    "that has not started.")
        return current_time() - self._start_connect

    @property
    def connect_timeout(self):
        """ Get the value to use when setting a connection timeout.

        This will be a positive float or integer, the value None
        (never timeout), or the default system timeout.

        :return: the connect timeout
        :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None
        """
        if self.total is None:
            return self._connect

        if self._connect is None or self._connect is self.DEFAULT_TIMEOUT:
            return self.total

        return min(self._connect, self.total)

    @property
    def read_timeout(self):
        """ Get the value for the read timeout.

        This assumes some time has elapsed in the connection timeout and
        computes the read timeout appropriately.

        If self.total is set, the read timeout is dependent on the amount of
        time taken by the connect timeout. If the connection time has not been
        established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be
        raised.

        :return: the value to use for the read timeout
        :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None
        :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect`
            has not yet been called on this object.
        """
        if (self.total is not None and
            self.total is not self.DEFAULT_TIMEOUT and
            self._read is not None and
            self._read is not self.DEFAULT_TIMEOUT):
            # in case the connect timeout has not yet been established.
            if self._start_connect is None:
                return self._read
            return max(0, min(self.total - self.get_connect_duration(),
                              self._read))
        elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT:
            return max(0, self.total - self.get_connect_duration())
        else:
            return self._read
site-packages/pip/_vendor/requests/packages/urllib3/util/__init__.py000064400000001156151733463700021617 0ustar00# urllib3/util/__init__.py
# Copyright 2008-2014 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
#
# This module is part of urllib3 and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php

from .connection import is_connection_dropped
from .request import make_headers
from .response import is_fp_closed
from .ssl_ import (
    SSLContext,
    HAS_SNI,
    assert_fingerprint,
    resolve_cert_reqs,
    resolve_ssl_version,
    ssl_wrap_socket,
)
from .timeout import (
    current_time,
    Timeout,
)
from .url import (
    get_host,
    parse_url,
    split_first,
    Url,
)
site-packages/pip/_vendor/requests/packages/urllib3/util/request.py000064400000003604151733463700021550 0ustar00from base64 import b64encode

from ..packages import six


ACCEPT_ENCODING = 'gzip,deflate'


def make_headers(keep_alive=None, accept_encoding=None, user_agent=None,
                 basic_auth=None, proxy_basic_auth=None):
    """
    Shortcuts for generating request headers.

    :param keep_alive:
        If ``True``, adds 'connection: keep-alive' header.

    :param accept_encoding:
        Can be a boolean, list, or string.
        ``True`` translates to 'gzip,deflate'.
        List will get joined by comma.
        String will be used as provided.

    :param user_agent:
        String representing the user-agent you want, such as
        "python-urllib3/0.6"

    :param basic_auth:
        Colon-separated username:password string for 'authorization: basic ...'
        auth header.

    :param proxy_basic_auth:
        Colon-separated username:password string for 'proxy-authorization: basic ...'
        auth header.

    Example: ::

        >>> make_headers(keep_alive=True, user_agent="Batman/1.0")
        {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'}
        >>> make_headers(accept_encoding=True)
        {'accept-encoding': 'gzip,deflate'}
    """
    headers = {}
    if accept_encoding:
        if isinstance(accept_encoding, str):
            pass
        elif isinstance(accept_encoding, list):
            accept_encoding = ','.join(accept_encoding)
        else:
            accept_encoding = ACCEPT_ENCODING
        headers['accept-encoding'] = accept_encoding

    if user_agent:
        headers['user-agent'] = user_agent

    if keep_alive:
        headers['connection'] = 'keep-alive'

    if basic_auth:
        headers['authorization'] = 'Basic ' + \
            b64encode(six.b(basic_auth)).decode('utf-8')

    if proxy_basic_auth:
        headers['proxy-authorization'] = 'Basic ' + \
            b64encode(six.b(proxy_basic_auth)).decode('utf-8')

    return headers


site-packages/pip/_vendor/requests/packages/urllib3/exceptions.py000064400000006444151733463700021271 0ustar00# urllib3/exceptions.py
# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
#
# This module is part of urllib3 and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php


## Base Exceptions

class HTTPError(Exception):
    "Base exception used by this module."
    pass


class PoolError(HTTPError):
    "Base exception for errors caused within a pool."
    def __init__(self, pool, message):
        self.pool = pool
        HTTPError.__init__(self, "%s: %s" % (pool, message))

    def __reduce__(self):
        # For pickling purposes.
        return self.__class__, (None, None)


class RequestError(PoolError):
    "Base exception for PoolErrors that have associated URLs."
    def __init__(self, pool, url, message):
        self.url = url
        PoolError.__init__(self, pool, message)

    def __reduce__(self):
        # For pickling purposes.
        return self.__class__, (None, self.url, None)


class SSLError(HTTPError):
    "Raised when SSL certificate fails in an HTTPS connection."
    pass


class ProxyError(HTTPError):
    "Raised when the connection to a proxy fails."
    pass


class ConnectionError(HTTPError):
    "Raised when a normal connection fails."
    pass


class DecodeError(HTTPError):
    "Raised when automatic decoding based on Content-Type fails."
    pass


## Leaf Exceptions

class MaxRetryError(RequestError):
    "Raised when the maximum number of retries is exceeded."

    def __init__(self, pool, url, reason=None):
        self.reason = reason

        message = "Max retries exceeded with url: %s" % url
        if reason:
            message += " (Caused by %s: %s)" % (type(reason), reason)
        else:
            message += " (Caused by redirect)"

        RequestError.__init__(self, pool, url, message)


class HostChangedError(RequestError):
    "Raised when an existing pool gets a request for a foreign host."

    def __init__(self, pool, url, retries=3):
        message = "Tried to open a foreign host with url: %s" % url
        RequestError.__init__(self, pool, url, message)
        self.retries = retries


class TimeoutStateError(HTTPError):
    """ Raised when passing an invalid state to a timeout """
    pass


class TimeoutError(HTTPError):
    """ Raised when a socket timeout error occurs.

    Catching this error will catch both :exc:`ReadTimeoutErrors
    <ReadTimeoutError>` and :exc:`ConnectTimeoutErrors <ConnectTimeoutError>`.
    """
    pass


class ReadTimeoutError(TimeoutError, RequestError):
    "Raised when a socket timeout occurs while receiving data from a server"
    pass


# This timeout error does not have a URL attached and needs to inherit from the
# base HTTPError
class ConnectTimeoutError(TimeoutError):
    "Raised when a socket timeout occurs while connecting to a server"
    pass


class EmptyPoolError(PoolError):
    "Raised when a pool runs out of connections and no more are allowed."
    pass


class ClosedPoolError(PoolError):
    "Raised when a request enters a pool after the pool has been closed."
    pass


class LocationParseError(ValueError, HTTPError):
    "Raised when get_host or similar fails to parse the URL input."

    def __init__(self, location):
        message = "Failed to parse: %s" % location
        HTTPError.__init__(self, message)

        self.location = location
site-packages/pip/_vendor/requests/packages/urllib3/poolmanager.py000064400000021421151733463710021405 0ustar00# urllib3/poolmanager.py
# Copyright 2008-2014 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
#
# This module is part of urllib3 and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php

import logging

try:  # Python 3
    from urllib.parse import urljoin
except ImportError:
    from urlparse import urljoin

from ._collections import RecentlyUsedContainer
from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool
from .connectionpool import port_by_scheme
from .request import RequestMethods
from .util import parse_url


__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url']


pool_classes_by_scheme = {
    'http': HTTPConnectionPool,
    'https': HTTPSConnectionPool,
}

log = logging.getLogger(__name__)

SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs',
                'ssl_version')


class PoolManager(RequestMethods):
    """
    Allows for arbitrary requests while transparently keeping track of
    necessary connection pools for you.

    :param num_pools:
        Number of connection pools to cache before discarding the least
        recently used pool.

    :param headers:
        Headers to include with all requests, unless other headers are given
        explicitly.

    :param \**connection_pool_kw:
        Additional parameters are used to create fresh
        :class:`urllib3.connectionpool.ConnectionPool` instances.

    Example: ::

        >>> manager = PoolManager(num_pools=2)
        >>> r = manager.request('GET', 'http://google.com/')
        >>> r = manager.request('GET', 'http://google.com/mail')
        >>> r = manager.request('GET', 'http://yahoo.com/')
        >>> len(manager.pools)
        2

    """

    proxy = None

    def __init__(self, num_pools=10, headers=None, **connection_pool_kw):
        RequestMethods.__init__(self, headers)
        self.connection_pool_kw = connection_pool_kw
        self.pools = RecentlyUsedContainer(num_pools,
                                           dispose_func=lambda p: p.close())

    def _new_pool(self, scheme, host, port):
        """
        Create a new :class:`ConnectionPool` based on host, port and scheme.

        This method is used to actually create the connection pools handed out
        by :meth:`connection_from_url` and companion methods. It is intended
        to be overridden for customization.
        """
        pool_cls = pool_classes_by_scheme[scheme]
        kwargs = self.connection_pool_kw
        if scheme == 'http':
            kwargs = self.connection_pool_kw.copy()
            for kw in SSL_KEYWORDS:
                kwargs.pop(kw, None)

        return pool_cls(host, port, **kwargs)

    def clear(self):
        """
        Empty our store of pools and direct them all to close.

        This will not affect in-flight connections, but they will not be
        re-used after completion.
        """
        self.pools.clear()

    def connection_from_host(self, host, port=None, scheme='http'):
        """
        Get a :class:`ConnectionPool` based on the host, port, and scheme.

        If ``port`` isn't given, it will be derived from the ``scheme`` using
        ``urllib3.connectionpool.port_by_scheme``.
        """

        scheme = scheme or 'http'

        port = port or port_by_scheme.get(scheme, 80)

        pool_key = (scheme, host, port)

        with self.pools.lock:
            # If the scheme, host, or port doesn't match existing open
            # connections, open a new ConnectionPool.
            pool = self.pools.get(pool_key)
            if pool:
                return pool

            # Make a fresh ConnectionPool of the desired type
            pool = self._new_pool(scheme, host, port)
            self.pools[pool_key] = pool
        return pool

    def connection_from_url(self, url):
        """
        Similar to :func:`urllib3.connectionpool.connection_from_url` but
        doesn't pass any additional parameters to the
        :class:`urllib3.connectionpool.ConnectionPool` constructor.

        Additional parameters are taken from the :class:`.PoolManager`
        constructor.
        """
        u = parse_url(url)
        return self.connection_from_host(u.host, port=u.port, scheme=u.scheme)

    def urlopen(self, method, url, redirect=True, **kw):
        """
        Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen`
        with custom cross-host redirect logic and only sends the request-uri
        portion of the ``url``.

        The given ``url`` parameter must be absolute, such that an appropriate
        :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it.
        """
        u = parse_url(url)
        conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme)

        kw['assert_same_host'] = False
        kw['redirect'] = False
        if 'headers' not in kw:
            kw['headers'] = self.headers

        if self.proxy is not None and u.scheme == "http":
            response = conn.urlopen(method, url, **kw)
        else:
            response = conn.urlopen(method, u.request_uri, **kw)

        redirect_location = redirect and response.get_redirect_location()
        if not redirect_location:
            return response

        # Support relative URLs for redirecting.
        redirect_location = urljoin(url, redirect_location)

        # RFC 2616, Section 10.3.4
        if response.status == 303:
            method = 'GET'

        log.info("Redirecting %s -> %s" % (url, redirect_location))
        kw['retries'] = kw.get('retries', 3) - 1  # Persist retries countdown
        kw['redirect'] = redirect
        return self.urlopen(method, redirect_location, **kw)


class ProxyManager(PoolManager):
    """
    Behaves just like :class:`PoolManager`, but sends all requests through
    the defined proxy, using the CONNECT method for HTTPS URLs.

    :param proxy_url:
        The URL of the proxy to be used.

    :param proxy_headers:
        A dictionary contaning headers that will be sent to the proxy. In case
        of HTTP they are being sent with each request, while in the
        HTTPS/CONNECT case they are sent only once. Could be used for proxy
        authentication.

    Example:
        >>> proxy = urllib3.ProxyManager('http://localhost:3128/')
        >>> r1 = proxy.request('GET', 'http://google.com/')
        >>> r2 = proxy.request('GET', 'http://httpbin.org/')
        >>> len(proxy.pools)
        1
        >>> r3 = proxy.request('GET', 'https://httpbin.org/')
        >>> r4 = proxy.request('GET', 'https://twitter.com/')
        >>> len(proxy.pools)
        3

    """

    def __init__(self, proxy_url, num_pools=10, headers=None,
                 proxy_headers=None, **connection_pool_kw):

        if isinstance(proxy_url, HTTPConnectionPool):
            proxy_url = '%s://%s:%i' % (proxy_url.scheme, proxy_url.host,
                                        proxy_url.port)
        proxy = parse_url(proxy_url)
        if not proxy.port:
            port = port_by_scheme.get(proxy.scheme, 80)
            proxy = proxy._replace(port=port)
        self.proxy = proxy
        self.proxy_headers = proxy_headers or {}
        assert self.proxy.scheme in ("http", "https"), \
            'Not supported proxy scheme %s' % self.proxy.scheme
        connection_pool_kw['_proxy'] = self.proxy
        connection_pool_kw['_proxy_headers'] = self.proxy_headers
        super(ProxyManager, self).__init__(
            num_pools, headers, **connection_pool_kw)

    def connection_from_host(self, host, port=None, scheme='http'):
        if scheme == "https":
            return super(ProxyManager, self).connection_from_host(
                host, port, scheme)

        return super(ProxyManager, self).connection_from_host(
            self.proxy.host, self.proxy.port, self.proxy.scheme)

    def _set_proxy_headers(self, url, headers=None):
        """
        Sets headers needed by proxies: specifically, the Accept and Host
        headers. Only sets headers not provided by the user.
        """
        headers_ = {'Accept': '*/*'}

        netloc = parse_url(url).netloc
        if netloc:
            headers_['Host'] = netloc

        if headers:
            headers_.update(headers)
        return headers_

    def urlopen(self, method, url, redirect=True, **kw):
        "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute."
        u = parse_url(url)

        if u.scheme == "http":
            # For proxied HTTPS requests, httplib sets the necessary headers
            # on the CONNECT to the proxy. For HTTP, we'll definitely
            # need to set 'Host' at the very least.
            kw['headers'] = self._set_proxy_headers(url, kw.get('headers',
                                                                self.headers))

        return super(ProxyManager, self).urlopen(method, url, redirect, **kw)


def proxy_from_url(url, **kw):
    return ProxyManager(proxy_url=url, **kw)
site-packages/pip/_vendor/requests/packages/urllib3/packages/__pycache__/__init__.cpython-33.pyc000064400000000517151733463710026702 0ustar00�
7�ReJc@s$ddlmZddlmZdS(i(uabsolute_importi(ussl_match_hostnameN(u
__future__uabsolute_importuussl_match_hostname(((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/__init__.pyu<module>ssite-packages/pip/_vendor/requests/packages/urllib3/packages/__pycache__/ordered_dict.cpython-33.pyc000064400000031320151733463710027566 0ustar00�
7�Re�"c@s�yddlmZWn"ek
r8ddlmZYnXy ddlmZmZmZWnek
rmYnXGdd�de	�Z
dS(i(u	get_ident(uKeysViewu
ValuesViewu	ItemsViewcBsv|EeZdZdZdd�Zejdd�Zejdd�Zdd	�Zd
d�Z	dd
�Z
d5dd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�ZeZe�Zedd�Zd4d d!�Zid"d#�Zd$d%�Zd&d'�Zed4d(d)��Zd*d+�Zd,d-�Z d.d/�Z!d0d1�Z"d2d3�Z#d4S(6uOrderedDictu)Dictionary that remembers insertion ordercOs�t|�dkr+tdt|���ny|jWnAtk
ryg|_}||dg|dd�<i|_YnX|j||�dS(u�Initialize an ordered dictionary.  Signature is the same as for
        regular dictionaries, but keyword arguments are not recommended
        because their insertion order is arbitrary.

        iu$expected at most 1 arguments, got %dN(ulenu	TypeErroru_OrderedDict__rootuAttributeErroruNoneu_OrderedDict__mapu_OrderedDict__update(uselfuargsukwdsuroot((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyu__init__s

uOrderedDict.__init__cCs\||krH|j}|d}|||g|d<|d<|j|<n||||�dS(u!od.__setitem__(i, y) <==> od[i]=yiiN(u_OrderedDict__rootu_OrderedDict__map(uselfukeyuvalueudict_setitemurootulast((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyu__setitem__-s
	
)uOrderedDict.__setitem__cCs@|||�|jj|�\}}}||d<||d<dS(u od.__delitem__(y) <==> del od[y]iiN(u_OrderedDict__mapupop(uselfukeyudict_delitemu	link_prevu	link_next((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyu__delitem__7s

uOrderedDict.__delitem__ccs=|j}|d}x#||k	r8|dV|d}qWdS(uod.__iter__() <==> iter(od)iiN(u_OrderedDict__root(uselfurootucurr((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyu__iter__@s
	
	uOrderedDict.__iter__ccs=|j}|d}x#||k	r8|dV|d}qWdS(u#od.__reversed__() <==> reversed(od)iiN(u_OrderedDict__root(uselfurootucurr((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyu__reversed__Hs
	
	uOrderedDict.__reversed__cCs�yZx$|jj�D]}|dd�=qW|j}||dg|dd�<|jj�Wntk
rnYnXtj|�dS(u.od.clear() -> None.  Remove all items from od.N(u_OrderedDict__mapu
itervaluesu_OrderedDict__rootuNoneuclearuAttributeErrorudict(uselfunodeuroot((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyuclearPs	
uOrderedDict.clearcCs�|std��n|j}|rO|d}|d}||d<||d<n(|d}|d}||d<||d<|d}|j|=tj||�}||fS(u�od.popitem() -> (k, v), return and remove a (key, value) pair.
        Pairs are returned in LIFO order if last is true or FIFO order if false.

        udictionary is emptyiii(uKeyErroru_OrderedDict__rootu_OrderedDict__mapudictupop(uselfulasturootulinku	link_prevu	link_nextukeyuvalue((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyupopitem\s 	









uOrderedDict.popitemcCs
t|�S(uod.keys() -> list of keys in od(ulist(uself((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyukeysusuOrderedDict.keyscs�fdd��D�S(u#od.values() -> list of values in odcsg|]}�|�qS(((u.0ukey(uself(uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyu
<listcomp>{s	u&OrderedDict.values.<locals>.<listcomp>((uself((uselfuT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyuvaluesysuOrderedDict.valuescs�fdd��D�S(u.od.items() -> list of (key, value) pairs in odcs g|]}|�|f�qS(((u.0ukey(uself(uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyu
<listcomp>s	u%OrderedDict.items.<locals>.<listcomp>((uself((uselfuT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyuitems}suOrderedDict.itemscCs
t|�S(u0od.iterkeys() -> an iterator over the keys in od(uiter(uself((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyuiterkeys�suOrderedDict.iterkeysccsx|D]}||VqWdS(u2od.itervalues -> an iterator over the values in odN((uselfuk((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyu
itervalues�s
uOrderedDict.itervaluesccs$x|D]}|||fVqWdS(u=od.iteritems -> an iterator over the (key, value) items in odN((uselfuk((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyu	iteritems�s
uOrderedDict.iteritemscOs&t|�dkr.tdt|�f��n|sCtd��n|d}f}t|�dkrr|d}nt|t�r�xw|D]}||||<q�WnXt|d�r�xF|j�D]}||||<q�Wn!x|D]\}}|||<q�Wx$|j�D]\}}|||<qWdS(u�od.update(E, **F) -> None.  Update od from dict/iterable E and F.

        If E is a dict instance, does:           for k in E: od[k] = E[k]
        If E has a .keys() method, does:         for k in E.keys(): od[k] = E[k]
        Or if E is an iterable of items, does:   for k, v in E: od[k] = v
        In either case, this is followed by:     for k, v in F.items(): od[k] = v

        iu8update() takes at most 2 positional arguments (%d given)u,update() takes at least 1 argument (0 given)iiukeysN(ulenu	TypeErroru
isinstanceudictuhasattrukeysuitems(uargsukwdsuselfuotherukeyuvalue((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyuupdate�s&	


uOrderedDict.updatecCsC||kr!||}||=|S||jkr?t|��n|S(u�od.pop(k[,d]) -> v, remove specified key and return the corresponding value.
        If key is not found, d is returned if given, otherwise KeyError is raised.

        (u_OrderedDict__markeruKeyError(uselfukeyudefaulturesult((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyupop�s
uOrderedDict.popcCs"||kr||S|||<|S(uDod.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od((uselfukeyudefault((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyu
setdefault�s
uOrderedDict.setdefaultcCsst|�t�f}||kr%dSd||<z5|sId|jjfSd|jj|j�fSWd||=XdS(uod.__repr__() <==> repr(od)u...iu%s()u%s(%r)N(uidu
_get_identu	__class__u__name__uitems(uselfu
_repr_runningucall_key((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyu__repr__�s
uOrderedDict.__repr__cs~�fdd��D�}t��j�}x'tt��D]}|j|d�q;W|rn�j|f|fS�j|ffS(u%Return state information for picklingcs g|]}|�|g�qS(((u.0uk(uself(uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyu
<listcomp>�s	u*OrderedDict.__reduce__.<locals>.<listcomp>N(uvarsucopyuOrderedDictupopuNoneu	__class__(uselfuitemsu	inst_dictuk((uselfuT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyu
__reduce__�suOrderedDict.__reduce__cCs
|j|�S(u!od.copy() -> a shallow copy of od(u	__class__(uself((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyucopy�suOrderedDict.copycCs(|�}x|D]}|||<qW|S(u�OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S
        and values equal to v (which defaults to None).

        ((uclsuiterableuvalueudukey((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyufromkeys�s	
uOrderedDict.fromkeyscCsMt|t�r=t|�t|�ko<|j�|j�kStj||�S(u�od.__eq__(y) <==> od==y.  Comparison to another OD is order-sensitive
        while comparison to a regular mapping is order-insensitive.

        (u
isinstanceuOrderedDictulenuitemsudictu__eq__(uselfuother((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyu__eq__�s.uOrderedDict.__eq__cCs||kS(N((uselfuother((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyu__ne__�suOrderedDict.__ne__cCs
t|�S(u@od.viewkeys() -> a set-like object providing a view on od's keys(uKeysView(uself((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyuviewkeys�suOrderedDict.viewkeyscCs
t|�S(u<od.viewvalues() -> an object providing a view on od's values(u
ValuesView(uself((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyu
viewvalues�suOrderedDict.viewvaluescCs
t|�S(uBod.viewitems() -> a set-like object providing a view on od's items(u	ItemsView(uself((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyu	viewitemssuOrderedDict.viewitemsNT($u__name__u
__module__u__qualname__u__doc__u__init__udictu__setitem__u__delitem__u__iter__u__reversed__uclearuTrueupopitemukeysuvaluesuitemsuiterkeysu
itervaluesu	iteritemsuupdateu_OrderedDict__updateuobjectu_OrderedDict__markerupopuNoneu
setdefaultu__repr__u
__reduce__ucopyuclassmethodufromkeysu__eq__u__ne__uviewkeysu
viewvaluesu	viewitems(u
__locals__((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyuOrderedDicts:
		



	uOrderedDictN(uthreadu	get_identu
_get_identuImportErrorudummy_threadu_abcolluKeysViewu
ValuesViewu	ItemsViewudictuOrderedDict(((uT/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.pyu<module>s
 
site-packages/pip/_vendor/requests/packages/urllib3/packages/__pycache__/six.cpython-33.pyc000064400000037734151733463710025761 0ustar00�
7�Rel-c2@s�dZddlZddlZddlZdZdZejddkZer�efZ	e
fZefZ
eZeZejZn�efZ	e
efZeejfZ
eZeZejjd�r�e
d��ZnWGd	d
�d
e�Zyee��Wnek
re
d��ZYnXe
d��Z[dd
�Zdd�ZGdd�de�ZGdd�de�Z Gdd�de�Z!Gdd�dej"�Z#e!dddd�e!ddddd�e!dd dd!d�e!d"ddd#d"�e!d$d d%d&�e!d'd d(�e!ddd�e!d)d dd)d*�e!d+ddd,d+�e dd �e d-d.�e d/d0�e d1d2d3�e d4d5d6�e d7d8d9�e d:d;d<�e d=d>d?�e d@d@dA�e dBdBdA�e dCdCdA�e dDdDdE�e dFdG�e dHdI�e dJdK�e dLdM�e dNdOdP�e dQdRdS�e dTdUdV�e dWdXdY�e dZd[d\�e d]d^d_�e d`dadb�e dcddde�e dfdgdh�e didjdS�e dkdldm�e dndodp�e dqdrdY�e dsdtdu�e dvdw�g(Z$x!e$D]Z%e&e#e%j'e%�qW[%e#dx�Z(ej)e*dy<dzd{�Z+d|d}�Z,er�d~Z-dZ.d�Z/d�Z0d�Z1d�Z2d�Z3n*d�Z-d�Z.d�Z/d�Z0d�Z1d�Z2d�Z3y
e4Z5Wne6k
r�d�d��Z5YnXe5Z4erd�d��Z7eZ8d�d��Z9n(d�d��Z7Gd�d��d�e�Z8e9Z9ee7d��ej:e-�Z;ej:e.�Z<ej:e/�Z=ej:e0�Z>d�d��Z?d�d��Z@d�d��ZAer!d�d��ZBd�d��ZCejddkr�d�d��ZDnejEd�dd��ZDddlFZFeFjGZGeFjHZHn7d�d��ZBd�d��ZCeIZDddlGZGeGjGZGZHeeBd��eeCd��er�ddlJZJeKeJd��ZLdd�d��ZNeKeJd��ZO[Jn(ddd�d��ZLeLd��d�d��ZOeeNd��ed�d��ZPdS(�u6Utilities for writing code that runs on Python 2 and 3iNu'Benjamin Peterson <benjamin@python.org>u1.2.0iujavaiicBs |EeZdZdd�ZdS(uXcCsdS(Niil((uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyu__len__6su	X.__len__N(u__name__u
__module__u__qualname__u__len__(u
__locals__((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyuX5suXi?cCs
||_dS(u Add documentation to a function.N(u__doc__(ufuncudoc((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyu_add_docCsu_add_doccCst|�tj|S(u7Import module, returning the module after the last dot.(u
__import__usysumodules(uname((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyu_import_moduleHs
u_import_modulecBs,|EeZdZdd�Zdd�ZdS(u
_LazyDescrcCs
||_dS(N(uname(uselfuname((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyu__init__Psu_LazyDescr.__init__cCs3|j�}t||j|�t||j�|S(N(u_resolveusetattrunameudelattr(uselfuobjutpuresult((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyu__get__Ssu_LazyDescr.__get__N(u__name__u
__module__u__qualname__u__init__u__get__(u
__locals__((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyu
_LazyDescrNsu
_LazyDescrcs5|EeZdZd�fdd�Zdd�Z�S(uMovedModulecsJtt|�j|�tr=|dkr1|}n||_n	||_dS(N(usuperuMovedModuleu__init__uPY3uNoneumod(uselfunameuoldunew(u	__class__(uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyu__init__]s	uMovedModule.__init__cCs
t|j�S(N(u_import_moduleumod(uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyu_resolvefsuMovedModule._resolveN(u__name__u
__module__u__qualname__uNoneu__init__u_resolve(u
__locals__((u	__class__uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyuMovedModule[s	uMovedModulecs8|EeZdZdd�fdd�Zdd�Z�S(uMovedAttributecs�tt|�j|�trp|dkr1|}n||_|dkrd|dkr[|}qd|}n||_n'||_|dkr�|}n||_dS(N(usuperuMovedAttributeu__init__uPY3uNoneumoduattr(uselfunameuold_modunew_moduold_attrunew_attr(u	__class__(uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyu__init__ls						uMovedAttribute.__init__cCst|j�}t||j�S(N(u_import_moduleumodugetattruattr(uselfumodule((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyu_resolve~suMovedAttribute._resolveN(u__name__u
__module__u__qualname__uNoneu__init__u_resolve(u
__locals__((u	__class__uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyuMovedAttributejsuMovedAttributecBs|EeZdZdZdS(u_MovedItemsuLazy loading of moved objectsN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyu_MovedItems�su_MovedItemsu	cStringIOuiouStringIOufilteru	itertoolsubuiltinsuifilteruinputu__builtin__u	raw_inputumapuimapu
reload_moduleuimpureloadureduceu	functoolsuxrangeurangeuzipuizipuconfigparseruConfigParserucopyregucopy_reguhttp_cookiejaru	cookielibuhttp.cookiejaruhttp_cookiesuCookieuhttp.cookiesu
html_entitiesuhtmlentitydefsu
html.entitiesuhtml_parseru
HTMLParseruhtml.parseruhttp_clientuhttplibuhttp.clientuBaseHTTPServeruhttp.serveru
CGIHTTPServeruSimpleHTTPServerucPickleupickleuqueueuQueueureprlibureprusocketserveruSocketServerutkinteruTkinterutkinter_dialoguDialogutkinter.dialogutkinter_filedialogu
FileDialogutkinter.filedialogutkinter_scrolledtextuScrolledTextutkinter.scrolledtextutkinter_simpledialoguSimpleDialogutkinter.simpledialogutkinter_tixuTixutkinter.tixutkinter_constantsuTkconstantsutkinter.constantsutkinter_dnduTkdndutkinter.dndutkinter_colorchooserutkColorChooserutkinter.colorchooserutkinter_commondialogutkCommonDialogutkinter.commondialogutkinter_tkfiledialogutkFileDialogutkinter_fontutkFontutkinter.fontutkinter_messageboxutkMessageBoxutkinter.messageboxutkinter_tksimpledialogutkSimpleDialoguurllib_robotparserurobotparseruurllib.robotparseruwinregu_winregumovesu.movescCstt|j|�dS(uAdd an item to six.moves.N(usetattru_MovedItemsuname(umove((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyuadd_move�suadd_movecCs`ytt|�WnHtk
r[ytj|=Wn%tk
rVtd|f��YnXYnXdS(uRemove item from six.moves.uno such move, %rN(udelattru_MovedItemsuAttributeErrorumovesu__dict__uKeyError(uname((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyuremove_move�s

uremove_moveu__func__u__self__u__code__u__defaults__ukeysuvaluesuitemsuim_funcuim_selfu	func_codeu
func_defaultsuiterkeysu
itervaluesu	iteritemscCs
|j�S(N(unext(uit((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyuadvance_iterator�suadvance_iteratorcCs|S(N((uunbound((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyuget_unbound_function�suget_unbound_functioncCs tdd�t|�jD��S(Ncss|]}d|jkVqdS(u__call__N(u__dict__(u.0uklass((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyu	<genexpr>�sucallable.<locals>.<genexpr>(uanyutypeu__mro__(uobj((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyucallable�sucallablecCs|jS(N(uim_func(uunbound((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyuget_unbound_function�scBs |EeZdZdd�ZdS(uIteratorcCst|�j|�S(N(utypeu__next__(uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyunext�su
Iterator.nextN(u__name__u
__module__u__qualname__unext(u
__locals__((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyuIterator�suIteratoru3Get the function out of a possibly unbound functioncCstt|t���S(u1Return an iterator over the keys of a dictionary.(uiterugetattru	_iterkeys(ud((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyuiterkeysscCstt|t���S(u3Return an iterator over the values of a dictionary.(uiterugetattru_itervalues(ud((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyu
itervaluesscCstt|t���S(u?Return an iterator over the (key, value) pairs of a dictionary.(uiterugetattru
_iteritems(ud((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyu	iteritemsscCs
|jd�S(Nulatin-1(uencode(us((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyubsubcCs|S(N((us((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyuusuucCs
t|f�S(N(ubytes(ui((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyuint2bytesuint2byteuto_bytesubigcCs|S(N((us((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyub#scCs
t|d�S(Nuunicode_escape(uunicode(us((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyuu%suByte literaluText literaluexeccCs+|j|k	r!|j|��n|�dS(N(u
__traceback__uwith_traceback(utpuvalueutb((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyureraise3sureraiseuprintcCse|dkrBtjd�}|j}|dkr<|j}n~n|dkrW|}ntd�dS(uExecute code in a namespace.iuexec code in globs, locsN(uNoneusysu	_getframeu	f_globalsuf_localsuexec(ucodeuglobsulocsuframe((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyuexec_=s		uexec_u9def reraise(tp, value, tb=None):
    raise tp, value, tb
c
s�|jdtj���dkr%dS�fdd�}d}|jdd�}|dk	r�t|t�rsd
}q�t|t�s�t	d��q�n|jdd�}|dk	r�t|t�r�d
}q�t|t�s�t	d��q�n|rt	d	��n|s3x*|D]}t|t�r
d
}Pq
q
Wn|rTtd
�}td�}nd
}d}|dkru|}n|dkr�|}nx7t
|�D])\}	}|	r�||�n||�q�W||�dS(uThe new-style print function.ufileNcs/t|t�st|�}n�j|�dS(N(u
isinstanceu
basestringustruwrite(udata(ufp(uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyuwriteTsuprint_.<locals>.writeusepusep must be None or a stringuenduend must be None or a stringu$invalid keyword arguments to print()u
u FT(upopusysustdoutuNoneuFalseu
isinstanceuunicodeuTrueustru	TypeErroru	enumerate(
uargsukwargsuwriteuwant_unicodeusepuenduargunewlineuspaceui((ufpuK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyuprint_OsL		
		
uprint_uReraise an exception.cCs|d|fi�S(u%Create a base class with a metaclass.uNewBase((umetaubase((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyuwith_metaclasssuwith_metaclassli���li���ll����(Qu__doc__uoperatorusysutypesu
__author__u__version__uversion_infouPY3ustrustring_typesuintu
integer_typesutypeuclass_typesu	text_typeubytesubinary_typeumaxsizeuMAXSIZEu
basestringulongu	ClassTypeuunicodeuplatformu
startswithuobjectuXulenu
OverflowErroru_add_docu_import_moduleu
_LazyDescruMovedModuleuMovedAttributeu
ModuleTypeu_MovedItemsu_moved_attributesuattrusetattrunameumovesumodulesu__name__uadd_moveuremove_moveu
_meth_funcu
_meth_selfu
_func_codeu_func_defaultsu	_iterkeysu_itervaluesu
_iteritemsunextuadvance_iteratoru	NameErroruget_unbound_functionuIteratorucallableu
attrgetteruget_method_functionuget_method_selfuget_function_codeuget_function_defaultsuiterkeysu
itervaluesu	iteritemsubuuuint2byteumethodcalleruiouStringIOuBytesIOuchrubuiltinsugetattruexec_uNoneureraiseuprint_uwith_metaclass(((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/six.pyu<module>s$				

			
	

	



-
site-packages/pip/_vendor/requests/packages/urllib3/packages/six.py000064400000026554151733463710021476 0ustar00"""Utilities for writing code that runs on Python 2 and 3"""

#Copyright (c) 2010-2011 Benjamin Peterson

#Permission is hereby granted, free of charge, to any person obtaining a copy of
#this software and associated documentation files (the "Software"), to deal in
#the Software without restriction, including without limitation the rights to
#use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
#the Software, and to permit persons to whom the Software is furnished to do so,
#subject to the following conditions:

#The above copyright notice and this permission notice shall be included in all
#copies or substantial portions of the Software.

#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
#FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
#COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
#IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
#CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

import operator
import sys
import types

__author__ = "Benjamin Peterson <benjamin@python.org>"
__version__ = "1.2.0"  # Revision 41c74fef2ded


# True if we are running on Python 3.
PY3 = sys.version_info[0] == 3

if PY3:
    string_types = str,
    integer_types = int,
    class_types = type,
    text_type = str
    binary_type = bytes

    MAXSIZE = sys.maxsize
else:
    string_types = basestring,
    integer_types = (int, long)
    class_types = (type, types.ClassType)
    text_type = unicode
    binary_type = str

    if sys.platform.startswith("java"):
        # Jython always uses 32 bits.
        MAXSIZE = int((1 << 31) - 1)
    else:
        # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
        class X(object):
            def __len__(self):
                return 1 << 31
        try:
            len(X())
        except OverflowError:
            # 32-bit
            MAXSIZE = int((1 << 31) - 1)
        else:
            # 64-bit
            MAXSIZE = int((1 << 63) - 1)
            del X


def _add_doc(func, doc):
    """Add documentation to a function."""
    func.__doc__ = doc


def _import_module(name):
    """Import module, returning the module after the last dot."""
    __import__(name)
    return sys.modules[name]


class _LazyDescr(object):

    def __init__(self, name):
        self.name = name

    def __get__(self, obj, tp):
        result = self._resolve()
        setattr(obj, self.name, result)
        # This is a bit ugly, but it avoids running this again.
        delattr(tp, self.name)
        return result


class MovedModule(_LazyDescr):

    def __init__(self, name, old, new=None):
        super(MovedModule, self).__init__(name)
        if PY3:
            if new is None:
                new = name
            self.mod = new
        else:
            self.mod = old

    def _resolve(self):
        return _import_module(self.mod)


class MovedAttribute(_LazyDescr):

    def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
        super(MovedAttribute, self).__init__(name)
        if PY3:
            if new_mod is None:
                new_mod = name
            self.mod = new_mod
            if new_attr is None:
                if old_attr is None:
                    new_attr = name
                else:
                    new_attr = old_attr
            self.attr = new_attr
        else:
            self.mod = old_mod
            if old_attr is None:
                old_attr = name
            self.attr = old_attr

    def _resolve(self):
        module = _import_module(self.mod)
        return getattr(module, self.attr)



class _MovedItems(types.ModuleType):
    """Lazy loading of moved objects"""


_moved_attributes = [
    MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
    MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
    MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
    MovedAttribute("map", "itertools", "builtins", "imap", "map"),
    MovedAttribute("reload_module", "__builtin__", "imp", "reload"),
    MovedAttribute("reduce", "__builtin__", "functools"),
    MovedAttribute("StringIO", "StringIO", "io"),
    MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
    MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),

    MovedModule("builtins", "__builtin__"),
    MovedModule("configparser", "ConfigParser"),
    MovedModule("copyreg", "copy_reg"),
    MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
    MovedModule("http_cookies", "Cookie", "http.cookies"),
    MovedModule("html_entities", "htmlentitydefs", "html.entities"),
    MovedModule("html_parser", "HTMLParser", "html.parser"),
    MovedModule("http_client", "httplib", "http.client"),
    MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
    MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
    MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
    MovedModule("cPickle", "cPickle", "pickle"),
    MovedModule("queue", "Queue"),
    MovedModule("reprlib", "repr"),
    MovedModule("socketserver", "SocketServer"),
    MovedModule("tkinter", "Tkinter"),
    MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
    MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
    MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
    MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
    MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
    MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
    MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
    MovedModule("tkinter_colorchooser", "tkColorChooser",
                "tkinter.colorchooser"),
    MovedModule("tkinter_commondialog", "tkCommonDialog",
                "tkinter.commondialog"),
    MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
    MovedModule("tkinter_font", "tkFont", "tkinter.font"),
    MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
    MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
                "tkinter.simpledialog"),
    MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
    MovedModule("winreg", "_winreg"),
]
for attr in _moved_attributes:
    setattr(_MovedItems, attr.name, attr)
del attr

moves = sys.modules[__name__ + ".moves"] = _MovedItems("moves")


def add_move(move):
    """Add an item to six.moves."""
    setattr(_MovedItems, move.name, move)


def remove_move(name):
    """Remove item from six.moves."""
    try:
        delattr(_MovedItems, name)
    except AttributeError:
        try:
            del moves.__dict__[name]
        except KeyError:
            raise AttributeError("no such move, %r" % (name,))


if PY3:
    _meth_func = "__func__"
    _meth_self = "__self__"

    _func_code = "__code__"
    _func_defaults = "__defaults__"

    _iterkeys = "keys"
    _itervalues = "values"
    _iteritems = "items"
else:
    _meth_func = "im_func"
    _meth_self = "im_self"

    _func_code = "func_code"
    _func_defaults = "func_defaults"

    _iterkeys = "iterkeys"
    _itervalues = "itervalues"
    _iteritems = "iteritems"


try:
    advance_iterator = next
except NameError:
    def advance_iterator(it):
        return it.next()
next = advance_iterator


if PY3:
    def get_unbound_function(unbound):
        return unbound

    Iterator = object

    def callable(obj):
        return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
else:
    def get_unbound_function(unbound):
        return unbound.im_func

    class Iterator(object):

        def next(self):
            return type(self).__next__(self)

    callable = callable
_add_doc(get_unbound_function,
         """Get the function out of a possibly unbound function""")


get_method_function = operator.attrgetter(_meth_func)
get_method_self = operator.attrgetter(_meth_self)
get_function_code = operator.attrgetter(_func_code)
get_function_defaults = operator.attrgetter(_func_defaults)


def iterkeys(d):
    """Return an iterator over the keys of a dictionary."""
    return iter(getattr(d, _iterkeys)())

def itervalues(d):
    """Return an iterator over the values of a dictionary."""
    return iter(getattr(d, _itervalues)())

def iteritems(d):
    """Return an iterator over the (key, value) pairs of a dictionary."""
    return iter(getattr(d, _iteritems)())


if PY3:
    def b(s):
        return s.encode("latin-1")
    def u(s):
        return s
    if sys.version_info[1] <= 1:
        def int2byte(i):
            return bytes((i,))
    else:
        # This is about 2x faster than the implementation above on 3.2+
        int2byte = operator.methodcaller("to_bytes", 1, "big")
    import io
    StringIO = io.StringIO
    BytesIO = io.BytesIO
else:
    def b(s):
        return s
    def u(s):
        return unicode(s, "unicode_escape")
    int2byte = chr
    import StringIO
    StringIO = BytesIO = StringIO.StringIO
_add_doc(b, """Byte literal""")
_add_doc(u, """Text literal""")


if PY3:
    import builtins
    exec_ = getattr(builtins, "exec")


    def reraise(tp, value, tb=None):
        if value.__traceback__ is not tb:
            raise value.with_traceback(tb)
        raise value


    print_ = getattr(builtins, "print")
    del builtins

else:
    def exec_(code, globs=None, locs=None):
        """Execute code in a namespace."""
        if globs is None:
            frame = sys._getframe(1)
            globs = frame.f_globals
            if locs is None:
                locs = frame.f_locals
            del frame
        elif locs is None:
            locs = globs
        exec("""exec code in globs, locs""")


    exec_("""def reraise(tp, value, tb=None):
    raise tp, value, tb
""")


    def print_(*args, **kwargs):
        """The new-style print function."""
        fp = kwargs.pop("file", sys.stdout)
        if fp is None:
            return
        def write(data):
            if not isinstance(data, basestring):
                data = str(data)
            fp.write(data)
        want_unicode = False
        sep = kwargs.pop("sep", None)
        if sep is not None:
            if isinstance(sep, unicode):
                want_unicode = True
            elif not isinstance(sep, str):
                raise TypeError("sep must be None or a string")
        end = kwargs.pop("end", None)
        if end is not None:
            if isinstance(end, unicode):
                want_unicode = True
            elif not isinstance(end, str):
                raise TypeError("end must be None or a string")
        if kwargs:
            raise TypeError("invalid keyword arguments to print()")
        if not want_unicode:
            for arg in args:
                if isinstance(arg, unicode):
                    want_unicode = True
                    break
        if want_unicode:
            newline = unicode("\n")
            space = unicode(" ")
        else:
            newline = "\n"
            space = " "
        if sep is None:
            sep = space
        if end is None:
            end = newline
        for i, arg in enumerate(args):
            if i:
                write(sep)
            write(arg)
        write(end)

_add_doc(reraise, """Reraise an exception.""")


def with_metaclass(meta, base=object):
    """Create a base class with a metaclass."""
    return meta("NewBase", (base,), {})
_vendor/requests/packages/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-33.pyc000064400000001127151733463710032474 0ustar00site-packages/pip�
7�Re�c@s~yddlmZmZWnWek
rsyddlmZmZWn(ek
rnddlmZmZYnXYnXdZdS(i(uCertificateErrorumatch_hostnameiuCertificateErrorumatch_hostnameN(uCertificateErrorumatch_hostname(ussluCertificateErrorumatch_hostnameuImportErrorubackports.ssl_match_hostnameu_implementationu__all__(((uc/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyu<module>s

 requests/packages/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-33.pyc000064400000006267151733463710034133 0ustar00site-packages/pip/_vendor�
7�Re�c@sMdZddlZdZGdd�de�Zddd�Zd	d
�ZdS(uJThe match_hostname() function from Python 3.3.3, essential when using SSL.iNu3.4.0.2cBs|EeZdZdS(uCertificateErrorN(u__name__u
__module__u__qualname__(u
__locals__((uj/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyuCertificateError
suCertificateErroric
CsXg}|sdS|jd�}|d}|dd�}|jd�}||krmtdt|���n|s�|j�|j�kS|dkr�|jd�nY|jd�s�|jd�r�|jtj	|��n"|jtj	|�j
d	d
��x$|D]}|jtj	|��qWtjddj|�d
tj
�}	|	j|�S(uhMatching according to RFC 6125, section 6.4.3

    http://tools.ietf.org/html/rfc6125#section-6.4.3
    u.iiNu*u,too many wildcards in certificate DNS name: u[^.]+uxn--u\*u[^.]*u\Au\.u\ZF(uFalseusplitucountuCertificateErrorurepruloweruappendu
startswithureuescapeureplaceucompileujoinu
IGNORECASEumatch(
udnuhostnameu
max_wildcardsupatsupartsuleftmostu	remainderu	wildcardsufragupat((uj/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyu_dnsname_matchs*
"
&u_dnsname_matchcCs[|std��ng}|jdf�}xC|D];\}}|dkr4t||�r_dS|j|�q4q4W|s�xc|jdf�D]L}xC|D];\}}|dkr�t||�r�dS|j|�q�q�Wq�Wnt|�dkrtd|d	jtt|��f��n;t|�dkrKtd
||df��ntd��dS(
u)Verify that *cert* (in decoded format as returned by
    SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 and RFC 6125
    rules are followed, but IP addresses are not accepted for *hostname*.

    CertificateError is raised on failure. On success, the function
    returns nothing.
    uempty or no certificateusubjectAltNameuDNSNusubjectu
commonNameiu&hostname %r doesn't match either of %su, uhostname %r doesn't match %riu=no appropriate commonName or subjectAltName fields were found(	u
ValueErrorugetu_dnsname_matchuappendulenuCertificateErrorujoinumapurepr(ucertuhostnameudnsnamesusanukeyuvalueusub((uj/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyumatch_hostnameCs.%umatch_hostname(u__doc__ureu__version__u
ValueErroruCertificateErroru_dnsname_matchumatch_hostname(((uj/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyu<module>s
5site-packages/pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py000064400000000714151733463710026273 0ustar00try:
    # Python 3.2+
    from ssl import CertificateError, match_hostname
except ImportError:
    try:
        # Backport of the function from a pypi module
        from backports.ssl_match_hostname import CertificateError, match_hostname
    except ImportError:
        # Our vendored copy
        from ._implementation import CertificateError, match_hostname

# Not needed, but documenting what we provide.
__all__ = ('CertificateError', 'match_hostname')
site-packages/pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py000064400000007302151733463710027720 0ustar00"""The match_hostname() function from Python 3.3.3, essential when using SSL."""

# Note: This file is under the PSF license as the code comes from the python
# stdlib.   http://docs.python.org/3/license.html

import re

__version__ = '3.4.0.2'

class CertificateError(ValueError):
    pass


def _dnsname_match(dn, hostname, max_wildcards=1):
    """Matching according to RFC 6125, section 6.4.3

    http://tools.ietf.org/html/rfc6125#section-6.4.3
    """
    pats = []
    if not dn:
        return False

    # Ported from python3-syntax:
    # leftmost, *remainder = dn.split(r'.')
    parts = dn.split(r'.')
    leftmost = parts[0]
    remainder = parts[1:]

    wildcards = leftmost.count('*')
    if wildcards > max_wildcards:
        # Issue #17980: avoid denials of service by refusing more
        # than one wildcard per fragment.  A survey of established
        # policy among SSL implementations showed it to be a
        # reasonable choice.
        raise CertificateError(
            "too many wildcards in certificate DNS name: " + repr(dn))

    # speed up common case w/o wildcards
    if not wildcards:
        return dn.lower() == hostname.lower()

    # RFC 6125, section 6.4.3, subitem 1.
    # The client SHOULD NOT attempt to match a presented identifier in which
    # the wildcard character comprises a label other than the left-most label.
    if leftmost == '*':
        # When '*' is a fragment by itself, it matches a non-empty dotless
        # fragment.
        pats.append('[^.]+')
    elif leftmost.startswith('xn--') or hostname.startswith('xn--'):
        # RFC 6125, section 6.4.3, subitem 3.
        # The client SHOULD NOT attempt to match a presented identifier
        # where the wildcard character is embedded within an A-label or
        # U-label of an internationalized domain name.
        pats.append(re.escape(leftmost))
    else:
        # Otherwise, '*' matches any dotless string, e.g. www*
        pats.append(re.escape(leftmost).replace(r'\*', '[^.]*'))

    # add the remaining fragments, ignore any wildcards
    for frag in remainder:
        pats.append(re.escape(frag))

    pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)
    return pat.match(hostname)


def match_hostname(cert, hostname):
    """Verify that *cert* (in decoded format as returned by
    SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 and RFC 6125
    rules are followed, but IP addresses are not accepted for *hostname*.

    CertificateError is raised on failure. On success, the function
    returns nothing.
    """
    if not cert:
        raise ValueError("empty or no certificate")
    dnsnames = []
    san = cert.get('subjectAltName', ())
    for key, value in san:
        if key == 'DNS':
            if _dnsname_match(value, hostname):
                return
            dnsnames.append(value)
    if not dnsnames:
        # The subject is only checked when there is no dNSName entry
        # in subjectAltName
        for sub in cert.get('subject', ()):
            for key, value in sub:
                # XXX according to RFC 2818, the most specific Common Name
                # must be used.
                if key == 'commonName':
                    if _dnsname_match(value, hostname):
                        return
                    dnsnames.append(value)
    if len(dnsnames) > 1:
        raise CertificateError("hostname %r "
            "doesn't match either of %s"
            % (hostname, ', '.join(map(repr, dnsnames))))
    elif len(dnsnames) == 1:
        raise CertificateError("hostname %r "
            "doesn't match %r"
            % (hostname, dnsnames[0]))
    else:
        raise CertificateError("no appropriate commonName or "
            "subjectAltName fields were found")
site-packages/pip/_vendor/requests/packages/urllib3/packages/__init__.py000064400000000112151733463710022410 0ustar00from __future__ import absolute_import

from . import ssl_match_hostname

site-packages/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.py000064400000021350151733463710023307 0ustar00# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy.
# Passes Python2.7's test suite and incorporates all the latest updates.
# Copyright 2009 Raymond Hettinger, released under the MIT License.
# http://code.activestate.com/recipes/576693/

try:
    from thread import get_ident as _get_ident
except ImportError:
    from dummy_thread import get_ident as _get_ident

try:
    from _abcoll import KeysView, ValuesView, ItemsView
except ImportError:
    pass


class OrderedDict(dict):
    'Dictionary that remembers insertion order'
    # An inherited dict maps keys to values.
    # The inherited dict provides __getitem__, __len__, __contains__, and get.
    # The remaining methods are order-aware.
    # Big-O running times for all methods are the same as for regular dictionaries.

    # The internal self.__map dictionary maps keys to links in a doubly linked list.
    # The circular doubly linked list starts and ends with a sentinel element.
    # The sentinel element never gets deleted (this simplifies the algorithm).
    # Each link is stored as a list of length three:  [PREV, NEXT, KEY].

    def __init__(self, *args, **kwds):
        '''Initialize an ordered dictionary.  Signature is the same as for
        regular dictionaries, but keyword arguments are not recommended
        because their insertion order is arbitrary.

        '''
        if len(args) > 1:
            raise TypeError('expected at most 1 arguments, got %d' % len(args))
        try:
            self.__root
        except AttributeError:
            self.__root = root = []                     # sentinel node
            root[:] = [root, root, None]
            self.__map = {}
        self.__update(*args, **kwds)

    def __setitem__(self, key, value, dict_setitem=dict.__setitem__):
        'od.__setitem__(i, y) <==> od[i]=y'
        # Setting a new item creates a new link which goes at the end of the linked
        # list, and the inherited dictionary is updated with the new key/value pair.
        if key not in self:
            root = self.__root
            last = root[0]
            last[1] = root[0] = self.__map[key] = [last, root, key]
        dict_setitem(self, key, value)

    def __delitem__(self, key, dict_delitem=dict.__delitem__):
        'od.__delitem__(y) <==> del od[y]'
        # Deleting an existing item uses self.__map to find the link which is
        # then removed by updating the links in the predecessor and successor nodes.
        dict_delitem(self, key)
        link_prev, link_next, key = self.__map.pop(key)
        link_prev[1] = link_next
        link_next[0] = link_prev

    def __iter__(self):
        'od.__iter__() <==> iter(od)'
        root = self.__root
        curr = root[1]
        while curr is not root:
            yield curr[2]
            curr = curr[1]

    def __reversed__(self):
        'od.__reversed__() <==> reversed(od)'
        root = self.__root
        curr = root[0]
        while curr is not root:
            yield curr[2]
            curr = curr[0]

    def clear(self):
        'od.clear() -> None.  Remove all items from od.'
        try:
            for node in self.__map.itervalues():
                del node[:]
            root = self.__root
            root[:] = [root, root, None]
            self.__map.clear()
        except AttributeError:
            pass
        dict.clear(self)

    def popitem(self, last=True):
        '''od.popitem() -> (k, v), return and remove a (key, value) pair.
        Pairs are returned in LIFO order if last is true or FIFO order if false.

        '''
        if not self:
            raise KeyError('dictionary is empty')
        root = self.__root
        if last:
            link = root[0]
            link_prev = link[0]
            link_prev[1] = root
            root[0] = link_prev
        else:
            link = root[1]
            link_next = link[1]
            root[1] = link_next
            link_next[0] = root
        key = link[2]
        del self.__map[key]
        value = dict.pop(self, key)
        return key, value

    # -- the following methods do not depend on the internal structure --

    def keys(self):
        'od.keys() -> list of keys in od'
        return list(self)

    def values(self):
        'od.values() -> list of values in od'
        return [self[key] for key in self]

    def items(self):
        'od.items() -> list of (key, value) pairs in od'
        return [(key, self[key]) for key in self]

    def iterkeys(self):
        'od.iterkeys() -> an iterator over the keys in od'
        return iter(self)

    def itervalues(self):
        'od.itervalues -> an iterator over the values in od'
        for k in self:
            yield self[k]

    def iteritems(self):
        'od.iteritems -> an iterator over the (key, value) items in od'
        for k in self:
            yield (k, self[k])

    def update(*args, **kwds):
        '''od.update(E, **F) -> None.  Update od from dict/iterable E and F.

        If E is a dict instance, does:           for k in E: od[k] = E[k]
        If E has a .keys() method, does:         for k in E.keys(): od[k] = E[k]
        Or if E is an iterable of items, does:   for k, v in E: od[k] = v
        In either case, this is followed by:     for k, v in F.items(): od[k] = v

        '''
        if len(args) > 2:
            raise TypeError('update() takes at most 2 positional '
                            'arguments (%d given)' % (len(args),))
        elif not args:
            raise TypeError('update() takes at least 1 argument (0 given)')
        self = args[0]
        # Make progressively weaker assumptions about "other"
        other = ()
        if len(args) == 2:
            other = args[1]
        if isinstance(other, dict):
            for key in other:
                self[key] = other[key]
        elif hasattr(other, 'keys'):
            for key in other.keys():
                self[key] = other[key]
        else:
            for key, value in other:
                self[key] = value
        for key, value in kwds.items():
            self[key] = value

    __update = update  # let subclasses override update without breaking __init__

    __marker = object()

    def pop(self, key, default=__marker):
        '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value.
        If key is not found, d is returned if given, otherwise KeyError is raised.

        '''
        if key in self:
            result = self[key]
            del self[key]
            return result
        if default is self.__marker:
            raise KeyError(key)
        return default

    def setdefault(self, key, default=None):
        'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od'
        if key in self:
            return self[key]
        self[key] = default
        return default

    def __repr__(self, _repr_running={}):
        'od.__repr__() <==> repr(od)'
        call_key = id(self), _get_ident()
        if call_key in _repr_running:
            return '...'
        _repr_running[call_key] = 1
        try:
            if not self:
                return '%s()' % (self.__class__.__name__,)
            return '%s(%r)' % (self.__class__.__name__, self.items())
        finally:
            del _repr_running[call_key]

    def __reduce__(self):
        'Return state information for pickling'
        items = [[k, self[k]] for k in self]
        inst_dict = vars(self).copy()
        for k in vars(OrderedDict()):
            inst_dict.pop(k, None)
        if inst_dict:
            return (self.__class__, (items,), inst_dict)
        return self.__class__, (items,)

    def copy(self):
        'od.copy() -> a shallow copy of od'
        return self.__class__(self)

    @classmethod
    def fromkeys(cls, iterable, value=None):
        '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S
        and values equal to v (which defaults to None).

        '''
        d = cls()
        for key in iterable:
            d[key] = value
        return d

    def __eq__(self, other):
        '''od.__eq__(y) <==> od==y.  Comparison to another OD is order-sensitive
        while comparison to a regular mapping is order-insensitive.

        '''
        if isinstance(other, OrderedDict):
            return len(self)==len(other) and self.items() == other.items()
        return dict.__eq__(self, other)

    def __ne__(self, other):
        return not self == other

    # -- the following methods are only used in Python 2.7 --

    def viewkeys(self):
        "od.viewkeys() -> a set-like object providing a view on od's keys"
        return KeysView(self)

    def viewvalues(self):
        "od.viewvalues() -> an object providing a view on od's values"
        return ValuesView(self)

    def viewitems(self):
        "od.viewitems() -> a set-like object providing a view on od's items"
        return ItemsView(self)
site-packages/pip/_vendor/requests/packages/urllib3/filepost.py000064400000004720151733463710020731 0ustar00# urllib3/filepost.py
# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
#
# This module is part of urllib3 and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php

import codecs
import mimetypes

from uuid import uuid4
from io import BytesIO

from .packages import six
from .packages.six import b
from .fields import RequestField

writer = codecs.lookup('utf-8')[3]


def choose_boundary():
    """
    Our embarassingly-simple replacement for mimetools.choose_boundary.
    """
    return uuid4().hex


def iter_field_objects(fields):
    """
    Iterate over fields.

    Supports list of (k, v) tuples and dicts, and lists of
    :class:`~urllib3.fields.RequestField`.

    """
    if isinstance(fields, dict):
        i = six.iteritems(fields)
    else:
        i = iter(fields)

    for field in i:
      if isinstance(field, RequestField):
        yield field
      else:
        yield RequestField.from_tuples(*field)


def iter_fields(fields):
    """
    .. deprecated:: 1.6

    Iterate over fields.

    The addition of :class:`~urllib3.fields.RequestField` makes this function
    obsolete. Instead, use :func:`iter_field_objects`, which returns
    :class:`~urllib3.fields.RequestField` objects.

    Supports list of (k, v) tuples and dicts.
    """
    if isinstance(fields, dict):
        return ((k, v) for k, v in six.iteritems(fields))

    return ((k, v) for k, v in fields)


def encode_multipart_formdata(fields, boundary=None):
    """
    Encode a dictionary of ``fields`` using the multipart/form-data MIME format.

    :param fields:
        Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`).

    :param boundary:
        If not specified, then a random boundary will be generated using
        :func:`mimetools.choose_boundary`.
    """
    body = BytesIO()
    if boundary is None:
        boundary = choose_boundary()

    for field in iter_field_objects(fields):
        body.write(b('--%s\r\n' % (boundary)))

        writer(body).write(field.render_headers())
        data = field.data

        if isinstance(data, int):
            data = str(data)  # Backwards compatibility

        if isinstance(data, six.text_type):
            writer(body).write(data)
        else:
            body.write(data)

        body.write(b'\r\n')

    body.write(b('--%s--\r\n' % (boundary)))

    content_type = str('multipart/form-data; boundary=%s' % boundary)

    return body.getvalue(), content_type
site-packages/pip/_vendor/requests/packages/__init__.py000064400000000076151733463710017267 0ustar00from __future__ import absolute_import

from . import urllib3
site-packages/pip/_vendor/requests/packages/chardet/gb2312prober.py000064400000003221151733463710021247 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
# 
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
# 
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

from .mbcharsetprober import MultiByteCharSetProber
from .codingstatemachine import CodingStateMachine
from .chardistribution import GB2312DistributionAnalysis
from .mbcssm import GB2312SMModel

class GB2312Prober(MultiByteCharSetProber):
    def __init__(self):
        MultiByteCharSetProber.__init__(self)
        self._mCodingSM = CodingStateMachine(GB2312SMModel)
        self._mDistributionAnalyzer = GB2312DistributionAnalysis()
        self.reset()

    def get_charset_name(self):
        return "GB2312"
site-packages/pip/_vendor/requests/packages/chardet/langgreekmodel.py000064400000030524151733463710022123 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Communicator client code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

# 255: Control characters that usually does not exist in any text
# 254: Carriage/Return
# 253: symbol (punctuation) that does not belong to word
# 252: 0 - 9

# Character Mapping Table:
Latin7_CharToOrderMap = (
255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85,  # 40
 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253,  # 50
253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55,  # 60
 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253,  # 70
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 80
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 90
253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253,  # a0
253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123,  # b0
110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39,  # c0
 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15,  # d0
124,  1, 29, 20, 21,  3, 32, 13, 25,  5, 11, 16, 10,  6, 30,  4,  # e0
  9,  8, 14,  7,  2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253,  # f0
)

win1253_CharToOrderMap = (
255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85,  # 40
 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253,  # 50
253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55,  # 60
 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253,  # 70
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 80
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 90
253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253,  # a0
253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123,  # b0
110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39,  # c0
 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15,  # d0
124,  1, 29, 20, 21,  3, 32, 13, 25,  5, 11, 16, 10,  6, 30,  4,  # e0
  9,  8, 14,  7,  2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253,  # f0
)

# Model Table:
# total sequences: 100%
# first 512 sequences: 98.2851%
# first 1024 sequences:1.7001%
# rest  sequences:     0.0359%
# negative sequences:  0.0148%
GreekLangModel = (
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0,
3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0,
2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0,
0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0,
2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0,
2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0,
0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0,
2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0,
0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0,
3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0,
3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0,
2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0,
2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0,
0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0,
0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0,
0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0,
0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2,
0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0,
0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2,
0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0,
0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2,
0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2,
0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,
0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2,
0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0,
0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0,
0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,
0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0,
0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2,
0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0,
0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2,
0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0,
0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2,
0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,
0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2,
0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,
0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1,
0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,
0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2,
0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2,
0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2,
0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,
0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0,
0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,
0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0,
0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0,
0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
)

Latin7GreekModel = {
  'charToOrderMap': Latin7_CharToOrderMap,
  'precedenceMatrix': GreekLangModel,
  'mTypicalPositiveRatio': 0.982851,
  'keepEnglishLetter': False,
  'charsetName': "ISO-8859-7"
}

Win1253GreekModel = {
  'charToOrderMap': win1253_CharToOrderMap,
  'precedenceMatrix': GreekLangModel,
  'mTypicalPositiveRatio': 0.982851,
  'keepEnglishLetter': False,
  'charsetName': "windows-1253"
}

# flake8: noqa
site-packages/pip/_vendor/requests/packages/chardet/compat.py000064400000002205151733463710020421 0ustar00######################## BEGIN LICENSE BLOCK ########################
# Contributor(s):
#   Ian Cordasco - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

import sys


if sys.version_info < (3, 0):
    base_str = (str, unicode)
else:
    base_str = (bytes, str)


def wrap_ord(a):
    if sys.version_info < (3, 0) and isinstance(a, base_str):
        return ord(a)
    else:
        return a
site-packages/pip/_vendor/requests/packages/chardet/langhungarianmodel.py000064400000030370151733463710023001 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Communicator client code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

# 255: Control characters that usually does not exist in any text
# 254: Carriage/Return
# 253: symbol (punctuation) that does not belong to word
# 252: 0 - 9

# Character Mapping Table:
Latin2_HungarianCharToOrderMap = (
255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47,
 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253,
253,  2, 18, 26, 17,  1, 27, 12, 20,  9, 22,  7,  6, 13,  4,  8,
 23, 67, 10,  5,  3, 21, 19, 65, 62, 16, 11,253,253,253,253,253,
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, 75,198,199,200,201,202,203,204,205,
 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,
221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231,
232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241,
 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85,
245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253,
)

win1250HungarianCharToOrderMap = (
255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47,
 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253,
253,  2, 18, 26, 17,  1, 27, 12, 20,  9, 22,  7,  6, 13,  4,  8,
 23, 67, 10,  5,  3, 21, 19, 65, 62, 16, 11,253,253,253,253,253,
161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,
177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190,
191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205,
 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,
221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231,
232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241,
 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87,
245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253,
)

# Model Table:
# total sequences: 100%
# first 512 sequences: 94.7368%
# first 1024 sequences:5.2623%
# rest  sequences:     0.8894%
# negative sequences:  0.0009%
HungarianLangModel = (
0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2,
3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,
3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3,
0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2,
0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3,
0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2,
0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1,
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3,
0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0,
3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2,
0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2,
0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2,
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2,
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2,
0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2,
0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1,
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2,
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3,
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1,
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1,
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0,
1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0,
1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0,
1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1,
3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1,
2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1,
2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1,
2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1,
2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0,
2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1,
3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1,
2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1,
2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1,
2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,
1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1,
1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1,
3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0,
1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1,
1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1,
2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1,
2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0,
2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1,
3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1,
2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1,
1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0,
1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0,
2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1,
2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,
1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0,
1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1,
2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0,
1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0,
1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0,
2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1,
2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1,
2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1,
1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1,
1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1,
1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0,
0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0,
2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1,
2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1,
1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1,
2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,
1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0,
1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0,
2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0,
2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1,
2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0,
1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,
2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0,
0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,
1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,
0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,
1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,
2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,
)

Latin2HungarianModel = {
  'charToOrderMap': Latin2_HungarianCharToOrderMap,
  'precedenceMatrix': HungarianLangModel,
  'mTypicalPositiveRatio': 0.947368,
  'keepEnglishLetter': True,
  'charsetName': "ISO-8859-2"
}

Win1250HungarianModel = {
  'charToOrderMap': win1250HungarianCharToOrderMap,
  'precedenceMatrix': HungarianLangModel,
  'mTypicalPositiveRatio': 0.947368,
  'keepEnglishLetter': True,
  'charsetName': "windows-1250"
}

# flake8: noqa
site-packages/pip/_vendor/requests/packages/chardet/mbcssm.py000064400000046230151733463710020430 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

from .constants import eStart, eError, eItsMe

# BIG5

BIG5_cls = (
    1,1,1,1,1,1,1,1,  # 00 - 07    #allow 0x00 as legal value
    1,1,1,1,1,1,0,0,  # 08 - 0f
    1,1,1,1,1,1,1,1,  # 10 - 17
    1,1,1,0,1,1,1,1,  # 18 - 1f
    1,1,1,1,1,1,1,1,  # 20 - 27
    1,1,1,1,1,1,1,1,  # 28 - 2f
    1,1,1,1,1,1,1,1,  # 30 - 37
    1,1,1,1,1,1,1,1,  # 38 - 3f
    2,2,2,2,2,2,2,2,  # 40 - 47
    2,2,2,2,2,2,2,2,  # 48 - 4f
    2,2,2,2,2,2,2,2,  # 50 - 57
    2,2,2,2,2,2,2,2,  # 58 - 5f
    2,2,2,2,2,2,2,2,  # 60 - 67
    2,2,2,2,2,2,2,2,  # 68 - 6f
    2,2,2,2,2,2,2,2,  # 70 - 77
    2,2,2,2,2,2,2,1,  # 78 - 7f
    4,4,4,4,4,4,4,4,  # 80 - 87
    4,4,4,4,4,4,4,4,  # 88 - 8f
    4,4,4,4,4,4,4,4,  # 90 - 97
    4,4,4,4,4,4,4,4,  # 98 - 9f
    4,3,3,3,3,3,3,3,  # a0 - a7
    3,3,3,3,3,3,3,3,  # a8 - af
    3,3,3,3,3,3,3,3,  # b0 - b7
    3,3,3,3,3,3,3,3,  # b8 - bf
    3,3,3,3,3,3,3,3,  # c0 - c7
    3,3,3,3,3,3,3,3,  # c8 - cf
    3,3,3,3,3,3,3,3,  # d0 - d7
    3,3,3,3,3,3,3,3,  # d8 - df
    3,3,3,3,3,3,3,3,  # e0 - e7
    3,3,3,3,3,3,3,3,  # e8 - ef
    3,3,3,3,3,3,3,3,  # f0 - f7
    3,3,3,3,3,3,3,0  # f8 - ff
)

BIG5_st = (
    eError,eStart,eStart,     3,eError,eError,eError,eError,#00-07
    eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,#08-0f
    eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart#10-17
)

Big5CharLenTable = (0, 1, 1, 2, 0)

Big5SMModel = {'classTable': BIG5_cls,
               'classFactor': 5,
               'stateTable': BIG5_st,
               'charLenTable': Big5CharLenTable,
               'name': 'Big5'}

# CP949

CP949_cls  = (
    1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,  # 00 - 0f
    1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1,  # 10 - 1f
    1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,  # 20 - 2f
    1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,  # 30 - 3f
    1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,  # 40 - 4f
    4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1,  # 50 - 5f
    1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,  # 60 - 6f
    5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1,  # 70 - 7f
    0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,  # 80 - 8f
    6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,  # 90 - 9f
    6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8,  # a0 - af
    7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,  # b0 - bf
    7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2,  # c0 - cf
    2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,  # d0 - df
    2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,  # e0 - ef
    2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0,  # f0 - ff
)

CP949_st = (
#cls=    0      1      2      3      4      5      6      7      8      9  # previous state =
    eError,eStart,     3,eError,eStart,eStart,     4,     5,eError,     6, # eStart
    eError,eError,eError,eError,eError,eError,eError,eError,eError,eError, # eError
    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe, # eItsMe
    eError,eError,eStart,eStart,eError,eError,eError,eStart,eStart,eStart, # 3
    eError,eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart, # 4
    eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart, # 5
    eError,eStart,eStart,eStart,eStart,eError,eError,eStart,eStart,eStart, # 6
)

CP949CharLenTable = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2)

CP949SMModel = {'classTable': CP949_cls,
                'classFactor': 10,
                'stateTable': CP949_st,
                'charLenTable': CP949CharLenTable,
                'name': 'CP949'}

# EUC-JP

EUCJP_cls = (
    4,4,4,4,4,4,4,4,  # 00 - 07
    4,4,4,4,4,4,5,5,  # 08 - 0f
    4,4,4,4,4,4,4,4,  # 10 - 17
    4,4,4,5,4,4,4,4,  # 18 - 1f
    4,4,4,4,4,4,4,4,  # 20 - 27
    4,4,4,4,4,4,4,4,  # 28 - 2f
    4,4,4,4,4,4,4,4,  # 30 - 37
    4,4,4,4,4,4,4,4,  # 38 - 3f
    4,4,4,4,4,4,4,4,  # 40 - 47
    4,4,4,4,4,4,4,4,  # 48 - 4f
    4,4,4,4,4,4,4,4,  # 50 - 57
    4,4,4,4,4,4,4,4,  # 58 - 5f
    4,4,4,4,4,4,4,4,  # 60 - 67
    4,4,4,4,4,4,4,4,  # 68 - 6f
    4,4,4,4,4,4,4,4,  # 70 - 77
    4,4,4,4,4,4,4,4,  # 78 - 7f
    5,5,5,5,5,5,5,5,  # 80 - 87
    5,5,5,5,5,5,1,3,  # 88 - 8f
    5,5,5,5,5,5,5,5,  # 90 - 97
    5,5,5,5,5,5,5,5,  # 98 - 9f
    5,2,2,2,2,2,2,2,  # a0 - a7
    2,2,2,2,2,2,2,2,  # a8 - af
    2,2,2,2,2,2,2,2,  # b0 - b7
    2,2,2,2,2,2,2,2,  # b8 - bf
    2,2,2,2,2,2,2,2,  # c0 - c7
    2,2,2,2,2,2,2,2,  # c8 - cf
    2,2,2,2,2,2,2,2,  # d0 - d7
    2,2,2,2,2,2,2,2,  # d8 - df
    0,0,0,0,0,0,0,0,  # e0 - e7
    0,0,0,0,0,0,0,0,  # e8 - ef
    0,0,0,0,0,0,0,0,  # f0 - f7
    0,0,0,0,0,0,0,5  # f8 - ff
)

EUCJP_st = (
          3,     4,     3,     5,eStart,eError,eError,eError,#00-07
     eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f
     eItsMe,eItsMe,eStart,eError,eStart,eError,eError,eError,#10-17
     eError,eError,eStart,eError,eError,eError,     3,eError,#18-1f
          3,eError,eError,eError,eStart,eStart,eStart,eStart#20-27
)

EUCJPCharLenTable = (2, 2, 2, 3, 1, 0)

EUCJPSMModel = {'classTable': EUCJP_cls,
                'classFactor': 6,
                'stateTable': EUCJP_st,
                'charLenTable': EUCJPCharLenTable,
                'name': 'EUC-JP'}

# EUC-KR

EUCKR_cls  = (
    1,1,1,1,1,1,1,1,  # 00 - 07
    1,1,1,1,1,1,0,0,  # 08 - 0f
    1,1,1,1,1,1,1,1,  # 10 - 17
    1,1,1,0,1,1,1,1,  # 18 - 1f
    1,1,1,1,1,1,1,1,  # 20 - 27
    1,1,1,1,1,1,1,1,  # 28 - 2f
    1,1,1,1,1,1,1,1,  # 30 - 37
    1,1,1,1,1,1,1,1,  # 38 - 3f
    1,1,1,1,1,1,1,1,  # 40 - 47
    1,1,1,1,1,1,1,1,  # 48 - 4f
    1,1,1,1,1,1,1,1,  # 50 - 57
    1,1,1,1,1,1,1,1,  # 58 - 5f
    1,1,1,1,1,1,1,1,  # 60 - 67
    1,1,1,1,1,1,1,1,  # 68 - 6f
    1,1,1,1,1,1,1,1,  # 70 - 77
    1,1,1,1,1,1,1,1,  # 78 - 7f
    0,0,0,0,0,0,0,0,  # 80 - 87
    0,0,0,0,0,0,0,0,  # 88 - 8f
    0,0,0,0,0,0,0,0,  # 90 - 97
    0,0,0,0,0,0,0,0,  # 98 - 9f
    0,2,2,2,2,2,2,2,  # a0 - a7
    2,2,2,2,2,3,3,3,  # a8 - af
    2,2,2,2,2,2,2,2,  # b0 - b7
    2,2,2,2,2,2,2,2,  # b8 - bf
    2,2,2,2,2,2,2,2,  # c0 - c7
    2,3,2,2,2,2,2,2,  # c8 - cf
    2,2,2,2,2,2,2,2,  # d0 - d7
    2,2,2,2,2,2,2,2,  # d8 - df
    2,2,2,2,2,2,2,2,  # e0 - e7
    2,2,2,2,2,2,2,2,  # e8 - ef
    2,2,2,2,2,2,2,2,  # f0 - f7
    2,2,2,2,2,2,2,0   # f8 - ff
)

EUCKR_st = (
    eError,eStart,     3,eError,eError,eError,eError,eError,#00-07
    eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart #08-0f
)

EUCKRCharLenTable = (0, 1, 2, 0)

EUCKRSMModel = {'classTable': EUCKR_cls,
                'classFactor': 4,
                'stateTable': EUCKR_st,
                'charLenTable': EUCKRCharLenTable,
                'name': 'EUC-KR'}

# EUC-TW

EUCTW_cls = (
    2,2,2,2,2,2,2,2,  # 00 - 07
    2,2,2,2,2,2,0,0,  # 08 - 0f
    2,2,2,2,2,2,2,2,  # 10 - 17
    2,2,2,0,2,2,2,2,  # 18 - 1f
    2,2,2,2,2,2,2,2,  # 20 - 27
    2,2,2,2,2,2,2,2,  # 28 - 2f
    2,2,2,2,2,2,2,2,  # 30 - 37
    2,2,2,2,2,2,2,2,  # 38 - 3f
    2,2,2,2,2,2,2,2,  # 40 - 47
    2,2,2,2,2,2,2,2,  # 48 - 4f
    2,2,2,2,2,2,2,2,  # 50 - 57
    2,2,2,2,2,2,2,2,  # 58 - 5f
    2,2,2,2,2,2,2,2,  # 60 - 67
    2,2,2,2,2,2,2,2,  # 68 - 6f
    2,2,2,2,2,2,2,2,  # 70 - 77
    2,2,2,2,2,2,2,2,  # 78 - 7f
    0,0,0,0,0,0,0,0,  # 80 - 87
    0,0,0,0,0,0,6,0,  # 88 - 8f
    0,0,0,0,0,0,0,0,  # 90 - 97
    0,0,0,0,0,0,0,0,  # 98 - 9f
    0,3,4,4,4,4,4,4,  # a0 - a7
    5,5,1,1,1,1,1,1,  # a8 - af
    1,1,1,1,1,1,1,1,  # b0 - b7
    1,1,1,1,1,1,1,1,  # b8 - bf
    1,1,3,1,3,3,3,3,  # c0 - c7
    3,3,3,3,3,3,3,3,  # c8 - cf
    3,3,3,3,3,3,3,3,  # d0 - d7
    3,3,3,3,3,3,3,3,  # d8 - df
    3,3,3,3,3,3,3,3,  # e0 - e7
    3,3,3,3,3,3,3,3,  # e8 - ef
    3,3,3,3,3,3,3,3,  # f0 - f7
    3,3,3,3,3,3,3,0   # f8 - ff
)

EUCTW_st = (
    eError,eError,eStart,     3,     3,     3,     4,eError,#00-07
    eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f
    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError,#10-17
    eStart,eStart,eStart,eError,eError,eError,eError,eError,#18-1f
         5,eError,eError,eError,eStart,eError,eStart,eStart,#20-27
    eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f
)

EUCTWCharLenTable = (0, 0, 1, 2, 2, 2, 3)

EUCTWSMModel = {'classTable': EUCTW_cls,
                'classFactor': 7,
                'stateTable': EUCTW_st,
                'charLenTable': EUCTWCharLenTable,
                'name': 'x-euc-tw'}

# GB2312

GB2312_cls = (
    1,1,1,1,1,1,1,1,  # 00 - 07
    1,1,1,1,1,1,0,0,  # 08 - 0f
    1,1,1,1,1,1,1,1,  # 10 - 17
    1,1,1,0,1,1,1,1,  # 18 - 1f
    1,1,1,1,1,1,1,1,  # 20 - 27
    1,1,1,1,1,1,1,1,  # 28 - 2f
    3,3,3,3,3,3,3,3,  # 30 - 37
    3,3,1,1,1,1,1,1,  # 38 - 3f
    2,2,2,2,2,2,2,2,  # 40 - 47
    2,2,2,2,2,2,2,2,  # 48 - 4f
    2,2,2,2,2,2,2,2,  # 50 - 57
    2,2,2,2,2,2,2,2,  # 58 - 5f
    2,2,2,2,2,2,2,2,  # 60 - 67
    2,2,2,2,2,2,2,2,  # 68 - 6f
    2,2,2,2,2,2,2,2,  # 70 - 77
    2,2,2,2,2,2,2,4,  # 78 - 7f
    5,6,6,6,6,6,6,6,  # 80 - 87
    6,6,6,6,6,6,6,6,  # 88 - 8f
    6,6,6,6,6,6,6,6,  # 90 - 97
    6,6,6,6,6,6,6,6,  # 98 - 9f
    6,6,6,6,6,6,6,6,  # a0 - a7
    6,6,6,6,6,6,6,6,  # a8 - af
    6,6,6,6,6,6,6,6,  # b0 - b7
    6,6,6,6,6,6,6,6,  # b8 - bf
    6,6,6,6,6,6,6,6,  # c0 - c7
    6,6,6,6,6,6,6,6,  # c8 - cf
    6,6,6,6,6,6,6,6,  # d0 - d7
    6,6,6,6,6,6,6,6,  # d8 - df
    6,6,6,6,6,6,6,6,  # e0 - e7
    6,6,6,6,6,6,6,6,  # e8 - ef
    6,6,6,6,6,6,6,6,  # f0 - f7
    6,6,6,6,6,6,6,0   # f8 - ff
)

GB2312_st = (
    eError,eStart,eStart,eStart,eStart,eStart,     3,eError,#00-07
    eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f
    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,#10-17
         4,eError,eStart,eStart,eError,eError,eError,eError,#18-1f
    eError,eError,     5,eError,eError,eError,eItsMe,eError,#20-27
    eError,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f
)

# To be accurate, the length of class 6 can be either 2 or 4.
# But it is not necessary to discriminate between the two since
# it is used for frequency analysis only, and we are validing
# each code range there as well. So it is safe to set it to be
# 2 here.
GB2312CharLenTable = (0, 1, 1, 1, 1, 1, 2)

GB2312SMModel = {'classTable': GB2312_cls,
                  'classFactor': 7,
                  'stateTable': GB2312_st,
                  'charLenTable': GB2312CharLenTable,
                  'name': 'GB2312'}

# Shift_JIS

SJIS_cls = (
    1,1,1,1,1,1,1,1,  # 00 - 07
    1,1,1,1,1,1,0,0,  # 08 - 0f
    1,1,1,1,1,1,1,1,  # 10 - 17
    1,1,1,0,1,1,1,1,  # 18 - 1f
    1,1,1,1,1,1,1,1,  # 20 - 27
    1,1,1,1,1,1,1,1,  # 28 - 2f
    1,1,1,1,1,1,1,1,  # 30 - 37
    1,1,1,1,1,1,1,1,  # 38 - 3f
    2,2,2,2,2,2,2,2,  # 40 - 47
    2,2,2,2,2,2,2,2,  # 48 - 4f
    2,2,2,2,2,2,2,2,  # 50 - 57
    2,2,2,2,2,2,2,2,  # 58 - 5f
    2,2,2,2,2,2,2,2,  # 60 - 67
    2,2,2,2,2,2,2,2,  # 68 - 6f
    2,2,2,2,2,2,2,2,  # 70 - 77
    2,2,2,2,2,2,2,1,  # 78 - 7f
    3,3,3,3,3,3,3,3,  # 80 - 87
    3,3,3,3,3,3,3,3,  # 88 - 8f
    3,3,3,3,3,3,3,3,  # 90 - 97
    3,3,3,3,3,3,3,3,  # 98 - 9f
    #0xa0 is illegal in sjis encoding, but some pages does
    #contain such byte. We need to be more error forgiven.
    2,2,2,2,2,2,2,2,  # a0 - a7
    2,2,2,2,2,2,2,2,  # a8 - af
    2,2,2,2,2,2,2,2,  # b0 - b7
    2,2,2,2,2,2,2,2,  # b8 - bf
    2,2,2,2,2,2,2,2,  # c0 - c7
    2,2,2,2,2,2,2,2,  # c8 - cf
    2,2,2,2,2,2,2,2,  # d0 - d7
    2,2,2,2,2,2,2,2,  # d8 - df
    3,3,3,3,3,3,3,3,  # e0 - e7
    3,3,3,3,3,4,4,4,  # e8 - ef
    4,4,4,4,4,4,4,4,  # f0 - f7
    4,4,4,4,4,0,0,0   # f8 - ff
)


SJIS_st = (
    eError,eStart,eStart,     3,eError,eError,eError,eError,#00-07
    eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f
    eItsMe,eItsMe,eError,eError,eStart,eStart,eStart,eStart #10-17
)

SJISCharLenTable = (0, 1, 1, 2, 0, 0)

SJISSMModel = {'classTable': SJIS_cls,
               'classFactor': 6,
               'stateTable': SJIS_st,
               'charLenTable': SJISCharLenTable,
               'name': 'Shift_JIS'}

# UCS2-BE

UCS2BE_cls = (
    0,0,0,0,0,0,0,0,  # 00 - 07
    0,0,1,0,0,2,0,0,  # 08 - 0f
    0,0,0,0,0,0,0,0,  # 10 - 17
    0,0,0,3,0,0,0,0,  # 18 - 1f
    0,0,0,0,0,0,0,0,  # 20 - 27
    0,3,3,3,3,3,0,0,  # 28 - 2f
    0,0,0,0,0,0,0,0,  # 30 - 37
    0,0,0,0,0,0,0,0,  # 38 - 3f
    0,0,0,0,0,0,0,0,  # 40 - 47
    0,0,0,0,0,0,0,0,  # 48 - 4f
    0,0,0,0,0,0,0,0,  # 50 - 57
    0,0,0,0,0,0,0,0,  # 58 - 5f
    0,0,0,0,0,0,0,0,  # 60 - 67
    0,0,0,0,0,0,0,0,  # 68 - 6f
    0,0,0,0,0,0,0,0,  # 70 - 77
    0,0,0,0,0,0,0,0,  # 78 - 7f
    0,0,0,0,0,0,0,0,  # 80 - 87
    0,0,0,0,0,0,0,0,  # 88 - 8f
    0,0,0,0,0,0,0,0,  # 90 - 97
    0,0,0,0,0,0,0,0,  # 98 - 9f
    0,0,0,0,0,0,0,0,  # a0 - a7
    0,0,0,0,0,0,0,0,  # a8 - af
    0,0,0,0,0,0,0,0,  # b0 - b7
    0,0,0,0,0,0,0,0,  # b8 - bf
    0,0,0,0,0,0,0,0,  # c0 - c7
    0,0,0,0,0,0,0,0,  # c8 - cf
    0,0,0,0,0,0,0,0,  # d0 - d7
    0,0,0,0,0,0,0,0,  # d8 - df
    0,0,0,0,0,0,0,0,  # e0 - e7
    0,0,0,0,0,0,0,0,  # e8 - ef
    0,0,0,0,0,0,0,0,  # f0 - f7
    0,0,0,0,0,0,4,5   # f8 - ff
)

UCS2BE_st  = (
          5,     7,     7,eError,     4,     3,eError,eError,#00-07
     eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f
     eItsMe,eItsMe,     6,     6,     6,     6,eError,eError,#10-17
          6,     6,     6,     6,     6,eItsMe,     6,     6,#18-1f
          6,     6,     6,     6,     5,     7,     7,eError,#20-27
          5,     8,     6,     6,eError,     6,     6,     6,#28-2f
          6,     6,     6,     6,eError,eError,eStart,eStart #30-37
)

UCS2BECharLenTable = (2, 2, 2, 0, 2, 2)

UCS2BESMModel = {'classTable': UCS2BE_cls,
                 'classFactor': 6,
                 'stateTable': UCS2BE_st,
                 'charLenTable': UCS2BECharLenTable,
                 'name': 'UTF-16BE'}

# UCS2-LE

UCS2LE_cls = (
    0,0,0,0,0,0,0,0,  # 00 - 07
    0,0,1,0,0,2,0,0,  # 08 - 0f
    0,0,0,0,0,0,0,0,  # 10 - 17
    0,0,0,3,0,0,0,0,  # 18 - 1f
    0,0,0,0,0,0,0,0,  # 20 - 27
    0,3,3,3,3,3,0,0,  # 28 - 2f
    0,0,0,0,0,0,0,0,  # 30 - 37
    0,0,0,0,0,0,0,0,  # 38 - 3f
    0,0,0,0,0,0,0,0,  # 40 - 47
    0,0,0,0,0,0,0,0,  # 48 - 4f
    0,0,0,0,0,0,0,0,  # 50 - 57
    0,0,0,0,0,0,0,0,  # 58 - 5f
    0,0,0,0,0,0,0,0,  # 60 - 67
    0,0,0,0,0,0,0,0,  # 68 - 6f
    0,0,0,0,0,0,0,0,  # 70 - 77
    0,0,0,0,0,0,0,0,  # 78 - 7f
    0,0,0,0,0,0,0,0,  # 80 - 87
    0,0,0,0,0,0,0,0,  # 88 - 8f
    0,0,0,0,0,0,0,0,  # 90 - 97
    0,0,0,0,0,0,0,0,  # 98 - 9f
    0,0,0,0,0,0,0,0,  # a0 - a7
    0,0,0,0,0,0,0,0,  # a8 - af
    0,0,0,0,0,0,0,0,  # b0 - b7
    0,0,0,0,0,0,0,0,  # b8 - bf
    0,0,0,0,0,0,0,0,  # c0 - c7
    0,0,0,0,0,0,0,0,  # c8 - cf
    0,0,0,0,0,0,0,0,  # d0 - d7
    0,0,0,0,0,0,0,0,  # d8 - df
    0,0,0,0,0,0,0,0,  # e0 - e7
    0,0,0,0,0,0,0,0,  # e8 - ef
    0,0,0,0,0,0,0,0,  # f0 - f7
    0,0,0,0,0,0,4,5   # f8 - ff
)

UCS2LE_st = (
          6,     6,     7,     6,     4,     3,eError,eError,#00-07
     eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f
     eItsMe,eItsMe,     5,     5,     5,eError,eItsMe,eError,#10-17
          5,     5,     5,eError,     5,eError,     6,     6,#18-1f
          7,     6,     8,     8,     5,     5,     5,eError,#20-27
          5,     5,     5,eError,eError,eError,     5,     5,#28-2f
          5,     5,     5,eError,     5,eError,eStart,eStart #30-37
)

UCS2LECharLenTable = (2, 2, 2, 2, 2, 2)

UCS2LESMModel = {'classTable': UCS2LE_cls,
                 'classFactor': 6,
                 'stateTable': UCS2LE_st,
                 'charLenTable': UCS2LECharLenTable,
                 'name': 'UTF-16LE'}

# UTF-8

UTF8_cls = (
    1,1,1,1,1,1,1,1,  # 00 - 07  #allow 0x00 as a legal value
    1,1,1,1,1,1,0,0,  # 08 - 0f
    1,1,1,1,1,1,1,1,  # 10 - 17
    1,1,1,0,1,1,1,1,  # 18 - 1f
    1,1,1,1,1,1,1,1,  # 20 - 27
    1,1,1,1,1,1,1,1,  # 28 - 2f
    1,1,1,1,1,1,1,1,  # 30 - 37
    1,1,1,1,1,1,1,1,  # 38 - 3f
    1,1,1,1,1,1,1,1,  # 40 - 47
    1,1,1,1,1,1,1,1,  # 48 - 4f
    1,1,1,1,1,1,1,1,  # 50 - 57
    1,1,1,1,1,1,1,1,  # 58 - 5f
    1,1,1,1,1,1,1,1,  # 60 - 67
    1,1,1,1,1,1,1,1,  # 68 - 6f
    1,1,1,1,1,1,1,1,  # 70 - 77
    1,1,1,1,1,1,1,1,  # 78 - 7f
    2,2,2,2,3,3,3,3,  # 80 - 87
    4,4,4,4,4,4,4,4,  # 88 - 8f
    4,4,4,4,4,4,4,4,  # 90 - 97
    4,4,4,4,4,4,4,4,  # 98 - 9f
    5,5,5,5,5,5,5,5,  # a0 - a7
    5,5,5,5,5,5,5,5,  # a8 - af
    5,5,5,5,5,5,5,5,  # b0 - b7
    5,5,5,5,5,5,5,5,  # b8 - bf
    0,0,6,6,6,6,6,6,  # c0 - c7
    6,6,6,6,6,6,6,6,  # c8 - cf
    6,6,6,6,6,6,6,6,  # d0 - d7
    6,6,6,6,6,6,6,6,  # d8 - df
    7,8,8,8,8,8,8,8,  # e0 - e7
    8,8,8,8,8,9,8,8,  # e8 - ef
    10,11,11,11,11,11,11,11,  # f0 - f7
    12,13,13,13,14,15,0,0    # f8 - ff
)

UTF8_st = (
    eError,eStart,eError,eError,eError,eError,     12,   10,#00-07
         9,     11,     8,     7,     6,     5,     4,    3,#08-0f
    eError,eError,eError,eError,eError,eError,eError,eError,#10-17
    eError,eError,eError,eError,eError,eError,eError,eError,#18-1f
    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#20-27
    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#28-2f
    eError,eError,     5,     5,     5,     5,eError,eError,#30-37
    eError,eError,eError,eError,eError,eError,eError,eError,#38-3f
    eError,eError,eError,     5,     5,     5,eError,eError,#40-47
    eError,eError,eError,eError,eError,eError,eError,eError,#48-4f
    eError,eError,     7,     7,     7,     7,eError,eError,#50-57
    eError,eError,eError,eError,eError,eError,eError,eError,#58-5f
    eError,eError,eError,eError,     7,     7,eError,eError,#60-67
    eError,eError,eError,eError,eError,eError,eError,eError,#68-6f
    eError,eError,     9,     9,     9,     9,eError,eError,#70-77
    eError,eError,eError,eError,eError,eError,eError,eError,#78-7f
    eError,eError,eError,eError,eError,     9,eError,eError,#80-87
    eError,eError,eError,eError,eError,eError,eError,eError,#88-8f
    eError,eError,    12,    12,    12,    12,eError,eError,#90-97
    eError,eError,eError,eError,eError,eError,eError,eError,#98-9f
    eError,eError,eError,eError,eError,    12,eError,eError,#a0-a7
    eError,eError,eError,eError,eError,eError,eError,eError,#a8-af
    eError,eError,    12,    12,    12,eError,eError,eError,#b0-b7
    eError,eError,eError,eError,eError,eError,eError,eError,#b8-bf
    eError,eError,eStart,eStart,eStart,eStart,eError,eError,#c0-c7
    eError,eError,eError,eError,eError,eError,eError,eError #c8-cf
)

UTF8CharLenTable = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6)

UTF8SMModel = {'classTable': UTF8_cls,
               'classFactor': 16,
               'stateTable': UTF8_st,
               'charLenTable': UTF8CharLenTable,
               'name': 'UTF-8'}

# flake8: noqa
site-packages/pip/_vendor/requests/packages/chardet/langthaimodel.py000064400000026013151733463710021751 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Communicator client code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

# 255: Control characters that usually does not exist in any text
# 254: Carriage/Return
# 253: symbol (punctuation) that does not belong to word
# 252: 0 - 9

# The following result for thai was collected from a limited sample (1M).

# Character Mapping Table:
TIS620CharToOrderMap = (
255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111,  # 40
188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253,  # 50
253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82,  # 60
 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253,  # 70
209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222,
223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235,
236,  5, 30,237, 24,238, 75,  8, 26, 52, 34, 51,119, 47, 58, 57,
 49, 53, 55, 43, 20, 19, 44, 14, 48,  3, 17, 25, 39, 62, 31, 54,
 45,  9, 16,  2, 61, 15,239, 12, 42, 46, 18, 21, 76,  4, 66, 63,
 22, 10,  1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244,
 11, 28, 41, 29, 33,245, 50, 37,  6,  7, 67, 77, 38, 93,246,247,
 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253,
)

# Model Table:
# total sequences: 100%
# first 512 sequences: 92.6386%
# first 1024 sequences:7.3177%
# rest  sequences:     1.0230%
# negative sequences:  0.0436%
ThaiLangModel = (
0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3,
0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2,
3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3,
0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,
3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2,
3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1,
3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2,
3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1,
3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1,
3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,
3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1,
2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1,
3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1,
0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,
3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1,
0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,
3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2,
1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0,
3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3,
3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0,
1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2,
0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,
2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3,
0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0,
3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1,
2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,
3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2,
0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2,
3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0,
2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1,
2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1,
3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1,
3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0,
3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1,
3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1,
3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1,
1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2,
0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3,
0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,
3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0,
3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1,
1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0,
3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1,
3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2,
0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0,
0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0,
1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1,
1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,
3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1,
0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0,
0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,
3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0,
3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1,
0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0,
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1,
0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,
0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0,
0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1,
0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,
3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0,
0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0,
0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,
3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1,
2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,
0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0,
3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0,
0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0,
1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0,
1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,
1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
)

TIS620ThaiModel = {
  'charToOrderMap': TIS620CharToOrderMap,
  'precedenceMatrix': ThaiLangModel,
  'mTypicalPositiveRatio': 0.926386,
  'keepEnglishLetter': False,
  'charsetName': "TIS-620"
}

# flake8: noqa
site-packages/pip/_vendor/requests/packages/chardet/eucjpprober.py000064400000007136151733463720021467 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

import sys
from . import constants
from .mbcharsetprober import MultiByteCharSetProber
from .codingstatemachine import CodingStateMachine
from .chardistribution import EUCJPDistributionAnalysis
from .jpcntx import EUCJPContextAnalysis
from .mbcssm import EUCJPSMModel


class EUCJPProber(MultiByteCharSetProber):
    def __init__(self):
        MultiByteCharSetProber.__init__(self)
        self._mCodingSM = CodingStateMachine(EUCJPSMModel)
        self._mDistributionAnalyzer = EUCJPDistributionAnalysis()
        self._mContextAnalyzer = EUCJPContextAnalysis()
        self.reset()

    def reset(self):
        MultiByteCharSetProber.reset(self)
        self._mContextAnalyzer.reset()

    def get_charset_name(self):
        return "EUC-JP"

    def feed(self, aBuf):
        aLen = len(aBuf)
        for i in range(0, aLen):
            # PY3K: aBuf is a byte array, so aBuf[i] is an int, not a byte
            codingState = self._mCodingSM.next_state(aBuf[i])
            if codingState == constants.eError:
                if constants._debug:
                    sys.stderr.write(self.get_charset_name()
                                     + ' prober hit error at byte ' + str(i)
                                     + '\n')
                self._mState = constants.eNotMe
                break
            elif codingState == constants.eItsMe:
                self._mState = constants.eFoundIt
                break
            elif codingState == constants.eStart:
                charLen = self._mCodingSM.get_current_charlen()
                if i == 0:
                    self._mLastChar[1] = aBuf[0]
                    self._mContextAnalyzer.feed(self._mLastChar, charLen)
                    self._mDistributionAnalyzer.feed(self._mLastChar, charLen)
                else:
                    self._mContextAnalyzer.feed(aBuf[i - 1:i + 1], charLen)
                    self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1],
                                                     charLen)

        self._mLastChar[0] = aBuf[aLen - 1]

        if self.get_state() == constants.eDetecting:
            if (self._mContextAnalyzer.got_enough_data() and
               (self.get_confidence() > constants.SHORTCUT_THRESHOLD)):
                self._mState = constants.eFoundIt

        return self.get_state()

    def get_confidence(self):
        contxtCf = self._mContextAnalyzer.get_confidence()
        distribCf = self._mDistributionAnalyzer.get_confidence()
        return max(contxtCf, distribCf)
site-packages/pip/_vendor/requests/packages/chardet/big5freq.py000064400000241242151733463720020651 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Communicator client code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

# Big5 frequency table
# by Taiwan's Mandarin Promotion Council
# <http://www.edu.tw:81/mandr/>
#
# 128  --> 0.42261
# 256  --> 0.57851
# 512  --> 0.74851
# 1024 --> 0.89384
# 2048 --> 0.97583
#
# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98
# Random Distribution Ration = 512/(5401-512)=0.105
#
# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR

BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75

#Char to FreqOrder table
BIG5_TABLE_SIZE = 5376

Big5CharToFreqOrder = (
   1,1801,1506, 255,1431, 198,   9,  82,   6,5008, 177, 202,3681,1256,2821, 110, #   16
3814,  33,3274, 261,  76,  44,2114,  16,2946,2187,1176, 659,3971,  26,3451,2653, #   32
1198,3972,3350,4202, 410,2215, 302, 590, 361,1964,   8, 204,  58,4510,5009,1932, #   48
  63,5010,5011, 317,1614,  75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, #   64
3682,   3,  10,3973,1471,  29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, #   80
4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947,  34,3556,3204,  64, 604, #   96
5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337,  72, 406,5017,  80, #  112
 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449,  69,2987, 591, #  128
 179,2096, 471, 115,2035,1844,  60,  50,2988, 134, 806,1869, 734,2036,3454, 180, #  144
 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, #  160
2502,  90,2716,1338, 663,  11, 906,1099,2553,  20,2441, 182, 532,1716,5019, 732, #  176
1376,4204,1311,1420,3206,  25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, #  192
3276, 475,1447,3683,5020, 117,  21, 656, 810,1297,2300,2334,3557,5021, 126,4205, #  208
 706, 456, 150, 613,4513,  71,1118,2037,4206, 145,3092,  85, 835, 486,2115,1246, #  224
1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, #  240
3558,3135,5023,1956,1153,4207,  83, 296,1199,3093, 192, 624,  93,5024, 822,1898, #  256
2823,3136, 795,2065, 991,1554,1542,1592,  27,  43,2867, 859, 139,1456, 860,4514, #  272
 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, #  288
3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, #  304
1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, #  320
5026,5027,2176,3207,3685,2682, 593, 845,1062,3277,  88,1723,2038,3978,1951, 212, #  336
 266, 152, 149, 468,1899,4208,4516,  77, 187,5028,3038,  37,   5,2990,5029,3979, #  352
5030,5031,  39,2524,4517,2908,3208,2079,  55, 148,  74,4518, 545, 483,1474,1029, #  368
1665, 217,1870,1531,3138,1104,2655,4209,  24, 172,3562, 900,3980,3563,3564,4519, #  384
  32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683,   4,3039,3351,1427,1789, #  400
 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, #  416
3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439,  38,5037,1063,5038, 794, #  432
3982,1435,2301,  46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804,  35, 707, #  448
 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, #  464
2129,1363,3689,1423, 697, 100,3094,  48,  70,1231, 495,3139,2196,5043,1294,5044, #  480
2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, #  496
 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, #  512
 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, #  528
3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, #  544
1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, #  560
1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, #  576
1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381,   7, #  592
2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, #  608
 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, #  624
4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, #  640
1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, #  656
5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, #  672
2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, #  688
 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, #  704
  98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, #  720
 523,2789,2790,2658,5061, 141,2235,1333,  68, 176, 441, 876, 907,4220, 603,2602, #  736
 710, 171,3464, 404, 549,  18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, #  752
5063,2991, 368,5064, 146, 366,  99, 871,3693,1543, 748, 807,1586,1185,  22,2263, #  768
 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, #  784
1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068,  59,5069, #  800
 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, #  816
 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, #  832
5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, #  848
1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, #  864
 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, #  880
3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, #  896
4224,  57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, #  912
3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, #  928
 279,3145,  51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, #  944
 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, #  960
1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, #  976
4227,2475,1436, 953,4228,2055,4545, 671,2400,  79,4229,2446,3285, 608, 567,2689, #  992
3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008
3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024
2402,5097,5098,5099,4232,3045,   0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040
5101, 233,4233,3697,1819,4550,4551,5102,  96,1777,1315,2083,5103, 257,5104,1810, # 1056
3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072
5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088
1484,5110,1712, 127,  67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104
2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120
1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136
  78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152
1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168
4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184
3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200
 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216
 165, 243,4559,3703,2528, 123, 683,4239, 764,4560,  36,3998,1793, 589,2916, 816, # 1232
 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248
2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264
5122, 611,1156, 854,2386,1316,2875,   2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280
1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296
2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312
1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328
1994,5135,4564,5136,5137,2198,  13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344
5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360
5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376
5149, 128,2133,  92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392
3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408
4567,2252,  94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424
4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440
2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456
5163,2337,2068,  23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472
3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488
 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504
5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863,  41, # 1520
5170,5171,4575,5172,1657,2338,  19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536
1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552
2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568
3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584
4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600
5182,2692, 733,  40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616
3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632
4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648
1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664
1871,2762,3004,5187, 435,5188, 343,1108, 596,  17,1751,4579,2239,3477,3709,5189, # 1680
4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696
1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712
 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728
1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744
1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760
3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776
 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792
5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808
2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824
1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840
1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551,  30,2268,4266, # 1856
5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872
 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888
4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904
 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920
2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936
 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952
1041,3005, 293,1168,  87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968
1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984
 730,1515, 184,2840,  66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000
4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016
4021,5231,5232,1186,  15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032
1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048
3596,1342,1681,1718, 766,3297, 286,  89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064
5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080
5240,3298, 310, 313,3482,2304, 770,4278,  54,3054, 189,4611,3105,3848,4025,5241, # 2096
1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112
2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128
1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144
3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160
2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176
3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192
2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208
4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224
4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240
3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256
  97,  81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272
3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288
 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304
3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320
4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336
3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352
1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368
5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384
 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400
5286, 587,  14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416
1702,1226, 102,1547,  62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432
 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448
4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294,  86,1494,1730, # 2464
4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480
 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496
2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512
2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885,  28,2695, # 2528
3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544
1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560
4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576
2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592
1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608
1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624
2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640
3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656
1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672
5313,3493,5314,5315,5316,3310,2698,1433,3311, 131,  95,1504,4049, 723,4303,3166, # 2688
1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704
4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654,  53,5320,3014,5321, # 2720
1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736
 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752
1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768
4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784
4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800
2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816
1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832
4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848
 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864
5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880
2322,3316,5346,5347,4308,5348,4309,  84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896
3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912
4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928
 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944
5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960
5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976
1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992
4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008
4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024
2699,1516,3614,1121,1082,1329,3317,4073,1449,3873,  65,1128,2848,2927,2769,1590, # 3040
3874,5370,5371,  12,2668,  45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056
3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072
2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088
1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104
4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120
3736,1859,  91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136
3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152
2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168
4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771,  61,4079,3738,1823,4080, # 3184
5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200
3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216
2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232
3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248
1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264
2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280
3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296
4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063,  56,1396,3113, # 3312
2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328
2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344
5418,1076,  49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360
1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376
2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392
1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408
3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424
4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629,  31,2851, # 3440
2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456
3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472
3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488
2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504
4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520
2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536
3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552
4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568
5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584
3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600
 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616
1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412,  42,3119, 464,5455,2642, # 3632
4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648
1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664
4701,5462,3020, 962, 588,3629, 289,3250,2644,1116,  52,5463,3067,1797,5464,5465, # 3680
5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696
 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712
5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728
5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744
2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760
3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776
2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792
2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808
 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824
1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840
4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856
3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872
3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888
 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904
2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920
 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936
2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952
4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968
1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984
4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000
1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016
3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032
 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048
3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064
5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080
5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096
3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112
3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128
1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144
2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160
5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176
1561,2674,1452,4113,1375,5549,5550,  47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192
1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208
3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224
 919,2352,2975,2353,1270,4727,4115,  73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240
1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256
4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272
5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288
2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304
3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320
 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336
1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352
2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368
2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384
5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400
5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416
5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432
2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448
2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464
1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480
4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496
3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512
3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528
4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544
4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560
2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576
2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592
5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608
4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624
5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640
4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656
 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672
 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688
1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704
3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720
4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736
1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752
5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768
2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784
2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800
3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816
5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832
1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848
3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864
5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880
1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896
5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912
2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928
3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944
2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960
3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976
3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992
3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008
4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024
 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040
2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056
4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072
3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088
5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104
1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120
5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136
 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152
1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168
 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184
4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200
1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216
4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232
1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248
 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264
3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280
4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296
5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312
 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328
3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344
 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360
2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376  #last 512
#Everything below is of no interest for detection purpose
2522,1613,4812,5799,3345,3945,2523,5800,4162,5801,1637,4163,2471,4813,3946,5802, # 5392
2500,3034,3800,5803,5804,2195,4814,5805,2163,5806,5807,5808,5809,5810,5811,5812, # 5408
5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828, # 5424
5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, # 5440
5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860, # 5456
5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876, # 5472
5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892, # 5488
5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, # 5504
5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923,5924, # 5520
5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940, # 5536
5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956, # 5552
5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972, # 5568
5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988, # 5584
5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004, # 5600
6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020, # 5616
6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036, # 5632
6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052, # 5648
6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068, # 5664
6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, # 5680
6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100, # 5696
6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116, # 5712
6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132, # 5728
6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, # 5744
6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164, # 5760
6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180, # 5776
6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196, # 5792
6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212, # 5808
6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,3670,6224,6225,6226,6227, # 5824
6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243, # 5840
6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259, # 5856
6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275, # 5872
6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,4815,6286,6287,6288,6289,6290, # 5888
6291,6292,4816,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305, # 5904
6306,6307,6308,6309,6310,6311,4817,4818,6312,6313,6314,6315,6316,6317,6318,4819, # 5920
6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334, # 5936
6335,6336,6337,4820,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349, # 5952
6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365, # 5968
6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381, # 5984
6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397, # 6000
6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,3441,6411,6412, # 6016
6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,4440,6426,6427, # 6032
6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443, # 6048
6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,4821,6455,6456,6457,6458, # 6064
6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, # 6080
6475,6476,6477,3947,3948,6478,6479,6480,6481,3272,4441,6482,6483,6484,6485,4442, # 6096
6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,4822,6497,6498,6499,6500, # 6112
6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516, # 6128
6517,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532, # 6144
6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548, # 6160
6549,6550,6551,6552,6553,6554,6555,6556,2784,6557,4823,6558,6559,6560,6561,6562, # 6176
6563,6564,6565,6566,6567,6568,6569,3949,6570,6571,6572,4824,6573,6574,6575,6576, # 6192
6577,6578,6579,6580,6581,6582,6583,4825,6584,6585,6586,3950,2785,6587,6588,6589, # 6208
6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605, # 6224
6606,6607,6608,6609,6610,6611,6612,4826,6613,6614,6615,4827,6616,6617,6618,6619, # 6240
6620,6621,6622,6623,6624,6625,4164,6626,6627,6628,6629,6630,6631,6632,6633,6634, # 6256
3547,6635,4828,6636,6637,6638,6639,6640,6641,6642,3951,2984,6643,6644,6645,6646, # 6272
6647,6648,6649,4165,6650,4829,6651,6652,4830,6653,6654,6655,6656,6657,6658,6659, # 6288
6660,6661,6662,4831,6663,6664,6665,6666,6667,6668,6669,6670,6671,4166,6672,4832, # 6304
3952,6673,6674,6675,6676,4833,6677,6678,6679,4167,6680,6681,6682,3198,6683,6684, # 6320
6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,4834,6698,6699, # 6336
6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715, # 6352
6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731, # 6368
6732,6733,6734,4443,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,4444, # 6384
6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761, # 6400
6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777, # 6416
6778,6779,6780,6781,4168,6782,6783,3442,6784,6785,6786,6787,6788,6789,6790,6791, # 6432
4169,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806, # 6448
6807,6808,6809,6810,6811,4835,6812,6813,6814,4445,6815,6816,4446,6817,6818,6819, # 6464
6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835, # 6480
3548,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,4836,6847,6848,6849, # 6496
6850,6851,6852,6853,6854,3953,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, # 6512
6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,3199,6878,6879, # 6528
6880,6881,6882,4447,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, # 6544
6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,4170,6905,6906,6907,6908,6909, # 6560
6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925, # 6576
6926,6927,4837,6928,6929,6930,6931,6932,6933,6934,6935,6936,3346,6937,6938,4838, # 6592
6939,6940,6941,4448,6942,6943,6944,6945,6946,4449,6947,6948,6949,6950,6951,6952, # 6608
6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968, # 6624
6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, # 6640
6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,3671,6995,6996,6997,6998,4839, # 6656
6999,7000,7001,7002,3549,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013, # 6672
7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, # 6688
7030,4840,7031,7032,7033,7034,7035,7036,7037,7038,4841,7039,7040,7041,7042,7043, # 6704
7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, # 6720
7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,2985,7071,7072,7073,7074, # 6736
7075,7076,7077,7078,7079,7080,4842,7081,7082,7083,7084,7085,7086,7087,7088,7089, # 6752
7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105, # 6768
7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,4450,7119,7120, # 6784
7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136, # 6800
7137,7138,7139,7140,7141,7142,7143,4843,7144,7145,7146,7147,7148,7149,7150,7151, # 6816
7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167, # 6832
7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, # 6848
7184,7185,7186,7187,7188,4171,4172,7189,7190,7191,7192,7193,7194,7195,7196,7197, # 6864
7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, # 6880
7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229, # 6896
7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245, # 6912
7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261, # 6928
7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277, # 6944
7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293, # 6960
7294,7295,7296,4844,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308, # 6976
7309,7310,7311,7312,7313,7314,7315,7316,4451,7317,7318,7319,7320,7321,7322,7323, # 6992
7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339, # 7008
7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,4173,7354, # 7024
7355,4845,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369, # 7040
7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385, # 7056
7386,7387,7388,4846,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400, # 7072
7401,7402,7403,7404,7405,3672,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415, # 7088
7416,7417,7418,7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431, # 7104
7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447, # 7120
7448,7449,7450,7451,7452,7453,4452,7454,3200,7455,7456,7457,7458,7459,7460,7461, # 7136
7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,4847,7475,7476, # 7152
7477,3133,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491, # 7168
7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,3347,7503,7504,7505,7506, # 7184
7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,4848, # 7200
7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537, # 7216
7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,3801,4849,7550,7551, # 7232
7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, # 7248
7568,7569,3035,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, # 7264
7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598, # 7280
7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614, # 7296
7615,7616,4850,7617,7618,3802,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628, # 7312
7629,7630,7631,7632,4851,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643, # 7328
7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659, # 7344
7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,4453,7671,7672,7673,7674, # 7360
7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690, # 7376
7691,7692,7693,7694,7695,7696,7697,3443,7698,7699,7700,7701,7702,4454,7703,7704, # 7392
7705,7706,7707,7708,7709,7710,7711,7712,7713,2472,7714,7715,7716,7717,7718,7719, # 7408
7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,3954,7732,7733,7734, # 7424
7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750, # 7440
3134,7751,7752,4852,7753,7754,7755,4853,7756,7757,7758,7759,7760,4174,7761,7762, # 7456
7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778, # 7472
7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794, # 7488
7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,4854,7806,7807,7808,7809, # 7504
7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825, # 7520
4855,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7536
7841,7842,7843,7844,7845,7846,7847,3955,7848,7849,7850,7851,7852,7853,7854,7855, # 7552
7856,7857,7858,7859,7860,3444,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870, # 7568
7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886, # 7584
7887,7888,7889,7890,7891,4175,7892,7893,7894,7895,7896,4856,4857,7897,7898,7899, # 7600
7900,2598,7901,7902,7903,7904,7905,7906,7907,7908,4455,7909,7910,7911,7912,7913, # 7616
7914,3201,7915,7916,7917,7918,7919,7920,7921,4858,7922,7923,7924,7925,7926,7927, # 7632
7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943, # 7648
7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7958,7959, # 7664
7960,7961,7962,7963,7964,7965,7966,7967,7968,7969,7970,7971,7972,7973,7974,7975, # 7680
7976,7977,7978,7979,7980,7981,4859,7982,7983,7984,7985,7986,7987,7988,7989,7990, # 7696
7991,7992,7993,7994,7995,7996,4860,7997,7998,7999,8000,8001,8002,8003,8004,8005, # 7712
8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,4176,8017,8018,8019,8020, # 7728
8021,8022,8023,4861,8024,8025,8026,8027,8028,8029,8030,8031,8032,8033,8034,8035, # 7744
8036,4862,4456,8037,8038,8039,8040,4863,8041,8042,8043,8044,8045,8046,8047,8048, # 7760
8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8064, # 7776
8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080, # 7792
8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096, # 7808
8097,8098,8099,4864,4177,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110, # 7824
8111,8112,8113,8114,8115,8116,8117,8118,8119,8120,4178,8121,8122,8123,8124,8125, # 7840
8126,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141, # 7856
8142,8143,8144,8145,4865,4866,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155, # 7872
8156,8157,8158,8159,8160,8161,8162,8163,8164,8165,4179,8166,8167,8168,8169,8170, # 7888
8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,4457,8182,8183,8184,8185, # 7904
8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201, # 7920
8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, # 7936
8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232,8233, # 7952
8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249, # 7968
8250,8251,8252,8253,8254,8255,8256,3445,8257,8258,8259,8260,8261,8262,4458,8263, # 7984
8264,8265,8266,8267,8268,8269,8270,8271,8272,4459,8273,8274,8275,8276,3550,8277, # 8000
8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,4460,8290,8291,8292, # 8016
8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,4867, # 8032
8308,8309,8310,8311,8312,3551,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, # 8048
8323,8324,8325,8326,4868,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, # 8064
8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353, # 8080
8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,4869,4461,8364,8365,8366,8367, # 8096
8368,8369,8370,4870,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, # 8112
8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398, # 8128
8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,4871,8411,8412,8413, # 8144
8414,8415,8416,8417,8418,8419,8420,8421,8422,4462,8423,8424,8425,8426,8427,8428, # 8160
8429,8430,8431,8432,8433,2986,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443, # 8176
8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459, # 8192
8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475, # 8208
8476,8477,8478,4180,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490, # 8224
8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506, # 8240
8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522, # 8256
8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538, # 8272
8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554, # 8288
8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,4872,8565,8566,8567,8568,8569, # 8304
8570,8571,8572,8573,4873,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584, # 8320
8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600, # 8336
8601,8602,8603,8604,8605,3803,8606,8607,8608,8609,8610,8611,8612,8613,4874,3804, # 8352
8614,8615,8616,8617,8618,8619,8620,8621,3956,8622,8623,8624,8625,8626,8627,8628, # 8368
8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,2865,8639,8640,8641,8642,8643, # 8384
8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,4463,8657,8658, # 8400
8659,4875,4876,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672, # 8416
8673,8674,8675,8676,8677,8678,8679,8680,8681,4464,8682,8683,8684,8685,8686,8687, # 8432
8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, # 8448
8704,8705,8706,8707,8708,8709,2261,8710,8711,8712,8713,8714,8715,8716,8717,8718, # 8464
8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,4181, # 8480
8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749, # 8496
8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,4877,8764, # 8512
8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780, # 8528
8781,8782,8783,8784,8785,8786,8787,8788,4878,8789,4879,8790,8791,8792,4880,8793, # 8544
8794,8795,8796,8797,8798,8799,8800,8801,4881,8802,8803,8804,8805,8806,8807,8808, # 8560
8809,8810,8811,8812,8813,8814,8815,3957,8816,8817,8818,8819,8820,8821,8822,8823, # 8576
8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839, # 8592
8840,8841,8842,8843,8844,8845,8846,8847,4882,8848,8849,8850,8851,8852,8853,8854, # 8608
8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870, # 8624
8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,3202,8885, # 8640
8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901, # 8656
8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, # 8672
8918,8919,8920,8921,8922,8923,8924,4465,8925,8926,8927,8928,8929,8930,8931,8932, # 8688
4883,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,2214,8944,8945,8946, # 8704
8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, # 8720
8963,8964,8965,4884,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, # 8736
8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,4885, # 8752
8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008, # 8768
9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,4182,9022,9023, # 8784
9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039, # 8800
9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055, # 8816
9056,9057,9058,9059,9060,9061,9062,9063,4886,9064,9065,9066,9067,9068,9069,4887, # 8832
9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085, # 8848
9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101, # 8864
9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, # 8880
9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133, # 8896
9134,9135,9136,9137,9138,9139,9140,9141,3958,9142,9143,9144,9145,9146,9147,9148, # 8912
9149,9150,9151,4888,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163, # 8928
9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,4889,9176,9177,9178, # 8944
9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194, # 8960
9195,9196,9197,9198,9199,9200,9201,9202,9203,4890,9204,9205,9206,9207,9208,9209, # 8976
9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,4466,9223,9224, # 8992
9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240, # 9008
9241,9242,9243,9244,9245,4891,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255, # 9024
9256,9257,4892,9258,9259,9260,9261,4893,4894,9262,9263,9264,9265,9266,9267,9268, # 9040
9269,9270,9271,9272,9273,4467,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283, # 9056
9284,9285,3673,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298, # 9072
9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314, # 9088
9315,9316,9317,9318,9319,9320,9321,9322,4895,9323,9324,9325,9326,9327,9328,9329, # 9104
9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, # 9120
9346,9347,4468,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360, # 9136
9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,4896,9374,4469, # 9152
9375,9376,9377,9378,9379,4897,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389, # 9168
9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405, # 9184
9406,4470,9407,2751,9408,9409,3674,3552,9410,9411,9412,9413,9414,9415,9416,9417, # 9200
9418,9419,9420,9421,4898,9422,9423,9424,9425,9426,9427,9428,9429,3959,9430,9431, # 9216
9432,9433,9434,9435,9436,4471,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446, # 9232
9447,9448,9449,9450,3348,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461, # 9248
9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,4899,9473,9474,9475,9476, # 9264
9477,4900,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,3349,9489,9490, # 9280
9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506, # 9296
9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,4901,9521, # 9312
9522,9523,9524,9525,9526,4902,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536, # 9328
9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, # 9344
9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568, # 9360
9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584, # 9376
3805,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599, # 9392
9600,9601,9602,4903,9603,9604,9605,9606,9607,4904,9608,9609,9610,9611,9612,9613, # 9408
9614,4905,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628, # 9424
9629,9630,9631,9632,4906,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643, # 9440
4907,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658, # 9456
9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,4183,9673, # 9472
9674,9675,9676,9677,4908,9678,9679,9680,9681,4909,9682,9683,9684,9685,9686,9687, # 9488
9688,9689,9690,4910,9691,9692,9693,3675,9694,9695,9696,2945,9697,9698,9699,9700, # 9504
9701,9702,9703,9704,9705,4911,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715, # 9520
9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731, # 9536
9732,9733,9734,9735,4912,9736,9737,9738,9739,9740,4913,9741,9742,9743,9744,9745, # 9552
9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,4914,9759,9760, # 9568
9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776, # 9584
9777,9778,9779,9780,9781,9782,4915,9783,9784,9785,9786,9787,9788,9789,9790,9791, # 9600
9792,9793,4916,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806, # 9616
9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, # 9632
9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838, # 9648
9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854, # 9664
9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,4917,9869, # 9680
9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885, # 9696
9886,9887,9888,9889,9890,9891,9892,4472,9893,9894,9895,9896,9897,3806,9898,9899, # 9712
9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,4918, # 9728
9915,9916,9917,4919,9918,9919,9920,9921,4184,9922,9923,9924,9925,9926,9927,9928, # 9744
9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944, # 9760
9945,9946,4920,9947,9948,9949,9950,9951,9952,9953,9954,9955,4185,9956,9957,9958, # 9776
9959,9960,9961,9962,9963,9964,9965,4921,9966,9967,9968,4473,9969,9970,9971,9972, # 9792
9973,9974,9975,9976,9977,4474,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, # 9808
9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003, # 9824
10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019, # 9840
10020,10021,4922,10022,4923,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, # 9856
10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,4924, # 9872
10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064, # 9888
10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080, # 9904
10081,10082,10083,10084,10085,10086,10087,4475,10088,10089,10090,10091,10092,10093,10094,10095, # 9920
10096,10097,4476,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110, # 9936
10111,2174,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125, # 9952
10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,3807, # 9968
4186,4925,10141,10142,10143,10144,10145,10146,10147,4477,4187,10148,10149,10150,10151,10152, # 9984
10153,4188,10154,10155,10156,10157,10158,10159,10160,10161,4926,10162,10163,10164,10165,10166, #10000
10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182, #10016
10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,3203,10193,10194,10195,10196,10197, #10032
10198,10199,10200,4478,10201,10202,10203,10204,4479,10205,10206,10207,10208,10209,10210,10211, #10048
10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227, #10064
10228,10229,10230,10231,10232,10233,10234,4927,10235,10236,10237,10238,10239,10240,10241,10242, #10080
10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258, #10096
10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,4480, #10112
4928,4929,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287, #10128
10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303, #10144
10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319, #10160
10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,4930, #10176
10335,10336,10337,10338,10339,10340,10341,10342,4931,10343,10344,10345,10346,10347,10348,10349, #10192
10350,10351,10352,10353,10354,10355,3088,10356,2786,10357,10358,10359,10360,4189,10361,10362, #10208
10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,4932,10376,10377, #10224
10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,4933, #10240
10393,10394,10395,4934,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407, #10256
10408,10409,10410,10411,10412,3446,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422, #10272
10423,4935,10424,10425,10426,10427,10428,10429,10430,4936,10431,10432,10433,10434,10435,10436, #10288
10437,10438,10439,10440,10441,10442,10443,4937,10444,10445,10446,10447,4481,10448,10449,10450, #10304
10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466, #10320
10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482, #10336
10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498, #10352
10499,10500,10501,10502,10503,10504,10505,4938,10506,10507,10508,10509,10510,2552,10511,10512, #10368
10513,10514,10515,10516,3447,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527, #10384
10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543, #10400
4482,10544,4939,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557, #10416
10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,3676,4483,10568,10569,10570,10571, #10432
10572,3448,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586, #10448
10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602, #10464
10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618, #10480
10619,10620,10621,10622,10623,10624,10625,10626,10627,4484,10628,10629,10630,10631,10632,4940, #10496
10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648, #10512
10649,10650,10651,10652,10653,10654,10655,10656,4941,10657,10658,10659,2599,10660,10661,10662, #10528
10663,10664,10665,10666,3089,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677, #10544
10678,10679,10680,4942,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692, #10560
10693,10694,10695,10696,10697,4485,10698,10699,10700,10701,10702,10703,10704,4943,10705,3677, #10576
10706,10707,10708,10709,10710,10711,10712,4944,10713,10714,10715,10716,10717,10718,10719,10720, #10592
10721,10722,10723,10724,10725,10726,10727,10728,4945,10729,10730,10731,10732,10733,10734,10735, #10608
10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751, #10624
10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,4946,10762,10763,10764,10765,10766, #10640
10767,4947,4948,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780, #10656
10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796, #10672
10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812, #10688
10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828, #10704
10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844, #10720
10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860, #10736
10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876, #10752
10877,10878,4486,10879,10880,10881,10882,10883,10884,10885,4949,10886,10887,10888,10889,10890, #10768
10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906, #10784
10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,4487,10920,10921, #10800
10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,4950,10933,10934,10935,10936, #10816
10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,4488,10950,10951, #10832
10952,10953,10954,10955,10956,10957,10958,10959,4190,10960,10961,10962,10963,10964,10965,10966, #10848
10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982, #10864
10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998, #10880
10999,11000,11001,11002,11003,11004,11005,11006,3960,11007,11008,11009,11010,11011,11012,11013, #10896
11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, #10912
11030,11031,11032,4951,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044, #10928
11045,11046,11047,4489,11048,11049,11050,11051,4952,11052,11053,11054,11055,11056,11057,11058, #10944
4953,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,4954,11072, #10960
11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088, #10976
11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104, #10992
11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,3808,11116,11117,11118,11119, #11008
11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,4955, #11024
11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150, #11040
11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,4956,11162,11163,11164,11165, #11056
11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,4957, #11072
11181,11182,11183,11184,11185,11186,4958,11187,11188,11189,11190,11191,11192,11193,11194,11195, #11088
11196,11197,11198,11199,11200,3678,11201,11202,11203,11204,11205,11206,4191,11207,11208,11209, #11104
11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, #11120
11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241, #11136
11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,4959,11252,11253,11254,11255,11256, #11152
11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272, #11168
11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288, #11184
11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304, #11200
11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,3679,11315,11316,11317,11318,4490, #11216
11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334, #11232
11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,4960,11348,11349, #11248
11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365, #11264
11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,3961,4961,11378,11379, #11280
11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395, #11296
11396,11397,4192,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410, #11312
11411,4962,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425, #11328
11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441, #11344
11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457, #11360
11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,4963,11470,11471,4491, #11376
11472,11473,11474,11475,4964,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486, #11392
11487,11488,11489,11490,11491,11492,4965,11493,11494,11495,11496,11497,11498,11499,11500,11501, #11408
11502,11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514,11515,11516,11517, #11424
11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,3962,11530,11531,11532, #11440
11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548, #11456
11549,11550,11551,11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564, #11472
4193,4194,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, #11488
11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,4966,4195,11592, #11504
11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,3090,11605,11606,11607, #11520
11608,11609,11610,4967,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622, #11536
11623,11624,11625,11626,11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, #11552
11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654, #11568
11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670, #11584
11671,11672,11673,11674,4968,11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685, #11600
11686,11687,11688,11689,11690,11691,11692,11693,3809,11694,11695,11696,11697,11698,11699,11700, #11616
11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713,11714,11715,11716, #11632
11717,11718,3553,11719,11720,11721,11722,11723,11724,11725,11726,11727,11728,11729,11730,4969, #11648
11731,11732,11733,11734,11735,11736,11737,11738,11739,11740,4492,11741,11742,11743,11744,11745, #11664
11746,11747,11748,11749,11750,11751,11752,4970,11753,11754,11755,11756,11757,11758,11759,11760, #11680
11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776, #11696
11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,4971,11791, #11712
11792,11793,11794,11795,11796,11797,4972,11798,11799,11800,11801,11802,11803,11804,11805,11806, #11728
11807,11808,11809,11810,4973,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, #11744
11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,3680,3810,11835, #11760
11836,4974,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850, #11776
11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, #11792
11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882, #11808
11883,11884,4493,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897, #11824
11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913, #11840
11914,11915,4975,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928, #11856
11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944, #11872
11945,11946,11947,11948,11949,4976,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959, #11888
11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975, #11904
11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,4196,11988,11989,11990, #11920
11991,11992,4977,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005, #11936
12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021, #11952
12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, #11968
12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053, #11984
12054,12055,12056,12057,12058,12059,12060,12061,4978,12062,12063,12064,12065,12066,12067,12068, #12000
12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084, #12016
12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100, #12032
12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116, #12048
12117,12118,12119,12120,12121,12122,12123,4979,12124,12125,12126,12127,12128,4197,12129,12130, #12064
12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146, #12080
12147,12148,12149,12150,12151,12152,12153,12154,4980,12155,12156,12157,12158,12159,12160,4494, #12096
12161,12162,12163,12164,3811,12165,12166,12167,12168,12169,4495,12170,12171,4496,12172,12173, #12112
12174,12175,12176,3812,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188, #12128
12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204, #12144
12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220, #12160
12221,4981,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235, #12176
4982,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,4983,12246,12247,12248,12249, #12192
4984,12250,12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264, #12208
4985,12265,4497,12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277,12278, #12224
12279,12280,12281,12282,12283,12284,12285,12286,12287,4986,12288,12289,12290,12291,12292,12293, #12240
12294,12295,12296,2473,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308, #12256
12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,3963,12320,12321,12322,12323, #12272
12324,12325,12326,12327,12328,12329,12330,12331,12332,4987,12333,12334,12335,12336,12337,12338, #12288
12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12352,12353,12354, #12304
12355,12356,12357,12358,12359,3964,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369, #12320
12370,3965,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384, #12336
12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400, #12352
12401,12402,12403,12404,12405,12406,12407,12408,4988,12409,12410,12411,12412,12413,12414,12415, #12368
12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431, #12384
12432,12433,12434,12435,12436,12437,12438,3554,12439,12440,12441,12442,12443,12444,12445,12446, #12400
12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462, #12416
12463,12464,4989,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477, #12432
12478,12479,12480,4990,12481,12482,12483,12484,12485,12486,12487,12488,12489,4498,12490,12491, #12448
12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507, #12464
12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523, #12480
12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539, #12496
12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,4991,12552,12553,12554, #12512
12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570, #12528
12571,12572,12573,12574,12575,12576,12577,12578,3036,12579,12580,12581,12582,12583,3966,12584, #12544
12585,12586,12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600, #12560
12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616, #12576
12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632, #12592
12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,4499,12647, #12608
12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663, #12624
12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679, #12640
12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695, #12656
12696,12697,12698,4992,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710, #12672
12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726, #12688
12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, #12704
12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758, #12720
12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12772,12773,12774, #12736
12775,12776,12777,12778,4993,2175,12779,12780,12781,12782,12783,12784,12785,12786,4500,12787, #12752
12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803, #12768
12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819, #12784
12820,12821,12822,12823,12824,12825,12826,4198,3967,12827,12828,12829,12830,12831,12832,12833, #12800
12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849, #12816
12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,4199,12862,12863,12864, #12832
12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880, #12848
12881,12882,12883,12884,12885,12886,12887,4501,12888,12889,12890,12891,12892,12893,12894,12895, #12864
12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911, #12880
12912,4994,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926, #12896
12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942, #12912
12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,1772,12957, #12928
12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, #12944
12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989, #12960
12990,12991,12992,12993,12994,12995,12996,12997,4502,12998,4503,12999,13000,13001,13002,13003, #12976
4504,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, #12992
13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,3449,13030,13031,13032,13033, #13008
13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049, #13024
13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065, #13040
13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, #13056
13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097, #13072
13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113, #13088
13114,13115,13116,13117,13118,3968,13119,4995,13120,13121,13122,13123,13124,13125,13126,13127, #13104
4505,13128,13129,13130,13131,13132,13133,13134,4996,4506,13135,13136,13137,13138,13139,4997, #13120
13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155, #13136
13156,13157,13158,13159,4998,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170, #13152
13171,13172,13173,13174,13175,13176,4999,13177,13178,13179,13180,13181,13182,13183,13184,13185, #13168
13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, #13184
13202,13203,13204,13205,13206,5000,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216, #13200
13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,4200,5001,13228,13229,13230, #13216
13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,3969,13241,13242,13243,13244,3970, #13232
13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260, #13248
13261,13262,13263,13264,13265,13266,13267,13268,3450,13269,13270,13271,13272,13273,13274,13275, #13264
13276,5002,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290, #13280
13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,3813,13303,13304,13305, #13296
13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, #13312
13322,13323,13324,13325,13326,13327,13328,4507,13329,13330,13331,13332,13333,13334,13335,13336, #13328
13337,13338,13339,13340,13341,5003,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351, #13344
13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367, #13360
5004,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382, #13376
13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398, #13392
13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, #13408
13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430, #13424
13431,13432,4508,13433,13434,13435,4201,13436,13437,13438,13439,13440,13441,13442,13443,13444, #13440
13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,5005,13458,13459, #13456
13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,4509,13471,13472,13473,13474, #13472
13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490, #13488
13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506, #13504
13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, #13520
13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538, #13536
13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554, #13552
13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, #13568
13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586, #13584
13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602, #13600
13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, #13616
13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634, #13632
13635,13636,13637,13638,13639,13640,13641,13642,5006,13643,13644,13645,13646,13647,13648,13649, #13648
13650,13651,5007,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664, #13664
13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680, #13680
13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696, #13696
13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712, #13712
13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728, #13728
13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744, #13744
13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760, #13760
13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,3273,13775, #13776
13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791, #13792
13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807, #13808
13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823, #13824
13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839, #13840
13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855, #13856
13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871, #13872
13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887, #13888
13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903, #13904
13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919, #13920
13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935, #13936
13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951, #13952
13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967, #13968
13968,13969,13970,13971,13972) #13973

# flake8: noqa
site-packages/pip/_vendor/requests/packages/chardet/__pycache__/langhebrewmodel.cpython-33.pyc000064400000055574151733463720026600 0ustar00�
7�Re6,c@s9d�Zd�Zied�6ed�6d�d�6d�d�6d�d�6Zd�S(�i�i�i�i�iEi[iOiPi\iYiaiZiDioipiRiIi_iUiNiyiViGiCifikiTirigisi2iJi<i=i*iLiFi@i5iii]i8iAi6i1iBini3i+i,i?iQiMibiKili|i�i�i�i�i(i:i�i�i�i�i�i�i�i�i�i�iSi4i/i.iHi i^i�iqi�imi�i�i�i�i"iti�ividi�i�iuiwihi}i�i�iWici�ijizi{i�i7i�i�iei�i�ixi�i0i'i9i�ii;i)iXi!i%i$iii#i�i>ii�i~i�i�i&i-i�i�i�i�i�ii�i�i�i�i�i�i�i	iiiiiiiiiiiiiiiiii
iiiiiii
ii�i�i`iucharToOrderMapuprecedenceMatrixgC��|�?umTypicalPositiveRatioukeepEnglishLetteruwindows-1255ucharsetNameN(i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iEi[iOiPi\iYiaiZiDioipiRiIi_iUiNiyiViGiCifikiTirigisi�i�i�i�i�i�i2iJi<i=i*iLiFi@i5iii]i8iAi6i1iBini3i+i,i?iQiMibiKili�i�i�i�i�i|i�i�i�i�i(i:i�i�i�i�i�i�i�i�i�i�iSi4i/i.iHi i^i�iqi�imi�i�i�i�i"iti�ividi�i�iuiwihi}i�i�iWici�ijizi{i�i7i�i�iei�i�ixi�i0i'i9i�ii;i)iXi!i%i$iii#i�i>ii�i~i�i�i&i-i�i�i�i�i�ii�i�i�i�i�i�i�i	iiiiiiiiiiiiiiiiii
iiiiiii
ii�i�i�i`i�(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiF(uwin1255_CharToOrderMapuHebrewLangModeluFalseuWin1255HebrewModel(((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/langhebrewmodel.pyu<module>&s*
site-packages/pip/_vendor/requests/packages/chardet/__pycache__/sbcsgroupprober.cpython-33.pyc000064400000005245151733463720026650 0ustar00�
7�Re�c@s�ddlmZddlmZddlmZmZmZmZm	Z	m
Z
ddlmZm
Z
ddlmZmZddlmZmZddlmZddlmZdd	lmZGd
d�de�ZdS(
i(uCharSetGroupProber(uSingleByteCharSetProber(uWin1251CyrillicModelu
Koi8rModeluLatin5CyrillicModeluMacCyrillicModeluIbm866ModeluIbm855Model(uLatin7GreekModeluWin1253GreekModel(uLatin5BulgarianModeluWin1251BulgarianModel(uLatin2HungarianModeluWin1250HungarianModel(uTIS620ThaiModel(uWin1255HebrewModel(uHebrewProbercBs |EeZdZdd�ZdS(uSBCSGroupProbercCs�tj|�tt�tt�tt�tt�tt�tt�tt	�tt
�tt�tt�tt
�tt�tt�g
|_t�}ttd|�}ttd|�}|j||�|jj|||g�|j�dS(NFT(uCharSetGroupProberu__init__uSingleByteCharSetProberuWin1251CyrillicModelu
Koi8rModeluLatin5CyrillicModeluMacCyrillicModeluIbm866ModeluIbm855ModeluLatin7GreekModeluWin1253GreekModeluLatin5BulgarianModeluWin1251BulgarianModeluLatin2HungarianModeluWin1250HungarianModeluTIS620ThaiModelu	_mProbersuHebrewProberuWin1255HebrewModeluFalseuTrueuset_model_probersuextendureset(uselfuhebrewProberulogicalHebrewProberuvisualHebrewProber((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/sbcsgroupprober.pyu__init__+s.
															
uSBCSGroupProber.__init__N(u__name__u
__module__u__qualname__u__init__(u
__locals__((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/sbcsgroupprober.pyuSBCSGroupProber*suSBCSGroupProberN(ucharsetgroupproberuCharSetGroupProberusbcharsetproberuSingleByteCharSetProberulangcyrillicmodeluWin1251CyrillicModelu
Koi8rModeluLatin5CyrillicModeluMacCyrillicModeluIbm866ModeluIbm855ModelulanggreekmodeluLatin7GreekModeluWin1253GreekModelulangbulgarianmodeluLatin5BulgarianModeluWin1251BulgarianModelulanghungarianmodeluLatin2HungarianModeluWin1250HungarianModelu
langthaimodeluTIS620ThaiModelulanghebrewmodeluWin1255HebrewModeluhebrewproberuHebrewProberuSBCSGroupProber(((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/sbcsgroupprober.pyu<module>s.site-packages/pip/_vendor/requests/packages/chardet/__pycache__/euckrfreq.cpython-33.pyc000064400000255336151733463720025426 0ustar00�
7�Re��c&"@sdZdZd("Zd'"S()"g@i0	i
i�ixiti�i�i�iHiai�i�i�i�i+i�iWiui�ihii]i�i�i�i�i�i�i�i�i�i�iviwi�i�i�i�imiFi!ipi�ii�ii�i�i�i�ixi�i/i�i�i�i�ii�i�i�i9ii�i�iti�i-iyi�iKi�i�i�i�i�i�iiOi�ini�i�i�i�i�ii0i�i�i<i4i{i�i�i�i�i�iii�iri�i�i�i�i�i�i�i�i�i�i�iXiXi�i�i�i�iYi�i�i&i�iPi�i�i�i�i�i�i�i^i�i�i�i�i�i�i�i9i�i�i�i�i�i�iQi�i"iiti�i�i�i�ii]i{i7i�ii�i{i�i;i�iui�izi/i�i|i�i�i�i�i7i�i�i.i�i�i�i�ii�ii�iiiiii{iiii#i|i}i�i~i�iti8ii_i	i
iii
i!iiii_ii�i�i�iii*i�iuii`i"i�ii|iii�i�iiiaiiiiiii?iiRi!i i/i�i�i!i"i=i�i�i#i�i$i%i&i'i(i)i,i�i'ibi$i*i�i+i�i-i�i,i�ii�i�i�i&iUi�i�i#ii�i-i.i'ii�ifi/isi�i0i�i�iii�i i�i9iei[i1i�i�iiZi�i�i:i�i�i�i2i3i�iGii�iiyi4i�i�i�i5i6i7i,iwi�i�isi8i�i�i9i:ii�i~i;ii<i;i}i=i>i?ioi)i�i�i@i�iAiBi�i�i2iYiCiDi�i<iEiFiGiHiIi%iJiKiLiMiNiOii`i>iPi�i=iQi�iRi�iSiTi;i�i�i�i�iiUi�iViWiXi4iYiiiZi[i�i\i]iii^i�i�i_i"iPi�i�i`i;i�i~iHiaiivi�izi?ii�i�ibi�i�i<icididieifici0i�idiigiyi�i�ihiiisi0iji=iki�ili�i�i�i<ibi�i�iUii�ii�iIiminioiipiqirisitiuii�i�i�i6iviwi�i*i�i]ixiyi�i�iziZi�i-i:i�ibi
i{i|i�i&i'i�i�i5i�i�ii>i}i~iwiigi�i�i�i6i�i%i�i�i(i�ivi�ii�iwi�i�i�i�iEi�i�i�i�i�i�i�i�i�ifi�iVi�i7i�i�i�i�iBi�iNi�i[i�i'i�i�i�i�i�i�i�iSi�i�i�i�i�iei�iixi�i�i�i�i�i�i�i�i�ii�i�i�i�i�i�i�i�i�i�i�i?i�i�ii�iqi�ifi�i(i)i�i�i~i�i\i�i�i�i�i�i)ii�i�ii�ii�i�i�i�i�i$ii�i�i�i�i�ili�i�i�ii~i�i�iCi�i�ii�i@i�i�i�i�i�i2i�i�iKiiziVii�i�i�i�iQirifiiii�i�i ihi+i3ii1i�ii�i�i�iigi(i�i�i�izi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iAi�i<ijii�iMigi�i2i�i�i�i�i�i�i�i�i�iVihii�iJi�i�i0i�iibii�i�i�ii�i�i�iiYi�i�ii�ii�iai!i*i�i�i�i�i�iKiDi8iiRiiBi�i@i�i�i�ii�i�i�iyi�i�i�i�iiXi:i�i�i#i�i�i�iii�iGi�i�iki�i�i=i�i�i�i�i!i�i�i�iJi�i�i=i�i�i�i}i�iijii�i�i�i�i�i�i�i�i�i�i�iEi�i�i�i�i�ijiOi4i�i�i�i�i�i�i�i�i�i	ivi]i�iCi�i�i�i�i�i�i�ioi�i�i�i�i
i�i�i�iliciAi�i�i�i�i�i�i�i�iiTi�i�iki�i�i�i�i�i�i3i*i�iqi�i�i>i�ii�i�i�ii+iiiiii;i�ipiixii�i�i�iiii�i�i	i�i
ii�ii
i�i�i�i�iliii�i�iii)i�ii�i�imi8i�iiDii�iiiiii�ii�iii7iLiBi�iiDii�ii�i�itiiii i!i
i"i#i$i%iRi&i'i(i)i*i�i+i,i�i,i-i.imi�i
i^i/ici�iEi�i�i�iaimi0iEi1i2i3ii�i�i4iTi�i�i�i5i�ii�i�i6i7iini�i�ioi8i9iFi�i�i�i:iGi;i<i=i>i?i@iAiBiCiDiEi$iFiGi�i�i%i�i�ipiHiIiJiKiLi�i�ii�i�i�i�iMiNiOiPiQiRii�iSi/iTi�iUi�iiiVi�iIiHi�ii�i�i�iWi�iXi�iqiYiZi[i\i�iri�isi]i^i_i`iiviLiai�i�i.i�ibiFi>i�i�ijiciZi�i�iBi6i�i`idieii�i|iifi�i�i5igi�ihi�iiiHi�iji�i�iki�ili�i1iminioipiqiriCisitiuiviwi�ixiyizi{i�i�i|i}i~ii�i�i�iiii�iOi�i�i�i�i�i�ii�i�i�i�i�iEi�i�iqi�iiIi�i\i�i-i�i�iSi�i�i�i
i�iei�i�i�ili�iMii�iQiiPiii^ii
i-iFi�i�i�ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i
i.i�iti�i�i�i�iJi�i�i�i�i�i�i�igi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ii�i�i�i�i�iui�i�i�i9i	i�i�i�i	i�i$i�i�i�i�ii5i%i�ikiLi�i�ii�i�i�i�ii�i�iAi�i�i�i�i�i�i�i�i�iRi�iui�i�i�ii�i)i�i�i:i�i�i�ii�i�i�i"i$ivi�i�i�iciZi�i�i�i�i�ii*iWiiKi�iLi�i+i�ii�i�i�i�i�ii�i	iBi�i�i?i�i�i�ii�i�i�i�i�iMi[i5i�i�i�ini�i�i�i�i�iCi�i'i�i�i�i�i�i�i�i�i
i�i�i�i	i�ii�i�i�i�i�iFiTi/i�i�i�i�ii8i�iui�i�i�iKi�i(iMi�iiii�i�i�i�i�i�i�ii�i�iTi�i?ii�i�i�ii�iiei i(i�i�i�i�i�i�i%i0iii�iOi�i	i8i	i	i	i	i	i�iii	i	i	ii�i#ii�i		i�i�iVi
iiiPii iMiWi�i
	ii	i�i|i	i
	iSi�i�i�ii�i�i�i	i	i�i�i	i	i	i	i	i	i�i	i	i�i9iDiii�i�i�ii	i3i�i�i	i	i	i{i	ii�i	i	i	i�i 	i�i�i�ii�i!	iki�i�ii�iNi�iYi�i"	i#	i$	i%	i&	i'	i(	i]i)	i*	i+	i,	i-	i.	i�i/	i�i�i>ii�i�i1	i�i�i�i�i\i�i2	i�i3	i�i�i4	i5	i6	iwi7	i�i8	i�i3ii�i�i9	i:	iLii�i�i;	i�i<	i�ii�ii�i�ii�i�i�i=	i�iJi>	i?	i@	i�iA	i�iB	iC	iD	i�iE	i�i�iF	iG	iH	iI	i�i�i�i�i�i�iJ	iK	ii�iL	iM	iN	iiIiO	iP	i�iQ	iR	iS	i�iT	i�iU	iV	iW	iX	i�iY	iZ	i[	i\	i]	i�i�i^	i_	i`	ia	i�iib	ic	id	ie	ii�if	ig	iUi�ixi ih	i�i�ii	ij	i�ii�i4i&i�i�i�i!i�i�i�iSiyii�i�i"i
i�i#ik	i�il	im	in	i�i�i�ipiQi�i.io	iUi�iOi�ip	i�iq	ir	is	ixit	i�iu	iv	iw	iii$ix	i�iy	i�i`iz	i{	i|	i}	i�i~	i	i�	i�	i�	i�	i�	i�	i�iCi�i�i�i�i%iyi�iioi�	i�i�	i�	i�	i�	i�	i�	i�i�	i�	i�	i�	i�i�i�	i�i�i�	i�	ii@i�i�i�	iGi�	i�i�ii2i�i�i�i�i�	i�	i�	i�	iNi�	ii�i�i�i�i�	i�	i�	i�	i�	iri�	i�izini�i�i�iPi�	i#i�	i&iQi�	i�imi�	ici�i�i�	i'i�	iwi�	i�	i�i(ili@i�i�i�i)i�i*i�	i�	i�	i�	i�i�	i�	i�	i�	i�i�i�	i�i�i�	i�	i�	iHi�i�	i�	ii�	ii�i�	i�	i�	i�i�	i�	iri�	ii�iAi�	i�i�i�i�i�	i}i,i�i�i:i�ii�i�i
iiIi�	iNi�i1i�	iWi�i�i�i�i�i�i�i�	i+i�	i�	i1i�ibi�i�	iqi�	i,i�	i�i�iei�i�i_iidi�	i�	i�	i�	i�	i�	i�i�i2i�i�i�i�	i�i�	i�	i�	i�	ii�	i�i�	i�	i�i-i�	i�i�i�	i�	i�	i�	i�	i�	i�i�	i�	i�	i�	i�	i�	i�i�	i�i�	i�	ii�i7i�	i�i�	ii�	i�	i�	i�	i�	i�	i�	i�i�i�i�i�i�i�i�i,iGi�ii�i�	i�i^i�	i�	i.i�	i�igi�i�	i�i�	i�	i�	i�i�i�	ii�ii_i�i�	i�	i�	i�i�ihihii{i�	i|i�i�i�i3i�	i�	i�	i�i�i�	i
i
i\ii�i�ii
i
i
i
i
i
i
i�i	
i

i
i
ii�i�i
iji
iii�i4ii
i
i
i
i
i
i�i�i
i
i
i
i�i6idi�i/i
i
ii�i�ioi
i�iRi�ii�i	i&i
ikinizi�ii�i�i
i�i
i�i�iXi�idiiSi�i}i
i}ii�i~i�i�ii�i 
i!
iNi"
i�i�i�i�i�i�i#
i�i�isi$
i%
i&
ifiDii1i'
i�ii(
i@i)
i^i�i�i�i*
i�i+
i,
i-
i.
i/
iJi+i0
i1
i2
i�iTi�i3
i4
i5
i6
i�i7
iAi.i�i�i�i8
i9
ii"i:
i;
i�i<
i=
i>
ii�i0i?
i�i@
iiA
iB
iiC
iD
iE
iF
iG
i�i�i_i[iH
iI
i�ii`iaiJ
i�ii�i�iK
iL
iM
iN
i�iO
i�iiiiiiP
iQ
iR
iS
iT
iU
iV
iW
iX
iY
iZ
i[
i\
i]
i^
i_
i`
ia
ib
ic
id
ie
if
ig
ih
ii
ij
ik
il
im
in
io
ip
iq
ir
is
it
iu
iv
iw
ix
iy
iz
i{
i|
i}
i~
i
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
iipi�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
ii�
i�
i�
i�
i�
i�
i�
ii�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i	i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i
i�
ii�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
ii�
i�
i�
iUi�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i1i�
i�
i�
iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i
i)i*i+i,ii-i.ii/i0i1i2i3i4i5i6i7i8i9i:iVi2i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqiri3isitiuiviwixiyizi{i|i}i~iii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ii�i�i�i�i�ii�i4i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ii�i�i�iii�i�i�i�i�i�i�i�i�i�i�i�i�i�ii�i�i�i�iiiiiiiiiii	i
ii�ii
iiiiiiiiiiiiiiiiiii i!i"i#i$i�i%i&i'i(i)ii*i+i,i-iWi.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihi5iiijikiliminioipiqirisitiuiiviwi6ixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i
i
i
i
i
i
i
i
i
i	
i

i
i
i

i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i 
i!
i"
i#
i$
i7i%
i&
i'
i(
i)
i*
i+
i,
i-
i.
i/
i0
i1
i2
i3
i4
i5
i6
i7
i8
i9
i:
i;
i8i<
i=
i>
i?
i@
iA
iB
iC
iD
iE
iF
iG
iH
iI
iJ
iK
iL
iM
iN
iO
iP
iQ
iR
iS
iT
iU
iV
i9iW
iX
iY
iZ
i[
i:i\
i]
i^
iii_
i`
ia
ib
ic
id
ie
if
ig
i�ih
ii
ij
i;ik
il
im
in
io
iip
iq
ir
is
it
iu
iv
iw
ix
iy
iz
i{
i|
i}
i~
i�i
i�
i�
i�
i�
ii�i�
i i!i�
i�
i�
i"i�
i�
i�
i�
i�
i#i�
i�
i�
i�
i�
i$i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i<i�
i�
i�
i�
i�
i�
i�i�
i�
i�
i�
i�
i�
i%i�
i=i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i>i�
i�
i�
i�
i�
i&i?i�
i�
i�
i'i�
i(i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i)i�
i�
i*i�
iiiiiiiiii	i
iii
iiiiiiii+iiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i,i.i/i-i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHi.iIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisiti�iuiviwixi�iyizi{i|i/i�i}i~ii�i�i�i�i�i0i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i@i�i�i�i�i�i�i�i�i�i�i�i1i�i�i�i�i�i�i�i�i�i�i2i�i�i�i�i�i�i�i�i�i�i�i�iAi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iBi3i�i�i4i�i�i�i�i�i�i�i�i�iCi�i�i�i�i�i5i�i�i�i�i�i�i�i�i�i�i6i�i�i7iDi�i�i�i�i�i�i�i8i�i�i9i�i�i�i�i�i�i�iiiiiiEiiiii	i
iii
iiiiii:iiiiiiiiiiii;iii i!i<i"i#i$i%i&i'i(i)i*i+i,i-i.i=i/i0i1i2i3i4i5i6i7i>i8i9i:i?i@i;iFi<iGi=i>iHi?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTi�iUiViWiXiYiZi[i�i\iAi]i^i_i`iaibicidieifigiBihiiijikiliCiminioipiqirisitiuiviwixiyizi{i|i}iDi~ii�i�i�i�i�i�i�i�i�i�iIi�i�i�i�i�i�i�i�i�i�i�i�i�i�iJi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iKi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iEi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iFi�i�i�i�iGi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iHi�i�i�i�i�i�i�i�i�iIi�i�i�i�i�i�i�i�iiiiiiiiii	i
iii�i
iiiiiiiiiiiiiiii�iiiiJi i!i"i#i$i%i&i'i(i)iLi*i+i,i-i.i/i0iKi1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{iLi|i}i~ii�i�i�i�iMi�iMi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iNi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iNi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iOi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iPi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiiiQi	i
iii
iRiiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iSiAiBiCiDiEiFiGiHiIiXiJiKiLiMiNiTiOiPiQiRiSiTiUiViWiXiYiZi�i�i[i\i]i^i_i`iaibicidieifigiOihiiijikiliminioipiqiUirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iVi�i�i�iWi�i�i�i�i�i�i�i�i�i�i�i�i�i�iPi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iXi�i�i�i�i�iYi�i�i�i�i�i�i�i�iZi�i�i�i�i�i�i�i�i�i�i�i[i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiii\ii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)iQi*i+i,i-i.i/i0i1i2i3i4i5iRi6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJi]iKiLiMiNiOi^iPiQiRiSi�iTiUiViYiWiXiYiZi[i\i]i^i_i`iaibicidieifigi�ihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii_i�i`i�i�i�i�i�i�i�i�iai�i�i�i�i�i�i�i�i�i�i�iSi�i�i�i�i�i�i�i�i�i�i�i�i�i�ibi�i�i�i�i�i�i�i�i�i�ici�i�i�i�i�i�i�i�i�i�i�idi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iei�i�i�ifi�i�i�i�i�i�i�i�i�igi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i5i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiihiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/iji0i1i2iTi3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCikiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiliuiviwiximiyizini{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�ioi�ipi�i�i�i�i�i�i6i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iUi�i�i�i�i�i�i�i�i�i�i�iqi�i�i�i�i�i�iVi�i�i�i�i�i�i�i�i�i�iri�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�isi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iti�i�i�i�i�i�i�i�iWi�iiiiiiiiii	iui
iii
iiiiiiiiiiiiiiiiiXiiviiYi i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:iZi;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiwiOiPiQiRixiSiTiUiVi[iWi\iXiYiZi[i]i\i]i^i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiyi�i�i�i�izi�i�i�i�i�i�i_i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i{i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i|i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i`i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i}i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiii�iiiiiiiiii i!i"i#i$i~i%i&i'i(ii)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i�i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifi�igihiiijikilimi�inioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iai�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iZi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ibi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ici�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiidiiiiiii	i
iii
iiiiiei iiiiiiiiiiii�iiii i!i"i#i$i�i%i�i&i'i(i)i*i+i,i-i.i�i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBi�iCiDiEiFiGiHiIi�iJiKiLiMiNi�iOiPiQiRifiSiTiUiViWiXiYiZi[i\i]i�i^i_i�i�i`iaibicidieifigihi�iiijikiliminioipi�iqirisitiuiviwigixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ihi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i[i\i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiii�iiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i�i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@i�i�iAi�iBiCiDiEiFiGiHiIi�iJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]iii^iji_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i�i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKi�iLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikilimi�inioipiqirisitiuiviwi�ixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iki�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
i�iiiiiiiiii�iiiiiiiiii i!i"i#i$i%i&i�i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigi�ihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ili�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiii�ii	i
iii
iiiiii�iiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEimiFiGiHiIiJiKiLiMiNiOiPini�iQiRiSiTiUiVi�iWiXiYiZioi[i\i]i^i_i`iaibicidieipifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i�i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iqi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i�i?i@iAiBiCiDiEiFiGiHiIiJiKiLiriMiNiOiPiQiRiSiTiUiViWiXi�iYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisiti�iuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'isi(i)i*i+i,i-i�i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i i i i i i i i i i	 i
 i i i
 i i i i i i i i i i i i i i i i i i i  i! i" i# i$ i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz i{ i| i} i~ i i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i!i!i!i!i!i!i!i!i!i	!i
!i!i!i
!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i !i!!i"!i#!i$!i%!i&!i'!i(!i)!i*!i+!i,!i-!i.!i/!i0!i1!i2!i3!i4!i5!i6!i7!i8!i9!i:!i;!i<!i=!i>!i?!i@!iA!iB!iC!iD!iE!iF!iG!iH!iI!iJ!iK!iL!iM!iN!iO!iP!iQ!iR!iS!iT!iU!iV!iW!iX!iY!iZ!i[!i\!i]!i^!i_!i`!ia!ib!ic!id!ie!if!ig!ih!ii!ij!ik!il!im!in!io!ip!iq!ir!is!it!iu!iv!iw!ix!iy!iz!i{!i|!i}!i~!i!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i"i"i"i"i"i"i"i"i"i	"i
"i"i"i
"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i "i!"i""i#"i$"i%"N(&"i
i�ixiti�i�i�iHiai�i�i�i�i+i�iWiui�ihii]i�i�i�i�i�i�i�i�i�i�iviwi�i�i�i�imiFi!ipi�ii�ii�i�i�i�ixi�i/i�i�i�i�ii�i�i�i9ii�i�iti�i-iyi�iKi�i�i�i�i�i�iiOi�ini�i�i�i�i�ii0i�i�i<i4i{i�i�i�i�i�iii�iri�i�i�i�i�i�i�i�i�i�i�iXiXi�i�i�i�iYi�i�i&i�iPi�i�i�i�i�i�i�i^i�i�i�i�i�i�i�i9i�i�i�i�i�i�iQi�i"iiti�i�i�i�ii]i{i7i�ii�i{i�i;i�iui�izi/i�i|i�i�i�i�i7i�i�i.i�i�i�i�ii�ii�iiiiii{iiii#i|i}i�i~i�iti8ii_i	i
iii
i!iiii_ii�i�i�iii*i�iuii`i"i�ii|iii�i�iiiaiiiiiii?iiRi!i i/i�i�i!i"i=i�i�i#i�i$i%i&i'i(i)i,i�i'ibi$i*i�i+i�i-i�i,i�ii�i�i�i&iUi�i�i#ii�i-i.i'ii�ifi/isi�i0i�i�iii�i i�i9iei[i1i�i�iiZi�i�i:i�i�i�i2i3i�iGii�iiyi4i�i�i�i5i6i7i,iwi�i�isi8i�i�i9i:ii�i~i;ii<i;i}i=i>i?ioi)i�i�i@i�iAiBi�i�i2iYiCiDi�i<iEiFiGiHiIi%iJiKiLiMiNiOii`i>iPi�i=iQi�iRi�iSiTi;i�i�i�i�iiUi�iViWiXi4iYiiiZi[i�i\i]iii^i�i�i_i"iPi�i�i`i;i�i~iHiaiivi�izi?ii�i�ibi�i�i<icididieifici0i�idiigiyi�i�ihiiisi0iji=iki�ili�i�i�i<ibi�i�iUii�ii�iIiminioiipiqirisitiuii�i�i�i6iviwi�i*i�i]ixiyi�i�iziZi�i-i:i�ibi
i{i|i�i&i'i�i�i5i�i�ii>i}i~iwiigi�i�i�i6i�i%i�i�i(i�ivi�ii�iwi�i�i�i�iEi�i�i�i�i�i�i�i�i�ifi�iVi�i7i�i�i�i�iBi�iNi�i[i�i'i�i�i�i�i�i�i�iSi�i�i�i�i�iei�iixi�i�i�i�i�i�i�i�i�ii�i�i�i�i�i�i�i�i�i�i�i?i�i�ii�iqi�ifi�i(i)i�i�i~i�i\i�i�i�i�i�i)ii�i�ii�ii�i�i�i�i�i$ii�i�i�i�i�ili�i�i�ii~i�i�iCi�i�ii�i@i�i�i�i�i�i2i�i�iKiiziVii�i�i�i�iQirifiiii�i�i ihi+i3ii1i�ii�i�i�iigi(i�i�i�izi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iAi�i<ijii�iMigi�i2i�i�i�i�i�i�i�i�i�iVihii�iJi�i�i0i�iibii�i�i�ii�i�i�iiYi�i�ii�ii�iai!i*i�i�i�i�i�iKiDi8iiRiiBi�i@i�i�i�ii�i�i�iyi�i�i�i�iiXi:i�i�i#i�i�i�iii�iGi�i�iki�i�i=i�i�i�i�i!i�i�i�iJi�i�i=i�i�i�i}i�iijii�i�i�i�i�i�i�i�i�i�i�iEi�i�i�i�i�ijiOi4i�i�i�i�i�i�i�i�i�i	ivi]i�iCi�i�i�i�i�i�i�ioi�i�i�i�i
i�i�i�iliciAi�i�i�i�i�i�i�i�iiTi�i�iki�i�i�i�i�i�i3i*i�iqi�i�i>i�ii�i�i�ii+iiiiii;i�ipiixii�i�i�iiii�i�i	i�i
ii�ii
i�i�i�i�iliii�i�iii)i�ii�i�imi8i�iiDii�iiiiii�ii�iii7iLiBi�iiDii�ii�i�itiiii i!i
i"i#i$i%iRi&i'i(i)i*i�i+i,i�i,i-i.imi�i
i^i/ici�iEi�i�i�iaimi0iEi1i2i3ii�i�i4iTi�i�i�i5i�ii�i�i6i7iini�i�ioi8i9iFi�i�i�i:iGi;i<i=i>i?i@iAiBiCiDiEi$iFiGi�i�i%i�i�ipiHiIiJiKiLi�i�ii�i�i�i�iMiNiOiPiQiRii�iSi/iTi�iUi�iiiVi�iIiHi�ii�i�i�iWi�iXi�iqiYiZi[i\i�iri�isi]i^i_i`iiviLiai�i�i.i�ibiFi>i�i�ijiciZi�i�iBi6i�i`idieii�i|iifi�i�i5igi�ihi�iiiHi�iji�i�iki�ili�i1iminioipiqiriCisitiuiviwi�ixiyizi{i�i�i|i}i~ii�i�i�iiii�iOi�i�i�i�i�i�ii�i�i�i�i�iEi�i�iqi�iiIi�i\i�i-i�i�iSi�i�i�i
i�iei�i�i�ili�iMii�iQiiPiii^ii
i-iFi�i�i�ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i
i.i�iti�i�i�i�iJi�i�i�i�i�i�i�igi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ii�i�i�i�i�iui�i�i�i9i	i�i�i�i	i�i$i�i�i�i�ii5i%i�ikiLi�i�ii�i�i�i�ii�i�iAi�i�i�i�i�i�i�i�i�iRi�iui�i�i�ii�i)i�i�i:i�i�i�ii�i�i�i"i$ivi�i�i�iciZi�i�i�i�i�ii*iWiiKi�iLi�i+i�ii�i�i�i�i�ii�i	iBi�i�i?i�i�i�ii�i�i�i�i�iMi[i5i�i�i�ini�i�i�i�i�iCi�i'i�i�i�i�i�i�i�i�i
i�i�i�i	i�ii�i�i�i�i�iFiTi/i�i�i�i�ii8i�iui�i�i�iKi�i(iMi�iiii�i�i�i�i�i�i�ii�i�iTi�i?ii�i�i�ii�iiei i(i�i�i�i�i�i�i%i0iii�iOi�i	i8i	i	i	i	i	i�iii	i	i	ii�i#ii�i		i�i�iVi
iiiPii iMiWi�i
	ii	i�i|i	i
	iSi�i�i�ii�i�i�i	i	i�i�i	i	i	i	i	i	i�i	i	i�i9iDiii�i�i�ii	i3i�i�i	i	i	i{i	ii�i	i	i	i�i 	i�i�i�ii�i!	iki�i�ii�iNi�iYi�i"	i#	i$	i%	i&	i'	i(	i]i)	i*	i+	i,	i-	i.	i�i/	i�i�i>ii�i�i0	i1	i�i�i�i�i\i�i2	i�i3	i�i�i4	i5	i6	iwi7	i�i8	i�i3ii�i�i9	i:	iLii�i�i;	i�i<	i�ii�ii�i�ii�i�i�i=	i�iJi>	i?	i@	i�iA	i�iB	iC	iD	i�iE	i�i�iF	iG	iH	iI	i�i�i�i�i�i�iJ	iK	ii�iL	iM	iN	iiIiO	iP	i�iQ	iR	iS	i�iT	i�iU	iV	iW	iX	i�iY	iZ	i[	i\	i]	i�i�i^	i_	i`	ia	i�iib	ic	id	ie	ii�if	ig	iUi�ixi ih	i�i�ii	ij	i�ii�i4i&i�i�i�i!i�i�i�iSiyii�i�i"i
i�i#ik	i�il	im	in	i�i�i�ipiQi�i.io	iUi�iOi�ip	i�iq	ir	is	ixit	i�iu	iv	iw	iii$ix	i�iy	i�i`iz	i{	i|	i}	i�i~	i	i�	i�	i�	i�	i�	i�	i�iCi�i�i�i�i%iyi�iioi�	i�i�	i�	i�	i�	i�	i�	i�i�	i�	i�	i�	i�i�i�	i�i�i�	i�	ii@i�i�i�	iGi�	i�i�ii2i�i�i�i�i�	i�	i�	i�	iNi�	ii�i�i�i�i�	i�	i�	i�	i�	iri�	i�izini�i�i�iPi�	i#i�	i&iQi�	i�imi�	ici�i�i�	i'i�	iwi�	i�	i�i(ili@i�i�i�i)i�i*i�	i�	i�	i�	i�i�	i�	i�	i�	i�i�i�	i�i�i�	i�	i�	iHi�i�	i�	ii�	ii�i�	i�	i�	i�i�	i�	iri�	ii�iAi�	i�i�i�i�i�	i}i,i�i�i:i�ii�i�i
iiIi�	iNi�i1i�	iWi�i�i�i�i�i�i�i�	i+i�	i�	i1i�ibi�i�	iqi�	i,i�	i�i�iei�i�i_iidi�	i�	i�	i�	i�	i�	i�i�i2i�i�i�i�	i�i�	i�	i�	i�	ii�	i�i�	i�	i�i-i�	i�i�i�	i�	i�	i�	i�	i�	i�i�	i�	i�	i�	i�	i�	i�i�	i�i�	i�	ii�i7i�	i�i�	ii�	i�	i�	i�	i�	i�	i�	i�i�i�i�i�i�i�i�i,iGi�ii�i�	i�i^i�	i�	i.i�	i�igi�i�	i�i�	i�	i�	i�i�i�	ii�ii_i�i�	i�	i�	i�i�ihihii{i�	i|i�i�i�i3i�	i�	i�	i�i�i�	i
i
i\ii�i�ii
i
i
i
i
i
i
i�i	
i

i
i
ii�i�i
iji
iii�i4ii
i
i
i
i
i
i�i�i
i
i
i
i�i6idi�i/i
i
ii�i�ioi
i�iRi�ii�i	i&i
ikinizi�ii�i�i
i�i
i�i�iXi�idiiSi�i}i
i}ii�i~i�i�ii�i 
i!
iNi"
i�i�i�i�i�i�i#
i�i�isi$
i%
i&
ifiDii1i'
i�ii(
i@i)
i^i�i�i�i*
i�i+
i,
i-
i.
i/
iJi+i0
i1
i2
i�iTi�i3
i4
i5
i6
i�i7
iAi.i�i�i�i8
i9
ii"i:
i;
i�i<
i=
i>
ii�i0i?
i�i@
iiA
iB
iiC
iD
iE
iF
iG
i�i�i_i[iH
iI
i�ii`iaiJ
i�ii�i�iK
iL
iM
iN
i�iO
i�iiiiiiP
iQ
iR
iS
iT
iU
iV
iW
iX
iY
iZ
i[
i\
i]
i^
i_
i`
ia
ib
ic
id
ie
if
ig
ih
ii
ij
ik
il
im
in
io
ip
iq
ir
is
it
iu
iv
iw
ix
iy
iz
i{
i|
i}
i~
i
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
iipi�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
ii�
i�
i�
i�
i�
i�
i�
ii�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i	i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i
i�
ii�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
ii�
i�
i�
iUi�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i1i�
i�
i�
iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i
i)i*i+i,ii-i.ii/i0i1i2i3i4i5i6i7i8i9i:iVi2i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqiri3isitiuiviwixiyizi{i|i}i~iii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ii�i�i�i�i�ii�i4i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ii�i�i�iii�i�i�i�i�i�i�i�i�i�i�i�i�i�ii�i�i�i�iiiiiiiiiii	i
ii�ii
iiiiiiiiiiiiiiiiiii i!i"i#i$i�i%i&i'i(i)ii*i+i,i-iWi.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihi5iiijikiliminioipiqirisitiuiiviwi6ixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i
i
i
i
i
i
i
i
i
i	
i

i
i
i

i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i
i 
i!
i"
i#
i$
i7i%
i&
i'
i(
i)
i*
i+
i,
i-
i.
i/
i0
i1
i2
i3
i4
i5
i6
i7
i8
i9
i:
i;
i8i<
i=
i>
i?
i@
iA
iB
iC
iD
iE
iF
iG
iH
iI
iJ
iK
iL
iM
iN
iO
iP
iQ
iR
iS
iT
iU
iV
i9iW
iX
iY
iZ
i[
i:i\
i]
i^
iii_
i`
ia
ib
ic
id
ie
if
ig
i�ih
ii
ij
i;ik
il
im
in
io
iip
iq
ir
is
it
iu
iv
iw
ix
iy
iz
i{
i|
i}
i~
i�i
i�
i�
i�
i�
ii�i�
i i!i�
i�
i�
i"i�
i�
i�
i�
i�
i#i�
i�
i�
i�
i�
i$i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i<i�
i�
i�
i�
i�
i�
i�i�
i�
i�
i�
i�
i�
i%i�
i=i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i>i�
i�
i�
i�
i�
i&i?i�
i�
i�
i'i�
i(i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i�
i)i�
i�
i*i�
iiiiiiiiii	i
iii
iiiiiiii+iiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i,i.i/i-i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHi.iIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisiti�iuiviwixi�iyizi{i|i/i�i}i~ii�i�i�i�i�i0i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i@i�i�i�i�i�i�i�i�i�i�i�i1i�i�i�i�i�i�i�i�i�i�i2i�i�i�i�i�i�i�i�i�i�i�i�iAi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iBi3i�i�i4i�i�i�i�i�i�i�i�i�iCi�i�i�i�i�i5i�i�i�i�i�i�i�i�i�i�i6i�i�i7iDi�i�i�i�i�i�i�i8i�i�i9i�i�i�i�i�i�i�iiiiiiEiiiii	i
iii
iiiiii:iiiiiiiiiiii;iii i!i<i"i#i$i%i&i'i(i)i*i+i,i-i.i=i/i0i1i2i3i4i5i6i7i>i8i9i:i?i@i;iFi<iGi=i>iHi?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTi�iUiViWiXiYiZi[i�i\iAi]i^i_i`iaibicidieifigiBihiiijikiliCiminioipiqirisitiuiviwixiyizi{i|i}iDi~ii�i�i�i�i�i�i�i�i�i�iIi�i�i�i�i�i�i�i�i�i�i�i�i�i�iJi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iKi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iEi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iFi�i�i�i�iGi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iHi�i�i�i�i�i�i�i�i�iIi�i�i�i�i�i�i�i�iiiiiiiiii	i
iii�i
iiiiiiiiiiiiiiii�iiiiJi i!i"i#i$i%i&i'i(i)iLi*i+i,i-i.i/i0iKi1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{iLi|i}i~ii�i�i�i�iMi�iMi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iNi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iNi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iOi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iPi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiiiQi	i
iii
iRiiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iSiAiBiCiDiEiFiGiHiIiXiJiKiLiMiNiTiOiPiQiRiSiTiUiViWiXiYiZi�i�i[i\i]i^i_i`iaibicidieifigiOihiiijikiliminioipiqiUirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iVi�i�i�iWi�i�i�i�i�i�i�i�i�i�i�i�i�i�iPi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iXi�i�i�i�i�iYi�i�i�i�i�i�i�i�iZi�i�i�i�i�i�i�i�i�i�i�i[i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiii\ii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)iQi*i+i,i-i.i/i0i1i2i3i4i5iRi6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJi]iKiLiMiNiOi^iPiQiRiSi�iTiUiViYiWiXiYiZi[i\i]i^i_i`iaibicidieifigi�ihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii_i�i`i�i�i�i�i�i�i�i�iai�i�i�i�i�i�i�i�i�i�i�iSi�i�i�i�i�i�i�i�i�i�i�i�i�i�ibi�i�i�i�i�i�i�i�i�i�ici�i�i�i�i�i�i�i�i�i�i�idi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iei�i�i�ifi�i�i�i�i�i�i�i�i�igi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i5i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiihiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/iji0i1i2iTi3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCikiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiliuiviwiximiyizini{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�ioi�ipi�i�i�i�i�i�i6i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iUi�i�i�i�i�i�i�i�i�i�i�iqi�i�i�i�i�i�iVi�i�i�i�i�i�i�i�i�i�iri�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�isi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iti�i�i�i�i�i�i�i�iWi�iiiiiiiiii	iui
iii
iiiiiiiiiiiiiiiiiXiiviiYi i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:iZi;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiwiOiPiQiRixiSiTiUiVi[iWi\iXiYiZi[i]i\i]i^i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiyi�i�i�i�izi�i�i�i�i�i�i_i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i{i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i|i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i`i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i}i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiii�iiiiiiiiii i!i"i#i$i~i%i&i'i(ii)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i�i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifi�igihiiijikilimi�inioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iai�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iZi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ibi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ici�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiidiiiiiii	i
iii
iiiiiei iiiiiiiiiiii�iiii i!i"i#i$i�i%i�i&i'i(i)i*i+i,i-i.i�i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBi�iCiDiEiFiGiHiIi�iJiKiLiMiNi�iOiPiQiRifiSiTiUiViWiXiYiZi[i\i]i�i^i_i�i�i`iaibicidieifigihi�iiijikiliminioipi�iqirisitiuiviwigixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ihi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i[i\i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiii�iiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i�i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@i�i�iAi�iBiCiDiEiFiGiHiIi�iJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]iii^iji_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i�i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKi�iLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikilimi�inioipiqirisitiuiviwi�ixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iki�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
i�iiiiiiiiii�iiiiiiiiii i!i"i#i$i%i&i�i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigi�ihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ili�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiii�ii	i
iii
iiiiii�iiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEimiFiGiHiIiJiKiLiMiNiOiPini�iQiRiSiTiUiVi�iWiXiYiZioi[i\i]i^i_i`iaibicidieipifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i�i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iqi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i�i?i@iAiBiCiDiEiFiGiHiIiJiKiLiriMiNiOiPiQiRiSiTiUiViWiXi�iYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisiti�iuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'isi(i)i*i+i,i-i�i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i i i i i i i i i i	 i
 i i i
 i i i i i i i i i i i i i i i i i i i  i! i" i# i$ i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz i{ i| i} i~ i i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i!i!i!i!i!i!i!i!i!i	!i
!i!i!i
!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i !i!!i"!i#!i$!i%!i&!i'!i(!i)!i*!i+!i,!i-!i.!i/!i0!i1!i2!i3!i4!i5!i6!i7!i8!i9!i:!i;!i<!i=!i>!i?!i@!iA!iB!iC!iD!iE!iF!iG!iH!iI!iJ!iK!iL!iM!iN!iO!iP!iQ!iR!iS!iT!iU!iV!iW!iX!iY!iZ!i[!i\!i]!i^!i_!i`!ia!ib!ic!id!ie!if!ig!ih!ii!ij!ik!il!im!in!io!ip!iq!ir!is!it!iu!iv!iw!ix!iy!iz!i{!i|!i}!i~!i!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i"i"i"i"i"i"i"i"i"i	"i
"i"i"i
"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i "i!"i""i#"i$"i%"(u EUCKR_TYPICAL_DISTRIBUTION_RATIOuEUCKR_TABLE_SIZEuEUCKRCharToFreqOrder(((uH/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/euckrfreq.pyu<module>)sHsite-packages/pip/_vendor/requests/packages/chardet/__pycache__/gb2312freq.cpython-33.pyc000064400000206316151733463720025207 0ustar00�
7�Re��cp@sdZdZdrZdqS(sg�������?i�i�i�i�i<	iTi�i	iQi�i�
i�
i�i�i<iwi�i9	i�i�	i�i�i�iZi�i�iqi�i�i�
iW
iyii�ieioi�iv
i�i�i�i�i�iiiLiBiiQ
i�i�i�iQi�i�iEiifi�ii�ii�i�i�idi(iyii�i,i	i�i
iEiei�i�
iWiRi�i�i|	iR
i�i�
i�i
iX
i�
ijiEi�ii+iPii�i�ii�ii;i�imi�ili�i�i�i�i�iieiHi�i�i�i�i^iki6i�i"iFi�i�
i�
i�
i^	i�i�
i�i�i�i?i`iui$i1i�
i�i�i iUi�i1i�i�igili�ii		i�iGi�i2i�iq	i�i iPi�iL	i�i�i�iiy	ii�i�
i�iMi�iki�i4	i�ii�i�i�i
i�	i@	i`i�i5i�i�iN
i�i7i3i�iniiuiGi&ibihi0i�iMiNii�	i
iY	i�
i�i�	i
i�i�i�
i&i�
iQi
i7i^ihi�i�iJi�iPi�i�i�iri�i�i�ii�i�iT	i-iGi,iuii�	i�i$ii�i<iBii$i>ii�ixiLiWii�ini
i�iTi�iZi�i�
i�	i{ii�i�	i�iii�
i?i�
i0ibi;iDi�ii�i�iCiSi�iUi>	i|igi�i�i�	i�
iKi�i

i�i�i�i%
i5
i�i�ii�ili�ihi
ii�i?i�ii iUi�i�i�i�	i�i*i<
i�i�
i�i
i�i
i�i�i�
i�i�
i!	iX
i�i�i�	i�iQigi�i�i�i�	i�iri�
i�i�iqi�i�
i�iz
i�i�	i3ii�i�i�i
i�
i]iciziii7i�i_ii�iCi�i&iaiHi|
ili
i�i=i�i�iIiPi�
i�i~
i8i`i�iw	i�i�
iTi�i�
i�i�i�i�i�
i�ii�i�i�i[iqi�ii�	igi�i|iCi	i�i�iNiIi�i�i5i�
i(i�i/iHiK
i
i�iii�i9i�iIi�i�i|i�i�i�i�
i�iiWii�i�i�i^i~iii�i�	i�i=iXi�i3i�
iIi�ii�
i�i�i�i�i3irii�i�ioii�i�i{iiiiCi�i!iHi�	i�i�i�ifii=
ii1i[i�i|iDii%i�iti�i�i�
i�i i�i.i�iiiyiiTi�i�i9
i�
ii#i�i�iJi�ini�ii�i
i�i>iBi"i�i�iai�i�iMiKi�iiWi�i�	i�	i!
ir	iFi+	i�
i
ii�ix
iHiJi�i�i�i�i2iKi�iR
i$ii9i�
it
i�i�
i�i�i�i�i�ii�i�ii�i�i%i~i�
i`	i�i�i�i�i'iviii�i�i|ii'ii�in
i*i�i�i�iFi�i%i�i)i~i�i
i�i�iJi&i�i
i!iDi�iwii[iii�	i�i	i'	i�	i�ikii�i	i�
i�
i�i�ii�ii�i�ih
iBi_i�i?iigihi�i'i�i�i�i�i�ii�i�i�ii�i�i5i]i�ii�i�ii�i�i�i�i1	i�i)ia	ii�i�i�i;	ii�i_i�i�iQi/iu
i�
i�
iji[i�i}i�i
i�i�i�	ii�i�iQi^
i�iGi�izi�i�i�iViOi�ii�i�i�i�imiui�	i6i�i�i-i$i�i�iRi�i}	i
ipiri]
i�
iDiii�i�i�iiiii�i�ii1ini�i�iitiYiG	i�i�i/i|iti0i�
i�i�ii�i\i�
i�i�ivi�i�i�ici�ii�i�
i~iAi"i�i"	i!i8iCi8	ii�	iji�
i1i�ili>i�
ii]
i�i�
i~i�iLi(i�i�iKidiiviDi�i�i�i%i�	i�i�i�	i,ii2i�i�
i�i�iji-i.i�imiKii�i�ioi	i;i	i�i�idi@iai	iM	i1
iLi@i2i�iwi�itiQi
i/i�i i�i~i�i�i�i�i�
i/i�i�
i_	i#i�iOi�iOiGi�i�iki[iOioi�i�i-
i
i�ii�	i!i�i�iIi�i�i�i{iri�i.ihi�
iiT
iiii'iL
iai�i�
i@i�i�i�i�i�i�
iTi/
i�ii�i�ii�iMi�ii
ili�ii�
i{i8i#i�
i�i�i9i�iSiRi�	iwi�iZi�i0
iEigigi�i�i
i�iLi�i�ipi�i�iSi
i�i�i�i�i�	i@i�iI	iLi;
iOiqi�i�i)	ii:iFi�i5iJidiA
i�i
i)
iEiLiYi�i�i�i�
im	i�i�i�i�i�i�ici�iRi�i!i�i�i�i�
i�i(i�i�i]iIi�i�
i�	i�iei�ii�i�i�i�i�i`i�ii�i�i
i�i[i�iC
i(iPi,i�i}iO	i'iLi\
i�
i�ii�i�iiZi�i�isi'i�	iUi�i�i�i�iN
ii�i�i�
i�i�iMi�i�i�i�i�i�i�i�iii�igi'i�i�i	i�i
i�iPi0is	iii�ip	i�	inii�i�ii\i�
i�i�i�
i!ihi�i�imi(i&i
iCiiBi)i5	i�i�i�ii�i�i
i�i�i>i�i�i�i�ii�	i�i{iNi�iiiEi3iiJi#i�ici�i�
ii$
i�i5i�ixii]i�i�iki�i�i�i�i�iP
i�i
iiiri�iLi�izidi�i�i#i�
ii�i[iSiihiiGi�i�ii�i�
iUi+i�	iyi�iwi"i�iVi2
i&izi�	i�	i�iJ
iP	i�	i�i�i�i�i%	iZi$ioiTiKi1i�
i�i`iVi�ii�idi�i�i�i�i+i�i�iAi�i�i�i�i�i$i�i�	i_i3i\i�i�i�i�i�ibi�ifi�i�i�i�i�
iAinii�ixi�iFi�
iOi[i�i�i(i�ii
i#i7i2	ixiif	i�	i�
i!i6i{
i�i�iYi�ii�i+i�i�i�i�i i�i�i�i�	i	iKiei�i�i�
iTi$i�i�iihii	iRi�i�i"i�i�iZi 
i_i�i@i�iaii�ii3
i�
iki)iji�iiiei�i
iAi^i�i
iW	i�i�ihi:
iz
i)
i�i|i�i�ii�ii8iji�i�
ii�i3i�	i
izi�ipiyi�i�i2ioiD	i=i�i.i�i9iaifi�i*i_i�i	i*i�ii�
i�
i�i�i-ii�
i}i�i�
i�i�i*	i�
iti�iti6
iqi�i�i�i�i�i�i�iSi 	i�i�i!i)iiyi�
i�iiij	i�i�	i�iViIi�i�ig
iiiLi�i�i�ipiDi�i�i�i�i%i�i�iMi�i�i�i$i�i�i�iE	i"iU	i�ie
i	i|i�	iQii�i�i�ii�i�
i1
i�i�i�i�i$i i]i4i&i�i�izi�i�i`i�iwi�
iiii�
i)i%
i&i�i�i�i*i�i�i8i2i>
iSi
i�i�i1i#i�i�i
i�i#i	i�
i�i�ii�iF
iii,	i>i+i
ii�iZi3iqi�i�
i$i�i�
iVi�	i;i�i�iNi�imiKiWi�i�i�i5i�
i�	iRi4i�iIiiDi�i�i�i�
i�i�
i�i�i�ii%iKi|ii�i�
i�i�i�i�i9i�in	i�i�i�
i-i3i2
ipiii?
i�i~i�i�i�i�i�iCi�i[i�i�
i�i�i�i3	i>i�ili
i`ix	i�i�i�i�i#
i�i�i�i0i�i�i�i�	iL
i�i�iQi�iRi�i?i(imi�i`
i�i3ii�ii&
i�
iiisiDi�i0	ib	ifi@i�	i�i�i�
ii=i�i
i<i�i�i�i�
i�i6ii�isi�i�i�iSi�i�i�
i8iZ
i�i�i�i�i�i�i�ii�
i�i�
i�ii�iNi�	i�i
iLi�
iJ	i�i�i�	ibiigii�i[
i�i�ii�ii~i�i�	i�	i�i�ifi�i�iii�
ii`i4i=	i�i�i�ili?	i�ici�ii�iiii�i�i�i�i�i�i�i�iwi�i�i�i%ii�id	i^i+i�i�i�iZi�iFiI
i�iti�i�	i/i�	ii�iyi*
isi&i+ii�i)ii�i�	i�i�ii�
i�ie	i�i�iQi]	ii	i_i7	ii0iciui�i�iLiki
i�i�i�i�i#ii�ii�i�i�i�i?i�i�ii�
ini
i�i�i�i	i�i�i�	iHi�iYi�iu	i�i�
i�	i�iJi�i_i_i&i�i�ii�i�i�iZi%i�i�	isi�iSiiiiVi�i�i�i�i�i1i'i�i�iFi\i
i|i�	iWi�i�i|i�iSiWi�	i*i	iRiliPi#i�ii-iq
i�i�i	i�i�i4i�i�i�i�i�iai�i�ii�i@
i�iXiii%i�i�i8
i3i,i�i}i�i�i�idixi�	i�i#	i�i6i�
i�
i.ii�iAi�
i�ir
i�
i�iRidi�ii+
i�i�i�i�
i{i{iHi�	i
i�i�i�i�i�ici	i
i�i�i�i,i�iI
i�icii�i�i�i�i=i�iJi.i,i>iii�iLiei]i�i�
iCi�i�i�i*i;i
i�i i�ipi�
i�i�iRi�i9i�
i�
ii�
i�i�i?i:i�	i�i�iQi'isi�iwi[i�
i�i-i�
i)i�i�iMi�i�i�i�i]i}i6i@i
iiUi�i�i�i/i�i�is
i�	i�i�ik	i?i�i,
i=
i1iMi�i�i�i/iS
idi�i�io
i6	ikiui�i�i�iWi{iixiWi�i�ii�i�ixi^i�i�i[	i+i7i:i�iUi�i�i!i�i�i�
i.iHiTi�iYi�i�i	ii@i"iCisi	i�	iiG
ibi�i7i~i.
iUiiqi�	i�i�i�i{i�i�i�iYi/i�
i�i�iAi�
i�i*i:i8i'i�i�i�i�iiAi_i0i�i�i�iiii�iKi�
i�i�iti*i�i�i�
i�i�i�i�i�	i�
i�i�iDii�ii>i�i�ivii

i�
i'i�iVi�i�i�
i�i�ikiii\ii�i�i�i!ii�i*iU
i�i�i�i�iizi�i\if
i�i�i�	i
i�i�i�i�i�i�i�i�i�iiB	iii�i�i�i{ii=i�
i�i&i�
i�iVi�	i�i"i!i�
i�	i�i�i�
i(	i=i�i�
i�
i�i9ii�i4iai�i�i-iQ	i�i�
i�i�
imi�i�i�i�iCi�i�i7i}iqiDi4i�iuii�	i�i�ivii�iF	i�iuia
i�iHioi�
i
	iliKiA	i�i�i�	izi4i�	i!
iH
i�i�	i�i5iiji�i`i�i�
iBi:iOiai�i#i�i�i�idii�i(i�
i&
i�i^imig
iE
iio	i�i(iGi$i@i
iIii�iAiii`iXii7i�i/i�i$i�i�i�ihi�i�i�i�	iUi"iTii�i�i�imi�i�i!ii�i�ii�i i�iMi�	i�i�i�i�	i2iqi�i�i9i�i�i�i�i�ii�i/i�i�i�iipi@iX	i�ijiii
i^
ibi�
i�iniivii�i�ioioi�iivi�i�i0i�i9i�i$	i�ifiSizi
iiDi{i�iXi�ii�iVi3iYi
i�i�
iAi�i�i�i�i�iqiUi�
i:	ii2iji�iii{	i�i�	iFi�i�
i�	ii	i�i�i�iciiiR	i;ikihi�ii�
i�iYiOixi�iziZi<iv	ii�
i
i�
i�iIi�i�i4
iMi�i�i�i�ibi�ii�ii�i�i�iCi�i�
i�i�iOi�i8i�i�i�	i.i]iiVic
i�	i�i�i
iH	i�iTi�i�i�	i�i>
i
i�i�i3ii�i�i,i�i�ifi�i�iiliTiWiHi.i'i>ipi�i�i�i"i�i�	iJi�i�
i�
ivi2i�i�i	ixi	i2i�igi i4i�i�i�
i�
i�i�i{
iz	i�i�	i�
i�i�i�	i�i�ii�i�i?ii�i�i�	iJi�i�i�i�
i�	i8i�i�iEij
i\i�i8i8
ii ii�ii`i�i>ibiSii�i�i�i�ii�i0i�i�i�iEi�i�idi�i�i�i1i�i�i�ini@i�i�i�iTii�	i�i�iQi�iCi�i�iKi;iki�i�i�i�i�i_i\	ieiiwi�i�ii�iMi�i.	iriaii�i�
i�i�i�
i�i�i�igi�i�i'i�
i�iii�	iTii�i4ioi�i�	iXiyi�ixii�	i�
i
iU
i^i:i�i�i�i�ii"i#i�i�iii�	i�i�i�iNiUi�i�ipii"
i-i�i�	i�i�i:i�i
ii�	i�i�i�i�	i�i�iWi
iG
iLi�i�
iGiwioi�i�iiMiri�i�ii�iQ
i�iIiNi%i
iXiii�i7
i�
iai�i�ii�i�	i'
iiihi�i}iNiyi?iti�i�iDi�i�i�i�i�ili�i�i�i	ii�ieiJisi2i*iyi�i�i�i�i�ii�iqi�i�i5i}isi$i�i�i�i5
iBi�i�i�i#idisi}i�i~i�iib
i�iO
i/	i]i�i�i�	i]i2i�iifi7i�i�iOi

iRii#
i	i[i�iEi�iif
iS
i�	idiFi�i�i�iC	iV
i>i�i	i�iBi�ii	i1i6imi�ii	i�i�i�i�ip
i�ii�
i�i<izi�
i|
iXi�i�i�isiei]ii�i�i
i�
iiOi�i+i�	iii�i�i�i:i�	iAi�ii�i�i�i(
i�
imii4iPi�i	ini�i�
ioioi�i�imiiyiii8i	i�i<i�i�i<ic	iCi�i�i&iwi
i�	i$i 
i9i&i�i�i)i`i�i�ii�i�iGibiEi�i:iQioiFi�
i�i�i�	i�
iFi|i;i�
i�ii3i4i%i�i:i�	ici�ipi6
i\iCi�i0i9
i�i�i�i�i�i~	i�ii"ihi�i�i�i�	i)ii�	i�
i�i�i*
i�ii
i
i%i�i	i�i�ii�
i.i�i�i9i	i�i�i�
i�i�i	i�i"i!i�i,
i�ig	iJigiF
i�ii�i�
i�i;ii	iZiEi^iA
i�iili5i�i�i�i4i'
i�iiki	i�i�	i2i�i�
i�i	iXi7ii�i�
i{i�iBixi=iei(iii�i�i'i�i�ii�i�ii�iiii�iD
iiikii�i�i�i-i,i�
iei7
i�i�i�i�ii�i�ini}
ipi7iji�i�	i�i9i�i�
i�i�i�i�i0iPi�i�i�i�ii�iO
i�
i�i�	i�iUi
ii�i<
i�i�i�
iJi�itiNi�i)ii.i�i�i*iiAi�ir
i]i)i�ii�i�iGi�i_
ipik
i�i�i
	i%i
i�i�
i�i>ibi_i^i?ii:iYiDi%i�i�i�
i�ii�i�iiYi�i�
i�i�ii�i�il
iAi�i�	i�
i�	iDiBi�	i
i�i	i@
i(iv
i�i�i�igi�
i�	i}ivi�i�i�i�
i�ii�i�ii�i�ii�ii�i�i i-i~i�iyi%i�	i�
i_i�i�ii�i�iijiMi�i�iGi+i�	ii�i�i�	i�i�ii3
i;i
iGi)i�i
i�i�ii�i�ii�i
i
i�i,iIi�	i�i�iiXiAi\i�ii�iPivi�i�	iVii=i�
i�
i6i<i�iXii�
i	ii8i-	iY
i�i�i�i�i�i�i�ici�i�i�i9i�	i-
iui�i	i�i�
iRi�
iii6i�i�	i�ih	i}ii?
iw
ii�i�	iai(i�ii1i�i�
i�i>i�i�i�i�i�i]i�
iXiriPi0i,ii+iji�i`i�i�i�ii.iii
i�i&	iWiB
i�ii|i7iUi�i�	iiWi�iYi�i�
i�iw
i�
ii�ii�ii�i�iui�ibi�iq
i�i�ibi�i�i�i�i=i$
i�iNiJi�i�iUi�ii�i�	ii�iiiKi,i�i�i4iri{i�iiHi�ipi5ii�i=i�	i�iEi9i�i;ii<ii5i�
iiii�i\ii�iipi�ii�i�iri�iNi�ii^i�i�i�i�iKii�i*ii{i+
i�	i�i*i8ii�ii	ii�i�i�ij
ii@il	i6i�i2i8i�i�	i�ii�i'i�i�i�iB
i�iii\i�i�iSiV	ii~i�i�i�i�i�i�
i�iVi�
izi�i^i	i�i�i�i_
i}
iGiqi�iIi�i�i�i8itihiS	i�i}iRi�	i9i�iSin
iPi�iBiii�isi�iXi}ifi�i�ii�i�i�i�i�i�i�iniIi^i�iTi�ixi�iri�i�i_iibi�iOiPiQiRiSi�iTi<iV
i�iYi�i�
i�i�i�i1iUiLiVi4i�i�i�iUiEi�iMi3ifii�i�i�i�iFi�ii�i�iBiGii�i�i�i�ii�i�i�i�i�i�i�
i?i
i�iVi&iHiWiWiXi�ii�i@i�isi:i�iXiYiZi�iti�i.
iKi[i�i�iri�iYi�i�i�i'i�i(i4ii�i�i�i�ii�
i�i�i5i�i�i�i�i�	i�iZiBiIi	
i&i�ii�
i?i�i0ii[i�	i�iai�iY
i�iii�i\i�i�iLi@i�ii�iWii�ii�i}ii�iMi]i�i1i�i�i�iJi^i;iiKiti�i i�i�i�iuii�i�i_i�i`iTi�isi�i
iai�i�i�i�i�
iNi\ibiiAiciti�i�i�i�i�i�i�i�i�i�iaiUi
i�i�
i�iiri�iBiOi�i�i�i�izi�i�i�iDi�i�ii�i�idiCi�i�
i�i�i�ii�i�i�i�ii�iDi4
i�
i]i�i�iiji�i�i�i�ieiLi�i�i�i�ifi�i^igiuiCi~
ihi�i�ibi�i2i�i�i�iii�i�i(i�i�iNii�iMiXi�iZiji�ii�i�i5i_i�i�i�iui�i�i�ii�ii�i�i�i<i=iMii�
ikii�iei:i`iEivi�ili�i�iii`
i�i�i�i)iminiNiFi�i�i
i;i�ioi)i�iViaiici	iGi�i�ioi�i�isi�ipiOi�i�iiqiwi~iri�i�ibi�i*i�iiVi�iPii�i�i�iHici�ifi�i�i�i(i�iIisi�itiui�idiQieiWi�	i�i�i�i�i�i�i
iki�i+i�ii�i�iNiivi�i�i�iJi�
i�
i9i�ii�iRiSi�ifi�i�igi�ipi�iiiwiiiAiKi�ihiZ
i�iii�i�ibixi�i�
i�i�ii�ijiyi�i<i�i�i�i!i�i+is
i�i�i�i�i�ijilii�i�i,i�iRi�izi{i�iTiCiDici�
i�ii�
iki�i�i�imi:
i�	iDi�
i�i+iLi|ii-iEi�i�ii�i�itili�iMiNi�i�	i�i�i�ii�i�iUi�i�iOi�i}i*i~iiBi�iPi�i[iuiQii�i�ii�i�i�i	ii5iOiliRi�i=i�i�iVi5i�i�i�i�i�i�iSiiTi�iXi�iYi�i�i�imi�i�iPi�i�ini�i�i�i�iEi�iUi�i�iqi�iiviWiimioi�i�i�ii�ipigi"
i.i�i�i�iqi�i�ii&i�iPiri�iie
i�i�i�i�i�i�ii'i,isiti�i�idi�i�ii�i�i�iYi�i�i�i�i+i�i�iQi�i�i�i�iuii�
i�ii�iXi�iei�i�i3i�i�i�iFi�i
i�i�i�iri�i�i�i�i�i�
iui iVi�
i(i�iii�iYiwi�i�i�i�i�i�iZio
ini6i�i
ivi�i�i.ii�i�ii�ifi�i�i�i�i�ii�i�i�i�i�i�iJi=i�iwiixi�i�i�ii�ii�icii�i�ifi�i�iGi�i�ii�i�i�ii�iioiZi�i[ipii�i�
i�ii�i�iPi�ii[idi4i�i�i�i�i5i�i�i�i6i�ii�i�i�i7i�i�ii!ii�i�iHi8i�ii-i�i�i�i�i�i�igihi�i�i�i\i�i�i�i�iqi�i�i�i,i�ihi�i�i i]iii	ixi�iyi�ii[i�i�i	i
i�i�i	iWi�i�i�iN	ii6i�i�i)i|iRi�it	i�i�i>ii�i�iZi�ii�iji�ifi^i�i�i�i�i�i�i�i>i/i�i�i*i
ii
ii�i�i�ivi�i
i-i�iyiCi]i
iiEiDi�iXiki
ii�i�i<iZii�i�iFi�ii�i�ii�i
i�ii�
i�i�i�i�i�i�i�ii�
ii�izi�i�i�iYii!i{i�i�i�iiAiZi�i�iSi�ii�i�i%i_i�i�ii�i�i|i[i�i\i}i�i�iXiiIi�i�i�i0i�i�i?iRi�i1ii�i@i�i]i~iziki�iTiC
i2ii6i�i^i�i�i�i�
ii�iei�ii�i�i�iirixi�ii�i�i_i!i�ii�i`i`i	i�i�i�
i�i�iFi�
i�i�i�i�i�i�i�i�i�i�i�i[iii�i�i�i�i^ii�i�i�i�ii
ifi�i�ih
i_ik
i�i�i+i"i�i#ihi�i�i~i�i�ii�i�i�i�iJi$i�i�i�i%i�i�i&i'iQi�ii�i�i'i�i�i�ici�i\i�idi}i\i�i.i�i�iKi�
ii�i�
i�i�i�iii�i�it
i�i�ibi�iisi�i�ii�ini�ii�i�i�i�i�i�i�i�i�i�i"i�i�i�
iGiNiUi
i�i�iJ
i�ivi�i�
i�i#i]iVii�ii�i�
i�i�i�i�i�ii�i�ii/
iviji/i�i�i�i�i+ii�ii�i�ii�i3iiEi�i�
i�i�i�i�i�i�iiiai,i�i.i�i�i
iwii�
i\iAi�i�iBii�i�i(
i�ivi�i�iti/iii$iHii�iSii�i�i�ii�i�i)i�i�i�i�ii�i�i�
i�i�i#i�i�i�i�i�i�i�ibi�iii�i�ii�i�i]iOi�
i�iai�i%ii�i�i�i�i(i�i�
ii�i�i�i�ii�i�i�ii�i^i�i�iD
i�i�i�iu
ii�i�icidi�
i�i�iLii�i4i:ii�i�i�i�i�i�i�iii�i
i�iciW
iRi�i�i�i?i�i�i�ii iHi?ii�i=i�ii�ii�i�i�ii�i�i�
iVi�i�ii�i�i�ii�i�iii�i�ii/i)iiEibi�ixi�ili�i�i�iei�i�iWi�i�i�i*ici�iH
i9i�ii�i�i�ii
i�i�i�i�i�iyidi,imiiei�iii�iji�ii�ii�i`i�i+i�ifii�ii�i�i i�i�i�igi�ii�ini�i�i!i6iIi�ii�
i�
i�i:i"i�i�i�i�ifi�i�i�i�iai�i�iigi�i�iqi�
i�i�iNi�iCii0i�i�i0i�i-i�
i�i�i�
iiiM
i~ii$i�i�iai�i�i�i�i�iT
ihi�ib
i�i�i�i#ic
i
i�i&i�i"i�i�iii�i/i�i�iM
i�i�i:i-i$iFi�i�iui�i�iFiviiKii�i�i�i�i:ii�i%il
i�i�ii�i�i�i�ioi�i�i�iXii�i)i�i�i&i'i�ii{i�i�i�i�iiii�i�ipi�ii�iii,i�i�i�i�i5ii�i�iOiYi�iji�
i�ii�i�iki6i-iMi<ii	ii�i�i�i@i�ihi@i�ix
i�i(i�ii�iyi�i�i i�i�i�i�i�i�i"i.i�i/i0i.i�ii�ii�ili�im
i7i�i�igiNi�i�iOii1i�i�i
i)i�i�i�i�i�i�i�i!i iqi�i�i*iPi�i�i�i
iPi�i\i�iri�i�i�i�i�i�i�i�iQi�i�iwizi�iGi�i"i�i�i�iii�i
i�i�i�i�
iii�i�i�i+isiti�i%iziii�iE
iy
i#i�i�i�ijiiii�iJia
i�i�i�i�i�ikii.i$i`i�i�i%i�i�iDii�i�ii�i�iliiGi�i�iKi�i�iZi�i�i,i1i�ii6i�i�ii�imi�i�i�i&iii'i�isini�i�iEi�i�i�i(i[i�i/ii�i�i�i�ii�i�ilioi�i8ii�ii�i�i�i�i�iti�i>i�ipiiwi�iOiii�i7i�i�i�i)i�i�i-i�i.i i�i�
i
i�i�i�i	i�i�i�iWi�i�i2i�i�i!i/ikim
i�i�i�iqi3i�i*i+i
i0i�i�i�i�iqi�iSi�i&i�i�irixi�i�
i1i�
i�imi,i4iXi�isi�i�i�ii-i�i�ii"i�i;i�i�i�i*i\ii2i8iRiyi�i�i3i�i�ini�ii�i�i�i�i�i�i4i�i	i�i�iui�i�ii;i�i�
i�iei�ii�i�i5i�ini
i�iid
ii�iy
i.i�i�i�ii�i�ioi�i�i�i6i7ii�iiK
i;i�ii�iQi�i(i�
i�i�iiti�iii�i�i;iiFiHi/i�i�i�i�i�iiivii�iSi8iTi9ii�i�i�i�i�i/i]i:ii"iuii�i	i0i9i#i
ii�
i<iii
i�i;ii�ii�i�iiiUi$ii
i�i�ii<i1i�iQi%i[
ii�i=i[i�ii�i7ii�i�i>ii2i�i�iYi�i�i+iipi?ii�i:i�i�
i�i@i^i�i�iqi�iAii�i�iVi5iiii�i�
iLi2i�i3i�i
i�i�i�iri�ii	ii�i3i
i�i�i�i�i�i�i�i4iwi�i�i�i�i�ii4i6iBi�ii�i|iSii�i�iP
i&i�i
i�
ixivii�i�ii�i'ii�i?i0i�i�iiii�i�iCii5i
ii�iwii=i�i6iii7i�i
i>i0i�iiii iii!i8isiip
ii�i�i�i�i�ii�i(i�
iiii"ii#i�i)i�i�i$i�iiDi�i�i*i�i�i%i�i�i+i�i�i�iifiiEiixi�i�i�i�i�i�i_i�iki�i�iiFi�
i�ili7i`iMiGiyi&iiHi'i�i9ii�i:i;iAixi�i;iiIigii<iJi�i�i(i�i�iKi�i^iLiMi�i,i8ii�i�iiyizii5i<i�izi�i}ii_i)iNi?i=i�iai<iOi�i�i�i*i�i�iFiWi<ii�i>iii�i�i�iiPi�i�i�i+i�i{i�ii�
i�i i�i,i�i�i�i�iIi�i!iei"i-i	i�ii�iQi9i#iRi�i�i|i�iSi�i.imi�i$i/i�i�i�i�i�i
i%ii�iTi�ii�i�iUi�iVi�i�i,i?i�imi@i�ii6i-iWi�iXi.i&i`i:i/i0iAiHi1i0i\
i2izi7i�i�i}i�iBi@i�i�
i1i
ii�i�iCi'ibi3i�i(i�
iAi�i)i2i4i;iti~i3ii�iBi�iiNiui�iYi�i�i*iZi�iaii{iXi�i[i+ici�i i�i\i�i;
i,i-iTiUi�i�ivi�ii5i	i6i�iDi
i]i{i�i�i7i�i�
iyi�i�i8i�ibi.i�i�i9i:i|i<i/i~ii;ii�ihi�i0i�i1i2i�
i�i�i3i4i�imi<i^ii{i�i_i�i�i�iEiFi�i`i5i�i�iai�i�iZi|iYi�iiii	
iwi=ibiGi�i�i4i�i�
i�i�iIi�iii�iZi=i>i>i�ici�
ii�idi�i�ii�ixi5i�i�i?i6iHi�iIi@i1i_i
i�iJi�iAi7i�iKii�ieifigi�i=i
i�i0
iihi@iBii8i[i9iCini:iDiii�i�i�i;iji�i�iyi}i<iziEikili�i�i{i�ii=i>i�i�i|iLi�i2i?iJi�i�i�imi�ii|iMini}i}i@iiFi�i�i�i~iBi>i�i�idi-i�i�ioipii�i�i�iciGi�idi�i�iqi�i�i\ieiGiOiAiHiBi6i�i�
i=i�iiNi�iIiOi�i�i7i~iJiKi�iiCi~iriLi�i�i�iMioi8i?i�ii�iiNi�i�isii=i�i�iti�iCi�ii@iui�iK	i�i�i�i9i�i�iOiiPi�i�iQii�i�ii�i�i�i iriYi�ii�ivi�i?i�iRiwiSiTi�i`iUiDiVixi�iEiiPiWi�iXi�i!iYi�i�i�i$i�i\i�i1i�i�i�i�i�i�i"iQiZi�i�i7i�i�i�iAiyi�ii�i�i�id
i�i[i�i�iBizi�i�i\i
i�
ii�i�ii�iVi�i{i�ifi]i|i^i}i�i�iBi�i�ii�i:i_i�i�i;i�i�i�i`i<ipiiFiiPi�iaiibiGi�i-ici]iidi�i�i�igiHi�iIi�i�iei�i�iui�i�i�i�iqiJifi�igijiKi~ihi�i�i^i�ii#i�i�i�i�ii�iiiHiLi�i�iji�iRi�iSi�i�i�iMi�i�
i!iTii�i�i�ikiwi�i�i�ini�i�i�ili#i>i�i�iZ	i�iHi�ii#i�i�i�iNimii�i�i�i�i�ini�ioN(pi�i�i�i<	iTi�i	iQi�i�
i�
i�i�i<iwi�i9	i�i�	i�i�i�iZi�i�iqi�i�i�
iW
iyii�ieioi�iv
i�i�i�i�i�iiiLiBiiQ
i�i�i�iQi�i�iEiifi�ii�ii�i�i�idi(iyii�i,i	i�i
iEiei�i�
iWiRi�i�i|	iR
i�i�
i�i
iX
i�
ijiEi�ii+iPii�i�ii�ii;i�imi�ili�i�i�i�i�iieiHi�i�i�i�i^iki6i�i"iFi�i�
i�
i�
i^	i�i�
i�i�i�i?i`iui$i1i�
i�i�i iUi�i1i�i�igili�ii		i�iGi�i2i�iq	i�i iPi�iL	i�i�i�iiy	ii�i�
i�iMi�iki�i4	i�ii�i�i�i
i�	i@	i`i�i5i�i�iN
i�i7i3i�iniiuiGi&ibihi0i�iMiNii�	i
iY	i�
i�i�	i
i�i�i�
i&i�
iQi
i7i^ihi�i�iJi�iPi�i�i�iri�i�i�ii�i�iT	i-iGi,iuii�	i�i$ii�i<iBii$i>ii�ixiLiWii�ini
i�iTi�iZi�i�
i�	i{ii�i�	i�iii�
i?i�
i0ibi;iDi�ii�i�iCiSi�iUi>	i|igi�i�i�	i�
iKi�i

i�i�i�i%
i5
i�i�ii�ili�ihi
ii�i?i�ii iUi�i�i�i�	i�i*i<
i�i�
i�i
i�i
i�i�i�
i�i�
i!	iX
i�i�i�	i�iQigi�i�i�i�	i�iri�
i�i�iqi�i�
i�iz
i�i�	i3ii�i�i�i
i�
i]iciziii7i�i_ii�iCi�i&iaiHi|
ili
i�i=i�i�iIiPi�
i�i~
i8i`i�iw	i�i�
iTi�i�
i�i�i�i�i�
i�ii�i�i�i[iqi�ii�	igi�i|iCi	i�i�iNiIi�i�i5i�
i(i�i/iHiK
i
i�iii�i9i�iIi�i�i|i�i�i�i�
i�iiWii�i�i�i^i~iii�i�	i�i=iXi�i3i�
iIi�ii�
i�i�i�i�i3irii�i�ioii�i�i{iiiiCi�i!iHi�	i�i�i�ifii=
ii1i[i�i|iDii%i�iti�i�i�
i�i i�i.i�iiiyiiTi�i�i9
i�
ii#i�i�iJi�ini�ii�i
i�i>iBi"i�i�iai�i�iMiKi�iiWi�i�	i�	i!
ir	iFi+	i�
i
ii�ix
iHiJi�i�i�i�i2iKi�iR
i$ii9i�
it
i�i�
i�i�i�i�i�ii�i�ii�i�i%i~i�
i`	i�i�i�i�i'iviii�i�i|ii'ii�in
i*i�i�i�iFi�i%i�i)i~i�i
i�i�iJi&i�i
i!iDi�iwii[iii�	i�i	i'	i�	i�ikii�i	i�
i�
i�i�ii�ii�i�ih
iBi_i�i?iigihi�i'i�i�i�i�i�ii�i�i�ii�i�i5i]i�ii�i�ii�i�i�i�i1	i�i)ia	ii�i�i�i;	ii�i_i�i�iQi/iu
i�
i�
iji[i�i}i�i
i�i�i�	ii�i�iQi^
i�iGi�izi�i�i�iViOi�ii�i�i�i�imiui�	i6i�i�i-i$i�i�iRi�i}	i
ipiri]
i�
iDiii�i�i�iiiii�i�ii1ini�i�iitiYiG	i�i�i/i|iti0i�
i�i�ii�i\i�
i�i�ivi�i�i�ici�ii�i�
i~iAi"i�i"	i!i8iCi8	ii�	iji�
i1i�ili>i�
ii]
i�i�
i~i�iLi(i�i�iKidiiviDi�i�i�i%i�	i�i�i�	i,ii2i�i�
i�i�iji-i.i�imiKii�i�ioi	i;i	i�i�idi@iai	iM	i1
iLi@i2i�iwi�itiQi
i/i�i i�i~i�i�i�i�i�
i/i�i�
i_	i#i�iOi�iOiGi�i�iki[iOioi�i�i-
i
i�ii�	i!i�i�iIi�i�i�i{iri�i.ihi�
iiT
iiii'iL
iai�i�
i@i�i�i�i�i�i�
iTi/
i�ii�i�ii�iMi�ii
ili�ii�
i{i8i#i�
i�i�i9i�iSiRi�	iwi�iZi�i0
iEigigi�i�i
i�iLi�i�ipi�i�iSi
i�i�i�i�i�	i@i�iI	iLi;
iOiqi�i�i)	ii:iFi�i5iJidiA
i�i
i)
iEiLiYi�i�i�i�
im	i�i�i�i�i�i�ici�iRi�i!i�i�i�i�
i�i(i�i�i]iIi�i�
i�	i�iei�ii�i�i�i�i�i`i�ii�i�i
i�i[i�iC
i(iPi,i�i}iO	i'iLi\
i�
i�ii�i�iiZi�i�isi'i�	iUi�i�i�i�iN
ii�i�i�
i�i�iMi�i�i�i�i�i�i�i�iii�igi'i�i�i	i�i
i�iPi0is	iii�ip	i�	inii�i�ii\i�
i�i�i�
i!ihi�i�imi(i&i
iCiiBi)i5	i�i�i�ii�i�i
i�i�i>i�i�i�i�ii�	i�i{iNi�iiiEi3iiJi#i�ici�i�
ii$
i�i5i�ixii]i�i�iki�i�i�i�i�iP
i�i
iiiri�iLi�izidi�i�i#i�
ii�i[iSiihiiGi�i�ii�i�
iUi+i�	iyi�iwi"i�iVi2
i&izi�	i�	i�iJ
iP	i�	i�i�i�i�i%	iZi$ioiTiKi1i�
i�i`iVi�ii�idi�i�i�i�i+i�i�iAi�i�i�i�i�i$i�i�	i_i3i\i�i�i�i�i�ibi�ifi�i�i�i�i�
iAinii�ixi�iFi�
iOi[i�i�i(i�ii
i#i7i2	ixiif	i�	i�
i!i6i{
i�i�iYi�ii�i+i�i�i�i�i i�i�i�i�	i	iKiei�i�i�
iTi$i�i�iihii	iRi�i�i"i�i�iZi 
i_i�i@i�iaii�ii3
i�
iki)iji�iiiei�i
iAi^i�i
iW	i�i�ihi:
iz
i)
i�i|i�i�ii�ii8iji�i�
ii�i3i�	i
izi�ipiyi�i�i2ioiD	i=i�i.i�i9iaifi�i*i_i�i	i*i�ii�
i�
i�i�i-ii�
i}i�i�
i�i�i*	i�
iti�iti6
iqi�i�i�i�i�i�i�iSi 	i�i�i!i)iiyi�
i�iiij	i�i�	i�iViIi�i�ig
iiiLi�i�i�ipiDi�i�i�i�i%i�i�iMi�i�i�i$i�i�i�iE	i"iU	i�ie
i	i|i�	iQii�i�i�ii�i�
i1
i�i�i�i�i$i i]i4i&i�i�izi�i�i`i�iwi�
iiii�
i)i%
i&i�i�i�i*i�i�i8i2i>
iSi
i�i�i1i#i�i�i
i�i#i	i�
i�i�ii�iF
iii,	i>i+i
ii�iZi3iqi�i�
i$i�i�
iVi�	i;i�i�iNi�imiKiWi�i�i�i5i�
i�	iRi4i�iIiiDi�i�i�i�
i�i�
i�i�i�ii%iKi|ii�i�
i�i�i�i�i9i�in	i�i�i�
i-i3i2
ipiii?
i�i~i�i�i�i�i�iCi�i[i�i�
i�i�i�i3	i>i�ili
i`ix	i�i�i�i�i#
i�i�i�i0i�i�i�i�	iL
i�i�iQi�iRi�i?i(imi�i`
i�i3ii�ii&
i�
iiisiDi�i0	ib	ifi@i�	i�i�i�
ii=i�i
i<i�i�i�i�
i�i6ii�isi�i�i�iSi�i�i�
i8iZ
i�i�i�i�i�i�i�ii�
i�i�
i�ii�iNi�	i�i
iLi�
iJ	i�i�i�	ibiigii�i[
i�i�ii�ii~i�i�	i�	i�i�ifi�i�iii�
ii`i4i=	i�i�i�ili?	i�ici�ii�iiii�i�i�i�i�i�i�i�iwi�i�i�i%ii�id	i^i+i�i�i�iZi�iFiI
i�iti�i�	i/i�	ii�iyi*
isi&i+ii�i)ii�i�	i�i�ii�
i�ie	i�i�iQi]	ii	i_i7	ii0iciui�i�iLiki
i�i�i�i�i#ii�ii�i�i�i�i?i�i�ii�
ini
i�i�i�i	i�i�i�	iHi�iYi�iu	i�i�
i�	i�iJi�i_i_i&i�i�ii�i�i�iZi%i�i�	isi�iSiiiiVi�i�i�i�i�i1i'i�i�iFi\i
i|i�	iWi�i�i|i�iSiWi�	i*i	iRiliPi#i�ii-iq
i�i�i	i�i�i4i�i�i�i�i�iai�i�ii�i@
i�iXiii%i�i�i8
i3i,i�i}i�i�i�idixi�	i�i#	i�i6i�
i�
i.ii�iAi�
i�ir
i�
i�iRidi�ii+
i�i�i�i�
i{i{iHi�	i
i�i�i�i�i�ici	i
i�i�i�i,i�iI
i�icii�i�i�i�i=i�iJi.i,i>iii�iLiei]i�i�
iCi�i�i�i*i;i
i�i i�ipi�
i�i�iRi�i9i�
i�
ii�
i�i�i?i:i�	i�i�iQi'isi�iwi[i�
i�i-i�
i)i�i�iMi�i�i�i�i]i}i6i@i
iiUi�i�i�i/i�i�is
i�	i�i�ik	i?i�i,
i=
i1iMi�i�i�i/iS
idi�i�io
i6	ikiui�i�i�iWi{iixiWi�i�ii�i�ixi^i�i�i[	i+i7i:i�iUi�i�i!i�i�i�
i.iHiTi�iYi�i�i	ii@i"iCisi	i�	iiG
ibi�i7i~i.
iUiiqi�	i�i�i�i{i�i�i�iYi/i�
i�i�iAi�
i�i*i:i8i'i�i�i�i�iiAi_i0i�i�i�iiii�iKi�
i�i�iti*i�i�i�
i�i�i�i�i�	i�
i�i�iDii�ii>i�i�ivii

i�
i'i�iVi�i�i�
i�i�ikiii\ii�i�i�i!ii�i*iU
i�i�i�i�iizi�i\if
i�i�i�	i
i�i�i�i�i�i�i�i�i�iiB	iii�i�i�i{ii=i�
i�i&i�
i�iVi�	i�i"i!i�
i�	i�i�i�
i(	i=i�i�
i�
i�i9ii�i4iai�i�i-iQ	i�i�
i�i�
imi�i�i�i�iCi�i�i7i}iqiDi4i�iuii�	i�i�ivii�iF	i�iuia
i�iHioi�
i
	iliKiA	i�i�i�	izi4i�	i!
iH
i�i�	i�i5iiji�i`i�i�
iBi:iOiai�i#i�i�i�idii�i(i�
i&
i�i^imig
iE
iio	i�i(iGi$i@i
iIii�iAiii`iXii7i�i/i�i$i�i�i�ihi�i�i�i�	iUi"iTii�i�i�imi�i�i!ii�i�ii�i i�iMi�	i�i�i�i�	i2iqi�i�i9i�i�i�i�i�ii�i/i�i�i�iipi@iX	i�ijiii
i^
ibi�
i�iniivii�i�ioioi�iivi�i�i0i�i9i�i$	i�ifiSizi
iiDi{i�iXi�ii�iVi3iYi
i�i�
iAi�i�i�i�i�iqiUi�
i:	ii2iji�iii{	i�i�	iFi�i�
i�	ii	i�i�i�iciiiR	i;ikihi�ii�
i�iYiOixi�iziZi<iv	ii�
i
i�
i�iIi�i�i4
iMi�i�i�i�ibi�ii�ii�i�i�iCi�i�
i�i�iOi�i8i�i�i�	i.i]iiVic
i�	i�i�i
iH	i�iTi�i�i�	i�i>
i
i�i�i3ii�i�i,i�i�ifi�i�iiliTiWiHi.i'i>ipi�i�i�i"i�i�	iJi�i�
i�
ivi2i�i�i	ixi	i2i�igi i4i�i�i�
i�
i�i�i{
iz	i�i�	i�
i�i�i�	i�i�ii�i�i?ii�i�i�	iJi�i�i�i�
i�	i8i�i�iEij
i\i�i8i8
ii ii�ii`i�i>ibiSii�i�i�i�ii�i0i�i�i�iEi�i�idi�i�i�i1i�i�i�ini@i�i�i�iTii�	i�i�iQi�iCi�i�iKi;iki�i�i�i�i�i_i\	ieiiwi�i�ii�iMi�i.	iriaii�i�
i�i�i�
i�i�i�igi�i�i'i�
i�iii�	iTii�i4ioi�i�	iXiyi�ixii�	i�
i
iU
i^i:i�i�i�i�ii"i#i�i�iii�	i�i�i�iNiUi�i�ipii"
i-i�i�	i�i�i:i�i
ii�	i�i�i�i�	i�i�iWi
iG
iLi�i�
iGiwioi�i�iiMiri�i�ii�iQ
i�iIiNi%i
iXiii�i7
i�
iai�i�ii�i�	i'
iiihi�i}iNiyi?iti�i�iDi�i�i�i�i�ili�i�i�i	ii�ieiJisi2i*iyi�i�i�i�i�ii�iqi�i�i5i}isi$i�i�i�i5
iBi�i�i�i#idisi}i�i~i�iib
i�iO
i/	i]i�i�i�	i]i2i�iifi7i�i�iOi

iRii#
i	i[i�iEi�iif
iS
i�	idiFi�i�i�iC	iV
i>i�i	i�iBi�ii	i1i6imi�ii	i�i�i�i�ip
i�ii�
i�i<izi�
i|
iXi�i�i�isiei]ii�i�i
i�
iiOi�i+i�	iii�i�i�i:i�	iAi�ii�i�i�i(
i�
imii4iPi�i	ini�i�
ioioi�i�imiiyiii8i	i�i<i�i�i<ic	iCi�i�i&iwi
i�	i$i 
i9i&i�i�i)i`i�i�ii�i�iGibiEi�i:iQioiFi�
i�i�i�	i�
iFi|i;i�
i�ii3i4i%i�i:i�	ici�ipi6
i\iCi�i0i9
i�i�i�i�i�i~	i�ii"ihi�i�i�i�	i)ii�	i�
i�i�i*
i�ii
i
i%i�i	i�i�ii�
i.i�i�i9i	i�i�i�
i�i�i	i�i"i!i�i,
i�ig	iJigiF
i�ii�i�
i�i;ii	iZiEi^iA
i�iili5i�i�i�i4i'
i�iiki	i�i�	i2i�i�
i�i	iXi7ii�i�
i{i�iBixi=iei(iii�i�i'i�i�ii�i�ii�iiii�iD
iiikii�i�i�i-i,i�
iei7
i�i�i�i�ii�i�ini}
ipi7iji�i�	i�i9i�i�
i�i�i�i�i0iPi�i�i�i�ii�iO
i�
i�i�	i�iUi
ii�i<
i�i�i�
iJi�itiNi�i)ii.i�i�i*iiAi�ir
i]i)i�ii�i�iGi�i_
ipik
i�i�i
	i%i
i�i�
i�i>ibi_i^i?ii:iYiDi%i�i�i�
i�ii�i�iiYi�i�
i�i�ii�i�il
iAi�i�	i�
i�	iDiBi�	i
i�i	i@
i(iv
i�i�i�igi�
i�	i}ivi�i�i�i�
i�ii�i�ii�i�ii�ii�i�i i-i~i�iyi%i�	i�
i_i�i�ii�i�iijiMi�i�iGi+i�	ii�i�i�	i�i�ii3
i;i
iGi)i�i
i�i�ii�i�ii�i
i
i�i,iIi�	i�i�iiXiAi\i�ii�iPivi�i�	iVii=i�
i�
i6i<i�iXii�
i	ii8i-	iY
i�i�i�i�i�i�i�ici�i�i�i9i�	i-
iui�i	i�i�
iRi�
iii6i�i�	i�ih	i}ii?
iw
ii�i�	iai(i�ii1i�i�
i�i>i�i�i�i�i�i]i�
iXiriPi0i,ii+iji�i`i�i�i�ii.iii
i�i&	iWiB
i�ii|i7iUi�i�	iiWi�iYi�i�
i�iw
i�
ii�ii�ii�i�iui�ibi�iq
i�i�ibi�i�i�i�i=i$
i�iNiJi�i�iUi�ii�i�	ii�iiiKi,i�i�i4iri{i�iiHi�ipi5ii�i=i�	i�iEi9i�i;ii<ii5i�
iiii�i\ii�iipi�ii�i�iri�iNi�ii^i�i�i�i�iKii�i*ii{i+
i�	i�i*i8ii�ii	ii�i�i�ij
ii@il	i6i�i2i8i�i�	i�ii�i'i�i�i�iB
i�iii\i�i�iSiV	ii~i�i�i�i�i�i�
i�iVi�
izi�i^i	i�i�i�i_
i}
iGiqi�iIi�i�i�i8itihiS	i�i}iRi�	i9i�iSin
iPi�iBiii�isi�iXi}ifi�i�ii�i�i�i�i�i�i�iniIi^i�iTi�ixi�iri�i�i_iibi�iOiPiQiRiSi�iTi<iV
i�iYi�i�
i�i�i�i1iUiLiVi4i�i�i�iUiEi�iMi3ifii�i�i�i�iFi�ii�i�iBiGii�i�i�i�ii�i�i�i�i�i�i�
i?i
i�iVi&iHiWiWiXi�ii�i@i�isi:i�iXiYiZi�iti�i.
iKi[i�i�iri�iYi�i�i�i'i�i(i4ii�i�i�i�ii�
i�i�i5i�i�i�i�i�	i�iZiBiIi	
i&i�ii�
i?i�i0ii[i�	i�iai�iY
i�iii�i\i�i�iLi@i�ii�iWii�ii�i}ii�iMi]i�i1i�i�i�iJi^i;iiKiti�i i�i�i�iuii�i�i_i�i`iTi�isi�i
iai�i�i�i�i�
iNi\ibiiAiciti�i�i�i�i�i�i�i�i�i�iaiUi
i�i�
i�iiri�iBiOi�i�i�i�izi�i�i�iDi�i�ii�i�idiCi�i�
i�i�i�ii�i�i�i�ii�iDi4
i�
i]i�i�iiji�i�i�i�ieiLi�i�i�i�ifi�i^igiuiCi~
ihi�i�ibi�i2i�i�i�iii�i�i(i�i�iNii�iMiXi�iZiji�ii�i�i5i_i�i�i�iui�i�i�ii�ii�i�i�i<i=iMii�
ikii�iei:i`iEivi�ili�i�iii`
i�i�i�i)iminiNiFi�i�i
i;i�ioi)i�iViaiici	iGi�i�ioi�i�isi�ipiOi�i�iiqiwi~iri�i�ibi�i*i�iiVi�iPii�i�i�iHici�ifi�i�i�i(i�iIisi�itiui�idiQieiWi�	i�i�i�i�i�i�i
iki�i+i�ii�i�iNiivi�i�i�iJi�
i�
i9i�ii�iRiSi�ifi�i�igi�ipi�iiiwiiiAiKi�ihiZ
i�iii�i�ibixi�i�
i�i�ii�ijiyi�i<i�i�i�i!i�i+is
i�i�i�i�i�ijilii�i�i,i�iRi�izi{i�iTiCiDici�
i�ii�
iki�i�i�imi:
i�	iDi�
i�i+iLi|ii-iEi�i�ii�i�itili�iMiNi�i�	i�i�i�ii�i�iUi�i�iOi�i}i*i~iiBi�iPi�i[iuiQii�i�ii�i�i�i	ii5iOiliRi�i=i�i�iVi5i�i�i�i�i�i�iSiiTi�iXi�iYi�i�i�imi�i�iPi�i�ini�i�i�i�iEi�iUi�i�iqi�iiviWiimioi�i�i�ii�ipigi"
i.i�i�i�iqi�i�ii&i�iPiri�iie
i�i�i�i�i�i�ii'i,isiti�i�idi�i�ii�i�i�iYi�i�i�i�i+i�i�iQi�i�i�i�iuii�
i�ii�iXi�iei�i�i3i�i�i�iFi�i
i�i�i�iri�i�i�i�i�i�
iui iVi�
i(i�iii�iYiwi�i�i�i�i�i�iZio
ini6i�i
ivi�i�i.ii�i�ii�ifi�i�i�i�i�ii�i�i�i�i�i�iJi=i�iwiixi�i�i�ii�ii�icii�i�ifi�i�iGi�i�ii�i�i�ii�iioiZi�i[ipii�i�
i�ii�i�iPi�ii[idi4i�i�i�i�i5i�i�i�i6i�ii�i�i�i7i�i�ii!ii�i�iHi8i�ii-i�i�i�i�i�i�igihi�i�i�i\i�i�i�i�iqi�i�i�i,i�ihi�i�i i]iii	ixi�iyi�ii[i�i�i	i
i�i�i	iWi�i�i�iN	ii6i�i�i)i|iRi�it	i�i�i>ii�i�iZi�ii�iji�ifi^i�i�i�i�i�i�i�i>i/i�i�i*i
ii
ii�i�i�ivi�i
i-i�iyiCi]i
iiEiDi�iXiki
ii�i�i<iZii�i�iFi�ii�i�ii�i
i�ii�
i�i�i�i�i�i�i�ii�
ii�izi�i�i�iYii!i{i�i�i�iiAiZi�i�iSi�ii�i�i%i_i�i�ii�i�i|i[i�i\i}i�i�iXiiIi�i�i�i0i�i�i?iRi�i1ii�i@i�i]i~iziki�iTiC
i2ii6i�i^i�i�i�i�
ii�iei�ii�i�i�iirixi�ii�i�i_i!i�ii�i`i`i	i�i�i�
i�i�iFi�
i�i�i�i�i�i�i�i�i�i�i�i[iii�i�i�i�i^ii�i�i�i�ii
ifi�i�ih
i_ik
i�i�i+i"i�i#ihi�i�i~i�i�ii�i�i�i�iJi$i�i�i�i%i�i�i&i'iQi�ii�i�i'i�i�i�ici�i\i�idi}i\i�i.i�i�iKi�
ii�i�
i�i�i�iii�i�it
i�i�ibi�iisi�i�ii�ini�ii�i�i�i�i�i�i�i�i�i�i"i�i�i�
iGiNiUi
i�i�iJ
i�ivi�i�
i�i#i]iVii�ii�i�
i�i�i�i�i�ii�i�ii/
iviji/i�i�i�i�i+ii�ii�i�ii�i3iiEi�i�
i�i�i�i�i�i�iiiai,i�i.i�i�i
iwii�
i\iAi�i�iBii�i�i(
i�ivi�i�iti/iii$iHii�iSii�i�i�ii�i�i)i�i�i�i�ii�i�i�
i�i�i#i�i�i�i�i�i�i�ibi�iii�i�ii�i�i]iOi�
i�i�iai�i%ii�i�i�i�i(i�i�
ii�i�i�i�ii�i�i�ii�i^i�i�iD
i�i�i�iu
ii�i�icidi�
i�i�iLii�i4i:ii�i�i�i�i�i�i�iii�i
i�iciW
iRi�i�i�i?i�i�i�ii iHi?ii�i=i�ii�ii�i�i�ii�i�i�
iVi�i�ii�i�i�ii�i�iii�i�ii/i)iiEibi�ixi�ili�i�i�iei�i�iWi�i�i�i*ici�iH
i9i�ii�i�i�ii
i�i�i�i�i�iyidi,imiiei�iii�iji�ii�ii�i`i�i+i�ifii�ii�i�i i�i�i�igi�ii�ini�i�i!i6iIi�ii�
i�
i�i:i"i�i�i�i�ifi�i�i�i�iai�i�iigi�i�iqi�
i�i�iNi�iCii0i�i�i0i�i-i�
i�i�i�
iiiM
i~ii$i�i�iai�i�i�i�i�iT
ihi�ib
i�i�i�i#ic
i
i�i&i�i"i�i�iii�i/i�i�iM
i�i�i:i-i$iFi�i�iui�i�iFiviiKii�i�i�i�i:ii�i%il
i�i�ii�i�i�i�ioi�i�i�iXii�i)i�i�i&i'i�ii{i�i�i�i�iiii�i�ipi�ii�iii,i�i�i�i�i5ii�i�iOiYi�iji�
i�ii�i�iki6i-iMi<ii	ii�i�i�i@i�ihi@i�ix
i�i(i�ii�iyi�i�i i�i�i�i�i�i�i"i.i�i/i0i.i�ii�ii�ili�im
i7i�i�igiNi�i�iOii1i�i�i
i)i�i�i�i�i�i�i�i!i iqi�i�i*iPi�i�i�i
iPi�i\i�iri�i�i�i�i�i�i�i�iQi�i�iwizi�iGi�i"i�i�i�iii�i
i�i�i�i�
iii�i�i�i+isiti�i%iziii�iE
iy
i#i�i�i�ijiiii�iJia
i�i�i�i�i�ikii.i$i`i�i�i%i�i�iDii�i�ii�i�iliiGi�i�iKi�i�iZi�i�i,i1i�ii6i�i�ii�imi�i�i�i&iii'i�isini�i�iEi�i�i�i(i[i�i/ii�i�i�i�ii�i�ilioi�i8ii�ii�i�i�i�i�iti�i>i�ipiiwi�iOiii�i7i�i�i�i)i�i�i-i�i.i i�i�
i
i�i�i�i	i�i�i�iWi�i�i2i�i�i!i/ikim
i�i�i�iqi3i�i*i+i
i0i�i�i�i�iqi�iSi�i&i�i�irixi�i�
i1i�
i�imi,i4iXi�isi�i�i�ii-i�i�ii"i�i;i�i�i�i*i\ii2i8iRiyi�i�i3i�i�ini�ii�i�i�i�i�i�i4i�i	i�i�iui�i�ii;i�i�
i�iei�ii�i�i5i�ini
i�iid
ii�iy
i.i�i�i�ii�i�ioi�i�i�i6i7ii�iiK
i;i�ii�iQi�i(i�
i�i�iiti�iii�i�i;iiFiHi/i�i�i�i�i�iiivii�iSi8iTi9ii�i�i�i�i�i/i]i:ii"iuii�i	i0i9i#i
ii�
i<iii
i�i;ii�ii�i�iiiUi$ii
i�i�ii<i1i�iQi%i[
ii�i=i[i�ii�i7ii�i�i>ii2i�i�iYi�i�i+iipi?ii�i:i�i�
i�i@i^i�i�iqi�iAii�i�iVi5iiii�i�
iLi2i�i3i�i
i�i�i�iri�ii	ii�i3i
i�i�i�i�i�i�i�i4iwi�i�i�i�i�ii4i6iBi�ii�i|iSii�i�iP
i&i�i
i�
ixivii�i�ii�i'ii�i?i0i�i�iiii�i�iCii5i
ii�iwii=i�i6iii7i�i
i>i0i�iiii iii!i8isiip
ii�i�i�i�i�ii�i(i�
iiii"ii#i�i)i�i�i$i�iiDi�i�i*i�i�i%i�i�i+i�i�i�iifiiEiixi�i�i�i�i�i�i_i�iki�i�iiFi�
i�ili7i`iMiGiyi&iiHi'i�i9ii�i:i;iAixi�i;iiIigii<iJi�i�i(i�i�iKi�i^iLiMi�i,i8ii�i�iiyizii5i<i�izi�i}ii_i)iNi?i=i�iai<iOi�i�i�i*i�i�iFiWi<ii�i>iii�i�i�iiPi�i�i�i+i�i{i�ii�
i�i i�i,i�i�i�i�iIi�i!iei"i-i	i�ii�iQi9i#iRi�i�i|i�iSi�i.imi�i$i/i�i�i�i�i�i
i%ii�iTi�ii�i�iUi�iVi�i�i,i?i�imi@i�ii6i-iWi�iXi.i&i`i:i/i0iAiHi1i0i\
i2izi7i�i�i}i�iBi@i�i�
i1i
ii�i�iCi'ibi3i�i(i�
iAi�i)i2i4i;iti~i3ii�iBi�iiNiui�iYi�i�i*iZi�iaii{iXi�i[i+ici�i i�i\i�i;
i,i-iTiUi�i�ivi�ii5i	i6i�iDi
i]i{i�i�i7i�i�
iyi�i�i8i�ibi.i�i�i9i:i|i<i/i~ii;ii�ihi�i0i�i1i2i�
i�i�i3i4i�imi<i^ii{i�i_i�i�i�iEiFi�i`i5i�i�iai�i�iZi|iYi�iiii	
iwi=ibiGi�i�i4i�i�
i�i�iIi�iii�iZi=i>i>i�ici�
ii�idi�i�ii�ixi5i�i�i?i6iHi�iIi@i1i_i
i�iJi�iAi7i�iKii�ieifigi�i=i
i�i0
iihi@iBii8i[i9iCini:iDiii�i�i�i;iji�i�iyi}i<iziEikili�i�i{i�ii=i>i�i�i|iLi�i2i?iJi�i�i�imi�ii|iMini}i}i@iiFi�i�i�i~iBi>i�i�idi-i�i�ioipii�i�i�iciGi�idi�i�iqi�i�i\ieiGiOiAiHiBi6i�i�
i=i�iiNi�iIiOi�i�i7i~iJiKi�iiCi~iriLi�i�i�iMioi8i?i�ii�iiNi�i�isii=i�i�iti�iCi�ii@iui�iK	i�i�i�i9i�i�iOiiPi�i�iQii�i�ii�i�i�i iriYi�ii�ivi�i?i�iRiwiSiTi�i`iUiDiVixi�iEiiPiWi�iXi�i!iYi�i�i�i$i�i\i�i1i�i�i�i�i�i�i"iQiZi�i�i7i�i�i�iAiyi�ii�i�i�id
i�i[i�i�iBizi�i�i\i
i�
ii�i�ii�iVi�i{i�ifi]i|i^i}i�i�iBi�i�ii�i:i_i�i�i;i�i�i�i`i<ipiiFiiPi�iaiibiGi�i-ici]iidi�i�i�igiHi�iIi�i�iei�i�iui�i�i�i�iqiJifi�igijiKi~ihi�i�i^i�ii#i�i�i�i�ii�iiiHiLi�i�iji�iRi�iSi�i�i�iMi�i�
i!iTii�i�i�ikiwi�i�i�ini�i�i�ili#i>i�i�iZ	i�iHi�ii#i�i�i�iNimii�i�i�i�i�ini�io(u!GB2312_TYPICAL_DISTRIBUTION_RATIOuGB2312_TABLE_SIZEuGB2312CharToFreqOrder(((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/gb2312freq.pyu<module>*sPsite-packages/pip/_vendor/requests/packages/chardet/__pycache__/jpcntx.cpython-33.pyc000064400000062640151733463720024737 0ustar00�
7�Re�Jc�@s,RddlmZdZdZdZdZdZdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSddddddddddddddddddddddddddddddddddd	ddddddd	dddd	ddddddddddddddddddddddddddd	d	d	d	dddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddd	dd	ddddd	dddd	dd	dd	dddddddddddd	dddd	d	dd	d	d	dd	d	ddd	d	ddddddddddddddd	dddd	dddddd	ddd	dd	ddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSddddddddddd	dddddddd	dddd	dddddddddd	dddddd	d	dd	d	ddd	dddddddddddddddd	dddd	dddddddddddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSddddddddddddddddddddddddddddddd	ddddddd	dddd	dddddd	dddddddddddddd	ddddddddddddd	ddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddd	dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd	dddddddddfSddddddddddd	dddddd	dddddd	dddddddddddd	ddddd	dd	d	ddd	dddddddddddddddddddd	ddddddd	d	dd	dddddd	dfSdd	dd	ddddddddddddddddddddddddddddddd	dddd	ddd	ddddddddddddddddddddddddddddddd	ddddddddddfSddddddddddddddddddddddddddddddd	ddddddd	dddd	d	ddddddddddddddddddd	ddddddddddddd	ddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddddddddddddddddddddddddddddddd	dddd	dd	dd	dd	dddd	d	dddddddddddddddddddddddddd	ddd	dddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSddddddddddddddddddddddddddddddd	ddddddd	d	dddddddddddddddddddddddddddddddddddd	d	dddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddddd	ddddddddddddd	dddddddddddddddddddd	d	ddd	ddd	dddddddddddddddddddddddddddddd	d	dddddd	fSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddd	ddddddddddddddddddddddd	dddddddddddddddddddddddddddddddddddddddddddddd	ddd	ddddddd	fSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddd	ddddddd	dddd	dddddddddddddddd	ddddddd	dddd	dddddddddddddddddddd	ddddddddd	ddddd	dddddddfSddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd	ddddddddddddddddfSddddddddddd	d	dddddddddddddddddddddddddddddddddd	ddddddddddd	dddddddddddddddddd	d	dddddddfSddddddddddddddddddddddddddddddddddddddd	dddd	ddddddddddddddddddddddddddddddddddddddddfSdddddddddddddddddddddddddddddddddddddd	ddddddddddddddddddddddddddddddddddddd	dddddddd	fSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddddd	ddddddddddddd	dddd	ddddddddddddddddddddddd	dddddddddddddddddddddddddddddd	ddddddd	fSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddd	ddddddd	d	ddd	dddd	dddd	ddddddddd	d	ddddddd	dddddd	d	dddddddddddddddddd	d	dddddd	d	d	d	ddddddddfSddddddddddd	dddddd	dddd	dddddddddddddd	ddddd	ddddddddddddddddddddddddddddddddddddd	ddddddfSddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd	dddd	ddddddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSddddddddddddddddddddddddddddddd	ddddddd	dd	dddddddddddddddddddddddddddddddddddddddddddfSdddd	ddddddd	dddddd	ddddddddddddddddddddd	dddddddd	dddddddddddddddd	dddd	dddddddddddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdd	dd	dddddd	ddd	dd	dddddddd	ddddddddddddddddddddddd	d	dddddddddddddddd	ddd	ddddddddd	ddddddddfSdd	dd	ddddddddd	dddddddddd	dd	ddddddddddddddddd	dddd	d	ddddddddddddddddddd	dddddddddddddddddfSdddd	dd	ddddd	d	d	dddddd	dddd	dd	dddddddddddddd	ddd	d	ddd	d	ddddddddddddddddddd	dddddddddddddddd	d	fSdddddd	ddddddddddddd	ddddddddddddddddddddddddddd	dddddddddddddddddddd	dddddddddddddddddfSdddd	ddddddd	d	ddd	dd	dd	dd	dd	dddddddd	dddd	dddddd	ddddd	dddddddddddddddddddd	ddddddd	d	d	dddddddd	fSdd	dddddddd	ddddddddddddd	dd	ddddddddddd	dddddd	ddddd	ddddddddddddddddddd	dddddd	dddddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdd	dddd	ddddd	d	ddddddd	dddddddddddd	d	ddddddd	d	dd	d	dddd	dddddddddddddddd	ddd	dddddd	dddddddddd	dfSdd	dd	ddddddddddddddd	ddddddd	ddd	dddddddddddd	d	dddddddddddddddddddd	dddddddddddddddddddddfSddddddddddd	ddddddddddddddddddddddddddddddd	dddddddddddddddddddddddddddddddddddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddddddddddddddddddddddddddddddddddddddd	dddddddddddddddddddddddddddddddddddddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddddddddddddddddddddddddddddddddddddddddddddd	dddddddddddddddddddddddddddddddddddddfSddddddddddddd	ddddddddddddddddddddddddd	dddddddddddddddddddddddddddddddddddddddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddddddddddddddddddddddddddddddddddddddd	d	ddddddddddddddddddddddddddddddddddddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddd	dd	ddddddddddddddddd	dd	d	d	dddd	d	ddd	dddd	ddddddddddddddddddddddd	dddddddddddd	dd	dddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd	dddddddddddddddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSddddddddddddddddddddddddddddddd	ddddddd	ddddd	ddd	ddddddddddddddddddddddddddddd	ddddddddfSdd	dddd	ddddddddddddddddd	dddddddddddd	ddddddd	dddd	dddddddddddddddddddddddddddddddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSddddddddddddddddddddddddddddddddddd	ddddddddddddddddddddddddddddddddddddddddddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddddd	dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddd	dd	ddddddddd	dddddddddddddddddddd	ddddddddddddddddddddddddddddddddddddddd	dddddddddfSdddd	ddddddd	dddddddddddd	ddd	ddddddddddddd	ddd	d	ddd	d	d	dddddddddddddddddddddddddddd	ddddddd	fSddddddddddddddddddddddd	dddddddddddddddd	d	ddd	ddd	dddddddddddddddd	dddd	dddddddddddddddddfSdddd	ddddddd	d	ddddddd	dddddddddddd	d	ddddddd	d	dd	d	ddd	d	dddddddddd	ddddddddd	dddddd	dddddddddddfSddddddddddd	d	ddddddddddddddddddd	ddddddd	d	dd	d	d	ddd	d	d	dddddddddddddd	ddddddddddd	dd	ddddddd	dfSdddddd	dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSddddddddddd	dddddddddddddddd	ddddddddddddddd	dddddddddddddddddddddddddddddddddd	dddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSddddddddddddddddddddddd	dd	ddddddddddddddddddddddddddddddddddddddddd	dddddddddddddddddfSddddddddddd	d	dddddddddddddddddddd	ddddddd	d	d	d	dddd	d	ddddddddddddddddddddddddddddddddddddfSfSZGd
d�d�ZGdd
�d
e�Z	Gdd�de�Z
dS(i(uwrap_ordiidi�iiiiicBs\|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S(uJapaneseContextAnalysiscCs|j�dS(N(ureset(uself((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/jpcntx.pyu__init__|su JapaneseContextAnalysis.__init__cCs8d|_dgt|_d|_d|_d|_dS(Niii����F(u
_mTotalReluNUM_OF_CATEGORYu_mRelSampleu_mNeedToSkipCharNumu_mLastCharOrderuFalseu_mDone(uself((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/jpcntx.pyuresets
			uJapaneseContextAnalysis.resetcCs�|jr
dS|j}x�||kr�|j|||d��\}}||7}||krw|||_d|_q|dkr�|jdkr�|jd7_|jtkr�d|_Pn|jt|j|d7<n||_qWdS(Niii����i����i����T(	u_mDoneu_mNeedToSkipCharNumu	get_orderu_mLastCharOrderu
_mTotalReluMAX_REL_THRESHOLDuTrueu_mRelSampleujp2CharContext(uselfuaBufuaLenuiuorderucharLen((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/jpcntx.pyufeed�s 			#

	uJapaneseContextAnalysis.feedcCs
|jtkS(N(u
_mTotalReluENOUGH_REL_THRESHOLD(uself((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/jpcntx.pyugot_enough_data�su'JapaneseContextAnalysis.got_enough_datacCs0|jtkr(|j|jd|jStSdS(Ni(u
_mTotalReluMINIMUM_DATA_THRESHOLDu_mRelSampleu	DONT_KNOW(uself((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/jpcntx.pyuget_confidence�su&JapaneseContextAnalysis.get_confidencecCsdS(Nii����(i����i((uselfuaBuf((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/jpcntx.pyu	get_order�su!JapaneseContextAnalysis.get_orderN(	u__name__u
__module__u__qualname__u__init__uresetufeedugot_enough_datauget_confidenceu	get_order(u
__locals__((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/jpcntx.pyuJapaneseContextAnalysis{suJapaneseContextAnalysiscBs |EeZdZdd�ZdS(uSJISContextAnalysiscCs�|s
dSt|d�}d|ko1dknsRd|koMdknr[d}nd}t|�dkr�t|d�}|dkr�d|ko�d	knr�|d|fSnd|fS(
Niii�i�i�i�ii�i�i����(i����ii����(uwrap_ordulen(uselfuaBufu
first_charucharLenusecond_char((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/jpcntx.pyu	get_order�s8	(uSJISContextAnalysis.get_orderN(u__name__u
__module__u__qualname__u	get_order(u
__locals__((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/jpcntx.pyuSJISContextAnalysis�suSJISContextAnalysiscBs |EeZdZdd�ZdS(uEUCJPContextAnalysiscCs�|s
dSt|d�}|dksBd|ko=dknrKd}n|dkr`d}nd}t|�dkr�t|d�}|d	kr�d|ko�d
knr�|d|fSnd
|fS(Niii�i�i�ii�ii�i�i����(i����ii����(uwrap_ordulen(uselfuaBufu
first_charucharLenusecond_char((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/jpcntx.pyu	get_order�s(		(uEUCJPContextAnalysis.get_orderN(u__name__u
__module__u__qualname__u	get_order(u
__locals__((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/jpcntx.pyuEUCJPContextAnalysis�suEUCJPContextAnalysisN(ucompatuwrap_orduNUM_OF_CATEGORYu	DONT_KNOWuENOUGH_REL_THRESHOLDuMAX_REL_THRESHOLDuMINIMUM_DATA_THRESHOLDujp2CharContextuJapaneseContextAnalysisuSJISContextAnalysisuEUCJPContextAnalysis(((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/jpcntx.pyu<module>s������������������������������������������������������������������������������������8site-packages/pip/_vendor/requests/packages/chardet/__pycache__/euctwprober.cpython-33.pyc000064400000002776151733463720025776 0ustar00�
7�Re�c@sZddlmZddlmZddlmZddlmZGdd�de�ZdS(i(uMultiByteCharSetProber(uCodingStateMachine(uEUCTWDistributionAnalysis(uEUCTWSMModelcBs,|EeZdZdd�Zdd�ZdS(uEUCTWProbercCs6tj|�tt�|_t�|_|j�dS(N(uMultiByteCharSetProberu__init__uCodingStateMachineuEUCTWSMModelu
_mCodingSMuEUCTWDistributionAnalysisu_mDistributionAnalyzerureset(uself((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/euctwprober.pyu__init__"s
uEUCTWProber.__init__cCsdS(NuEUC-TW((uself((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/euctwprober.pyuget_charset_name(suEUCTWProber.get_charset_nameN(u__name__u
__module__u__qualname__u__init__uget_charset_name(u
__locals__((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/euctwprober.pyuEUCTWProber!suEUCTWProberN(	umbcharsetproberuMultiByteCharSetProberucodingstatemachineuCodingStateMachineuchardistributionuEUCTWDistributionAnalysisumbcssmuEUCTWSMModeluEUCTWProber(((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/euctwprober.pyu<module>ssite-packages/pip/_vendor/requests/packages/chardet/__pycache__/euctwfreq.cpython-33.pyc000064400000167414151733463720025443 0ustar00�
7�Re8�c�@sdZdZd�Zd�S(�g�?i�iii�i�i�i�i	iRii�i�i�ii�i�
ini�i!i�iiLi,iAiisi�i�i�iiiL
iS
i�ii�i�i�i�i.iNiii�ii�i:i�i�i�i?i�i�i=iNiKi�i�i�il	i�i�i�
i�i�i�
i ii
ii�ii�
ioi$i�iii�i�ici8i�i�ii�i�i�i�i�izi|i�iti"i�
iei@i\i�i�	i�i�i�i�i�i�iFi�iM
iQiHi�i�iPivi�ifi�ii�iDiT
i�i�iFiN
i�iEi�iOi�i/i�isi�i3i<i2i�i�i&iLi�i�iO
i�i�iGi�iiMi�i�i?iii`iiF	i*i�igi�	iZi�
i:i�ii�iKi�	ii�	i�ii�i�i�i`i�ii�igii	i iqi�i~i�i�iP
i�	ii�i�i�i!i�iuii�i*ii�i	i�
i�i~i�i�i�i�iei�iGi^i�i�i�i�iUiCi�iBi�i�i�i�ii�i ijioi/ii�iOi2	i[i�i�i�
i&i�i�i�i�iSi(i�i�i�ipi]i�i6iii�
i'iii�iii8ii+i%i[i�i�i\i�i�i�ii�iX	i(i�i�i�i0i�i iHi�
i�
i"i!i�i+i�i1i"i�i�i�
iOiG	i�iifi1i�i�i�i�i�i�ii2i9i�ili,i�i	ii�ii�i�i}ihi#iq
iQiMi&i�iXi�i�i#i�i�i
i�i�i�iji�i�iMi�i�i�i%ii�i�i$i�i�i'i�	i�iNiiii7i�iJi�i!i�i�ii�i�iMi�i)iPiU
i�ii�i�
i�i%i�
i�
i�i i�i�
i iIi�i3	i�i�
iir
ii�i�i�i�i�imi�i�i$i�i�ixi�i�i�i�i�
i�i�i�i%i&i�i
ii�i�i�ii�i�i&i�i'i�ii'i�i�i.i�i�ii�iH	i�i�i�i�i$i#i�iDi&iAi�	i�i�i�i�i�iUiGii�i�i
iQ
iPiSi'i�i�idi�i0iFi�i�i*i�i�ii�ii�iJii�iUii�i�iI	iR
i�i�i<i�iS
i:i7
i�
i�i	i	i9i�i}ii�	i�i�iViPiT
ii)iCii�i�i&i�
i�	i)i�i�im	i�i�i�i�i�ii4	i�i�i�in	i*ii�i�ii�i�iOi�i�i�i�i�	i+i(i
i�i�i�iU
i(i�i5iYiji�
ili�iuii)i�
i*i+iV
i
i=i�i�i�i�i�i�i�i4i�i!i�i�iTi,ixi�i�ieii�	i�iJ	iPi�is
i5iAiV
i/iki�i�
iili!i	i�iAi�i`i�i�
i�i�iAi�i�
iii�i�
i�i�	i�i�i�i�i�i�iMi�
i�i�i�ii�iW
i�i�i�
it
i�i�i+i}i�iji8
i�i�i�i�i�i�i�i�i-i)imi�	i�iW
i�i		i�i�
i�iai�i
iPiK	i�i,i�i�i�i7i'iu
i�i{iki�i�ii�i�
i9
i�iii�i�i�i�i�i�i�i1i�ibii�	i�
i�i�io	i�iX
i,iQi�i�i�i�i�ii�
i�
iX
i�i�i�i5iDi�i�ili�i�i[i 
i�i�iY
i�i%ii.iY	i�i*i�i�i�
i�iRi�i�i�ipi�i�inicigi+ii�i'i2i�ii�i{i�ili�imi�i�i:
i�ifi
	i�i|i5	i�i�ii�iZ
i�i�
i�i�i�i�i,i�i�i�i�i;i�iIiYi�i�i[
iXi"i�i	i�i�i�i~i�i�i,i�iki�i�i-i�i�ii�i�iDi�i�i�i>i]i�i,i�i�i�iviLiBiii&i�i�i�
i�i�i�iGi�i�iiBi�i�
i!
i�i�iui�i�i�i�i�	i iaii�i�iv
iSi�i}i;
i�iDi�i=i�i0ii�i\
i(i�ii�ivi i�i�i�i�i�i.i�i�i9iHii�i�i�i]
iEi�i�i�i�i�i!i�i/i�i�i�ii-ii�iQi*i�i.i/i�i�i�ii0i3ii"
i�i*iRii�i�iWi�i�i/iibi.i�i�	ii�i�i�i�i�iRiii�i)i�i2i�i�	i�i�i�i�i�i�iZ	i�iTiiw
i�i�i�i�	i�i�i�ii�i�i[	iOi�i�	i�i`i7ix
i^
i�i�i�i�i�i�i\	i�i�i�i�i�i�igi�i�ini�i
i_i�i~i�i�i�i0i�i�
iai�iy
i]	i�i�i�i�i�ii�i�	i;i�i�	i-i�i�iL	i�i�i�i/ii�i�i�i`i�i#i"i�ii�ii0i�
isii�i�idisi�
i�iY
i�iikiwioi�i�i�i�i�i1ii2i�igipiQi�iUi�ivi�i�i�iiCiSi�i^	i�i�i5i�i�iBi�i_i�ibiNi�i�iXi�i�i�i�
i�iLici�
i�
i	iKiwi*iaiGi3i�i
i�i�ii1i6i�	i2i6	iNi�i�ii	i3i�i:i�i\iqi�i�ii-i�iii3i�
i�i�i�ixi�
i�i�iri�i4i�
i_
i�iUi�i�i�i@i�i5i�ii�i�ii�i/i+i6ii�ii�i�i�i�i�
i7	iZ
ii�i�i8i4iiCi�ii�i�ili�i`
i�i�i�i�i�iYi�i�i�i�i5i�	i{i�ii�i�i$i7iiMiVi0iri�i�i�igiiVi�i8i�i9i,iZi�i�i{i#iWi0iii$i�i�
i�
i�i4ii[i�ivi�iici�iViM	i$i-ii�iiXiii�idi�i�iWi[
ii�i�iiiqi�
ii1i�ii�iiti�ii�i	iii�
i2i�i2i:i3i i.i�i�i2i�i
i�i�ii�i�i%ii�i�iii
i�ii�iii�i
i�
i6i�i4i�i|ii�iSiii�i_	i�
ii�i�i�i`iii�i�i�	i3iii;iriiii7iYiLi;i�i�	i�	iiii�iTi\i�i�ii<i�iVi5i�ii�
i�i�i�ii"ixi%ii;i8	i i�ii2iEi=i!i�ii�i^iiwi�
i"i�i�iisi�i#i<iQii�iri$ii]ii%i�i.i&ii3i5iBi�iyi'i�i�i�ii�ii>iYia
ib
i(i�
i	i)i*i	iiii�i:i�i6i�i^iii�ii(i�
i+i+iiixi,i	i.ihi/i-iii�i
iVii�iihi�izi.ii�i�i�i<i�i�i;i/i?i�ii
i�	i0i8i�ii�i5i6i�
i_i)i1i2i	i3iyi	ii�i�
ii^i4i�i�i?i$i+i\
i�i5i_iWi�iiz
i6i0ii�
i]
i	i�ip	i7i�i�i8i^
i<
i�iVi9i�i6i�iIiwi}ic
i^ii
i9i@i�i
iAii�i�i�	i:iei1iiiBi�i�i�i�ii�i�ii�i7i;i<i�i=i{
i�i(i`iRi1iYiiIi�	i�ii�i6i�id
i>i�i�ie
i?i�ioi�iqiYinii�iliiCiDi{i�i�
i_
iEiPiUi�i�i�i�ii�iEimi�i@i�i:i�
ii
iAii�i�i�ii#
i�	iNi�
i�iBi�iCiWiTiTii�i
i�if
i;iDii&i�
i|i�i�i�ii�i�
i�i�i<i=
i�
i�ii	iVi�i�
iioi�i�	iEi�
iFiii�i�i�i�i�iiiDi-i8i�iGidi�	ii�
iHiti�iiIizi
iiJi�
i�
iKii�i|
i�ii�i�i>
i�i�i�i�iiiLi:i�	i=i�iMii?
i�i�iiHi�i�ii�iNii�i�	iOiPiiFikiQi9i�i�i�i�
i�	iuiivii�ii�iiRiSi�i�i}i
i>i�i�i�ii
i:iTi	i�iN	i�iCi�ii�iUi~i�i iWi�iGi�i�i�i,iiii�iOi�i|ii�i�iOi?iVi`	i�i i�i~iiwi�ii�i@i!i�i�i;iii�iiWi�i"i�
iXi�iYiiRig
iuii�
ih
i�
ixi=i
iiZi�i<i�ii[i�i#ii=i 	i\i$ii]iHiIi^i7iO	i$
i
i_i%iviJi�i i!iwitii`iaibi9	i&i�i"i{i�i�i�	i'ici�idi8i�ii�i�i[i9i�i�idiZi�	iei�i�i�i@
i!i(i"ifi�i�ii�i#i$iTigiKii�i%i�iWiMihii�iii�i�i�i%i�i�i�i�i�i
i`
i�iyi7imiLijiki�i:	i>i!i�i�i�iiBi)ili|ii�i
izi�i�ii
i�iMi�i�i�
i�i�imi�iniuiq	ivi�i�
i
i*iNioipi�iiqi7i.iri�iyi�
iii�
i�ifi�i�i�isi!	iyi�
iOi	i�i�i�i+iPij
i�
i>i�i�i�i�iiYi�iAiti�iui%
i
i�ivi�i�izi2iwi,i�	i�	i�i�i3iQi�i�i
ixi�i6i9ik
i�ii&i6i�i�i-i
i�iRiyi�iQi9ici�
i'i.i
ioi(iBiFi?il
i�i)iei�i�
izi�
iSiTi�i�i�i{i/i�i�i"	i�	ibi/i�i`i�i�i0iui�ivi�i�i1i�i�
i�	i�iUi�i*i�i/iEi�iSi�i8iZi|i}iFi+ii�i!i~i2i,iFiP	i�im
ii
i�ieisi�iCi�ir	ii�i�ii�iai3iZi%i-i�i�i�i�	i4i�i�i�iAi�i�i�
i�
iii
i�i�i�iDi.i�ii�i�	ini�ii�i�i�
i�i�i	i�i3i5iJi0i�is	i�
i�i�i�i@i�i�iVi�i/i�	i�i6iWiAi7ioi�
i�iPi0i�i1i�in
i�i�iaiQi2i�ipi:ii�iPi�ibi�i�i�i�ii{i3i7iEi�i�i�	i�i�i|iFiGiXi�i�i�i�i�i]i�
i4i�i�i}
i�i�i�
i5i�i&i�i8i	
i�i�i�	i�i�i�i�i�iLi�i�i�i�i�
i�	iYi

i�ii�i�i4i
iBi9i8i�i�i�i�i�	iHi�
i/i3iZi[i�i�
io
i�i�i:i0i�ini\i�i]i�i^i�i�i�i�	i�i�i�iIi�i�i�i;i�i4i�i<i�i=i;i�	ii
i�i�iXi�	i�ii�i5i_i�i�
i�
i�i�i�i�i}i0i>ip
iJi�i�iKii�i�i&
iFi�i�i�i�
i�
i#i�i[i�i�i�ifii>iq
i�i?ir
i�i6i�i�i�ii�
i�i�i�i�iji�i�ii�i@i-ipi9i;	i6iyiAi�i�ii�	i'
i�i�ii�i�ii�iVi�i�i`i�i4i�i�i�iKi
iai�
i6i�i�i�i�ii�i"i�i�iKi�i

ii�i�i�	iYiGioi�ibifici7iis
ipiri�	i8i�i�i�i�i�iiA
iQ	i�
iCi,i
i�i�i�ii�i\iLi�iuii~
i�
i�i�i9i�i�iBi�iZi�i�i
iCi�i�iijidi�i0ihigi�iei�iMi}i7i�
i�i
i�iDi�	i�i�i�i�ifi:i�iiNi;i�
iEiFi�i(
i�i�i<i�i�iGiMi=iwigi�i~it	i?i�i�i�i
itimi#	i�	i�i+i�i�ihi�i�i�i�ii[i�
iOi�	i�i�i�i
i�iB
i�i�i$	it
ii�
i�iia	i�i�	i�iHii�i�i�iQi"i<	i
i�i�i-i1i�i#iu
i'i�iDi�ii�i
i�
iIi�i>iJi%	i�i�iPii
iii�i�
i=ia
i�iKi�iv
i�i�i�i�i�
i�i�i�i_i�iji�i?iEi1i�
i�
i�iki�i8iQi�i�ili�i�i
i�imi@i
i�ibi�i�i�iiRi�i�i�i5i�i�i�i�iLi	iw
iini�i�i�i4iHii�iMi�i�i�i�ii�i�ii\i�ioi�iNi]i�ii�
i�i\ix
igi�iEi
i�i�i�i�i�i�ipi�i�
i�iqi
i�i�i�i�i�iOi�i�i�iri�iZi�isiti�i�ii�iPiei�i�i�i�i�ioi�i�i^ii}i�i�i�iziAi&	i�i�i�i�
i�i�ini-i�i�
iQiiii
i�i�i�iRi�iui�	i�i�iiBi�i�i�
iy
i�i�iviwiBihiqi�i�i�i<i�i*iiiSi"iTiCi>i)i
ixiUi�i�i�i~i�i�i�izi�iVi�i�i�i�iC
i)iqi�i�iWi
	i�i�i�iDi�iEiTiFipi�i�i#i#iyi�i�
i�i�iGi�iz
i�ii�i�i�	i�i�i�iSi�iXi
i�i�i�i�iu	i
i=iHi�i�i_i�iRiii�i�i�iwi�i�iYizi{iqi�ii3i�i5i�i
i�i{
i�i�i|i}iSi~i�i
i
i�iZi[i�iii�i�i`i�iFi�i]ii�ini�i�iIi�i
ii�i�i�i�i�iGiTiJi�iKiziSiri\i)
ii
iv	i�i5i�i�ii�
ib	i�i�iji�i�i�i�i�
i�i�i]i^i�i�i�ici�i�i�ii�
i�i�
iai:i1i�i�i�i�iAihiiai�
i6i�i�i�iib
i-i�i
iHi_ii�	i�i
i�i�i�ii�i�i�i|
i�i*
ifi�i	i�ii�
iD
ii
iLiWi�iiiUii�
ii�i$i�i
i
i�iNiiiR	iki�iE
i�i�iiiMi�iS	i'	ii`i�isi�iF
ii�iai}
i�i�
i(	ijii	i~
iViBi[ibiWi�i�ibi
iIi�ic
ii
i�i{i�i�i�	i�i�	ici�
i�	iidi
i�
i]i�i�i�i=	ieii�iii�i�
i�i�i
iNi	i�i�ifigi�
i�
i�
i�ihiiiii�
i=i�iXii�ii�i�i�i�i�id
i�iHiCi�
iii�iTiWi�
i
i�i9i�i�	iNi�iKiEiji4iJi�
iYi
i�iG
i	ikii�ihiOii�
i�
ii]iPiZi�ili�iQi[iki�iminiRioic	i�ii�i�i�iSiXiiii\i+i�i�i�i�iIiTiUiUi�ii
i�ili�
iDiiiipiiqi
iki�	imi�i�
iKii�iii�i�iVi8i�
i i�iri@iWiri�
iCiGi�i�i�i
i�i^i�
i�i�i8itii:i�i
i!i�inisi�i"i�
i#i$i]iti�	i%i�
i&iriui'i+
i(i)i�ie
i
i}i
i�i�i�i*i4i1i+i�i�i�i�i�ii�i,ii�
i>	iXitiri?	i�i�
i-i�iviui{i�iw	iwi�i.ixiT	i,
iii�i/i0i�i�i�i1i�
i�i2i�
iGiRi
i�i^i�iYi
iZi�i
i[i3i^i�i�i�i�i�i
i)	i\i�	i4i@ivi�i5i�i6i7i�id	i]i�
i�i^i8i�i&i�	ii�ii9iyiuiii�
i�iziRi�i{i�i�i�i(i_i�i<i9i�ili�i�i�i_i 
iSi`iki�i[i�	i�i�i�
ixi:i�i;i<i!
i$i=i�i|ii�i>idi�
ii?ieii�i�i�ii�i�i�ii�
i}i@iAiBi�i.i~iaiOi
i�i�i`ibi�i�
i%ii�i�i�
i;i�
i�ii�iCiiDi�i�ii�if
i"
iLi�
i�i�i�i�
iEi;i�iFi&iGi�
i
i�ix	iHi)i�i�ici�iIidiTi�i�
i�
iei�i�i�ii	i�iJiigi~i�iUi�ie	i	iii�ifiai8igi�
i�	ibihiKiy	i�i�i�iLii:i�
i�iii�i*iMiii�i�iciti�iMiNi�i�i�i�i	i�i
i�i�if	i�i�iYidiei�i*ii�iOiH
i�i#
i�i#i;i�
i�	i�i�i�iI
i\i@	i�i�i�isi$
i�
iPiQi�
i�	i�
iRijiSiTi�i+i�iUi�iVi�i�iLi�
i!i�iJ
i\i4iWi�iiXiYiZi�i[i>iwikifi�i�i+i�ii%
i�i�i$i�i\i�i�iili�
i]i�ili^i_ig
i%i�i`iaigiii�i�
i�iNiK
ibicidi�i�
iciwi�
iei�ibiyi�ifihigihihi�i'iiiimi�iz	ijidiii�ii	i<i�i�i|i�i�i�i�i�i�i�iiOiki�
ilii�i�
iai�i�imi�i�i�ini�
i�iui�ini�i�i�iei&
i�
ioi�i�ii�	i<i�ipiqiPiQi�iji�	i�i	i�i�i(i�i_irisi�i�i�ii<iEiRifi�i�i�i�i]i�i�iIiti=i�iui�ivi�i�
i�ioi�
i�
iki,iliwi'
i�i�	imi�i�i�iFi`i�i�ifi�i�i�
iSiJixi�iyizini�iL
i�ipiOi�ii�i�
i{i�
i�i�iA	iyi�i�iU	i�i|i}i~iFi�iqi�i�
i�	i�i�ii�iii�i�iipi�i�iB	i�ioi	i�i�i�ipii-
i�iri�i�iqiqi�i(
i�iri�i�i�isi�i�i�i�
i�i�i�
i(i.
isi)
i�itii�	ii*
i�iui�i�iTiviM
i{	i�i�iti�i'i�i�i�i�
i�i�i�i�i�i�i�igiZiwi�
i�	ici�iji+
ipi�i�i�ixi�i�i�ihi�i�i�i�
i�i�i�i�i,
i=ii�i�	iiui�i�ii�i/
iyi�i
i�	iyivi�	i�i�iwi�i�i�i�i�i�i�i�
izi�i�ii�i>i�iCi'i�i�i�i{iiZi�i�i�i�i�i�i�i�iaii�i�	i�iqi?i�i
i�i|i�i�	i"i�i�
i�ii}i�i�i�i�i=iiAi�i1i�i)i�i�i�i?i�
i�
i�ii�ixi	i�i	ii�	i�
i�i�ihi�iSi�i�i�i(i�i�
i�i�i'ixiyi�i�
i�i�i
i�
i�i�i�i�i_i	i�i�i>i�i}iPi�i�i�i�i�ii~i�i
iN
iici�i
i�i�i�iHi�i	iii�i�i�i�i�i�ii�i�i�i�i�iji�i�i�	i*	i�i�i�i�
i�ii�iih
i�i�i_i�i�i/i�i<i�i~i7ikiTi�ii]iiUibi�
iti�i�ig	i�izi�i�
i�i|	ii�i�i�i�i�i�i�i{i�i�i�	ii0
i�i�
i�i+	i�i,	i�i�i�iIi�i�i�i�i�ii�iiBi�i�i4isi�
i�i�i�i�i�i�
i�i�i?iCi�i�i	i�iGi�i�i�i�i�i�i�i�i�i�i�i�i�ii�i|i1
i�iimiC	i�i�ili�i�ii
i}	i�i?i�i�ii�i�i�ih	i�i�iIi�i�i�iVii�i�i�i�i�i�i^i�i�i�i�i-	i.	i�ii)i�i�i�
i�i�i�i2
i�iiii�i�
i�i�i�iAi�i�i�i-
i�i�i�i�i�i�
i�i
i�i�	i�i�i�i�i�i�
i�i�
i�i�i�
i�i�iQi�i�
iO
i�i�i�i�ii�i�iziKi�i�i�i[i�iJi�i�i@i�i.
i�i�i�i�iD	ii}i/
i@i�i�
i�i�i�
i�i@iiRi�i�i�	ij
i~i�i�iJi�i�i�
i�i�i�i�i�
i0
i�imi�i�iimi~	i�i	i�ii1
i�i�i�	i�i�ii�i�i�
idi�i�i�iXi�i�i9i�i�ii�i�iUi�i�i�i�i�iLi�i3
i�ii�i�
i	i�i�i�i�	i�i�i�i�
i�ii$i(ivi�i�i&i�ibi�i�i�i�i�i�i�ii�i�i�i{i�i�i�i�i�i�i�i�i�i�i2
i�i�	i�i�i�i�	ii�i�
i�i�i�i�i�i�i�i^i�i�iV	i�	i�i�i�i�i�i�i�i�i�i�i�i�ii2iW	i�i
iWioii	iik
iXi�i�i�	iAi4
i�i�
i�i3
i�i�i�	i�i�i�i�i�
i�i�i�
i�i�i�i�i�i�i�i	i�iHi�i�i�i�i�iiiii�iDii�iIisi
i�i�i�
i�i i�i�i�i�iwi�i{iii�ii�i�i/	ini,iiii�i	i�	i�i�i
i�iiii
ii4
iBi�ii�iP
i5
i�
i�i�
i�	i�i�
i�i	i�ii|i�iziii�i�i
i'i�i5
i�ii�i!i�i�iyi�i�iVii�i�i�	i�i�i�ii�i�i�i�i�ii�	i�
iii-ii�i�i�ii�
ii�
i�	i�i�iii�
i�i"i%ii�i�iJiCii�ixi�i�iii�i	iil
i6
i�i�iii�
ii�
i�iiXi�ii�i7
ii�	i�
iNiim
iii�i iWii�i!i�	ii
i�
i>i8
i�i"i#i9
ij	iDi�i�ii$i	
i%ii�
i�i�iXi&ii'iEi�i(iFii)i�ixi�	ikii�ii�i*i+i�i�i�iDi�i�i,i�i�ii�i�iiKi-i.i/i:
i�i0iJi�ii1i|i�i�i�i�i�i�i�iEi*i2i�
i�ii�ii�iHixii�ii3i�i�i�i�i3ii�i�i;
ipi�i<
ii�ii�i�i4i5i	i�	i6i�iOi�i
i7i8i�i9i�i:i�i�i;i�i�i�i�i<i�
iiYi=i>i
i	i?i�i@iAiBi�
i�i�i=
i�	i�i�ioi�	ifi�ii�i�
i�
i�	i�	iCiiDi�i#i�i�
i>
i�iEi�i�iFiZiE	i�i�i�	i[i$i�
i�iGi?
ii�	i�i�iGi�i�i�i@
iHi�iA
i\iLi�i�i�i�i�
iIi	iii�ii�iiiJi�	i�i�
i	iKiLi]iMiNi
i�iji�iQ
i�
iB
iOiPi�i�iQi�
i�i�iRi�
iSiTi�i(i�ii�iC
i�iUiiVi�iWiXi�i�iYi�i�i�iZi�i�idi[iciHi�i_i�i#i0	i\ii]i�ini

i�	i�i�ii^ii�i_ik	iD
i�i`iai�i�ibi�i�i�	ici�i�i�i�idi�ii�	i�iiidi^iE
ieiii�i�
ii�i�ifi�i_i7iii�i i�
i�iF
iiigi-i�ii!ii�ihi�	iqi;i�i�i�i�iXi�i i	i�i�iiiji�i�i�i
ikili�i�i~imiG
i`iniyipi�i�ioi>i�ipi�iqi
i�i�iri�iai�i�i�isiti"iui|i�i?ii�iivi�i�i�i�i�iei�i�iwixiyi�i�i�i�izi{i@i|i�i�	i}i�i�	i�i�i%isiiR
i�i.i�iMi?i�
i�i~ii�ibii�i@i�i�i�ii�i�i�i�i�i�i�i�i�i�i�
i�i6
iIi�i�i�i�i�i�i�i�ici�i�i�i�i�i�i�i2ii�i�imi�i@i�i�i�i�	i�i�iNii�i�ifiii�iZi�
i�i�i�i�i�i�i\iH
i�idi�i�iJi�i�	i�i�	i�
i�i�i�i�i�iKi�i�i�i#i�i�i�i�i�i�	i�i�i�iKi�i�i�i�igi�i�i�ihi�i>i�i.i�i�i�i�i�i�i�ii)in
itiii�i�
io
i�
iI
i�i�
i�iiqi�i�iri�i�i�i�i�i�ip
i�i�	i�i�iziii�iUi�iJ
i�i�i1	iK
iti�i�i�i�i�i�i�
i�i�iJi�iiLi�	i�i�i�i�i�i�i�	iMi�i�i�ii�	i�i�i�iei�i�	i�ii�i�	i�i�i�i�i�i�i�iri�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i i i i i i i i i i	 i
 i i i
 i i i i i i i i i i i i i i i i i i i  i! i" i# i$ i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz i{ i| i} i~ i i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i!i!i!i!i!i!i!i!i!i	!i
!i!i!i
!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i !i!!i"!i#!i$!i%!i&!i'!i(!i)!i*!i+!i,!i-!i.!i/!i0!i1!i2!i3!i4!i5!i6!i7!i8!i9!i:!i;!i<!i=!i>!i?!i@!iA!iB!iC!iD!iE!iF!iG!iH!iI!iJ!iK!iL!iM!iN!iO!iP!iQ!iR!iS!iT!iU!iV!iW!iX!iY!iZ!i[!i\!i]!i^!i_!i`!ia!ib!ic!id!ie!if!ig!ih!ii!ij!ik!il!im!in!io!ip!iq!ir!is!it!iu!iv!iw!ix!iy!iz!i{!i|!i}!i~!i!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i"i"i"i"i"i"i"i"i"i	"i
"i"i"i
"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i "i!"i""i#"i$"i%"N(�iii�i�i�i�i	iRii�i�i�ii�i�
ini�i!i�iiLi,iAiisi�i�i�iiiL
iS
i�ii�i�i�i�i.iNiii�ii�i:i�i�i�i?i�i�i=iNiKi�i�i�il	i�i�i�
i�i�i�
i ii
ii�ii�
ioi$i�iii�i�ici8i�i�ii�i�i�i�i�izi|i�iti"i�
iei@i\i�i�	i�i�i�i�i�i�iFi�iM
iQiHi�i�iPivi�ifi�ii�iDiT
i�i�iFiN
i�iEi�iOi�i/i�isi�i3i<i2i�i�i&iLi�i�iO
i�i�iGi�iiMi�i�i?iii`iiF	i*i�igi�	iZi�
i:i�ii�iKi�	ii�	i�ii�i�i�i`i�ii�igii	i iqi�i~i�i�iP
i�	ii�i�i�i!i�iuii�i*ii�i	i�
i�i~i�i�i�i�iei�iGi^i�i�i�i�iUiCi�iBi�i�i�i�ii�i ijioi/ii�iOi2	i[i�i�i�
i&i�i�i�i�iSi(i�i�i�ipi]i�i6iii�
i'iii�iii8ii+i%i[i�i�i\i�i�i�ii�iX	i(i�i�i�i0i�i iHi�
i�
i"i!i�i+i�i1i"i�i�i�
iOiG	i�iifi1i�i�i�i�i�i�ii2i9i�ili,i�i	ii�ii�i�i}ihi#iq
iQiMi&i�iXi�i�i#i�i�i
i�i�i�iji�i�iMi�i�i�i%ii�i�i$i�i�i'i�	i�iNiiii7i�iJi�i!i�i�ii�i�iMi�i)iPiU
i�ii�i�
i�i%i�
i�
i�i i�i�
i iIi�i3	i�i�
iir
ii�i�i�i�i�imi�i�i$i�i�ixi�i�i�i�i�
i�i�i�i%i&i�i
ii�i�i�ii�i�i&i�i'i�ii'i�i�i.i�i�ii�iH	i�i�i�i�i$i#i�iDi&iAi�	i�i�i�i�i�iUiGii�i�i
iQ
iPiSi'i�i�idi�i0iFi�i�i*i�i�ii�ii�iJii�iUii�i�iI	iR
i�i�i<i�iS
i:i7
i�
i�i	i	i9i�i}ii�	i�i�iViPiT
ii)iCii�i�i&i�
i�	i)i�i�im	i�i�i�i�i�ii4	i�i�i�in	i*ii�i�ii�i�iOi�i�i�i�i�	i+i(i
i�i�i�iU
i(i�i5iYiji�
ili�iuii)i�
i*i+iV
i
i=i�i�i�i�i�i�i�i4i�i!i�i�iTi,ixi�i�ieii�	i�iJ	iPi�is
i5iAiV
i/iki�i�
iili!i	i�iAi�i`i�i�
i�i�iAi�i�
iii�i�
i�i�	i�i�i�i�i�i�iMi�
i�i�i�ii�iW
i�i�i�
it
i�i�i+i}i�iji8
i�i�i�i�i�i�i�i�i-i)imi�	i�iW
i�i		i�i�
i�iai�i
iPiK	i�i,i�i�i�i7i'iu
i�i{iki�i�ii�i�
i9
i�iii�i�i�i�i�i�i�i1i�ibii�	i�
i�i�io	i�iX
i,iQi�i�i�i�i�ii�
i�
iX
i�i�i�i5iDi�i�ili�i�i[i 
i�i�iY
i�i%ii.iY	i�i*i�i�i�
i�iRi�i�i�ipi�i�inicigi+ii�i'i2i�ii�i{i�ili�imi�i�i:
i�ifi
	i�i|i5	i�i�ii�iZ
i�i�
i�i�i�i�i,i�i�i�i�i;i�iIiYi�i�i[
iXi"i�i	i�i�i�i~i�i�i,i�iki�i�i-i�i�ii�i�iDi�i�i�i>i]i�i,i�i�i�iviLiBiii&i�i�i�
i�i�i�iGi�i�iiBi�i�
i!
i�i�iui�i�i�i�i�	i iaii�i�iv
iSi�i}i;
i�iDi�i=i�i0ii�i\
i(i�ii�ivi i�i�i�i�i�i.i�i�i9iHii�i�i�i]
iEi�i�i�i�i�i!i�i/i�i�i�ii-ii�iQi*i�i.i/i�i�i�ii0i3ii"
i�i*iRii�i�iWi�i�i/iibi.i�i�	ii�i�i�i�i�iRiii�i)i�i2i�i�	i�i�i�i�i�i�iZ	i�iTiiw
i�i�i�i�	i�i�i�ii�i�i[	iOi�i�	i�i`i7ix
i^
i�i�i�i�i�i�i\	i�i�i�i�i�i�igi�i�ini�i
i_i�i~i�i�i�i0i�i�
iai�iy
i]	i�i�i�i�i�ii�i�	i;i�i�	i-i�i�iL	i�i�i�i/ii�i�i�i`i�i#i"i�ii�ii0i�
isii�i�idisi�
i�iY
i�iikiwioi�i�i�i�i�i1ii2i�igipiQi�iUi�ivi�i�i�iiCiSi�i^	i�i�i5i�i�iBi�i_i�ibiNi�i�iXi�i�i�i�
i�iLici�
i�
i	iKiwi*iaiGi3i�i
i�i�ii1i6i�	i2i6	iNi�i�ii	i3i�i:i�i\iqi�i�ii-i�iii3i�
i�i�i�ixi�
i�i�iri�i4i�
i_
i�iUi�i�i�i@i�i5i�ii�i�ii�i/i+i6ii�ii�i�i�i�i�
i7	iZ
ii�i�i8i4iiCi�ii�i�ili�i`
i�i�i�i�i�iYi�i�i�i�i5i�	i{i�ii�i�i$i7iiMiVi0iri�i�i�igiiVi�i8i�i9i,iZi�i�i{i#iWi0iii$i�i�
i�
i�i4ii[i�ivi�iici�iViM	i$i-ii�iiXiii�idi�i�iWi[
ii�i�iiiqi�
ii1i�ii�iiti�ii�i	iii�
i2i�i2i:i3i i.i�i�i2i�i
i�i�ii�i�i%ii�i�iii
i�ii�iii�i
i�
i6i�i4i�i|ii�iSiii�i_	i�
ii�i�i�i`iii�i�i�	i3iii;iriiii7iYiLi;i�i�	i�	iiii�iTi\i�i�ii<i�iVi5i�ii�
i�i�i�ii"ixi%ii;i8	i i�ii2iEi=i!i�ii�i^iiwi�
i"i�i�iisi�i#i<iQii�iri$ii]ii%i�i.i&ii3i5iBi�iyi'i�i�i�ii�ii>iYia
ib
i(i�
i	i)i*i	iiii�i:i�i6i�i^iii�ii(i�
i+i+iiixi,i	i.ihi/i-iii�i
iVii�iihi�izi.ii�i�i�i<i�i�i;i/i?i�ii
i�	i0i8i�ii�i5i6i�
i_i)i1i2i	i3iyi	ii�i�
ii^i4i�i�i?i$i+i\
i�i5i_iWi�iiz
i6i0ii�
i]
i	i�ip	i7i�i�i8i^
i<
i�iVi9i�i6i�iIiwi}ic
i^ii
i9i@i�i
iAii�i�i�	i:iei1iiiBi�i�i�i�ii�i�ii�i7i;i<i�i=i{
i�i(i`iRi1iYiiIi�	i�ii�i6i�id
i>i�i�ie
i?i�ioi�iqiYinii�iliiCiDi{i�i�
i_
iEiPiUi�i�i�i�ii�iEimi�i@i�i:i�
ii
iAii�i�i�ii#
i�	iNi�
i�iBi�iCiWiTiTii�i
i�if
i;iDii&i�
i|i�i�i�ii�i�
i�i�i<i=
i�
i�ii	iVi�i�
iioi�i�	iEi�
iFiii�i�i�i�i�iiiDi-i8i�iGidi�	ii�
iHiti�iiIizi
iiJi�
i�
iKii�i|
i�ii�i�i>
i�i�i�i�iiiLi:i�	i=i�iMii?
i�i�iiHi�i�ii�iNii�i�	iOiPiiFikiQi9i�i�i�i�
i�	iuiivii�ii�iiRiSi�i�i}i
i>i�i�i�ii
i:iTi	i�iN	i�iCi�ii�iUi~i�i iWi�iGi�i�i�i,iiii�iOi�i|ii�i�iOi?iVi`	i�i i�i~iiwi�ii�i@i!i�i�i;iii�iiWi�i"i�
iXi�iYiiRig
iuii�
ih
i�
ixi=i
iiZi�i<i�ii[i�i#ii=i 	i\i$ii]iHiIi^i7iO	i$
i
i_i%iviJi�i i!iwitii`iaibi9	i&i�i"i{i�i�i�	i'ici�idi8i�ii�i�i[i9i�i�idiZi�	iei�i�i�i@
i!i(i"ifi�i�ii�i#i$iTigiKii�i%i�iWiMihii�iii�i�i�i%i�i�i�i�i�i
i`
i�iyi7imiLijiki�i:	i>i!i�i�i�iiBi)ili|ii�i
izi�i�ii
i�iMi�i�i�
i�i�imi�iniuiq	ivi�i�
i
i*iNioipi�iiqi7i.iri�iyi�
iii�
i�ifi�i�i�isi!	iyi�
iOi	i�i�i�i+iPij
i�
i>i�i�i�i�iiYi�iAiti�iui%
i
i�ivi�i�izi2iwi,i�	i�	i�i�i3iQi�i�i
ixi�i6i9ik
i�ii&i6i�i�i-i
i�iRiyi�iQi9ici�
i'i.i
ioi(iBiFi?il
i�i)iei�i�
izi�
iSiTi�i�i�i{i/i�i�i"	i�	ibi/i�i`i�i�i0iui�ivi�i�i1i�i�
i�	i�iUi�i*i�i/iEi�iSi�i8iZi|i}iFi+ii�i!i~i2i,iFiP	i�im
ii
i�ieisi�iCi�ir	ii�i�ii�iai3iZi%i-i�i�i�i�	i4i�i�i�iAi�i�i�
i�
iii
i�i�i�iDi.i�ii�i�	ini�ii�i�i�
i�i�i	i�i3i5iJi0i�is	i�
i�i�i�i@i�i�iVi�i/i�	i�i6iWiAi7ioi�
i�iPi0i�i1i�in
i�i�iaiQi2i�ipi:ii�iPi�ibi�i�i�i�ii{i3i7iEi�i�i�	i�i�i|iFiGiXi�i�i�i�i�i]i�
i4i�i�i}
i�i�i�
i5i�i&i�i8i	
i�i�i�	i�i�i�i�i�iLi�i�i�i�i�
i�	iYi

i�ii�i�i4i
iBi9i8i�i�i�i�i�	iHi�
i/i3iZi[i�i�
io
i�i�i:i0i�ini\i�i]i�i^i�i�i�i�	i�i�i�iIi�i�i�i;i�i4i�i<i�i=i;i�	ii
i�i�iXi�	i�ii�i5i_i�i�
i�
i�i�i�i�i}i0i>ip
iJi�i�iKii�i�i&
iFi�i�i�i�
i�
i#i�i[i�i�i�ifii>iq
i�i?ir
i�i6i�i�i�ii�
i�i�i�i�iji�i�ii�i@i-ipi9i;	i6iyiAi�i�ii�	i'
i�i�ii�i�ii�iVi�i�i`i�i4i�i�i�iKi
iai�
i6i�i�i�i�ii�i"i�i�iKi�i

ii�i�i�	iYiGioi�ibifici7iis
ipiri�	i8i�i�i�i�i�iiA
iQ	i�
iCi,i
i�i�i�ii�i\iLi�iuii~
i�
i�i�i9i�i�iBi�iZi�i�i
iCi�i�iijidi�i0ihigi�iei�iMi}i7i�
i�i
i�iDi�	i�i�i�i�ifi:i�iiNi;i�
iEiFi�i(
i�i�i<i�i�iGiMi=iwigi�i~it	i?i�i�i�i
itimi#	i�	i�i+i�i�ihi�i�i�i�ii[i�
iOi�	i�i�i�i
i�iB
i�i�i$	it
ii�
i�iia	i�i�	i�iHii�i�i�iQi"i<	i
i�i�i-i1i�i#iu
i'i�iDi�ii�i
i�
iIi�i>iJi%	i�i�iPii
iii�i�
i=ia
i�iKi�iv
i�i�i�i�i�
i�i�i�i_i�iji�i?iEi1i�
i�
i�iki�i8iQi�i�ili�i�i
i�imi@i
i�ibi�i�i�iiRi�i�i�i5i�i�i�i�iLi	iw
iini�i�i�i4iHii�iMi�i�i�i�ii�i�ii\i�ioi�iNi]i�ii�
i�i\ix
igi�iEi
i�i�i�i�i�i�ipi�i�
i�iqi
i�i�i�i�i�iOi�i�i�iri�iZi�isiti�i�ii�iPiei�i�i�i�i�ioi�i�i^ii}i�i�i�iziAi&	i�i�i�i�
i�i�ini-i�i�
iQiiii
i�i�i�iRi�iui�	i�i�iiBi�i�i�
iy
i�i�iviwiBihiqi�i�i�i<i�i*iiiSi"iTiCi>i)i
ixiUi�i�i�i~i�i�i�izi�iVi�i�i�i�iC
i)iqi�i�iWi
	i�i�i�iDi�iEiTiFipi�i�i#i#iyi�i�
i�i�iGi�iz
i�ii�i�i�	i�i�i�iSi�iXi
i�i�i�i�iu	i
i=iHi�i�i_i�iRiii�i�i�iwi�i�iYizi{iqi�ii3i�i5i�i
i�i{
i�i�i|i}iSi~i�i
i
i�iZi[i�iii�i�i`i�iFi�i]ii�ini�i�iIi�i
ii�i�i�i�i�iGiTiJi�iKiziSiri\i)
ii
iv	i�i5i�i�ii�
ib	i�i�iji�i�i�i�i�
i�i�i]i^i�i�i�ici�i�i�ii�
i�i�
iai:i1i�i�i�i�iAihiiai�
i6i�i�i�iib
i-i�i
iHi_ii�	i�i
i�i�i�ii�i�i�i|
i�i*
ifi�i	i�ii�
iD
ii
iLiWi�iiiUii�
ii�i$i�i
i
i�iNiiiR	iki�iE
i�i�iiiMi�iS	i'	ii`i�isi�iF
ii�iai}
i�i�
i(	ijii	i~
iViBi[ibiWi�i�ibi
iIi�ic
ii
i�i{i�i�i�	i�i�	ici�
i�	iidi
i�
i]i�i�i�i=	ieii�iii�i�
i�i�i
iNi	i�i�ifigi�
i�
i�
i�ihiiiii�
i=i�iXii�ii�i�i�i�i�id
i�iHiCi�
iii�iTiWi�
i
i�i9i�i�	iNi�iKiEiji4iJi�
iYi
i�iG
i	ikii�ihiOii�
i�
ii]iPiZi�ili�iQi[iki�iminiRioic	i�ii�i�i�iSiXiiii\i+i�i�i�i�iIiTiUiUi�ii
i�ili�
iDiiiipiiqi
iki�	imi�i�
iKii�iii�i�iVi8i�
i i�iri@iWiri�
iCiGi�i�i�i
i�i^i�
i�i�i8itii:i�i
i!i�inisi�i"i�
i#i$i]iti�	i%i�
i&iriui'i+
i(i)i�ie
i
i}i
i�i�i�i*i4i1i+i�i�i�i�i�ii�i,ii�
i>	iXitiri?	i�i�
i-i�iviui{i�iw	iwi�i.ixiT	i,
iii�i/i0i�i�i�i1i�
i�i2i�
iGiRi
i�i^i�iYi
iZi�i
i[i3i^i�i�i�i�i�i
i)	i\i�	i4i@ivi�i5i�i6i7i�id	i]i�
i�i^i8i�i&i�	ii�ii9iyiuiii�
i�iziRi�i{i�i�i�i(i_i�i<i9i�ili�i�i�i_i 
iSi`iki�i[i�	i�i�i�
ixi:i�i;i<i!
i$i=i�i|ii�i>idi�
ii?ieii�i�i�ii�i�i�ii�
i}i@iAiBi�i.i~iaiOi
i�i�i`ibi�i�
i%ii�i�i�
i;i�
i�ii�iCiiDi�i�ii�if
i"
iLi�
i�i�i�i�
iEi;i�iFi&iGi�
i
i�ix	iHi)i�i�ici�iIidiTi�i�
i�
iei�i�i�ii	i�iJiigi~i�iUi�ie	i	iii�ifiai8igi�
i�	ibihiKiy	i�i�i�iLii:i�
i�iii�i*iMiii�i�iciti�iMiNi�i�i�i�i	i�i
i�i�if	i�i�iYidiei�i*ii�iOiH
i�i#
i�i#i;i�
i�	i�i�i�iI
i\i@	i�i�i�isi$
i�
iPiQi�
i�	i�
iRijiSiTi�i+i�iUi�iVi�i�iLi�
i!i�iJ
i\i4iWi�iiXiYiZi�i[i>iwikifi�i�i+i�ii%
i�i�i$i�i\i�i�iili�
i]i�ili^i_ig
i%i�i`iaigiii�i�
i�iNiK
ibicidi�i�
iciwi�
iei�ibiyi�ifihigihihi�i'iiiimi�iz	ijidiii�ii	i<i�i�i|i�i�i�i�i�i�i�iiOiki�
ilii�i�
iai�i�imi�i�i�ini�
i�iui�ini�i�i�iei&
i�
ioi�i�ii�	i<i�ipiqiPiQi�iji�	i�i	i�i�i(i�i_irisi�i�i�ii<iEiRifi�i�i�i�i]i�i�iIiti=i�iui�ivi�i�
i�ioi�
i�
iki,iliwi'
i�i�	imi�i�i�iFi`i�i�ifi�i�i�
iSiJixi�iyizini�iL
i�ipiOi�ii�i�
i{i�
i�i�iA	iyi�i�iU	i�i|i}i~iFi�iqi�i�
i�	i�i�ii�iii�i�iipi�i�iB	i�ioi	i�i�i�ipii-
i�iri�i�iqiqi�i(
i�iri�i�i�isi�i�i�i�
i�i�i�
i(i.
isi)
i�itii�	ii*
i�iui�i�iTiviM
i{	i�i�iti�i'i�i�i�i�
i�i�i�i�i�i�i�igiZiwi�
i�	ici�iji+
ipi�i�i�ixi�i�i�ihi�i�i�i�
i�i�i�i�i,
i=ii�i�	iiui�i�ii�i/
iyi�i
i�	iyivi�	i�i�iwi�i�i�i�i�i�i�i�
izi�i�ii�i>i�iCi'i�i�i�i{iiZi�i�i�i�i�i�i�i�iaii�i�	i�iqi?i�i
i�i|i�i�	i"i�i�
i�ii}i�i�i�i�i=iiAi�i1i�i)i�i�i�i?i�
i�
i�ii�ixi	i�i	ii�	i�
i�i�ihi�iSi�i�i�i(i�i�
i�i�i'ixiyi�i�
i�i�i
i�
i�i�i�i�i_i	i�i�i>i�i}iPi�i�i�i�i�ii~i�i
iN
iici�i
i�i�i�iHi�i	iii�i�i�i�i�i�ii�i�i�i�i�iji�i�i�	i*	i�i�i�i�
i�ii�iih
i�i�i_i�i�i/i�i<i�i~i7ikiTi�ii]iiUibi�
iti�i�ig	i�izi�i�
i�i|	ii�i�i�i�i�i�i�i{i�i�i�	ii0
i�i�
i�i+	i�i,	i�i�i�iIi�i�i�i�i�ii�iiBi�i�i4isi�
i�i�i�i�i�i�
i�i�i?iCi�i�i	i�iGi�i�i�i�i�i�i�i�i�i�i�i�i�ii�i|i1
i�iimiC	i�i�ili�i�ii
i}	i�i?i�i�ii�i�i�ih	i�i�iIi�i�i�iVii�i�i�i�i�i�i^i�i�i�i�i-	i.	i�ii)i�i�i�
i�i�i�i2
i�iiii�i�
i�i�i�iAi�i�i�i-
i�i�i�i�i�i�
i�i
i�i�	i�i�i�i�i�i�
i�i�
i�i�i�
i�i�iQi�i�
iO
i�i�i�i�ii�i�iziKi�i�i�i[i�iJi�i�i@i�i.
i�i�i�i�iD	ii}i/
i@i�i�
i�i�i�
i�i@iiRi�i�i�	ij
i~i�i�iJi�i�i�
i�i�i�i�i�
i0
i�imi�i�iimi~	i�i	i�ii1
i�i�i�	i�i�ii�i�i�
idi�i�i�iXi�i�i9i�i�ii�i�iUi�i�i�i�i�iLi�i3
i�ii�i�
i	i�i�i�i�	i�i�i�i�
i�ii$i(ivi�i�i&i�ibi�i�i�i�i�i�i�ii�i�i�i{i�i�i�i�i�i�i�i�i�i�i2
i�i�	i�i�i�i�	ii�i�
i�i�i�i�i�i�i�i^i�i�iV	i�	i�i�i�i�i�i�i�i�i�i�i�i�ii2iW	i�i
iWioii	iik
iXi�i�i�	iAi4
i�i�
i�i3
i�i�i�	i�i�i�i�i�
i�i�i�
i�i�i�i�i�i�i�i	i�iHi�i�i�i�i�iiiii�iDii�iIisi
i�i�i�
i�i i�i�i�i�iwi�i{iii�ii�i�i/	ini,iiii�i	i�	i�i�i
i�iiii
ii4
iBi�ii�iP
i5
i�
i�i�
i�	i�i�
i�i	i�ii|i�iziii�i�i
i'i�i5
i�ii�i!i�i�iyi�i�iVii�i�i�	i�i�i�ii�i�i�i�i�ii�	i�
iii-ii�i�i�ii�
ii�
i�	i�i�iii�
i�i"i%ii�i�iJiCii�ixi�i�iii�i	iil
i6
i�i�iii�
ii�
i�iiXi�ii�i7
ii�	i�
iNiim
iii�i iWii�i!i�	ii
i�
i>i8
i�i"i#i9
ij	iDi�i�ii$i	
i%ii�
i�i�iXi&ii'iEi�i(iFii)i�ixi�	ikii�ii�i*i+i�i�i�iDi�i�i,i�i�ii�i�iiKi-i.i/i:
i�i0iJi�ii1i|i�i�i�i�i�i�i�iEi*i2i�
i�ii�ii�iHixii�ii3i�i�i�i�i3ii�i�i;
ipi�i<
ii�ii�i�i4i5i	i�	i6i�iOi�i
i7i8i�i9i�i:i�i�i;i�i�i�i�i<i�
iiYi=i>i
i	i?i�i@iAiBi�
i�i�i=
i�	i�i�ioi�	ifi�ii�i�
i�
i�	i�	iCiiDi�i#i�i�
i>
i�iEi�i�iFiZiE	i�i�i�	i[i$i�
i�iGi?
ii�	i�i�iGi�i�i�i@
iHi�iA
i\iLi�i�i�i�i�
iIi	iii�ii�iiiJi�	i�i�
i	iKiLi]iMiNi
i�iji�iQ
i�
iB
iOiPi�i�iQi�
i�i�iRi�
iSiTi�i(i�ii�iC
i�iUiiVi�iWiXi�i�iYi�i�i�iZi�i�idi[iciHi�i_i�i#i0	i\ii]i�ini

i�	i�i�ii^ii�i_ik	iD
i�i`iai�i�ibi�i�i�	ici�i�i�i�idi�ii�	i�iiidi^iE
ieiii�i�
ii�i�ifi�i_i7iii�i i�
i�iF
iiigi-i�ii!ii�ihi�	iqi;i�i�i�i�iXi�i i	i�i�iiiji�i�i�i
ikili�i�i~imiG
i`iniyipi�i�ioi>i�ipi�iqi
i�i�iri�iai�i�i�isiti"iui|i�i?ii�iivi�i�i�i�i�iei�i�iwixiyi�i�i�i�izi{i@i|i�i�	i}i�i�	i�i�i%isiiR
i�i.i�iMi?i�
i�i~ii�ibii�i@i�i�i�ii�i�i�i�i�i�i�i�i�i�i�
i�i6
iIi�i�i�i�i�i�i�i�ici�i�i�i�i�i�i�i2ii�i�imi�i@i�i�i�i�	i�i�iNii�i�ifiii�iZi�
i�i�i�i�i�i�i\iH
i�idi�i�iJi�i�	i�i�	i�
i�i�i�i�i�iKi�i�i�i#i�i�i�i�i�i�	i�i�i�iKi�i�i�i�igi�i�i�ihi�i>i�i.i�i�i�i�i�i�i�ii)in
iti�iii�i�
io
i�
iI
i�i�
i�iiqi�i�iri�i�i�i�i�i�ip
i�i�	i�i�iziii�iUi�iJ
i�i�i1	iK
iti�i�i�i�i�i�i�
i�i�iJi�iiLi�	i�i�i�i�i�i�i�	iMi�i�i�ii�	i�i�i�iei�i�	i�ii�i�	i�i�i�i�i�i�i�iri�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i i i i i i i i i i	 i
 i i i
 i i i i i i i i i i i i i i i i i i i  i! i" i# i$ i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz i{ i| i} i~ i i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i!i!i!i!i!i!i!i!i!i	!i
!i!i!i
!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i !i!!i"!i#!i$!i%!i&!i'!i(!i)!i*!i+!i,!i-!i.!i/!i0!i1!i2!i3!i4!i5!i6!i7!i8!i9!i:!i;!i<!i=!i>!i?!i@!iA!iB!iC!iD!iE!iF!iG!iH!iI!iJ!iK!iL!iM!iN!iO!iP!iQ!iR!iS!iT!iU!iV!iW!iX!iY!iZ!i[!i\!i]!i^!i_!i`!ia!ib!ic!id!ie!if!ig!ih!ii!ij!ik!il!im!in!io!ip!iq!ir!is!it!iu!iv!iw!ix!iy!iz!i{!i|!i}!i~!i!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i"i"i"i"i"i"i"i"i"i	"i
"i"i"i
"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i "i!"i""i#"i$"i%"(u EUCTW_TYPICAL_DISTRIBUTION_RATIOuEUCTW_TABLE_SIZEuEUCTWCharToFreqOrder(((uH/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/euctwfreq.pyu<module>,s�site-packages/pip/_vendor/requests/packages/chardet/__pycache__/mbcssm.cpython-33.pyc000064400000042452151733463730024715 0ustar00�
7�Re�Lc@sX	ddlmZmZmZd"ZeeedeeeeeeeeeeeeeeeeeeeefZd#Zied6dd6ed	6ed
6dd6Zd$Zeedeeedded
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefFZ	d%Z
ied6dd6e	d	6e
d
6dd6Zd&Zddddeeeeeeeeeeeeeeeeeeeeeeeeeededeeeeeeef(Z
d'Zied6d
d6e
d	6ed
6dd6Zd(ZeedeeeeeeeeeeeeefZd)Zied6dd6ed	6ed
6dd6Zd*Zeeeddddeeeeeeeeeeeeeeeeeeeeeeeeedeeeeeeeeeeeeeeef0Zd+Zied6dd6ed	6ed
6dd6Zd,Zeeeeeedeeeeeeeeeeeeeeeeedeeeeeeeeedeeeeeeeeeeeeef0Zd-Zied6dd6ed	6ed
6dd6Zd.ZeeedeeeeeeeeeeeeeeeeeeeefZd/Zied6d
d6ed	6ed
6dd6Zd0Z dddeddeeeeeeeeeeeed
d
d
d
eed
d
d
d
d
ed
d
d
d
d
d
dddeddd
d
ed
d
d
d
d
d
d
eeeef8Z!d1Z"ie d6d
d6e!d	6e"d
6dd6Z#d2Z$d
d
dd
ddeeeeeeeeeeeedddeeedddeded
d
dd
dddddedddeeedddddedeeef8Z%d3Z&ie$d6d
d6e%d	6e&d
6dd6Z'd4Z(eeeeeeddddddd
dddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeddddeeeeeeeeeeeeedddeeeeeeeeeeeeddddeeeeeeeeeeeeeeddeeeeeeeeeeeeddddeeeeeeeeeeeeeeedeeeeeeeeeeeeddddeeeeeeeeeeeeeeedeeeeeeeeeeeedddeeeeeeeeeeeeeeeeeeeeeeeeeeef�Z)d5Z*ie(d6dd6e)d	6e*d
6d d6Z+d!S(6i(ueStartueErrorueItsMeiiiiu
classTableiuclassFactoru
stateTableucharLenTableuBig5unameiiii	i
uCP949uEUC-JPuEUC-KRux-euc-twuGB2312u	Shift_JISuUTF-16BEuUTF-16LEiii
iiiuUTF-8N(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii	iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(
iiiiiiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii	iii
iiiiiiiii
i
i
iiii(iiiiiiiiiiiiiiii(,u	constantsueStartueErrorueItsMeuBIG5_clsuBIG5_stuBig5CharLenTableuBig5SMModelu	CP949_clsuCP949_stuCP949CharLenTableuCP949SMModelu	EUCJP_clsuEUCJP_stuEUCJPCharLenTableuEUCJPSMModelu	EUCKR_clsuEUCKR_stuEUCKRCharLenTableuEUCKRSMModelu	EUCTW_clsuEUCTW_stuEUCTWCharLenTableuEUCTWSMModelu
GB2312_clsu	GB2312_stuGB2312CharLenTableu
GB2312SMModeluSJIS_clsuSJIS_stuSJISCharLenTableuSJISSMModelu
UCS2BE_clsu	UCS2BE_stuUCS2BECharLenTableu
UCS2BESMModelu
UCS2LE_clsu	UCS2LE_stuUCS2LECharLenTableu
UCS2LESMModeluUTF8_clsuUTF8_stuUTF8CharLenTableuUTF8SMModel(((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/mbcssm.pyu<module>sh

$
















site-packages/pip/_vendor/requests/packages/chardet/__pycache__/mbcharsetprober.cpython-33.pyc000064400000006164151733463730026613 0ustar00�
7�Re�c@sFddlZddlmZddlmZGdd�de�ZdS(iNi(u	constants(u
CharSetProbercBsP|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS(uMultiByteCharSetProbercCs2tj|�d|_d|_ddg|_dS(Ni(u
CharSetProberu__init__uNoneu_mDistributionAnalyzeru
_mCodingSMu
_mLastChar(uself((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/mbcharsetprober.pyu__init__$s
		uMultiByteCharSetProber.__init__cCsRtj|�|jr&|jj�n|jr?|jj�nddg|_dS(Ni(u
CharSetProberuresetu
_mCodingSMu_mDistributionAnalyzeru
_mLastChar(uself((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/mbcharsetprober.pyureset*s
		uMultiByteCharSetProber.resetcCsdS(N((uself((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/mbcharsetprober.pyuget_charset_name2su'MultiByteCharSetProber.get_charset_namecCs�t|�}xtd|�D]
}|jj||�}|tjkr�tjr{tjj	|j
�dt|�d�ntj|_
Pq|tjkr�tj|_
Pq|tjkr|jj�}|dkr�|d|jd<|jj|j|�q&|jj||d|d�|�qqW||d|jd<|j�tjkr�|jj�r�|j�tjkr�tj|_
q�n|j�S(Niu prober hit error at byte u
i(ulenurangeu
_mCodingSMu
next_stateu	constantsueErroru_debugusysustderruwriteuget_charset_nameustrueNotMeu_mStateueItsMeueFoundItueStartuget_current_charlenu
_mLastCharu_mDistributionAnalyzerufeedu	get_stateu
eDetectingugot_enough_datauget_confidenceuSHORTCUT_THRESHOLD(uselfuaBufuaLenuiucodingStateucharLen((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/mbcharsetprober.pyufeed5s2		"uMultiByteCharSetProber.feedcCs
|jj�S(N(u_mDistributionAnalyzeruget_confidence(uself((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/mbcharsetprober.pyuget_confidenceUsu%MultiByteCharSetProber.get_confidenceN(u__name__u
__module__u__qualname__u__init__uresetuget_charset_nameufeeduget_confidence(u
__locals__((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/mbcharsetprober.pyuMultiByteCharSetProber#s
 uMultiByteCharSetProber(usysuu	constantsu
charsetproberu
CharSetProberuMultiByteCharSetProber(((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/mbcharsetprober.pyu<module>ssite-packages/pip/_vendor/requests/packages/chardet/__pycache__/langthaimodel.cpython-33.pyc000064400000055556151733463730026252 0ustar00�
7�Re,c@s9d�Zd�Zied�6ed�6d�d�6d�d�6d�d�6Zd�S(�i�i�i�i�i�ijikidi�i�i�iei^i�i�iliminioi�i�i�iYi_ipiqi�i�i�i�i@iHiIiriJisitifiQi�iuiZigiNiRi`i�i[iOiTihiiiaibi\i�i�i�i�i�i�iXi�i�i�i�i�i�i�ivi�i�i�i�iciUiSi�i�i�i�i�i�i�i�i�i�i�i�iii�ii�iKiii4i"i3iwi/i:i9i1i5i7i+iii,ii0iiii'i>ii6i-i	iii=ii�ii*i.iiiLiiBi?ii
ii$ii
i(ii i#iVi�i�i�i�i�iii)ii!i�i2i%iiiCiMi&i]i�i�iDi8i;iAiEi<iFiPiGiWi�i�i�i�iucharToOrderMapuprecedenceMatrixg��@��?umTypicalPositiveRatioukeepEnglishLetteruTIS-620ucharsetNameN(i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ijikidi�i�i�iei^i�i�iliminioi�i�i�iYi_ipiqi�i�i�i�i�i�i�i�i�i�i@iHiIiriJisitifiQi�iuiZigiNiRi`i�i[iOiTihiiiaibi\i�i�i�i�i�i�i�i�i�i�i�iXi�i�i�i�i�i�i�ivi�i�i�i�iciUiSi�i�i�i�i�i�i�i�i�i�i�i�iii�ii�iKiii4i"i3iwi/i:i9i1i5i7i+iii,ii0iiii'i>ii6i-i	iii=ii�ii*i.iiiLiiBi?ii
ii$ii
i(ii i#iVi�i�i�i�i�iii)ii!i�i2i%iiiCiMi&i]i�i�iDi8i;iAiEi<iFiPiGiWi�i�i�i�i�i�(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiF(uTIS620CharToOrderMapu
ThaiLangModeluFalseuTIS620ThaiModel(((uL/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/langthaimodel.pyu<module>%s*
site-packages/pip/_vendor/requests/packages/chardet/__pycache__/jisfreq.cpython-33.pyc000064400000244076151733463730025102 0ustar00�
7�ReӸcP @sdZdZdR ZdQ S(S g@ii(iii�i�i�i'iOii}i�i�i�i�i]i�
i�
ii�
i�i�i�i�ii�i�i�ii�i�iXi}i�i�ikiig
i�
i�iki�i�i�iiiii�i�i%i&i0i1i,i-i�i�iii�ii�i�i�i<ii�ipi�i�i�i�i�i�igi�ii�iWiXi�i�ih
i"i�i�i�i�i
i	ii\i�i�i�
i/
i�i�i�i�ii�i0
i�i�
ihi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ii�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii ii!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i�iViji4i�ii�iBii�i8i9i:i;i<i=i>ivi�i�i�iSi�ieiifi�i�id	i+i�i�iaiwi�i�i�iIi�i~i�i�
ii?i@iAiBiCiDi
ii-iiiii�i�
iiEi^i.i�i3iii
iFi/iYi�i�ii�iji�
iiGiHiIiJiqii1
iiYiiki/ii2iii#iii�i*i�ii�ii�ii[ii\i5i�i!i!i	i%i@ilii'iAiiii4i
ii�i�iii<ii�i�i-i�ii7iSi�i�i~iKi=iiEi�i;ii�i7i7i8imi&iii
iiOiKi=i~idiiiLiMiNiOiPiQiRiSiTiUiViYi>iJi"ip	ipi�i�ii�iTi_i�i�i.iXi�i�iLijieii9iPi iliyi�i�iiDi�i�i�i)ihi�iFi?ii+iiigicii�iBi]iNi�i�i8iji:i5iii7ii�iRi4iGidi�i�i�iniihiti6i3i$iWiCi�i�i:
ixi�ii*iV	iiWiXiYiZi[i\i]i^i_i`iiaibicidieifigihiiijikiliminioipiqirisiti�
iuiviwixiyizi{i|i�i�ii�ili}i�i~iii	i�i�
i�ii�i
i�i�ii�iiii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiki�i�
i>i�
i�
i	i�i
	ij
i�i�i�iZi[i\i]iiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ii
i�i�i�i�ii�i2
i�i�i{iTi�ia
i�
i^i�i�i|i�i=iimik
i�i�i�i	iViyi�	i�i
iq	ii�ii�
i�	i�i�i�i�i!i�i�	i�ii�i�i�iCiOi3ii�i�i�i�ir	i�i�ini�i+ii�i�i�
ipiqi�i;
iAi�i�i�iCi0i�ini�
i�i�iTiCioi
i�i
i#	ii�i~iiPi�i�i�ii�i�	ii�	i�i$	izi�i�i&i�i�i�i�ii�i�i�i�i_ii�iUi�i�
is	i�	i�i�iIi�i�i�ii�i�i�i3
i�ii$iWi1i5iPi�	i�ii�i�i�i�iXi�i�i�il
i�i�iHi�i�	ii�i�ii�i
i�
iWi�i~ipii$i�iii@iLi�i�	i�i�i�iuiiiJiI	iW	i�i�i_i�i�	i<i�i�ii]iDi�i�i�iihi�i�i�i�ii�ifi-i�i}it	i�i�	ii�i�i�i,i�i
ibi�i�iXi�iiFii{i`i�i�i+i3iqi�imi�i4
i�i�i�i�i�iBiliX	i�
ii%
i�i�i%	i2iui�i�	i�	i�iJii|iri�i@ii�iii�i�i�
i�i�	iL
iiiii�i�ib
iJ	iici�i�i�i�i�i�ii4	iRi�im
iTi�i�ii�i�i�i�i�ie	i�ii?i
i�i�i�ii-i	i�i*iEi�i�i+i�i�i&	i�	i�i�i/i�i�i.isi[i�i+ii�
ii�
iBic
i�i�i�i�i�i	i)ii,i�iu	ii	ii9i&
iii�i�i�iv	i�iYi�i3i�i
i�i�iiDi�i�i�i�idi�i�i|i(iyii�ii�i<i8i�	iiiiiid
i5
iBi�inii�ii�i�i|i�	i!i�i)i@in
imii�	i0iai�i�i�	izi'i�i�i�	iWi�i[ivi�i�i�	i�i�i	io
ii�	i�i
ii�i'
i�ii"i�i�i9ii�ii�iJi�i�ihi�i�ie
ii�i\i�i�iip
i@iiQi9i�i�i�i	i�i�i�iw	iiiEi�iJiIi�	i�i�i�i�iifi�i�i�i
i�i1i�i�i
i�i�i'	iri
i�i�i�i�
i�i�ici�	iqi�ixi�ii
i2i�i�ii�i�	i*i�i�ibiFi�ivi�idi�
i�i�i!iRi�i�iQi�ii�iPi�iii�ii�i�i(	i�i�i_ii`i�i�if
i�i6
i�iAii�iai�i�iuiTii2i�i�iii�ii^iCi�i�
i�i[i�i�
ivi%i�i�i�ini!iFi�iZi^i�ii�idii�i�ix	i�i�i]i�iBiici�
i�i�i�iPiqi	iiHiY	i�i�i(
i�i�
i�igi}iKi�	i�ii4i�iWi�i�i�iCig
i-idi�ikii4i}i�iq
i~i+i�	i�i�ihi@	i�	ii@iA	iDi:i�i�iei�
i�iqiwi�i�i�i�i�i�i�idi�iZi�i*iM
i[i�i�isiZi�
i�i�i>i�i'i-i�i�
iii�i)	ii�i�i�itiFi7
i�iti#i�i�i�i�iiYi�i�ifikibi1i�i�
i�i6ioiciiqi�	i�i�i�i�
iui�i:i�i�iN
i�iUi=i�	ivi�iliNi�i�i�i]i�i;i�i�i�
i�i�iliLi	i}i�i�ii�iB	i�i8
iQi�i#i`iTi�i�	ixiiri�	iii�i�i�i�	i�i3inii�ii�ii�i{i�i�i@i�i�ii�i9
i�i�i�i5ih
idiZ	i�i�iiii�i�i�iisi-ir
i�iii�i[i�i0iii�i�i.iSi	iRiO
i�ii�i�i;i�i4iy	i�
i;i�iz	i�ipi�i�i i�i�i:
i(i|i�
i�i"i�i�i�i�i�i�iOi�iei�i�i�i
iC	iti)
ii6iKi�i�i8i�iP
iihi�i�i�ii�i3i$i�i�i*
i=ibieii�
i4i�i�i�	i.i7i�i\i�i�iiji�ii�i�i�i�i�i�i/ii�i�i�i=i�i^i�i5	i�i�i�	i\i�ii�i�i9i#i+i�
is
i,i�i7ii�iYi�i�i�
iMi�i+
ii
iQi�i�i6	i�i�i�i�iiyi�iisi#i{	i�
iUifi<i�i�ivi�i�i)i�
ii�ii�i�imi<iii�	i�i�igi�i�	ili�i iD	ibiui�
i�iDiBi�i�i�
i[	i�ii8i�i�i>ii�ii�i�i�i�ii]i�iDi�i�i�i6iZi�i�	i5i�i�
i�
i<imi�
i,i�	i�iui^i�	i�i�igi�i�iIi�i�igi�i�i\i:i
iMiti�	i�iEi�ioi�i�i�i�iEiRi�ii�iEij
i�igiWi�i�iKi�	iCi�i=i�i]i$i!i�i�	ii�i�i`iKiviii0iii�i^i�i�i3i�i"ii�i�i�iiaik
ii;
iwi�i�i�i�i�i�i�
iyii�i�i�iPii�i�	iwi�i�i�it
i�i�i�ii�i�iJiaii�i]i�i�i�i�	i�ii�iiLihii�i�i�
iu
iji�ii#iCi�i�i	iai�i!isi|	i�i	iYi�i
i�i�i�ihiOi5i�i�iziii�
iSi�iLi�i.i�i&ii	i<
i7i�isiAi�i�iMi�
i�isi�i*i,
i%i�
i�	i�iki�i&ifi�iOiji"i�i(i-i�i[i�i�i�i�i-i=i�i}	i�i�iMiSi�i�i�ii�iii�i�i�i�
i
ii
i�i~	i�iJitikivieiyii�i�i<
i�ifi�iMiki�
ii�ioi�i�i�iwiv
ili�i]i�ii.i�
i�i�i�i/if	iqi$igi�iGi�i�ini�i>i6i=
i�i�i�i�i�iNi�	ixi�iei*	iihii�i�i$i�i�i�ioibi,ii�i�iiti�i�i	i�ii�
iVi�i�
iiii�i�i�iw
iiipiHi�iVi�iii<iZi�	i8iriwi�i&i�i�i�i/i�i�i�i�i>i�i>
iE	ixi�i&iei�iwi	i�i�i5i�i�i�
ii\i�i�i�iSiiii�i�i�i2i�i�iii+i'i�i%i�i�ix
iOi�i
iQ
i�i�iii�i�i_iHi�i�ii�igii�iy
i�i�
i0i&i+	ii�ii�i�il
i'i�i'izi�i	i	i�i_i�i�ii�i�i�i?
i�
i�i�	i�iz
i�im
i|i
ii	ig	i0i�i�i i�i*i�i�i
i`iwii�i
i#i�ici)i�i�iR
i�i�i�iTi�i�iriiVi�i�i�i_ii�ii�iri�i�i�
i`ixi�i�i
i�i�ifi�iin
i=
i*iAii�	i(i�ixi�iS
i�i{iT
i�i9ii�iMi�iri�ii;ii(ii%i�i[iaibii�iDi�i�ii-
i\	i�iii�io
iEimi)i�i!i�iici�i,	i1ii]	i�i�i�i>iIi�i�i�	iTii�i�i�i�i�iyiikizixi�iNi	i�i�i�i	i5i�i�i"i�iHi<idi�i
i�i�ih	i�	i�i
ip
i�i�i:iLi1i�i�i�
ii�i>
i�iq
i?iZiMiIi�iiBiK	iDi�i#i
i
iYi>i�i�iii`i�i�i�i�ii�i�i�ii�i�i�i i�i�ici�ii�i�i�i�iTi�iaii2iyi/i�i"iU
i�i�ibi�i�i�i/i�i�	i�ii
i{i
i�iji�i�i�i5i*i�i�i�i�iaixi�i�i�	iiFi�i�i�i7i�i�i�	i?i�iwi�iii�i�i+i�i8i�i�
iNi�
i�i�i,i�ini�i
ii�ioisi_i?i�i�	i�i�ii�	i�i�i?i0i�	i�	i�iyi3ifi�i=i�i�ilii�	iivi]i�i	i	i�i�izi�
i�iyijiiui�i�ipi�iji�ii	
iiizii�ir
ii�i�i�i�i�iiiFi�i'i�	i{
iniixiui$ii�i�iMi�i�i�ikiipi�
i^	iqi
i`i|i�i�	ii

i|
i�	i�
ii�i�	i
i�i�i�i�	iGii�i-i�iZi1iYi�i-	i	iei�i�i[iCi�i�i�iei�i.i-ii�i�i	i�i�i�
i�
i7	ibili	i�i�i�i{i�i.i	i�i�izi�i�
i�
i�i?
i�ii9ii�
i�ii�i}i�i�
iai�i�	i
iQi�	idi;iV
i�i/i^iDi�i?imi�
i�
i9iIi�
i�i�i
ii�i�
i{i}i i�ii�i�i�i&i�i~i�iXi�i�i}
i�
i�i9i�i�i:i�i"i\ii�i
i_	i�i8iWi~
i^i%iPisi�iwi�i�ii8	i�iLi�ii.
i�i�i�
i�iiNi�i�iPi�iSi�i�i�i:iRi'i0ibii�i�
i�i�i�i�izii�	iiiiiKi�i�i�i�
iri�iqi
i�i�iniL	ii�ii�i�i�i�i�i�iXi@
i�igiii�i�i4i�i:ii�i�iri�	i�iQi�
ii	i;i'i�i>i�ibimi�iwi�i�i�is
i�ii�iA
i�it
i9	ii�iii�	ioi^i�i�i2i�ici�ii�i�iiri�i�i�i!iitii1i{i�i�i�i�i�i�isii�i�i�i�i�ixiiviaipi�i�i
i�iLiOi�iiUi�i.ii�i)i.	i�iEi�	i"iiyii	i�i�i�i�i(i�
ii�iqiEi6i
i�
i2iui6i�i�i�i�i.i�ii	ii�iVi�iisi�
i�i�iGiGijiti�iWii�	i�i�i`i�i�i�iui�ii�
i�i{iQii�	iOiCi�i�i�
i�iJi�	i	i	i$i�i�i�i/	i�ii_ii�iij	iRi�i7ii�i/
ii3iDiu
i6iXi4i�i�iii�ii>i�iii0
i`i`	i
i�i�i�iUi�i i�
irii�i)i�i5i�iHi�i 
i�ii~iri�i�
i�i�i�i�i�	i�ii]i�i�ii�ii�ii@
i�i�i�
iai�ivi�i�i�i/i!i6i�i�i�i7iwi�i	i3ici8ixii�i�iB
i�i�iM	i�i�iF	i�igii�i�i(i�i
i:	ii�iHi�i�
ifi�i�i"i�
i~i�i�i�i�
iyiii�i�i i!iNi�
i4iA
i�idiei�i�izii�i�i�i�i�i�i0	i�i�ii�i�i�ii�i{i�i�i�i�
i�ifi(ili�iGi�	i�i�i^iB
imiFi|iiUi�i�i2iRi�i�i#i�i�
i�i�iFi�iiUi�i�i�i1i�iciki�iN	iSi�	i�i�i�
i�i�i$iO	i�iiYi�i�i�i
i�iGiii�iW
i	iC
i?i�ii�i~i�i�iUiFi�i�i�ii�i�i�i�
iC
i�	i�i�iiei
i�i�i�ii/iQi_iv
i;i�i�iPi)i�iGimi�	i�i�iGi,iIizi_i�	i�i	i9ini�i�
iAi�	i�
iX
i�i#iVi)i<i%i�i}i�i�iHiw
i5i�ipi.ii�i�imii�i�i�
i#ihi|ibi�i�i�i@i(i^izi�iiAi�
i ii"iigi�i|i�i�i�i�i�i6i�iXi�i�i,i�i�i		ii�i$i#iIik	i�ii�i�i:i	i�iQiioihiVi$i�
i�iti�i�i�iY
i,i�ii
i�iD
i�i�	i~i�
i�
i�i�i%i�ii i�i�i�ii�i�
i i7i/i
	i�i�i�i�	iEiVi�i�
iE
iui�i&i�i�ii�i�	i�ioi�i�iZi�iii�i�i	ii�i�i�i!i�ini8i�i'i�i�i�ii�ii�i�	i�iGi�iRi2i�ii:i�i,i�iiZ
ili�i(iXiP	i?i�ii�	ioi�ii�i�i�i�iWi*ii�i;i8i�i&i)i�i�i
ioi�ii�i�iHi_i�i�i0i�ix
i�i0i�i;	i�i
i�i�iXi�i	i�i�i1i�iZi*i%i�	i�ii|idi`ii�iSiji}i\ii�i�iG	i�ii�	ifiqi%iBi�i1
ipi�i"ii�i�i�i�i|i�i�ii�	i�il	i2
i�i�
i�
ii�i@ihi�i;i�i�ii	i�i	i�i�i&ii�i�i}i�i%i�i�iii?i�i�	i�ia	iy
ii�
i�i�i�	i�i=i1i�i<i�i{i#ii�i�i�i�
iAi�i
i�iti�i�i�	i�i>i
iKi3
i�i�i=i�ii\i�i�i'iAi+igi�ib	iKi�i�i�i�i
i�i
i�i4
i�i*i�im	i�	i�i�
ioiNii0i(iii�i$i4i i{ii�i�iQ	i�i�iUi�i�i�i,i`ii�	i�ii�
iji)i i�i-i6i�i�	iF
i2i)ii
i*i�iYiZiJi�iHi�iii.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]isi^i_i�i`iaibicidi?ieifi@igihi%iiijiikiki�	i5
iAi
i�iliminioiBipiqiri�
i1	iiCiDitii�
isi&iEiFiti�iuii
i�
iviwixi�i�i�i'iGiyizi�	ii{iHii|i}i�i~i�
i(iIii)i�ii�
i�i�i!
i�i�iJi�i�iKi�i�iLi�i�i*i�iMi�i�i�i�i�i�i�i�iNii�i�i�i�
i�i�i+iOi,i�i-i�i.i�i�i
i�i�i�ii�iG
i�i�ii�i�i�i�ii�i�ii�i�iPii�i�i�i�i�i�i�	i/i�iQi�i�i�i�i�i�iRi�i�i�i�i�i
i�i�ii�i�iSi�iH
iTi�iUi�i�i�ii�i�i�i�i�i�
i�iVi
i�iWiXi�i�i�i�ii�i�iYi�i0i�i�iZi�i�i�i�i�i[i\i]i�i�i^i�i�i_i�i�i`i�iaibi?i�ici�idi�ii�iei�i1i�i�	ifiui�i�igi�i�i�
i�i2ii�i[
ii�i@i�i�i�iI
i�ihi"
i+iAi
i�i�iii,ijikiz
i-ili�i.ii/i�i�i�i�i�i�i�i�i3iimi�i�i�ii�iniD
i�i�i�iR	i�i�i�i�ioi�
ipiJ
i�ili
i4i2i�i�
i�ii�
ii�	iBi�
i�i�i�
i�iqiriK
i�i�i�
i�i�i�
ii�i5iE
i	
iIi�i

i6i�	i
ii�ivi�i�i�i7isi8i�	i
iL
iwi�i�i9i�itii�i�ii�i�i:i�iui�i�ii;i�i�i�i�i�i�
i�i i�iiiiii<iiiiiKi	i
i	ixiviii
ii!i=iii>iiiii�iii	iiii?iii@ii�iiiii�iiwi i�i!i"i"i�i#i$i0i%i&ii'i(i)i*i1i+i�i,i-i�
i.i<	i#i
i/i$i�i
i0ii1ixi2i3i�iyi4iyi5i%i&i�
i

izi6iCi7izi8i�iLiiBi'iAi
i�iiBi�i(i�i{i|i)i�iCi*i�i9i�
i�
ii:i;i<i�i�
i}i~i=iDi�i>ii?i@iAiBi�i�i�i�iCiDiDic	iiEiFi�
iiGi�iHiIiJiKiLiMiNi{iOi�i+iPi3iQi�i�
iRi�	iEiSiTiUiVi�i�iWiXiYi2iZi[i\i]i^i_i`i�i�iaibi�icidimiEiFieifi�igihi�iiijikiJiliminioipiqirisitiuiviwi�
iGixiyizi�i,i�i-i�i.i
iMi�i{i�i�i�i�i|i�iHi}i�i~i�i/iniIiii�i0iJi�iKi�i�i#
i�i�i�i�i3i�i�i�i�i�i�i�i�i�i�i�i�i�i�i1i�i�i�i�i2iM
i�i3i�i�i�iLi�i�i�i�i�i4i�i�i�i�
i�i�
iMi�i4i�i�i�i5i�i�
i�
i6i�i�i�i�i�i�i�i�i�i�i�i�
i�i�i�i7i�i�iNi�iOi�
iPi|i�i�iQi�i�i�	iKi�
i�i�i�
i�i8i�i�i}i�i
i�	i�ii�iiN
i9i�iLiRi�i:i�i;i�i�iFi�i{
i�iSi�i�i�i<i�i�i=i�i�i�i�i�
i�i�i�
i�i�iTi�i�i�i�i�i>i�iO
i5i�i�i�i~i�i?i�iii�i�
i�i�
i@i@i�i�i
i�i�i�iAi�iioi�iGi�i�i�i�iii�
i�i�i6i�	i�i�ii�i�i�
i�iUi�
i�ii�i�i�i�ii�i�i�i�i�i�
i�iBiCi�i7i
i�i�iVi�iNi�i�i�iDi�i�i�i�i�i�
i�iWi�i�i�iXi�
i�iEiFii�iYi�
i�i�i4i�i�iGi�i�iHin	i�	ipi�iZiS	i�i�i�i[i�iciIi�i�i�i�i�i�i
i�i�i8i�i�
i
i9i�i�iHi�ii�
i\i:i�i�ii�
i�ii�iJi�i�i�i�i
i�i]i�i�i�iiii�
i�i�ii�ii
i�iiii�iii	i
iii
i�i�iii�
iii�
i�i�iiiiIi�i�iiiiiiP
iiiii�i�iii�iKii�i�i�ii i!i^i"i#i�
i$i�
i%iLi&i'i(i)i*i+i�i,i-i�i�
i.iJi/i0iQ
i�i1iMi2i3i4i�	i�i5i6i7i�
i8i9i:i�i;i;iNiOi<i�
i=iPiQi>i?i@iAi�iBi�i�iCiDi<i�iRiEiFi�i�
iGiHiIiJiKi�
ii�
iSiLiMi�i�i�
iNiOiPiQiTi
iRiR
i�iSiTi�iUiVi�iS
i_iWiXiYiZi[ii\i�i]i^i_i`iaibiciidi�iei�i�ifi�
i�igihiiiUijikilimi=inioi�
i`ipi�iqiri~isii�itiuiviai�iVi�
i�iWiwi�ixiyi�izi�i�
i�i{i|i}i�
i~iMii�ibi�i�i�i�iXi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i
i�i�
i�i�ici�i�i�i�idi�i�i�i�ii�i i�i�
i�i�i�iYi�iZiei[i�i�i�iT
i�i+i�i�i�i�ii�i�i�i�i�i�i�i>i�i�i�i�i�i�i�i�
i�i�i�i\i�ifi�i�i]i�i�igi�i�i�i�ii�i�	i�i�iU
i
i�i�ii�i�
i^i�i�i_i�i�i�i�	i`i�iai�i�i�i i�i�i�i�i�i�ihiiiji�i�i�i�ibi�
i!i�i�i�i�i�ici�i[i�i�
i�i�i
i�i�i
i�i�
iV
ikidi�ili�i�i"i#i�i�i�i�i�i�i�iei?i�i�i�i�i�i�i�ifi�i5i�i�i�i�i�i�i�imi�i�i�i@inigi�i�i�i�i$i�i�ioi�iW
i�i�i�ipiqi�iri
i�i
i�
i�i�
i\
i�i�
i�i�i�i�i�ihi�i�i�i�i�i�isi�i�i�i�i�i�iti�i�i�i�
i�
i�i�i�i�i�i�iAiBi�i!i�
i�i�
ii�i�iiiii�ii
i�i�iii�iiCiiuiDi6iijii�	i	i
i�i�
i�ii
i�i�ii�ikiEi�	i
i�i�	iii�i�iKii�
iiiilii%imi�
iFiiiiii�iF
ivi�ini�iwiiLixioi�i�iyiii"i�iipiiii�i izi�iqi!i"i�
i#i�iri$i%iNi&i'i�i(i{i�i7i)i*i+i,isi-i�
i.i/i0i�ii�i1i
i�
i2i�i3i4iti�i�
i5ii�i�i6i�i&i�i�i�i7iqi'i�i�i8i9i�i:i|i;i<i=i>i?i@i�iAiBiCiDiEiFi�iGiHiIi�
i�
iJi�
iX
iKiLiMiNiOiPiQiRiSiTiUi�iViWi�iXiYi�iZi[i}i\i]i�
i�i^i�
i_i6
i�i
i`iai�iGiHi�i�
i�
i(i~i�i)i�i*iIi�
i�
i�ibiMiciui�i�	i�
i�i�idieifi=	i�ivigihi�iiijii}ikilimiwini�
ixioipiqiri�isi�
i�i�i�i�itiui�i+i�iviyi�iwi�	i�i,ixi�iyi�iOi�izi�i�iY
i�
i�i9izi{i�i$
i�i�i�i{i�ii�i7
i�
ii�iJiZ
ii�i�i�
i|i}i~i�
i8i�i|ii�i}i�i�i�i�i�i�i�i�i�i�	i�i�i�i�i�i�i�i~i�i�i�iKi�i�
i�i�i�i�i�i�iLi�i�i�i-i�i�	i�i�i�i�i�i�i�i�i�i�i�ii�ii�i�i�i�ii
i�i]
i�i�ii.i�i�ii�i�i�i�i�i�i�	i�i�i�i�iNi�ii�iPi
i�iri�i�i�i�i�i�i�iMi�i�i�i�i�i�i�i�i�i�	i�i�i�i�iOi�i�i�i�iNi�i�iiOii�i�i�i�i�i�
i�i�i	i�i�i�i�i
i�i�i�ii�i�
i 	ii�i�i[
i�i
ii�i�ii�i�i�i�iii�iPiii�i�i�i�ii�i�
i�i�i�i�ii�i/i�i�i�i�ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ii�i�i�ii�i�i�i�i�i�i�i�ii�i�i0i�iQi�i�i�i�i�i�i�i�isiii�i�iG
i1i�i�
i�i�ii�i�i�i�ii�ii�i�ii�iiRii�
iii�iii i 
i\
i�i�i|
i�ii�iii	i�i�i
iiiiPi2iQi�i�i
iii�i�i�i�ii�ii�	iii�iiiiii ii!i�i�i"ii�
iii#i�ii!i�
ii$ii i!i�i"i!
i#i$i�i%i&i%i�i&i'i	i'i(i(i)i)i#i*i+i�
i,i�
i*i-i�iSi+i.i�i2	i3iH	i�i�i/i0i1i2i3i�i4i,i�i}
i5i�
i-iH
iRi.i6i!	i7i/i8i9i:i0i1i�i�i�i;ii<i=i>i?i@iAiBi2i�i�iCiDiEi~
iFi3iGiQi�iHi�iIi�	iJi�i"
i�iKiLiMi4iNiOi�i#
iPiQiRiSi�i�iTiUi5iViWi�i�i6i7i�i4i8i"i�
i9iXiYiZi:i[i;i$
i�i�i�i\i�i�
i]i^i<i_i�i5i�i�i`iaibicidiei�i�ifiigi�i=i�i�ihi�i�i�iiiji�
ikilimi�i�i>ini#i6ioipi?iqi�irisiTitiui�i�i�ivi
i�i@iAi�iwi�i�ixi�iyizi{iUi|i}iBiCiDi3	iEi~iI
i�ii�i�i�i�i�i�i�i�iFi�i�i�i�i�i�i�
i�i�iGi�iHi�i�i�i�i�i�i�i�i�i�i�i�
i�i�i�i�i�i�
i�i�i�i�i�iIi�i�i�i�i�i�iJiKi�i�i�i�i�i�i�i�iLi�i�iMi�i�i�i�
i�
i�iNi�i�i�i�i�
i�iT	i�i�i�i�i�i�iOi�i�i�iPi�i�i�i�i�iQi�i�i�i�i7i�i8i�i9i�i�i�i�i�i�i:i�i�i�i�i�i�i�i�i�iRi�i�i�i;i�iSi�i�
i�iTi�i�i�i�iUi�
iVi�iWi�i�i�	iXi�iYiSi�iZi[i�i�	i�i�i�i�
i�i�i�i�iVi\iWi�iU	i�
i�i�i"	i�i�i�i�i�i�i]i�i�i�i�i^i�i�i�i�i�i�i�i_i�i�i�i`i$iai�i�i�ibi]
i�i�ici�idiAi�iei�i�i�iifi�i�i^
i�i<ii�i�i�i$i�i�i�i�i�i^
i_
igi�i�i�ii%i�i�i�i=i�i>i�i�i�i%i	i?i�i�i�i�iti�i�i�i@iXi`
i�i�i�i�i�ihi�i�i�i�i�iiii�iiYi%
i�ii&i�	iZiiiTiii�
i	ia
i�i
i�i9ii�iii�i�iRi�i�ii�ii�iui�i�ijiki�i
ili�ii�iiiiiimiAii:iiiii�ii�iBiiniii�i[ii
ii�iii i�i\i!ioi"ipi�i�i�
iJ
iqi]i�i�i#i$i%i&iCi�iri'i(i)i*isiti+i,i�i�i-i.i/i^iui0i�	i1i�i�i�i2iDio	ivi3i�i4iwi_
i5i6i�
i�i&i;i7i8i�i9i�ixi:i;i�i<i_i&
i`ii�
i�
i'
ii�i�i=i�iSi>i?iUi�	i�i�i�iyizi'i�i
i(
i�i�i�i�i@iEi�
iAi`
i�iVi�i{i�iWiXiBi(i|i}i�i~ii�i'iCiDi�i�iEiFi�iGiHiIiJi�iKib
i�i�iLiai�i�i�iFiMi�i�i�iNiOi�iPi�iQi�i�i�i�ii�iRiSi�
i�iTi�iUi)
i�iVii�	iWiXi�i)i�i8
iYiZi[i\i]i^iiGi�i�
i_i`i�i�iaibicidi�i�iei�ibi�i�i�ifigihiii�ijiki�i�i�ilimini�i�i�iYioipi�iqiZirisi�itiuiviwixiyi�izi�i{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ii�i�i�i�i�i<i�i�i�i�iTi�i�iHi�i�i�i�i�i�i�i�i�i�i�i�i�i�ivi�i�i�i�i�i�i�i�i�i�i�i�iIi�i�i�
i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i[i�i�i�iJi�i�i�
i�i�i�i�i�i�i�i�i�
i�i�i�i�i�iiUi
ici�i�i�
i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iKi�i�i�i�i�i�i�i�i�i�i�ic
i�i�i�i�i�i�i�i�i�iLi�i�i�i�i�i�i�id
ii�i�i9
i�i�ii�i�iVi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�
i�i�i�i�i�i�i�i�idii�
i�i�i�	i�i�ii1i�i�
i*i�iMi�ipi�i�i�i�i�i�i�i�i	i�i�i�i�i�i�i�i�i�i�i�i�i�i�i>	i�i�i�i	iii�i
iNi�i�ii�iOi*
i�i�i(ii�
iii�i�iii�i�
ii	i
ii+
ii
i=i�iiiPi�i�iiii�ii�i�i�i�i�iiii�i�i�ii�ii�i�i�i:i�ii�ii�i;i,
ii�i�i�ii�ii�i�i�i�i�i�i�i-
ii�ii�ii i�i�i�i!i"i#i�i$i%i&i'i�i�i(i)i*i�i+i�ie
i,i-i.i/iQi0i�i�i�i1i2i3i4i5i6i7i�i�i8i9i:i;iRiei<i=i>i?iK
i�i@i�i�iAiBi
iCiDiEiFiSiGiHiIiJiKi�iWiLiMiNiOiPiTiQi�i�iRiSi�i�iTi�iUiVi�iUiWiXiYiZi[i\i]i^i_i`iiai�i�i�ibi�i�icidi�ieifi�igiihiiif
i?	iji\i�i�i�ikili�i�i�imi.
i+inioipiqirisiti
i�iuivifi,i�i�iwixi�iyizi�i�i�i�ii{i|i�i}i~i�i�i�
ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iVi�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i i i i i i i i i i	 i
 i i i
 i i i i i i i i i i i i i i i i i i i  i! i" i# i$ i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO N(P i(iii�i�i�i'iOii}i�i�i�i�i]i�
i�
ii�
i�i�i�i�ii�i�i�ii�i�iXi}i�i�ikiig
i�
i�iki�i�i�iiiii�i�i%i&i0i1i,i-i�i�iii�ii�i�i�i<ii�ipi�i�i�i�i�i�igi�ii�iWiXi�i�ih
i"i�i�i�i�i
i	ii\i�i�i�
i/
i�i�i�i�ii�i0
i�i�
ihi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ii�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii ii!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i�iViji4i�ii�iBii�i8i9i:i;i<i=i>ivi�i�i�iSi�ieiifi�i�id	i+i�i�iaiwi�i�i�iIi�i~i�i�
ii?i@iAiBiCiDi
ii-iiiii�i�
iiEi^i.i�i3iii
iFi/iYi�i�ii�iji�
iiGiHiIiJiqii1
iiYiiki/ii2iii#iii�i*i�ii�ii�ii[ii\i5i�i!i!i	i%i@ilii'iAiiii4i
ii�i�iii<ii�i�i-i�ii7iSi�i�i~iKi=iiEi�i;ii�i7i7i8imi&iii
iiOiKi=i~idiiiLiMiNiOiPiQiRiSiTiUiViYi>iJi"ip	ipi�i�ii�iTi_i�i�i.iXi�i�iLijieii9iPi iliyi�i�iiDi�i�i�i)ihi�iFi?ii+iiigicii�iBi]iNi�i�i8iji:i5iii7ii�iRi4iGidi�i�i�iniihiti6i3i$iWiCi�i�i:
ixi�ii*iV	iiWiXiYiZi[i\i]i^i_i`iiaibicidieifigihiiijikiliminioipiqirisiti�
iuiviwixiyizi{i|i�i�ii�ili}i�i~iii	i�i�
i�ii�i
i�i�ii�iiii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiki�i�
i>i�
i�
i	i�i
	ij
i�i�i�iZi[i\i]iiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ii
i�i�i�i�ii�i2
i�i�i{iTi�ia
i�
i^i�i�i|i�i=iimik
i�i�i�i	iViyi�	i�i
iq	ii�ii�
i�	i�i�i�i�i!i�i�	i�ii�i�i�iCiOi3ii�i�i�i�ir	i�i�ini�i+ii�i�i�
ipiqi�i;
iAi�i�i�iCi0i�ini�
i�i�iTiCioi
i�i
i#	ii�i~iiPi�i�i�ii�i�	ii�	i�i$	izi�i�i&i�i�i�i�ii�i�i�i�i_ii�iUi�i�
is	i�	i�i�iIi�i�i�ii�i�i�i3
i�ii$iWi1i5iPi�	i�ii�i�i�i�iXi�i�i�il
i�i�iHi�i�	ii�i�ii�i
i�
iWi�i~ipii$i�iii@iLi�i�	i�i�i�iuiiiJiI	iW	i�i�i_i�i�	i<i�i�ii]iDi�i�i�iihi�i�i�i�ii�ifi-i�i}it	i�i�	ii�i�i�i,i�i
ibi�i�iXi�iiFii{i`i�i�i+i3iqi�imi�i4
i�i�i�i�i�iBiliX	i�
ii%
i�i�i%	i2iui�i�	i�	i�iJii|iri�i@ii�iii�i�i�
i�i�	iL
iiiii�i�ib
iJ	iici�i�i�i�i�i�ii4	iRi�im
iTi�i�ii�i�i�i�i�ie	i�ii?i
i�i�i�ii-i	i�i*iEi�i�i+i�i�i&	i�	i�i�i/i�i�i.isi[i�i+ii�
ii�
iBic
i�i�i�i�i�i	i)ii,i�iu	ii	ii9i&
iii�i�i�iv	i�iYi�i3i�i
i�i�iiDi�i�i�i�idi�i�i|i(iyii�ii�i<i8i�	iiiiiid
i5
iBi�inii�ii�i�i|i�	i!i�i)i@in
imii�	i0iai�i�i�	izi'i�i�i�	iWi�i[ivi�i�i�	i�i�i	io
ii�	i�i
ii�i'
i�ii"i�i�i9ii�ii�iJi�i�ihi�i�ie
ii�i\i�i�iip
i@iiQi9i�i�i�i	i�i�i�iw	iiiEi�iJiIi�	i�i�i�i�iifi�i�i�i
i�i1i�i�i
i�i�i'	iri
i�i�i�i�
i�i�ici�	iqi�ixi�ii
i2i�i�ii�i�	i*i�i�ibiFi�ivi�idi�
i�i�i!iRi�i�iQi�ii�iPi�iii�ii�i�i(	i�i�i_ii`i�i�if
i�i6
i�iAii�iai�i�iuiTii2i�i�iii�ii^iCi�i�
i�i[i�i�
ivi%i�i�i�ini!iFi�iZi^i�ii�idii�i�ix	i�i�i]i�iBiici�
i�i�i�iPiqi	iiHiY	i�i�i(
i�i�
i�igi}iKi�	i�ii4i�iWi�i�i�iCig
i-idi�ikii4i}i�iq
i~i+i�	i�i�ihi@	i�	ii@iA	iDi:i�i�iei�
i�iqiwi�i�i�i�i�i�i�idi�iZi�i*iM
i[i�i�isiZi�
i�i�i>i�i'i-i�i�
iii�i)	ii�i�i�itiFi7
i�iti#i�i�i�i�iiYi�i�ifikibi1i�i�
i�i6ioiciiqi�	i�i�i�i�
iui�i:i�i�iN
i�iUi=i�	ivi�iliNi�i�i�i]i�i;i�i�i�
i�i�iliLi	i}i�i�ii�iB	i�i8
iQi�i#i`iTi�i�	ixiiri�	iii�i�i�i�	i�i3inii�ii�ii�i{i�i�i@i�i�ii�i9
i�i�i�i5ih
idiZ	i�i�iiii�i�i�iisi-ir
i�iii�i[i�i0iii�i�i.iSi	iRiO
i�ii�i�i;i�i4iy	i�
i;i�iz	i�ipi�i�i i�i�i:
i(i|i�
i�i"i�i�i�i�i�i�iOi�iei�i�i�i
iC	iti)
ii6iKi�i�i8i�iP
iihi�i�i�ii�i3i$i�i�i*
i=ibieii�
i4i�i�i�	i.i7i�i\i�i�iiji�ii�i�i�i�i�i�i/ii�i�i�i=i�i^i�i5	i�i�i�	i\i�ii�i�i9i#i+i�
is
i,i�i7ii�iYi�i�i�
iMi�i+
ii
iQi�i�i6	i�i�i�i�iiyi�iisi#i{	i�
iUifi<i�i�ivi�i�i)i�
ii�ii�i�imi<iii�	i�i�igi�i�	ili�i iD	ibiui�
i�iDiBi�i�i�
i[	i�ii8i�i�i>ii�ii�i�i�i�ii]i�iDi�i�i�i6iZi�i�	i5i�i�
i�
i<imi�
i,i�	i�iui^i�	i�i�igi�i�iIi�i�igi�i�i\i:i
iMiti�	i�iEi�ioi�i�i�i�iEiRi�ii�iEij
i�igiWi�i�iKi�	iCi�i=i�i]i$i!i�i�	ii�i�i`iKiviii0iii�i^i�i�i3i�i"ii�i�i�iiaik
ii;
iwi�i�i�i�i�i�i�
iyii�i�i�iPii�i�	iwi�i�i�it
i�i�i�ii�i�iJiaii�i]i�i�i�i�	i�ii�iiLihii�i�i�
iu
iji�ii#iCi�i�i	iai�i!isi|	i�i	iYi�i
i�i�i�ihiOi5i�i�iziii�
iSi�iLi�i.i�i&ii	i<
i7i�isiAi�i�iMi�
i�isi�i*i,
i%i�
i�	i�iki�i&ifi�iOiji"i�i(i-i�i[i�i�i�i�i-i=i�i}	i�i�iMiSi�i�i�ii�iii�i�i�i�
i
ii
i�i~	i�iJitikivieiyii�i�i<
i�ifi�iMiki�
ii�ioi�i�i�iwiv
ili�i]i�ii.i�
i�i�i�i/if	iqi$igi�iGi�i�ini�i>i6i=
i�i�i�i�i�iNi�	ixi�iei*	iihii�i�i$i�i�i�ioibi,ii�i�iiti�i�i	i�ii�
iVi�i�
iiii�i�i�iw
iiipiHi�iVi�iii<iZi�	i8iriwi�i&i�i�i�i/i�i�i�i�i>i�i>
iE	ixi�i&iei�iwi	i�i�i5i�i�i�
ii\i�i�i�iSiiii�i�i�i2i�i�iii+i'i�i%i�i�ix
iOi�i
iQ
i�i�iii�i�i_iHi�i�ii�igii�iy
i�i�
i0i&i+	ii�ii�i�il
i'i�i'izi�i	i	i�i_i�i�ii�i�i�i?
i�
i�i�	i�iz
i�im
i|i
ii	ig	i0i�i�i i�i*i�i�i
i`iwii�i
i#i�ici)i�i�iR
i�i�i�iTi�i�iriiVi�i�i�i_ii�ii�iri�i�i�
i`ixi�i�i
i�i�ifi�iin
i=
i*iAii�	i(i�ixi�iS
i�i{iT
i�i9ii�iMi�iri�ii;ii(ii%i�i[iaibii�iDi�i�ii-
i\	i�iii�io
iEimi)i�i!i�iici�i,	i1ii]	i�i�i�i>iIi�i�i�	iTii�i�i�i�i�iyiikizixi�iNi	i�i�i�i	i5i�i�i"i�iHi<idi�i
i�i�ih	i�	i�i
ip
i�i�i:iLi1i�i�i�
ii�i>
i�iq
i?iZiMiIi�iiBiK	iDi�i#i
i
iYi>i�i�iii`i�i�i�i�ii�i�i�ii�i�i�i i�i�ici�ii�i�i�i�iTi�iaii2iyi/i�i"iU
i�i�ibi�i�i�i/i�i�	i�ii
i{i
i�iji�i�i�i5i*i�i�i�i�iaixi�i�i�	iiFi�i�i�i7i�i�i�	i?i�iwi�iii�i�i+i�i8i�i�
iNi�
i�i�i,i�ini�i
ii�ioisi_i?i�i�	i�i�ii�	i�i�i?i0i�	i�	i�iyi3ifi�i=i�i�ilii�	iivi]i�i	i	i�i�izi�
i�iyijiiui�i�ipi�iji�ii	
iiizii�ir
ii�i�i�i�i�iiiFi�i'i�	i{
iniixiui$ii�i�iMi�i�i�ikiipi�
i^	iqi
i`i|i�i�	ii

i|
i�	i�
ii�i�	i
i�i�i�i�	iGii�i-i�iZi1iYi�i-	i	iei�i�i[iCi�i�i�iei�i.i-ii�i�i	i�i�i�
i�
i7	ibili	i�i�i�i{i�i.i	i�i�izi�i�
i�
i�i?
i�ii9ii�
i�ii�i}i�i�
iai�i�	i
iQi�	idi;iV
i�i/i^iDi�i?imi�
i�
i9iIi�
i�i�i
ii�i�
i{i}i i�ii�i�i�i&i�i~i�iXi�i�i}
i�
i�i9i�i�i:i�i"i\ii�i
i_	i�i8iWi~
i^i%iPisi�iwi�i�ii8	i�iLi�ii.
i�i�i�
i�iiNi�i�iPi�iSi�i�i�i:iRi'i0ibii�i�
i�i�i�i�izii�	iiiiiKi�i�i�i�
iri�iqi
i�i�iniL	ii�ii�i�i�i�i�i�iXi@
i�igiii�i�i4i�i:ii�i�iri�	i�iQi�
ii	i;i'i�i>i�ibimi�iwi�i�i�is
i�ii�iA
i�it
i9	ii�iii�	ioi^i�i�i2i�ici�ii�i�iiri�i�i�i!iitii1i{i�i�i�i�i�i�isii�i�i�i�i�ixiiviaipi�i�i
i�iLiOi�iiUi�i.ii�i)i.	i�iEi�	i"iiyii	i�i�i�i�i(i�
ii�iqiEi6i
i�
i2iui6i�i�i�i�i.i�ii	ii�iVi�iisi�
i�i�iGiGijiti�iWii�	i�i�i`i�i�i�iui�ii�
i�i{iQii�	iOiCi�i�i�
i�iJi�	i	i	i$i�i�i�i/	i�ii_ii�iij	iRi�i7ii�i/
ii3iDiu
i6iXi4i�i�iii�ii>i�iii0
i`i`	i
i�i�i�iUi�i i�
irii�i)i�i5i�iHi�i 
i�ii~iri�i�
i�i�i�i�i�	i�ii]i�i�ii�ii�ii@
i�i�i�
iai�ivi�i�i�i/i!i6i�i�i�i7iwi�i	i3ici8ixii�i�iB
i�i�iM	i�i�iF	i�igii�i�i(i�i
i:	ii�iHi�i�
ifi�i�i"i�
i~i�i�i�i�
iyiii�i�i i!iNi�
i4iA
i�idiei�i�izii�i�i�i�i�i�i0	i�i�ii�i�i�ii�i{i�i�i�i�
i�ifi(ili�iGi�	i�i�i^iB
imiFi|iiUi�i�i2iRi�i�i#i�i�
i�i�iFi�iiUi�i�i�i1i�iciki�iN	iSi�	i�i�i�
i�i�i$iO	i�iiYi�i�i�i
i�iGiii�iW
i	iC
i?i�ii�i~i�i�iUiFi�i�i�ii�i�i�i�
iC
i�	i�i�iiei
i�i�i�ii/iQi_iv
i;i�i�iPi)i�iGimi�	i�i�iGi,iIizi_i�	i�i	i9ini�i�
iAi�	i�
iX
i�i#iVi)i<i%i�i}i�i�iHiw
i5i�ipi.ii�i�imii�i�i�
i#ihi|ibi�i�i�i@i(i^izi�iiAi�
i ii"iigi�i|i�i�i�i�i�i6i�iXi�i�i,i�i�i		ii�i$i#iIik	i�ii�i�i:i	i�iQiioihiVi$i�
i�iti�i�i�iY
i,i�ii
i�iD
i�i�	i~i�
i�
i�i�i%i�ii i�i�i�ii�i�
i i7i/i
	i�i�i�i�	iEiVi�i�
iE
iui�i&i�i�ii�i�	i�ioi�i�iZi�iii�i�i	ii�i�i�i!i�ini8i�i'i�i�i�ii�ii�i�	i�iGi�iRi2i�ii:i�i,i�iiZ
ili�i(iXiP	i?i�ii�	ioi�ii�i�i�i�iWi*ii�i;i8i�i&i)i�i�i
ioi�ii�i�iHi_i�i�i0i�ix
i�i0i�i;	i�i
i�i�iXi�i	i�i�i1i�iZi*i%i�	i�ii|idi`ii�iSiji}i\ii�i�iG	i�ii�	ifiqi%iBi�i1
ipi�i"ii�i�i�i�i|i�i�ii�	i�il	i2
i�i�
i�
ii�i@ihi�i;i�i�ii	i�i	i�i�i&ii�i�i}i�i%i�i�iii?i�i�	i�ia	iy
ii�
i�i�i�	i�i=i1i�i<i�i{i#ii�i�i�i�
iAi�i
i�iti�i�i�	i�i>i
iKi3
i�i�i=i�ii\i�i�i'iAi+igi�ib	iKi�i�i�i�i
i�i
i�i4
i�i*i�im	i�	i�i�
ioiNii0i(iii�i$i4i i{ii�i�iQ	i�i�iUi�i�i�i,i`ii�	i�ii�
iji)i i�i-i6i�i�	iF
i2i)ii
i*i�iYiZiJi�iHi�iii.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]isi^i_i�i`iaibicidi?ieifi@igihi%iiijiikiki�	i5
iAi
i�iliminioiBipiqiri�
i1	iiCiDitii�
isi&iEiFiti�iuii
ii�
iviwixi�i�i�i'iGiyizi�	ii{iHii|i}i�i~i�
i(iIii)i�ii�
i�i�i!
i�i�iJi�i�iKi�i�iLi�i�i*i�iMi�i�i�i�i�i�i�i�iNii�i�i�i�
i�i�i+iOi,i�i-i�i.i�i�i
i�i�i�ii�iG
i�i�ii�i�i�i�ii�i�ii�i�iPii�i�i�i�i�i�i�	i/i�iQi�i�i�i�i�i�iRi�i�i�i�i�i
i�i�ii�i�iSi�iH
iTi�iUi�i�i�ii�i�i�i�i�i�
i�iVi
i�iWiXi�i�i�i�ii�i�iYi�i0i�i�iZi�i�i�i�i�i[i\i]i�i�i^i�i�i_i�i�i`i�iaibi?i�ici�idi�ii�iei�i1i�i�	ifiui�i�igi�i�i�
i�i2ii�i[
ii�i@i�i�i�iI
i�ihi"
i+iAi
i�i�iii,ijikiz
i-ili�i.ii/i�i�i�i�i�i�i�i�i3iimi�i�i�ii�iniD
i�i�i�iR	i�i�i�i�ioi�
ipiJ
i�ili
i4i2i�i�
i�ii�
ii�	iBi�
i�i�i�
i�iqiriK
i�i�i�
i�i�i�
ii�i5iE
i	
iIi�i

i6i�	i
ii�ivi�i�i�i7isi8i�	i
iL
iwi�i�i9i�itii�i�ii�i�i:i�iui�i�ii;i�i�i�i�i�i�
i�i i�iiiiii<iiiiiKi	i
i	ixiviii
ii!i=iii>iiiii�iii	iiii?iii@ii�iiiii�iiwi i�i!i"i"i�i#i$i0i%i&ii'i(i)i*i1i+i�i,i-i�
i.i<	i#i
i/i$i�i
i0ii1ixi2i3i�iyi4iyi5i%i&i�
i

izi6iCi7izi8i�iLiiBi'iAi
i�iiBi�i(i�i{i|i)i�iCi*i�i9i�
i�
ii:i;i<i�i�
i}i~i=iDi�i>ii?i@iAiBi�i�i�i�iCiDiDic	iiEiFi�
iiGi�iHiIiJiKiLiMiNi{iOi�i+iPi3iQi�i�
iRi�	iEiSiTiUiVi�i�iWiXiYi2iZi[i\i]i^i_i`i�i�iaibi�icidimiEiFieifi�igihi�iiijikiJiliminioipiqirisitiuiviwi�
iGixiyizi�i,i�i-i�i.i
iMi�i{i�i�i�i�i|i�iHi}i�i~i�i/iniIiii�i0iJi�iKi�i�i#
i�i�i�i�i3i�i�i�i�i�i�i�i�i�i�i�i�i�i�i1i�i�i�i�i2iM
i�i3i�i�i�iLi�i�i�i�i�i4i�i�i�i�
i�i�
iMi�i4i�i�i�i5i�i�
i�
i6i�i�i�i�i�i�i�i�i�i�i�i�
i�i�i�i7i�i�iNi�iOi�
iPi|i�i�iQi�i�i�	iKi�
i�i�i�
i�i8i�i�i}i�i
i�	i�ii�iiN
i9i�iLiRi�i:i�i;i�i�iFi�i{
i�iSi�i�i�i<i�i�i=i�i�i�i�i�
i�i�i�
i�i�iTi�i�i�i�i�i>i�iO
i5i�i�i�i~i�i?i�iii�i�
i�i�
i@i@i�i�i
i�i�i�iAi�iioi�iGi�i�i�i�iii�
i�i�i6i�	i�i�ii�i�i�
i�iUi�
i�ii�i�i�i�ii�i�i�i�i�i�
i�iBiCi�i7i
i�i�iVi�iNi�i�i�iDi�i�i�i�i�i�
i�iWi�i�i�iXi�
i�iEiFii�iYi�
i�i�i4i�i�iGi�i�iHin	i�	ipi�iZiS	i�i�i�i[i�iciIi�i�i�i�i�i�i
i�i�i8i�i�
i
i9i�i�iHi�ii�
i\i:i�i�ii�
i�ii�iJi�i�i�i�i
i�i]i�i�i�iiii�
i�i�ii�ii
i�iiii�iii	i
iii
i�i�iii�
iii�
i�i�iiiiIi�i�iiiiiiP
iiiii�i�iii�iKii�i�i�ii i!i^i"i#i�
i$i�
i%iLi&i'i(i)i*i+i�i,i-i�i�
i.iJi/i0iQ
i�i1iMi2i3i4i�	i�i5i6i7i�
i8i9i:i�i;i;iNiOi<i�
i=iPiQi>i?i@iAi�iBi�i�iCiDi<i�iRiEiFi�i�
iGiHiIiJiKi�
ii�
iSiLiMi�i�i�
iNiOiPiQiTi
iRiR
i�iSiTi�iUiVi�iS
i_iWiXiYiZi[ii\i�i]i^i_i`iaibiciidi�iei�i�ifi�
i�igihiiiUijikilimi=inioi�
i`ipi�iqiri~isii�itiuiviai�iVi�
i�iWiwi�ixiyi�izi�i�
i�i{i|i}i�
i~iMii�ibi�i�i�i�iXi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i
i�i�
i�i�ici�i�i�i�idi�i�i�i�ii�i i�i�
i�i�i�iYi�iZiei[i�i�i�iT
i�i+i�i�i�i�ii�i�i�i�i�i�i�i>i�i�i�i�i�i�i�i�
i�i�i�i\i�ifi�i�i]i�i�igi�i�i�i�ii�i�	i�i�iU
i
i�i�ii�i�
i^i�i�i_i�i�i�i�	i`i�iai�i�i�i i�i�i�i�i�i�ihiiiji�i�i�i�ibi�
i!i�i�i�i�i�ici�i[i�i�
i�i�i
i�i�i
i�i�
iV
ikidi�ili�i�i"i#i�i�i�i�i�i�i�iei?i�i�i�i�i�i�i�ifi�i5i�i�i�i�i�i�i�imi�i�i�i@inigi�i�i�i�i$i�i�ioi�iW
i�i�i�ipiqi�iri
i�i
i�
i�i�
i\
i�i�
i�i�i�i�i�ihi�i�i�i�i�i�isi�i�i�i�i�i�iti�i�i�i�
i�
i�i�i�i�i�i�iAiBi�i!i�
i�i�
ii�i�iiiii�ii
i�i�iii�iiCiiuiDi6iijii�	i	i
i�i�
i�ii
i�i�ii�ikiEi�	i
i�i�	iii�i�iKii�
iiiilii%imi�
iFiiiiii�iF
ivi�ini�iwiiLixioi�i�iyiii"i�iipiiii�i izi�iqi!i"i�
i#i�iri$i%iNi&i'i�i(i{i�i7i)i*i+i,isi-i�
i.i/i0i�ii�i1i
i�
i2i�i3i4iti�i�
i5ii�i�i6i�i&i�i�i�i7iqi'i�i�i8i9i�i:i|i;i<i=i>i?i@i�iAiBiCiDiEiFi�iGiHiIi�
i�
iJi�
iX
iKiLiMiNiOiPiQiRiSiTiUi�iViWi�iXiYi�iZi[i}i\i]i�
i�i^i�
i_i6
i�i
i`iai�iGiHi�i�
i�
i(i~i�i)i�i*iIi�
i�
i�ibiMiciui�i�	i�
i�i�idieifi=	i�ivigihi�iiijii}ikilimiwini�
ixioipiqiri�isi�
i�i�i�i�itiui�i+i�iviyi�iwi�	i�i,ixi�iyi�iOi�izi�i�iY
i�
i�i9izi{i�i$
i�i�i�i{i�ii�i7
i�
ii�iJiZ
ii�i�i�
i|i}i~i�
i8i�i|ii�i}i�i�i�i�i�i�i�i�i�i�	i�i�i�i�i�i�i�i~i�i�i�iKi�i�
i�i�i�i�i�i�iLi�i�i�i-i�i�	i�i�i�i�i�i�i�i�i�i�i�ii�ii�i�i�i�ii
i�i]
i�i�ii.i�i�ii�i�i�i�i�i�i�	i�i�i�i�iNi�ii�iPi
i�iri�i�i�i�i�i�i�iMi�i�i�i�i�i�i�i�i�i�	i�i�i�i�iOi�i�i�i�iNi�i�iiOii�i�i�i�i�i�
i�i�i	i�i�i�i�i
i�i�i�ii�i�
i 	ii�i�i[
i�i
ii�i�ii�i�i�i�iii�iPiii�i�i�i�ii�i�
i�i�i�i�ii�i/i�i�i�i�ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ii�i�i�ii�i�i�i�i�i�i�i�ii�i�i0i�iQi�i�i�i�i�i�i�i�isiii�i�iG
i1i�i�
i�i�ii�i�i�i�ii�ii�i�ii�iiRii�
iii�iii i 
i\
i�i�i|
i�ii�iii	i�i�i
iiiiPi2iQi�i�i
iii�i�i�i�ii�ii�	iii�iiiiii ii!i�i�i"ii�
iii#i�ii!i�
ii$ii i!i�i"i!
i#i$i�i%i&i%i�i&i'i	i'i(i(i)i)i#i*i+i�
i,i�
i*i-i�iSi+i.i�i2	i3iH	i�i�i/i0i1i2i3i�i4i,i�i}
i5i�
i-iH
iRi.i6i!	i7i/i8i9i:i0i1i�i�i�i;ii<i=i>i?i@iAiBi2i�i�iCiDiEi~
iFi3iGiQi�iHi�iIi�	iJi�i"
i�iKiLiMi4iNiOi�i#
iPiQiRiSi�i�iTiUi5iViWi�i�i6i7i�i4i8i"i�
i9iXiYiZi:i[i;i$
i�i�i�i\i�i�
i]i^i<i_i�i5i�i�i`iaibicidiei�i�ifiigi�i=i�i�ihi�i�i�iiiji�
ikilimi�i�i>ini#i6ioipi?iqi�irisiTitiui�i�i�ivi
i�i@iAi�iwi�i�ixi�iyizi{iUi|i}iBiCiDi3	iEi~iI
i�ii�i�i�i�i�i�i�i�iFi�i�i�i�i�i�i�
i�i�iGi�iHi�i�i�i�i�i�i�i�i�i�i�i�
i�i�i�i�i�i�
i�i�i�i�i�iIi�i�i�i�i�i�iJiKi�i�i�i�i�i�i�i�iLi�i�iMi�i�i�i�
i�
i�iNi�i�i�i�i�
i�iT	i�i�i�i�i�i�iOi�i�i�iPi�i�i�i�i�iQi�i�i�i�i7i�i8i�i9i�i�i�i�i�i�i:i�i�i�i�i�i�i�i�i�iRi�i�i�i;i�iSi�i�
i�iTi�i�i�i�iUi�
iVi�iWi�i�i�	iXi�iYiSi�iZi[i�i�	i�i�i�i�
i�i�i�i�iVi\iWi�iU	i�
i�i�i"	i�i�i�i�i�i�i]i�i�i�i�i^i�i�i�i�i�i�i�i_i�i�i�i`i$iai�i�i�ibi]
i�i�ici�idiAi�iei�i�i�iifi�i�i^
i�i<ii�i�i�i$i�i�i�i�i�i^
i_
igi�i�i�ii%i�i�i�i=i�i>i�i�i�i%i	i?i�i�i�i�iti�i�i�i@iXi`
i�i�i�i�i�ihi�i�i�i�i�iiii�iiYi%
i�ii&i�	iZiiiTiii�
i	ia
i�i
i�i9ii�iii�i�iRi�i�ii�ii�iui�i�ijiki�i
ili�ii�iiiiiimiAii:iiiii�ii�iBiiniii�i[ii
ii�iii i�i\i!ioi"ipi�i�i�
iJ
iqi]i�i�i#i$i%i&iCi�iri'i(i)i*isiti+i,i�i�i-i.i/i^iui0i�	i1i�i�i�i2iDio	ivi3i�i4iwi_
i5i6i�
i�i&i;i7i8i�i9i�ixi:i;i�i<i_i&
i`ii�
i�
i'
ii�i�i=i�iSi>i?iUi�	i�i�i�iyizi'i�i
i(
i�i�i�i�i@iEi�
iAi`
i�iVi�i{i�iWiXiBi(i|i}i�i~ii�i'iCiDi�i�iEiFi�iGiHiIiJi�iKib
i�i�iLiai�i�i�iFiMi�i�i�iNiOi�iPi�iQi�i�i�i�ii�iRiSi�
i�iTi�iUi)
i�iVii�	iWiXi�i)i�i8
iYiZi[i\i]i^iiGi�i�
i_i`i�i�iaibicidi�i�iei�ibi�i�i�ifigihiii�ijiki�i�i�ilimini�i�i�iYioipi�iqiZirisi�itiuiviwixiyi�izi�i{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ii�i�i�i�i�i<i�i�i�i�iTi�i�iHi�i�i�i�i�i�i�i�i�i�i�i�i�i�ivi�i�i�i�i�i�i�i�i�i�i�i�iIi�i�i�
i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i[i�i�i�iJi�i�i�
i�i�i�i�i�i�i�i�i�
i�i�i�i�i�iiUi
ici�i�i�
i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iKi�i�i�i�i�i�i�i�i�i�i�ic
i�i�i�i�i�i�i�i�i�iLi�i�i�i�i�i�i�id
ii�i�i9
i�i�ii�i�iVi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�
i�i�i�i�i�i�i�i�idii�
i�i�i�	i�i�ii1i�i�
i*i�iMi�ipi�i�i�i�i�i�i�i�i	i�i�i�i�i�i�i�i�i�i�i�i�i�i�i>	i�i�i�i	iii�i
iNi�i�ii�iOi*
i�i�i(ii�
iii�i�iii�i�
ii	i
ii+
ii
i=i�iiiPi�i�iiii�ii�i�i�i�i�iiii�i�i�ii�ii�i�i�i:i�ii�ii�i;i,
ii�i�i�ii�ii�i�i�i�i�i�i�i-
ii�ii�ii i�i�i�i!i"i#i�i$i%i&i'i�i�i(i)i*i�i+i�ie
i,i-i.i/iQi0i�i�i�i1i2i3i4i5i6i7i�i�i8i9i:i;iRiei<i=i>i?iK
i�i@i�i�iAiBi
iCiDiEiFiSiGiHiIiJiKi�iWiLiMiNiOiPiTiQi�i�iRiSi�i�iTi�iUiVi�iUiWiXiYiZi[i\i]i^i_i`iiai�i�i�ibi�i�icidi�ieifi�igiihiiif
i?	iji\i�i�i�ikili�i�i�imi.
i+inioipiqirisiti
i�iuivifi,i�i�iwixi�iyizi�i�i�i�ii{i|i�i}i~i�i�i�
ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iVi�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i i i i i i i i i i	 i
 i i i
 i i i i i i i i i i i i i i i i i i i  i! i" i# i$ i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO (uJIS_TYPICAL_DISTRIBUTION_RATIOuJIS_TABLE_SIZEuJISCharToFreqOrder(((uF/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/jisfreq.pyu<module>,ssite-packages/pip/_vendor/requests/packages/chardet/__pycache__/compat.cpython-33.pyc000064400000001213151733463730024702 0ustar00�
7�Re�c@sFddlZejdkr*eefZneefZdd�ZdS(iNicCs0tjdkr(t|t�r(t|�S|SdS(Nii(ii(usysuversion_infou
isinstanceubase_struord(ua((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/compat.pyuwrap_ords
uwrap_ord(ii(usysuversion_infoustruunicodeubase_strubytesuwrap_ord(((uE/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/compat.pyu<module>ssite-packages/pip/_vendor/requests/packages/chardet/__pycache__/gb2312prober.cpython-33.pyc000064400000003016151733463730025534 0ustar00�
7�Re�c@sZddlmZddlmZddlmZddlmZGdd�de�ZdS(i(uMultiByteCharSetProber(uCodingStateMachine(uGB2312DistributionAnalysis(u
GB2312SMModelcBs,|EeZdZdd�Zdd�ZdS(uGB2312ProbercCs6tj|�tt�|_t�|_|j�dS(N(uMultiByteCharSetProberu__init__uCodingStateMachineu
GB2312SMModelu
_mCodingSMuGB2312DistributionAnalysisu_mDistributionAnalyzerureset(uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/gb2312prober.pyu__init__"s
uGB2312Prober.__init__cCsdS(NuGB2312((uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/gb2312prober.pyuget_charset_name(suGB2312Prober.get_charset_nameN(u__name__u
__module__u__qualname__u__init__uget_charset_name(u
__locals__((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/gb2312prober.pyuGB2312Prober!suGB2312ProberN(	umbcharsetproberuMultiByteCharSetProberucodingstatemachineuCodingStateMachineuchardistributionuGB2312DistributionAnalysisumbcssmu
GB2312SMModeluGB2312Prober(((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/gb2312prober.pyu<module>ssite-packages/pip/_vendor/requests/packages/chardet/__pycache__/charsetgroupprober.cpython-33.pyc000064400000006464151733463730027354 0ustar00�
7�Re�c@sFddlmZddlZddlmZGdd�de�ZdS(i(u	constantsiN(u
CharSetProbercBsP|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS(uCharSetGroupProbercCs,tj|�d|_g|_d|_dS(Ni(u
CharSetProberu__init__u_mActiveNumu	_mProbersuNoneu_mBestGuessProber(uself((uQ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/charsetgroupprober.pyu__init__"s
		uCharSetGroupProber.__init__cCsbtj|�d|_x<|jD]1}|r |j�d|_|jd7_q q Wd|_dS(NiiT(u
CharSetProberuresetu_mActiveNumu	_mProbersuTrueuactiveuNoneu_mBestGuessProber(uselfuprober((uQ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/charsetgroupprober.pyureset(s
	
	uCharSetGroupProber.resetcCs0|js#|j�|js#dSn|jj�S(N(u_mBestGuessProberuget_confidenceuNoneuget_charset_name(uself((uQ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/charsetgroupprober.pyuget_charset_name2s
	
	u#CharSetGroupProber.get_charset_namecCs�x�|jD]�}|sq
n|js+q
n|j|�}|sFq
n|tjkrh||_|j�S|tjkr
d|_|j	d8_	|j	dkr�tj|_
|j�Sq
q
W|j�S(NiiF(u	_mProbersuactiveufeedu	constantsueFoundItu_mBestGuessProberu	get_stateueNotMeuFalseu_mActiveNumu_mState(uselfuaBufuproberust((uQ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/charsetgroupprober.pyufeed:s$		
	uCharSetGroupProber.feedcCs�|j�}|tjkrdS|tjkr2dSd}d|_x�|jD]�}|s]qKn|js�tjrKt	j
j|j�d�qKqKn|j
�}tjr�t	j
jd|j�|f�n||krK|}||_qKqKW|js�dS|S(Ng�G�z��?g{�G�z�?gu not active
u%s confidence = %s
(u	get_stateu	constantsueFoundItueNotMeuNoneu_mBestGuessProberu	_mProbersuactiveu_debugusysustderruwriteuget_charset_nameuget_confidence(uselfustubestConfuproberucf((uQ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/charsetgroupprober.pyuget_confidenceNs2					u!CharSetGroupProber.get_confidenceN(u__name__u
__module__u__qualname__u__init__uresetuget_charset_nameufeeduget_confidence(u
__locals__((uQ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/charsetgroupprober.pyuCharSetGroupProber!s

uCharSetGroupProber(uu	constantsusysu
charsetproberu
CharSetProberuCharSetGroupProber(((uQ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/charsetgroupprober.pyu<module>ssite-packages/pip/_vendor/requests/packages/chardet/__pycache__/big5freq.cpython-33.pyc000064400000336217151733463730025142 0ustar00�
7�Re�Bc�6@sգdZdZdddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d	d	d	d	d	d	d	d	d	d		d
	d	d	d
	d	d	d	d	d	d	d	d	d	d	d	d	d	d	d	d	d	d	d 	d!	d"	d#	d$	d%	d&	d'	d(	d)	d*	d+	d,	d-	d.	d/	d0	d1	d2	d3	d4	d5	d6	d7	d8	d9	d:	d;	d<	d=	d>	d?	d@	dA	dB	dC	dD	dE	dF	dG	dH	dI	dJ	dK	dL	dM	dN	dO	dP	dQ	dR	dS	dT	dU	dV	dW	dX	dY	dZ	d[	d\	d]	d^	d_	d`	da	db	dc	dd	de	df	dg	dh	di	dj	dk	dl	dm	dn	do	dp	dq	dr	ds	dt	du	dv	dw	dx	dy	dz	d{	d|	d}	d~	d	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d�	d
d
d
d
d
d
d
d
d
d	
d

d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d 
d!
d"
d#
d$
d%
d&
d'
d(
d)
d*
d+
d,
d-
d.
d/
d0
d1
d2
d3
d4
d5
d6
d7
d8
d9
d:
d;
d<
d=
d>
d?
d@
dA
dB
dC
dD
dE
dF
dG
dH
dI
dJ
dK
dL
dM
dN
dO
dP
dQ
dR
dS
dT
dU
dV
dW
dX
dY
dZ
d[
d\
d]
d^
d_
d`
da
db
dc
dd
de
df
dg
dh
di
dj
dk
dl
dm
dn
do
dp
dq
dr
ds
dt
du
dv
dw
dx
dy
dz
d{
d|
d}
d~
d
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�ddddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d
d
d
d
d
d
d
d
d
d	
d

d
d
d

d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d
d 
d!
d"
d#
d$
d%
d&
d'
d(
d)
d*
d+
d,
d-
d.
d/
d0
d1
d2
d3
d4
d5
d6
d7
d8
d9
d:
d;
d<
d=
d>
d?
d@
dA
dB
dC
dD
dE
dF
dG
dH
dI
dJ
dK
dL
dM
dN
dO
dP
dQ
dR
dS
dT
dU
dV
dW
dX
dY
dZ
d[
d\
d]
d^
d_
d`
da
db
dc
dd
de
df
dg
dh
di
dj
dk
dl
dm
dn
do
dp
dq
dr
ds
dt
du
dv
dw
dx
dy
dz
d{
d|
d}
d~
d
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
d�
dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�dddddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d d d d d d d d d d	 d
 d d d
 d d d d d d d d d d d d d d d d d d d  d! d" d# d$ d% d& d' d( d) d* d+ d, d- d. d/ d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d: d; d< d= d> d? d@ dA dB dC dD dE dF dG dH dI dJ dK dL dM dN dO dP dQ dR dS dT dU dV dW dX dY dZ d[ d\ d] d^ d_ d` da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz d{ d| d} d~ d d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d� d!d!d!d!d!d!d!d!d!d	!d
!d!d!d
!d!d!d!d!d!d!d!d!d!d!d!d!d!d!d!d!d!d!d !d!!d"!d#!d$!d%!d&!d'!d(!d)!d*!d+!d,!d-!d.!d/!d0!d1!d2!d3!d4!d5!d6!d7!d8!d9!d:!d;!d<!d=!d>!d?!d@!dA!dB!dC!dD!dE!dF!dG!dH!dI!dJ!dK!dL!dM!dN!dO!dP!dQ!dR!dS!dT!dU!dV!dW!dX!dY!dZ!d[!d\!d]!d^!d_!d`!da!db!dc!dd!de!df!dg!dh!di!dj!dk!dl!dm!dn!do!dp!dq!dr!ds!dt!du!dv!dw!dx!dy!dz!d{!d|!d}!d~!d!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d�!d"d"d"d"d"d"d"d"d"d	"d
"d"d"d
"d"d"d"d"d"d"d"d"d"d"d"d"d"d"d"d"d"d"d "d!"d""d#"d$"d%"d&"d'"d("d)"d*"d+"d,"d-"d."d/"d0"d1"d2"d3"d4"d5"d6"d7"d8"d9"d:"d;"d<"d="d>"d?"d@"dA"dB"dC"dD"dE"dF"dG"dH"dI"dJ"dK"dL"dM"dN"dO"dP"dQ"dR"dS"dT"dU"dV"dW"dX"dY"dZ"d["d\"d]"d^"d_"d`"da"db"dc"dd"de"df"dg"dh"di"dj"dk"dl"dm"dn"do"dp"dq"dr"ds"dt"du"dv"dw"dx"dy"dz"d{"d|"d}"d~"d"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d�"d#d#d#d#d#d#d#d#d#d	#d
#d#d#d
#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d #d!#d"#d##d$#d%#d&#d'#d(#d)#d*#d+#d,#d-#d.#d/#d0#d1#d2#d3#d4#d5#d6#d7#d8#d9#d:#d;#d<#d=#d>#d?#d@#dA#dB#dC#dD#dE#dF#dG#dH#dI#dJ#dK#dL#dM#dN#dO#dP#dQ#dR#dS#dT#dU#dV#dW#dX#dY#dZ#d[#d\#d]#d^#d_#d`#da#db#dc#dd#de#df#dg#dh#di#dj#dk#dl#dm#dn#do#dp#dq#dr#ds#dt#du#dv#dw#dx#dy#dz#d{#d|#d}#d~#d#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d�#d$d$d$d$d$d$d$d$d$d	$d
$d$d$d
$d$d$d$d$d$d$d$d$d$d$d$d$d$d$d$d$d$d$d $d!$d"$d#$d$$d%$d&$d'$d($d)$d*$d+$d,$d-$d.$d/$d0$d1$d2$d3$d4$d5$d6$d7$d8$d9$d:$d;$d<$d=$d>$d?$d@$dA$dB$dC$dD$dE$dF$dG$dH$dI$dJ$dK$dL$dM$dN$dO$dP$dQ$dR$dS$dT$dU$dV$dW$dX$dY$dZ$d[$d\$d]$d^$d_$d`$da$db$dc$dd$de$df$dg$dh$di$dj$dk$dl$dm$dn$do$dp$dq$dr$ds$dt$du$dv$dw$dx$dy$dz$d{$d|$d}$d~$d$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d�$d%d%d%d%d%d%d%d%d%d	%d
%d%d%d
%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d %d!%d"%d#%d$%d%%d&%d'%d(%d)%d*%d+%d,%d-%d.%d/%d0%d1%d2%d3%d4%d5%d6%d7%d8%d9%d:%d;%d<%d=%d>%d?%d@%dA%dB%dC%dD%dE%dF%dG%dH%dI%dJ%dK%dL%dM%dN%dO%dP%dQ%dR%dS%dT%dU%dV%dW%dX%dY%dZ%d[%d\%d]%d^%d_%d`%da%db%dc%dd%de%df%dg%dh%di%dj%dk%dl%dm%dn%do%dp%dq%dr%ds%dt%du%dv%dw%dx%dy%dz%d{%d|%d}%d~%d%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d�%d&d&d&d&d&d&d&d&d&d	&d
&d&d&d
&d&d&d&d&d&d&d&d&d&d&d&d&d&d&d&d&d&d&d &d!&d"&d#&d$&d%&d&&d'&d(&d)&d*&d+&d,&d-&d.&d/&d0&d1&d2&d3&d4&d5&d6&d7&d8&d9&d:&d;&d<&d=&d>&d?&d@&dA&dB&dC&dD&dE&dF&dG&dH&dI&dJ&dK&dL&dM&dN&dO&dP&dQ&dR&dS&dT&dU&dV&dW&dX&dY&dZ&d[&d\&d]&d^&d_&d`&da&db&dc&dd&de&df&dg&dh&di&dj&dk&dl&dm&dn&do&dp&dq&dr&ds&dt&du&dv&dw&dx&dy&dz&d{&d|&d}&d~&d&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d�&d'd'd'd'd'd'd'd'd'd	'd
'd'd'd
'd'd'd'd'd'd'd'd'd'd'd'd'd'd'd'd'd'd'd 'd!'d"'d#'d$'d%'d&'d''d('d)'d*'d+'d,'d-'d.'d/'d0'd1'd2'd3'd4'd5'd6'd7'd8'd9'd:'d;'d<'d='d>'d?'d@'dA'dB'dC'dD'dE'dF'dG'dH'dI'dJ'dK'dL'dM'dN'dO'dP'dQ'dR'dS'dT'dU'dV'dW'dX'dY'dZ'd['d\'d]'d^'d_'d`'da'db'dc'dd'de'df'dg'dh'di'dj'dk'dl'dm'dn'do'dp'dq'dr'ds'dt'du'dv'dw'dx'dy'dz'd{'d|'d}'d~'d'd�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d�'d(d(d(d(d(d(d(d(d(d	(d
(d(d(d
(d(d(d(d(d(d(d(d(d(d(d(d(d(d(d(d(d(d(d (d!(d"(d#(d$(d%(d&(d'(d((d)(d*(d+(d,(d-(d.(d/(d0(d1(d2(d3(d4(d5(d6(d7(d8(d9(d:(d;(d<(d=(d>(d?(d@(dA(dB(dC(dD(dE(dF(dG(dH(dI(dJ(dK(dL(dM(dN(dO(dP(dQ(dR(dS(dT(dU(dV(dW(dX(dY(dZ(d[(d\(d](d^(d_(d`(da(db(dc(dd(de(df(dg(dh(di(dj(dk(dl(dm(dn(do(dp(dq(dr(ds(dt(du(dv(dw(dx(dy(dz(d{(d|(d}(d~(d(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d�(d)d)d)d)d)d)d)d)d)d	)d
)d)d)d
)d)d)d)d)d)d)d)d)d)d)d)d)d)d)d)d)d)d)d )d!)d")d#)d$)d%)d&)d')d()d))d*)d+)d,)d-)d.)d/)d0)d1)d2)d3)d4)d5)d6)d7)d8)d9)d:)d;)d<)d=)d>)d?)d@)dA)dB)dC)dD)dE)dF)dG)dH)dI)dJ)dK)dL)dM)dN)dO)dP)dQ)dR)dS)dT)dU)dV)dW)dX)dY)dZ)d[)d\)d])d^)d_)d`)da)db)dc)dd)de)df)dg)dh)di)dj)dk)dl)dm)dn)do)dp)dq)dr)ds)dt)du)dv)dw)dx)dy)dz)d{)d|)d})d~)d)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d�)d*d*d*d*d*d*d*d*d*d	*d
*d*d*d
*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d*d *d!*d"*d#*d$*d%*d&*d'*d(*d)*d**d+*d,*d-*d.*d/*d0*d1*d2*d3*d4*d5*d6*d7*d8*d9*d:*d;*d<*d=*d>*d?*d@*dA*dB*dC*dD*dE*dF*dG*dH*dI*dJ*dK*dL*dM*dN*dO*dP*dQ*dR*dS*dT*dU*dV*dW*dX*dY*dZ*d[*d\*d]*d^*d_*d`*da*db*dc*dd*de*df*dg*dh*di*dj*dk*dl*dm*dn*do*dp*dq*dr*ds*dt*du*dv*dw*dx*dy*dz*d{*d|*d}*d~*d*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d�*d+d+d+d+d+d+d+d+d+d	+d
+d+d+d
+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d +d!+d"+d#+d$+d%+d&+d'+d(+d)+d*+d++d,+d-+d.+d/+d0+d1+d2+d3+d4+d5+d6+d7+d8+d9+d:+d;+d<+d=+d>+d?+d@+dA+dB+dC+dD+dE+dF+dG+dH+dI+dJ+dK+dL+dM+dN+dO+dP+dQ+dR+dS+dT+dU+dV+dW+dX+dY+dZ+d[+d\+d]+d^+d_+d`+da+db+dc+dd+de+df+dg+dh+di+dj+dk+dl+dm+dn+do+dp+dq+dr+ds+dt+du+dv+dw+dx+dy+dz+d{+d|+d}+d~+d+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d�+d,d,d,d,d,d,d,d,d,d	,d
,d,d,d
,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d ,d!,d",d#,d$,d%,d&,d',d(,d),d*,d+,d,,d-,d.,d/,d0,d1,d2,d3,d4,d5,d6,d7,d8,d9,d:,d;,d<,d=,d>,d?,d@,dA,dB,dC,dD,dE,dF,dG,dH,dI,dJ,dK,dL,dM,dN,dO,dP,dQ,dR,dS,dT,dU,dV,dW,dX,dY,dZ,d[,d\,d],d^,d_,d`,da,db,dc,dd,de,df,dg,dh,di,dj,dk,dl,dm,dn,do,dp,dq,dr,ds,dt,du,dv,dw,dx,dy,dz,d{,d|,d},d~,d,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d�,d-d-d-d-d-d-d-d-d-d	-d
-d-d-d
-d-d-d-d-d-d-d-d-d-d-d-d-d-d-d-d-d-d-d -d!-d"-d#-d$-d%-d&-d'-d(-d)-d*-d+-d,-d--d.-d/-d0-d1-d2-d3-d4-d5-d6-d7-d8-d9-d:-d;-d<-d=-d>-d?-d@-dA-dB-dC-dD-dE-dF-dG-dH-dI-dJ-dK-dL-dM-dN-dO-dP-dQ-dR-dS-dT-dU-dV-dW-dX-dY-dZ-d[-d\-d]-d^-d_-d`-da-db-dc-dd-de-df-dg-dh-di-dj-dk-dl-dm-dn-do-dp-dq-dr-ds-dt-du-dv-dw-dx-dy-dz-d{-d|-d}-d~-d-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d�-d.d.d.d.d.d.d.d.d.d	.d
.d.d.d
.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d .d!.d".d#.d$.d%.d&.d'.d(.d).d*.d+.d,.d-.d..d/.d0.d1.d2.d3.d4.d5.d6.d7.d8.d9.d:.d;.d<.d=.d>.d?.d@.dA.dB.dC.dD.dE.dF.dG.dH.dI.dJ.dK.dL.dM.dN.dO.dP.dQ.dR.dS.dT.dU.dV.dW.dX.dY.dZ.d[.d\.d].d^.d_.d`.da.db.dc.dd.de.df.dg.dh.di.dj.dk.dl.dm.dn.do.dp.dq.dr.ds.dt.du.dv.dw.dx.dy.dz.d{.d|.d}.d~.d.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d�.d/d/d/d/d/d/d/d/d/d	/d
/d/d/d
/d/d/d/d/d/d/d/d/d/d/d/d/d/d/d/d/d/d/d /d!/d"/d#/d$/d%/d&/d'/d(/d)/d*/d+/d,/d-/d./d//d0/d1/d2/d3/d4/d5/d6/d7/d8/d9/d:/d;/d</d=/d>/d?/d@/dA/dB/dC/dD/dE/dF/dG/dH/dI/dJ/dK/dL/dM/dN/dO/dP/dQ/dR/dS/dT/dU/dV/dW/dX/dY/dZ/d[/d\/d]/d^/d_/d`/da/db/dc/dd/de/df/dg/dh/di/dj/dk/dl/dm/dn/do/dp/dq/dr/ds/dt/du/dv/dw/dx/dy/dz/d{/d|/d}/d~/d/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d�/d0d0d0d0d0d0d0d0d0d	0d
0d0d0d
0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d 0d!0d"0d#0d$0d%0d&0d'0d(0d)0d*0d+0d,0d-0d.0d/0d00d10d20d30d40d50d60d70d80d90d:0d;0d<0d=0d>0d?0d@0dA0dB0dC0dD0dE0dF0dG0dH0dI0dJ0dK0dL0dM0dN0dO0dP0dQ0dR0dS0dT0dU0dV0dW0dX0dY0dZ0d[0d\0d]0d^0d_0d`0da0db0dc0dd0de0df0dg0dh0di0dj0dk0dl0dm0dn0do0dp0dq0dr0ds0dt0du0dv0dw0dx0dy0dz0d{0d|0d}0d~0d0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d�0d1d1d1d1d1d1d1d1d1d	1d
1d1d1d
1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d 1d!1d"1d#1d$1d%1d&1d'1d(1d)1d*1d+1d,1d-1d.1d/1d01d11d21d31d41d51d61d71d81d91d:1d;1d<1d=1d>1d?1d@1dA1dB1dC1dD1dE1dF1dG1dH1dI1dJ1dK1dL1dM1dN1dO1dP1dQ1dR1dS1dT1dU1dV1dW1dX1dY1dZ1d[1d\1d]1d^1d_1d`1da1db1dc1dd1de1df1dg1dh1di1dj1dk1dl1dm1dn1do1dp1dq1dr1ds1dt1du1dv1dw1dx1dy1dz1d{1d|1d}1d~1d1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d�1d2d2d2d2d2d2d2d2d2d	2d
2d2d2d
2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d 2d!2d"2d#2d$2d%2d&2d'2d(2d)2d*2d+2d,2d-2d.2d/2d02d12d22d32d42d52d62d72d82d92d:2d;2d<2d=2d>2d?2d@2dA2dB2dC2dD2dE2dF2dG2dH2dI2dJ2dK2dL2dM2dN2dO2dP2dQ2dR2dS2dT2dU2dV2dW2dX2dY2dZ2d[2d\2d]2d^2d_2d`2da2db2dc2dd2de2df2dg2dh2di2dj2dk2dl2dm2dn2do2dp2dq2dr2ds2dt2du2dv2dw2dx2dy2dz2d{2d|2d}2d~2d2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d�2d3d3d3d3d3d3d3d3d3d	3d
3d3d3d
3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d 3d!3d"3d#3d$3d%3d&3d'3d(3d)3d*3d+3d,3d-3d.3d/3d03d13d23d33d43d53d63d73d83d93d:3d;3d<3d=3d>3d?3d@3dA3dB3dC3dD3dE3dF3dG3dH3dI3dJ3dK3dL3dM3dN3dO3dP3dQ3dR3dS3dT3dU3dV3dW3dX3dY3dZ3d[3d\3d]3d^3d_3d`3da3db3dc3dd3de3df3dg3dh3di3dj3dk3dl3dm3dn3do3dp3dq3dr3ds3dt3du3dv3dw3dx3dy3dz3d{3d|3d}3d~3d3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d�3d4d4d4d4d4d4d4d4d4d	4d
4d4d4d
4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d 4d!4d"4d#4d$4d%4d&4d'4d(4d)4d*4d+4d,4d-4d.4d/4d04d14d24d34d44d54d64d74d84d94d:4d;4d<4d=4d>4d?4d@4dA4dB4dC4dD4dE4dF4dG4dH4dI4dJ4dK4dL4dM4dN4dO4dP4dQ4dR4dS4dT4dU4dV4dW4dX4dY4dZ4d[4d\4d]4d^4d_4d`4da4db4dc4dd4de4df4dg4dh4di4dj4dk4dl4dm4dn4do4dp4dq4dr4ds4dt4du4dv4dw4dx4dy4dz4d{4d|4d}4d~4d4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d�4d5d5d5d5d5d5d5d5d5d	5d
5d5d5d
5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d 5d!5d"5d#5d$5d%5d&5d'5d(5d)5d*5d+5d,5d-5d.5d/5d05d15d25d35d45d55d65d75d85d95d:5d;5d<5d=5d>5d?5d@5dA5dB5dC5dD5dE5dF5dG5dH5dI5dJ5dK5dL5dM5dN5dO5dP5dQ5dR5dS5dT5dU5dV5dW5dX5dY5dZ5d[5d\5d]5d^5d_5d`5da5db5dc5dd5de5df5dg5dh5di5dj5dk5dl5dm5dn5do5dp5dq5dr5ds5dt5du5dv5dw5dx5dy5dz5d{5d|5d}5d~5d5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d�5d6d6d6d6d6d6d6d6d6d	6d
6d6d6d
6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d 6d!6d"6d#6d$6d%6d&6d'6d(6d)6d*6d+6d,6d-6d.6d/6d06d16d26d36d46d56d66d76d86d96d:6d;6d<6d=6d>6d?6d@6dA6dB6dC6dD6dE6dF6dG6dH6dI6dJ6dK6dL6dM6dN6dO6dP6dQ6dR6dS6dT6dU6dV6dW6dX6dY6dZ6d[6d\6d]6d^6d_6d`6da6db6dc6dd6de6df6dg6dh6di6dj6dk6dl6dm6dn6do6dp6dq6dr6ds6dt6du6dv6dw6dx6dy6dz6d{6d|6d}6d~6d6d�6d�6d�6d�6d�6d�6d�6d�6d�6d�6d�6d�6d�6d�6d�6d�6d�6d�6d�6d�6d�6d�6f�6Zd�6S(�6g�?iii	i�i�i�i�i	iRii�i�i�iai�iini�i!i�iiLi,iBii�i�i�i�i�ii{
i]
i�i�i
iji�i�i.iNiii�ii�i:i�i�i�i?i�i�i=iNiKi�i�ikiq	i�i�i�
ii�iibii
i�i�ii�
ioi2i�iii�i�ici8i�i�ii�i�i�i�i�i{i|i�i�i"i�
i�i@i\i�i�	i�i�i�i�i�i�iFi�i|
iQiHi�i�iPivi�i�i�ii�iDi^
i�i�iFi}
i�iEi�iOi�i0i�isi�i4i<i2i�i�i&iMi�i�i~
i�i�iGi�ii[i�i�i?iiiaiiK	i*i�igi�	iZi�
i:i�ii�iKi�	ii�	i�ii�i�i�i`ilii�i�ii
	i iqi�i~i�i�i
i�	ii�i�i�ici�iuii�i*ii�i	i�
i�i~imi�i�i�iei�iGi^i�ini�iiUiCi�iCi�i�i�i�ii�i ijioi/ii�iPi7	i[i�i�i�
i?i�i�i�ioiSi(i�ii�ipi]i�i6ijii@iii�iii8ii+i3i[i�i�i\i�i�i�i�i�i]	iAi�i�i�i1i�i�iHi�
i�
idi�i�i+i�i2i�i�i�i�
iOiL	i�iifi1i�i�i�i�i�i�ii3i9i�ili,i�i	ii�ii�i�i�i�ieiz
iQiMi&i�iXi�i�i�i�i�i
i�i�i�ikipi�iMi�i�i�i%ii�i�i�i�i�i'i�	i�i\i�ii7i�iJi�i!i�i�ii�i�iNi�iBiPi_
iqii�i�
i�i�i�
i�
i�i i�ii iIi�i8	i�i�
ii{
ii�i
i�i�i�imi�i�ifi�i�ixi�i�i�i�i�
i�i
i�igi�i�i
ii�i�i�ii�i�i&i�i'i�ii�i�i�i.i�i�ii�iM	i�i�i�i�i$i#i�iDihiAi�	i�i�iri�i�iUiGii�i�i
i�
iQiSiii�i�idii0iFi�i�iCi�i�ii�i i�iJii�iUii�i�iN	i�
i�i�i<i�i�
i:iA
i�
i�i	i 	i9i�i}ii�	i�i�iWiPi�
ii)iDii�i�i4i�
i�	i)i�i�ir	i�isi�i�itii9	i�i�i�is	i*ii�i�i�i�i�i]i�i�i�i�i�	iDiji(
i
i�i�i�
i�iui5iYiji	ili�iuii�i�
i�i�i`
i
i=i�i�i�i�i�i�i�i5i�i!i�i�iTiEixi�i�ieii�	i�iO	iPi�i|
i6iAi�
i/iki�i�
iili!i	i�iBi�i`i�i
i�i�iAi�iiii�i�
ivi�	i�i�iwi�i�i�iMi�
i�i�i�ii�ia
i�i�i�
i}
i�ixi,i}i�i�iB
i�i�i�i�i�i�i�i�iFikimi�	i�i�
i�i	i�i�
i�ibi�i)
i^iP	i
i,i�i�i�i7i5i~
iyi|i�izi�ii�i�
iC
i{iii�i�i�i�i�i�i�i1i�ibii�	i�
i�i�it	i�i�
i�i_i�i�i�i�i�ii�
i�
ib
i�i�i�i5iDi�i�ili�i|i[i*
i�i�i�
i�i%iiGi^	i�ili�i�i�
i�i`i�i�i�ipi�i�inicigimii�i'i2i�ii�i{i�i�i�i�i�i�iD
i�ifi	i�i|i:	i�i�ii�i�
i�i�
i
i�i�i�ini�i�i�i�i;i�iIiYi}i�i�
iXi"i�i
i�i�i�i�i�i�i-i�ili�i�i�i�i�ii�i�iEi�i~i�i>i]i�i,i�i�i�iviLiBiii&i�i�ii�i�i�iGi�i�iiBi�i�
i+
i�ii�i�i�i�i�i�	i iaii�i�i
iai�i}iE
i�iDi�i=i�i0ii�i�
i6i�ii�ivi!i�i�i�i�i�i�i�i�i9iHii�i�i�i�
iFi�i�i�i�i�i"i�iHi�i�i�i
ioii�iRi*i�i.i�i�i�i�iiIi3ii,
i�i*iSii�i�iXi�i�i/iibipi�i�	ii�i�i�i�i�iRiii�i7i�i2i�i�	i�i�i�i�i�i�i_	i�ibii�
i�i�i�i�	i�i�i�ii�i�i`	iOi�i�	i�i`i7i�
i�
i�i�i�i�i�iia	i�i�i�i�i�i�igi�i�i�i�i
i_i�i~i�i�i�i�i�i�
iai�i�
ib	i�i�i�i�i�ii�i�	i;i�i�	i-i
i�iQ	i�i�i�iqii�i�i�i`i�i#i#i�ii�iiri�
isii�i�iditi�
i�ic
i�iikiwi�i�i�i�i�i�i�ii�i�igi�iQi�iUi
i�i�i�i�iiCiSi�ic	i�i�i5i�i�iBi�i_i�iciNi�i�iYi�i�i�i�
i�iLidi�
i�
i	iKi�i8iaiGi�i�i
i�i�iisi6i�	iti;	iNi�i�ii	i4i�i:i�i\iqi�i�i�i.i�iiiui�
i�i�i�i�i�
i�i
iri�i�i�
i�
i�ici�i�i�i@i�i�i�ii�i�ii�i/i9i�ii�ii�i�i�i�i�
i<	id
ii�i�i8iviiCi�ii
i�imi�i�
i�i�i�i�i�iZi�i�i�i�iwi�	i{i�i�i�i�i$i�iiMidi0iri�i�i�igiiVi�i�ii�i:iZi�i�i{i$iei0i�ii$i�i�
i�
i�i5i�i[i�ivi�iici�iViR	i$i;ii�iifiii�idi�i�iWie
ii�i�iii�i�
iiJi�ii�iiui�i	i�i
i�ii�
iKi�i2i�iLi i.i�i�i2i�ii�i�ii�i�i%ii�i�ii
ii�ii�iii�i
i�
ixi�iMi�i}ii�iTii�i�id	i�
ii�i�i�i`iii�i�i�	i3iii;i�iiiiyiYiLi�i�i�	i�	iiii�iUi\i�i�ii�i�iViNi�ii�
i�i�i 
i�i"ixi%ii;i=	i i�i�i2iEi�i!i�i�i�i^i�i"iwi�
i#i�i�i�i�i�i$i<iQi�i�iri%i�i]i�i&i�i<i'ii3i6iBi�i�i(i�i�i�i�i�ii�igi�
i�
i)i�
i	i*i+i!	iii�i�i:i�i7i�i^i�ii�ii(i�
i,i+iiixi-i�i/ihi=i.i�i�i�i�iVii�iihi�i�i/ii�i�i�i<i�i�i;i0i�i�i�i
i�	i1izi�ii�i5i6i�
i_i)i2i3i�i4iyi"	ii�i�
i�i^i5i�i�i?i%i+if
i�i6i_iWi�i�i�
i7i>ii�
ig
i#	i�iu	i8i�i�i9ih
iF
i�iVi{i�iOi�iIiwi~i�
i^ii�i:i�i�i�i�i�i�i�i�	i;iei1i�i�i�i�i�i�i�i�i�i�iiiPi<i=i�i>i�
i�i(i`iRi?iYi�iIi�	i�i�i�i7i�i�
i?i�i�i�
i@i�ioi�iqiYinii�ilii�i�i�i�i�
ii
iEiPiVi�i!
i�i�i�i�i�ini�iAi�i|i�
ii
iBi�i�i�i�ii-
i�	iOi�
i�iCi�iDiWiTiTii�i�i�i�
i}iEi�i&i�
i�i�i�i�ii�i�
i�i�i~iG
i�
i�ii$	iWi�ii�ioi�i
iFiiGi�ii"
i�i�i�i#
i�i�iDi-iQi�iHiei�	iiiIi�i�iiJizi
i�iKiiiLi�i$
i�
i�i�i�i�iH
i�i�i�ii�i�iMi:i�	ii�iNi�iI
i�i�i�iHi�i�ii�iOi�i�i�	iPiQi�i�ikiRiRi�i�i�i�
i
i�i�i�i�i�i�ii�iSiTi�i�i�i%
i�i�i�i�i�i&
iSiUii�iS	i�iCi�i�i�iVi~i�i!iXi�i�i�i�i�i,i�ii�i�iOi�i|i�ii�iPi�ie	i�i�i�i�ii�i�i�i�i�i�i�i�iTiii�i�iWi�i�iiXi�iYi�iRi�
iviii�
ii�i=ii�iZi�iUi�i�i[i�i�i�iVi%	i\i�i�i]i�i�i^i8iT	i.
i'
i_i�ivi�i�i�i�iwitii`iaibi>	i�i�i"i{i�i�i�	i�ici�idi9i�iii�i[i9iiidihi
iei�i�i�iJ
i!i�i�ifi�i�ii�i�i�iTigi�ii�i%i�iWiMihii�iii�i�i�i�ii�i�i�i�i(
ij
i�iyi7imi�ijiki�i?	iWi"i�i�i�iiBi�ili|i�i�i)
izi�i�i�
i�i�i�i�ii�i�imi�iniuiv	iwi�i	i*
ii�ioipi�iiqi7i.iri�i�i
iii�
i�ifi�i�i�isi&	iyii�i i�i�i�ii�i�
ii>i�i�i�i�iiYi�i�iti�iui/
i+
i�ivi�i�i�i@iwii�	i�	i�i�i3i�i�i�i,
ixi�i6i9i�
i	ii�i6i�i�ii!ii�iyi�iQi:ici
i�ii-
ioi�i�iFiXi�
i�i�ifi�iizi�
i�i�i�i�i�i{i/i�i�i'	i�	ibii�i`i�i�iiui	ivi�i�ii�i�
i
i
i�i�i�i�i0iEi�iSi�i8i[i|i}iGi�ii�i!i~ii�iFiU	i�i�
iii�ieisi�i�i�iw	ii�i�i"iiai	iZi&i�i�i�i�i�	i
i�i�i�iAi�i�i�
iiiii�i�i�i�i�i�ii�i
ioi�ii�ii�
i
i�i	i�iAiiJi0i�ix	i�
i�i�i�iYi�i�i�i�i�i�	i�ii�iZi8ioii�iQi�i�i�i�i�
i�i�iaiQi�i�ipi;ii�iPi�ibi�i�i�i�ii�i�i
i�i�i�i�	i�i�i�i�i�i�i�i�i�i�i�i]ii�ii�i�
i�i�ii�i�i'i�ii.
i�i�i
i�i�ii�i�iLi�i�i�i�ii�	i�i/
i�ii�i�iBi0
i[ii8i�i�i�i�i�	i�ii/i3i�i�i�ii�
ii�ii0i�ini�i�i�ii�i�i�ii�	i�i�i�i�ii�iii�i4i�ii�ii<i�	ii
i�i�iYi�	i�ii�iCi�i�ii�
i�i�i�i�i}i1ii�
i�i�i�iKii�i�i0
iFi�i�i�i�
ii#i�i\i�i�i�ifii>i�
i�ii�
i�i�i�i�i�ii�
i�i�i�i�iji�i�ii�ii-ipi9i@	i6iyii�i�ii
i1
i�i�ii�i�ii�iVi�i�i�i�i4i�i�i�iKi1
i�i�
iDi�i�i�i�ii�i#i�i�i�i�i2
ii�ii�	iZiHipi�i�igi�i�ii�
iqiri
i�i�i�i�i�i�iiK
iV	i�
i\i,i
i�i�i�ii�i]i�i�iuii�
iii�i�i�i�ii�iZi�i�i�
iii�iiji�i�i0ihihi�i�i�i�i�iEii�i	
i�ii�	i�i�i�i�i�i�i�ii�i�i�
iii�i2
i�i�i�i�i�iiMi�iwi�i�i�iy	i?i�i�i�i

itimi(	i�	i�i+i�i�i�i�i�i�i�iiii�
i�i�	i�i�i�i
i�iL
i�i�i)	i�
ii�
i�iif	i�i�	i�iii�i�i�iRi"iA	i3
i�i�i-i1i�i$i�
i(i�i]i�i#i�i$i�
ii�i�i i*	i�i�i�i�i
i�i�i�
i=ik
i�i!i�i�
i�i�i�i�i�
i�i�i�i_i�i�i�i�i^i2ii�
i�i�i�i9i�i�i�i�i�i�i4
i�i�i�i
i�ibii�i�ii�i�ii�i5i�i�i�i�i"i	i�
ii�i�i�i�i4iIii�i#i�i�i�i�iii�iiji�i�ii$iki�ii�
i�i\i�
igi�iEi5
i�i�i�i�i�i�i�i�i�
i�i�i6
i�i�ii	i�i%ii�i�i�i�i[i�i�i�i�i�ii�i&iei�i�i�i�i�ioi�i�ili	i}i�i�i�izi�i+	i�i�i�ii�i�ini-i�i�
i'iiii
i�i�i�i(i�i�i�	i�i�ii�i�i�ii�
i�i�i�i�iBiiiqi�i�i�i<i�i*iji)i"i*i�i>i)i7
i�i+i�i�i�ii�i�i�izi�i,i�i�i�iiM
i)iri�i�i-i	i�i�i�i�i�i�iTi�ipi�i�i#i#i�i�ii�i�i�i�i�
i�ii�i	i�	i�i�i�iSi�i.i8
i�i�i�i�iz	i9
i=i�i�i�imi�iSiii�i�i�ixi�i�i/i�i�iqi�ii3i�i5i�i:
i�i�
i�i�i�i�i�i�i�i
i;
i�i0i1i�iii�i�ini�i_i�i]ii�ini�i�i�i�i
i%i�i�i�i�i�i`i�i�i�i�iziTisi2i3
i�i
i{	i�i5i�i�ii�
ig	i�i�iki�i�i�ii�
i�i�i3i4i�i�i�ici i�i�i
i�
i�iiai:i1i�i�i�i!iAihi ioi�
i6i"i�i�iil
i-i�i
iai5ii�	i�i
i�i�i#i!i�i$i�i�
i�i4
ifi�i	i%i&i�
iN
i
i�iWi�iii�ii�
i'i�i$i�ii<
i�iNiiiW	iki�iO
i�i�iii�i�iX	i,	ii6i&iti�iP
ii�i7i�
i�i�
i-	ijii	i�
i�iCi[ipi�i�i'i8i
ibi�im
ii�
i�i{i(i�i�	i�i�	i9i�
i�	ii:i
i�
i^i�i�i�iB	i;ii�iii�i�
i�i�i
i�i	i�i)i<i=i�
ii�
i�i>iiiii�
i=i�i�ii�ii�i�i�i�i�in
i�iHiDi�
i?i�iUiWi�
i=
i�i:i�i�	iNi�iKiEi@i4ici�
i�i>
i�iQ
i
iAii�ihi�ii�
i�
i(i]i�i�i�iBi*i�i�ili�iCiDi�iEih	i�ii�i�i�i�iXiiii�i+i�i�i�i+iJi�i�iUi�ii
i�imi iEiiiiFiiGi
iki�	ini�i�
idii�iii�i�i�iFi!i i�iri@i�iHi"iCiGi�i�i�i
i�i^i�
i�i�i8iti)i;i�i?
i!i�ioiIi�i"i#i#i$i�iJi�	i%i�
i&iriKi'i5
i(i)i�io
i@
i}iA
i�i,i�i*i4i1i+i�i�i�i�i�i"i�i,ii�
iC	i�iuiriD	i-i�
i-i�iLivi{i�i|	iMi.i.iNiY	i6
iii�i/i0i/i�i�i1i$i�i2i%iGiRiB
i�i_i�i�iC
i�i�iD
i�i3i�i�i�i�i�i�ii.	i�i�	i4i@iwi�i5i�i6i7i�ii	i�i&i0i�i8i	i&i�	i*i�i+iGiOiuii#i�
i1iPiRi�iQi�i�i�i)i�i�i=i9i�ili�i�i�i�iE
iSi�iki�i\i�	i�i�i�
iyi:i�i;i<iF
i%i=i�iRiii>idi'i,i?iei$i�i2i3i-i�i�i4ii(iSi@iAiBi�i.iTi�iOi
i�i�i�i�i�i�
i&ii�i�i�
i<i�
i�ii�iCiiDi�i�iUi�ip
iG
iei�
i�i�i�i�
iEi;iViFi'iGi)i
i�i}	iHi*i�iWi�i�iIi�iTi�i�
i�
i�i�i�i�ii	i�iJi.igi~i�iUi�ij	i	iiiXi�i�i8i�i*i�	i�i�iKi~	i�i�i�iLiiHi�
i�ii%i�i+ifi�i�i�i�iti�iMiNi�i�i�ii	i�i 
i�i�ik	iYiiYi�i�i�i*i/i�iOiR
iZiH
i�i#iIi�
i�	i�i�i5iS
i]iE	i[i\i
isiI
i+iPiQi,i�	i�
iRi�iSiTi�i,i�iUi]iVi�i�iLi-i!i�iT
i\i4iWi�iiXiYiZi�i[i>iwi�i�i�i�i+i^iiJ
i�i_i$i�i\i�i�iili.i]i`i�i^i_iq
i%i�i`iaiii�i�
i6igiU
ibicidiai�
iqixi�
iei
ibiyi�ifihigihi�i�i'iiii�i�i	ijiri�i
i0i	i=i�ibi|i�i�i�i�i�i�i	iihiki�
ilii�i�
iai�icimi�ii�ini�
i�iui�i�idiei�isiK
i/ioi7i�i&i�	iJi8ipiqiiijifi�i�	igi	i�i�i(i�i`irisi�i�iii<iFikifi�i�i�i�i]i�i�iIiti>i�iui�ivi�i�
i�i�i�
i0i�i-i�iwiL
i�i�	i�i�i�i�iGiai�i
iti�i�i�
iSiKixiiyizi�i�iV
i�i�iOi�i1i�i�
i{i�
i�i�iF	iyi�i9iZ	i�i|i}i~iFi�i�i�i�
i�	i:i�iiii2i�i�iipi�i;iG	i�i�i	ihi�i�i�ii7
i�i�i�iiqii�iM
i�iii�iii�i�i�i�
i�i�i�
i(i8
i�iN
i	ii3i�	iiO
i<ii�i�iTiiW
i�	i�i�i�i�i(i�i�i�i1i�i�i�i�i�i�i�iuiZii�
i�	ici�ijiP
ipi�i�i
ii�i�i�iviiiji�i�
i�i�i�i�iQ
iKii�i�	i'i�i�i�ii�i9
ii�i
i�	izi�i�	i
i�i�iki�i�i�i�i�i�i2i	i�ilii�i>i=iCi'i�i�i>i
iiZi�i�i�i�imini�i�ibii�i�	iiqi?i�i
i�ii�i�	i"i�i�
i?i
i}i�i�ioi@i>iiAi�i1i�i)i�i�i�i?i�
i�
i�ii�ixi	i�i	ii�	i3i�iihi�iili�i�i�i)i�i�
ipi�i'i�i�i�i4i�i�i
i�
i�i�i�iAi_i	iBi�iLi�i
iPiqi�ii�iriii�iiX
iicisi!
i�i�iiHi�i	iwi�i�i�iCiDitii�i�i�i�i�ixi
ii�	i/	i�iii5i
i4iuiir
i�ii_i�i�i/i�i<i�i~i7iyimi�ii^i5inibi�
iti�iil	i�i�i�i6i�i�	i7i�i�i�i�i�iivi�i�i�i�	i8i:
i�i�
i�i0	i�i1	i�iwiiIi�i�i�i�i�i(i�iiBi�i�i4isi�
i�i�i�i�i
i�
i�i�i?iCiixi	iEiHii�iFiyiziGi�ii�i�i{i�i�ii|i�i;
i}i9imiH	i~i�izi�i�is
i�	i�iMi�i�ii�i�iim	i�i�iIi�i�iioii�ii�ii�i�i_ii�i�i�i2	i3	iHii*i�ii�
ii�i�i<
i�iii:i�i�
i�i�i�iAi�i�i�iR
i�i�i�iii�
i�i"
i�i�	i�i�i�i�i�i�
ii�
i�i�i�
i�i�iQii�
iY
iii�i�ii�ii{iKi�ii�i[iiJi�i�iNi�iS
i�i�i�i�iI	ii�iT
i@ii�
i�i�i�
i�i@iiRi�i�i�	it
i�ii�iJiIi�i�
i�i�ii�i�
iU
i�imii�i�i{i�	i�i�	i
i;iV
i�ii�	ii�i<i�ii�
idi�i�i�iXi�i�i9i�i�i6i�i�iUi�i�i�i i�iLi!i=
i�i)i�i�
i	ii�i�i�	ii�i�i�
ii=i$i(ivi�ii&i�ici�iii�i	i
i�i>i�i�i�i{i"i�i�i�i�i#i�i�i�i�iW
i�i�	i�i�i�i�	ii$i�
i%ii�i�i�i�i&i^i�i�i[	i�	i�i'ii�i�ii�i�i�i(i i�ii2i\	iJi
ipipin	iiu
iqi)i�i�	iOi>
i�i�
i*iX
i�i�i�	i+i�i�i,i�
i�i�i�
i�i�i�i�iKi�i
i		i�iIi-i�i�i!i�i�i�i�i�i.iDi�i�iJisi#
i�i�i�
i�i7i�i�i�i/iwi�i|iii�i�i�i"i4	i|i,iii�i�i�	i�i�ii�iiii�i?iY
iPi0ii1iZ
iZ
i�
i�i�
i�	i�i�
i#i@i2ii|i�iziii�i�iAi'i�i?
i�i	i�i8i�i�iyi�iLiVi
i3ii�	i�i$i�ii�iMi�i%i�ii�	i�
ii
i.ii4iNi�iiii�
i�	i�i�ii�i�
i5i9i%ii�i�iKiQii�ixi6i7iiBi�i
	iOiv
i[
i�i�i&ii�
ii�
i�iiXi�i*i�i\
iPi�	i�
iNi+iw
iii�iiWiCi�ii�	iQiDii?i]
i�iii^
io	iRi	
i�iEii
iiFii'i�iXiiGiiSi�iiTiRii8ixi�	ikiSi�iTi�ii i�i�i�iDi�i9i!i�i�ii�i(iiLi"i#i$i%i_
i�i&iJi:iUi�i}ii)i�i

i;i<i
iEi+i'i�
i�iHi=iVi*iHiyi,i+iWi3i>i�i�i?i(iIi,i-i`
iqi�ia
ii�ii
i�i)i*iXi�	i+i�iOi�iYi,i-i�i.i�i/i�i�i0i.i�i�i�i1i�
iJiri2i3i$
i	i4i�i5i6i7i�
i�ib
i�	i�i�i}i�	ifi�iKi�i�
i�
i�	i�	i8iZi9i�i:i�i�
ic
i�i:i�ii;isiJ	i@i�i�	iti;i�
i/i<id
ii�	i�i�iUi�i0i�ie
i=i�if
iuiMi�i�i�i�i�
i>i	i[iiAiLi�iii?i�	i
i�
i	i@iAiviBiCi\i�iji�i[
i�
ig
iDiEi�i�iFiiBi�iGi�
i�iHi�i(i�iMiCih
i�iIiNiJiiKiLi�i�iMi�i1i2iNi�i�idiOidiViDi`i�i#i5	iPi]iQiEini
i�	i�i�i^iRi_iFiSip	ii
i�iTiUi�i

i�iVi�i�i�	i�iGi�i�i�ieiHiOi�	i�iPi`iWiwij
iXi ii3i�
iai�iIiYiJixi7iii�i-i�
i4ik
iibiZi-i�ii.ici�i[i�	iri;i�iKi5iLiXi�i i	i�i�i\i]i�i�i6i%
i^i_i�i�i~i`il
iyiaizi~i�i�ibi?i�ici7idi
i�i�iei�izi�i�iMifigi/ihi|i�i@idi�iiiiNi�i�i�i8ifi�i�ijiki�iOiPi�i�ilimi@ini9i�	ioi�i�	i�i�i<isii\
iQi.iRiNi@i�
i�ipiiSi{iqi�iAi�i�i�ii�iTi
i�i�i�i:i�i�iri�
isi@
iWi;itiui�iviwixiyi|i�i�i�i�izi�i�i3iQi�i�imi�iAi{i|i�i�	i�i}iOiRi�i�igiii~iZi�
ii�i�i�i�i�i\im
i�i}i�i<iXi�i�	i�i�	i�
i�i�i�i
i�iYi�i�i�i0i�i�i�i�i=i�	i�i�i�iLi�i�i�i�ihi�i�i�iii>i>i�i/i?iUi�i�i�i�i�iei)ix
iti�ifiSi�i�
iy
i�
in
i
ii�iTii@i�i�i�i�i�i�i�i�i�i�i�	i�i�iziUigi�iVi�io
i�i�i6	ip
iti�i�i�i�i�i�i�
iAi�iJiVihiZi�	i�iWi�i�i�i�i�	iMi�i�i
iii�	i�iBi�ieiCi�	i�iji�i�	i�i�i�i�i�i�i�isi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiViPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iq
iii
iiiiiiiiiiiiiXiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i�i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMikiliNiOiPiQi�iYiRiSiTiUiZiViWiXiYiZi[i\i]i^i_i`i�iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�
i�i�i�i�i�i�i�i�i�i�i�i�i�i�imi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ini�
i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iDi�i�i�i�i�i�i�i�i�i�
i�i�i�i�i�i�i�i�i�ioi�i�i�i�i�i�i�i�iEi�i�i�i�i�i�i�i�iiiiiiii�iii	i
iii
iiiFii�ipiiiii�iiiiGiiii~iiiiii i!i"i#i$i%i&i'i(i)i�i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNi[iOiPiQiRiSiTiUiViWiXiYi\iZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}iHi~iir
i�i�i�i�i�i�i�i�iIi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i]i�i�i^i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�
i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iqi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ii�i�i�i�i�i_i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iJi�i�i�i�i�i�i�iiiiiiiiii	i
iii
iii�iiiiiiiiii
iii�iiii`iii i!i"iai#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiWiSiTiUiVi�iWiXiYiZi�
i[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuivi�iwixiyizi{i|i}i~i�ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ibi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiKiLiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ici�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iMi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iXi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiidii�ii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i�i3i4i5i=i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNi
iOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iai�ibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i�i�i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iei�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiis
iiiiiifiiiiiiiiii i!i�	i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3iri4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFi>iGiHi�iIiJiKi�iLiMiNiOiPiNiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i�i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�isi�i�i�i�i�i�i�i�i�i�i�i�i�it
i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iOi�i�i�i�i�i�i�i�i�i�i�i&
i�i�i�i�i�i�i�i�igi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiiiiiiii	i
iii
iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i�i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i�i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiPiQiRiSiTiUiViWi�iXiYiZi[i\i]i^i_i`iaibicidi�ihieifigihi�iiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiQi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iRi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iSi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iii�i�i�i�i�i�i�i�i�i�i i i i i i i i i i	 i
 i i i
 i i i i i i i i i i i i i i i i i i i  i! i" i# i$ i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iu
iA iB iC iD iE iF ijiG iH iI iJ iK iL iM iN iO iP ikiQ iR iS iT i�
iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ilib ic id ie if ig ih ii ij ik il im in io ip iq ir is iit iu iv iw ix i�
iy iz i{ i| i} i~ i i� i� i� i� i� i� i� ii� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� iimi� i� i� i� i� i� i� ii� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� i� ii� i� i� i� i� i� i� i� i� i� i� i� ini� i� i� i� i� i� i� i� i� i� i� i�i� i� i� i� i� i� i� i� i� i� i� i� i� i� i!i!i!i!i!i!i!i!i!i	!i
!i!i!i
!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!iTi!i !i!!i"!i#!i$!i%!i&!i'!i(!i)!i*!i+!i,!i-!i.!i/!i0!i1!i2!i3!i4!i5!i6!i7!i8!i9!i:!i;!i<!i=!i>!i?!i@!iA!iB!iC!iD!iE!iF!iG!iH!iI!iJ!iK!iL!iM!iN!iO!iP!iQ!iR!iS!iT!iU!iV!iW!iX!iY!iZ!i[!i\!i]!i^!i_!i`!ia!ib!ic!id!ie!if!ig!ih!ii!ij!ik!il!im!in!io!ip!iq!ir!is!it!iiu!iv!iw!ix!iy!iz!i{!i|!i}!i	i~!i!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�i�!i�!i�!i�!i�!i�!i�!i�!i
i�i�!i�!i�!i�!i�!i�!i�!i�!iti�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i1i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!ioi�!i�!i�!iii�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!ipi�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i�!i"i"i"i"i"i"i�i"i"i"i	"i
"i"i"i
"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"iUi"i"i "i!"i""i#"i$"i%"i&"i'"i("i)"i*"i+"i,"i-"i."i/"i0"i1"i2"i3"i4"i5"i6"i7"i8"i9"i:"i;"i
i<"i="i>"i?"i@"iA"iB"iC"iD"iE"iF"iG"iH"iI"iJ"iK"iL"iM"iN"iO"iP"iQ"iR"iS"iT"iiU"iiV"iW"iX"iiY"iZ"i["i\"i]"i^"i_"i`"ia"iib"ic"id"ie"if"ig"ih"ii"ij"ik"il"im"in"io"iuip"iq"ir"is"it"iu"iv"iw"ix"iy"iz"i{"i|"i}"i~"i"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"ii�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"iqi�"i�"i�"i�"i�"i�"i�"i�"ii�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i�"i#i#i#i#i#i#ii#i#i#i	#i
#i#i#i
#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i #ii!#i"#i##i$#i%#i&#i'#i(#i)#i*#i+#i,#i-#i.#i/#i0#i1#i2#i3#i4#i5#i6#i7#i8#i9#i:#i;#i<#i=#iVi>#i?#i@#iA#iB#iC#iD#iE#iF#iG#iH#iI#iJ#iK#iL#iM#iN#iO#iP#iQ#iR#iS#iT#iU#iV#iW#iX#iY#iZ#i[#i\#i]#i^#i_#i`#ia#ib#ic#id#ie#if#ig#iih#ii#ij#ik#il#im#iin#io#ip#iq#ir#is#it#iu#iv#iw#ix#iy#iz#i{#i|#i}#i~#i#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#ivi�#i�#i�#i�#i�#i�#i�#i�#i�#i�#ii�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#ii�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#ii�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i�#i$i$i$i$i$i$i$iri$i$i	$i
$i$i$i
$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$ii$i$i $i!$i"$i#$i$$i%$i&$i'$i($i)$ii*$i+$i,$i-$iii.$i/$i0$i1$i2$i3$i4$i5$i6$i7$i8$i9$isi:$i;$i<$i=$i>$i?$i@$iA$iB$iC$iD$iE$iYiF$iG$iH$iI$iJ$iK$iL$iM$iN$iO$iP$iQ$iR$iS$iT$iU$iV$iW$iX$iY$iZ$i[$i\$i]$i^$i_$i`$ia$ib$ic$id$ie$if$ig$ih$ii$ij$iik$il$im$in$io$ip$iq$ir$is$it$iu$iv$iw$ix$iy$iz$i{$i|$i}$i~$i$i�$i�$i�$i�$iti�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i i�$iui�$i�$i�$i�$i�$i!i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$ivi�$i�
i�$i�$iZi�
i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i"i�$i�$i�$i�$i�$i�$i�$i�$iwi�$i�$i�$i�$i�$i�$i�$iwi�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i
i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i�$i%i#i%i%i%i%i%i$i%i%i%i	%i
%i%i%i
%i%i%i%i
i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i %i!%i"%i#%i$%i%%i&%i'%i(%i)%i*%i+%i,%i-%i.%i/%i0%i%i1%i2%i3%i4%i5%i6%i&i7%i8%i9%i:%i;%i<%i=%i>%i?%i@%iA%iB%iC%iD%iE%iF%iG%iH%iI%iJ%iK%iL%iM%iN%iO%iP%iQ%iR%iS%iT%iU%iV%iW%iX%iY%iZ%i[%i\%i]%i^%i_%i`%ia%ib%ic%id%ie%if%ig%ih%ii%ij%ik%il%im%in%io%ip%i�iq%ir%is%it%iu%iv%iw%ix%iy%iz%i{%i|%i}%i~%i%i�%i�%i�%i'i�%i�%i�%i�%i�%i(i�%i�%i�%i�%i�%i�%i�%i)i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i*i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i+i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%iWi�%i�%i�%i�%i�%i,i�%i�%i�%i�%i-i�%i�%i�%i�%i�%i�%i�%i�%i�%i.i�%i�%i�%i[i�%i�%i�%i�i�%i�%i�%i�%i�%i�%i�%i�%i�%i/i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i�%i&i&i&i&i&i&i&i&i0i&i	&i
&i&i&i1i
&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i2i&i &i!&i"&i#&i$&i%&i&&i'&i(&i)&i*&i+&i,&i-&i.&i/&i0&i1&i2&i3&i4&i5&i6&i3i7&i8&i9&i:&i;&i<&i=&i>&i?&i@&iA&i4iB&iC&iD&iE&iF&iG&iH&iI&iJ&iK&iL&iM&iN&iO&iP&iQ&iR&iS&iT&iU&iV&iW&iX&iY&iZ&i[&i\&i]&i^&i_&i`&ia&ib&ic&id&ie&if&ig&ih&ii&ij&ik&il&im&in&io&ip&iq&ir&is&it&iu&iv&iw&ix&iy&iz&i{&i|&i}&i~&i&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i5i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&ixi�&i�&i�&i�&i�&i�i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i6i�&i�&i�&i7i�&i�&i�&i�&iXi�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i8i�&i�&i�&i�&i�&i�&i�&i�&i�&iYi�&i�&i�&i�&i�&i�&i�&i�&i�&i�&i9i�&i�&i�&iyi�&i�&i�&i�&i�&i�&i�&i�&i�&izi�&i�&i�&i�&i�&i�&i'i'i'i'i'i'i'i'i'i	'i
'i'i'i
'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i 'i!'i"'i#'i$'i%'i:i&'i;i''i('i)'i*'i+'i,'i-'i.'i/'i0'i1'i2'i3'i4'i5'i6'i7'i8'i9'i:'i;'i<'i='i>'i?'i@'i<iA'iB'iC'iD'iE'iF'iG'iH'iI'iJ'iK'iL'iM'iN'iO'iP'iQ'iR'iS'iT'iU'iV'iW'iX'iY'iZ'i['i\'i]'i^'i_'i`'ia'ib'ic'id'ie'if'ig'i{ih'ii'ij'ik'il'im'in'io'ip'iq'i|ir'is'it'iu'iv'iw'ix'iy'iz'i{'i|'i}'i~'i'i~i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�iZi=i�'i�'i�'i�'i�'i�'i�'i}i[i�'i�'i�'i�'i�'i�'i\i�'i�'i�'i�'i�'i�'i�'i�'i>i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�i�'i�'i�'i�'i�'i�'i�'i�'i~i�'i�'i�'i�'ii�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i�'i?i�'i�'i�'i�'i�'i(i(i(i(i(i(i(i(i(i	(i
(i(i(i
(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i (i!(i�i@iAi"(i#(i$(i%(i&(i'(i((i)(i*(i+(i,(i-(i.(i/(i0(i1(i2(i3(i4(i5(i6(i7(i8(i9(i:(i;(i<(i=(i>(i?(i@(iA(iB(iC(iD(iE(iF(iG(iH(iI(iJ(iK(iL(iM(iN(iO(iP(iQ(iR(iS(iT(iU(iV(iW(iX(iY(iZ(i[(i\(i](i^(iBi_(i`(ia(ib(ic(id(ie(if(iCig(ih(ii(ij(ik(il(im(in(io(ip(iq(ir(is(iit(i�
iu(iv(iw(ix(i]iy(iz(i{(i|(i}(i~(i(i�(i�(i�(i�(i�(i�(i�(i�(iDi�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(iEi�(i�(i�(iFi�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(iv
i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(iGi�(i�(i�(i�(i�(i�(i�(iHi�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(iIi�(i�(i�(i�(i�i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i�(i)i)i)i)i)i)i)i)i)i	)iJi
)i)i)i
)i)i�	i)i)i)i)i)i)iw
i)i)i)i)i)i)i)i)i)i)i)i )i!)i")i#)i$)i%)i&)i')i()i))i*)i+)i,)i-)i.)i/)i�i0)iKi1)i2)i3)i4)i5)i6)i7)i8)i9)i:)i;)i<)i=)i>)i?)i@)iA)iB)iC)iD)iE)iF)iG)i\i�iH)iI)iJ)iK)iL)ix
iM)iN)iO)iP)iQ)iR)iS)iT)iU)iV)iW)iX)iY)iZ)i[)i\)i])i^)i_)i`)ia)ib)ic)id)ie)if)ig)ih)ii)ij)ik)il)im)in)io)ip)iq)ir)is)it)iu)iv)iw)ix)iy)iz)i{)i|)i})i~)i)i�)i�)i�)i�)i�i�)i�)i�)i�)i�)iLi�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)iMi�)i�)i�)i'
i�)i�)i�)i�)i�)i�)i�)ii�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)iNi�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�i�)i�)i�)i�)i�)i�)i�)iOi�)i]i�)i�)i�)i�)i�)i�)i�)iPi�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)iQi�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i�)i*i*i*i*i*i*i*i*i*i	*iRi
*i*i*i
*i*i*iSiTi*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i *i!*i"*i#*i$*i%*i&*i'*i(*i)*i**i+*i,*i-*i.*i/*i0*i1*i2*i3*i4*i5*i6*i7*i8*i9*i:*i;*i<*i=*i>*i?*i@*iA*iB*iC*iD*iE*iF*iG*iH*iI*iJ*iK*iL*iM*iN*iO*iP*iQ*iR*iS*iT*iU*iV*iW*iX*iY*iZ*i[*i\*i]*i^*i_*i`*ia*ib*ic*id*ie*if*ig*ih*ii*ij*ik*il*im*in*io*ip*iq*ir*is*it*iu*iv*iw*ix*iy*iz*i{*i|*i}*i~*i�i*i�*i�*i�*i�*i�*i�*iUi�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*iVi�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i^i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*i�*ixi�*i+i+i+i+i+i+i+i+i+i	+i
+i+i+i
+i+i+i+i+i+i+i+i+i+i+i+iWi+i+i+i+i+i+i+i +i!+i"+i#+i$+i%+i&+i'+i�i(+i)+i*+i++iXi,+i-+i.+i/+i0+i1+i2+iYi3+i4+i5+i6+i7+i8+i9+i:+i;+i<+i=+i>+i?+iZi@+iA+iB+iC+iD+iE+iF+iG+iH+iI+iJ+iK+iL+iM+iN+iO+iP+iQ+iR+iS+iT+iU+iV+iW+iX+iY+iZ+i[+i\+i]+i^+i_+i`+ia+ib+ic+id+ie+if+ig+ih+ii+ij+ik+i�il+im+in+io+ip+iq+ir+is+it+iu+iv+iw+ix+iy+iz+i{+i|+i}+i~+i[i+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i\i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i]i�+i�+i�+i�+i�+i�+i^i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i^i�+i�+i�+i�+i�+i�+i_i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i_i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i�+i,i,i,i,i,i,i,i,i,i	,i
,i,i,i
,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i ,i!,i",i#,i$,i%,i&,i',i(,i),i*,i+,i,,i-,i.,i/,i0,i1,i2,i_i3,i4,i5,i6,i�i7,i8,i9,i:,i;,i<,i=,i>,i?,i@,iA,iB,iC,iD,iE,iF,iG,iH,iI,iJ,iK,iL,iM,iN,iO,iP,iQ,iR,iS,i`iT,iU,iV,iW,iX,iY,iZ,i[,i\,i],i^,i_,i`,ia,ib,ic,id,ie,if,ig,ih,ii,ij,ik,il,im,in,io,ip,iq,iyiair,is,it,iu,iv,iw,ix,iy,iz,i{,i|,i},i~,i,i�,i�,i�,i�,i�,i�,i`i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,ibi�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,ici�,i�,i�i�,i�,i�,i�,idi�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,iei�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i�,i-i-i-i-i-i-i-i-i-i	-izi
-i-i-i
-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i -i!-i"-i#-i$-i%-i&-i'-i(-i)-i*-i+-i,-iaibi--i.-i/-i0-i1-i2-i3-i4-i5-i6-i7-i8-i9-i:-i;-i<-i=-i>-i?-i@-iA-iB-iC-iD-iE-iF-iG-ificiH-iI-iJ-iK-iL-iM-iN-iO-iP-iQ-iR-iS-iT-iiU-iV-iW-iX-iY-iZ-igi[-i\-i]-i^-i_-i`-ia-ib-ic-id-ie-if-ig-ih-ii-ij-ik-il-im-in-io-ip-iq-ir-is-it-iu-iv-iw-ix-iy-iz-i{-i|-i}-i~-i-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-ihi�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�
i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-iii�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-iji�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i�-i.i.i.i.i.i.i.i.i.i	.i
.i.i.i
.i.iki.i.i.i.i.i.i.ili.i.i.i.i.i.i.i.i.i.i .i!.i".imi#.i$.i%.i&.i'.i(.i).i*.i+.i,.i-.i..i/.i0.i1.i2.i3.i4.i5.i6.i7.i8.i9.i:.i`i�i;.i<.ini=.i>.i?.i@.iA.iB.iC.iD.iE.iF.iG.iH.iI.iJ.iK.iL.iM.iN.iO.iP.iQ.iR.iS.iT.iU.iV.iW.iX.iY.iZ.i[.i\.i].i^.i_.i`.ia.ib.ic.id.ie.if.ig.ih.ii.ij.ik.il.i�im.in.io.ip.iq.ir.is.it.iu.iv.iw.ix.iy.iz.i{.i|.i}.i~.i.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.ioi�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.ipi�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.idi�.i�.i�.i�.i�.iqi�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i�.i/i/i/i/i/i/i/i/i/i	/i
/i/i/i
/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/iri/i/i /i!/i"/i#/i$/i%/i&/i'/i(/i)/i*/i+/i,/i-/i./i//i0/i1/i2/i3/i4/i5/i6/i7/i8/i9/i:/i;/i</i=/i>/i?/i@/iA/iB/iC/iD/iE/iF/iG/iH/iI/iJ/iK/iL/iM/iN/iO/iP/iQ/iR/iS/iT/iU/iV/iW/iX/iY/iZ/i[/isi\/i]/i^/i_/i`/ieia/ib/ic/id/ie/if/ig/ih/ii/ij/ik/il/im/in/io/ip/iq/ir/is/it/iu/iv/iw/ix/iy/iz/iti{/i|/i}/i~/i/i�/i�i�/i�/i�/i�/i�i�/i�/i�/i�/i�/i�i�/i�/i�i�/i�/i�/i�/i�/i�i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/iui�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/ivi�/i�/i�/i�/i�/i�/i�/i�/i�/i�/iwi�/i�/i�/i�/ixi�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/iyi�/i�i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/i�/izi0i0i0i0i0i0i0i0i0i�	i	0i
0i0i0i
0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i{i 0i!0i"0i#0i$0i%0i&0i'0i(0i)0i*0i+0i,0i{i-0i.0i/0i00i10i20i30i40i50i60i70i80i90i:0i;0i<0i=0i>0i?0i@0iA0iB0iC0iD0iE0iF0iG0i|iH0iI0iJ0iK0iL0iM0iN0iO0iP0iQ0iR0i}iS0iT0iU0iV0iW0iX0iY0iZ0i[0i\0i]0i^0i_0i`0ia0ib0ic0id0ie0if0ig0ih0ii0ij0ik0il0im0in0io0ip0iq0ir0is0it0iu0iv0iw0ix0i|iy0iz0i{0i|0i}0i~0i0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�
i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i}i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i~i�0i�0i�0i�0i�0i�0i�0i�0i�0i�i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i�0i1i1i1i1i1i1i1i1ii1i	1i
1i1i1i
1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i 1i!1i"1i�i#1i$1i%1i&1i'1i~i(1i)1i*1i+1i,1i-1i.1i/1i01i11i21i31i41i51i61i71i81i91i:1i;1i<1i=1i>1i?1i@1iA1iB1iC1iD1iE1iF1iG1iH1iI1iJ1iK1iL1iM1iN1iO1iP1iQ1iR1iS1iT1iU1iV1iW1iX1iY1iZ1i[1i\1i]1i^1i_1i`1ia1ib1ic1id1ie1if1i�ig1ih1ii1ij1ik1il1im1in1io1ip1iq1ir1is1it1iu1iv1iw1ix1iy1iz1i{1i|1i}1i~1i1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�ii�1i�1i�1i�1i�1i�1i�1i�1i�i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i�1i2i2i2i2i2i2i2i2i2i	2i
2i2i2i
2i2i2i2i2i2i2i2i2i2i2i2i2i2ifii2i2i2i2i2i 2i!2i"2i#2i$2i%2i&2i'2i(2i)2i*2i+2i,2i-2i.2i/2i02i12i22i32i42i52i62i72i82i92i:2i;2i<2i=2igi>2i?2i@2iA2iB2iC2iD2iE2iF2iG2iH2iI2iJ2iK2iL2iM2iN2iO2iP2iQ2iR2iS2iT2iU2iV2iW2i�iX2iY2iZ2i[2i\2i]2i^2i_2i`2ia2ib2ic2id2ie2if2ig2ih2ii2ij2ik2il2im2in2io2ip2i�iq2ir2is2it2iu2iv2iw2ix2iy2iz2i{2i|2i}2i~2i2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�i�2i�i�2i�2i�2i�2i�2i�i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2iy
i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i�2i3i3i3i3i3i3i3i3i3i	3i
3i3i3i
3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i 3i!3i"3i#3i$3i%3i&3i'3i(3i)3i*3i+3i,3i-3i.3i/3i03i13i23i33i43i53i63i73i83i93i:3i;3i<3i=3i>3i�i?3i�i@3iA3iB3iC3iD3iE3iF3iG3i�iH3iI3iJ3iK3iL3iM3iN3i�i�iO3iP3iQ3iR3iS3i�iT3iU3iV3iW3iX3iY3iZ3i[3i\3i]3i^3i_3i`3ia3ib3ic3id3ie3if3ig3i�ih3ii3ij3ik3il3im3in3io3ip3iq3ir3is3it3iu3iv3iw3ix3i�iy3iz3i{3i|3i}3i~3i3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3ihi�i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�i�3i�3i�3i�3i�i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3iz
i�3i�3i�3i�3i�3i�3i�3i�3i�i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�3i�i�3i�3i�3i�3i�3i�3i�3i�3i�3i4i4i4i4i4i4i4i4i4i	4i
4i4i4i
4i4i4i4i�i4i4i4i4i4i4i4i4i4i4i4i4i4i�i4i4i 4i!4i"4i#4i$4i%4i&4i'4i(4i)4i*4i+4i,4i-4i.4i/4i04i14i24i34i44i54i64i74i�i84i94i:4i;4i<4i=4i>4i?4i@4iA4iB4iC4iD4iE4iF4iG4iH4iI4iJ4iK4iL4iM4iN4iO4iP4iQ4iR4iS4iT4iU4iV4iW4iX4iY4iZ4i[4i\4i]4i^4i_4i`4ia4ib4ic4id4ie4if4ig4ih4ii4ij4ik4il4im4in4io4ip4iq4ir4is4it4iu4iv4iw4ix4i�iy4iz4i{4iii|4i}4i~4i4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i�4i5i5i5i5i5i5i5i5i5i	5i
5i5i5i
5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i 5i!5i"5i#5i$5i%5i&5i'5i(5i)5i*5i+5i,5i-5i.5i/5i05i15i25i35i45i55i65i75i85i95i:5i;5i<5i=5i>5i?5i@5iA5iB5iC5iD5iE5iF5iG5iH5iI5iJ5i�iK5iL5iM5iN5iO5iP5iQ5iR5iS5i�iT5iU5iV5iW5iX5iY5iZ5i[5i\5i]5i^5i_5i`5ia5ib5ic5id5ie5if5ig5ih5ii5ij5ik5il5im5in5io5ip5iq5ir5is5it5iu5iv5iw5ix5iy5iz5i{5i|5i}5i~5i5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i�5i6i6i6i6i6i6i6i6i6i	6i
6i6i6i
6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i 6i!6i"6i#6i$6i%6i&6i'6i(6i)6i*6i+6i,6i-6i.6i/6i06i16i26i36i46i56i66i76i86i96i:6i;6i<6i=6i>6i?6i@6iA6iB6iC6iD6iE6iF6iG6iH6iI6iJ6iK6iL6iM6iN6iO6iP6iQ6iR6iS6iT6iU6iV6iW6iX6iY6iZ6i[6i\6i]6i^6i_6i`6ia6ib6ic6id6ie6if6ig6ih6ii6ij6ik6il6im6in6io6ip6iq6ir6is6it6iu6iv6iw6ix6iy6iz6i{6i|6i}6i~6i6i�6i�6i�6i�6i�6i�6i�6i�6i�6i�6i�6i�6i�6i�6i�6i�6i�6i�6i�6i�6i�6N(uBIG5_TYPICAL_DISTRIBUTION_RATIOuBIG5_TABLE_SIZEuBig5CharToFreqOrder(((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/big5freq.pyu<module>+s�000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000site-packages/pip/_vendor/requests/packages/chardet/__pycache__/cp949prober.cpython-33.pyc000064400000002775151733463740025520 0ustar00�
7�Re�c@sZddlmZddlmZddlmZddlmZGdd�de�ZdS(i(uMultiByteCharSetProber(uCodingStateMachine(uEUCKRDistributionAnalysis(uCP949SMModelcBs,|EeZdZdd�Zdd�ZdS(uCP949ProbercCs6tj|�tt�|_t�|_|j�dS(N(uMultiByteCharSetProberu__init__uCodingStateMachineuCP949SMModelu
_mCodingSMuEUCKRDistributionAnalysisu_mDistributionAnalyzerureset(uself((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/cp949prober.pyu__init__#s
uCP949Prober.__init__cCsdS(NuCP949((uself((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/cp949prober.pyuget_charset_name+suCP949Prober.get_charset_nameN(u__name__u
__module__u__qualname__u__init__uget_charset_name(u
__locals__((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/cp949prober.pyuCP949Prober"suCP949ProberN(	umbcharsetproberuMultiByteCharSetProberucodingstatemachineuCodingStateMachineuchardistributionuEUCKRDistributionAnalysisumbcssmuCP949SMModeluCP949Prober(((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/cp949prober.pyu<module>ssite-packages/pip/_vendor/requests/packages/chardet/__pycache__/sbcharsetprober.cpython-33.pyc000064400000010252151733463740026613 0ustar00�
7�Re�c@s�ddlZddlmZddlmZddlmZdZdZdZ	d	Z
d
ZdZedZ
Gdd
�d
e�ZdS(iNi(u	constants(u
CharSetProber(uwrap_ordi@igffffff�?g�������?i�icBsV|EeZdZdddd�Zdd�Zdd�Zdd�Zd	d
�Z	dS(
uSingleByteCharSetProbercCs6tj|�||_||_||_|j�dS(N(u
CharSetProberu__init__u_mModelu
_mReversedu_mNameProberureset(uselfumodelureversedu
nameProber((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/sbcharsetprober.pyu__init__-s

			u SingleByteCharSetProber.__init__cCsEtj|�d|_dgt|_d|_d|_d|_dS(Ni�i(u
CharSetProberuresetu_mLastOrderuNUMBER_OF_SEQ_CATu
_mSeqCountersu_mTotalSeqsu_mTotalCharu
_mFreqChar(uself((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/sbcharsetprober.pyureset6s
			uSingleByteCharSetProber.resetcCs%|jr|jj�S|jdSdS(NucharsetName(u_mNameProberuget_charset_nameu_mModel(uself((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/sbcharsetprober.pyuget_charset_name@s	
u(SingleByteCharSetProber.get_charset_namecCs�|jds|j|�}nt|�}|s;|j�Sx�|D]�}|jdt|�}|tkr}|jd7_n|tkr|jd7_|j	tkr|j
d7_
|js�|j	t|}|jd|}n"|t|j	}|jd|}|j|d7<qn||_	qBW|j�t
jkr�|j
tkr�|j�}|tkr�t
jr�tjjd|jd|f�nt
j|_q�|tkr�t
jr�tjjd|jd|tf�nt
j|_q�q�n|j�S(NukeepEnglishLetterucharToOrderMapiuprecedenceMatrixu$%s confidence = %s, we have awinner
ucharsetNameu9%s confidence = %s, below negativeshortcut threshhold %s
(u_mModelufilter_without_english_lettersulenu	get_stateuwrap_orduSYMBOL_CAT_ORDERu_mTotalCharuSAMPLE_SIZEu
_mFreqCharu_mLastOrderu_mTotalSeqsu
_mReversedu
_mSeqCountersu	constantsu
eDetectinguSB_ENOUGH_REL_THRESHOLDuget_confidenceuPOSITIVE_SHORTCUT_THRESHOLDu_debugusysustderruwriteueFoundItu_mStateuNEGATIVE_SHORTCUT_THRESHOLDueNotMe(uselfuaBufuaLenucuorderuiumodelucf((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/sbcharsetprober.pyufeedFsF


	
		
uSingleByteCharSetProber.feedcCshd}|jdkrdd|jt|j|jd}||j|j}|dkrdd}qdn|S(Ng{�G�z�?ig�?umTypicalPositiveRatiog�G�z��?(u_mTotalSeqsu
_mSeqCountersuPOSITIVE_CATu_mModelu
_mFreqCharu_mTotalChar(uselfur((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/sbcharsetprober.pyuget_confidenceps#u&SingleByteCharSetProber.get_confidenceNF(
u__name__u
__module__u__qualname__uFalseuNoneu__init__uresetuget_charset_nameufeeduget_confidence(u
__locals__((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/sbcharsetprober.pyuSingleByteCharSetProber,s
	
*uSingleByteCharSetProber(usysuu	constantsu
charsetproberu
CharSetProberucompatuwrap_orduSAMPLE_SIZEuSB_ENOUGH_REL_THRESHOLDuPOSITIVE_SHORTCUT_THRESHOLDuNEGATIVE_SHORTCUT_THRESHOLDuSYMBOL_CAT_ORDERuNUMBER_OF_SEQ_CATuPOSITIVE_CATuSingleByteCharSetProber(((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/sbcharsetprober.pyu<module>s
site-packages/pip/_vendor/requests/packages/chardet/__pycache__/__init__.cpython-33.pyc000064400000001635151733463740025167 0ustar00�
7�Rec@s&dZddlmZdd�ZdS(u2.2.1i(uversion_infocCs�tdkrt|t�s7tdkrFt|t�rFtd��nddlm}|j�}|j�|j	|�|j
�|jS(Niiu-Expected a bytes object, not a unicode objecti(uuniversaldetector(ii(ii(uversion_infou
isinstanceuunicodeubytesu
ValueErroruuuniversaldetectoruUniversalDetectoruresetufeeducloseuresult(uaBufuuniversaldetectoruu((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/__init__.pyudetects


udetectN(u__version__usysuversion_infoudetect(((uG/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/__init__.pyu<module>ssite-packages/pip/_vendor/requests/packages/chardet/__pycache__/mbcsgroupprober.cpython-33.pyc000064400000003206151733463740026637 0ustar00�
7�Re�c@s�ddlmZddlmZddlmZddlmZddlm	Z	ddl
mZddlm
Z
ddlmZdd	lmZGd
d�de�ZdS(
i(uCharSetGroupProber(u
UTF8Prober(u
SJISProber(uEUCJPProber(uGB2312Prober(uEUCKRProber(uCP949Prober(u
Big5Prober(uEUCTWProbercBs |EeZdZdd�ZdS(uMBCSGroupProbercCsTtj|�t�t�t�t�t�t�t�t	�g|_
|j�dS(N(uCharSetGroupProberu__init__u
UTF8Proberu
SJISProberuEUCJPProberuGB2312ProberuEUCKRProberuCP949Proberu
Big5ProberuEUCTWProberu	_mProbersureset(uself((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/mbcsgroupprober.pyu__init__*s
uMBCSGroupProber.__init__N(u__name__u
__module__u__qualname__u__init__(u
__locals__((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/mbcsgroupprober.pyuMBCSGroupProber)suMBCSGroupProberN(ucharsetgroupproberuCharSetGroupProberu
utf8proberu
UTF8Proberu
sjisproberu
SJISProberueucjpproberuEUCJPProberugb2312proberuGB2312ProberueuckrproberuEUCKRProberucp949proberuCP949Proberu
big5proberu
Big5ProberueuctwproberuEUCTWProberuMBCSGroupProber(((uN/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/mbcsgroupprober.pyu<module>ssite-packages/pip/_vendor/requests/packages/chardet/__pycache__/eucjpprober.cpython-33.pyc000064400000007102151733463740025743 0ustar00�
7�Re^c@s�ddlZddlmZddlmZddlmZddlmZddl	m
Z
ddlmZGd	d
�d
e�Z
dS(iNi(u	constants(uMultiByteCharSetProber(uCodingStateMachine(uEUCJPDistributionAnalysis(uEUCJPContextAnalysis(uEUCJPSMModelcBsP|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS(uEUCJPProbercCsBtj|�tt�|_t�|_t�|_|j	�dS(N(
uMultiByteCharSetProberu__init__uCodingStateMachineuEUCJPSMModelu
_mCodingSMuEUCJPDistributionAnalysisu_mDistributionAnalyzeruEUCJPContextAnalysisu_mContextAnalyzerureset(uself((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/eucjpprober.pyu__init__&s

uEUCJPProber.__init__cCstj|�|jj�dS(N(uMultiByteCharSetProberuresetu_mContextAnalyzer(uself((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/eucjpprober.pyureset-s
uEUCJPProber.resetcCsdS(NuEUC-JP((uself((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/eucjpprober.pyuget_charset_name1suEUCJPProber.get_charset_namecCs�t|�}xVtd|�D]E}|jj||�}|tjkr�tjr{tjj	|j
�dt|�d�ntj|_
Pq|tjkr�tj|_
Pq|tjkr|jj�}|dkr|d|jd<|jj|j|�|jj|j|�qa|jj||d|d�|�|jj||d|d�|�qqW||d|jd<|j�tjkr�|jj�r�|j�tjkr�tj|_
q�n|j�S(Niu prober hit error at byte u
i(ulenurangeu
_mCodingSMu
next_stateu	constantsueErroru_debugusysustderruwriteuget_charset_nameustrueNotMeu_mStateueItsMeueFoundItueStartuget_current_charlenu
_mLastCharu_mContextAnalyzerufeedu_mDistributionAnalyzeru	get_stateu
eDetectingugot_enough_datauget_confidenceuSHORTCUT_THRESHOLD(uselfuaBufuaLenuiucodingStateucharLen((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/eucjpprober.pyufeed4s6		"%uEUCJPProber.feedcCs+|jj�}|jj�}t||�S(N(u_mContextAnalyzeruget_confidenceu_mDistributionAnalyzerumax(uselfucontxtCfu	distribCf((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/eucjpprober.pyuget_confidenceWsuEUCJPProber.get_confidenceN(u__name__u
__module__u__qualname__u__init__uresetuget_charset_nameufeeduget_confidence(u
__locals__((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/eucjpprober.pyuEUCJPProber%s
#uEUCJPProber(usysuu	constantsumbcharsetproberuMultiByteCharSetProberucodingstatemachineuCodingStateMachineuchardistributionuEUCJPDistributionAnalysisujpcntxuEUCJPContextAnalysisumbcssmuEUCJPSMModeluEUCJPProber(((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/eucjpprober.pyu<module>ssite-packages/pip/_vendor/requests/packages/chardet/__pycache__/euckrprober.cpython-33.pyc000064400000002776151733463740025762 0ustar00�
7�Re�c@sZddlmZddlmZddlmZddlmZGdd�de�ZdS(i(uMultiByteCharSetProber(uCodingStateMachine(uEUCKRDistributionAnalysis(uEUCKRSMModelcBs,|EeZdZdd�Zdd�ZdS(uEUCKRProbercCs6tj|�tt�|_t�|_|j�dS(N(uMultiByteCharSetProberu__init__uCodingStateMachineuEUCKRSMModelu
_mCodingSMuEUCKRDistributionAnalysisu_mDistributionAnalyzerureset(uself((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/euckrprober.pyu__init__#s
uEUCKRProber.__init__cCsdS(NuEUC-KR((uself((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/euckrprober.pyuget_charset_name)suEUCKRProber.get_charset_nameN(u__name__u
__module__u__qualname__u__init__uget_charset_name(u
__locals__((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/euckrprober.pyuEUCKRProber"suEUCKRProberN(	umbcharsetproberuMultiByteCharSetProberucodingstatemachineuCodingStateMachineuchardistributionuEUCKRDistributionAnalysisumbcssmuEUCKRSMModeluEUCKRProber(((uJ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/euckrprober.pyu<module>ssite-packages/pip/_vendor/requests/packages/chardet/__pycache__/langgreekmodel.cpython-33.pyc000064400000060030151733463740026402 0ustar00�
7�ReT1c@shd�Zd�Zd�Zied�6ed�6d�d�6d�d�6d�d�6Zied�6ed�6d�d�6d�d�6d�d�6Zd�S(�i�i�i�i�iRidihi^ibieitifioi�iui\iXiqiUiOiviiiSiCiriwi_icimi�iHiFiPiQi<i`i]iYiDixiaiMiViEi7iNisiAiBi:iLijigiWikipi�iZiJi�i�i=i$i.iGiIi6ili{inii3i+i)i"i[i(i4i/i,i5i&i1i;i'i#i0i�i%i!i-i8i2iTi9iyiiiii|iiiiii i
iiiii
iiii	iiiiiiii*ii@iKiiiiucharToOrderMapuprecedenceMatrixg���s�?umTypicalPositiveRatioukeepEnglishLetteru
ISO-8859-7ucharsetNameuwindows-1253N(i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iRidihi^ibieitifioi�iui\iXiqiUiOiviiiSiCiriwi_icimi�i�i�i�i�i�i�iHiFiPiQi<i`i]iYiDixiaiMiViEi7iNisiAiBi:iLijigiWikipi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iZi�i�i�i�i�i�i�i�i�i�iJi�i�i�i�i�i�i�i�i=i$i.iGiIi�i6i�ili{inii3i+i)i"i[i(i4i/i,i5i&i1i;i'i#i0i�i%i!i-i8i2iTi9ixiyiiiii|iiiiii i
iiiii
iiii	iiiiiiii*ii@iKiiii�(i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iRidihi^ibieitifioi�iui\iXiqiUiOiviiiSiCiriwi_icimi�i�i�i�i�i�i�iHiFiPiQi<i`i]iYiDixiaiMiViEi7iNisiAiBi:iLijigiWikipi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i=i�i�i�i�i�i�i�i�i�i�iJi�i�i�i�i�i�i�i�i�i$i.iGiIi�i6i�ili{inii3i+i)i"i[i(i4i/i,i5i&i1i;i'i#i0i�i%i!i-i8i2iTi9ixiyiiiii|iiiiii i
iiiii
iiii	iiiiiiii*ii@iKiiii�(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiF(uLatin7_CharToOrderMapuwin1253_CharToOrderMapuGreekLangModeluFalseuLatin7GreekModeluWin1253GreekModel(((uM/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/langgreekmodel.pyu<module>#sV

site-packages/pip/_vendor/requests/packages/chardet/__pycache__/escsm.cpython-33.pyc000064400000016265151733463740024547 0ustar00�
7�Re�c@s�ddlmZmZmZdZeedeeeeeeeeeeeeeeeeeeededededddededddededeeeeeeef0ZdZied6dd	6ed
6ed6dd
6ZdZedeeeeeeeeeeeeeeeeeeeeeeeeeeeedeeeeeeeeeddeeeeeeeeeeeeeeeeeeeeeef@Z	dZ
ied6dd	6e	d
6e
d6dd
6ZdZedeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeedeeedeeeeedeeeeeeeeeeeeeeeeeeeeeeeeeeeefHZ
dZied6dd	6e
d
6ed6dd
6ZdZedeeeeeeeeeeeeeeeeeeedeeeeeedeeeeeeeeeeef(ZdZied6dd	6ed
6ed6dd
6ZdS(i(ueStartueErrorueItsMeiiiiiiu
classTableuclassFactoru
stateTableucharLenTableu
HZ-GB-2312unamei	uISO-2022-CNiii
uISO-2022-JPuISO-2022-KRN(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(	iiiiiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii	iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(
iiiiiiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiii(u	constantsueStartueErrorueItsMeuHZ_clsuHZ_stuHZCharLenTableu	HZSMModelu
ISO2022CN_clsuISO2022CN_stuISO2022CNCharLenTableuISO2022CNSMModelu
ISO2022JP_clsuISO2022JP_stuISO2022JPCharLenTableuISO2022JPSMModelu
ISO2022KR_clsuISO2022KR_stuISO2022KRCharLenTableuISO2022KRSMModel(((uD/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/escsm.pyu<module>sh






site-packages/pip/_vendor/requests/packages/chardet/__pycache__/latin1prober.cpython-33.pyc000064400000010025151733463740026023 0ustar00�
7�Reyc@s�ddlmZddlmZddlmZdZdZdZdZ	dZ
dZdZd	Z
d
ZdZeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee	e	e	e	e	e	e	e	e	e	e	e	e	e	e	e	e	e	e	e	e	e	e	e	e	e	eeeeeee
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
e
e
e
e
e
eee
e
e
e
e
e
e
e
eee
e
e
e
e
ee
e
e
e
e
eeefZdZGdd
�d
e�ZdS(i(u
CharSetProber(ueNotMe(uwrap_ordiiiiiiiicBsP|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS(uLatin1ProbercCstj|�|j�dS(N(u
CharSetProberu__init__ureset(uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/latin1prober.pyu__init__bs
uLatin1Prober.__init__cCs*t|_dgt|_tj|�dS(Ni(uOTHu_mLastCharClassuFREQ_CAT_NUMu
_mFreqCounteru
CharSetProberureset(uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/latin1prober.pyuresetfs	uLatin1Prober.resetcCsdS(Nuwindows-1252((uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/latin1prober.pyuget_charset_nameksuLatin1Prober.get_charset_namecCs�|j|�}xf|D]^}tt|�}t|jt|}|dkrZt|_Pn|j|d7<||_qW|j	�S(Nii(
ufilter_with_english_lettersuLatin1_CharToClassuwrap_orduLatin1ClassModelu_mLastCharClassu	CLASS_NUMueNotMeu_mStateu
_mFreqCounteru	get_state(uselfuaBufucu	charClassufreq((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/latin1prober.pyufeedns

	
uLatin1Prober.feedcCs�|j�tkrdSt|j�}|dkr:d}n$|jd||jdd|}|dkrsd}n|d}|S(Ng{�G�z�?giig4@g�?(u	get_stateueNotMeusumu
_mFreqCounter(uselfutotalu
confidence((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/latin1prober.pyuget_confidence|s		
uLatin1Prober.get_confidenceN(u__name__u
__module__u__qualname__u__init__uresetuget_charset_nameufeeduget_confidence(u
__locals__((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/latin1prober.pyuLatin1Proberas
uLatin1ProberN(@iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(u
charsetproberu
CharSetProberu	constantsueNotMeucompatuwrap_orduFREQ_CAT_NUMuUDFuOTHuASCuASSuACVuACOuASVuASOu	CLASS_NUMuLatin1_CharToClassuLatin1ClassModeluLatin1Prober(((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/latin1prober.pyu<module>sj	site-packages/pip/_vendor/requests/packages/chardet/__pycache__/constants.cpython-33.pyc000064400000000547151733463740025445 0ustar00�
7�Re7c@s4dZdZdZdZdZdZdZdZdS(iiigffffff�?N(u_debugu
eDetectingueFoundItueNotMeueStartueErrorueItsMeuSHORTCUT_THRESHOLD(((uH/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/constants.pyu<module>ssite-packages/pip/_vendor/requests/packages/chardet/__pycache__/hebrewprober.cpython-33.pyc000064400000010753151733463740026117 0ustar00�
7�Re/4c@s�ddlmZddlmZmZddlmZdZdZdZ	dZ
dZd	Zd
Z
dZdZd
ZdZdZdZdZGdd�de�ZdS(i(u
CharSetProber(ueNotMeu
eDetecting(uwrap_ordi�i�i�i�i�i�i�i�i�i�ig{�G�z�?u
ISO-8859-8uwindows-1255cBst|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS(uHebrewProbercCs-tj|�d|_d|_|j�dS(N(u
CharSetProberu__init__uNoneu_mLogicalProberu_mVisualProberureset(uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/hebrewprober.pyu__init__�s
		uHebrewProber.__init__cCs(d|_d|_d|_d|_dS(Niu (u_mFinalCharLogicalScoreu_mFinalCharVisualScoreu_mPrevu_mBeforePrev(uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/hebrewprober.pyureset�s			uHebrewProber.resetcCs||_||_dS(N(u_mLogicalProberu_mVisualProber(uselfu
logicalProberuvisualProber((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/hebrewprober.pyuset_model_probers�s	uHebrewProber.set_model_proberscCst|�tttttgkS(N(uwrap_ordu	FINAL_KAFu	FINAL_MEMu	FINAL_NUNuFINAL_PEuFINAL_TSADI(uselfuc((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/hebrewprober.pyuis_final�suHebrewProber.is_finalcCst|�ttttgkS(N(uwrap_ordu
NORMAL_KAFu
NORMAL_MEMu
NORMAL_NUNu	NORMAL_PE(uselfuc((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/hebrewprober.pyuis_non_final�suHebrewProber.is_non_finalcCs�|j�tkrtS|j|�}x�|D]�}|dkr�|jdkr�|j|j�rq|jd7_q�|j|j�r�|jd7_q�q�n?|jdkr�|j|j�r�|dkr�|jd7_n|j|_||_q,Wt	S(Nu i(
u	get_stateueNotMeufilter_high_bit_onlyu_mBeforePrevuis_finalu_mPrevu_mFinalCharLogicalScoreuis_non_finalu_mFinalCharVisualScoreu
eDetecting(uselfuaBufucur((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/hebrewprober.pyufeed�s 

uHebrewProber.feedcCs�|j|j}|tkr tS|tkr1tS|jj�|jj�}|tkr]tS|tkrntS|dkr~tStS(Ng(	u_mFinalCharLogicalScoreu_mFinalCharVisualScoreuMIN_FINAL_CHAR_DISTANCEuLOGICAL_HEBREW_NAMEuVISUAL_HEBREW_NAMEu_mLogicalProberuget_confidenceu_mVisualProberuMIN_MODEL_DISTANCE(uselfufinalsubumodelsub((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/hebrewprober.pyuget_charset_name�s

uHebrewProber.get_charset_namecCs2|jj�tkr.|jj�tkr.tStS(N(u_mLogicalProberu	get_stateueNotMeu_mVisualProberu
eDetecting(uself((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/hebrewprober.pyu	get_statesuHebrewProber.get_stateN(u__name__u
__module__u__qualname__u__init__uresetuset_model_probersuis_finaluis_non_finalufeeduget_charset_nameu	get_state(u
__locals__((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/hebrewprober.pyuHebrewProber�s

;uHebrewProberN(u
charsetproberu
CharSetProberu	constantsueNotMeu
eDetectingucompatuwrap_ordu	FINAL_KAFu
NORMAL_KAFu	FINAL_MEMu
NORMAL_MEMu	FINAL_NUNu
NORMAL_NUNuFINAL_PEu	NORMAL_PEuFINAL_TSADIuNORMAL_TSADIuMIN_FINAL_CHAR_DISTANCEuMIN_MODEL_DISTANCEuVISUAL_HEBREW_NAMEuLOGICAL_HEBREW_NAMEuHebrewProber(((uK/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/hebrewprober.pyu<module>s"dsite-packages/pip/_vendor/requests/packages/chardet/__pycache__/utf8prober.cpython-33.pyc000064400000005443151733463740025531 0ustar00�
7�Re\
c@s`ddlmZddlmZddlmZddlmZdZGdd�de�Z	dS(	i(u	constants(u
CharSetProber(uCodingStateMachine(uUTF8SMModelg�?cBsP|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS(u
UTF8ProbercCs*tj|�tt�|_|j�dS(N(u
CharSetProberu__init__uCodingStateMachineuUTF8SMModelu
_mCodingSMureset(uself((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/utf8prober.pyu__init__%s
uUTF8Prober.__init__cCs'tj|�|jj�d|_dS(Ni(u
CharSetProberuresetu
_mCodingSMu
_mNumOfMBChar(uself((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/utf8prober.pyureset*s

uUTF8Prober.resetcCsdS(Nuutf-8((uself((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/utf8prober.pyuget_charset_name/suUTF8Prober.get_charset_namecCs�x�|D]�}|jj|�}|tjkr>tj|_Pq|tjkr]tj|_Pq|tjkr|jj	�dkr�|j
d7_
q�qqW|j�tjkr�|j
�tjkr�tj|_q�n|j�S(Nii(u
_mCodingSMu
next_stateu	constantsueErrorueNotMeu_mStateueItsMeueFoundItueStartuget_current_charlenu
_mNumOfMBCharu	get_stateu
eDetectinguget_confidenceuSHORTCUT_THRESHOLD(uselfuaBufucucodingState((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/utf8prober.pyufeed2s
uUTF8Prober.feedcCsLd}|jdkrDx$td|j�D]}|t}q(Wd|S|SdS(Ng�G�z��?iig�?(u
_mNumOfMBCharurangeu
ONE_CHAR_PROB(uselfuunlikeui((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/utf8prober.pyuget_confidenceEsuUTF8Prober.get_confidenceN(u__name__u
__module__u__qualname__u__init__uresetuget_charset_nameufeeduget_confidence(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/utf8prober.pyu
UTF8Prober$s
u
UTF8ProberN(
uu	constantsu
charsetproberu
CharSetProberucodingstatemachineuCodingStateMachineumbcssmuUTF8SMModelu
ONE_CHAR_PROBu
UTF8Prober(((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/utf8prober.pyu<module>s
site-packages/pip/_vendor/requests/packages/chardet/__pycache__/codingstatemachine.cpython-33.pyc000064400000004617151733463740027264 0ustar00�
7�Re	c@s7ddlmZddlmZGdd�d�ZdS(i(ueStart(uwrap_ordcBsP|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS(uCodingStateMachinecCs)||_d|_d|_|j�dS(Ni(u_mModelu_mCurrentBytePosu_mCurrentCharLenureset(uselfusm((uQ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/codingstatemachine.pyu__init__!s			uCodingStateMachine.__init__cCs
t|_dS(N(ueStartu_mCurrentState(uself((uQ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/codingstatemachine.pyureset'suCodingStateMachine.resetcCs�|jdt|�}|jtkrFd|_|jd||_n|j|jd|}|jd||_|jd7_|jS(Nu
classTableiucharLenTableuclassFactoru
stateTablei(u_mModeluwrap_ordu_mCurrentStateueStartu_mCurrentBytePosu_mCurrentCharLen(uselfucubyteClsu
curr_state((uQ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/codingstatemachine.pyu
next_state*s	uCodingStateMachine.next_statecCs|jS(N(u_mCurrentCharLen(uself((uQ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/codingstatemachine.pyuget_current_charlen9su&CodingStateMachine.get_current_charlencCs|jdS(Nuname(u_mModel(uself((uQ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/codingstatemachine.pyuget_coding_state_machine<su+CodingStateMachine.get_coding_state_machineN(u__name__u
__module__u__qualname__u__init__uresetu
next_stateuget_current_charlenuget_coding_state_machine(u
__locals__((uQ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/codingstatemachine.pyuCodingStateMachine s
uCodingStateMachineN(u	constantsueStartucompatuwrap_orduCodingStateMachine(((uQ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/codingstatemachine.pyu<module>ssite-packages/pip/_vendor/requests/packages/chardet/__pycache__/chardetect.cpython-33.pyc000064400000003303151733463740025530 0ustar00�
7�Reuc@sqdZddlmZddlmZmZddlmZddd�Zdd	�Z	e
d
krme	�ndS(u
Script which takes one or more file paths and reports on their detected
encodings

Example::

    % chardetect somefile someotherfile
    somefile: windows-1252 with confidence 0.5
    someotherfile: ascii with confidence 1.0

If no paths are provided, it takes its input from stdin.

i(uopen(uargvustdin(uUniversalDetectorustdincCsit�}x|D]}|j|�qW|j�|j}|dr]d||d|dfSd|SdS(u;Return a string describing the probable encoding of a file.uencodingu%s: %s with confidence %su
confidenceu
%s: no resultN(uUniversalDetectorufeeducloseuresult(ufileunameuuulineuresult((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardetect.pyudescription_ofs	

	
udescription_ofcCsott�dkr%ttt��nFxCtdd�D]1}t|d��}tt||��WdQXq6WdS(Niurb(ulenuargvuprintudescription_ofustdinuopen(upathuf((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardetect.pyumain$s
umainu__main__N(u__doc__uiouopenusysuargvustdinuchardet.universaldetectoruUniversalDetectorudescription_ofumainu__name__(((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardetect.pyu<module>s	site-packages/pip/_vendor/requests/packages/chardet/__pycache__/big5prober.cpython-33.pyc000064400000002754151733463740025473 0ustar00�
7�Re�c@sZddlmZddlmZddlmZddlmZGdd�de�ZdS(i(uMultiByteCharSetProber(uCodingStateMachine(uBig5DistributionAnalysis(uBig5SMModelcBs,|EeZdZdd�Zdd�ZdS(u
Big5ProbercCs6tj|�tt�|_t�|_|j�dS(N(uMultiByteCharSetProberu__init__uCodingStateMachineuBig5SMModelu
_mCodingSMuBig5DistributionAnalysisu_mDistributionAnalyzerureset(uself((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/big5prober.pyu__init__#s
uBig5Prober.__init__cCsdS(NuBig5((uself((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/big5prober.pyuget_charset_name)suBig5Prober.get_charset_nameN(u__name__u
__module__u__qualname__u__init__uget_charset_name(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/big5prober.pyu
Big5Prober"su
Big5ProberN(	umbcharsetproberuMultiByteCharSetProberucodingstatemachineuCodingStateMachineuchardistributionuBig5DistributionAnalysisumbcssmuBig5SMModelu
Big5Prober(((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/big5prober.pyu<module>ssite-packages/pip/_vendor/requests/packages/chardet/__pycache__/universaldetector.cpython-33.pyc000064400000011743151733463740027173 0ustar00�
7�Re�c@s�ddlmZddlZddlZddlmZddlmZddlm	Z	ddl
mZddlZdZ
dZdZd	ZGd
d�d�ZdS(i(u	constantsiN(uLatin1Prober(uMBCSGroupProber(uSBCSGroupProber(uEscCharSetProberg�������?icBsD|EeZdZdd�Zdd�Zdd�Zdd�Zd	S(
uUniversalDetectorcCsDtjd�|_tjd�|_d|_g|_|j�dS(Ns[�-�]s(|~{)(ureucompileu_highBitDetectoru_escDetectoruNoneu_mEscCharSetProberu_mCharSetProbersureset(uself((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/universaldetector.pyu__init__-s
		uUniversalDetector.__init__cCsidd6dd6|_d|_d|_d|_t|_d|_	|j
r]|j
j�nx|jD]}|j�qgWdS(Nuencodinggu
confidencesFT(
uNoneuresultuFalseudoneuTrueu_mStartu	_mGotDatau
ePureAsciiu_mInputStateu
_mLastCharu_mEscCharSetProberuresetu_mCharSetProbers(uselfuprober((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/universaldetector.pyureset4s						uUniversalDetector.resetcCsN|jr
dSt|�}|s#dS|js�|dd�tjkr_idd6dd6|_q�|dd�tjkr�idd6dd6|_q�|dd�tjkr�idd6dd6|_q�|dd�d	kr�id
d6dd6|_q�|dd�dkr%idd6dd6|_q�|dd
�tjkrXidd6dd6|_q�|dd
�tj	kr�idd6dd6|_q�nd|_|jdr�|jddkr�d|_dS|jtkr(|j
j|�r�t|_q(|jtkr(|jj|j|�r(t|_q(n|dd�|_|jtkr�|jsbt�|_n|jj|�tjkrJi|jj�d6|jj�d6|_d|_qJn�|jtkrJ|js�t�t�t�g|_nx\|jD]N}|j|�tjkr�i|j�d6|j�d6|_d|_Pq�q�WndS(NiuUTF-8uencodingg�?u
confidenceiuUTF-32LEuUTF-32BEs��uX-ISO-10646-UCS-4-3412s��uX-ISO-10646-UCS-4-2143iuUTF-16LEuUTF-16BEgiTi����(udoneulenu	_mGotDataucodecsuBOMuresultuBOM_UTF32_LEuBOM_UTF32_BEuBOM_LEuBOM_BEuTrueu_mInputStateu
ePureAsciiu_highBitDetectorusearchu	eHighbyteu_escDetectoru
_mLastCharu	eEscAsciiu_mEscCharSetProberuEscCharSetProberufeedu	constantsueFoundItuget_charset_nameuget_confidenceu_mCharSetProbersuMBCSGroupProberuSBCSGroupProberuLatin1Prober(uselfuaBufuaLenuprober((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/universaldetector.pyufeed@sh			 				uUniversalDetector.feedcCs�|jr
dS|js6tjr2tjjd�ndSd
|_|jt	krlidd6dd6|_
|j
S|jtkrd}d}d}xD|j
D]9}|s�q�n|j�}||kr�|}|}q�q�W|r|tkri|j�d6|j�d6|_
|j
Sntjr|tjjd�xM|j
djD]8}|sOq=ntjjd	|j�|j�f�q=WndS(Nuno data received!
uasciiuencodingg�?u
confidencegu"no probers hit minimum threshhold
iu%s confidence = %s
T(udoneu	_mGotDatau	constantsu_debugusysustderruwriteuTrueu_mInputStateu
ePureAsciiuresultu	eHighbyteuNoneu_mCharSetProbersuget_confidenceuMINIMUM_THRESHOLDuget_charset_nameumProbers(uselfuproberConfidenceumaxProberConfidenceu	maxProberuprober((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/universaldetector.pyuclose�sB				

		uUniversalDetector.closeN(u__name__u
__module__u__qualname__u__init__uresetufeeduclose(u
__locals__((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/universaldetector.pyuUniversalDetector,sFuUniversalDetector(uu	constantsusysucodecsulatin1proberuLatin1ProberumbcsgroupproberuMBCSGroupProberusbcsgroupproberuSBCSGroupProberu	escproberuEscCharSetProberureuMINIMUM_THRESHOLDu
ePureAsciiu	eEscAsciiu	eHighbyteuUniversalDetector(((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/universaldetector.pyu<module>ssite-packages/pip/_vendor/requests/packages/chardet/__pycache__/langbulgarianmodel.cpython-33.pyc000064400000060521151733463740027256 0ustar00�
7�Re�1c@shd�Zd�Zd�Zied�6ed�6d�d�6d�d�6d�d�6Zied�6ed�6d�d�6d�d�6d�d�6Zd�S(�i�i�i�i�iMiZicidiHimikieiOi�iQifiLi^iRini�ili[iJiwiTi`ioi�isiAiEiFiBi?iDipigi\i�ihi_iViWiGiti�iUi]iaiqi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iii�i�i�i�i�i�i-i�i�ii i#i+i%i,i7i/i(i;i!i.i&i$i)ii'ii"i3i0i1i5i2i6i9i=i�iCi�i<i8iii	iiiiiiiii
iiii
iiiiiiiiiiiiKi4i�i*ii>i�i�i�i:i�ibi�i�i�i�i�i�ixiNi@iSiyiuiXiziYijiIiPiviriucharToOrderMapuprecedenceMatrixg! _B�?umTypicalPositiveRatioukeepEnglishLetteru
ISO-8859-5ucharsetNameuwindows-1251N(i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iMiZicidiHimikieiOi�iQifiLi^iRini�ili[iJiwiTi`ioi�isi�i�i�i�i�i�iAiEiFiBi?iDipigi\i�ihi_iViWiGiti�iUi]iaiqi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iQi�i�i�i�i�iii�i�i�i�i�i�i-i�i�ii i#i+i%i,i7i/i(i;i!i.i&i$i)ii'ii"i3i0i1i5i2i6i9i=i�iCi�i<i8iii	iiiiiiiii
iiii
iiiiiiiiiiiiKi4i�i*ii>i�i�i�i:i�ibi�i�i�i�i�i�i[i�i�(i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iMiZicidiHimikieiOi�iQifiLi^iRini�ili[iJiwiTi`ioi�isi�i�i�i�i�i�iAiEiFiBi?iDipigi\i�ihi_iViWiGiti�iUi]iaiqi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ixi�i�i�i�i�i�i�i�iNi@iSiyibiuiii�i�i�i�i�i�i�i�iXi�i�i�i�iziYiji�i�i�i�i�i-i�i�iIiPiviri�i�i�i�i�i>i:i�i�i�i�i�ii i#i+i%i,i7i/i(i;i!i.i&i$i)ii'ii"i3i0i1i5i2i6i9i=i�iCi�i<i8iii	iiiiiiiii
iiii
iiiiiiiiiiiiKi4i�i*i(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiF(uLatin5_BulgarianCharToOrderMapuwin1251BulgarianCharToOrderMapuBulgarianLangModeluFalseuLatin5BulgarianModeluWin1251BulgarianModel(((uQ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/langbulgarianmodel.pyu<module>&sV

site-packages/pip/_vendor/requests/packages/chardet/__pycache__/sjisprober.cpython-33.pyc000064400000007120151733463740025605 0ustar00�
7�Re�c@s�ddlZddlmZddlmZddlmZddlmZddl	m
Z
ddlmZGd	d
�d
e�Z
dS(iNi(uMultiByteCharSetProber(uCodingStateMachine(uSJISDistributionAnalysis(uSJISContextAnalysis(uSJISSMModel(u	constantscBsP|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS(u
SJISProbercCsBtj|�tt�|_t�|_t�|_|j	�dS(N(
uMultiByteCharSetProberu__init__uCodingStateMachineuSJISSMModelu
_mCodingSMuSJISDistributionAnalysisu_mDistributionAnalyzeruSJISContextAnalysisu_mContextAnalyzerureset(uself((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/sjisprober.pyu__init__&s

uSJISProber.__init__cCstj|�|jj�dS(N(uMultiByteCharSetProberuresetu_mContextAnalyzer(uself((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/sjisprober.pyureset-s
uSJISProber.resetcCsdS(Nu	SHIFT_JIS((uself((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/sjisprober.pyuget_charset_name1suSJISProber.get_charset_namecCs�t|�}xltd|�D][}|jj||�}|tjkr�tjr{tjj	|j
�dt|�d�ntj|_
Pq|tjkr�tj|_
Pq|tjkr|jj�}|dkr"|d|jd<|jj|jd|d�|�|jj|j|�qw|jj||d||d|�|�|jj||d|d�|�qqW||d|jd<|j�tjkr�|jj�r�|j�tjkr�tj|_
q�n|j�S(Niu prober hit error at byte u
iii(ulenurangeu
_mCodingSMu
next_stateu	constantsueErroru_debugusysustderruwriteuget_charset_nameustrueNotMeu_mStateueItsMeueFoundItueStartuget_current_charlenu
_mLastCharu_mContextAnalyzerufeedu_mDistributionAnalyzeru	get_stateu
eDetectingugot_enough_datauget_confidenceuSHORTCUT_THRESHOLD(uselfuaBufuaLenuiucodingStateucharLen((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/sjisprober.pyufeed4s:		"uSJISProber.feedcCs+|jj�}|jj�}t||�S(N(u_mContextAnalyzeruget_confidenceu_mDistributionAnalyzerumax(uselfucontxtCfu	distribCf((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/sjisprober.pyuget_confidenceXsuSJISProber.get_confidenceN(u__name__u
__module__u__qualname__u__init__uresetuget_charset_nameufeeduget_confidence(u
__locals__((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/sjisprober.pyu
SJISProber%s
$u
SJISProber(usysumbcharsetproberuMultiByteCharSetProberucodingstatemachineuCodingStateMachineuchardistributionuSJISDistributionAnalysisujpcntxuSJISContextAnalysisumbcssmuSJISSMModeluu	constantsu
SJISProber(((uI/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/sjisprober.pyu<module>ssite-packages/pip/_vendor/requests/packages/chardet/__pycache__/charsetprober.cpython-33.pyc000064400000005701151733463740026271 0ustar00�
7�Renc@s3ddlmZddlZGdd�d�ZdS(i(u	constantsiNcBs�|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�ZdS(u
CharSetProbercCsdS(N((uself((uL/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/charsetprober.pyu__init__"suCharSetProber.__init__cCstj|_dS(N(u	constantsu
eDetectingu_mState(uself((uL/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/charsetprober.pyureset%suCharSetProber.resetcCsdS(N(uNone(uself((uL/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/charsetprober.pyuget_charset_name(suCharSetProber.get_charset_namecCsdS(N((uselfuaBuf((uL/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/charsetprober.pyufeed+suCharSetProber.feedcCs|jS(N(u_mState(uself((uL/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/charsetprober.pyu	get_state.suCharSetProber.get_statecCsdS(Ng((uself((uL/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/charsetprober.pyuget_confidence1suCharSetProber.get_confidencecCstjdd|�}|S(Ns([-])+s (ureusub(uselfuaBuf((uL/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/charsetprober.pyufilter_high_bit_only4su"CharSetProber.filter_high_bit_onlycCstjdd|�}|S(Ns([A-Za-z])+s (ureusub(uselfuaBuf((uL/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/charsetprober.pyufilter_without_english_letters8su,CharSetProber.filter_without_english_letterscCs|S(N((uselfuaBuf((uL/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/charsetprober.pyufilter_with_english_letters<su)CharSetProber.filter_with_english_lettersN(u__name__u
__module__u__qualname__u__init__uresetuget_charset_nameufeedu	get_stateuget_confidenceufilter_high_bit_onlyufilter_without_english_lettersufilter_with_english_letters(u
__locals__((uL/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/charsetprober.pyu
CharSetProber!su
CharSetProber(uu	constantsureu
CharSetProber(((uL/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/charsetprober.pyu<module>ssite-packages/pip/_vendor/requests/packages/chardet/__pycache__/chardistribution.cpython-33.pyc000064400000027003151733463740027002 0ustar00�
7�Re
$c@sOddlmZmZmZddlmZmZmZddlm	Z	m
Z
mZddlm
Z
mZmZddlmZmZmZddlmZdZdZd	Zd
ZGdd�d�ZGd
d�de�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd�de�Z dS(i(uEUCTWCharToFreqOrderuEUCTW_TABLE_SIZEu EUCTW_TYPICAL_DISTRIBUTION_RATIO(uEUCKRCharToFreqOrderuEUCKR_TABLE_SIZEu EUCKR_TYPICAL_DISTRIBUTION_RATIO(uGB2312CharToFreqOrderuGB2312_TABLE_SIZEu!GB2312_TYPICAL_DISTRIBUTION_RATIO(uBig5CharToFreqOrderuBIG5_TABLE_SIZEuBIG5_TYPICAL_DISTRIBUTION_RATIO(uJISCharToFreqOrderuJIS_TABLE_SIZEuJIS_TYPICAL_DISTRIBUTION_RATIO(uwrap_ordig�G�z��?g{�G�z�?icBs\|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S(uCharDistributionAnalysiscCs)d|_d|_d|_|j�dS(N(uNoneu_mCharToFreqOrderu_mTableSizeu_mTypicalDistributionRatioureset(uself((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyu__init__/s			u!CharDistributionAnalysis.__init__cCsd|_d|_d|_dS(ureset analyser, clear any stateiNF(uFalseu_mDoneu_mTotalCharsu_mFreqChars(uself((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyureset;s		uCharDistributionAnalysis.resetcCs}|dkr|j|�}nd}|dkry|jd7_||jkryd|j|krv|jd7_qvqyndS(u"feed a character with known lengthiiiiNi����(u	get_orderu_mTotalCharsu_mTableSizeu_mCharToFreqOrderu_mFreqChars(uselfuaBufuaCharLenuorder((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyufeedDsuCharDistributionAnalysis.feedcCsi|jdks|jtkr"tS|j|jkre|j|j|j|j}|tkre|SntS(u(return confidence based on existing datai(u_mTotalCharsu_mFreqCharsuMINIMUM_DATA_THRESHOLDuSURE_NOu_mTypicalDistributionRatiouSURE_YES(uselfur((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyuget_confidenceRsu'CharDistributionAnalysis.get_confidencecCs
|jtkS(N(u_mTotalCharsuENOUGH_DATA_THRESHOLD(uself((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyugot_enough_databsu(CharDistributionAnalysis.got_enough_datacCsdS(Nii����((uselfuaBuf((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyu	get_ordergsu"CharDistributionAnalysis.get_orderN(	u__name__u
__module__u__qualname__u__init__uresetufeeduget_confidenceugot_enough_datau	get_order(u
__locals__((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyuCharDistributionAnalysis.s	uCharDistributionAnalysiscBs,|EeZdZdd�Zdd�ZdS(uEUCTWDistributionAnalysiscCs,tj|�t|_t|_t|_dS(N(uCharDistributionAnalysisu__init__uEUCTWCharToFreqOrderu_mCharToFreqOrderuEUCTW_TABLE_SIZEu_mTableSizeu EUCTW_TYPICAL_DISTRIBUTION_RATIOu_mTypicalDistributionRatio(uself((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyu__init__ps
		u"EUCTWDistributionAnalysis.__init__cCsBt|d�}|dkr:d|dt|d�dSdSdS(Nii�i^ii�i����(uwrap_ord(uselfuaBufu
first_char((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyu	get_ordervsu#EUCTWDistributionAnalysis.get_orderN(u__name__u
__module__u__qualname__u__init__u	get_order(u
__locals__((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyuEUCTWDistributionAnalysisosuEUCTWDistributionAnalysiscBs,|EeZdZdd�Zdd�ZdS(uEUCKRDistributionAnalysiscCs,tj|�t|_t|_t|_dS(N(uCharDistributionAnalysisu__init__uEUCKRCharToFreqOrderu_mCharToFreqOrderuEUCKR_TABLE_SIZEu_mTableSizeu EUCKR_TYPICAL_DISTRIBUTION_RATIOu_mTypicalDistributionRatio(uself((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyu__init__�s
		u"EUCKRDistributionAnalysis.__init__cCsBt|d�}|dkr:d|dt|d�dSdSdS(Nii�i^ii�i����(uwrap_ord(uselfuaBufu
first_char((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyu	get_order�su#EUCKRDistributionAnalysis.get_orderN(u__name__u
__module__u__qualname__u__init__u	get_order(u
__locals__((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyuEUCKRDistributionAnalysis�suEUCKRDistributionAnalysiscBs,|EeZdZdd�Zdd�ZdS(uGB2312DistributionAnalysiscCs,tj|�t|_t|_t|_dS(N(uCharDistributionAnalysisu__init__uGB2312CharToFreqOrderu_mCharToFreqOrderuGB2312_TABLE_SIZEu_mTableSizeu!GB2312_TYPICAL_DISTRIBUTION_RATIOu_mTypicalDistributionRatio(uself((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyu__init__�s
		u#GB2312DistributionAnalysis.__init__cCsUt|d�t|d�}}|dkrM|dkrMd|d|dSdSdS(Niii�i�i^i����(uwrap_ord(uselfuaBufu
first_charusecond_char((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyu	get_order�s!u$GB2312DistributionAnalysis.get_orderN(u__name__u
__module__u__qualname__u__init__u	get_order(u
__locals__((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyuGB2312DistributionAnalysis�suGB2312DistributionAnalysiscBs,|EeZdZdd�Zdd�ZdS(uBig5DistributionAnalysiscCs,tj|�t|_t|_t|_dS(N(uCharDistributionAnalysisu__init__uBig5CharToFreqOrderu_mCharToFreqOrderuBIG5_TABLE_SIZEu_mTableSizeuBIG5_TYPICAL_DISTRIBUTION_RATIOu_mTypicalDistributionRatio(uself((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyu__init__�s
		u!Big5DistributionAnalysis.__init__cCspt|d�t|d�}}|dkrh|dkrQd|d|ddSd|d|dSndSdS(	Niii�i�i�i?i@i����(uwrap_ord(uselfuaBufu
first_charusecond_char((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyu	get_order�s!u"Big5DistributionAnalysis.get_orderN(u__name__u
__module__u__qualname__u__init__u	get_order(u
__locals__((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyuBig5DistributionAnalysis�suBig5DistributionAnalysiscBs,|EeZdZdd�Zdd�ZdS(uSJISDistributionAnalysiscCs,tj|�t|_t|_t|_dS(N(uCharDistributionAnalysisu__init__uJISCharToFreqOrderu_mCharToFreqOrderuJIS_TABLE_SIZEu_mTableSizeuJIS_TYPICAL_DISTRIBUTION_RATIOu_mTypicalDistributionRatio(uself((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyu__init__�s
		u!SJISDistributionAnalysis.__init__cCs�t|d�t|d�}}|dkrJ|dkrJd|d}n1|dkrw|dkrwd|dd}ndS||d	}|d
kr�d}n|S(
Niii�i�i�i�i�ii@ii����i����(uwrap_ord(uselfuaBufu
first_charusecond_charuorder((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyu	get_order�s!	u"SJISDistributionAnalysis.get_orderN(u__name__u
__module__u__qualname__u__init__u	get_order(u
__locals__((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyuSJISDistributionAnalysis�suSJISDistributionAnalysiscBs,|EeZdZdd�Zdd�ZdS(uEUCJPDistributionAnalysiscCs,tj|�t|_t|_t|_dS(N(uCharDistributionAnalysisu__init__uJISCharToFreqOrderu_mCharToFreqOrderuJIS_TABLE_SIZEu_mTableSizeuJIS_TYPICAL_DISTRIBUTION_RATIOu_mTypicalDistributionRatio(uself((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyu__init__�s
		u"EUCJPDistributionAnalysis.__init__cCsBt|d�}|dkr:d|dt|d�dSdSdS(Nii�i^i�ii����(uwrap_ord(uselfuaBufuchar((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyu	get_order�su#EUCJPDistributionAnalysis.get_orderN(u__name__u
__module__u__qualname__u__init__u	get_order(u
__locals__((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyuEUCJPDistributionAnalysis�suEUCJPDistributionAnalysisN(!u	euctwfrequEUCTWCharToFreqOrderuEUCTW_TABLE_SIZEu EUCTW_TYPICAL_DISTRIBUTION_RATIOu	euckrfrequEUCKRCharToFreqOrderuEUCKR_TABLE_SIZEu EUCKR_TYPICAL_DISTRIBUTION_RATIOu
gb2312frequGB2312CharToFreqOrderuGB2312_TABLE_SIZEu!GB2312_TYPICAL_DISTRIBUTION_RATIOubig5frequBig5CharToFreqOrderuBIG5_TABLE_SIZEuBIG5_TYPICAL_DISTRIBUTION_RATIOujisfrequJISCharToFreqOrderuJIS_TABLE_SIZEuJIS_TYPICAL_DISTRIBUTION_RATIOucompatuwrap_orduENOUGH_DATA_THRESHOLDuSURE_YESuSURE_NOuMINIMUM_DATA_THRESHOLDuCharDistributionAnalysisuEUCTWDistributionAnalysisuEUCKRDistributionAnalysisuGB2312DistributionAnalysisuBig5DistributionAnalysisuSJISDistributionAnalysisuEUCJPDistributionAnalysis(((uO/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/chardistribution.pyu<module>s Asite-packages/pip/_vendor/requests/packages/chardet/__pycache__/langhungarianmodel.cpython-33.pyc000064400000060501151733463750027265 0ustar00�
7�Re�0c@shd�Zd�Zd�Zied�6ed�6d�d�6d�d�6d�d�6Zied�6ed�6d�d�6d�d�6d�d�6Zd�S(�i�i�i�i�ii(i6i-i i2i1i&i'i5i$i)i"i#i/i.iGi+i!i%i9i0i@iDi7i4iiiiiiiii	iiii
iiiiCi
iiiiiAi>iii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iKi�i�i�i�i�i�i�i�iOi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i3iQi�iNi�i�i�i�i,i�i�i�i=i�i�i�i�i�i:i�iBi;i�i�i�i<iEi?i�i�i�iRiiJi�iFiPi�iHi�iiSiMiTiiLiUi�i�i�iiIi*ii�i�i�ii8ii�iViWiucharToOrderMapuprecedenceMatrixg��(��P�?umTypicalPositiveRatioukeepEnglishLetteru
ISO-8859-2ucharsetNameuwindows-1250N(i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ii(i6i-i i2i1i&i'i5i$i)i"i#i/i.iGi+i!i%i9i0i@iDi7i4i�i�i�i�i�i�iiiiiiiii	iiii
iiiiCi
iiiiiAi>iii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iKi�i�i�i�i�i�i�i�iOi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i3iQi�iNi�i�i�i�i,i�i�i�i=i�i�i�i�i�i:i�iBi;i�i�i�i<iEi?i�i�i�iRiiJi�iFiPi�iHi�iiSiMiTiiLiUi�i�i�iiIi*ii�i�i�ii8ii�i�i�(i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ii(i6i-i i2i1i&i'i5i$i)i"i#i/i.iHi+i!i%i9i0i@iDi7i4i�i�i�i�i�i�iiiiiiiii	iiii
iiiiCi
iiiiiAi>iii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iNi�iEi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iLi�i�i�i�i�i�i�i�iQi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i3iSi�iPi�i�i�i�i,i�i�i�i=i�i�i�i�i�i:i�iBi;i�i�i�i<iFi?i�i�i�iTiiKi�iGiRi�iIi�iiUiOiViiMiWi�i�i�iiJi*ii�i�i�ii8ii�i�i�(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiT(uLatin2_HungarianCharToOrderMapuwin1250HungarianCharToOrderMapuHungarianLangModeluTrueuLatin2HungarianModeluWin1250HungarianModel(((uQ/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/langhungarianmodel.pyu<module>#sV

site-packages/pip/_vendor/requests/packages/chardet/__pycache__/langcyrillicmodel.cpython-33.pyc000064400000073603151733463750027132 0ustar00�
7�Re=Ec@s$d�Zd�Zd�Zd�Zd�Zd�Zd�Zied�6ed�6d�d�6d�d�6d�d�6Zied�6ed�6d�d�6d�d�6d�d�6Z	ied�6ed�6d�d�6d�d�6d�d�6Z
ied�6ed�6d�d�6d�d�6d�d�6Zied�6ed�6d�d�6d�d�6d�d�6Zied�6ed�6d�d�6d�d�6d�d�6Z
d�S(�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iJi�iKi�i�i�i�i�i�i�i�i�i�i�i�iGi�iBi�iAi�iLi�i@i�i�iMiHi�iEiCi�iNiIi�i�iOi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iDi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiii
ii'iiiiiiiiiiii	iiiii
iiiiiiii6i;i%i,i:i)i0i5i.i7i*i<i$i1i&ii"i#i+i-i i(i4i8i!i=i>i3i9i/i?i2iFiucharToOrderMapuprecedenceMatrixgl���P@�?umTypicalPositiveRatioukeepEnglishLetteruKOI8-RucharsetNameuwindows-1251u
ISO-8859-5uMacCyrillicuIBM866uIBM855N(i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iJi�iKi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iGi�iBi�iAi�iLi�i@i�i�iMiHi�iEiCi�iNiIi�i�iOi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iDi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iiiii
ii'iiiiiiiiiiii	iiiii
iiiiiiii6i;i%i,i:i)i0i5i.i7i*i<i$i1i&ii"i#i+i-i i(i4i8i!i=i>i3i9i/i?i2iF(i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iJi�iKi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iGi�iBi�iAi�iLi�i@i�i�iMiHi�iEiCi�iNiIi�i�iOi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iDi�i�i�i�i�i�i�i%i,i!i.i)i0i8i3i*i<i$i1i&ii"i#i-i i(i4i5i7i:i2i9i?iFi>i=i/i;i+iii
ii
iiiiiiiiiiii	iiii'iiiiii6iiiii(i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iJi�iKi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iGi�iBi�iAi�iLi�i@i�i�iMiHi�iEiCi�iNiIi�i�iOi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i%i,i!i.i)i0i8i3i*i<i$i1i&ii"i#i-i i(i4i5i7i:i2i9i?iFi>i=i/i;i+iii
ii
iiiiiiiiiiii	iiii'iiiiii6iiiiii�iDi�i�i�i�i�i�i�i�i�i�i�i�i�i�(i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iJi�iKi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iGi�iBi�iAi�iLi�i@i�i�iMiHi�iEiCi�iNiIi�i�iOi�i�i�i�i�i�i�i�i�i%i,i!i.i)i0i8i3i*i<i$i1i&ii"i#i-i i(i4i5i7i:i2i9i?iFi>i=i/i;i+i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iDiiii
ii
iiiiiiiiiiii	iiii'iiiiii6iiiii�(i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iJi�iKi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iGi�iBi�iAi�iLi�i@i�i�iMiHi�iEiCi�iNiIi�i�iOi�i�i�i�i�i�i�i�i�i�i�i�i�iDi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�ii;i6iFii%ii,ii:i
i)ii0i'i5ii.i�i�i�i�i�i�i�ii7ii*i�i�i�i�ii<i�i�i�i�i�i�i�ii$i�i�i�i�i�i�i�i�ii1ii&iiii"ii�i�i�i�i#ii�i+i	i-ii ii(ii4ii8i
i!ii=i�i�ii>ii3ii9ii/ii?ii2i�i�i�(i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iJi�iKi�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�iGi�iBi�iAi�iLi�i@i�i�iMiHi�iEiCi�iNiIi�i�iOi�i�i�i�i�i�i�i�i�i%i,i!i.i)i0i8i3i*i<i$i1i&ii"i#i-i i(i4i5i7i:i2i9i?iFi>i=i/i;i+iii
ii
iiiiiiiiiiii�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i	iiii'iiiiii6iiiiii�iDi�i�i�i�i�i�i�i�i�i�i�i�i�i�(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiF(uKOI8R_CharToOrderMapuwin1251_CharToOrderMapulatin5_CharToOrderMapumacCyrillic_CharToOrderMapuIBM855_CharToOrderMapuIBM866_CharToOrderMapuRussianLangModeluFalseu
Koi8rModeluWin1251CyrillicModeluLatin5CyrillicModeluMacCyrillicModeluIbm866ModeluIbm855Model(((uP/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/langcyrillicmodel.pyu<module>s





site-packages/pip/_vendor/requests/packages/chardet/__pycache__/escprober.cpython-33.pyc000064400000006205151733463750025413 0ustar00�
7�Resc@s|ddlmZddlmZmZmZmZddlmZddl	m
Z
ddlmZGdd�de�Z
dS(	i(u	constants(u	HZSMModeluISO2022CNSMModeluISO2022JPSMModeluISO2022KRSMModel(u
CharSetProber(uCodingStateMachine(uwrap_ordcBsP|EeZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS(uEscCharSetProbercCsHtj|�tt�tt�tt�tt�g|_|j�dS(N(	u
CharSetProberu__init__uCodingStateMachineu	HZSMModeluISO2022CNSMModeluISO2022JPSMModeluISO2022KRSMModelu
_mCodingSMureset(uself((uH/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/escprober.pyu__init__%s
			uEscCharSetProber.__init__cCs_tj|�x0|jD]%}|s)qnd|_|j�qWt|j�|_d|_dS(NT(	u
CharSetProberuresetu
_mCodingSMuTrueuactiveulenu
_mActiveSMuNoneu_mDetectedCharset(uselfucodingSM((uH/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/escprober.pyureset/s
	uEscCharSetProber.resetcCs|jS(N(u_mDetectedCharset(uself((uH/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/escprober.pyuget_charset_name9su!EscCharSetProber.get_charset_namecCs|jr
dSdSdS(Ng�G�z��?g(u_mDetectedCharset(uself((uH/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/escprober.pyuget_confidence<s	uEscCharSetProber.get_confidencecCs�x�|D]�}x�|jD]�}|s)qn|js8qn|jt|��}|tjkr�d|_|jd8_|jdkr�tj|_	|j
�Sq|tjkrtj|_	|j
�|_|j
�SqWqW|j
�S(NiiF(u
_mCodingSMuactiveu
next_stateuwrap_ordu	constantsueErroruFalseu
_mActiveSMueNotMeu_mStateu	get_stateueItsMeueFoundItuget_coding_state_machineu_mDetectedCharset(uselfuaBufucucodingSMucodingState((uH/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/escprober.pyufeedBs$
		
uEscCharSetProber.feedN(u__name__u
__module__u__qualname__u__init__uresetuget_charset_nameuget_confidenceufeed(u
__locals__((uH/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/escprober.pyuEscCharSetProber$s


uEscCharSetProberN(uu	constantsuescsmu	HZSMModeluISO2022CNSMModeluISO2022JPSMModeluISO2022KRSMModelu
charsetproberu
CharSetProberucodingstatemachineuCodingStateMachineucompatuwrap_orduEscCharSetProber(((uH/tmp/pip-zej_zi-build/pip/_vendor/requests/packages/chardet/escprober.pyu<module>s
"site-packages/pip/_vendor/requests/packages/chardet/latin1prober.py000064400000012171151733463750021547 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Universal charset detector code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 2001
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#   Shy Shalom - original C code
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

from .charsetprober import CharSetProber
from .constants import eNotMe
from .compat import wrap_ord

FREQ_CAT_NUM = 4

UDF = 0  # undefined
OTH = 1  # other
ASC = 2  # ascii capital letter
ASS = 3  # ascii small letter
ACV = 4  # accent capital vowel
ACO = 5  # accent capital other
ASV = 6  # accent small vowel
ASO = 7  # accent small other
CLASS_NUM = 8  # total classes

Latin1_CharToClass = (
    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 00 - 07
    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 08 - 0F
    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 10 - 17
    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 18 - 1F
    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 20 - 27
    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 28 - 2F
    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 30 - 37
    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 38 - 3F
    OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 40 - 47
    ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 48 - 4F
    ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 50 - 57
    ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH,   # 58 - 5F
    OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 60 - 67
    ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 68 - 6F
    ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 70 - 77
    ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH,   # 78 - 7F
    OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH,   # 80 - 87
    OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF,   # 88 - 8F
    UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 90 - 97
    OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO,   # 98 - 9F
    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # A0 - A7
    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # A8 - AF
    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # B0 - B7
    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # B8 - BF
    ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO,   # C0 - C7
    ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV,   # C8 - CF
    ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH,   # D0 - D7
    ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO,   # D8 - DF
    ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO,   # E0 - E7
    ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV,   # E8 - EF
    ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH,   # F0 - F7
    ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO,   # F8 - FF
)

# 0 : illegal
# 1 : very unlikely
# 2 : normal
# 3 : very likely
Latin1ClassModel = (
    # UDF OTH ASC ASS ACV ACO ASV ASO
    0,  0,  0,  0,  0,  0,  0,  0,  # UDF
    0,  3,  3,  3,  3,  3,  3,  3,  # OTH
    0,  3,  3,  3,  3,  3,  3,  3,  # ASC
    0,  3,  3,  3,  1,  1,  3,  3,  # ASS
    0,  3,  3,  3,  1,  2,  1,  2,  # ACV
    0,  3,  3,  3,  3,  3,  3,  3,  # ACO
    0,  3,  1,  3,  1,  1,  1,  3,  # ASV
    0,  3,  1,  3,  1,  1,  3,  3,  # ASO
)


class Latin1Prober(CharSetProber):
    def __init__(self):
        CharSetProber.__init__(self)
        self.reset()

    def reset(self):
        self._mLastCharClass = OTH
        self._mFreqCounter = [0] * FREQ_CAT_NUM
        CharSetProber.reset(self)

    def get_charset_name(self):
        return "windows-1252"

    def feed(self, aBuf):
        aBuf = self.filter_with_english_letters(aBuf)
        for c in aBuf:
            charClass = Latin1_CharToClass[wrap_ord(c)]
            freq = Latin1ClassModel[(self._mLastCharClass * CLASS_NUM)
                                    + charClass]
            if freq == 0:
                self._mState = eNotMe
                break
            self._mFreqCounter[freq] += 1
            self._mLastCharClass = charClass

        return self.get_state()

    def get_confidence(self):
        if self.get_state() == eNotMe:
            return 0.01

        total = sum(self._mFreqCounter)
        if total < 0.01:
            confidence = 0.0
        else:
            confidence = ((self._mFreqCounter[3] / total)
                          - (self._mFreqCounter[1] * 20.0 / total))
        if confidence < 0.0:
            confidence = 0.0
        # lower the confidence of latin1 so that other more accurate
        # detector can take priority.
        confidence = confidence * 0.5
        return confidence
site-packages/pip/_vendor/requests/packages/chardet/chardistribution.py000064400000022012151733463750022515 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Communicator client code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

from .euctwfreq import (EUCTWCharToFreqOrder, EUCTW_TABLE_SIZE,
                        EUCTW_TYPICAL_DISTRIBUTION_RATIO)
from .euckrfreq import (EUCKRCharToFreqOrder, EUCKR_TABLE_SIZE,
                        EUCKR_TYPICAL_DISTRIBUTION_RATIO)
from .gb2312freq import (GB2312CharToFreqOrder, GB2312_TABLE_SIZE,
                         GB2312_TYPICAL_DISTRIBUTION_RATIO)
from .big5freq import (Big5CharToFreqOrder, BIG5_TABLE_SIZE,
                       BIG5_TYPICAL_DISTRIBUTION_RATIO)
from .jisfreq import (JISCharToFreqOrder, JIS_TABLE_SIZE,
                      JIS_TYPICAL_DISTRIBUTION_RATIO)
from .compat import wrap_ord

ENOUGH_DATA_THRESHOLD = 1024
SURE_YES = 0.99
SURE_NO = 0.01
MINIMUM_DATA_THRESHOLD = 3


class CharDistributionAnalysis:
    def __init__(self):
        # Mapping table to get frequency order from char order (get from
        # GetOrder())
        self._mCharToFreqOrder = None
        self._mTableSize = None  # Size of above table
        # This is a constant value which varies from language to language,
        # used in calculating confidence.  See
        # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html
        # for further detail.
        self._mTypicalDistributionRatio = None
        self.reset()

    def reset(self):
        """reset analyser, clear any state"""
        # If this flag is set to True, detection is done and conclusion has
        # been made
        self._mDone = False
        self._mTotalChars = 0  # Total characters encountered
        # The number of characters whose frequency order is less than 512
        self._mFreqChars = 0

    def feed(self, aBuf, aCharLen):
        """feed a character with known length"""
        if aCharLen == 2:
            # we only care about 2-bytes character in our distribution analysis
            order = self.get_order(aBuf)
        else:
            order = -1
        if order >= 0:
            self._mTotalChars += 1
            # order is valid
            if order < self._mTableSize:
                if 512 > self._mCharToFreqOrder[order]:
                    self._mFreqChars += 1

    def get_confidence(self):
        """return confidence based on existing data"""
        # if we didn't receive any character in our consideration range,
        # return negative answer
        if self._mTotalChars <= 0 or self._mFreqChars <= MINIMUM_DATA_THRESHOLD:
            return SURE_NO

        if self._mTotalChars != self._mFreqChars:
            r = (self._mFreqChars / ((self._mTotalChars - self._mFreqChars)
                 * self._mTypicalDistributionRatio))
            if r < SURE_YES:
                return r

        # normalize confidence (we don't want to be 100% sure)
        return SURE_YES

    def got_enough_data(self):
        # It is not necessary to receive all data to draw conclusion.
        # For charset detection, certain amount of data is enough
        return self._mTotalChars > ENOUGH_DATA_THRESHOLD

    def get_order(self, aBuf):
        # We do not handle characters based on the original encoding string,
        # but convert this encoding string to a number, here called order.
        # This allows multiple encodings of a language to share one frequency
        # table.
        return -1


class EUCTWDistributionAnalysis(CharDistributionAnalysis):
    def __init__(self):
        CharDistributionAnalysis.__init__(self)
        self._mCharToFreqOrder = EUCTWCharToFreqOrder
        self._mTableSize = EUCTW_TABLE_SIZE
        self._mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO

    def get_order(self, aBuf):
        # for euc-TW encoding, we are interested
        #   first  byte range: 0xc4 -- 0xfe
        #   second byte range: 0xa1 -- 0xfe
        # no validation needed here. State machine has done that
        first_char = wrap_ord(aBuf[0])
        if first_char >= 0xC4:
            return 94 * (first_char - 0xC4) + wrap_ord(aBuf[1]) - 0xA1
        else:
            return -1


class EUCKRDistributionAnalysis(CharDistributionAnalysis):
    def __init__(self):
        CharDistributionAnalysis.__init__(self)
        self._mCharToFreqOrder = EUCKRCharToFreqOrder
        self._mTableSize = EUCKR_TABLE_SIZE
        self._mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO

    def get_order(self, aBuf):
        # for euc-KR encoding, we are interested
        #   first  byte range: 0xb0 -- 0xfe
        #   second byte range: 0xa1 -- 0xfe
        # no validation needed here. State machine has done that
        first_char = wrap_ord(aBuf[0])
        if first_char >= 0xB0:
            return 94 * (first_char - 0xB0) + wrap_ord(aBuf[1]) - 0xA1
        else:
            return -1


class GB2312DistributionAnalysis(CharDistributionAnalysis):
    def __init__(self):
        CharDistributionAnalysis.__init__(self)
        self._mCharToFreqOrder = GB2312CharToFreqOrder
        self._mTableSize = GB2312_TABLE_SIZE
        self._mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO

    def get_order(self, aBuf):
        # for GB2312 encoding, we are interested
        #  first  byte range: 0xb0 -- 0xfe
        #  second byte range: 0xa1 -- 0xfe
        # no validation needed here. State machine has done that
        first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1])
        if (first_char >= 0xB0) and (second_char >= 0xA1):
            return 94 * (first_char - 0xB0) + second_char - 0xA1
        else:
            return -1


class Big5DistributionAnalysis(CharDistributionAnalysis):
    def __init__(self):
        CharDistributionAnalysis.__init__(self)
        self._mCharToFreqOrder = Big5CharToFreqOrder
        self._mTableSize = BIG5_TABLE_SIZE
        self._mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO

    def get_order(self, aBuf):
        # for big5 encoding, we are interested
        #   first  byte range: 0xa4 -- 0xfe
        #   second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe
        # no validation needed here. State machine has done that
        first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1])
        if first_char >= 0xA4:
            if second_char >= 0xA1:
                return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63
            else:
                return 157 * (first_char - 0xA4) + second_char - 0x40
        else:
            return -1


class SJISDistributionAnalysis(CharDistributionAnalysis):
    def __init__(self):
        CharDistributionAnalysis.__init__(self)
        self._mCharToFreqOrder = JISCharToFreqOrder
        self._mTableSize = JIS_TABLE_SIZE
        self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO

    def get_order(self, aBuf):
        # for sjis encoding, we are interested
        #   first  byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe
        #   second byte range: 0x40 -- 0x7e,  0x81 -- oxfe
        # no validation needed here. State machine has done that
        first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1])
        if (first_char >= 0x81) and (first_char <= 0x9F):
            order = 188 * (first_char - 0x81)
        elif (first_char >= 0xE0) and (first_char <= 0xEF):
            order = 188 * (first_char - 0xE0 + 31)
        else:
            return -1
        order = order + second_char - 0x40
        if second_char > 0x7F:
            order = -1
        return order


class EUCJPDistributionAnalysis(CharDistributionAnalysis):
    def __init__(self):
        CharDistributionAnalysis.__init__(self)
        self._mCharToFreqOrder = JISCharToFreqOrder
        self._mTableSize = JIS_TABLE_SIZE
        self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO

    def get_order(self, aBuf):
        # for euc-JP encoding, we are interested
        #   first  byte range: 0xa0 -- 0xfe
        #   second byte range: 0xa1 -- 0xfe
        # no validation needed here. State machine has done that
        char = wrap_ord(aBuf[0])
        if char >= 0xA0:
            return 94 * (char - 0xA1) + wrap_ord(aBuf[1]) - 0xa1
        else:
            return -1
site-packages/pip/_vendor/requests/packages/chardet/constants.py000064400000002467151733463750021170 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Universal charset detector code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 2001
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#   Shy Shalom - original C code
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
# 
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
# 
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

_debug = 0

eDetecting = 0
eFoundIt = 1
eNotMe = 2

eStart = 0
eError = 1
eItsMe = 2

SHORTCUT_THRESHOLD = 0.95
site-packages/pip/_vendor/requests/packages/chardet/chardetect.py000064400000002165151733463750021255 0ustar00#!/usr/bin/env python
"""
Script which takes one or more file paths and reports on their detected
encodings

Example::

    % chardetect somefile someotherfile
    somefile: windows-1252 with confidence 0.5
    someotherfile: ascii with confidence 1.0

If no paths are provided, it takes its input from stdin.

"""
from io import open
from sys import argv, stdin

from chardet.universaldetector import UniversalDetector


def description_of(file, name='stdin'):
    """Return a string describing the probable encoding of a file."""
    u = UniversalDetector()
    for line in file:
        u.feed(line)
    u.close()
    result = u.result
    if result['encoding']:
        return '%s: %s with confidence %s' % (name,
                                              result['encoding'],
                                              result['confidence'])
    else:
        return '%s: no result' % name


def main():
    if len(argv) <= 1:
        print(description_of(stdin))
    else:
        for path in argv[1:]:
            with open(path, 'rb') as f:
                print(description_of(f, path))


if __name__ == '__main__':
    main()
site-packages/pip/_vendor/requests/packages/chardet/mbcsgroupprober.py000064400000003657151733463750022371 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Universal charset detector code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 2001
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#   Shy Shalom - original C code
#   Proofpoint, Inc.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

from .charsetgroupprober import CharSetGroupProber
from .utf8prober import UTF8Prober
from .sjisprober import SJISProber
from .eucjpprober import EUCJPProber
from .gb2312prober import GB2312Prober
from .euckrprober import EUCKRProber
from .cp949prober import CP949Prober
from .big5prober import Big5Prober
from .euctwprober import EUCTWProber


class MBCSGroupProber(CharSetGroupProber):
    def __init__(self):
        CharSetGroupProber.__init__(self)
        self._mProbers = [
            UTF8Prober(),
            SJISProber(),
            EUCJPProber(),
            GB2312Prober(),
            EUCKRProber(),
            CP949Prober(),
            Big5Prober(),
            EUCTWProber()
        ]
        self.reset()
site-packages/pip/_vendor/requests/packages/chardet/charsetgroupprober.py000064400000007317151733463750023073 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Communicator client code.
# 
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
# 
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
# 
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
# 
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

from . import constants
import sys
from .charsetprober import CharSetProber


class CharSetGroupProber(CharSetProber):
    def __init__(self):
        CharSetProber.__init__(self)
        self._mActiveNum = 0
        self._mProbers = []
        self._mBestGuessProber = None

    def reset(self):
        CharSetProber.reset(self)
        self._mActiveNum = 0
        for prober in self._mProbers:
            if prober:
                prober.reset()
                prober.active = True
                self._mActiveNum += 1
        self._mBestGuessProber = None

    def get_charset_name(self):
        if not self._mBestGuessProber:
            self.get_confidence()
            if not self._mBestGuessProber:
                return None
#                self._mBestGuessProber = self._mProbers[0]
        return self._mBestGuessProber.get_charset_name()

    def feed(self, aBuf):
        for prober in self._mProbers:
            if not prober:
                continue
            if not prober.active:
                continue
            st = prober.feed(aBuf)
            if not st:
                continue
            if st == constants.eFoundIt:
                self._mBestGuessProber = prober
                return self.get_state()
            elif st == constants.eNotMe:
                prober.active = False
                self._mActiveNum -= 1
                if self._mActiveNum <= 0:
                    self._mState = constants.eNotMe
                    return self.get_state()
        return self.get_state()

    def get_confidence(self):
        st = self.get_state()
        if st == constants.eFoundIt:
            return 0.99
        elif st == constants.eNotMe:
            return 0.01
        bestConf = 0.0
        self._mBestGuessProber = None
        for prober in self._mProbers:
            if not prober:
                continue
            if not prober.active:
                if constants._debug:
                    sys.stderr.write(prober.get_charset_name()
                                     + ' not active\n')
                continue
            cf = prober.get_confidence()
            if constants._debug:
                sys.stderr.write('%s confidence = %s\n' %
                                 (prober.get_charset_name(), cf))
            if bestConf < cf:
                bestConf = cf
                self._mBestGuessProber = prober
        if not self._mBestGuessProber:
            return 0.0
        return bestConf
#        else:
#            self._mBestGuessProber = self._mProbers[0]
#            return self._mBestGuessProber.get_confidence()
site-packages/pip/_vendor/requests/packages/chardet/euctwfreq.py000064400000104070151733463750021152 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Communicator client code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

# EUCTW frequency table
# Converted from big5 work
# by Taiwan's Mandarin Promotion Council
# <http:#www.edu.tw:81/mandr/>

# 128  --> 0.42261
# 256  --> 0.57851
# 512  --> 0.74851
# 1024 --> 0.89384
# 2048 --> 0.97583
#
# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98
# Random Distribution Ration = 512/(5401-512)=0.105
#
# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR

EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75

# Char to FreqOrder table ,
EUCTW_TABLE_SIZE = 8102

EUCTWCharToFreqOrder = (
   1,1800,1506, 255,1431, 198,   9,  82,   6,7310, 177, 202,3615,1256,2808, 110, # 2742
3735,  33,3241, 261,  76,  44,2113,  16,2931,2184,1176, 659,3868,  26,3404,2643, # 2758
1198,3869,3313,4060, 410,2211, 302, 590, 361,1963,   8, 204,  58,4296,7311,1931, # 2774
  63,7312,7313, 317,1614,  75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790
3616,   3,  10,3870,1471,  29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806
4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932,  34,3501,3173,  64, 604, # 2822
7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337,  72, 406,7319,  80, # 2838
 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449,  69,2969, 591, # 2854
 179,2095, 471, 115,2034,1843,  60,  50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870
 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886
2495,  90,2707,1338, 663,  11, 906,1099,2545,  20,2436, 182, 532,1716,7321, 732, # 2902
1376,4062,1311,1420,3175,  25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918
3243, 475,1447,3617,7322, 117,  21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934
 706, 456, 150, 613,4299,  71,1118,2036,4064, 145,3069,  85, 835, 486,2114,1246, # 2950
1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966
3503,3110,7325,1955,1153,4065,  83, 296,1199,3070, 192, 624,  93,7326, 822,1897, # 2982
2810,3111, 795,2064, 991,1554,1542,1592,  27,  43,2853, 859, 139,1456, 860,4300, # 2998
 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014
3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030
1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046
7328,7329,2173,3176,3619,2673, 593, 845,1062,3244,  88,1723,2037,3875,1950, 212, # 3062
 266, 152, 149, 468,1898,4066,4302,  77, 187,7330,3018,  37,   5,2972,7331,3876, # 3078
7332,7333,  39,2517,4303,2894,3177,2078,  55, 148,  74,4304, 545, 483,1474,1029, # 3094
1665, 217,1869,1531,3113,1104,2645,4067,  24, 172,3507, 900,3877,3508,3509,4305, # 3110
  32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674,   4,3019,3314,1427,1788, # 3126
 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142
3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439,  38,7339,1063,7340, 794, # 3158
3879,1435,2296,  46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804,  35, 707, # 3174
 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190
2128,1363,3623,1423, 697, 100,3071,  48,  70,1231, 495,3114,2193,7345,1294,7346, # 3206
2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222
 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238
 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254
3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270
1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286
1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302
1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381,   7, # 3318
2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334
 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350
4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366
1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382
7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398
2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414
 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430
  98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446
 523,2776,2777,2648,7364, 141,2231,1333,  68, 176, 441, 876, 907,4077, 603,2592, # 3462
 710, 171,3417, 404, 549,  18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478
7366,2973, 368,7367, 146, 366,  99, 871,3627,1543, 748, 807,1586,1185,  22,2258, # 3494
 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510
1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371,  59,7372, # 3526
 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542
 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558
7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574
1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590
 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606
3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622
4081,  57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638
3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654
 279,3120,  51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670
 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686
1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702
4084,2468,1436, 953,4085,2054,4331, 671,2395,  79,4086,2441,3252, 608, 567,2680, # 3718
3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734
3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750
2397,7400,7401,7402,4089,3025,   0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766
7404, 233,4090,3631,1818,4336,4337,7405,  96,1776,1315,2082,7406, 257,7407,1809, # 3782
3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798
7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814
1484,7413,1712, 127,  67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830
2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846
1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862
  78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878
1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894
4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910
3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926
 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942
 165, 243,4345,3637,2521, 123, 683,4096, 764,4346,  36,3895,1792, 589,2902, 816, # 3958
 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974
2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990
7425, 611,1156, 854,2381,1316,2861,   2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006
1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022
2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038
1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054
1993,7438,4350,7439,7440,2195,  13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070
7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086
7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102
7452, 128,2132,  92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118
3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134
4353,2248,  94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150
1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166
7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182
2332,2067,  23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198
7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214
3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230
3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863,  41,7473, # 4246
7474,4361,7475,1657,2333,  19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262
2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278
7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294
 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310
4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326
2683, 733,  40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342
7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358
3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374
2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390
2752,2986,7490, 435,7491, 343,1108, 596,  17,1751,4365,2235,3430,3643,7492,4366, # 4406
 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422
2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438
1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454
1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470
2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486
1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502
7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518
7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534
2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550
4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566
1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551,  30,2263,4122, # 4582
7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598
 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614
4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630
 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646
2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662
 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678
1041,2987, 293,1168,  87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694
1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710
 730,1515, 184,2827,  66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726
3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742
3918,7535,7536,1186,  15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758
1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774
3541,1342,1681,1718, 766,3264, 286,  89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790
7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806
7544,3265, 310, 313,3435,2299, 770,4134,  54,3034, 189,4397,3082,3769,3922,7545, # 4822
1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838
2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854
1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870
3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886
2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902
3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918
2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934
4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950
4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966
3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982
  97,  81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998
3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014
 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030
3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046
3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062
3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078
1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094
7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110
 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126
7590, 587,  14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142
1702,1226, 102,1547,  62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158
 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174
4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598,  86,1494,1730, # 5190
3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206
 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222
2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238
2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885,  28,2686, # 5254
3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270
1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286
4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302
2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318
1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334
1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350
2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366
3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382
1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398
7617,3446,7618,7619,7620,3277,2689,1433,3278, 131,  95,1504,3946, 723,4159,3141, # 5414
1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430
4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654,  53,7624,2996,7625, # 5446
1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462
 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478
1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494
3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510
3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526
2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542
1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558
4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574
 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590
7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606
2317,3283,7650,7651,4164,7652,4165,  84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622
3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638
4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654
 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670
7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686
7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702
1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718
4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734
3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750
2690,1516,3559,1121,1082,1329,3284,3970,1449,3794,  65,1128,2835,2913,2759,1590, # 5766
3795,7674,7675,  12,2658,  45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782
3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798
2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814
1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830
4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846
3670,1858,  91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862
3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878
2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894
4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761,  61,3976,3672,1822,3977, # 5910
7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926
3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942
2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958
3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974
1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990
2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006
3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022
4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043,  56,1396,3090, # 6038
2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054
2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070
7722,1076,  49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086
1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102
2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118
1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134
3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150
4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629,  31,2838, # 6166
2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182
3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198
3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214
2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230
4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246
2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262
3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278
4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294
7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310
3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326
 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342
1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412,  42,3096, 464,7759,2632, # 6358
4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374
1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390
4487,7766,3002, 962, 588,3574, 289,3219,2634,1116,  52,7767,3047,1796,7768,7769, # 6406
7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422
 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438
7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454
2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470
1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486
1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502
3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518
 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534
 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550
 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566
3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582
2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598
 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614
7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630
1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646
3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662
7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678
1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694
7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710
4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726
1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742
2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758
2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774
4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790
 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806
 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822
3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838
3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854
1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870
2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886
7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902
1561,2664,1452,4010,1375,7855,7856,  47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918
1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934
3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950
 919,2347,2960,2348,1270,4511,4012,  73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966
1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982
4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998
7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014
2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030
3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046
 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062
1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078
2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094
2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110
7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126
7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142
7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158
2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174
2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190
1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206
4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222
3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238
3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254
4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270
4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286
2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302
2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318
7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334
4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350
7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366
2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382
1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398
3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414
4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430
2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446
 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462
2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478
1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494
2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510
2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526
4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542
7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558
1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574
3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590
7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606
1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622
8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638
2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654
8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670
2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686
2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702
8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718
8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734
8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750
 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766
8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782
4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798
3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814
8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830
1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846
8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862
 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878
1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894
 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910
4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926
1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942
4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958
1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974
 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990
3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006
4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022
8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038
 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054
3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070
 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086
2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102
#Everything below is of no interest for detection purpose
2515,1613,4582,8119,3312,3866,2516,8120,4058,8121,1637,4059,2466,4583,3867,8122, # 8118
2493,3016,3734,8123,8124,2192,8125,8126,2162,8127,8128,8129,8130,8131,8132,8133, # 8134
8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8148,8149, # 8150
8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,8160,8161,8162,8163,8164,8165, # 8166
8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181, # 8182
8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, # 8198
8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213, # 8214
8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229, # 8230
8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245, # 8246
8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261, # 8262
8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, # 8278
8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292,8293, # 8294
8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,8308,8309, # 8310
8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325, # 8326
8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337,8338,8339,8340,8341, # 8342
8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356,8357, # 8358
8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373, # 8374
8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389, # 8390
8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405, # 8406
8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421, # 8422
8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, # 8438
8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453, # 8454
8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469, # 8470
8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485, # 8486
8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501, # 8502
8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, # 8518
8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533, # 8534
8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549, # 8550
8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565, # 8566
8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581, # 8582
8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597, # 8598
8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613, # 8614
8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629, # 8630
8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645, # 8646
8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661, # 8662
8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, # 8678
8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693, # 8694
8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709, # 8710
8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725, # 8726
8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741) # 8742

# flake8: noqa
site-packages/pip/_vendor/requests/packages/chardet/langcyrillicmodel.py000064400000042475151733463750022654 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Communicator client code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

# KOI8-R language model
# Character Mapping Table:
KOI8R_CharToOrderMap = (
255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,  # 80
207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,  # 90
223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237,  # a0
238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,  # b0
 27,  3, 21, 28, 13,  2, 39, 19, 26,  4, 23, 11,  8, 12,  5,  1,  # c0
 15, 16,  9,  7,  6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54,  # d0
 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34,  # e0
 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70,  # f0
)

win1251_CharToOrderMap = (
255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
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, 68,247,248,249,250,251,252,253,
 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
)

latin5_CharToOrderMap = (
255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
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,
 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255,
)

macCyrillic_CharToOrderMap = (
255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
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, 68, 16,
  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255,
)

IBM855_CharToOrderMap = (
255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205,
206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70,
  3, 37, 21, 44, 28, 58, 13, 41,  2, 48, 39, 53, 19, 46,218,219,
220,221,222,223,224, 26, 55,  4, 42,225,226,227,228, 23, 60,229,
230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243,
  8, 49, 12, 38,  5, 31,  1, 34, 15,244,245,246,247, 35, 16,248,
 43,  9, 45,  7, 32,  6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249,
250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255,
)

IBM866_CharToOrderMap = (
255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
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,
  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255,
)

# Model Table:
# total sequences: 100%
# first 512 sequences: 97.6601%
# first 1024 sequences: 2.3389%
# rest  sequences:      0.1237%
# negative sequences:   0.0009%
RussianLangModel = (
0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2,
3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0,
0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0,
0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1,
0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1,
0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0,
0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0,
0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0,
0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0,
0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0,
0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0,
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0,
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0,
0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0,
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0,
0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0,
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0,
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0,
0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0,
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0,
0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0,
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0,
0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0,
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0,
0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0,
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0,
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1,
1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1,
1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0,
2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1,
1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0,
3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1,
1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0,
2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2,
1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1,
1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1,
1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,
2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1,
1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0,
3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2,
1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,
2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1,
1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0,
2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0,
0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1,
1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0,
1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1,
1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0,
3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1,
2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1,
3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1,
1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,
1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1,
0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1,
1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0,
1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,
0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1,
1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2,
2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1,
1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0,
1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0,
2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,
1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,
0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,
2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1,
1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1,
1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,
0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1,
0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,
0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,
0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1,
0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,
2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0,
0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
)

Koi8rModel = {
  'charToOrderMap': KOI8R_CharToOrderMap,
  'precedenceMatrix': RussianLangModel,
  'mTypicalPositiveRatio': 0.976601,
  'keepEnglishLetter': False,
  'charsetName': "KOI8-R"
}

Win1251CyrillicModel = {
  'charToOrderMap': win1251_CharToOrderMap,
  'precedenceMatrix': RussianLangModel,
  'mTypicalPositiveRatio': 0.976601,
  'keepEnglishLetter': False,
  'charsetName': "windows-1251"
}

Latin5CyrillicModel = {
  'charToOrderMap': latin5_CharToOrderMap,
  'precedenceMatrix': RussianLangModel,
  'mTypicalPositiveRatio': 0.976601,
  'keepEnglishLetter': False,
  'charsetName': "ISO-8859-5"
}

MacCyrillicModel = {
  'charToOrderMap': macCyrillic_CharToOrderMap,
  'precedenceMatrix': RussianLangModel,
  'mTypicalPositiveRatio': 0.976601,
  'keepEnglishLetter': False,
  'charsetName': "MacCyrillic"
};

Ibm866Model = {
  'charToOrderMap': IBM866_CharToOrderMap,
  'precedenceMatrix': RussianLangModel,
  'mTypicalPositiveRatio': 0.976601,
  'keepEnglishLetter': False,
  'charsetName': "IBM866"
}

Ibm855Model = {
  'charToOrderMap': IBM855_CharToOrderMap,
  'precedenceMatrix': RussianLangModel,
  'mTypicalPositiveRatio': 0.976601,
  'keepEnglishLetter': False,
  'charsetName': "IBM855"
}

# flake8: noqa
site-packages/pip/_vendor/requests/packages/chardet/sbcsgroupprober.py000064400000006333151733463750022371 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Universal charset detector code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 2001
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#   Shy Shalom - original C code
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

from .charsetgroupprober import CharSetGroupProber
from .sbcharsetprober import SingleByteCharSetProber
from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel,
                                Latin5CyrillicModel, MacCyrillicModel,
                                Ibm866Model, Ibm855Model)
from .langgreekmodel import Latin7GreekModel, Win1253GreekModel
from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel
from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel
from .langthaimodel import TIS620ThaiModel
from .langhebrewmodel import Win1255HebrewModel
from .hebrewprober import HebrewProber


class SBCSGroupProber(CharSetGroupProber):
    def __init__(self):
        CharSetGroupProber.__init__(self)
        self._mProbers = [
            SingleByteCharSetProber(Win1251CyrillicModel),
            SingleByteCharSetProber(Koi8rModel),
            SingleByteCharSetProber(Latin5CyrillicModel),
            SingleByteCharSetProber(MacCyrillicModel),
            SingleByteCharSetProber(Ibm866Model),
            SingleByteCharSetProber(Ibm855Model),
            SingleByteCharSetProber(Latin7GreekModel),
            SingleByteCharSetProber(Win1253GreekModel),
            SingleByteCharSetProber(Latin5BulgarianModel),
            SingleByteCharSetProber(Win1251BulgarianModel),
            SingleByteCharSetProber(Latin2HungarianModel),
            SingleByteCharSetProber(Win1250HungarianModel),
            SingleByteCharSetProber(TIS620ThaiModel),
        ]
        hebrewProber = HebrewProber()
        logicalHebrewProber = SingleByteCharSetProber(Win1255HebrewModel,
                                                      False, hebrewProber)
        visualHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, True,
                                                     hebrewProber)
        hebrewProber.set_model_probers(logicalHebrewProber, visualHebrewProber)
        self._mProbers.extend([hebrewProber, logicalHebrewProber,
                               visualHebrewProber])

        self.reset()
site-packages/pip/_vendor/requests/packages/chardet/jpcntx.py000064400000045240151733463750020456 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Communicator client code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

from .compat import wrap_ord

NUM_OF_CATEGORY = 6
DONT_KNOW = -1
ENOUGH_REL_THRESHOLD = 100
MAX_REL_THRESHOLD = 1000
MINIMUM_DATA_THRESHOLD = 4

# This is hiragana 2-char sequence table, the number in each cell represents its frequency category
jp2CharContext = (
(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1),
(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4),
(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2),
(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4),
(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4),
(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3),
(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4),
(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4),
(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3),
(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3),
(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3),
(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4),
(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3),
(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4),
(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3),
(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5),
(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3),
(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5),
(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4),
(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4),
(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3),
(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3),
(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3),
(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5),
(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4),
(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5),
(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3),
(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4),
(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4),
(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4),
(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1),
(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0),
(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3),
(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0),
(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3),
(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3),
(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5),
(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4),
(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5),
(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3),
(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3),
(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3),
(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3),
(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4),
(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4),
(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2),
(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3),
(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3),
(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3),
(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3),
(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4),
(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3),
(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4),
(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3),
(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3),
(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4),
(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4),
(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3),
(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4),
(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4),
(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3),
(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4),
(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4),
(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4),
(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3),
(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2),
(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2),
(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3),
(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3),
(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5),
(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3),
(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4),
(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4),
(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4),
(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3),
(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1),
(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2),
(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3),
(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1),
)

class JapaneseContextAnalysis:
    def __init__(self):
        self.reset()

    def reset(self):
        self._mTotalRel = 0  # total sequence received
        # category counters, each interger counts sequence in its category
        self._mRelSample = [0] * NUM_OF_CATEGORY
        # if last byte in current buffer is not the last byte of a character,
        # we need to know how many bytes to skip in next buffer
        self._mNeedToSkipCharNum = 0
        self._mLastCharOrder = -1  # The order of previous char
        # If this flag is set to True, detection is done and conclusion has
        # been made
        self._mDone = False

    def feed(self, aBuf, aLen):
        if self._mDone:
            return

        # The buffer we got is byte oriented, and a character may span in more than one
        # buffers. In case the last one or two byte in last buffer is not
        # complete, we record how many byte needed to complete that character
        # and skip these bytes here.  We can choose to record those bytes as
        # well and analyse the character once it is complete, but since a
        # character will not make much difference, by simply skipping
        # this character will simply our logic and improve performance.
        i = self._mNeedToSkipCharNum
        while i < aLen:
            order, charLen = self.get_order(aBuf[i:i + 2])
            i += charLen
            if i > aLen:
                self._mNeedToSkipCharNum = i - aLen
                self._mLastCharOrder = -1
            else:
                if (order != -1) and (self._mLastCharOrder != -1):
                    self._mTotalRel += 1
                    if self._mTotalRel > MAX_REL_THRESHOLD:
                        self._mDone = True
                        break
                    self._mRelSample[jp2CharContext[self._mLastCharOrder][order]] += 1
                self._mLastCharOrder = order

    def got_enough_data(self):
        return self._mTotalRel > ENOUGH_REL_THRESHOLD

    def get_confidence(self):
        # This is just one way to calculate confidence. It works well for me.
        if self._mTotalRel > MINIMUM_DATA_THRESHOLD:
            return (self._mTotalRel - self._mRelSample[0]) / self._mTotalRel
        else:
            return DONT_KNOW

    def get_order(self, aBuf):
        return -1, 1

class SJISContextAnalysis(JapaneseContextAnalysis):
    def get_order(self, aBuf):
        if not aBuf:
            return -1, 1
        # find out current char's byte length
        first_char = wrap_ord(aBuf[0])
        if ((0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC)):
            charLen = 2
        else:
            charLen = 1

        # return its order if it is hiragana
        if len(aBuf) > 1:
            second_char = wrap_ord(aBuf[1])
            if (first_char == 202) and (0x9F <= second_char <= 0xF1):
                return second_char - 0x9F, charLen

        return -1, charLen

class EUCJPContextAnalysis(JapaneseContextAnalysis):
    def get_order(self, aBuf):
        if not aBuf:
            return -1, 1
        # find out current char's byte length
        first_char = wrap_ord(aBuf[0])
        if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE):
            charLen = 2
        elif first_char == 0x8F:
            charLen = 3
        else:
            charLen = 1

        # return its order if it is hiragana
        if len(aBuf) > 1:
            second_char = wrap_ord(aBuf[1])
            if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3):
                return second_char - 0xA1, charLen

        return -1, charLen

# flake8: noqa
site-packages/pip/_vendor/requests/packages/chardet/__init__.py000064400000002417151733463750020706 0ustar00######################## BEGIN LICENSE BLOCK ########################
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

__version__ = "2.2.1"
from sys import version_info


def detect(aBuf):
    if ((version_info < (3, 0) and isinstance(aBuf, unicode)) or
            (version_info >= (3, 0) and not isinstance(aBuf, bytes))):
        raise ValueError('Expected a bytes object, not a unicode object')

    from . import universaldetector
    u = universaldetector.UniversalDetector()
    u.reset()
    u.feed(aBuf)
    u.close()
    return u.result
site-packages/pip/_vendor/requests/packages/chardet/euckrfreq.py000064400000131632151733463760021141 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Communicator client code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
# 
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
# 
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

# Sampling from about 20M text materials include literature and computer technology

# 128  --> 0.79
# 256  --> 0.92
# 512  --> 0.986
# 1024 --> 0.99944
# 2048 --> 0.99999
#
# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24
# Random Distribution Ration = 512 / (2350-512) = 0.279.
# 
# Typical Distribution Ratio  

EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0

EUCKR_TABLE_SIZE = 2352

# Char to FreqOrder table , 
EUCKRCharToFreqOrder = ( \
  13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722,  87,
1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398,
1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488,  20,1733,1269,1734,
 945,1400,1735,  47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739,
 116, 987, 813,1401, 683,  75,1204, 145,1740,1741,1742,1743,  16, 847, 667, 622,
 708,1744,1745,1746, 966, 787, 304, 129,1747,  60, 820, 123, 676,1748,1749,1750,
1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856,
 344,1763,1764,1765,1766,  89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205,
 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779,
1780, 337, 751,1058,  28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782,  19,
1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567,
1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797,
1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802,
1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899,
 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818,
1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409,
1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697,
1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770,
1412,1837,1838,  39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723,
 544,1023,1081, 869,  91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416,
1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300,
 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083,
 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857,
1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871,
 282,  96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420,
1421, 268,1877,1422,1878,1879,1880, 308,1881,   2, 537,1882,1883,1215,1884,1885,
 127, 791,1886,1273,1423,1887,  34, 336, 404, 643,1888, 571, 654, 894, 840,1889,
   0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893,
1894,1123,  48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317,
1899, 694,1900, 909, 734,1424, 572, 866,1425, 691,  85, 524,1010, 543, 394, 841,
1901,1902,1903,1026,1904,1905,1906,1907,1908,1909,  30, 451, 651, 988, 310,1910,
1911,1426, 810,1216,  93,1912,1913,1277,1217,1914, 858, 759,  45,  58, 181, 610,
 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375,
1919, 359,1920, 687,1921, 822,1922, 293,1923,1924,  40, 662, 118, 692,  29, 939,
 887, 640, 482, 174,1925,  69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870,
 217, 854,1163, 823,1927,1928,1929,1930, 834,1931,  78,1932, 859,1933,1063,1934,
1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888,
1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950,
1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065,
1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002,
1283,1222,1960,1961,1962,1963,  36, 383, 228, 753, 247, 454,1964, 876, 678,1965,
1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467,
  50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285,
 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971,   7,
 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979,
1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985,
 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994,
1995, 560, 223,1287,  98,   8, 189, 650, 978,1288,1996,1437,1997,  17, 345, 250,
 423, 277, 234, 512, 226,  97, 289,  42, 167,1998, 201,1999,2000, 843, 836, 824,
 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003,
2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008,  71,1440, 745,
 619, 688,2009, 829,2010,2011, 147,2012,  33, 948,2013,2014,  74, 224,2015,  61,
 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023,
2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591,  52, 724, 246,2031,2032,
2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912,
2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224,
 719,1170, 959, 440, 437, 534,  84, 388, 480,1131, 159, 220, 198, 679,2044,1012,
 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050,
2051,2052,2053,  59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681,
 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414,
1444,2064,2065,  41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068,
2069,1292,2070,2071,1445,2072,1446,2073,2074,  55, 588,  66,1447, 271,1092,2075,
1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850,
2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606,
2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449,
1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452,
 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112,
2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121,
2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130,
  22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174,  73,1096, 231, 274,
 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139,
2141,2142,2143,2144,  11, 374, 844,2145, 154,1232,  46,1461,2146, 838, 830, 721,
1233, 106,2147,  90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298,
2150,1462, 761, 565,2151, 686,2152, 649,2153,  72, 173,2154, 460, 415,2155,1463,
2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747,
2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177,  23, 530, 285,
2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187,
2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193,  10,
2194, 613, 424,2195, 979, 108, 449, 589,  27, 172,  81,1031,  80, 774, 281, 350,
1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201,
2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972,
2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219,
2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233,
2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242,
2243, 521, 486, 548,2244,2245,2246,1473,1300,  53, 549, 137, 875,  76, 158,2247,
1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178,
1475,2249,  82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255,
2256,  18, 450, 206,2257, 290, 292,1142,2258, 511, 162,  99, 346, 164, 735,2259,
1476,1477,   4, 554, 343, 798,1099,2260,1100,2261,  43, 171,1303, 139, 215,2262,
2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702,
1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272,  67,2273,
 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541,
2282,2283,2284,2285,2286,  70, 852,1071,2287,2288,2289,2290,  21,  56, 509, 117,
 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187,
2294,1046,1479,2295, 340,2296,  63,1047, 230,2297,2298,1305, 763,1306, 101, 800,
 808, 494,2299,2300,2301, 903,2302,  37,1072,  14,   5,2303,  79, 675,2304, 312,
2305,2306,2307,2308,2309,1480,   6,1307,2310,2311,2312,   1, 470,  35,  24, 229,
2313, 695, 210,  86, 778,  15, 784, 592, 779,  32,  77, 855, 964,2314, 259,2315,
 501, 380,2316,2317,  83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484,
2320,2321,2322,2323,2324,2325,1485,2326,2327, 128,  57,  68, 261,1048, 211, 170,
1240,  31,2328,  51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335,
 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601,
1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395,
2351,1490,1491,  62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354,
1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476,
2361,2362, 332,  12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035,
 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498,
2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310,
1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389,
2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504,
1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505,
2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145,
1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624,
 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700,
2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221,
2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377,
 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448,
 915, 489,2449,1514,1184,2450,2451, 515,  64, 427, 495,2452, 583,2453, 483, 485,
1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705,
1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465,
 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471,
2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997,
2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486,
 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187,  65,2494,
 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771,
 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323,
2499,2500,  49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491,
  95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510,
 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519,
2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532,
2533,  25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199,
 704, 504, 468, 758, 657,1528, 196,  44, 839,1246, 272, 750,2543, 765, 862,2544,
2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247,
1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441,
 249,1075,2556,2557,2558, 466, 743,2559,2560,2561,  92, 514, 426, 420, 526,2562,
2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362,
2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583,
2584,1532,  54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465,
   3, 458,   9,  38,2588, 107, 110, 890, 209,  26, 737, 498,2589,1534,2590, 431,
 202,  88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151,
 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596,
2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601,  94, 175, 197, 406,
2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611,
2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619,
1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628,
2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042,
 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642,  # 512, 256
#Everything below is of no interest for detection purpose
2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,
2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,
2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,
2691,2692,2693,2694,2695,2696,2697,2698,2699,1542, 880,2700,2701,2702,2703,2704,
2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,
2721,2722,2723,2724,2725,1543,2726,2727,2728,2729,2730,2731,2732,1544,2733,2734,
2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,
2751,2752,2753,2754,1545,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,
2766,1546,2767,1547,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,
2780,2781,2782,2783,2784,2785,2786,1548,2787,2788,2789,1109,2790,2791,2792,2793,
2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,
2810,2811,2812,1329,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,
2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,
2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,
1549,2857,2858,2859,2860,1550,2861,2862,1551,2863,2864,2865,2866,2867,2868,2869,
2870,2871,2872,2873,2874,1110,1330,2875,2876,2877,2878,2879,2880,2881,2882,2883,
2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,
2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,
2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,1331,
2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,1552,2944,2945,
2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,
2962,2963,2964,1252,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,
2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,
2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,
3009,3010,3011,3012,1553,3013,3014,3015,3016,3017,1554,3018,1332,3019,3020,3021,
3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,
3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,1555,3051,3052,
3053,1556,1557,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,
3067,1558,3068,3069,3070,3071,3072,3073,3074,3075,3076,1559,3077,3078,3079,3080,
3081,3082,3083,1253,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,
3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,1152,3109,3110,
3111,3112,3113,1560,3114,3115,3116,3117,1111,3118,3119,3120,3121,3122,3123,3124,
3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,
3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,
3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,
3173,3174,3175,3176,1333,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,
3188,3189,1561,3190,3191,1334,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,
3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,
3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,
3234,1562,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,
3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,
3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,1563,3278,3279,
3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,
3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,
3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327,
3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343,
3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,
3360,3361,3362,3363,3364,1335,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,
3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,1336,3388,3389,
3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405,
3406,3407,3408,3409,3410,3411,3412,3413,3414,1337,3415,3416,3417,3418,3419,1338,
3420,3421,3422,1564,1565,3423,3424,3425,3426,3427,3428,3429,3430,3431,1254,3432,
3433,3434,1339,3435,3436,3437,3438,3439,1566,3440,3441,3442,3443,3444,3445,3446,
3447,3448,3449,3450,3451,3452,3453,3454,1255,3455,3456,3457,3458,3459,1567,1191,
3460,1568,1569,3461,3462,3463,1570,3464,3465,3466,3467,3468,1571,3469,3470,3471,
3472,3473,1572,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,
1340,3487,3488,3489,3490,3491,3492,1021,3493,3494,3495,3496,3497,3498,1573,3499,
1341,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,1342,3512,3513,
3514,3515,3516,1574,1343,3517,3518,3519,1575,3520,1576,3521,3522,3523,3524,3525,
3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541,
3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557,
3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573,
3574,3575,3576,3577,3578,3579,3580,1577,3581,3582,1578,3583,3584,3585,3586,3587,
3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,
3604,1579,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,
3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,1580,3630,3631,1581,3632,
3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,
3649,3650,3651,3652,3653,3654,3655,3656,1582,3657,3658,3659,3660,3661,3662,3663,
3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,
3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,
3696,3697,3698,3699,3700,1192,3701,3702,3703,3704,1256,3705,3706,3707,3708,1583,
1257,3709,3710,3711,3712,3713,3714,3715,3716,1584,3717,3718,3719,3720,3721,3722,
3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,
3739,3740,3741,3742,3743,3744,3745,1344,3746,3747,3748,3749,3750,3751,3752,3753,
3754,3755,3756,1585,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,1586,3767,
3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,1345,3779,3780,3781,3782,
3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,1346,1587,3796,
3797,1588,3798,3799,3800,3801,3802,3803,3804,3805,3806,1347,3807,3808,3809,3810,
3811,1589,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,1590,3822,3823,1591,
1348,3824,3825,3826,3827,3828,3829,3830,1592,3831,3832,1593,3833,3834,3835,3836,
3837,3838,3839,3840,3841,3842,3843,3844,1349,3845,3846,3847,3848,3849,3850,3851,
3852,3853,3854,3855,3856,3857,3858,1594,3859,3860,3861,3862,3863,3864,3865,3866,
3867,3868,3869,1595,3870,3871,3872,3873,1596,3874,3875,3876,3877,3878,3879,3880,
3881,3882,3883,3884,3885,3886,1597,3887,3888,3889,3890,3891,3892,3893,3894,3895,
1598,3896,3897,3898,1599,1600,3899,1350,3900,1351,3901,3902,1352,3903,3904,3905,
3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,
3922,3923,3924,1258,3925,3926,3927,3928,3929,3930,3931,1193,3932,1601,3933,3934,
3935,3936,3937,3938,3939,3940,3941,3942,3943,1602,3944,3945,3946,3947,3948,1603,
3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,
3965,1604,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,1353,3978,
3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,1354,3992,3993,
3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,
4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,1355,4024,
4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,
1605,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,
4056,4057,4058,4059,4060,1606,4061,4062,4063,4064,1607,4065,4066,4067,4068,4069,
4070,4071,4072,4073,4074,4075,4076,1194,4077,4078,1608,4079,4080,4081,4082,4083,
4084,4085,4086,4087,1609,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098,
4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,1259,4109,4110,4111,4112,4113,
4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,1195,4125,4126,4127,1610,
4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,1356,4138,4139,4140,4141,4142,
4143,4144,1611,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157,
4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173,
4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189,
4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205,
4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,1612,4220,
4221,4222,4223,4224,4225,4226,4227,1357,4228,1613,4229,4230,4231,4232,4233,4234,
4235,4236,4237,4238,4239,4240,4241,4242,4243,1614,4244,4245,4246,4247,4248,4249,
4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,
4266,4267,4268,4269,4270,1196,1358,4271,4272,4273,4274,4275,4276,4277,4278,4279,
4280,4281,4282,4283,4284,4285,4286,4287,1615,4288,4289,4290,4291,4292,4293,4294,
4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310,
4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,
4327,4328,4329,4330,4331,4332,4333,4334,1616,4335,4336,4337,4338,4339,4340,4341,
4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357,
4358,4359,4360,1617,4361,4362,4363,4364,4365,1618,4366,4367,4368,4369,4370,4371,
4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,
4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,
4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,1619,4417,4418,
4419,4420,4421,4422,4423,4424,4425,1112,4426,4427,4428,4429,4430,1620,4431,4432,
4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,1260,1261,4443,4444,4445,4446,
4447,4448,4449,4450,4451,4452,4453,4454,4455,1359,4456,4457,4458,4459,4460,4461,
4462,4463,4464,4465,1621,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,
4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,1055,4490,4491,
4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,
4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,1622,4519,4520,4521,1623,
4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,1360,4536,
4537,4538,4539,4540,4541,4542,4543, 975,4544,4545,4546,4547,4548,4549,4550,4551,
4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,
4568,4569,4570,4571,1624,4572,4573,4574,4575,4576,1625,4577,4578,4579,4580,4581,
4582,4583,4584,1626,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,1627,
4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,
4612,4613,4614,4615,1628,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,
4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,
4643,4644,4645,4646,4647,4648,4649,1361,4650,4651,4652,4653,4654,4655,4656,4657,
4658,4659,4660,4661,1362,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,
4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,1629,4683,4684,4685,4686,4687,
1630,4688,4689,4690,4691,1153,4692,4693,4694,1113,4695,4696,4697,4698,4699,4700,
4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,1197,4712,4713,4714,4715,
4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,
4732,4733,4734,4735,1631,4736,1632,4737,4738,4739,4740,4741,4742,4743,4744,1633,
4745,4746,4747,4748,4749,1262,4750,4751,4752,4753,4754,1363,4755,4756,4757,4758,
4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,1634,4769,4770,4771,4772,4773,
4774,4775,4776,4777,4778,1635,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788,
4789,1636,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803,
4804,4805,4806,1637,4807,4808,4809,1638,4810,4811,4812,4813,4814,4815,4816,4817,
4818,1639,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832,
4833,1077,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847,
4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863,
4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,
4880,4881,4882,4883,1640,4884,4885,1641,4886,4887,4888,4889,4890,4891,4892,4893,
4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,
4910,4911,1642,4912,4913,4914,1364,4915,4916,4917,4918,4919,4920,4921,4922,4923,
4924,4925,4926,4927,4928,4929,4930,4931,1643,4932,4933,4934,4935,4936,4937,4938,
4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,
4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970,
4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,1644,4981,4982,4983,4984,1645,
4985,4986,1646,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999,
5000,5001,5002,5003,5004,5005,1647,5006,1648,5007,5008,5009,5010,5011,5012,1078,
5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028,
1365,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,1649,5040,5041,5042,
5043,5044,5045,1366,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,1650,5056,
5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,
5073,5074,5075,5076,5077,1651,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,
5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,
5104,5105,5106,5107,5108,5109,5110,1652,5111,5112,5113,5114,5115,5116,5117,5118,
1367,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,1653,5130,5131,5132,
5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,
5149,1368,5150,1654,5151,1369,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161,
5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177,
5178,1370,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192,
5193,5194,5195,5196,5197,5198,1655,5199,5200,5201,5202,1656,5203,5204,5205,5206,
1371,5207,1372,5208,5209,5210,5211,1373,5212,5213,1374,5214,5215,5216,5217,5218,
5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,
5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,1657,5248,5249,
5250,5251,1658,1263,5252,5253,5254,5255,5256,1375,5257,5258,5259,5260,5261,5262,
5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,
5279,5280,5281,5282,5283,1659,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,
5294,5295,5296,5297,5298,5299,5300,1660,5301,5302,5303,5304,5305,5306,5307,5308,
5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,1376,5322,5323,
5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,1198,5334,5335,5336,5337,5338,
5339,5340,5341,5342,5343,1661,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353,
5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369,
5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385,
5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,1264,5399,5400,
5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,1662,5413,5414,5415,
5416,1663,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430,
5431,5432,5433,5434,5435,5436,5437,5438,1664,5439,5440,5441,5442,5443,5444,5445,
5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461,
5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477,
5478,1154,5479,5480,5481,5482,5483,5484,5485,1665,5486,5487,5488,5489,5490,5491,
5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507,
5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523,
5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,
5540,5541,5542,5543,5544,5545,5546,5547,5548,1377,5549,5550,5551,5552,5553,5554,
5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,
1114,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,
5586,5587,5588,5589,5590,5591,5592,1378,5593,5594,5595,5596,5597,5598,5599,5600,
5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,1379,5615,
5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,
5632,5633,5634,1380,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,
5647,5648,5649,1381,1056,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,
1666,5661,5662,5663,5664,5665,5666,5667,5668,1667,5669,1668,5670,5671,5672,5673,
5674,5675,5676,5677,5678,1155,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688,
5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,1669,5699,5700,5701,5702,5703,
5704,5705,1670,5706,5707,5708,5709,5710,1671,5711,5712,5713,5714,1382,5715,5716,
5717,5718,5719,5720,5721,5722,5723,5724,5725,1672,5726,5727,1673,1674,5728,5729,
5730,5731,5732,5733,5734,5735,5736,1675,5737,5738,5739,5740,5741,5742,5743,5744,
1676,5745,5746,5747,5748,5749,5750,5751,1383,5752,5753,5754,5755,5756,5757,5758,
5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,1677,5769,5770,5771,5772,5773,
1678,5774,5775,5776, 998,5777,5778,5779,5780,5781,5782,5783,5784,5785,1384,5786,
5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,1679,5801,
5802,5803,1115,1116,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815,
5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831,
5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847,
5848,5849,5850,5851,5852,5853,5854,5855,1680,5856,5857,5858,5859,5860,5861,5862,
5863,5864,1681,5865,5866,5867,1682,5868,5869,5870,5871,5872,5873,5874,5875,5876,
5877,5878,5879,1683,5880,1684,5881,5882,5883,5884,1685,5885,5886,5887,5888,5889,
5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,
5906,5907,1686,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,
5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,1687,
5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,
5952,1688,1689,5953,1199,5954,5955,5956,5957,5958,5959,5960,5961,1690,5962,5963,
5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,
5980,5981,1385,5982,1386,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,
5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009,
6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,
6026,6027,1265,6028,6029,1691,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,
6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055,
6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071,
6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,1692,6085,6086,
6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102,
6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118,
6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,1693,6132,6133,
6134,6135,6136,1694,6137,6138,6139,6140,6141,1695,6142,6143,6144,6145,6146,6147,
6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,
6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,
6180,6181,6182,6183,6184,6185,1696,6186,6187,6188,6189,6190,6191,6192,6193,6194,
6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,
6211,6212,6213,6214,6215,6216,6217,6218,6219,1697,6220,6221,6222,6223,6224,6225,
6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,
6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,1698,6254,6255,6256,
6257,6258,6259,6260,6261,6262,6263,1200,6264,6265,6266,6267,6268,6269,6270,6271,  #1024
6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287,
6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,1699,
6303,6304,1700,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317,
6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,
6334,6335,6336,6337,6338,6339,1701,6340,6341,6342,6343,6344,1387,6345,6346,6347,
6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,
6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,
6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,
6396,6397,6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,
6412,6413,1702,6414,6415,6416,6417,6418,6419,6420,6421,6422,1703,6423,6424,6425,
6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,1704,6439,6440,
6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456,
6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,
6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488,
6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,1266,
6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,
6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535,
6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551,
1705,1706,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565,
6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581,
6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597,
6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613,
6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628,6629,
6630,6631,6632,6633,6634,6635,6636,6637,1388,6638,6639,6640,6641,6642,6643,6644,
1707,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659,
6660,6661,6662,6663,1708,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674,
1201,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689,
6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705,
6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721,
6722,6723,6724,6725,1389,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736,
1390,1709,6737,6738,6739,6740,6741,6742,1710,6743,6744,6745,6746,1391,6747,6748,
6749,6750,6751,6752,6753,6754,6755,6756,6757,1392,6758,6759,6760,6761,6762,6763,
6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779,
6780,1202,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794,
6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,1711,
6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825,
6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,1393,6837,6838,6839,6840,
6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856,
6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872,
6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883,6884,6885,6886,6887,6888,
6889,6890,6891,6892,6893,6894,6895,6896,6897,6898,6899,6900,6901,6902,1712,6903,
6904,6905,6906,6907,6908,6909,6910,1713,6911,6912,6913,6914,6915,6916,6917,6918,
6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,
6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,
6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,
6967,6968,6969,6970,6971,6972,6973,6974,1714,6975,6976,6977,6978,6979,6980,6981,
6982,6983,6984,6985,6986,6987,6988,1394,6989,6990,6991,6992,6993,6994,6995,6996,
6997,6998,6999,7000,1715,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011,
7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,
7028,1716,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042,
7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,
7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074,
7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090,
7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106,
7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122,
7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138,
7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154,
7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168,7169,7170,
7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186,
7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202,
7203,7204,7205,7206,7207,1395,7208,7209,7210,7211,7212,7213,1717,7214,7215,7216,
7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232,
7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248,
7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264,
7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,
7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296,
7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312,
7313,1718,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,
7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,
7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359,
7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375,
7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391,
7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407,
7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423,
7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439,
7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455,
7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,
7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,
7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,
7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,
7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,
7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551,
7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,
7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583,
7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,
7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,
7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631,
7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647,
7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663,
7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679,
7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695,
7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711,
7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727,
7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743,
7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759,
7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,
7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,
7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807,
7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,
7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,
7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,
7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,
7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,
7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,
7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,
7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935,
7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951,
7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967,
7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983,
7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999,
8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,
8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031,
8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047,
8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,
8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,
8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,
8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111,
8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127,
8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,
8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,
8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,
8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,
8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,
8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,
8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,
8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,
8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,
8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,
8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,
8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,
8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,
8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,
8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,
8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,
8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,
8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,
8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,
8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,
8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,
8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,
8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,
8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,
8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,
8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,
8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,
8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,
8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,
8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,
8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,
8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,
8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,
8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,
8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,
8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,
8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,
8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,
8736,8737,8738,8739,8740,8741)

# flake8: noqa
site-packages/pip/_vendor/requests/packages/chardet/escsm.py000064400000017237151733463760020270 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

from .constants import eStart, eError, eItsMe

HZ_cls = (
1,0,0,0,0,0,0,0,  # 00 - 07
0,0,0,0,0,0,0,0,  # 08 - 0f
0,0,0,0,0,0,0,0,  # 10 - 17
0,0,0,1,0,0,0,0,  # 18 - 1f
0,0,0,0,0,0,0,0,  # 20 - 27
0,0,0,0,0,0,0,0,  # 28 - 2f
0,0,0,0,0,0,0,0,  # 30 - 37
0,0,0,0,0,0,0,0,  # 38 - 3f
0,0,0,0,0,0,0,0,  # 40 - 47
0,0,0,0,0,0,0,0,  # 48 - 4f
0,0,0,0,0,0,0,0,  # 50 - 57
0,0,0,0,0,0,0,0,  # 58 - 5f
0,0,0,0,0,0,0,0,  # 60 - 67
0,0,0,0,0,0,0,0,  # 68 - 6f
0,0,0,0,0,0,0,0,  # 70 - 77
0,0,0,4,0,5,2,0,  # 78 - 7f
1,1,1,1,1,1,1,1,  # 80 - 87
1,1,1,1,1,1,1,1,  # 88 - 8f
1,1,1,1,1,1,1,1,  # 90 - 97
1,1,1,1,1,1,1,1,  # 98 - 9f
1,1,1,1,1,1,1,1,  # a0 - a7
1,1,1,1,1,1,1,1,  # a8 - af
1,1,1,1,1,1,1,1,  # b0 - b7
1,1,1,1,1,1,1,1,  # b8 - bf
1,1,1,1,1,1,1,1,  # c0 - c7
1,1,1,1,1,1,1,1,  # c8 - cf
1,1,1,1,1,1,1,1,  # d0 - d7
1,1,1,1,1,1,1,1,  # d8 - df
1,1,1,1,1,1,1,1,  # e0 - e7
1,1,1,1,1,1,1,1,  # e8 - ef
1,1,1,1,1,1,1,1,  # f0 - f7
1,1,1,1,1,1,1,1,  # f8 - ff
)

HZ_st = (
eStart,eError,     3,eStart,eStart,eStart,eError,eError,# 00-07
eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f
eItsMe,eItsMe,eError,eError,eStart,eStart,     4,eError,# 10-17
     5,eError,     6,eError,     5,     5,     4,eError,# 18-1f
     4,eError,     4,     4,     4,eError,     4,eError,# 20-27
     4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart,# 28-2f
)

HZCharLenTable = (0, 0, 0, 0, 0, 0)

HZSMModel = {'classTable': HZ_cls,
             'classFactor': 6,
             'stateTable': HZ_st,
             'charLenTable': HZCharLenTable,
             'name': "HZ-GB-2312"}

ISO2022CN_cls = (
2,0,0,0,0,0,0,0,  # 00 - 07
0,0,0,0,0,0,0,0,  # 08 - 0f
0,0,0,0,0,0,0,0,  # 10 - 17
0,0,0,1,0,0,0,0,  # 18 - 1f
0,0,0,0,0,0,0,0,  # 20 - 27
0,3,0,0,0,0,0,0,  # 28 - 2f
0,0,0,0,0,0,0,0,  # 30 - 37
0,0,0,0,0,0,0,0,  # 38 - 3f
0,0,0,4,0,0,0,0,  # 40 - 47
0,0,0,0,0,0,0,0,  # 48 - 4f
0,0,0,0,0,0,0,0,  # 50 - 57
0,0,0,0,0,0,0,0,  # 58 - 5f
0,0,0,0,0,0,0,0,  # 60 - 67
0,0,0,0,0,0,0,0,  # 68 - 6f
0,0,0,0,0,0,0,0,  # 70 - 77
0,0,0,0,0,0,0,0,  # 78 - 7f
2,2,2,2,2,2,2,2,  # 80 - 87
2,2,2,2,2,2,2,2,  # 88 - 8f
2,2,2,2,2,2,2,2,  # 90 - 97
2,2,2,2,2,2,2,2,  # 98 - 9f
2,2,2,2,2,2,2,2,  # a0 - a7
2,2,2,2,2,2,2,2,  # a8 - af
2,2,2,2,2,2,2,2,  # b0 - b7
2,2,2,2,2,2,2,2,  # b8 - bf
2,2,2,2,2,2,2,2,  # c0 - c7
2,2,2,2,2,2,2,2,  # c8 - cf
2,2,2,2,2,2,2,2,  # d0 - d7
2,2,2,2,2,2,2,2,  # d8 - df
2,2,2,2,2,2,2,2,  # e0 - e7
2,2,2,2,2,2,2,2,  # e8 - ef
2,2,2,2,2,2,2,2,  # f0 - f7
2,2,2,2,2,2,2,2,  # f8 - ff
)

ISO2022CN_st = (
eStart,     3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07
eStart,eError,eError,eError,eError,eError,eError,eError,# 08-0f
eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17
eItsMe,eItsMe,eItsMe,eError,eError,eError,     4,eError,# 18-1f
eError,eError,eError,eItsMe,eError,eError,eError,eError,# 20-27
     5,     6,eError,eError,eError,eError,eError,eError,# 28-2f
eError,eError,eError,eItsMe,eError,eError,eError,eError,# 30-37
eError,eError,eError,eError,eError,eItsMe,eError,eStart,# 38-3f
)

ISO2022CNCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0)

ISO2022CNSMModel = {'classTable': ISO2022CN_cls,
                    'classFactor': 9,
                    'stateTable': ISO2022CN_st,
                    'charLenTable': ISO2022CNCharLenTable,
                    'name': "ISO-2022-CN"}

ISO2022JP_cls = (
2,0,0,0,0,0,0,0,  # 00 - 07
0,0,0,0,0,0,2,2,  # 08 - 0f
0,0,0,0,0,0,0,0,  # 10 - 17
0,0,0,1,0,0,0,0,  # 18 - 1f
0,0,0,0,7,0,0,0,  # 20 - 27
3,0,0,0,0,0,0,0,  # 28 - 2f
0,0,0,0,0,0,0,0,  # 30 - 37
0,0,0,0,0,0,0,0,  # 38 - 3f
6,0,4,0,8,0,0,0,  # 40 - 47
0,9,5,0,0,0,0,0,  # 48 - 4f
0,0,0,0,0,0,0,0,  # 50 - 57
0,0,0,0,0,0,0,0,  # 58 - 5f
0,0,0,0,0,0,0,0,  # 60 - 67
0,0,0,0,0,0,0,0,  # 68 - 6f
0,0,0,0,0,0,0,0,  # 70 - 77
0,0,0,0,0,0,0,0,  # 78 - 7f
2,2,2,2,2,2,2,2,  # 80 - 87
2,2,2,2,2,2,2,2,  # 88 - 8f
2,2,2,2,2,2,2,2,  # 90 - 97
2,2,2,2,2,2,2,2,  # 98 - 9f
2,2,2,2,2,2,2,2,  # a0 - a7
2,2,2,2,2,2,2,2,  # a8 - af
2,2,2,2,2,2,2,2,  # b0 - b7
2,2,2,2,2,2,2,2,  # b8 - bf
2,2,2,2,2,2,2,2,  # c0 - c7
2,2,2,2,2,2,2,2,  # c8 - cf
2,2,2,2,2,2,2,2,  # d0 - d7
2,2,2,2,2,2,2,2,  # d8 - df
2,2,2,2,2,2,2,2,  # e0 - e7
2,2,2,2,2,2,2,2,  # e8 - ef
2,2,2,2,2,2,2,2,  # f0 - f7
2,2,2,2,2,2,2,2,  # f8 - ff
)

ISO2022JP_st = (
eStart,     3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07
eStart,eStart,eError,eError,eError,eError,eError,eError,# 08-0f
eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17
eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,# 18-1f
eError,     5,eError,eError,eError,     4,eError,eError,# 20-27
eError,eError,eError,     6,eItsMe,eError,eItsMe,eError,# 28-2f
eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,# 30-37
eError,eError,eError,eItsMe,eError,eError,eError,eError,# 38-3f
eError,eError,eError,eError,eItsMe,eError,eStart,eStart,# 40-47
)

ISO2022JPCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

ISO2022JPSMModel = {'classTable': ISO2022JP_cls,
                    'classFactor': 10,
                    'stateTable': ISO2022JP_st,
                    'charLenTable': ISO2022JPCharLenTable,
                    'name': "ISO-2022-JP"}

ISO2022KR_cls = (
2,0,0,0,0,0,0,0,  # 00 - 07
0,0,0,0,0,0,0,0,  # 08 - 0f
0,0,0,0,0,0,0,0,  # 10 - 17
0,0,0,1,0,0,0,0,  # 18 - 1f
0,0,0,0,3,0,0,0,  # 20 - 27
0,4,0,0,0,0,0,0,  # 28 - 2f
0,0,0,0,0,0,0,0,  # 30 - 37
0,0,0,0,0,0,0,0,  # 38 - 3f
0,0,0,5,0,0,0,0,  # 40 - 47
0,0,0,0,0,0,0,0,  # 48 - 4f
0,0,0,0,0,0,0,0,  # 50 - 57
0,0,0,0,0,0,0,0,  # 58 - 5f
0,0,0,0,0,0,0,0,  # 60 - 67
0,0,0,0,0,0,0,0,  # 68 - 6f
0,0,0,0,0,0,0,0,  # 70 - 77
0,0,0,0,0,0,0,0,  # 78 - 7f
2,2,2,2,2,2,2,2,  # 80 - 87
2,2,2,2,2,2,2,2,  # 88 - 8f
2,2,2,2,2,2,2,2,  # 90 - 97
2,2,2,2,2,2,2,2,  # 98 - 9f
2,2,2,2,2,2,2,2,  # a0 - a7
2,2,2,2,2,2,2,2,  # a8 - af
2,2,2,2,2,2,2,2,  # b0 - b7
2,2,2,2,2,2,2,2,  # b8 - bf
2,2,2,2,2,2,2,2,  # c0 - c7
2,2,2,2,2,2,2,2,  # c8 - cf
2,2,2,2,2,2,2,2,  # d0 - d7
2,2,2,2,2,2,2,2,  # d8 - df
2,2,2,2,2,2,2,2,  # e0 - e7
2,2,2,2,2,2,2,2,  # e8 - ef
2,2,2,2,2,2,2,2,  # f0 - f7
2,2,2,2,2,2,2,2,  # f8 - ff
)

ISO2022KR_st = (
eStart,     3,eError,eStart,eStart,eStart,eError,eError,# 00-07
eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f
eItsMe,eItsMe,eError,eError,eError,     4,eError,eError,# 10-17
eError,eError,eError,eError,     5,eError,eError,eError,# 18-1f
eError,eError,eError,eItsMe,eStart,eStart,eStart,eStart,# 20-27
)

ISO2022KRCharLenTable = (0, 0, 0, 0, 0, 0)

ISO2022KRSMModel = {'classTable': ISO2022KR_cls,
                    'classFactor': 6,
                    'stateTable': ISO2022KR_st,
                    'charLenTable': ISO2022KRCharLenTable,
                    'name': "ISO-2022-KR"}

# flake8: noqa
site-packages/pip/_vendor/requests/packages/chardet/langbulgarianmodel.py000064400000030760151733463760023001 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Communicator client code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

# 255: Control characters that usually does not exist in any text
# 254: Carriage/Return
# 253: symbol (punctuation) that does not belong to word
# 252: 0 - 9

# Character Mapping Table:
# this table is modified base on win1251BulgarianCharToOrderMap, so
# only number <64 is sure valid

Latin5_BulgarianCharToOrderMap = (
255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82,  # 40
110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253,  # 50
253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71,  # 60
116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253,  # 70
194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,  # 80
210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,  # 90
 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238,  # a0
 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30,  # b0
 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56,  # c0
  1, 18,  9, 20, 11,  3, 23, 15,  2, 26, 12, 10, 14,  6,  4, 13,  # d0
  7,  8,  5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16,  # e0
 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253,  # f0
)

win1251BulgarianCharToOrderMap = (
255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82,  # 40
110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253,  # 50
253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71,  # 60
116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253,  # 70
206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220,  # 80
221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229,  # 90
 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240,  # a0
 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250,  # b0
 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30,  # c0
 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56,  # d0
  1, 18,  9, 20, 11,  3, 23, 15,  2, 26, 12, 10, 14,  6,  4, 13,  # e0
  7,  8,  5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16,  # f0
)

# Model Table:
# total sequences: 100%
# first 512 sequences: 96.9392%
# first 1024 sequences:3.0618%
# rest  sequences:     0.2992%
# negative sequences:  0.0020%
BulgarianLangModel = (
0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2,
3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1,
0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0,
0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0,
0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0,
0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0,
0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0,
0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0,
0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0,
0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0,
1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0,
0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0,
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0,
0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0,
0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1,
0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0,
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0,
0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0,
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0,
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0,
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3,
2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1,
3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2,
1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0,
3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1,
1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0,
2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2,
2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0,
3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2,
1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0,
2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2,
2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0,
3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2,
1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0,
2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2,
2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0,
2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2,
1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0,
2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2,
1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,
3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2,
1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0,
3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1,
1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0,
2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1,
1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0,
2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2,
1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,
2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1,
1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0,
3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,
1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2,
1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1,
2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2,
1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,
2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2,
1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1,
0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2,
1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1,
1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,
1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1,
0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1,
0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,
0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0,
1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,
0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,
1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1,
1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,
1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
)

Latin5BulgarianModel = {
  'charToOrderMap': Latin5_BulgarianCharToOrderMap,
  'precedenceMatrix': BulgarianLangModel,
  'mTypicalPositiveRatio': 0.969392,
  'keepEnglishLetter': False,
  'charsetName': "ISO-8859-5"
}

Win1251BulgarianModel = {
  'charToOrderMap': win1251BulgarianCharToOrderMap,
  'precedenceMatrix': BulgarianLangModel,
  'mTypicalPositiveRatio': 0.969392,
  'keepEnglishLetter': False,
  'charsetName': "windows-1251"
}


# flake8: noqa
site-packages/pip/_vendor/requests/packages/chardet/codingstatemachine.py000064400000004416151733463760023002 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

from .constants import eStart
from .compat import wrap_ord


class CodingStateMachine:
    def __init__(self, sm):
        self._mModel = sm
        self._mCurrentBytePos = 0
        self._mCurrentCharLen = 0
        self.reset()

    def reset(self):
        self._mCurrentState = eStart

    def next_state(self, c):
        # for each byte we get its class
        # if it is first byte, we also get byte length
        # PY3K: aBuf is a byte stream, so c is an int, not a byte
        byteCls = self._mModel['classTable'][wrap_ord(c)]
        if self._mCurrentState == eStart:
            self._mCurrentBytePos = 0
            self._mCurrentCharLen = self._mModel['charLenTable'][byteCls]
        # from byte's class and stateTable, we get its next state
        curr_state = (self._mCurrentState * self._mModel['classFactor']
                      + byteCls)
        self._mCurrentState = self._mModel['stateTable'][curr_state]
        self._mCurrentBytePos += 1
        return self._mCurrentState

    def get_current_charlen(self):
        return self._mCurrentCharLen

    def get_coding_state_machine(self):
        return self._mModel['name']
site-packages/pip/_vendor/requests/packages/chardet/euckrprober.py000064400000003213151733463760021466 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

from .mbcharsetprober import MultiByteCharSetProber
from .codingstatemachine import CodingStateMachine
from .chardistribution import EUCKRDistributionAnalysis
from .mbcssm import EUCKRSMModel


class EUCKRProber(MultiByteCharSetProber):
    def __init__(self):
        MultiByteCharSetProber.__init__(self)
        self._mCodingSM = CodingStateMachine(EUCKRSMModel)
        self._mDistributionAnalyzer = EUCKRDistributionAnalysis()
        self.reset()

    def get_charset_name(self):
        return "EUC-KR"
site-packages/pip/_vendor/requests/packages/chardet/mbcharsetprober.py000064400000006304151733463760022331 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Universal charset detector code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 2001
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#   Shy Shalom - original C code
#   Proofpoint, Inc.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

import sys
from . import constants
from .charsetprober import CharSetProber


class MultiByteCharSetProber(CharSetProber):
    def __init__(self):
        CharSetProber.__init__(self)
        self._mDistributionAnalyzer = None
        self._mCodingSM = None
        self._mLastChar = [0, 0]

    def reset(self):
        CharSetProber.reset(self)
        if self._mCodingSM:
            self._mCodingSM.reset()
        if self._mDistributionAnalyzer:
            self._mDistributionAnalyzer.reset()
        self._mLastChar = [0, 0]

    def get_charset_name(self):
        pass

    def feed(self, aBuf):
        aLen = len(aBuf)
        for i in range(0, aLen):
            codingState = self._mCodingSM.next_state(aBuf[i])
            if codingState == constants.eError:
                if constants._debug:
                    sys.stderr.write(self.get_charset_name()
                                     + ' prober hit error at byte ' + str(i)
                                     + '\n')
                self._mState = constants.eNotMe
                break
            elif codingState == constants.eItsMe:
                self._mState = constants.eFoundIt
                break
            elif codingState == constants.eStart:
                charLen = self._mCodingSM.get_current_charlen()
                if i == 0:
                    self._mLastChar[1] = aBuf[0]
                    self._mDistributionAnalyzer.feed(self._mLastChar, charLen)
                else:
                    self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1],
                                                     charLen)

        self._mLastChar[0] = aBuf[aLen - 1]

        if self.get_state() == constants.eDetecting:
            if (self._mDistributionAnalyzer.got_enough_data() and
                    (self.get_confidence() > constants.SHORTCUT_THRESHOLD)):
                self._mState = constants.eFoundIt

        return self.get_state()

    def get_confidence(self):
        return self._mDistributionAnalyzer.get_confidence()
site-packages/pip/_vendor/requests/packages/chardet/jisfreq.py000064400000134323151733463760020615 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Communicator client code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

# Sampling from about 20M text materials include literature and computer technology
#
# Japanese frequency table, applied to both S-JIS and EUC-JP
# They are sorted in order.

# 128  --> 0.77094
# 256  --> 0.85710
# 512  --> 0.92635
# 1024 --> 0.97130
# 2048 --> 0.99431
#
# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58
# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191
#
# Typical Distribution Ratio, 25% of IDR

JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0

# Char to FreqOrder table ,
JIS_TABLE_SIZE = 4368

JISCharToFreqOrder = (
  40,   1,   6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, #   16
3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247,  18, 179,5071, 856,1661, #   32
1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, #   48
2042,1061,1062,  48,  49,  44,  45, 433, 434,1040,1041, 996, 787,2997,1255,4305, #   64
2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, #   80
5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, #   96
1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, #  112
5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, #  128
5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, #  144
5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, #  160
5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, #  176
5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, #  192
5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, #  208
1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, #  224
1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, #  240
1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, #  256
2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, #  272
3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161,  26,3377,   2,3929,  20, #  288
3691,  47,4100,  50,  17,  16,  35, 268,  27, 243,  42, 155,  24, 154,  29, 184, #  304
   4,  91,  14,  92,  53, 396,  33, 289,   9,  37,  64, 620,  21,  39, 321,   5, #  320
  12,  11,  52,  13,   3, 208, 138,   0,   7,  60, 526, 141, 151,1069, 181, 275, #  336
1591,  83, 132,1475, 126, 331, 829,  15,  69, 160,  59,  22, 157,  55,1079, 312, #  352
 109,  38,  23,  25,  10,  19,  79,5195,  61, 382,1124,   8,  30,5196,5197,5198, #  368
5199,5200,5201,5202,5203,5204,5205,5206,  89,  62,  74,  34,2416, 112, 139, 196, #  384
 271, 149,  84, 607, 131, 765,  46,  88, 153, 683,  76, 874, 101, 258,  57,  80, #  400
  32, 364, 121,1508, 169,1547,  68, 235, 145,2999,  41, 360,3027,  70,  63,  31, #  416
  43, 259, 262,1383,  99, 533, 194,  66,  93, 846, 217, 192,  56, 106,  58, 565, #  432
 280, 272, 311, 256, 146,  82, 308,  71, 100, 128, 214, 655, 110, 261, 104,1140, #  448
  54,  51,  36,  87,  67,3070, 185,2618,2936,2020,  28,1066,2390,2059,5207,5208, #  464
5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, #  480
5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, #  496
5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, #  512
4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, #  528
5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, #  544
5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, #  560
5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, #  576
5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, #  592
5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, #  608
5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, #  624
5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, #  640
5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, #  656
5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, #  672
3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, #  688
5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, #  704
5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, #  720
5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, #  736
5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, #  752
5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, #  768
5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, #  784
5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, #  800
5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, #  816
5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, #  832
5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, #  848
5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, #  864
5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, #  880
5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, #  896
5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, #  912
5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, #  928
5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, #  944
5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, #  960
5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, #  976
5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, #  992
5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008
5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024
5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040
5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056
5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072
5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088
5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104
5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120
5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136
5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152
5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168
5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184
5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200
5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216
5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232
5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248
5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264
5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280
5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296
6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312
6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328
6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344
6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360
6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376
6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392
6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408
6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424
4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440
 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456
 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472
1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619,  65,3302,2045, # 1488
1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504
 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520
3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536
3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552
 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568
3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584
3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600
 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616
2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632
 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648
3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664
1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680
 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696
1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712
 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728
2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744
2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760
2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776
2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792
1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808
1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824
1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840
1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856
2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872
1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888
2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904
1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920
1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936
1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952
1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968
1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984
1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000
 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016
 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032
1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048
2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064
2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080
2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096
3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112
3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128
 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144
3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160
1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876,  78,2287,1482,1277, # 2176
 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192
2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208
1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224
 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240
3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256
4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272
2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288
1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304
2601,1919,1078,  75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320
1075, 292,3818,1756,2602, 317,  98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336
 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352
 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368
1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384
2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400
2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416
2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432
3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448
1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464
2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480
 359,2291,1676,  73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496
 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512
 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528
1209,  96, 587,2166,1032, 260,1072,2153, 173,  94, 226,3244, 819,2006,4642,4114, # 2544
2203, 231,1744, 782,  97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560
 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576
1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592
1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608
 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624
1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640
1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656
1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672
 764,2861,1853, 688,2429,1920,1462,  77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688
2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704
 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720
2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736
3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752
2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768
1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784
6147, 441, 762,1771,3447,3607,3608,1904, 840,3037,  86, 939,1385, 572,1370,2445, # 2800
1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816
2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832
1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848
 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864
  72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880
3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896
3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912
1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928
1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944
1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960
1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976
 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992
 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008
2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024
 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040
3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056
2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072
 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088
1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104
2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120
 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136
1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152
 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168
4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184
2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200
1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216
 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232
1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248
2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264
 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280
6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296
1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312
1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328
2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344
3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360
 914,2550,2587,  81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376
3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392
1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408
 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424
1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440
 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456
3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472
 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488
2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504
 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520
4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536
2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552
1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568
1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584
1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600
 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616
1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632
3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648
1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664
3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680
 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696
 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712
 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728
2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744
1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760
 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776
1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792
 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808
1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824
 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840
 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856
 480,2083,1774,3458, 923,2279,1350, 221,3086,  85,2233,2234,3835,1585,3010,2147, # 3872
1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888
1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904
2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920
4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936
 227,1351,1645,2453,2193,1421,2887, 812,2121, 634,  95,2435, 201,2312,4665,1646, # 3952
1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968
 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984
1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000
3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016
1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032
2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048
2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064
1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080
1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096
2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112
 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128
2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144
1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160
1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176
1279,2136,1697,2335, 204, 721,2097,3838,  90,6186,2085,2505, 191,3967, 124,2148, # 4192
1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208
3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224
2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240
2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256
 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272
3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288
3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304
1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320
2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336
1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352
2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368  #last 512
#Everything below is of no interest for detection purpose
2138,2122,3730,2888,1995,1820,1044,6190,6191,6192,6193,6194,6195,6196,6197,6198, # 4384
6199,6200,6201,6202,6203,6204,6205,4670,6206,6207,6208,6209,6210,6211,6212,6213, # 4400
6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229, # 4416
6230,6231,6232,6233,6234,6235,6236,6237,3187,6238,6239,3969,6240,6241,6242,6243, # 4432
6244,4671,6245,6246,4672,6247,6248,4133,6249,6250,4364,6251,2923,2556,2613,4673, # 4448
4365,3970,6252,6253,6254,6255,4674,6256,6257,6258,2768,2353,4366,4675,4676,3188, # 4464
4367,3463,6259,4134,4677,4678,6260,2267,6261,3842,3332,4368,3543,6262,6263,6264, # 4480
3013,1954,1928,4135,4679,6265,6266,2478,3091,6267,4680,4369,6268,6269,1699,6270, # 4496
3544,4136,4681,6271,4137,6272,4370,2804,6273,6274,2593,3971,3972,4682,6275,2236, # 4512
4683,6276,6277,4684,6278,6279,4138,3973,4685,6280,6281,3258,6282,6283,6284,6285, # 4528
3974,4686,2841,3975,6286,6287,3545,6288,6289,4139,4687,4140,6290,4141,6291,4142, # 4544
6292,6293,3333,6294,6295,6296,4371,6297,3399,6298,6299,4372,3976,6300,6301,6302, # 4560
4373,6303,6304,3843,3731,6305,4688,4374,6306,6307,3259,2294,6308,3732,2530,4143, # 4576
6309,4689,6310,6311,6312,3048,6313,6314,4690,3733,2237,6315,6316,2282,3334,6317, # 4592
6318,3844,6319,6320,4691,6321,3400,4692,6322,4693,6323,3049,6324,4375,6325,3977, # 4608
6326,6327,6328,3546,6329,4694,3335,6330,4695,4696,6331,6332,6333,6334,4376,3978, # 4624
6335,4697,3979,4144,6336,3980,4698,6337,6338,6339,6340,6341,4699,4700,4701,6342, # 4640
6343,4702,6344,6345,4703,6346,6347,4704,6348,4705,4706,3135,6349,4707,6350,4708, # 4656
6351,4377,6352,4709,3734,4145,6353,2506,4710,3189,6354,3050,4711,3981,6355,3547, # 4672
3014,4146,4378,3735,2651,3845,3260,3136,2224,1986,6356,3401,6357,4712,2594,3627, # 4688
3137,2573,3736,3982,4713,3628,4714,4715,2682,3629,4716,6358,3630,4379,3631,6359, # 4704
6360,6361,3983,6362,6363,6364,6365,4147,3846,4717,6366,6367,3737,2842,6368,4718, # 4720
2628,6369,3261,6370,2386,6371,6372,3738,3984,4719,3464,4720,3402,6373,2924,3336, # 4736
4148,2866,6374,2805,3262,4380,2704,2069,2531,3138,2806,2984,6375,2769,6376,4721, # 4752
4722,3403,6377,6378,3548,6379,6380,2705,3092,1979,4149,2629,3337,2889,6381,3338, # 4768
4150,2557,3339,4381,6382,3190,3263,3739,6383,4151,4723,4152,2558,2574,3404,3191, # 4784
6384,6385,4153,6386,4724,4382,6387,6388,4383,6389,6390,4154,6391,4725,3985,6392, # 4800
3847,4155,6393,6394,6395,6396,6397,3465,6398,4384,6399,6400,6401,6402,6403,6404, # 4816
4156,6405,6406,6407,6408,2123,6409,6410,2326,3192,4726,6411,6412,6413,6414,4385, # 4832
4157,6415,6416,4158,6417,3093,3848,6418,3986,6419,6420,3849,6421,6422,6423,4159, # 4848
6424,6425,4160,6426,3740,6427,6428,6429,6430,3987,6431,4727,6432,2238,6433,6434, # 4864
4386,3988,6435,6436,3632,6437,6438,2843,6439,6440,6441,6442,3633,6443,2958,6444, # 4880
6445,3466,6446,2364,4387,3850,6447,4388,2959,3340,6448,3851,6449,4728,6450,6451, # 4896
3264,4729,6452,3193,6453,4389,4390,2706,3341,4730,6454,3139,6455,3194,6456,3051, # 4912
2124,3852,1602,4391,4161,3853,1158,3854,4162,3989,4392,3990,4731,4732,4393,2040, # 4928
4163,4394,3265,6457,2807,3467,3855,6458,6459,6460,3991,3468,4733,4734,6461,3140, # 4944
2960,6462,4735,6463,6464,6465,6466,4736,4737,4738,4739,6467,6468,4164,2403,3856, # 4960
6469,6470,2770,2844,6471,4740,6472,6473,6474,6475,6476,6477,6478,3195,6479,4741, # 4976
4395,6480,2867,6481,4742,2808,6482,2493,4165,6483,6484,6485,6486,2295,4743,6487, # 4992
6488,6489,3634,6490,6491,6492,6493,6494,6495,6496,2985,4744,6497,6498,4745,6499, # 5008
6500,2925,3141,4166,6501,6502,4746,6503,6504,4747,6505,6506,6507,2890,6508,6509, # 5024
6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,3469,4167,6520,6521,6522,4748, # 5040
4396,3741,4397,4749,4398,3342,2125,4750,6523,4751,4752,4753,3052,6524,2961,4168, # 5056
6525,4754,6526,4755,4399,2926,4169,6527,3857,6528,4400,4170,6529,4171,6530,6531, # 5072
2595,6532,6533,6534,6535,3635,6536,6537,6538,6539,6540,6541,6542,4756,6543,6544, # 5088
6545,6546,6547,6548,4401,6549,6550,6551,6552,4402,3405,4757,4403,6553,6554,6555, # 5104
4172,3742,6556,6557,6558,3992,3636,6559,6560,3053,2726,6561,3549,4173,3054,4404, # 5120
6562,6563,3993,4405,3266,3550,2809,4406,6564,6565,6566,4758,4759,6567,3743,6568, # 5136
4760,3744,4761,3470,6569,6570,6571,4407,6572,3745,4174,6573,4175,2810,4176,3196, # 5152
4762,6574,4177,6575,6576,2494,2891,3551,6577,6578,3471,6579,4408,6580,3015,3197, # 5168
6581,3343,2532,3994,3858,6582,3094,3406,4409,6583,2892,4178,4763,4410,3016,4411, # 5184
6584,3995,3142,3017,2683,6585,4179,6586,6587,4764,4412,6588,6589,4413,6590,2986, # 5200
6591,2962,3552,6592,2963,3472,6593,6594,4180,4765,6595,6596,2225,3267,4414,6597, # 5216
3407,3637,4766,6598,6599,3198,6600,4415,6601,3859,3199,6602,3473,4767,2811,4416, # 5232
1856,3268,3200,2575,3996,3997,3201,4417,6603,3095,2927,6604,3143,6605,2268,6606, # 5248
3998,3860,3096,2771,6607,6608,3638,2495,4768,6609,3861,6610,3269,2745,4769,4181, # 5264
3553,6611,2845,3270,6612,6613,6614,3862,6615,6616,4770,4771,6617,3474,3999,4418, # 5280
4419,6618,3639,3344,6619,4772,4182,6620,2126,6621,6622,6623,4420,4773,6624,3018, # 5296
6625,4774,3554,6626,4183,2025,3746,6627,4184,2707,6628,4421,4422,3097,1775,4185, # 5312
3555,6629,6630,2868,6631,6632,4423,6633,6634,4424,2414,2533,2928,6635,4186,2387, # 5328
6636,4775,6637,4187,6638,1891,4425,3202,3203,6639,6640,4776,6641,3345,6642,6643, # 5344
3640,6644,3475,3346,3641,4000,6645,3144,6646,3098,2812,4188,3642,3204,6647,3863, # 5360
3476,6648,3864,6649,4426,4001,6650,6651,6652,2576,6653,4189,4777,6654,6655,6656, # 5376
2846,6657,3477,3205,4002,6658,4003,6659,3347,2252,6660,6661,6662,4778,6663,6664, # 5392
6665,6666,6667,6668,6669,4779,4780,2048,6670,3478,3099,6671,3556,3747,4004,6672, # 5408
6673,6674,3145,4005,3748,6675,6676,6677,6678,6679,3408,6680,6681,6682,6683,3206, # 5424
3207,6684,6685,4781,4427,6686,4782,4783,4784,6687,6688,6689,4190,6690,6691,3479, # 5440
6692,2746,6693,4428,6694,6695,6696,6697,6698,6699,4785,6700,6701,3208,2727,6702, # 5456
3146,6703,6704,3409,2196,6705,4429,6706,6707,6708,2534,1996,6709,6710,6711,2747, # 5472
6712,6713,6714,4786,3643,6715,4430,4431,6716,3557,6717,4432,4433,6718,6719,6720, # 5488
6721,3749,6722,4006,4787,6723,6724,3644,4788,4434,6725,6726,4789,2772,6727,6728, # 5504
6729,6730,6731,2708,3865,2813,4435,6732,6733,4790,4791,3480,6734,6735,6736,6737, # 5520
4436,3348,6738,3410,4007,6739,6740,4008,6741,6742,4792,3411,4191,6743,6744,6745, # 5536
6746,6747,3866,6748,3750,6749,6750,6751,6752,6753,6754,6755,3867,6756,4009,6757, # 5552
4793,4794,6758,2814,2987,6759,6760,6761,4437,6762,6763,6764,6765,3645,6766,6767, # 5568
3481,4192,6768,3751,6769,6770,2174,6771,3868,3752,6772,6773,6774,4193,4795,4438, # 5584
3558,4796,4439,6775,4797,6776,6777,4798,6778,4799,3559,4800,6779,6780,6781,3482, # 5600
6782,2893,6783,6784,4194,4801,4010,6785,6786,4440,6787,4011,6788,6789,6790,6791, # 5616
6792,6793,4802,6794,6795,6796,4012,6797,6798,6799,6800,3349,4803,3483,6801,4804, # 5632
4195,6802,4013,6803,6804,4196,6805,4014,4015,6806,2847,3271,2848,6807,3484,6808, # 5648
6809,6810,4441,6811,4442,4197,4443,3272,4805,6812,3412,4016,1579,6813,6814,4017, # 5664
6815,3869,6816,2964,6817,4806,6818,6819,4018,3646,6820,6821,4807,4019,4020,6822, # 5680
6823,3560,6824,6825,4021,4444,6826,4198,6827,6828,4445,6829,6830,4199,4808,6831, # 5696
6832,6833,3870,3019,2458,6834,3753,3413,3350,6835,4809,3871,4810,3561,4446,6836, # 5712
6837,4447,4811,4812,6838,2459,4448,6839,4449,6840,6841,4022,3872,6842,4813,4814, # 5728
6843,6844,4815,4200,4201,4202,6845,4023,6846,6847,4450,3562,3873,6848,6849,4816, # 5744
4817,6850,4451,4818,2139,6851,3563,6852,6853,3351,6854,6855,3352,4024,2709,3414, # 5760
4203,4452,6856,4204,6857,6858,3874,3875,6859,6860,4819,6861,6862,6863,6864,4453, # 5776
3647,6865,6866,4820,6867,6868,6869,6870,4454,6871,2869,6872,6873,4821,6874,3754, # 5792
6875,4822,4205,6876,6877,6878,3648,4206,4455,6879,4823,6880,4824,3876,6881,3055, # 5808
4207,6882,3415,6883,6884,6885,4208,4209,6886,4210,3353,6887,3354,3564,3209,3485, # 5824
2652,6888,2728,6889,3210,3755,6890,4025,4456,6891,4825,6892,6893,6894,6895,4211, # 5840
6896,6897,6898,4826,6899,6900,4212,6901,4827,6902,2773,3565,6903,4828,6904,6905, # 5856
6906,6907,3649,3650,6908,2849,3566,6909,3567,3100,6910,6911,6912,6913,6914,6915, # 5872
4026,6916,3355,4829,3056,4457,3756,6917,3651,6918,4213,3652,2870,6919,4458,6920, # 5888
2438,6921,6922,3757,2774,4830,6923,3356,4831,4832,6924,4833,4459,3653,2507,6925, # 5904
4834,2535,6926,6927,3273,4027,3147,6928,3568,6929,6930,6931,4460,6932,3877,4461, # 5920
2729,3654,6933,6934,6935,6936,2175,4835,2630,4214,4028,4462,4836,4215,6937,3148, # 5936
4216,4463,4837,4838,4217,6938,6939,2850,4839,6940,4464,6941,6942,6943,4840,6944, # 5952
4218,3274,4465,6945,6946,2710,6947,4841,4466,6948,6949,2894,6950,6951,4842,6952, # 5968
4219,3057,2871,6953,6954,6955,6956,4467,6957,2711,6958,6959,6960,3275,3101,4843, # 5984
6961,3357,3569,6962,4844,6963,6964,4468,4845,3570,6965,3102,4846,3758,6966,4847, # 6000
3878,4848,4849,4029,6967,2929,3879,4850,4851,6968,6969,1733,6970,4220,6971,6972, # 6016
6973,6974,6975,6976,4852,6977,6978,6979,6980,6981,6982,3759,6983,6984,6985,3486, # 6032
3487,6986,3488,3416,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,4853, # 6048
6998,6999,4030,7000,7001,3211,7002,7003,4221,7004,7005,3571,4031,7006,3572,7007, # 6064
2614,4854,2577,7008,7009,2965,3655,3656,4855,2775,3489,3880,4222,4856,3881,4032, # 6080
3882,3657,2730,3490,4857,7010,3149,7011,4469,4858,2496,3491,4859,2283,7012,7013, # 6096
7014,2365,4860,4470,7015,7016,3760,7017,7018,4223,1917,7019,7020,7021,4471,7022, # 6112
2776,4472,7023,7024,7025,7026,4033,7027,3573,4224,4861,4034,4862,7028,7029,1929, # 6128
3883,4035,7030,4473,3058,7031,2536,3761,3884,7032,4036,7033,2966,2895,1968,4474, # 6144
3276,4225,3417,3492,4226,2105,7034,7035,1754,2596,3762,4227,4863,4475,3763,4864, # 6160
3764,2615,2777,3103,3765,3658,3418,4865,2296,3766,2815,7036,7037,7038,3574,2872, # 6176
3277,4476,7039,4037,4477,7040,7041,4038,7042,7043,7044,7045,7046,7047,2537,7048, # 6192
7049,7050,7051,7052,7053,7054,4478,7055,7056,3767,3659,4228,3575,7057,7058,4229, # 6208
7059,7060,7061,3660,7062,3212,7063,3885,4039,2460,7064,7065,7066,7067,7068,7069, # 6224
7070,7071,7072,7073,7074,4866,3768,4867,7075,7076,7077,7078,4868,3358,3278,2653, # 6240
7079,7080,4479,3886,7081,7082,4869,7083,7084,7085,7086,7087,7088,2538,7089,7090, # 6256
7091,4040,3150,3769,4870,4041,2896,3359,4230,2930,7092,3279,7093,2967,4480,3213, # 6272
4481,3661,7094,7095,7096,7097,7098,7099,7100,7101,7102,2461,3770,7103,7104,4231, # 6288
3151,7105,7106,7107,4042,3662,7108,7109,4871,3663,4872,4043,3059,7110,7111,7112, # 6304
3493,2988,7113,4873,7114,7115,7116,3771,4874,7117,7118,4232,4875,7119,3576,2336, # 6320
4876,7120,4233,3419,4044,4877,4878,4482,4483,4879,4484,4234,7121,3772,4880,1045, # 6336
3280,3664,4881,4882,7122,7123,7124,7125,4883,7126,2778,7127,4485,4486,7128,4884, # 6352
3214,3887,7129,7130,3215,7131,4885,4045,7132,7133,4046,7134,7135,7136,7137,7138, # 6368
7139,7140,7141,7142,7143,4235,7144,4886,7145,7146,7147,4887,7148,7149,7150,4487, # 6384
4047,4488,7151,7152,4888,4048,2989,3888,7153,3665,7154,4049,7155,7156,7157,7158, # 6400
7159,7160,2931,4889,4890,4489,7161,2631,3889,4236,2779,7162,7163,4891,7164,3060, # 6416
7165,1672,4892,7166,4893,4237,3281,4894,7167,7168,3666,7169,3494,7170,7171,4050, # 6432
7172,7173,3104,3360,3420,4490,4051,2684,4052,7174,4053,7175,7176,7177,2253,4054, # 6448
7178,7179,4895,7180,3152,3890,3153,4491,3216,7181,7182,7183,2968,4238,4492,4055, # 6464
7184,2990,7185,2479,7186,7187,4493,7188,7189,7190,7191,7192,4896,7193,4897,2969, # 6480
4494,4898,7194,3495,7195,7196,4899,4495,7197,3105,2731,7198,4900,7199,7200,7201, # 6496
4056,7202,3361,7203,7204,4496,4901,4902,7205,4497,7206,7207,2315,4903,7208,4904, # 6512
7209,4905,2851,7210,7211,3577,7212,3578,4906,7213,4057,3667,4907,7214,4058,2354, # 6528
3891,2376,3217,3773,7215,7216,7217,7218,7219,4498,7220,4908,3282,2685,7221,3496, # 6544
4909,2632,3154,4910,7222,2337,7223,4911,7224,7225,7226,4912,4913,3283,4239,4499, # 6560
7227,2816,7228,7229,7230,7231,7232,7233,7234,4914,4500,4501,7235,7236,7237,2686, # 6576
7238,4915,7239,2897,4502,7240,4503,7241,2516,7242,4504,3362,3218,7243,7244,7245, # 6592
4916,7246,7247,4505,3363,7248,7249,7250,7251,3774,4506,7252,7253,4917,7254,7255, # 6608
3284,2991,4918,4919,3219,3892,4920,3106,3497,4921,7256,7257,7258,4922,7259,4923, # 6624
3364,4507,4508,4059,7260,4240,3498,7261,7262,4924,7263,2992,3893,4060,3220,7264, # 6640
7265,7266,7267,7268,7269,4509,3775,7270,2817,7271,4061,4925,4510,3776,7272,4241, # 6656
4511,3285,7273,7274,3499,7275,7276,7277,4062,4512,4926,7278,3107,3894,7279,7280, # 6672
4927,7281,4513,7282,7283,3668,7284,7285,4242,4514,4243,7286,2058,4515,4928,4929, # 6688
4516,7287,3286,4244,7288,4517,7289,7290,7291,3669,7292,7293,4930,4931,4932,2355, # 6704
4933,7294,2633,4518,7295,4245,7296,7297,4519,7298,7299,4520,4521,4934,7300,4246, # 6720
4522,7301,7302,7303,3579,7304,4247,4935,7305,4936,7306,7307,7308,7309,3777,7310, # 6736
4523,7311,7312,7313,4248,3580,7314,4524,3778,4249,7315,3581,7316,3287,7317,3221, # 6752
7318,4937,7319,7320,7321,7322,7323,7324,4938,4939,7325,4525,7326,7327,7328,4063, # 6768
7329,7330,4940,7331,7332,4941,7333,4526,7334,3500,2780,1741,4942,2026,1742,7335, # 6784
7336,3582,4527,2388,7337,7338,7339,4528,7340,4250,4943,7341,7342,7343,4944,7344, # 6800
7345,7346,3020,7347,4945,7348,7349,7350,7351,3895,7352,3896,4064,3897,7353,7354, # 6816
7355,4251,7356,7357,3898,7358,3779,7359,3780,3288,7360,7361,4529,7362,4946,4530, # 6832
2027,7363,3899,4531,4947,3222,3583,7364,4948,7365,7366,7367,7368,4949,3501,4950, # 6848
3781,4951,4532,7369,2517,4952,4252,4953,3155,7370,4954,4955,4253,2518,4533,7371, # 6864
7372,2712,4254,7373,7374,7375,3670,4956,3671,7376,2389,3502,4065,7377,2338,7378, # 6880
7379,7380,7381,3061,7382,4957,7383,7384,7385,7386,4958,4534,7387,7388,2993,7389, # 6896
3062,7390,4959,7391,7392,7393,4960,3108,4961,7394,4535,7395,4962,3421,4536,7396, # 6912
4963,7397,4964,1857,7398,4965,7399,7400,2176,3584,4966,7401,7402,3422,4537,3900, # 6928
3585,7403,3782,7404,2852,7405,7406,7407,4538,3783,2654,3423,4967,4539,7408,3784, # 6944
3586,2853,4540,4541,7409,3901,7410,3902,7411,7412,3785,3109,2327,3903,7413,7414, # 6960
2970,4066,2932,7415,7416,7417,3904,3672,3424,7418,4542,4543,4544,7419,4968,7420, # 6976
7421,4255,7422,7423,7424,7425,7426,4067,7427,3673,3365,4545,7428,3110,2559,3674, # 6992
7429,7430,3156,7431,7432,3503,7433,3425,4546,7434,3063,2873,7435,3223,4969,4547, # 7008
4548,2898,4256,4068,7436,4069,3587,3786,2933,3787,4257,4970,4971,3788,7437,4972, # 7024
3064,7438,4549,7439,7440,7441,7442,7443,4973,3905,7444,2874,7445,7446,7447,7448, # 7040
3021,7449,4550,3906,3588,4974,7450,7451,3789,3675,7452,2578,7453,4070,7454,7455, # 7056
7456,4258,3676,7457,4975,7458,4976,4259,3790,3504,2634,4977,3677,4551,4260,7459, # 7072
7460,7461,7462,3907,4261,4978,7463,7464,7465,7466,4979,4980,7467,7468,2213,4262, # 7088
7469,7470,7471,3678,4981,7472,2439,7473,4263,3224,3289,7474,3908,2415,4982,7475, # 7104
4264,7476,4983,2655,7477,7478,2732,4552,2854,2875,7479,7480,4265,7481,4553,4984, # 7120
7482,7483,4266,7484,3679,3366,3680,2818,2781,2782,3367,3589,4554,3065,7485,4071, # 7136
2899,7486,7487,3157,2462,4072,4555,4073,4985,4986,3111,4267,2687,3368,4556,4074, # 7152
3791,4268,7488,3909,2783,7489,2656,1962,3158,4557,4987,1963,3159,3160,7490,3112, # 7168
4988,4989,3022,4990,4991,3792,2855,7491,7492,2971,4558,7493,7494,4992,7495,7496, # 7184
7497,7498,4993,7499,3426,4559,4994,7500,3681,4560,4269,4270,3910,7501,4075,4995, # 7200
4271,7502,7503,4076,7504,4996,7505,3225,4997,4272,4077,2819,3023,7506,7507,2733, # 7216
4561,7508,4562,7509,3369,3793,7510,3590,2508,7511,7512,4273,3113,2994,2616,7513, # 7232
7514,7515,7516,7517,7518,2820,3911,4078,2748,7519,7520,4563,4998,7521,7522,7523, # 7248
7524,4999,4274,7525,4564,3682,2239,4079,4565,7526,7527,7528,7529,5000,7530,7531, # 7264
5001,4275,3794,7532,7533,7534,3066,5002,4566,3161,7535,7536,4080,7537,3162,7538, # 7280
7539,4567,7540,7541,7542,7543,7544,7545,5003,7546,4568,7547,7548,7549,7550,7551, # 7296
7552,7553,7554,7555,7556,5004,7557,7558,7559,5005,7560,3795,7561,4569,7562,7563, # 7312
7564,2821,3796,4276,4277,4081,7565,2876,7566,5006,7567,7568,2900,7569,3797,3912, # 7328
7570,7571,7572,4278,7573,7574,7575,5007,7576,7577,5008,7578,7579,4279,2934,7580, # 7344
7581,5009,7582,4570,7583,4280,7584,7585,7586,4571,4572,3913,7587,4573,3505,7588, # 7360
5010,7589,7590,7591,7592,3798,4574,7593,7594,5011,7595,4281,7596,7597,7598,4282, # 7376
5012,7599,7600,5013,3163,7601,5014,7602,3914,7603,7604,2734,4575,4576,4577,7605, # 7392
7606,7607,7608,7609,3506,5015,4578,7610,4082,7611,2822,2901,2579,3683,3024,4579, # 7408
3507,7612,4580,7613,3226,3799,5016,7614,7615,7616,7617,7618,7619,7620,2995,3290, # 7424
7621,4083,7622,5017,7623,7624,7625,7626,7627,4581,3915,7628,3291,7629,5018,7630, # 7440
7631,7632,7633,4084,7634,7635,3427,3800,7636,7637,4582,7638,5019,4583,5020,7639, # 7456
3916,7640,3801,5021,4584,4283,7641,7642,3428,3591,2269,7643,2617,7644,4585,3592, # 7472
7645,4586,2902,7646,7647,3227,5022,7648,4587,7649,4284,7650,7651,7652,4588,2284, # 7488
7653,5023,7654,7655,7656,4589,5024,3802,7657,7658,5025,3508,4590,7659,7660,7661, # 7504
1969,5026,7662,7663,3684,1821,2688,7664,2028,2509,4285,7665,2823,1841,7666,2689, # 7520
3114,7667,3917,4085,2160,5027,5028,2972,7668,5029,7669,7670,7671,3593,4086,7672, # 7536
4591,4087,5030,3803,7673,7674,7675,7676,7677,7678,7679,4286,2366,4592,4593,3067, # 7552
2328,7680,7681,4594,3594,3918,2029,4287,7682,5031,3919,3370,4288,4595,2856,7683, # 7568
3509,7684,7685,5032,5033,7686,7687,3804,2784,7688,7689,7690,7691,3371,7692,7693, # 7584
2877,5034,7694,7695,3920,4289,4088,7696,7697,7698,5035,7699,5036,4290,5037,5038, # 7600
5039,7700,7701,7702,5040,5041,3228,7703,1760,7704,5042,3229,4596,2106,4089,7705, # 7616
4597,2824,5043,2107,3372,7706,4291,4090,5044,7707,4091,7708,5045,3025,3805,4598, # 7632
4292,4293,4294,3373,7709,4599,7710,5046,7711,7712,5047,5048,3806,7713,7714,7715, # 7648
5049,7716,7717,7718,7719,4600,5050,7720,7721,7722,5051,7723,4295,3429,7724,7725, # 7664
7726,7727,3921,7728,3292,5052,4092,7729,7730,7731,7732,7733,7734,7735,5053,5054, # 7680
7736,7737,7738,7739,3922,3685,7740,7741,7742,7743,2635,5055,7744,5056,4601,7745, # 7696
7746,2560,7747,7748,7749,7750,3923,7751,7752,7753,7754,7755,4296,2903,7756,7757, # 7712
7758,7759,7760,3924,7761,5057,4297,7762,7763,5058,4298,7764,4093,7765,7766,5059, # 7728
3925,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,3595,7777,4299,5060,4094, # 7744
7778,3293,5061,7779,7780,4300,7781,7782,4602,7783,3596,7784,7785,3430,2367,7786, # 7760
3164,5062,5063,4301,7787,7788,4095,5064,5065,7789,3374,3115,7790,7791,7792,7793, # 7776
7794,7795,7796,3597,4603,7797,7798,3686,3116,3807,5066,7799,7800,5067,7801,7802, # 7792
4604,4302,5068,4303,4096,7803,7804,3294,7805,7806,5069,4605,2690,7807,3026,7808, # 7808
7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824, # 7824
7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7840
7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856, # 7856
7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872, # 7872
7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888, # 7888
7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904, # 7904
7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920, # 7920
7921,7922,7923,7924,3926,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, # 7936
7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, # 7952
7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, # 7968
7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, # 7984
7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, # 8000
8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, # 8016
8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, # 8032
8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, # 8048
8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, # 8064
8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, # 8080
8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, # 8096
8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, # 8112
8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, # 8128
8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, # 8144
8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, # 8160
8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, # 8176
8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, # 8192
8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, # 8208
8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, # 8224
8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, # 8240
8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, # 8256
8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271) # 8272

# flake8: noqa
site-packages/pip/_vendor/requests/packages/chardet/langhebrewmodel.py000064400000026066151733463760022315 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Universal charset detector code.
#
# The Initial Developer of the Original Code is
#          Simon Montagu
# Portions created by the Initial Developer are Copyright (C) 2005
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#   Shy Shalom - original C code
#   Shoshannah Forbes - original C code (?)
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

# 255: Control characters that usually does not exist in any text
# 254: Carriage/Return
# 253: symbol (punctuation) that does not belong to word
# 252: 0 - 9

# Windows-1255 language model
# Character Mapping Table:
win1255_CharToOrderMap = (
255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85,  # 40
 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253,  # 50
253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49,  # 60
 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253,  # 70
124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214,
215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221,
 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227,
106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234,
 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237,
238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250,
  9,  8, 20, 16,  3,  2, 24, 14, 22,  1, 25, 15,  4, 11,  6, 23,
 12, 19, 13, 26, 18, 27, 21, 17,  7, 10,  5,251,252,128, 96,253,
)

# Model Table:
# total sequences: 100%
# first 512 sequences: 98.4004%
# first 1024 sequences: 1.5981%
# rest  sequences:      0.087%
# negative sequences:   0.0015%
HebrewLangModel = (
0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0,
3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,
1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,
1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3,
1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2,
1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2,
1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2,
0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2,
0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,
3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2,
1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,
3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2,
0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1,
0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,
0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2,
0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,
3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2,
0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,
3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2,
0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2,
0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2,
0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,
3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1,
0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2,
0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0,
3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2,
0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,
3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2,
0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2,
0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0,
1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2,
0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0,
0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3,
0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0,
0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0,
0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,
0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0,
2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0,
0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1,
0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1,
0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,
0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0,
0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1,
1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1,
0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1,
2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1,
1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1,
2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1,
1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1,
2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,
0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1,
1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1,
0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0,
)

Win1255HebrewModel = {
  'charToOrderMap': win1255_CharToOrderMap,
  'precedenceMatrix': HebrewLangModel,
  'mTypicalPositiveRatio': 0.984004,
  'keepEnglishLetter': False,
  'charsetName': "windows-1255"
}

# flake8: noqa
site-packages/pip/_vendor/requests/packages/chardet/gb2312freq.py000064400000106253151733463760020731 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Communicator client code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

# GB2312 most frequently used character table
#
# Char to FreqOrder table , from hz6763

# 512  --> 0.79  -- 0.79
# 1024 --> 0.92  -- 0.13
# 2048 --> 0.98  -- 0.06
# 6768 --> 1.00  -- 0.02
#
# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79
# Random Distribution Ration = 512 / (3755 - 512) = 0.157
#
# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR

GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9

GB2312_TABLE_SIZE = 3760

GB2312CharToFreqOrder = (
1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205,
2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842,
2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409,
 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670,
1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820,
1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585,
 152,1687,1539, 738,1559,  59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566,
1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850,  70,3285,2729,3534,3575,
2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853,
3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061,
 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155,
1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406,
 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816,
2534,1546,2393,2760, 737,2494,  13, 447, 245,2747,  38,2765,2129,2589,1079, 606,
 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023,
2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414,
1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513,
3195,4115,5627,2489,2991,  24,2065,2697,1087,2719,  48,1634, 315,  68, 985,2052,
 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570,
1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575,
 253,3099,  32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250,
2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506,
1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563,  26,
3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835,
1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686,
2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054,
1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894,
 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105,
3777,3657, 643,2298,1148,1779, 190, 989,3544, 414,  11,2135,2063,2979,1471, 403,
3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694,
 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873,
3651, 210,  33,1608,2516, 200,1520, 415, 102,   0,3389,1287, 817,  91,3299,2940,
 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687,  20,1819, 121,
1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648,
3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992,
2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680,  72, 842,1990, 212,1233,
1154,1586,  75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157,
 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807,
1910, 534, 529,3309,1721,1660, 274,  39,2827, 661,2670,1578, 925,3248,3815,1094,
4278,4901,4252,  41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258,
 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478,
3568, 194,5062,  15, 961,3870,1241,1192,2664,  66,5215,3260,2111,1295,1127,2152,
3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426,  53,2909,
 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272,
1272,2363, 284,1753,3679,4064,1695,  81, 815,2677,2757,2731,1386, 859, 500,4221,
2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252,
1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301,
1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254,
 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070,
3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461,
3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640,  67,2360,
4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124,
 296,3979,1739,1611,3684,  23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535,
3116,  17,1074, 467,2692,2201, 387,2922,  45,1326,3055,1645,3659,2817, 958, 243,
1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713,
1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071,
4046,3572,2399,1571,3281,  79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442,
 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946,
 814,4968,3487,1548,2644,1567,1285,   2, 295,2636,  97, 946,3576, 832, 141,4257,
3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180,
1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427,
 602,1525,2608,1605,1639,3175, 694,3064,  10, 465,  76,2000,4846,4208, 444,3781,
1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724,
2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844,  89, 937,
 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943,
 432, 445,2811, 206,4136,1472, 730, 349,  73, 397,2802,2547, 998,1637,1167, 789,
 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552,
3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246,
4996, 371,1575,2436,1621,2210, 984,4033,1734,2638,  16,4529, 663,2755,3255,1451,
3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310,
 750,2058, 165,  80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860,
2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297,
2357, 395,3740, 137,2075, 944,4089,2584,1267,3802,  62,1533,2285, 178, 176, 780,
2440, 201,3707, 590, 478,1560,4354,2117,1075,  30,  74,4643,4004,1635,1441,2745,
 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936,
2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032,
 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669,  43,2523,1657,
 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414,
 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976,
3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436,
2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254,
2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024,  40,3240,1536,
1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238,
  18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059,
2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741,
  90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447,
 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601,
1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269,
1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076,  46,4253,2873,1889,1894,
 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173,
 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994,
1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956,
2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437,
3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154,
2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240,
2269,2246,1446,  36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143,
2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634,
3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472,
1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906,  51, 369, 170,3541,
1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143,
2101,2730,2490,  82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312,
1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414,
3750,2289,2795, 813,3123,2610,1136,4368,   5,3391,4541,2174, 420, 429,1728, 754,
1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424,
1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302,
3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739,
 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004,
2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484,
1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739,
4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535,
1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641,
1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307,
3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573,
1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533,
  47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965,
 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096,  99,
1397,1769,2300,4428,1643,3455,1978,1757,3718,1440,  35,4879,3742,1296,4228,2280,
 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505,
1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012,
1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039,
 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982,
3708, 135,2131,  87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530,
4314,   9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392,
3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656,
2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220,
2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766,
1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535,
3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728,
2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338,
1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627,
1505,1911,1883,3526, 698,3629,3456,1833,1431, 746,  77,1261,2017,2296,1977,1885,
 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411,
2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671,
2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162,
3192,2910,2010, 140,2395,2859,  55,1082,2012,2901, 662, 419,2081,1438, 680,2774,
4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524,
3399,  98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346,
 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040,
3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188,
2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280,
1086,1974,2034, 630, 257,3338,2788,4903,1017,  86,4790, 966,2789,1995,1696,1131,
 259,3095,4188,1308, 179,1463,5257, 289,4107,1248,  42,3413,1725,2288, 896,1947,
 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970,
3034,3310, 540,2370,1562,1288,2990, 502,4765,1147,   4,1853,2708, 207, 294,2814,
4078,2902,2509, 684,  34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557,
2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997,
1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972,
1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369,
 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376,
1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196,  19, 941,3624,3480,
3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610,
 955,1089,3103,1053,  96,  88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128,
 642,4006, 903,2539,1877,2082, 596,  29,4066,1790, 722,2157, 130, 995,1569, 769,
1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445,  50, 625, 487,2207,
  57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392,
1783, 362,   8,3433,3422, 610,2793,3277,1390,1284,1654,  21,3823, 734, 367, 623,
 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782,
2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650,
 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478,
2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773,
2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007,
1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323,
1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598,
2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961,
 819,1541, 142,2284,  44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302,
1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409,
1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683,
2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191,
2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434,  92,1466,4920,2616,
3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302,
1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774,
4462,  64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147,
 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731,
 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464,
3264,2855,2722,1952,1029,2839,2467,  84,4383,2215, 820,1391,2015,2448,3672, 377,
1948,2168, 797,2545,3536,2578,2645,  94,2874,1678, 405,1259,3071, 771, 546,1315,
 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928,  14,2594, 557,
3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903,
1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060,
4031,2641,4067,3145,1870,  37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261,
1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092,
2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810,
1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708,
 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658,
1178,2639,2351,  93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871,
3341,1618,4126,2595,2334, 603, 651,  69, 701, 268,2662,3411,2555,1380,1606, 503,
 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229,
2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112,
 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504,
1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389,
1281,  52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169,  27,
1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542,
3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861,
2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845,
3891,2868,3621,2254,  58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700,
3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469,
3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582,
 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999,
2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274,
 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020,
2724,1927,2333,4440, 567,  22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601,
  12, 974,3783,4391, 951,1412,   1,3720, 453,4608,4041, 528,1041,1027,3230,2628,
1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040,  31,
 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668,
 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778,
1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169,
3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667,
3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118,  63,2076, 314,1881,
1348,1061, 172, 978,3515,1747, 532, 511,3970,   6, 601, 905,2699,3300,1751, 276,
1467,3725,2668,  65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320,
3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751,
2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432,
2754,  95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772,
1985, 244,2546, 474, 495,1046,2611,1851,2061,  71,2089,1675,2590, 742,3758,2843,
3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116,
 451,   3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904,
4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652,
1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664,
2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078,  49,3770,
3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283,
3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626,
1197,1663,4476,3127,  85,4240,2528,  25,1111,1181,3673, 407,3470,4561,2679,2713,
 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333,
 391,2963, 187,  61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062,
2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555,
 931, 317,2517,3027, 325, 569, 686,2107,3084,  60,1042,1333,2794, 264,3177,4014,
1628, 258,3712,   7,4464,1176,1043,1778, 683, 114,1975,  78,1492, 383,1886, 510,
 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015,
1282,1289,4609, 697,1453,3044,2666,3611,1856,2412,  54, 719,1330, 568,3778,2459,
1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390,
1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238,
1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421,  56,1908,1640,2387,2232,
1917,1874,2477,4921, 148,  83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624,
 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189,
 852,1221,1400,1486, 882,2299,4036, 351,  28,1122, 700,6479,6480,6481,6482,6483,  # last 512
#Everything below is of no interest for detection purpose
5508,6484,3900,3414,3974,4441,4024,3537,4037,5628,5099,3633,6485,3148,6486,3636,
5509,3257,5510,5973,5445,5872,4941,4403,3174,4627,5873,6276,2286,4230,5446,5874,
5122,6102,6103,4162,5447,5123,5323,4849,6277,3980,3851,5066,4246,5774,5067,6278,
3001,2807,5695,3346,5775,5974,5158,5448,6487,5975,5976,5776,3598,6279,5696,4806,
4211,4154,6280,6488,6489,6490,6281,4212,5037,3374,4171,6491,4562,4807,4722,4827,
5977,6104,4532,4079,5159,5324,5160,4404,3858,5359,5875,3975,4288,4610,3486,4512,
5325,3893,5360,6282,6283,5560,2522,4231,5978,5186,5449,2569,3878,6284,5401,3578,
4415,6285,4656,5124,5979,2506,4247,4449,3219,3417,4334,4969,4329,6492,4576,4828,
4172,4416,4829,5402,6286,3927,3852,5361,4369,4830,4477,4867,5876,4173,6493,6105,
4657,6287,6106,5877,5450,6494,4155,4868,5451,3700,5629,4384,6288,6289,5878,3189,
4881,6107,6290,6495,4513,6496,4692,4515,4723,5100,3356,6497,6291,3810,4080,5561,
3570,4430,5980,6498,4355,5697,6499,4724,6108,6109,3764,4050,5038,5879,4093,3226,
6292,5068,5217,4693,3342,5630,3504,4831,4377,4466,4309,5698,4431,5777,6293,5778,
4272,3706,6110,5326,3752,4676,5327,4273,5403,4767,5631,6500,5699,5880,3475,5039,
6294,5562,5125,4348,4301,4482,4068,5126,4593,5700,3380,3462,5981,5563,3824,5404,
4970,5511,3825,4738,6295,6501,5452,4516,6111,5881,5564,6502,6296,5982,6503,4213,
4163,3454,6504,6112,4009,4450,6113,4658,6297,6114,3035,6505,6115,3995,4904,4739,
4563,4942,4110,5040,3661,3928,5362,3674,6506,5292,3612,4791,5565,4149,5983,5328,
5259,5021,4725,4577,4564,4517,4364,6298,5405,4578,5260,4594,4156,4157,5453,3592,
3491,6507,5127,5512,4709,4922,5984,5701,4726,4289,6508,4015,6116,5128,4628,3424,
4241,5779,6299,4905,6509,6510,5454,5702,5780,6300,4365,4923,3971,6511,5161,3270,
3158,5985,4100, 867,5129,5703,6117,5363,3695,3301,5513,4467,6118,6512,5455,4232,
4242,4629,6513,3959,4478,6514,5514,5329,5986,4850,5162,5566,3846,4694,6119,5456,
4869,5781,3779,6301,5704,5987,5515,4710,6302,5882,6120,4392,5364,5705,6515,6121,
6516,6517,3736,5988,5457,5989,4695,2457,5883,4551,5782,6303,6304,6305,5130,4971,
6122,5163,6123,4870,3263,5365,3150,4871,6518,6306,5783,5069,5706,3513,3498,4409,
5330,5632,5366,5458,5459,3991,5990,4502,3324,5991,5784,3696,4518,5633,4119,6519,
4630,5634,4417,5707,4832,5992,3418,6124,5993,5567,4768,5218,6520,4595,3458,5367,
6125,5635,6126,4202,6521,4740,4924,6307,3981,4069,4385,6308,3883,2675,4051,3834,
4302,4483,5568,5994,4972,4101,5368,6309,5164,5884,3922,6127,6522,6523,5261,5460,
5187,4164,5219,3538,5516,4111,3524,5995,6310,6311,5369,3181,3386,2484,5188,3464,
5569,3627,5708,6524,5406,5165,4677,4492,6312,4872,4851,5885,4468,5996,6313,5709,
5710,6128,2470,5886,6314,5293,4882,5785,3325,5461,5101,6129,5711,5786,6525,4906,
6526,6527,4418,5887,5712,4808,2907,3701,5713,5888,6528,3765,5636,5331,6529,6530,
3593,5889,3637,4943,3692,5714,5787,4925,6315,6130,5462,4405,6131,6132,6316,5262,
6531,6532,5715,3859,5716,5070,4696,5102,3929,5788,3987,4792,5997,6533,6534,3920,
4809,5000,5998,6535,2974,5370,6317,5189,5263,5717,3826,6536,3953,5001,4883,3190,
5463,5890,4973,5999,4741,6133,6134,3607,5570,6000,4711,3362,3630,4552,5041,6318,
6001,2950,2953,5637,4646,5371,4944,6002,2044,4120,3429,6319,6537,5103,4833,6538,
6539,4884,4647,3884,6003,6004,4758,3835,5220,5789,4565,5407,6540,6135,5294,4697,
4852,6320,6321,3206,4907,6541,6322,4945,6542,6136,6543,6323,6005,4631,3519,6544,
5891,6545,5464,3784,5221,6546,5571,4659,6547,6324,6137,5190,6548,3853,6549,4016,
4834,3954,6138,5332,3827,4017,3210,3546,4469,5408,5718,3505,4648,5790,5131,5638,
5791,5465,4727,4318,6325,6326,5792,4553,4010,4698,3439,4974,3638,4335,3085,6006,
5104,5042,5166,5892,5572,6327,4356,4519,5222,5573,5333,5793,5043,6550,5639,5071,
4503,6328,6139,6551,6140,3914,3901,5372,6007,5640,4728,4793,3976,3836,4885,6552,
4127,6553,4451,4102,5002,6554,3686,5105,6555,5191,5072,5295,4611,5794,5296,6556,
5893,5264,5894,4975,5466,5265,4699,4976,4370,4056,3492,5044,4886,6557,5795,4432,
4769,4357,5467,3940,4660,4290,6141,4484,4770,4661,3992,6329,4025,4662,5022,4632,
4835,4070,5297,4663,4596,5574,5132,5409,5895,6142,4504,5192,4664,5796,5896,3885,
5575,5797,5023,4810,5798,3732,5223,4712,5298,4084,5334,5468,6143,4052,4053,4336,
4977,4794,6558,5335,4908,5576,5224,4233,5024,4128,5469,5225,4873,6008,5045,4729,
4742,4633,3675,4597,6559,5897,5133,5577,5003,5641,5719,6330,6560,3017,2382,3854,
4406,4811,6331,4393,3964,4946,6561,2420,3722,6562,4926,4378,3247,1736,4442,6332,
5134,6333,5226,3996,2918,5470,4319,4003,4598,4743,4744,4485,3785,3902,5167,5004,
5373,4394,5898,6144,4874,1793,3997,6334,4085,4214,5106,5642,4909,5799,6009,4419,
4189,3330,5899,4165,4420,5299,5720,5227,3347,6145,4081,6335,2876,3930,6146,3293,
3786,3910,3998,5900,5300,5578,2840,6563,5901,5579,6147,3531,5374,6564,6565,5580,
4759,5375,6566,6148,3559,5643,6336,6010,5517,6337,6338,5721,5902,3873,6011,6339,
6567,5518,3868,3649,5722,6568,4771,4947,6569,6149,4812,6570,2853,5471,6340,6341,
5644,4795,6342,6012,5723,6343,5724,6013,4349,6344,3160,6150,5193,4599,4514,4493,
5168,4320,6345,4927,3666,4745,5169,5903,5005,4928,6346,5725,6014,4730,4203,5046,
4948,3395,5170,6015,4150,6016,5726,5519,6347,5047,3550,6151,6348,4197,4310,5904,
6571,5581,2965,6152,4978,3960,4291,5135,6572,5301,5727,4129,4026,5905,4853,5728,
5472,6153,6349,4533,2700,4505,5336,4678,3583,5073,2994,4486,3043,4554,5520,6350,
6017,5800,4487,6351,3931,4103,5376,6352,4011,4321,4311,4190,5136,6018,3988,3233,
4350,5906,5645,4198,6573,5107,3432,4191,3435,5582,6574,4139,5410,6353,5411,3944,
5583,5074,3198,6575,6354,4358,6576,5302,4600,5584,5194,5412,6577,6578,5585,5413,
5303,4248,5414,3879,4433,6579,4479,5025,4854,5415,6355,4760,4772,3683,2978,4700,
3797,4452,3965,3932,3721,4910,5801,6580,5195,3551,5907,3221,3471,3029,6019,3999,
5908,5909,5266,5267,3444,3023,3828,3170,4796,5646,4979,4259,6356,5647,5337,3694,
6357,5648,5338,4520,4322,5802,3031,3759,4071,6020,5586,4836,4386,5048,6581,3571,
4679,4174,4949,6154,4813,3787,3402,3822,3958,3215,3552,5268,4387,3933,4950,4359,
6021,5910,5075,3579,6358,4234,4566,5521,6359,3613,5049,6022,5911,3375,3702,3178,
4911,5339,4521,6582,6583,4395,3087,3811,5377,6023,6360,6155,4027,5171,5649,4421,
4249,2804,6584,2270,6585,4000,4235,3045,6156,5137,5729,4140,4312,3886,6361,4330,
6157,4215,6158,3500,3676,4929,4331,3713,4930,5912,4265,3776,3368,5587,4470,4855,
3038,4980,3631,6159,6160,4132,4680,6161,6362,3923,4379,5588,4255,6586,4121,6587,
6363,4649,6364,3288,4773,4774,6162,6024,6365,3543,6588,4274,3107,3737,5050,5803,
4797,4522,5589,5051,5730,3714,4887,5378,4001,4523,6163,5026,5522,4701,4175,2791,
3760,6589,5473,4224,4133,3847,4814,4815,4775,3259,5416,6590,2738,6164,6025,5304,
3733,5076,5650,4816,5590,6591,6165,6592,3934,5269,6593,3396,5340,6594,5804,3445,
3602,4042,4488,5731,5732,3525,5591,4601,5196,6166,6026,5172,3642,4612,3202,4506,
4798,6366,3818,5108,4303,5138,5139,4776,3332,4304,2915,3415,4434,5077,5109,4856,
2879,5305,4817,6595,5913,3104,3144,3903,4634,5341,3133,5110,5651,5805,6167,4057,
5592,2945,4371,5593,6596,3474,4182,6367,6597,6168,4507,4279,6598,2822,6599,4777,
4713,5594,3829,6169,3887,5417,6170,3653,5474,6368,4216,2971,5228,3790,4579,6369,
5733,6600,6601,4951,4746,4555,6602,5418,5475,6027,3400,4665,5806,6171,4799,6028,
5052,6172,3343,4800,4747,5006,6370,4556,4217,5476,4396,5229,5379,5477,3839,5914,
5652,5807,4714,3068,4635,5808,6173,5342,4192,5078,5419,5523,5734,6174,4557,6175,
4602,6371,6176,6603,5809,6372,5735,4260,3869,5111,5230,6029,5112,6177,3126,4681,
5524,5915,2706,3563,4748,3130,6178,4018,5525,6604,6605,5478,4012,4837,6606,4534,
4193,5810,4857,3615,5479,6030,4082,3697,3539,4086,5270,3662,4508,4931,5916,4912,
5811,5027,3888,6607,4397,3527,3302,3798,2775,2921,2637,3966,4122,4388,4028,4054,
1633,4858,5079,3024,5007,3982,3412,5736,6608,3426,3236,5595,3030,6179,3427,3336,
3279,3110,6373,3874,3039,5080,5917,5140,4489,3119,6374,5812,3405,4494,6031,4666,
4141,6180,4166,6032,5813,4981,6609,5081,4422,4982,4112,3915,5653,3296,3983,6375,
4266,4410,5654,6610,6181,3436,5082,6611,5380,6033,3819,5596,4535,5231,5306,5113,
6612,4952,5918,4275,3113,6613,6376,6182,6183,5814,3073,4731,4838,5008,3831,6614,
4888,3090,3848,4280,5526,5232,3014,5655,5009,5737,5420,5527,6615,5815,5343,5173,
5381,4818,6616,3151,4953,6617,5738,2796,3204,4360,2989,4281,5739,5174,5421,5197,
3132,5141,3849,5142,5528,5083,3799,3904,4839,5480,2880,4495,3448,6377,6184,5271,
5919,3771,3193,6034,6035,5920,5010,6036,5597,6037,6378,6038,3106,5422,6618,5423,
5424,4142,6619,4889,5084,4890,4313,5740,6620,3437,5175,5307,5816,4199,5198,5529,
5817,5199,5656,4913,5028,5344,3850,6185,2955,5272,5011,5818,4567,4580,5029,5921,
3616,5233,6621,6622,6186,4176,6039,6379,6380,3352,5200,5273,2908,5598,5234,3837,
5308,6623,6624,5819,4496,4323,5309,5201,6625,6626,4983,3194,3838,4167,5530,5922,
5274,6381,6382,3860,3861,5599,3333,4292,4509,6383,3553,5481,5820,5531,4778,6187,
3955,3956,4324,4389,4218,3945,4325,3397,2681,5923,4779,5085,4019,5482,4891,5382,
5383,6040,4682,3425,5275,4094,6627,5310,3015,5483,5657,4398,5924,3168,4819,6628,
5925,6629,5532,4932,4613,6041,6630,4636,6384,4780,4204,5658,4423,5821,3989,4683,
5822,6385,4954,6631,5345,6188,5425,5012,5384,3894,6386,4490,4104,6632,5741,5053,
6633,5823,5926,5659,5660,5927,6634,5235,5742,5824,4840,4933,4820,6387,4859,5928,
4955,6388,4143,3584,5825,5346,5013,6635,5661,6389,5014,5484,5743,4337,5176,5662,
6390,2836,6391,3268,6392,6636,6042,5236,6637,4158,6638,5744,5663,4471,5347,3663,
4123,5143,4293,3895,6639,6640,5311,5929,5826,3800,6189,6393,6190,5664,5348,3554,
3594,4749,4603,6641,5385,4801,6043,5827,4183,6642,5312,5426,4761,6394,5665,6191,
4715,2669,6643,6644,5533,3185,5427,5086,5930,5931,5386,6192,6044,6645,4781,4013,
5745,4282,4435,5534,4390,4267,6045,5746,4984,6046,2743,6193,3501,4087,5485,5932,
5428,4184,4095,5747,4061,5054,3058,3862,5933,5600,6646,5144,3618,6395,3131,5055,
5313,6396,4650,4956,3855,6194,3896,5202,4985,4029,4225,6195,6647,5828,5486,5829,
3589,3002,6648,6397,4782,5276,6649,6196,6650,4105,3803,4043,5237,5830,6398,4096,
3643,6399,3528,6651,4453,3315,4637,6652,3984,6197,5535,3182,3339,6653,3096,2660,
6400,6654,3449,5934,4250,4236,6047,6401,5831,6655,5487,3753,4062,5832,6198,6199,
6656,3766,6657,3403,4667,6048,6658,4338,2897,5833,3880,2797,3780,4326,6659,5748,
5015,6660,5387,4351,5601,4411,6661,3654,4424,5935,4339,4072,5277,4568,5536,6402,
6662,5238,6663,5349,5203,6200,5204,6201,5145,4536,5016,5056,4762,5834,4399,4957,
6202,6403,5666,5749,6664,4340,6665,5936,5177,5667,6666,6667,3459,4668,6404,6668,
6669,4543,6203,6670,4276,6405,4480,5537,6671,4614,5205,5668,6672,3348,2193,4763,
6406,6204,5937,5602,4177,5669,3419,6673,4020,6205,4443,4569,5388,3715,3639,6407,
6049,4058,6206,6674,5938,4544,6050,4185,4294,4841,4651,4615,5488,6207,6408,6051,
5178,3241,3509,5835,6208,4958,5836,4341,5489,5278,6209,2823,5538,5350,5206,5429,
6675,4638,4875,4073,3516,4684,4914,4860,5939,5603,5389,6052,5057,3237,5490,3791,
6676,6409,6677,4821,4915,4106,5351,5058,4243,5539,4244,5604,4842,4916,5239,3028,
3716,5837,5114,5605,5390,5940,5430,6210,4332,6678,5540,4732,3667,3840,6053,4305,
3408,5670,5541,6410,2744,5240,5750,6679,3234,5606,6680,5607,5671,3608,4283,4159,
4400,5352,4783,6681,6411,6682,4491,4802,6211,6412,5941,6413,6414,5542,5751,6683,
4669,3734,5942,6684,6415,5943,5059,3328,4670,4144,4268,6685,6686,6687,6688,4372,
3603,6689,5944,5491,4373,3440,6416,5543,4784,4822,5608,3792,4616,5838,5672,3514,
5391,6417,4892,6690,4639,6691,6054,5673,5839,6055,6692,6056,5392,6212,4038,5544,
5674,4497,6057,6693,5840,4284,5675,4021,4545,5609,6418,4454,6419,6213,4113,4472,
5314,3738,5087,5279,4074,5610,4959,4063,3179,4750,6058,6420,6214,3476,4498,4716,
5431,4960,4685,6215,5241,6694,6421,6216,6695,5841,5945,6422,3748,5946,5179,3905,
5752,5545,5947,4374,6217,4455,6423,4412,6218,4803,5353,6696,3832,5280,6219,4327,
4702,6220,6221,6059,4652,5432,6424,3749,4751,6425,5753,4986,5393,4917,5948,5030,
5754,4861,4733,6426,4703,6697,6222,4671,5949,4546,4961,5180,6223,5031,3316,5281,
6698,4862,4295,4934,5207,3644,6427,5842,5950,6428,6429,4570,5843,5282,6430,6224,
5088,3239,6060,6699,5844,5755,6061,6431,2701,5546,6432,5115,5676,4039,3993,3327,
4752,4425,5315,6433,3941,6434,5677,4617,4604,3074,4581,6225,5433,6435,6226,6062,
4823,5756,5116,6227,3717,5678,4717,5845,6436,5679,5846,6063,5847,6064,3977,3354,
6437,3863,5117,6228,5547,5394,4499,4524,6229,4605,6230,4306,4500,6700,5951,6065,
3693,5952,5089,4366,4918,6701,6231,5548,6232,6702,6438,4704,5434,6703,6704,5953,
4168,6705,5680,3420,6706,5242,4407,6066,3812,5757,5090,5954,4672,4525,3481,5681,
4618,5395,5354,5316,5955,6439,4962,6707,4526,6440,3465,4673,6067,6441,5682,6708,
5435,5492,5758,5683,4619,4571,4674,4804,4893,4686,5493,4753,6233,6068,4269,6442,
6234,5032,4705,5146,5243,5208,5848,6235,6443,4963,5033,4640,4226,6236,5849,3387,
6444,6445,4436,4437,5850,4843,5494,4785,4894,6709,4361,6710,5091,5956,3331,6237,
4987,5549,6069,6711,4342,3517,4473,5317,6070,6712,6071,4706,6446,5017,5355,6713,
6714,4988,5436,6447,4734,5759,6715,4735,4547,4456,4754,6448,5851,6449,6450,3547,
5852,5318,6451,6452,5092,4205,6716,6238,4620,4219,5611,6239,6072,4481,5760,5957,
5958,4059,6240,6453,4227,4537,6241,5761,4030,4186,5244,5209,3761,4457,4876,3337,
5495,5181,6242,5959,5319,5612,5684,5853,3493,5854,6073,4169,5613,5147,4895,6074,
5210,6717,5182,6718,3830,6243,2798,3841,6075,6244,5855,5614,3604,4606,5496,5685,
5118,5356,6719,6454,5960,5357,5961,6720,4145,3935,4621,5119,5962,4261,6721,6455,
4786,5963,4375,4582,6245,6246,6247,6076,5437,4877,5856,3376,4380,6248,4160,6722,
5148,6456,5211,6457,6723,4718,6458,6724,6249,5358,4044,3297,6459,6250,5857,5615,
5497,5245,6460,5498,6725,6251,6252,5550,3793,5499,2959,5396,6461,6462,4572,5093,
5500,5964,3806,4146,6463,4426,5762,5858,6077,6253,4755,3967,4220,5965,6254,4989,
5501,6464,4352,6726,6078,4764,2290,5246,3906,5438,5283,3767,4964,2861,5763,5094,
6255,6256,4622,5616,5859,5860,4707,6727,4285,4708,4824,5617,6257,5551,4787,5212,
4965,4935,4687,6465,6728,6466,5686,6079,3494,4413,2995,5247,5966,5618,6729,5967,
5764,5765,5687,5502,6730,6731,6080,5397,6467,4990,6258,6732,4538,5060,5619,6733,
4719,5688,5439,5018,5149,5284,5503,6734,6081,4607,6259,5120,3645,5861,4583,6260,
4584,4675,5620,4098,5440,6261,4863,2379,3306,4585,5552,5689,4586,5285,6735,4864,
6736,5286,6082,6737,4623,3010,4788,4381,4558,5621,4587,4896,3698,3161,5248,4353,
4045,6262,3754,5183,4588,6738,6263,6739,6740,5622,3936,6741,6468,6742,6264,5095,
6469,4991,5968,6743,4992,6744,6083,4897,6745,4256,5766,4307,3108,3968,4444,5287,
3889,4343,6084,4510,6085,4559,6086,4898,5969,6746,5623,5061,4919,5249,5250,5504,
5441,6265,5320,4878,3242,5862,5251,3428,6087,6747,4237,5624,5442,6266,5553,4539,
6748,2585,3533,5398,4262,6088,5150,4736,4438,6089,6267,5505,4966,6749,6268,6750,
6269,5288,5554,3650,6090,6091,4624,6092,5690,6751,5863,4270,5691,4277,5555,5864,
6752,5692,4720,4865,6470,5151,4688,4825,6753,3094,6754,6471,3235,4653,6755,5213,
5399,6756,3201,4589,5865,4967,6472,5866,6473,5019,3016,6757,5321,4756,3957,4573,
6093,4993,5767,4721,6474,6758,5625,6759,4458,6475,6270,6760,5556,4994,5214,5252,
6271,3875,5768,6094,5034,5506,4376,5769,6761,2120,6476,5253,5770,6762,5771,5970,
3990,5971,5557,5558,5772,6477,6095,2787,4641,5972,5121,6096,6097,6272,6763,3703,
5867,5507,6273,4206,6274,4789,6098,6764,3619,3646,3833,3804,2394,3788,4936,3978,
4866,4899,6099,6100,5559,6478,6765,3599,5868,6101,5869,5870,6275,6766,4527,6767)

# flake8: noqa
site-packages/pip/_vendor/requests/packages/chardet/cp949prober.py000064400000003366151733463760021236 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

from .mbcharsetprober import MultiByteCharSetProber
from .codingstatemachine import CodingStateMachine
from .chardistribution import EUCKRDistributionAnalysis
from .mbcssm import CP949SMModel


class CP949Prober(MultiByteCharSetProber):
    def __init__(self):
        MultiByteCharSetProber.__init__(self)
        self._mCodingSM = CodingStateMachine(CP949SMModel)
        # NOTE: CP949 is a superset of EUC-KR, so the distribution should be
        #       not different.
        self._mDistributionAnalyzer = EUCKRDistributionAnalysis()
        self.reset()

    def get_charset_name(self):
        return "CP949"
site-packages/pip/_vendor/requests/packages/chardet/sbcharsetprober.py000064400000011271151733463760022336 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Universal charset detector code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 2001
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#   Shy Shalom - original C code
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

import sys
from . import constants
from .charsetprober import CharSetProber
from .compat import wrap_ord

SAMPLE_SIZE = 64
SB_ENOUGH_REL_THRESHOLD = 1024
POSITIVE_SHORTCUT_THRESHOLD = 0.95
NEGATIVE_SHORTCUT_THRESHOLD = 0.05
SYMBOL_CAT_ORDER = 250
NUMBER_OF_SEQ_CAT = 4
POSITIVE_CAT = NUMBER_OF_SEQ_CAT - 1
#NEGATIVE_CAT = 0


class SingleByteCharSetProber(CharSetProber):
    def __init__(self, model, reversed=False, nameProber=None):
        CharSetProber.__init__(self)
        self._mModel = model
        # TRUE if we need to reverse every pair in the model lookup
        self._mReversed = reversed
        # Optional auxiliary prober for name decision
        self._mNameProber = nameProber
        self.reset()

    def reset(self):
        CharSetProber.reset(self)
        # char order of last character
        self._mLastOrder = 255
        self._mSeqCounters = [0] * NUMBER_OF_SEQ_CAT
        self._mTotalSeqs = 0
        self._mTotalChar = 0
        # characters that fall in our sampling range
        self._mFreqChar = 0

    def get_charset_name(self):
        if self._mNameProber:
            return self._mNameProber.get_charset_name()
        else:
            return self._mModel['charsetName']

    def feed(self, aBuf):
        if not self._mModel['keepEnglishLetter']:
            aBuf = self.filter_without_english_letters(aBuf)
        aLen = len(aBuf)
        if not aLen:
            return self.get_state()
        for c in aBuf:
            order = self._mModel['charToOrderMap'][wrap_ord(c)]
            if order < SYMBOL_CAT_ORDER:
                self._mTotalChar += 1
            if order < SAMPLE_SIZE:
                self._mFreqChar += 1
                if self._mLastOrder < SAMPLE_SIZE:
                    self._mTotalSeqs += 1
                    if not self._mReversed:
                        i = (self._mLastOrder * SAMPLE_SIZE) + order
                        model = self._mModel['precedenceMatrix'][i]
                    else:  # reverse the order of the letters in the lookup
                        i = (order * SAMPLE_SIZE) + self._mLastOrder
                        model = self._mModel['precedenceMatrix'][i]
                    self._mSeqCounters[model] += 1
            self._mLastOrder = order

        if self.get_state() == constants.eDetecting:
            if self._mTotalSeqs > SB_ENOUGH_REL_THRESHOLD:
                cf = self.get_confidence()
                if cf > POSITIVE_SHORTCUT_THRESHOLD:
                    if constants._debug:
                        sys.stderr.write('%s confidence = %s, we have a'
                                         'winner\n' %
                                         (self._mModel['charsetName'], cf))
                    self._mState = constants.eFoundIt
                elif cf < NEGATIVE_SHORTCUT_THRESHOLD:
                    if constants._debug:
                        sys.stderr.write('%s confidence = %s, below negative'
                                         'shortcut threshhold %s\n' %
                                         (self._mModel['charsetName'], cf,
                                          NEGATIVE_SHORTCUT_THRESHOLD))
                    self._mState = constants.eNotMe

        return self.get_state()

    def get_confidence(self):
        r = 0.01
        if self._mTotalSeqs > 0:
            r = ((1.0 * self._mSeqCounters[POSITIVE_CAT]) / self._mTotalSeqs
                 / self._mModel['mTypicalPositiveRatio'])
            r = r * self._mFreqChar / self._mTotalChar
            if r >= 1.0:
                r = 0.99
        return r
site-packages/pip/_vendor/requests/packages/chardet/sjisprober.py000064400000007226151733463760021335 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

import sys
from .mbcharsetprober import MultiByteCharSetProber
from .codingstatemachine import CodingStateMachine
from .chardistribution import SJISDistributionAnalysis
from .jpcntx import SJISContextAnalysis
from .mbcssm import SJISSMModel
from . import constants


class SJISProber(MultiByteCharSetProber):
    def __init__(self):
        MultiByteCharSetProber.__init__(self)
        self._mCodingSM = CodingStateMachine(SJISSMModel)
        self._mDistributionAnalyzer = SJISDistributionAnalysis()
        self._mContextAnalyzer = SJISContextAnalysis()
        self.reset()

    def reset(self):
        MultiByteCharSetProber.reset(self)
        self._mContextAnalyzer.reset()

    def get_charset_name(self):
        return "SHIFT_JIS"

    def feed(self, aBuf):
        aLen = len(aBuf)
        for i in range(0, aLen):
            codingState = self._mCodingSM.next_state(aBuf[i])
            if codingState == constants.eError:
                if constants._debug:
                    sys.stderr.write(self.get_charset_name()
                                     + ' prober hit error at byte ' + str(i)
                                     + '\n')
                self._mState = constants.eNotMe
                break
            elif codingState == constants.eItsMe:
                self._mState = constants.eFoundIt
                break
            elif codingState == constants.eStart:
                charLen = self._mCodingSM.get_current_charlen()
                if i == 0:
                    self._mLastChar[1] = aBuf[0]
                    self._mContextAnalyzer.feed(self._mLastChar[2 - charLen:],
                                                charLen)
                    self._mDistributionAnalyzer.feed(self._mLastChar, charLen)
                else:
                    self._mContextAnalyzer.feed(aBuf[i + 1 - charLen:i + 3
                                                     - charLen], charLen)
                    self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1],
                                                     charLen)

        self._mLastChar[0] = aBuf[aLen - 1]

        if self.get_state() == constants.eDetecting:
            if (self._mContextAnalyzer.got_enough_data() and
               (self.get_confidence() > constants.SHORTCUT_THRESHOLD)):
                self._mState = constants.eFoundIt

        return self.get_state()

    def get_confidence(self):
        contxtCf = self._mContextAnalyzer.get_confidence()
        distribCf = self._mDistributionAnalyzer.get_confidence()
        return max(contxtCf, distribCf)
site-packages/pip/_vendor/requests/packages/chardet/escprober.py000064400000006163151733463760021136 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

from . import constants
from .escsm import (HZSMModel, ISO2022CNSMModel, ISO2022JPSMModel,
                    ISO2022KRSMModel)
from .charsetprober import CharSetProber
from .codingstatemachine import CodingStateMachine
from .compat import wrap_ord


class EscCharSetProber(CharSetProber):
    def __init__(self):
        CharSetProber.__init__(self)
        self._mCodingSM = [
            CodingStateMachine(HZSMModel),
            CodingStateMachine(ISO2022CNSMModel),
            CodingStateMachine(ISO2022JPSMModel),
            CodingStateMachine(ISO2022KRSMModel)
        ]
        self.reset()

    def reset(self):
        CharSetProber.reset(self)
        for codingSM in self._mCodingSM:
            if not codingSM:
                continue
            codingSM.active = True
            codingSM.reset()
        self._mActiveSM = len(self._mCodingSM)
        self._mDetectedCharset = None

    def get_charset_name(self):
        return self._mDetectedCharset

    def get_confidence(self):
        if self._mDetectedCharset:
            return 0.99
        else:
            return 0.00

    def feed(self, aBuf):
        for c in aBuf:
            # PY3K: aBuf is a byte array, so c is an int, not a byte
            for codingSM in self._mCodingSM:
                if not codingSM:
                    continue
                if not codingSM.active:
                    continue
                codingState = codingSM.next_state(wrap_ord(c))
                if codingState == constants.eError:
                    codingSM.active = False
                    self._mActiveSM -= 1
                    if self._mActiveSM <= 0:
                        self._mState = constants.eNotMe
                        return self.get_state()
                elif codingState == constants.eItsMe:
                    self._mState = constants.eFoundIt
                    self._mDetectedCharset = codingSM.get_coding_state_machine()  # nopep8
                    return self.get_state()

        return self.get_state()
site-packages/pip/_vendor/requests/packages/chardet/hebrewprober.py000064400000032057151733463760021641 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Universal charset detector code.
#
# The Initial Developer of the Original Code is
#          Shy Shalom
# Portions created by the Initial Developer are Copyright (C) 2005
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

from .charsetprober import CharSetProber
from .constants import eNotMe, eDetecting
from .compat import wrap_ord

# This prober doesn't actually recognize a language or a charset.
# It is a helper prober for the use of the Hebrew model probers

### General ideas of the Hebrew charset recognition ###
#
# Four main charsets exist in Hebrew:
# "ISO-8859-8" - Visual Hebrew
# "windows-1255" - Logical Hebrew
# "ISO-8859-8-I" - Logical Hebrew
# "x-mac-hebrew" - ?? Logical Hebrew ??
#
# Both "ISO" charsets use a completely identical set of code points, whereas
# "windows-1255" and "x-mac-hebrew" are two different proper supersets of
# these code points. windows-1255 defines additional characters in the range
# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific
# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6.
# x-mac-hebrew defines similar additional code points but with a different
# mapping.
#
# As far as an average Hebrew text with no diacritics is concerned, all four
# charsets are identical with respect to code points. Meaning that for the
# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters
# (including final letters).
#
# The dominant difference between these charsets is their directionality.
# "Visual" directionality means that the text is ordered as if the renderer is
# not aware of a BIDI rendering algorithm. The renderer sees the text and
# draws it from left to right. The text itself when ordered naturally is read
# backwards. A buffer of Visual Hebrew generally looks like so:
# "[last word of first line spelled backwards] [whole line ordered backwards
# and spelled backwards] [first word of first line spelled backwards]
# [end of line] [last word of second line] ... etc' "
# adding punctuation marks, numbers and English text to visual text is
# naturally also "visual" and from left to right.
#
# "Logical" directionality means the text is ordered "naturally" according to
# the order it is read. It is the responsibility of the renderer to display
# the text from right to left. A BIDI algorithm is used to place general
# punctuation marks, numbers and English text in the text.
#
# Texts in x-mac-hebrew are almost impossible to find on the Internet. From
# what little evidence I could find, it seems that its general directionality
# is Logical.
#
# To sum up all of the above, the Hebrew probing mechanism knows about two
# charsets:
# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are
#    backwards while line order is natural. For charset recognition purposes
#    the line order is unimportant (In fact, for this implementation, even
#    word order is unimportant).
# Logical Hebrew - "windows-1255" - normal, naturally ordered text.
#
# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be
#    specifically identified.
# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew
#    that contain special punctuation marks or diacritics is displayed with
#    some unconverted characters showing as question marks. This problem might
#    be corrected using another model prober for x-mac-hebrew. Due to the fact
#    that x-mac-hebrew texts are so rare, writing another model prober isn't
#    worth the effort and performance hit.
#
#### The Prober ####
#
# The prober is divided between two SBCharSetProbers and a HebrewProber,
# all of which are managed, created, fed data, inquired and deleted by the
# SBCSGroupProber. The two SBCharSetProbers identify that the text is in
# fact some kind of Hebrew, Logical or Visual. The final decision about which
# one is it is made by the HebrewProber by combining final-letter scores
# with the scores of the two SBCharSetProbers to produce a final answer.
#
# The SBCSGroupProber is responsible for stripping the original text of HTML
# tags, English characters, numbers, low-ASCII punctuation characters, spaces
# and new lines. It reduces any sequence of such characters to a single space.
# The buffer fed to each prober in the SBCS group prober is pure text in
# high-ASCII.
# The two SBCharSetProbers (model probers) share the same language model:
# Win1255Model.
# The first SBCharSetProber uses the model normally as any other
# SBCharSetProber does, to recognize windows-1255, upon which this model was
# built. The second SBCharSetProber is told to make the pair-of-letter
# lookup in the language model backwards. This in practice exactly simulates
# a visual Hebrew model using the windows-1255 logical Hebrew model.
#
# The HebrewProber is not using any language model. All it does is look for
# final-letter evidence suggesting the text is either logical Hebrew or visual
# Hebrew. Disjointed from the model probers, the results of the HebrewProber
# alone are meaningless. HebrewProber always returns 0.00 as confidence
# since it never identifies a charset by itself. Instead, the pointer to the
# HebrewProber is passed to the model probers as a helper "Name Prober".
# When the Group prober receives a positive identification from any prober,
# it asks for the name of the charset identified. If the prober queried is a
# Hebrew model prober, the model prober forwards the call to the
# HebrewProber to make the final decision. In the HebrewProber, the
# decision is made according to the final-letters scores maintained and Both
# model probers scores. The answer is returned in the form of the name of the
# charset identified, either "windows-1255" or "ISO-8859-8".

# windows-1255 / ISO-8859-8 code points of interest
FINAL_KAF = 0xea
NORMAL_KAF = 0xeb
FINAL_MEM = 0xed
NORMAL_MEM = 0xee
FINAL_NUN = 0xef
NORMAL_NUN = 0xf0
FINAL_PE = 0xf3
NORMAL_PE = 0xf4
FINAL_TSADI = 0xf5
NORMAL_TSADI = 0xf6

# Minimum Visual vs Logical final letter score difference.
# If the difference is below this, don't rely solely on the final letter score
# distance.
MIN_FINAL_CHAR_DISTANCE = 5

# Minimum Visual vs Logical model score difference.
# If the difference is below this, don't rely at all on the model score
# distance.
MIN_MODEL_DISTANCE = 0.01

VISUAL_HEBREW_NAME = "ISO-8859-8"
LOGICAL_HEBREW_NAME = "windows-1255"


class HebrewProber(CharSetProber):
    def __init__(self):
        CharSetProber.__init__(self)
        self._mLogicalProber = None
        self._mVisualProber = None
        self.reset()

    def reset(self):
        self._mFinalCharLogicalScore = 0
        self._mFinalCharVisualScore = 0
        # The two last characters seen in the previous buffer,
        # mPrev and mBeforePrev are initialized to space in order to simulate
        # a word delimiter at the beginning of the data
        self._mPrev = ' '
        self._mBeforePrev = ' '
        # These probers are owned by the group prober.

    def set_model_probers(self, logicalProber, visualProber):
        self._mLogicalProber = logicalProber
        self._mVisualProber = visualProber

    def is_final(self, c):
        return wrap_ord(c) in [FINAL_KAF, FINAL_MEM, FINAL_NUN, FINAL_PE,
                               FINAL_TSADI]

    def is_non_final(self, c):
        # The normal Tsadi is not a good Non-Final letter due to words like
        # 'lechotet' (to chat) containing an apostrophe after the tsadi. This
        # apostrophe is converted to a space in FilterWithoutEnglishLetters
        # causing the Non-Final tsadi to appear at an end of a word even
        # though this is not the case in the original text.
        # The letters Pe and Kaf rarely display a related behavior of not being
        # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak'
        # for example legally end with a Non-Final Pe or Kaf. However, the
        # benefit of these letters as Non-Final letters outweighs the damage
        # since these words are quite rare.
        return wrap_ord(c) in [NORMAL_KAF, NORMAL_MEM, NORMAL_NUN, NORMAL_PE]

    def feed(self, aBuf):
        # Final letter analysis for logical-visual decision.
        # Look for evidence that the received buffer is either logical Hebrew
        # or visual Hebrew.
        # The following cases are checked:
        # 1) A word longer than 1 letter, ending with a final letter. This is
        #    an indication that the text is laid out "naturally" since the
        #    final letter really appears at the end. +1 for logical score.
        # 2) A word longer than 1 letter, ending with a Non-Final letter. In
        #    normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi,
        #    should not end with the Non-Final form of that letter. Exceptions
        #    to this rule are mentioned above in isNonFinal(). This is an
        #    indication that the text is laid out backwards. +1 for visual
        #    score
        # 3) A word longer than 1 letter, starting with a final letter. Final
        #    letters should not appear at the beginning of a word. This is an
        #    indication that the text is laid out backwards. +1 for visual
        #    score.
        #
        # The visual score and logical score are accumulated throughout the
        # text and are finally checked against each other in GetCharSetName().
        # No checking for final letters in the middle of words is done since
        # that case is not an indication for either Logical or Visual text.
        #
        # We automatically filter out all 7-bit characters (replace them with
        # spaces) so the word boundary detection works properly. [MAP]

        if self.get_state() == eNotMe:
            # Both model probers say it's not them. No reason to continue.
            return eNotMe

        aBuf = self.filter_high_bit_only(aBuf)

        for cur in aBuf:
            if cur == ' ':
                # We stand on a space - a word just ended
                if self._mBeforePrev != ' ':
                    # next-to-last char was not a space so self._mPrev is not a
                    # 1 letter word
                    if self.is_final(self._mPrev):
                        # case (1) [-2:not space][-1:final letter][cur:space]
                        self._mFinalCharLogicalScore += 1
                    elif self.is_non_final(self._mPrev):
                        # case (2) [-2:not space][-1:Non-Final letter][
                        #  cur:space]
                        self._mFinalCharVisualScore += 1
            else:
                # Not standing on a space
                if ((self._mBeforePrev == ' ') and
                        (self.is_final(self._mPrev)) and (cur != ' ')):
                    # case (3) [-2:space][-1:final letter][cur:not space]
                    self._mFinalCharVisualScore += 1
            self._mBeforePrev = self._mPrev
            self._mPrev = cur

        # Forever detecting, till the end or until both model probers return
        # eNotMe (handled above)
        return eDetecting

    def get_charset_name(self):
        # Make the decision: is it Logical or Visual?
        # If the final letter score distance is dominant enough, rely on it.
        finalsub = self._mFinalCharLogicalScore - self._mFinalCharVisualScore
        if finalsub >= MIN_FINAL_CHAR_DISTANCE:
            return LOGICAL_HEBREW_NAME
        if finalsub <= -MIN_FINAL_CHAR_DISTANCE:
            return VISUAL_HEBREW_NAME

        # It's not dominant enough, try to rely on the model scores instead.
        modelsub = (self._mLogicalProber.get_confidence()
                    - self._mVisualProber.get_confidence())
        if modelsub > MIN_MODEL_DISTANCE:
            return LOGICAL_HEBREW_NAME
        if modelsub < -MIN_MODEL_DISTANCE:
            return VISUAL_HEBREW_NAME

        # Still no good, back to final letter distance, maybe it'll save the
        # day.
        if finalsub < 0.0:
            return VISUAL_HEBREW_NAME

        # (finalsub > 0 - Logical) or (don't know what to do) default to
        # Logical.
        return LOGICAL_HEBREW_NAME

    def get_state(self):
        # Remain active as long as any of the model probers are active.
        if (self._mLogicalProber.get_state() == eNotMe) and \
           (self._mVisualProber.get_state() == eNotMe):
            return eNotMe
        return eDetecting
site-packages/pip/_vendor/requests/packages/chardet/utf8prober.py000064400000005134151733463770021250 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

from . import constants
from .charsetprober import CharSetProber
from .codingstatemachine import CodingStateMachine
from .mbcssm import UTF8SMModel

ONE_CHAR_PROB = 0.5


class UTF8Prober(CharSetProber):
    def __init__(self):
        CharSetProber.__init__(self)
        self._mCodingSM = CodingStateMachine(UTF8SMModel)
        self.reset()

    def reset(self):
        CharSetProber.reset(self)
        self._mCodingSM.reset()
        self._mNumOfMBChar = 0

    def get_charset_name(self):
        return "utf-8"

    def feed(self, aBuf):
        for c in aBuf:
            codingState = self._mCodingSM.next_state(c)
            if codingState == constants.eError:
                self._mState = constants.eNotMe
                break
            elif codingState == constants.eItsMe:
                self._mState = constants.eFoundIt
                break
            elif codingState == constants.eStart:
                if self._mCodingSM.get_current_charlen() >= 2:
                    self._mNumOfMBChar += 1

        if self.get_state() == constants.eDetecting:
            if self.get_confidence() > constants.SHORTCUT_THRESHOLD:
                self._mState = constants.eFoundIt

        return self.get_state()

    def get_confidence(self):
        unlike = 0.99
        if self._mNumOfMBChar < 6:
            for i in range(0, self._mNumOfMBChar):
                unlike = unlike * ONE_CHAR_PROB
            return 1.0 - unlike
        else:
            return unlike
site-packages/pip/_vendor/requests/packages/chardet/euctwprober.py000064400000003214151733463770021506 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
# 
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
# 
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

from .mbcharsetprober import MultiByteCharSetProber
from .codingstatemachine import CodingStateMachine
from .chardistribution import EUCTWDistributionAnalysis
from .mbcssm import EUCTWSMModel

class EUCTWProber(MultiByteCharSetProber):
    def __init__(self):
        MultiByteCharSetProber.__init__(self)
        self._mCodingSM = CodingStateMachine(EUCTWSMModel)
        self._mDistributionAnalyzer = EUCTWDistributionAnalysis()
        self.reset()

    def get_charset_name(self):
        return "EUC-TW"
site-packages/pip/_vendor/requests/packages/chardet/universaldetector.py000064400000015257151733463770022721 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Universal charset detector code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 2001
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#   Shy Shalom - original C code
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

from . import constants
import sys
import codecs
from .latin1prober import Latin1Prober  # windows-1252
from .mbcsgroupprober import MBCSGroupProber  # multi-byte character sets
from .sbcsgroupprober import SBCSGroupProber  # single-byte character sets
from .escprober import EscCharSetProber  # ISO-2122, etc.
import re

MINIMUM_THRESHOLD = 0.20
ePureAscii = 0
eEscAscii = 1
eHighbyte = 2


class UniversalDetector:
    def __init__(self):
        self._highBitDetector = re.compile(b'[\x80-\xFF]')
        self._escDetector = re.compile(b'(\033|~{)')
        self._mEscCharSetProber = None
        self._mCharSetProbers = []
        self.reset()

    def reset(self):
        self.result = {'encoding': None, 'confidence': 0.0}
        self.done = False
        self._mStart = True
        self._mGotData = False
        self._mInputState = ePureAscii
        self._mLastChar = b''
        if self._mEscCharSetProber:
            self._mEscCharSetProber.reset()
        for prober in self._mCharSetProbers:
            prober.reset()

    def feed(self, aBuf):
        if self.done:
            return

        aLen = len(aBuf)
        if not aLen:
            return

        if not self._mGotData:
            # If the data starts with BOM, we know it is UTF
            if aBuf[:3] == codecs.BOM:
                # EF BB BF  UTF-8 with BOM
                self.result = {'encoding': "UTF-8", 'confidence': 1.0}
            elif aBuf[:4] == codecs.BOM_UTF32_LE:
                # FF FE 00 00  UTF-32, little-endian BOM
                self.result = {'encoding': "UTF-32LE", 'confidence': 1.0}
            elif aBuf[:4] == codecs.BOM_UTF32_BE:
                # 00 00 FE FF  UTF-32, big-endian BOM
                self.result = {'encoding': "UTF-32BE", 'confidence': 1.0}
            elif aBuf[:4] == b'\xFE\xFF\x00\x00':
                # FE FF 00 00  UCS-4, unusual octet order BOM (3412)
                self.result = {
                    'encoding': "X-ISO-10646-UCS-4-3412",
                    'confidence': 1.0
                }
            elif aBuf[:4] == b'\x00\x00\xFF\xFE':
                # 00 00 FF FE  UCS-4, unusual octet order BOM (2143)
                self.result = {
                    'encoding': "X-ISO-10646-UCS-4-2143",
                    'confidence': 1.0
                }
            elif aBuf[:2] == codecs.BOM_LE:
                # FF FE  UTF-16, little endian BOM
                self.result = {'encoding': "UTF-16LE", 'confidence': 1.0}
            elif aBuf[:2] == codecs.BOM_BE:
                # FE FF  UTF-16, big endian BOM
                self.result = {'encoding': "UTF-16BE", 'confidence': 1.0}

        self._mGotData = True
        if self.result['encoding'] and (self.result['confidence'] > 0.0):
            self.done = True
            return

        if self._mInputState == ePureAscii:
            if self._highBitDetector.search(aBuf):
                self._mInputState = eHighbyte
            elif ((self._mInputState == ePureAscii) and
                    self._escDetector.search(self._mLastChar + aBuf)):
                self._mInputState = eEscAscii

        self._mLastChar = aBuf[-1:]

        if self._mInputState == eEscAscii:
            if not self._mEscCharSetProber:
                self._mEscCharSetProber = EscCharSetProber()
            if self._mEscCharSetProber.feed(aBuf) == constants.eFoundIt:
                self.result = {'encoding': self._mEscCharSetProber.get_charset_name(),
                               'confidence': self._mEscCharSetProber.get_confidence()}
                self.done = True
        elif self._mInputState == eHighbyte:
            if not self._mCharSetProbers:
                self._mCharSetProbers = [MBCSGroupProber(), SBCSGroupProber(),
                                         Latin1Prober()]
            for prober in self._mCharSetProbers:
                if prober.feed(aBuf) == constants.eFoundIt:
                    self.result = {'encoding': prober.get_charset_name(),
                                   'confidence': prober.get_confidence()}
                    self.done = True
                    break

    def close(self):
        if self.done:
            return
        if not self._mGotData:
            if constants._debug:
                sys.stderr.write('no data received!\n')
            return
        self.done = True

        if self._mInputState == ePureAscii:
            self.result = {'encoding': 'ascii', 'confidence': 1.0}
            return self.result

        if self._mInputState == eHighbyte:
            proberConfidence = None
            maxProberConfidence = 0.0
            maxProber = None
            for prober in self._mCharSetProbers:
                if not prober:
                    continue
                proberConfidence = prober.get_confidence()
                if proberConfidence > maxProberConfidence:
                    maxProberConfidence = proberConfidence
                    maxProber = prober
            if maxProber and (maxProberConfidence > MINIMUM_THRESHOLD):
                self.result = {'encoding': maxProber.get_charset_name(),
                               'confidence': maxProber.get_confidence()}
                return self.result

        if constants._debug:
            sys.stderr.write('no probers hit minimum threshhold\n')
            for prober in self._mCharSetProbers[0].mProbers:
                if not prober:
                    continue
                sys.stderr.write('%s confidence = %s\n' %
                                 (prober.get_charset_name(),
                                  prober.get_confidence()))
site-packages/pip/_vendor/requests/packages/chardet/charsetprober.py000064400000003556151733463770022021 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Universal charset detector code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 2001
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#   Shy Shalom - original C code
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

from . import constants
import re


class CharSetProber:
    def __init__(self):
        pass

    def reset(self):
        self._mState = constants.eDetecting

    def get_charset_name(self):
        return None

    def feed(self, aBuf):
        pass

    def get_state(self):
        return self._mState

    def get_confidence(self):
        return 0.0

    def filter_high_bit_only(self, aBuf):
        aBuf = re.sub(b'([\x00-\x7F])+', b' ', aBuf)
        return aBuf

    def filter_without_english_letters(self, aBuf):
        aBuf = re.sub(b'([A-Za-z])+', b' ', aBuf)
        return aBuf

    def filter_with_english_letters(self, aBuf):
        # TODO
        return aBuf
site-packages/pip/_vendor/requests/packages/chardet/big5prober.py000064400000003224151733463770021206 0ustar00######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Communicator client code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301  USA
######################### END LICENSE BLOCK #########################

from .mbcharsetprober import MultiByteCharSetProber
from .codingstatemachine import CodingStateMachine
from .chardistribution import Big5DistributionAnalysis
from .mbcssm import Big5SMModel


class Big5Prober(MultiByteCharSetProber):
    def __init__(self):
        MultiByteCharSetProber.__init__(self)
        self._mCodingSM = CodingStateMachine(Big5SMModel)
        self._mDistributionAnalyzer = Big5DistributionAnalysis()
        self.reset()

    def get_charset_name(self):
        return "Big5"
site-packages/pip/_vendor/requests/utils.py000064400000047005151733463770015123 0ustar00# -*- coding: utf-8 -*-

"""
requests.utils
~~~~~~~~~~~~~~

This module provides utility functions that are used within Requests
that are also useful for external consumption.

"""

import cgi
import codecs
import collections
import io
import os
import platform
import re
import sys
import socket
import struct

from . import __version__
from . import certs
from .compat import parse_http_list as _parse_list_header
from .compat import (quote, urlparse, bytes, str, OrderedDict, unquote, is_py2,
                     builtin_str, getproxies, proxy_bypass, urlunparse)
from .cookies import RequestsCookieJar, cookiejar_from_dict
from .structures import CaseInsensitiveDict
from .exceptions import InvalidURL

_hush_pyflakes = (RequestsCookieJar,)

NETRC_FILES = ('.netrc', '_netrc')

DEFAULT_CA_BUNDLE_PATH = certs.where()


def dict_to_sequence(d):
    """Returns an internal sequence dictionary update."""

    if hasattr(d, 'items'):
        d = d.items()

    return d


def super_len(o):
    if hasattr(o, '__len__'):
        return len(o)

    if hasattr(o, 'len'):
        return o.len

    if hasattr(o, 'fileno'):
        try:
            fileno = o.fileno()
        except io.UnsupportedOperation:
            pass
        else:
            return os.fstat(fileno).st_size

    if hasattr(o, 'getvalue'):
        # e.g. BytesIO, cStringIO.StringIO
        return len(o.getvalue())


def get_netrc_auth(url):
    """Returns the Requests tuple auth for a given url from netrc."""

    try:
        from netrc import netrc, NetrcParseError

        netrc_path = None

        for f in NETRC_FILES:
            try:
                loc = os.path.expanduser('~/{0}'.format(f))
            except KeyError:
                # os.path.expanduser can fail when $HOME is undefined and
                # getpwuid fails. See http://bugs.python.org/issue20164 &
                # https://github.com/kennethreitz/requests/issues/1846
                return

            if os.path.exists(loc):
                netrc_path = loc
                break

        # Abort early if there isn't one.
        if netrc_path is None:
            return

        ri = urlparse(url)

        # Strip port numbers from netloc
        host = ri.netloc.split(':')[0]

        try:
            _netrc = netrc(netrc_path).authenticators(host)
            if _netrc:
                # Return with login / password
                login_i = (0 if _netrc[0] else 1)
                return (_netrc[login_i], _netrc[2])
        except (NetrcParseError, IOError):
            # If there was a parsing error or a permissions issue reading the file,
            # we'll just skip netrc auth
            pass

    # AppEngine hackiness.
    except (ImportError, AttributeError):
        pass


def guess_filename(obj):
    """Tries to guess the filename of the given object."""
    name = getattr(obj, 'name', None)
    if name and name[0] != '<' and name[-1] != '>':
        return os.path.basename(name)


def from_key_val_list(value):
    """Take an object and test to see if it can be represented as a
    dictionary. Unless it can not be represented as such, return an
    OrderedDict, e.g.,

    ::

        >>> from_key_val_list([('key', 'val')])
        OrderedDict([('key', 'val')])
        >>> from_key_val_list('string')
        ValueError: need more than 1 value to unpack
        >>> from_key_val_list({'key': 'val'})
        OrderedDict([('key', 'val')])
    """
    if value is None:
        return None

    if isinstance(value, (str, bytes, bool, int)):
        raise ValueError('cannot encode objects that are not 2-tuples')

    return OrderedDict(value)


def to_key_val_list(value):
    """Take an object and test to see if it can be represented as a
    dictionary. If it can be, return a list of tuples, e.g.,

    ::

        >>> to_key_val_list([('key', 'val')])
        [('key', 'val')]
        >>> to_key_val_list({'key': 'val'})
        [('key', 'val')]
        >>> to_key_val_list('string')
        ValueError: cannot encode objects that are not 2-tuples.
    """
    if value is None:
        return None

    if isinstance(value, (str, bytes, bool, int)):
        raise ValueError('cannot encode objects that are not 2-tuples')

    if isinstance(value, collections.Mapping):
        value = value.items()

    return list(value)


# From mitsuhiko/werkzeug (used with permission).
def parse_list_header(value):
    """Parse lists as described by RFC 2068 Section 2.

    In particular, parse comma-separated lists where the elements of
    the list may include quoted-strings.  A quoted-string could
    contain a comma.  A non-quoted string could have quotes in the
    middle.  Quotes are removed automatically after parsing.

    It basically works like :func:`parse_set_header` just that items
    may appear multiple times and case sensitivity is preserved.

    The return value is a standard :class:`list`:

    >>> parse_list_header('token, "quoted value"')
    ['token', 'quoted value']

    To create a header from the :class:`list` again, use the
    :func:`dump_header` function.

    :param value: a string with a list header.
    :return: :class:`list`
    """
    result = []
    for item in _parse_list_header(value):
        if item[:1] == item[-1:] == '"':
            item = unquote_header_value(item[1:-1])
        result.append(item)
    return result


# From mitsuhiko/werkzeug (used with permission).
def parse_dict_header(value):
    """Parse lists of key, value pairs as described by RFC 2068 Section 2 and
    convert them into a python dict:

    >>> d = parse_dict_header('foo="is a fish", bar="as well"')
    >>> type(d) is dict
    True
    >>> sorted(d.items())
    [('bar', 'as well'), ('foo', 'is a fish')]

    If there is no value for a key it will be `None`:

    >>> parse_dict_header('key_without_value')
    {'key_without_value': None}

    To create a header from the :class:`dict` again, use the
    :func:`dump_header` function.

    :param value: a string with a dict header.
    :return: :class:`dict`
    """
    result = {}
    for item in _parse_list_header(value):
        if '=' not in item:
            result[item] = None
            continue
        name, value = item.split('=', 1)
        if value[:1] == value[-1:] == '"':
            value = unquote_header_value(value[1:-1])
        result[name] = value
    return result


# From mitsuhiko/werkzeug (used with permission).
def unquote_header_value(value, is_filename=False):
    r"""Unquotes a header value.  (Reversal of :func:`quote_header_value`).
    This does not use the real unquoting but what browsers are actually
    using for quoting.

    :param value: the header value to unquote.
    """
    if value and value[0] == value[-1] == '"':
        # this is not the real unquoting, but fixing this so that the
        # RFC is met will result in bugs with internet explorer and
        # probably some other browsers as well.  IE for example is
        # uploading files with "C:\foo\bar.txt" as filename
        value = value[1:-1]

        # if this is a filename and the starting characters look like
        # a UNC path, then just return the value without quotes.  Using the
        # replace sequence below on a UNC path has the effect of turning
        # the leading double slash into a single slash and then
        # _fix_ie_filename() doesn't work correctly.  See #458.
        if not is_filename or value[:2] != '\\\\':
            return value.replace('\\\\', '\\').replace('\\"', '"')
    return value


def dict_from_cookiejar(cj):
    """Returns a key/value dictionary from a CookieJar.

    :param cj: CookieJar object to extract cookies from.
    """

    cookie_dict = {}

    for cookie in cj:
        cookie_dict[cookie.name] = cookie.value

    return cookie_dict


def add_dict_to_cookiejar(cj, cookie_dict):
    """Returns a CookieJar from a key/value dictionary.

    :param cj: CookieJar to insert cookies into.
    :param cookie_dict: Dict of key/values to insert into CookieJar.
    """

    cj2 = cookiejar_from_dict(cookie_dict)
    cj.update(cj2)
    return cj


def get_encodings_from_content(content):
    """Returns encodings from given content string.

    :param content: bytestring to extract encodings from.
    """

    charset_re = re.compile(r'<meta.*?charset=["\']*(.+?)["\'>]', flags=re.I)
    pragma_re = re.compile(r'<meta.*?content=["\']*;?charset=(.+?)["\'>]', flags=re.I)
    xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]')

    return (charset_re.findall(content) +
            pragma_re.findall(content) +
            xml_re.findall(content))


def get_encoding_from_headers(headers):
    """Returns encodings from given HTTP Header Dict.

    :param headers: dictionary to extract encoding from.
    """

    content_type = headers.get('content-type')

    if not content_type:
        return None

    content_type, params = cgi.parse_header(content_type)

    if 'charset' in params:
        return params['charset'].strip("'\"")

    if 'text' in content_type:
        return 'ISO-8859-1'


def stream_decode_response_unicode(iterator, r):
    """Stream decodes a iterator."""

    if r.encoding is None:
        for item in iterator:
            yield item
        return

    decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace')
    for chunk in iterator:
        rv = decoder.decode(chunk)
        if rv:
            yield rv
    rv = decoder.decode(b'', final=True)
    if rv:
        yield rv


def iter_slices(string, slice_length):
    """Iterate over slices of a string."""
    pos = 0
    while pos < len(string):
        yield string[pos:pos + slice_length]
        pos += slice_length


def get_unicode_from_response(r):
    """Returns the requested content back in unicode.

    :param r: Response object to get unicode content from.

    Tried:

    1. charset from content-type

    2. every encodings from ``<meta ... charset=XXX>``

    3. fall back and replace all unicode characters

    """

    tried_encodings = []

    # Try charset from content-type
    encoding = get_encoding_from_headers(r.headers)

    if encoding:
        try:
            return str(r.content, encoding)
        except UnicodeError:
            tried_encodings.append(encoding)

    # Fall back:
    try:
        return str(r.content, encoding, errors='replace')
    except TypeError:
        return r.content


# The unreserved URI characters (RFC 3986)
UNRESERVED_SET = frozenset(
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
    + "0123456789-._~")


def unquote_unreserved(uri):
    """Un-escape any percent-escape sequences in a URI that are unreserved
    characters. This leaves all reserved, illegal and non-ASCII bytes encoded.
    """
    parts = uri.split('%')
    for i in range(1, len(parts)):
        h = parts[i][0:2]
        if len(h) == 2 and h.isalnum():
            try:
                c = chr(int(h, 16))
            except ValueError:
                raise InvalidURL("Invalid percent-escape sequence: '%s'" % h)

            if c in UNRESERVED_SET:
                parts[i] = c + parts[i][2:]
            else:
                parts[i] = '%' + parts[i]
        else:
            parts[i] = '%' + parts[i]
    return ''.join(parts)


def requote_uri(uri):
    """Re-quote the given URI.

    This function passes the given URI through an unquote/quote cycle to
    ensure that it is fully and consistently quoted.
    """
    # Unquote only the unreserved characters
    # Then quote only illegal characters (do not quote reserved, unreserved,
    # or '%')
    return quote(unquote_unreserved(uri), safe="!#$%&'()*+,/:;=?@[]~")


def address_in_network(ip, net):
    """
    This function allows you to check if on IP belongs to a network subnet
    Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24
             returns False if ip = 192.168.1.1 and net = 192.168.100.0/24
    """
    ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0]
    netaddr, bits = net.split('/')
    netmask = struct.unpack('=L', socket.inet_aton(dotted_netmask(int(bits))))[0]
    network = struct.unpack('=L', socket.inet_aton(netaddr))[0] & netmask
    return (ipaddr & netmask) == (network & netmask)


def dotted_netmask(mask):
    """
    Converts mask from /xx format to xxx.xxx.xxx.xxx
    Example: if mask is 24 function returns 255.255.255.0
    """
    bits = 0xffffffff ^ (1 << 32 - mask) - 1
    return socket.inet_ntoa(struct.pack('>I', bits))


def is_ipv4_address(string_ip):
    try:
        socket.inet_aton(string_ip)
    except socket.error:
        return False
    return True


def is_valid_cidr(string_network):
    """Very simple check of the cidr format in no_proxy variable"""
    if string_network.count('/') == 1:
        try:
            mask = int(string_network.split('/')[1])
        except ValueError:
            return False

        if mask < 1 or mask > 32:
            return False

        try:
            socket.inet_aton(string_network.split('/')[0])
        except socket.error:
            return False
    else:
        return False
    return True


def should_bypass_proxies(url):
    """
    Returns whether we should bypass proxies or not.
    """
    get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper())

    # First check whether no_proxy is defined. If it is, check that the URL
    # we're getting isn't in the no_proxy list.
    no_proxy = get_proxy('no_proxy')
    netloc = urlparse(url).netloc

    if no_proxy:
        # We need to check whether we match here. We need to see if we match
        # the end of the netloc, both with and without the port.
        no_proxy = no_proxy.replace(' ', '').split(',')

        ip = netloc.split(':')[0]
        if is_ipv4_address(ip):
            for proxy_ip in no_proxy:
                if is_valid_cidr(proxy_ip):
                    if address_in_network(ip, proxy_ip):
                        return True
        else:
            for host in no_proxy:
                if netloc.endswith(host) or netloc.split(':')[0].endswith(host):
                    # The URL does match something in no_proxy, so we don't want
                    # to apply the proxies on this URL.
                    return True

    # If the system proxy settings indicate that this URL should be bypassed,
    # don't proxy.
    # The proxy_bypass function is incredibly buggy on OS X in early versions
    # of Python 2.6, so allow this call to fail. Only catch the specific
    # exceptions we've seen, though: this call failing in other ways can reveal
    # legitimate problems.
    try:
        bypass = proxy_bypass(netloc)
    except (TypeError, socket.gaierror):
        bypass = False

    if bypass:
        return True

    return False

def get_environ_proxies(url):
    """Return a dict of environment proxies."""
    if should_bypass_proxies(url):
        return {}
    else:
        return getproxies()


def default_user_agent(name="python-requests"):
    """Return a string representing the default user agent."""
    _implementation = platform.python_implementation()

    if _implementation == 'CPython':
        _implementation_version = platform.python_version()
    elif _implementation == 'PyPy':
        _implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major,
                                                sys.pypy_version_info.minor,
                                                sys.pypy_version_info.micro)
        if sys.pypy_version_info.releaselevel != 'final':
            _implementation_version = ''.join([_implementation_version, sys.pypy_version_info.releaselevel])
    elif _implementation == 'Jython':
        _implementation_version = platform.python_version()  # Complete Guess
    elif _implementation == 'IronPython':
        _implementation_version = platform.python_version()  # Complete Guess
    else:
        _implementation_version = 'Unknown'

    try:
        p_system = platform.system()
        p_release = platform.release()
    except IOError:
        p_system = 'Unknown'
        p_release = 'Unknown'

    return " ".join(['%s/%s' % (name, __version__),
                     '%s/%s' % (_implementation, _implementation_version),
                     '%s/%s' % (p_system, p_release)])


def default_headers():
    return CaseInsensitiveDict({
        'User-Agent': default_user_agent(),
        'Accept-Encoding': ', '.join(('gzip', 'deflate')),
        'Accept': '*/*'
    })


def parse_header_links(value):
    """Return a dict of parsed link headers proxies.

    i.e. Link: <http:/.../front.jpeg>; rel=front; type="image/jpeg",<http://.../back.jpeg>; rel=back;type="image/jpeg"

    """

    links = []

    replace_chars = " '\""

    for val in value.split(","):
        try:
            url, params = val.split(";", 1)
        except ValueError:
            url, params = val, ''

        link = {}

        link["url"] = url.strip("<> '\"")

        for param in params.split(";"):
            try:
                key, value = param.split("=")
            except ValueError:
                break

            link[key.strip(replace_chars)] = value.strip(replace_chars)

        links.append(link)

    return links


# Null bytes; no need to recreate these on each call to guess_json_utf
_null = '\x00'.encode('ascii')  # encoding to ASCII for Python 3
_null2 = _null * 2
_null3 = _null * 3


def guess_json_utf(data):
    # JSON always starts with two ASCII characters, so detection is as
    # easy as counting the nulls and from their location and count
    # determine the encoding. Also detect a BOM, if present.
    sample = data[:4]
    if sample in (codecs.BOM_UTF32_LE, codecs.BOM32_BE):
        return 'utf-32'     # BOM included
    if sample[:3] == codecs.BOM_UTF8:
        return 'utf-8-sig'  # BOM included, MS style (discouraged)
    if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE):
        return 'utf-16'     # BOM included
    nullcount = sample.count(_null)
    if nullcount == 0:
        return 'utf-8'
    if nullcount == 2:
        if sample[::2] == _null2:   # 1st and 3rd are null
            return 'utf-16-be'
        if sample[1::2] == _null2:  # 2nd and 4th are null
            return 'utf-16-le'
        # Did not detect 2 valid UTF-16 ascii-range characters
    if nullcount == 3:
        if sample[:3] == _null3:
            return 'utf-32-be'
        if sample[1:] == _null3:
            return 'utf-32-le'
        # Did not detect a valid UTF-32 ascii-range character
    return None


def prepend_scheme_if_needed(url, new_scheme):
    '''Given a URL that may or may not have a scheme, prepend the given scheme.
    Does not replace a present scheme with the one provided as an argument.'''
    scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme)

    # urlparse is a finicky beast, and sometimes decides that there isn't a
    # netloc present. Assume that it's being over-cautious, and switch netloc
    # and path if urlparse decided there was no netloc.
    if not netloc:
        netloc, path = path, netloc

    return urlunparse((scheme, netloc, path, params, query, fragment))


def get_auth_from_url(url):
    """Given a url with authentication components, extract them into a tuple of
    username,password."""
    parsed = urlparse(url)

    try:
        auth = (unquote(parsed.username), unquote(parsed.password))
    except (AttributeError, TypeError):
        auth = ('', '')

    return auth


def to_native_string(string, encoding='ascii'):
    """
    Given a string object, regardless of type, returns a representation of that
    string in the native string type, encoding and decoding where necessary.
    This assumes ASCII unless told otherwise.
    """
    out = None

    if isinstance(string, builtin_str):
        out = string
    else:
        if is_py2:
            out = string.encode(encoding)
        else:
            out = string.decode(encoding)

    return out
site-packages/pip/_vendor/__init__.py000064400000000412151733463770013636 0ustar00"""
pip._vendor is for vendoring dependencies of pip to prevent needing pip to
depend on something external.

Files inside of pip._vendor should be considered immutable and should only be
updated to versions from upstream.
"""
from __future__ import absolute_import
site-packages/pip/_vendor/re-vendor.py000064400000001405151733463770014003 0ustar00import os
import sys
import pip
import glob
import shutil

here = os.path.abspath(os.path.dirname(__file__))

def usage():
    print("Usage: re-vendor.py [clean|vendor]")
    sys.exit(1)

def clean():
    for fn in os.listdir(here):
        dirname = os.path.join(here, fn)
        if os.path.isdir(dirname):
            shutil.rmtree(dirname)
    # six is a single file, not a package
    os.unlink(os.path.join(here, 'six.py'))

def vendor():
    pip.main(['install', '-t', here, '-r', 'vendor.txt'])
    for dirname in glob.glob('*.egg-info'):
        shutil.rmtree(dirname)

if __name__ == '__main__':
    if len(sys.argv) != 2:
        usage()
    if sys.argv[1] == 'clean':
        clean()
    elif sys.argv[1] == 'vendor':
        vendor()
    else:
        usage()
site-packages/pip/_vendor/colorama/ansitowin32.py000064400000015010151733463770016054 0ustar00# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
import re
import sys

from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style
from .winterm import WinTerm, WinColor, WinStyle
from .win32 import windll


winterm = None
if windll is not None:
    winterm = WinTerm()


def is_a_tty(stream):
    return hasattr(stream, 'isatty') and stream.isatty()


class StreamWrapper(object):
    '''
    Wraps a stream (such as stdout), acting as a transparent proxy for all
    attribute access apart from method 'write()', which is delegated to our
    Converter instance.
    '''
    def __init__(self, wrapped, converter):
        # double-underscore everything to prevent clashes with names of
        # attributes on the wrapped stream object.
        self.__wrapped = wrapped
        self.__convertor = converter

    def __getattr__(self, name):
        return getattr(self.__wrapped, name)

    def write(self, text):
        self.__convertor.write(text)


class AnsiToWin32(object):
    '''
    Implements a 'write()' method which, on Windows, will strip ANSI character
    sequences from the text, and if outputting to a tty, will convert them into
    win32 function calls.
    '''
    ANSI_RE = re.compile('\033\[((?:\d|;)*)([a-zA-Z])')

    def __init__(self, wrapped, convert=None, strip=None, autoreset=False):
        # The wrapped stream (normally sys.stdout or sys.stderr)
        self.wrapped = wrapped

        # should we reset colors to defaults after every .write()
        self.autoreset = autoreset

        # create the proxy wrapping our output stream
        self.stream = StreamWrapper(wrapped, self)

        on_windows = sys.platform.startswith('win')

        # should we strip ANSI sequences from our output?
        if strip is None:
            strip = on_windows
        self.strip = strip

        # should we should convert ANSI sequences into win32 calls?
        if convert is None:
            convert = on_windows and is_a_tty(wrapped)
        self.convert = convert

        # dict of ansi codes to win32 functions and parameters
        self.win32_calls = self.get_win32_calls()

        # are we wrapping stderr?
        self.on_stderr = self.wrapped is sys.stderr


    def should_wrap(self):
        '''
        True if this class is actually needed. If false, then the output
        stream will not be affected, nor will win32 calls be issued, so
        wrapping stdout is not actually required. This will generally be
        False on non-Windows platforms, unless optional functionality like
        autoreset has been requested using kwargs to init()
        '''
        return self.convert or self.strip or self.autoreset


    def get_win32_calls(self):
        if self.convert and winterm:
            return {
                AnsiStyle.RESET_ALL: (winterm.reset_all, ),
                AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT),
                AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL),
                AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL),
                AnsiFore.BLACK: (winterm.fore, WinColor.BLACK),
                AnsiFore.RED: (winterm.fore, WinColor.RED),
                AnsiFore.GREEN: (winterm.fore, WinColor.GREEN),
                AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW),
                AnsiFore.BLUE: (winterm.fore, WinColor.BLUE),
                AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA),
                AnsiFore.CYAN: (winterm.fore, WinColor.CYAN),
                AnsiFore.WHITE: (winterm.fore, WinColor.GREY),
                AnsiFore.RESET: (winterm.fore, ),
                AnsiBack.BLACK: (winterm.back, WinColor.BLACK),
                AnsiBack.RED: (winterm.back, WinColor.RED),
                AnsiBack.GREEN: (winterm.back, WinColor.GREEN),
                AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW),
                AnsiBack.BLUE: (winterm.back, WinColor.BLUE),
                AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA),
                AnsiBack.CYAN: (winterm.back, WinColor.CYAN),
                AnsiBack.WHITE: (winterm.back, WinColor.GREY),
                AnsiBack.RESET: (winterm.back, ),
            }


    def write(self, text):
        if self.strip or self.convert:
            self.write_and_convert(text)
        else:
            self.wrapped.write(text)
            self.wrapped.flush()
        if self.autoreset:
            self.reset_all()


    def reset_all(self):
        if self.convert:
            self.call_win32('m', (0,))
        elif not self.wrapped.closed and is_a_tty(self.wrapped):
            self.wrapped.write(Style.RESET_ALL)


    def write_and_convert(self, text):
        '''
        Write the given text to our wrapped stream, stripping any ANSI
        sequences from the text, and optionally converting them into win32
        calls.
        '''
        cursor = 0
        for match in self.ANSI_RE.finditer(text):
            start, end = match.span()
            self.write_plain_text(text, cursor, start)
            self.convert_ansi(*match.groups())
            cursor = end
        self.write_plain_text(text, cursor, len(text))


    def write_plain_text(self, text, start, end):
        if start < end:
            self.wrapped.write(text[start:end])
            self.wrapped.flush()


    def convert_ansi(self, paramstring, command):
        if self.convert:
            params = self.extract_params(paramstring)
            self.call_win32(command, params)


    def extract_params(self, paramstring):
        def split(paramstring):
            for p in paramstring.split(';'):
                if p != '':
                    yield int(p)
        return tuple(split(paramstring))


    def call_win32(self, command, params):
        if params == []:
            params = [0]
        if command == 'm':
            for param in params:
                if param in self.win32_calls:
                    func_args = self.win32_calls[param]
                    func = func_args[0]
                    args = func_args[1:]
                    kwargs = dict(on_stderr=self.on_stderr)
                    func(*args, **kwargs)
        elif command in ('H', 'f'): # set cursor position
            func = winterm.set_cursor_position
            func(params, on_stderr=self.on_stderr)
        elif command in ('J'):
            func = winterm.erase_data
            func(params, on_stderr=self.on_stderr)
        elif command == 'A':
            if params == () or params == None:
                num_rows = 1
            else:
                num_rows = params[0]
            func = winterm.cursor_up
            func(num_rows, on_stderr=self.on_stderr)

site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-33.pyc000064400000005060151733463770021113 0ustar00�
7�Rec@s�dZdZdd�ZGdd�de�ZGdd�d�ZGdd	�d	�ZGd
d�d�Zee�Zee�Z	ee�Z
dS(
u�
This module generates ANSI character codes to printing colors to terminals.
See: http://en.wikipedia.org/wiki/ANSI_escape_code
uCstt|�dS(Num(uCSIustr(ucode((u2/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansi.pyu
code_to_chars	su
code_to_charscBs |EeZdZdd�ZdS(u	AnsiCodescCsRxKt|�D]=}|jd�s
t||�}t||t|��q
q
WdS(Nu_(udiru
startswithugetattrusetattru
code_to_chars(uselfucodesunameuvalue((u2/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansi.pyu__init__
suAnsiCodes.__init__N(u__name__u
__module__u__qualname__u__init__(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansi.pyu	AnsiCodessu	AnsiCodescBsJ|EeZdZdZdZdZdZdZdZdZ	dZ
d	Zd
S(uAnsiForeiii i!i"i#i$i%i'N(u__name__u
__module__u__qualname__uBLACKuREDuGREENuYELLOWuBLUEuMAGENTAuCYANuWHITEuRESET(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansi.pyuAnsiForesuAnsiForecBsJ|EeZdZdZdZdZdZdZdZdZ	dZ
d	Zd
S(uAnsiBacki(i)i*i+i,i-i.i/i1N(u__name__u
__module__u__qualname__uBLACKuREDuGREENuYELLOWuBLUEuMAGENTAuCYANuWHITEuRESET(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansi.pyuAnsiBacksuAnsiBackcBs,|EeZdZdZdZdZdZdS(u	AnsiStyleiiiiN(u__name__u
__module__u__qualname__uBRIGHTuDIMuNORMALu	RESET_ALL(u
__locals__((u2/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansi.pyu	AnsiStyle)su	AnsiStyleN(u__doc__uCSIu
code_to_charsuobjectu	AnsiCodesuAnsiForeuAnsiBacku	AnsiStyleuForeuBackuStyle(((u2/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansi.pyu<module>ssite-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-33.pyc000064400000004307151733463770022316 0ustar00�
7�Rec@s�ddlZddlZddlmZejZejZejaeja	dadd�Zdddddd�Zdd	�Zd
d�Zdd
�ZdS(iNi(uAnsiToWin32cCstt�j�dS(N(uAnsiToWin32uorig_stdoutu	reset_all(((u8/tmp/pip-zej_zi-build/pip/_vendor/colorama/initialise.pyu	reset_allsu	reset_allcCs�|r+t|||g�r+td��ntt||||�t_att||||�t_a	t
s�tjt
�da
ndS(Nu,wrap=False conflicts with any other arg=TrueT(uanyu
ValueErroruwrap_streamuorig_stdoutusysustdoutuwrapped_stdoutuorig_stderrustderruwrapped_stderruatexit_doneuatexituregisteru	reset_alluTrue(u	autoresetuconvertustripuwrap((u8/tmp/pip-zej_zi-build/pip/_vendor/colorama/initialise.pyuinits
uinitcCstt_tt_dS(N(uorig_stdoutusysustdoutuorig_stderrustderr(((u8/tmp/pip-zej_zi-build/pip/_vendor/colorama/initialise.pyudeinit&s	udeinitcCstt_tt_dS(N(uwrapped_stdoutusysustdoutustderr(((u8/tmp/pip-zej_zi-build/pip/_vendor/colorama/initialise.pyureinit+s	ureinitcCsC|r?t|d|d|d|�}|j�r?|j}q?n|S(Nuconvertustripu	autoreset(uAnsiToWin32ushould_wrapustream(ustreamuconvertustripu	autoresetuwrapuwrapper((u8/tmp/pip-zej_zi-build/pip/_vendor/colorama/initialise.pyuwrap_stream0s	uwrap_streamFT(uatexitusysuansitowin32uAnsiToWin32ustdoutuorig_stdoutustderruorig_stderruwrapped_stdoutuwrapped_stderruFalseuatexit_doneu	reset_alluNoneuTrueuinitudeinitureinituwrap_stream(((u8/tmp/pip-zej_zi-build/pip/_vendor/colorama/initialise.pyu<module>s				site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-33.pyc000064400000013567151733463770021661 0ustar00�
7�Renc@sVddlmZGdd�de�ZGdd�de�ZGdd�de�ZdS(	i(uwin32cBsD|EeZdZdZdZdZdZdZdZdZ	dZ
d	S(
uWinColoriiiiiiiiN(u__name__u
__module__u__qualname__uBLACKuBLUEuGREENuCYANuREDuMAGENTAuYELLOWuGREY(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/colorama/winterm.pyuWinColorsuWinColorcBs |EeZdZdZdZdS(uWinStyleiiN(u__name__u
__module__u__qualname__uNORMALuBRIGHT(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/colorama/winterm.pyuWinStylesuWinStylecBs�|EeZdZdd�Zdd�Zdd�Zddd�Zddd	d
�Z	dddd�Z
ddd
d�Zdddd�Zdd�Z
dddd�Zdddd�Zdddd�ZdS(uWinTermcCsPtjtj�j|_|j|j�|j|_|j|_	|j
|_dS(N(uwin32uGetConsoleScreenBufferInfouSTDOUTuwAttributesu_defaultu	set_attrsu_foreu
_default_foreu_backu
_default_backu_styleu_default_style(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/colorama/winterm.pyu__init__s
uWinTerm.__init__cCs|j|jd|jS(Ni(u_foreu_backu_style(uself((u5/tmp/pip-zej_zi-build/pip/_vendor/colorama/winterm.pyu	get_attrssuWinTerm.get_attrscCs2|d@|_|d?d@|_|tj@|_dS(Nii(u_foreu_backuWinStyleuBRIGHTu_style(uselfuvalue((u5/tmp/pip-zej_zi-build/pip/_vendor/colorama/winterm.pyu	set_attrs"s
uWinTerm.set_attrscCs'|j|j�|jd|j�dS(Nuattrs(u	set_attrsu_defaultuset_console(uselfu	on_stderr((u5/tmp/pip-zej_zi-build/pip/_vendor/colorama/winterm.pyu	reset_all'suWinTerm.reset_allcCs5|dkr|j}n||_|jd|�dS(Nu	on_stderr(uNoneu
_default_foreu_foreuset_console(uselfuforeu	on_stderr((u5/tmp/pip-zej_zi-build/pip/_vendor/colorama/winterm.pyufore+s	uWinTerm.forecCs5|dkr|j}n||_|jd|�dS(Nu	on_stderr(uNoneu
_default_backu_backuset_console(uselfubacku	on_stderr((u5/tmp/pip-zej_zi-build/pip/_vendor/colorama/winterm.pyuback1s	uWinTerm.backcCs5|dkr|j}n||_|jd|�dS(Nu	on_stderr(uNoneu_default_styleu_styleuset_console(uselfustyleu	on_stderr((u5/tmp/pip-zej_zi-build/pip/_vendor/colorama/winterm.pyustyle7s	u
WinTerm.stylecCsJ|dkr|j�}ntj}|r6tj}ntj||�dS(N(uNoneu	get_attrsuwin32uSTDOUTuSTDERRuSetConsoleTextAttribute(uselfuattrsu	on_stderruhandle((u5/tmp/pip-zej_zi-build/pip/_vendor/colorama/winterm.pyuset_console=s	uWinTerm.set_consolecCs4tj|�j}|jd7_|jd7_|S(Ni(uwin32uGetConsoleScreenBufferInfoudwCursorPositionuXuY(uselfuhandleuposition((u5/tmp/pip-zej_zi-build/pip/_vendor/colorama/winterm.pyuget_positionEsuWinTerm.get_positioncCs?|dkrdStj}|r+tj}ntj||�dS(N(uNoneuwin32uSTDOUTuSTDERRuSetConsoleCursorPosition(uselfupositionu	on_stderruhandle((u5/tmp/pip-zej_zi-build/pip/_vendor/colorama/winterm.pyuset_cursor_positionMs	uWinTerm.set_cursor_positionicCsd|dkrdStj}|r+tj}n|j|�}|j||jf}|j||�dS(Ni(uwin32uSTDOUTuSTDERRuget_positionuYuXuset_cursor_position(uselfunum_rowsu	on_stderruhandleupositionuadjusted_position((u5/tmp/pip-zej_zi-build/pip/_vendor/colorama/winterm.pyu	cursor_upWs	uWinTerm.cursor_upcCs�|ddkrdStj}|r/tj}ntjdd�}tj|�}|jj|jj}tj|d||�tj	||j
�||�tj||j|jf�dS(Niiu (i(uwin32uSTDOUTuSTDERRuCOORDuGetConsoleScreenBufferInfoudwSizeuXuYuFillConsoleOutputCharacteruFillConsoleOutputAttributeu	get_attrsuSetConsoleCursorPosition(uselfumodeu	on_stderruhandleucoord_screenucsbiudw_con_size((u5/tmp/pip-zej_zi-build/pip/_vendor/colorama/winterm.pyu
erase_dataas	uWinTerm.erase_dataNF(u__name__u
__module__u__qualname__u__init__u	get_attrsu	set_attrsuNoneu	reset_alluFalseuforeubackustyleuset_consoleuget_positionuset_cursor_positionu	cursor_upu
erase_data(u
__locals__((u5/tmp/pip-zej_zi-build/pip/_vendor/colorama/winterm.pyuWinTerms

uWinTermN(uuwin32uobjectuWinColoruWinStyleuWinTerm(((u5/tmp/pip-zej_zi-build/pip/_vendor/colorama/winterm.pyu<module>ssite-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-33.pyc000064400000000725151733463770021723 0ustar00�
7�Re�c@sRddlmZmZmZddlmZmZmZddlm	Z	dZ
dS(i(uinitudeinitureinit(uForeuBackuStyle(uAnsiToWin32u0.3.1N(u
initialiseuinitudeinitureinituansiuForeuBackuStyleuansitowin32uAnsiToWin32u__version__(((u6/tmp/pip-zej_zi-build/pip/_vendor/colorama/__init__.pyu<module>ssite-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-33.pyc000064400000021011151733463770022333 0ustar00�
7�Rec@s�ddlZddlZddlmZmZmZmZddlmZm	Z	m
Z
ddlmZdZedk	r�e�Zndd�ZGdd	�d	e�ZGd
d�de�ZdS(iNi(uAnsiForeuAnsiBacku	AnsiStyleuStyle(uWinTermuWinColoruWinStyle(uwindllcCst|d�o|j�S(Nuisatty(uhasattruisatty(ustream((u9/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansitowin32.pyuis_a_ttysuis_a_ttycBs>|EeZdZdZdd�Zdd�Zdd�ZdS(	u
StreamWrapperu�
    Wraps a stream (such as stdout), acting as a transparent proxy for all
    attribute access apart from method 'write()', which is delegated to our
    Converter instance.
    cCs||_||_dS(N(u_StreamWrapper__wrappedu_StreamWrapper__convertor(uselfuwrappedu	converter((u9/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansitowin32.pyu__init__s	uStreamWrapper.__init__cCst|j|�S(N(ugetattru_StreamWrapper__wrapped(uselfuname((u9/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansitowin32.pyu__getattr__suStreamWrapper.__getattr__cCs|jj|�dS(N(u_StreamWrapper__convertoruwrite(uselfutext((u9/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansitowin32.pyuwrite"suStreamWrapper.writeN(u__name__u
__module__u__qualname__u__doc__u__init__u__getattr__uwrite(u
__locals__((u9/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansitowin32.pyu
StreamWrappersu
StreamWrappercBs�|EeZdZdZejd�Zddddd�Z	dd�Z
dd�Zd	d
�Zdd�Z
d
d�Zdd�Zdd�Zdd�Zdd�ZdS(uAnsiToWin32u�
    Implements a 'write()' method which, on Windows, will strip ANSI character
    sequences from the text, and if outputting to a tty, will convert them into
    win32 function calls.
    u\[((?:\d|;)*)([a-zA-Z])cCs�||_||_t||�|_tjjd�}|dkrK|}n||_|dkru|oot	|�}n||_
|j�|_|jtj
k|_dS(Nuwin(uwrappedu	autoresetu
StreamWrapperustreamusysuplatformu
startswithuNoneustripuis_a_ttyuconvertuget_win32_callsuwin32_callsustderru	on_stderr(uselfuwrappeduconvertustripu	autoresetu
on_windows((u9/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansitowin32.pyu__init__.s					uAnsiToWin32.__init__cCs|jp|jp|jS(uj
        True if this class is actually needed. If false, then the output
        stream will not be affected, nor will win32 calls be issued, so
        wrapping stdout is not actually required. This will generally be
        False on non-Windows platforms, unless optional functionality like
        autoreset has been requested using kwargs to init()
        (uconvertustripu	autoreset(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansitowin32.pyushould_wrapKsuAnsiToWin32.should_wrapcCs�|jr�tr�itjftj6tjtjftj6tjtjftj	6tjtjftj6tj
tjft
j6tj
tjft
j6tj
tjft
j6tj
tjft
j6tj
tjft
j6tj
tjft
j6tj
tjft
j6tj
tjft
j6tj
ft
j6tjtjftj6tjtjftj6tjtjftj6tjtjftj6tjtjftj6tjtjftj6tjtjftj6tjtjftj6tjftj6SdS(N(uconvertuwintermu	reset_allu	AnsiStyleu	RESET_ALLustyleuWinStyleuBRIGHTuNORMALuDIMuforeuWinColoruBLACKuAnsiForeuREDuGREENuYELLOWuBLUEuMAGENTAuCYANuGREYuWHITEuRESETubackuAnsiBack(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansitowin32.pyuget_win32_callsVs0uAnsiToWin32.get_win32_callscCsY|js|jr"|j|�n|jj|�|jj�|jrU|j�ndS(N(ustripuconvertuwrite_and_convertuwrappeduwriteuflushu	autoresetu	reset_all(uselfutext((u9/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansitowin32.pyuwriters
	uAnsiToWin32.writecCsR|jr|jdd�n2|jjrNt|j�rN|jjtj�ndS(Numi(i(uconvertu
call_win32uwrappeducloseduis_a_ttyuwriteuStyleu	RESET_ALL(uself((u9/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansitowin32.pyu	reset_all|s	uAnsiToWin32.reset_allcCs~d}xX|jj|�D]D}|j�\}}|j|||�|j|j��|}qW|j||t|��dS(u�
        Write the given text to our wrapped stream, stripping any ANSI
        sequences from the text, and optionally converting them into win32
        calls.
        iN(uANSI_REufinditeruspanuwrite_plain_textuconvert_ansiugroupsulen(uselfutextucursorumatchustartuend((u9/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansitowin32.pyuwrite_and_convert�s
uAnsiToWin32.write_and_convertcCs:||kr6|jj|||��|jj�ndS(N(uwrappeduwriteuflush(uselfutextustartuend((u9/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansitowin32.pyuwrite_plain_text�suAnsiToWin32.write_plain_textcCs/|jr+|j|�}|j||�ndS(N(uconvertuextract_paramsu
call_win32(uselfuparamstringucommanduparams((u9/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansitowin32.pyuconvert_ansi�s	uAnsiToWin32.convert_ansicCsdd�}t||��S(Ncss8x1|jd�D] }|dkrt|�VqqWdS(Nu;u(usplituint(uparamstringup((u9/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansitowin32.pyusplit�su)AnsiToWin32.extract_params.<locals>.split(utuple(uselfuparamstringusplit((u9/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansitowin32.pyuextract_params�suAnsiToWin32.extract_paramsc	Cs@|gkrdg}n|dkr�x|D]^}||jkr+|j|}|d}|dd�}td|j�}|||�q+q+Wn�|d	kr�tj}||d|j�n�|dkr�tj}||d|j�nV|dkr<|fks
|dkrd}n
|d}tj}||d|j�ndS(
Niumiu	on_stderruHufuJuA(uHuf(uwin32_callsudictu	on_stderruwintermuset_cursor_positionu
erase_datauNoneu	cursor_up(	uselfucommanduparamsuparamu	func_argsufuncuargsukwargsunum_rows((u9/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansitowin32.pyu
call_win32�s,


			
	uAnsiToWin32.call_win32NF(u__name__u
__module__u__qualname__u__doc__ureucompileuANSI_REuNoneuFalseu__init__ushould_wrapuget_win32_callsuwriteu	reset_alluwrite_and_convertuwrite_plain_textuconvert_ansiuextract_paramsu
call_win32(u
__locals__((u9/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansitowin32.pyuAnsiToWin32&s
uAnsiToWin32(ureusysuansiuAnsiForeuAnsiBacku	AnsiStyleuStyleuwintermuWinTermuWinColoruWinStyleuwin32uwindlluNoneuis_a_ttyuobjectu
StreamWrapperuAnsiToWin32(((u9/tmp/pip-zej_zi-build/pip/_vendor/colorama/ansitowin32.pyu<module>s"site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-33.pyc000064400000012054151733463770021124 0ustar00�
7�Re/c@s]dZdZddlZddlmZy#eej�ZddlmZWn*eefk
rwdZdd�Z
Yn�XddlmZmZm
Z
mZmZmZmZGd	d
�d
e�ZejjZejge_eje_ejjZejee�ge_eje_ejj
Zejejge_eje_ejjZ ejej!ge _eje _ejj"Z#eje
ejej!eej�ge#_eje#_ejj$Z%ejejejej!eej�ge%_eje%_iee�e6ee�e6Z&edd�Zd
d�Z
dd�Zdd�Z'dd�Z$dS(iiiN(u
LibraryLoader(uwintypescGsdS(N(uNone(u_((u3/tmp/pip-zej_zi-build/pip/_vendor/colorama/win32.pyu<lambda>su<lambda>(ubyrefu	Structureuc_charuc_shortuc_uint32uc_ushortuPOINTERcBsh|EeZdZdZdejfdejfdejfdejfdejfgZdd�Z	d	S(
uCONSOLE_SCREEN_BUFFER_INFOustruct in wincon.h.udwSizeudwCursorPositionuwAttributesusrWindowudwMaximumWindowSizecCshd|jj|jj|jj|jj|j|jj|jj|jj|jj	|j
j|j
jfS(Nu"(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)(udwSizeuYuXudwCursorPositionuwAttributesusrWindowuTopuLeftuBottomuRightudwMaximumWindowSize(uself((u3/tmp/pip-zej_zi-build/pip/_vendor/colorama/win32.pyu__str__s$u"CONSOLE_SCREEN_BUFFER_INFO.__str__N(
u__name__u
__module__u__qualname__u__doc__uwintypesu_COORDuWORDu
SMALL_RECTu_fields_u__str__(u
__locals__((u3/tmp/pip-zej_zi-build/pip/_vendor/colorama/win32.pyuCONSOLE_SCREEN_BUFFER_INFOsuCONSOLE_SCREEN_BUFFER_INFOcCs,t|}t�}t|t|��}|S(N(uhandlesuCONSOLE_SCREEN_BUFFER_INFOu_GetConsoleScreenBufferInfoubyref(u	stream_iduhandleucsbiusuccess((u3/tmp/pip-zej_zi-build/pip/_vendor/colorama/win32.pyuGetConsoleScreenBufferInfo[s

	uGetConsoleScreenBufferInfocCst|}t||�S(N(uhandlesu_SetConsoleTextAttribute(u	stream_iduattrsuhandle((u3/tmp/pip-zej_zi-build/pip/_vendor/colorama/win32.pyuSetConsoleTextAttributebs
uSetConsoleTextAttributecCs�tj|�}|jdks-|jdkr1dStj|jd|jd�}tt�j}|j|j7_|j|j7_t	|}t
||�S(Nii(uwintypesu_COORDuYuXuGetConsoleScreenBufferInfouSTDOUTusrWindowuTopuLeftuhandlesu_SetConsoleCursorPosition(u	stream_idupositionuadjusted_positionusruhandle((u3/tmp/pip-zej_zi-build/pip/_vendor/colorama/win32.pyuSetConsoleCursorPositionfs 
uSetConsoleCursorPositioncCsYt|}t|�}tj|�}tjd�}t||||t|��}|jS(Ni(uhandlesuc_charuwintypesuDWORDu_FillConsoleOutputCharacterAubyrefuvalue(u	stream_iducharulengthustartuhandleunum_writtenusuccess((u3/tmp/pip-zej_zi-build/pip/_vendor/colorama/win32.pyuFillConsoleOutputCharacterws
uFillConsoleOutputCharactercCsSt|}tj|�}tj|�}tjd�}t||||t|��S(ua FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )i(uhandlesuwintypesuWORDuDWORDu_FillConsoleOutputAttributeubyref(u	stream_iduattrulengthustartuhandleu	attributeunum_written((u3/tmp/pip-zej_zi-build/pip/_vendor/colorama/win32.pyuFillConsoleOutputAttribute�s
uFillConsoleOutputAttributei����i�((uSTDOUTuSTDERRuctypesu
LibraryLoaderuWinDLLuwindlluwintypesuAttributeErroruImportErroruNoneuSetConsoleTextAttributeubyrefu	Structureuc_charuc_shortuc_uint32uc_ushortuPOINTERuCONSOLE_SCREEN_BUFFER_INFOukernel32uGetStdHandleu
_GetStdHandleuDWORDuargtypesuHANDLEurestypeuGetConsoleScreenBufferInfou_GetConsoleScreenBufferInfouBOOLu_SetConsoleTextAttributeuWORDuSetConsoleCursorPositionu_SetConsoleCursorPositionu_COORDuFillConsoleOutputCharacterAu_FillConsoleOutputCharacterAuFillConsoleOutputAttributeu_FillConsoleOutputAttributeuhandlesuFillConsoleOutputCharacter(((u3/tmp/pip-zej_zi-build/pip/_vendor/colorama/win32.pyu<module>s`4

site-packages/pip/_vendor/colorama/win32.py000064400000011457151733463770014651 0ustar00# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.

# from winbase.h
STDOUT = -11
STDERR = -12

import ctypes
from ctypes import LibraryLoader

try:
    windll = LibraryLoader(ctypes.WinDLL)
    from ctypes import wintypes
except (AttributeError, ImportError):
    windll = None
    SetConsoleTextAttribute = lambda *_: None
else:
    from ctypes import (
        byref, Structure, c_char, c_short, c_uint32, c_ushort, POINTER
    )

    class CONSOLE_SCREEN_BUFFER_INFO(Structure):
        """struct in wincon.h."""
        _fields_ = [
            ("dwSize", wintypes._COORD),
            ("dwCursorPosition", wintypes._COORD),
            ("wAttributes", wintypes.WORD),
            ("srWindow", wintypes.SMALL_RECT),
            ("dwMaximumWindowSize", wintypes._COORD),
        ]
        def __str__(self):
            return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % (
                self.dwSize.Y, self.dwSize.X
                , self.dwCursorPosition.Y, self.dwCursorPosition.X
                , self.wAttributes
                , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right
                , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X
            )

    _GetStdHandle = windll.kernel32.GetStdHandle
    _GetStdHandle.argtypes = [
        wintypes.DWORD,
    ]
    _GetStdHandle.restype = wintypes.HANDLE

    _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo
    _GetConsoleScreenBufferInfo.argtypes = [
        wintypes.HANDLE,
        POINTER(CONSOLE_SCREEN_BUFFER_INFO),
    ]
    _GetConsoleScreenBufferInfo.restype = wintypes.BOOL

    _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute
    _SetConsoleTextAttribute.argtypes = [
        wintypes.HANDLE,
        wintypes.WORD,
    ]
    _SetConsoleTextAttribute.restype = wintypes.BOOL

    _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition
    _SetConsoleCursorPosition.argtypes = [
        wintypes.HANDLE,
        wintypes._COORD,
    ]
    _SetConsoleCursorPosition.restype = wintypes.BOOL

    _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA
    _FillConsoleOutputCharacterA.argtypes = [
        wintypes.HANDLE,
        c_char,
        wintypes.DWORD,
        wintypes._COORD,
        POINTER(wintypes.DWORD),
    ]
    _FillConsoleOutputCharacterA.restype = wintypes.BOOL

    _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute
    _FillConsoleOutputAttribute.argtypes = [
        wintypes.HANDLE,
        wintypes.WORD,
        wintypes.DWORD,
        wintypes._COORD,
        POINTER(wintypes.DWORD),
    ]
    _FillConsoleOutputAttribute.restype = wintypes.BOOL

    handles = {
        STDOUT: _GetStdHandle(STDOUT),
        STDERR: _GetStdHandle(STDERR),
    }

    def GetConsoleScreenBufferInfo(stream_id=STDOUT):
        handle = handles[stream_id]
        csbi = CONSOLE_SCREEN_BUFFER_INFO()
        success = _GetConsoleScreenBufferInfo(
            handle, byref(csbi))
        return csbi

    def SetConsoleTextAttribute(stream_id, attrs):
        handle = handles[stream_id]
        return _SetConsoleTextAttribute(handle, attrs)

    def SetConsoleCursorPosition(stream_id, position):
        position = wintypes._COORD(*position)
        # If the position is out of range, do nothing.
        if position.Y <= 0 or position.X <= 0:
            return
        # Adjust for Windows' SetConsoleCursorPosition:
        #    1. being 0-based, while ANSI is 1-based.
        #    2. expecting (x,y), while ANSI uses (y,x).
        adjusted_position = wintypes._COORD(position.Y - 1, position.X - 1)
        # Adjust for viewport's scroll position
        sr = GetConsoleScreenBufferInfo(STDOUT).srWindow
        adjusted_position.Y += sr.Top
        adjusted_position.X += sr.Left
        # Resume normal processing
        handle = handles[stream_id]
        return _SetConsoleCursorPosition(handle, adjusted_position)

    def FillConsoleOutputCharacter(stream_id, char, length, start):
        handle = handles[stream_id]
        char = c_char(char)
        length = wintypes.DWORD(length)
        num_written = wintypes.DWORD(0)
        # Note that this is hard-coded for ANSI (vs wide) bytes.
        success = _FillConsoleOutputCharacterA(
            handle, char, length, start, byref(num_written))
        return num_written.value

    def FillConsoleOutputAttribute(stream_id, attr, length, start):
        ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )'''
        handle = handles[stream_id]
        attribute = wintypes.WORD(attr)
        length = wintypes.DWORD(length)
        num_written = wintypes.DWORD(0)
        # Note that this is hard-coded for ANSI (vs wide) bytes.
        return _FillConsoleOutputAttribute(
            handle, attribute, length, start, byref(num_written))
site-packages/pip/_vendor/colorama/initialise.py000064400000002421151733463770016030 0ustar00# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
import atexit
import sys

from .ansitowin32 import AnsiToWin32


orig_stdout = sys.stdout
orig_stderr = sys.stderr

wrapped_stdout = sys.stdout
wrapped_stderr = sys.stderr

atexit_done = False


def reset_all():
    AnsiToWin32(orig_stdout).reset_all()


def init(autoreset=False, convert=None, strip=None, wrap=True):

    if not wrap and any([autoreset, convert, strip]):
        raise ValueError('wrap=False conflicts with any other arg=True')

    global wrapped_stdout, wrapped_stderr
    sys.stdout = wrapped_stdout = \
        wrap_stream(orig_stdout, convert, strip, autoreset, wrap)
    sys.stderr = wrapped_stderr = \
        wrap_stream(orig_stderr, convert, strip, autoreset, wrap)

    global atexit_done
    if not atexit_done:
        atexit.register(reset_all)
        atexit_done = True


def deinit():
    sys.stdout = orig_stdout
    sys.stderr = orig_stderr


def reinit():
    sys.stdout = wrapped_stdout
    sys.stderr = wrapped_stdout


def wrap_stream(stream, convert, strip, autoreset, wrap):
    if wrap:
        wrapper = AnsiToWin32(stream,
            convert=convert, strip=strip, autoreset=autoreset)
        if wrapper.should_wrap():
            stream = wrapper.stream
    return stream


site-packages/pip/_vendor/colorama/__init__.py000064400000000331151733463770015433 0ustar00# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
from .initialise import init, deinit, reinit
from .ansi import Fore, Back, Style
from .ansitowin32 import AnsiToWin32

__version__ = '0.3.1'

site-packages/pip/_vendor/colorama/winterm.py000064400000010156151733463770015367 0ustar00# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
from . import win32


# from wincon.h
class WinColor(object):
    BLACK   = 0
    BLUE    = 1
    GREEN   = 2
    CYAN    = 3
    RED     = 4
    MAGENTA = 5
    YELLOW  = 6
    GREY    = 7

# from wincon.h
class WinStyle(object):
    NORMAL = 0x00 # dim text, dim background
    BRIGHT = 0x08 # bright text, dim background


class WinTerm(object):

    def __init__(self):
        self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes
        self.set_attrs(self._default)
        self._default_fore = self._fore
        self._default_back = self._back
        self._default_style = self._style

    def get_attrs(self):
        return self._fore + self._back * 16 + self._style

    def set_attrs(self, value):
        self._fore = value & 7
        self._back = (value >> 4) & 7
        self._style = value & WinStyle.BRIGHT

    def reset_all(self, on_stderr=None):
        self.set_attrs(self._default)
        self.set_console(attrs=self._default)

    def fore(self, fore=None, on_stderr=False):
        if fore is None:
            fore = self._default_fore
        self._fore = fore
        self.set_console(on_stderr=on_stderr)

    def back(self, back=None, on_stderr=False):
        if back is None:
            back = self._default_back
        self._back = back
        self.set_console(on_stderr=on_stderr)

    def style(self, style=None, on_stderr=False):
        if style is None:
            style = self._default_style
        self._style = style
        self.set_console(on_stderr=on_stderr)

    def set_console(self, attrs=None, on_stderr=False):
        if attrs is None:
            attrs = self.get_attrs()
        handle = win32.STDOUT
        if on_stderr:
            handle = win32.STDERR
        win32.SetConsoleTextAttribute(handle, attrs)

    def get_position(self, handle):
        position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition
        # Because Windows coordinates are 0-based,
        # and win32.SetConsoleCursorPosition expects 1-based.
        position.X += 1
        position.Y += 1
        return position
    
    def set_cursor_position(self, position=None, on_stderr=False):
        if position is None:
            #I'm not currently tracking the position, so there is no default.
            #position = self.get_position()
            return
        handle = win32.STDOUT
        if on_stderr:
            handle = win32.STDERR
        win32.SetConsoleCursorPosition(handle, position)

    def cursor_up(self, num_rows=0, on_stderr=False):
        if num_rows == 0:
            return
        handle = win32.STDOUT
        if on_stderr:
            handle = win32.STDERR
        position = self.get_position(handle)
        adjusted_position = (position.Y - num_rows, position.X)
        self.set_cursor_position(adjusted_position, on_stderr)

    def erase_data(self, mode=0, on_stderr=False):
        # 0 (or None) should clear from the cursor to the end of the screen.
        # 1 should clear from the cursor to the beginning of the screen.
        # 2 should clear the entire screen. (And maybe move cursor to (1,1)?)
        #
        # At the moment, I only support mode 2. From looking at the API, it
        #    should be possible to calculate a different number of bytes to clear,
        #    and to do so relative to the cursor position.
        if mode[0] not in (2,):
            return
        handle = win32.STDOUT
        if on_stderr:
            handle = win32.STDERR
        # here's where we'll home the cursor
        coord_screen = win32.COORD(0,0)
        csbi = win32.GetConsoleScreenBufferInfo(handle)
        # get the number of character cells in the current buffer
        dw_con_size = csbi.dwSize.X * csbi.dwSize.Y
        # fill the entire screen with blanks
        win32.FillConsoleOutputCharacter(handle, ' ', dw_con_size, coord_screen)
        # now set the buffer's attributes accordingly
        win32.FillConsoleOutputAttribute(handle, self.get_attrs(), dw_con_size, coord_screen );
        # put the cursor at (0, 0)
        win32.SetConsoleCursorPosition(handle, (coord_screen.X, coord_screen.Y))
site-packages/pip/_vendor/colorama/ansi.py000064400000002017151733463770014631 0ustar00# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
'''
This module generates ANSI character codes to printing colors to terminals.
See: http://en.wikipedia.org/wiki/ANSI_escape_code
'''

CSI = '\033['

def code_to_chars(code):
    return CSI + str(code) + 'm'

class AnsiCodes(object):
    def __init__(self, codes):
        for name in dir(codes):
            if not name.startswith('_'):
                value = getattr(codes, name)
                setattr(self, name, code_to_chars(value))

class AnsiFore:
    BLACK   = 30
    RED     = 31
    GREEN   = 32
    YELLOW  = 33
    BLUE    = 34
    MAGENTA = 35
    CYAN    = 36
    WHITE   = 37
    RESET   = 39

class AnsiBack:
    BLACK   = 40
    RED     = 41
    GREEN   = 42
    YELLOW  = 43
    BLUE    = 44
    MAGENTA = 45
    CYAN    = 46
    WHITE   = 47
    RESET   = 49

class AnsiStyle:
    BRIGHT    = 1
    DIM       = 2
    NORMAL    = 22
    RESET_ALL = 0

Fore = AnsiCodes( AnsiFore )
Back = AnsiCodes( AnsiBack )
Style = AnsiCodes( AnsiStyle )

site-packages/pip/_vendor/pkg_resources.py000064400000303271151733463770014763 0ustar00"""
Package resource API
--------------------

A resource is a logical file contained within a package, or a logical
subdirectory thereof.  The package resource API expects resource names
to have their path parts separated with ``/``, *not* whatever the local
path separator is.  Do not use os.path operations to manipulate resource
names being passed into the API.

The package resource API is designed to work with normal filesystem packages,
.egg files, and unpacked .egg files.  It can also work in a limited way with
.zip files and with custom PEP 302 loaders that support the ``get_data()``
method.
"""

import sys
import os
import time
import re
import imp
import zipfile
import zipimport
import warnings
import stat
import functools
import pkgutil
import token
import symbol
import operator
import platform
from pkgutil import get_importer

try:
    from urlparse import urlparse, urlunparse
except ImportError:
    from urllib.parse import urlparse, urlunparse

try:
    frozenset
except NameError:
    from sets import ImmutableSet as frozenset
try:
    basestring
    next = lambda o: o.next()
    from cStringIO import StringIO as BytesIO
except NameError:
    basestring = str
    from io import BytesIO
    def execfile(fn, globs=None, locs=None):
        if globs is None:
            globs = globals()
        if locs is None:
            locs = globs
        exec(compile(open(fn).read(), fn, 'exec'), globs, locs)

# capture these to bypass sandboxing
from os import utime
try:
    from os import mkdir, rename, unlink
    WRITE_SUPPORT = True
except ImportError:
    # no write support, probably under GAE
    WRITE_SUPPORT = False

from os import open as os_open
from os.path import isdir, split

# Avoid try/except due to potential problems with delayed import mechanisms.
if sys.version_info >= (3, 3) and sys.implementation.name == "cpython":
    import importlib._bootstrap as importlib_bootstrap
else:
    importlib_bootstrap = None

try:
    import parser
except ImportError:
    pass

def _bypass_ensure_directory(name, mode=0x1FF):  # 0777
    # Sandbox-bypassing version of ensure_directory()
    if not WRITE_SUPPORT:
        raise IOError('"os.mkdir" not supported on this platform.')
    dirname, filename = split(name)
    if dirname and filename and not isdir(dirname):
        _bypass_ensure_directory(dirname)
        mkdir(dirname, mode)


_state_vars = {}

def _declare_state(vartype, **kw):
    globals().update(kw)
    _state_vars.update(dict.fromkeys(kw, vartype))

def __getstate__():
    state = {}
    g = globals()
    for k, v in _state_vars.items():
        state[k] = g['_sget_'+v](g[k])
    return state

def __setstate__(state):
    g = globals()
    for k, v in state.items():
        g['_sset_'+_state_vars[k]](k, g[k], v)
    return state

def _sget_dict(val):
    return val.copy()

def _sset_dict(key, ob, state):
    ob.clear()
    ob.update(state)

def _sget_object(val):
    return val.__getstate__()

def _sset_object(key, ob, state):
    ob.__setstate__(state)

_sget_none = _sset_none = lambda *args: None


def get_supported_platform():
    """Return this platform's maximum compatible version.

    distutils.util.get_platform() normally reports the minimum version
    of Mac OS X that would be required to *use* extensions produced by
    distutils.  But what we want when checking compatibility is to know the
    version of Mac OS X that we are *running*.  To allow usage of packages that
    explicitly require a newer version of Mac OS X, we must also know the
    current version of the OS.

    If this condition occurs for any other platform with a version in its
    platform strings, this function should be extended accordingly.
    """
    plat = get_build_platform()
    m = macosVersionString.match(plat)
    if m is not None and sys.platform == "darwin":
        try:
            plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3))
        except ValueError:
            pass    # not Mac OS X
    return plat

__all__ = [
    # Basic resource access and distribution/entry point discovery
    'require', 'run_script', 'get_provider',  'get_distribution',
    'load_entry_point', 'get_entry_map', 'get_entry_info', 'iter_entry_points',
    'resource_string', 'resource_stream', 'resource_filename',
    'resource_listdir', 'resource_exists', 'resource_isdir',

    # Environmental control
    'declare_namespace', 'working_set', 'add_activation_listener',
    'find_distributions', 'set_extraction_path', 'cleanup_resources',
    'get_default_cache',

    # Primary implementation classes
    'Environment', 'WorkingSet', 'ResourceManager',
    'Distribution', 'Requirement', 'EntryPoint',

    # Exceptions
    'ResolutionError','VersionConflict','DistributionNotFound','UnknownExtra',
    'ExtractionError',

    # Parsing functions and string utilities
    'parse_requirements', 'parse_version', 'safe_name', 'safe_version',
    'get_platform', 'compatible_platforms', 'yield_lines', 'split_sections',
    'safe_extra', 'to_filename', 'invalid_marker', 'evaluate_marker',

    # filesystem utilities
    'ensure_directory', 'normalize_path',

    # Distribution "precedence" constants
    'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', 'DEVELOP_DIST',

    # "Provider" interfaces, implementations, and registration/lookup APIs
    'IMetadataProvider', 'IResourceProvider', 'FileMetadata',
    'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider',
    'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider',
    'register_finder', 'register_namespace_handler', 'register_loader_type',
    'fixup_namespace_packages', 'get_importer',

    # Deprecated/backward compatibility only
    'run_main', 'AvailableDistributions',
]

class ResolutionError(Exception):
    """Abstract base for dependency resolution errors"""
    def __repr__(self):
        return self.__class__.__name__+repr(self.args)

class VersionConflict(ResolutionError):
    """An already-installed version conflicts with the requested version"""

class DistributionNotFound(ResolutionError):
    """A requested distribution was not found"""

class UnknownExtra(ResolutionError):
    """Distribution doesn't have an "extra feature" of the given name"""
_provider_factories = {}

PY_MAJOR = sys.version[:3]
EGG_DIST = 3
BINARY_DIST = 2
SOURCE_DIST = 1
CHECKOUT_DIST = 0
DEVELOP_DIST = -1

def register_loader_type(loader_type, provider_factory):
    """Register `provider_factory` to make providers for `loader_type`

    `loader_type` is the type or class of a PEP 302 ``module.__loader__``,
    and `provider_factory` is a function that, passed a *module* object,
    returns an ``IResourceProvider`` for that module.
    """
    _provider_factories[loader_type] = provider_factory

def get_provider(moduleOrReq):
    """Return an IResourceProvider for the named module or requirement"""
    if isinstance(moduleOrReq,Requirement):
        return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0]
    try:
        module = sys.modules[moduleOrReq]
    except KeyError:
        __import__(moduleOrReq)
        module = sys.modules[moduleOrReq]
    loader = getattr(module, '__loader__', None)
    return _find_adapter(_provider_factories, loader)(module)

def _macosx_vers(_cache=[]):
    if not _cache:
        import platform
        version = platform.mac_ver()[0]
        # fallback for MacPorts
        if version == '':
            import plistlib
            plist = '/System/Library/CoreServices/SystemVersion.plist'
            if os.path.exists(plist):
                if hasattr(plistlib, 'readPlist'):
                    plist_content = plistlib.readPlist(plist)
                    if 'ProductVersion' in plist_content:
                        version = plist_content['ProductVersion']

        _cache.append(version.split('.'))
    return _cache[0]

def _macosx_arch(machine):
    return {'PowerPC':'ppc', 'Power_Macintosh':'ppc'}.get(machine,machine)

def get_build_platform():
    """Return this platform's string for platform-specific distributions

    XXX Currently this is the same as ``distutils.util.get_platform()``, but it
    needs some hacks for Linux and Mac OS X.
    """
    try:
        # Python 2.7 or >=3.2
        from sysconfig import get_platform
    except ImportError:
        from distutils.util import get_platform

    plat = get_platform()
    if sys.platform == "darwin" and not plat.startswith('macosx-'):
        try:
            version = _macosx_vers()
            machine = os.uname()[4].replace(" ", "_")
            return "macosx-%d.%d-%s" % (int(version[0]), int(version[1]),
                _macosx_arch(machine))
        except ValueError:
            # if someone is running a non-Mac darwin system, this will fall
            # through to the default implementation
            pass
    return plat

macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)")
darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)")
get_platform = get_build_platform   # XXX backward compat


def compatible_platforms(provided,required):
    """Can code for the `provided` platform run on the `required` platform?

    Returns true if either platform is ``None``, or the platforms are equal.

    XXX Needs compatibility checks for Linux and other unixy OSes.
    """
    if provided is None or required is None or provided==required:
        return True     # easy case

    # Mac OS X special cases
    reqMac = macosVersionString.match(required)
    if reqMac:
        provMac = macosVersionString.match(provided)

        # is this a Mac package?
        if not provMac:
            # this is backwards compatibility for packages built before
            # setuptools 0.6. All packages built after this point will
            # use the new macosx designation.
            provDarwin = darwinVersionString.match(provided)
            if provDarwin:
                dversion = int(provDarwin.group(1))
                macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2))
                if dversion == 7 and macosversion >= "10.3" or \
                        dversion == 8 and macosversion >= "10.4":

                    #import warnings
                    #warnings.warn("Mac eggs should be rebuilt to "
                    #    "use the macosx designation instead of darwin.",
                    #    category=DeprecationWarning)
                    return True
            return False    # egg isn't macosx or legacy darwin

        # are they the same major version and machine type?
        if provMac.group(1) != reqMac.group(1) or \
                provMac.group(3) != reqMac.group(3):
            return False

        # is the required OS major update >= the provided one?
        if int(provMac.group(2)) > int(reqMac.group(2)):
            return False

        return True

    # XXX Linux and other platforms' special cases should go here
    return False


def run_script(dist_spec, script_name):
    """Locate distribution `dist_spec` and run its `script_name` script"""
    ns = sys._getframe(1).f_globals
    name = ns['__name__']
    ns.clear()
    ns['__name__'] = name
    require(dist_spec)[0].run_script(script_name, ns)

run_main = run_script   # backward compatibility

def get_distribution(dist):
    """Return a current distribution object for a Requirement or string"""
    if isinstance(dist,basestring): dist = Requirement.parse(dist)
    if isinstance(dist,Requirement): dist = get_provider(dist)
    if not isinstance(dist,Distribution):
        raise TypeError("Expected string, Requirement, or Distribution", dist)
    return dist

def load_entry_point(dist, group, name):
    """Return `name` entry point of `group` for `dist` or raise ImportError"""
    return get_distribution(dist).load_entry_point(group, name)

def get_entry_map(dist, group=None):
    """Return the entry point map for `group`, or the full entry map"""
    return get_distribution(dist).get_entry_map(group)

def get_entry_info(dist, group, name):
    """Return the EntryPoint object for `group`+`name`, or ``None``"""
    return get_distribution(dist).get_entry_info(group, name)


class IMetadataProvider:

    def has_metadata(name):
        """Does the package's distribution contain the named metadata?"""

    def get_metadata(name):
        """The named metadata resource as a string"""

    def get_metadata_lines(name):
        """Yield named metadata resource as list of non-blank non-comment lines

       Leading and trailing whitespace is stripped from each line, and lines
       with ``#`` as the first non-blank character are omitted."""

    def metadata_isdir(name):
        """Is the named metadata a directory?  (like ``os.path.isdir()``)"""

    def metadata_listdir(name):
        """List of metadata names in the directory (like ``os.listdir()``)"""

    def run_script(script_name, namespace):
        """Execute the named script in the supplied namespace dictionary"""


class IResourceProvider(IMetadataProvider):
    """An object that provides access to package resources"""

    def get_resource_filename(manager, resource_name):
        """Return a true filesystem path for `resource_name`

        `manager` must be an ``IResourceManager``"""

    def get_resource_stream(manager, resource_name):
        """Return a readable file-like object for `resource_name`

        `manager` must be an ``IResourceManager``"""

    def get_resource_string(manager, resource_name):
        """Return a string containing the contents of `resource_name`

        `manager` must be an ``IResourceManager``"""

    def has_resource(resource_name):
        """Does the package contain the named resource?"""

    def resource_isdir(resource_name):
        """Is the named resource a directory?  (like ``os.path.isdir()``)"""

    def resource_listdir(resource_name):
        """List of resource names in the directory (like ``os.listdir()``)"""


class WorkingSet(object):
    """A collection of active distributions on sys.path (or a similar list)"""

    def __init__(self, entries=None):
        """Create working set from list of path entries (default=sys.path)"""
        self.entries = []
        self.entry_keys = {}
        self.by_key = {}
        self.callbacks = []

        if entries is None:
            entries = sys.path

        for entry in entries:
            self.add_entry(entry)

    @classmethod
    def _build_master(cls):
        """
        Prepare the master working set.
        """
        ws = cls()
        try:
            from __main__ import __requires__
        except ImportError:
            # The main program does not list any requirements
            return ws

        # ensure the requirements are met
        try:
            ws.require(__requires__)
        except VersionConflict:
            return cls._build_from_requirements(__requires__)

        return ws

    @classmethod
    def _build_from_requirements(cls, req_spec):
        """
        Build a working set from a requirement spec. Rewrites sys.path.
        """
        # try it without defaults already on sys.path
        # by starting with an empty path
        ws = cls([])
        reqs = parse_requirements(req_spec)
        dists = ws.resolve(reqs, Environment())
        for dist in dists:
            ws.add(dist)

        # add any missing entries from sys.path
        for entry in sys.path:
            if entry not in ws.entries:
                ws.add_entry(entry)

        # then copy back to sys.path
        sys.path[:] = ws.entries
        return ws

    def add_entry(self, entry):
        """Add a path item to ``.entries``, finding any distributions on it

        ``find_distributions(entry, True)`` is used to find distributions
        corresponding to the path entry, and they are added.  `entry` is
        always appended to ``.entries``, even if it is already present.
        (This is because ``sys.path`` can contain the same value more than
        once, and the ``.entries`` of the ``sys.path`` WorkingSet should always
        equal ``sys.path``.)
        """
        self.entry_keys.setdefault(entry, [])
        self.entries.append(entry)
        for dist in find_distributions(entry, True):
            self.add(dist, entry, False)

    def __contains__(self,dist):
        """True if `dist` is the active distribution for its project"""
        return self.by_key.get(dist.key) == dist

    def find(self, req):
        """Find a distribution matching requirement `req`

        If there is an active distribution for the requested project, this
        returns it as long as it meets the version requirement specified by
        `req`.  But, if there is an active distribution for the project and it
        does *not* meet the `req` requirement, ``VersionConflict`` is raised.
        If there is no active distribution for the requested project, ``None``
        is returned.
        """
        dist = self.by_key.get(req.key)
        if dist is not None and dist not in req:
            raise VersionConflict(dist,req)     # XXX add more info
        else:
            return dist

    def iter_entry_points(self, group, name=None):
        """Yield entry point objects from `group` matching `name`

        If `name` is None, yields all entry points in `group` from all
        distributions in the working set, otherwise only ones matching
        both `group` and `name` are yielded (in distribution order).
        """
        for dist in self:
            entries = dist.get_entry_map(group)
            if name is None:
                for ep in entries.values():
                    yield ep
            elif name in entries:
                yield entries[name]

    def run_script(self, requires, script_name):
        """Locate distribution for `requires` and run `script_name` script"""
        ns = sys._getframe(1).f_globals
        name = ns['__name__']
        ns.clear()
        ns['__name__'] = name
        self.require(requires)[0].run_script(script_name, ns)

    def __iter__(self):
        """Yield distributions for non-duplicate projects in the working set

        The yield order is the order in which the items' path entries were
        added to the working set.
        """
        seen = {}
        for item in self.entries:
            if item not in self.entry_keys:
                # workaround a cache issue
                continue

            for key in self.entry_keys[item]:
                if key not in seen:
                    seen[key]=1
                    yield self.by_key[key]

    def add(self, dist, entry=None, insert=True, replace=False):
        """Add `dist` to working set, associated with `entry`

        If `entry` is unspecified, it defaults to the ``.location`` of `dist`.
        On exit from this routine, `entry` is added to the end of the working
        set's ``.entries`` (if it wasn't already present).

        `dist` is only added to the working set if it's for a project that
        doesn't already have a distribution in the set, unless `replace=True`.
        If it's added, any callbacks registered with the ``subscribe()`` method
        will be called.
        """
        if insert:
            dist.insert_on(self.entries, entry)

        if entry is None:
            entry = dist.location
        keys = self.entry_keys.setdefault(entry,[])
        keys2 = self.entry_keys.setdefault(dist.location,[])
        if not replace and dist.key in self.by_key:
            return      # ignore hidden distros

        self.by_key[dist.key] = dist
        if dist.key not in keys:
            keys.append(dist.key)
        if dist.key not in keys2:
            keys2.append(dist.key)
        self._added_new(dist)

    def resolve(self, requirements, env=None, installer=None,
            replace_conflicting=False):
        """List all distributions needed to (recursively) meet `requirements`

        `requirements` must be a sequence of ``Requirement`` objects.  `env`,
        if supplied, should be an ``Environment`` instance.  If
        not supplied, it defaults to all distributions available within any
        entry or distribution in the working set.  `installer`, if supplied,
        will be invoked with each requirement that cannot be met by an
        already-installed distribution; it should return a ``Distribution`` or
        ``None``.

        Unless `replace_conflicting=True`, raises a VersionConflict exception if
        any requirements are found on the path that have the correct name but
        the wrong version.  Otherwise, if an `installer` is supplied it will be
        invoked to obtain the correct version of the requirement and activate
        it.
        """

        requirements = list(requirements)[::-1]  # set up the stack
        processed = {}  # set of processed requirements
        best = {}  # key -> dist
        to_activate = []

        while requirements:
            req = requirements.pop(0)   # process dependencies breadth-first
            if req in processed:
                # Ignore cyclic or redundant dependencies
                continue
            dist = best.get(req.key)
            if dist is None:
                # Find the best distribution and add it to the map
                dist = self.by_key.get(req.key)
                if dist is None or (dist not in req and replace_conflicting):
                    ws = self
                    if env is None:
                        if dist is None:
                            env = Environment(self.entries)
                        else:
                            # Use an empty environment and workingset to avoid
                            # any further conflicts with the conflicting
                            # distribution
                            env = Environment([])
                            ws = WorkingSet([])
                    dist = best[req.key] = env.best_match(req, ws, installer)
                    if dist is None:
                        #msg = ("The '%s' distribution was not found on this "
                        #       "system, and is required by this application.")
                        #raise DistributionNotFound(msg % req)

                        # unfortunately, zc.buildout uses a str(err)
                        # to get the name of the distribution here..
                        raise DistributionNotFound(req)
                to_activate.append(dist)
            if dist not in req:
                # Oops, the "best" so far conflicts with a dependency
                raise VersionConflict(dist,req) # XXX put more info here
            requirements.extend(dist.requires(req.extras)[::-1])
            processed[req] = True

        return to_activate    # return list of distros to activate

    def find_plugins(self, plugin_env, full_env=None, installer=None,
            fallback=True):
        """Find all activatable distributions in `plugin_env`

        Example usage::

            distributions, errors = working_set.find_plugins(
                Environment(plugin_dirlist)
            )
            map(working_set.add, distributions)  # add plugins+libs to sys.path
            print 'Could not load', errors        # display errors

        The `plugin_env` should be an ``Environment`` instance that contains
        only distributions that are in the project's "plugin directory" or
        directories. The `full_env`, if supplied, should be an ``Environment``
        contains all currently-available distributions.  If `full_env` is not
        supplied, one is created automatically from the ``WorkingSet`` this
        method is called on, which will typically mean that every directory on
        ``sys.path`` will be scanned for distributions.

        `installer` is a standard installer callback as used by the
        ``resolve()`` method. The `fallback` flag indicates whether we should
        attempt to resolve older versions of a plugin if the newest version
        cannot be resolved.

        This method returns a 2-tuple: (`distributions`, `error_info`), where
        `distributions` is a list of the distributions found in `plugin_env`
        that were loadable, along with any other distributions that are needed
        to resolve their dependencies.  `error_info` is a dictionary mapping
        unloadable plugin distributions to an exception instance describing the
        error that occurred. Usually this will be a ``DistributionNotFound`` or
        ``VersionConflict`` instance.
        """

        plugin_projects = list(plugin_env)
        plugin_projects.sort()  # scan project names in alphabetic order

        error_info = {}
        distributions = {}

        if full_env is None:
            env = Environment(self.entries)
            env += plugin_env
        else:
            env = full_env + plugin_env

        shadow_set = self.__class__([])
        list(map(shadow_set.add, self))   # put all our entries in shadow_set

        for project_name in plugin_projects:

            for dist in plugin_env[project_name]:

                req = [dist.as_requirement()]

                try:
                    resolvees = shadow_set.resolve(req, env, installer)

                except ResolutionError:
                    v = sys.exc_info()[1]
                    error_info[dist] = v    # save error info
                    if fallback:
                        continue    # try the next older version of project
                    else:
                        break       # give up on this project, keep going

                else:
                    list(map(shadow_set.add, resolvees))
                    distributions.update(dict.fromkeys(resolvees))

                    # success, no need to try any more versions of this project
                    break

        distributions = list(distributions)
        distributions.sort()

        return distributions, error_info

    def require(self, *requirements):
        """Ensure that distributions matching `requirements` are activated

        `requirements` must be a string or a (possibly-nested) sequence
        thereof, specifying the distributions and versions required.  The
        return value is a sequence of the distributions that needed to be
        activated to fulfill the requirements; all relevant distributions are
        included, even if they were already activated in this working set.
        """
        needed = self.resolve(parse_requirements(requirements))

        for dist in needed:
            self.add(dist)

        return needed

    def subscribe(self, callback):
        """Invoke `callback` for all distributions (including existing ones)"""
        if callback in self.callbacks:
            return
        self.callbacks.append(callback)
        for dist in self:
            callback(dist)

    def _added_new(self, dist):
        for callback in self.callbacks:
            callback(dist)

    def __getstate__(self):
        return (
            self.entries[:], self.entry_keys.copy(), self.by_key.copy(),
            self.callbacks[:]
        )

    def __setstate__(self, e_k_b_c):
        entries, keys, by_key, callbacks = e_k_b_c
        self.entries = entries[:]
        self.entry_keys = keys.copy()
        self.by_key = by_key.copy()
        self.callbacks = callbacks[:]


class Environment(object):
    """Searchable snapshot of distributions on a search path"""

    def __init__(self, search_path=None, platform=get_supported_platform(), python=PY_MAJOR):
        """Snapshot distributions available on a search path

        Any distributions found on `search_path` are added to the environment.
        `search_path` should be a sequence of ``sys.path`` items.  If not
        supplied, ``sys.path`` is used.

        `platform` is an optional string specifying the name of the platform
        that platform-specific distributions must be compatible with.  If
        unspecified, it defaults to the current platform.  `python` is an
        optional string naming the desired version of Python (e.g. ``'3.3'``);
        it defaults to the current version.

        You may explicitly set `platform` (and/or `python`) to ``None`` if you
        wish to map *all* distributions, not just those compatible with the
        running platform or Python version.
        """
        self._distmap = {}
        self._cache = {}
        self.platform = platform
        self.python = python
        self.scan(search_path)

    def can_add(self, dist):
        """Is distribution `dist` acceptable for this environment?

        The distribution must match the platform and python version
        requirements specified when this environment was created, or False
        is returned.
        """
        return (self.python is None or dist.py_version is None
            or dist.py_version==self.python) \
            and compatible_platforms(dist.platform,self.platform)

    def remove(self, dist):
        """Remove `dist` from the environment"""
        self._distmap[dist.key].remove(dist)

    def scan(self, search_path=None):
        """Scan `search_path` for distributions usable in this environment

        Any distributions found are added to the environment.
        `search_path` should be a sequence of ``sys.path`` items.  If not
        supplied, ``sys.path`` is used.  Only distributions conforming to
        the platform/python version defined at initialization are added.
        """
        if search_path is None:
            search_path = sys.path

        for item in search_path:
            for dist in find_distributions(item):
                self.add(dist)

    def __getitem__(self,project_name):
        """Return a newest-to-oldest list of distributions for `project_name`
        """
        try:
            return self._cache[project_name]
        except KeyError:
            project_name = project_name.lower()
            if project_name not in self._distmap:
                return []

        if project_name not in self._cache:
            dists = self._cache[project_name] = self._distmap[project_name]
            _sort_dists(dists)

        return self._cache[project_name]

    def add(self,dist):
        """Add `dist` if we ``can_add()`` it and it isn't already added"""
        if self.can_add(dist) and dist.has_version():
            dists = self._distmap.setdefault(dist.key,[])
            if dist not in dists:
                dists.append(dist)
                if dist.key in self._cache:
                    _sort_dists(self._cache[dist.key])

    def best_match(self, req, working_set, installer=None):
        """Find distribution best matching `req` and usable on `working_set`

        This calls the ``find(req)`` method of the `working_set` to see if a
        suitable distribution is already active.  (This may raise
        ``VersionConflict`` if an unsuitable version of the project is already
        active in the specified `working_set`.)  If a suitable distribution
        isn't active, this method returns the newest distribution in the
        environment that meets the ``Requirement`` in `req`.  If no suitable
        distribution is found, and `installer` is supplied, then the result of
        calling the environment's ``obtain(req, installer)`` method will be
        returned.
        """
        dist = working_set.find(req)
        if dist is not None:
            return dist
        for dist in self[req.key]:
            if dist in req:
                return dist
        return self.obtain(req, installer) # try and download/install

    def obtain(self, requirement, installer=None):
        """Obtain a distribution matching `requirement` (e.g. via download)

        Obtain a distro that matches requirement (e.g. via download).  In the
        base ``Environment`` class, this routine just returns
        ``installer(requirement)``, unless `installer` is None, in which case
        None is returned instead.  This method is a hook that allows subclasses
        to attempt other ways of obtaining a distribution before falling back
        to the `installer` argument."""
        if installer is not None:
            return installer(requirement)

    def __iter__(self):
        """Yield the unique project names of the available distributions"""
        for key in self._distmap.keys():
            if self[key]: yield key

    def __iadd__(self, other):
        """In-place addition of a distribution or environment"""
        if isinstance(other,Distribution):
            self.add(other)
        elif isinstance(other,Environment):
            for project in other:
                for dist in other[project]:
                    self.add(dist)
        else:
            raise TypeError("Can't add %r to environment" % (other,))
        return self

    def __add__(self, other):
        """Add an environment or distribution to an environment"""
        new = self.__class__([], platform=None, python=None)
        for env in self, other:
            new += env
        return new


AvailableDistributions = Environment    # XXX backward compatibility


class ExtractionError(RuntimeError):
    """An error occurred extracting a resource

    The following attributes are available from instances of this exception:

    manager
        The resource manager that raised this exception

    cache_path
        The base directory for resource extraction

    original_error
        The exception instance that caused extraction to fail
    """


class ResourceManager:
    """Manage resource extraction and packages"""
    extraction_path = None

    def __init__(self):
        self.cached_files = {}

    def resource_exists(self, package_or_requirement, resource_name):
        """Does the named resource exist?"""
        return get_provider(package_or_requirement).has_resource(resource_name)

    def resource_isdir(self, package_or_requirement, resource_name):
        """Is the named resource an existing directory?"""
        return get_provider(package_or_requirement).resource_isdir(
            resource_name
        )

    def resource_filename(self, package_or_requirement, resource_name):
        """Return a true filesystem path for specified resource"""
        return get_provider(package_or_requirement).get_resource_filename(
            self, resource_name
        )

    def resource_stream(self, package_or_requirement, resource_name):
        """Return a readable file-like object for specified resource"""
        return get_provider(package_or_requirement).get_resource_stream(
            self, resource_name
        )

    def resource_string(self, package_or_requirement, resource_name):
        """Return specified resource as a string"""
        return get_provider(package_or_requirement).get_resource_string(
            self, resource_name
        )

    def resource_listdir(self, package_or_requirement, resource_name):
        """List the contents of the named resource directory"""
        return get_provider(package_or_requirement).resource_listdir(
            resource_name
        )

    def extraction_error(self):
        """Give an error message for problems extracting file(s)"""

        old_exc = sys.exc_info()[1]
        cache_path = self.extraction_path or get_default_cache()

        err = ExtractionError("""Can't extract file(s) to egg cache

The following error occurred while trying to extract file(s) to the Python egg
cache:

  %s

The Python egg cache directory is currently set to:

  %s

Perhaps your account does not have write access to this directory?  You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.
""" % (old_exc, cache_path)
        )
        err.manager = self
        err.cache_path = cache_path
        err.original_error = old_exc
        raise err

    def get_cache_path(self, archive_name, names=()):
        """Return absolute location in cache for `archive_name` and `names`

        The parent directory of the resulting path will be created if it does
        not already exist.  `archive_name` should be the base filename of the
        enclosing egg (which may not be the name of the enclosing zipfile!),
        including its ".egg" extension.  `names`, if provided, should be a
        sequence of path name parts "under" the egg's extraction location.

        This method should only be called by resource providers that need to
        obtain an extraction location, and only for names they intend to
        extract, as it tracks the generated names for possible cleanup later.
        """
        extract_path = self.extraction_path or get_default_cache()
        target_path = os.path.join(extract_path, archive_name+'-tmp', *names)
        try:
            _bypass_ensure_directory(target_path)
        except:
            self.extraction_error()

        self._warn_unsafe_extraction_path(extract_path)

        self.cached_files[target_path] = 1
        return target_path

    @staticmethod
    def _warn_unsafe_extraction_path(path):
        """
        If the default extraction path is overridden and set to an insecure
        location, such as /tmp, it opens up an opportunity for an attacker to
        replace an extracted file with an unauthorized payload. Warn the user
        if a known insecure location is used.

        See Distribute #375 for more details.
        """
        if os.name == 'nt' and not path.startswith(os.environ['windir']):
            # On Windows, permissions are generally restrictive by default
            #  and temp directories are not writable by other users, so
            #  bypass the warning.
            return
        mode = os.stat(path).st_mode
        if mode & stat.S_IWOTH or mode & stat.S_IWGRP:
            msg = ("%s is writable by group/others and vulnerable to attack "
                "when "
                "used with get_resource_filename. Consider a more secure "
                "location (set with .set_extraction_path or the "
                "PYTHON_EGG_CACHE environment variable)." % path)
            warnings.warn(msg, UserWarning)

    def postprocess(self, tempname, filename):
        """Perform any platform-specific postprocessing of `tempname`

        This is where Mac header rewrites should be done; other platforms don't
        have anything special they should do.

        Resource providers should call this method ONLY after successfully
        extracting a compressed resource.  They must NOT call it on resources
        that are already in the filesystem.

        `tempname` is the current (temporary) name of the file, and `filename`
        is the name it will be renamed to by the caller after this routine
        returns.
        """

        if os.name == 'posix':
            # Make the resource executable
            mode = ((os.stat(tempname).st_mode) | 0x16D) & 0xFFF # 0555, 07777
            os.chmod(tempname, mode)

    def set_extraction_path(self, path):
        """Set the base path where resources will be extracted to, if needed.

        If you do not call this routine before any extractions take place, the
        path defaults to the return value of ``get_default_cache()``.  (Which
        is based on the ``PYTHON_EGG_CACHE`` environment variable, with various
        platform-specific fallbacks.  See that routine's documentation for more
        details.)

        Resources are extracted to subdirectories of this path based upon
        information given by the ``IResourceProvider``.  You may set this to a
        temporary directory, but then you must call ``cleanup_resources()`` to
        delete the extracted files when done.  There is no guarantee that
        ``cleanup_resources()`` will be able to remove all extracted files.

        (Note: you may not change the extraction path for a given resource
        manager once resources have been extracted, unless you first call
        ``cleanup_resources()``.)
        """
        if self.cached_files:
            raise ValueError(
                "Can't change extraction path, files already extracted"
            )

        self.extraction_path = path

    def cleanup_resources(self, force=False):
        """
        Delete all extracted resource files and directories, returning a list
        of the file and directory names that could not be successfully removed.
        This function does not have any concurrency protection, so it should
        generally only be called when the extraction path is a temporary
        directory exclusive to a single process.  This method is not
        automatically called; you must call it explicitly or register it as an
        ``atexit`` function if you wish to ensure cleanup of a temporary
        directory used for extractions.
        """
        # XXX

def get_default_cache():
    """Determine the default cache location

    This returns the ``PYTHON_EGG_CACHE`` environment variable, if set.
    Otherwise, on Windows, it returns a "Python-Eggs" subdirectory of the
    "Application Data" directory.  On all other systems, it's "~/.python-eggs".
    """
    try:
        return os.environ['PYTHON_EGG_CACHE']
    except KeyError:
        pass

    if os.name!='nt':
        return os.path.expanduser('~/.python-eggs')

    app_data = 'Application Data'   # XXX this may be locale-specific!
    app_homes = [
        (('APPDATA',), None),       # best option, should be locale-safe
        (('USERPROFILE',), app_data),
        (('HOMEDRIVE','HOMEPATH'), app_data),
        (('HOMEPATH',), app_data),
        (('HOME',), None),
        (('WINDIR',), app_data),    # 95/98/ME
    ]

    for keys, subdir in app_homes:
        dirname = ''
        for key in keys:
            if key in os.environ:
                dirname = os.path.join(dirname, os.environ[key])
            else:
                break
        else:
            if subdir:
                dirname = os.path.join(dirname,subdir)
            return os.path.join(dirname, 'Python-Eggs')
    else:
        raise RuntimeError(
            "Please set the PYTHON_EGG_CACHE enviroment variable"
        )

def safe_name(name):
    """Convert an arbitrary string to a standard distribution name

    Any runs of non-alphanumeric/. characters are replaced with a single '-'.
    """
    return re.sub('[^A-Za-z0-9.]+', '-', name)


def safe_version(version):
    """Convert an arbitrary string to a standard version string

    Spaces become dots, and all other non-alphanumeric characters become
    dashes, with runs of multiple dashes condensed to a single dash.
    """
    version = version.replace(' ','.')
    return re.sub('[^A-Za-z0-9.]+', '-', version)


def safe_extra(extra):
    """Convert an arbitrary string to a standard 'extra' name

    Any runs of non-alphanumeric characters are replaced with a single '_',
    and the result is always lowercased.
    """
    return re.sub('[^A-Za-z0-9.]+', '_', extra).lower()


def to_filename(name):
    """Convert a project or version name to its filename-escaped form

    Any '-' characters are currently replaced with '_'.
    """
    return name.replace('-','_')


class MarkerEvaluation(object):
    values = {
        'os_name': lambda: os.name,
        'sys_platform': lambda: sys.platform,
        'python_full_version': lambda: sys.version.split()[0],
        'python_version': lambda:'%s.%s' % (sys.version_info[0], sys.version_info[1]),
        'platform_version': platform.version,
        'platform_machine': platform.machine,
        'python_implementation': platform.python_implementation,
    }

    @classmethod
    def is_invalid_marker(cls, text):
        """
        Validate text as a PEP 426 environment marker; return an exception
        if invalid or False otherwise.
        """
        try:
            cls.evaluate_marker(text)
        except SyntaxError:
            return cls.normalize_exception(sys.exc_info()[1])
        return False

    @staticmethod
    def normalize_exception(exc):
        """
        Given a SyntaxError from a marker evaluation, normalize the error message:
         - Remove indications of filename and line number.
         - Replace platform-specific error messages with standard error messages.
        """
        subs = {
            'unexpected EOF while parsing': 'invalid syntax',
            'parenthesis is never closed': 'invalid syntax',
        }
        exc.filename = None
        exc.lineno = None
        exc.msg = subs.get(exc.msg, exc.msg)
        return exc

    @classmethod
    def and_test(cls, nodelist):
        # MUST NOT short-circuit evaluation, or invalid syntax can be skipped!
        return functools.reduce(operator.and_, [cls.interpret(nodelist[i]) for i in range(1,len(nodelist),2)])

    @classmethod
    def test(cls, nodelist):
        # MUST NOT short-circuit evaluation, or invalid syntax can be skipped!
        return functools.reduce(operator.or_, [cls.interpret(nodelist[i]) for i in range(1,len(nodelist),2)])

    @classmethod
    def atom(cls, nodelist):
        t = nodelist[1][0]
        if t == token.LPAR:
            if nodelist[2][0] == token.RPAR:
                raise SyntaxError("Empty parentheses")
            return cls.interpret(nodelist[2])
        raise SyntaxError("Language feature not supported in environment markers")

    @classmethod
    def comparison(cls, nodelist):
        if len(nodelist)>4:
            raise SyntaxError("Chained comparison not allowed in environment markers")
        comp = nodelist[2][1]
        cop = comp[1]
        if comp[0] == token.NAME:
            if len(nodelist[2]) == 3:
                if cop == 'not':
                    cop = 'not in'
                else:
                    cop = 'is not'
        try:
            cop = cls.get_op(cop)
        except KeyError:
            raise SyntaxError(repr(cop)+" operator not allowed in environment markers")
        return cop(cls.evaluate(nodelist[1]), cls.evaluate(nodelist[3]))

    @classmethod
    def get_op(cls, op):
        ops = {
            symbol.test: cls.test,
            symbol.and_test: cls.and_test,
            symbol.atom: cls.atom,
            symbol.comparison: cls.comparison,
            'not in': lambda x, y: x not in y,
            'in': lambda x, y: x in y,
            '==': operator.eq,
            '!=': operator.ne,
        }
        if hasattr(symbol, 'or_test'):
            ops[symbol.or_test] = cls.test
        return ops[op]

    @classmethod
    def evaluate_marker(cls, text, extra=None):
        """
        Evaluate a PEP 426 environment marker on CPython 2.4+.
        Return a boolean indicating the marker result in this environment.
        Raise SyntaxError if marker is invalid.

        This implementation uses the 'parser' module, which is not implemented on
        Jython and has been superseded by the 'ast' module in Python 2.6 and
        later.
        """
        return cls.interpret(parser.expr(text).totuple(1)[1])

    @classmethod
    def _markerlib_evaluate(cls, text):
        """
        Evaluate a PEP 426 environment marker using markerlib.
        Return a boolean indicating the marker result in this environment.
        Raise SyntaxError if marker is invalid.
        """
        from pip._vendor import _markerlib
        # markerlib implements Metadata 1.2 (PEP 345) environment markers.
        # Translate the variables to Metadata 2.0 (PEP 426).
        env = _markerlib.default_environment()
        for key in env.keys():
            new_key = key.replace('.', '_')
            env[new_key] = env.pop(key)
        try:
            result = _markerlib.interpret(text, env)
        except NameError:
            e = sys.exc_info()[1]
            raise SyntaxError(e.args[0])
        return result

    if 'parser' not in globals():
        # Fall back to less-complete _markerlib implementation if 'parser' module
        # is not available.
        evaluate_marker = _markerlib_evaluate

    @classmethod
    def interpret(cls, nodelist):
        while len(nodelist)==2: nodelist = nodelist[1]
        try:
            op = cls.get_op(nodelist[0])
        except KeyError:
            raise SyntaxError("Comparison or logical expression expected")
        return op(nodelist)

    @classmethod
    def evaluate(cls, nodelist):
        while len(nodelist)==2: nodelist = nodelist[1]
        kind = nodelist[0]
        name = nodelist[1]
        if kind==token.NAME:
            try:
                op = cls.values[name]
            except KeyError:
                raise SyntaxError("Unknown name %r" % name)
            return op()
        if kind==token.STRING:
            s = nodelist[1]
            if s[:1] not in "'\"" or s.startswith('"""') or s.startswith("'''") \
                    or '\\' in s:
                raise SyntaxError(
                    "Only plain strings allowed in environment markers")
            return s[1:-1]
        raise SyntaxError("Language feature not supported in environment markers")

invalid_marker = MarkerEvaluation.is_invalid_marker
evaluate_marker = MarkerEvaluation.evaluate_marker

class NullProvider:
    """Try to implement resources and metadata for arbitrary PEP 302 loaders"""

    egg_name = None
    egg_info = None
    loader = None

    def __init__(self, module):
        self.loader = getattr(module, '__loader__', None)
        self.module_path = os.path.dirname(getattr(module, '__file__', ''))

    def get_resource_filename(self, manager, resource_name):
        return self._fn(self.module_path, resource_name)

    def get_resource_stream(self, manager, resource_name):
        return BytesIO(self.get_resource_string(manager, resource_name))

    def get_resource_string(self, manager, resource_name):
        return self._get(self._fn(self.module_path, resource_name))

    def has_resource(self, resource_name):
        return self._has(self._fn(self.module_path, resource_name))

    def has_metadata(self, name):
        return self.egg_info and self._has(self._fn(self.egg_info,name))

    if sys.version_info <= (3,):
        def get_metadata(self, name):
            if not self.egg_info:
                return ""
            return self._get(self._fn(self.egg_info,name))
    else:
        def get_metadata(self, name):
            if not self.egg_info:
                return ""
            return self._get(self._fn(self.egg_info,name)).decode("utf-8")

    def get_metadata_lines(self, name):
        return yield_lines(self.get_metadata(name))

    def resource_isdir(self,resource_name):
        return self._isdir(self._fn(self.module_path, resource_name))

    def metadata_isdir(self,name):
        return self.egg_info and self._isdir(self._fn(self.egg_info,name))

    def resource_listdir(self,resource_name):
        return self._listdir(self._fn(self.module_path,resource_name))

    def metadata_listdir(self,name):
        if self.egg_info:
            return self._listdir(self._fn(self.egg_info,name))
        return []

    def run_script(self,script_name,namespace):
        script = 'scripts/'+script_name
        if not self.has_metadata(script):
            raise ResolutionError("No script named %r" % script_name)
        script_text = self.get_metadata(script).replace('\r\n','\n')
        script_text = script_text.replace('\r','\n')
        script_filename = self._fn(self.egg_info,script)
        namespace['__file__'] = script_filename
        if os.path.exists(script_filename):
            execfile(script_filename, namespace, namespace)
        else:
            from linecache import cache
            cache[script_filename] = (
                len(script_text), 0, script_text.split('\n'), script_filename
            )
            script_code = compile(script_text,script_filename,'exec')
            exec(script_code, namespace, namespace)

    def _has(self, path):
        raise NotImplementedError(
            "Can't perform this operation for unregistered loader type"
        )

    def _isdir(self, path):
        raise NotImplementedError(
            "Can't perform this operation for unregistered loader type"
        )

    def _listdir(self, path):
        raise NotImplementedError(
            "Can't perform this operation for unregistered loader type"
        )

    def _fn(self, base, resource_name):
        if resource_name:
            return os.path.join(base, *resource_name.split('/'))
        return base

    def _get(self, path):
        if hasattr(self.loader, 'get_data'):
            return self.loader.get_data(path)
        raise NotImplementedError(
            "Can't perform this operation for loaders without 'get_data()'"
        )

register_loader_type(object, NullProvider)


class EggProvider(NullProvider):
    """Provider based on a virtual filesystem"""

    def __init__(self,module):
        NullProvider.__init__(self,module)
        self._setup_prefix()

    def _setup_prefix(self):
        # we assume here that our metadata may be nested inside a "basket"
        # of multiple eggs; that's why we use module_path instead of .archive
        path = self.module_path
        old = None
        while path!=old:
            if path.lower().endswith('.egg'):
                self.egg_name = os.path.basename(path)
                self.egg_info = os.path.join(path, 'EGG-INFO')
                self.egg_root = path
                break
            old = path
            path, base = os.path.split(path)

class DefaultProvider(EggProvider):
    """Provides access to package resources in the filesystem"""

    def _has(self, path):
        return os.path.exists(path)

    def _isdir(self,path):
        return os.path.isdir(path)

    def _listdir(self,path):
        return os.listdir(path)

    def get_resource_stream(self, manager, resource_name):
        return open(self._fn(self.module_path, resource_name), 'rb')

    def _get(self, path):
        stream = open(path, 'rb')
        try:
            return stream.read()
        finally:
            stream.close()

register_loader_type(type(None), DefaultProvider)

if importlib_bootstrap is not None:
    register_loader_type(importlib_bootstrap.SourceFileLoader, DefaultProvider)


class EmptyProvider(NullProvider):
    """Provider that returns nothing for all requests"""

    _isdir = _has = lambda self,path: False
    _get = lambda self,path: ''
    _listdir = lambda self,path: []
    module_path = None

    def __init__(self):
        pass

empty_provider = EmptyProvider()


def build_zipmanifest(path):
    """
    This builds a similar dictionary to the zipimport directory
    caches.  However instead of tuples, ZipInfo objects are stored.

    The translation of the tuple is as follows:
      * [0] - zipinfo.filename on stock pythons this needs "/" --> os.sep
              on pypy it is the same (one reason why distribute did work
              in some cases on pypy and win32).
      * [1] - zipinfo.compress_type
      * [2] - zipinfo.compress_size
      * [3] - zipinfo.file_size
      * [4] - len(utf-8 encoding of filename) if zipinfo & 0x800
              len(ascii encoding of filename) otherwise
      * [5] - (zipinfo.date_time[0] - 1980) << 9 |
               zipinfo.date_time[1] << 5 | zipinfo.date_time[2]
      * [6] - (zipinfo.date_time[3] - 1980) << 11 |
               zipinfo.date_time[4] << 5 | (zipinfo.date_time[5] // 2)
      * [7] - zipinfo.CRC
    """
    zipinfo = dict()
    zfile = zipfile.ZipFile(path)
    #Got ZipFile has not __exit__ on python 3.1
    try:
        for zitem in zfile.namelist():
            zpath = zitem.replace('/', os.sep)
            zipinfo[zpath] = zfile.getinfo(zitem)
            assert zipinfo[zpath] is not None
    finally:
        zfile.close()
    return zipinfo


class ZipProvider(EggProvider):
    """Resource support for zips and eggs"""

    eagers = None

    def __init__(self, module):
        EggProvider.__init__(self,module)
        self.zipinfo = build_zipmanifest(self.loader.archive)
        self.zip_pre = self.loader.archive+os.sep

    def _zipinfo_name(self, fspath):
        # Convert a virtual filename (full path to file) into a zipfile subpath
        # usable with the zipimport directory cache for our target archive
        if fspath.startswith(self.zip_pre):
            return fspath[len(self.zip_pre):]
        raise AssertionError(
            "%s is not a subpath of %s" % (fspath,self.zip_pre)
        )

    def _parts(self,zip_path):
        # Convert a zipfile subpath into an egg-relative path part list
        fspath = self.zip_pre+zip_path  # pseudo-fs path
        if fspath.startswith(self.egg_root+os.sep):
            return fspath[len(self.egg_root)+1:].split(os.sep)
        raise AssertionError(
            "%s is not a subpath of %s" % (fspath,self.egg_root)
        )

    def get_resource_filename(self, manager, resource_name):
        if not self.egg_name:
            raise NotImplementedError(
                "resource_filename() only supported for .egg, not .zip"
            )
        # no need to lock for extraction, since we use temp names
        zip_path = self._resource_to_zip(resource_name)
        eagers = self._get_eager_resources()
        if '/'.join(self._parts(zip_path)) in eagers:
            for name in eagers:
                self._extract_resource(manager, self._eager_to_zip(name))
        return self._extract_resource(manager, zip_path)

    @staticmethod
    def _get_date_and_size(zip_stat):
        size = zip_stat.file_size
        date_time = zip_stat.date_time + (0, 0, -1)  # ymdhms+wday, yday, dst
        #1980 offset already done
        timestamp = time.mktime(date_time)
        return timestamp, size

    def _extract_resource(self, manager, zip_path):

        if zip_path in self._index():
            for name in self._index()[zip_path]:
                last = self._extract_resource(
                    manager, os.path.join(zip_path, name)
                )
            return os.path.dirname(last)  # return the extracted directory name

        timestamp, size = self._get_date_and_size(self.zipinfo[zip_path])

        if not WRITE_SUPPORT:
            raise IOError('"os.rename" and "os.unlink" are not supported '
                          'on this platform')
        try:

            real_path = manager.get_cache_path(
                self.egg_name, self._parts(zip_path)
            )

            if self._is_current(real_path, zip_path):
                return real_path

            outf, tmpnam = _mkstemp(".$extract", dir=os.path.dirname(real_path))
            os.write(outf, self.loader.get_data(zip_path))
            os.close(outf)
            utime(tmpnam, (timestamp,timestamp))
            manager.postprocess(tmpnam, real_path)

            try:
                rename(tmpnam, real_path)

            except os.error:
                if os.path.isfile(real_path):
                    if self._is_current(real_path, zip_path):
                        # the file became current since it was checked above,
                        #  so proceed.
                        return real_path
                    elif os.name=='nt':     # Windows, del old file and retry
                        unlink(real_path)
                        rename(tmpnam, real_path)
                        return real_path
                raise

        except os.error:
            manager.extraction_error()  # report a user-friendly error

        return real_path

    def _is_current(self, file_path, zip_path):
        """
        Return True if the file_path is current for this zip_path
        """
        timestamp, size = self._get_date_and_size(self.zipinfo[zip_path])
        if not os.path.isfile(file_path):
            return False
        stat = os.stat(file_path)
        if stat.st_size!=size or stat.st_mtime!=timestamp:
            return False
        # check that the contents match
        zip_contents = self.loader.get_data(zip_path)
        f = open(file_path, 'rb')
        file_contents = f.read()
        f.close()
        return zip_contents == file_contents

    def _get_eager_resources(self):
        if self.eagers is None:
            eagers = []
            for name in ('native_libs.txt', 'eager_resources.txt'):
                if self.has_metadata(name):
                    eagers.extend(self.get_metadata_lines(name))
            self.eagers = eagers
        return self.eagers

    def _index(self):
        try:
            return self._dirindex
        except AttributeError:
            ind = {}
            for path in self.zipinfo:
                parts = path.split(os.sep)
                while parts:
                    parent = os.sep.join(parts[:-1])
                    if parent in ind:
                        ind[parent].append(parts[-1])
                        break
                    else:
                        ind[parent] = [parts.pop()]
            self._dirindex = ind
            return ind

    def _has(self, fspath):
        zip_path = self._zipinfo_name(fspath)
        return zip_path in self.zipinfo or zip_path in self._index()

    def _isdir(self,fspath):
        return self._zipinfo_name(fspath) in self._index()

    def _listdir(self,fspath):
        return list(self._index().get(self._zipinfo_name(fspath), ()))

    def _eager_to_zip(self,resource_name):
        return self._zipinfo_name(self._fn(self.egg_root,resource_name))

    def _resource_to_zip(self,resource_name):
        return self._zipinfo_name(self._fn(self.module_path,resource_name))

register_loader_type(zipimport.zipimporter, ZipProvider)


class FileMetadata(EmptyProvider):
    """Metadata handler for standalone PKG-INFO files

    Usage::

        metadata = FileMetadata("/path/to/PKG-INFO")

    This provider rejects all data and metadata requests except for PKG-INFO,
    which is treated as existing, and will be the contents of the file at
    the provided location.
    """

    def __init__(self,path):
        self.path = path

    def has_metadata(self,name):
        return name=='PKG-INFO'

    def get_metadata(self,name):
        if name=='PKG-INFO':
            f = open(self.path,'rU')
            metadata = f.read()
            f.close()
            return metadata
        raise KeyError("No metadata except PKG-INFO is available")

    def get_metadata_lines(self,name):
        return yield_lines(self.get_metadata(name))


class PathMetadata(DefaultProvider):
    """Metadata provider for egg directories

    Usage::

        # Development eggs:

        egg_info = "/path/to/PackageName.egg-info"
        base_dir = os.path.dirname(egg_info)
        metadata = PathMetadata(base_dir, egg_info)
        dist_name = os.path.splitext(os.path.basename(egg_info))[0]
        dist = Distribution(basedir,project_name=dist_name,metadata=metadata)

        # Unpacked egg directories:

        egg_path = "/path/to/PackageName-ver-pyver-etc.egg"
        metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO'))
        dist = Distribution.from_filename(egg_path, metadata=metadata)
    """

    def __init__(self, path, egg_info):
        self.module_path = path
        self.egg_info = egg_info


class EggMetadata(ZipProvider):
    """Metadata provider for .egg files"""

    def __init__(self, importer):
        """Create a metadata provider from a zipimporter"""

        self.zipinfo = build_zipmanifest(importer.archive)
        self.zip_pre = importer.archive+os.sep
        self.loader = importer
        if importer.prefix:
            self.module_path = os.path.join(importer.archive, importer.prefix)
        else:
            self.module_path = importer.archive
        self._setup_prefix()

_declare_state('dict', _distribution_finders = {})

def register_finder(importer_type, distribution_finder):
    """Register `distribution_finder` to find distributions in sys.path items

    `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
    handler), and `distribution_finder` is a callable that, passed a path
    item and the importer instance, yields ``Distribution`` instances found on
    that path item.  See ``pkg_resources.find_on_path`` for an example."""
    _distribution_finders[importer_type] = distribution_finder


def find_distributions(path_item, only=False):
    """Yield distributions accessible via `path_item`"""
    importer = get_importer(path_item)
    finder = _find_adapter(_distribution_finders, importer)
    return finder(importer, path_item, only)

def find_eggs_in_zip(importer, path_item, only=False):
    """
    Find eggs in zip files; possibly multiple nested eggs.
    """
    if importer.archive.endswith('.whl'):
        # wheels are not supported with this finder
        # they don't have PKG-INFO metadata, and won't ever contain eggs
        return
    metadata = EggMetadata(importer)
    if metadata.has_metadata('PKG-INFO'):
        yield Distribution.from_filename(path_item, metadata=metadata)
    if only:
        return  # don't yield nested distros
    for subitem in metadata.resource_listdir('/'):
        if subitem.endswith('.egg'):
            subpath = os.path.join(path_item, subitem)
            for dist in find_eggs_in_zip(zipimport.zipimporter(subpath), subpath):
                yield dist

register_finder(zipimport.zipimporter, find_eggs_in_zip)

def find_nothing(importer, path_item, only=False):
    return ()
register_finder(object,find_nothing)

def find_on_path(importer, path_item, only=False):
    """Yield distributions accessible on a sys.path directory"""
    path_item = _normalize_cached(path_item)

    if os.path.isdir(path_item) and os.access(path_item, os.R_OK):
        if path_item.lower().endswith('.egg'):
            # unpacked egg
            yield Distribution.from_filename(
                path_item, metadata=PathMetadata(
                    path_item, os.path.join(path_item,'EGG-INFO')
                )
            )
        else:
            # scan for .egg and .egg-info in directory
            for entry in os.listdir(path_item):
                lower = entry.lower()
                if lower.endswith('.egg-info') or lower.endswith('.dist-info'):
                    fullpath = os.path.join(path_item, entry)
                    if os.path.isdir(fullpath):
                        # egg-info directory, allow getting metadata
                        metadata = PathMetadata(path_item, fullpath)
                    else:
                        metadata = FileMetadata(fullpath)
                    yield Distribution.from_location(
                        path_item,entry,metadata,precedence=DEVELOP_DIST
                    )
                elif not only and lower.endswith('.egg'):
                    for dist in find_distributions(os.path.join(path_item, entry)):
                        yield dist
                elif not only and lower.endswith('.egg-link'):
                    entry_file = open(os.path.join(path_item, entry))
                    try:
                        entry_lines = entry_file.readlines()
                    finally:
                        entry_file.close()
                    for line in entry_lines:
                        if not line.strip(): continue
                        for item in find_distributions(os.path.join(path_item,line.rstrip())):
                            yield item
                        break
register_finder(pkgutil.ImpImporter,find_on_path)

if importlib_bootstrap is not None:
    register_finder(importlib_bootstrap.FileFinder, find_on_path)

_declare_state('dict', _namespace_handlers={})
_declare_state('dict', _namespace_packages={})


def register_namespace_handler(importer_type, namespace_handler):
    """Register `namespace_handler` to declare namespace packages

    `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
    handler), and `namespace_handler` is a callable like this::

        def namespace_handler(importer,path_entry,moduleName,module):
            # return a path_entry to use for child packages

    Namespace handlers are only called if the importer object has already
    agreed that it can handle the relevant path item, and they should only
    return a subpath if the module __path__ does not already contain an
    equivalent subpath.  For an example namespace handler, see
    ``pkg_resources.file_ns_handler``.
    """
    _namespace_handlers[importer_type] = namespace_handler

def _handle_ns(packageName, path_item):
    """Ensure that named package includes a subpath of path_item (if needed)"""

    importer = get_importer(path_item)
    if importer is None:
        return None
    loader = importer.find_module(packageName)
    if loader is None:
        return None
    module = sys.modules.get(packageName)
    if module is None:
        module = sys.modules[packageName] = imp.new_module(packageName)
        module.__path__ = []
        _set_parent_ns(packageName)
    elif not hasattr(module,'__path__'):
        raise TypeError("Not a package:", packageName)
    handler = _find_adapter(_namespace_handlers, importer)
    subpath = handler(importer, path_item, packageName, module)
    if subpath is not None:
        path = module.__path__
        path.append(subpath)
        loader.load_module(packageName)
        for path_item in path:
            if path_item not in module.__path__:
                module.__path__.append(path_item)
    return subpath

def declare_namespace(packageName):
    """Declare that package 'packageName' is a namespace package"""

    imp.acquire_lock()
    try:
        if packageName in _namespace_packages:
            return

        path, parent = sys.path, None
        if '.' in packageName:
            parent = '.'.join(packageName.split('.')[:-1])
            declare_namespace(parent)
            if parent not in _namespace_packages:
                __import__(parent)
            try:
                path = sys.modules[parent].__path__
            except AttributeError:
                raise TypeError("Not a package:", parent)

        # Track what packages are namespaces, so when new path items are added,
        # they can be updated
        _namespace_packages.setdefault(parent,[]).append(packageName)
        _namespace_packages.setdefault(packageName,[])

        for path_item in path:
            # Ensure all the parent's path items are reflected in the child,
            # if they apply
            _handle_ns(packageName, path_item)

    finally:
        imp.release_lock()

def fixup_namespace_packages(path_item, parent=None):
    """Ensure that previously-declared namespace packages include path_item"""
    imp.acquire_lock()
    try:
        for package in _namespace_packages.get(parent,()):
            subpath = _handle_ns(package, path_item)
            if subpath: fixup_namespace_packages(subpath,package)
    finally:
        imp.release_lock()

def file_ns_handler(importer, path_item, packageName, module):
    """Compute an ns-package subpath for a filesystem or zipfile importer"""

    subpath = os.path.join(path_item, packageName.split('.')[-1])
    normalized = _normalize_cached(subpath)
    for item in module.__path__:
        if _normalize_cached(item)==normalized:
            break
    else:
        # Only return the path if it's not already there
        return subpath

register_namespace_handler(pkgutil.ImpImporter,file_ns_handler)
register_namespace_handler(zipimport.zipimporter,file_ns_handler)

if importlib_bootstrap is not None:
    register_namespace_handler(importlib_bootstrap.FileFinder, file_ns_handler)


def null_ns_handler(importer, path_item, packageName, module):
    return None

register_namespace_handler(object,null_ns_handler)


def normalize_path(filename):
    """Normalize a file/dir name for comparison purposes"""
    return os.path.normcase(os.path.realpath(filename))

def _normalize_cached(filename,_cache={}):
    try:
        return _cache[filename]
    except KeyError:
        _cache[filename] = result = normalize_path(filename)
        return result

def _set_parent_ns(packageName):
    parts = packageName.split('.')
    name = parts.pop()
    if parts:
        parent = '.'.join(parts)
        setattr(sys.modules[parent], name, sys.modules[packageName])


def yield_lines(strs):
    """Yield non-empty/non-comment lines of a ``basestring`` or sequence"""
    if isinstance(strs,basestring):
        for s in strs.splitlines():
            s = s.strip()
            if s and not s.startswith('#'):     # skip blank lines/comments
                yield s
    else:
        for ss in strs:
            for s in yield_lines(ss):
                yield s

LINE_END = re.compile(r"\s*(#.*)?$").match         # whitespace and comment
CONTINUE = re.compile(r"\s*\\\s*(#.*)?$").match    # line continuation
DISTRO = re.compile(r"\s*((\w|[-.])+)").match    # Distribution or extra
VERSION = re.compile(r"\s*(<=?|>=?|==|!=)\s*((\w|[-.])+)").match  # ver. info
COMMA = re.compile(r"\s*,").match               # comma between items
OBRACKET = re.compile(r"\s*\[").match
CBRACKET = re.compile(r"\s*\]").match
MODULE = re.compile(r"\w+(\.\w+)*$").match
EGG_NAME = re.compile(
    r"(?P<name>[^-]+)"
    r"( -(?P<ver>[^-]+) (-py(?P<pyver>[^-]+) (-(?P<plat>.+))? )? )?",
    re.VERBOSE | re.IGNORECASE
).match

component_re = re.compile(r'(\d+ | [a-z]+ | \.| -)', re.VERBOSE)
replace = {'pre':'c', 'preview':'c','-':'final-','rc':'c','dev':'@'}.get

def _parse_version_parts(s):
    for part in component_re.split(s):
        part = replace(part,part)
        if not part or part=='.':
            continue
        if part[:1] in '0123456789':
            yield part.zfill(8)    # pad for numeric comparison
        else:
            yield '*'+part

    yield '*final'  # ensure that alpha/beta/candidate are before final

def parse_version(s):
    """Convert a version string to a chronologically-sortable key

    This is a rough cross between distutils' StrictVersion and LooseVersion;
    if you give it versions that would work with StrictVersion, then it behaves
    the same; otherwise it acts like a slightly-smarter LooseVersion. It is
    *possible* to create pathological version coding schemes that will fool
    this parser, but they should be very rare in practice.

    The returned value will be a tuple of strings.  Numeric portions of the
    version are padded to 8 digits so they will compare numerically, but
    without relying on how numbers compare relative to strings.  Dots are
    dropped, but dashes are retained.  Trailing zeros between alpha segments
    or dashes are suppressed, so that e.g. "2.4.0" is considered the same as
    "2.4". Alphanumeric parts are lower-cased.

    The algorithm assumes that strings like "-" and any alpha string that
    alphabetically follows "final"  represents a "patch level".  So, "2.4-1"
    is assumed to be a branch or patch of "2.4", and therefore "2.4.1" is
    considered newer than "2.4-1", which in turn is newer than "2.4".

    Strings like "a", "b", "c", "alpha", "beta", "candidate" and so on (that
    come before "final" alphabetically) are assumed to be pre-release versions,
    so that the version "2.4" is considered newer than "2.4a1".

    Finally, to handle miscellaneous cases, the strings "pre", "preview", and
    "rc" are treated as if they were "c", i.e. as though they were release
    candidates, and therefore are not as new as a version string that does not
    contain them, and "dev" is replaced with an '@' so that it sorts lower than
    than any other pre-release tag.
    """
    parts = []
    for part in _parse_version_parts(s.lower()):
        if part.startswith('*'):
            if part<'*final':   # remove '-' before a prerelease tag
                while parts and parts[-1]=='*final-': parts.pop()
            # remove trailing zeros from each series of numeric parts
            while parts and parts[-1]=='00000000':
                parts.pop()
        parts.append(part)
    return tuple(parts)
class EntryPoint(object):
    """Object representing an advertised importable object"""

    def __init__(self, name, module_name, attrs=(), extras=(), dist=None):
        if not MODULE(module_name):
            raise ValueError("Invalid module name", module_name)
        self.name = name
        self.module_name = module_name
        self.attrs = tuple(attrs)
        self.extras = Requirement.parse(("x[%s]" % ','.join(extras))).extras
        self.dist = dist

    def __str__(self):
        s = "%s = %s" % (self.name, self.module_name)
        if self.attrs:
            s += ':' + '.'.join(self.attrs)
        if self.extras:
            s += ' [%s]' % ','.join(self.extras)
        return s

    def __repr__(self):
        return "EntryPoint.parse(%r)" % str(self)

    def load(self, require=True, env=None, installer=None):
        if require: self.require(env, installer)
        entry = __import__(self.module_name, globals(),globals(), ['__name__'])
        for attr in self.attrs:
            try:
                entry = getattr(entry,attr)
            except AttributeError:
                raise ImportError("%r has no %r attribute" % (entry,attr))
        return entry

    def require(self, env=None, installer=None):
        if self.extras and not self.dist:
            raise UnknownExtra("Can't require() without a distribution", self)
        list(map(working_set.add,
            working_set.resolve(self.dist.requires(self.extras),env,installer)))

    @classmethod
    def parse(cls, src, dist=None):
        """Parse a single entry point from string `src`

        Entry point syntax follows the form::

            name = some.module:some.attr [extra1,extra2]

        The entry name and module name are required, but the ``:attrs`` and
        ``[extras]`` parts are optional
        """
        try:
            attrs = extras = ()
            name,value = src.split('=',1)
            if '[' in value:
                value,extras = value.split('[',1)
                req = Requirement.parse("x["+extras)
                if req.specs: raise ValueError
                extras = req.extras
            if ':' in value:
                value,attrs = value.split(':',1)
                if not MODULE(attrs.rstrip()):
                    raise ValueError
                attrs = attrs.rstrip().split('.')
        except ValueError:
            raise ValueError(
                "EntryPoint must be in 'name=module:attrs [extras]' format",
                src
            )
        else:
            return cls(name.strip(), value.strip(), attrs, extras, dist)

    @classmethod
    def parse_group(cls, group, lines, dist=None):
        """Parse an entry point group"""
        if not MODULE(group):
            raise ValueError("Invalid group name", group)
        this = {}
        for line in yield_lines(lines):
            ep = cls.parse(line, dist)
            if ep.name in this:
                raise ValueError("Duplicate entry point", group, ep.name)
            this[ep.name]=ep
        return this

    @classmethod
    def parse_map(cls, data, dist=None):
        """Parse a map of entry point groups"""
        if isinstance(data,dict):
            data = data.items()
        else:
            data = split_sections(data)
        maps = {}
        for group, lines in data:
            if group is None:
                if not lines:
                    continue
                raise ValueError("Entry points must be listed in groups")
            group = group.strip()
            if group in maps:
                raise ValueError("Duplicate group name", group)
            maps[group] = cls.parse_group(group, lines, dist)
        return maps


def _remove_md5_fragment(location):
    if not location:
        return ''
    parsed = urlparse(location)
    if parsed[-1].startswith('md5='):
        return urlunparse(parsed[:-1] + ('',))
    return location


class Distribution(object):
    """Wrap an actual or potential sys.path entry w/metadata"""
    PKG_INFO = 'PKG-INFO'

    def __init__(self, location=None, metadata=None, project_name=None,
            version=None, py_version=PY_MAJOR, platform=None,
            precedence=EGG_DIST):
        self.project_name = safe_name(project_name or 'Unknown')
        if version is not None:
            self._version = safe_version(version)
        self.py_version = py_version
        self.platform = platform
        self.location = location
        self.precedence = precedence
        self._provider = metadata or empty_provider

    @classmethod
    def from_location(cls,location,basename,metadata=None,**kw):
        project_name, version, py_version, platform = [None]*4
        basename, ext = os.path.splitext(basename)
        if ext.lower() in _distributionImpl:
            # .dist-info gets much metadata differently
            match = EGG_NAME(basename)
            if match:
                project_name, version, py_version, platform = match.group(
                    'name','ver','pyver','plat'
                )
            cls = _distributionImpl[ext.lower()]
        return cls(
            location, metadata, project_name=project_name, version=version,
            py_version=py_version, platform=platform, **kw
        )

    hashcmp = property(
        lambda self: (
            getattr(self,'parsed_version',()),
            self.precedence,
            self.key,
            _remove_md5_fragment(self.location),
            self.py_version,
            self.platform
        )
    )
    def __hash__(self): return hash(self.hashcmp)
    def __lt__(self, other):
        return self.hashcmp < other.hashcmp
    def __le__(self, other):
        return self.hashcmp <= other.hashcmp
    def __gt__(self, other):
        return self.hashcmp > other.hashcmp
    def __ge__(self, other):
        return self.hashcmp >= other.hashcmp
    def __eq__(self, other):
        if not isinstance(other, self.__class__):
            # It's not a Distribution, so they are not equal
            return False
        return self.hashcmp == other.hashcmp
    def __ne__(self, other):
        return not self == other

    # These properties have to be lazy so that we don't have to load any
    # metadata until/unless it's actually needed.  (i.e., some distributions
    # may not know their name or version without loading PKG-INFO)

    @property
    def key(self):
        try:
            return self._key
        except AttributeError:
            self._key = key = self.project_name.lower()
            return key

    @property
    def parsed_version(self):
        try:
            return self._parsed_version
        except AttributeError:
            self._parsed_version = pv = parse_version(self.version)
            return pv

    @property
    def version(self):
        try:
            return self._version
        except AttributeError:
            for line in self._get_metadata(self.PKG_INFO):
                if line.lower().startswith('version:'):
                    self._version = safe_version(line.split(':',1)[1].strip())
                    return self._version
            else:
                raise ValueError(
                    "Missing 'Version:' header and/or %s file" % self.PKG_INFO, self
                )

    @property
    def _dep_map(self):
        try:
            return self.__dep_map
        except AttributeError:
            dm = self.__dep_map = {None: []}
            for name in 'requires.txt', 'depends.txt':
                for extra,reqs in split_sections(self._get_metadata(name)):
                    if extra:
                        if ':' in extra:
                            extra, marker = extra.split(':',1)
                            if invalid_marker(marker):
                                reqs=[] # XXX warn
                            elif not evaluate_marker(marker):
                                reqs=[]
                        extra = safe_extra(extra) or None
                    dm.setdefault(extra,[]).extend(parse_requirements(reqs))
            return dm

    def requires(self,extras=()):
        """List of Requirements needed for this distro if `extras` are used"""
        dm = self._dep_map
        deps = []
        deps.extend(dm.get(None,()))
        for ext in extras:
            try:
                deps.extend(dm[safe_extra(ext)])
            except KeyError:
                raise UnknownExtra(
                    "%s has no such extra feature %r" % (self, ext)
                )
        return deps

    def _get_metadata(self,name):
        if self.has_metadata(name):
            for line in self.get_metadata_lines(name):
                yield line

    def activate(self,path=None):
        """Ensure distribution is importable on `path` (default=sys.path)"""
        if path is None: path = sys.path
        self.insert_on(path)
        if path is sys.path:
            fixup_namespace_packages(self.location)
            for pkg in self._get_metadata('namespace_packages.txt'):
                if pkg in sys.modules:
                    declare_namespace(pkg)

    def egg_name(self):
        """Return what this distribution's standard .egg filename should be"""
        filename = "%s-%s-py%s" % (
            to_filename(self.project_name), to_filename(self.version),
            self.py_version or PY_MAJOR
        )

        if self.platform:
            filename += '-'+self.platform
        return filename

    def __repr__(self):
        if self.location:
            return "%s (%s)" % (self,self.location)
        else:
            return str(self)

    def __str__(self):
        try: version = getattr(self,'version',None)
        except ValueError: version = None
        version = version or "[unknown version]"
        return "%s %s" % (self.project_name,version)

    def __getattr__(self,attr):
        """Delegate all unrecognized public attributes to .metadata provider"""
        if attr.startswith('_'):
            raise AttributeError(attr)
        return getattr(self._provider, attr)

    @classmethod
    def from_filename(cls,filename,metadata=None, **kw):
        return cls.from_location(
            _normalize_cached(filename), os.path.basename(filename), metadata,
            **kw
        )

    def as_requirement(self):
        """Return a ``Requirement`` that matches this distribution exactly"""
        return Requirement.parse('%s==%s' % (self.project_name, self.version))

    def load_entry_point(self, group, name):
        """Return the `name` entry point of `group` or raise ImportError"""
        ep = self.get_entry_info(group,name)
        if ep is None:
            raise ImportError("Entry point %r not found" % ((group,name),))
        return ep.load()

    def get_entry_map(self, group=None):
        """Return the entry point map for `group`, or the full entry map"""
        try:
            ep_map = self._ep_map
        except AttributeError:
            ep_map = self._ep_map = EntryPoint.parse_map(
                self._get_metadata('entry_points.txt'), self
            )
        if group is not None:
            return ep_map.get(group,{})
        return ep_map

    def get_entry_info(self, group, name):
        """Return the EntryPoint object for `group`+`name`, or ``None``"""
        return self.get_entry_map(group).get(name)

    def insert_on(self, path, loc = None):
        """Insert self.location in path before its nearest parent directory"""

        loc = loc or self.location
        if not loc:
            return

        nloc = _normalize_cached(loc)
        bdir = os.path.dirname(nloc)
        npath= [(p and _normalize_cached(p) or p) for p in path]

        for p, item in enumerate(npath):
            if item==nloc:
                break
            elif item==bdir and self.precedence==EGG_DIST:
                # if it's an .egg, give it precedence over its directory
                if path is sys.path:
                    self.check_version_conflict()
                path.insert(p, loc)
                npath.insert(p, nloc)
                break
        else:
            if path is sys.path:
                self.check_version_conflict()
            path.append(loc)
            return

        # p is the spot where we found or inserted loc; now remove duplicates
        while 1:
            try:
                np = npath.index(nloc, p+1)
            except ValueError:
                break
            else:
                del npath[np], path[np]
                p = np  # ha!

        return

    def check_version_conflict(self):
        if self.key=='setuptools':
            return      # ignore the inevitable setuptools self-conflicts  :(

        nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt'))
        loc = normalize_path(self.location)
        for modname in self._get_metadata('top_level.txt'):
            if (modname not in sys.modules or modname in nsp
                    or modname in _namespace_packages):
                continue
            if modname in ('pkg_resources', 'setuptools', 'site'):
                continue
            fn = getattr(sys.modules[modname], '__file__', None)
            if fn and (normalize_path(fn).startswith(loc) or
                       fn.startswith(self.location)):
                continue
            issue_warning(
                "Module %s was already imported from %s, but %s is being added"
                " to sys.path" % (modname, fn, self.location),
            )

    def has_version(self):
        try:
            self.version
        except ValueError:
            issue_warning("Unbuilt egg for "+repr(self))
            return False
        return True

    def clone(self,**kw):
        """Copy this distribution, substituting in any changed keyword args"""
        for attr in (
            'project_name', 'version', 'py_version', 'platform', 'location',
            'precedence'
        ):
            kw.setdefault(attr, getattr(self,attr,None))
        kw.setdefault('metadata', self._provider)
        return self.__class__(**kw)

    @property
    def extras(self):
        return [dep for dep in self._dep_map if dep]


class DistInfoDistribution(Distribution):
    """Wrap an actual or potential sys.path entry w/metadata, .dist-info style"""
    PKG_INFO = 'METADATA'
    EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])")

    @property
    def _parsed_pkg_info(self):
        """Parse and cache metadata"""
        try:
            return self._pkg_info
        except AttributeError:
            from email.parser import Parser
            self._pkg_info = Parser().parsestr(self.get_metadata(self.PKG_INFO))
            return self._pkg_info

    @property
    def _dep_map(self):
        try:
            return self.__dep_map
        except AttributeError:
            self.__dep_map = self._compute_dependencies()
            return self.__dep_map

    def _preparse_requirement(self, requires_dist):
        """Convert 'Foobar (1); baz' to ('Foobar ==1', 'baz')
        Split environment marker, add == prefix to version specifiers as
        necessary, and remove parenthesis.
        """
        parts = requires_dist.split(';', 1) + ['']
        distvers = parts[0].strip()
        mark = parts[1].strip()
        distvers = re.sub(self.EQEQ, r"\1==\2\3", distvers)
        distvers = distvers.replace('(', '').replace(')', '')
        return (distvers, mark)

    def _compute_dependencies(self):
        """Recompute this distribution's dependencies."""
        from pip._vendor._markerlib import compile as compile_marker
        dm = self.__dep_map = {None: []}

        reqs = []
        # Including any condition expressions
        for req in self._parsed_pkg_info.get_all('Requires-Dist') or []:
            distvers, mark = self._preparse_requirement(req)
            parsed = next(parse_requirements(distvers))
            parsed.marker_fn = compile_marker(mark)
            reqs.append(parsed)

        def reqs_for_extra(extra):
            for req in reqs:
                if req.marker_fn(override={'extra':extra}):
                    yield req

        common = frozenset(reqs_for_extra(None))
        dm[None].extend(common)

        for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []:
            extra = safe_extra(extra.strip())
            dm[extra] = list(frozenset(reqs_for_extra(extra)) - common)

        return dm


_distributionImpl = {
    '.egg': Distribution,
    '.egg-info': Distribution,
    '.dist-info': DistInfoDistribution,
    }


def issue_warning(*args,**kw):
    level = 1
    g = globals()
    try:
        # find the first stack frame that is *not* code in
        # the pkg_resources module, to use for the warning
        while sys._getframe(level).f_globals is g:
            level += 1
    except ValueError:
        pass
    from warnings import warn
    warn(stacklevel = level+1, *args, **kw)


def parse_requirements(strs):
    """Yield ``Requirement`` objects for each specification in `strs`

    `strs` must be an instance of ``basestring``, or a (possibly-nested)
    iterable thereof.
    """
    # create a steppable iterator, so we can handle \-continuations
    lines = iter(yield_lines(strs))

    def scan_list(ITEM,TERMINATOR,line,p,groups,item_name):

        items = []

        while not TERMINATOR(line,p):
            if CONTINUE(line,p):
                try:
                    line = next(lines)
                    p = 0
                except StopIteration:
                    raise ValueError(
                        "\\ must not appear on the last nonblank line"
                    )

            match = ITEM(line,p)
            if not match:
                raise ValueError("Expected "+item_name+" in",line,"at",line[p:])

            items.append(match.group(*groups))
            p = match.end()

            match = COMMA(line,p)
            if match:
                p = match.end() # skip the comma
            elif not TERMINATOR(line,p):
                raise ValueError(
                    "Expected ',' or end-of-list in",line,"at",line[p:]
                )

        match = TERMINATOR(line,p)
        if match: p = match.end()   # skip the terminator, if any
        return line, p, items

    for line in lines:
        match = DISTRO(line)
        if not match:
            raise ValueError("Missing distribution spec", line)
        project_name = match.group(1)
        p = match.end()
        extras = []

        match = OBRACKET(line,p)
        if match:
            p = match.end()
            line, p, extras = scan_list(
                DISTRO, CBRACKET, line, p, (1,), "'extra' name"
            )

        line, p, specs = scan_list(VERSION,LINE_END,line,p,(1,2),"version spec")
        specs = [(op,safe_version(val)) for op,val in specs]
        yield Requirement(project_name, specs, extras)


def _sort_dists(dists):
    tmp = [(dist.hashcmp,dist) for dist in dists]
    tmp.sort()
    dists[::-1] = [d for hc,d in tmp]


class Requirement:
    def __init__(self, project_name, specs, extras):
        """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!"""
        self.unsafe_name, project_name = project_name, safe_name(project_name)
        self.project_name, self.key = project_name, project_name.lower()
        index = [(parse_version(v),state_machine[op],op,v) for op,v in specs]
        index.sort()
        self.specs = [(op,ver) for parsed,trans,op,ver in index]
        self.index, self.extras = index, tuple(map(safe_extra,extras))
        self.hashCmp = (
            self.key, tuple([(op,parsed) for parsed,trans,op,ver in index]),
            frozenset(self.extras)
        )
        self.__hash = hash(self.hashCmp)

    def __str__(self):
        specs = ','.join([''.join(s) for s in self.specs])
        extras = ','.join(self.extras)
        if extras: extras = '[%s]' % extras
        return '%s%s%s' % (self.project_name, extras, specs)

    def __eq__(self,other):
        return isinstance(other,Requirement) and self.hashCmp==other.hashCmp

    def __contains__(self,item):
        if isinstance(item,Distribution):
            if item.key != self.key: return False
            if self.index: item = item.parsed_version  # only get if we need it
        elif isinstance(item,basestring):
            item = parse_version(item)
        last = None
        compare = lambda a, b: (a > b) - (a < b) # -1, 0, 1
        for parsed,trans,op,ver in self.index:
            action = trans[compare(item,parsed)] # Indexing: 0, 1, -1
            if action=='F':
                return False
            elif action=='T':
                return True
            elif action=='+':
                last = True
            elif action=='-' or last is None:   last = False
        if last is None: last = True    # no rules encountered
        return last

    def __hash__(self):
        return self.__hash

    def __repr__(self): return "Requirement.parse(%r)" % str(self)

    @staticmethod
    def parse(s):
        reqs = list(parse_requirements(s))
        if reqs:
            if len(reqs)==1:
                return reqs[0]
            raise ValueError("Expected only one requirement", s)
        raise ValueError("No requirements found", s)

state_machine = {
    #       =><
    '<': '--T',
    '<=': 'T-T',
    '>': 'F+F',
    '>=': 'T+F',
    '==': 'T..',
    '!=': 'F++',
}


def _get_mro(cls):
    """Get an mro for a type or classic class"""
    if not isinstance(cls,type):
        class cls(cls,object): pass
        return cls.__mro__[1:]
    return cls.__mro__

def _find_adapter(registry, ob):
    """Return an adapter factory for `ob` from `registry`"""
    for t in _get_mro(getattr(ob, '__class__', type(ob))):
        if t in registry:
            return registry[t]


def ensure_directory(path):
    """Ensure that the parent directory of `path` exists"""
    dirname = os.path.dirname(path)
    if not os.path.isdir(dirname):
        os.makedirs(dirname)

def split_sections(s):
    """Split a string or iterable thereof into (section,content) pairs

    Each ``section`` is a stripped version of the section header ("[section]")
    and each ``content`` is a list of stripped lines excluding blank lines and
    comment-only lines.  If there are any such lines before the first section
    header, they're returned in a first ``section`` of ``None``.
    """
    section = None
    content = []
    for line in yield_lines(s):
        if line.startswith("["):
            if line.endswith("]"):
                if section or content:
                    yield section, content
                section = line[1:-1].strip()
                content = []
            else:
                raise ValueError("Invalid section heading", line)
        else:
            content.append(line)

    # wrap up last segment
    yield section, content

def _mkstemp(*args,**kw):
    from tempfile import mkstemp
    old_open = os.open
    try:
        os.open = os_open   # temporarily bypass sandboxing
        return mkstemp(*args,**kw)
    finally:
        os.open = old_open  # and then put it back


# Set up global resource manager (deliberately not state-saved)
_manager = ResourceManager()
def _initialize(g):
    for name in dir(_manager):
        if not name.startswith('_'):
            g[name] = getattr(_manager, name)
_initialize(globals())

# Prepare the master working set and make the ``require()`` API available
working_set = WorkingSet._build_master()
_declare_state('object', working_set=working_set)

require = working_set.require
iter_entry_points = working_set.iter_entry_points
add_activation_listener = working_set.subscribe
run_script = working_set.run_script
run_main = run_script   # backward compatibility
# Activate all distributions already on sys.path, and ensure that
# all distributions added to the working set in the future (e.g. by
# calling ``require()``) will get activated as well.
add_activation_listener(lambda dist: dist.activate())
working_set.entries=[]
list(map(working_set.add_entry,sys.path)) # match order
site-packages/pip/commands/list.py000064400000015236151733463770013231 0ustar00from pip.basecommand import Command
from pip.exceptions import DistributionNotFound, BestVersionAlreadyInstalled
from pip.index import PackageFinder
from pip.log import logger
from pip.req import InstallRequirement
from pip.util import get_installed_distributions, dist_is_editable
from pip.cmdoptions import make_option_group, index_group


class ListCommand(Command):
    """List installed packages, including editables."""
    name = 'list'
    usage = """
      %prog [options]"""
    summary = 'List installed packages.'

    # distributions to skip (python itself is reported by pkg_resources.working_set)
    skip = ['python']

    def __init__(self, *args, **kw):
        super(ListCommand, self).__init__(*args, **kw)

        cmd_opts = self.cmd_opts

        cmd_opts.add_option(
            '-o', '--outdated',
            action='store_true',
            default=False,
            help='List outdated packages (excluding editables)')
        cmd_opts.add_option(
            '-u', '--uptodate',
            action='store_true',
            default=False,
            help='List uptodate packages (excluding editables)')
        cmd_opts.add_option(
            '-e', '--editable',
            action='store_true',
            default=False,
            help='List editable projects.')
        cmd_opts.add_option(
            '-l', '--local',
            action='store_true',
            default=False,
            help='If in a virtualenv that has global access, do not list globally-installed packages.')

        cmd_opts.add_option(
            '--pre',
            action='store_true',
            default=False,
            help="Include pre-release and development versions. By default, pip only finds stable versions.")

        index_opts = make_option_group(index_group, self.parser)

        self.parser.insert_option_group(0, index_opts)
        self.parser.insert_option_group(0, cmd_opts)

    def _build_package_finder(self, options, index_urls, session):
        """
        Create a package finder appropriate to this list command.
        """
        return PackageFinder(find_links=options.find_links,
                             index_urls=index_urls,
                             allow_external=options.allow_external,
                             allow_unverified=options.allow_unverified,
                             allow_all_external=options.allow_all_external,
                             allow_all_prereleases=options.pre,
                             process_dependency_links=
                                options.process_dependency_links,
                             session=session,
                        )

    def run(self, options, args):
        if options.outdated:
            self.run_outdated(options)
        elif options.uptodate:
            self.run_uptodate(options)
        elif options.editable:
            self.run_editables(options)
        else:
            self.run_listing(options)

    def run_outdated(self, options):
        for dist, remote_version_raw, remote_version_parsed in self.find_packages_latests_versions(options):
            if remote_version_parsed > dist.parsed_version:
                logger.notify('%s (Current: %s Latest: %s)' % (dist.project_name,
                    dist.version, remote_version_raw))

    def find_packages_latests_versions(self, options):
        index_urls = [options.index_url] + options.extra_index_urls
        if options.no_index:
            logger.notify('Ignoring indexes: %s' % ','.join(index_urls))
            index_urls = []

        if options.use_mirrors:
            logger.deprecated("1.7",
                        "--use-mirrors has been deprecated and will be removed"
                        " in the future. Explicit uses of --index-url and/or "
                        "--extra-index-url is suggested.")

        if options.mirrors:
            logger.deprecated("1.7",
                        "--mirrors has been deprecated and will be removed in "
                        " the future. Explicit uses of --index-url and/or "
                        "--extra-index-url is suggested.")
            index_urls += options.mirrors

        dependency_links = []
        for dist in get_installed_distributions(local_only=options.local, skip=self.skip):
            if dist.has_metadata('dependency_links.txt'):
                dependency_links.extend(
                    dist.get_metadata_lines('dependency_links.txt'),
                )

        session = self._build_session(options)

        finder = self._build_package_finder(options, index_urls, session)
        finder.add_dependency_links(dependency_links)

        installed_packages = get_installed_distributions(local_only=options.local, include_editables=False, skip=self.skip)
        for dist in installed_packages:
            req = InstallRequirement.from_line(dist.key, None)
            try:
                link = finder.find_requirement(req, True)

                # If link is None, means installed version is most up-to-date
                if link is None:
                    continue
            except DistributionNotFound:
                continue
            except BestVersionAlreadyInstalled:
                remote_version = req.installed_version
            else:
                # It might be a good idea that link or finder had a public method
                # that returned version
                remote_version = finder._link_package_versions(link, req.name)[0]
                remote_version_raw = remote_version[2]
                remote_version_parsed = remote_version[0]
            yield dist, remote_version_raw, remote_version_parsed

    def run_listing(self, options):
        installed_packages = get_installed_distributions(local_only=options.local, skip=self.skip)
        self.output_package_listing(installed_packages)

    def run_editables(self, options):
        installed_packages = get_installed_distributions(local_only=options.local, editables_only=True)
        self.output_package_listing(installed_packages)

    def output_package_listing(self, installed_packages):
        installed_packages = sorted(installed_packages, key=lambda dist: dist.project_name.lower())
        for dist in installed_packages:
            if dist_is_editable(dist):
                line = '%s (%s, %s)' % (dist.project_name, dist.version, dist.location)
            else:
                line = '%s (%s)' % (dist.project_name, dist.version)
            logger.notify(line)

    def run_uptodate(self, options):
        uptodate = []
        for dist, remote_version_raw, remote_version_parsed in self.find_packages_latests_versions(options):
            if dist.parsed_version == remote_version_parsed:
                uptodate.append(dist)
        self.output_package_listing(uptodate)
site-packages/pip/commands/__pycache__/list.cpython-33.pyc000064400000017555151733463770017520 0ustar00�
7�Re�c@s�ddlmZddlmZmZddlmZddlmZddl	m
Z
ddlmZm
Z
ddlmZmZGdd	�d	e�Zd
S(i(uCommand(uDistributionNotFounduBestVersionAlreadyInstalled(u
PackageFinder(ulogger(uInstallRequirement(uget_installed_distributionsudist_is_editable(umake_option_groupuindex_groupcs�|EeZdZdZdZdZdZdgZ�fdd�Zdd	�Z	d
d�Z
dd
�Zdd�Zdd�Z
dd�Zdd�Zdd�Z�S(uListCommandu-List installed packages, including editables.ulistu
      %prog [options]uList installed packages.upythonc	stt|�j||�|j}|jdddddddd�|jdd	dddddd
�|jdddddddd
�|jdddddddd�|jddddddd�tt|j�}|jj	d|�|jj	d|�dS(Nu-ou
--outdateduactionu
store_trueudefaultuhelpu,List outdated packages (excluding editables)u-uu
--uptodateu,List uptodate packages (excluding editables)u-eu
--editableuList editable projects.u-lu--localuSIf in a virtualenv that has global access, do not list globally-installed packages.u--preuYInclude pre-release and development versions. By default, pip only finds stable versions.iF(
usuperuListCommandu__init__ucmd_optsu
add_optionuFalseumake_option_groupuindex_groupuparseruinsert_option_group(uselfuargsukwucmd_optsu
index_opts(u	__class__(u*/tmp/pip-zej_zi-build/pip/commands/list.pyu__init__s<					uListCommand.__init__cCsItd|jd|d|jd|jd|jd|jd|jd|�S(	uK
        Create a package finder appropriate to this list command.
        u
find_linksu
index_urlsuallow_externaluallow_unverifieduallow_all_externaluallow_all_prereleasesuprocess_dependency_linksusession(u
PackageFinderu
find_linksuallow_externaluallow_unverifieduallow_all_externalupreuprocess_dependency_links(uselfuoptionsu
index_urlsusession((u*/tmp/pip-zej_zi-build/pip/commands/list.pyu_build_package_finder9s					u!ListCommand._build_package_findercCs\|jr|j|�n?|jr2|j|�n&|jrK|j|�n
|j|�dS(N(uoutdatedurun_outdateduuptodateurun_uptodateueditableu
run_editablesurun_listing(uselfuoptionsuargs((u*/tmp/pip-zej_zi-build/pip/commands/list.pyurunHs			uListCommand.runcCsYxR|j|�D]A\}}}||jkrtjd|j|j|f�qqWdS(Nu%s (Current: %s Latest: %s)(ufind_packages_latests_versionsuparsed_versionuloggerunotifyuproject_nameuversion(uselfuoptionsudisturemote_version_rawuremote_version_parsed((u*/tmp/pip-zej_zi-build/pip/commands/list.pyurun_outdatedRsuListCommand.run_outdatedc
cs�|jg|j}|jr?tjddj|��g}n|jr[tjdd�n|jr�tjdd�||j7}ng}xKt	d|j
d|j�D].}|jd�r�|j
|jd��q�q�W|j|�}|j|||�}|j|�t	d|j
d	dd|j�}x�|D]�}tj|jd�}y(|j|d
�}	|	dkrsw1nWn/tk
r�w1YnHtk
r�|j}
Yn.X|j|	|j�d
}
|
d}|
d
}|||fVq1WdS(NuIgnoring indexes: %su,u1.7u�--use-mirrors has been deprecated and will be removed in the future. Explicit uses of --index-url and/or --extra-index-url is suggested.u�--mirrors has been deprecated and will be removed in  the future. Explicit uses of --index-url and/or --extra-index-url is suggested.u
local_onlyuskipudependency_links.txtuinclude_editablesiiFT(u	index_urluextra_index_urlsuno_indexuloggerunotifyujoinuuse_mirrorsu
deprecatedumirrorsuget_installed_distributionsulocaluskipuhas_metadatauextenduget_metadata_linesu_build_sessionu_build_package_finderuadd_dependency_linksuFalseuInstallRequirementu	from_lineukeyuNoneufind_requirementuTrueuDistributionNotFounduBestVersionAlreadyInstalleduinstalled_versionu_link_package_versionsuname(
uselfuoptionsu
index_urlsudependency_linksudistusessionufinderuinstalled_packagesurequlinkuremote_versionuremote_version_rawuremote_version_parsed((u*/tmp/pip-zej_zi-build/pip/commands/list.pyufind_packages_latests_versionsXsD				
		"
!





u*ListCommand.find_packages_latests_versionscCs,td|jd|j�}|j|�dS(Nu
local_onlyuskip(uget_installed_distributionsulocaluskipuoutput_package_listing(uselfuoptionsuinstalled_packages((u*/tmp/pip-zej_zi-build/pip/commands/list.pyurun_listing�suListCommand.run_listingcCs)td|jdd�}|j|�dS(Nu
local_onlyueditables_onlyT(uget_installed_distributionsulocaluTrueuoutput_package_listing(uselfuoptionsuinstalled_packages((u*/tmp/pip-zej_zi-build/pip/commands/list.pyu
run_editables�suListCommand.run_editablescCs{t|ddd��}x\|D]T}t|�rPd|j|j|jf}nd|j|jf}tj|�qWdS(NukeycSs
|jj�S(N(uproject_nameulower(udist((u*/tmp/pip-zej_zi-build/pip/commands/list.pyu<lambda>�su4ListCommand.output_package_listing.<locals>.<lambda>u%s (%s, %s)u%s (%s)(usortedudist_is_editableuproject_nameuversionulocationuloggerunotify(uselfuinstalled_packagesudistuline((u*/tmp/pip-zej_zi-build/pip/commands/list.pyuoutput_package_listing�s
u"ListCommand.output_package_listingcCsYg}x?|j|�D].\}}}|j|kr|j|�qqW|j|�dS(N(ufind_packages_latests_versionsuparsed_versionuappenduoutput_package_listing(uselfuoptionsuuptodateudisturemote_version_rawuremote_version_parsed((u*/tmp/pip-zej_zi-build/pip/commands/list.pyurun_uptodate�s
uListCommand.run_uptodate(u__name__u
__module__u__qualname__u__doc__unameuusageusummaryuskipu__init__u_build_package_finderurunurun_outdatedufind_packages_latests_versionsurun_listingu
run_editablesuoutput_package_listingurun_uptodate(u
__locals__((u	__class__u*/tmp/pip-zej_zi-build/pip/commands/list.pyuListCommand
s	%
4	uListCommandN(upip.basecommanduCommandupip.exceptionsuDistributionNotFounduBestVersionAlreadyInstalledu	pip.indexu
PackageFinderupip.loguloggerupip.requInstallRequirementupip.utiluget_installed_distributionsudist_is_editableupip.cmdoptionsumake_option_groupuindex_groupuListCommand(((u*/tmp/pip-zej_zi-build/pip/commands/list.pyu<module>ssite-packages/pip/commands/__pycache__/zip.cpython-33.pyc000064400000033620151733463770017336 0ustar00�
7�Re�9c@s�ddlZddlZddlZddlZddlZddlZddlmZmZm	Z	ddl
mZddlm
Z
ddlmZGdd�de�ZdS(iN(udisplay_pathu
backup_dirurmtree(ulogger(uInstallationError(uCommandcs�|EeZdZdZdZdZdZ�fdd�Zdd�Zd	d
�Z	dd�Z
d
d�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Z�S(u
ZipCommanduZip individual packages.uzipu#
     %prog [options] <package> ...u$DEPRECATED. Zip individual packages.c
s9tt|�j||�|jdkrM|jjddddddd�n(|jjd	dd
dddddd�|jjd
dddddd�|jjdddddddd�|jjddddddd�|jjddddddd�|jjdddddd�|jjd|j�dS( Nuzipu--unzipuactionu
store_trueudestuunzipuhelpu"Unzip (rather than zip) a package.u--zipustore_falseudefaultu"Zip (rather than unzip) a package.u--no-pycuno_pycuEDo not include .pyc files in zip files (useful on Google App Engine).u-lu--listulistu2List the packages available, and their zip status.u--sort-filesu
sort_filesuDWith --list, sort packages according to how many files they contain.u--pathuappendupathsu?Restrict operations to the given paths (may include wildcards).u-nu
--simulateu0Do not actually perform the zip/unzip operation.iT(	usuperu
ZipCommandu__init__unameucmd_optsu
add_optionuTrueuparseruinsert_option_group(uselfuargsukw(u	__class__(u)/tmp/pip-zej_zi-build/pip/commands/zip.pyu__init__sL	
								uZipCommand.__init__cCsp|jstjSg}t�}x�tjD]�}tjjtjj|��}x�|jD]�}tjjtjj|��}d|kr�tjt	j
|d�|�r�|j|�|j|�Pq�qW|j
|�rW|j|�|j|�PqWqWWtjd|dj|j�f�q)WxJ|jD]?}||kr)d|kr)|j|�tjd|�q)q)W|S(u:All the entries of sys.path, possibly restricted by --pathu*u,Skipping path %s because it doesn't match %su, uDAdding path %s because it doesn't match anything already on sys.path(uselect_pathsusysupathusetuosunormcaseuabspathureusearchufnmatchu	translateuappenduaddu
startswithuloggerudebugujoin(uselfuresultu	match_anyupathumatch((u)/tmp/pip-zej_zi-build/pip/commands/zip.pyupaths>s2		



	
	uZipCommand.pathscCsVtjdd�|j|_|j|_|jrA|j||�S|sVtd��ng}x�|D]�}|j|�\}}|jr�t	j
j|�r�td||f��n6|jr�t	j
j|�r�td||f��n|j||f�qcWd}xJ|D]B\}}|jr6|j||�}q|j|||j�}qW|S(Nu1.7u_DEPRECATION: 'pip zip' and 'pip unzip` are deprecated, and will be removed in a future release.u2You must give at least one package to zip or unzipu;The module %s (in %s) is not a zip file; cannot be unzippedu:The module %s (in %s) is not a directory; cannot be zipped(uloggeru
deprecatedupathsuselect_pathsusimulateulistuInstallationErrorufind_packageuunzipuosupathuisdiruappenduNoneu
unzip_packageuzip_packageuno_pyc(uselfuoptionsuargsupackagesuargumodule_nameufilenameulast_status((u)/tmp/pip-zej_zi-build/pip/commands/zip.pyurun\s4	
	uZipCommand.runc
Cs�tjj|�}tjj|�rPtj|�rPtd|||f��ntjj|�}||j�kr�tj	dt
|�t
|�t
|�f�ntjd|t
|�f�|jr�tjd�dStj
d7_
z�tj|�}g}x|j�D]}|j}|j|tjj�r�|j|�}	tjj||�}
tjjtjj|
��s�tjtjj|
��n|	r�|
jtjj�r�tjj|
�s�tj|
�q�qt|
d�}|j|	�|j�q|j||j|�f�qW|j�|sbtjdt
|��tj|�|j|�n`tjd|t
|�f�tj|d	�}x$|D]\}}	|j||	�q�W|j�Wdtj
d8_
XdS(
Nu3Module %s (in %s) isn't located in a zip file in %su/Unpacking %s into %s, but %s is not on sys.pathuUnzipping %s (in %s)u3Skipping remaining operations because of --simulateiuwbuRemoving now-empty zip file %su(Removing entries in %s/ from zip file %suw( uosupathudirnameuisfileuzipfileu
is_zipfileuInstallationErrorupathsuloggeruwarnudisplay_pathunotifyusimulateuindentuZipFileuinfolistufilenameu
startswithusepureadujoinuexistsumakedirsuendswithuopenuwriteucloseuappenduinfouunlinkuremove_filename_from_pthuwritestr(uselfumodule_nameufilenameuzip_filenameupackage_pathuziputo_saveuinfounameucontentudestuf((u)/tmp/pip-zej_zi-build/pip/commands/zip.pyu
unzip_package{sX"	
	

 

uZipCommand.unzip_packagecCsN|}tjd|t|�f�tjd7_|jd�rJ|}n
|d}z�||kr�t|�}tjd||f�|js�tj||�q�nyvtj	dt|��|js�t
j|d�}|j|dd	�x�t
j|�D]�\}}}	|r)d
d�|	D�}	nx�|d
f|	dfgD]�\}
}x�|
D]}t
jj||�}
t
jj||t|�d�jt
jj�|�}|r�|j|dd	�qU|j|
|�qUWqBWq�W|j�ntj	dt|��|jst|�nWn�YnX|j|�Wdtjd8_XdS(NuZip %s (in %s)iu.eggu.zipuMoving %s aside to %suCreating zip file in %suwu/ucSs+g|]!}|j�jd�s|�qS(u.pyc(uloweruendswith(u.0uf((u)/tmp/pip-zej_zi-build/pip/commands/zip.pyu
<listcomp>�s	u*ZipCommand.zip_package.<locals>.<listcomp>uRemoving old directory %sTF(uloggerunotifyudisplay_pathuindentuendswithu
backup_dirusimulateushutilumoveuinfouzipfileuZipFileuwritestruosuwalkuTrueuFalseupathujoinulenulstripusepuwriteucloseurmtreeuadd_filename_to_pth(uselfumodule_nameufilenameuno_pycu
orig_filenameu
dest_filenameuzipudirpathudirnamesu	filenamesufnsuis_dirufnufulludest((u)/tmp/pip-zej_zi-build/pip/commands/zip.pyuzip_package�sF	
		%
7
	uZipCommand.zip_packagecsx�|j�D]�}t|d�}|j�}|j��fdd�|D�}||kr
tjdt��t|�f�dd�|D�s�tjdt|��|js�tj	|�q�n2|js�t|d�}|j
|�|j�ndSq
Wtjdt���dS(	Nurcs(g|]}|j��kr|�qS((ustrip(u.0ul(ufilename(u)/tmp/pip-zej_zi-build/pip/commands/zip.pyu
<listcomp>�s	u7ZipCommand.remove_filename_from_pth.<locals>.<listcomp>u*Removing reference to %s from .pth file %scSsg|]}|r|�qS(((u.0uline((u)/tmp/pip-zej_zi-build/pip/commands/zip.pyu
<listcomp>�s	u %s file would be empty: deletinguwbu.Cannot find a reference to %s in any .pth file(u	pth_filesuopenu	readlinesucloseuloggeruinfoudisplay_pathusimulateuosuunlinku
writelinesuwarn(uselfufilenameupthufulinesu	new_lines((ufilenameu)/tmp/pip-zej_zi-build/pip/commands/zip.pyuremove_filename_from_pth�s$
			

u#ZipCommand.remove_filename_from_pthcCs�tjj|�}|d}||j�krHtjdt|��n|js�tjj|�r�t	|�}|j
�}|j�|r�|djd�r�|dd7<n|j
|d�n
|dg}t	|d�}|j|�|j�ndS(Nu.pthu.Adding .pth file %s, but it is not on sys.pathiu
uwbi����i����(uosupathudirnameupathsuloggeruwarnudisplay_pathusimulateuexistsuopenu	readlinesucloseuendswithuappendu
writelines(uselfufilenameupathudestufulines((u)/tmp/pip-zej_zi-build/pip/commands/zip.pyuadd_filename_to_pth�s 
	


uZipCommand.add_filename_to_pthccs�x�|j�D]r}tjj|�s
tjj|�r?q
nx=tj|�D],}|jd�rOtjj||�VqOqOWq
WdS(Nu.pth(upathsuosupathuexistsuisdirulistdiruendswithujoin(uselfupathufilename((u)/tmp/pip-zej_zi-build/pip/commands/zip.pyu	pth_filess&uZipCommand.pth_filesc
Cs�x�|j�D]�}tjj||�}tjj|�rD||fStjj|�r
tj|�r
tj|d�}y |j	tjj|d��Wnt
k
r�YnX|j�||fS|j�q
q
Wtd|��dS(Nuru__init__.pyu!No package with the name %s found(
upathsuosupathujoinuexistsuisdiruzipfileu
is_zipfileuZipFileureaduKeyErrorucloseuInstallationError(uselfupackageupathufulluzip((u)/tmp/pip-zej_zi-build/pip/commands/zip.pyufind_packages
" 


uZipCommand.find_packagecCsD|rtd��nx(t|j��D]}tjj|�sFq(ntjj|jtjj��}tjj	|�r�t
j|�r�tjj|�|j�kr(t
jdt|��q(q(n|dkr|dkr|jdd�jd�rq(nt
jdt|��t
jd	7_g}g}z�x�ttj|��D]�}tjj|�d
j�}|dkrqKn|dkr�t
jdt|��qKntjj||�}	tjj|	�r�|j||j|	�f�qKt
j|	�r
|j|�qKt
jdt|��qKW|r�t
jd�t
jd	7_z"x|D]}t
j|�qTWWdt
jd	8_Xn
t
jd�|r|jr�|jddd��nt
jd�t
jd	7_z2x+|D]#\}}
t
jd||
f�q�WWdt
jd	8_Xn
t
jd�Wdt
jd	8_Xq(WdS(Nu'You cannot give an argument with --listuZipped egg: %su
site-packagesu
dist-packagesu\u/u
lib/pythonuIn %s:iiu.pthu	.egg-infou	.egg-linku.pyu Not displaying %s: not a packageuUnknown file: %suZipped packages:uNo zipped packages.ukeycSs	|dS(Ni((ux((u)/tmp/pip-zej_zi-build/pip/commands/zip.pyu<lambda>Lsu!ZipCommand.list.<locals>.<lambda>uUnzipped packages:u%s  (%i files)uNo unzipped packages.(u.pthu	.egg-infou	.egg-link(uInstallationErrorusortedupathsuosupathuexistsubasenameurstripusepuisfileuzipfileu
is_zipfileudirnameuloggerunotifyudisplay_pathureplaceuendswithuindentulistdirusplitextuloweruinfoujoinuisdiruappendu
count_packageu
sort_filesusort(uselfuoptionsuargsupathubasenameuzippeduunzippedufilenameuextufullucount((u)/tmp/pip-zej_zi-build/pip/commands/zip.pyulistsf!!


	
uZipCommand.listcCsPd}xCtj|�D]2\}}}dd�|D�}|t|�7}qW|S(NicSs+g|]!}|j�jd�s|�qS(u.pyc(uloweruendswith(u.0uf((u)/tmp/pip-zej_zi-build/pip/commands/zip.pyu
<listcomp>\s	u,ZipCommand.count_package.<locals>.<listcomp>(uosuwalkulen(uselfupathutotaludirpathudirnamesu	filenames((u)/tmp/pip-zej_zi-build/pip/commands/zip.pyu
count_packageYs
uZipCommand.count_package(u__name__u
__module__u__qualname__u__doc__unameuusageusummaryu__init__upathsurunu
unzip_packageuzip_packageuremove_filename_from_pthuadd_filename_to_pthu	pth_filesufind_packageulistu
count_package(u
__locals__((u	__class__u)/tmp/pip-zej_zi-build/pip/commands/zip.pyu
ZipCommand
s*3,;u
ZipCommand(usysureufnmatchuosushutiluzipfileupip.utiludisplay_pathu
backup_dirurmtreeupip.loguloggerupip.exceptionsuInstallationErrorupip.basecommanduCommandu
ZipCommand(((u)/tmp/pip-zej_zi-build/pip/commands/zip.pyu<module>ssite-packages/pip/commands/__pycache__/wheel.cpython-33.pyc000064400000015607151733463770017645 0ustar00�
7�Re"c@s�ddlmZddlZddlZddlmZddlmZddlm	Z	ddl
mZmZddl
mZmZmZddlmZmZdd	lmZdd
lmZejjeej�d�ZGdd
�d
e�ZdS(i(uabsolute_importN(uCommand(u
PackageFinder(ulogger(uCommandErroruPreviousBuildDirError(uInstallRequirementuRequirementSetuparse_requirements(uBuildDirectoryunormalize_path(uWheelBuilder(u
cmdoptionsu
wheelhousecsJ|EeZdZdZdZdZdZ�fdd�Zdd�Z�S(	uWheelCommandu�
    Build Wheel archives for your requirements and dependencies.

    Wheel is a built-package format, and offers the advantage of not recompiling your software during every install.
    For more details, see the wheel docs: http://wheel.readthedocs.org/en/latest.

    Requirements: setuptools>=0.8, and wheel.

    'pip wheel' uses the bdist_wheel setuptools extension from the wheel package to build individual wheels.

    uwheelu�
      %prog [options] <requirement specifier> ...
      %prog [options] -r <requirements file> ...
      %prog [options] <vcs project url> ...
      %prog [options] <local project path> ...
      %prog [options] <archive url/path> ...u$Build wheels from your requirements.cs�tt|�j||�|j}|jdddddddtdd	�|jtjj��|jtj	j��|jd
ddddd
ddd�|jtj
j��|jtjj��|jtjj��|jtj
j��|jdddd
ddddd�|jdd
ddddd�|jtjj��tjtj|j�}|jjd|�|jjd|�dS(Nu-wu--wheel-dirudestu	wheel_dirumetavarudirudefaultuhelpuABuild wheels into <dir>, where the default is '<cwd>/wheelhouse'.u--build-optionu
build_optionsuoptionsuactionuappendu9Extra arguments to be supplied to 'setup.py bdist_wheel'.u--global-optionuglobal_optionsuZExtra global options to be supplied to the setup.py call before the 'bdist_wheel' command.u--preu
store_trueuYInclude pre-release and development versions. By default, pip only finds stable versions.iF(usuperuWheelCommandu__init__ucmd_optsu
add_optionuDEFAULT_WHEEL_DIRu
cmdoptionsu	use_wheelumakeuno_use_wheelurequirementsudownload_cacheuno_depsu	build_diruFalseuno_cleanumake_option_groupuindex_groupuparseruinsert_option_group(uselfuargsukwucmd_optsu
index_opts(u	__class__(u+/tmp/pip-zej_zi-build/pip/commands/wheel.pyu__init__(sF		uWheelCommand.__init__c.Csuyddl}Wntk
r0td��YnXyddl}Wntk
ratd��YnXt|d�s�td��n|jg|j}|jr�tj	ddj
|��g}n|jr�tjdd�n|j
rtjdd	�||j
7}n|jr(tjj|j�|_n|j|�}td
|jd|d|jd
|jd|jd|jd|jd|jd|�	}|jp�|j}t|jd|���}	td|	ddddd|jd|j dd"d|d|j"�}
tjj#|j"�s tj$|j"�nx'|D]}|
j%t&j'|d��q'Wxj|j(D]_}xVt)|d|d|d|�D]6}
|
j*r�tj	d|
j+�qyn|
j%|
�qyWqTW|
j,s�i|j-d6}d|}tj.|�dSzfyAt/|
||j"d |j0pgd!|j1pg�}|j2�Wnt3k
rOd"|_�YnXWd|jsj|
j4�nXWdQXdS(#NiuN'pip wheel' requires the 'wheel' package. To fix this, run:  pip install wheelup'pip wheel' requires setuptools >= 0.8 for dist-info support. To fix this, run: pip install --upgrade setuptoolsuDistInfoDistributionuIgnoring indexes: %su,u1.7u�--use-mirrors has been deprecated and will be removed in the future. Explicit uses of --index-url and/or --extra-index-url is suggested.u�--mirrors has been deprecated and will be removed in  the future. Explicit uses of --index-url and/or --extra-index-url is suggested.u
find_linksu
index_urlsu	use_wheeluallow_externaluallow_unverifieduallow_all_externaluallow_all_prereleasesuprocess_dependency_linksusessionudeleteu	build_dirusrc_dirudownload_dirudownload_cacheuignore_dependenciesuignore_installeduwheel_download_dirufinderuoptionsuignoring %sunameuLYou must give at least one requirement to %(name)s (see "pip help %(name)s")u
build_optionsuglobal_optionsT(5uwheel.bdist_wheeluImportErroruCommandErroru
pkg_resourcesuhasattru	index_urluextra_index_urlsuno_indexuloggerunotifyujoinuuse_mirrorsu
deprecatedumirrorsu	build_diruosupathuabspathu_build_sessionu
PackageFinderu
find_linksu	use_wheeluallow_externaluallow_unverifieduallow_all_externalupreuprocess_dependency_linksuno_cleanuBuildDirectoryuRequirementSetuNoneudownload_cacheuignore_dependenciesuTrueu	wheel_diruexistsumakedirsuadd_requirementuInstallRequirementu	from_lineurequirementsuparse_requirementsueditableuurluhas_requirementsunameuerroruWheelBuilderu
build_optionsuglobal_optionsubuilduPreviousBuildDirErroru
cleanup_files(uselfuoptionsuargsuwheelu
pkg_resourcesu
index_urlsusessionufinderubuild_deleteu	build_dirurequirement_setunameufilenameurequoptsumsguwb((u+/tmp/pip-zej_zi-build/pip/commands/wheel.pyurunUs�

				
												

		
	
		uWheelCommand.run(	u__name__u
__module__u__qualname__u__doc__unameuusageusummaryu__init__urun(u
__locals__((u	__class__u+/tmp/pip-zej_zi-build/pip/commands/wheel.pyuWheelCommands-uWheelCommand(u
__future__uabsolute_importuosusysupip.basecommanduCommandu	pip.indexu
PackageFinderupip.loguloggerupip.exceptionsuCommandErroruPreviousBuildDirErrorupip.requInstallRequirementuRequirementSetuparse_requirementsupip.utiluBuildDirectoryunormalize_pathu	pip.wheeluWheelBuilderupipu
cmdoptionsupathujoinucurdiruDEFAULT_WHEEL_DIRuWheelCommand(((u+/tmp/pip-zej_zi-build/pip/commands/wheel.pyu<module>ssite-packages/pip/commands/__pycache__/completion.cpython-33.pyc000064400000005504151733463770020705 0ustar00�
7�Re.c@sPddlZddlmZdZidd6dd6ZGdd	�d	e�ZdS(
iN(uCommanduJ
# pip %(shell)s completion start%(script)s# pip %(shell)s completion end
u�
_pip_completion()
{
    COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \
                   COMP_CWORD=$COMP_CWORD \
                   PIP_AUTO_COMPLETE=1 $1 ) )
}
complete -o default -F _pip_completion pip
ubashu�
function _pip_completion {
  local words cword
  read -Ac words
  read -cn cword
  reply=( $( COMP_WORDS="$words[*]" \
             COMP_CWORD=$(( cword-1 )) \
             PIP_AUTO_COMPLETE=1 $words[1] ) )
}
compctl -K _pip_completion pip
uzshcsJ|EeZdZdZdZdZdZ�fdd�Zdd�Z	�S(	uCompletionCommandu3A helper command to be used for command completion.u
completionu2A helper command to be used for command completioncsstt|�j||�|jjddddddddd	d
�|jjdddddd
ddd	d�dS(Nu--bashu-buactionustore_constuconstubashudestushelluhelpuEmit completion code for bashu--zshu-zuzshuEmit completion code for zsh(usuperuCompletionCommandu__init__uparseru
add_option(uselfuargsukw(u	__class__(u0/tmp/pip-zej_zi-build/pip/commands/completion.pyu__init__$s				uCompletionCommand.__init__cCs�tj�}dd�t|�D�}|j|krktj|jd�}tti|d6|jd6�ntjj	ddj
|��dS(	u-Prints the completion code of the given shellcSsg|]}d|�qS(u--((u.0ushell((u0/tmp/pip-zej_zi-build/pip/commands/completion.pyu
<listcomp>6s	u)CompletionCommand.run.<locals>.<listcomp>uuscriptushelluERROR: You must pass %s
u or N(uCOMPLETION_SCRIPTSukeysusortedushellugetuprintuBASE_COMPLETIONusysustderruwriteujoin(uselfuoptionsuargsushellsu
shell_optionsuscript((u0/tmp/pip-zej_zi-build/pip/commands/completion.pyurun3s"uCompletionCommand.runT(
u__name__u
__module__u__qualname__u__doc__unameusummaryuTrueuhiddenu__init__urun(u
__locals__((u	__class__u0/tmp/pip-zej_zi-build/pip/commands/completion.pyuCompletionCommandsuCompletionCommand(usysupip.basecommanduCommanduBASE_COMPLETIONuCOMPLETION_SCRIPTSuCompletionCommand(((u0/tmp/pip-zej_zi-build/pip/commands/completion.pyu<module>s	

site-packages/pip/commands/__pycache__/show.cpython-33.pyc000064400000010064151733463770017511 0ustar00�
7�Re�
c@snddlZddlmZddlmZddlmZGdd�de�Zdd�Zd	d
�Z	dS(iN(uCommand(ulogger(u
pkg_resourcescsJ|EeZdZdZdZdZdZ�fdd�Zdd�Z�S(	uShowCommandu6Show information about one or more installed packages.ushowu$
      %prog [options] <package> ...u*Show information about installed packages.cs^tt|�j||�|jjdddddddddd	�|jjd
|j�dS(Nu-fu--filesudestufilesuactionu
store_trueudefaultuhelpu7Show the full list of installed files for each package.iF(usuperuShowCommandu__init__ucmd_optsu
add_optionuFalseuparseruinsert_option_group(uselfuargsukw(u	__class__(u*/tmp/pip-zej_zi-build/pip/commands/show.pyu__init__s		uShowCommand.__init__cCs=|stjd�dS|}t|�}t||j�dS(Nu.ERROR: Please provide a package name or names.(uloggeruwarnusearch_packages_infou
print_resultsufiles(uselfuoptionsuargsuqueryuresults((u*/tmp/pip-zej_zi-build/pip/commands/show.pyuruns
uShowCommand.run(	u__name__u
__module__u__qualname__u__doc__unameuusageusummaryu__init__urun(u
__locals__((u	__class__u*/tmp/pip-zej_zi-build/pip/commands/show.pyuShowCommandsuShowCommandccs�tdd�tjD��}x�|D]�}|j�}||kr#||}i|jd6|jd6|jd6dd�|j�D�d6}tj	j
|j|j�dd	�}tj	j|�r�||d
<n|Vq#q#WdS(u�
    Gather details from installed distributions. Print distribution name,
    version, location, and installed files. Installed files requires a
    pip generated 'installed-files.txt' in the distributions '.egg-info'
    directory.
    cSs%g|]}|jj�|f�qS((uproject_nameulower(u.0up((u*/tmp/pip-zej_zi-build/pip/commands/show.pyu
<listcomp>,s	u(search_packages_info.<locals>.<listcomp>unameuversionulocationcSsg|]}|j�qS((uproject_name(u.0udep((u*/tmp/pip-zej_zi-build/pip/commands/show.pyu
<listcomp>5s	urequiresu	.egg-infouinstalled-files.txtufilesN(
udictu
pkg_resourcesuworking_setuloweruproject_nameuversionulocationurequiresuosupathujoinuegg_nameuisfile(uqueryuinstalled_packagesunameunormalized_nameudistupackageufilelist((u*/tmp/pip-zej_zi-build/pip/commands/show.pyusearch_packages_info$s$




	
	
usearch_packages_infocCs�x�|D]�}tjd�tjd|d�tjd|d�tjd|d�tjdd	j|d
��|rtjd�d|kr�x?t|d�D]}tjd
|j��q�Wq�tjd�qqWdS(uD
    Print the informations from installed distributions found.
    u---uName: %sunameuVersion: %suversionuLocation: %sulocationuRequires: %su, urequiresuFiles:ufilesu  %su!Cannot locate installed-files.txtN(uloggerunotifyujoinuopenustrip(u
distributionsulist_all_filesudistuline((u*/tmp/pip-zej_zi-build/pip/commands/show.pyu
print_results@s


u
print_results(
uosupip.basecommanduCommandupip.loguloggerupip._vendoru
pkg_resourcesuShowCommandusearch_packages_infou
print_results(((u*/tmp/pip-zej_zi-build/pip/commands/show.pyu<module>ssite-packages/pip/commands/__pycache__/unzip.cpython-33.pyc000064400000001175151733464000017664 0ustar00�
7�Re�c@s*ddlmZGdd�de�ZdS(i(u
ZipCommandcBs&|EeZdZdZdZdZdS(uUnzipCommanduUnzip individual packages.uunzipu&DEPRECATED. Unzip individual packages.N(u__name__u
__module__u__qualname__u__doc__unameusummary(u
__locals__((u+/tmp/pip-zej_zi-build/pip/commands/unzip.pyuUnzipCommandsuUnzipCommandN(upip.commands.zipu
ZipCommanduUnzipCommand(((u+/tmp/pip-zej_zi-build/pip/commands/unzip.pyu<module>ssite-packages/pip/commands/__pycache__/__init__.cpython-33.pyc000064400000005670151733464000020262 0ustar00�
7�Re�c@s�dZddlmZddlmZddlmZddlmZddl	m
Z
ddlmZddl
mZdd	lmZdd
lmZddlmZddlmZdd
lmZieej6eej6eej6eej6eej6eej6eej6eej6eej6eej6e
e
j6eej6Zeeee
eeeeeeegZdddd�Zdd�Zdd�ZdS(u%
Package containing all pip commands
i(u
BundleCommand(uCompletionCommand(u
FreezeCommand(uHelpCommand(uListCommand(u
SearchCommand(uShowCommand(uInstallCommand(uUninstallCommand(uUnzipCommand(u
ZipCommand(uWheelCommandccsb|rttt�}ntj�}x7|D]/\}}|rL|jrLq+n||jfVq+WdS(u5Yields sorted (command name, command summary) tuples.N(u_sort_commandsucommandsucommands_orderuitemsuhiddenusummary(u
ignore_hiddenuordereducmditemsunameu
command_class((u./tmp/pip-zej_zi-build/pip/commands/__init__.pyu
get_summaries3su
get_summariescCsBddlm}||tj��}|r8|d}nd}|S(uCommand name auto-correct.i(uget_close_matchesF(udifflibuget_close_matchesucommandsukeysuFalse(unameuget_close_matchesuclose_commandsuguess((u./tmp/pip-zej_zi-build/pip/commands/__init__.pyuget_similar_commandsBs
uget_similar_commandscs(�fdd�}t|j�d|�S(Ncs2y�j|d�SWntk
r-dSYnXdS(Nii�(uindexu
ValueError(ukey(uorder(u./tmp/pip-zej_zi-build/pip/commands/__init__.pyukeyfnQs
u_sort_commands.<locals>.keyfnukey(usorteduitems(ucmddictuorderukeyfn((uorderu./tmp/pip-zej_zi-build/pip/commands/__init__.pyu_sort_commandsPsu_sort_commandsNT( u__doc__upip.commands.bundleu
BundleCommandupip.commands.completionuCompletionCommandupip.commands.freezeu
FreezeCommandupip.commands.helpuHelpCommandupip.commands.listuListCommandupip.commands.searchu
SearchCommandupip.commands.showuShowCommandupip.commands.installuInstallCommandupip.commands.uninstalluUninstallCommandupip.commands.unzipuUnzipCommandupip.commands.zipu
ZipCommandupip.commands.wheeluWheelCommandunameucommandsucommands_orderuTrueu
get_summariesuget_similar_commandsu_sort_commands(((u./tmp/pip-zej_zi-build/pip/commands/__init__.pyu<module>sN











	site-packages/pip/commands/__pycache__/uninstall.cpython-33.pyc000064400000005762151733464000020536 0ustar00�
7�Re�c@sVddlmZmZmZddlmZddlmZGdd�de�ZdS(i(uInstallRequirementuRequirementSetuparse_requirements(uCommand(uInstallationErrorcsJ|EeZdZdZdZdZdZ�fdd�Zdd�Z�S(	uUninstallCommanduB
    Uninstall packages.

    pip is able to uninstall most installed packages. Known exceptions are:

    - Pure distutils packages installed with ``python setup.py install``, which
      leave behind no metadata to determine what files were installed.
    - Script wrappers installed by ``python setup.py develop``.
    u	uninstalluU
      %prog [options] <package> ...
      %prog [options] -r <requirements file> ...uUninstall packages.c
s�tt|�j||�|jjdddddddgdd	d
d�|jjdd
ddddd
d�|jjd|j�dS(Nu-ru
--requirementudesturequirementsuactionuappendudefaultumetavarufileuhelpujUninstall all the packages listed in the given requirements file.  This option can be used multiple times.u-yu--yesuyesu
store_trueu2Don't ask for confirmation of uninstall deletions.i(usuperuUninstallCommandu__init__ucmd_optsu
add_optionuparseruinsert_option_group(uselfuargsukw(u	__class__(u//tmp/pip-zej_zi-build/pip/commands/uninstall.pyu__init__s				uUninstallCommand.__init__c	Cs�|j|�}tddddddd|�}x$|D]}|jtj|��q7WxA|jD]6}x-t|d|d|�D]}|j|�q�WqaW|js�t	dt
d|j���n|jd|j
�dS(	Nu	build_dirusrc_dirudownload_dirusessionuoptionsuLYou must give at least one requirement to %(name)s (see "pip help %(name)s")unameuauto_confirm(u_build_sessionuRequirementSetuNoneuadd_requirementuInstallRequirementu	from_lineurequirementsuparse_requirementsuhas_requirementsuInstallationErrorudictunameu	uninstalluyes(uselfuoptionsuargsusessionurequirement_setunameufilenameureq((u//tmp/pip-zej_zi-build/pip/commands/uninstall.pyurun(s"	
	uUninstallCommand.run(	u__name__u
__module__u__qualname__u__doc__unameuusageusummaryu__init__urun(u
__locals__((u	__class__u//tmp/pip-zej_zi-build/pip/commands/uninstall.pyuUninstallCommands	uUninstallCommandN(	upip.requInstallRequirementuRequirementSetuparse_requirementsupip.basecommanduCommandupip.exceptionsuInstallationErroruUninstallCommand(((u//tmp/pip-zej_zi-build/pip/commands/uninstall.pyu<module>ssite-packages/pip/commands/__pycache__/bundle.cpython-33.pyc000064400000005074151733464000017772 0ustar00�
7�Re�c@s�ddlZddlmZmZddlmZmZddlmZddl	m
Z
ddlmZGdd�de�Z
dS(	iN(ubuild_prefixu
src_prefix(udisplay_pathu
backup_dir(ulogger(uInstallationError(uInstallCommandcsV|EeZdZdZdZdZdZd	Z�fdd�Z	�fdd�Z
�S(
u
BundleCommandu9Create pybundles (archives containing multiple packages).ubundleu:
      %prog [options] <bundle name>.pybundle <package>...uDEPRECATED. Create pybundles.cs�tt|�j||�|jjd�}ttd�|_|jjd�}ttd�|_|jj	i|j|j
6|j|j
6�dS(Nu--buildu-bundleu--src(usuperu
BundleCommandu__init__uparseru
get_optionu
backup_dirubuild_prefixudefaultu
src_prefixuset_defaultsudest(uselfuargsukwu	build_optusrc_opt(u	__class__(u,/tmp/pip-zej_zi-build/pip/commands/bundle.pyu__init__s
uBundleCommand.__init__cs�tjdd�|s%td��nd|_tjdt|j�t|j�f�|j	d�|_
tt|�j
||�}|S(Nu1.6u�DEPRECATION: 'pip bundle' and support for installing from *.pybundle files is deprecated. See https://github.com/pypa/pip/pull/1046uYou must give a bundle filenameuBPutting temporary build files in %s and source/develop files in %siT(uloggeru
deprecateduInstallationErroruTrueuignore_installedunotifyudisplay_pathu	build_dirusrc_dirupopubundle_filenameusuperu
BundleCommandurun(uselfuoptionsuargsurequirement_set(u	__class__(u,/tmp/pip-zej_zi-build/pip/commands/bundle.pyuruns		 uBundleCommand.runT(u__name__u
__module__u__qualname__u__doc__unameuusageusummaryuTrueubundleu__init__urun(u
__locals__((u	__class__u,/tmp/pip-zej_zi-build/pip/commands/bundle.pyu
BundleCommand	su
BundleCommand(utextwrapu
pip.locationsubuild_prefixu
src_prefixupip.utiludisplay_pathu
backup_dirupip.loguloggerupip.exceptionsuInstallationErrorupip.commands.installuInstallCommandu
BundleCommand(((u,/tmp/pip-zej_zi-build/pip/commands/bundle.pyu<module>ssite-packages/pip/commands/__pycache__/freeze.cpython-33.pyc000064400000011656151733464000020004 0ustar00�
7�Re8c@s�ddlZddlZddlZddlmZddlmZddlmZddl	m
Z
ddlmZGdd�de�Z
dS(	iN(uInstallRequirement(ulogger(uCommand(uget_installed_distributions(u
pkg_resourcescsV|EeZdZdZdZdZdZ�fdd�Zdd�Zdd	�Z	�S(
u
FreezeCommandu1Output installed packages in requirements format.ufreezeu
      %prog [options]c
s�tt|�j||�|jjdddddddddd	d
d�|jjdd
dddddgddd
d�|jjddddddddd
d�|jjd|j�dS(Nu-ru
--requirementudesturequirementuactionustoreudefaultumetavarufileuhelpuVUse the order in the given requirements file and it's comments when generating output.u-fu--find-linksu
find_linksuappenduURLu<URL for finding packages, which will be added to the output.u-lu--localulocalu
store_trueuUIf in a virtualenv that has global access, do not output globally-installed packages.iF(	usuperu
FreezeCommandu__init__ucmd_optsu
add_optionuNoneuFalseuparseruinsert_option_group(uselfuargsukw(u	__class__(u,/tmp/pip-zej_zi-build/pip/commands/freeze.pyu__init__s,						uFreezeCommand.__init__cCstj�dS(N(uloggerumove_stdout_to_stderr(uself((u,/tmp/pip-zej_zi-build/pip/commands/freeze.pyu
setup_logging-suFreezeCommand.setup_loggingcCs�|j}|jpg}|j}d}d}|j}|rNtj|�}ng}	tj	}
x9t
jD].}|jd�rg|	j
|jd��qgqgWx*|D]"}d|kr�|	j|�q�q�Wx|D]}|
jd|�q�Wi}
x?td|�D].}tjj||	d|�}||
|j<q�W|rrt|�}x|D]}|j�sq|j�jd�r�|
j|�qIn|r�|j|�r�|
j|�qIn/|jd�s�|jd�r2|jd�r�|d	d�j�}n%|td�d�j�jd
�}tj|d|j�}n�|jd�s�|jd
�s�|jd�s�|jd�s�|jd�s�|jd�s�|jd�s�|jd�s�|jd�r�|
j|�qIntj|�}|jst j!d|j��t j!d�qIn|j|
kr:t j"d|j��qIn|
jt#|
|j��|
|j=qIW|
jd�nx9t$|
j%�ddd��D]}|
jt#|��q�WdS(Nudependency_links.txtu#egg=u-f %s
u
local_onlyu	find_tagsu#u-eu
--editableiu=udefault_vcsu-ru
--requirementu-Zu--always-unzipu-fu-iu--extra-index-urlu--find-linksu--index-urlu>Skipping line because it's not clear what it would install: %su9  (add #egg=PackageName to the URL to avoid this warning)u?Requirement file contains %s, but that package is not installedu:## The following requirements were added by pip --freeze:
ukeycSs|jS(N(uname(ux((u,/tmp/pip-zej_zi-build/pip/commands/freeze.pyu<lambda>qsu#FreezeCommand.run.<locals>.<lambda>F(&urequirementu
find_linksulocaluFalseuNoneuskip_requirements_regexureucompileusysustdoutu
pkg_resourcesuworking_setuhas_metadatauextenduget_metadata_linesuappenduwriteuget_installed_distributionsupipuFrozenRequirementu	from_distunameuopenustripu
startswithusearchulenulstripuInstallRequirementu
from_editableudefault_vcsu	from_lineuloggerunotifyuwarnustrusorteduvalues(uselfuoptionsuargsurequirementu
find_linksu
local_onlyu	find_tagsu
skip_matchu
skip_regexudependency_linksufudistulinku
installationsurequreq_fulineuline_requinstallation((u,/tmp/pip-zej_zi-build/pip/commands/freeze.pyurun0sv				


"

%
		
	%uFreezeCommand.run(
u__name__u
__module__u__qualname__u__doc__unameuusageusummaryu__init__u
setup_loggingurun(u
__locals__((u	__class__u,/tmp/pip-zej_zi-build/pip/commands/freeze.pyu
FreezeCommandsu
FreezeCommand(ureusysupipupip.requInstallRequirementupip.loguloggerupip.basecommanduCommandupip.utiluget_installed_distributionsupip._vendoru
pkg_resourcesu
FreezeCommand(((u,/tmp/pip-zej_zi-build/pip/commands/freeze.pyu<module>ssite-packages/pip/commands/__pycache__/help.cpython-33.pyc000064400000002711151733464000017444 0ustar00�
7�Re�c@s@ddlmZmZddlmZGdd�de�ZdS(i(uCommanduSUCCESS(uCommandErrorcBs8|EeZdZdZdZdZdZdd�ZdS(uHelpCommanduShow help for commandsuhelpu
      %prog <command>uShow help for commands.c	Cs�ddlm}m}y|d}Wntk
r<tSYnX||kr�||�}d|g}|r||jd|�ntdj|���n||�}|jj	�tS(Ni(ucommandsuget_similar_commandsuunknown command "%s"umaybe you meant "%s"u - (
upip.commandsucommandsuget_similar_commandsu
IndexErroruSUCCESSuappenduCommandErrorujoinuparseru
print_help(	uselfuoptionsuargsucommandsuget_similar_commandsucmd_nameuguessumsgucommand((u*/tmp/pip-zej_zi-build/pip/commands/help.pyuruns
	


uHelpCommand.runN(u__name__u
__module__u__qualname__u__doc__unameuusageusummaryurun(u
__locals__((u*/tmp/pip-zej_zi-build/pip/commands/help.pyuHelpCommands
uHelpCommandN(upip.basecommanduCommanduSUCCESSupip.exceptionsuCommandErroruHelpCommand(((u*/tmp/pip-zej_zi-build/pip/commands/help.pyu<module>ssite-packages/pip/commands/__pycache__/install.cpython-33.pyc000064400000027265151733464000020175 0ustar00�
7�Re�5c@s�ddlZddlZddlZddlZddlmZmZmZddlm	Z	ddl
mZmZm
Z
mZddlmZddlmZddlmZmZmZddlmZdd	lmZGd
d�de�ZdS(iN(uInstallRequirementuRequirementSetuparse_requirements(ulogger(u
src_prefixuvirtualenv_no_globaludistutils_schemeubuild_prefix(uCommand(u
PackageFinder(uInstallationErroruCommandErroruPreviousBuildDirError(u
cmdoptions(uBuildDirectorycs\|EeZdZdZdZdZdZdZ�fdd�Z	dd�Z
d	d
�Z�S(uInstallCommanduI
    Install packages from:

    - PyPI (and other indexes) using requirement specifiers.
    - VCS project urls.
    - Local project directories.
    - Local or remote source archives.

    pip also supports installing from "requirements files", which provide
    an easy way to specify a whole environment to be installed.
    uinstallu�
      %prog [options] <requirement specifier> ...
      %prog [options] -r <requirements file> ...
      %prog [options] [-e] <vcs project url> ...
      %prog [options] [-e] <local project path> ...
      %prog [options] <archive url/path> ...uInstall packages.c
shtt|�j||�|j}|jdddddddgdd	d
d�|jtjj��|jtjj��|jdd
ddddddd
d�|jddddddddddd
d�|jtj
j��|jdddddddddtd
d�|jdddddd d
d!�|jd"dd#dd d
d$�|jd%d&dd'dd d
d(�|jtjj��|jd)dd*dd d
d+�|jd,dd-dd d
d.�|jtj
j��|jtjj��|jd/dd0dd d
d1�|jd2dd3dd d
d4�|jd5dd6ddddd
d7�|jd8dd9dd:ddd
d;�|jd<dd dd=ddEd
d>�|jd?dd@dd=d
dA�|jtjj��|jtjj��|jdBdd ddFd
dC�|jtjj��tjtj|j�}|jjdD|�|jjdD|�dS(GNu-eu
--editableudestu	editablesuactionuappendudefaultumetavarupath/urluhelpukInstall a project in editable mode (i.e. setuptools "develop mode") from a local project path or a VCS url.u-tu--targetu
target_dirudiruInstall packages into <dir>.u-du
--downloadu--download-diru--download-directoryudownload_diru`Download packages into <dir> instead of installing them, regardless of what's already installed.u--srcu--sourceu--source-diru--source-directoryusrc_diru�Directory to check out editable projects into. The default in a virtualenv is "<venv path>/src". The default for global installs is "<current dir>/src".u-Uu	--upgradeuupgradeu
store_trueu�Upgrade all packages to the newest available version. This process is recursive regardless of whether a dependency is already satisfied.u--force-reinstalluforce_reinstalluKWhen upgrading, reinstall all packages even if they are already up-to-date.u-Iu--ignore-installeduignore_installedu5Ignore the installed packages (reinstalling instead).u--no-installu
no_installuNDEPRECATED. Download and unpack all packages, but don't actually install them.u
--no-downloaduno_downloaduDEPRECATED. Don't download any packages, just install the ones already downloaded (completes an install run with --no-install).u--useru
use_user_siteuInstall using the user scheme.u--egguas_eggu�Install packages as eggs, not 'flat', like pip normally does. This option is not about installing *from* eggs. (WARNING: Because this option overrides pip's normal install logic, requirements files may not behave as expected.)u--rootu	root_pathu=Install everything relative to this alternate root directory.u--strip-file-prefixustrip_file_prefixuprefixu5Strip given prefix from script paths in wheel RECORD.u	--compileucompileuCompile py files to pycu--no-compileustore_falseuDo not compile py files to pycu--preuYInclude pre-release and development versions. By default, pip only finds stable versions.iTF(usuperuInstallCommandu__init__ucmd_optsu
add_optionu
cmdoptionsurequirementsumakeu	build_diruNoneudownload_cacheu
src_prefixuno_depsuinstall_optionsuglobal_optionsuTrueu	use_wheeluno_use_wheeluFalseuno_cleanumake_option_groupuindex_groupuparseruinsert_option_group(uselfuargsukwucmd_optsu
index_opts(u	__class__(u-/tmp/pip-zej_zi-build/pip/commands/install.pyu__init__(s�					uInstallCommand.__init__cCsRtd|jd|d|jd|jd|jd|jd|jd|jd	|�	S(
u�
        Create a package finder appropriate to this install command.
        This method is meant to be overridden by subclasses, not
        called directly.
        u
find_linksu
index_urlsu	use_wheeluallow_externaluallow_unverifieduallow_all_externaluallow_all_prereleasesuprocess_dependency_linksusession(u
PackageFinderu
find_linksu	use_wheeluallow_externaluallow_unverifieduallow_all_externalupreuprocess_dependency_links(uselfuoptionsu
index_urlsusession((u-/tmp/pip-zej_zi-build/pip/commands/install.pyu_build_package_finder�s						u$InstallCommand._build_package_finderc+Cs|js$|js$|js$|jr7tjdd�n|jrUd.|_d.|_n|jdkr�|jsv|jr�t
|_n|jr�tjj
|j�|_ntjj
|j�|_|jp�g}|jr�t�r�td��n|jd�nd}|jr�d.|_tj�}tjj
|j�|_tjj|j�rttjj|j�rttd��n|jd|�n|jp�g}|jg|j}|jr�tjddj|��g}n|j r�tjdd	�n|j!rtjdd
�||j!7}n|j"|�}|j#|||�}|jpN|j}	t$|jd|	��}
t%d|
d
|jd|jd|j&d|j'd|j(d|jd|j)d|j*d|jd|d|d|j+�
}x'|D]}|j,t-j.|d��q�Wx0|j/D]%}|j,t-j0|d|j1��qWxG|j2D]<}
x3t3|
d|d|d|�D]}|j,|�qkWqFW|j4s�i|j5d6}|j6r�dt7|ddj|j6��}n
d |}tj8|�dSzEy |js|j9|d!|j:d"|j:�n
|j;�|jr�|j:r�|j<||d#|j=d$|j>�djd%d&�|j?D��}|r
tjd'|�q
nu|j:s�djd(d&�|j@D��}|r
tjd)|�q
n0|j:r
|jA|jB�tjd*|jB�nWntCk
r+d.|_�YnXWd|jrc|jsM|jrc|jDd"|j:�nXWdQX|jrtjj|j�s�tjE|j�ntFd+d,|�d-}xHtjG|�D]7}tHjItjj||�tjj|j|��q�WtHjJ|�n|S(/Nu1.7u~DEPRECATION: --no-install, --no-download, --build, and --no-clean are deprecated.  See https://github.com/pypa/pip/issues/906.uZCan not perform a '--user' install. User site-packages are not visible in this virtualenv.u--useru=Target path exists but is not a directory, will not continue.u--home=uIgnoring indexes: %su,u�--use-mirrors has been deprecated and will be removed in the future. Explicit uses of --index-url and/or --extra-index-url is suggested.u�--mirrors has been deprecated and will be removed in  the future. Explicit uses of --index-url and/or --extra-index-url is suggested.udeleteu	build_dirusrc_dirudownload_dirudownload_cacheuupgradeuas_egguignore_installeduignore_dependenciesuforce_reinstallu
use_user_siteu
target_dirusessionu	pycompileudefault_vcsufinderuoptionsunameu^You must give at least one requirement to %(name)s (maybe you meant "pip %(name)s %(links)s"?)ulinksu uLYou must give at least one requirement to %(name)s (see "pip help %(name)s")uforce_root_egg_infoubundleurootustrip_file_prefixcSsg|]}|j�qS((uname(u.0ureq((u-/tmp/pip-zej_zi-build/pip/commands/install.pyu
<listcomp>4s	u&InstallCommand.run.<locals>.<listcomp>uSuccessfully installed %scSsg|]}|j�qS((uname(u.0ureq((u-/tmp/pip-zej_zi-build/pip/commands/install.pyu
<listcomp>9s	uSuccessfully downloaded %suCreated bundle in %suuhomeupurelibT(Ku
no_installuno_downloadu	build_diruno_cleanuloggeru
deprecatedudownload_diruTrueuignore_installeduNoneubuild_prefixuosupathuabspathusrc_diruinstall_optionsu
use_user_siteuvirtualenv_no_globaluInstallationErroruappendu
target_dirutempfileumkdtempuexistsuisdiruCommandErroruglobal_optionsu	index_urluextra_index_urlsuno_indexunotifyujoinuuse_mirrorsumirrorsu_build_sessionu_build_package_finderuBuildDirectoryuRequirementSetudownload_cacheuupgradeuas_egguignore_dependenciesuforce_reinstallucompileuadd_requirementuInstallRequirementu	from_lineu	editablesu
from_editableudefault_vcsurequirementsuparse_requirementsuhas_requirementsunameu
find_linksudictuwarnu
prepare_filesubundleulocate_filesuinstallu	root_pathustrip_file_prefixusuccessfully_installedusuccessfully_downloadedu
create_bundleubundle_filenameuPreviousBuildDirErroru
cleanup_filesumakedirsudistutils_schemeulistdirushutilumoveurmtree(uselfuoptionsuargsuinstall_optionsutemp_target_diruglobal_optionsu
index_urlsusessionufinderubuild_deleteu	build_dirurequirement_setunameufilenameurequoptsumsgu	installedu
downloadedulib_diruitem((u-/tmp/pip-zej_zi-build/pip/commands/install.pyurun�s�											+				
											
%		"
	"
	
		
		uInstallCommand.runF(u__name__u
__module__u__qualname__u__doc__unameuusageusummaryuFalseubundleu__init__u_build_package_finderurun(u
__locals__((u	__class__u-/tmp/pip-zej_zi-build/pip/commands/install.pyuInstallCommands�uInstallCommand(uosusysutempfileushutilupip.requInstallRequirementuRequirementSetuparse_requirementsupip.loguloggeru
pip.locationsu
src_prefixuvirtualenv_no_globaludistutils_schemeubuild_prefixupip.basecommanduCommandu	pip.indexu
PackageFinderupip.exceptionsuInstallationErroruCommandErroruPreviousBuildDirErrorupipu
cmdoptionsupip.utiluBuildDirectoryuInstallCommand(((u-/tmp/pip-zej_zi-build/pip/commands/install.pyu<module>s"site-packages/pip/commands/__pycache__/search.cpython-33.pyc000064400000015226151733464000017766 0ustar00�
7�Re�c@sddlZddlZddlZddlmZmZddlmZddl	m
Z
ddlmZm
Z
mZddlmZddlmZddlmZdd	lmZmZGd
d�de�Zdd
�Zdddd�Zdd�Zdd�ZdS(iN(uCommanduSUCCESS(uget_terminal_size(ulogger(u	xmlrpclibureduceucmp(uCommandError(uNO_MATCHES_FOUND(u
pkg_resources(u
StrictVersionuLooseVersioncsV|EeZdZdZdZdZdZ�fdd�Zdd�Zd	d
�Z	�S(u
SearchCommandu@Search for PyPI packages whose name or summary contains <query>.usearchu
      %prog [options] <query>uSearch PyPI for packages.c
s[tt|�j||�|jjddddddddd	�|jjd
|j�dS(Nu--indexudestuindexumetavaruURLudefaultuhttps://pypi.python.org/pypiuhelpu3Base URL of Python Package Index (default %default)i(usuperu
SearchCommandu__init__ucmd_optsu
add_optionuparseruinsert_option_group(uselfuargsukw(u	__class__(u,/tmp/pip-zej_zi-build/pip/commands/search.pyu__init__s	uSearchCommand.__init__cCs�|std��n|}|j}|j||�}t|�}d}tjj�rgt�d}nt	|d|�|r�t
StS(Nu)Missing required argument (search query).iuterminal_width(uCommandErroruindexusearchutransform_hitsuNoneusysustdoutuisattyuget_terminal_sizeu
print_resultsuSUCCESSuNO_MATCHES_FOUND(uselfuoptionsuargsuqueryu	index_urlu	pypi_hitsuhitsuterminal_width((u,/tmp/pip-zej_zi-build/pip/commands/search.pyurun"s	uSearchCommand.runcCs3tj|�}|ji|d6|d6d�}|S(Nunameusummaryuor(u	xmlrpclibuServerProxyusearch(uselfuqueryu	index_urlupypiuhits((u,/tmp/pip-zej_zi-build/pip/commands/search.pyusearch4s uSearchCommand.search(
u__name__u
__module__u__qualname__u__doc__unameuusageusummaryu__init__urunusearch(u
__locals__((u	__class__u,/tmp/pip-zej_zi-build/pip/commands/search.pyu
SearchCommandsu
SearchCommandcCsi}x�|D]�}|d}|d}|d}|d}|dkrPd}n||j�kr�i|d6|d6|gd6|d6||<q
||dj|�|t||d�kr
|||d<|||d<q
q
Wt|j�dd	d
�dd
�}|S(u�
    The list from pypi is really a list of versions. We want a list of
    packages with the list of versions stored inline. This converts the
    list from pypi into one we can use.
    unameusummaryuversionu_pypi_orderingiuversionsuscoreukeycSs|dS(Nuscore((ux((u,/tmp/pip-zej_zi-build/pip/commands/search.pyu<lambda>Tsu transform_hits.<locals>.<lambda>ureverseNT(uNoneukeysuappenduhighest_versionusorteduvaluesuTrue(uhitsupackagesuhitunameusummaryuversionuscoreupackage_list((u,/tmp/pip-zej_zi-build/pip/commands/search.pyutransform_hits:s 




	,$utransform_hitsic
Csgdd�tjD�}xJ|D]B}|d}|dp:d}|dk	r�tj|||d�}dd|d	j|�}nd
|j|�|f}y�tj|�||krItj	|�}tj
d7_
z_t|d�}	|j|	kr
tjd
|j�n%tjd|j�tjd|	�Wdtj
d8_
XnWqt
k
r^YqXqWdS(NcSsg|]}|j�qS((uproject_name(u.0up((u,/tmp/pip-zej_zi-build/pip/commands/search.pyu
<listcomp>Ys	u!print_results.<locals>.<listcomp>unameusummaryuiu
u iu%s - %siuversionsuINSTALLED: %s (latest)u
INSTALLED: %su
LATEST:    %s(u
pkg_resourcesuworking_setuNoneutextwrapuwrapujoinuljustuloggerunotifyuget_distributionuindentuhighest_versionuversionuUnicodeEncodeError(
uhitsuname_column_widthuterminal_widthuinstalled_packagesuhitunameusummaryulineudistulatest((u,/tmp/pip-zej_zi-build/pip/commands/search.pyu
print_resultsXs,



u
print_resultscCs�ytt|�t|��SWntk
r1YnXytt|�t|��SWnKtk
r�tdd�t|�jD�dd�t|�jD��SYnXdS(NcSsg|]}t|��qS((ustr(u.0uv((u,/tmp/pip-zej_zi-build/pip/commands/search.pyu
<listcomp>s	u$compare_versions.<locals>.<listcomp>cSsg|]}t|��qS((ustr(u.0uv((u,/tmp/pip-zej_zi-build/pip/commands/search.pyu
<listcomp>�s	(ucmpu
StrictVersionu
ValueErroruLooseVersionu	TypeErroruversion(uversion1uversion2((u,/tmp/pip-zej_zi-build/pip/commands/search.pyucompare_versionsts

ucompare_versionscCstdd�|�S(NcSst||�dkr|p|S(Ni(ucompare_versions(uv1uv2((u,/tmp/pip-zej_zi-build/pip/commands/search.pyu<lambda>�su!highest_version.<locals>.<lambda>(ureduce(uversions((u,/tmp/pip-zej_zi-build/pip/commands/search.pyuhighest_version�suhighest_version(usysutextwrapupip.downloadupipupip.basecommanduCommanduSUCCESSupip.utiluget_terminal_sizeupip.loguloggerupip.backwardcompatu	xmlrpclibureduceucmpupip.exceptionsuCommandErrorupip.status_codesuNO_MATCHES_FOUNDupip._vendoru
pkg_resourcesudistutils.versionu
StrictVersionuLooseVersionu
SearchCommandutransform_hitsuNoneu
print_resultsucompare_versionsuhighest_version(((u,/tmp/pip-zej_zi-build/pip/commands/search.pyu<module>s*site-packages/pip/commands/completion.py000064400000003456151733464000014413 0ustar00import sys
from pip.basecommand import Command

BASE_COMPLETION = """
# pip %(shell)s completion start%(script)s# pip %(shell)s completion end
"""

COMPLETION_SCRIPTS = {
    'bash': """
_pip_completion()
{
    COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \\
                   COMP_CWORD=$COMP_CWORD \\
                   PIP_AUTO_COMPLETE=1 $1 ) )
}
complete -o default -F _pip_completion pip
""", 'zsh': """
function _pip_completion {
  local words cword
  read -Ac words
  read -cn cword
  reply=( $( COMP_WORDS="$words[*]" \\
             COMP_CWORD=$(( cword-1 )) \\
             PIP_AUTO_COMPLETE=1 $words[1] ) )
}
compctl -K _pip_completion pip
"""}


class CompletionCommand(Command):
    """A helper command to be used for command completion."""
    name = 'completion'
    summary = 'A helper command to be used for command completion'
    hidden = True

    def __init__(self, *args, **kw):
        super(CompletionCommand, self).__init__(*args, **kw)
        self.parser.add_option(
            '--bash', '-b',
            action='store_const',
            const='bash',
            dest='shell',
            help='Emit completion code for bash')
        self.parser.add_option(
            '--zsh', '-z',
            action='store_const',
            const='zsh',
            dest='shell',
            help='Emit completion code for zsh')

    def run(self, options, args):
        """Prints the completion code of the given shell"""
        shells = COMPLETION_SCRIPTS.keys()
        shell_options = ['--' + shell for shell in sorted(shells)]
        if options.shell in shells:
            script = COMPLETION_SCRIPTS.get(options.shell, '')
            print(BASE_COMPLETION % {'script': script, 'shell': options.shell})
        else:
            sys.stderr.write('ERROR: You must pass %s\n' % ' or '.join(shell_options))
site-packages/pip/commands/zip.py000064400000034745151733464000013051 0ustar00import sys
import re
import fnmatch
import os
import shutil
import zipfile
from pip.util import display_path, backup_dir, rmtree
from pip.log import logger
from pip.exceptions import InstallationError
from pip.basecommand import Command


class ZipCommand(Command):
    """Zip individual packages."""
    name = 'zip'
    usage = """
     %prog [options] <package> ..."""
    summary = 'DEPRECATED. Zip individual packages.'

    def __init__(self, *args, **kw):
        super(ZipCommand, self).__init__(*args, **kw)
        if self.name == 'zip':
            self.cmd_opts.add_option(
                '--unzip',
                action='store_true',
                dest='unzip',
                help='Unzip (rather than zip) a package.')
        else:
            self.cmd_opts.add_option(
                '--zip',
                action='store_false',
                dest='unzip',
                default=True,
                help='Zip (rather than unzip) a package.')
        self.cmd_opts.add_option(
            '--no-pyc',
            action='store_true',
            dest='no_pyc',
            help='Do not include .pyc files in zip files (useful on Google App Engine).')
        self.cmd_opts.add_option(
            '-l', '--list',
            action='store_true',
            dest='list',
            help='List the packages available, and their zip status.')
        self.cmd_opts.add_option(
            '--sort-files',
            action='store_true',
            dest='sort_files',
            help='With --list, sort packages according to how many files they contain.')
        self.cmd_opts.add_option(
            '--path',
            action='append',
            dest='paths',
            help='Restrict operations to the given paths (may include wildcards).')
        self.cmd_opts.add_option(
            '-n', '--simulate',
            action='store_true',
            help='Do not actually perform the zip/unzip operation.')

        self.parser.insert_option_group(0, self.cmd_opts)

    def paths(self):
        """All the entries of sys.path, possibly restricted by --path"""
        if not self.select_paths:
            return sys.path
        result = []
        match_any = set()
        for path in sys.path:
            path = os.path.normcase(os.path.abspath(path))
            for match in self.select_paths:
                match = os.path.normcase(os.path.abspath(match))
                if '*' in match:
                    if re.search(fnmatch.translate(match + '*'), path):
                        result.append(path)
                        match_any.add(match)
                        break
                else:
                    if path.startswith(match):
                        result.append(path)
                        match_any.add(match)
                        break
            else:
                logger.debug("Skipping path %s because it doesn't match %s"
                             % (path, ', '.join(self.select_paths)))
        for match in self.select_paths:
            if match not in match_any and '*' not in match:
                result.append(match)
                logger.debug("Adding path %s because it doesn't match "
                             "anything already on sys.path" % match)
        return result

    def run(self, options, args):

        logger.deprecated('1.7', "DEPRECATION: 'pip zip' and 'pip unzip` are deprecated, and will be removed in a future release.")

        self.select_paths = options.paths
        self.simulate = options.simulate
        if options.list:
            return self.list(options, args)
        if not args:
            raise InstallationError(
                'You must give at least one package to zip or unzip')
        packages = []
        for arg in args:
            module_name, filename = self.find_package(arg)
            if options.unzip and os.path.isdir(filename):
                raise InstallationError(
                    'The module %s (in %s) is not a zip file; cannot be unzipped'
                    % (module_name, filename))
            elif not options.unzip and not os.path.isdir(filename):
                raise InstallationError(
                    'The module %s (in %s) is not a directory; cannot be zipped'
                    % (module_name, filename))
            packages.append((module_name, filename))
        last_status = None
        for module_name, filename in packages:
            if options.unzip:
                last_status = self.unzip_package(module_name, filename)
            else:
                last_status = self.zip_package(module_name, filename, options.no_pyc)
        return last_status

    def unzip_package(self, module_name, filename):
        zip_filename = os.path.dirname(filename)
        if not os.path.isfile(zip_filename) and zipfile.is_zipfile(zip_filename):
            raise InstallationError(
                'Module %s (in %s) isn\'t located in a zip file in %s'
                % (module_name, filename, zip_filename))
        package_path = os.path.dirname(zip_filename)
        if not package_path in self.paths():
            logger.warn(
                'Unpacking %s into %s, but %s is not on sys.path'
                % (display_path(zip_filename), display_path(package_path),
                   display_path(package_path)))
        logger.notify('Unzipping %s (in %s)' % (module_name, display_path(zip_filename)))
        if self.simulate:
            logger.notify('Skipping remaining operations because of --simulate')
            return
        logger.indent += 2
        try:
            ## FIXME: this should be undoable:
            zip = zipfile.ZipFile(zip_filename)
            to_save = []
            for info in zip.infolist():
                name = info.filename
                if name.startswith(module_name + os.path.sep):
                    content = zip.read(name)
                    dest = os.path.join(package_path, name)
                    if not os.path.exists(os.path.dirname(dest)):
                        os.makedirs(os.path.dirname(dest))
                    if not content and dest.endswith(os.path.sep):
                        if not os.path.exists(dest):
                            os.makedirs(dest)
                    else:
                        f = open(dest, 'wb')
                        f.write(content)
                        f.close()
                else:
                    to_save.append((name, zip.read(name)))
            zip.close()
            if not to_save:
                logger.info('Removing now-empty zip file %s' % display_path(zip_filename))
                os.unlink(zip_filename)
                self.remove_filename_from_pth(zip_filename)
            else:
                logger.info('Removing entries in %s/ from zip file %s' % (module_name, display_path(zip_filename)))
                zip = zipfile.ZipFile(zip_filename, 'w')
                for name, content in to_save:
                    zip.writestr(name, content)
                zip.close()
        finally:
            logger.indent -= 2

    def zip_package(self, module_name, filename, no_pyc):
        orig_filename = filename
        logger.notify('Zip %s (in %s)' % (module_name, display_path(filename)))
        logger.indent += 2
        if filename.endswith('.egg'):
            dest_filename = filename
        else:
            dest_filename = filename + '.zip'
        try:
            ## FIXME: I think this needs to be undoable:
            if filename == dest_filename:
                filename = backup_dir(orig_filename)
                logger.notify('Moving %s aside to %s' % (orig_filename, filename))
                if not self.simulate:
                    shutil.move(orig_filename, filename)
            try:
                logger.info('Creating zip file in %s' % display_path(dest_filename))
                if not self.simulate:
                    zip = zipfile.ZipFile(dest_filename, 'w')
                    zip.writestr(module_name + '/', '')
                    for dirpath, dirnames, filenames in os.walk(filename):
                        if no_pyc:
                            filenames = [f for f in filenames
                                         if not f.lower().endswith('.pyc')]
                        for fns, is_dir in [(dirnames, True), (filenames, False)]:
                            for fn in fns:
                                full = os.path.join(dirpath, fn)
                                dest = os.path.join(module_name, dirpath[len(filename):].lstrip(os.path.sep), fn)
                                if is_dir:
                                    zip.writestr(dest + '/', '')
                                else:
                                    zip.write(full, dest)
                    zip.close()
                logger.info('Removing old directory %s' % display_path(filename))
                if not self.simulate:
                    rmtree(filename)
            except:
                ## FIXME: need to do an undo here
                raise
            ## FIXME: should also be undone:
            self.add_filename_to_pth(dest_filename)
        finally:
            logger.indent -= 2

    def remove_filename_from_pth(self, filename):
        for pth in self.pth_files():
            f = open(pth, 'r')
            lines = f.readlines()
            f.close()
            new_lines = [
                l for l in lines if l.strip() != filename]
            if lines != new_lines:
                logger.info('Removing reference to %s from .pth file %s'
                            % (display_path(filename), display_path(pth)))
                if not [line for line in new_lines if line]:
                    logger.info('%s file would be empty: deleting' % display_path(pth))
                    if not self.simulate:
                        os.unlink(pth)
                else:
                    if not self.simulate:
                        f = open(pth, 'wb')
                        f.writelines(new_lines)
                        f.close()
                return
        logger.warn('Cannot find a reference to %s in any .pth file' % display_path(filename))

    def add_filename_to_pth(self, filename):
        path = os.path.dirname(filename)
        dest = filename + '.pth'
        if path not in self.paths():
            logger.warn('Adding .pth file %s, but it is not on sys.path' % display_path(dest))
        if not self.simulate:
            if os.path.exists(dest):
                f = open(dest)
                lines = f.readlines()
                f.close()
                if lines and not lines[-1].endswith('\n'):
                    lines[-1] += '\n'
                lines.append(filename + '\n')
            else:
                lines = [filename + '\n']
            f = open(dest, 'wb')
            f.writelines(lines)
            f.close()

    def pth_files(self):
        for path in self.paths():
            if not os.path.exists(path) or not os.path.isdir(path):
                continue
            for filename in os.listdir(path):
                if filename.endswith('.pth'):
                    yield os.path.join(path, filename)

    def find_package(self, package):
        for path in self.paths():
            full = os.path.join(path, package)
            if os.path.exists(full):
                return package, full
            if not os.path.isdir(path) and zipfile.is_zipfile(path):
                zip = zipfile.ZipFile(path, 'r')
                try:
                    zip.read(os.path.join(package, '__init__.py'))
                except KeyError:
                    pass
                else:
                    zip.close()
                    return package, full
                zip.close()
        ## FIXME: need special error for package.py case:
        raise InstallationError(
            'No package with the name %s found' % package)

    def list(self, options, args):
        if args:
            raise InstallationError(
                'You cannot give an argument with --list')
        for path in sorted(self.paths()):
            if not os.path.exists(path):
                continue
            basename = os.path.basename(path.rstrip(os.path.sep))
            if os.path.isfile(path) and zipfile.is_zipfile(path):
                if os.path.dirname(path) not in self.paths():
                    logger.notify('Zipped egg: %s' % display_path(path))
                continue
            if (basename != 'site-packages' and basename != 'dist-packages'
                and not path.replace('\\', '/').endswith('lib/python')):
                continue
            logger.notify('In %s:' % display_path(path))
            logger.indent += 2
            zipped = []
            unzipped = []
            try:
                for filename in sorted(os.listdir(path)):
                    ext = os.path.splitext(filename)[1].lower()
                    if ext in ('.pth', '.egg-info', '.egg-link'):
                        continue
                    if ext == '.py':
                        logger.info('Not displaying %s: not a package' % display_path(filename))
                        continue
                    full = os.path.join(path, filename)
                    if os.path.isdir(full):
                        unzipped.append((filename, self.count_package(full)))
                    elif zipfile.is_zipfile(full):
                        zipped.append(filename)
                    else:
                        logger.info('Unknown file: %s' % display_path(filename))
                if zipped:
                    logger.notify('Zipped packages:')
                    logger.indent += 2
                    try:
                        for filename in zipped:
                            logger.notify(filename)
                    finally:
                        logger.indent -= 2
                else:
                    logger.notify('No zipped packages.')
                if unzipped:
                    if options.sort_files:
                        unzipped.sort(key=lambda x: -x[1])
                    logger.notify('Unzipped packages:')
                    logger.indent += 2
                    try:
                        for filename, count in unzipped:
                            logger.notify('%s  (%i files)' % (filename, count))
                    finally:
                        logger.indent -= 2
                else:
                    logger.notify('No unzipped packages.')
            finally:
                logger.indent -= 2

    def count_package(self, path):
        total = 0
        for dirpath, dirnames, filenames in os.walk(path):
            filenames = [f for f in filenames
                         if not f.lower().endswith('.pyc')]
            total += len(filenames)
        return total
site-packages/pip/commands/freeze.py000064400000011070151733464000013511 0ustar00import re
import sys
import pip

from pip.req import InstallRequirement
from pip.log import logger
from pip.basecommand import Command
from pip.util import get_installed_distributions
from pip._vendor import pkg_resources


class FreezeCommand(Command):
    """Output installed packages in requirements format."""
    name = 'freeze'
    usage = """
      %prog [options]"""
    summary = 'Output installed packages in requirements format.'

    def __init__(self, *args, **kw):
        super(FreezeCommand, self).__init__(*args, **kw)

        self.cmd_opts.add_option(
            '-r', '--requirement',
            dest='requirement',
            action='store',
            default=None,
            metavar='file',
            help="Use the order in the given requirements file and it's comments when generating output.")
        self.cmd_opts.add_option(
            '-f', '--find-links',
            dest='find_links',
            action='append',
            default=[],
            metavar='URL',
            help='URL for finding packages, which will be added to the output.')
        self.cmd_opts.add_option(
            '-l', '--local',
            dest='local',
            action='store_true',
            default=False,
            help='If in a virtualenv that has global access, do not output globally-installed packages.')

        self.parser.insert_option_group(0, self.cmd_opts)

    def setup_logging(self):
        logger.move_stdout_to_stderr()

    def run(self, options, args):
        requirement = options.requirement
        find_links = options.find_links or []
        local_only = options.local
        ## FIXME: Obviously this should be settable:
        find_tags = False
        skip_match = None

        skip_regex = options.skip_requirements_regex
        if skip_regex:
            skip_match = re.compile(skip_regex)

        dependency_links = []

        f = sys.stdout

        for dist in pkg_resources.working_set:
            if dist.has_metadata('dependency_links.txt'):
                dependency_links.extend(dist.get_metadata_lines('dependency_links.txt'))
        for link in find_links:
            if '#egg=' in link:
                dependency_links.append(link)
        for link in find_links:
            f.write('-f %s\n' % link)
        installations = {}
        for dist in get_installed_distributions(local_only=local_only):
            req = pip.FrozenRequirement.from_dist(dist, dependency_links, find_tags=find_tags)
            installations[req.name] = req
        if requirement:
            req_f = open(requirement)
            for line in req_f:
                if not line.strip() or line.strip().startswith('#'):
                    f.write(line)
                    continue
                if skip_match and skip_match.search(line):
                    f.write(line)
                    continue
                elif line.startswith('-e') or line.startswith('--editable'):
                    if line.startswith('-e'):
                        line = line[2:].strip()
                    else:
                        line = line[len('--editable'):].strip().lstrip('=')
                    line_req = InstallRequirement.from_editable(line, default_vcs=options.default_vcs)
                elif (line.startswith('-r') or line.startswith('--requirement')
                      or line.startswith('-Z') or line.startswith('--always-unzip')
                      or line.startswith('-f') or line.startswith('-i')
                      or line.startswith('--extra-index-url')
                      or line.startswith('--find-links')
                      or line.startswith('--index-url')):
                    f.write(line)
                    continue
                else:
                    line_req = InstallRequirement.from_line(line)
                if not line_req.name:
                    logger.notify("Skipping line because it's not clear what it would install: %s"
                                  % line.strip())
                    logger.notify("  (add #egg=PackageName to the URL to avoid this warning)")
                    continue
                if line_req.name not in installations:
                    logger.warn("Requirement file contains %s, but that package is not installed"
                                % line.strip())
                    continue
                f.write(str(installations[line_req.name]))
                del installations[line_req.name]
            f.write('## The following requirements were added by pip --freeze:\n')
        for installation in sorted(installations.values(), key=lambda x: x.name):
            f.write(str(installation))
site-packages/pip/commands/wheel.py000064400000017042151733464000013342 0ustar00# -*- coding: utf-8 -*-
from __future__ import absolute_import

import os
import sys
from pip.basecommand import Command
from pip.index import PackageFinder
from pip.log import logger
from pip.exceptions import CommandError, PreviousBuildDirError
from pip.req import InstallRequirement, RequirementSet, parse_requirements
from pip.util import BuildDirectory, normalize_path
from pip.wheel import WheelBuilder
from pip import cmdoptions

DEFAULT_WHEEL_DIR = os.path.join(normalize_path(os.curdir), 'wheelhouse')

class WheelCommand(Command):
    """
    Build Wheel archives for your requirements and dependencies.

    Wheel is a built-package format, and offers the advantage of not recompiling your software during every install.
    For more details, see the wheel docs: http://wheel.readthedocs.org/en/latest.

    Requirements: setuptools>=0.8, and wheel.

    'pip wheel' uses the bdist_wheel setuptools extension from the wheel package to build individual wheels.

    """

    name = 'wheel'
    usage = """
      %prog [options] <requirement specifier> ...
      %prog [options] -r <requirements file> ...
      %prog [options] <vcs project url> ...
      %prog [options] <local project path> ...
      %prog [options] <archive url/path> ..."""

    summary = 'Build wheels from your requirements.'

    def __init__(self, *args, **kw):
        super(WheelCommand, self).__init__(*args, **kw)

        cmd_opts = self.cmd_opts

        cmd_opts.add_option(
            '-w', '--wheel-dir',
            dest='wheel_dir',
            metavar='dir',
            default=DEFAULT_WHEEL_DIR,
            help="Build wheels into <dir>, where the default is '<cwd>/wheelhouse'.")
        cmd_opts.add_option(cmdoptions.use_wheel.make())
        cmd_opts.add_option(cmdoptions.no_use_wheel.make())
        cmd_opts.add_option(
            '--build-option',
            dest='build_options',
            metavar='options',
            action='append',
            help="Extra arguments to be supplied to 'setup.py bdist_wheel'.")
        cmd_opts.add_option(cmdoptions.requirements.make())
        cmd_opts.add_option(cmdoptions.download_cache.make())
        cmd_opts.add_option(cmdoptions.no_deps.make())
        cmd_opts.add_option(cmdoptions.build_dir.make())

        cmd_opts.add_option(
            '--global-option',
            dest='global_options',
            action='append',
            metavar='options',
            help="Extra global options to be supplied to the setup.py "
            "call before the 'bdist_wheel' command.")

        cmd_opts.add_option(
            '--pre',
            action='store_true',
            default=False,
            help="Include pre-release and development versions. By default, pip only finds stable versions.")

        cmd_opts.add_option(cmdoptions.no_clean.make())

        index_opts = cmdoptions.make_option_group(cmdoptions.index_group, self.parser)

        self.parser.insert_option_group(0, index_opts)
        self.parser.insert_option_group(0, cmd_opts)

    def run(self, options, args):

        # confirm requirements
        try:
            import wheel.bdist_wheel
        except ImportError:
            raise CommandError("'pip wheel' requires the 'wheel' package. To fix this, run:  pip install wheel")

        try:
            import pkg_resources
        except ImportError:
            raise CommandError(
                "'pip wheel' requires setuptools >= 0.8 for dist-info support."
                " To fix this, run: pip install --upgrade setuptools"
            )
        else:
            if not hasattr(pkg_resources, 'DistInfoDistribution'):
                raise CommandError(
                    "'pip wheel' requires setuptools >= 0.8 for dist-info "
                    "support. To fix this, run: pip install --upgrade "
                    "setuptools"
                )

        index_urls = [options.index_url] + options.extra_index_urls
        if options.no_index:
            logger.notify('Ignoring indexes: %s' % ','.join(index_urls))
            index_urls = []

        if options.use_mirrors:
            logger.deprecated("1.7",
                        "--use-mirrors has been deprecated and will be removed"
                        " in the future. Explicit uses of --index-url and/or "
                        "--extra-index-url is suggested.")

        if options.mirrors:
            logger.deprecated("1.7",
                        "--mirrors has been deprecated and will be removed in "
                        " the future. Explicit uses of --index-url and/or "
                        "--extra-index-url is suggested.")
            index_urls += options.mirrors

        if options.build_dir:
            options.build_dir = os.path.abspath(options.build_dir)

        session = self._build_session(options)

        finder = PackageFinder(find_links=options.find_links,
                               index_urls=index_urls,
                               use_wheel=options.use_wheel,
                               allow_external=options.allow_external,
                               allow_unverified=options.allow_unverified,
                               allow_all_external=options.allow_all_external,
                               allow_all_prereleases=options.pre,
                               process_dependency_links=
                                options.process_dependency_links,
                               session=session,
                            )

        build_delete = (not (options.no_clean or options.build_dir))
        with BuildDirectory(options.build_dir, delete=build_delete) as build_dir:
            requirement_set = RequirementSet(
                build_dir=build_dir,
                src_dir=None,
                download_dir=None,
                download_cache=options.download_cache,
                ignore_dependencies=options.ignore_dependencies,
                ignore_installed=True,
                session=session,
                wheel_download_dir=options.wheel_dir
            )

            # make the wheelhouse
            if not os.path.exists(options.wheel_dir):
                os.makedirs(options.wheel_dir)

            #parse args and/or requirements files
            for name in args:
                requirement_set.add_requirement(
                    InstallRequirement.from_line(name, None))

            for filename in options.requirements:
                for req in parse_requirements(
                    filename,
                    finder=finder,
                    options=options,
                    session=session):
                    if req.editable:
                        logger.notify("ignoring %s" % req.url)
                        continue
                    requirement_set.add_requirement(req)

            #fail if no requirements
            if not requirement_set.has_requirements:
                opts = {'name': self.name}
                msg = ('You must give at least one requirement '
                       'to %(name)s (see "pip help %(name)s")' % opts)
                logger.error(msg)
                return

            try:
                #build wheels
                wb = WheelBuilder(
                    requirement_set,
                    finder,
                    options.wheel_dir,
                    build_options = options.build_options or [],
                    global_options = options.global_options or []
                    )
                wb.build()
            except PreviousBuildDirError:
                options.no_clean = True
                raise
            finally:
                if not options.no_clean:
                    requirement_set.cleanup_files()
site-packages/pip/commands/__init__.py000064400000004274151733464000014000 0ustar00"""
Package containing all pip commands
"""


from pip.commands.bundle import BundleCommand
from pip.commands.completion import CompletionCommand
from pip.commands.freeze import FreezeCommand
from pip.commands.help import HelpCommand
from pip.commands.list import ListCommand
from pip.commands.search import SearchCommand
from pip.commands.show import ShowCommand
from pip.commands.install import InstallCommand
from pip.commands.uninstall import UninstallCommand
from pip.commands.unzip import UnzipCommand
from pip.commands.zip import ZipCommand
from pip.commands.wheel import WheelCommand


commands = {
    BundleCommand.name: BundleCommand,
    CompletionCommand.name: CompletionCommand,
    FreezeCommand.name: FreezeCommand,
    HelpCommand.name: HelpCommand,
    SearchCommand.name: SearchCommand,
    ShowCommand.name: ShowCommand,
    InstallCommand.name: InstallCommand,
    UninstallCommand.name: UninstallCommand,
    UnzipCommand.name: UnzipCommand,
    ZipCommand.name: ZipCommand,
    ListCommand.name: ListCommand,
    WheelCommand.name: WheelCommand,
}


commands_order = [
    InstallCommand,
    UninstallCommand,
    FreezeCommand,
    ListCommand,
    ShowCommand,
    SearchCommand,
    WheelCommand,
    ZipCommand,
    UnzipCommand,
    BundleCommand,
    HelpCommand,
]


def get_summaries(ignore_hidden=True, ordered=True):
    """Yields sorted (command name, command summary) tuples."""

    if ordered:
        cmditems = _sort_commands(commands, commands_order)
    else:
        cmditems = commands.items()

    for name, command_class in cmditems:
        if ignore_hidden and command_class.hidden:
            continue

        yield (name, command_class.summary)


def get_similar_commands(name):
    """Command name auto-correct."""
    from difflib import get_close_matches

    close_commands = get_close_matches(name, commands.keys())

    if close_commands:
        guess = close_commands[0]
    else:
        guess = False

    return guess


def _sort_commands(cmddict, order):
    def keyfn(key):
        try:
            return order.index(key[1])
        except ValueError:
            # unordered items should come last
            return 0xff

    return sorted(cmddict.items(), key=keyfn)
site-packages/pip/commands/show.py000064400000005317151733464000013220 0ustar00import os

from pip.basecommand import Command
from pip.log import logger
from pip._vendor import pkg_resources


class ShowCommand(Command):
    """Show information about one or more installed packages."""
    name = 'show'
    usage = """
      %prog [options] <package> ..."""
    summary = 'Show information about installed packages.'

    def __init__(self, *args, **kw):
        super(ShowCommand, self).__init__(*args, **kw)
        self.cmd_opts.add_option(
            '-f', '--files',
            dest='files',
            action='store_true',
            default=False,
            help='Show the full list of installed files for each package.')

        self.parser.insert_option_group(0, self.cmd_opts)

    def run(self, options, args):
        if not args:
            logger.warn('ERROR: Please provide a package name or names.')
            return
        query = args

        results = search_packages_info(query)
        print_results(results, options.files)


def search_packages_info(query):
    """
    Gather details from installed distributions. Print distribution name,
    version, location, and installed files. Installed files requires a
    pip generated 'installed-files.txt' in the distributions '.egg-info'
    directory.
    """
    installed_packages = dict(
        [(p.project_name.lower(), p) for p in pkg_resources.working_set])
    for name in query:
        normalized_name = name.lower()
        if normalized_name in installed_packages:
            dist = installed_packages[normalized_name]
            package = {
                'name': dist.project_name,
                'version': dist.version,
                'location': dist.location,
                'requires': [dep.project_name for dep in dist.requires()],
            }
            filelist = os.path.join(
                       dist.location,
                       dist.egg_name() + '.egg-info',
                       'installed-files.txt')
            if os.path.isfile(filelist):
                package['files'] = filelist
            yield package


def print_results(distributions, list_all_files):
    """
    Print the informations from installed distributions found.
    """
    for dist in distributions:
        logger.notify("---")
        logger.notify("Name: %s" % dist['name'])
        logger.notify("Version: %s" % dist['version'])
        logger.notify("Location: %s" % dist['location'])
        logger.notify("Requires: %s" % ', '.join(dist['requires']))
        if list_all_files:
            logger.notify("Files:")
            if 'files' in dist:
                for line in open(dist['files']):
                    logger.notify("  %s" % line.strip())
            else:
                logger.notify("Cannot locate installed-files.txt")
site-packages/pip/commands/uninstall.py000064400000004233151733464010014246 0ustar00from pip.req import InstallRequirement, RequirementSet, parse_requirements
from pip.basecommand import Command
from pip.exceptions import InstallationError


class UninstallCommand(Command):
    """
    Uninstall packages.

    pip is able to uninstall most installed packages. Known exceptions are:

    - Pure distutils packages installed with ``python setup.py install``, which
      leave behind no metadata to determine what files were installed.
    - Script wrappers installed by ``python setup.py develop``.
    """
    name = 'uninstall'
    usage = """
      %prog [options] <package> ...
      %prog [options] -r <requirements file> ..."""
    summary = 'Uninstall packages.'

    def __init__(self, *args, **kw):
        super(UninstallCommand, self).__init__(*args, **kw)
        self.cmd_opts.add_option(
            '-r', '--requirement',
            dest='requirements',
            action='append',
            default=[],
            metavar='file',
            help='Uninstall all the packages listed in the given requirements file.  '
            'This option can be used multiple times.')
        self.cmd_opts.add_option(
            '-y', '--yes',
            dest='yes',
            action='store_true',
            help="Don't ask for confirmation of uninstall deletions.")

        self.parser.insert_option_group(0, self.cmd_opts)

    def run(self, options, args):
        session = self._build_session(options)

        requirement_set = RequirementSet(
            build_dir=None,
            src_dir=None,
            download_dir=None,
            session=session,
        )
        for name in args:
            requirement_set.add_requirement(
                InstallRequirement.from_line(name))
        for filename in options.requirements:
            for req in parse_requirements(filename,
                    options=options, session=session):
                requirement_set.add_requirement(req)
        if not requirement_set.has_requirements:
            raise InstallationError('You must give at least one requirement '
                'to %(name)s (see "pip help %(name)s")' % dict(name=self.name))
        requirement_set.uninstall(auto_confirm=options.yes)
site-packages/pip/commands/help.py000064400000001637151733464010013172 0ustar00from pip.basecommand import Command, SUCCESS
from pip.exceptions import CommandError


class HelpCommand(Command):
    """Show help for commands"""
    name = 'help'
    usage = """
      %prog <command>"""
    summary = 'Show help for commands.'

    def run(self, options, args):
        from pip.commands import commands, get_similar_commands

        try:
            # 'pip help' with no args is handled by pip.__init__.parseopt()
            cmd_name = args[0]  # the command we need help for
        except IndexError:
            return SUCCESS

        if cmd_name not in commands:
            guess = get_similar_commands(cmd_name)

            msg = ['unknown command "%s"' % cmd_name]
            if guess:
                msg.append('maybe you meant "%s"' % guess)

            raise CommandError(' - '.join(msg))

        command = commands[cmd_name]()
        command.parser.print_help()

        return SUCCESS
site-packages/pip/commands/bundle.py000064400000003373151733464010013512 0ustar00import textwrap
from pip.locations import build_prefix, src_prefix
from pip.util import display_path, backup_dir
from pip.log import logger
from pip.exceptions import InstallationError
from pip.commands.install import InstallCommand


class BundleCommand(InstallCommand):
    """Create pybundles (archives containing multiple packages)."""
    name = 'bundle'
    usage = """
      %prog [options] <bundle name>.pybundle <package>..."""
    summary = 'DEPRECATED. Create pybundles.'
    bundle = True

    def __init__(self, *args, **kw):
        super(BundleCommand, self).__init__(*args, **kw)
        # bundle uses different default source and build dirs
        build_opt = self.parser.get_option("--build")
        build_opt.default = backup_dir(build_prefix, '-bundle')
        src_opt = self.parser.get_option("--src")
        src_opt.default = backup_dir(src_prefix, '-bundle')
        self.parser.set_defaults(**{
                src_opt.dest: src_opt.default,
                build_opt.dest: build_opt.default,
                })

    def run(self, options, args):

        logger.deprecated('1.6', "DEPRECATION: 'pip bundle' and support for installing from *.pybundle files is deprecated. "
                    "See https://github.com/pypa/pip/pull/1046")

        if not args:
            raise InstallationError('You must give a bundle filename')
        # We have to get everything when creating a bundle:
        options.ignore_installed = True
        logger.notify('Putting temporary build files in %s and source/develop files in %s'
                      % (display_path(options.build_dir), display_path(options.src_dir)))
        self.bundle_filename = args.pop(0)
        requirement_set = super(BundleCommand, self).run(options, args)
        return requirement_set
site-packages/pip/commands/search.py000064400000011200151733464010013472 0ustar00import sys
import textwrap

import pip.download

from pip.basecommand import Command, SUCCESS
from pip.util import get_terminal_size
from pip.log import logger
from pip.backwardcompat import xmlrpclib, reduce, cmp
from pip.exceptions import CommandError
from pip.status_codes import NO_MATCHES_FOUND
from pip._vendor import pkg_resources
from distutils.version import StrictVersion, LooseVersion


class SearchCommand(Command):
    """Search for PyPI packages whose name or summary contains <query>."""
    name = 'search'
    usage = """
      %prog [options] <query>"""
    summary = 'Search PyPI for packages.'

    def __init__(self, *args, **kw):
        super(SearchCommand, self).__init__(*args, **kw)
        self.cmd_opts.add_option(
            '--index',
            dest='index',
            metavar='URL',
            default='https://pypi.python.org/pypi',
            help='Base URL of Python Package Index (default %default)')

        self.parser.insert_option_group(0, self.cmd_opts)

    def run(self, options, args):
        if not args:
            raise CommandError('Missing required argument (search query).')
        query = args
        index_url = options.index

        pypi_hits = self.search(query, index_url)
        hits = transform_hits(pypi_hits)

        terminal_width = None
        if sys.stdout.isatty():
            terminal_width = get_terminal_size()[0]

        print_results(hits, terminal_width=terminal_width)
        if pypi_hits:
            return SUCCESS
        return NO_MATCHES_FOUND

    def search(self, query, index_url):
        pypi = xmlrpclib.ServerProxy(index_url)
        hits = pypi.search({'name': query, 'summary': query}, 'or')
        return hits


def transform_hits(hits):
    """
    The list from pypi is really a list of versions. We want a list of
    packages with the list of versions stored inline. This converts the
    list from pypi into one we can use.
    """
    packages = {}
    for hit in hits:
        name = hit['name']
        summary = hit['summary']
        version = hit['version']
        score = hit['_pypi_ordering']
        if score is None:
            score = 0

        if name not in packages.keys():
            packages[name] = {'name': name, 'summary': summary, 'versions': [version], 'score': score}
        else:
            packages[name]['versions'].append(version)

            # if this is the highest version, replace summary and score
            if version == highest_version(packages[name]['versions']):
                packages[name]['summary'] = summary
                packages[name]['score'] = score

    # each record has a unique name now, so we will convert the dict into a list sorted by score
    package_list = sorted(packages.values(), key=lambda x: x['score'], reverse=True)
    return package_list


def print_results(hits, name_column_width=25, terminal_width=None):
    installed_packages = [p.project_name for p in pkg_resources.working_set]
    for hit in hits:
        name = hit['name']
        summary = hit['summary'] or ''
        if terminal_width is not None:
            # wrap and indent summary to fit terminal
            summary = textwrap.wrap(summary, terminal_width - name_column_width - 5)
            summary = ('\n' + ' ' * (name_column_width + 3)).join(summary)
        line = '%s - %s' % (name.ljust(name_column_width), summary)
        try:
            logger.notify(line)
            if name in installed_packages:
                dist = pkg_resources.get_distribution(name)
                logger.indent += 2
                try:
                    latest = highest_version(hit['versions'])
                    if dist.version == latest:
                        logger.notify('INSTALLED: %s (latest)' % dist.version)
                    else:
                        logger.notify('INSTALLED: %s' % dist.version)
                        logger.notify('LATEST:    %s' % latest)
                finally:
                    logger.indent -= 2
        except UnicodeEncodeError:
            pass


def compare_versions(version1, version2):
    try:
        return cmp(StrictVersion(version1), StrictVersion(version2))
    # in case of abnormal version number, fall back to LooseVersion
    except ValueError:
        pass
    try:
        return cmp(LooseVersion(version1), LooseVersion(version2))
    except TypeError:
    # certain LooseVersion comparions raise due to unorderable types,
    # fallback to string comparison
        return cmp([str(v) for v in LooseVersion(version1).version],
                   [str(v) for v in LooseVersion(version2).version])


def highest_version(versions):
    return reduce((lambda v1, v2: compare_versions(v1, v2) == 1 and v1 or v2), versions)
site-packages/pip/commands/unzip.py000064400000000271151733464010013400 0ustar00from pip.commands.zip import ZipCommand


class UnzipCommand(ZipCommand):
    """Unzip individual packages."""
    name = 'unzip'
    summary = 'DEPRECATED. Unzip individual packages.'
site-packages/pip/commands/install.py000064400000032724151733464010013711 0ustar00import os
import sys
import tempfile
import shutil
from pip.req import InstallRequirement, RequirementSet, parse_requirements
from pip.log import logger
from pip.locations import (src_prefix, virtualenv_no_global, distutils_scheme,
                           build_prefix)
from pip.basecommand import Command
from pip.index import PackageFinder
from pip.exceptions import InstallationError, CommandError, PreviousBuildDirError
from pip import cmdoptions
from pip.util import BuildDirectory


class InstallCommand(Command):
    """
    Install packages from:

    - PyPI (and other indexes) using requirement specifiers.
    - VCS project urls.
    - Local project directories.
    - Local or remote source archives.

    pip also supports installing from "requirements files", which provide
    an easy way to specify a whole environment to be installed.
    """
    name = 'install'

    usage = """
      %prog [options] <requirement specifier> ...
      %prog [options] -r <requirements file> ...
      %prog [options] [-e] <vcs project url> ...
      %prog [options] [-e] <local project path> ...
      %prog [options] <archive url/path> ..."""

    summary = 'Install packages.'
    bundle = False

    def __init__(self, *args, **kw):
        super(InstallCommand, self).__init__(*args, **kw)

        cmd_opts = self.cmd_opts

        cmd_opts.add_option(
            '-e', '--editable',
            dest='editables',
            action='append',
            default=[],
            metavar='path/url',
            help='Install a project in editable mode (i.e. setuptools "develop mode") from a local project path or a VCS url.')

        cmd_opts.add_option(cmdoptions.requirements.make())
        cmd_opts.add_option(cmdoptions.build_dir.make())

        cmd_opts.add_option(
            '-t', '--target',
            dest='target_dir',
            metavar='dir',
            default=None,
            help='Install packages into <dir>.')

        cmd_opts.add_option(
            '-d', '--download', '--download-dir', '--download-directory',
            dest='download_dir',
            metavar='dir',
            default=None,
            help="Download packages into <dir> instead of installing them, regardless of what's already installed.")

        cmd_opts.add_option(cmdoptions.download_cache.make())

        cmd_opts.add_option(
            '--src', '--source', '--source-dir', '--source-directory',
            dest='src_dir',
            metavar='dir',
            default=src_prefix,
            help='Directory to check out editable projects into. '
            'The default in a virtualenv is "<venv path>/src". '
            'The default for global installs is "<current dir>/src".')

        cmd_opts.add_option(
            '-U', '--upgrade',
            dest='upgrade',
            action='store_true',
            help='Upgrade all packages to the newest available version. '
            'This process is recursive regardless of whether a dependency is already satisfied.')

        cmd_opts.add_option(
            '--force-reinstall',
            dest='force_reinstall',
            action='store_true',
            help='When upgrading, reinstall all packages even if they are '
                 'already up-to-date.')

        cmd_opts.add_option(
            '-I', '--ignore-installed',
            dest='ignore_installed',
            action='store_true',
            help='Ignore the installed packages (reinstalling instead).')

        cmd_opts.add_option(cmdoptions.no_deps.make())

        cmd_opts.add_option(
            '--no-install',
            dest='no_install',
            action='store_true',
            help="DEPRECATED. Download and unpack all packages, but don't actually install them.")

        cmd_opts.add_option(
            '--no-download',
            dest='no_download',
            action="store_true",
            help="DEPRECATED. Don't download any packages, just install the ones already downloaded "
            "(completes an install run with --no-install).")

        cmd_opts.add_option(cmdoptions.install_options.make())
        cmd_opts.add_option(cmdoptions.global_options.make())

        cmd_opts.add_option(
            '--user',
            dest='use_user_site',
            action='store_true',
            help='Install using the user scheme.')

        cmd_opts.add_option(
            '--egg',
            dest='as_egg',
            action='store_true',
            help="Install packages as eggs, not 'flat', like pip normally does. This option is not about installing *from* eggs. (WARNING: Because this option overrides pip's normal install logic, requirements files may not behave as expected.)")

        cmd_opts.add_option(
            '--root',
            dest='root_path',
            metavar='dir',
            default=None,
            help="Install everything relative to this alternate root directory.")

        cmd_opts.add_option(
            '--strip-file-prefix',
            dest='strip_file_prefix',
            metavar='prefix',
            default=None,
            help="Strip given prefix from script paths in wheel RECORD."
        )

        cmd_opts.add_option(
            "--compile",
            action="store_true",
            dest="compile",
            default=True,
            help="Compile py files to pyc",
        )

        cmd_opts.add_option(
            "--no-compile",
            action="store_false",
            dest="compile",
            help="Do not compile py files to pyc",
        )

        cmd_opts.add_option(cmdoptions.use_wheel.make())
        cmd_opts.add_option(cmdoptions.no_use_wheel.make())

        cmd_opts.add_option(
            '--pre',
            action='store_true',
            default=False,
            help="Include pre-release and development versions. By default, pip only finds stable versions.")

        cmd_opts.add_option(cmdoptions.no_clean.make())

        index_opts = cmdoptions.make_option_group(cmdoptions.index_group, self.parser)

        self.parser.insert_option_group(0, index_opts)
        self.parser.insert_option_group(0, cmd_opts)

    def _build_package_finder(self, options, index_urls, session):
        """
        Create a package finder appropriate to this install command.
        This method is meant to be overridden by subclasses, not
        called directly.
        """
        return PackageFinder(find_links=options.find_links,
                             index_urls=index_urls,
                             use_wheel=options.use_wheel,
                             allow_external=options.allow_external,
                             allow_unverified=options.allow_unverified,
                             allow_all_external=options.allow_all_external,
                             allow_all_prereleases=options.pre,
                             process_dependency_links=
                                options.process_dependency_links,
                             session=session,
                            )

    def run(self, options, args):

        if (
            options.no_install or
            options.no_download or
            options.build_dir or
            options.no_clean
        ):
            logger.deprecated('1.7', 'DEPRECATION: --no-install, --no-download, --build, '
                              'and --no-clean are deprecated.  See https://github.com/pypa/pip/issues/906.')

        if options.download_dir:
            options.no_install = True
            options.ignore_installed = True

        # If we have --no-install or --no-download and no --build we use the
        # legacy static build dir
        if (options.build_dir is None
                and (options.no_install or options.no_download)):
            options.build_dir = build_prefix

        if options.build_dir:
            options.build_dir = os.path.abspath(options.build_dir)

        options.src_dir = os.path.abspath(options.src_dir)
        install_options = options.install_options or []
        if options.use_user_site:
            if virtualenv_no_global():
                raise InstallationError("Can not perform a '--user' install. User site-packages are not visible in this virtualenv.")
            install_options.append('--user')

        temp_target_dir = None
        if options.target_dir:
            options.ignore_installed = True
            temp_target_dir = tempfile.mkdtemp()
            options.target_dir = os.path.abspath(options.target_dir)
            if os.path.exists(options.target_dir) and not os.path.isdir(options.target_dir):
                raise CommandError("Target path exists but is not a directory, will not continue.")
            install_options.append('--home=' + temp_target_dir)

        global_options = options.global_options or []
        index_urls = [options.index_url] + options.extra_index_urls
        if options.no_index:
            logger.notify('Ignoring indexes: %s' % ','.join(index_urls))
            index_urls = []

        if options.use_mirrors:
            logger.deprecated("1.7",
                        "--use-mirrors has been deprecated and will be removed"
                        " in the future. Explicit uses of --index-url and/or "
                        "--extra-index-url is suggested.")

        if options.mirrors:
            logger.deprecated("1.7",
                        "--mirrors has been deprecated and will be removed in "
                        " the future. Explicit uses of --index-url and/or "
                        "--extra-index-url is suggested.")
            index_urls += options.mirrors

        session = self._build_session(options)

        finder = self._build_package_finder(options, index_urls, session)

        build_delete = (not (options.no_clean or options.build_dir))
        with BuildDirectory(options.build_dir, delete=build_delete) as build_dir:
            requirement_set = RequirementSet(
                build_dir=build_dir,
                src_dir=options.src_dir,
                download_dir=options.download_dir,
                download_cache=options.download_cache,
                upgrade=options.upgrade,
                as_egg=options.as_egg,
                ignore_installed=options.ignore_installed,
                ignore_dependencies=options.ignore_dependencies,
                force_reinstall=options.force_reinstall,
                use_user_site=options.use_user_site,
                target_dir=temp_target_dir,
                session=session,
                pycompile=options.compile,
            )
            for name in args:
                requirement_set.add_requirement(
                    InstallRequirement.from_line(name, None))
            for name in options.editables:
                requirement_set.add_requirement(
                    InstallRequirement.from_editable(name, default_vcs=options.default_vcs))
            for filename in options.requirements:
                for req in parse_requirements(filename, finder=finder, options=options, session=session):
                    requirement_set.add_requirement(req)
            if not requirement_set.has_requirements:
                opts = {'name': self.name}
                if options.find_links:
                    msg = ('You must give at least one requirement to %(name)s '
                           '(maybe you meant "pip %(name)s %(links)s"?)' %
                           dict(opts, links=' '.join(options.find_links)))
                else:
                    msg = ('You must give at least one requirement '
                           'to %(name)s (see "pip help %(name)s")' % opts)
                logger.warn(msg)
                return

            try:
                if not options.no_download:
                    requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle)
                else:
                    requirement_set.locate_files()

                if not options.no_install and not self.bundle:
                    requirement_set.install(
                        install_options,
                        global_options,
                        root=options.root_path,
                        strip_file_prefix=options.strip_file_prefix)
                    installed = ' '.join([req.name for req in
                                          requirement_set.successfully_installed])
                    if installed:
                        logger.notify('Successfully installed %s' % installed)
                elif not self.bundle:
                    downloaded = ' '.join([req.name for req in
                                           requirement_set.successfully_downloaded])
                    if downloaded:
                        logger.notify('Successfully downloaded %s' % downloaded)
                elif self.bundle:
                    requirement_set.create_bundle(self.bundle_filename)
                    logger.notify('Created bundle in %s' % self.bundle_filename)
            except PreviousBuildDirError:
                options.no_clean = True
                raise
            finally:
                # Clean up
                if (not options.no_clean) and ((not options.no_install) or options.download_dir):
                    requirement_set.cleanup_files(bundle=self.bundle)

        if options.target_dir:
            if not os.path.exists(options.target_dir):
                os.makedirs(options.target_dir)
            lib_dir = distutils_scheme('', home=temp_target_dir)['purelib']
            for item in os.listdir(lib_dir):
                shutil.move(
                    os.path.join(lib_dir, item),
                    os.path.join(options.target_dir, item)
                    )
            shutil.rmtree(temp_target_dir)
        return requirement_set
site-packages/pip/log.py000064400000022357151733464010011224 0ustar00"""Logging
"""

import sys
import os
import logging

from pip import backwardcompat
from pip._vendor import colorama, pkg_resources


def _color_wrap(*colors):
    def wrapped(inp):
        return "".join(list(colors) + [inp, colorama.Style.RESET_ALL])
    return wrapped


def should_color(consumer, environ, std=(sys.stdout, sys.stderr)):
    real_consumer = (consumer if not isinstance(consumer, colorama.AnsiToWin32)
                        else consumer.wrapped)

    # If consumer isn't stdout or stderr we shouldn't colorize it
    if real_consumer not in std:
        return False

    # If consumer is a tty we should color it
    if hasattr(real_consumer, "isatty") and real_consumer.isatty():
        return True

    # If we have an ASNI term we should color it
    if environ.get("TERM") == "ANSI":
        return True

    # If anything else we should not color it
    return False


def should_warn(current_version, removal_version):
    # Our Significant digits on versions is 2, so remove everything but the
    #   first two places.
    current_version = ".".join(current_version.split(".")[:2])
    removal_version = ".".join(removal_version.split(".")[:2])

    # Our warning threshold is one minor version before removal, so we
    #   decrement the minor version by one
    major, minor = removal_version.split(".")
    minor = str(int(minor) - 1)
    warn_version = ".".join([major, minor])

    # Test if our current_version should be a warn
    return (pkg_resources.parse_version(current_version)
                < pkg_resources.parse_version(warn_version))


class Logger(object):
    """
    Logging object for use in command-line script.  Allows ranges of
    levels, to avoid some redundancy of displayed information.
    """
    VERBOSE_DEBUG = logging.DEBUG - 1
    DEBUG = logging.DEBUG
    INFO = logging.INFO
    NOTIFY = (logging.INFO + logging.WARN) / 2
    WARN = WARNING = logging.WARN
    ERROR = logging.ERROR
    FATAL = logging.FATAL

    LEVELS = [VERBOSE_DEBUG, DEBUG, INFO, NOTIFY, WARN, ERROR, FATAL]

    COLORS = {
        WARN: _color_wrap(colorama.Fore.YELLOW),
        ERROR: _color_wrap(colorama.Fore.RED),
        FATAL: _color_wrap(colorama.Fore.RED),
    }

    def __init__(self):
        self.consumers = []
        self.indent = 0
        self.explicit_levels = False
        self.in_progress = None
        self.in_progress_hanging = False

    def add_consumers(self, *consumers):
        if sys.platform.startswith("win"):
            for level, consumer in consumers:
                if hasattr(consumer, "write"):
                    self.consumers.append(
                        (level, colorama.AnsiToWin32(consumer)),
                    )
                else:
                    self.consumers.append((level, consumer))
        else:
            self.consumers.extend(consumers)

    def debug(self, msg, *args, **kw):
        self.log(self.DEBUG, msg, *args, **kw)

    def info(self, msg, *args, **kw):
        self.log(self.INFO, msg, *args, **kw)

    def notify(self, msg, *args, **kw):
        self.log(self.NOTIFY, msg, *args, **kw)

    def warn(self, msg, *args, **kw):
        self.log(self.WARN, msg, *args, **kw)

    def error(self, msg, *args, **kw):
        self.log(self.ERROR, msg, *args, **kw)

    def fatal(self, msg, *args, **kw):
        self.log(self.FATAL, msg, *args, **kw)

    def deprecated(self, removal_version, msg, *args, **kwargs):
        """
        Logs deprecation message which is log level WARN if the
        ``removal_version`` is > 1 minor release away and log level ERROR
        otherwise.

        removal_version should be the version that the deprecated feature is
        expected to be removed in, so something that will not exist in
        version 1.7, but will in 1.6 would have a removal_version of 1.7.
        """
        from pip import __version__

        if should_warn(__version__, removal_version):
            self.warn(msg, *args, **kwargs)
        else:
            self.error(msg, *args, **kwargs)

    def log(self, level, msg, *args, **kw):
        if args:
            if kw:
                raise TypeError(
                    "You may give positional or keyword arguments, not both")
        args = args or kw

        # render
        if args:
            rendered = msg % args
        else:
            rendered = msg
        rendered = ' ' * self.indent + rendered
        if self.explicit_levels:
            ## FIXME: should this be a name, not a level number?
            rendered = '%02i %s' % (level, rendered)

        for consumer_level, consumer in self.consumers:
            if self.level_matches(level, consumer_level):
                if (self.in_progress_hanging
                    and consumer in (sys.stdout, sys.stderr)):
                    self.in_progress_hanging = False
                    sys.stdout.write('\n')
                    sys.stdout.flush()
                if hasattr(consumer, 'write'):
                    write_content = rendered + '\n'
                    if should_color(consumer, os.environ):
                        # We are printing to stdout or stderr and it supports
                        #   colors so render our text colored
                        colorizer = self.COLORS.get(level, lambda x: x)
                        write_content = colorizer(write_content)

                    consumer.write(write_content)
                    if hasattr(consumer, 'flush'):
                        consumer.flush()
                else:
                    consumer(rendered)

    def _show_progress(self):
        """Should we display download progress?"""
        return (self.stdout_level_matches(self.NOTIFY) and sys.stdout.isatty())

    def start_progress(self, msg):
        assert not self.in_progress, (
            "Tried to start_progress(%r) while in_progress %r"
            % (msg, self.in_progress))
        if self._show_progress():
            sys.stdout.write(' ' * self.indent + msg)
            sys.stdout.flush()
            self.in_progress_hanging = True
        else:
            self.in_progress_hanging = False
        self.in_progress = msg
        self.last_message = None

    def end_progress(self, msg='done.'):
        assert self.in_progress, (
            "Tried to end_progress without start_progress")
        if self._show_progress():
            if not self.in_progress_hanging:
                # Some message has been printed out since start_progress
                sys.stdout.write('...' + self.in_progress + msg + '\n')
                sys.stdout.flush()
            else:
                # These erase any messages shown with show_progress (besides .'s)
                logger.show_progress('')
                logger.show_progress('')
                sys.stdout.write(msg + '\n')
                sys.stdout.flush()
        self.in_progress = None
        self.in_progress_hanging = False

    def show_progress(self, message=None):
        """If we are in a progress scope, and no log messages have been
        shown, write out another '.'"""
        if self.in_progress_hanging:
            if message is None:
                sys.stdout.write('.')
                sys.stdout.flush()
            else:
                if self.last_message:
                    padding = ' ' * max(0, len(self.last_message) - len(message))
                else:
                    padding = ''
                sys.stdout.write('\r%s%s%s%s' %
                                (' ' * self.indent, self.in_progress, message, padding))
                sys.stdout.flush()
                self.last_message = message

    def stdout_level_matches(self, level):
        """Returns true if a message at this level will go to stdout"""
        return self.level_matches(level, self._stdout_level())

    def _stdout_level(self):
        """Returns the level that stdout runs at"""
        for level, consumer in self.consumers:
            if consumer is sys.stdout:
                return level
        return self.FATAL

    def level_matches(self, level, consumer_level):
        """
        >>> l = Logger()
        >>> l.level_matches(3, 4)
        False
        >>> l.level_matches(3, 2)
        True
        >>> l.level_matches(slice(None, 3), 3)
        False
        >>> l.level_matches(slice(None, 3), 2)
        True
        >>> l.level_matches(slice(1, 3), 1)
        True
        >>> l.level_matches(slice(2, 3), 1)
        False
        """
        if isinstance(level, slice):
            start, stop = level.start, level.stop
            if start is not None and start > consumer_level:
                return False
            if stop is not None or stop <= consumer_level:
                return False
            return True
        else:
            return level >= consumer_level

    @classmethod
    def level_for_integer(cls, level):
        levels = cls.LEVELS
        if level < 0:
            return levels[0]
        if level >= len(levels):
            return levels[-1]
        return levels[level]

    def move_stdout_to_stderr(self):
        to_remove = []
        to_add = []
        for consumer_level, consumer in self.consumers:
            if consumer == sys.stdout:
                to_remove.append((consumer_level, consumer))
                to_add.append((consumer_level, sys.stderr))
        for item in to_remove:
            self.consumers.remove(item)
        self.consumers.extend(to_add)

logger = Logger()
site-packages/pip/cmdoptions.py000064400000022162151733464010012614 0ustar00"""
shared options and groups

The principle here is to define options once, but *not* instantiate them globally.
One reason being that options with action='append' can carry state between parses.
pip parse's general options twice internally, and shouldn't pass on state.
To be consistent, all options will follow this design.

"""
import copy
from optparse import OptionGroup, SUPPRESS_HELP, Option
from pip.locations import default_log_file


def make_option_group(group, parser):
    """
    Return an OptionGroup object
    group  -- assumed to be dict with 'name' and 'options' keys
    parser -- an optparse Parser
    """
    option_group = OptionGroup(parser, group['name'])
    for option in group['options']:
        option_group.add_option(option.make())
    return option_group

class OptionMaker(object):
    """Class that stores the args/kwargs that would be used to make an Option,
    for making them later, and uses deepcopy's to reset state."""
    def __init__(self, *args, **kwargs):
        self.args = args
        self.kwargs = kwargs
    def make(self):
        args_copy = copy.deepcopy(self.args)
        kwargs_copy = copy.deepcopy(self.kwargs)
        return Option(*args_copy, **kwargs_copy)

###########
# options #
###########

help_ = OptionMaker(
    '-h', '--help',
    dest='help',
    action='help',
    help='Show help.')

require_virtualenv = OptionMaker(
    # Run only if inside a virtualenv, bail if not.
    '--require-virtualenv', '--require-venv',
    dest='require_venv',
    action='store_true',
    default=False,
    help=SUPPRESS_HELP)

verbose = OptionMaker(
    '-v', '--verbose',
    dest='verbose',
    action='count',
    default=0,
    help='Give more output. Option is additive, and can be used up to 3 times.')

version = OptionMaker(
    '-V', '--version',
    dest='version',
    action='store_true',
    help='Show version and exit.')

quiet = OptionMaker(
    '-q', '--quiet',
    dest='quiet',
    action='count',
    default=0,
    help='Give less output.')

log = OptionMaker(
    '--log',
    dest='log',
    metavar='path',
    help='Path to a verbose appending log. This log is inactive by default.')

log_explicit_levels = OptionMaker(
    # Writes the log levels explicitely to the log'
    '--log-explicit-levels',
    dest='log_explicit_levels',
    action='store_true',
    default=False,
    help=SUPPRESS_HELP)

log_file = OptionMaker(
    # The default log file
    '--log-file', '--local-log',
    dest='log_file',
    metavar='path',
    default=default_log_file,
    help='Path to a verbose non-appending log, that only logs failures. This log is active by default at %default.')

no_input = OptionMaker(
    # Don't ask for input
    '--no-input',
    dest='no_input',
    action='store_true',
    default=False,
    help=SUPPRESS_HELP)

proxy = OptionMaker(
    '--proxy',
    dest='proxy',
    type='str',
    default='',
    help="Specify a proxy in the form [user:passwd@]proxy.server:port.")

timeout = OptionMaker(
    '--timeout', '--default-timeout',
    metavar='sec',
    dest='timeout',
    type='float',
    default=15,
    help='Set the socket timeout (default %default seconds).')

default_vcs = OptionMaker(
    # The default version control system for editables, e.g. 'svn'
    '--default-vcs',
    dest='default_vcs',
    type='str',
    default='',
    help=SUPPRESS_HELP)

skip_requirements_regex = OptionMaker(
    # A regex to be used to skip requirements
    '--skip-requirements-regex',
    dest='skip_requirements_regex',
    type='str',
    default='',
    help=SUPPRESS_HELP)

exists_action = OptionMaker(
    # Option when path already exist
    '--exists-action',
    dest='exists_action',
    type='choice',
    choices=['s', 'i', 'w', 'b'],
    default=[],
    action='append',
    metavar='action',
    help="Default action when a path already exists: "
    "(s)witch, (i)gnore, (w)ipe, (b)ackup.")

cert = OptionMaker(
    '--cert',
    dest='cert',
    type='str',
    default='',
    metavar='path',
    help = "Path to alternate CA bundle.")

index_url = OptionMaker(
    '-i', '--index-url', '--pypi-url',
    dest='index_url',
    metavar='URL',
    default='https://pypi.python.org/simple/',
    help='Base URL of Python Package Index (default %default).')

extra_index_url = OptionMaker(
    '--extra-index-url',
    dest='extra_index_urls',
    metavar='URL',
    action='append',
    default=[],
    help='Extra URLs of package indexes to use in addition to --index-url.')

no_index = OptionMaker(
    '--no-index',
    dest='no_index',
    action='store_true',
    default=False,
    help='Ignore package index (only looking at --find-links URLs instead).')

find_links =  OptionMaker(
    '-f', '--find-links',
    dest='find_links',
    action='append',
    default=[],
    metavar='url',
    help="If a url or path to an html file, then parse for links to archives. If a local path or file:// url that's a directory, then look for archives in the directory listing.")

# TODO: Remove after 1.6
use_mirrors = OptionMaker(
    '-M', '--use-mirrors',
    dest='use_mirrors',
    action='store_true',
    default=False,
    help=SUPPRESS_HELP)

# TODO: Remove after 1.6
mirrors = OptionMaker(
    '--mirrors',
    dest='mirrors',
    metavar='URL',
    action='append',
    default=[],
    help=SUPPRESS_HELP)

allow_external = OptionMaker(
    "--allow-external",
    dest="allow_external",
    action="append",
    default=[],
    metavar="PACKAGE",
    help="Allow the installation of externally hosted files",
)

allow_all_external = OptionMaker(
    "--allow-all-external",
    dest="allow_all_external",
    action="store_true",
    default=False,
    help="Allow the installation of all externally hosted files",
)

# Remove after 1.7
no_allow_external = OptionMaker(
    "--no-allow-external",
    dest="allow_all_external",
    action="store_false",
    default=False,
    help=SUPPRESS_HELP,
)

# Remove --allow-insecure after 1.7
allow_unsafe = OptionMaker(
    "--allow-unverified", "--allow-insecure",
    dest="allow_unverified",
    action="append",
    default=[],
    metavar="PACKAGE",
    help="Allow the installation of insecure and unverifiable files",
)

# Remove after 1.7
no_allow_unsafe = OptionMaker(
    "--no-allow-insecure",
    dest="allow_all_insecure",
    action="store_false",
    default=False,
    help=SUPPRESS_HELP
)

# Remove after 1.5
process_dependency_links = OptionMaker(
    "--process-dependency-links",
    dest="process_dependency_links",
    action="store_true",
    default=False,
    help="Enable the processing of dependency links.",
)

requirements = OptionMaker(
    '-r', '--requirement',
    dest='requirements',
    action='append',
    default=[],
    metavar='file',
    help='Install from the given requirements file. '
    'This option can be used multiple times.')

use_wheel = OptionMaker(
    '--use-wheel',
    dest='use_wheel',
    action='store_true',
    help=SUPPRESS_HELP,
)

no_use_wheel = OptionMaker(
    '--no-use-wheel',
    dest='use_wheel',
    action='store_false',
    default=True,
    help=('Do not Find and prefer wheel archives when searching indexes and '
          'find-links locations.'),
)

download_cache = OptionMaker(
    '--download-cache',
    dest='download_cache',
    metavar='dir',
    default=None,
    help='Cache downloaded packages in <dir>.')

no_deps = OptionMaker(
    '--no-deps', '--no-dependencies',
    dest='ignore_dependencies',
    action='store_true',
    default=False,
    help="Don't install package dependencies.")

build_dir = OptionMaker(
    '-b', '--build', '--build-dir', '--build-directory',
    dest='build_dir',
    metavar='dir',
    help='Directory to unpack packages into and build in.',
)

install_options = OptionMaker(
    '--install-option',
    dest='install_options',
    action='append',
    metavar='options',
    help="Extra arguments to be supplied to the setup.py install "
    "command (use like --install-option=\"--install-scripts=/usr/local/bin\"). "
    "Use multiple --install-option options to pass multiple options to setup.py install. "
    "If you are using an option with a directory path, be sure to use absolute path.")

global_options = OptionMaker(
    '--global-option',
    dest='global_options',
    action='append',
    metavar='options',
    help="Extra global options to be supplied to the setup.py "
    "call before the install command.")

no_clean = OptionMaker(
    '--no-clean',
    action='store_true',
    default=False,
    help="Don't clean up build directories.")


##########
# groups #
##########

general_group = {
    'name': 'General Options',
    'options': [
        help_,
        require_virtualenv,
        verbose,
        version,
        quiet,
        log_file,
        log,
        log_explicit_levels,
        no_input,
        proxy,
        timeout,
        default_vcs,
        skip_requirements_regex,
        exists_action,
        cert,
        ]
    }

index_group = {
    'name': 'Package Index Options',
    'options': [
        index_url,
        extra_index_url,
        no_index,
        find_links,
        use_mirrors,
        mirrors,
        allow_external,
        allow_all_external,
        no_allow_external,
        allow_unsafe,
        no_allow_unsafe,
        process_dependency_links,
        ]
    }
site-packages/pip/wheel.py000064400000050500151733464010011536 0ustar00"""
Support for installing and building the "wheel" binary package format.
"""
from __future__ import with_statement

import compileall
import csv
import functools
import hashlib
import os
import re
import shutil
import sys

from base64 import urlsafe_b64encode
from email.parser import Parser

from pip.backwardcompat import ConfigParser, StringIO
from pip.exceptions import InvalidWheelFilename, UnsupportedWheel
from pip.locations import distutils_scheme
from pip.log import logger
from pip import pep425tags
from pip.util import call_subprocess, normalize_path, make_path_relative
from pip._vendor import pkg_resources
from pip._vendor.distlib.scripts import ScriptMaker
from pip._vendor import pkg_resources


wheel_ext = '.whl'

VERSION_COMPATIBLE = (1, 0)


def rehash(path, algo='sha256', blocksize=1<<20):
    """Return (hash, length) for path using hashlib.new(algo)"""
    h = hashlib.new(algo)
    length = 0
    with open(path, 'rb') as f:
        block = f.read(blocksize)
        while block:
            length += len(block)
            h.update(block)
            block = f.read(blocksize)
    digest = 'sha256='+urlsafe_b64encode(h.digest()).decode('latin1').rstrip('=')
    return (digest, length)

try:
    unicode
    def binary(s):
        if isinstance(s, unicode):
            return s.encode('ascii')
        return s
except NameError:
    def binary(s):
        if isinstance(s, str):
            return s.encode('ascii')

def open_for_csv(name, mode):
    if sys.version_info[0] < 3:
        nl = {}
        bin = 'b'
    else:
        nl = { 'newline': '' }
        bin = ''
    return open(name, mode + bin, **nl)

def fix_script(path):
    """Replace #!python with #!/path/to/python
    Return True if file was changed."""
    # XXX RECORD hashes will need to be updated
    if os.path.isfile(path):
        script = open(path, 'rb')
        try:
            firstline = script.readline()
            if not firstline.startswith(binary('#!python')):
                return False
            exename = sys.executable.encode(sys.getfilesystemencoding())
            firstline = binary('#!') + exename + binary(os.linesep)
            rest = script.read()
        finally:
            script.close()
        script = open(path, 'wb')
        try:
            script.write(firstline)
            script.write(rest)
        finally:
            script.close()
        return True

dist_info_re = re.compile(r"""^(?P<namever>(?P<name>.+?)(-(?P<ver>\d.+?))?)
                                \.dist-info$""", re.VERBOSE)

def root_is_purelib(name, wheeldir):
    """
    Return True if the extracted wheel in wheeldir should go into purelib.
    """
    name_folded = name.replace("-", "_")
    for item in os.listdir(wheeldir):
        match = dist_info_re.match(item)
        if match and match.group('name') == name_folded:
            with open(os.path.join(wheeldir, item, 'WHEEL')) as wheel:
                for line in wheel:
                    line = line.lower().rstrip()
                    if line == "root-is-purelib: true":
                        return True
    return False


def get_entrypoints(filename):
    if not os.path.exists(filename):
        return {}, {}

    # This is done because you can pass a string to entry_points wrappers which
    # means that they may or may not be valid INI files. The attempt here is to
    # strip leading and trailing whitespace in order to make them valid INI
    # files.
    with open(filename) as fp:
        data = StringIO()
        for line in fp:
            data.write(line.strip())
            data.write("\n")
        data.seek(0)

    cp = ConfigParser.RawConfigParser()
    cp.readfp(data)

    console = {}
    gui = {}
    if cp.has_section('console_scripts'):
        console = dict(cp.items('console_scripts'))
    if cp.has_section('gui_scripts'):
        gui = dict(cp.items('gui_scripts'))
    return console, gui


def move_wheel_files(name, req, wheeldir, user=False, home=None, root=None,
                     pycompile=True, scheme=None, strip_file_prefix=None):
    """Install a wheel"""

    if not scheme:
        scheme = distutils_scheme(name, user=user, home=home, root=root)

    if root_is_purelib(name, wheeldir):
        lib_dir = scheme['purelib']
    else:
        lib_dir = scheme['platlib']

    info_dir = []
    data_dirs = []
    source = wheeldir.rstrip(os.path.sep) + os.path.sep

    # Record details of the files moved
    #   installed = files copied from the wheel to the destination
    #   changed = files changed while installing (scripts #! line typically)
    #   generated = files newly generated during the install (script wrappers)
    installed = {}
    changed = set()
    generated = []

    # Compile all of the pyc files that we're going to be installing
    if pycompile:
        compileall.compile_dir(source, force=True, quiet=True)

    def normpath(src, p):
        return make_path_relative(src, p).replace(os.path.sep, '/')

    def record_installed(srcfile, destfile, modified=False):
        """Map archive RECORD paths to installation RECORD paths."""
        oldpath = normpath(srcfile, wheeldir)
        newpath = normpath(destfile, lib_dir)
        installed[oldpath] = newpath
        if modified:
            changed.add(destfile)

    def clobber(source, dest, is_base, fixer=None, filter=None):
        if not os.path.exists(dest): # common for the 'include' path
            os.makedirs(dest)

        for dir, subdirs, files in os.walk(source):
            basedir = dir[len(source):].lstrip(os.path.sep)
            destdir = os.path.join(dest, basedir)
            if is_base and basedir.split(os.path.sep, 1)[0].endswith('.data'):
                continue
            for s in subdirs:
                destsubdir = os.path.join(dest, basedir, s)
                if is_base and basedir == '' and destsubdir.endswith('.data'):
                    data_dirs.append(s)
                    continue
                elif (is_base
                    and s.endswith('.dist-info')
                    # is self.req.project_name case preserving?
                    and s.lower().startswith(req.project_name.replace('-', '_').lower())):
                    assert not info_dir, 'Multiple .dist-info directories'
                    info_dir.append(destsubdir)
            for f in files:
                # Skip unwanted files
                if filter and filter(f):
                    continue
                srcfile = os.path.join(dir, f)
                destfile = os.path.join(dest, basedir, f)
                # directory creation is lazy and after the file filtering above
                # to ensure we don't install empty dirs; empty dirs can't be
                # uninstalled.
                if not os.path.exists(destdir):
                    os.makedirs(destdir)
                # use copy2 (not move) to be extra sure we're not moving
                # directories over; copy2 fails for directories.  this would
                # fail tests (not during released/user execution)
                shutil.copy2(srcfile, destfile)
                changed = False
                if fixer:
                    changed = fixer(destfile)
                record_installed(srcfile, destfile, changed)

    clobber(source, lib_dir, True)

    assert info_dir, "%s .dist-info directory not found" % req

    # Get the defined entry points
    ep_file = os.path.join(info_dir[0], 'entry_points.txt')
    console, gui = get_entrypoints(ep_file)

    def is_entrypoint_wrapper(name):
        # EP, EP.exe and EP-script.py are scripts generated for
        # entry point EP by setuptools
        if name.lower().endswith('.exe'):
            matchname = name[:-4]
        elif name.lower().endswith('-script.py'):
            matchname = name[:-10]
        elif name.lower().endswith(".pya"):
            matchname = name[:-4]
        else:
            matchname = name
        # Ignore setuptools-generated scripts
        return (matchname in console or matchname in gui)

    for datadir in data_dirs:
        fixer = None
        filter = None
        for subdir in os.listdir(os.path.join(wheeldir, datadir)):
            fixer = None
            if subdir == 'scripts':
                fixer = fix_script
                filter = is_entrypoint_wrapper
            source = os.path.join(wheeldir, datadir, subdir)
            dest = scheme[subdir]
            clobber(source, dest, False, fixer=fixer, filter=filter)

    maker = ScriptMaker(None, scheme['scripts'])

    # Ensure we don't generate any variants for scripts because this is almost
    # never what somebody wants.
    # See https://bitbucket.org/pypa/distlib/issue/35/
    maker.variants = set(('', ))

    # This is required because otherwise distlib creates scripts that are not
    # executable.
    # See https://bitbucket.org/pypa/distlib/issue/32/
    maker.set_mode = True

    # Simplify the script and fix the fact that the default script swallows
    # every single stack trace.
    # See https://bitbucket.org/pypa/distlib/issue/34/
    # See https://bitbucket.org/pypa/distlib/issue/33/
    def _get_script_text(entry):
        return maker.script_template % {
            "module": entry.prefix,
            "import_name": entry.suffix.split(".")[0],
            "func": entry.suffix,
        }

    maker._get_script_text = _get_script_text
    maker.script_template = """# -*- coding: utf-8 -*-
import re
import sys

from %(module)s import %(import_name)s

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(%(func)s())
"""

    # Special case pip and setuptools to generate versioned wrappers
    #
    # The issue is that some projects (specifically, pip and setuptools) use
    # code in setup.py to create "versioned" entry points - pip2.7 on Python
    # 2.7, pip3.3 on Python 3.3, etc. But these entry points are baked into
    # the wheel metadata at build time, and so if the wheel is installed with
    # a *different* version of Python the entry points will be wrong. The
    # correct fix for this is to enhance the metadata to be able to describe
    # such versioned entry points, but that won't happen till Metadata 2.0 is
    # available.
    # In the meantime, projects using versioned entry points will either have
    # incorrect versioned entry points, or they will not be able to distribute
    # "universal" wheels (i.e., they will need a wheel per Python version).
    #
    # Because setuptools and pip are bundled with _ensurepip and virtualenv,
    # we need to use universal wheels. So, as a stopgap until Metadata 2.0, we
    # override the versioned entry points in the wheel and generate the
    # correct ones. This code is purely a short-term measure until Metadat 2.0
    # is available.
    #
    # To add the level of hack in this section of code, in order to support
    # ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment
    # variable which will control which version scripts get installed.
    #
    # ENSUREPIP_OPTIONS=altinstall
    #   - Only pipX.Y and easy_install-X.Y will be generated and installed
    # ENSUREPIP_OPTIONS=install
    #   - pipX.Y, pipX, easy_install-X.Y will be generated and installed. Note
    #     that this option is technically if ENSUREPIP_OPTIONS is set and is
    #     not altinstall
    # DEFAULT
    #   - The default behavior is to install pip, pipX, pipX.Y, easy_install
    #     and easy_install-X.Y.
    pip_script = console.pop('pip', None)
    if pip_script:
        if "ENSUREPIP_OPTIONS" not in os.environ:
            spec = 'pip = ' + pip_script
            generated.extend(maker.make(spec))

        if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall":
            spec = 'pip%s = %s' % (sys.version[:1], pip_script)
            generated.extend(maker.make(spec))

        spec = 'pip%s = %s' % (sys.version[:3], pip_script)
        generated.extend(maker.make(spec))
        # Delete any other versioned pip entry points
        pip_ep = [k for k in console if re.match(r'pip(\d(\.\d)?)?$', k)]
        for k in pip_ep:
            del console[k]
    easy_install_script = console.pop('easy_install', None)
    if easy_install_script:
        if "ENSUREPIP_OPTIONS" not in os.environ:
            spec = 'easy_install = ' + easy_install_script
            generated.extend(maker.make(spec))

        spec = 'easy_install-%s = %s' % (sys.version[:3], easy_install_script)
        generated.extend(maker.make(spec))
        # Delete any other versioned easy_install entry points
        easy_install_ep = [k for k in console
                if re.match(r'easy_install(-\d\.\d)?$', k)]
        for k in easy_install_ep:
            del console[k]

    # Generate the console and GUI entry points specified in the wheel
    if len(console) > 0:
        generated.extend(maker.make_multiple(['%s = %s' % kv for kv in console.items()]))
    if len(gui) > 0:
        generated.extend(maker.make_multiple(['%s = %s' % kv for kv in gui.items()], {'gui': True}))

    record = os.path.join(info_dir[0], 'RECORD')
    temp_record = os.path.join(info_dir[0], 'RECORD.pip')
    with open_for_csv(record, 'r') as record_in:
        with open_for_csv(temp_record, 'w+') as record_out:
            reader = csv.reader(record_in)
            writer = csv.writer(record_out)
            for row in reader:
                row[0] = installed.pop(row[0], row[0])
                if row[0] in changed:
                    row[1], row[2] = rehash(row[0])
                writer.writerow(row)
            for f in generated:
                h, l = rehash(f)
                if strip_file_prefix and f.startswith(strip_file_prefix):
                    f = os.path.join(os.sep, os.path.relpath(f, strip_file_prefix))
                writer.writerow((f, h, l))
            for f in installed:
                writer.writerow((installed[f], '', ''))
    shutil.move(temp_record, record)

def _unique(fn):
    @functools.wraps(fn)
    def unique(*args, **kw):
        seen = set()
        for item in fn(*args, **kw):
            if item not in seen:
                seen.add(item)
                yield item
    return unique

# TODO: this goes somewhere besides the wheel module
@_unique
def uninstallation_paths(dist):
    """
    Yield all the uninstallation paths for dist based on RECORD-without-.pyc

    Yield paths to all the files in RECORD. For each .py file in RECORD, add
    the .pyc in the same directory.

    UninstallPathSet.add() takes care of the __pycache__ .pyc.
    """
    from pip.req import FakeFile # circular import
    r = csv.reader(FakeFile(dist.get_metadata_lines('RECORD')))
    for row in r:
        path = os.path.join(dist.location, row[0])
        yield path
        if path.endswith('.py'):
            dn, fn = os.path.split(path)
            base = fn[:-3]
            path = os.path.join(dn, base+'.pyc')
            yield path


def wheel_version(source_dir):
    """
    Return the Wheel-Version of an extracted wheel, if possible.

    Otherwise, return False if we couldn't parse / extract it.
    """
    try:
        dist = [d for d in pkg_resources.find_on_path(None, source_dir)][0]

        wheel_data = dist.get_metadata('WHEEL')
        wheel_data = Parser().parsestr(wheel_data)

        version = wheel_data['Wheel-Version'].strip()
        version = tuple(map(int, version.split('.')))
        return version
    except:
        return False


def check_compatibility(version, name):
    """
    Raises errors or warns if called with an incompatible Wheel-Version.

    Pip should refuse to install a Wheel-Version that's a major series
    ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when
    installing a version only minor version ahead (e.g 1.2 > 1.1).

    version: a 2-tuple representing a Wheel-Version (Major, Minor)
    name: name of wheel or package to raise exception about

    :raises UnsupportedWheel: when an incompatible Wheel-Version is given
    """
    if not version:
        raise UnsupportedWheel(
            "%s is in an unsupported or invalid wheel" % name
        )
    if version[0] > VERSION_COMPATIBLE[0]:
        raise UnsupportedWheel(
            "%s's Wheel-Version (%s) is not compatible with this version "
            "of pip" % (name, '.'.join(map(str, version)))
        )
    elif version > VERSION_COMPATIBLE:
        logger.warn('Installing from a newer Wheel-Version (%s)'
                    % '.'.join(map(str, version)))


class Wheel(object):
    """A wheel file"""

    # TODO: maybe move the install code into this class

    wheel_file_re = re.compile(
                r"""^(?P<namever>(?P<name>.+?)-(?P<ver>\d.*?))
                ((-(?P<build>\d.*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?)
                \.whl|\.dist-info)$""",
                re.VERBOSE)

    def __init__(self, filename):
        """
        :raises InvalidWheelFilename: when the filename is invalid for a wheel
        """
        wheel_info = self.wheel_file_re.match(filename)
        if not wheel_info:
            raise InvalidWheelFilename("%s is not a valid wheel filename." % filename)
        self.filename = filename
        self.name = wheel_info.group('name').replace('_', '-')
        # we'll assume "_" means "-" due to wheel naming scheme
        # (https://github.com/pypa/pip/issues/1150)
        self.version = wheel_info.group('ver').replace('_', '-')
        self.pyversions = wheel_info.group('pyver').split('.')
        self.abis = wheel_info.group('abi').split('.')
        self.plats = wheel_info.group('plat').split('.')

        # All the tag combinations from this file
        self.file_tags = set((x, y, z) for x in self.pyversions for y
                            in self.abis for z in self.plats)

    def support_index_min(self, tags=None):
        """
        Return the lowest index that one of the wheel's file_tag combinations
        achieves in the supported_tags list e.g. if there are 8 supported tags,
        and one of the file tags is first in the list, then return 0.  Returns
        None is the wheel is not supported.
        """
        if tags is None: # for mock
            tags = pep425tags.supported_tags
        indexes = [tags.index(c) for c in self.file_tags if c in tags]
        return min(indexes) if indexes else None

    def supported(self, tags=None):
        """Is this wheel supported on this system?"""
        if tags is None: # for mock
            tags = pep425tags.supported_tags
        return bool(set(tags).intersection(self.file_tags))


class WheelBuilder(object):
    """Build wheels from a RequirementSet."""

    def __init__(self, requirement_set, finder, wheel_dir, build_options=[], global_options=[]):
        self.requirement_set = requirement_set
        self.finder = finder
        self.wheel_dir = normalize_path(wheel_dir)
        self.build_options = build_options
        self.global_options = global_options

    def _build_one(self, req):
        """Build one wheel."""

        base_args = [
            sys.executable, '-c',
            "import setuptools;__file__=%r;"\
            "exec(compile(open(__file__).read().replace('\\r\\n', '\\n'), __file__, 'exec'))" % req.setup_py] + \
            list(self.global_options)

        logger.notify('Running setup.py bdist_wheel for %s' % req.name)
        logger.notify('Destination directory: %s' % self.wheel_dir)
        wheel_args = base_args + ['bdist_wheel', '-d', self.wheel_dir] + self.build_options
        try:
            call_subprocess(wheel_args, cwd=req.source_dir, show_stdout=False)
            return True
        except:
            logger.error('Failed building wheel for %s' % req.name)
            return False

    def build(self):
        """Build wheels."""

        #unpack and constructs req set
        self.requirement_set.prepare_files(self.finder)

        reqset = self.requirement_set.requirements.values()

        buildset = [req for req in reqset if not req.is_wheel]

        if not buildset:
            return

        #build the wheels
        logger.notify(
            'Building wheels for collected packages: %s' %
            ','.join([req.name for req in buildset])
        )
        logger.indent += 2
        build_success, build_failure = [], []
        for req in buildset:
            if self._build_one(req):
                build_success.append(req)
            else:
                build_failure.append(req)
        logger.indent -= 2

        #notify sucess/failure
        if build_success:
            logger.notify('Successfully built %s' % ' '.join([req.name for req in build_success]))
        if build_failure:
            logger.notify('Failed to build %s' % ' '.join([req.name for req in build_failure]))
site-packages/pip/baseparser.py000064400000017742151733464010012574 0ustar00"""Base option parser setup"""

import sys
import optparse
import os
import textwrap
from distutils.util import strtobool

from pip.backwardcompat import ConfigParser, string_types
from pip.locations import default_config_file
from pip.util import get_terminal_size, get_prog
from pip._vendor import pkg_resources


class PrettyHelpFormatter(optparse.IndentedHelpFormatter):
    """A prettier/less verbose help formatter for optparse."""

    def __init__(self, *args, **kwargs):
        # help position must be aligned with __init__.parseopts.description
        kwargs['max_help_position'] = 30
        kwargs['indent_increment'] = 1
        kwargs['width'] = get_terminal_size()[0] - 2
        optparse.IndentedHelpFormatter.__init__(self, *args, **kwargs)

    def format_option_strings(self, option):
        return self._format_option_strings(option, ' <%s>', ', ')

    def _format_option_strings(self, option, mvarfmt=' <%s>', optsep=', '):
        """
        Return a comma-separated list of option strings and metavars.

        :param option:  tuple of (short opt, long opt), e.g: ('-f', '--format')
        :param mvarfmt: metavar format string - evaluated as mvarfmt % metavar
        :param optsep:  separator
        """
        opts = []

        if option._short_opts:
            opts.append(option._short_opts[0])
        if option._long_opts:
            opts.append(option._long_opts[0])
        if len(opts) > 1:
            opts.insert(1, optsep)

        if option.takes_value():
            metavar = option.metavar or option.dest.lower()
            opts.append(mvarfmt % metavar.lower())

        return ''.join(opts)

    def format_heading(self, heading):
        if heading == 'Options':
            return ''
        return heading + ':\n'

    def format_usage(self, usage):
        """
        Ensure there is only one newline between usage and the first heading
        if there is no description.
        """
        msg = '\nUsage: %s\n' % self.indent_lines(textwrap.dedent(usage), "  ")
        return msg

    def format_description(self, description):
        # leave full control over description to us
        if description:
            if hasattr(self.parser, 'main'):
                label = 'Commands'
            else:
                label = 'Description'
            #some doc strings have inital newlines, some don't
            description = description.lstrip('\n')
            #some doc strings have final newlines and spaces, some don't
            description = description.rstrip()
            #dedent, then reindent
            description = self.indent_lines(textwrap.dedent(description), "  ")
            description = '%s:\n%s\n' % (label, description)
            return description
        else:
            return ''

    def format_epilog(self, epilog):
        # leave full control over epilog to us
        if epilog:
            return epilog
        else:
            return ''

    def indent_lines(self, text, indent):
        new_lines = [indent + line for line in text.split('\n')]
        return "\n".join(new_lines)


class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter):
    """Custom help formatter for use in ConfigOptionParser that updates
    the defaults before expanding them, allowing them to show up correctly
    in the help listing"""

    def expand_default(self, option):
        if self.parser is not None:
            self.parser.update_defaults(self.parser.defaults)
        return optparse.IndentedHelpFormatter.expand_default(self, option)


class CustomOptionParser(optparse.OptionParser):
    def insert_option_group(self, idx, *args, **kwargs):
        """Insert an OptionGroup at a given position."""
        group = self.add_option_group(*args, **kwargs)

        self.option_groups.pop()
        self.option_groups.insert(idx, group)

        return group

    @property
    def option_list_all(self):
        """Get a list of all options, including those in option groups."""
        res = self.option_list[:]
        for i in self.option_groups:
            res.extend(i.option_list)

        return res


class ConfigOptionParser(CustomOptionParser):
    """Custom option parser which updates its defaults by checking the
    configuration files and environmental variables"""

    def __init__(self, *args, **kwargs):
        self.config = ConfigParser.RawConfigParser()
        self.name = kwargs.pop('name')
        self.files = self.get_config_files()
        if self.files:
            self.config.read(self.files)
        assert self.name
        optparse.OptionParser.__init__(self, *args, **kwargs)

    def get_config_files(self):
        config_file = os.environ.get('PIP_CONFIG_FILE', False)
        if config_file == os.devnull:
            return []
        if config_file and os.path.exists(config_file):
            return [config_file]
        return [default_config_file]

    def check_default(self, option, key, val):
        try:
            return option.check_value(key, val)
        except optparse.OptionValueError:
            e = sys.exc_info()[1]
            print("An error occurred during configuration: %s" % e)
            sys.exit(3)

    def update_defaults(self, defaults):
        """Updates the given defaults with values from the config files and
        the environ. Does a little special handling for certain types of
        options (lists)."""
        # Then go and look for the other sources of configuration:
        config = {}
        # 1. config files
        for section in ('global', self.name):
            config.update(self.normalize_keys(self.get_config_section(section)))
        # 2. environmental variables
        config.update(self.normalize_keys(self.get_environ_vars()))
        # Then set the options with those values
        for key, val in config.items():
            option = self.get_option(key)
            if option is not None:
                # ignore empty values
                if not val:
                    continue
                if option.action in ('store_true', 'store_false', 'count'):
                    val = strtobool(val)
                if option.action == 'append':
                    val = val.split()
                    val = [self.check_default(option, key, v) for v in val]
                else:
                    val = self.check_default(option, key, val)

                defaults[option.dest] = val
        return defaults

    def normalize_keys(self, items):
        """Return a config dictionary with normalized keys regardless of
        whether the keys were specified in environment variables or in config
        files"""
        normalized = {}
        for key, val in items:
            key = key.replace('_', '-')
            if not key.startswith('--'):
                key = '--%s' % key  # only prefer long opts
            normalized[key] = val
        return normalized

    def get_config_section(self, name):
        """Get a section of a configuration"""
        if self.config.has_section(name):
            return self.config.items(name)
        return []

    def get_environ_vars(self, prefix='PIP_'):
        """Returns a generator with all environmental vars with prefix PIP_"""
        for key, val in os.environ.items():
            if key.startswith(prefix):
                yield (key.replace(prefix, '').lower(), val)

    def get_default_values(self):
        """Overridding to make updating the defaults after instantiation of
        the option parser possible, update_defaults() does the dirty work."""
        if not self.process_default_values:
            # Old, pre-Optik 1.5 behaviour.
            return optparse.Values(self.defaults)

        defaults = self.update_defaults(self.defaults.copy())  # ours
        for option in self._get_all_options():
            default = defaults.get(option.dest)
            if isinstance(default, string_types):
                opt_str = option.get_opt_string()
                defaults[option.dest] = option.check_value(opt_str, default)
        return optparse.Values(defaults)

    def error(self, msg):
        self.print_usage(sys.stderr)
        self.exit(2, "%s\n" % msg)
site-packages/pip/__init__.py000064400000022324151733464010012174 0ustar00import os
import optparse

import sys
import re

from pip.exceptions import InstallationError, CommandError, PipError
from pip.log import logger
from pip.util import get_installed_distributions, get_prog
from pip.vcs import git, mercurial, subversion, bazaar  # noqa
from pip.baseparser import ConfigOptionParser, UpdatingDefaultsHelpFormatter
from pip.commands import commands, get_summaries, get_similar_commands

# This fixes a peculiarity when importing via __import__ - as we are
# initialising the pip module, "from pip import cmdoptions" is recursive
# and appears not to work properly in that situation.
import pip.cmdoptions
cmdoptions = pip.cmdoptions

# The version as used in the setup.py and the docs conf.py
__version__ = "1.5.6"


def autocomplete():
    """Command and option completion for the main option parser (and options)
    and its subcommands (and options).

    Enable by sourcing one of the completion shell scripts (bash or zsh).
    """
    # Don't complete if user hasn't sourced bash_completion file.
    if 'PIP_AUTO_COMPLETE' not in os.environ:
        return
    cwords = os.environ['COMP_WORDS'].split()[1:]
    cword = int(os.environ['COMP_CWORD'])
    try:
        current = cwords[cword - 1]
    except IndexError:
        current = ''

    subcommands = [cmd for cmd, summary in get_summaries()]
    options = []
    # subcommand
    try:
        subcommand_name = [w for w in cwords if w in subcommands][0]
    except IndexError:
        subcommand_name = None

    parser = create_main_parser()
    # subcommand options
    if subcommand_name:
        # special case: 'help' subcommand has no options
        if subcommand_name == 'help':
            sys.exit(1)
        # special case: list locally installed dists for uninstall command
        if subcommand_name == 'uninstall' and not current.startswith('-'):
            installed = []
            lc = current.lower()
            for dist in get_installed_distributions(local_only=True):
                if dist.key.startswith(lc) and dist.key not in cwords[1:]:
                    installed.append(dist.key)
            # if there are no dists installed, fall back to option completion
            if installed:
                for dist in installed:
                    print(dist)
                sys.exit(1)

        subcommand = commands[subcommand_name]()
        options += [(opt.get_opt_string(), opt.nargs)
                    for opt in subcommand.parser.option_list_all
                    if opt.help != optparse.SUPPRESS_HELP]

        # filter out previously specified options from available options
        prev_opts = [x.split('=')[0] for x in cwords[1:cword - 1]]
        options = [(x, v) for (x, v) in options if x not in prev_opts]
        # filter options by current input
        options = [(k, v) for k, v in options if k.startswith(current)]
        for option in options:
            opt_label = option[0]
            # append '=' to options which require args
            if option[1]:
                opt_label += '='
            print(opt_label)
    else:
        # show main parser options only when necessary
        if current.startswith('-') or current.startswith('--'):
            opts = [i.option_list for i in parser.option_groups]
            opts.append(parser.option_list)
            opts = (o for it in opts for o in it)

            subcommands += [i.get_opt_string() for i in opts
                            if i.help != optparse.SUPPRESS_HELP]

        print(' '.join([x for x in subcommands if x.startswith(current)]))
    sys.exit(1)


def create_main_parser():
    parser_kw = {
        'usage': '\n%prog <command> [options]',
        'add_help_option': False,
        'formatter': UpdatingDefaultsHelpFormatter(),
        'name': 'global',
        'prog': get_prog(),
    }

    parser = ConfigOptionParser(**parser_kw)
    parser.disable_interspersed_args()

    pip_pkg_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    parser.version = 'pip %s from %s (python %s)' % (
        __version__,  pip_pkg_dir, sys.version[:3])

    # add the general options
    gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser)
    parser.add_option_group(gen_opts)

    parser.main = True # so the help formatter knows

    # create command listing for description
    command_summaries = get_summaries()
    description = [''] + ['%-27s %s' % (i, j) for i, j in command_summaries]
    parser.description = '\n'.join(description)

    return parser


def parseopts(args):
    parser = create_main_parser()

    # Note: parser calls disable_interspersed_args(), so the result of this call
    # is to split the initial args into the general options before the
    # subcommand and everything else.
    # For example:
    #  args: ['--timeout=5', 'install', '--user', 'INITools']
    #  general_options: ['--timeout==5']
    #  args_else: ['install', '--user', 'INITools']
    general_options, args_else = parser.parse_args(args)

    # --version
    if general_options.version:
        sys.stdout.write(parser.version)
        sys.stdout.write(os.linesep)
        sys.exit()

    # pip || pip help -> print_help()
    if not args_else or (args_else[0] == 'help' and len(args_else) == 1):
        parser.print_help()
        sys.exit()

    # the subcommand name
    cmd_name = args_else[0].lower()

    #all the args without the subcommand
    cmd_args = args[:]
    cmd_args.remove(args_else[0].lower())

    if cmd_name not in commands:
        guess = get_similar_commands(cmd_name)

        msg = ['unknown command "%s"' % cmd_name]
        if guess:
            msg.append('maybe you meant "%s"' % guess)

        raise CommandError(' - '.join(msg))

    return cmd_name, cmd_args


def main(initial_args=None):
    if initial_args is None:
        initial_args = sys.argv[1:]

    autocomplete()

    try:
        cmd_name, cmd_args = parseopts(initial_args)
    except PipError:
        e = sys.exc_info()[1]
        sys.stderr.write("ERROR: %s" % e)
        sys.stderr.write(os.linesep)
        sys.exit(1)

    command = commands[cmd_name]()
    return command.main(cmd_args)


def bootstrap():
    """
    Bootstrapping function to be called from install-pip.py script.
    """
    pkgs = ['pip']
    try:
        import setuptools
    except ImportError:
        pkgs.append('setuptools')
    return main(['install', '--upgrade'] + pkgs + sys.argv[1:])

############################################################
## Writing freeze files


class FrozenRequirement(object):

    def __init__(self, name, req, editable, comments=()):
        self.name = name
        self.req = req
        self.editable = editable
        self.comments = comments

    _rev_re = re.compile(r'-r(\d+)$')
    _date_re = re.compile(r'-(20\d\d\d\d\d\d)$')

    @classmethod
    def from_dist(cls, dist, dependency_links, find_tags=False):
        location = os.path.normcase(os.path.abspath(dist.location))
        comments = []
        from pip.vcs import vcs, get_src_requirement
        if vcs.get_backend_name(location):
            editable = True
            try:
                req = get_src_requirement(dist, location, find_tags)
            except InstallationError:
                ex = sys.exc_info()[1]
                logger.warn("Error when trying to get requirement for VCS system %s, falling back to uneditable format" % ex)
                req = None
            if req is None:
                logger.warn('Could not determine repository location of %s' % location)
                comments.append('## !! Could not determine repository location')
                req = dist.as_requirement()
                editable = False
        else:
            editable = False
            req = dist.as_requirement()
            specs = req.specs
            assert len(specs) == 1 and specs[0][0] == '=='
            version = specs[0][1]
            ver_match = cls._rev_re.search(version)
            date_match = cls._date_re.search(version)
            if ver_match or date_match:
                svn_backend = vcs.get_backend('svn')
                if svn_backend:
                    svn_location = svn_backend(
                        ).get_location(dist, dependency_links)
                if not svn_location:
                    logger.warn(
                        'Warning: cannot find svn location for %s' % req)
                    comments.append('## FIXME: could not find svn URL in dependency_links for this package:')
                else:
                    comments.append('# Installing as editable to satisfy requirement %s:' % req)
                    if ver_match:
                        rev = ver_match.group(1)
                    else:
                        rev = '{%s}' % date_match.group(1)
                    editable = True
                    req = '%s@%s#egg=%s' % (svn_location, rev, cls.egg_name(dist))
        return cls(dist.project_name, req, editable, comments)

    @staticmethod
    def egg_name(dist):
        name = dist.egg_name()
        match = re.search(r'-py\d\.\d$', name)
        if match:
            name = name[:match.start()]
        return name

    def __str__(self):
        req = self.req
        if self.editable:
            req = '-e %s' % req
        return '\n'.join(list(self.comments) + [str(req)]) + '\n'


if __name__ == '__main__':
    exit = main()
    if exit:
        sys.exit(exit)
site-packages/pip/locations.py000064400000014072151733464010012431 0ustar00"""Locations where we look for configs, install stuff, etc"""

import sys
import site
import os
import tempfile
from distutils.command.install import install, SCHEME_KEYS
import getpass
from pip.backwardcompat import get_python_lib, get_path_uid, user_site
import pip.exceptions


DELETE_MARKER_MESSAGE = '''\
This file is placed here by pip to indicate the source was put
here by pip.

Once this package is successfully installed this source code will be
deleted (unless you remove this file).
'''
PIP_DELETE_MARKER_FILENAME = 'pip-delete-this-directory.txt'

def write_delete_marker_file(directory):
    """
    Write the pip delete marker file into this directory.
    """
    filepath = os.path.join(directory, PIP_DELETE_MARKER_FILENAME)
    marker_fp = open(filepath, 'w')
    marker_fp.write(DELETE_MARKER_MESSAGE)
    marker_fp.close()


def running_under_virtualenv():
    """
    Return True if we're running inside a virtualenv, False otherwise.

    """
    if hasattr(sys, 'real_prefix'):
        return True
    elif sys.prefix != getattr(sys, "base_prefix", sys.prefix):
        return True

    return False


def virtualenv_no_global():
    """
    Return True if in a venv and no system site packages.
    """
    #this mirrors the logic in virtualenv.py for locating the no-global-site-packages.txt file
    site_mod_dir = os.path.dirname(os.path.abspath(site.__file__))
    no_global_file = os.path.join(site_mod_dir, 'no-global-site-packages.txt')
    if running_under_virtualenv() and os.path.isfile(no_global_file):
        return True

def __get_username():
    """ Returns the effective username of the current process. """
    if sys.platform == 'win32':
        return getpass.getuser()
    import pwd
    return pwd.getpwuid(os.geteuid()).pw_name

def _get_build_prefix():
    """ Returns a safe build_prefix """
    path = os.path.join(tempfile.gettempdir(), 'pip_build_%s' %
        __get_username())
    if sys.platform == 'win32':
        """ on windows(tested on 7) temp dirs are isolated """
        return path
    try:
        os.mkdir(path)
        write_delete_marker_file(path)
    except OSError:
        file_uid = None
        try:
            # raises OSError for symlinks
            # https://github.com/pypa/pip/pull/935#discussion_r5307003
            file_uid = get_path_uid(path)
        except OSError:
            file_uid = None

        if file_uid != os.geteuid():
            msg = "The temporary folder for building (%s) is either not owned by you, or is a symlink." \
                % path
            print (msg)
            print("pip will not work until the temporary folder is " + \
                 "either deleted or is a real directory owned by your user account.")
            raise pip.exceptions.InstallationError(msg)
    return path

if running_under_virtualenv():
    build_prefix = os.path.join(sys.prefix, 'build')
    src_prefix = os.path.join(sys.prefix, 'src')
else:
    # Note: intentionally NOT using mkdtemp
    # See https://github.com/pypa/pip/issues/906 for plan to move to mkdtemp
    build_prefix = _get_build_prefix()

    ## FIXME: keep src in cwd for now (it is not a temporary folder)
    try:
        src_prefix = os.path.join(os.getcwd(), 'src')
    except OSError:
        # In case the current working directory has been renamed or deleted
        sys.exit("The folder you are executing pip from can no longer be found.")

# under Mac OS X + virtualenv sys.prefix is not properly resolved
# it is something like /path/to/python/bin/..
# Note: using realpath due to tmp dirs on OSX being symlinks
build_prefix = os.path.abspath(os.path.realpath(build_prefix))
src_prefix = os.path.abspath(src_prefix)

# FIXME doesn't account for venv linked to global site-packages

site_packages = get_python_lib()
user_dir = os.path.expanduser('~')
if sys.platform == 'win32':
    bin_py = os.path.join(sys.prefix, 'Scripts')
    bin_user = os.path.join(user_site, 'Scripts') if user_site else None
    # buildout uses 'bin' on Windows too?
    if not os.path.exists(bin_py):
        bin_py = os.path.join(sys.prefix, 'bin')
        bin_user = os.path.join(user_site, 'bin') if user_site else None
    default_storage_dir = os.path.join(user_dir, 'pip')
    default_config_file = os.path.join(default_storage_dir, 'pip.ini')
    default_log_file = os.path.join(default_storage_dir, 'pip.log')
else:
    bin_py = os.path.join(sys.prefix, 'bin')
    bin_user = os.path.join(user_site, 'bin') if user_site else None
    default_storage_dir = os.path.join(user_dir, '.pip')
    default_config_file = os.path.join(default_storage_dir, 'pip.conf')
    default_log_file = os.path.join(default_storage_dir, 'pip.log')

    # Forcing to use /usr/local/bin for standard Mac OS X framework installs
    # Also log to ~/Library/Logs/ for use with the Console.app log viewer
    if sys.platform[:6] == 'darwin' and sys.prefix[:16] == '/System/Library/':
        bin_py = '/usr/local/bin'
        default_log_file = os.path.join(user_dir, 'Library/Logs/pip.log')


def distutils_scheme(dist_name, user=False, home=None, root=None):
    """
    Return a distutils install scheme
    """
    from distutils.dist import Distribution

    scheme = {}
    d = Distribution({'name': dist_name})
    d.parse_config_files()
    i = d.get_command_obj('install', create=True)
    # NOTE: setting user or home has the side-effect of creating the home dir or
    # user base for installations during finalize_options()
    # ideally, we'd prefer a scheme class that has no side-effects.
    i.user = user or i.user
    i.home = home or i.home
    i.root = root or i.root
    i.finalize_options()
    for key in SCHEME_KEYS:
        scheme[key] = getattr(i, 'install_'+key)

    if running_under_virtualenv():
        scheme['headers'] = os.path.join(sys.prefix,
                                    'include',
                                    'site',
                                    'python' + sys.version[:3],
                                    dist_name)

        if root is not None:
            scheme["headers"] = os.path.join(
                root,
                os.path.abspath(scheme["headers"])[1:],
            )

    return scheme
site-packages/pip/exceptions.py000064400000002076151733464010012620 0ustar00"""Exceptions used throughout package"""


class PipError(Exception):
    """Base pip exception"""


class InstallationError(PipError):
    """General exception during installation"""


class UninstallationError(PipError):
    """General exception during uninstallation"""


class DistributionNotFound(InstallationError):
    """Raised when a distribution cannot be found to satisfy a requirement"""


class BestVersionAlreadyInstalled(PipError):
    """Raised when the most up-to-date version of a package is already
    installed.  """


class BadCommand(PipError):
    """Raised when virtualenv or a command is not found"""


class CommandError(PipError):
    """Raised when there is an error in command-line arguments"""


class PreviousBuildDirError(PipError):
    """Raised when there's a previous conflicting build directory"""


class HashMismatch(InstallationError):
    """Distribution file hash values don't match."""


class InvalidWheelFilename(InstallationError):
    """Invalid wheel filename."""


class UnsupportedWheel(InstallationError):
    """Unsupported wheel."""
site-packages/pip/util.py000064400000061044151733464010011414 0ustar00import sys
import shutil
import os
import stat
import re
import posixpath
import zipfile
import tarfile
import subprocess
import textwrap
import tempfile

from pip.exceptions import InstallationError, BadCommand, PipError
from pip.backwardcompat import(WindowsError, string_types, raw_input,
                                console_to_str, user_site, PermissionError)
from pip.locations import site_packages, running_under_virtualenv, virtualenv_no_global
from pip.log import logger
from pip._vendor import pkg_resources
from pip._vendor.distlib import version

__all__ = ['rmtree', 'display_path', 'backup_dir',
           'find_command', 'ask', 'Inf',
           'normalize_name', 'splitext',
           'format_size', 'is_installable_dir',
           'is_svn_page', 'file_contents',
           'split_leading_dir', 'has_leading_dir',
           'make_path_relative', 'normalize_path',
           'renames', 'get_terminal_size', 'get_prog',
           'unzip_file', 'untar_file', 'create_download_cache_folder',
           'cache_download', 'unpack_file', 'call_subprocess']


def get_prog():
    try:
        if os.path.basename(sys.argv[0]) in ('__main__.py', '-c'):
            return "%s -m pip" % sys.executable
    except (AttributeError, TypeError, IndexError):
        pass
    return 'pip'


def rmtree(dir, ignore_errors=False):
    shutil.rmtree(dir, ignore_errors=ignore_errors,
                  onerror=rmtree_errorhandler)


def rmtree_errorhandler(func, path, exc_info):
    """On Windows, the files in .svn are read-only, so when rmtree() tries to
    remove them, an exception is thrown.  We catch that here, remove the
    read-only attribute, and hopefully continue without problems."""
    exctype, value = exc_info[:2]
    if not ((exctype is WindowsError and value.args[0] == 5) or #others
            (exctype is OSError and value.args[0] == 13) or #python2.4
            (exctype is PermissionError and value.args[3] == 5) #python3.3
            ):
        raise
    # file type should currently be read only
    if ((os.stat(path).st_mode & stat.S_IREAD) != stat.S_IREAD):
        raise
    # convert to read/write
    os.chmod(path, stat.S_IWRITE)
    # use the original function to repeat the operation
    func(path)


def display_path(path):
    """Gives the display value for a given path, making it relative to cwd
    if possible."""
    path = os.path.normcase(os.path.abspath(path))
    if path.startswith(os.getcwd() + os.path.sep):
        path = '.' + path[len(os.getcwd()):]
    return path


def backup_dir(dir, ext='.bak'):
    """Figure out the name of a directory to back up the given dir to
    (adding .bak, .bak2, etc)"""
    n = 1
    extension = ext
    while os.path.exists(dir + extension):
        n += 1
        extension = ext + str(n)
    return dir + extension


def find_command(cmd, paths=None, pathext=None):
    """Searches the PATH for the given command and returns its path"""
    if paths is None:
        paths = os.environ.get('PATH', '').split(os.pathsep)
    if isinstance(paths, string_types):
        paths = [paths]
    # check if there are funny path extensions for executables, e.g. Windows
    if pathext is None:
        pathext = get_pathext()
    pathext = [ext for ext in pathext.lower().split(os.pathsep) if len(ext)]
    # don't use extensions if the command ends with one of them
    if os.path.splitext(cmd)[1].lower() in pathext:
        pathext = ['']
    # check if we find the command on PATH
    for path in paths:
        # try without extension first
        cmd_path = os.path.join(path, cmd)
        for ext in pathext:
            # then including the extension
            cmd_path_ext = cmd_path + ext
            if os.path.isfile(cmd_path_ext):
                return cmd_path_ext
        if os.path.isfile(cmd_path):
            return cmd_path
    raise BadCommand('Cannot find command %r' % cmd)


def get_pathext(default_pathext=None):
    """Returns the path extensions from environment or a default"""
    if default_pathext is None:
        default_pathext = os.pathsep.join(['.COM', '.EXE', '.BAT', '.CMD'])
    pathext = os.environ.get('PATHEXT', default_pathext)
    return pathext


def ask_path_exists(message, options):
    for action in os.environ.get('PIP_EXISTS_ACTION', '').split():
        if action in options:
            return action
    return ask(message, options)


def ask(message, options):
    """Ask the message interactively, with the given possible responses"""
    while 1:
        if os.environ.get('PIP_NO_INPUT'):
            raise Exception('No input was expected ($PIP_NO_INPUT set); question: %s' % message)
        response = raw_input(message)
        response = response.strip().lower()
        if response not in options:
            print('Your response (%r) was not one of the expected responses: %s' % (
                response, ', '.join(options)))
        else:
            return response


class _Inf(object):
    """I am bigger than everything!"""

    def __eq__(self, other):
        if self is other:
            return True
        else:
            return False

    def __ne__(self, other):
        return not self.__eq__(other)

    def __lt__(self, other):
        return False

    def __le__(self, other):
        return False

    def __gt__(self, other):
        return True

    def __ge__(self, other):
        return True

    def __repr__(self):
        return 'Inf'


Inf = _Inf() #this object is not currently used as a sortable in our code
del _Inf


_normalize_re = re.compile(r'[^a-z]', re.I)


def normalize_name(name):
    return _normalize_re.sub('-', name.lower())


def format_size(bytes):
    if bytes > 1000*1000:
        return '%.1fMB' % (bytes/1000.0/1000)
    elif bytes > 10*1000:
        return '%ikB' % (bytes/1000)
    elif bytes > 1000:
        return '%.1fkB' % (bytes/1000.0)
    else:
        return '%ibytes' % bytes


def is_installable_dir(path):
    """Return True if `path` is a directory containing a setup.py file."""
    if not os.path.isdir(path):
        return False
    setup_py = os.path.join(path, 'setup.py')
    if os.path.isfile(setup_py):
        return True
    return False


def is_svn_page(html):
    """Returns true if the page appears to be the index page of an svn repository"""
    return (re.search(r'<title>[^<]*Revision \d+:', html)
            and re.search(r'Powered by (?:<a[^>]*?>)?Subversion', html, re.I))


def file_contents(filename):
    fp = open(filename, 'rb')
    try:
        return fp.read().decode('utf-8')
    finally:
        fp.close()


def split_leading_dir(path):
    path = str(path)
    path = path.lstrip('/').lstrip('\\')
    if '/' in path and (('\\' in path and path.find('/') < path.find('\\'))
                        or '\\' not in path):
        return path.split('/', 1)
    elif '\\' in path:
        return path.split('\\', 1)
    else:
        return path, ''


def has_leading_dir(paths):
    """Returns true if all the paths have the same leading path name
    (i.e., everything is in one subdirectory in an archive)"""
    common_prefix = None
    for path in paths:
        prefix, rest = split_leading_dir(path)
        if not prefix:
            return False
        elif common_prefix is None:
            common_prefix = prefix
        elif prefix != common_prefix:
            return False
    return True


def make_path_relative(path, rel_to):
    """
    Make a filename relative, where the filename path, and it is
    relative to rel_to

        >>> make_relative_path('/usr/share/something/a-file.pth',
        ...                    '/usr/share/another-place/src/Directory')
        '../../../something/a-file.pth'
        >>> make_relative_path('/usr/share/something/a-file.pth',
        ...                    '/home/user/src/Directory')
        '../../../usr/share/something/a-file.pth'
        >>> make_relative_path('/usr/share/a-file.pth', '/usr/share/')
        'a-file.pth'
    """
    path_filename = os.path.basename(path)
    path = os.path.dirname(path)
    path = os.path.normpath(os.path.abspath(path))
    rel_to = os.path.normpath(os.path.abspath(rel_to))
    path_parts = path.strip(os.path.sep).split(os.path.sep)
    rel_to_parts = rel_to.strip(os.path.sep).split(os.path.sep)
    while path_parts and rel_to_parts and path_parts[0] == rel_to_parts[0]:
        path_parts.pop(0)
        rel_to_parts.pop(0)
    full_parts = ['..']*len(rel_to_parts) + path_parts + [path_filename]
    if full_parts == ['']:
        return '.' + os.path.sep
    return os.path.sep.join(full_parts)


def normalize_path(path):
    """
    Convert a path to its canonical, case-normalized, absolute version.

    """
    return os.path.normcase(os.path.realpath(os.path.expanduser(path)))


def splitext(path):
    """Like os.path.splitext, but take off .tar too"""
    base, ext = posixpath.splitext(path)
    if base.lower().endswith('.tar'):
        ext = base[-4:] + ext
        base = base[:-4]
    return base, ext


def renames(old, new):
    """Like os.renames(), but handles renaming across devices."""
    # Implementation borrowed from os.renames().
    head, tail = os.path.split(new)
    if head and tail and not os.path.exists(head):
        os.makedirs(head)

    shutil.move(old, new)

    head, tail = os.path.split(old)
    if head and tail:
        try:
            os.removedirs(head)
        except OSError:
            pass


def is_local(path):
    """
    Return True if path is within sys.prefix, if we're running in a virtualenv.

    If we're not in a virtualenv, all paths are considered "local."

    """
    if not running_under_virtualenv():
        return True
    return normalize_path(path).startswith(normalize_path(sys.prefix))


def dist_is_local(dist):
    """
    Return True if given Distribution object is installed locally
    (i.e. within current virtualenv).

    Always True if we're not in a virtualenv.

    """
    return is_local(dist_location(dist))


def dist_in_usersite(dist):
    """
    Return True if given Distribution is installed in user site.
    """
    if user_site:
        return normalize_path(dist_location(dist)).startswith(normalize_path(user_site))
    else:
        return False

def dist_in_site_packages(dist):
    """
    Return True if given Distribution is installed in distutils.sysconfig.get_python_lib().
    """
    return normalize_path(dist_location(dist)).startswith(normalize_path(site_packages))


def dist_is_editable(dist):
    """Is distribution an editable install?"""
    #TODO: factor out determining editableness out of FrozenRequirement
    from pip import FrozenRequirement
    req = FrozenRequirement.from_dist(dist, [])
    return req.editable

def get_installed_distributions(local_only=True,
                                skip=('setuptools', 'pip', 'python', 'distribute'),
                                include_editables=True,
                                editables_only=False):
    """
    Return a list of installed Distribution objects.

    If ``local_only`` is True (default), only return installations
    local to the current virtualenv, if in a virtualenv.

    ``skip`` argument is an iterable of lower-case project names to
    ignore; defaults to ('setuptools', 'pip', 'python'). [FIXME also
    skip virtualenv?]

    If ``editables`` is False, don't report editables.

    If ``editables_only`` is True , only report editables.

    """
    if local_only:
        local_test = dist_is_local
    else:
        local_test = lambda d: True

    if include_editables:
        editable_test = lambda d: True
    else:
        editable_test = lambda d: not dist_is_editable(d)

    if editables_only:
        editables_only_test = lambda d: dist_is_editable(d)
    else:
        editables_only_test = lambda d: True

    return [d for d in pkg_resources.working_set
            if local_test(d)
            and d.key not in skip
            and editable_test(d)
            and editables_only_test(d)
            ]


def egg_link_path(dist):
    """
    Return the path for the .egg-link file if it exists, otherwise, None.

    There's 3 scenarios:
    1) not in a virtualenv
       try to find in site.USER_SITE, then site_packages
    2) in a no-global virtualenv
       try to find in site_packages
    3) in a yes-global virtualenv
       try to find in site_packages, then site.USER_SITE  (don't look in global location)

    For #1 and #3, there could be odd cases, where there's an egg-link in 2 locations.
    This method will just return the first one found.
    """
    sites = []
    if running_under_virtualenv():
        if virtualenv_no_global():
            sites.append(site_packages)
        else:
            sites.append(site_packages)
            if user_site:
                sites.append(user_site)
    else:
        if user_site:
            sites.append(user_site)
        sites.append(site_packages)

    for site in sites:
        egglink = os.path.join(site, dist.project_name) + '.egg-link'
        if os.path.isfile(egglink):
            return egglink


def dist_location(dist):
    """
    Get the site-packages location of this distribution. Generally
    this is dist.location, except in the case of develop-installed
    packages, where dist.location is the source code location, and we
    want to know where the egg-link file is.

    """
    egg_link = egg_link_path(dist)
    if egg_link:
        return egg_link
    return dist.location


def get_terminal_size():
    """Returns a tuple (x, y) representing the width(x) and the height(x)
    in characters of the terminal window."""
    def ioctl_GWINSZ(fd):
        try:
            import fcntl
            import termios
            import struct
            cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ,
        '1234'))
        except:
            return None
        if cr == (0, 0):
            return None
        if cr == (0, 0):
            return None
        return cr
    cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2)
    if not cr:
        try:
            fd = os.open(os.ctermid(), os.O_RDONLY)
            cr = ioctl_GWINSZ(fd)
            os.close(fd)
        except:
            pass
    if not cr:
        cr = (os.environ.get('LINES', 25), os.environ.get('COLUMNS', 80))
    return int(cr[1]), int(cr[0])


def current_umask():
    """Get the current umask which involves having to set it temporarily."""
    mask = os.umask(0)
    os.umask(mask)
    return mask


def unzip_file(filename, location, flatten=True):
    """
    Unzip the file (with path `filename`) to the destination `location`.  All
    files are written based on system defaults and umask (i.e. permissions are
    not preserved), except that regular file members with any execute
    permissions (user, group, or world) have "chmod +x" applied after being
    written. Note that for windows, any execute changes using os.chmod are
    no-ops per the python docs.
    """
    if not os.path.exists(location):
        os.makedirs(location)
    zipfp = open(filename, 'rb')
    try:
        zip = zipfile.ZipFile(zipfp)
        leading = has_leading_dir(zip.namelist()) and flatten
        for info in zip.infolist():
            name = info.filename
            data = zip.read(name)
            fn = name
            if leading:
                fn = split_leading_dir(name)[1]
            fn = os.path.join(location, fn)
            dir = os.path.dirname(fn)
            if not os.path.exists(dir):
                os.makedirs(dir)
            if fn.endswith('/') or fn.endswith('\\'):
                # A directory
                if not os.path.exists(fn):
                    os.makedirs(fn)
            else:
                fp = open(fn, 'wb')
                try:
                    fp.write(data)
                finally:
                    fp.close()
                    mode = info.external_attr >> 16
                    # if mode and regular file and any execute permissions for user/group/world?
                    if mode and stat.S_ISREG(mode) and  mode & 0o111:
                        # make dest file have execute for user/group/world (chmod +x)
                        # no-op on windows per python docs
                        os.chmod(fn, (0o777-current_umask() | 0o111))
    finally:
        zipfp.close()


def untar_file(filename, location):
    """
    Untar the file (with path `filename`) to the destination `location`.
    All files are written based on system defaults and umask (i.e. permissions
    are not preserved), except that regular file members with any execute
    permissions (user, group, or world) have "chmod +x" applied after being
    written.  Note that for windows, any execute changes using os.chmod are
    no-ops per the python docs.
    """
    if not os.path.exists(location):
        os.makedirs(location)
    if filename.lower().endswith('.gz') or filename.lower().endswith('.tgz'):
        mode = 'r:gz'
    elif filename.lower().endswith('.bz2') or filename.lower().endswith('.tbz'):
        mode = 'r:bz2'
    elif filename.lower().endswith('.tar'):
        mode = 'r'
    else:
        logger.warn('Cannot determine compression type for file %s' % filename)
        mode = 'r:*'
    tar = tarfile.open(filename, mode)
    try:
        # note: python<=2.5 doesnt seem to know about pax headers, filter them
        leading = has_leading_dir([
            member.name for member in tar.getmembers()
            if member.name != 'pax_global_header'
        ])
        for member in tar.getmembers():
            fn = member.name
            if fn == 'pax_global_header':
                continue
            if leading:
                fn = split_leading_dir(fn)[1]
            path = os.path.join(location, fn)
            if member.isdir():
                if not os.path.exists(path):
                    os.makedirs(path)
            elif member.issym():
                try:
                    tar._extract_member(member, path)
                except:
                    e = sys.exc_info()[1]
                    # Some corrupt tar files seem to produce this
                    # (specifically bad symlinks)
                    logger.warn(
                        'In the tar file %s the member %s is invalid: %s'
                        % (filename, member.name, e))
                    continue
            else:
                try:
                    fp = tar.extractfile(member)
                except (KeyError, AttributeError):
                    e = sys.exc_info()[1]
                    # Some corrupt tar files seem to produce this
                    # (specifically bad symlinks)
                    logger.warn(
                        'In the tar file %s the member %s is invalid: %s'
                        % (filename, member.name, e))
                    continue
                if not os.path.exists(os.path.dirname(path)):
                    os.makedirs(os.path.dirname(path))
                destfp = open(path, 'wb')
                try:
                    shutil.copyfileobj(fp, destfp)
                finally:
                    destfp.close()
                fp.close()
                # member have any execute permissions for user/group/world?
                if member.mode & 0o111:
                    # make dest file have execute for user/group/world
                    # no-op on windows per python docs
                    os.chmod(path, (0o777-current_umask() | 0o111))
    finally:
        tar.close()


def create_download_cache_folder(folder):
    logger.indent -= 2
    logger.notify('Creating supposed download cache at %s' % folder)
    logger.indent += 2
    os.makedirs(folder)


def cache_download(target_file, temp_location, content_type):
    logger.notify('Storing download in cache at %s' % display_path(target_file))
    shutil.copyfile(temp_location, target_file)
    fp = open(target_file+'.content-type', 'w')
    fp.write(content_type)
    fp.close()


def unpack_file(filename, location, content_type, link):
    filename = os.path.realpath(filename)
    if (content_type == 'application/zip'
        or filename.endswith('.zip')
        or filename.endswith('.pybundle')
        or filename.endswith('.whl')
        or zipfile.is_zipfile(filename)):
        unzip_file(filename, location, flatten=not filename.endswith(('.pybundle', '.whl')))
    elif (content_type == 'application/x-gzip'
          or tarfile.is_tarfile(filename)
          or splitext(filename)[1].lower() in ('.tar', '.tar.gz', '.tar.bz2', '.tgz', '.tbz')):
        untar_file(filename, location)
    elif (content_type and content_type.startswith('text/html')
          and is_svn_page(file_contents(filename))):
        # We don't really care about this
        from pip.vcs.subversion import Subversion
        Subversion('svn+' + link.url).unpack(location)
    else:
        ## FIXME: handle?
        ## FIXME: magic signatures?
        logger.fatal('Cannot unpack file %s (downloaded from %s, content-type: %s); cannot detect archive format'
                     % (filename, location, content_type))
        raise InstallationError('Cannot determine archive format of %s' % location)


def call_subprocess(cmd, show_stdout=True,
                    filter_stdout=None, cwd=None,
                    raise_on_returncode=True,
                    command_level=logger.DEBUG, command_desc=None,
                    extra_environ=None):
    if command_desc is None:
        cmd_parts = []
        for part in cmd:
            if ' ' in part or '\n' in part or '"' in part or "'" in part:
                part = '"%s"' % part.replace('"', '\\"')
            cmd_parts.append(part)
        command_desc = ' '.join(cmd_parts)
    if show_stdout:
        stdout = None
    else:
        stdout = subprocess.PIPE
    logger.log(command_level, "Running command %s" % command_desc)
    env = os.environ.copy()
    if extra_environ:
        env.update(extra_environ)
    try:
        proc = subprocess.Popen(
            cmd, stderr=subprocess.STDOUT, stdin=None, stdout=stdout,
            cwd=cwd, env=env)
    except Exception:
        e = sys.exc_info()[1]
        logger.fatal(
            "Error %s while executing command %s" % (e, command_desc))
        raise
    all_output = []
    if stdout is not None:
        stdout = proc.stdout
        while 1:
            line = console_to_str(stdout.readline())
            if not line:
                break
            line = line.rstrip()
            all_output.append(line + '\n')
            if filter_stdout:
                level = filter_stdout(line)
                if isinstance(level, tuple):
                    level, line = level
                logger.log(level, line)
                if not logger.stdout_level_matches(level):
                    logger.show_progress()
            else:
                logger.info(line)
    else:
        returned_stdout, returned_stderr = proc.communicate()
        all_output = [returned_stdout or '']
    proc.wait()
    if proc.returncode:
        if raise_on_returncode:
            if all_output:
                logger.notify('Complete output from command %s:' % command_desc)
                logger.notify('\n'.join(all_output) + '\n----------------------------------------')
            raise InstallationError(
                "Command %s failed with error code %s in %s"
                % (command_desc, proc.returncode, cwd))
        else:
            logger.warn(
                "Command %s had error code %s in %s"
                % (command_desc, proc.returncode, cwd))
    if stdout is not None:
        return ''.join(all_output)


def is_prerelease(vers):
    """
    Attempt to determine if this is a pre-release using PEP386/PEP426 rules.

    Will return True if it is a pre-release and False if not. Versions are
    assumed to be a pre-release if they cannot be parsed.
    """
    normalized = version._suggest_normalized_version(vers)

    if normalized is None:
        # Cannot normalize, assume it is a pre-release
        return True

    parsed = version._normalized_key(normalized)
    return any([any([y in set(["a", "b", "c", "rc", "dev"]) for y in x]) for x in parsed])


class BuildDirectory(object):

    def __init__(self, name=None, delete=None):
        # If we were not given an explicit directory, and we were not given an
        # explicit delete option, then we'll default to deleting.
        if name is None and delete is None:
            delete = True

        if name is None:
            name = tempfile.mkdtemp(prefix="pip-build-")
            # If we were not given an explicit directory, and we were not given
            # an explicit delete option, then we'll default to deleting.
            if delete is None:
                delete = True

        self.name = name
        self.delete = delete

    def __repr__(self):
        return "<{} {!r}>".format(self.__class__.__name__, self.name)

    def __enter__(self):
        return self.name

    def __exit__(self, exc, value, tb):
        self.cleanup()

    def cleanup(self):
        if self.delete:
            rmtree(self.name)
site-packages/pip/vcs/bazaar.py000064400000011517151733464010012472 0ustar00import os
import tempfile
import re
from pip.backwardcompat import urlparse
from pip.log import logger
from pip.util import rmtree, display_path, call_subprocess
from pip.vcs import vcs, VersionControl
from pip.download import path_to_url


class Bazaar(VersionControl):
    name = 'bzr'
    dirname = '.bzr'
    repo_name = 'branch'
    bundle_file = 'bzr-branch.txt'
    schemes = ('bzr', 'bzr+http', 'bzr+https', 'bzr+ssh', 'bzr+sftp', 'bzr+ftp', 'bzr+lp')
    guide = ('# This was a Bazaar branch; to make it a branch again run:\n'
             'bzr branch -r %(rev)s %(url)s .\n')

    def __init__(self, url=None, *args, **kwargs):
        super(Bazaar, self).__init__(url, *args, **kwargs)
        # Python >= 2.7.4, 3.3 doesn't have uses_fragment or non_hierarchical
        # Register lp but do not expose as a scheme to support bzr+lp.
        if getattr(urlparse, 'uses_fragment', None):
            urlparse.uses_fragment.extend(['lp'])
            urlparse.non_hierarchical.extend(['lp'])

    def parse_vcs_bundle_file(self, content):
        url = rev = None
        for line in content.splitlines():
            if not line.strip() or line.strip().startswith('#'):
                continue
            match = re.search(r'^bzr\s*branch\s*-r\s*(\d*)', line)
            if match:
                rev = match.group(1).strip()
            url = line[match.end():].strip().split(None, 1)[0]
            if url and rev:
                return url, rev
        return None, None

    def export(self, location):
        """Export the Bazaar repository at the url to the destination location"""
        temp_dir = tempfile.mkdtemp('-export', 'pip-')
        self.unpack(temp_dir)
        if os.path.exists(location):
            # Remove the location to make sure Bazaar can export it correctly
            rmtree(location)
        try:
            call_subprocess([self.cmd, 'export', location], cwd=temp_dir,
                            filter_stdout=self._filter, show_stdout=False)
        finally:
            rmtree(temp_dir)

    def switch(self, dest, url, rev_options):
        call_subprocess([self.cmd, 'switch', url], cwd=dest)

    def update(self, dest, rev_options):
        call_subprocess(
            [self.cmd, 'pull', '-q'] + rev_options, cwd=dest)

    def obtain(self, dest):
        url, rev = self.get_url_rev()
        if rev:
            rev_options = ['-r', rev]
            rev_display = ' (to revision %s)' % rev
        else:
            rev_options = []
            rev_display = ''
        if self.check_destination(dest, url, rev_options, rev_display):
            logger.notify('Checking out %s%s to %s'
                          % (url, rev_display, display_path(dest)))
            call_subprocess(
                [self.cmd, 'branch', '-q'] + rev_options + [url, dest])

    def get_url_rev(self):
        # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it
        url, rev = super(Bazaar, self).get_url_rev()
        if url.startswith('ssh://'):
            url = 'bzr+' + url
        return url, rev

    def get_url(self, location):
        urls = call_subprocess(
            [self.cmd, 'info'], show_stdout=False, cwd=location)
        for line in urls.splitlines():
            line = line.strip()
            for x in ('checkout of branch: ',
                      'parent branch: '):
                if line.startswith(x):
                    repo = line.split(x)[1]
                    if self._is_local_repository(repo):
                        return path_to_url(repo)
                    return repo
        return None

    def get_revision(self, location):
        revision = call_subprocess(
            [self.cmd, 'revno'], show_stdout=False, cwd=location)
        return revision.splitlines()[-1]

    def get_tag_revs(self, location):
        tags = call_subprocess(
            [self.cmd, 'tags'], show_stdout=False, cwd=location)
        tag_revs = []
        for line in tags.splitlines():
            tags_match = re.search(r'([.\w-]+)\s*(.*)$', line)
            if tags_match:
                tag = tags_match.group(1)
                rev = tags_match.group(2)
                tag_revs.append((rev.strip(), tag.strip()))
        return dict(tag_revs)

    def get_src_requirement(self, dist, location, find_tags):
        repo = self.get_url(location)
        if not repo.lower().startswith('bzr:'):
            repo = 'bzr+' + repo
        egg_project_name = dist.egg_name().split('-', 1)[0]
        if not repo:
            return None
        current_rev = self.get_revision(location)
        tag_revs = self.get_tag_revs(location)

        if current_rev in tag_revs:
            # It's a tag
            full_egg_name = '%s-%s' % (egg_project_name, tag_revs[current_rev])
        else:
            full_egg_name = '%s-dev_r%s' % (dist.egg_name(), current_rev)
        return '%s@%s#egg=%s' % (repo, current_rev, full_egg_name)


vcs.register(Bazaar)
site-packages/pip/vcs/__pycache__/subversion.cpython-33.pyc000064400000030211151733464010017702 0ustar00�
7�Re�)c@sddlZddlZddlmZddlmZddlmZmZm	Z	ddl
mZddlm
Z
mZejd�Zejd�Zejd	�Zejd
�Zejd�Zejd�ZGd
d�de�Zdd�Ze
je�dS(iN(uurlparse(uLink(urmtreeudisplay_pathucall_subprocess(ulogger(uvcsuVersionControlu
url="([^"]+)"ucommitted-rev="(\d+)"u	URL: (.+)uRevision: (.+)u\s*revision="(\d+)"u<url>(.*)</url>cs�|EeZdZdZdZdZd&ZdZd	Zd
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Z�fdd�Zdd�Zdd�Zd d!�Zd"d#�Zd'd$d%�Z�S((u
Subversionusvnu.svnucheckoutusvn+sshusvn+httpu	svn+httpsusvn+svnusvn-checkout.txtug# This was an svn checkout; to make it a checkout again run:
svn checkout --force -r %(rev)s %(url)s .
cCs|jd�j|j�s,td|��t|jd|gdddidd6�}tj|�}|s�t	j
dt|��t	jd	|�dS|jd
�j�}tj|�}|s�t	j
dt|��t	jd	|�|d
fS||jd
�fS(u/Returns (url, revision), where both are stringsu/uBad directory: %suinfoushow_stdoutu
extra_environuCuLANGu'Cannot determine URL of svn checkout %su!Output that cannot be parsed: 
%siu,Cannot determine revision of svn checkout %sFN(NN(urstripuendswithudirnameuAssertionErrorucall_subprocessucmduFalseu_svn_url_reusearchuloggeruwarnudisplay_pathuinfouNoneugroupustripu_svn_revision_re(uselfulocationuoutputumatchuurl((u+/tmp/pip-zej_zi-build/pip/vcs/subversion.pyuget_infos,(
uSubversion.get_infocCs�x�|j�D]�}|j�s
|j�jd�r;q
ntjd|�}|sWdS|jd�}||j�d�j�jdd�d}||fSWdS(Nu#u
^-r\s*([^ ])?ii(NN(NN(	u
splitlinesustripu
startswithureusearchuNoneugroupuendusplit(uselfucontentulineumatchurevurest((u+/tmp/pip-zej_zi-build/pip/vcs/subversion.pyuparse_vcs_bundle_file,s",u Subversion.parse_vcs_bundle_filecCs�|j�\}}t||�}tjd||f�tjd7_zStjj|�rit|�nt	|j
dg|||gd|jdd�Wdtjd8_XdS(u@Export the svn repository at the url to the destination locationu!Exporting svn repository %s to %siuexportu
filter_stdoutushow_stdoutNF(
uget_url_revuget_rev_optionsuloggerunotifyuindentuosupathuexistsurmtreeucall_subprocessucmdu_filteruFalse(uselfulocationuurlurevurev_options((u+/tmp/pip-zej_zi-build/pip/vcs/subversion.pyuexport8s
uSubversion.exportcCs%t|jdg|||g�dS(Nuswitch(ucall_subprocessucmd(uselfudestuurlurev_options((u+/tmp/pip-zej_zi-build/pip/vcs/subversion.pyuswitchIsuSubversion.switchcCs"t|jdg||g�dS(Nuupdate(ucall_subprocessucmd(uselfudesturev_options((u+/tmp/pip-zej_zi-build/pip/vcs/subversion.pyuupdateMsuSubversion.updatecCs�|j�\}}t||�}|r4d|}nd}|j||||�r�tjd||t|�f�t|jddg|||g�ndS(Nu (to revision %s)uuChecking out %s%s to %sucheckoutu-q(uget_url_revuget_rev_optionsucheck_destinationuloggerunotifyudisplay_pathucall_subprocessucmd(uselfudestuurlurevurev_optionsurev_display((u+/tmp/pip-zej_zi-build/pip/vcs/subversion.pyuobtainQs
	uSubversion.obtaincCs�x�|D]�}t|�j}|s(qnd|kr_dj|jd�dd��j�}n|}||jkr|jdd�dSqWdS(Nu-iu#ii����(uLinkuegg_fragmentujoinusplitulowerukeyuNone(uselfudistudependency_linksuurluegg_fragmentukey((u+/tmp/pip-zej_zi-build/pip/vcs/subversion.pyuget_location^s
+uSubversion.get_locationc
Cs�d}x�tj|�D]�\}}}|j|krJg|dd�<qn|j|j�tjj||jd�}tjj|�s�qn|j|�\}}||kr�|d}	n-|s�|j|	�r�g|dd�<qnt	||�}qW|S(uR
        Return the maximum revision for all files under a given location
        iNuentriesu/(
uosuwalkudirnameuremoveupathujoinuexistsu_get_svn_url_revu
startswithumax(
uselfulocationurevisionubaseudirsufilesu
entries_fnudirurlulocalrevubase_url((u+/tmp/pip-zej_zi-build/pip/vcs/subversion.pyuget_revisionls"
uSubversion.get_revisioncsAtt|�j�\}}|jd�r7d|}n||fS(Nussh://usvn+(usuperu
Subversionuget_url_revu
startswith(uselfuurlurev(u	__class__(u+/tmp/pip-zej_zi-build/pip/vcs/subversion.pyuget_url_rev�s
uSubversion.get_url_revcCsx|}x^tjjtjj|d��sf|}tjj|�}||kr	tjd|�dSq	W|j|�dS(Nusetup.pyuGCould not find setup.py for directory %s (tried all parent directories)i(	uosupathuexistsujoinudirnameuloggeruwarnuNoneu_get_svn_url_rev(uselfulocationu
orig_locationu
last_location((u+/tmp/pip-zej_zi-build/pip/vcs/subversion.pyuget_url�s$	uSubversion.get_urlc

Cs�ddlm}ttjj||jd��}|j�}|j�|j	d�st|j	d�st|j	d�r�t
ttj
|jd���}|dd=|dd}d	d
�|D�dg}n�|j	d�r7tj|�}|std|��n|jd
�}dd
�tj|�D�dg}n{yYt|jdd|gdd�}tj|�jd
�}dd
�tj|�D�}Wn|k
r�dg}}YnX|r�t|�}	nd}	||	fS(Ni(uInstallationErroruentriesu8u9u10u

icSs<g|]2}t|�dkr|drt|d��qS(i	(ulenuint(u.0ud((u+/tmp/pip-zej_zi-build/pip/vcs/subversion.pyu
<listcomp>�s	u/Subversion._get_svn_url_rev.<locals>.<listcomp>u<?xmluBadly formatted data: %ricSs%g|]}t|jd���qS(i(uintugroup(u.0um((u+/tmp/pip-zej_zi-build/pip/vcs/subversion.pyu
<listcomp>�s	uinfou--xmlushow_stdoutcSs%g|]}t|jd���qS(i(uintugroup(u.0um((u+/tmp/pip-zej_zi-build/pip/vcs/subversion.pyu
<listcomp>�s	F(upip.exceptionsuInstallationErroruopenuosupathujoinudirnameureaducloseu
startswithulistumapustru
splitlinesusplitu_svn_xml_url_reusearchu
ValueErrorugroupu_svn_rev_reufinditerucall_subprocessucmduFalseu_svn_info_xml_url_reu_svn_info_xml_rev_reuNoneumax(
uselfulocationuInstallationErrorufudatauurlurevsumatchuxmlurev((u+/tmp/pip-zej_zi-build/pip/vcs/subversion.pyu_get_svn_url_rev�s2!
-!&! 
uSubversion._get_svn_url_revcCs�t|jdd|gdd�}g}xV|j�D]H}|j�}t|d�}|djd�}|j||f�q4W|S(	Nulsu-vushow_stdoutiiu/Fi����(ucall_subprocessucmduFalseu
splitlinesusplituintustripuappend(uselfusvn_tag_urlustdouturesultsulineupartsurevutag((u+/tmp/pip-zej_zi-build/pip/vcs/subversion.pyuget_tag_revs�suSubversion.get_tag_revscCsZd}d}xG|D]?\}}||kr|dksC||kr|}|}qqW|S(N(uNone(uselfurevutag_revsubest_match_revubest_tagutagutag_rev((u+/tmp/pip-zej_zi-build/pip/vcs/subversion.pyufind_tag_match�s
uSubversion.find_tag_matchcCs�|j|�}|dkrdS|jd�}|j�jdd�d}|j|�}|ddkr�d||df}n�|ddkr�d|j�|d|f}n�|ddkrZd
|j�|f}|r{dj|dd��d}	|j|	�}
|j||
�}|rWtj	d|�d|	|f}d||f}qWq{n!tj
d|�d
||f}d|||fS(Nu/u-iiiutagsutagu%s-%subranchesubranchu	%s-%s-r%sutrunku
%s-dev_r%su/tagsu2trunk checkout %s seems to be equivalent to tag %su%s/%su?svn URL does not fit normal structure (tags/branches/trunk): %susvn+%s@%s#egg=%si����(utagsutagi����i����(ubranchesubranchi����i����i����(uget_urluNoneusplituegg_nameuget_revisionujoinuget_tag_revsufind_tag_matchuloggerunotifyuwarn(uselfudistulocationu	find_tagsurepoupartsuegg_project_nameurevu
full_egg_nameutag_urlutag_revsumatch((u+/tmp/pip-zej_zi-build/pip/vcs/subversion.pyuget_src_requirement�s. uSubversion.get_src_requirement(usvnusvn+sshusvn+httpu	svn+httpsusvn+svnF(u__name__u
__module__u__qualname__unameudirnameu	repo_nameuschemesubundle_fileuguideuget_infouparse_vcs_bundle_fileuexportuswitchuupdateuobtainuget_locationuget_revisionuget_url_revuget_urlu_get_svn_url_revuget_tag_revsufind_tag_matchuFalseuget_src_requirement(u
__locals__((u	__class__u+/tmp/pip-zej_zi-build/pip/vcs/subversion.pyu
Subversions(
!u
SubversioncCs�|rd|g}ng}tj|�}t|d�rO|j|j}}nl|d}d|kr�|jd�d}d|kr�|jdd�\}}q�|d}}nd	\}}|r�|d|g7}n|r�|d|g7}n|S(
Nu-ruusernameiu@iu:u
--usernameu
--password(NN(uurlparseuurlsplituhasattruusernameupasswordusplituNone(uurlurevurev_optionsuruusernameupasswordunetlocuauth((u+/tmp/pip-zej_zi-build/pip/vcs/subversion.pyuget_rev_options�s$
uget_rev_options(uosureupip.backwardcompatuurlparseu	pip.indexuLinkupip.utilurmtreeudisplay_pathucall_subprocessupip.loguloggerupip.vcsuvcsuVersionControlucompileu_svn_xml_url_reu_svn_rev_reu_svn_url_reu_svn_revision_reu_svn_info_xml_rev_reu_svn_info_xml_url_reu
Subversionuget_rev_optionsuregister(((u+/tmp/pip-zej_zi-build/pip/vcs/subversion.pyu<module>s�site-packages/pip/vcs/__pycache__/__init__.cpython-33.pyc000064400000031612151733464010017250 0ustar00�
7�Re,"c@s�dZddlZddlZddlmZmZddlmZddlm	Z	m
Z
mZmZm
Z
ddgZGdd	�d	e�Ze�ZGd
d�de�Zdd�ZdS(
u)Handles all VCS (version control) supportiN(uurlparseuurllib(ulogger(udisplay_pathu
backup_dirufind_commandurmtreeuask_path_existsuvcsuget_src_requirementcs�|EeZdZiZddddddgZ�fdd�Zd	d
�Zedd��Zed
d��Z	edd��Z
dd�Zdddd�Z
dd�Zdd�Zdd�Z�S(u
VcsSupportusshugituhgubzrusftpusvncsRtjj|j�ttdd�r;tjj|j�ntt|�j	�dS(Nu
uses_fragment(
uurlparseuuses_netlocuextenduschemesugetattruNoneu
uses_fragmentusuperu
VcsSupportu__init__(uself(u	__class__(u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyu__init__suVcsSupport.__init__cCs
|jj�S(N(u	_registryu__iter__(uself((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyu__iter__suVcsSupport.__iter__cCst|jj��S(N(ulistu	_registryuvalues(uself((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyubackendssuVcsSupport.backendscCsdd�|jD�S(NcSsg|]}|j�qS((udirname(u.0ubackend((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyu
<listcomp>$s	u'VcsSupport.dirnames.<locals>.<listcomp>(ubackends(uself((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyudirnames"suVcsSupport.dirnamescCs.g}x!|jD]}|j|j�qW|S(N(ubackendsuextenduschemes(uselfuschemesubackend((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyuall_schemes&suVcsSupport.all_schemescCsPt|d�s'tjd|j�dS|j|jkrL||j|j<ndS(NunameuCannot register VCS %s(uhasattruloggeruwarnu__name__unameu	_registry(uselfucls((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyuregister-s
uVcsSupport.registercCsR||jkr|j|=n2||jj�krA|j|j=n
tjd�dS(Nu0Cannot unregister because no class or name given(u	_registryuvaluesunameuloggeruwarn(uselfuclsuname((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyu
unregister4s

uVcsSupport.unregistercCsOxH|jj�D]7}tjj||j�}tjj|�r|jSqWdS(u�
        Return the name of the version control backend if found at given
        location, e.g. vcs.get_backend_name('/path/to/vcs/checkout')
        N(	u	_registryuvaluesuosupathujoinudirnameuexistsunameuNone(uselfulocationuvc_typeupath((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyuget_backend_name<s
uVcsSupport.get_backend_namecCs*|j�}||jkr&|j|SdS(N(uloweru	_registry(uselfuname((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyuget_backendGsuVcsSupport.get_backendcCs&|j|�}|r"|j|�SdS(N(uget_backend_nameuget_backenduNone(uselfulocationuvc_type((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyuget_backend_from_locationLs
u$VcsSupport.get_backend_from_locationN(u__name__u
__module__u__qualname__u	_registryuschemesu__init__u__iter__upropertyubackendsudirnamesuall_schemesuregisteruNoneu
unregisteruget_backend_nameuget_backenduget_backend_from_location(u
__locals__((u	__class__u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyu
VcsSupportsu
VcsSupportcs�|EeZdZdZdZd �fdd�Zdd�Zdd�Ze	dd	��Z
d
d�Zdd
�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd!dd�Z�S("uVersionControlucs/||_d|_tt|�j||�dS(N(uurluNoneu_cmdusuperuVersionControlu__init__(uselfuurluargsukwargs(u	__class__(u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyu__init__Zs		uVersionControl.__init__cCs
tj|fS(N(uloggeruINFO(uselfuline((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyu_filter_suVersionControl._filtercCs1tjj|�\}}|jtjj�p0|S(u~
           posix absolute paths start with os.path.sep,
           win32 ones ones start with drive (like c:\folder)
        (uosupathu
splitdriveu
startswithusep(uselfurepoudriveutail((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyu_is_local_repositorybsu#VersionControl._is_local_repositorycCsL|jdk	r|jSt|j�}tjd|j|f�||_|S(NuFound command %r at %r(u_cmduNoneufind_commandunameuloggeruinfo(uselfucommand((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyucmdjs	uVersionControl.cmdc	Cs�d}d|jks(t||j��|jjdd�d}tj|�\}}}}}d}d|kr�|jdd�\}}ntj||||df�}||fS(um
        Returns the correct repository URL and revision by parsing the given
        repository URL
        uvSorry, '%s' is a malformed VCS url. The format is <vcs>+<protocol>://<url>, e.g. svn+http://myrepo/svn/MyApp#egg=MyAppu+iu@uN(uurluAssertionErrorusplituurlparseuurlsplituNoneursplitu
urlunsplit(	uselfu
error_messageuurluschemeunetlocupathuqueryufragurev((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyuget_url_revss"uVersionControl.get_url_revcCsH|jd�j|j�s,td|��|j|�|j|�fS(uA
        Returns (url, revision), where both are strings
        u/uBad directory: %s(urstripuendswithudirnameuAssertionErroruget_urluget_revision(uselfulocation((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyuget_info�s,uVersionControl.get_infocCstj|�jd�S(ua
        Normalize a URL for comparison by unquoting it and removing any trailing slash.
        u/(uurllibuunquoteurstrip(uselfuurl((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyu
normalize_url�suVersionControl.normalize_urlcCs|j|�|j|�kS(uV
        Compare two repo URLs for identity, ignoring incidental differences.
        (u
normalize_url(uselfuurl1uurl2((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyucompare_urls�suVersionControl.compare_urlscCs
t�dS(u�
        Takes the contents of the bundled text file that explains how to revert
        the stripped off version control data of the given package and returns
        the URL and revision of it.
        N(uNotImplementedError(uselfucontent((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyuparse_vcs_bundle_file�su$VersionControl.parse_vcs_bundle_filecCs
t�dS(ux
        Called when installing or updating an editable package, takes the
        source path of the checkout.
        N(uNotImplementedError(uselfudest((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyuobtain�suVersionControl.obtaincCs
t�dS(uB
        Switch the repo at ``dest`` to point to ``URL``.
        N(uNotImplemented(uselfudestuurlurev_options((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyuswitch�suVersionControl.switchcCs
t�dS(uO
        Update an already-existing repo to the given ``rev_options``.
        N(uNotImplementedError(uselfudesturev_options((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyuupdate�suVersionControl.updatec
Cs@d}d}tjj|�r#d}tjjtjj||j��r�|j|�}|j||�r�t	j
d|jj�t
|�|f�t	jdt
|�|j|f�|j||�q t	jd|j|jt
|�|f�d}q#t	jd	||j|jf�d}n|r<t	jd|j|f�td|d
|d�}|dkr�t	jd|jt
|�||f�|j|||�q<|dkr�q<|dkr�t	jdt
|��t|�d}q<|dkr<t|�}	t	jdt
|�|	f�tj||	�d}q<n|S(u�
        Prepare a location to receive a checkout/clone.

        Return True if the location is ready for (and requires) a
        checkout/clone, False otherwise.
        u)%s in %s exists, and has correct URL (%s)uUpdating %s %s%su%s %s in %s exists with URL %su%(s)witch, (i)gnore, (w)ipe, (b)ackup usuiuwubu0Directory %s already exists, and is not a %s %s.u(i)gnore, (w)ipe, (b)ackup u+The plan is to install the %s repository %suWhat to do?  %siiuSwitching %s %s to %s%suDeleting %suBacking up %s to %sTF(usuiuwub(u%(s)witch, (i)gnore, (w)ipe, (b)ackup (usuiuwub(uiuwub(u(i)gnore, (w)ipe, (b)ackup (uiuwub(uTrueuFalseuosupathuexistsujoinudirnameuget_urlucompare_urlsuloggeruinfou	repo_nameutitleudisplay_pathunotifyuupdateuwarnunameuask_path_existsuswitchurmtreeu
backup_dirushutilumove(
uselfudestuurlurev_optionsurev_displayucheckoutupromptuexisting_urluresponseudest_dir((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyucheck_destination�sZ$							
	
		u VersionControl.check_destinationcCs0tjj|�rt|�n|j|�dS(N(uosupathuexistsurmtreeuobtain(uselfulocation((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyuunpack�s
uVersionControl.unpackcCs
t�dS(N(uNotImplementedError(uselfudistulocationu	find_tags((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyuget_src_requirement�su"VersionControl.get_src_requirementNF(u__name__u
__module__u__qualname__unameudirnameuNoneu__init__u_filteru_is_local_repositoryupropertyucmduget_url_revuget_infou
normalize_urlucompare_urlsuparse_vcs_bundle_fileuobtainuswitchuupdateucheck_destinationuunpackuFalseuget_src_requirement(u
__locals__((u	__class__u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyuVersionControlVs"	:uVersionControlcCsFtj|�}|r+|�j|||�Stjd|�|j�S(Nutcannot determine version of editable source in %s (is not SVN checkout, Git clone, Mercurial clone or Bazaar branch)(uvcsuget_backend_from_locationuget_src_requirementuloggeruwarnuas_requirement(udistulocationu	find_tagsuversion_control((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyuget_src_requirement�s
(u__doc__uosushutilupip.backwardcompatuurlparseuurllibupip.loguloggerupip.utiludisplay_pathu
backup_dirufind_commandurmtreeuask_path_existsu__all__uobjectu
VcsSupportuvcsuVersionControluget_src_requirement(((u)/tmp/pip-zej_zi-build/pip/vcs/__init__.pyu<module>s(D	�site-packages/pip/vcs/__pycache__/mercurial.cpython-33.pyc000064400000017241151733464020017477 0ustar00�
7�Re�c@s�ddlZddlZddlZddlZddlmZddlmZmZddlm	Z	ddl
mZmZddl
mZddlmZGdd	�d	e�Zeje�dS(
iN(ucall_subprocess(udisplay_pathurmtree(ulogger(uvcsuVersionControl(upath_to_url(uConfigParsercBs�|EeZdZdZdZdZd!ZdZd	Zd
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd S("u	Mercurialuhgu.hgucloneuhg+httpuhg+httpsuhg+sshuhg+static-httpuhg-clone.txtug# This was a Mercurial repo; to make it a repo again run:
hg init
hg pull %(url)s
hg update -r %(rev)s
cCs�d}}x�|j�D]�}|j�s|j�jd�rEqntjd|�}|ru|jd�j�}ntjd|�}|r�|jd�j�}n|r|r||fSqWdS(Nu#uhg\s*pull\s*(.*)\s*iu^hg\s*update\s*-r\s*(.*)\s*(NN(uNoneu
splitlinesustripu
startswithureusearchugroup(uselfucontentuurlurevulineu	url_matchu	rev_match((u*/tmp/pip-zej_zi-build/pip/vcs/mercurial.pyuparse_vcs_bundle_files
"uMercurial.parse_vcs_bundle_filecCs`tjdd�}|j|�z/t|jd|gd|jddd|�Wdt|�XdS(	u?Export the Hg repository at the url to the destination locationu-exportupip-uarchiveu
filter_stdoutushow_stdoutucwdNF(utempfileumkdtempuunpackucall_subprocessucmdu_filteruFalseurmtree(uselfulocationutemp_dir((u*/tmp/pip-zej_zi-build/pip/vcs/mercurial.pyuexport%s
uMercurial.exportcCs�tjj||jd�}tj�}yJ|j|�|jdd|�t|d�}|j	|�|j
�WnBttjfk
r�t
j�d}tjd||f�Yn!Xt|jddg|d	|�dS(
Nuhgrcupathsudefaultuwiu/Could not switch Mercurial repository to %s: %suupdateu-qucwd(uosupathujoinudirnameuConfigParseruSafeConfigParserureadusetuopenuwriteucloseuOSErroruNoSectionErrorusysuexc_infouloggeruwarnucall_subprocessucmd(uselfudestuurlurev_optionsurepo_configuconfiguconfig_fileue((u*/tmp/pip-zej_zi-build/pip/vcs/mercurial.pyuswitch0s

uMercurial.switchcCs@t|jddgd|�t|jddg|d|�dS(Nupullu-qucwduupdate(ucall_subprocessucmd(uselfudesturev_options((u*/tmp/pip-zej_zi-build/pip/vcs/mercurial.pyuupdateAsuMercurial.updatecCs�|j�\}}|r.|g}d|}ng}d}|j||||�r�tjd||t|�f�t|jddd||g�t|jddg|d|�ndS(	Nu (to revision %s)uuCloning hg %s%s to %sucloneu
--noupdateu-quupdateucwd(uget_url_revucheck_destinationuloggerunotifyudisplay_pathucall_subprocessucmd(uselfudestuurlurevurev_optionsurev_display((u*/tmp/pip-zej_zi-build/pip/vcs/mercurial.pyuobtainFs	
	uMercurial.obtaincCsRt|jddgddd|�j�}|j|�rHt|�}n|j�S(Nu
showconfigu
paths.defaultushow_stdoutucwdF(ucall_subprocessucmduFalseustripu_is_local_repositoryupath_to_url(uselfulocationuurl((u*/tmp/pip-zej_zi-build/pip/vcs/mercurial.pyuget_urlTsuMercurial.get_urlcCs�t|jdgddd|�}g}x{|j�D]m}tjd|�}|r4|jd�}|jd�}d|kr�|j|j�|j�f�q�q4q4Wt	|�S(	Nutagsushow_stdoutucwdu([\w\d\.-]+)\s*([\d]+):.*$iiutipF(
ucall_subprocessucmduFalseu
splitlinesureusearchugroupuappendustripudict(uselfulocationutagsutag_revsulineu
tags_matchutagurev((u*/tmp/pip-zej_zi-build/pip/vcs/mercurial.pyuget_tag_revs\s)uMercurial.get_tag_revscCs�t|jdgddd|�}g}x{|j�D]m}tjd|�}|r4|jd�}|jd�}d|kr�|j|j�|j�f�q�q4q4Wt	|�S(	Nubranchesushow_stdoutucwdu([\w\d\.-]+)\s*([\d]+):.*$iiudefaultF(
ucall_subprocessucmduFalseu
splitlinesureusearchugroupuappendustripudict(uselfulocationubranchesubranch_revsulineubranches_matchubranchurev((u*/tmp/pip-zej_zi-build/pip/vcs/mercurial.pyuget_branch_revsis)uMercurial.get_branch_revscCs.t|jddgddd|�j�}|S(Nuparentsu--template={rev}ushow_stdoutucwdF(ucall_subprocessucmduFalseustrip(uselfulocationucurrent_revision((u*/tmp/pip-zej_zi-build/pip/vcs/mercurial.pyuget_revisionvsuMercurial.get_revisioncCs.t|jddgddd|�j�}|S(Nuparentsu--template={node}ushow_stdoutucwdF(ucall_subprocessucmduFalseustrip(uselfulocationucurrent_rev_hash((u*/tmp/pip-zej_zi-build/pip/vcs/mercurial.pyuget_revision_hash|suMercurial.get_revision_hashcCs�|j|�}|j�jd�s1d|}n|j�jdd�d}|sWdS|j|�}|j|�}|j|�}|j	|�}	||kr�d|||f}
n-||	kr�d||	|f}
n
d|}
d|||
fS(	Nuhg:uhg+u-iiu%s-%su%s-devu%s@%s#egg=%s(
uget_urluloweru
startswithuegg_nameusplituNoneuget_revisionuget_revision_hashuget_tag_revsuget_branch_revs(uselfudistulocationu	find_tagsurepouegg_project_nameucurrent_revucurrent_rev_hashutag_revsubranch_revsu
full_egg_name((u*/tmp/pip-zej_zi-build/pip/vcs/mercurial.pyuget_src_requirement�s 

uMercurial.get_src_requirementN(uhguhg+httpuhg+httpsuhg+sshuhg+static-http(u__name__u
__module__u__qualname__unameudirnameu	repo_nameuschemesubundle_fileuguideuparse_vcs_bundle_fileuexportuswitchuupdateuobtainuget_urluget_tag_revsuget_branch_revsuget_revisionuget_revision_hashuget_src_requirement(u
__locals__((u*/tmp/pip-zej_zi-build/pip/vcs/mercurial.pyu	Mercurial
s"

u	Mercurial(uosutempfileureusysupip.utilucall_subprocessudisplay_pathurmtreeupip.loguloggerupip.vcsuvcsuVersionControlupip.downloadupath_to_urlupip.backwardcompatuConfigParseru	Mercurialuregister(((u*/tmp/pip-zej_zi-build/pip/vcs/mercurial.pyu<module>s�site-packages/pip/vcs/__pycache__/bazaar.cpython-33.pyc000064400000015455151733464020016761 0ustar00�
7�ReOc@s�ddlZddlZddlZddlmZddlmZddlmZm	Z	m
Z
ddlmZm
Z
ddlmZGdd�de
�Zeje�dS(	iN(uurlparse(ulogger(urmtreeudisplay_pathucall_subprocess(uvcsuVersionControl(upath_to_urlcs�|EeZdZdZdZdZdZd"ZdZd#�fdd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Z�fdd�Zdd�Zdd�Zdd�Zd d!�Z�S($uBazaarubzru.bzrubranchubzr-branch.txtubzr+httpu	bzr+httpsubzr+sshubzr+sftpubzr+ftpubzr+lpu[# This was a Bazaar branch; to make it a branch again run:
bzr branch -r %(rev)s %(url)s .
cs[tt|�j|||�ttdd�rWtjjdg�tjjdg�ndS(Nu
uses_fragmentulp(	usuperuBazaaru__init__ugetattruurlparseuNoneu
uses_fragmentuextendunon_hierarchical(uselfuurluargsukwargs(u	__class__(u'/tmp/pip-zej_zi-build/pip/vcs/bazaar.pyu__init__suBazaar.__init__cCs�d}}x�|j�D]�}|j�s|j�jd�rEqntjd|�}|ru|jd�j�}n||j�d�j�jdd�d}|r|r||fSqWdS(Nu#u^bzr\s*branch\s*-r\s*(\d*)ii(NN(	uNoneu
splitlinesustripu
startswithureusearchugroupuendusplit(uselfucontentuurlurevulineumatch((u'/tmp/pip-zej_zi-build/pip/vcs/bazaar.pyuparse_vcs_bundle_files
",uBazaar.parse_vcs_bundle_filecCstjdd�}|j|�tjj|�r>t|�nz/t|jd|gd|d|j	dd�Wdt|�XdS(	uCExport the Bazaar repository at the url to the destination locationu-exportupip-uexportucwdu
filter_stdoutushow_stdoutNF(utempfileumkdtempuunpackuosupathuexistsurmtreeucall_subprocessucmdu_filteruFalse(uselfulocationutemp_dir((u'/tmp/pip-zej_zi-build/pip/vcs/bazaar.pyuexport)s

u
Bazaar.exportcCs t|jd|gd|�dS(Nuswitchucwd(ucall_subprocessucmd(uselfudestuurlurev_options((u'/tmp/pip-zej_zi-build/pip/vcs/bazaar.pyuswitch6su
Bazaar.switchcCs$t|jddg|d|�dS(Nupullu-qucwd(ucall_subprocessucmd(uselfudesturev_options((u'/tmp/pip-zej_zi-build/pip/vcs/bazaar.pyuupdate9su
Bazaar.updatecCs�|j�\}}|r1d|g}d|}ng}d}|j||||�r�tjd||t|�f�t|jddg|||g�ndS(Nu-ru (to revision %s)uuChecking out %s%s to %subranchu-q(uget_url_revucheck_destinationuloggerunotifyudisplay_pathucall_subprocessucmd(uselfudestuurlurevurev_optionsurev_display((u'/tmp/pip-zej_zi-build/pip/vcs/bazaar.pyuobtain=s
	u
Bazaar.obtaincsAtt|�j�\}}|jd�r7d|}n||fS(Nussh://ubzr+(usuperuBazaaruget_url_revu
startswith(uselfuurlurev(u	__class__(u'/tmp/pip-zej_zi-build/pip/vcs/bazaar.pyuget_url_revKs
uBazaar.get_url_revcCs�t|jdgddd|�}xp|j�D]b}|j�}xMdD]E}|j|�rG|j|�d}|j|�r�t|�S|SqGWq.WdS(	Nuinfoushow_stdoutucwducheckout of branch: uparent branch: iF(ucheckout of branch: uparent branch: (
ucall_subprocessucmduFalseu
splitlinesustripu
startswithusplitu_is_local_repositoryupath_to_urluNone(uselfulocationuurlsulineuxurepo((u'/tmp/pip-zej_zi-build/pip/vcs/bazaar.pyuget_urlRs

uBazaar.get_urlcCs/t|jdgddd|�}|j�dS(Nurevnoushow_stdoutucwdiFi����(ucall_subprocessucmduFalseu
splitlines(uselfulocationurevision((u'/tmp/pip-zej_zi-build/pip/vcs/bazaar.pyuget_revision`suBazaar.get_revisioncCs�t|jdgddd|�}g}xl|j�D]^}tjd|�}|r4|jd�}|jd�}|j|j�|j�f�q4q4Wt	|�S(Nutagsushow_stdoutucwdu([.\w-]+)\s*(.*)$iiF(
ucall_subprocessucmduFalseu
splitlinesureusearchugroupuappendustripudict(uselfulocationutagsutag_revsulineu
tags_matchutagurev((u'/tmp/pip-zej_zi-build/pip/vcs/bazaar.pyuget_tag_revses&uBazaar.get_tag_revsc	Cs�|j|�}|j�jd�s1d|}n|j�jdd�d}|sWdS|j|�}|j|�}||kr�d|||f}nd|j�|f}d|||fS(	Nubzr:ubzr+u-iiu%s-%su
%s-dev_r%su%s@%s#egg=%s(uget_urluloweru
startswithuegg_nameusplituNoneuget_revisionuget_tag_revs(	uselfudistulocationu	find_tagsurepouegg_project_nameucurrent_revutag_revsu
full_egg_name((u'/tmp/pip-zej_zi-build/pip/vcs/bazaar.pyuget_src_requirementqs
uBazaar.get_src_requirement(ubzrubzr+httpu	bzr+httpsubzr+sshubzr+sftpubzr+ftpubzr+lpN(u__name__u
__module__u__qualname__unameudirnameu	repo_nameubundle_fileuschemesuguideuNoneu__init__uparse_vcs_bundle_fileuexportuswitchuupdateuobtainuget_url_revuget_urluget_revisionuget_tag_revsuget_src_requirement(u
__locals__((u	__class__u'/tmp/pip-zej_zi-build/pip/vcs/bazaar.pyuBazaars"

uBazaar(uosutempfileureupip.backwardcompatuurlparseupip.loguloggerupip.utilurmtreeudisplay_pathucall_subprocessupip.vcsuvcsuVersionControlupip.downloadupath_to_urluBazaaruregister(((u'/tmp/pip-zej_zi-build/pip/vcs/bazaar.pyu<module>sxsite-packages/pip/vcs/__pycache__/git.cpython-33.pyc000064400000022416151733464020016277 0ustar00�
7�Re�c@s�ddlZddlZddlZddlmZddlmZmZddlm	Z	m
Z
ddlmZddl
mZmZejZejZGdd�de
�Ze	je�dS(	iN(ucall_subprocess(udisplay_pathurmtree(uvcsuVersionControl(ulogger(uurl2pathnameuurlparsecs�|EeZdZdZdZdZd%Zd	Zd
Zd&�fdd�Z
d
d�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �Z�fd!d"�Zd#d$�Z�S('uGitugitu.gitucloneugit+httpu	git+httpsugit+sshugit+gitugit+fileu
git-clone.txtus# This was a Git repo; to make it a repo again run:
git init
git remote add origin %(url)s -f
git checkout %(rev)s
cs�|r�t|�\}}}}}|jd�r�|dt|jd���}	|	t|�jdd�jd�}
t|||
||f�}|jd�d}|d|�t||d�||
||f�}q�ntt	|�j
|||�dS(Nufileu/u\u+i(uurlsplituendswithulenulstripuurl2pathnameureplaceu
urlunsplitufindusuperuGitu__init__(uselfuurluargsukwargsuschemeunetlocupathuqueryufragmentuinitial_slashesunewpathu
after_plus(u	__class__(u$/tmp/pip-zej_zi-build/pip/vcs/git.pyu__init__s %9uGit.__init__cCs�d}}x�|j�D]�}|j�s|j�jd�rEqntjd|�}|ru|jd�j�}ntjd|�}|r�|jd�j�}n|r|r||fSqWdS(Nu#u$git\s*remote\s*add\s*origin(.*)\s*-fiu^git\s*checkout\s*-q\s*(.*)\s*(NN(uNoneu
splitlinesustripu
startswithureusearchugroup(uselfucontentuurlurevulineu	url_matchu	rev_match((u$/tmp/pip-zej_zi-build/pip/vcs/git.pyuparse_vcs_bundle_file%s
"uGit.parse_vcs_bundle_filecCs�tjdd�}|j|�zT|jd�s>|d}nt|jdddd|gd|jd	dd
|�Wdt|�XdS(
u@Export the Git repository at the url to the destination locationu-exportupip-u/ucheckout-indexu-au-fu--prefixu
filter_stdoutushow_stdoutucwdNF(	utempfileumkdtempuunpackuendswithucall_subprocessucmdu_filteruFalseurmtree(uselfulocationutemp_dir((u$/tmp/pip-zej_zi-build/pip/vcs/git.pyuexport4s

u
Git.exportcCs`|j|�}d|}||kr0||gS||krG||gStjd|�|SdS(u�Check the revision options before checkout to compensate that tags
        and branches may need origin/ as a prefix.
        Returns the SHA1 of the branch or tag if found.
        u	origin/%su5Could not find a tag or branch '%s', assuming commit.N(uget_refsuloggeruwarn(uselfurevudesturev_optionsu	revisionsu
origin_rev((u$/tmp/pip-zej_zi-build/pip/vcs/git.pyucheck_rev_optionsAs
uGit.check_rev_optionscCsPt|jdd|gd|�t|jddg|d|�|j|�dS(Nuconfiguremote.origin.urlucwducheckoutu-q(ucall_subprocessucmduupdate_submodules(uselfudestuurlurev_options((u$/tmp/pip-zej_zi-build/pip/vcs/git.pyuswitchSs
u
Git.switchcCsrt|jddgd|�|r>|j|d||�}nt|jdddg|d|�|j|�dS(Nufetchu-qucwdiuresetu--hard(ucall_subprocessucmducheck_rev_optionsuupdate_submodules(uselfudesturev_options((u$/tmp/pip-zej_zi-build/pip/vcs/git.pyuupdate[s
#u
Git.updatecCs|j�\}}|r.|g}d|}ndg}d}|j||||�r�tjd||t|�f�t|jdd||g�|j|�|r�|j|||�}|j	|�j
|d�s�t|jddg|d	|�q�q�ndS(
Nu (to %s)u
origin/masteruuCloning %s%s to %sucloneu-qiucheckoutucwd(uget_url_revucheck_destinationuloggerunotifyudisplay_pathucall_subprocessucmduupdate_submodulesucheck_rev_optionsuget_revisionu
startswith(uselfudestuurlurevurev_optionsurev_display((u$/tmp/pip-zej_zi-build/pip/vcs/git.pyuobtaines	
	 
u
Git.obtaincCs.t|jddgddd|�}|j�S(Nuconfiguremote.origin.urlushow_stdoutucwdF(ucall_subprocessucmduFalseustrip(uselfulocationuurl((u$/tmp/pip-zej_zi-build/pip/vcs/git.pyuget_urlxsuGit.get_urlcCs.t|jddgddd|�}|j�S(Nu	rev-parseuHEADushow_stdoutucwdF(ucall_subprocessucmduFalseustrip(uselfulocationucurrent_rev((u$/tmp/pip-zej_zi-build/pip/vcs/git.pyuget_revision~s!uGit.get_revisioncCs	t|jdgdd
d|�}i}x�|j�j�D]�}|jdd�\}}|j�}d}|jd�r�|td�d�}nP|jd�r�|td�d�}n(|jd	�r�|td	�d�}n|dk	r:|j�||<q:q:W|S(u=Return map of named refs (branches or tags) to commit hashes.ushow-refushow_stdoutucwdu iu
refs/remotes/Nurefs/heads/u
refs/tags/F(	ucall_subprocessucmduFalseustripu
splitlinesusplituNoneu
startswithulen(uselfulocationuoutputurvulineucommiturefuref_name((u$/tmp/pip-zej_zi-build/pip/vcs/git.pyuget_refs�s uGit.get_refsc
Cs�|j|�}|j�jd�s1d|}n|j�jdd�d}|sWdS|j|�}|j|�}tdd�|j	�D��}||kr�d|||f}	n
d	|}	d
|||	fS(Nugit:ugit+u-iicss!|]\}}||fVqdS(N((u.0urefucommit((u$/tmp/pip-zej_zi-build/pip/vcs/git.pyu	<genexpr>�su*Git.get_src_requirement.<locals>.<genexpr>u%s-%su%s-devu%s@%s#egg=%s(
uget_urluloweru
startswithuegg_nameusplituNoneuget_revisionuget_refsudictuitems(
uselfudistulocationu	find_tagsurepouegg_project_nameucurrent_revurefsunames_by_commitu
full_egg_name((u$/tmp/pip-zej_zi-build/pip/vcs/git.pyuget_src_requirement�s

uGit.get_src_requirementcs�d|jkrld|jks$t�|jjdd�|_tt|�j�\}}|jdd�}ntt|�j�\}}||fS(u;
        Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'.
        That's required because although they use SSH they sometimes doesn't
        work with a ssh:// scheme (e.g. Github). But we need a scheme for
        parsing. Hence we remove it again afterwards and return it as a stub.
        u://ufile:ugit+u
git+ssh://ussh://u(uurluAssertionErrorureplaceusuperuGituget_url_rev(uselfuurlurev(u	__class__(u$/tmp/pip-zej_zi-build/pip/vcs/git.pyuget_url_rev�suGit.get_url_revcCsNtjjtjj|d��s%dSt|jdddddgd|�dS(Nu.gitmodulesu	submoduleuupdateu--initu--recursiveu-qucwd(uosupathuexistsujoinucall_subprocessucmd(uselfulocation((u$/tmp/pip-zej_zi-build/pip/vcs/git.pyuupdate_submodules�s!uGit.update_submodules(ugitugit+httpu	git+httpsugit+sshugit+gitugit+fileN(u__name__u
__module__u__qualname__unameudirnameu	repo_nameuschemesubundle_fileuguideuNoneu__init__uparse_vcs_bundle_fileuexportucheck_rev_optionsuswitchuupdateuobtainuget_urluget_revisionuget_refsuget_src_requirementuget_url_revuupdate_submodules(u
__locals__((u	__class__u$/tmp/pip-zej_zi-build/pip/vcs/git.pyuGit
s&

uGit(utempfileureuos.pathuosupip.utilucall_subprocessudisplay_pathurmtreeupip.vcsuvcsuVersionControlupip.loguloggerupip.backwardcompatuurl2pathnameuurlparseuurlsplitu
urlunsplituGituregister(((u$/tmp/pip-zej_zi-build/pip/vcs/git.pyu<module>s		�site-packages/pip/vcs/__init__.py000064400000021054151733464020012767 0ustar00"""Handles all VCS (version control) support"""

import os
import shutil

from pip.backwardcompat import urlparse, urllib
from pip.log import logger
from pip.util import (display_path, backup_dir, find_command,
                      rmtree, ask_path_exists)


__all__ = ['vcs', 'get_src_requirement']


class VcsSupport(object):
    _registry = {}
    schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn']

    def __init__(self):
        # Register more schemes with urlparse for various version control systems
        urlparse.uses_netloc.extend(self.schemes)
        # Python >= 2.7.4, 3.3 doesn't have uses_fragment
        if getattr(urlparse, 'uses_fragment', None):
            urlparse.uses_fragment.extend(self.schemes)
        super(VcsSupport, self).__init__()

    def __iter__(self):
        return self._registry.__iter__()

    @property
    def backends(self):
        return list(self._registry.values())

    @property
    def dirnames(self):
        return [backend.dirname for backend in self.backends]

    @property
    def all_schemes(self):
        schemes = []
        for backend in self.backends:
            schemes.extend(backend.schemes)
        return schemes

    def register(self, cls):
        if not hasattr(cls, 'name'):
            logger.warn('Cannot register VCS %s' % cls.__name__)
            return
        if cls.name not in self._registry:
            self._registry[cls.name] = cls

    def unregister(self, cls=None, name=None):
        if name in self._registry:
            del self._registry[name]
        elif cls in self._registry.values():
            del self._registry[cls.name]
        else:
            logger.warn('Cannot unregister because no class or name given')

    def get_backend_name(self, location):
        """
        Return the name of the version control backend if found at given
        location, e.g. vcs.get_backend_name('/path/to/vcs/checkout')
        """
        for vc_type in self._registry.values():
            path = os.path.join(location, vc_type.dirname)
            if os.path.exists(path):
                return vc_type.name
        return None

    def get_backend(self, name):
        name = name.lower()
        if name in self._registry:
            return self._registry[name]

    def get_backend_from_location(self, location):
        vc_type = self.get_backend_name(location)
        if vc_type:
            return self.get_backend(vc_type)
        return None


vcs = VcsSupport()


class VersionControl(object):
    name = ''
    dirname = ''

    def __init__(self, url=None, *args, **kwargs):
        self.url = url
        self._cmd = None
        super(VersionControl, self).__init__(*args, **kwargs)

    def _filter(self, line):
        return (logger.INFO, line)

    def _is_local_repository(self, repo):
        """
           posix absolute paths start with os.path.sep,
           win32 ones ones start with drive (like c:\\folder)
        """
        drive, tail = os.path.splitdrive(repo)
        return repo.startswith(os.path.sep) or drive

    @property
    def cmd(self):
        if self._cmd is not None:
            return self._cmd
        command = find_command(self.name)
        logger.info('Found command %r at %r' % (self.name, command))
        self._cmd = command
        return command

    def get_url_rev(self):
        """
        Returns the correct repository URL and revision by parsing the given
        repository URL
        """
        error_message = (
           "Sorry, '%s' is a malformed VCS url. "
           "The format is <vcs>+<protocol>://<url>, "
           "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp")
        assert '+' in self.url, error_message % self.url
        url = self.url.split('+', 1)[1]
        scheme, netloc, path, query, frag = urlparse.urlsplit(url)
        rev = None
        if '@' in path:
            path, rev = path.rsplit('@', 1)
        url = urlparse.urlunsplit((scheme, netloc, path, query, ''))
        return url, rev

    def get_info(self, location):
        """
        Returns (url, revision), where both are strings
        """
        assert not location.rstrip('/').endswith(self.dirname), 'Bad directory: %s' % location
        return self.get_url(location), self.get_revision(location)

    def normalize_url(self, url):
        """
        Normalize a URL for comparison by unquoting it and removing any trailing slash.
        """
        return urllib.unquote(url).rstrip('/')

    def compare_urls(self, url1, url2):
        """
        Compare two repo URLs for identity, ignoring incidental differences.
        """
        return (self.normalize_url(url1) == self.normalize_url(url2))

    def parse_vcs_bundle_file(self, content):
        """
        Takes the contents of the bundled text file that explains how to revert
        the stripped off version control data of the given package and returns
        the URL and revision of it.
        """
        raise NotImplementedError

    def obtain(self, dest):
        """
        Called when installing or updating an editable package, takes the
        source path of the checkout.
        """
        raise NotImplementedError

    def switch(self, dest, url, rev_options):
        """
        Switch the repo at ``dest`` to point to ``URL``.
        """
        raise NotImplemented

    def update(self, dest, rev_options):
        """
        Update an already-existing repo to the given ``rev_options``.
        """
        raise NotImplementedError

    def check_destination(self, dest, url, rev_options, rev_display):
        """
        Prepare a location to receive a checkout/clone.

        Return True if the location is ready for (and requires) a
        checkout/clone, False otherwise.
        """
        checkout = True
        prompt = False
        if os.path.exists(dest):
            checkout = False
            if os.path.exists(os.path.join(dest, self.dirname)):
                existing_url = self.get_url(dest)
                if self.compare_urls(existing_url, url):
                    logger.info('%s in %s exists, and has correct URL (%s)' %
                                (self.repo_name.title(), display_path(dest),
                                 url))
                    logger.notify('Updating %s %s%s' %
                                  (display_path(dest), self.repo_name,
                                   rev_display))
                    self.update(dest, rev_options)
                else:
                    logger.warn('%s %s in %s exists with URL %s' %
                                (self.name, self.repo_name,
                                 display_path(dest), existing_url))
                    prompt = ('(s)witch, (i)gnore, (w)ipe, (b)ackup ',
                              ('s', 'i', 'w', 'b'))
            else:
                logger.warn('Directory %s already exists, '
                            'and is not a %s %s.' %
                            (dest, self.name, self.repo_name))
                prompt = ('(i)gnore, (w)ipe, (b)ackup ', ('i', 'w', 'b'))
        if prompt:
            logger.warn('The plan is to install the %s repository %s' %
                        (self.name, url))
            response = ask_path_exists('What to do?  %s' % prompt[0],
                                       prompt[1])

            if response == 's':
                logger.notify('Switching %s %s to %s%s' %
                              (self.repo_name, display_path(dest), url,
                               rev_display))
                self.switch(dest, url, rev_options)
            elif response == 'i':
                # do nothing
                pass
            elif response == 'w':
                logger.warn('Deleting %s' % display_path(dest))
                rmtree(dest)
                checkout = True
            elif response == 'b':
                dest_dir = backup_dir(dest)
                logger.warn('Backing up %s to %s'
                            % (display_path(dest), dest_dir))
                shutil.move(dest, dest_dir)
                checkout = True
        return checkout

    def unpack(self, location):
        if os.path.exists(location):
            rmtree(location)
        self.obtain(location)

    def get_src_requirement(self, dist, location, find_tags=False):
        raise NotImplementedError


def get_src_requirement(dist, location, find_tags):
    version_control = vcs.get_backend_from_location(location)
    if version_control:
        return version_control().get_src_requirement(dist, location, find_tags)
    logger.warn('cannot determine version of editable source in %s (is not SVN checkout, Git clone, Mercurial clone or Bazaar branch)' % location)
    return dist.as_requirement()
site-packages/pip/vcs/mercurial.py000064400000013274151733464020013220 0ustar00import os
import tempfile
import re
import sys
from pip.util import call_subprocess
from pip.util import display_path, rmtree
from pip.log import logger
from pip.vcs import vcs, VersionControl
from pip.download import path_to_url
from pip.backwardcompat import ConfigParser


class Mercurial(VersionControl):
    name = 'hg'
    dirname = '.hg'
    repo_name = 'clone'
    schemes = ('hg', 'hg+http', 'hg+https', 'hg+ssh', 'hg+static-http')
    bundle_file = 'hg-clone.txt'
    guide = ('# This was a Mercurial repo; to make it a repo again run:\n'
            'hg init\nhg pull %(url)s\nhg update -r %(rev)s\n')

    def parse_vcs_bundle_file(self, content):
        url = rev = None
        for line in content.splitlines():
            if not line.strip() or line.strip().startswith('#'):
                continue
            url_match = re.search(r'hg\s*pull\s*(.*)\s*', line)
            if url_match:
                url = url_match.group(1).strip()
            rev_match = re.search(r'^hg\s*update\s*-r\s*(.*)\s*', line)
            if rev_match:
                rev = rev_match.group(1).strip()
            if url and rev:
                return url, rev
        return None, None

    def export(self, location):
        """Export the Hg repository at the url to the destination location"""
        temp_dir = tempfile.mkdtemp('-export', 'pip-')
        self.unpack(temp_dir)
        try:
            call_subprocess(
                [self.cmd, 'archive', location],
                filter_stdout=self._filter, show_stdout=False, cwd=temp_dir)
        finally:
            rmtree(temp_dir)

    def switch(self, dest, url, rev_options):
        repo_config = os.path.join(dest, self.dirname, 'hgrc')
        config = ConfigParser.SafeConfigParser()
        try:
            config.read(repo_config)
            config.set('paths', 'default', url)
            config_file = open(repo_config, 'w')
            config.write(config_file)
            config_file.close()
        except (OSError, ConfigParser.NoSectionError):
            e = sys.exc_info()[1]
            logger.warn(
                'Could not switch Mercurial repository to %s: %s'
                % (url, e))
        else:
            call_subprocess([self.cmd, 'update', '-q'] + rev_options, cwd=dest)

    def update(self, dest, rev_options):
        call_subprocess([self.cmd, 'pull', '-q'], cwd=dest)
        call_subprocess(
            [self.cmd, 'update', '-q'] + rev_options, cwd=dest)

    def obtain(self, dest):
        url, rev = self.get_url_rev()
        if rev:
            rev_options = [rev]
            rev_display = ' (to revision %s)' % rev
        else:
            rev_options = []
            rev_display = ''
        if self.check_destination(dest, url, rev_options, rev_display):
            logger.notify('Cloning hg %s%s to %s'
                          % (url, rev_display, display_path(dest)))
            call_subprocess([self.cmd, 'clone', '--noupdate', '-q', url, dest])
            call_subprocess([self.cmd, 'update', '-q'] + rev_options, cwd=dest)

    def get_url(self, location):
        url = call_subprocess(
            [self.cmd, 'showconfig', 'paths.default'],
            show_stdout=False, cwd=location).strip()
        if self._is_local_repository(url):
            url = path_to_url(url)
        return url.strip()

    def get_tag_revs(self, location):
        tags = call_subprocess(
            [self.cmd, 'tags'], show_stdout=False, cwd=location)
        tag_revs = []
        for line in tags.splitlines():
            tags_match = re.search(r'([\w\d\.-]+)\s*([\d]+):.*$', line)
            if tags_match:
                tag = tags_match.group(1)
                rev = tags_match.group(2)
                if "tip" != tag:
                    tag_revs.append((rev.strip(), tag.strip()))
        return dict(tag_revs)

    def get_branch_revs(self, location):
        branches = call_subprocess(
            [self.cmd, 'branches'], show_stdout=False, cwd=location)
        branch_revs = []
        for line in branches.splitlines():
            branches_match = re.search(r'([\w\d\.-]+)\s*([\d]+):.*$', line)
            if branches_match:
                branch = branches_match.group(1)
                rev = branches_match.group(2)
                if "default" != branch:
                    branch_revs.append((rev.strip(), branch.strip()))
        return dict(branch_revs)

    def get_revision(self, location):
        current_revision = call_subprocess(
            [self.cmd, 'parents', '--template={rev}'],
            show_stdout=False, cwd=location).strip()
        return current_revision

    def get_revision_hash(self, location):
        current_rev_hash = call_subprocess(
            [self.cmd, 'parents', '--template={node}'],
            show_stdout=False, cwd=location).strip()
        return current_rev_hash

    def get_src_requirement(self, dist, location, find_tags):
        repo = self.get_url(location)
        if not repo.lower().startswith('hg:'):
            repo = 'hg+' + repo
        egg_project_name = dist.egg_name().split('-', 1)[0]
        if not repo:
            return None
        current_rev = self.get_revision(location)
        current_rev_hash = self.get_revision_hash(location)
        tag_revs = self.get_tag_revs(location)
        branch_revs = self.get_branch_revs(location)
        if current_rev in tag_revs:
            # It's a tag
            full_egg_name = '%s-%s' % (egg_project_name, tag_revs[current_rev])
        elif current_rev in branch_revs:
            # It's the tip of a branch
            full_egg_name = '%s-%s' % (egg_project_name, branch_revs[current_rev])
        else:
            full_egg_name = '%s-dev' % egg_project_name
        return '%s@%s#egg=%s' % (repo, current_rev_hash, full_egg_name)

vcs.register(Mercurial)
site-packages/pip/vcs/git.py000064400000017332151733464020012017 0ustar00import tempfile
import re
import os.path
from pip.util import call_subprocess
from pip.util import display_path, rmtree
from pip.vcs import vcs, VersionControl
from pip.log import logger
from pip.backwardcompat import url2pathname, urlparse
urlsplit = urlparse.urlsplit
urlunsplit = urlparse.urlunsplit


class Git(VersionControl):
    name = 'git'
    dirname = '.git'
    repo_name = 'clone'
    schemes = ('git', 'git+http', 'git+https', 'git+ssh', 'git+git', 'git+file')
    bundle_file = 'git-clone.txt'
    guide = ('# This was a Git repo; to make it a repo again run:\n'
        'git init\ngit remote add origin %(url)s -f\ngit checkout %(rev)s\n')

    def __init__(self, url=None, *args, **kwargs):

        # Works around an apparent Git bug
        # (see http://article.gmane.org/gmane.comp.version-control.git/146500)
        if url:
            scheme, netloc, path, query, fragment = urlsplit(url)
            if scheme.endswith('file'):
                initial_slashes = path[:-len(path.lstrip('/'))]
                newpath = initial_slashes + url2pathname(path).replace('\\', '/').lstrip('/')
                url = urlunsplit((scheme, netloc, newpath, query, fragment))
                after_plus = scheme.find('+') + 1
                url = scheme[:after_plus] + urlunsplit((scheme[after_plus:], netloc, newpath, query, fragment))

        super(Git, self).__init__(url, *args, **kwargs)

    def parse_vcs_bundle_file(self, content):
        url = rev = None
        for line in content.splitlines():
            if not line.strip() or line.strip().startswith('#'):
                continue
            url_match = re.search(r'git\s*remote\s*add\s*origin(.*)\s*-f', line)
            if url_match:
                url = url_match.group(1).strip()
            rev_match = re.search(r'^git\s*checkout\s*-q\s*(.*)\s*', line)
            if rev_match:
                rev = rev_match.group(1).strip()
            if url and rev:
                return url, rev
        return None, None

    def export(self, location):
        """Export the Git repository at the url to the destination location"""
        temp_dir = tempfile.mkdtemp('-export', 'pip-')
        self.unpack(temp_dir)
        try:
            if not location.endswith('/'):
                location = location + '/'
            call_subprocess(
                [self.cmd, 'checkout-index', '-a', '-f', '--prefix', location],
                filter_stdout=self._filter, show_stdout=False, cwd=temp_dir)
        finally:
            rmtree(temp_dir)

    def check_rev_options(self, rev, dest, rev_options):
        """Check the revision options before checkout to compensate that tags
        and branches may need origin/ as a prefix.
        Returns the SHA1 of the branch or tag if found.
        """
        revisions = self.get_refs(dest)

        origin_rev = 'origin/%s' % rev
        if origin_rev in revisions:
            # remote branch
            return [revisions[origin_rev]]
        elif rev in revisions:
            # a local tag or branch name
            return [revisions[rev]]
        else:
            logger.warn("Could not find a tag or branch '%s', assuming commit." % rev)
            return rev_options

    def switch(self, dest, url, rev_options):
        call_subprocess(
            [self.cmd, 'config', 'remote.origin.url', url], cwd=dest)
        call_subprocess(
            [self.cmd, 'checkout', '-q'] + rev_options, cwd=dest)

        self.update_submodules(dest)

    def update(self, dest, rev_options):
        # First fetch changes from the default remote
        call_subprocess([self.cmd, 'fetch', '-q'], cwd=dest)
        # Then reset to wanted revision (maby even origin/master)
        if rev_options:
            rev_options = self.check_rev_options(rev_options[0], dest, rev_options)
        call_subprocess([self.cmd, 'reset', '--hard', '-q'] + rev_options, cwd=dest)
        #: update submodules
        self.update_submodules(dest)

    def obtain(self, dest):
        url, rev = self.get_url_rev()
        if rev:
            rev_options = [rev]
            rev_display = ' (to %s)' % rev
        else:
            rev_options = ['origin/master']
            rev_display = ''
        if self.check_destination(dest, url, rev_options, rev_display):
            logger.notify('Cloning %s%s to %s' % (url, rev_display, display_path(dest)))
            call_subprocess([self.cmd, 'clone', '-q', url, dest])
            #: repo may contain submodules
            self.update_submodules(dest)
            if rev:
                rev_options = self.check_rev_options(rev, dest, rev_options)
                # Only do a checkout if rev_options differs from HEAD
                if not self.get_revision(dest).startswith(rev_options[0]):
                    call_subprocess([self.cmd, 'checkout', '-q'] + rev_options, cwd=dest)

    def get_url(self, location):
        url = call_subprocess(
            [self.cmd, 'config', 'remote.origin.url'],
            show_stdout=False, cwd=location)
        return url.strip()

    def get_revision(self, location):
        current_rev = call_subprocess(
            [self.cmd, 'rev-parse', 'HEAD'], show_stdout=False, cwd=location)
        return current_rev.strip()

    def get_refs(self, location):
        """Return map of named refs (branches or tags) to commit hashes."""
        output = call_subprocess([self.cmd, 'show-ref'],
                                 show_stdout=False, cwd=location)
        rv = {}
        for line in output.strip().splitlines():
            commit, ref = line.split(' ', 1)
            ref = ref.strip()
            ref_name = None
            if ref.startswith('refs/remotes/'):
                ref_name = ref[len('refs/remotes/'):]
            elif ref.startswith('refs/heads/'):
                ref_name = ref[len('refs/heads/'):]
            elif ref.startswith('refs/tags/'):
                ref_name = ref[len('refs/tags/'):]
            if ref_name is not None:
                rv[ref_name] = commit.strip()
        return rv

    def get_src_requirement(self, dist, location, find_tags):
        repo = self.get_url(location)
        if not repo.lower().startswith('git:'):
            repo = 'git+' + repo
        egg_project_name = dist.egg_name().split('-', 1)[0]
        if not repo:
            return None
        current_rev = self.get_revision(location)
        refs = self.get_refs(location)
        # refs maps names to commit hashes; we need the inverse
        # if multiple names map to a single commit, this arbitrarily picks one
        names_by_commit = dict((commit, ref) for ref, commit in refs.items())

        if current_rev in names_by_commit:
            # It's a tag
            full_egg_name = '%s-%s' % (egg_project_name, names_by_commit[current_rev])
        else:
            full_egg_name = '%s-dev' % egg_project_name

        return '%s@%s#egg=%s' % (repo, current_rev, full_egg_name)

    def get_url_rev(self):
        """
        Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'.
        That's required because although they use SSH they sometimes doesn't
        work with a ssh:// scheme (e.g. Github). But we need a scheme for
        parsing. Hence we remove it again afterwards and return it as a stub.
        """
        if not '://' in self.url:
            assert not 'file:' in self.url
            self.url = self.url.replace('git+', 'git+ssh://')
            url, rev = super(Git, self).get_url_rev()
            url = url.replace('ssh://', '')
        else:
            url, rev = super(Git, self).get_url_rev()

        return url, rev

    def update_submodules(self, location):
        if not os.path.exists(os.path.join(location, '.gitmodules')):
            return
        call_subprocess([self.cmd, 'submodule', 'update', '--init', '--recursive', '-q'],
                        cwd=location)

vcs.register(Git)
site-packages/pip/vcs/subversion.py000064400000024620151733464020013431 0ustar00import os
import re
from pip.backwardcompat import urlparse
from pip.index import Link
from pip.util import rmtree, display_path, call_subprocess
from pip.log import logger
from pip.vcs import vcs, VersionControl

_svn_xml_url_re = re.compile('url="([^"]+)"')
_svn_rev_re = re.compile('committed-rev="(\d+)"')
_svn_url_re = re.compile(r'URL: (.+)')
_svn_revision_re = re.compile(r'Revision: (.+)')
_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"')
_svn_info_xml_url_re = re.compile(r'<url>(.*)</url>')


class Subversion(VersionControl):
    name = 'svn'
    dirname = '.svn'
    repo_name = 'checkout'
    schemes = ('svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn')
    bundle_file = 'svn-checkout.txt'
    guide = ('# This was an svn checkout; to make it a checkout again run:\n'
            'svn checkout --force -r %(rev)s %(url)s .\n')

    def get_info(self, location):
        """Returns (url, revision), where both are strings"""
        assert not location.rstrip('/').endswith(self.dirname), 'Bad directory: %s' % location
        output = call_subprocess(
            [self.cmd, 'info', location], show_stdout=False, extra_environ={'LANG': 'C'})
        match = _svn_url_re.search(output)
        if not match:
            logger.warn('Cannot determine URL of svn checkout %s' % display_path(location))
            logger.info('Output that cannot be parsed: \n%s' % output)
            return None, None
        url = match.group(1).strip()
        match = _svn_revision_re.search(output)
        if not match:
            logger.warn('Cannot determine revision of svn checkout %s' % display_path(location))
            logger.info('Output that cannot be parsed: \n%s' % output)
            return url, None
        return url, match.group(1)

    def parse_vcs_bundle_file(self, content):
        for line in content.splitlines():
            if not line.strip() or line.strip().startswith('#'):
                continue
            match = re.search(r'^-r\s*([^ ])?', line)
            if not match:
                return None, None
            rev = match.group(1)
            rest = line[match.end():].strip().split(None, 1)[0]
            return rest, rev
        return None, None

    def export(self, location):
        """Export the svn repository at the url to the destination location"""
        url, rev = self.get_url_rev()
        rev_options = get_rev_options(url, rev)
        logger.notify('Exporting svn repository %s to %s' % (url, location))
        logger.indent += 2
        try:
            if os.path.exists(location):
                # Subversion doesn't like to check out over an existing directory
                # --force fixes this, but was only added in svn 1.5
                rmtree(location)
            call_subprocess(
                [self.cmd, 'export'] + rev_options + [url, location],
                filter_stdout=self._filter, show_stdout=False)
        finally:
            logger.indent -= 2

    def switch(self, dest, url, rev_options):
        call_subprocess(
            [self.cmd, 'switch'] + rev_options + [url, dest])

    def update(self, dest, rev_options):
        call_subprocess(
            [self.cmd, 'update'] + rev_options + [dest])

    def obtain(self, dest):
        url, rev = self.get_url_rev()
        rev_options = get_rev_options(url, rev)
        if rev:
            rev_display = ' (to revision %s)' % rev
        else:
            rev_display = ''
        if self.check_destination(dest, url, rev_options, rev_display):
            logger.notify('Checking out %s%s to %s'
                          % (url, rev_display, display_path(dest)))
            call_subprocess(
                [self.cmd, 'checkout', '-q'] + rev_options + [url, dest])

    def get_location(self, dist, dependency_links):
        for url in dependency_links:
            egg_fragment = Link(url).egg_fragment
            if not egg_fragment:
                continue
            if '-' in egg_fragment:
                ## FIXME: will this work when a package has - in the name?
                key = '-'.join(egg_fragment.split('-')[:-1]).lower()
            else:
                key = egg_fragment
            if key == dist.key:
                return url.split('#', 1)[0]
        return None

    def get_revision(self, location):
        """
        Return the maximum revision for all files under a given location
        """
        # Note: taken from setuptools.command.egg_info
        revision = 0

        for base, dirs, files in os.walk(location):
            if self.dirname not in dirs:
                dirs[:] = []
                continue    # no sense walking uncontrolled subdirs
            dirs.remove(self.dirname)
            entries_fn = os.path.join(base, self.dirname, 'entries')
            if not os.path.exists(entries_fn):
                ## FIXME: should we warn?
                continue

            dirurl, localrev = self._get_svn_url_rev(base)

            if base == location:
                base_url = dirurl + '/'   # save the root url
            elif not dirurl or not dirurl.startswith(base_url):
                dirs[:] = []
                continue    # not part of the same svn tree, skip it
            revision = max(revision, localrev)
        return revision

    def get_url_rev(self):
        # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it
        url, rev = super(Subversion, self).get_url_rev()
        if url.startswith('ssh://'):
            url = 'svn+' + url
        return url, rev

    def get_url(self, location):
        # In cases where the source is in a subdirectory, not alongside setup.py
        # we have to look up in the location until we find a real setup.py
        orig_location = location
        while not os.path.exists(os.path.join(location, 'setup.py')):
            last_location = location
            location = os.path.dirname(location)
            if location == last_location:
                # We've traversed up to the root of the filesystem without finding setup.py
                logger.warn("Could not find setup.py for directory %s (tried all parent directories)"
                            % orig_location)
                return None

        return self._get_svn_url_rev(location)[0]

    def _get_svn_url_rev(self, location):
        from pip.exceptions import InstallationError

        f = open(os.path.join(location, self.dirname, 'entries'))
        data = f.read()
        f.close()
        if data.startswith('8') or data.startswith('9') or data.startswith('10'):
            data = list(map(str.splitlines, data.split('\n\x0c\n')))
            del data[0][0]  # get rid of the '8'
            url = data[0][3]
            revs = [int(d[9]) for d in data if len(d) > 9 and d[9]] + [0]
        elif data.startswith('<?xml'):
            match = _svn_xml_url_re.search(data)
            if not match:
                raise ValueError('Badly formatted data: %r' % data)
            url = match.group(1)    # get repository URL
            revs = [int(m.group(1)) for m in _svn_rev_re.finditer(data)] + [0]
        else:
            try:
                # subversion >= 1.7
                xml = call_subprocess([self.cmd, 'info', '--xml', location], show_stdout=False)
                url = _svn_info_xml_url_re.search(xml).group(1)
                revs = [int(m.group(1)) for m in _svn_info_xml_rev_re.finditer(xml)]
            except InstallationError:
                url, revs = None, []

        if revs:
            rev = max(revs)
        else:
            rev = 0

        return url, rev

    def get_tag_revs(self, svn_tag_url):
        stdout = call_subprocess(
            [self.cmd, 'ls', '-v', svn_tag_url], show_stdout=False)
        results = []
        for line in stdout.splitlines():
            parts = line.split()
            rev = int(parts[0])
            tag = parts[-1].strip('/')
            results.append((tag, rev))
        return results

    def find_tag_match(self, rev, tag_revs):
        best_match_rev = None
        best_tag = None
        for tag, tag_rev in tag_revs:
            if (tag_rev > rev and
                (best_match_rev is None or best_match_rev > tag_rev)):
                # FIXME: Is best_match > tag_rev really possible?
                # or is it a sign something is wacky?
                best_match_rev = tag_rev
                best_tag = tag
        return best_tag

    def get_src_requirement(self, dist, location, find_tags=False):
        repo = self.get_url(location)
        if repo is None:
            return None
        parts = repo.split('/')
        ## FIXME: why not project name?
        egg_project_name = dist.egg_name().split('-', 1)[0]
        rev = self.get_revision(location)
        if parts[-2] in ('tags', 'tag'):
            # It's a tag, perfect!
            full_egg_name = '%s-%s' % (egg_project_name, parts[-1])
        elif parts[-2] in ('branches', 'branch'):
            # It's a branch :(
            full_egg_name = '%s-%s-r%s' % (dist.egg_name(), parts[-1], rev)
        elif parts[-1] == 'trunk':
            # Trunk :-/
            full_egg_name = '%s-dev_r%s' % (dist.egg_name(), rev)
            if find_tags:
                tag_url = '/'.join(parts[:-1]) + '/tags'
                tag_revs = self.get_tag_revs(tag_url)
                match = self.find_tag_match(rev, tag_revs)
                if match:
                    logger.notify('trunk checkout %s seems to be equivalent to tag %s' % match)
                    repo = '%s/%s' % (tag_url, match)
                    full_egg_name = '%s-%s' % (egg_project_name, match)
        else:
            # Don't know what it is
            logger.warn('svn URL does not fit normal structure (tags/branches/trunk): %s' % repo)
            full_egg_name = '%s-dev_r%s' % (egg_project_name, rev)
        return 'svn+%s@%s#egg=%s' % (repo, rev, full_egg_name)


def get_rev_options(url, rev):
    if rev:
        rev_options = ['-r', rev]
    else:
        rev_options = []

    r = urlparse.urlsplit(url)
    if hasattr(r, 'username'):
        # >= Python-2.5
        username, password = r.username, r.password
    else:
        netloc = r[1]
        if '@' in netloc:
            auth = netloc.split('@')[0]
            if ':' in auth:
                username, password = auth.split(':', 1)
            else:
                username, password = auth, None
        else:
            username, password = None, None

    if username:
        rev_options += ['--username', username]
    if password:
        rev_options += ['--password', password]
    return rev_options


vcs.register(Subversion)
site-packages/pip/pep425tags.py000064400000005631151733464020012336 0ustar00"""Generate and work with PEP 425 Compatibility Tags."""

import sys
import warnings

try:
    import sysconfig
except ImportError:  # pragma nocover
    # Python < 2.7
    import distutils.sysconfig as sysconfig
import distutils.util


def get_abbr_impl():
    """Return abbreviated implementation name."""
    if hasattr(sys, 'pypy_version_info'):
        pyimpl = 'pp'
    elif sys.platform.startswith('java'):
        pyimpl = 'jy'
    elif sys.platform == 'cli':
        pyimpl = 'ip'
    else:
        pyimpl = 'cp'
    return pyimpl


def get_impl_ver():
    """Return implementation version."""
    return ''.join(map(str, sys.version_info[:2]))


def get_platform():
    """Return our platform name 'win32', 'linux_x86_64'"""
    # XXX remove distutils dependency
    return distutils.util.get_platform().replace('.', '_').replace('-', '_')


def get_supported(versions=None, noarch=False):
    """Return a list of supported tags for each version specified in
    `versions`.

    :param versions: a list of string versions, of the form ["33", "32"],
        or None. The first version will be assumed to support our ABI.
    """
    supported = []

    # Versions must be given with respect to the preference
    if versions is None:
        versions = []
        major = sys.version_info[0]
        # Support all previous minor Python versions.
        for minor in range(sys.version_info[1], -1, -1):
            versions.append(''.join(map(str, (major, minor))))

    impl = get_abbr_impl()

    abis = []

    try:
        soabi = sysconfig.get_config_var('SOABI')
    except IOError as e: # Issue #1074
        warnings.warn("{0}".format(e), RuntimeWarning)
        soabi = None

    if soabi and soabi.startswith('cpython-'):
        abis[0:0] = ['cp' + soabi.split('-', 1)[-1]]

    abi3s = set()
    import imp
    for suffix in imp.get_suffixes():
        if suffix[0].startswith('.abi'):
            abi3s.add(suffix[0].split('.', 2)[1])

    abis.extend(sorted(list(abi3s)))

    abis.append('none')

    if not noarch:
        arch = get_platform()

        # Current version, current API (built specifically for our Python):
        for abi in abis:
            supported.append(('%s%s' % (impl, versions[0]), abi, arch))

    # No abi / arch, but requires our implementation:
    for i, version in enumerate(versions):
        supported.append(('%s%s' % (impl, version), 'none', 'any'))
        if i == 0:
            # Tagged specifically as being cross-version compatible
            # (with just the major version specified)
            supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any'))

    # No abi / arch, generic Python
    for i, version in enumerate(versions):
        supported.append(('py%s' % (version,), 'none', 'any'))
        if i == 0:
            supported.append(('py%s' % (version[0]), 'none', 'any'))

    return supported

supported_tags = get_supported()
supported_tags_noarch = get_supported(noarch=True)
site-packages/setuptools/compat.py000064400000004774151733464020013363 0ustar00import sys
import itertools

if sys.version_info[0] < 3:
    PY3 = False

    basestring = basestring
    import __builtin__ as builtins
    import ConfigParser
    from StringIO import StringIO
    BytesIO = StringIO
    execfile = execfile
    func_code = lambda o: o.func_code
    func_globals = lambda o: o.func_globals
    im_func = lambda o: o.im_func
    from htmlentitydefs import name2codepoint
    import httplib
    from BaseHTTPServer import HTTPServer
    from SimpleHTTPServer import SimpleHTTPRequestHandler
    from BaseHTTPServer import BaseHTTPRequestHandler
    iteritems = lambda o: o.iteritems()
    long_type = long
    maxsize = sys.maxint
    next = lambda o: o.next()
    numeric_types = (int, long, float)
    unichr = unichr
    unicode = unicode
    bytes = str
    from urllib import url2pathname, splittag, pathname2url
    import urllib2
    from urllib2 import urlopen, HTTPError, URLError, unquote, splituser
    from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit
    filterfalse = itertools.ifilterfalse

    exec("""def reraise(tp, value, tb=None):
    raise tp, value, tb""")
else:
    PY3 = True

    basestring = str
    import builtins
    import configparser as ConfigParser
    from io import StringIO, BytesIO
    func_code = lambda o: o.__code__
    func_globals = lambda o: o.__globals__
    im_func = lambda o: o.__func__
    from html.entities import name2codepoint
    import http.client as httplib
    from http.server import HTTPServer, SimpleHTTPRequestHandler
    from http.server import BaseHTTPRequestHandler
    iteritems = lambda o: o.items()
    long_type = int
    maxsize = sys.maxsize
    next = next
    numeric_types = (int, float)
    unichr = chr
    unicode = str
    bytes = bytes
    from urllib.error import HTTPError, URLError
    import urllib.request as urllib2
    from urllib.request import urlopen, url2pathname, pathname2url
    from urllib.parse import (
        urlparse, urlunparse, unquote, splituser, urljoin, urlsplit,
        urlunsplit, splittag,
    )
    filterfalse = itertools.filterfalse

    def execfile(fn, globs=None, locs=None):
        if globs is None:
            globs = globals()
        if locs is None:
            locs = globs
        f = open(fn, 'rb')
        try:
            source = f.read()
        finally:
            f.close()
        exec(compile(source, fn, 'exec'), globs, locs)

    def reraise(tp, value, tb=None):
        if value.__traceback__ is not tb:
            raise value.with_traceback(tb)
        raise value
site-packages/setuptools/version.py000064400000000024151733464020013545 0ustar00__version__ = '2.0'
site-packages/setuptools/command/build_py.py000064400000020370151733464020015313 0ustar00import os
import sys
import fnmatch
import textwrap
from distutils.command.build_py import build_py as _build_py
from distutils.util import convert_path
from glob import glob

try:
    from setuptools.lib2to3_ex import Mixin2to3
except ImportError:
    class Mixin2to3:
        def run_2to3(self, files, doctests=True):
            "do nothing"

class build_py(_build_py, Mixin2to3):
    """Enhanced 'build_py' command that includes data files with packages

    The data files are specified via a 'package_data' argument to 'setup()'.
    See 'setuptools.dist.Distribution' for more details.

    Also, this version of the 'build_py' command allows you to specify both
    'py_modules' and 'packages' in the same setup operation.
    """
    def finalize_options(self):
        _build_py.finalize_options(self)
        self.package_data = self.distribution.package_data
        self.exclude_package_data = self.distribution.exclude_package_data or {}
        if 'data_files' in self.__dict__: del self.__dict__['data_files']
        self.__updated_files = []
        self.__doctests_2to3 = []

    def run(self):
        """Build modules, packages, and copy data files to build directory"""
        if not self.py_modules and not self.packages:
            return

        if self.py_modules:
            self.build_modules()

        if self.packages:
            self.build_packages()
            self.build_package_data()

        self.run_2to3(self.__updated_files, False)
        self.run_2to3(self.__updated_files, True)
        self.run_2to3(self.__doctests_2to3, True)

        # Only compile actual .py files, using our base class' idea of what our
        # output files are.
        self.byte_compile(_build_py.get_outputs(self, include_bytecode=0))

    def __getattr__(self, attr):
        if attr=='data_files':  # lazily compute data files
            self.data_files = files = self._get_data_files()
            return files
        return _build_py.__getattr__(self,attr)

    def build_module(self, module, module_file, package):
        outfile, copied = _build_py.build_module(self, module, module_file, package)
        if copied:
            self.__updated_files.append(outfile)
        return outfile, copied

    def _get_data_files(self):
        """Generate list of '(package,src_dir,build_dir,filenames)' tuples"""
        self.analyze_manifest()
        data = []
        for package in self.packages or ():
            # Locate package source directory
            src_dir = self.get_package_dir(package)

            # Compute package build directory
            build_dir = os.path.join(*([self.build_lib] + package.split('.')))

            # Length of path to strip from found files
            plen = len(src_dir)+1

            # Strip directory from globbed filenames
            filenames = [
                file[plen:] for file in self.find_data_files(package, src_dir)
                ]
            data.append((package, src_dir, build_dir, filenames))
        return data

    def find_data_files(self, package, src_dir):
        """Return filenames for package's data files in 'src_dir'"""
        globs = (self.package_data.get('', [])
                 + self.package_data.get(package, []))
        files = self.manifest_files.get(package, [])[:]
        for pattern in globs:
            # Each pattern has to be converted to a platform-specific path
            files.extend(glob(os.path.join(src_dir, convert_path(pattern))))
        return self.exclude_data_files(package, src_dir, files)

    def build_package_data(self):
        """Copy data files into build directory"""
        for package, src_dir, build_dir, filenames in self.data_files:
            for filename in filenames:
                target = os.path.join(build_dir, filename)
                self.mkpath(os.path.dirname(target))
                srcfile = os.path.join(src_dir, filename)
                outf, copied = self.copy_file(srcfile, target)
                srcfile = os.path.abspath(srcfile)
                if copied and srcfile in self.distribution.convert_2to3_doctests:
                    self.__doctests_2to3.append(outf)

    def analyze_manifest(self):
        self.manifest_files = mf = {}
        if not self.distribution.include_package_data:
            return
        src_dirs = {}
        for package in self.packages or ():
            # Locate package source directory
            src_dirs[assert_relative(self.get_package_dir(package))] = package

        self.run_command('egg_info')
        ei_cmd = self.get_finalized_command('egg_info')
        for path in ei_cmd.filelist.files:
            d,f = os.path.split(assert_relative(path))
            prev = None
            oldf = f
            while d and d!=prev and d not in src_dirs:
                prev = d
                d, df = os.path.split(d)
                f = os.path.join(df, f)
            if d in src_dirs:
                if path.endswith('.py') and f==oldf:
                    continue    # it's a module, not data
                mf.setdefault(src_dirs[d],[]).append(path)

    def get_data_files(self): pass  # kludge 2.4 for lazy computation

    if sys.version<"2.4":    # Python 2.4 already has this code
        def get_outputs(self, include_bytecode=1):
            """Return complete list of files copied to the build directory

            This includes both '.py' files and data files, as well as '.pyc'
            and '.pyo' files if 'include_bytecode' is true.  (This method is
            needed for the 'install_lib' command to do its job properly, and to
            generate a correct installation manifest.)
            """
            return _build_py.get_outputs(self, include_bytecode) + [
                os.path.join(build_dir, filename)
                for package, src_dir, build_dir,filenames in self.data_files
                for filename in filenames
                ]

    def check_package(self, package, package_dir):
        """Check namespace packages' __init__ for declare_namespace"""
        try:
            return self.packages_checked[package]
        except KeyError:
            pass

        init_py = _build_py.check_package(self, package, package_dir)
        self.packages_checked[package] = init_py

        if not init_py or not self.distribution.namespace_packages:
            return init_py

        for pkg in self.distribution.namespace_packages:
            if pkg==package or pkg.startswith(package+'.'):
                break
        else:
            return init_py

        f = open(init_py,'rbU')
        if 'declare_namespace'.encode() not in f.read():
            from distutils import log
            log.warn(
                "WARNING: %s is a namespace package, but its __init__.py does\n"
                "not declare_namespace(); setuptools 0.7 will REQUIRE this!\n"
                '(See the setuptools manual under "Namespace Packages" for '
                "details.)\n", package
            )
        f.close()
        return init_py

    def initialize_options(self):
        self.packages_checked={}
        _build_py.initialize_options(self)

    def get_package_dir(self, package):
        res = _build_py.get_package_dir(self, package)
        if self.distribution.src_root is not None:
            return os.path.join(self.distribution.src_root, res)
        return res

    def exclude_data_files(self, package, src_dir, files):
        """Filter filenames for package's data files in 'src_dir'"""
        globs = (self.exclude_package_data.get('', [])
                 + self.exclude_package_data.get(package, []))
        bad = []
        for pattern in globs:
            bad.extend(
                fnmatch.filter(
                    files, os.path.join(src_dir, convert_path(pattern))
                )
            )
        bad = dict.fromkeys(bad)
        seen = {}
        return [
            f for f in files if f not in bad
                and f not in seen and seen.setdefault(f,1)  # ditch dupes
        ]


def assert_relative(path):
    if not os.path.isabs(path):
        return path
    from distutils.errors import DistutilsSetupError
    msg = textwrap.dedent("""
        Error: setup script specifies an absolute path:

            %s

        setup() arguments must *always* be /-separated paths relative to the
        setup.py directory, *never* absolute paths.
        """).lstrip() % path
    raise DistutilsSetupError(msg)
site-packages/setuptools/command/build_ext.py000064400000027116151733464020015470 0ustar00from distutils.command.build_ext import build_ext as _du_build_ext
try:
    # Attempt to use Pyrex for building extensions, if available
    from Pyrex.Distutils.build_ext import build_ext as _build_ext
except ImportError:
    _build_ext = _du_build_ext

import os, sys
from distutils.file_util import copy_file
from setuptools.extension import Library
from distutils.ccompiler import new_compiler
from distutils.sysconfig import customize_compiler
try:
    # Python 2.7 or >=3.2
    from sysconfig import _CONFIG_VARS
except ImportError:
    from distutils.sysconfig import get_config_var
    get_config_var("LDSHARED")  # make sure _config_vars is initialized
    del get_config_var
    from distutils.sysconfig import _config_vars as _CONFIG_VARS
from distutils import log
from distutils.errors import *

have_rtld = False
use_stubs = False
libtype = 'shared'

if sys.platform == "darwin":
    use_stubs = True
elif os.name != 'nt':
    try:
        from dl import RTLD_NOW
        have_rtld = True
        use_stubs = True
    except ImportError:
        pass

def if_dl(s):
    if have_rtld:
        return s
    return ''






class build_ext(_build_ext):
    def run(self):
        """Build extensions in build directory, then copy if --inplace"""
        old_inplace, self.inplace = self.inplace, 0
        _build_ext.run(self)
        self.inplace = old_inplace
        if old_inplace:
            self.copy_extensions_to_source()

    def copy_extensions_to_source(self):
        build_py = self.get_finalized_command('build_py')
        for ext in self.extensions:
            fullname = self.get_ext_fullname(ext.name)
            filename = self.get_ext_filename(fullname)
            modpath = fullname.split('.')
            package = '.'.join(modpath[:-1])
            package_dir = build_py.get_package_dir(package)
            dest_filename = os.path.join(package_dir,os.path.basename(filename))
            src_filename = os.path.join(self.build_lib,filename)

            # Always copy, even if source is older than destination, to ensure
            # that the right extensions for the current Python/platform are
            # used.
            copy_file(
                src_filename, dest_filename, verbose=self.verbose,
                dry_run=self.dry_run
            )
            if ext._needs_stub:
                self.write_stub(package_dir or os.curdir, ext, True)


    if _build_ext is not _du_build_ext and not hasattr(_build_ext,'pyrex_sources'):
        # Workaround for problems using some Pyrex versions w/SWIG and/or 2.4
        def swig_sources(self, sources, *otherargs):
            # first do any Pyrex processing
            sources = _build_ext.swig_sources(self, sources) or sources
            # Then do any actual SWIG stuff on the remainder
            return _du_build_ext.swig_sources(self, sources, *otherargs)



    def get_ext_filename(self, fullname):
        filename = _build_ext.get_ext_filename(self,fullname)
        if fullname in self.ext_map:
            ext = self.ext_map[fullname]
            if isinstance(ext,Library):
                fn, ext = os.path.splitext(filename)
                return self.shlib_compiler.library_filename(fn,libtype)
            elif use_stubs and ext._links_to_dynamic:
                d,fn = os.path.split(filename)
                return os.path.join(d,'dl-'+fn)
        return filename

    def initialize_options(self):
        _build_ext.initialize_options(self)
        self.shlib_compiler = None
        self.shlibs = []
        self.ext_map = {}

    def finalize_options(self):
        _build_ext.finalize_options(self)
        self.extensions = self.extensions or []
        self.check_extensions_list(self.extensions)
        self.shlibs = [ext for ext in self.extensions
                        if isinstance(ext,Library)]
        if self.shlibs:
            self.setup_shlib_compiler()
        for ext in self.extensions:
            ext._full_name = self.get_ext_fullname(ext.name)
        for ext in self.extensions:
            fullname = ext._full_name
            self.ext_map[fullname] = ext

            # distutils 3.1 will also ask for module names
            # XXX what to do with conflicts?
            self.ext_map[fullname.split('.')[-1]] = ext

            ltd = ext._links_to_dynamic = \
                self.shlibs and self.links_to_dynamic(ext) or False
            ext._needs_stub = ltd and use_stubs and not isinstance(ext,Library)
            filename = ext._file_name = self.get_ext_filename(fullname)
            libdir = os.path.dirname(os.path.join(self.build_lib,filename))
            if ltd and libdir not in ext.library_dirs:
                ext.library_dirs.append(libdir)
            if ltd and use_stubs and os.curdir not in ext.runtime_library_dirs:
                ext.runtime_library_dirs.append(os.curdir)

    def setup_shlib_compiler(self):
        compiler = self.shlib_compiler = new_compiler(
            compiler=self.compiler, dry_run=self.dry_run, force=self.force
        )
        if sys.platform == "darwin":
            tmp = _CONFIG_VARS.copy()
            try:
                # XXX Help!  I don't have any idea whether these are right...
                _CONFIG_VARS['LDSHARED'] = "gcc -Wl,-x -dynamiclib -undefined dynamic_lookup"
                _CONFIG_VARS['CCSHARED'] = " -dynamiclib"
                _CONFIG_VARS['SO'] = ".dylib"
                customize_compiler(compiler)
            finally:
                _CONFIG_VARS.clear()
                _CONFIG_VARS.update(tmp)
        else:
            customize_compiler(compiler)

        if self.include_dirs is not None:
            compiler.set_include_dirs(self.include_dirs)
        if self.define is not None:
            # 'define' option is a list of (name,value) tuples
            for (name,value) in self.define:
                compiler.define_macro(name, value)
        if self.undef is not None:
            for macro in self.undef:
                compiler.undefine_macro(macro)
        if self.libraries is not None:
            compiler.set_libraries(self.libraries)
        if self.library_dirs is not None:
            compiler.set_library_dirs(self.library_dirs)
        if self.rpath is not None:
            compiler.set_runtime_library_dirs(self.rpath)
        if self.link_objects is not None:
            compiler.set_link_objects(self.link_objects)

        # hack so distutils' build_extension() builds a library instead
        compiler.link_shared_object = link_shared_object.__get__(compiler)



    def get_export_symbols(self, ext):
        if isinstance(ext,Library):
            return ext.export_symbols
        return _build_ext.get_export_symbols(self,ext)

    def build_extension(self, ext):
        _compiler = self.compiler
        try:
            if isinstance(ext,Library):
                self.compiler = self.shlib_compiler
            _build_ext.build_extension(self,ext)
            if ext._needs_stub:
                self.write_stub(
                    self.get_finalized_command('build_py').build_lib, ext
                )
        finally:
            self.compiler = _compiler

    def links_to_dynamic(self, ext):
        """Return true if 'ext' links to a dynamic lib in the same package"""
        # XXX this should check to ensure the lib is actually being built
        # XXX as dynamic, and not just using a locally-found version or a
        # XXX static-compiled version
        libnames = dict.fromkeys([lib._full_name for lib in self.shlibs])
        pkg = '.'.join(ext._full_name.split('.')[:-1]+[''])
        for libname in ext.libraries:
            if pkg+libname in libnames: return True
        return False

    def get_outputs(self):
        outputs = _build_ext.get_outputs(self)
        optimize = self.get_finalized_command('build_py').optimize
        for ext in self.extensions:
            if ext._needs_stub:
                base = os.path.join(self.build_lib, *ext._full_name.split('.'))
                outputs.append(base+'.py')
                outputs.append(base+'.pyc')
                if optimize:
                    outputs.append(base+'.pyo')
        return outputs

    def write_stub(self, output_dir, ext, compile=False):
        log.info("writing stub loader for %s to %s",ext._full_name, output_dir)
        stub_file = os.path.join(output_dir, *ext._full_name.split('.'))+'.py'
        if compile and os.path.exists(stub_file):
            raise DistutilsError(stub_file+" already exists! Please delete.")
        if not self.dry_run:
            f = open(stub_file,'w')
            f.write('\n'.join([
                "def __bootstrap__():",
                "   global __bootstrap__, __file__, __loader__",
                "   import sys, os, pkg_resources, imp"+if_dl(", dl"),
                "   __file__ = pkg_resources.resource_filename(__name__,%r)"
                   % os.path.basename(ext._file_name),
                "   del __bootstrap__",
                "   if '__loader__' in globals():",
                "       del __loader__",
                if_dl("   old_flags = sys.getdlopenflags()"),
                "   old_dir = os.getcwd()",
                "   try:",
                "     os.chdir(os.path.dirname(__file__))",
                if_dl("     sys.setdlopenflags(dl.RTLD_NOW)"),
                "     imp.load_dynamic(__name__,__file__)",
                "   finally:",
                if_dl("     sys.setdlopenflags(old_flags)"),
                "     os.chdir(old_dir)",
                "__bootstrap__()",
                "" # terminal \n
            ]))
            f.close()
        if compile:
            from distutils.util import byte_compile
            byte_compile([stub_file], optimize=0,
                         force=True, dry_run=self.dry_run)
            optimize = self.get_finalized_command('install_lib').optimize
            if optimize > 0:
                byte_compile([stub_file], optimize=optimize,
                             force=True, dry_run=self.dry_run)
            if os.path.exists(stub_file) and not self.dry_run:
                os.unlink(stub_file)


if use_stubs or os.name=='nt':
    # Build shared libraries
    #
    def link_shared_object(self, objects, output_libname, output_dir=None,
        libraries=None, library_dirs=None, runtime_library_dirs=None,
        export_symbols=None, debug=0, extra_preargs=None,
        extra_postargs=None, build_temp=None, target_lang=None
    ):  self.link(
            self.SHARED_LIBRARY, objects, output_libname,
            output_dir, libraries, library_dirs, runtime_library_dirs,
            export_symbols, debug, extra_preargs, extra_postargs,
            build_temp, target_lang
        )
else:
    # Build static libraries everywhere else
    libtype = 'static'

    def link_shared_object(self, objects, output_libname, output_dir=None,
        libraries=None, library_dirs=None, runtime_library_dirs=None,
        export_symbols=None, debug=0, extra_preargs=None,
        extra_postargs=None, build_temp=None, target_lang=None
    ):
        # XXX we need to either disallow these attrs on Library instances,
        #     or warn/abort here if set, or something...
        #libraries=None, library_dirs=None, runtime_library_dirs=None,
        #export_symbols=None, extra_preargs=None, extra_postargs=None,
        #build_temp=None

        assert output_dir is None   # distutils build_ext doesn't pass this
        output_dir,filename = os.path.split(output_libname)
        basename, ext = os.path.splitext(filename)
        if self.library_filename("x").startswith('lib'):
            # strip 'lib' prefix; this is kludgy if some platform uses
            # a different prefix
            basename = basename[3:]

        self.create_static_lib(
            objects, basename, output_dir, debug, target_lang
        )


site-packages/setuptools/command/register.py000064400000000425151733464020015327 0ustar00from distutils.command.register import register as _register

class register(_register):
    __doc__ = _register.__doc__

    def run(self):
        # Make sure that we are using valid current name/version info
        self.run_command('egg_info')
        _register.run(self)

site-packages/setuptools/command/bdist_egg.py000064400000044436151733464020015444 0ustar00"""setuptools.command.bdist_egg

Build .egg distributions"""

# This module should be kept compatible with Python 2.3
import sys, os, marshal
from setuptools import Command
from distutils.dir_util import remove_tree, mkpath
try:
    # Python 2.7 or >=3.2
    from sysconfig import get_path, get_python_version
    def _get_purelib():
        return get_path("purelib")
except ImportError:
    from distutils.sysconfig import get_python_lib, get_python_version
    def _get_purelib():
        return get_python_lib(False)

from distutils import log
from distutils.errors import DistutilsSetupError
from pkg_resources import get_build_platform, Distribution, ensure_directory
from pkg_resources import EntryPoint
from types import CodeType
from setuptools.compat import basestring, next
from setuptools.extension import Library

def strip_module(filename):
    if '.' in filename:
        filename = os.path.splitext(filename)[0]
    if filename.endswith('module'):
        filename = filename[:-6]
    return filename

def write_stub(resource, pyfile):
    f = open(pyfile,'w')
    f.write('\n'.join([
        "def __bootstrap__():",
        "   global __bootstrap__, __loader__, __file__",
        "   import sys, pkg_resources, imp",
        "   __file__ = pkg_resources.resource_filename(__name__,%r)"
            % resource,
        "   __loader__ = None; del __bootstrap__, __loader__",
        "   imp.load_dynamic(__name__,__file__)",
        "__bootstrap__()",
        "" # terminal \n
    ]))
    f.close()

# stub __init__.py for packages distributed without one
NS_PKG_STUB = '__import__("pkg_resources").declare_namespace(__name__)'

class bdist_egg(Command):

    description = "create an \"egg\" distribution"

    user_options = [
        ('bdist-dir=', 'b',
            "temporary directory for creating the distribution"),
        ('plat-name=', 'p',
                     "platform name to embed in generated filenames "
                     "(default: %s)" % get_build_platform()),
        ('exclude-source-files', None,
                     "remove all .py files from the generated egg"),
        ('keep-temp', 'k',
                     "keep the pseudo-installation tree around after " +
                     "creating the distribution archive"),
        ('dist-dir=', 'd',
                     "directory to put final built distributions in"),
        ('skip-build', None,
                     "skip rebuilding everything (for testing/debugging)"),
    ]

    boolean_options = [
        'keep-temp', 'skip-build', 'exclude-source-files'
    ]

















    def initialize_options (self):
        self.bdist_dir = None
        self.plat_name = None
        self.keep_temp = 0
        self.dist_dir = None
        self.skip_build = 0
        self.egg_output = None
        self.exclude_source_files = None


    def finalize_options(self):
        ei_cmd = self.ei_cmd = self.get_finalized_command("egg_info")
        self.egg_info = ei_cmd.egg_info

        if self.bdist_dir is None:
            bdist_base = self.get_finalized_command('bdist').bdist_base
            self.bdist_dir = os.path.join(bdist_base, 'egg')

        if self.plat_name is None:
            self.plat_name = get_build_platform()

        self.set_undefined_options('bdist',('dist_dir', 'dist_dir'))

        if self.egg_output is None:

            # Compute filename of the output egg
            basename = Distribution(
                None, None, ei_cmd.egg_name, ei_cmd.egg_version,
                get_python_version(),
                self.distribution.has_ext_modules() and self.plat_name
            ).egg_name()

            self.egg_output = os.path.join(self.dist_dir, basename+'.egg')








    def do_install_data(self):
        # Hack for packages that install data to install's --install-lib
        self.get_finalized_command('install').install_lib = self.bdist_dir

        site_packages = os.path.normcase(os.path.realpath(_get_purelib()))
        old, self.distribution.data_files = self.distribution.data_files,[]

        for item in old:
            if isinstance(item,tuple) and len(item)==2:
                if os.path.isabs(item[0]):
                    realpath = os.path.realpath(item[0])
                    normalized = os.path.normcase(realpath)
                    if normalized==site_packages or normalized.startswith(
                        site_packages+os.sep
                    ):
                        item = realpath[len(site_packages)+1:], item[1]
                    # XXX else: raise ???
            self.distribution.data_files.append(item)

        try:
            log.info("installing package data to %s" % self.bdist_dir)
            self.call_command('install_data', force=0, root=None)
        finally:
            self.distribution.data_files = old


    def get_outputs(self):
        return [self.egg_output]


    def call_command(self,cmdname,**kw):
        """Invoke reinitialized command `cmdname` with keyword args"""
        for dirname in INSTALL_DIRECTORY_ATTRS:
            kw.setdefault(dirname,self.bdist_dir)
        kw.setdefault('skip_build',self.skip_build)
        kw.setdefault('dry_run', self.dry_run)
        cmd = self.reinitialize_command(cmdname, **kw)
        self.run_command(cmdname)
        return cmd


    def run(self):
        # Generate metadata first
        self.run_command("egg_info")
        # We run install_lib before install_data, because some data hacks
        # pull their data path from the install_lib command.
        log.info("installing library code to %s" % self.bdist_dir)
        instcmd = self.get_finalized_command('install')
        old_root = instcmd.root; instcmd.root = None
        if self.distribution.has_c_libraries() and not self.skip_build:
            self.run_command('build_clib')
        cmd = self.call_command('install_lib', warn_dir=0)
        instcmd.root = old_root

        all_outputs, ext_outputs = self.get_ext_outputs()
        self.stubs = []
        to_compile = []
        for (p,ext_name) in enumerate(ext_outputs):
            filename,ext = os.path.splitext(ext_name)
            pyfile = os.path.join(self.bdist_dir, strip_module(filename)+'.py')
            self.stubs.append(pyfile)
            log.info("creating stub loader for %s" % ext_name)
            if not self.dry_run:
                write_stub(os.path.basename(ext_name), pyfile)
            to_compile.append(pyfile)
            ext_outputs[p] = ext_name.replace(os.sep,'/')

        to_compile.extend(self.make_init_files())
        if to_compile:
            cmd.byte_compile(to_compile)
        if self.distribution.data_files:
            self.do_install_data()

        # Make the EGG-INFO directory
        archive_root = self.bdist_dir
        egg_info = os.path.join(archive_root,'EGG-INFO')
        self.mkpath(egg_info)
        if self.distribution.scripts:
            script_dir = os.path.join(egg_info, 'scripts')
            log.info("installing scripts to %s" % script_dir)
            self.call_command('install_scripts',install_dir=script_dir,no_ep=1)

        self.copy_metadata_to(egg_info)
        native_libs = os.path.join(egg_info, "native_libs.txt")
        if all_outputs:
            log.info("writing %s" % native_libs)
            if not self.dry_run:
                ensure_directory(native_libs)
                libs_file = open(native_libs, 'wt')
                libs_file.write('\n'.join(all_outputs))
                libs_file.write('\n')
                libs_file.close()
        elif os.path.isfile(native_libs):
            log.info("removing %s" % native_libs)
            if not self.dry_run:
                os.unlink(native_libs)

        write_safety_flag(
            os.path.join(archive_root,'EGG-INFO'), self.zip_safe()
        )

        if os.path.exists(os.path.join(self.egg_info,'depends.txt')):
            log.warn(
                "WARNING: 'depends.txt' will not be used by setuptools 0.6!\n"
                "Use the install_requires/extras_require setup() args instead."
            )

        if self.exclude_source_files:
            self.zap_pyfiles()

        # Make the archive
        make_zipfile(self.egg_output, archive_root, verbose=self.verbose,
                          dry_run=self.dry_run, mode=self.gen_header())
        if not self.keep_temp:
            remove_tree(self.bdist_dir, dry_run=self.dry_run)

        # Add to 'Distribution.dist_files' so that the "upload" command works
        getattr(self.distribution,'dist_files',[]).append(
            ('bdist_egg',get_python_version(),self.egg_output))




    def zap_pyfiles(self):
        log.info("Removing .py files from temporary directory")
        for base,dirs,files in walk_egg(self.bdist_dir):
            for name in files:
                if name.endswith('.py'):
                    path = os.path.join(base,name)
                    log.debug("Deleting %s", path)
                    os.unlink(path)

    def zip_safe(self):
        safe = getattr(self.distribution,'zip_safe',None)
        if safe is not None:
            return safe
        log.warn("zip_safe flag not set; analyzing archive contents...")
        return analyze_egg(self.bdist_dir, self.stubs)

    def make_init_files(self):
        """Create missing package __init__ files"""
        init_files = []
        for base,dirs,files in walk_egg(self.bdist_dir):
            if base==self.bdist_dir:
                # don't put an __init__ in the root
                continue
            for name in files:
                if name.endswith('.py'):
                    if '__init__.py' not in files:
                        pkg = base[len(self.bdist_dir)+1:].replace(os.sep,'.')
                        if self.distribution.has_contents_for(pkg):
                            log.warn("Creating missing __init__.py for %s",pkg)
                            filename = os.path.join(base,'__init__.py')
                            if not self.dry_run:
                                f = open(filename,'w'); f.write(NS_PKG_STUB)
                                f.close()
                            init_files.append(filename)
                    break
            else:
                # not a package, don't traverse to subdirectories
                dirs[:] = []

        return init_files

    def gen_header(self):
        epm = EntryPoint.parse_map(self.distribution.entry_points or '')
        ep = epm.get('setuptools.installation',{}).get('eggsecutable')
        if ep is None:
            return 'w'  # not an eggsecutable, do it the usual way.

        if not ep.attrs or ep.extras:
            raise DistutilsSetupError(
                "eggsecutable entry point (%r) cannot have 'extras' "
                "or refer to a module" % (ep,)
            )

        pyver = sys.version[:3]
        pkg = ep.module_name
        full = '.'.join(ep.attrs)
        base = ep.attrs[0]
        basename = os.path.basename(self.egg_output)

        header = (
            "#!/bin/sh\n"
            'if [ `basename $0` = "%(basename)s" ]\n'
            'then exec python%(pyver)s -c "'
            "import sys, os; sys.path.insert(0, os.path.abspath('$0')); "
            "from %(pkg)s import %(base)s; sys.exit(%(full)s())"
            '" "$@"\n'
            'else\n'
            '  echo $0 is not the correct name for this egg file.\n'
            '  echo Please rename it back to %(basename)s and try again.\n'
            '  exec false\n'
            'fi\n'

        ) % locals()

        if not self.dry_run:
            mkpath(os.path.dirname(self.egg_output), dry_run=self.dry_run)
            f = open(self.egg_output, 'w')
            f.write(header)
            f.close()
        return 'a'


    def copy_metadata_to(self, target_dir):
        "Copy metadata (egg info) to the target_dir"
        # normalize the path (so that a forward-slash in egg_info will
        # match using startswith below)
        norm_egg_info = os.path.normpath(self.egg_info)
        prefix = os.path.join(norm_egg_info,'')
        for path in self.ei_cmd.filelist.files:
            if path.startswith(prefix):
                target = os.path.join(target_dir, path[len(prefix):])
                ensure_directory(target)
                self.copy_file(path, target)

    def get_ext_outputs(self):
        """Get a list of relative paths to C extensions in the output distro"""

        all_outputs = []
        ext_outputs = []

        paths = {self.bdist_dir:''}
        for base, dirs, files in os.walk(self.bdist_dir):
            for filename in files:
                if os.path.splitext(filename)[1].lower() in NATIVE_EXTENSIONS:
                    all_outputs.append(paths[base]+filename)
            for filename in dirs:
                paths[os.path.join(base,filename)] = paths[base]+filename+'/'

        if self.distribution.has_ext_modules():
            build_cmd = self.get_finalized_command('build_ext')
            for ext in build_cmd.extensions:
                if isinstance(ext,Library):
                    continue
                fullname = build_cmd.get_ext_fullname(ext.name)
                filename = build_cmd.get_ext_filename(fullname)
                if not os.path.basename(filename).startswith('dl-'):
                    if os.path.exists(os.path.join(self.bdist_dir,filename)):
                        ext_outputs.append(filename)

        return all_outputs, ext_outputs


NATIVE_EXTENSIONS = dict.fromkeys('.dll .so .dylib .pyd'.split())




def walk_egg(egg_dir):
    """Walk an unpacked egg's contents, skipping the metadata directory"""
    walker = os.walk(egg_dir)
    base,dirs,files = next(walker)
    if 'EGG-INFO' in dirs:
        dirs.remove('EGG-INFO')
    yield base,dirs,files
    for bdf in walker:
        yield bdf

def analyze_egg(egg_dir, stubs):
    # check for existing flag in EGG-INFO
    for flag,fn in safety_flags.items():
        if os.path.exists(os.path.join(egg_dir,'EGG-INFO',fn)):
            return flag
    if not can_scan(): return False
    safe = True
    for base, dirs, files in walk_egg(egg_dir):
        for name in files:
            if name.endswith('.py') or name.endswith('.pyw'):
                continue
            elif name.endswith('.pyc') or name.endswith('.pyo'):
                # always scan, even if we already know we're not safe
                safe = scan_module(egg_dir, base, name, stubs) and safe
    return safe

def write_safety_flag(egg_dir, safe):
    # Write or remove zip safety flag file(s)
    for flag,fn in safety_flags.items():
        fn = os.path.join(egg_dir, fn)
        if os.path.exists(fn):
            if safe is None or bool(safe) != flag:
                os.unlink(fn)
        elif safe is not None and bool(safe)==flag:
            f=open(fn,'wt'); f.write('\n'); f.close()

safety_flags = {
    True: 'zip-safe',
    False: 'not-zip-safe',
}

def scan_module(egg_dir, base, name, stubs):
    """Check whether module possibly uses unsafe-for-zipfile stuff"""

    filename = os.path.join(base,name)
    if filename[:-1] in stubs:
        return True     # Extension module
    pkg = base[len(egg_dir)+1:].replace(os.sep,'.')
    module = pkg+(pkg and '.' or '')+os.path.splitext(name)[0]
    if sys.version_info < (3, 3):
        skip = 8   # skip magic & date
    else:
        skip = 12  # skip magic & date & file size
    f = open(filename,'rb'); f.read(skip)
    code = marshal.load(f); f.close()
    safe = True
    symbols = dict.fromkeys(iter_symbols(code))
    for bad in ['__file__', '__path__']:
        if bad in symbols:
            log.warn("%s: module references %s", module, bad)
            safe = False
    if 'inspect' in symbols:
        for bad in [
            'getsource', 'getabsfile', 'getsourcefile', 'getfile'
            'getsourcelines', 'findsource', 'getcomments', 'getframeinfo',
            'getinnerframes', 'getouterframes', 'stack', 'trace'
        ]:
            if bad in symbols:
                log.warn("%s: module MAY be using inspect.%s", module, bad)
                safe = False
    if '__name__' in symbols and '__main__' in symbols and '.' not in module:
        if sys.version[:3]=="2.4":  # -m works w/zipfiles in 2.5
            log.warn("%s: top-level module may be 'python -m' script", module)
            safe = False
    return safe

def iter_symbols(code):
    """Yield names and strings used by `code` and its nested code objects"""
    for name in code.co_names: yield name
    for const in code.co_consts:
        if isinstance(const,basestring):
            yield const
        elif isinstance(const,CodeType):
            for name in iter_symbols(const):
                yield name

def can_scan():
    if not sys.platform.startswith('java') and sys.platform != 'cli':
        # CPython, PyPy, etc.
        return True
    log.warn("Unable to analyze compiled code on this platform.")
    log.warn("Please ask the author to include a 'zip_safe'"
             " setting (either True or False) in the package's setup.py")


































# Attribute names of options for commands that might need to be convinced to
# install to the egg build directory

INSTALL_DIRECTORY_ATTRS = [
    'install_lib', 'install_dir', 'install_data', 'install_base'
]

def make_zipfile(zip_filename, base_dir, verbose=0, dry_run=0, compress=None,
    mode='w'
):
    """Create a zip file from all the files under 'base_dir'.  The output
    zip file will be named 'base_dir' + ".zip".  Uses either the "zipfile"
    Python module (if available) or the InfoZIP "zip" utility (if installed
    and found on the default search path).  If neither tool is available,
    raises DistutilsExecError.  Returns the name of the output zip file.
    """
    import zipfile
    mkpath(os.path.dirname(zip_filename), dry_run=dry_run)
    log.info("creating '%s' and adding '%s' to it", zip_filename, base_dir)

    def visit(z, dirname, names):
        for name in names:
            path = os.path.normpath(os.path.join(dirname, name))
            if os.path.isfile(path):
                p = path[len(base_dir)+1:]
                if not dry_run:
                    z.write(path, p)
                log.debug("adding '%s'" % p)

    if compress is None:
        compress = (sys.version>="2.4") # avoid 2.3 zipimport bug when 64 bits

    compression = [zipfile.ZIP_STORED, zipfile.ZIP_DEFLATED][bool(compress)]
    if not dry_run:
        z = zipfile.ZipFile(zip_filename, mode, compression=compression)
        for dirname, dirs, files in os.walk(base_dir):
            visit(z, dirname, files)
        z.close()
    else:
        for dirname, dirs, files in os.walk(base_dir):
            visit(None, dirname, files)
    return zip_filename
#
site-packages/setuptools/command/__pycache__/easy_install.cpython-33.pyc000064400000241517151733464030022465 0ustar00�
�Rec@s�dZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlmZddlmZmZddlZddlmZmZddlmZddlmZmZddlmZdd	lmZmZdd
l m!Z!m"Z"m#Z#m$Z$ddl%m&Z&m'Z'ddl(m)Z)dd
l*m+Z+ddl,m-Z-ddl,m.Z.ddl(m/Z/m0Z0ddl1m2Z2m3Z3m4Z4m5Z5m6Z6ddlm7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEejFjGdejHjIejJ��ZKddddddgZLdd�ZMdd�ZNejOdfkr�dd�ZPd d!�ZQnd"d�ZPd#d!�ZQGd$d�de�ZRd%d&�ZSd'd(�ZTd)d�ZUd*d�ZVd+d,�ZWGd-d�de=�ZXeKeYd.d/�ZZd0d1�Z[d2d3�Z\d4d5�Z]d6d7d8�Z^d9d:�Z_d;d<�Z`d=d>�Zaydd?lmbZcWnedk
r�d@dA�ZcYnXdBdC�ZbdDdE�ZeGdFdG�dGef�ZgGdHdI�dIeg�ZhGdJdK�dKeh�ZiegjjZjdLdM�ZkdNdO�ZleYe[dPdQ�ZmdRdS�ZndTdU�ZoepdVd�ZqdS(Wu
Easy Install
------------

A tool for doing automatic download/extract/build of distutils-based Python
packages.  For detailed documentation, see the accompanying EasyInstall.txt
file, or visit the `EasyInstall home page`__.

__ https://pythonhosted.org/setuptools/easy_install.html

iN(uglob(ulogudir_util(uCommandu_dont_write_bytecode(u	run_setup(uget_pathuget_config_vars(uget_platform(uconvert_pathu
subst_vars(uDistutilsArgErroruDistutilsOptionErroruDistutilsErroruDistutilsPlatformError(uINSTALL_SCHEMESuSCHEME_KEYS(usetopt(uunpack_archive(uPackageIndex(u
URL_SCHEME(u	bdist_egguegg_info(u	iteritemsumaxsizeu
basestringuunicodeureraise(uyield_linesunormalize_pathuresource_stringuensure_directoryuget_distributionufind_distributionsuEnvironmentuRequirementuDistributionuPathMetadatauEggMetadatau
WorkingSetuDistributionNotFounduVersionConflictuDEVELOP_DISTu__VENV_LAUNCHER__usamefileueasy_installuPthDistributionsuextract_wininst_cfgumainuget_exe_prefixescCstjd�dkS(NuPi(ustructucalcsize(((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuis_64bit@suis_64bitcCs�tjj|�o!tjj|�}ttjd�o9|}|rUtjj||�Stjjtjj|��}tjjtjj|��}||kS(Nusamefile(uosupathuexistsuhasattrusamefileunormpathunormcase(up1up2u
both_existuuse_samefileunorm_p1unorm_p2((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyusamefileCs$icCs|S(N((us((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu	_to_asciiMsu	_to_asciicCs2yt|d�dSWntk
r-dSYnXdS(NuasciiTF(uunicodeuTrueuUnicodeErroruFalse(us((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuisasciiOs


uisasciicCs
|jd�S(Nuascii(uencode(us((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu	_to_asciiVscCs2y|jd�dSWntk
r-dSYnXdS(NuasciiTF(uencodeuTrueuUnicodeErroruFalse(us((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuisasciiXs


cBs'|EeZdZdZdZd�Zd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�gZdddddd.d1d7d:g	Z	e
jr�d>e
jZ
ejd?d�e
f�e	jd?�nidd(6ZeZd@dA�ZdBdC�ZdDdE�ZdFdG�ZdHdI�ZdJdK�ZdLdM�ZdNdO�ZdPdQ�ZdRdS�ZdTdU�ZdVdW�ZdXdY�ZdZd[�Zd\d]�Z d^d_�Z!d�d`da�Z#d�dbdc�Z$ddde�Z%d�dfdg�Z&dhdi�Z'djdk�Z(dldm�Z)d�dndo�Z*dpfdqdr�Z+dsdt�Z,dudv�Z-dwdx�Z.dydz�Z/d{d|�Z0d}d~d�Z1d�d��Z2d�d��Z3d�d��Z4d�d��Z5d�d��Z6d�d��Z7d�d��Z8d�d��Z9d�d��Z:d�d��Z;d�d��Z<e=d�e=d�d�d�d���Z>e=d�d�d�d��Z?d�d��Z@d�S(�ueasy_installu'Manage a download/build/install processu Find/get/install Python packagesuprefix=uinstallation prefixuzip-okuzuinstall package as a zipfileu
multi-versionumu%make apps have to require() a versionuupgradeuUu1force upgrade (searches PyPI for latest versions)uinstall-dir=uduinstall package to DIRuscript-dir=usuinstall scripts to DIRuexclude-scriptsuxuDon't install scriptsualways-copyuau'Copy all needed packages to install diru
index-url=uiu base URL of Python Package Indexufind-links=ufu(additional URL(s) to search for packagesubuild-directory=ubu/download/extract/build in DIR; keep the resultsu	optimize=uOulalso compile with optimization: -O1 for "python -O", -O2 for "python -OO", and -O0 to disable [default: -O0]urecord=u3filename in which to record list of installed filesualways-unzipuZu*don't install as a zipfile, no matter whatu
site-dirs=uSu)list of directories where .pth files workueditableueu+Install specified packages in editable formuno-depsuNudon't install dependenciesuallow-hosts=uHu$pattern(s) that hostnames must matchulocal-snapshots-okulu(allow building eggs from local checkoutsuversionu"print version information and exitu
no-find-linksu9Don't load find-links defined in packages being installedu!install in user site-package '%s'uusercCs�tjr3tjjt�}|jtj�|_n	d|_d|_
|_d|_|_
|_d|_d|_d|_d|_d|_|_d|_|_|_d|_|_|_d|_|_|_d|_d|_d|_ d|_!d|_"d|_#d|_$d|_%d|_&tjrQtj'|_(tj|_)nd|_(d|_)d|_*d|_+d|_,|_-d|_.i|_/d|_1d|_2|j3j4|_4|j3j5||j3j6d��dS(Niueasy_installF(7usiteuENABLE_USER_SITEuosupathuabspathu__file__u
startswithu	USER_SITEuuseruNoneuzip_okulocal_snapshots_okuinstall_diru
script_diruexclude_scriptsu	index_urlu
find_linksubuild_directoryuargsuoptimizeurecorduupgradeualways_copyu
multi_versionueditableuno_depsuallow_hostsurootuprefixu	no_reportuversionuinstall_purelibuinstall_platlibuinstall_headersuinstall_libuinstall_scriptsuinstall_datauinstall_baseuinstall_platbaseu	USER_BASEuinstall_userbaseuinstall_usersiteu
no_find_linksu
package_indexupth_fileualways_copy_fromu	site_dirsuinstalled_projectsuFalseusitepy_installedu_dry_runudistributionuverboseu_set_command_optionsuget_option_dict(uselfuwhereami((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuinitialize_options�sL																									ueasy_install.initialize_optionscCs�x�|D]�}tjj|�s1tjj|�rtjd|�|js�tjj|�r|tjj|�r|t|�q�tj	|�q�qqWdS(NuDeleting %s(
uosupathuexistsuislinkuloguinfoudry_runuisdirurmtreeuunlink(uselfublockersufilename((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyudelete_blockers�s
$	%
ueasy_install.delete_blockersc	Csx|jr-tdtd�j�tj�ntjj�d}tdd�\}}i|jj�d6|jj	�d6|jj
�d6|d	6|dd
�d6|d|dd
6|d6|d6|d6|d6ttdd�d6|_t
jr|j|jd<|j|jd<n|jr�t
jr�|j�|jdkrNtd��n|j|_|_tjdkr�|jd�q�|jtjd�n|j�|j�|jdddd�|jdkr�|j|_n|jdkr�d.|_n|j!dd/�|j!dd0�|jrG|j"rG|j"|_|j#|_n|j!dd1�t$t%tj&�}t'�|_(|j)dk	rd d!�|j)jd"�D�}xq|D]f}tj&j*|�s�t+j,d#|�q�t%|�|kr�t-|d$��q�|j(j.t%|��q�Wn|j/s-|j0�n|j1p9d%|_1|j(dd�|_2xE|jt%|j�fD]+}||j2krn|j2j3d|�qnqnW|j4dk	r�d&d!�|j4jd"�D�}n	d'g}|j5dkr
|j6|j1d(|j2d)|�|_5nt7|j2tj&�|_8|j9dk	r_t:|j9t;�rh|j9j�|_9qhn	g|_9|j<r�|j5j=|j2tj&�n|js�|j5j>|j9�n|j!dd2�t:|j?t@�s1y>t@|j?�|_?d|j?ko�dknstA�nWq1tAk
r-t-d+��Yq1Xn|j/rS|jBrStCd,��n|jDsktCd-��ng|_EdS(3Nu
setuptools %su
setuptoolsiuprefixuexec_prefixu	dist_nameudist_versionu
dist_fullnameu
py_versioniupy_version_shortiupy_version_nodotu
sys_prefixusys_exec_prefixuabiflagsuuuserbaseuusersiteu$User base directory is not specifieduposixu	unix_useru_useruinstall_diru
script_dirubuild_directoryu	site_dirsuinstall_libuinstall_scriptsuinstallurecordcSs(g|]}tjj|j���qS((uosupathu
expanduserustrip(u.0us((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
<listcomp>s	u1easy_install.finalize_options.<locals>.<listcomp>u,u"%s (in --site-dirs) does not existu$ (in --site-dirs) is not on sys.pathuhttps://pypi.python.org/simplecSsg|]}|j��qS((ustrip(u.0us((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
<listcomp>)s	u*usearch_pathuhostsuoptimizeu--optimize must be 0, 1, or 2u9Must specify a build directory (-b) when using --editableu:No urls, filenames, or requirements specified (see --help)F(uinstall_diruinstall_dir(uinstall_diru
script_dir(urecordurecord(uoptimizeuoptimize(Fuversionuprintuget_distributionusysuexitusplituget_config_varsudistributionuget_nameuget_versionuget_fullnameugetattruconfig_varsusiteuENABLE_USER_SITEuinstall_userbaseuinstall_usersiteuuserucreate_home_pathuNoneuDistutilsPlatformErroruinstall_baseuinstall_platbaseuosunameu
select_schemeuexpand_basedirsuexpand_dirsu_expandu
script_diruinstall_diru
no_find_linksuFalseuset_undefined_optionsuinstall_purelibuinstall_scriptsumapunormalize_pathupathu
get_site_dirsu
all_site_dirsu	site_dirsuisdiruloguwarnuDistutilsOptionErroruappendueditableucheck_site_diru	index_urlushadow_pathuinsertuallow_hostsu
package_indexucreate_indexuEnvironmentulocal_indexu
find_linksu
isinstanceu
basestringulocal_snapshots_okuscan_egg_linksuadd_find_linksuoptimizeuintu
ValueErrorubuild_directoryuDistutilsArgErroruargsuoutputs(	uselfu
py_versionuprefixuexec_prefixunormpathu	site_dirsudu	path_itemuhosts((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyufinalize_options�s�	
	


		
	
"	!			

	ueasy_install.finalize_optionscCs�x�|D]y}t||�}|dk	rtjdksFtjdkr[tjj|�}nt||j�}t|||�qqWdS(Nuposixunt(	ugetattruNoneuosunameupathu
expanduseru
subst_varsuconfig_varsusetattr(uselfuattrsuattruval((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
_expand_attrsMs
ueasy_install._expand_attrscCs|jdddg�dS(uNCalls `os.path.expanduser` on install_base, install_platbase and
        root.uinstall_baseuinstall_platbaseurootN(u
_expand_attrs(uself((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuexpand_basedirsVsueasy_install.expand_basedirscCs#|jddddddg�dS(u+Calls `os.path.expanduser` on install dirs.uinstall_purelibuinstall_platlibuinstall_libuinstall_headersuinstall_scriptsuinstall_dataN(u
_expand_attrs(uself((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuexpand_dirs[sueasy_install.expand_dirscCs|j|jjkr(tj|j�nz�x%|jD]}|j||j�q5W|jr�|j}|j	r�t
|j	�}x5tt
|��D]}|||d�||<q�Wnddlm
}|j|j|j|fd|j�n|j�Wdtj|jj�XdS(Ni(u	file_utilu'writing list of installed files to '%s'(uverboseudistributionulogu
set_verbosityuargsueasy_installuno_depsurecorduoutputsurootulenurangeu	distutilsu	file_utiluexecuteu
write_fileuwarn_deprecated_options(uselfuspecuoutputsuroot_lenucounteru	file_util((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyurunas$			ueasy_install.runc
CsGytj�}Wntjdt�}YnXtjj|jd|�S(u�Return a pseudo-tempname base in the install directory.
        This code is intentionally naive; if a malicious party can write to
        the target directory you're already in deep doodoo.
        iutest-easy-install-%s(uosugetpidurandomurandintumaxsizeupathujoinuinstall_dir(uselfupid((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyupseudo_tempnamews
ueasy_install.pseudo_tempnamecCsdS(N((uself((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuwarn_deprecated_options�su$easy_install.warn_deprecated_optionscCs�t|j�}tjj|d�}||jk}|rS|jrS|j�}n�|j�d}tjj	|�}y:|r�tj
|�nt|d�j�tj
|�Wn"t
tfk
r�|j�YnX|r�|jr�t|j���n|r*|jdkr3t||j�|_q3n	d|_tjjdd�jtj�}|ttdd�|D��kr�d	|_n1|jr�tjj	|�r�d	|_d|_n||_dS(
u;Verify that self.install_dir is .pth-capable dir, if neededueasy-install.pthu.write-testuwu
PYTHONPATHucSsg|]}|r|�qS(((u.0u_f((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
<listcomp>�s	u/easy_install.check_site_dir.<locals>.<listcomp>NT(unormalize_pathuinstall_diruosupathujoinu
all_site_dirsu
multi_versionucheck_pth_processingupseudo_tempnameuexistsuunlinkuopenucloseuOSErroruIOErrorucant_write_to_targetuDistutilsErroruno_default_version_msgupth_fileuNoneuPthDistributionsuenvironugetusplitupathsepumapuTrueusitepy_installed(uselfuinstdirupth_fileuis_site_dirutestfileutest_existsu
PYTHONPATH((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyucheck_site_dir�s6	!"	ueasy_install.check_site_dircCs_d}|tj�d|jf}tjj|j�sE|d7}n
|d7}t|��dS(Nucan't create or remove files in install directory

The following error occurred while trying to add or remove files in the
installation directory:

    %s

The installation directory you specified (via --install-dir, --prefix, or
the distutils default setting) was:

    %s
iu�
This directory does not currently exist.  Please create it and try again, or
choose a different installation directory (using the -d or --install-dir
option).
uK
Perhaps your account does not have write access to this directory?  If the
installation directory is a system-owned directory, you may need to sign in
as the administrator or "root" account.  If you do not have administrative
access to this machine, you may wish to choose a different installation
directory, preferably one that is listed in your PYTHONPATH environment
variable.

For information on other options, you may wish to consult the
documentation at:

  https://pythonhosted.org/setuptools/easy_install.html

Please make the appropriate changes for your system and try again.
(usysuexc_infouinstall_diruosupathuexistsuDistutilsError(uselfutemplateumsg((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyucant_write_to_target�s
u!easy_install.cant_write_to_targetcCs.|j}tjd|�|j�d}|d}tjj|�}y]|r^tj|�ntjj|�}tjj|�s�tj	|�nt
|d�}Wn"ttfk
r�|j
�YnHXz�|jd|f�|j�d}tj}tjdkrctjj|�\}}tjj|d�}	|j�dkrctjj|	�rc|	}qcnd	d
lm}
|
|ddd
gd	�tjj|�r�tjd|�dSWd|r�|j�ntjj|�r�tj|�ntjj|�r
tj|�nX|js*tjd|�ndS(u@Empirically verify whether .pth files are supported in inst. diru Checking .pth file support in %su.pthu.okuwu7import os; f = open(%r, 'w'); f.write('OK'); f.close()
untupythonw.exeu
python.exei(uspawnu-Eu-cupassu-TEST PASSED: %s appears to support .pth filesNu+TEST FAILED: %s does NOT support .pth filesTF(uinstall_diruloguinfoupseudo_tempnameuosupathuexistsuunlinkudirnameumakedirsuopenuOSErroruIOErrorucant_write_to_targetuwriteucloseuNoneusysu
executableunameusplitujoinulowerudistutils.spawnuspawnuTrueu
multi_versionuwarnuFalse(uselfuinstdirupth_fileuok_fileu	ok_existsudirnameufu
executableubasenameualtuspawn((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyucheck_pth_processing�sP	

	$
	u!easy_install.check_pth_processingcCs�|jro|jd�roxS|jd�D]?}|jd|�rHq)n|j|||jd|��q)Wn|j|�dS(u=Write all the scripts for `dist`, unless scripts are excludeduscriptsuscripts/N(uexclude_scriptsumetadata_isdirumetadata_listdiruinstall_scriptuget_metadatauinstall_wrapper_scripts(uselfudistuscript_name((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuinstall_egg_scriptssu easy_install.install_egg_scriptscCs|tjj|�rhxctj|�D]?\}}}x-|D]%}|jjtjj||��q8Wq"Wn|jj|�dS(N(uosupathuisdiruwalkuoutputsuappendujoin(uselfupathubaseudirsufilesufilename((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
add_outputs

*ueasy_install.add_outputcCs#|jrtd|f��ndS(NujInvalid argument %r: you can't use filenames or URLs with --editable (except via the --find-links option).(ueditableuDistutilsArgError(uselfuspec((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyunot_editables	ueasy_install.not_editablecCsW|js
dStjjtjj|j|j��rStd|j|jf��ndS(Nu2%r already exists in %s; can't do a checkout there(ueditableuosupathuexistsujoinubuild_directoryukeyuDistutilsArgError(uselfuspec((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyucheck_editable$s	'ueasy_install.check_editablec
Cs�tjdd�}d}|js.|j�nzYt|t�s�t|�r�|j|�|j	j
||�}|jd|||d�St
jj|�r�|j|�|jd|||d�St|�}n|j|�|j	j|||j|j|j|j�}|dkrDd|}|jr5|d7}nt|��nB|jtkrm|j|||d�|S|j||j||�SWdt
jj|�r�t|�nXdS(Nuprefixu
easy_install-u+Could not find suitable distribution for %ru2 (--always-copy skips system and development eggs)uUsingT(utempfileumkdtempuNoneueditableuinstall_site_pyu
isinstanceuRequirementu
URL_SCHEMEunot_editableu
package_indexudownloaduinstall_itemuTrueuosupathuexistsuparse_requirement_argucheck_editableufetch_distributionuupgradeualways_copyulocal_indexuDistutilsErroru
precedenceuDEVELOP_DISTuprocess_distributionulocationurmtree(uselfuspecudepsutmpdirudownloadudistumsg((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyueasy_install.s:	



	
	
ueasy_install.easy_installcCs�|p|j}|p*tjj|�|k}|p@|jd�}|p||jdk	o|tjjt|��t|j�k}|r�|r�x4|j|j	D]}|j
|kr�Pq�q�Wd}ntj
dtjj|��|r!|j|||�}xP|D]}|j|||�qWn,|j|�g}|j||d|d�|dk	r}x!|D]}||kr`|Sq`WndS(Nu.eggu
Processing %siuUsingT(ualways_copyuosupathudirnameuendswithualways_copy_fromuNoneunormalize_pathulocal_indexuproject_nameulocationuTrueuloguinfoubasenameuinstall_eggsuprocess_distributionuegg_distribution(uselfuspecudownloadutmpdirudepsuinstall_neededudistudists((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuinstall_itemWs.
	

ueasy_install.install_itemcCsUt|}xDtD]<}d|}t||�dkrt||||�qqWdS(u=Sets the install directories by applying the install schemes.uinstall_N(uINSTALL_SCHEMESuSCHEME_KEYSugetattruNoneusetattr(uselfunameuschemeukeyuattrname((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
select_scheme{s



ueasy_install.select_schemecGs6|j|�|jj|�|jj|�|j|�||j|j<tj|j	|||��|j
d�r�|jr�|jj|j
d��n|r�|jr�dS|dk	r�|j|jkr�tjd|�dS|dks�||kr0|j�}|p|}t|j|j|j�}ntjd|�y(tg�j|g|j|j�}Wnitk
r�tj�d}td|j��Yn5tk
r�tj�d}td|j��YnX|js�|jr"x9|D].}|j|jkr�|j|j��q�q�Wntjd|�dS(Nudependency_links.txtuSkipping dependencies for %suProcessing dependencies for %siu'Could not find required distribution %su7Installed distribution %s conflicts with requirement %su'Finished processing dependencies for %s( u
update_pthu
package_indexuaddulocal_indexuinstall_egg_scriptsuinstalled_projectsukeyuloguinfouinstallation_reportuhas_metadatau
no_find_linksuadd_find_linksuget_metadata_linesualways_copyuNoneuwarnuas_requirementuRequirementuproject_nameuspecsuextrasu
WorkingSeturesolveueasy_installuDistributionNotFoundusysuexc_infouDistutilsErroruargsuVersionConflictualways_copy_from(uselfurequirementudistudepsuinfoudistrequdistrosue((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuprocess_distribution�sL


	


u!easy_install.process_distributioncCsA|jdk	r|jS|jd�r*dS|jd�s=dSdS(Nunot-zip-safeuzip-safeTF(uzip_okuNoneuhas_metadatauTrueuFalse(uselfudist((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyushould_unzip�sueasy_install.should_unzipcCstjj|j|j�}tjj|�rSd}tj||j|j|�|Stjj|�rn|}n�tjj	|�|kr�tj
|�ntj|�}t|�dkr�tjj||d�}tjj|�r�|}q�nt
|�tj||�|S(Nu<%r already exists in %s; build directory %s will not be keptii(uosupathujoinubuild_directoryukeyuexistsuloguwarnuisdirudirnameuunlinkulistdirulenuensure_directoryushutilumove(uselfuspecu
dist_filenameu
setup_baseudstumsgucontents((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
maybe_move�s"	
ueasy_install.maybe_movecCs4|js0x$t|�D]}|j|�qWndS(N(uexclude_scriptsuget_script_argsuwrite_script(uselfudistuargs((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuinstall_wrapper_scripts�s	u$easy_install.install_wrapper_scriptscs�t|j��}t||�}�fdd�}|rzd�|rZ�jdd��nt|�|��t�}n|j|t|�d�dS(u/Generate a legacy script wrapper and install itcs4td��}|jd�}|jdd�}|S(um
            There are a couple of template scripts in the package. This
            function loads one of them and prepares it for use.

            These templates use triple-quotes to escape variable
            substitutions so the scripts get the 2to3 treatment when build
            on Python 3. The templates cannot use triple-quotes naturally.
            u
setuptoolsuutf-8u"""u(uresource_stringudecodeureplace(ufilenameu	raw_bytesutemplate_struclean_template(u
template_name(u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuget_template�s	u1easy_install.install_script.<locals>.get_templateuscript template.pyu.pyu	 (dev).pyubN(ustruas_requirementuis_python_scriptureplaceuget_script_headerulocalsuwrite_scriptu	_to_ascii(uselfudistuscript_nameuscript_textudev_pathuspecu	is_scriptuget_template((u
template_nameu8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuinstall_script�s	ueasy_install.install_scriptutcs��j�fdd�|D��tjd|�j�tjj�j|�}�j|�t�}�j	s�t
|�tjj|�r�tj|�nt
|d|�}|j|�|j�t|d|�ndS(u1Write an executable file to the scripts directorycs(g|]}tjj�j|��qS((uosupathujoinu
script_dir(u.0ux(uself(u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
<listcomp>�s	u-easy_install.write_script.<locals>.<listcomp>uInstalling %s script to %suwi�N(udelete_blockersuloguinfou
script_diruosupathujoinu
add_outputu
current_umaskudry_runuensure_directoryuexistsuunlinkuopenuwriteucloseuchmod(uselfuscript_nameucontentsumodeublockersutargetumaskuf((uselfu8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuwrite_script�s
		


ueasy_install.write_scriptcCs�|j�jd�r(|j||�gS|j�jd�rP|j||�gS|}tjj|�r�|jd�r�t|||j�n'tjj	|�r�tjj
|�}n|j|�r�|jr�|dk	r�|j|||�}ntjj|d�}tjj|�s�ttjj|dd��}|s[tdtjj
|���nt|�dkr�tdtjj
|���n|d	}n|jr�tj|j||��gS|j||�SdS(
Nu.eggu.exeu.pyusetup.pyu*u"Couldn't find a setup script in %siuMultiple setup scripts in %si(uloweruendswithuinstall_egguinstall_exeuosupathuisfileuunpack_archiveuunpack_progressuisdiruabspathu
startswithubuild_directoryuNoneu
maybe_moveujoinuexistsuglobuDistutilsErrorulenueditableuloguinfoureport_editableubuild_and_install(uselfuspecu
dist_filenameutmpdiru
setup_baseusetup_scriptusetups((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuinstall_eggss4"
	ueasy_install.install_eggscCs[tjj|�r3t|tjj|d��}nttj|��}tj	|d|�S(NuEGG-INFOumetadata(
uosupathuisdiruPathMetadataujoinuEggMetadatau	zipimportuzipimporteruDistributionu
from_filename(uselfuegg_pathumetadata((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuegg_distribution+s!ueasy_install.egg_distributioncCs�tjj|jtjj|��}tjj|�}|jsLt|�n|j|�}t	||�s�tjj
|�r�tjj|�r�tj
|d|j�n2tjj|�r�|jtj|fd|�nt|�tjj
|�r+|j|�rtjd}}q�tjd}}na|j|�rZ|j|�|jd}}n2|j|�r|tjd}}ntjd}}|j|||f|dtjj|�tjj|�f�n|j|�|j|�S(Nudry_runu	Removing uMovinguCopyingu
Extractingu	 %s to %s(uosupathujoinuinstall_dirubasenameuabspathudry_runuensure_directoryuegg_distributionusamefileuisdiruislinkudir_utiluremove_treeuexistsuexecuteuunlinkuuncache_zipdiru
startswithushutilumoveucopytreeushould_unzipumkpathuunpack_and_compileucopy2udirnameu
add_output(uselfuegg_pathutmpdirudestinationudistufum((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuinstall_egg2s4$	
% 

)
ueasy_install.install_eggcs�t|�}|dkr+td|��ntdd|jdd�d|jdd�dt��}tjj||j	�d�}|_
|d}tjj|d	�}tjj|d
�}t|�t||�|_
|j||�tjj|�s}t|d�}	|	jd�xU|jd�D]D\}
}|
d
kr(|	jd|
jdd�j�|f�q(q(W|	j�ntjj|d��|j�fdd�t|�D��tj||d|jd|j�|j||�S(Nu(%s is not a valid distutils Windows .exeuproject_nameumetadataunameuversionuplatformu.eggu.tmpuEGG-INFOuPKG-INFOuwuMetadata-Version: 1.0
utarget_versionu%s: %s
u_u-uscriptscs)g|]}tjj�|d��qS(i(uosupathujoin(u.0uargs(u
script_dir(u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
<listcomp>ts	u,easy_install.install_exe.<locals>.<listcomp>uverboseudry_run(uextract_wininst_cfguNoneuDistutilsErroruDistributionugetuget_platformuosupathujoinuegg_nameulocationuensure_directoryuPathMetadatau	_provideru
exe_to_egguexistsuopenuwriteuitemsureplaceutitleucloseudelete_blockersuget_script_argsu	bdist_eggumake_zipfileuverboseudry_runuinstall_egg(uselfu
dist_filenameutmpdirucfgudistuegg_pathuegg_tmpu	_egg_infoupkg_infufukuv((u
script_diru8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuinstall_exeSs8&


0
 ueasy_install.install_execs�t|��g�g�i������fdd�}t|�|�g}x��D]�}|j�jd�rY|jd�}|d}tj|d�d|d<tjj	�|�}�j
|�|j
|�tj||�qYqYW|j��tj
tjj	�d�tj�|��x�dD]�}	t�|	r-tjj	�d|	d
�}
tjj|
�s�t|
d�}|jdj	t�|	�d�|j�q�q-q-Wd
S(u;Extract a bdist_wininst to the directories an egg would usecsR|j�}x�D]\}}|j|�r||t|�d�}|jd�}tjj�|�}|j�}|jd�s�|jd�r�tj	|d
�|d<d�tjj
|d�d<�j|�nI|jd�r$|dkr$d�tjj
|d�d<�j|�n|SqW|jd�sNtj
d	|�ndS(Nu/u.pydu.dlliiu.pyuSCRIPTS/u.pthuWARNING: can't process %si����i����(uloweru
startswithulenusplituosupathujoinuendswithu	bdist_eggustrip_moduleusplitextuappenduloguwarnuNone(usrcudstusuoldunewupartsudl(uegg_tmpunative_libsuprefixesu
to_compileu	top_level(u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuprocess�s$u(easy_install.exe_to_egg.<locals>.processu.pydu/iu.pyuEGG-INFOu	top_levelunative_libsu.txtuwu
Ni����i����i����(u	top_levelunative_libs(uget_exe_prefixesuunpack_archiveuloweruendswithusplitu	bdist_eggustrip_moduleuosupathujoinuappendu
write_stububyte_compileuwrite_safety_flaguanalyze_eggulocalsuexistsuopenuwriteuclose(uselfu
dist_filenameuegg_tmpuprocessustubsuresupartsuresourceupyfileunameutxtuf((uegg_tmpunative_libsuprefixesu
to_compileu	top_levelu8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
exe_to_egg}s4






!ueasy_install.exe_to_eggu	Installedc	Cszd}|jrN|jrN|d7}|jtttj�krN|d7}qNn|j}|j}|j	}d}|t
�S(u9Helpful installation message for display to package usersu
%(what)s %(eggloc)s%(extras)su�

Because this distribution was installed --multi-version, before you can
import modules from this package in an application, you will need to
'import pkg_resources' and then use a 'require()' call similar to one of
these examples, in order to select the desired version:

    pkg_resources.require("%(name)s")  # latest installed version
    pkg_resources.require("%(name)s==%(version)s")  # this exact version
    pkg_resources.require("%(name)s>=%(version)s")  # this version or higher
u�

Note also that the installation directory must be on sys.path at runtime for
this to work.  (e.g. by being the application's script directory, by being on
PYTHONPATH, or by being added to sys.path by your code.)
u(u
multi_versionu	no_reportuinstall_dirumapunormalize_pathusysupathulocationuproject_nameuversionulocals(	uselfurequdistuwhatumsguegglocunameuversionuextras((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuinstallation_report�s

			u easy_install.installation_reportcCs&tjj|�}tj}dt�S(Nu"
Extracted editable version of %(spec)s to %(dirname)s

If it uses setuptools in its setup script, you can activate it in
"development" mode by going to that directory and running::

    %(python)s setup.py develop

See the setuptools documentation for the "develop" command for more info.
(uosupathudirnameusysu
executableulocals(uselfuspecusetup_scriptudirnameupython((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyureport_editable�s		ueasy_install.report_editablecCs+tjjdt�tjjdt�t|�}|jdkrid|jd}|jdd|�n"|jdkr�|jdd�n|jr�|jdd	�nt	j
d
|t|�dd�dj|��yt
||�Wn<tk
r&tj�d}td|jdf��YnXdS(
Nudistutils.command.bdist_eggudistutils.command.egg_infoiuviiu-u-qu-nu
Running %s %su uSetup script exited with %s(usysumodulesu
setdefaultu	bdist_egguegg_infoulistuverboseuinsertudry_runuloguinfoulenujoinu	run_setupu
SystemExituexc_infouDistutilsErroruargs(uselfusetup_scriptu
setup_baseuargsuv((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu	run_setup�s"	*
ueasy_install.run_setupc	Csddg}tjdddtjj|��}z�|jtjj|��|j|�|j|||�t|g�}g}x?|D]7}x.||D]"}|j|j	|j
|��q�Wq�W|r�|jr�tj
d|�n|SWdt|�tj|j�XdS(Nu	bdist_eggu
--dist-diruprefixu
egg-dist-tmp-udiru+No eggs found in %s (setup script problem?)(utempfileumkdtempuosupathudirnameu_set_fetcher_optionsuappendu	run_setupuEnvironmentuinstall_eggulocationudry_runuloguwarnurmtreeu
set_verbosityuverbose(	uselfusetup_scriptu
setup_baseuargsudist_diruall_eggsueggsukeyudist((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyubuild_and_install�s$	

$	

ueasy_install.build_and_installc	Cs�|jjd�j�}d}i}xF|j�D]8\}}||krOq1n|d||jdd	�<q1Wtd|�}tjj|d
�}t	j
||�dS(
u
        When easy_install is about to run bdist_egg on a source dist, that
        source dist might have 'setup_requires' directives, requiring
        additional fetching. Ensure the fetcher options given to easy_install
        are available to that command as well.
        ueasy_installu
find_linksu	site_dirsu	index_urluoptimizeuallow_hostsiu_u-u	setup.cfgN(u
find_linksu	site_dirsu	index_urluoptimizeu	site_dirsuallow_hosts(udistributionuget_option_dictucopyuitemsureplaceudictuosupathujoinusetoptuedit_config(	uselfubaseuei_optsufetch_directivesu
fetch_optionsukeyuvalusettingsucfg_filename((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu_set_fetcher_optionss	u!easy_install._set_fetcher_optionscCs�|jdkrdSx~|j|jD]l}|jsE|j|jkr$tjd|�|jj|�|j|jkr�|jj|j�q�q$q$W|js|j|jj	kr�tjd|�qtjd|�|jj
|�|j|jkr|jj|j�qn|js�|jj
�|jdkr�tjj|jd�}tjj|�rotj|�nt|d�}|j|jj|j�d�|j�q�ndS(Nu&Removing %s from easy-install.pth fileu4%s is already the active version in easy-install.pthu"Adding %s to easy-install.pth fileu
setuptoolsusetuptools.pthuwtu
(upth_fileuNoneukeyu
multi_versionulocationuloguinfouremoveushadow_pathupathsuadduappendudry_runusaveuosupathujoinuinstall_diruislinkuunlinkuopenuwriteu
make_relativeuclose(uselfudistudufilenameuf((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
update_pths4	
	
 ueasy_install.update_pthcCstjd||�|S(NuUnpacking %s to %s(ulogudebug(uselfusrcudst((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuunpack_progress@sueasy_install.unpack_progresscs�g�g����fdd�}t|||��j���js�x<�D]1}tj|�tjdBd@}t||�qQWndS(Ncs�|jd�r/|jd�r/�j|�n.|jd�sM|jd�r]�j|�n�j||��jr}|p�dS(Nu.pyu	EGG-INFO/u.dllu.so(uendswithu
startswithuappenduunpack_progressudry_runuNone(usrcudst(uselfuto_chmodu
to_compile(u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyupfIsu+easy_install.unpack_and_compile.<locals>.pfimi�(uunpack_archiveubyte_compileudry_runuosustatuST_MODEuchmod(uselfuegg_pathudestinationupfufumode((uselfuto_chmodu
to_compileu8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuunpack_and_compileEs
	
ueasy_install.unpack_and_compilecCs�tr|jd�dSddlm}zetj|jd�||ddddd|j�|jr�||d|jddd|j�nWdtj|j�XdS(Nu%byte-compiling is disabled, skipping.i(ubyte_compileiuoptimizeuforceudry_run(	u_dont_write_bytecodeuwarnudistutils.utilubyte_compileulogu
set_verbosityuverboseudry_runuoptimize(uselfu
to_compileubyte_compile((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyubyte_compileXs
	ueasy_install.byte_compilecCs&d}||jtjjdd�fS(Nu�bad install directory or PYTHONPATH

You are attempting to install a package to a directory that is not
on PYTHONPATH and which Python does not read ".pth" files from.  The
installation directory you specified (via --install-dir, --prefix, or
the distutils default setting) was:

    %s

and your PYTHONPATH environment variable currently contains:

    %r

Here are some of your options for correcting the problem:

* You can choose a different installation directory, i.e., one that is
  on PYTHONPATH or supports .pth files

* You can add the installation directory to the PYTHONPATH environment
  variable.  (It must then also be on PYTHONPATH whenever you run
  Python and want to use the package(s) you are installing.)

* You can set up the installation directory to support ".pth" files by
  using one of the approaches described here:

  https://pythonhosted.org/setuptools/easy_install.html#custom-installation-locations

Please make the appropriate changes for your system and try again.u
PYTHONPATHu(uinstall_diruosuenvironuget(uselfutemplate((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuno_default_version_msgksu#easy_install.no_default_version_msgcCs?|jr
dStjj|jd�}tdd�}d}tjj|�r�tjd|j�t	|d�}|j
�}tjd
kr�|j
�}n|j�|jd	�s�td
|��q�n||kr2tjd|�|jst|�t	|d�}|j|�|j�n|j|g�nd|_dS(u8Make sure there's a site.py in the target dir, if neededNusite.pyu
setuptoolsu
site-patch.pyuuChecking existing site.py in %surbiu
def __boot():u;%s is not a setuptools-generated site.py; please remove it.uCreating %suwb(iT(usitepy_installeduosupathujoinuinstall_diruresource_stringuexistsulogudebuguopenureadusysuversion_infoudecodeucloseu
startswithuDistutilsErroruinfoudry_runuensure_directoryuwriteubyte_compileuTrue(uselfusitepyusourceucurrentuf((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuinstall_site_py�s2	
	


ueasy_install.install_site_pycCs�|js
dSttjjd��}xct|j�D]R\}}|j|�r5tjj|�r5|j	d|�tj
|d�q5q5WdS(uCreate directories under ~.Nu~uos.makedirs('%s', 0700)i�(uuseruconvert_pathuosupathu
expanduseru	iteritemsuconfig_varsu
startswithuisdirudebug_printumakedirs(uselfuhomeunameupath((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyucreate_home_path�s	"ueasy_install.create_home_pathuposixuinstall_diru/$base/lib/python$py_version_short/site-packagesu
script_diru	$base/binu$base/Lib/site-packagesu
$base/ScriptscGs |jd�j}|jr�|j�}|j|d<|jjtj|j�}xH|j	�D]7\}}t
||d�dkr\t|||�q\q\Wnddl
m}xo|D]g}t
||�}|dk	r�|||�}tjdkrtjj|�}nt|||�q�q�WdS(Nuinstallubasei(u
subst_varsuposix(uget_finalized_commanduconfig_varsuprefixucopyuINSTALL_SCHEMESugetuosunameuDEFAULT_SCHEMEuitemsugetattruNoneusetattrudistutils.utilu
subst_varsupathu
expanduser(uselfuattrsuconfig_varsuschemeuattruvalu
subst_vars((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu_expand�s 	

ueasy_install._expandNT(uprefix=Nuinstallation prefix(uzip-okuzuinstall package as a zipfile(u
multi-versionumu%make apps have to require() a version(uupgradeuUu1force upgrade (searches PyPI for latest versions)(uinstall-dir=uduinstall package to DIR(uscript-dir=usuinstall scripts to DIR(uexclude-scriptsuxuDon't install scripts(ualways-copyuau'Copy all needed packages to install dir(u
index-url=uiu base URL of Python Package Index(ufind-links=ufu(additional URL(s) to search for packages(ubuild-directory=ubu/download/extract/build in DIR; keep the results(u	optimize=uOulalso compile with optimization: -O1 for "python -O", -O2 for "python -OO", and -O0 to disable [default: -O0](urecord=Nu3filename in which to record list of installed files(ualways-unzipuZu*don't install as a zipfile, no matter what(u
site-dirs=uSu)list of directories where .pth files work(ueditableueu+Install specified packages in editable form(uno-depsuNudon't install dependencies(uallow-hosts=uHu$pattern(s) that hostnames must match(ulocal-snapshots-okulu(allow building eggs from local checkouts(uversionNu"print version information and exit(u
no-find-linksNu9Don't load find-links defined in packages being installedF(Au__name__u
__module__u__qualname__u__doc__udescriptionuTrueucommand_consumes_argumentsuNoneuuser_optionsuboolean_optionsusiteuENABLE_USER_SITEu	USER_SITEuhelp_msguappendunegative_optuPackageIndexucreate_indexuinitialize_optionsudelete_blockersufinalize_optionsu
_expand_attrsuexpand_basedirsuexpand_dirsurunupseudo_tempnameuwarn_deprecated_optionsucheck_site_dirucant_write_to_targetucheck_pth_processinguinstall_egg_scriptsu
add_outputunot_editableucheck_editableuFalseueasy_installuinstall_itemu
select_schemeuprocess_distributionushould_unzipu
maybe_moveuinstall_wrapper_scriptsuinstall_scriptuwrite_scriptuinstall_eggsuegg_distributionuinstall_egguinstall_exeu
exe_to_egguinstallation_reportureport_editableu	run_setupubuild_and_installu_set_fetcher_optionsu
update_pthuunpack_progressuunpack_and_compileubyte_compileuno_default_version_msguinstall_site_pyucreate_home_pathudictuINSTALL_SCHEMESuDEFAULT_SCHEMEu_expand(u
__locals__((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyueasy_install_s�		

3
�	*'0
)$	/	(!*2
$$
	c	Csdd�tjjdd�jtj�D�}tjg}tjtjkr_|jtj�nx8|D]0}|rftj	dkr�|jtj
j|dd��n�tjd	kr|j
tj
j|d
dtjdd�d�tj
j|d
d
�g�n%|j
|tj
j|d
d�g�tj	dkr�d|kr�tjjd�}|r�|jtj
j|ddtjdd�d��q�q�q�qfqfWtd�td�f}x*|D]"}||kr�|j|�q�q�Wtjr�|jtj�nttt|��}|S(NcSsg|]}|r|�qS(((u.0u_f((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
<listcomp>�s	u!get_site_dirs.<locals>.<listcomp>u
PYTHONPATHuuos2emxuriscosuLibu
site-packagesu/ulibupythoniusite-pythonudarwinuPython.frameworkuHOMEuLibraryuPythonupurelibuplatlib(uos2emxuriscos(uosuenvironugetusplitupathsepusysuprefixuexec_prefixuappenduplatformupathujoinusepuextenduversionuget_pathusiteuENABLE_USER_SITEu	USER_SITEulistumapunormalize_path(usitedirsuprefixesuprefixuhomeu	lib_pathsusite_lib((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
get_site_dirs�sF
"
	u
get_site_dirsccs^i}xQ|D]I}t|�}||kr1q
nd||<tjj|�sSq
ntj|�}||fVx�|D]�}|jd�s�qtn|dkr�qtnttjj||��}tt	|��}|j
�xw|D]o}|jd�s�t|j��}||krNd||<tjj|�s4q�n|tj|�fVqNq�q�WqtWq
WdS(uBYield sys.path directories that might contain "old-style" packagesiu.pthueasy-install.pthusetuptools.pthuimportN(ueasy-install.pthusetuptools.pth(
unormalize_pathuosupathuisdirulistdiruendswithuopenujoinulistuyield_linesucloseu
startswithurstrip(uinputsuseenudirnameufilesunameufulinesuline((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuexpand_pathss4





uexpand_pathscCs�t|d�}z�tj|�}|dkr1dS|d|d|d}|dkr[dS|j|d�ddlm}m}ddl}|j	d	|j
d��\}}}	|dkr�dS|j|d|�|jidd
6dd6�}
y~|j
|�}tj
dkr'tdg�}ntd�}|j|d�d}
|
jtj��}
|
j||
��Wn|jk
r�dSYnX|
jd�s�|
jd�r�dS|
SWd|j�XdS(unExtract configuration data from a bdist_wininst .exe

    Returns a ConfigParser.RawConfigParser, or None
    urbi	iiii(uStringIOuConfigParserNu<iiiizV4i{V4uuversionutarget_versioniiumetadatauSetup(izV4i{V4(ii(uopenuzipfileu_EndRecDatauNoneuseekusetuptools.compatuStringIOuConfigParserustructuunpackureaduRawConfigParserusysuversion_infoubytesuchrusplitudecodeugetfilesystemencodingureadfpuErroruhas_sectionuclose(u
dist_filenameufuendrecu	prependeduStringIOuConfigParserustructutagucfglenubmlenucfgupartu	null_byteuconfig((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuextract_wininst_cfg0s<$	 cCs�dddddg}tj|�}z}xv|j�D]h}|j}|jd�}t|�d	kr�|d
dkr�|djd
�r�|jddj|dd
��df�Pq�nt|�d
ks4|jd�r�q4n|jd�r�q4n|dj	�dkr4|j
|�}tjd kr7|j
�}nxbt|�D]Q}|j�jdd�}|jd�sD|jd|d|fdf�qDqDWq4q4WWd|j�Xdd�|D�}|j�|j�|S(!u4Get exe->egg path translations for a given .exe fileuPURELIB/uuPLATLIB/pywin32_system32uPLATLIB/uSCRIPTS/uEGG-INFO/scripts/uDATA/lib/site-packagesu/iiuPKG-INFOiu	.egg-infoiNu	EGG-INFO/u.pthu
-nspkg.pthuPURELIBuPLATLIBu\uimportu%s/%s/cSs(g|]\}}|j�|f�qS((ulower(u.0uxuy((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
<listcomp>s	u$get_exe_prefixes.<locals>.<listcomp>(uPURELIB/u(uPLATLIB/pywin32_system32u(uPLATLIB/u(uSCRIPTS/uEGG-INFO/scripts/(uDATA/lib/site-packagesu(uPURELIBuPLATLIB(i(uzipfileuZipFileuinfolistufilenameusplitulenuendswithuinsertujoinuupperureadusysuversion_infoudecodeuyield_linesustripureplaceu
startswithuappenducloseusortureverse(uexe_filenameuprefixesuzuinfounameupartsucontentsupth((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuget_exe_prefixes_s<		")"3

cCs=ytj|�SWn%tk
r8td|f��YnXdS(Nu1Not a URL, existing file, or requirement spec: %r(uRequirementuparseu
ValueErroruDistutilsError(uspec((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuparse_requirement_arg�s

uparse_requirement_argcBsk|EeZdZdZdZfdd�Zdd�Zdd�Zdd	�Z	d
d�Z
dd
�ZdS(uPthDistributionsu)A .pth file with Distribution paths in itcCs�||_ttt|��|_ttjj|j��|_|j	�t
j|gdd�x6t
|j�D]%}tt|jt|d���qoWdS(NT(ufilenameulistumapunormalize_pathusitedirsuosupathudirnameubasediru_loaduEnvironmentu__init__uNoneuyield_linesupathsuaddufind_distributionsuTrue(uselfufilenameusitedirsupath((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu__init__�s	
uPthDistributions.__init__cCs�g|_d}tj|j�}tjj|j�r3t	|jd�}x�|D]�}|j
d�rpd}qOn|j�}|jj
|�|j�sO|j�j
d�r�qOnttjj|j|��}|jd<tjj|�s�||kr|jj�d|_qOnd||<qOW|j�n|jrO|rOd|_nx.|jr|jdj�r|jj�qRWdS(	Nurtuimportu#iFTi����i����(upathsuFalseudictufromkeysusitedirsuosupathuisfileufilenameuopenu
startswithuTrueurstripuappendustripunormalize_pathujoinubasediruexistsupopudirtyuclose(uselfu
saw_importuseenufulineupath((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu_load�s2	
"&
	
 uPthDistributions._loadcCs�|js
dSdjt|j|j��}|r�tjd|j�d|}tj	j
|j�rvtj|j�nt|jd�}|j
|�|j�n;tj	j|j�r�tjd|j�tj|j�nd|_dS(u$Write changed .pth file back to diskNu
u	Saving %su�import sys; sys.__plen = len(sys.path)
%s
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)
uwtuDeleting empty %sF(udirtyujoinumapu
make_relativeupathsulogudebugufilenameuosupathuislinkuunlinkuopenuwriteucloseuexistsuFalse(uselfudatauf((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyusave�s 	

uPthDistributions.savecCsl|j|jkrX|j|jks9|jtj�krX|jj|j�d|_ntj	||�dS(u"Add `dist` to the distribution mapNT(
ulocationupathsusitedirsuosugetcwduappenduTrueudirtyuEnvironmentuadd(uselfudist((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuadd�suPthDistributions.addcCsIx2|j|jkr4|jj|j�d|_qWtj||�dS(u'Remove `dist` from the distribution mapNT(ulocationupathsuremoveuTrueudirtyuEnvironment(uselfudist((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuremove�s
uPthDistributions.removecCs�tjjt|��\}}t|j�}|g}tjdkrKdpQtj}xut|�|kr�||jkr�|jtj	�|j
�|j|�Stjj|�\}}|j|�qWW|SdS(Nu/(uosupathusplitunormalize_pathulenubasedirualtsepusepuappenducurdirureverseujoin(uselfupathunpathulastubaselenupartsusep((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
make_relative�s	

uPthDistributions.make_relativeNF(u__name__u
__module__u__qualname__u__doc__uFalseudirtyu__init__u_loadusaveuadduremoveu
make_relative(u
__locals__((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuPthDistributions�s	
cCs/ddlm}t|jt�s=tj|jj��}n|dj�d}|j	|�}d}|r�|j
d�p~d}|r�d|}q�n|r�d}nt|�}dt�}t
|�s|r|j�jd	�rd
|j�dd�}qqd
}nt||�}dt�}|S(u;Create a #! line, getting options (if any) from script_texti(u
first_line_reu
uiu u
python.exeu#!%(executable)s%(options)s
u-u -xN(udistutils.command.build_scriptsu
first_line_reu
isinstanceupatternustrureucompileudecodeu
splitlinesumatchugroupunt_quote_argulocalsuisasciiustripu
startswithufix_jython_executable(uscript_textu
executableuwininstu
first_line_reufirstumatchuoptionsuhdr((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuget_script_header�s,	
 	
uget_script_headercCsz|tjkr8tjdkr8t|tj�||�Stj�\}}}t||d|dd||ff�dS(Nuntiiu %s %s(	uosuremoveunameuchmodustatuS_IWRITEusysuexc_infoureraise(ufuncuarguexcuetuevu_((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
auto_chmods

u
auto_chmodcCs1ddlm}t||�t|tj�dS(u?Ensure that the importer caches dont have stale info for `path`i(u_zip_directory_cacheN(u	zipimportu_zip_directory_cacheu_uncacheusysupath_importer_cache(upathuzdc((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuuncache_zipdirs
uuncache_zipdircCsT||kr||=n:t|�}x+|D]#}t|�|kr)||=dSq)WdS(N(unormalize_path(upathucacheup((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu_uncache#s

u_uncacheu<string>cCs;yt||d�Wnttfk
r2dSYnXdSdS(u%Is this string a valid Python script?uexecNFT(ucompileuSyntaxErroru	TypeErroruFalseuTrue(utextufilename((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu	is_python-s
	u	is_pythoncCsRy)t|�}|jd�}|j�Wnttfk
rG|SYnX|dkS(uCDetermine if the specified executable is a .sh (contains a #! line)iu#!(uopenureaducloseuOSErroruIOError(u
executableufpumagic((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuis_sh6s	uis_shcCsg}d
}d}d|kp'd|k}|r@|jd�nx�|D]z}|dkrf|d7}qG|dkr�|jd|dd�d}qG|r�|jd|�d}n|j|�qGW|r�|jd|�n|r|jd|�|jd�nd	j|�S(u@Quote a command line argument according to Windows parsing rulesiu u	u"u\iiu\"uF(uFalseuappendujoin(uarguresultu	needquoteunbuc((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyunt_quote_arg?s,

		unt_quote_argcCsb|jd�s|jd�r"dSt||�r5dS|jd�r^d|j�dj�kSdS(uMIs this text, as a whole, a Python script? (as opposed to shell/bat/etc.
    u.pyu.pywu#!upythoniTF(uendswithuTrueu	is_pythonu
startswithu
splitlinesuloweruFalse(uscript_textufilename((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuis_python_script`suis_python_script(uchmodcGsdS(N((uargs((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu_chmodqsu_chmodcCs`tjd||�yt||�Wn5tjk
r[tj�d}tjd|�YnXdS(Nuchanging mode of %s to %oiuchmod failed: %s(ulogudebugu_chmoduosuerrorusysuexc_info(upathumodeue((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuchmodssuchmodcCsntjjd�rjt|�rjddl}|jjjd�dkrI|S|r_tj	d�qjd|Sn|S(Nujavaiuos.nameuLinuxu�WARNING: Unable to adapt shebang line for Jython, the following script is NOT executable
         see http://bugs.jython.org/issue1112 for more information.u/usr/bin/env %s(
usysuplatformu
startswithuis_shujavaulanguSystemugetPropertyuloguwarn(u
executableuoptionsujava((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyufix_jython_executable{s
ufix_jython_executablecBsk|EeZdZdZejd�j�Zee	d
dd��Zedd��Zedd��Z
d	S(uScriptWriteru`
    Encapsulates behavior around writing entry point scripts for console and
    gui apps.
    u6
        # EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r
        __requires__ = %(spec)r
        import sys
        from pkg_resources import load_entry_point

        if __name__ == '__main__':
            sys.exit(
                load_entry_point(%(spec)r, %(group)r, %(name)r)()
            )
    c
cs�|j|�}t|j��}td||�}xvdD]n}|d}x[|j|�j�D]D\}	}
|jt�}x%|j||	||�D]}|Vq�Wq`Wq:WdS(uW
        Yield write_script() argument tuples for a distribution's entrypoints
        uuconsoleuguiu_scriptsN(uconsoleugui(	u
get_writerustruas_requirementuget_script_headeru
get_entry_mapuitemsutemplateulocalsu_get_script_args(
uclsudistu
executableuwininstu	gen_classuspecuheaderutype_ugroupunameuepuscript_textures((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuget_script_args�s

"
uScriptWriter.get_script_argscCs#|stjdkrtj�S|S(Nuwin32(usysuplatformuWindowsScriptWriteru
get_writer(uclsu
force_windows((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
get_writer�s
uScriptWriter.get_writerccs|||fVdS(N((uclsutype_unameuheaderuscript_text((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu_get_script_args�suScriptWriter._get_script_argsNF(u__name__u
__module__u__qualname__u__doc__utextwrapudedentulstriputemplateuclassmethodusys_executableuFalseuget_script_argsu
get_writeru_get_script_args(u
__locals__((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuScriptWriter�s
uScriptWritercBsJ|EeZdZedd��Zedd��Zedd��ZdS(uWindowsScriptWritercCs2tdtd|�}tjjdd�}||S(u:
        Get a script writer suitable for Windows
        u
executableunaturaluSETUPTOOLS_LAUNCHER(udictuWindowsExecutableLauncherWriteruosuenvironuget(uclsu
writer_lookupulauncher((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
get_writer�s
	uWindowsScriptWriter.get_writerc#s�tdddd�|}|tjdj�jd�krRtjd|t�nddd	d
dddg}|j|�|j	||�}�fd
d�|D�}�|||d|fVdS(u For Windows, add a .py extensionuconsoleu.pyauguiu.pywuPATHEXTu;uH%s not listed in PATHEXT; scripts will not be recognized as executables.u.pyu
-script.pyu.pycu.pyou.execsg|]}�|�qS(((u.0ux(uname(u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
<listcomp>�s	u8WindowsScriptWriter._get_script_args.<locals>.<listcomp>utN(
udictuosuenvironulowerusplituwarningsuwarnuUserWarninguremoveu_adjust_header(uclsutype_unameuheaderuscript_textuextuoldublockers((unameu8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu_get_script_args�s"	
u$WindowsScriptWriter._get_script_argscCs�d}d}|dkr(||}}ntjtj|�tj�}|jd|d|�}|dd
�jd�}tjd	kr�tj	j
|�r�|S|S(u�
        Make sure 'pythonw' is used for gui and and 'python' is used for
        console (regardless of what sys.executable is).
        upythonw.exeu
python.exeuguiustringurepliiu"uwin32i����(ureucompileuescapeu
IGNORECASEusubustripusysuplatformuosupathuexists(utype_uorig_headerupatternureplu
pattern_obu
new_headeruclean_header((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu_adjust_header�s"u"WindowsScriptWriter._adjust_headerN(u__name__u
__module__u__qualname__uclassmethodu
get_writeru_get_script_argsustaticmethodu_adjust_header(u
__locals__((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuWindowsScriptWriter�s

uWindowsScriptWritercBs&|EeZdZedd��ZdS(uWindowsExecutableLauncherWriterc#s�|dkr$d}d}dg}nd}d}dddg}|j||�}�fd	d
�|D�}	�|||d|	fV�dt|�d
fVt�s��d}
|
t��dfVndS(uG
        For Windows, add a .py extension and an .exe launcher
        uguiu-script.pywu.pywucliu
-script.pyu.pyu.pycu.pyocsg|]}�|�qS(((u.0ux(uname(u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
<listcomp>�s	uDWindowsExecutableLauncherWriter._get_script_args.<locals>.<listcomp>utu.exeubu
.exe.manifestN(u_adjust_headeruget_win_launcheruis_64bituload_launcher_manifest(uclsutype_unameuheaderuscript_textu
launcher_typeuextuolduhdrublockersum_name((unameu8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu_get_script_args�s	
u0WindowsExecutableLauncherWriter._get_script_argsN(u__name__u
__module__u__qualname__uclassmethodu_get_script_args(u
__locals__((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuWindowsExecutableLauncherWriter�suWindowsExecutableLauncherWritercCstd|}tj�j�dkr7|jdd�}nt�rU|jdd�}n|jdd�}td|�S(u�
    Load the Windows launcher (executable) suitable for launching a script.

    `type` should be either 'cli' or 'gui'

    Returns the executable as a byte string.
    u%s.exeuarmu.u-arm.u-64.u-32.u
setuptools(uplatformumachineulowerureplaceuis_64bituresource_string(utypeulauncher_fn((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuget_win_launcher
s
	uget_win_launchercCsHtjtd�}tjddkr0|t�S|jd�t�SdS(Nulauncher manifest.xmliiuutf-8(u
pkg_resourcesuresource_stringu__name__usysuversion_infouvarsudecode(unameumanifest((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuload_launcher_manifestsuload_launcher_manifestcCs~|rdd�}n|dkr0dd�}ng}ytj|�}Wn.tjk
ry|tj|tj��YnXx�|D]�}tjj||�}ytj|�j	}Wntjk
r�d}YnXt
j|�r�t|||�q�ytj
|�Wq�tjk
r3|tj
|tj��Yq�Xq�Wytj|�Wn.tjk
ry|tj|tj��YnXdS(u�Recursively delete a directory tree.

    This code is taken from the Python 2.4 version of 'shutil', because
    the 2.3 version doesn't really work right.
    cWsdS(N((uargs((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuonerror,surmtree.<locals>.onerrorcWs�dS(N((uargs((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuonerror/siN(uNoneuosulistdiruerrorusysuexc_infoupathujoinulstatust_modeustatuS_ISDIRurmtreeuremoveurmdir(upathu
ignore_errorsuonerrorunamesunameufullnameumode((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyurmtree%s2
"urmtreecCs tjd�}tj|�|S(Ni(uosuumask(utmp((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
current_umaskHs
u
current_umaskcCsMddl}tjj|jd�}|tjd<tjj|�t�dS(Ni(	u
setuptoolsuosupathudirnameu__path__usysuargvuappendumain(u
setuptoolsuargv0((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu	bootstrapMs

u	bootstrapcs�ddlm�ddlm�ddl�d��fdd����fdd��G��fd	d
�d
����dkr�tjdd��n�����fdd
��dS(Ni(usetup(uDistributionuLusage: %(script)s [options] requirement_or_url ...
   or: %(script)s --help
cs�tdtjj|��S(Nuscript(udictuosupathubasename(uscript_name(uUSAGE(u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu	gen_usage_s	umain.<locals>.gen_usagecs7�jj}z��j_|�SWd|�j_XdS(N(ucoreu	gen_usage(ufu
old_gen_usage(u	distutilsu	gen_usage(u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
with_ei_usageds
umain.<locals>.with_ei_usagecs/|EeZdZdZ��fdd�ZdS(u-main.<locals>.DistributionWithoutHelpCommandsucs#�����fdd��dS(Ncs�j����S(N(u
_show_help((uDistributionuargsukwuself(u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu<lambda>psuJmain.<locals>.DistributionWithoutHelpCommands._show_help.<locals>.<lambda>((uselfuargsukw(uDistributionu
with_ei_usage(uargsukwuselfu8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu
_show_helposu8main.<locals>.DistributionWithoutHelpCommands._show_helpN(u__name__u
__module__u__qualname__ucommon_usageu
_show_help(u
__locals__(uDistributionu
with_ei_usage(u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyuDistributionWithoutHelpCommandslsuDistributionWithoutHelpCommandsic	s6�ddddg�dtjdp)dd���S(Nuscript_argsu-queasy_installu-vuscript_nameiu	distclass(usysuargv((uDistributionWithoutHelpCommandsuargvukwusetup(u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu<lambda>usumain.<locals>.<lambda>(u
setuptoolsusetupusetuptools.distuDistributionudistutils.coreuNoneusysuargv(uargvukw((	uDistributionuDistributionWithoutHelpCommandsuUSAGEuargvu	distutilsu	gen_usageukwusetupu
with_ei_usageu8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyumainUs(ru__doc__usysuosu	zipimportushutilutempfileuzipfileureustaturandomuplatformutextwrapuwarningsusiteustructuglobu	distutilsulogudir_utilu
pkg_resourcesu
setuptoolsuCommandu_dont_write_bytecodeusetuptools.sandboxu	run_setupusetuptools.py31compatuget_pathuget_config_varsudistutils.utiluget_platformuconvert_pathu
subst_varsudistutils.errorsuDistutilsArgErroruDistutilsOptionErroruDistutilsErroruDistutilsPlatformErrorudistutils.command.installuINSTALL_SCHEMESuSCHEME_KEYSusetuptools.commandusetoptusetuptools.archive_utiluunpack_archiveusetuptools.package_indexuPackageIndexu
URL_SCHEMEu	bdist_egguegg_infousetuptools.compatu	iteritemsumaxsizeu
basestringuunicodeureraiseuyield_linesunormalize_pathuresource_stringuensure_directoryuget_distributionufind_distributionsuEnvironmentuRequirementuDistributionuPathMetadatauEggMetadatau
WorkingSetuDistributionNotFounduVersionConflictuDEVELOP_DISTuenvironugetupathunormpathu
executableusys_executableu__all__uis_64bitusamefileuversion_infou	_to_asciiuisasciiueasy_installu
get_site_dirsuexpand_pathsuextract_wininst_cfguget_exe_prefixesuparse_requirement_arguPthDistributionsuFalseuget_script_headeru
auto_chmoduuncache_zipdiru_uncacheu	is_pythonuis_shunt_quote_arguis_python_scriptuchmodu_chmoduImportErrorufix_jython_executableuobjectuScriptWriteruWindowsScriptWriteruWindowsExecutableLauncherWriteruget_script_argsuget_win_launcheruload_launcher_manifesturmtreeu
current_umasku	bootstrapuNoneumain(((u8/tmp/pip-k8wh6o-build/setuptools/command/easy_install.pyu<module>
s�"(d	����~.)/&j
		!

..	#site-packages/setuptools/command/__pycache__/install_lib.cpython-33.pyc000064400000007534151733464030022271 0ustar00�
�Re�	c@s6ddlmZddlZGdd�de�ZdS(i(uinstall_libNcBsb|EeZdZdZdd�Zdd�Zdd�Zddd	dd
d�Zdd
�ZdS(uinstall_libu9Don't add compiled flags to filenames of non-Python filescCspg}xc|D][}|jd�s(q
n|jrE|j|d�n|jdkr
|j|d�q
q
W|S(Nu.pyuciuo(uendswithucompileuappenduoptimize(uselfupy_filenamesubytecode_filesupy_file((u7/tmp/pip-k8wh6o-build/setuptools/command/install_lib.pyu_bytecode_filenamess
	uinstall_lib._bytecode_filenamescCs6|j�|j�}|dk	r2|j|�ndS(N(ubuilduinstalluNoneubyte_compile(uselfuoutfiles((u7/tmp/pip-k8wh6o-build/setuptools/command/install_lib.pyuruns
uinstall_lib.runcCs�i}|jj}|r�|jd�jr�xy|D]n}|jd�}xV|r�tjj|j|�}x'dD]}d|tjj||�<qnW|j	�qIWq1Wn|S(Nuinstallu.u__init__.pyu__init__.pycu__init__.pyoi(u__init__.pyu__init__.pycu__init__.pyo(
udistributionunamespace_packagesuget_finalized_commandu!single_version_externally_managedusplituosupathujoinuinstall_dirupop(uselfuexcludeunspupkgupartsupkgdiruf((u7/tmp/pip-k8wh6o-build/setuptools/command/install_lib.pyuget_exclusionss
	
uinstall_lib.get_exclusionsiic	s�|r|r|st�|j���s>tj|||�Sddlm}ddlm�g����fdd�}||||��S(Ni(uunpack_directory(ulogcsP|�kr �jd|�dS�jd|tjj|���j|�|S(Nu/Skipping installation of %s (namespace package)ucopying %s -> %sF(uwarnuFalseuinfouosupathudirnameuappend(usrcudst(uexcludeuloguoutfiles(u7/tmp/pip-k8wh6o-build/setuptools/command/install_lib.pyupf;s
u!install_lib.copy_tree.<locals>.pf(uAssertionErroruget_exclusionsu_install_libu	copy_treeusetuptools.archive_utiluunpack_directoryu	distutilsulog(	uselfuinfileuoutfileu
preserve_modeupreserve_timesupreserve_symlinksuleveluunpack_directoryupf((uexcludeuloguoutfilesu7/tmp/pip-k8wh6o-build/setuptools/command/install_lib.pyu	copy_tree*s	uinstall_lib.copy_treecs<tj|�}|j���r8�fdd�|D�S|S(Ncs"g|]}|�kr|�qS(((u.0uf(uexclude(u7/tmp/pip-k8wh6o-build/setuptools/command/install_lib.pyu
<listcomp>Ks	u+install_lib.get_outputs.<locals>.<listcomp>(u_install_libuget_outputsuget_exclusions(uselfuoutputs((uexcludeu7/tmp/pip-k8wh6o-build/setuptools/command/install_lib.pyuget_outputsGs
uinstall_lib.get_outputsN(	u__name__u
__module__u__qualname__u__doc__u_bytecode_filenamesurunuget_exclusionsu	copy_treeuget_outputs(u
__locals__((u7/tmp/pip-k8wh6o-build/setuptools/command/install_lib.pyuinstall_libsuinstall_lib(udistutils.command.install_libuinstall_libu_install_libuos(((u7/tmp/pip-k8wh6o-build/setuptools/command/install_lib.pyu<module>ssite-packages/setuptools/command/__pycache__/alias.cpython-33.pyc000064400000007154151733464030021064 0ustar00�
�Re�	c@s�ddlZddlZddlmZddlmZddlmZddlTddlm	Z	m
Z
mZdd�ZGd	d
�d
e
�Z
dd�ZdS(
iN(uCommand(uconvert_path(ulog(u*(uedit_configuoption_baseuconfig_filecCsJx$dD]}||krt|�SqW|j�|gkrFt|�S|S(u4Quote an argument for later parsing by shlex.split()u"u'u\u#(u"u'u\u#(ureprusplit(uarguc((u1/tmp/pip-k8wh6o-build/setuptools/command/alias.pyushquotes

ushquotecBsj|EeZdZdZdZd
ZdgejZej	dgZ	dd�Z
dd	�Zd
d�ZdS(ualiasu3Define a shortcut that invokes one or more commandsu0define a shortcut to invoke one or more commandsuremoveururemove (unset) the aliascCs#tj|�d|_d|_dS(N(uoption_baseuinitialize_optionsuNoneuargsuremove(uself((u1/tmp/pip-k8wh6o-build/setuptools/command/alias.pyuinitialize_optionss
	ualias.initialize_optionscCs>tj|�|jr:t|j�dkr:td��ndS(NiuFMust specify exactly one argument (the alias name) when using --remove(uoption_baseufinalize_optionsuremoveulenuargsuDistutilsOptionError(uself((u1/tmp/pip-k8wh6o-build/setuptools/command/alias.pyufinalize_options"s
ualias.finalize_optionscCs"|jjd�}|jsZtd�td�x$|D]}tdt||��q6WdSt|j�dkr�|j\}|jr�d}q�||kr�tdt||��dStd|�dSn2|jd}djt	t
|jdd���}t|jii||6d6|j
�dS(	NualiasesuCommand Aliasesu---------------usetup.py aliasiu No alias definition found for %riu (udistributionuget_option_dictuargsuprintuformat_aliasulenuremoveuNoneujoinumapushquoteuedit_configufilenameudry_run(uselfualiasesualiasucommand((u1/tmp/pip-k8wh6o-build/setuptools/command/alias.pyurun*s&	


		
%u	alias.runNT(uremoveururemove (unset) the alias(
u__name__u
__module__u__qualname__u__doc__udescriptionuTrueucommand_consumes_argumentsuoption_baseuuser_optionsuboolean_optionsuinitialize_optionsufinalize_optionsurun(u
__locals__((u1/tmp/pip-k8wh6o-build/setuptools/command/alias.pyualiass
ualiascCs{||\}}|td�kr+d}n@|td�krFd}n%|td�krad}n
d|}||d|S(	Nuglobalu--global-config uuseru--user-config ulocaluu
--filename=%ru (uconfig_file(unameualiasesusourceucommand((u1/tmp/pip-k8wh6o-build/setuptools/command/alias.pyuformat_aliasEs			
uformat_alias(u	distutilsuosu
setuptoolsuCommandudistutils.utiluconvert_pathulogudistutils.errorsusetuptools.command.setoptuedit_configuoption_baseuconfig_fileushquoteualiasuformat_alias(((u1/tmp/pip-k8wh6o-build/setuptools/command/alias.pyu<module>s
	4site-packages/setuptools/command/__pycache__/bdist_egg.cpython-33.pyc000064400000052465151733464030021727 0ustar00�
�ReIc@sdZddlZddlZddlZddlmZddlmZmZy&ddl	m
Z
mZdd�ZWn4e
k
r�ddlmZmZd	d�ZYnXdd
lmZddlmZddlmZmZmZdd
lmZddlmZddlmZmZddlmZdd�Z dd�Z!dZ"Gdd�de�Z#e$j%dj&��Z'dd�Z(dd�Z)dd�Z*ide+6d e,6Z-d!d"�Z.d#d$�Z/d%d&�Z0d'd(d)d*gZ1dde2d+d,d-�Z3dS(.u6setuptools.command.bdist_egg

Build .egg distributionsiN(uCommand(uremove_treeumkpath(uget_pathuget_python_versioncCs
td�S(Nupurelib(uget_path(((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyu_get_purelibsu_get_purelib(uget_python_libuget_python_versioncCs
td�S(NF(uget_python_libuFalse(((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyu_get_purelibs(ulog(uDistutilsSetupError(uget_build_platformuDistributionuensure_directory(u
EntryPoint(uCodeType(u
basestringunext(uLibrarycCsKd|kr%tjj|�d}n|jd�rG|dd�}n|S(Nu.iumoduleii����(uosupathusplitextuendswith(ufilename((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyustrip_modules
ustrip_modulec
CsOt|d�}|jdjdddd|ddd	d
g��|j�dS(Nuwu
udef __bootstrap__():u-   global __bootstrap__, __loader__, __file__u!   import sys, pkg_resources, impu:   __file__ = pkg_resources.resource_filename(__name__,%r)u3   __loader__ = None; del __bootstrap__, __loader__u&   imp.load_dynamic(__name__,__file__)u__bootstrap__()u(uopenuwriteujoinuclose(uresourceupyfileuf((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyu
write_stub"s
u
write_stubu7__import__("pkg_resources").declare_namespace(__name__)cBs�|EeZdZdZd,ddde�fd-d
ddd
fd.d/gZd
ddgZdd�Zdd�Z	dd�Z
dd�Zdd�Zdd�Z
dd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+S(0u	bdist_eggucreate an "egg" distributionu
bdist-dir=ubu1temporary directory for creating the distributionu
plat-name=upu;platform name to embed in generated filenames (default: %s)uexclude-source-filesu+remove all .py files from the generated eggu	keep-tempuku/keep the pseudo-installation tree around after u!creating the distribution archiveu	dist-dir=udu-directory to put final built distributions inu
skip-buildu2skip rebuilding everything (for testing/debugging)cCsCd|_d|_d|_d|_d|_d|_d|_dS(Ni(uNoneu	bdist_diru	plat_nameu	keep_tempudist_diru
skip_buildu
egg_outputuexclude_source_files(uself((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyuinitialize_options]s						ubdist_egg.initialize_optionscCs�|jd�}|_|j|_|jdkr^|jd�j}tjj|d�|_n|j	dkr|t
�|_	n|jdd�|jdkr�t
dd|j|jt�|jj�o�|j	�j�}tjj|j|d�|_ndS(Nuegg_infoubdistueggudist_diru.egg(udist_dirudist_dir(uget_finalized_commanduei_cmduegg_infou	bdist_diruNoneu
bdist_baseuosupathujoinu	plat_nameuget_build_platformuset_undefined_optionsu
egg_outputuDistributionuegg_nameuegg_versionuget_python_versionudistributionuhas_ext_modulesudist_dir(uselfuei_cmdu
bdist_baseubasename((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyufinalize_optionsgs!ubdist_egg.finalize_optionscCsf|j|jd�_tjjtjjt���}|jj	g}|j_	x�|D]�}t
|t�r
t|�dkr
tjj
|d�r
tjj|d�}tjj|�}||ks�|j|tj�r|t|�dd�|df}qq
n|jj	j|�qVWz1tjd|j�|jddddd�Wd||j_	XdS(	Nuinstalliiiuinstalling package data to %suinstall_datauforceuroot(u	bdist_diruget_finalized_commanduinstall_libuosupathunormcaseurealpathu_get_purelibudistributionu
data_filesu
isinstanceutupleulenuisabsu
startswithusepuappenduloguinfoucall_commanduNone(uselfu
site_packagesuolduitemurealpathu
normalized((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyudo_install_data�s !
!-ubdist_egg.do_install_datacCs
|jgS(N(u
egg_output(uself((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyuget_outputs�subdist_egg.get_outputscKsmx!tD]}|j||j�qW|jd|j�|jd|j�|j||�}|j|�|S(u8Invoke reinitialized command `cmdname` with keyword argsu
skip_buildudry_run(uINSTALL_DIRECTORY_ATTRSu
setdefaultu	bdist_diru
skip_buildudry_runureinitialize_commandurun_command(uselfucmdnameukwudirnameucmd((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyucall_command�s

ubdist_egg.call_commandc
Cs�|jd�tjd|j�|jd�}|j}d|_|jj�rk|j	rk|jd�n|j
ddd�}||_|j�\}}g|_g}x�t
|�D]�\}}tjj|�\}	}
tjj|jt|	�d�}|jj|�tjd	|�|jsCttjj|�|�n|j|�|jtjd
�||<q�W|j|j��|r�|j|�n|jjr�|j�n|j}tjj|d�}
|j|
�|jjr(tjj|
d�}tjd
|�|j
dd|dd�n|j |
�tjj|
d�}|r�tjd|�|js�t!|�t"|d�}|j#dj|��|j#d�|j$�q�n?tjj%|�r�tjd|�|js�tj&|�q�nt'tjj|d�|j(��tjj)tjj|j*d��rKtj+d�n|j,ra|j-�nt.|j/|d|j0d|jd|j1��|j2s�t3|jd|j�nt4|jdg�jdt5�|j/f�dS(Nuegg_infouinstalling library code to %suinstallu
build_clibuinstall_libuwarn_diriu.pyucreating stub loader for %su/uEGG-INFOuscriptsuinstalling scripts to %suinstall_scriptsuinstall_diruno_epiunative_libs.txtu
writing %suwtu
uremoving %sudepends.txtuxWARNING: 'depends.txt' will not be used by setuptools 0.6!
Use the install_requires/extras_require setup() args instead.uverboseudry_runumodeu
dist_filesu	bdist_egg(6urun_commanduloguinfou	bdist_diruget_finalized_commandurootuNoneudistributionuhas_c_librariesu
skip_builducall_commanduget_ext_outputsustubsu	enumerateuosupathusplitextujoinustrip_moduleuappendudry_runu
write_stububasenameureplaceusepuextendumake_init_filesubyte_compileu
data_filesudo_install_dataumkpathuscriptsucopy_metadata_touensure_directoryuopenuwriteucloseuisfileuunlinkuwrite_safety_flaguzip_safeuexistsuegg_infouwarnuexclude_source_filesuzap_pyfilesumake_zipfileu
egg_outputuverboseu
gen_headeru	keep_tempuremove_treeugetattruget_python_version(uselfuinstcmduold_rootucmduall_outputsuext_outputsu
to_compileupuext_nameufilenameuextupyfileuarchive_rootuegg_infou
script_dirunative_libsu	libs_file((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyurun�sx
				"	

	

	

	$
	
	u
bdist_egg.runcCs�tjd�xut|j�D]d\}}}xR|D]J}|jd�r3tjj||�}tjd|�tj	|�q3q3WqWdS(Nu+Removing .py files from temporary directoryu.pyuDeleting %s(
uloguinfouwalk_eggu	bdist_diruendswithuosupathujoinudebuguunlink(uselfubaseudirsufilesunameupath((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyuzap_pyfiless

ubdist_egg.zap_pyfilescCsEt|jdd�}|dk	r%|Stjd�t|j|j�S(Nuzip_safeu4zip_safe flag not set; analyzing archive contents...(ugetattrudistributionuNoneuloguwarnuanalyze_eggu	bdist_dirustubs(uselfusafe((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyuzip_safe
s

ubdist_egg.zip_safec	Cs*g}xt|j�D]\}}}||jkr:qnx�|D]�}|jd�rAd|kr
|t|j�dd�jtjd�}|jj|�r
t	j
d|�tjj|d�}|j
s�t|d�}|jt�|j�n|j|�q
nPqAqAWg|dd�<qW|S(u%Create missing package __init__ filesu.pyu__init__.pyiNu.u#Creating missing __init__.py for %suw(uwalk_eggu	bdist_diruendswithulenureplaceuosusepudistributionuhas_contents_foruloguwarnupathujoinudry_runuopenuwriteuNS_PKG_STUBucloseuappend(	uselfu
init_filesubaseudirsufilesunameupkgufilenameuf((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyumake_init_filess&
,	

ubdist_egg.make_init_filesc
Cs'tj|jjpd�}|jdi�jd�}|dkrFdS|jsY|jrotd|f��nt	j
dd�}|j}dj|j�}|jd}t
jj|j�}d	t�}|js#tt
jj|j�d
|j�t|jd�}	|	j|�|	j�ndS(Nuusetuptools.installationueggsecutableuwuGeggsecutable entry point (%r) cannot have 'extras' or refer to a moduleiu.iuH#!/bin/sh
if [ `basename $0` = "%(basename)s" ]
then exec python%(pyver)s -c "import sys, os; sys.path.insert(0, os.path.abspath('$0')); from %(pkg)s import %(base)s; sys.exit(%(full)s())" "$@"
else
  echo $0 is not the correct name for this egg file.
  echo Please rename it back to %(basename)s and try again.
  exec false
fi
udry_runua(u
EntryPointu	parse_mapudistributionuentry_pointsugetuNoneuattrsuextrasuDistutilsSetupErrorusysuversionumodule_nameujoinuosupathubasenameu
egg_outputulocalsudry_runumkpathudirnameuopenuwriteuclose(
uselfuepmuepupyverupkgufullubaseubasenameuheaderuf((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyu
gen_header*s*	

	"

ubdist_egg.gen_headercCs�tjj|j�}tjj|d�}xh|jjjD]W}|j|�r:tjj||t	|�d��}t
|�|j||�q:q:WdS(u*Copy metadata (egg info) to the target_diruN(uosupathunormpathuegg_infoujoinuei_cmdufilelistufilesu
startswithulenuensure_directoryu	copy_file(uselfu
target_diru
norm_egg_infouprefixupathutarget((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyucopy_metadata_toSs%
ubdist_egg.copy_metadata_tocCs�g}g}id|j6}x�tj|j�D]�\}}}xH|D]@}tjj|�dj�tkrE|j|||�qEqEWx3|D]+}|||d|tjj||�<q�Wq/W|j	j
�r�|jd�}x�|jD]�}	t
|	t�rq�n|j|	j�}
|j|
�}tjj|�jd�s�tjjtjj|j|��ry|j|�qyq�q�Wn||fS(uAGet a list of relative paths to C extensions in the output distrouiu/u	build_extudl-(u	bdist_diruosuwalkupathusplitextuloweruNATIVE_EXTENSIONSuappendujoinudistributionuhas_ext_modulesuget_finalized_commandu
extensionsu
isinstanceuLibraryuget_ext_fullnameunameuget_ext_filenameubasenameu
startswithuexists(uselfuall_outputsuext_outputsupathsubaseudirsufilesufilenameu	build_cmduextufullname((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyuget_ext_outputs_s("
"
-$ubdist_egg.get_ext_outputsN(u
bdist-dir=ubu1temporary directory for creating the distribution(uexclude-source-filesNu+remove all .py files from the generated egg(u	dist-dir=udu-directory to put final built distributions in(u
skip-buildNu2skip rebuilding everything (for testing/debugging)(u__name__u
__module__u__qualname__udescriptionuget_build_platformuNoneuuser_optionsuboolean_optionsuinitialize_optionsufinalize_optionsudo_install_datauget_outputsucall_commandurunuzap_pyfilesuzip_safeumake_init_filesu
gen_headerucopy_metadata_touget_ext_outputs(u
__locals__((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyu	bdist_egg4s8
	
R	)u	bdist_eggu.dll .so .dylib .pydccshtj|�}t|�\}}}d|kr@|jd�n|||fVx|D]}|VqUWdS(u@Walk an unpacked egg's contents, skipping the metadata directoryuEGG-INFON(uosuwalkunexturemove(uegg_diruwalkerubaseudirsufilesubdf((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyuwalk_egg�s
uwalk_eggc		Cs�xBtj�D]4\}}tjjtjj|d|��r
|Sq
Wt�sRdSd}x�t	|�D]�\}}}xn|D]f}|j
d�s{|j
d�r�q{q{|j
d�s�|j
d�r{t||||�o�|}q{q{WqeW|S(NuEGG-INFOu.pyu.pywu.pycu.pyoFT(usafety_flagsuitemsuosupathuexistsujoinucan_scanuFalseuTrueuwalk_egguendswithuscan_module(	uegg_dirustubsuflagufnusafeubaseudirsufilesuname((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyuanalyze_egg�s$	
&uanalyze_eggcCs�x�tj�D]�\}}tjj||�}tjj|�rq|dks^t|�|kr�tj|�q�q
|dk	r
t|�|kr
t	|d�}|j
d�|j�q
q
WdS(Nuwtu
(usafety_flagsuitemsuosupathujoinuexistsuNoneubooluunlinkuopenuwriteuclose(uegg_dirusafeuflagufnuf((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyuwrite_safety_flag�s
uwrite_safety_flaguzip-safeunot-zip-safec

Cs�tjj||�}|dd�|kr/dS|t|�dd�jtjd�}||rgdpjdtjj|�d}tj	d kr�d}nd}t
|d	�}|j|�tj
|�}	|j�d}
tjt|	��}x<d
dgD].}||kr�tjd||�d!}
q�q�Wd
|kr�xZdddddddddddgD].}||krctjd||�d!}
qcqcWnd|kr�d|kr�d|kr�tjdd�dkr�tjd|�d!}
q�n|
S("u;Check whether module possibly uses unsafe-for-zipfile stuffNiu.uiiiiurbu__file__u__path__u%s: module references %suinspectu	getsourceu
getabsfileu
getsourcefileugetfilegetsourcelinesu
findsourceugetcommentsugetframeinfougetinnerframesugetouterframesustackutraceu"%s: module MAY be using inspect.%su__name__u__main__u2.4u.%s: top-level module may be 'python -m' scripti����T(iiF(uosupathujoinuTrueulenureplaceusepusplitextusysuversion_infouopenureadumarshaluloaducloseudictufromkeysuiter_symbolsuloguwarnuFalseuversion(
uegg_dirubaseunameustubsufilenameupkgumoduleuskipufucodeusafeusymbolsubad((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyuscan_module�s>)*	


	$uscan_moduleccsvx|jD]}|Vq
WxV|jD]K}t|t�r@|Vq#t|t�r#xt|�D]}|Vq\Wq#q#WdS(uBYield names and strings used by `code` and its nested code objectsN(uco_namesu	co_constsu
isinstanceu
basestringuCodeTypeuiter_symbols(ucodeunameuconst((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyuiter_symbols�s	uiter_symbolscCsDtjjd�r&tjdkr&dStjd�tjd�dS(Nujavaucliu1Unable to analyze compiled code on this platform.ufPlease ask the author to include a 'zip_safe' setting (either True or False) in the package's setup.pyT(usysuplatformu
startswithuTrueuloguwarn(((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyucan_scan�s"
ucan_scanuinstall_libuinstall_diruinstall_datauinstall_baseuwc
sddl}ttjj|�d��tjd|����fdd�}|dkrntj	dk}n|j
|jgt|�}�s�|j
||d|�}	x0tj��D]\}
}}||	|
|�q�W|	j�n3x0tj��D]\}
}}|d|
|�q�W|S(	uqCreate a zip file from all the files under 'base_dir'.  The output
    zip file will be named 'base_dir' + ".zip".  Uses either the "zipfile"
    Python module (if available) or the InfoZIP "zip" utility (if installed
    and found on the default search path).  If neither tool is available,
    raises DistutilsExecError.  Returns the name of the output zip file.
    iNudry_runu#creating '%s' and adding '%s' to itcs�x�|D]�}tjjtjj||��}tjj|�r|t��dd�}�ss|j||�ntjd|�qqWdS(Niuadding '%s'(	uosupathunormpathujoinuisfileulenuwriteulogudebug(uzudirnameunamesunameupathup(ubase_dirudry_run(u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyuvisits
!umake_zipfile.<locals>.visitu2.4ucompression(uzipfileumkpathuosupathudirnameuloguinfouNoneusysuversionu
ZIP_STOREDuZIP_DEFLATEDubooluZipFileuwalkuclose(
uzip_filenameubase_diruverboseudry_runucompressumodeuzipfileuvisitucompressionuzudirnameudirsufiles((ubase_dirudry_runu5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyumake_zipfiles		
umake_zipfile(4u__doc__usysuosumarshalu
setuptoolsuCommandudistutils.dir_utiluremove_treeumkpathu	sysconfiguget_pathuget_python_versionu_get_purelibuImportErrorudistutils.sysconfiguget_python_libu	distutilsulogudistutils.errorsuDistutilsSetupErroru
pkg_resourcesuget_build_platformuDistributionuensure_directoryu
EntryPointutypesuCodeTypeusetuptools.compatu
basestringunextusetuptools.extensionuLibraryustrip_moduleu
write_stubuNS_PKG_STUBu	bdist_eggudictufromkeysusplituNATIVE_EXTENSIONSuwalk_egguanalyze_egguwrite_safety_flaguTrueuFalseusafety_flagsuscan_moduleuiter_symbolsucan_scanuINSTALL_DIRECTORY_ATTRSuNoneumake_zipfile(((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_egg.pyu<module>sD$
�H


#
-	site-packages/setuptools/command/__pycache__/egg_info.cpython-33.pyc000064400000047706151733464030021557 0ustar00�
�Re�7c@s�dZddlZddlZddlZddlmZddlZddlmZddl	m
Z
ddlmZddlm
Z
ddlmZdd	lmZdd
lmZmZmZmZmZmZmZmZddl	mZGdd
�d
e�ZGdd�de�ZGdd�de
�Zdd�Zdd�Z dd�Z!dd�Z"dd�Z#dd�Z$d$dd�Z&d d!�Z'd"d#�Z(dS(%uUsetuptools.command.egg_info

Create a distribution's .egg-info directory and contentsiN(uCommand(ulog(usdist(u
basestring(u	svn_utils(uconvert_path(uFileList(uparse_requirementsu	safe_nameu
parse_versionusafe_versionuyield_linesu
EntryPointuiter_entry_pointsuto_filename(uwalk_revctrlcBs�|EeZdZdZd-d.d/d0d1d2gZddgZidd6dd6Zdd�Zdd�Zdd�Z	d3dd�Zdd�Zdd�Z
d d!�Zd"d#�Zd$d%�Zed&d'��Zd(d)�Zd*d+�Zd,S(4uegg_infou+create a distribution's .egg-info directoryu	egg-base=ueuLdirectory containing .egg-info directories (default: top of the source tree)utag-svn-revisionuru,Add subversion revision ID to version numberutag-dateudu0Add date stamp (e.g. 20050528) to version numberu
tag-build=ubu-Specify explicit tag to add to version numberuno-svn-revisionuRu*Don't add subversion revision ID [default]uno-dateuDu"Don't include date stamp [default]cCsUd|_d|_d|_d|_d|_d|_d|_d|_	d|_
dS(NiF(uNoneuegg_nameuegg_versionuegg_baseuegg_infou	tag_buildutag_svn_revisionutag_dateuFalseubroken_egg_infouvtags(uself((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyuinitialize_options)s								uegg_info.initialize_optionsc	CsKddlm}tdtddddd|j���}|||�dS(Ni(uedit_configuegg_infoutag_svn_revisionutag_dateu	tag_build(usetuptools.command.setoptuedit_configudictutags(uselfufilenameuedit_configuvalues((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyusave_version_info4suegg_info.save_version_infocCs�t|jj��|_|j�|_|j�|_y$tt	d|j|jf��Wn4t
k
r�tjj
d|j|jf��YnX|jdkr�|jj}|p�ijdtj�|_n|jd�t|j�d|_|jtjkr#tjj|j|j�|_nd|jkr?|j�n|j|jj_|jj}|dk	r�|j|jj�kr�|j|_t |j�|_!d|j_ndS(Nu%s==%su2Invalid distribution name or version syntax: %s-%suuegg_baseu	.egg-infou-("u	safe_nameudistributionuget_nameuegg_nameutagsuvtagsutagged_versionuegg_versionulistuparse_requirementsu
ValueErroru	distutilsuerrorsuDistutilsOptionErroruegg_baseuNoneupackage_dirugetuosucurdiruensure_dirnameuto_filenameuegg_infoupathujoinucheck_broken_egg_infoumetadatauversionu
_patched_distukeyuloweru_versionu
parse_versionu_parsed_version(uselfudirsupd((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyufinalize_options?s2!
	!
!
$uegg_info.finalize_optionscCsl|r|j|||�nLtjj|�rh|dkrX|rXtjd||�dS|j|�ndS(u�Write `data` to `filename` or delete if empty

        If `data` is non-empty, this routine is the same as ``write_file()``.
        If `data` is empty but not ``None``, this is the same as calling
        ``delete_file(filename)`.  If `data` is ``None``, then this is a no-op
        unless `filename` exists, in which case a warning is issued about the
        orphaned file (if `force` is false), or deleted (if `force` is true).
        u$%s not set in setup(), but %s existsN(u
write_fileuosupathuexistsuNoneuloguwarnudelete_file(uselfuwhatufilenameudatauforce((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyuwrite_or_delete_filegs	
uegg_info.write_or_delete_filecCsjtjd||�tjdkr4|jd�}n|jsft|d�}|j|�|j�ndS(u�Write `data` to `filename` (if not a dry run) after announcing it

        `what` is used in a log message to identify what is being written
        to the file.
        uwriting %s to %siuutf-8uwbN(i(	uloguinfousysuversion_infouencodeudry_runuopenuwriteuclose(uselfuwhatufilenameudatauf((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyu
write_file{s	
uegg_info.write_filecCs-tjd|�|js)tj|�ndS(u8Delete `filename` (if not a dry run) after announcing itudeleting %sN(uloguinfoudry_runuosuunlink(uselfufilename((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyudelete_file�s	uegg_info.delete_filecCsE|jj�}|jr4|j|j�r4t|�St||j�S(N(udistributionuget_versionuvtagsuendswithusafe_version(uselfuversion((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyutagged_version�s
uegg_info.tagged_versioncCs�|j|j�|jj}xNtd�D]@}|jd|�}|||jtjj	|j|j��q)Wtjj	|jd�}tjj
|�r�|j|�n|j�dS(Nuegg_info.writersu	installerunative_libs.txt(
umkpathuegg_infoudistributionufetch_build_egguiter_entry_pointsuloadunameuosupathujoinuexistsudelete_fileufind_sources(uselfu	installeruepuwriterunl((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyurun�s,uegg_info.runcCs�d}|jr||j7}n|jrctjjd�sLtjjd�rc|d|j�7}n|jr�ddl}||jd�7}n|S(Nuu.svnuPKG-INFOu-r%siu-%Y%m%d(	u	tag_buildutag_svn_revisionuosupathuexistsuget_svn_revisionutag_dateutimeustrftime(uselfuversionutime((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyutags�s		$	u
egg_info.tagscCsttjjtj�j��S(N(ustru	svn_utilsuSvnInfouloaduosucurdiruget_revision(((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyuget_svn_revision�suegg_info.get_svn_revisioncCsJtjj|jd�}t|j�}||_|j�|j|_dS(u"Generate SOURCES.txt manifest fileuSOURCES.txtN(	uosupathujoinuegg_infoumanifest_makerudistributionumanifesturunufilelist(uselfumanifest_filenameumm((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyufind_sources�s
	
uegg_info.find_sourcescCs�|jd}|jtjkr:tjj|j|�}ntjj|�r�tjddddd||j	�|j	|_
||_	ndS(Nu	.egg-infou-iNu�
Note: Your current .egg-info directory has a '-' in its name;
this will not work correctly with "setup.py develop".

Please rename %s to %s to correct this problem.
(uegg_nameuegg_baseuosucurdirupathujoinuexistsuloguwarnuegg_infoubroken_egg_info(uselfubei((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyucheck_broken_egg_info�s

uegg_info.check_broken_egg_infoN(u	egg-base=ueuLdirectory containing .egg-info directories (default: top of the source tree)(utag-svn-revisionuru,Add subversion revision ID to version number(utag-dateudu0Add date stamp (e.g. 20050528) to version number(u
tag-build=ubu-Specify explicit tag to add to version number(uno-svn-revisionuRu*Don't add subversion revision ID [default](uno-dateuDu"Don't include date stamp [default]F(u__name__u
__module__u__qualname__udescriptionuuser_optionsuboolean_optionsunegative_optuinitialize_optionsusave_version_infoufinalize_optionsuFalseuwrite_or_delete_fileu
write_fileudelete_fileutagged_versionurunutagsustaticmethoduget_svn_revisionufind_sourcesucheck_broken_egg_info(u
__locals__((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyuegg_infos0	

(uegg_infocBs&|EeZdZdZdd�ZdS(uFileListu@File list that accepts only existing, platform-independent pathscCs	|jd�r"|dd�}nt|�}tjdkr�yDtjj|�smtjj|jd��r�|jj	|�nWqt
k
r�tjj|jd��r�|jj	|�ntjd|tj
��YqXn%tjj|�r|jj	|�ndS(Nu
iiuutf-8u!'%s' not %s encodable -- skippingi����(i(uendswithuconvert_pathusysuversion_infouosupathuexistsuencodeufilesuappenduUnicodeEncodeErroruloguwarnugetfilesystemencoding(uselfuitemupath((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyuappend�s-
uFileList.appendN(u__name__u
__module__u__qualname__u__doc__uappend(u
__locals__((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyuFileList�suFileListcBsn|EeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dS(umanifest_makeruMANIFEST.incCs(d|_d|_d|_d|_dS(Ni(uuse_defaultsupruneu
manifest_onlyuforce_manifest(uself((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyuinitialize_options�s			u!manifest_maker.initialize_optionscCsdS(N((uself((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyufinalize_options�sumanifest_maker.finalize_optionscCs�t�|_tjj|j�s.|j�n|jj�|j�tjj|j	�rg|j
�n|j�|jj�|jj
�|j�dS(N(uFileListufilelistuosupathuexistsumanifestuwrite_manifestufindalluadd_defaultsutemplateu
read_templateuprune_file_listusorturemove_duplicates(uself((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyurun�s






umanifest_maker.runcCs�tjd	krg}xX|jjD]J}y|jd�Wn#tk
r^tjd|�Yq"X|j|�q"W||j_n|jj}t	j
dkr�dd�|D�}n|jt|j
|fd|j
�dS(
u�Write the file list in 'self.filelist' (presumably as filled in
        by 'add_defaults()' and 'read_template()') to the manifest file
        named by 'self.manifest'.
        iuutf-8u$'%s' not UTF-8 encodable -- skippingu/cSs%g|]}|jtjd��qS(u/(ureplaceuosusep(u.0uf((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyu
<listcomp>s	u1manifest_maker.write_manifest.<locals>.<listcomp>uwriting manifest file '%s'N(i(usysuversion_infoufilelistufilesuencodeuUnicodeEncodeErroruloguwarnuappenduosusepuexecuteu
write_fileumanifest(uselfufilesufile((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyuwrite_manifest�s
umanifest_maker.write_manifestcCs&|jd�s"tj||�ndS(Nustandard file not found:(u
startswithusdistuwarn(uselfumsg((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyuwarnsumanifest_maker.warncCs�tj|�|jj|j�|jj|j�tt��}|r[|jj|�n"t	j
j|j�r}|j�n|j
d�}|jjdd|j�dS(Nuegg_infou*uprefix(usdistuadd_defaultsufilelistuappendutemplateumanifestulistuwalk_revctrluextenduosupathuexistsu
read_manifestuget_finalized_commanduinclude_patternuegg_info(uselfurcfilesuei_cmd((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyuadd_defaultss

umanifest_maker.add_defaultscCs�|jd�}|jj�}|jjdd|j�|jjdd|�tjt	j
�}|jj|d|dd�dS(Nubuilduprefixu(RCS|CVS|\.svn)uis_regexi(uget_finalized_commandudistributionuget_fullnameufilelistuexclude_patternuNoneu
build_baseureuescapeuosusep(uselfubuildubase_dirusep((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyuprune_file_list%sumanifest_maker.prune_file_listN(u__name__u
__module__u__qualname__utemplateuinitialize_optionsufinalize_optionsurunuwrite_manifestuwarnuadd_defaultsuprune_file_list(u
__locals__((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyumanifest_maker�s
umanifest_makercCsZdj|�}tjdkr0|jd�}nt|d�}|j|�|j�dS(u{Create a file with the specified name and write 'contents' (a
    sequence of strings without line terminators) to it.
    u
iuutf-8uwbN(i(ujoinusysuversion_infouencodeuopenuwriteuclose(ufilenameucontentsuf((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyu
write_file.s
u
write_filecCs�tjd|�|js�|jj}|j|j|_}|j|j|_}z|j	|j
�Wd|||_|_Xt|jdd�}ddl
m}|j|j
|�ndS(Nu
writing %suzip_safei(u	bdist_egg(uloguinfoudry_runudistributionumetadatauegg_versionuversionuegg_nameunameuwrite_pkg_infouegg_infougetattruNoneusetuptools.commandu	bdist_egguwrite_safety_flag(ucmdubasenameufilenameumetadatauoldveruoldnameusafeu	bdist_egg((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyuwrite_pkg_info9s	uwrite_pkg_infocCs&tjj|�r"tjd�ndS(NusWARNING: 'depends.txt' is not used by setuptools 0.6!
Use the install_requires/extras_require setup() args instead.(uosupathuexistsuloguwarn(ucmdubasenameufilename((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyuwarn_depends_obsoleteJsuwarn_depends_obsoletec	Cs�|j}djt|jpf��g}xI|jp9ij�D]2\}}|jd|djt|��f�q@W|jd|dj|��dS(Nu
u	

[%s]
%surequirementsu(udistributionujoinuyield_linesuinstall_requiresuextras_requireuitemsuappenduwrite_or_delete_file(ucmdubasenameufilenameudistudatauextraureqs((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyuwrite_requirementsRs
	!"*uwrite_requirementscCsItjdd�|jj�D��}|jd|dj|�d�dS(NcSs&g|]}|jdd�d�qS(u.ii(usplit(u.0uk((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyu
<listcomp>\s	u(write_toplevel_names.<locals>.<listcomp>utop-level namesu
(udictufromkeysudistributionuiter_distribution_namesu
write_fileujoin(ucmdubasenameufilenameupkgs((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyuwrite_toplevel_namesYs	uwrite_toplevel_namescCst|||d�dS(NT(u	write_arguTrue(ucmdubasenameufilename((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyu
overwrite_argcsu
overwrite_argcCsgtjj|�d}t|j|d�}|dk	rMdj|�d}n|j||||�dS(Niu
(uosupathusplitextugetattrudistributionuNoneujoinuwrite_or_delete_file(ucmdubasenameufilenameuforceuargnameuvalue((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyu	write_argfs
u	write_argcCs�|jj}t|t�s'|dkr0|}n�|dk	r�g}xs|j�D]e\}}t|t�s�tj||�}djt	t
|j���}n|jd||f�qOWdj|�}n|j
d||d�dS(Nu
u	[%s]
%s

uuentry pointsT(udistributionuentry_pointsu
isinstanceu
basestringuNoneuitemsu
EntryPointuparse_groupujoinumapustruvaluesuappenduwrite_or_delete_fileuTrue(ucmdubasenameufilenameuepudatausectionucontents((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyu
write_entriesms	!u
write_entriescCsntjjd�rjtdd�}x9|D]1}tjd|�}|r(t|jd��Sq(W|j�ndS(NuPKG-INFOurUuVersion:.*-r(\d+)\s*$ii(	uosupathuexistsuopenureumatchuintugroupuclose(ufulineumatch((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyuget_pkg_info_revision}s

uget_pkg_info_revisionF()u__doc__uosureusysu
setuptoolsuCommandudistutils.errorsu	distutilsulogusetuptools.command.sdistusdistusetuptools.compatu
basestringu	svn_utilsudistutils.utiluconvert_pathudistutils.filelistuFileListu	_FileListu
pkg_resourcesuparse_requirementsu	safe_nameu
parse_versionusafe_versionuyield_linesu
EntryPointuiter_entry_pointsuto_filenameuwalk_revctrluegg_infoumanifest_makeru
write_fileuwrite_pkg_infouwarn_depends_obsoleteuwrite_requirementsuwrite_toplevel_namesu
overwrite_arguFalseu	write_argu
write_entriesuget_pkg_info_revision(((u4/tmp/pip-k8wh6o-build/setuptools/command/egg_info.pyu<module>s2:�J
site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-33.pyc000064400000005664151733464030022657 0ustar00�
�Re�c@sBddlmZddlZddlZGdd�de�ZdS(i(u
bdist_wininstNcBsr|EeZdZd
ZZd
dd�Zdd�Zddd�Zdd	�Z	e
ed
�sndd�Znd
S(u
bdist_wininstcCshtj||||�|j|�}|jrL|j}dd|f|_nd}d||f|_dS(Nu
bdist_wininstuany(u_bdist_wininstu
create_exeuget_installer_filenameutarget_versionu_bad_uploadu_good_upload(uselfuarcnameufullnameubitmapuinstaller_nameu	pyversion((u9/tmp/pip-k8wh6o-build/setuptools/command/bdist_wininst.pyu
create_exes		ubdist_wininst.create_execCsd|j|j}}t|jdg�}||krD|j|�n||kr`|j|�ndS(Nu
dist_files(u_good_uploadu_bad_uploadugetattrudistributionuremoveuappend(uselfugoodubadu
dist_files((u9/tmp/pip-k8wh6o-build/setuptools/command/bdist_wininst.pyu_fix_upload_namessubdist_wininst._fix_upload_namesicCs1|jj||�}|dkr-d|_n|S(Nuinstalluinstall_lib(uinstalluinstall_lib(udistributionureinitialize_commanduNoneuinstall_lib(uselfucommandureinit_subcommandsucmd((u9/tmp/pip-k8wh6o-build/setuptools/command/bdist_wininst.pyureinitialize_commands
	u"bdist_wininst.reinitialize_commandcCs5d|_ztj|�|j�Wdd|_XdS(NTF(uTrueu_is_runningu_bdist_wininsturunu_fix_upload_namesuFalse(uself((u9/tmp/pip-k8wh6o-build/setuptools/command/bdist_wininst.pyurun!s
	
ubdist_wininst.runuget_installer_filenamecCsQ|jr1tjj|jd||jf�}ntjj|jd|�}|S(Nu%s.win32-py%s.exeu%s.win32.exe(utarget_versionuosupathujoinudist_dir(uselfufullnameuinstaller_name((u9/tmp/pip-k8wh6o-build/setuptools/command/bdist_wininst.pyuget_installer_filename+s	
u$bdist_wininst.get_installer_filenameN(
u__name__u
__module__u__qualname__uNoneu_good_uploadu_bad_uploadu
create_exeu_fix_upload_namesureinitialize_commandurunuhasattru_bdist_wininstuget_installer_filename(u
__locals__((u9/tmp/pip-k8wh6o-build/setuptools/command/bdist_wininst.pyu
bdist_wininsts
	u
bdist_wininst(udistutils.command.bdist_wininstu
bdist_wininstu_bdist_wininstuosusys(((u9/tmp/pip-k8wh6o-build/setuptools/command/bdist_wininst.pyu<module>ssite-packages/setuptools/command/__pycache__/sdist.cpython-33.pyc000064400000023120151733464030021110 0ustar00�
�Re� c@s�ddlZddlZddlZddlmZddlZddlmZddlm	Z	ddl
mZddlm
Z
dZd
dd�ZGd
d�de�Zd
dd�Zedejdej��e
jgZGdd�de�ZdS(iN(uglob(usdist(uconvert_path(ulog(u	svn_utilsuREADMEu
README.rstu
README.txtuccs@x9tjd�D](}x|j�|�D]}|Vq)WqWdS(u%Find all files under revision controlusetuptools.file_findersN(u
pkg_resourcesuiter_entry_pointsuload(udirnameuepuitem((u1/tmp/pip-k8wh6o-build/setuptools/command/sdist.pyuwalk_revctrlsuwalk_revctrlcBs>|EeZdZddd�Zdd�Zddd�ZdS(	u	re_findercCs%||_||_t|�|_dS(N(upatternupostprocuconvert_pathupath(uselfupathupatternupostproc((u1/tmp/pip-k8wh6o-build/setuptools/command/sdist.pyu__init__s		ure_finder.__init__ccs�t|d�}z|j�}Wd|j�XxU|jj|�D]A}|jd�}|jrp|j|�}ntj||�Vq@WdS(NurUi(	uopenureaducloseupatternufinditerugroupupostprocu	svn_utilsujoinpath(uselfudirnameufilenameufudataumatchupath((u1/tmp/pip-k8wh6o-build/setuptools/command/sdist.pyu_finders	ure_finder._finderuccs�tj||j�}tjj|�r�xh|j||�D]Q}tjj|�rZ|Vq:tjj|�r:x||�D]}|VqyWq:q:WndS(N(u	svn_utilsujoinpathupathuosuisfileu_finderuisdir(uselfudirnameupathuitem((u1/tmp/pip-k8wh6o-build/setuptools/command/sdist.pyu__call__+sure_finder.__call__N(u__name__u
__module__u__qualname__uNoneu__init__u_finderu__call__(u
__locals__((u1/tmp/pip-k8wh6o-build/setuptools/command/sdist.pyu	re_finders
u	re_finderccs1x*tD]"}x||�D]}|VqWqWdS(uPrimary svn_cvs entry pointN(ufinders(udirnameufinderuitem((u1/tmp/pip-k8wh6o-build/setuptools/command/sdist.pyu_default_revctrl7s
u_default_revctrluCVS/Entriesu
^\w?/([^/]+)/cBs�|EeZdZdZd ddddfd!gZiZdd�Zd
d�Ze	j
d"kp�d#e	j
koyd$knp�d%e	j
ko�d&knZer�eZndd�Z
dd�Zdd�Zdd�Zdd�ZdS('usdistu=Smart sdist that finds anything supported by revision controluformats=u6formats for source distribution (comma-separated list)u	keep-tempuku1keep the distribution tree around after creating uarchive file(s)u	dist-dir=uduFdirectory to put the source distribution archive(s) in [default: dist]cCs|jd�|jd�}|j|_|jjtjj|jd��|j�x!|j	�D]}|j|�qaWddl
}d|jjkr�|j
�n|j�t|jdg�}x<|jD]1}dd|f}||kr�|j|�q�q�WdS(Nuegg_infouSOURCES.txtiuchecku
dist_filesusdistu(urun_commanduget_finalized_commandufilelistuappenduosupathujoinuegg_infoucheck_readmeuget_sub_commandsudistutils.commanducommandu__all__ucheck_metadataumake_distributionugetattrudistributionu
archive_files(uselfuei_cmducmd_nameu	distutilsu
dist_filesufileudata((u1/tmp/pip-k8wh6o-build/setuptools/command/sdist.pyurunUs 
"


u	sdist.runc	CsDytj|�Wn,tj�djjjdj��YnXdS(Niutemplate(u_sdistu
read_templateusysuexc_infoutb_nextutb_frameuf_localsuclose(uself((u1/tmp/pip-k8wh6o-build/setuptools/command/sdist.pyu__read_template_hackns
!usdist.__read_template_hackiiiiiics`t|jjg}x�|D]�}t|t�r�|}d}x:|D]2}tjj|�rAd}|jj	|�PqAqAW|s�|j
ddj|��q�qtjj|�r�|jj	|�q|j
d|�qWddg}xH|D]@}tt
tjjt|���}|r�|jj|�q�q�W|jj�r�|jd�}|jj|j��|jjs�xC|jD]5\}	�}	}
|jj�fd	d
�|
D��qxWq�n|jj�r�|jd�}|jj|j��n|jj�r%|jd�}|jj|j��n|jj�r\|jd
�}
|jj|
j��ndS(Niiu,standard file not found: should have one of u, ustandard file '%s' not foundu
test/test*.pyu	setup.cfgubuild_pycs%g|]}tjj�|��qS((uosupathujoin(u.0ufilename(usrc_dir(u1/tmp/pip-k8wh6o-build/setuptools/command/sdist.pyu
<listcomp>�s	u&sdist.add_defaults.<locals>.<listcomp>u	build_extu
build_clibu
build_scripts(uREADMESudistributionuscript_nameu
isinstanceutupleuosupathuexistsufilelistuappenduwarnujoinulistufilteruisfileuglobuextenduhas_pure_modulesuget_finalized_commanduget_source_filesuinclude_package_datau
data_filesuhas_ext_modulesuhas_c_librariesuhas_scripts(uselfu	standardsufnualtsugot_ituoptionalupatternufilesubuild_pyu_u	filenamesu	build_extu
build_clibu
build_scripts((usrc_diru1/tmp/pip-k8wh6o-build/setuptools/command/sdist.pyuadd_defaults�sL

	
!usdist.add_defaultscCsEx>tD]}tjj|�rdSqW|jddjt��dS(Nu,standard file not found: should have one of u, (uREADMESuosupathuexistsuwarnujoin(uselfuf((u1/tmp/pip-k8wh6o-build/setuptools/command/sdist.pyucheck_readme�s

usdist.check_readmecCs�tj|||�tjj|d�}ttd�ritjj|�ritj|�|jd|�n|j	d�j
|�dS(Nu	setup.cfgulinkuegg_info(u_sdistumake_release_treeuosupathujoinuhasattruexistsuunlinku	copy_fileuget_finalized_commandusave_version_info(uselfubase_dirufilesudest((u1/tmp/pip-k8wh6o-build/setuptools/command/sdist.pyumake_release_tree�s!
usdist.make_release_treec
CsYtjj|j�sdSt|jd�}z|j�}Wd|j�X|dj�kS(NurbUu+# file GENERATED by distutils, do NOT edit
F(	uosupathuisfileumanifestuFalseuopenureadlineucloseuencode(uselfufpu
first_line((u1/tmp/pip-k8wh6o-build/setuptools/command/sdist.pyu_manifest_is_not_generated�su sdist._manifest_is_not_generatedcCs�tjd|j�t|jd�}x�|D]�}tjdkr�y|jd�}Wq�tk
r|tjd|�w,Yq�Xn|j	�}|j
d�s,|r�q,n|jj|�q,W|j
�dS(	u�Read the manifest file (named by 'self.manifest') and use it to
        fill in 'self.filelist', the list of files to include in the source
        distribution.
        ureading manifest file '%s'urbUiuUTF-8u"%r not UTF-8 decodable -- skippingu#N(i(uloguinfoumanifestuopenusysuversion_infoudecodeuUnicodeDecodeErroruwarnustripu
startswithufilelistuappenduclose(uselfumanifestuline((u1/tmp/pip-k8wh6o-build/setuptools/command/sdist.pyu
read_manifest�s

usdist.read_manifestN(uformats=Nu6formats for source distribution (comma-separated list)(u	dist-dir=uduFdirectory to put the source distribution archive(s) in [default: dist](iii(ii(iii(ii(iii(u__name__u
__module__u__qualname__u__doc__uNoneuuser_optionsunegative_opturunu_sdist__read_template_hackusysuversion_infouhas_leaky_handleu
read_templateuadd_defaultsucheck_readmeumake_release_treeu_manifest_is_not_generatedu
read_manifest(u
__locals__((u1/tmp/pip-k8wh6o-build/setuptools/command/sdist.pyusdistEs*		5	
usdist(uREADMEu
README.rstu
README.txt(uosureusysuglobu
pkg_resourcesudistutils.command.sdistusdistu_sdistudistutils.utiluconvert_pathu	distutilsulogu
setuptoolsu	svn_utilsuREADMESuwalk_revctrluobjectu	re_finderu_default_revctrlucompileuMu
svn_finderufinders(((u1/tmp/pip-k8wh6o-build/setuptools/command/sdist.pyu<module>s site-packages/setuptools/command/__pycache__/saveopts.cpython-33.pyc000064400000002517151733464030021635 0ustar00�
�Re�c@sXddlZddlZddlmZddlmZmZGdd�de�ZdS(iN(uCommand(uedit_configuoption_basecBs,|EeZdZdZdZdd�ZdS(usaveoptsu#Save command-line options to a fileu7save supplied options to setup.cfg or other config filecCs�|j}i}xt|jD]i}|dkr1qnxN|j|�j�D]7\}\}}|dkrG||j|i�|<qGqGWqWt|j||j�dS(Nusaveoptsucommand line(udistributionucommand_optionsuget_option_dictuitemsu
setdefaultuedit_configufilenameudry_run(uselfudistusettingsucmduoptusrcuval((u4/tmp/pip-k8wh6o-build/setuptools/command/saveopts.pyurun
s	(!usaveopts.runN(u__name__u
__module__u__qualname__u__doc__udescriptionurun(u
__locals__((u4/tmp/pip-k8wh6o-build/setuptools/command/saveopts.pyusaveoptssusaveopts(u	distutilsuosu
setuptoolsuCommandusetuptools.command.setoptuedit_configuoption_baseusaveopts(((u4/tmp/pip-k8wh6o-build/setuptools/command/saveopts.pyu<module>ssite-packages/setuptools/command/__pycache__/test.cpython-33.pyc000064400000015221151733464030020744 0ustar00�
�Re,c@s�ddlmZddlmZddlZddlTddlmZddlmZm	Z	Gdd�de�Z
Gd	d
�d
e�ZdS(i(uCommand(uDistutilsOptionErrorN(u*(u_namespace_packages(u
TestLoaderumaincBs |EeZdZdd�ZdS(uScanningLoadercCs,g}|jdkr1|jtj||��nt|d�rV|j|j��nt|d�rx�t|jd�D]�}|jd�r�|dkr�|jd|dd
�}n-t|j|d
�rx|jd|}nqx|j|j	|��qxWnt
|�dkr |j|�S|dSdS(uReturn a suite of all tests cases contained in the given module

        If the module is a package, load tests from all the modules in it.
        If the module has an ``additional_tests`` function, call it and add
        the return value to the tests.
        usetuptools.tests.doctestuadditional_testsu__path__uu.pyu__init__.pyu.Niu/__init__.pyiii����(u__name__uappendu
TestLoaderuloadTestsFromModuleuhasattruadditional_testsuresource_listdiruendswithuresource_existsuloadTestsFromNameulenu
suiteClass(uselfumoduleutestsufileu	submodule((u0/tmp/pip-k8wh6o-build/setuptools/command/test.pyuloadTestsFromModule
s"
u"ScanningLoader.loadTestsFromModuleN(u__name__u
__module__u__qualname__uloadTestsFromModule(u
__locals__((u0/tmp/pip-k8wh6o-build/setuptools/command/test.pyuScanningLoadersuScanningLoadercBsh|EeZdZdZdZddgZd	d
�Zdd�Zd
d�Zdd�Z	dd�Z
dS(utestu.Command to run unit tests after in-place buildu#run unit tests after in-place buildutest-module=umu$Run 'test_suite' in specified moduleutest-suite=usu1Test suite to run (e.g. 'some_module.test_suite')cCsd|_d|_d|_dS(N(uNoneu
test_suiteutest_moduleutest_loader(uself((u0/tmp/pip-k8wh6o-build/setuptools/command/test.pyuinitialize_options7s		utest.initialize_optionscCs�|jdkrC|jdkr0|jj|_q[|jd|_n|jr[td��n|jg|_|jr�|jjdd�n|jdkr�t	|jdd�|_n|jdkr�d|_ndS(Nu.test_suiteu1You may specify a module or a suite, but not bothiu	--verboseutest_loaderu&setuptools.command.test:ScanningLoader(
u
test_suiteuNoneutest_moduleudistributionuDistutilsOptionErroru	test_argsuverboseuinsertutest_loaderugetattr(uself((u0/tmp/pip-k8wh6o-build/setuptools/command/test.pyufinalize_options=s		utest.finalize_optionscCs�tjd
kr�t|jdd�r�|jddd�|jd�|jd�}t|j	�}|jdd|�|jd�|jddd�|jd�n-|jd�|jddd	�|jd�|jd�}tj
dd�}tjj�}z[tj
j
dt|j��tj�td
d��td|j|jf�|�Wd|tj
dd�<tjj�tjj|�tj�XdS(Niuuse_2to3ubuild_pyuinplaceiuegg_infouegg_baseu	build_exticSs
|j�S(N(uactivate(udist((u0/tmp/pip-k8wh6o-build/setuptools/command/test.pyu<lambda>tsu/test.with_project_on_sys_path.<locals>.<lambda>u%s==%s(iF(usysuversion_infougetattrudistributionuFalseureinitialize_commandurun_commanduget_finalized_commandunormalize_pathu	build_libupathumodulesucopyuinsertuegg_baseuworking_setu__init__uadd_activation_listenerurequireuegg_nameuegg_versionuclearuupdate(uselfufuncubpy_cmdu
build_pathuei_cmduold_pathuold_modules((u0/tmp/pip-k8wh6o-build/setuptools/command/test.pyuwith_project_on_sys_pathTs2$





utest.with_project_on_sys_pathcCs�|jjr%|jj|jj�n|jjrJ|jj|jj�n|jr�dj|j�}|jr�|jd|�q�|jd|�|j	|j
�ndS(Nu u skipping "unittest %s" (dry run)urunning "unittest %s"(udistributionuinstall_requiresufetch_build_eggsu
tests_requireu
test_suiteujoinu	test_argsudry_runuannounceuwith_project_on_sys_pathu	run_tests(uselfucmd((u0/tmp/pip-k8wh6o-build/setuptools/command/test.pyurun~s		utest.runcCs2ddl}tjd	kr�t|jdd
�r�|jdjd�d}|tkr�g}|tj	kr{|j
|�n|d7}x0tj	D]%}|j|�r�|j
|�q�q�Wtt
tj	j|��q�ntjd|j�}|jdd
�}|�}|jdd|jg|jd|�dS(Niiuuse_2to3iu.ux=urequireu
testLoader(iFi����(uunittestusysuversion_infougetattrudistributionuFalseu	test_argsusplitu_namespace_packagesumodulesuappendu
startswithulistumapu__delitem__u
EntryPointuparseutest_loaderuloadumainuNoneu__file__(uselfuunittestumoduleudel_modulesunameu	loader_epuloader_classucks((u0/tmp/pip-k8wh6o-build/setuptools/command/test.pyu	run_tests�s$$
	utest.run_testsN(utest-module=umu$Run 'test_suite' in specified module(utest-suite=usu1Test suite to run (e.g. 'some_module.test_suite')(u__name__u
__module__u__qualname__u__doc__udescriptionuuser_optionsuinitialize_optionsufinalize_optionsuwith_project_on_sys_pathurunu	run_tests(u
__locals__((u0/tmp/pip-k8wh6o-build/setuptools/command/test.pyutest+s	*utest(u
setuptoolsuCommandudistutils.errorsuDistutilsOptionErrorusysu
pkg_resourcesu_namespace_packagesuunittestu
TestLoaderumainuScanningLoaderutest(((u0/tmp/pip-k8wh6o-build/setuptools/command/test.pyu<module>s
#site-packages/setuptools/command/__pycache__/install_scripts.cpython-33.pyc000064400000006106151733464030023204 0ustar00�
�Rec@sbddlmZddlmZmZmZddlZddlm	Z	Gdd�de�ZdS(i(uinstall_scripts(uDistributionuPathMetadatauensure_directoryN(ulogcBsA|EeZdZdZdd�Zdd�Zddd�Zd	S(
uinstall_scriptsu;Do normal script install, plus any egg_info wrapper scriptscCstj|�d|_dS(NF(u_install_scriptsuinitialize_optionsuFalseuno_ep(uself((u;/tmp/pip-k8wh6o-build/setuptools/command/install_scripts.pyuinitialize_options
s
u"install_scripts.initialize_optionsc	Csddlm}ddlm}|jd�|jjrItj|�n	g|_|j	r_dS|j
d�}t|jt
|j|j�|j|j�}|j
d�}t|d|�}t|j
d�dd	�}x'||||�D]}|j|�q�WdS(
Ni(uget_script_args(usys_executableuegg_infou
build_scriptsu
executableu
bdist_wininstu_is_runningF(usetuptools.command.easy_installuget_script_argsusys_executableurun_commandudistributionuscriptsu_install_scriptsurunuoutfilesuno_epuget_finalized_commanduDistributionuegg_baseuPathMetadatauegg_infouegg_nameuegg_versionugetattruFalseuwrite_script(	uselfuget_script_argsusys_executableuei_cmdudistubs_cmdu
executableu
is_wininstuargs((u;/tmp/pip-k8wh6o-build/setuptools/command/install_scripts.pyuruns$
		uinstall_scripts.runutc
Gs�ddlm}m}tjd||j�tjj|j|�}|j	j
|�|�}|js�t|�t
|d|�}	|	j|�|	j�||d|�ndS(u1Write an executable file to the scripts directoryi(uchmodu
current_umaskuInstalling %s script to %suwi�N(usetuptools.command.easy_installuchmodu
current_umaskuloguinfouinstall_diruosupathujoinuoutfilesuappendudry_runuensure_directoryuopenuwriteuclose(
uselfuscript_nameucontentsumodeuignoreduchmodu
current_umaskutargetumaskuf((u;/tmp/pip-k8wh6o-build/setuptools/command/install_scripts.pyuwrite_script(s		


uinstall_scripts.write_scriptN(u__name__u
__module__u__qualname__u__doc__uinitialize_optionsurunuwrite_script(u
__locals__((u;/tmp/pip-k8wh6o-build/setuptools/command/install_scripts.pyuinstall_scriptssuinstall_scripts(
u!distutils.command.install_scriptsuinstall_scriptsu_install_scriptsu
pkg_resourcesuDistributionuPathMetadatauensure_directoryuosu	distutilsulog(((u;/tmp/pip-k8wh6o-build/setuptools/command/install_scripts.pyu<module>ssite-packages/setuptools/command/__pycache__/__init__.cpython-33.pyc000064400000001550151733464030021524 0ustar00�
�Re)c@s�dddddddddd	d
ddd
ddddddgZddlmZddlZddlmZdejkr�dejd<ejjd�n[[dS(ualiasu	bdist_eggu	bdist_rpmu	build_extubuild_pyudevelopueasy_installuegg_infouinstalluinstall_liburotateusaveoptsusdistusetoptutestuinstall_egg_infouinstall_scriptsuregisteru
bdist_wininstuupload_docsi(uinstall_scriptsN(ubdistuegguPython .egg file(u	bdist_egguPython .egg file(	u__all__usetuptools.commanduinstall_scriptsusysudistutils.command.bdistubdistuformat_commandsuformat_commanduappend(((u4/tmp/pip-k8wh6o-build/setuptools/command/__init__.pyu<module>s
site-packages/setuptools/command/__pycache__/upload_docs.cpython-33.pyc000064400000017334151733464030022270 0ustar00�
�Re�c@sdZddlZddlZddlZddlZddlZddlZddlmZddl	m
Z
ddlmZddl
mZddlmZddlmZmZmZmZmZer�d	nd
Zddd
�ZGdd�de�ZdS(upupload_docs

Implements a Distutils 'upload_docs' subcommand (upload documentation to
PyPI's pythonhosted.org).
iN(ustandard_b64encode(uiter_entry_points(ulog(uDistutilsOptionError(uupload(uhttplibuurlparseuunicodeu	iteritemsuPY3usurrogateescapeustrictuutf-8cCs#t|t�r|j|t�S|S(N(u
isinstanceuunicodeuencodeuerrors(usuencoding((u7/tmp/pip-k8wh6o-build/setuptools/command/upload_docs.pyubsubcBs�|EeZdZdZdddejfddgZejZd	d
�Z	de	fgZ
dd
�Zdd�Zdd�Z
dd�Zdd�ZdS(uupload_docsuUpload documentation to PyPIurepository=uruurl of repository [default: %s]u
show-responseu&display full response text from serveruupload-dir=udirectory to uploadcCs1|jdkr-xtdd�D]}dSWndS(Nudistutils.commandsubuild_sphinxT(u
upload_diruNoneuiter_entry_pointsuTrue(uselfuep((u7/tmp/pip-k8wh6o-build/setuptools/command/upload_docs.pyu
has_sphinx0suupload_docs.has_sphinxubuild_sphinxcCs#tj|�d|_d|_dS(N(uuploaduinitialize_optionsuNoneu
upload_diru
target_dir(uself((u7/tmp/pip-k8wh6o-build/setuptools/command/upload_docs.pyuinitialize_options7s
	uupload_docs.initialize_optionscCs�tj|�|jdkrs|j�rF|jd�}|j|_q�|jd�}tj	j
|jd�|_n|jd�|j|_|j
d|j�dS(Nubuild_sphinxubuildudocsu
upload_diruUsing upload directory %s(uuploadufinalize_optionsu
upload_diruNoneu
has_sphinxuget_finalized_commandubuilder_target_diru
target_diruosupathujoinu
build_baseuensure_dirnameuannounce(uselfubuild_sphinxubuild((u7/tmp/pip-k8wh6o-build/setuptools/command/upload_docs.pyufinalize_options<s

uupload_docs.finalize_optionsc
Cs�tj|d�}z�|j|j�x�tj|j�D]�\}}}||jkrs|rstd|j��nxp|D]h}tjj||�}|t	|j�d�j
tjj�}tjj||�}	|j||	�qzWq8WWd|j
�XdS(Nuwu'no files found in upload directory '%s'(uzipfileuZipFileumkpathu
target_diruosuwalkuDistutilsOptionErrorupathujoinulenulstripusepuwriteuclose(
uselfufilenameuzip_fileurootudirsufilesunameufullurelativeudest((u7/tmp/pip-k8wh6o-build/setuptools/command/upload_docs.pyucreate_zipfileJs"
(uupload_docs.create_zipfilecCs�x!|j�D]}|j|�q
Wtj�}|jjj�}tjj	|d|�}z|j
|�|j|�Wdtj
|�XdS(Nu%s.zip(uget_sub_commandsurun_commandutempfileumkdtempudistributionumetadatauget_nameuosupathujoinucreate_zipfileuupload_fileushutilurmtree(uselfucmd_nameutmp_dirunameuzip_file((u7/tmp/pip-k8wh6o-build/setuptools/command/upload_docs.pyurun[s
uupload_docs.runcCslt|d�}|j�}|j�|jj}idd6|j�d6tjj|�|fd6}t	|j
d|j�}t|�}t
r�|jd�}nd|}d	}t	d
�t	|�}	|	t	d�}
g}xt|�D]�\}}
d|}t|
t�r|
g}
nx�|
D]�}t|�tkrZ|d
|d7}|d}nt	|�}|j|	�|jt	|��|jt	d��|j|�|r#|d&d�t	d�kr#|jt	d��q#q#Wq�W|j|
�|jt	d��t	d�j|�}|jd|jtj�t|j�\}}}}}}|rk|rk|sqt�|dkr�tj|�}n.|dkr�tj|�}ntd|��d}y{|j�|j d|�d|}|j!d|�|j!dt"t#|���|j!d|�|j$�|j%|�WnBt&j'k
r�t(j)�d}|jt"|�tj*�dSYnX|j+�}|j,dkr�|jd|j,|j-ftj�nz|j,dkr|j.d �}|dkrd!|j�}n|jd"|tj�n#|jd#|j,|j-ftj*�|j0rht1d$d%|j�d$d%�ndS('Nurbu
doc_uploadu:actionunameucontentu:uasciiuBasic u3--------------GHSKFJDLGDS7543FJKLFHRE75642756743254u
--u--u*
Content-Disposition: form-data; name="%s"u; filename="%s"iiu

u
u
uuSubmitting documentation to %suhttpuhttpsuunsupported schema uPOSTu multipart/form-data; boundary=%suContent-typeuContent-lengthu
Authorizationi�uServer response (%s): %si-uLocationuhttps://pythonhosted.org/%s/uUpload successful. Visit %suUpload failed (%s): %su-iKi����(2uopenureaducloseudistributionumetadatauget_nameuosupathubasenameubuusernameupasswordustandard_b64encodeuPY3udecodeu	iteritemsu
isinstanceulistutypeutupleuappendujoinuannounceu
repositoryuloguINFOuurlparseuAssertionErroruhttplibuHTTPConnectionuHTTPSConnectionuconnectu
putrequestu	putheaderustrulenu
endheadersusendusocketuerrorusysuexc_infouERRORugetresponseustatusureasonu	getheaderuNoneu
show_responseuprint(uselfufilenameufucontentumetaudataucredentialsuauthuboundaryusep_boundaryuend_boundaryubodyukeyuvaluesutitleuvalueuschemaunetlocuurluparamsuqueryu	fragmentsuconnucontent_typeueurulocation((u7/tmp/pip-k8wh6o-build/setuptools/command/upload_docs.pyuupload_fileis�







"

!


	



	uupload_docs.upload_fileN(u
show-responseNu&display full response text from server(uupload-dir=Nudirectory to upload(u__name__u
__module__u__qualname__udescriptionuuploaduDEFAULT_REPOSITORYuNoneuuser_optionsuboolean_optionsu
has_sphinxusub_commandsuinitialize_optionsufinalize_optionsucreate_zipfileurunuupload_file(u
__locals__((u7/tmp/pip-k8wh6o-build/setuptools/command/upload_docs.pyuupload_docs#s
		uupload_docs(u__doc__uosusocketuzipfileutempfileusysushutilubase64ustandard_b64encodeu
pkg_resourcesuiter_entry_pointsu	distutilsulogudistutils.errorsuDistutilsOptionErrorudistutils.command.uploaduuploadusetuptools.compatuhttplibuurlparseuunicodeu	iteritemsuPY3uerrorsubuupload_docs(((u7/tmp/pip-k8wh6o-build/setuptools/command/upload_docs.pyu<module>s(site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-33.pyc000064400000005524151733464030021755 0ustar00�
�Re�c@sBddlmZddlZddlZGdd�de�ZdS(i(u	bdist_rpmNcBsY|EeZdZdd�Zejdkr=ddd�Zndd�Zd	d
�ZdS(u	bdist_rpmcCstj|�d|_dS(N(u
_bdist_rpmuinitialize_optionsuNoneuno_egg(uself((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_rpm.pyuinitialize_optionss
ubdist_rpm.initialize_optionsu2.5ic
Cs�tj||||�||jkr�|jd�r�t|jdg�jd|jd�radpqtjdd�t	j
j|t	j
j|��f�ndS(Nu.rpmu
dist_filesu	bdist_rpmu.src.rpmuanyi(
u
_bdist_rpmu	move_fileudist_diruendswithugetattrudistributionuappendusysuversionuosupathujoinubasename(uselfusrcudstulevel((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_rpm.pyu	move_files%ubdist_rpm.move_filecCs|jd�tj|�dS(Nuegg_info(urun_commandu
_bdist_rpmurun(uself((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_rpm.pyuruns
u
bdist_rpm.runcs�|jj�}|jdd�}tj|�}d|�d|���fdd�|D�}|j|j��dd|�|S(Nu-u_u%define version csFg|]<}|jdd�jdd�jdd�j����qS(uSource0: %{name}-%{version}.taru)Source0: %{name}-%{unmangled_version}.tarusetup.py install u5setup.py install --single-version-externally-managed u%setupu&%setup -n %{name}-%{unmangled_version}(ureplace(u.0uline(uline23uline24(u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_rpm.pyu
<listcomp>1s	
u-bdist_rpm._make_spec_file.<locals>.<listcomp>iu%define unmangled_version (udistributionuget_versionureplaceu
_bdist_rpmu_make_spec_fileuinsertuindex(uselfuversionu
rpmversionuspec((uline23uline24u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_rpm.pyu_make_spec_file*s



!ubdist_rpm._make_spec_fileN(	u__name__u
__module__u__qualname__uinitialize_optionsusysuversionu	move_fileurunu_make_spec_file(u
__locals__((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_rpm.pyu	bdist_rpm	s
	u	bdist_rpm(udistutils.command.bdist_rpmu	bdist_rpmu
_bdist_rpmusysuos(((u5/tmp/pip-k8wh6o-build/setuptools/command/bdist_rpm.pyu<module>ssite-packages/setuptools/command/__pycache__/develop.cpython-33.pyc000064400000015542151733464030021431 0ustar00�
�Re/c@s�ddlmZddlmZmZddlmZmZmZddl	m
Z
ddlmZm
Z
ddlZddlZddlZddlZGdd�de�ZdS(	i(ueasy_install(uconvert_pathu
subst_vars(uDistributionuPathMetadataunormalize_path(ulog(uDistutilsErroruDistutilsOptionErrorNcBs�|EeZdZdZdZejddgZejdgZdZ
dd	�Zd
d�Zdd
�Z
dd�Zdd�Zdd�ZdS(udevelopuSet up package for developmentu%install package in 'development mode'u	uninstalluuuUninstall this source packageu	egg-path=u-Set the path to be used in the .egg-link filecCs7|jrd|_|j�n
|j�|j�dS(NT(u	uninstalluTrueu
multi_versionuuninstall_linkuinstall_for_developmentuwarn_deprecated_options(uself((u3/tmp/pip-k8wh6o-build/setuptools/command/develop.pyuruns
		

udevelop.runcCs5d|_d|_tj|�d|_d|_dS(Nu.(uNoneu	uninstalluegg_pathueasy_installuinitialize_optionsu
setup_pathualways_copy_from(uself((u3/tmp/pip-k8wh6o-build/setuptools/command/develop.pyuinitialize_optionss
		
	udevelop.initialize_optionscCs�|jd�}|jr7td|j|jf��n|jg|_tj|�|j�|j	�|j
jtjd��t
jj|j|jd�|_|j|_|jdkr�t
jj|j�|_nt|j�}tt
jj|j|j��|kr!td|��nt|t|t
jj|j��d|j�|_|jjt
jd�}|t
jkr�d|jd�d	}n||_tt
jj|j|j|��}|tt
j�kr�td
|tt
j���ndS(Nuegg_infou-Please rename %r to %r before using 'develop'u*.eggu	.egg-linkuA--egg-path must be a relative path from the install directory to uproject_nameu/u../iuGCan't get a consistent path to setup script from installation directory( uget_finalized_commandubroken_egg_infouDistutilsErroruegg_infouegg_nameuargsueasy_installufinalize_optionsuexpand_basedirsuexpand_dirsu
package_indexuscanuglobuosupathujoinuinstall_diruegg_linkuegg_baseuegg_pathuNoneuabspathunormalize_pathuDistutilsOptionErroruDistributionuPathMetadataudistureplaceusepucurdirucountu
setup_path(uselfueiutargetup((u3/tmp/pip-k8wh6o-build/setuptools/command/develop.pyufinalize_options's@	


"'
	$udevelop.finalize_optionscCs�tjd
kr�t|jdd�r�|jddd�|jd�|jd�}t|j	�}|jdd|�|jd�|jddd�|jd�|jd�}||_
||j_t
||j�|j_n-|jd�|jddd	�|jd�|j�tjr=|jtj�dt_ntjd
|j|j�|js�t|jd�}|j|j
d|j�|j�n|jd|j|j�dS(Niuuse_2to3ubuild_pyuinplaceiuegg_infouegg_baseu	build_extiuCreating %s (link to %s)uwu
(iF( usysuversion_infougetattrudistributionuFalseureinitialize_commandurun_commanduget_finalized_commandunormalize_pathu	build_libuegg_pathudistulocationuPathMetadatauegg_infou	_provideruinstall_site_pyu
setuptoolsubootstrap_install_fromueasy_installuNoneuloguinfouegg_linkuegg_baseudry_runuopenuwriteu
setup_pathucloseuprocess_distributionuno_deps(uselfubpy_cmdu
build_pathuei_cmduf((u3/tmp/pip-k8wh6o-build/setuptools/command/develop.pyuinstall_for_developmentVs4$


	


		
udevelop.install_for_developmentcCs�tjj|j�r�tjd|j|j�t|j�}dd�|D�}|j�||j	g|j	|j
gfkr�tjd|�dS|js�tj
|j�q�n|js�|j|j�n|jjr�tjd�ndS(NuRemoving %s (link to %s)cSsg|]}|j��qS((urstrip(u.0uline((u3/tmp/pip-k8wh6o-build/setuptools/command/develop.pyu
<listcomp>�s	u*develop.uninstall_link.<locals>.<listcomp>u$Link points to %s: uninstall abortedu5Note: you must uninstall or replace scripts manually!(uosupathuexistsuegg_linkuloguinfouegg_baseuopenucloseuegg_pathu
setup_pathuwarnudry_runuunlinku
update_pthudistudistributionuscripts(uselfu
egg_link_fileucontents((u3/tmp/pip-k8wh6o-build/setuptools/command/develop.pyuuninstall_link�s
$		udevelop.uninstall_linkcCs�||jk	rtj||�S|j|�x|jjp>gD]k}tjjt	|��}tjj
|�}t|d�}|j�}|j
�|j||||�q?WdS(NurU(udistueasy_installuinstall_egg_scriptsuinstall_wrapper_scriptsudistributionuscriptsuosupathuabspathuconvert_pathubasenameuopenureaducloseuinstall_script(uselfudistuscript_nameuscript_pathufuscript_text((u3/tmp/pip-k8wh6o-build/setuptools/command/develop.pyuinstall_egg_scripts�s

udevelop.install_egg_scriptsN(u	uninstalluuuUninstall this source package(u	egg-path=Nu-Set the path to be used in the .egg-link fileF(u__name__u
__module__u__qualname__u__doc__udescriptionueasy_installuuser_optionsuNoneuboolean_optionsuFalseucommand_consumes_argumentsurunuinitialize_optionsufinalize_optionsuinstall_for_developmentuuninstall_linkuinstall_egg_scripts(u
__locals__((u3/tmp/pip-k8wh6o-build/setuptools/command/develop.pyudevelops
	/.udevelop(usetuptools.command.easy_installueasy_installudistutils.utiluconvert_pathu
subst_varsu
pkg_resourcesuDistributionuPathMetadataunormalize_pathu	distutilsulogudistutils.errorsuDistutilsErroruDistutilsOptionErroruosusysu
setuptoolsuglobudevelop(((u3/tmp/pip-k8wh6o-build/setuptools/command/develop.pyu<module>s0site-packages/setuptools/command/__pycache__/install_egg_info.cpython-33.pyc000064400000012514151733464030023272 0ustar00�
�Re�c@stddlmZddlmZddlmZmZddlZddlZddl	Z	Gdd�de�Z
dS(i(uCommand(uunpack_archive(ulogudir_utilNcBs}|EeZdZdZdZdgZdd�Zdd�Zd	d
�Zdd�Z	d
d�Z
dd�Zdd�ZdS(uinstall_egg_infou.Install an .egg-info directory for the packageuinstall-dir=ududirectory to install tocCs
d|_dS(N(uNoneuinstall_dir(uself((u</tmp/pip-k8wh6o-build/setuptools/command/install_egg_info.pyuinitialize_optionssu#install_egg_info.initialize_optionscCs�|jdd�|jd�}tjdd|j|j�j�d}|j|_t	j
j|j|�|_
|j
g|_dS(Nuinstall_libuinstall_diruegg_infou	.egg-info(uinstall_diruinstall_dir(uset_undefined_optionsuget_finalized_commandu
pkg_resourcesuDistributionuNoneuegg_nameuegg_versionuegg_infousourceuosupathujoinuinstall_dirutargetuoutputs(uselfuei_cmdubasename((u</tmp/pip-k8wh6o-build/setuptools/command/install_egg_info.pyufinalize_optionssu!install_egg_info.finalize_optionscCs�|jd�|j}tjj|j�r]tjj|j�r]tj|jd|j�n;tjj	|j�r�|j
tj|jfd|j�n|js�tj
|j�n|j
|jfd|j|jf�|j�dS(Nuegg_infoudry_runu	Removing uCopying %s to %s(urun_commandutargetuosupathuisdiruislinkudir_utiluremove_treeudry_runuexistsuexecuteuunlinku
pkg_resourcesuensure_directoryucopytreeusourceuinstall_namespaces(uselfutarget((u</tmp/pip-k8wh6o-build/setuptools/command/install_egg_info.pyuruns
	+&	uinstall_egg_info.runcCs|jS(N(uoutputs(uself((u</tmp/pip-k8wh6o-build/setuptools/command/install_egg_info.pyuget_outputs*suinstall_egg_info.get_outputscs,�fdd�}t�j�j|�dS(Ncs[x1dD])}|j|�s,d||krdSqW�jj|�tjd||�|S(Nu.svn/uCVS/u/uCopying %s to %s(u.svn/uCVS/(u
startswithuNoneuoutputsuappendulogudebug(usrcudstuskip(uself(u</tmp/pip-k8wh6o-build/setuptools/command/install_egg_info.pyuskimmer/s
u*install_egg_info.copytree.<locals>.skimmer(uunpack_archiveusourceutarget(uselfuskimmer((uselfu</tmp/pip-k8wh6o-build/setuptools/command/install_egg_info.pyucopytree-s
uinstall_egg_info.copytreecCs|j�}|sdStjj|j�\}}|d7}|jj|�tjd|�|j	st
|d�}x|D]w}t|�}t|j
d��}d}d|kr�ddj|dd	��|d
f}n|jdt��qzW|j�ndS(Nu
-nspkg.pthu
Installing %suwtu.u
u(; m and setattr(sys.modules[%r], %r, m)
iu7import sys,types,os; p = os.path.join(sys._getframe(1).f_locals['sitedir'], *%(pth)r); ie = os.path.exists(os.path.join(p,'__init__.py')); m = not ie and sys.modules.setdefault(%(pkg)r,types.ModuleType(%(pkg)r)); mp = (m or []) and m.__dict__.setdefault('__path__',[]); (p not in mp) and mp.append(p)%(trailer)si����i����(u_get_all_ns_packagesuosupathusplitextutargetuoutputsuappenduloguinfoudry_runuopenustrutupleusplitujoinuwriteulocalsuclose(uselfunspufilenameuextufupkgupthutrailer((u</tmp/pip-k8wh6o-build/setuptools/command/install_egg_info.pyuinstall_namespacesSs(
	
'u#install_egg_info.install_namespacescCsvi}xS|jjpgD]?}|jd�}x'|rWd|dj|�<|j�q1WqWt|�}|j�|S(Nu.i(udistributionunamespace_packagesusplitujoinupopulistusort(uselfunspupkg((u</tmp/pip-k8wh6o-build/setuptools/command/install_egg_info.pyu_get_all_ns_packagesrs	
u%install_egg_info._get_all_ns_packagesN(uinstall-dir=ududirectory to install to(
u__name__u
__module__u__qualname__u__doc__udescriptionuuser_optionsuinitialize_optionsufinalize_optionsurunuget_outputsucopytreeuinstall_namespacesu_get_all_ns_packages(u
__locals__((u</tmp/pip-k8wh6o-build/setuptools/command/install_egg_info.pyuinstall_egg_infos	
&uinstall_egg_info(u
setuptoolsuCommandusetuptools.archive_utiluunpack_archiveu	distutilsulogudir_utiluosushutilu
pkg_resourcesuinstall_egg_info(((u</tmp/pip-k8wh6o-build/setuptools/command/install_egg_info.pyu<module>s$site-packages/setuptools/command/__pycache__/register.cpython-33.pyc000064400000001441151733464030021610 0ustar00�
�Rec@s*ddlmZGdd�de�ZdS(i(uregistercBs)|EeZdZejZdd�ZdS(uregistercCs|jd�tj|�dS(Nuegg_info(urun_commandu	_registerurun(uself((u4/tmp/pip-k8wh6o-build/setuptools/command/register.pyuruns
uregister.runN(u__name__u
__module__u__qualname__u	_registeru__doc__urun(u
__locals__((u4/tmp/pip-k8wh6o-build/setuptools/command/register.pyuregisters	uregisterN(udistutils.command.registeruregisteru	_register(((u4/tmp/pip-k8wh6o-build/setuptools/command/register.pyu<module>ssite-packages/setuptools/command/__pycache__/build_py.cpython-33.pyc000064400000026567151733464030021613 0ustar00�
�Re� c
@s�ddlZddlZddlZddlZddlmZddlmZddl	m	Z	yddl
mZWn%ek
r�Gdd�d�ZYnXGdd	�d	ee�Zd
d�Z
dS(iN(ubuild_py(uconvert_path(uglob(u	Mixin2to3cBs#|EeZdZddd�ZdS(u	Mixin2to3cCsdS(u
do nothingN((uselfufilesudoctests((u4/tmp/pip-k8wh6o-build/setuptools/command/build_py.pyurun_2to3
suMixin2to3.run_2to3NT(u__name__u
__module__u__qualname__uTrueurun_2to3(u
__locals__((u4/tmp/pip-k8wh6o-build/setuptools/command/build_py.pyu	Mixin2to3su	Mixin2to3cBs�|EeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Ze
jdkr�ddd�Zndd�Zdd�Zdd�Zdd�Zd S(!ubuild_pyuXEnhanced 'build_py' command that includes data files with packages

    The data files are specified via a 'package_data' argument to 'setup()'.
    See 'setuptools.dist.Distribution' for more details.

    Also, this version of the 'build_py' command allows you to specify both
    'py_modules' and 'packages' in the same setup operation.
    cCsctj|�|jj|_|jjp+i|_d|jkrM|jd=ng|_g|_dS(Nu
data_files(u	_build_pyufinalize_optionsudistributionupackage_datauexclude_package_datau__dict__u_build_py__updated_filesu_build_py__doctests_2to3(uself((u4/tmp/pip-k8wh6o-build/setuptools/command/build_py.pyufinalize_optionss

	ubuild_py.finalize_optionscCs�|jr|jrdS|jr.|j�n|jrN|j�|j�n|j|jd�|j|jd�|j|j	d�|j
tj|dd��dS(u?Build modules, packages, and copy data files to build directoryNuinclude_bytecodeiFT(
u
py_modulesupackagesu
build_modulesubuild_packagesubuild_package_dataurun_2to3u_build_py__updated_filesuFalseuTrueu_build_py__doctests_2to3ubyte_compileu	_build_pyuget_outputs(uself((u4/tmp/pip-k8wh6o-build/setuptools/command/build_py.pyurun!s	
	

ubuild_py.runcCs3|dkr#|j�|_}|Stj||�S(Nu
data_files(u_get_data_filesu
data_filesu	_build_pyu__getattr__(uselfuattrufiles((u4/tmp/pip-k8wh6o-build/setuptools/command/build_py.pyu__getattr__5subuild_py.__getattr__cCsAtj||||�\}}|r7|jj|�n||fS(N(u	_build_pyubuild_moduleu_build_py__updated_filesuappend(uselfumoduleumodule_fileupackageuoutfileucopied((u4/tmp/pip-k8wh6o-build/setuptools/command/build_py.pyubuild_module;subuild_py.build_modulecs�|j�g}x�|jpfD]�}|j|�}tjj|jg|jd��}t|�d��fdd�|j	||�D�}|j
||||f�q W|S(u?Generate list of '(package,src_dir,build_dir,filenames)' tuplesu.ics g|]}|�d��qS(N((u.0ufile(uplen(u4/tmp/pip-k8wh6o-build/setuptools/command/build_py.pyu
<listcomp>Qs	u,build_py._get_data_files.<locals>.<listcomp>(uanalyze_manifestupackagesuget_package_diruosupathujoinu	build_libusplitulenufind_data_filesuappend(uselfudataupackageusrc_diru	build_diru	filenames((uplenu4/tmp/pip-k8wh6o-build/setuptools/command/build_py.pyu_get_data_filesAs
%%ubuild_py._get_data_filescCs�|jjdg�|jj|g�}|jj|g�dd�}x6|D].}|jttjj|t|����qNW|j	|||�S(u6Return filenames for package's data files in 'src_dir'uN(
upackage_dataugetumanifest_filesuextenduglobuosupathujoinuconvert_pathuexclude_data_files(uselfupackageusrc_diruglobsufilesupattern((u4/tmp/pip-k8wh6o-build/setuptools/command/build_py.pyufind_data_filesVs
,ubuild_py.find_data_filesc
Cs�x�|jD]�\}}}}x�|D]�}tjj||�}|jtjj|��tjj||�}|j||�\}}	tjj|�}|	r#||jj	kr#|j
j|�q#q#Wq
WdS(u$Copy data files into build directoryN(u
data_filesuosupathujoinumkpathudirnameu	copy_fileuabspathudistributionuconvert_2to3_doctestsu_build_py__doctests_2to3uappend(
uselfupackageusrc_diru	build_diru	filenamesufilenameutargetusrcfileuoutfucopied((u4/tmp/pip-k8wh6o-build/setuptools/command/build_py.pyubuild_package_data`s
ubuild_py.build_package_datacCs\i|_}|jjsdSi}x0|jp2fD]}||t|j|��<q3W|jd�|jd�}x�|jj	D]�}t
jjt|��\}}d}|}	xU|r||kr||kr|}t
jj|�\}}
t
jj|
|�}q�W||kr|jd�r4||	kr4qn|j||g�j|�qqWdS(Nuegg_infou.py(umanifest_filesudistributionuinclude_package_dataupackagesuassert_relativeuget_package_dirurun_commanduget_finalized_commandufilelistufilesuosupathusplituNoneujoinuendswithu
setdefaultuappend(uselfumfusrc_dirsupackageuei_cmdupathudufuprevuoldfudf((u4/tmp/pip-k8wh6o-build/setuptools/command/build_py.pyuanalyze_manifestls(

!ubuild_py.analyze_manifestcCsdS(N((uself((u4/tmp/pip-k8wh6o-build/setuptools/command/build_py.pyuget_data_files�subuild_py.get_data_filesu2.4icCs$tj||�dd�|jD�S(ujReturn complete list of files copied to the build directory

            This includes both '.py' files and data files, as well as '.pyc'
            and '.pyo' files if 'include_bytecode' is true.  (This method is
            needed for the 'install_lib' command to do its job properly, and to
            generate a correct installation manifest.)
            cSs>g|]4\}}}}|D]}tjj||��qqS((uosupathujoin(u.0upackageusrc_diru	build_diru	filenamesufilename((u4/tmp/pip-k8wh6o-build/setuptools/command/build_py.pyu
<listcomp>�s	u(build_py.get_outputs.<locals>.<listcomp>(u	_build_pyuget_outputsu
data_files(uselfuinclude_bytecode((u4/tmp/pip-k8wh6o-build/setuptools/command/build_py.pyuget_outputs�s	ubuild_py.get_outputscCs�y|j|SWntk
r#YnXtj|||�}||j|<|sZ|jjr^|Sx;|jjD])}||ks�|j|d�rkPqkqkW|St|d�}dj�|j	�kr�ddl
m}|jd|�n|j
�|S(u8Check namespace packages' __init__ for declare_namespaceu.urbUudeclare_namespacei(ulogu�WARNING: %s is a namespace package, but its __init__.py does
not declare_namespace(); setuptools 0.7 will REQUIRE this!
(See the setuptools manual under "Namespace Packages" for details.)
(upackages_checkeduKeyErroru	_build_pyu
check_packageudistributionunamespace_packagesu
startswithuopenuencodeureadu	distutilsuloguwarnuclose(uselfupackageupackage_diruinit_pyupkgufulog((u4/tmp/pip-k8wh6o-build/setuptools/command/build_py.pyu
check_package�s(



ubuild_py.check_packagecCsi|_tj|�dS(N(upackages_checkedu	_build_pyuinitialize_options(uself((u4/tmp/pip-k8wh6o-build/setuptools/command/build_py.pyuinitialize_options�s	ubuild_py.initialize_optionscCsAtj||�}|jjdk	r=tjj|jj|�S|S(N(u	_build_pyuget_package_dirudistributionusrc_rootuNoneuosupathujoin(uselfupackageures((u4/tmp/pip-k8wh6o-build/setuptools/command/build_py.pyuget_package_dir�subuild_py.get_package_dircs�|jjdg�|jj|g�}g�x<|D]4}�jtj|tjj|t|����q5Wt	j
���i���fdd�|D�S(u6Filter filenames for package's data files in 'src_dir'ucs@g|]6}|�kr|�kr�j|d�r|�qS(i(u
setdefault(u.0uf(ubaduseen(u4/tmp/pip-k8wh6o-build/setuptools/command/build_py.pyu
<listcomp>�s	u/build_py.exclude_data_files.<locals>.<listcomp>(uexclude_package_dataugetuextendufnmatchufilteruosupathujoinuconvert_pathudictufromkeys(uselfupackageusrc_dirufilesuglobsupattern((ubaduseenu4/tmp/pip-k8wh6o-build/setuptools/command/build_py.pyuexclude_data_files�s
&ubuild_py.exclude_data_filesN(u__name__u
__module__u__qualname__u__doc__ufinalize_optionsurunu__getattr__ubuild_moduleu_get_data_filesufind_data_filesubuild_package_datauanalyze_manifestuget_data_filesusysuversionuget_outputsu
check_packageuinitialize_optionsuget_package_diruexclude_data_files(u
__locals__((u4/tmp/pip-k8wh6o-build/setuptools/command/build_py.pyubuild_pys 
ubuild_pycCsOtjj|�s|Sddlm}tjd�j�|}||��dS(Ni(uDistutilsSetupErroru�
        Error: setup script specifies an absolute path:

            %s

        setup() arguments must *always* be /-separated paths relative to the
        setup.py directory, *never* absolute paths.
        (uosupathuisabsudistutils.errorsuDistutilsSetupErrorutextwrapudedentulstrip(upathuDistutilsSetupErrorumsg((u4/tmp/pip-k8wh6o-build/setuptools/command/build_py.pyuassert_relative�suassert_relative(uosusysufnmatchutextwrapudistutils.command.build_pyubuild_pyu	_build_pyudistutils.utiluconvert_pathuglobusetuptools.lib2to3_exu	Mixin2to3uImportErroruassert_relative(((u4/tmp/pip-k8wh6o-build/setuptools/command/build_py.pyu<module>s
�site-packages/setuptools/command/__pycache__/install.cpython-33.pyc000064400000011005151733464030021427 0ustar00�
�Re�c@s~ddlZddlZddlZddlmZddlmZGdd�de�Zdd�ejD�ej	e_dS(iN(uinstall(uDistutilsArgErrorcBs�|EeZdZdZejddgZejddgZddd�fd	d
d�fgZe	e�Z
dd�Zd
d�Zdd�Z
dd�Zdd�ZdS(uinstallu7Use easy_install to install the package, w/dependenciesuold-and-unmanageableuTry not to use this!u!single-version-externally-managedu5used by system package builders to create 'flat' eggsuinstall_egg_infocCsdS(NT(uTrue(uself((u3/tmp/pip-k8wh6o-build/setuptools/command/install.pyu<lambda>suinstall.<lambda>uinstall_scriptscCsdS(NT(uTrue(uself((u3/tmp/pip-k8wh6o-build/setuptools/command/install.pyu<lambda>scCs,tj|�d|_d|_d|_dS(N(u_installuinitialize_optionsuNoneuold_and_unmanageableu!single_version_externally_managedu
no_compile(uself((u3/tmp/pip-k8wh6o-build/setuptools/command/install.pyuinitialize_optionss
		uinstall.initialize_optionscCsUtj|�|jr"d|_n/|jrQ|jrQ|jrQtd��qQndS(NuAYou must specify --record or --root when building system packagesT(u_installufinalize_optionsurootuTrueu!single_version_externally_managedurecorduDistutilsArgError(uself((u3/tmp/pip-k8wh6o-build/setuptools/command/install.pyufinalize_optionss
		uinstall.finalize_optionscCs5|js|jrtj|�Sd|_d|_dS(Nu(urootu!single_version_externally_managedu_installuhandle_extra_pathuNoneu	path_fileu
extra_dirs(uself((u3/tmp/pip-k8wh6o-build/setuptools/command/install.pyuhandle_extra_path's
	uinstall.handle_extra_pathcCs�|js|jrtj|�Stjd�}|jjdd�}|jj	}|dksg|dkrwtj|�n
|j
�dS(Niu__name__uudistutils.disturun_commands(uold_and_unmanageableu!single_version_externally_managedu_installurunusysu	_getframeu	f_globalsugetuf_codeuco_nameudo_egg_install(uselfucalleru
caller_moduleucaller_name((u3/tmp/pip-k8wh6o-build/setuptools/command/install.pyurun2s
uinstall.runcCs�|jjd�}||jddd|jd|j�}|j�d|_|jjtjd��|j	d�|jj
d�jg}tj
r�|jd	tj
�n||_|j�dt_
dS(
Nueasy_installuargsuxurooturecordu.u*.eggu	bdist_eggi(udistributionuget_command_classurooturecorduensure_finalizedualways_copy_fromu
package_indexuscanugloburun_commanduget_command_obju
egg_outputu
setuptoolsubootstrap_install_fromuinsertuargsurunuNone(uselfueasy_installucmduargs((u3/tmp/pip-k8wh6o-build/setuptools/command/install.pyudo_egg_installPs$
	
		
uinstall.do_egg_installN(uold-and-unmanageableNuTry not to use this!(u!single-version-externally-managedNu5used by system package builders to create 'flat' eggs(u__name__u
__module__u__qualname__u__doc__u_installuuser_optionsuNoneuboolean_optionsunew_commandsudictu_ncuinitialize_optionsufinalize_optionsuhandle_extra_pathurunudo_egg_install(u
__locals__((u3/tmp/pip-k8wh6o-build/setuptools/command/install.pyuinstalls

uinstallcCs)g|]}|dtjkr|�qS(i(uinstallu_nc(u.0ucmd((u3/tmp/pip-k8wh6o-build/setuptools/command/install.pyu
<listcomp>js	u
<listcomp>(
u
setuptoolsusysuglobudistutils.command.installuinstallu_installudistutils.errorsuDistutilsArgErrorusub_commandsunew_commands(((u3/tmp/pip-k8wh6o-build/setuptools/command/install.pyu<module>s
$esite-packages/setuptools/command/__pycache__/setopt.cpython-33.pyc000064400000015320151733464030021303 0ustar00�
�Re�c@s�ddlZddlZddlmZddlmZddlmZddlTdddd	gZd
dd�Z	ddd�ZGd
d�de�ZGdd	�d	e�Z
dS(iN(uCommand(uconvert_path(ulog(u*uconfig_fileuedit_configuoption_baseusetoptulocalcCs�|dkrdS|dkr>tjjtjjtj�d�S|dkrtjdkr_dpbd}tjjtd	|��St	d
|��dS(u�Get the filename of the distutils, local, global, or per-user config

    `kind` must be one of "local", "global", or "user"
    ulocalu	setup.cfguglobalu
distutils.cfguuseruposixu.uu~/%spydistutils.cfgu7config_file() type must be 'local', 'global', or 'user'N(
uosupathujoinudirnameu	distutilsu__file__unameu
expanduseruconvert_pathu
ValueError(ukindudot((u2/tmp/pip-k8wh6o-build/setuptools/command/setopt.pyuconfig_file
s	c
Cs�ddlm}tjd|�|j�}|j|g�x+|j�D]\}}|dkr�tjd||�|j	|�qI|j
|�s�tjd||�|j|�nx�|j�D]�\}}|dkr6tjd|||�|j||�|j
|�sbtjd||�|j	|�qbq�tjd||||�|j|||�q�WqIWtjd	|�|s�t|d
�}	|j|	�|	j�ndS(uYEdit a configuration file to include `settings`

    `settings` is a dictionary of dictionaries or ``None`` values, keyed by
    command/section name.  A ``None`` value means to delete the entire section,
    while a dictionary lists settings to be changed or deleted in that section.
    A setting of ``None`` means to delete that setting.
    i(uConfigParseruReading configuration from %suDeleting section [%s] from %suAdding new section [%s] to %suDeleting %s.%s from %su#Deleting empty [%s] section from %suSetting %s.%s to %r in %su
Writing %suwN(usetuptools.compatuConfigParserulogudebuguRawConfigParserureaduitemsuNoneuinfouremove_sectionuhas_sectionuadd_sectionu
remove_optionuoptionsusetuopenuwriteuclose(
ufilenameusettingsudry_runuConfigParseruoptsusectionuoptionsuoptionuvalueuf((u2/tmp/pip-k8wh6o-build/setuptools/command/setopt.pyuedit_config*s:	
	

cBsM|EeZdZdZdddgZddgZdd�Zd
d�ZdS(uoption_baseu<Abstract base class for commands that mess with config filesu
global-configugu0save options to the site-wide distutils.cfg fileuuser-configuuu7save options to the current user's pydistutils.cfg fileu	filename=ufu-configuration file to use (default=setup.cfg)cCsd|_d|_d|_dS(N(uNoneu
global_configuuser_configufilename(uself((u2/tmp/pip-k8wh6o-build/setuptools/command/setopt.pyuinitialize_optionscs		uoption_base.initialize_optionscCs�g}|jr%|jtd��n|jrD|jtd��n|jdk	rf|j|j�n|s�|jtd��nt|�dkr�td|��n|\|_dS(Nuglobaluuserulocaliu/Must specify only one configuration file option(u
global_configuappenduconfig_fileuuser_configufilenameuNoneulenuDistutilsOptionError(uselfu	filenames((u2/tmp/pip-k8wh6o-build/setuptools/command/setopt.pyufinalize_optionshs		uoption_base.finalize_optionsN(u
global-configugu0save options to the site-wide distutils.cfg file(uuser-configuuu7save options to the current user's pydistutils.cfg file(u	filename=ufu-configuration file to use (default=setup.cfg)(u__name__u
__module__u__qualname__u__doc__uuser_optionsuboolean_optionsuinitialize_optionsufinalize_options(u
__locals__((u2/tmp/pip-k8wh6o-build/setuptools/command/setopt.pyuoption_baseSs	cBsm|EeZdZdZdZddddgejZejdgZdd�Zdd�Z	dd�Z
dS(usetoptu#Save command-line options to a fileu1set an option in setup.cfg or another config fileucommand=ucucommand to set an option foruoption=uou
option to setu
set-value=usuvalue of the optionuremoveururemove (unset) the valuecCs5tj|�d|_d|_d|_d|_dS(N(uoption_baseuinitialize_optionsuNoneucommanduoptionu	set_valueuremove(uself((u2/tmp/pip-k8wh6o-build/setuptools/command/setopt.pyuinitialize_options�s

			usetopt.initialize_optionscCsftj|�|jdks+|jdkr:td��n|jdkrb|jrbtd��ndS(Nu%Must specify --command *and* --optionu$Must specify --set-value or --remove(uoption_baseufinalize_optionsucommanduNoneuoptionuDistutilsOptionErroru	set_valueuremove(uself((u2/tmp/pip-k8wh6o-build/setuptools/command/setopt.pyufinalize_options�s

usetopt.finalize_optionscCs=t|jii|j|jjdd�6|j6|j�dS(Nu-u_(uedit_configufilenameu	set_valueuoptionureplaceucommandudry_run(uself((u2/tmp/pip-k8wh6o-build/setuptools/command/setopt.pyurun�s	#u
setopt.runN(ucommand=ucucommand to set an option for(uoption=uou
option to set(u
set-value=usuvalue of the option(uremoveururemove (unset) the value(u__name__u
__module__u__qualname__u__doc__udescriptionuoption_baseuuser_optionsuboolean_optionsuinitialize_optionsufinalize_optionsurun(u
__locals__((u2/tmp/pip-k8wh6o-build/setuptools/command/setopt.pyusetopt|s
F(u	distutilsuosu
setuptoolsuCommandudistutils.utiluconvert_pathulogudistutils.errorsu__all__uconfig_fileuFalseuedit_configuoption_baseusetopt(((u2/tmp/pip-k8wh6o-build/setuptools/command/setopt.pyu<module>s
 ))site-packages/setuptools/command/__pycache__/build_ext.cpython-33.pyc000064400000031404151733464030021745 0ustar00�
�ReN.c%@sddlmZyddlmZWnek
r>eZYnXddlZddlZddlm	Z	ddl
mZddlm
Z
ddlmZyddlmZWn?ek
r�ddlmZed	�[dd
lmZYnXddlmZddlTdZdZd
Zejdkr1dZnGejdkrxy ddlmZdZdZWqxek
rtYqxXndd�Z Gdd�de�Zes�ejdkr�dddddddddddd�
Z"n0dZdddddddddddd�
Z"dS(i(u	build_extN(u	copy_file(uLibrary(unew_compiler(ucustomize_compiler(u_CONFIG_VARS(uget_config_varuLDSHARED(u_config_vars(ulog(u*usharedudarwinunt(uRTLD_NOWcCstr
|SdS(Nu(u	have_rtld(us((u5/tmp/pip-k8wh6o-build/setuptools/command/build_ext.pyuif_dl&suif_dlcBs�|EeZdZdd�Zdd�Zeek	rSeed�rSdd�Zndd	�Z	d
d�Z
dd
�Zdd�Zdd�Z
dd�Zdd�Zdd�Zddd�ZdS(u	build_extcCs@|jd}|_tj|�||_|r<|j�ndS(u;Build extensions in build directory, then copy if --inplaceiN(uinplaceu
_build_exturunucopy_extensions_to_source(uselfuold_inplace((u5/tmp/pip-k8wh6o-build/setuptools/command/build_ext.pyurun1s

	u
build_ext.runc
Cs�|jd�}x�|jD]�}|j|j�}|j|�}|jd�}dj|dd��}|j|�}tj	j|tj	j
|��}tj	j|j|�}	t|	|d|j
d|j�|jr|j|p�tj|d�qqWdS(Nubuild_pyu.iuverboseudry_runi����T(uget_finalized_commandu
extensionsuget_ext_fullnameunameuget_ext_filenameusplitujoinuget_package_diruosupathubasenameu	build_libu	copy_fileuverboseudry_runu_needs_stubu
write_stubucurdiruTrue(
uselfubuild_pyuextufullnameufilenameumodpathupackageupackage_diru
dest_filenameusrc_filename((u5/tmp/pip-k8wh6o-build/setuptools/command/build_ext.pyucopy_extensions_to_source9s!
	u#build_ext.copy_extensions_to_sourceu
pyrex_sourcescGs+tj||�p|}tj|||�S(N(u
_build_extuswig_sourcesu
_du_build_ext(uselfusourcesu	otherargs((u5/tmp/pip-k8wh6o-build/setuptools/command/build_ext.pyuswig_sourcesQsubuild_ext.swig_sourcescCs�tj||�}||jkr�|j|}t|t�rhtjj|�\}}|jj	|t
�Str�|jr�tjj
|�\}}tjj|d|�Sn|S(Nudl-(u
_build_extuget_ext_filenameuext_mapu
isinstanceuLibraryuosupathusplitextushlib_compilerulibrary_filenameulibtypeu	use_stubsu_links_to_dynamicusplitujoin(uselfufullnameufilenameuextufnud((u5/tmp/pip-k8wh6o-build/setuptools/command/build_ext.pyuget_ext_filenameYs
ubuild_ext.get_ext_filenamecCs,tj|�d|_g|_i|_dS(N(u
_build_extuinitialize_optionsuNoneushlib_compilerushlibsuext_map(uself((u5/tmp/pip-k8wh6o-build/setuptools/command/build_ext.pyuinitialize_optionses
		ubuild_ext.initialize_optionscCs�tj|�|jpg|_|j|j�dd�|jD�|_|jr^|j�nx&|jD]}|j|j�|_qhWx|jD]}|j}||j	|<||j	|j
d�d<|jr�|j|�p�d}|_
|otot|t�|_|j|�}|_tjjtjj|j|��}|rm||jkrm|jj|�n|r�tr�tj|jkr�|jjtj�q�q�WdS(NcSs%g|]}t|t�r|�qS((u
isinstanceuLibrary(u.0uext((u5/tmp/pip-k8wh6o-build/setuptools/command/build_ext.pyu
<listcomp>os	u.build_ext.finalize_options.<locals>.<listcomp>u.ii����F(u
_build_extufinalize_optionsu
extensionsucheck_extensions_listushlibsusetup_shlib_compileruget_ext_fullnameunameu
_full_nameuext_mapusplitulinks_to_dynamicuFalseu_links_to_dynamicu	use_stubsu
isinstanceuLibraryu_needs_stubuget_ext_filenameu
_file_nameuosupathudirnameujoinu	build_libulibrary_dirsuappenducurdiruruntime_library_dirs(uselfuextufullnameultdufilenameulibdir((u5/tmp/pip-k8wh6o-build/setuptools/command/build_ext.pyufinalize_optionsks(
	
	
%$ubuild_ext.finalize_optionscCs�td|jd|jd|j�}|_tjdkr�tj�}z,dtd<dtd<d	td
<t	|�Wdtj
�tj|�Xn
t	|�|jdk	r�|j|j�n|jdk	r�x*|jD]\}}|j||�q�Wn|jdk	r+x!|jD]}|j|�qWn|jdk	rM|j|j�n|jdk	ro|j|j�n|jdk	r�|j|j�n|jdk	r�|j|j�ntj|�|_dS(Nucompilerudry_runuforceudarwinu0gcc -Wl,-x -dynamiclib -undefined dynamic_lookupuLDSHAREDu -dynamiclibuCCSHAREDu.dylibuSO(unew_compilerucompilerudry_runuforceushlib_compilerusysuplatformu_CONFIG_VARSucopyucustomize_compileruclearuupdateuinclude_dirsuNoneuset_include_dirsudefineudefine_macrouundefuundefine_macrou	librariesu
set_librariesulibrary_dirsuset_library_dirsurpathuset_runtime_library_dirsulink_objectsuset_link_objectsulink_shared_objectu__get__(uselfucompilerutmpunameuvalueumacro((u5/tmp/pip-k8wh6o-build/setuptools/command/build_ext.pyusetup_shlib_compiler�s:%




ubuild_ext.setup_shlib_compilercCs&t|t�r|jStj||�S(N(u
isinstanceuLibraryuexport_symbolsu
_build_extuget_export_symbols(uselfuext((u5/tmp/pip-k8wh6o-build/setuptools/command/build_ext.pyuget_export_symbols�subuild_ext.get_export_symbolscCst|j}zZt|t�r*|j|_ntj||�|jrb|j|jd�j	|�nWd||_XdS(Nubuild_py(
ucompileru
isinstanceuLibraryushlib_compileru
_build_extubuild_extensionu_needs_stubu
write_stubuget_finalized_commandu	build_lib(uselfuextu	_compiler((u5/tmp/pip-k8wh6o-build/setuptools/command/build_ext.pyubuild_extension�s		ubuild_ext.build_extensioncCswtjdd�|jD��}dj|jjd�dd�dg�}x%|jD]}|||krUdSqUWd	S(
u?Return true if 'ext' links to a dynamic lib in the same packagecSsg|]}|j�qS((u
_full_name(u.0ulib((u5/tmp/pip-k8wh6o-build/setuptools/command/build_ext.pyu
<listcomp>�s	u.build_ext.links_to_dynamic.<locals>.<listcomp>u.Niui����TF(	udictufromkeysushlibsujoinu
_full_nameusplitu	librariesuTrueuFalse(uselfuextulibnamesupkgulibname((u5/tmp/pip-k8wh6o-build/setuptools/command/build_ext.pyulinks_to_dynamic�s,ubuild_ext.links_to_dynamiccCs�tj|�}|jd�j}x}|jD]r}|jr+tjj|j	|j
jd��}|j|d�|j|d�|r�|j|d�q�q+q+W|S(Nubuild_pyu.u.pyu.pycu.pyo(
u
_build_extuget_outputsuget_finalized_commanduoptimizeu
extensionsu_needs_stubuosupathujoinu	build_libu
_full_nameusplituappend(uselfuoutputsuoptimizeuextubase((u5/tmp/pip-k8wh6o-build/setuptools/command/build_ext.pyuget_outputs�s	$ubuild_ext.get_outputscCs�tjd|j|�tjj||jjd��d}|rftjj|�rft|d��n|j	st
|d�}|jdjddd	td
�dtjj
|j�dd
dtd�dddtd�ddtd�dddg��|j�n|r�ddlm}||gdddd d|j	�|jd�j}|dkr�||gd|dd d|j	�ntjj|�r�|j	r�tj|�q�ndS(!Nu writing stub loader for %s to %su.u.pyu already exists! Please delete.uwu
udef __bootstrap__():u-   global __bootstrap__, __file__, __loader__u%   import sys, os, pkg_resources, impu, dlu:   __file__ = pkg_resources.resource_filename(__name__,%r)u   del __bootstrap__u    if '__loader__' in globals():u       del __loader__u#   old_flags = sys.getdlopenflags()u   old_dir = os.getcwd()u   try:u(     os.chdir(os.path.dirname(__file__))u$     sys.setdlopenflags(dl.RTLD_NOW)u(     imp.load_dynamic(__name__,__file__)u   finally:u"     sys.setdlopenflags(old_flags)u     os.chdir(old_dir)u__bootstrap__()ui(ubyte_compileuoptimizeuforceudry_runuinstall_libT(uloguinfou
_full_nameuosupathujoinusplituexistsuDistutilsErrorudry_runuopenuwriteuif_dlubasenameu
_file_nameucloseudistutils.utilubyte_compileuTrueuget_finalized_commanduoptimizeuunlink(uselfu
output_diruextucompileu	stub_fileufubyte_compileuoptimize((u5/tmp/pip-k8wh6o-build/setuptools/command/build_ext.pyu
write_stub�sJ%	
			

ubuild_ext.write_stubNF(u__name__u
__module__u__qualname__urunucopy_extensions_to_sourceu
_build_extu
_du_build_extuhasattruswig_sourcesuget_ext_filenameuinitialize_optionsufinalize_optionsusetup_shlib_compileruget_export_symbolsubuild_extensionulinks_to_dynamicuget_outputsuFalseu
write_stub(u
__locals__((u5/tmp/pip-k8wh6o-build/setuptools/command/build_ext.pyu	build_ext0s)
u	build_extc

Cs8|j|j|||||||||	|
||�
dS(N(ulinkuSHARED_LIBRARY(
uselfuobjectsuoutput_libnameu
output_diru	librariesulibrary_dirsuruntime_library_dirsuexport_symbolsudebugu
extra_preargsuextra_postargsu
build_temputarget_lang((u5/tmp/pip-k8wh6o-build/setuptools/command/build_ext.pyulink_shared_objects
ulink_shared_objectustaticc
Cs�|dkst�tjj|�\}}
tjj|
�\}}|jd�jd�rm|dd�}n|j|||||�dS(Nuxulibi(	uNoneuAssertionErroruosupathusplitusplitextulibrary_filenameu
startswithucreate_static_lib(uselfuobjectsuoutput_libnameu
output_diru	librariesulibrary_dirsuruntime_library_dirsuexport_symbolsudebugu
extra_preargsuextra_postargsu
build_temputarget_langufilenameubasenameuext((u5/tmp/pip-k8wh6o-build/setuptools/command/build_ext.pyulink_shared_objectsFT(#udistutils.command.build_extu	build_extu
_du_build_extuPyrex.Distutils.build_extu
_build_extuImportErroruosusysudistutils.file_utilu	copy_fileusetuptools.extensionuLibraryudistutils.ccompilerunew_compilerudistutils.sysconfigucustomize_compileru	sysconfigu_CONFIG_VARSuget_config_varu_config_varsu	distutilsulogudistutils.errorsuFalseu	have_rtldu	use_stubsulibtypeuplatformuTrueunameudluRTLD_NOWuif_dluNoneulink_shared_object(((u5/tmp/pip-k8wh6o-build/setuptools/command/build_ext.pyu<module>sT



	


�					site-packages/setuptools/command/__pycache__/rotate.cpython-33.pyc000064400000007076151733464030021274 0ustar00�
�Rec@s|ddlZddlZddlmZddlmZddlmZddlmZddl	TGdd�de�Z
dS(	iN(uCommand(u
basestring(uconvert_path(ulog(u*cBsY|EeZdZdZdZdddgZgZdd
�Zdd�Zdd�Z	dS(urotateuDelete older distributionsu2delete older distributions, keeping N newest filesumatch=umupatterns to match (required)u	dist-dir=udu%directory where the distributions areukeep=uku(number of matching distributions to keepcCsd|_d|_d|_dS(N(uNoneumatchudist_dirukeep(uself((u2/tmp/pip-k8wh6o-build/setuptools/command/rotate.pyuinitialize_optionss		urotate.initialize_optionscCs�|jdkrtd��n|jdkr<td��nyt|j�|_Wntk
rrtd��YnXt|jt�r�dd�|jjd�D�|_n|j	dd	�dS(
NuQMust specify one or more (comma-separated) match patterns (e.g. '.zip' or '.egg')u$Must specify number of files to keepu--keep must be an integercSs"g|]}t|j���qS((uconvert_pathustrip(u.0up((u2/tmp/pip-k8wh6o-build/setuptools/command/rotate.pyu
<listcomp>'s	u+rotate.finalize_options.<locals>.<listcomp>u,ubdistudist_dir(udist_dirudist_dir(
umatchuNoneuDistutilsOptionErrorukeepuintu
ValueErroru
isinstanceu
basestringusplituset_undefined_options(uself((u2/tmp/pip-k8wh6o-build/setuptools/command/rotate.pyufinalize_optionss
%urotate.finalize_optionscCs�|jd�ddlm}x�|jD]�}|jj�d|}|tjj|j|��}dd�|D�}|j	�|j
�tjdt
|�|�||jd�}x=|D]5\}}tjd|�|js�tj|�q�q�Wq'WdS(	Nuegg_infoi(uglobu*cSs(g|]}tjj|�|f�qS((uosupathugetmtime(u.0uf((u2/tmp/pip-k8wh6o-build/setuptools/command/rotate.pyu
<listcomp>1s	urotate.run.<locals>.<listcomp>u%d file(s) matching %suDeleting %s(urun_commanduglobumatchudistributionuget_nameuosupathujoinudist_dirusortureverseuloguinfoulenukeepudry_runuunlink(uselfuglobupatternufilesutuf((u2/tmp/pip-k8wh6o-build/setuptools/command/rotate.pyurun+s


	u
rotate.runN(umatch=umupatterns to match (required)(u	dist-dir=udu%directory where the distributions are(ukeep=uku(number of matching distributions to keep(
u__name__u
__module__u__qualname__u__doc__udescriptionuuser_optionsuboolean_optionsuinitialize_optionsufinalize_optionsurun(u
__locals__((u2/tmp/pip-k8wh6o-build/setuptools/command/rotate.pyurotates	urotate(u	distutilsuosu
setuptoolsuCommandusetuptools.compatu
basestringudistutils.utiluconvert_pathulogudistutils.errorsurotate(((u2/tmp/pip-k8wh6o-build/setuptools/command/rotate.pyu<module>s
site-packages/setuptools/command/bdist_rpm.py000064400000003751151733464030015474 0ustar00# This is just a kludge so that bdist_rpm doesn't guess wrong about the
# distribution name and version, if the egg_info command is going to alter
# them, another kludge to allow you to build old-style non-egg RPMs, and
# finally, a kludge to track .rpm files for uploading when run on Python <2.5.

from distutils.command.bdist_rpm import bdist_rpm as _bdist_rpm
import sys, os

class bdist_rpm(_bdist_rpm):

    def initialize_options(self):
        _bdist_rpm.initialize_options(self)
        self.no_egg = None

    if sys.version<"2.5":
        # Track for uploading any .rpm file(s) moved to self.dist_dir
        def move_file(self, src, dst, level=1):
            _bdist_rpm.move_file(self, src, dst, level)
            if dst==self.dist_dir and src.endswith('.rpm'):
                getattr(self.distribution,'dist_files',[]).append(
                    ('bdist_rpm',
                    src.endswith('.src.rpm') and 'any' or sys.version[:3],
                     os.path.join(dst, os.path.basename(src)))
                )

    def run(self):
        self.run_command('egg_info')    # ensure distro name is up-to-date
        _bdist_rpm.run(self)













    def _make_spec_file(self):
        version = self.distribution.get_version()
        rpmversion = version.replace('-','_')
        spec = _bdist_rpm._make_spec_file(self)
        line23 = '%define version '+version
        line24 = '%define version '+rpmversion
        spec  = [
            line.replace(
                "Source0: %{name}-%{version}.tar",
                "Source0: %{name}-%{unmangled_version}.tar"
            ).replace(
                "setup.py install ",
                "setup.py install --single-version-externally-managed "
            ).replace(
                "%setup",
                "%setup -n %{name}-%{unmangled_version}"
            ).replace(line23,line24)
            for line in spec
        ]
        spec.insert(spec.index(line24)+1, "%define unmangled_version "+version)
        return spec




















site-packages/setuptools/command/test.py000064400000013454151733464030014471 0ustar00from setuptools import Command
from distutils.errors import DistutilsOptionError
import sys
from pkg_resources import *
from pkg_resources import _namespace_packages
from unittest import TestLoader, main

class ScanningLoader(TestLoader):

    def loadTestsFromModule(self, module):
        """Return a suite of all tests cases contained in the given module

        If the module is a package, load tests from all the modules in it.
        If the module has an ``additional_tests`` function, call it and add
        the return value to the tests.
        """
        tests = []
        if module.__name__!='setuptools.tests.doctest':  # ugh
            tests.append(TestLoader.loadTestsFromModule(self,module))

        if hasattr(module, "additional_tests"):
            tests.append(module.additional_tests())

        if hasattr(module, '__path__'):
            for file in resource_listdir(module.__name__, ''):
                if file.endswith('.py') and file!='__init__.py':
                    submodule = module.__name__+'.'+file[:-3]
                else:
                    if resource_exists(
                        module.__name__, file+'/__init__.py'
                    ):
                        submodule = module.__name__+'.'+file
                    else:
                        continue
                tests.append(self.loadTestsFromName(submodule))

        if len(tests)!=1:
            return self.suiteClass(tests)
        else:
            return tests[0] # don't create a nested suite for only one return


class test(Command):

    """Command to run unit tests after in-place build"""

    description = "run unit tests after in-place build"

    user_options = [
        ('test-module=','m', "Run 'test_suite' in specified module"),
        ('test-suite=','s',
            "Test suite to run (e.g. 'some_module.test_suite')"),
    ]

    def initialize_options(self):
        self.test_suite = None
        self.test_module = None
        self.test_loader = None


    def finalize_options(self):

        if self.test_suite is None:
            if self.test_module is None:
                self.test_suite = self.distribution.test_suite
            else:
                self.test_suite = self.test_module+".test_suite"
        elif self.test_module:
            raise DistutilsOptionError(
                "You may specify a module or a suite, but not both"
            )

        self.test_args = [self.test_suite]

        if self.verbose:
            self.test_args.insert(0,'--verbose')
        if self.test_loader is None:
            self.test_loader = getattr(self.distribution,'test_loader',None)
        if self.test_loader is None:
            self.test_loader = "setuptools.command.test:ScanningLoader"



    def with_project_on_sys_path(self, func):
        if sys.version_info >= (3,) and getattr(self.distribution, 'use_2to3', False):
            # If we run 2to3 we can not do this inplace:

            # Ensure metadata is up-to-date
            self.reinitialize_command('build_py', inplace=0)
            self.run_command('build_py')
            bpy_cmd = self.get_finalized_command("build_py")
            build_path = normalize_path(bpy_cmd.build_lib)

            # Build extensions
            self.reinitialize_command('egg_info', egg_base=build_path)
            self.run_command('egg_info')

            self.reinitialize_command('build_ext', inplace=0)
            self.run_command('build_ext')
        else:
            # Without 2to3 inplace works fine:
            self.run_command('egg_info')

            # Build extensions in-place
            self.reinitialize_command('build_ext', inplace=1)
            self.run_command('build_ext')

        ei_cmd = self.get_finalized_command("egg_info")

        old_path = sys.path[:]
        old_modules = sys.modules.copy()

        try:
            sys.path.insert(0, normalize_path(ei_cmd.egg_base))
            working_set.__init__()
            add_activation_listener(lambda dist: dist.activate())
            require('%s==%s' % (ei_cmd.egg_name, ei_cmd.egg_version))
            func()
        finally:
            sys.path[:] = old_path
            sys.modules.clear()
            sys.modules.update(old_modules)
            working_set.__init__()


    def run(self):
        if self.distribution.install_requires:
            self.distribution.fetch_build_eggs(self.distribution.install_requires)
        if self.distribution.tests_require:
            self.distribution.fetch_build_eggs(self.distribution.tests_require)

        if self.test_suite:
            cmd = ' '.join(self.test_args)
            if self.dry_run:
                self.announce('skipping "unittest %s" (dry run)' % cmd)
            else:
                self.announce('running "unittest %s"' % cmd)
                self.with_project_on_sys_path(self.run_tests)


    def run_tests(self):
        import unittest

        # Purge modules under test from sys.modules. The test loader will
        # re-import them from the build location. Required when 2to3 is used
        # with namespace packages.
        if sys.version_info >= (3,) and getattr(self.distribution, 'use_2to3', False):
            module = self.test_args[-1].split('.')[0]
            if module in _namespace_packages:
                del_modules = []
                if module in sys.modules:
                    del_modules.append(module)
                module += '.'
                for name in sys.modules:
                    if name.startswith(module):
                        del_modules.append(name)
                list(map(sys.modules.__delitem__, del_modules))

        loader_ep = EntryPoint.parse("x="+self.test_loader)
        loader_class = loader_ep.load(require=False)
        cks = loader_class()
        unittest.main(
            None, None, [unittest.__file__]+self.test_args,
            testLoader = cks
        )

































site-packages/setuptools/command/easy_install.py000075500000216014151733464040016202 0ustar00#!/opt/alt/python33/bin/python3

"""
Easy Install
------------

A tool for doing automatic download/extract/build of distutils-based Python
packages.  For detailed documentation, see the accompanying EasyInstall.txt
file, or visit the `EasyInstall home page`__.

__ https://pythonhosted.org/setuptools/easy_install.html

"""

import sys
import os
import zipimport
import shutil
import tempfile
import zipfile
import re
import stat
import random
import platform
import textwrap
import warnings
import site
import struct
from glob import glob
from distutils import log, dir_util

import pkg_resources
from setuptools import Command, _dont_write_bytecode
from setuptools.sandbox import run_setup
from setuptools.py31compat import get_path, get_config_vars

from distutils.util import get_platform
from distutils.util import convert_path, subst_vars
from distutils.errors import DistutilsArgError, DistutilsOptionError, \
    DistutilsError, DistutilsPlatformError
from distutils.command.install import INSTALL_SCHEMES, SCHEME_KEYS
from setuptools.command import setopt
from setuptools.archive_util import unpack_archive
from setuptools.package_index import PackageIndex
from setuptools.package_index import URL_SCHEME
from setuptools.command import bdist_egg, egg_info
from setuptools.compat import (iteritems, maxsize, basestring, unicode,
                               reraise)
from pkg_resources import (
    yield_lines, normalize_path, resource_string, ensure_directory,
    get_distribution, find_distributions, Environment, Requirement,
    Distribution, PathMetadata, EggMetadata, WorkingSet, DistributionNotFound,
    VersionConflict, DEVELOP_DIST,
)

sys_executable = os.environ.get('__VENV_LAUNCHER__',
    os.path.normpath(sys.executable))

__all__ = [
    'samefile', 'easy_install', 'PthDistributions', 'extract_wininst_cfg',
    'main', 'get_exe_prefixes',
]

def is_64bit():
    return struct.calcsize("P") == 8

def samefile(p1, p2):
    both_exist = os.path.exists(p1) and os.path.exists(p2)
    use_samefile = hasattr(os.path, 'samefile') and both_exist
    if use_samefile:
        return os.path.samefile(p1, p2)
    norm_p1 = os.path.normpath(os.path.normcase(p1))
    norm_p2 = os.path.normpath(os.path.normcase(p2))
    return norm_p1 == norm_p2

if sys.version_info <= (3,):
    def _to_ascii(s):
        return s
    def isascii(s):
        try:
            unicode(s, 'ascii')
            return True
        except UnicodeError:
            return False
else:
    def _to_ascii(s):
        return s.encode('ascii')
    def isascii(s):
        try:
            s.encode('ascii')
            return True
        except UnicodeError:
            return False

class easy_install(Command):
    """Manage a download/build/install process"""
    description = "Find/get/install Python packages"
    command_consumes_arguments = True

    user_options = [
        ('prefix=', None, "installation prefix"),
        ("zip-ok", "z", "install package as a zipfile"),
        ("multi-version", "m", "make apps have to require() a version"),
        ("upgrade", "U", "force upgrade (searches PyPI for latest versions)"),
        ("install-dir=", "d", "install package to DIR"),
        ("script-dir=", "s", "install scripts to DIR"),
        ("exclude-scripts", "x", "Don't install scripts"),
        ("always-copy", "a", "Copy all needed packages to install dir"),
        ("index-url=", "i", "base URL of Python Package Index"),
        ("find-links=", "f", "additional URL(s) to search for packages"),
        ("build-directory=", "b",
            "download/extract/build in DIR; keep the results"),
        ('optimize=', 'O',
            "also compile with optimization: -O1 for \"python -O\", "
            "-O2 for \"python -OO\", and -O0 to disable [default: -O0]"),
        ('record=', None,
            "filename in which to record list of installed files"),
        ('always-unzip', 'Z', "don't install as a zipfile, no matter what"),
        ('site-dirs=','S',"list of directories where .pth files work"),
        ('editable', 'e', "Install specified packages in editable form"),
        ('no-deps', 'N', "don't install dependencies"),
        ('allow-hosts=', 'H', "pattern(s) that hostnames must match"),
        ('local-snapshots-ok', 'l',
            "allow building eggs from local checkouts"),
        ('version', None, "print version information and exit"),
        ('no-find-links', None,
            "Don't load find-links defined in packages being installed")
    ]
    boolean_options = [
        'zip-ok', 'multi-version', 'exclude-scripts', 'upgrade', 'always-copy',
        'editable',
        'no-deps', 'local-snapshots-ok', 'version'
    ]

    if site.ENABLE_USER_SITE:
        help_msg = "install in user site-package '%s'" % site.USER_SITE
        user_options.append(('user', None, help_msg))
        boolean_options.append('user')

    negative_opt = {'always-unzip': 'zip-ok'}
    create_index = PackageIndex

    def initialize_options(self):
        if site.ENABLE_USER_SITE:
            whereami = os.path.abspath(__file__)
            self.user = whereami.startswith(site.USER_SITE)
        else:
            self.user = 0

        self.zip_ok = self.local_snapshots_ok = None
        self.install_dir = self.script_dir = self.exclude_scripts = None
        self.index_url = None
        self.find_links = None
        self.build_directory = None
        self.args = None
        self.optimize = self.record = None
        self.upgrade = self.always_copy = self.multi_version = None
        self.editable = self.no_deps = self.allow_hosts = None
        self.root = self.prefix = self.no_report = None
        self.version = None
        self.install_purelib = None     # for pure module distributions
        self.install_platlib = None     # non-pure (dists w/ extensions)
        self.install_headers = None     # for C/C++ headers
        self.install_lib = None         # set to either purelib or platlib
        self.install_scripts = None
        self.install_data = None
        self.install_base = None
        self.install_platbase = None
        if site.ENABLE_USER_SITE:
            self.install_userbase = site.USER_BASE
            self.install_usersite = site.USER_SITE
        else:
            self.install_userbase = None
            self.install_usersite = None
        self.no_find_links = None

        # Options not specifiable via command line
        self.package_index = None
        self.pth_file = self.always_copy_from = None
        self.site_dirs = None
        self.installed_projects = {}
        self.sitepy_installed = False
        # Always read easy_install options, even if we are subclassed, or have
        # an independent instance created.  This ensures that defaults will
        # always come from the standard configuration file(s)' "easy_install"
        # section, even if this is a "develop" or "install" command, or some
        # other embedding.
        self._dry_run = None
        self.verbose = self.distribution.verbose
        self.distribution._set_command_options(
            self, self.distribution.get_option_dict('easy_install')
        )

    def delete_blockers(self, blockers):
        for filename in blockers:
            if os.path.exists(filename) or os.path.islink(filename):
                log.info("Deleting %s", filename)
                if not self.dry_run:
                    if os.path.isdir(filename) and not os.path.islink(filename):
                        rmtree(filename)
                    else:
                        os.unlink(filename)

    def finalize_options(self):
        if self.version:
            print('setuptools %s' % get_distribution('setuptools').version)
            sys.exit()

        py_version = sys.version.split()[0]
        prefix, exec_prefix = get_config_vars('prefix', 'exec_prefix')

        self.config_vars = {
            'dist_name': self.distribution.get_name(),
            'dist_version': self.distribution.get_version(),
            'dist_fullname': self.distribution.get_fullname(),
            'py_version': py_version,
            'py_version_short': py_version[0:3],
            'py_version_nodot': py_version[0] + py_version[2],
            'sys_prefix': prefix,
            'prefix': prefix,
            'sys_exec_prefix': exec_prefix,
            'exec_prefix': exec_prefix,
            # Only python 3.2+ has abiflags
            'abiflags': getattr(sys, 'abiflags', ''),
        }

        if site.ENABLE_USER_SITE:
            self.config_vars['userbase'] = self.install_userbase
            self.config_vars['usersite'] = self.install_usersite

        # fix the install_dir if "--user" was used
        #XXX: duplicate of the code in the setup command
        if self.user and site.ENABLE_USER_SITE:
            self.create_home_path()
            if self.install_userbase is None:
                raise DistutilsPlatformError(
                    "User base directory is not specified")
            self.install_base = self.install_platbase = self.install_userbase
            if os.name == 'posix':
                self.select_scheme("unix_user")
            else:
                self.select_scheme(os.name + "_user")

        self.expand_basedirs()
        self.expand_dirs()

        self._expand('install_dir','script_dir','build_directory','site_dirs')
        # If a non-default installation directory was specified, default the
        # script directory to match it.
        if self.script_dir is None:
            self.script_dir = self.install_dir

        if self.no_find_links is None:
            self.no_find_links = False

        # Let install_dir get set by install_lib command, which in turn
        # gets its info from the install command, and takes into account
        # --prefix and --home and all that other crud.
        self.set_undefined_options('install_lib',
            ('install_dir','install_dir')
        )
        # Likewise, set default script_dir from 'install_scripts.install_dir'
        self.set_undefined_options('install_scripts',
            ('install_dir', 'script_dir')
        )

        if self.user and self.install_purelib:
            self.install_dir = self.install_purelib
            self.script_dir = self.install_scripts
        # default --record from the install command
        self.set_undefined_options('install', ('record', 'record'))
        # Should this be moved to the if statement below? It's not used
        # elsewhere
        normpath = map(normalize_path, sys.path)
        self.all_site_dirs = get_site_dirs()
        if self.site_dirs is not None:
            site_dirs = [
                os.path.expanduser(s.strip()) for s in self.site_dirs.split(',')
            ]
            for d in site_dirs:
                if not os.path.isdir(d):
                    log.warn("%s (in --site-dirs) does not exist", d)
                elif normalize_path(d) not in normpath:
                    raise DistutilsOptionError(
                        d+" (in --site-dirs) is not on sys.path"
                    )
                else:
                    self.all_site_dirs.append(normalize_path(d))
        if not self.editable: self.check_site_dir()
        self.index_url = self.index_url or "https://pypi.python.org/simple"
        self.shadow_path = self.all_site_dirs[:]
        for path_item in self.install_dir, normalize_path(self.script_dir):
            if path_item not in self.shadow_path:
                self.shadow_path.insert(0, path_item)

        if self.allow_hosts is not None:
            hosts = [s.strip() for s in self.allow_hosts.split(',')]
        else:
            hosts = ['*']
        if self.package_index is None:
            self.package_index = self.create_index(
                self.index_url, search_path = self.shadow_path, hosts=hosts,
            )
        self.local_index = Environment(self.shadow_path+sys.path)

        if self.find_links is not None:
            if isinstance(self.find_links, basestring):
                self.find_links = self.find_links.split()
        else:
            self.find_links = []
        if self.local_snapshots_ok:
            self.package_index.scan_egg_links(self.shadow_path+sys.path)
        if not self.no_find_links:
            self.package_index.add_find_links(self.find_links)
        self.set_undefined_options('install_lib', ('optimize','optimize'))
        if not isinstance(self.optimize,int):
            try:
                self.optimize = int(self.optimize)
                if not (0 <= self.optimize <= 2): raise ValueError
            except ValueError:
                raise DistutilsOptionError("--optimize must be 0, 1, or 2")

        if self.editable and not self.build_directory:
            raise DistutilsArgError(
                "Must specify a build directory (-b) when using --editable"
            )
        if not self.args:
            raise DistutilsArgError(
                "No urls, filenames, or requirements specified (see --help)")

        self.outputs = []

    def _expand_attrs(self, attrs):
        for attr in attrs:
            val = getattr(self, attr)
            if val is not None:
                if os.name == 'posix' or os.name == 'nt':
                    val = os.path.expanduser(val)
                val = subst_vars(val, self.config_vars)
                setattr(self, attr, val)

    def expand_basedirs(self):
        """Calls `os.path.expanduser` on install_base, install_platbase and
        root."""
        self._expand_attrs(['install_base', 'install_platbase', 'root'])

    def expand_dirs(self):
        """Calls `os.path.expanduser` on install dirs."""
        self._expand_attrs(['install_purelib', 'install_platlib',
                            'install_lib', 'install_headers',
                            'install_scripts', 'install_data',])

    def run(self):
        if self.verbose != self.distribution.verbose:
            log.set_verbosity(self.verbose)
        try:
            for spec in self.args:
                self.easy_install(spec, not self.no_deps)
            if self.record:
                outputs = self.outputs
                if self.root:               # strip any package prefix
                    root_len = len(self.root)
                    for counter in range(len(outputs)):
                        outputs[counter] = outputs[counter][root_len:]
                from distutils import file_util
                self.execute(
                    file_util.write_file, (self.record, outputs),
                    "writing list of installed files to '%s'" %
                    self.record
                )
            self.warn_deprecated_options()
        finally:
            log.set_verbosity(self.distribution.verbose)

    def pseudo_tempname(self):
        """Return a pseudo-tempname base in the install directory.
        This code is intentionally naive; if a malicious party can write to
        the target directory you're already in deep doodoo.
        """
        try:
            pid = os.getpid()
        except:
            pid = random.randint(0, maxsize)
        return os.path.join(self.install_dir, "test-easy-install-%s" % pid)

    def warn_deprecated_options(self):
        pass

    def check_site_dir(self):
        """Verify that self.install_dir is .pth-capable dir, if needed"""

        instdir = normalize_path(self.install_dir)
        pth_file = os.path.join(instdir,'easy-install.pth')

        # Is it a configured, PYTHONPATH, implicit, or explicit site dir?
        is_site_dir = instdir in self.all_site_dirs

        if not is_site_dir and not self.multi_version:
            # No?  Then directly test whether it does .pth file processing
            is_site_dir = self.check_pth_processing()
        else:
            # make sure we can write to target dir
            testfile = self.pseudo_tempname()+'.write-test'
            test_exists = os.path.exists(testfile)
            try:
                if test_exists: os.unlink(testfile)
                open(testfile,'w').close()
                os.unlink(testfile)
            except (OSError,IOError):
                self.cant_write_to_target()

        if not is_site_dir and not self.multi_version:
            # Can't install non-multi to non-site dir
            raise DistutilsError(self.no_default_version_msg())

        if is_site_dir:
            if self.pth_file is None:
                self.pth_file = PthDistributions(pth_file, self.all_site_dirs)
        else:
            self.pth_file = None

        PYTHONPATH = os.environ.get('PYTHONPATH','').split(os.pathsep)
        if instdir not in map(normalize_path, [_f for _f in PYTHONPATH if _f]):
            # only PYTHONPATH dirs need a site.py, so pretend it's there
            self.sitepy_installed = True
        elif self.multi_version and not os.path.exists(pth_file):
            self.sitepy_installed = True    # don't need site.py in this case
            self.pth_file = None            # and don't create a .pth file
        self.install_dir = instdir

    def cant_write_to_target(self):
        template = """can't create or remove files in install directory

The following error occurred while trying to add or remove files in the
installation directory:

    %s

The installation directory you specified (via --install-dir, --prefix, or
the distutils default setting) was:

    %s
"""
        msg = template % (sys.exc_info()[1], self.install_dir,)

        if not os.path.exists(self.install_dir):
            msg += """
This directory does not currently exist.  Please create it and try again, or
choose a different installation directory (using the -d or --install-dir
option).
"""
        else:
            msg += """
Perhaps your account does not have write access to this directory?  If the
installation directory is a system-owned directory, you may need to sign in
as the administrator or "root" account.  If you do not have administrative
access to this machine, you may wish to choose a different installation
directory, preferably one that is listed in your PYTHONPATH environment
variable.

For information on other options, you may wish to consult the
documentation at:

  https://pythonhosted.org/setuptools/easy_install.html

Please make the appropriate changes for your system and try again.
"""
        raise DistutilsError(msg)

    def check_pth_processing(self):
        """Empirically verify whether .pth files are supported in inst. dir"""
        instdir = self.install_dir
        log.info("Checking .pth file support in %s", instdir)
        pth_file = self.pseudo_tempname()+".pth"
        ok_file = pth_file+'.ok'
        ok_exists = os.path.exists(ok_file)
        try:
            if ok_exists: os.unlink(ok_file)
            dirname = os.path.dirname(ok_file)
            if not os.path.exists(dirname):
                os.makedirs(dirname)
            f = open(pth_file,'w')
        except (OSError,IOError):
            self.cant_write_to_target()
        else:
            try:
                f.write("import os; f = open(%r, 'w'); f.write('OK'); f.close()\n" % (ok_file,))
                f.close()
                f=None
                executable = sys.executable
                if os.name=='nt':
                    dirname,basename = os.path.split(executable)
                    alt = os.path.join(dirname,'pythonw.exe')
                    if basename.lower()=='python.exe' and os.path.exists(alt):
                        # use pythonw.exe to avoid opening a console window
                        executable = alt

                from distutils.spawn import spawn
                spawn([executable,'-E','-c','pass'],0)

                if os.path.exists(ok_file):
                    log.info(
                        "TEST PASSED: %s appears to support .pth files",
                        instdir
                    )
                    return True
            finally:
                if f:
                    f.close()
                if os.path.exists(ok_file):
                    os.unlink(ok_file)
                if os.path.exists(pth_file):
                    os.unlink(pth_file)
        if not self.multi_version:
            log.warn("TEST FAILED: %s does NOT support .pth files", instdir)
        return False

    def install_egg_scripts(self, dist):
        """Write all the scripts for `dist`, unless scripts are excluded"""
        if not self.exclude_scripts and dist.metadata_isdir('scripts'):
            for script_name in dist.metadata_listdir('scripts'):
                if dist.metadata_isdir('scripts/' + script_name):
                    # The "script" is a directory, likely a Python 3
                    # __pycache__ directory, so skip it.
                    continue
                self.install_script(
                    dist, script_name,
                    dist.get_metadata('scripts/'+script_name)
                )
        self.install_wrapper_scripts(dist)

    def add_output(self, path):
        if os.path.isdir(path):
            for base, dirs, files in os.walk(path):
                for filename in files:
                    self.outputs.append(os.path.join(base,filename))
        else:
            self.outputs.append(path)

    def not_editable(self, spec):
        if self.editable:
            raise DistutilsArgError(
                "Invalid argument %r: you can't use filenames or URLs "
                "with --editable (except via the --find-links option)."
                % (spec,)
            )

    def check_editable(self,spec):
        if not self.editable:
            return

        if os.path.exists(os.path.join(self.build_directory, spec.key)):
            raise DistutilsArgError(
                "%r already exists in %s; can't do a checkout there" %
                (spec.key, self.build_directory)
            )

    def easy_install(self, spec, deps=False):
        tmpdir = tempfile.mkdtemp(prefix="easy_install-")
        download = None
        if not self.editable: self.install_site_py()

        try:
            if not isinstance(spec,Requirement):
                if URL_SCHEME(spec):
                    # It's a url, download it to tmpdir and process
                    self.not_editable(spec)
                    download = self.package_index.download(spec, tmpdir)
                    return self.install_item(None, download, tmpdir, deps, True)

                elif os.path.exists(spec):
                    # Existing file or directory, just process it directly
                    self.not_editable(spec)
                    return self.install_item(None, spec, tmpdir, deps, True)
                else:
                    spec = parse_requirement_arg(spec)

            self.check_editable(spec)
            dist = self.package_index.fetch_distribution(
                spec, tmpdir, self.upgrade, self.editable, not self.always_copy,
                self.local_index
            )
            if dist is None:
                msg = "Could not find suitable distribution for %r" % spec
                if self.always_copy:
                    msg+=" (--always-copy skips system and development eggs)"
                raise DistutilsError(msg)
            elif dist.precedence==DEVELOP_DIST:
                # .egg-info dists don't need installing, just process deps
                self.process_distribution(spec, dist, deps, "Using")
                return dist
            else:
                return self.install_item(spec, dist.location, tmpdir, deps)

        finally:
            if os.path.exists(tmpdir):
                rmtree(tmpdir)

    def install_item(self, spec, download, tmpdir, deps, install_needed=False):

        # Installation is also needed if file in tmpdir or is not an egg
        install_needed = install_needed or self.always_copy
        install_needed = install_needed or os.path.dirname(download) == tmpdir
        install_needed = install_needed or not download.endswith('.egg')
        install_needed = install_needed or (
            self.always_copy_from is not None and
            os.path.dirname(normalize_path(download)) ==
            normalize_path(self.always_copy_from)
        )

        if spec and not install_needed:
            # at this point, we know it's a local .egg, we just don't know if
            # it's already installed.
            for dist in self.local_index[spec.project_name]:
                if dist.location==download:
                    break
            else:
                install_needed = True   # it's not in the local index

        log.info("Processing %s", os.path.basename(download))

        if install_needed:
            dists = self.install_eggs(spec, download, tmpdir)
            for dist in dists:
                self.process_distribution(spec, dist, deps)
        else:
            dists = [self.egg_distribution(download)]
            self.process_distribution(spec, dists[0], deps, "Using")

        if spec is not None:
            for dist in dists:
                if dist in spec:
                    return dist

    def select_scheme(self, name):
        """Sets the install directories by applying the install schemes."""
        # it's the caller's problem if they supply a bad name!
        scheme = INSTALL_SCHEMES[name]
        for key in SCHEME_KEYS:
            attrname = 'install_' + key
            if getattr(self, attrname) is None:
                setattr(self, attrname, scheme[key])

    def process_distribution(self, requirement, dist, deps=True, *info):
        self.update_pth(dist)
        self.package_index.add(dist)
        self.local_index.add(dist)
        self.install_egg_scripts(dist)
        self.installed_projects[dist.key] = dist
        log.info(self.installation_report(requirement, dist, *info))
        if (dist.has_metadata('dependency_links.txt') and
                not self.no_find_links):
            self.package_index.add_find_links(
                dist.get_metadata_lines('dependency_links.txt')
            )
        if not deps and not self.always_copy:
            return
        elif requirement is not None and dist.key != requirement.key:
            log.warn("Skipping dependencies for %s", dist)
            return  # XXX this is not the distribution we were looking for
        elif requirement is None or dist not in requirement:
            # if we wound up with a different version, resolve what we've got
            distreq = dist.as_requirement()
            requirement = requirement or distreq
            requirement = Requirement(
                distreq.project_name, distreq.specs, requirement.extras
            )
        log.info("Processing dependencies for %s", requirement)
        try:
            distros = WorkingSet([]).resolve(
                [requirement], self.local_index, self.easy_install
            )
        except DistributionNotFound:
            e = sys.exc_info()[1]
            raise DistutilsError(
                "Could not find required distribution %s" % e.args
            )
        except VersionConflict:
            e = sys.exc_info()[1]
            raise DistutilsError(
                "Installed distribution %s conflicts with requirement %s"
                % e.args
            )
        if self.always_copy or self.always_copy_from:
            # Force all the relevant distros to be copied or activated
            for dist in distros:
                if dist.key not in self.installed_projects:
                    self.easy_install(dist.as_requirement())
        log.info("Finished processing dependencies for %s", requirement)

    def should_unzip(self, dist):
        if self.zip_ok is not None:
            return not self.zip_ok
        if dist.has_metadata('not-zip-safe'):
            return True
        if not dist.has_metadata('zip-safe'):
            return True
        return False

    def maybe_move(self, spec, dist_filename, setup_base):
        dst = os.path.join(self.build_directory, spec.key)
        if os.path.exists(dst):
            msg = "%r already exists in %s; build directory %s will not be kept"
            log.warn(msg, spec.key, self.build_directory, setup_base)
            return setup_base
        if os.path.isdir(dist_filename):
            setup_base = dist_filename
        else:
            if os.path.dirname(dist_filename)==setup_base:
                os.unlink(dist_filename)   # get it out of the tmp dir
            contents = os.listdir(setup_base)
            if len(contents)==1:
                dist_filename = os.path.join(setup_base,contents[0])
                if os.path.isdir(dist_filename):
                    # if the only thing there is a directory, move it instead
                    setup_base = dist_filename
        ensure_directory(dst)
        shutil.move(setup_base, dst)
        return dst

    def install_wrapper_scripts(self, dist):
        if not self.exclude_scripts:
            for args in get_script_args(dist):
                self.write_script(*args)

    def install_script(self, dist, script_name, script_text, dev_path=None):
        """Generate a legacy script wrapper and install it"""
        spec = str(dist.as_requirement())
        is_script = is_python_script(script_text, script_name)

        def get_template(filename):
            """
            There are a couple of template scripts in the package. This
            function loads one of them and prepares it for use.

            These templates use triple-quotes to escape variable
            substitutions so the scripts get the 2to3 treatment when build
            on Python 3. The templates cannot use triple-quotes naturally.
            """
            raw_bytes = resource_string('setuptools', template_name)
            template_str = raw_bytes.decode('utf-8')
            clean_template = template_str.replace('"""', '')
            return clean_template

        if is_script:
            template_name = 'script template.py'
            if dev_path:
                template_name = template_name.replace('.py', ' (dev).py')
            script_text = (get_script_header(script_text) +
                get_template(template_name) % locals())
        self.write_script(script_name, _to_ascii(script_text), 'b')

    def write_script(self, script_name, contents, mode="t", blockers=()):
        """Write an executable file to the scripts directory"""
        self.delete_blockers(   # clean up old .py/.pyw w/o a script
            [os.path.join(self.script_dir,x) for x in blockers])
        log.info("Installing %s script to %s", script_name, self.script_dir)
        target = os.path.join(self.script_dir, script_name)
        self.add_output(target)

        mask = current_umask()
        if not self.dry_run:
            ensure_directory(target)
            if os.path.exists(target):
                os.unlink(target)
            f = open(target,"w"+mode)
            f.write(contents)
            f.close()
            chmod(target, 0x1FF-mask) # 0777

    def install_eggs(self, spec, dist_filename, tmpdir):
        # .egg dirs or files are already built, so just return them
        if dist_filename.lower().endswith('.egg'):
            return [self.install_egg(dist_filename, tmpdir)]
        elif dist_filename.lower().endswith('.exe'):
            return [self.install_exe(dist_filename, tmpdir)]

        # Anything else, try to extract and build
        setup_base = tmpdir
        if os.path.isfile(dist_filename) and not dist_filename.endswith('.py'):
            unpack_archive(dist_filename, tmpdir, self.unpack_progress)
        elif os.path.isdir(dist_filename):
            setup_base = os.path.abspath(dist_filename)

        if (setup_base.startswith(tmpdir)   # something we downloaded
                and self.build_directory and spec is not None):
            setup_base = self.maybe_move(spec, dist_filename, setup_base)

        # Find the setup.py file
        setup_script = os.path.join(setup_base, 'setup.py')

        if not os.path.exists(setup_script):
            setups = glob(os.path.join(setup_base, '*', 'setup.py'))
            if not setups:
                raise DistutilsError(
                    "Couldn't find a setup script in %s" % os.path.abspath(dist_filename)
                )
            if len(setups)>1:
                raise DistutilsError(
                    "Multiple setup scripts in %s" % os.path.abspath(dist_filename)
                )
            setup_script = setups[0]

        # Now run it, and return the result
        if self.editable:
            log.info(self.report_editable(spec, setup_script))
            return []
        else:
            return self.build_and_install(setup_script, setup_base)

    def egg_distribution(self, egg_path):
        if os.path.isdir(egg_path):
            metadata = PathMetadata(egg_path,os.path.join(egg_path,'EGG-INFO'))
        else:
            metadata = EggMetadata(zipimport.zipimporter(egg_path))
        return Distribution.from_filename(egg_path,metadata=metadata)

    def install_egg(self, egg_path, tmpdir):
        destination = os.path.join(self.install_dir,os.path.basename(egg_path))
        destination = os.path.abspath(destination)
        if not self.dry_run:
            ensure_directory(destination)

        dist = self.egg_distribution(egg_path)
        if not samefile(egg_path, destination):
            if os.path.isdir(destination) and not os.path.islink(destination):
                dir_util.remove_tree(destination, dry_run=self.dry_run)
            elif os.path.exists(destination):
                self.execute(os.unlink,(destination,),"Removing "+destination)
            uncache_zipdir(destination)
            if os.path.isdir(egg_path):
                if egg_path.startswith(tmpdir):
                    f,m = shutil.move, "Moving"
                else:
                    f,m = shutil.copytree, "Copying"
            elif self.should_unzip(dist):
                self.mkpath(destination)
                f,m = self.unpack_and_compile, "Extracting"
            elif egg_path.startswith(tmpdir):
                f,m = shutil.move, "Moving"
            else:
                f,m = shutil.copy2, "Copying"

            self.execute(f, (egg_path, destination),
                (m+" %s to %s") %
                (os.path.basename(egg_path),os.path.dirname(destination)))

        self.add_output(destination)
        return self.egg_distribution(destination)

    def install_exe(self, dist_filename, tmpdir):
        # See if it's valid, get data
        cfg = extract_wininst_cfg(dist_filename)
        if cfg is None:
            raise DistutilsError(
                "%s is not a valid distutils Windows .exe" % dist_filename
            )
        # Create a dummy distribution object until we build the real distro
        dist = Distribution(
            None,
            project_name=cfg.get('metadata','name'),
            version=cfg.get('metadata','version'), platform=get_platform(),
        )

        # Convert the .exe to an unpacked egg
        egg_path = dist.location = os.path.join(tmpdir, dist.egg_name()+'.egg')
        egg_tmp = egg_path + '.tmp'
        _egg_info = os.path.join(egg_tmp, 'EGG-INFO')
        pkg_inf = os.path.join(_egg_info, 'PKG-INFO')
        ensure_directory(pkg_inf)   # make sure EGG-INFO dir exists
        dist._provider = PathMetadata(egg_tmp, _egg_info)    # XXX
        self.exe_to_egg(dist_filename, egg_tmp)

        # Write EGG-INFO/PKG-INFO
        if not os.path.exists(pkg_inf):
            f = open(pkg_inf,'w')
            f.write('Metadata-Version: 1.0\n')
            for k,v in cfg.items('metadata'):
                if k != 'target_version':
                    f.write('%s: %s\n' % (k.replace('_','-').title(), v))
            f.close()
        script_dir = os.path.join(_egg_info,'scripts')
        self.delete_blockers(   # delete entry-point scripts to avoid duping
            [os.path.join(script_dir,args[0]) for args in get_script_args(dist)]
        )
        # Build .egg file from tmpdir
        bdist_egg.make_zipfile(
            egg_path, egg_tmp, verbose=self.verbose, dry_run=self.dry_run
        )
        # install the .egg
        return self.install_egg(egg_path, tmpdir)

    def exe_to_egg(self, dist_filename, egg_tmp):
        """Extract a bdist_wininst to the directories an egg would use"""
        # Check for .pth file and set up prefix translations
        prefixes = get_exe_prefixes(dist_filename)
        to_compile = []
        native_libs = []
        top_level = {}
        def process(src,dst):
            s = src.lower()
            for old,new in prefixes:
                if s.startswith(old):
                    src = new+src[len(old):]
                    parts = src.split('/')
                    dst = os.path.join(egg_tmp, *parts)
                    dl = dst.lower()
                    if dl.endswith('.pyd') or dl.endswith('.dll'):
                        parts[-1] = bdist_egg.strip_module(parts[-1])
                        top_level[os.path.splitext(parts[0])[0]] = 1
                        native_libs.append(src)
                    elif dl.endswith('.py') and old!='SCRIPTS/':
                        top_level[os.path.splitext(parts[0])[0]] = 1
                        to_compile.append(dst)
                    return dst
            if not src.endswith('.pth'):
                log.warn("WARNING: can't process %s", src)
            return None
        # extract, tracking .pyd/.dll->native_libs and .py -> to_compile
        unpack_archive(dist_filename, egg_tmp, process)
        stubs = []
        for res in native_libs:
            if res.lower().endswith('.pyd'):    # create stubs for .pyd's
                parts = res.split('/')
                resource = parts[-1]
                parts[-1] = bdist_egg.strip_module(parts[-1])+'.py'
                pyfile = os.path.join(egg_tmp, *parts)
                to_compile.append(pyfile)
                stubs.append(pyfile)
                bdist_egg.write_stub(resource, pyfile)
        self.byte_compile(to_compile)   # compile .py's
        bdist_egg.write_safety_flag(os.path.join(egg_tmp,'EGG-INFO'),
            bdist_egg.analyze_egg(egg_tmp, stubs))  # write zip-safety flag

        for name in 'top_level','native_libs':
            if locals()[name]:
                txt = os.path.join(egg_tmp, 'EGG-INFO', name+'.txt')
                if not os.path.exists(txt):
                    f = open(txt,'w')
                    f.write('\n'.join(locals()[name])+'\n')
                    f.close()

    def installation_report(self, req, dist, what="Installed"):
        """Helpful installation message for display to package users"""
        msg = "\n%(what)s %(eggloc)s%(extras)s"
        if self.multi_version and not self.no_report:
            msg += """

Because this distribution was installed --multi-version, before you can
import modules from this package in an application, you will need to
'import pkg_resources' and then use a 'require()' call similar to one of
these examples, in order to select the desired version:

    pkg_resources.require("%(name)s")  # latest installed version
    pkg_resources.require("%(name)s==%(version)s")  # this exact version
    pkg_resources.require("%(name)s>=%(version)s")  # this version or higher
"""
            if self.install_dir not in map(normalize_path,sys.path):
                msg += """

Note also that the installation directory must be on sys.path at runtime for
this to work.  (e.g. by being the application's script directory, by being on
PYTHONPATH, or by being added to sys.path by your code.)
"""
        eggloc = dist.location
        name = dist.project_name
        version = dist.version
        extras = '' # TODO: self.report_extras(req, dist)
        return msg % locals()

    def report_editable(self, spec, setup_script):
        dirname = os.path.dirname(setup_script)
        python = sys.executable
        return """\nExtracted editable version of %(spec)s to %(dirname)s

If it uses setuptools in its setup script, you can activate it in
"development" mode by going to that directory and running::

    %(python)s setup.py develop

See the setuptools documentation for the "develop" command for more info.
""" % locals()

    def run_setup(self, setup_script, setup_base, args):
        sys.modules.setdefault('distutils.command.bdist_egg', bdist_egg)
        sys.modules.setdefault('distutils.command.egg_info', egg_info)

        args = list(args)
        if self.verbose>2:
            v = 'v' * (self.verbose - 1)
            args.insert(0,'-'+v)
        elif self.verbose<2:
            args.insert(0,'-q')
        if self.dry_run:
            args.insert(0,'-n')
        log.info(
            "Running %s %s", setup_script[len(setup_base)+1:], ' '.join(args)
        )
        try:
            run_setup(setup_script, args)
        except SystemExit:
            v = sys.exc_info()[1]
            raise DistutilsError("Setup script exited with %s" % (v.args[0],))

    def build_and_install(self, setup_script, setup_base):
        args = ['bdist_egg', '--dist-dir']

        dist_dir = tempfile.mkdtemp(
            prefix='egg-dist-tmp-', dir=os.path.dirname(setup_script)
        )
        try:
            self._set_fetcher_options(os.path.dirname(setup_script))
            args.append(dist_dir)

            self.run_setup(setup_script, setup_base, args)
            all_eggs = Environment([dist_dir])
            eggs = []
            for key in all_eggs:
                for dist in all_eggs[key]:
                    eggs.append(self.install_egg(dist.location, setup_base))
            if not eggs and not self.dry_run:
                log.warn("No eggs found in %s (setup script problem?)",
                    dist_dir)
            return eggs
        finally:
            rmtree(dist_dir)
            log.set_verbosity(self.verbose) # restore our log verbosity

    def _set_fetcher_options(self, base):
        """
        When easy_install is about to run bdist_egg on a source dist, that
        source dist might have 'setup_requires' directives, requiring
        additional fetching. Ensure the fetcher options given to easy_install
        are available to that command as well.
        """
        # find the fetch options from easy_install and write them out
        #  to the setup.cfg file.
        ei_opts = self.distribution.get_option_dict('easy_install').copy()
        fetch_directives = (
            'find_links', 'site_dirs', 'index_url', 'optimize',
            'site_dirs', 'allow_hosts',
        )
        fetch_options = {}
        for key, val in ei_opts.items():
            if key not in fetch_directives: continue
            fetch_options[key.replace('_', '-')] = val[1]
        # create a settings dictionary suitable for `edit_config`
        settings = dict(easy_install=fetch_options)
        cfg_filename = os.path.join(base, 'setup.cfg')
        setopt.edit_config(cfg_filename, settings)

    def update_pth(self, dist):
        if self.pth_file is None:
            return

        for d in self.pth_file[dist.key]:    # drop old entries
            if self.multi_version or d.location != dist.location:
                log.info("Removing %s from easy-install.pth file", d)
                self.pth_file.remove(d)
                if d.location in self.shadow_path:
                    self.shadow_path.remove(d.location)

        if not self.multi_version:
            if dist.location in self.pth_file.paths:
                log.info(
                    "%s is already the active version in easy-install.pth",
                    dist
                )
            else:
                log.info("Adding %s to easy-install.pth file", dist)
                self.pth_file.add(dist) # add new entry
                if dist.location not in self.shadow_path:
                    self.shadow_path.append(dist.location)

        if not self.dry_run:

            self.pth_file.save()

            if dist.key=='setuptools':
                # Ensure that setuptools itself never becomes unavailable!
                # XXX should this check for latest version?
                filename = os.path.join(self.install_dir,'setuptools.pth')
                if os.path.islink(filename): os.unlink(filename)
                f = open(filename, 'wt')
                f.write(self.pth_file.make_relative(dist.location)+'\n')
                f.close()

    def unpack_progress(self, src, dst):
        # Progress filter for unpacking
        log.debug("Unpacking %s to %s", src, dst)
        return dst     # only unpack-and-compile skips files for dry run

    def unpack_and_compile(self, egg_path, destination):
        to_compile = []
        to_chmod = []

        def pf(src, dst):
            if dst.endswith('.py') and not src.startswith('EGG-INFO/'):
                to_compile.append(dst)
            elif dst.endswith('.dll') or dst.endswith('.so'):
                to_chmod.append(dst)
            self.unpack_progress(src,dst)
            return not self.dry_run and dst or None

        unpack_archive(egg_path, destination, pf)
        self.byte_compile(to_compile)
        if not self.dry_run:
            for f in to_chmod:
                mode = ((os.stat(f)[stat.ST_MODE]) | 0x16D) & 0xFED  # 0555, 07755
                chmod(f, mode)

    def byte_compile(self, to_compile):
        if _dont_write_bytecode:
            self.warn('byte-compiling is disabled, skipping.')
            return

        from distutils.util import byte_compile
        try:
            # try to make the byte compile messages quieter
            log.set_verbosity(self.verbose - 1)

            byte_compile(to_compile, optimize=0, force=1, dry_run=self.dry_run)
            if self.optimize:
                byte_compile(
                    to_compile, optimize=self.optimize, force=1,
                    dry_run=self.dry_run
                )
        finally:
            log.set_verbosity(self.verbose)     # restore original verbosity

    def no_default_version_msg(self):
        template = """bad install directory or PYTHONPATH

You are attempting to install a package to a directory that is not
on PYTHONPATH and which Python does not read ".pth" files from.  The
installation directory you specified (via --install-dir, --prefix, or
the distutils default setting) was:

    %s

and your PYTHONPATH environment variable currently contains:

    %r

Here are some of your options for correcting the problem:

* You can choose a different installation directory, i.e., one that is
  on PYTHONPATH or supports .pth files

* You can add the installation directory to the PYTHONPATH environment
  variable.  (It must then also be on PYTHONPATH whenever you run
  Python and want to use the package(s) you are installing.)

* You can set up the installation directory to support ".pth" files by
  using one of the approaches described here:

  https://pythonhosted.org/setuptools/easy_install.html#custom-installation-locations

Please make the appropriate changes for your system and try again."""
        return template % (self.install_dir, os.environ.get('PYTHONPATH',''))

    def install_site_py(self):
        """Make sure there's a site.py in the target dir, if needed"""

        if self.sitepy_installed:
            return  # already did it, or don't need to

        sitepy = os.path.join(self.install_dir, "site.py")
        source = resource_string("setuptools", "site-patch.py")
        current = ""

        if os.path.exists(sitepy):
            log.debug("Checking existing site.py in %s", self.install_dir)
            f = open(sitepy,'rb')
            current = f.read()
            # we want str, not bytes
            if sys.version_info >= (3,):
                current = current.decode()

            f.close()
            if not current.startswith('def __boot():'):
                raise DistutilsError(
                    "%s is not a setuptools-generated site.py; please"
                    " remove it." % sitepy
                )

        if current != source:
            log.info("Creating %s", sitepy)
            if not self.dry_run:
                ensure_directory(sitepy)
                f = open(sitepy,'wb')
                f.write(source)
                f.close()
            self.byte_compile([sitepy])

        self.sitepy_installed = True

    def create_home_path(self):
        """Create directories under ~."""
        if not self.user:
            return
        home = convert_path(os.path.expanduser("~"))
        for name, path in iteritems(self.config_vars):
            if path.startswith(home) and not os.path.isdir(path):
                self.debug_print("os.makedirs('%s', 0700)" % path)
                os.makedirs(path, 0x1C0)    # 0700

    INSTALL_SCHEMES = dict(
        posix = dict(
            install_dir = '$base/lib/python$py_version_short/site-packages',
            script_dir = '$base/bin',
        ),
    )

    DEFAULT_SCHEME = dict(
        install_dir = '$base/Lib/site-packages',
        script_dir = '$base/Scripts',
    )

    def _expand(self, *attrs):
        config_vars = self.get_finalized_command('install').config_vars

        if self.prefix:
            # Set default install_dir/scripts from --prefix
            config_vars = config_vars.copy()
            config_vars['base'] = self.prefix
            scheme = self.INSTALL_SCHEMES.get(os.name,self.DEFAULT_SCHEME)
            for attr,val in scheme.items():
                if getattr(self,attr,None) is None:
                    setattr(self,attr,val)

        from distutils.util import subst_vars
        for attr in attrs:
            val = getattr(self, attr)
            if val is not None:
                val = subst_vars(val, config_vars)
                if os.name == 'posix':
                    val = os.path.expanduser(val)
                setattr(self, attr, val)

def get_site_dirs():
    # return a list of 'site' dirs
    sitedirs = [_f for _f in os.environ.get('PYTHONPATH',
                                            '').split(os.pathsep) if _f]
    prefixes = [sys.prefix]
    if sys.exec_prefix != sys.prefix:
        prefixes.append(sys.exec_prefix)
    for prefix in prefixes:
        if prefix:
            if sys.platform in ('os2emx', 'riscos'):
                sitedirs.append(os.path.join(prefix, "Lib", "site-packages"))
            elif os.sep == '/':
                sitedirs.extend([os.path.join(prefix,
                                         "lib",
                                         "python" + sys.version[:3],
                                         "site-packages"),
                            os.path.join(prefix, "lib", "site-python")])
            else:
                sitedirs.extend(
                    [prefix, os.path.join(prefix, "lib", "site-packages")]
                )
            if sys.platform == 'darwin':
                # for framework builds *only* we add the standard Apple
                # locations. Currently only per-user, but /Library and
                # /Network/Library could be added too
                if 'Python.framework' in prefix:
                    home = os.environ.get('HOME')
                    if home:
                        sitedirs.append(
                            os.path.join(home,
                                         'Library',
                                         'Python',
                                         sys.version[:3],
                                         'site-packages'))
    lib_paths = get_path('purelib'), get_path('platlib')
    for site_lib in lib_paths:
        if site_lib not in sitedirs: sitedirs.append(site_lib)

    if site.ENABLE_USER_SITE:
        sitedirs.append(site.USER_SITE)

    sitedirs = list(map(normalize_path, sitedirs))

    return sitedirs


def expand_paths(inputs):
    """Yield sys.path directories that might contain "old-style" packages"""

    seen = {}

    for dirname in inputs:
        dirname = normalize_path(dirname)
        if dirname in seen:
            continue

        seen[dirname] = 1
        if not os.path.isdir(dirname):
            continue

        files = os.listdir(dirname)
        yield dirname, files

        for name in files:
            if not name.endswith('.pth'):
                # We only care about the .pth files
                continue
            if name in ('easy-install.pth','setuptools.pth'):
                # Ignore .pth files that we control
                continue

            # Read the .pth file
            f = open(os.path.join(dirname,name))
            lines = list(yield_lines(f))
            f.close()

            # Yield existing non-dupe, non-import directory lines from it
            for line in lines:
                if not line.startswith("import"):
                    line = normalize_path(line.rstrip())
                    if line not in seen:
                        seen[line] = 1
                        if not os.path.isdir(line):
                            continue
                        yield line, os.listdir(line)


def extract_wininst_cfg(dist_filename):
    """Extract configuration data from a bdist_wininst .exe

    Returns a ConfigParser.RawConfigParser, or None
    """
    f = open(dist_filename,'rb')
    try:
        endrec = zipfile._EndRecData(f)
        if endrec is None:
            return None

        prepended = (endrec[9] - endrec[5]) - endrec[6]
        if prepended < 12:  # no wininst data here
            return None
        f.seek(prepended-12)

        from setuptools.compat import StringIO, ConfigParser
        import struct
        tag, cfglen, bmlen = struct.unpack("<iii",f.read(12))
        if tag not in (0x1234567A, 0x1234567B):
            return None     # not a valid tag

        f.seek(prepended-(12+cfglen))
        cfg = ConfigParser.RawConfigParser({'version':'','target_version':''})
        try:
            part = f.read(cfglen)
            # part is in bytes, but we need to read up to the first null
            #  byte.
            if sys.version_info >= (2,6):
                null_byte = bytes([0])
            else:
                null_byte = chr(0)
            config = part.split(null_byte, 1)[0]
            # Now the config is in bytes, but for RawConfigParser, it should
            #  be text, so decode it.
            config = config.decode(sys.getfilesystemencoding())
            cfg.readfp(StringIO(config))
        except ConfigParser.Error:
            return None
        if not cfg.has_section('metadata') or not cfg.has_section('Setup'):
            return None
        return cfg

    finally:
        f.close()


def get_exe_prefixes(exe_filename):
    """Get exe->egg path translations for a given .exe file"""

    prefixes = [
        ('PURELIB/', ''), ('PLATLIB/pywin32_system32', ''),
        ('PLATLIB/', ''),
        ('SCRIPTS/', 'EGG-INFO/scripts/'),
        ('DATA/lib/site-packages', ''),
    ]
    z = zipfile.ZipFile(exe_filename)
    try:
        for info in z.infolist():
            name = info.filename
            parts = name.split('/')
            if len(parts)==3 and parts[2]=='PKG-INFO':
                if parts[1].endswith('.egg-info'):
                    prefixes.insert(0,('/'.join(parts[:2]), 'EGG-INFO/'))
                    break
            if len(parts) != 2 or not name.endswith('.pth'):
                continue
            if name.endswith('-nspkg.pth'):
                continue
            if parts[0].upper() in ('PURELIB','PLATLIB'):
                contents = z.read(name)
                if sys.version_info >= (3,):
                    contents = contents.decode()
                for pth in yield_lines(contents):
                    pth = pth.strip().replace('\\','/')
                    if not pth.startswith('import'):
                        prefixes.append((('%s/%s/' % (parts[0],pth)), ''))
    finally:
        z.close()
    prefixes = [(x.lower(),y) for x, y in prefixes]
    prefixes.sort()
    prefixes.reverse()
    return prefixes


def parse_requirement_arg(spec):
    try:
        return Requirement.parse(spec)
    except ValueError:
        raise DistutilsError(
            "Not a URL, existing file, or requirement spec: %r" % (spec,)
        )

class PthDistributions(Environment):
    """A .pth file with Distribution paths in it"""

    dirty = False

    def __init__(self, filename, sitedirs=()):
        self.filename = filename
        self.sitedirs = list(map(normalize_path, sitedirs))
        self.basedir = normalize_path(os.path.dirname(self.filename))
        self._load()
        Environment.__init__(self, [], None, None)
        for path in yield_lines(self.paths):
            list(map(self.add, find_distributions(path, True)))

    def _load(self):
        self.paths = []
        saw_import = False
        seen = dict.fromkeys(self.sitedirs)
        if os.path.isfile(self.filename):
            f = open(self.filename,'rt')
            for line in f:
                if line.startswith('import'):
                    saw_import = True
                    continue
                path = line.rstrip()
                self.paths.append(path)
                if not path.strip() or path.strip().startswith('#'):
                    continue
                # skip non-existent paths, in case somebody deleted a package
                # manually, and duplicate paths as well
                path = self.paths[-1] = normalize_path(
                    os.path.join(self.basedir,path)
                )
                if not os.path.exists(path) or path in seen:
                    self.paths.pop()    # skip it
                    self.dirty = True   # we cleaned up, so we're dirty now :)
                    continue
                seen[path] = 1
            f.close()

        if self.paths and not saw_import:
            self.dirty = True   # ensure anything we touch has import wrappers
        while self.paths and not self.paths[-1].strip():
            self.paths.pop()

    def save(self):
        """Write changed .pth file back to disk"""
        if not self.dirty:
            return

        data = '\n'.join(map(self.make_relative,self.paths))
        if data:
            log.debug("Saving %s", self.filename)
            data = (
                "import sys; sys.__plen = len(sys.path)\n"
                "%s\n"
                "import sys; new=sys.path[sys.__plen:];"
                " del sys.path[sys.__plen:];"
                " p=getattr(sys,'__egginsert',0); sys.path[p:p]=new;"
                " sys.__egginsert = p+len(new)\n"
            ) % data

            if os.path.islink(self.filename):
                os.unlink(self.filename)
            f = open(self.filename,'wt')
            f.write(data)
            f.close()

        elif os.path.exists(self.filename):
            log.debug("Deleting empty %s", self.filename)
            os.unlink(self.filename)

        self.dirty = False

    def add(self, dist):
        """Add `dist` to the distribution map"""
        if (dist.location not in self.paths and (
                dist.location not in self.sitedirs or
                dist.location == os.getcwd() # account for '.' being in PYTHONPATH
                )):
            self.paths.append(dist.location)
            self.dirty = True
        Environment.add(self, dist)

    def remove(self, dist):
        """Remove `dist` from the distribution map"""
        while dist.location in self.paths:
            self.paths.remove(dist.location)
            self.dirty = True
        Environment.remove(self, dist)

    def make_relative(self,path):
        npath, last = os.path.split(normalize_path(path))
        baselen = len(self.basedir)
        parts = [last]
        sep = os.altsep=='/' and '/' or os.sep
        while len(npath)>=baselen:
            if npath==self.basedir:
                parts.append(os.curdir)
                parts.reverse()
                return sep.join(parts)
            npath, last = os.path.split(npath)
            parts.append(last)
        else:
            return path

def get_script_header(script_text, executable=sys_executable, wininst=False):
    """Create a #! line, getting options (if any) from script_text"""
    from distutils.command.build_scripts import first_line_re

    # first_line_re in Python >=3.1.4 and >=3.2.1 is a bytes pattern.
    if not isinstance(first_line_re.pattern, str):
        first_line_re = re.compile(first_line_re.pattern.decode())

    first = (script_text+'\n').splitlines()[0]
    match = first_line_re.match(first)
    options = ''
    if match:
        options = match.group(1) or ''
        if options: options = ' '+options
    if wininst:
        executable = "python.exe"
    else:
        executable = nt_quote_arg(executable)
    hdr = "#!%(executable)s%(options)s\n" % locals()
    if not isascii(hdr):
        # Non-ascii path to sys.executable, use -x to prevent warnings
        if options:
            if options.strip().startswith('-'):
                options = ' -x'+options.strip()[1:]
            # else: punt, we can't do it, let the warning happen anyway
        else:
            options = ' -x'
    executable = fix_jython_executable(executable, options)
    hdr = "#!%(executable)s%(options)s\n" % locals()
    return hdr

def auto_chmod(func, arg, exc):
    if func is os.remove and os.name=='nt':
        chmod(arg, stat.S_IWRITE)
        return func(arg)
    et, ev, _ = sys.exc_info()
    reraise(et, (ev[0], ev[1] + (" %s %s" % (func,arg))))

def uncache_zipdir(path):
    """Ensure that the importer caches dont have stale info for `path`"""
    from zipimport import _zip_directory_cache as zdc
    _uncache(path, zdc)
    _uncache(path, sys.path_importer_cache)

def _uncache(path, cache):
    if path in cache:
        del cache[path]
    else:
        path = normalize_path(path)
        for p in cache:
            if normalize_path(p)==path:
                del cache[p]
                return

def is_python(text, filename='<string>'):
    "Is this string a valid Python script?"
    try:
        compile(text, filename, 'exec')
    except (SyntaxError, TypeError):
        return False
    else:
        return True

def is_sh(executable):
    """Determine if the specified executable is a .sh (contains a #! line)"""
    try:
        fp = open(executable)
        magic = fp.read(2)
        fp.close()
    except (OSError,IOError): return executable
    return magic == '#!'

def nt_quote_arg(arg):
    """Quote a command line argument according to Windows parsing rules"""

    result = []
    needquote = False
    nb = 0

    needquote = (" " in arg) or ("\t" in arg)
    if needquote:
        result.append('"')

    for c in arg:
        if c == '\\':
            nb += 1
        elif c == '"':
            # double preceding backslashes, then add a \"
            result.append('\\' * (nb*2) + '\\"')
            nb = 0
        else:
            if nb:
                result.append('\\' * nb)
                nb = 0
            result.append(c)

    if nb:
        result.append('\\' * nb)

    if needquote:
        result.append('\\' * nb)    # double the trailing backslashes
        result.append('"')

    return ''.join(result)

def is_python_script(script_text, filename):
    """Is this text, as a whole, a Python script? (as opposed to shell/bat/etc.
    """
    if filename.endswith('.py') or filename.endswith('.pyw'):
        return True     # extension says it's Python
    if is_python(script_text, filename):
        return True     # it's syntactically valid Python
    if script_text.startswith('#!'):
        # It begins with a '#!' line, so check if 'python' is in it somewhere
        return 'python' in script_text.splitlines()[0].lower()

    return False    # Not any Python I can recognize

try:
    from os import chmod as _chmod
except ImportError:
    # Jython compatibility
    def _chmod(*args): pass

def chmod(path, mode):
    log.debug("changing mode of %s to %o", path, mode)
    try:
        _chmod(path, mode)
    except os.error:
        e = sys.exc_info()[1]
        log.debug("chmod failed: %s", e)

def fix_jython_executable(executable, options):
    if sys.platform.startswith('java') and is_sh(executable):
        # Workaround for Jython is not needed on Linux systems.
        import java
        if java.lang.System.getProperty("os.name") == "Linux":
            return executable

        # Workaround Jython's sys.executable being a .sh (an invalid
        # shebang line interpreter)
        if options:
            # Can't apply the workaround, leave it broken
            log.warn(
                "WARNING: Unable to adapt shebang line for Jython,"
                " the following script is NOT executable\n"
                "         see http://bugs.jython.org/issue1112 for"
                " more information.")
        else:
            return '/usr/bin/env %s' % executable
    return executable


class ScriptWriter(object):
    """
    Encapsulates behavior around writing entry point scripts for console and
    gui apps.
    """

    template = textwrap.dedent("""
        # EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r
        __requires__ = %(spec)r
        import sys
        from pkg_resources import load_entry_point

        if __name__ == '__main__':
            sys.exit(
                load_entry_point(%(spec)r, %(group)r, %(name)r)()
            )
    """).lstrip()

    @classmethod
    def get_script_args(cls, dist, executable=sys_executable, wininst=False):
        """
        Yield write_script() argument tuples for a distribution's entrypoints
        """
        gen_class = cls.get_writer(wininst)
        spec = str(dist.as_requirement())
        header = get_script_header("", executable, wininst)
        for type_ in 'console', 'gui':
            group = type_ + '_scripts'
            for name, ep in dist.get_entry_map(group).items():
                script_text = gen_class.template % locals()
                for res in gen_class._get_script_args(type_, name, header,
                        script_text):
                    yield res

    @classmethod
    def get_writer(cls, force_windows):
        if force_windows or sys.platform=='win32':
            return WindowsScriptWriter.get_writer()
        return cls

    @classmethod
    def _get_script_args(cls, type_, name, header, script_text):
        # Simply write the stub with no extension.
        yield (name, header+script_text)


class WindowsScriptWriter(ScriptWriter):
    @classmethod
    def get_writer(cls):
        """
        Get a script writer suitable for Windows
        """
        writer_lookup = dict(
            executable=WindowsExecutableLauncherWriter,
            natural=cls,
        )
        # for compatibility, use the executable launcher by default
        launcher = os.environ.get('SETUPTOOLS_LAUNCHER', 'executable')
        return writer_lookup[launcher]

    @classmethod
    def _get_script_args(cls, type_, name, header, script_text):
        "For Windows, add a .py extension"
        ext = dict(console='.pya', gui='.pyw')[type_]
        if ext not in os.environ['PATHEXT'].lower().split(';'):
            warnings.warn("%s not listed in PATHEXT; scripts will not be "
                "recognized as executables." % ext, UserWarning)
        old = ['.pya', '.py', '-script.py', '.pyc', '.pyo', '.pyw', '.exe']
        old.remove(ext)
        header = cls._adjust_header(type_, header)
        blockers = [name+x for x in old]
        yield name+ext, header+script_text, 't', blockers

    @staticmethod
    def _adjust_header(type_, orig_header):
        """
        Make sure 'pythonw' is used for gui and and 'python' is used for
        console (regardless of what sys.executable is).
        """
        pattern = 'pythonw.exe'
        repl = 'python.exe'
        if type_ == 'gui':
            pattern, repl = repl, pattern
        pattern_ob = re.compile(re.escape(pattern), re.IGNORECASE)
        new_header = pattern_ob.sub(string=orig_header, repl=repl)
        clean_header = new_header[2:-1].strip('"')
        if sys.platform == 'win32' and not os.path.exists(clean_header):
            # the adjusted version doesn't exist, so return the original
            return orig_header
        return new_header


class WindowsExecutableLauncherWriter(WindowsScriptWriter):
    @classmethod
    def _get_script_args(cls, type_, name, header, script_text):
        """
        For Windows, add a .py extension and an .exe launcher
        """
        if type_=='gui':
            launcher_type = 'gui'
            ext = '-script.pyw'
            old = ['.pyw']
        else:
            launcher_type = 'cli'
            ext = '-script.py'
            old = ['.py','.pyc','.pyo']
        hdr = cls._adjust_header(type_, header)
        blockers = [name+x for x in old]
        yield (name+ext, hdr+script_text, 't', blockers)
        yield (
            name+'.exe', get_win_launcher(launcher_type),
            'b' # write in binary mode
        )
        if not is_64bit():
            # install a manifest for the launcher to prevent Windows
            #  from detecting it as an installer (which it will for
            #  launchers like easy_install.exe). Consider only
            #  adding a manifest for launchers detected as installers.
            #  See Distribute #143 for details.
            m_name = name + '.exe.manifest'
            yield (m_name, load_launcher_manifest(name), 't')

# for backward-compatibility
get_script_args = ScriptWriter.get_script_args

def get_win_launcher(type):
    """
    Load the Windows launcher (executable) suitable for launching a script.

    `type` should be either 'cli' or 'gui'

    Returns the executable as a byte string.
    """
    launcher_fn = '%s.exe' % type
    if platform.machine().lower()=='arm':
        launcher_fn = launcher_fn.replace(".", "-arm.")
    if is_64bit():
        launcher_fn = launcher_fn.replace(".", "-64.")
    else:
        launcher_fn = launcher_fn.replace(".", "-32.")
    return resource_string('setuptools', launcher_fn)

def load_launcher_manifest(name):
    manifest = pkg_resources.resource_string(__name__, 'launcher manifest.xml')
    if sys.version_info[0] < 3:
        return manifest % vars()
    else:
        return manifest.decode('utf-8') % vars()

def rmtree(path, ignore_errors=False, onerror=auto_chmod):
    """Recursively delete a directory tree.

    This code is taken from the Python 2.4 version of 'shutil', because
    the 2.3 version doesn't really work right.
    """
    if ignore_errors:
        def onerror(*args):
            pass
    elif onerror is None:
        def onerror(*args):
            raise
    names = []
    try:
        names = os.listdir(path)
    except os.error:
        onerror(os.listdir, path, sys.exc_info())
    for name in names:
        fullname = os.path.join(path, name)
        try:
            mode = os.lstat(fullname).st_mode
        except os.error:
            mode = 0
        if stat.S_ISDIR(mode):
            rmtree(fullname, ignore_errors, onerror)
        else:
            try:
                os.remove(fullname)
            except os.error:
                onerror(os.remove, fullname, sys.exc_info())
    try:
        os.rmdir(path)
    except os.error:
        onerror(os.rmdir, path, sys.exc_info())

def current_umask():
    tmp = os.umask(0x12)    # 022
    os.umask(tmp)
    return tmp

def bootstrap():
    # This function is called when setuptools*.egg is run using /bin/sh
    import setuptools
    argv0 = os.path.dirname(setuptools.__path__[0])
    sys.argv[0] = argv0
    sys.argv.append(argv0)
    main()

def main(argv=None, **kw):
    from setuptools import setup
    from setuptools.dist import Distribution
    import distutils.core

    USAGE = """\
usage: %(script)s [options] requirement_or_url ...
   or: %(script)s --help
"""

    def gen_usage(script_name):
        return USAGE % dict(
            script=os.path.basename(script_name),
        )

    def with_ei_usage(f):
        old_gen_usage = distutils.core.gen_usage
        try:
            distutils.core.gen_usage = gen_usage
            return f()
        finally:
            distutils.core.gen_usage = old_gen_usage

    class DistributionWithoutHelpCommands(Distribution):
        common_usage = ""

        def _show_help(self,*args,**kw):
            with_ei_usage(lambda: Distribution._show_help(self,*args,**kw))

    if argv is None:
        argv = sys.argv[1:]

    with_ei_usage(lambda:
        setup(
            script_args = ['-q','easy_install', '-v']+argv,
            script_name = sys.argv[0] or 'easy_install',
            distclass=DistributionWithoutHelpCommands, **kw
        )
    )
site-packages/setuptools/command/rotate.py000064400000004016151733464040015003 0ustar00import distutils, os
from setuptools import Command
from setuptools.compat import basestring
from distutils.util import convert_path
from distutils import log
from distutils.errors import *

class rotate(Command):
    """Delete older distributions"""

    description = "delete older distributions, keeping N newest files"
    user_options = [
        ('match=',    'm', "patterns to match (required)"),
        ('dist-dir=', 'd', "directory where the distributions are"),
        ('keep=',     'k', "number of matching distributions to keep"),
    ]

    boolean_options = []

    def initialize_options(self):
        self.match = None
        self.dist_dir = None
        self.keep = None

    def finalize_options(self):
        if self.match is None:
            raise DistutilsOptionError(
                "Must specify one or more (comma-separated) match patterns "
                "(e.g. '.zip' or '.egg')"
            )
        if self.keep is None:
            raise DistutilsOptionError("Must specify number of files to keep")           
        try:
            self.keep = int(self.keep)
        except ValueError:
            raise DistutilsOptionError("--keep must be an integer")
        if isinstance(self.match, basestring):
            self.match = [
                convert_path(p.strip()) for p in self.match.split(',')
            ]
        self.set_undefined_options('bdist',('dist_dir', 'dist_dir'))

    def run(self):
        self.run_command("egg_info")
        from glob import glob
        for pattern in self.match:
            pattern = self.distribution.get_name()+'*'+pattern
            files = glob(os.path.join(self.dist_dir,pattern))
            files = [(os.path.getmtime(f),f) for f in files]
            files.sort()
            files.reverse()

            log.info("%d file(s) matching %s", len(files), pattern)
            files = files[self.keep:]
            for (t,f) in files:
                log.info("Deleting %s", f)
                if not self.dry_run:
                    os.unlink(f)

























site-packages/setuptools/command/install_lib.py000064400000004666151733464040016014 0ustar00from distutils.command.install_lib import install_lib as _install_lib
import os

class install_lib(_install_lib):
    """Don't add compiled flags to filenames of non-Python files"""

    def _bytecode_filenames (self, py_filenames):
        bytecode_files = []
        for py_file in py_filenames:
            if not py_file.endswith('.py'):
                continue
            if self.compile:
                bytecode_files.append(py_file + "c")
            if self.optimize > 0:
                bytecode_files.append(py_file + "o")

        return bytecode_files

    def run(self):
        self.build()
        outfiles = self.install()
        if outfiles is not None:
            # always compile, in case we have any extension stubs to deal with
            self.byte_compile(outfiles)

    def get_exclusions(self):
        exclude = {}
        nsp = self.distribution.namespace_packages

        if (nsp and self.get_finalized_command('install')
               .single_version_externally_managed
        ):
            for pkg in nsp:
                parts = pkg.split('.')
                while parts:
                    pkgdir = os.path.join(self.install_dir, *parts)
                    for f in '__init__.py', '__init__.pyc', '__init__.pyo':
                        exclude[os.path.join(pkgdir,f)] = 1
                    parts.pop()
        return exclude

    def copy_tree(
        self, infile, outfile,
        preserve_mode=1, preserve_times=1, preserve_symlinks=0, level=1
    ):
        assert preserve_mode and preserve_times and not preserve_symlinks
        exclude = self.get_exclusions()

        if not exclude:
            return _install_lib.copy_tree(self, infile, outfile)

        # Exclude namespace package __init__.py* files from the output

        from setuptools.archive_util import unpack_directory
        from distutils import log

        outfiles = []

        def pf(src, dst):
            if dst in exclude:
                log.warn("Skipping installation of %s (namespace package)",dst)
                return False

            log.info("copying %s -> %s", src, os.path.dirname(dst))
            outfiles.append(dst)
            return dst

        unpack_directory(infile, outfile, pf)
        return outfiles

    def get_outputs(self):
        outputs = _install_lib.get_outputs(self)
        exclude = self.get_exclusions()
        if exclude:
            return [f for f in outputs if f not in exclude]
        return outputs






site-packages/setuptools/command/upload_docs.py000064400000015227151733464040016007 0ustar00# -*- coding: utf-8 -*-
"""upload_docs

Implements a Distutils 'upload_docs' subcommand (upload documentation to
PyPI's pythonhosted.org).
"""

import os
import socket
import zipfile
import tempfile
import sys
import shutil

from base64 import standard_b64encode
from pkg_resources import iter_entry_points

from distutils import log
from distutils.errors import DistutilsOptionError
from distutils.command.upload import upload

from setuptools.compat import httplib, urlparse, unicode, iteritems, PY3

errors = 'surrogateescape' if PY3 else 'strict'


# This is not just a replacement for byte literals
# but works as a general purpose encoder
def b(s, encoding='utf-8'):
    if isinstance(s, unicode):
        return s.encode(encoding, errors)
    return s


class upload_docs(upload):

    description = 'Upload documentation to PyPI'

    user_options = [
        ('repository=', 'r',
         "url of repository [default: %s]" % upload.DEFAULT_REPOSITORY),
        ('show-response', None,
         'display full response text from server'),
        ('upload-dir=', None, 'directory to upload'),
        ]
    boolean_options = upload.boolean_options

    def has_sphinx(self):
        if self.upload_dir is None:
            for ep in iter_entry_points('distutils.commands', 'build_sphinx'):
                return True

    sub_commands = [('build_sphinx', has_sphinx)]

    def initialize_options(self):
        upload.initialize_options(self)
        self.upload_dir = None
        self.target_dir = None

    def finalize_options(self):
        upload.finalize_options(self)
        if self.upload_dir is None:
            if self.has_sphinx():
                build_sphinx = self.get_finalized_command('build_sphinx')
                self.target_dir = build_sphinx.builder_target_dir
            else:
                build = self.get_finalized_command('build')
                self.target_dir = os.path.join(build.build_base, 'docs')
        else:
            self.ensure_dirname('upload_dir')
            self.target_dir = self.upload_dir
        self.announce('Using upload directory %s' % self.target_dir)

    def create_zipfile(self, filename):
        zip_file = zipfile.ZipFile(filename, "w")
        try:
            self.mkpath(self.target_dir)  # just in case
            for root, dirs, files in os.walk(self.target_dir):
                if root == self.target_dir and not files:
                    raise DistutilsOptionError(
                        "no files found in upload directory '%s'"
                        % self.target_dir)
                for name in files:
                    full = os.path.join(root, name)
                    relative = root[len(self.target_dir):].lstrip(os.path.sep)
                    dest = os.path.join(relative, name)
                    zip_file.write(full, dest)
        finally:
            zip_file.close()

    def run(self):
        # Run sub commands
        for cmd_name in self.get_sub_commands():
            self.run_command(cmd_name)

        tmp_dir = tempfile.mkdtemp()
        name = self.distribution.metadata.get_name()
        zip_file = os.path.join(tmp_dir, "%s.zip" % name)
        try:
            self.create_zipfile(zip_file)
            self.upload_file(zip_file)
        finally:
            shutil.rmtree(tmp_dir)

    def upload_file(self, filename):
        f = open(filename, 'rb')
        content = f.read()
        f.close()
        meta = self.distribution.metadata
        data = {
            ':action': 'doc_upload',
            'name': meta.get_name(),
            'content': (os.path.basename(filename), content),
        }
        # set up the authentication
        credentials = b(self.username + ':' + self.password)
        credentials = standard_b64encode(credentials)
        if PY3:
            credentials = credentials.decode('ascii')
        auth = "Basic " + credentials

        # Build up the MIME payload for the POST data
        boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254'
        sep_boundary = b('\n--') + b(boundary)
        end_boundary = sep_boundary + b('--')
        body = []
        for key, values in iteritems(data):
            title = '\nContent-Disposition: form-data; name="%s"' % key
            # handle multiple entries for the same name
            if isinstance(values, list):
                values = [values]
            for value in values:
                if type(value) is tuple:
                    title += '; filename="%s"' % value[0]
                    value = value[1]
                else:
                    value = b(value)
                body.append(sep_boundary)
                body.append(b(title))
                body.append(b("\n\n"))
                body.append(value)
                if value and value[-1:] == b('\r'):
                    body.append(b('\n'))  # write an extra newline (lurve Macs)
        body.append(end_boundary)
        body.append(b("\n"))
        body = b('').join(body)

        self.announce("Submitting documentation to %s" % (self.repository),
                      log.INFO)

        # build the Request
        # We can't use urllib2 since we need to send the Basic
        # auth right with the first request
        schema, netloc, url, params, query, fragments = \
            urlparse(self.repository)
        assert not params and not query and not fragments
        if schema == 'http':
            conn = httplib.HTTPConnection(netloc)
        elif schema == 'https':
            conn = httplib.HTTPSConnection(netloc)
        else:
            raise AssertionError("unsupported schema "+schema)

        data = ''
        try:
            conn.connect()
            conn.putrequest("POST", url)
            content_type = 'multipart/form-data; boundary=%s' % boundary
            conn.putheader('Content-type', content_type)
            conn.putheader('Content-length', str(len(body)))
            conn.putheader('Authorization', auth)
            conn.endheaders()
            conn.send(body)
        except socket.error:
            e = sys.exc_info()[1]
            self.announce(str(e), log.ERROR)
            return

        r = conn.getresponse()
        if r.status == 200:
            self.announce('Server response (%s): %s' % (r.status, r.reason),
                          log.INFO)
        elif r.status == 301:
            location = r.getheader('Location')
            if location is None:
                location = 'https://pythonhosted.org/%s/' % meta.get_name()
            self.announce('Upload successful. Visit %s' % location,
                          log.INFO)
        else:
            self.announce('Upload failed (%s): %s' % (r.status, r.reason),
                          log.ERROR)
        if self.show_response:
            print('-'*75, r.read(), '-'*75)
site-packages/setuptools/command/install_scripts.py000064400000004024151733464040016721 0ustar00from distutils.command.install_scripts import install_scripts \
     as _install_scripts
from pkg_resources import Distribution, PathMetadata, ensure_directory
import os
from distutils import log

class install_scripts(_install_scripts):
    """Do normal script install, plus any egg_info wrapper scripts"""

    def initialize_options(self):
        _install_scripts.initialize_options(self)
        self.no_ep = False

    def run(self):
        from setuptools.command.easy_install import get_script_args
        from setuptools.command.easy_install import sys_executable

        self.run_command("egg_info")
        if self.distribution.scripts:
            _install_scripts.run(self)  # run first to set up self.outfiles
        else:
            self.outfiles = []
        if self.no_ep:
            # don't install entry point scripts into .egg file!
            return

        ei_cmd = self.get_finalized_command("egg_info")
        dist = Distribution(
            ei_cmd.egg_base, PathMetadata(ei_cmd.egg_base, ei_cmd.egg_info),
            ei_cmd.egg_name, ei_cmd.egg_version,
        )
        bs_cmd = self.get_finalized_command('build_scripts')
        executable = getattr(bs_cmd,'executable',sys_executable)
        is_wininst = getattr(
            self.get_finalized_command("bdist_wininst"), '_is_running', False
        )
        for args in get_script_args(dist, executable, is_wininst):
            self.write_script(*args)

    def write_script(self, script_name, contents, mode="t", *ignored):
        """Write an executable file to the scripts directory"""
        from setuptools.command.easy_install import chmod, current_umask
        log.info("Installing %s script to %s", script_name, self.install_dir)
        target = os.path.join(self.install_dir, script_name)
        self.outfiles.append(target)

        mask = current_umask()
        if not self.dry_run:
            ensure_directory(target)
            f = open(target,"w"+mode)
            f.write(contents)
            f.close()
            chmod(target, 0x1FF-mask)  # 0777

site-packages/setuptools/command/alias.py000064400000004666151733464040014611 0ustar00import distutils, os
from setuptools import Command
from distutils.util import convert_path
from distutils import log
from distutils.errors import *
from setuptools.command.setopt import edit_config, option_base, config_file

def shquote(arg):
    """Quote an argument for later parsing by shlex.split()"""
    for c in '"', "'", "\\", "#":
        if c in arg: return repr(arg)
    if arg.split() != [arg]:
        return repr(arg)
    return arg        


class alias(option_base):
    """Define a shortcut that invokes one or more commands"""
    
    description = "define a shortcut to invoke one or more commands"
    command_consumes_arguments = True

    user_options = [
        ('remove',   'r', 'remove (unset) the alias'), 
    ] + option_base.user_options

    boolean_options = option_base.boolean_options + ['remove']

    def initialize_options(self):
        option_base.initialize_options(self)
        self.args = None
        self.remove = None

    def finalize_options(self):
        option_base.finalize_options(self)
        if self.remove and len(self.args) != 1:
            raise DistutilsOptionError(
                "Must specify exactly one argument (the alias name) when "
                "using --remove"
            )

    def run(self):
        aliases = self.distribution.get_option_dict('aliases')

        if not self.args:
            print("Command Aliases")
            print("---------------")
            for alias in aliases:
                print("setup.py alias", format_alias(alias, aliases))
            return

        elif len(self.args)==1:
            alias, = self.args
            if self.remove:
                command = None
            elif alias in aliases:
                print("setup.py alias", format_alias(alias, aliases))
                return
            else:
                print("No alias definition found for %r" % alias)
                return
        else:
            alias = self.args[0]
            command = ' '.join(map(shquote,self.args[1:]))

        edit_config(self.filename, {'aliases': {alias:command}}, self.dry_run)


def format_alias(name, aliases):
    source, command = aliases[name]
    if source == config_file('global'):
        source = '--global-config '
    elif source == config_file('user'):
        source = '--user-config '
    elif source == config_file('local'):
        source = ''
    else:
        source = '--filename=%r' % source
    return source+name+' '+command
            


site-packages/setuptools/command/install_egg_info.py000064400000007371151733464040017017 0ustar00from setuptools import Command
from setuptools.archive_util import unpack_archive
from distutils import log, dir_util
import os, shutil, pkg_resources

class install_egg_info(Command):
    """Install an .egg-info directory for the package"""

    description = "Install an .egg-info directory for the package"

    user_options = [
        ('install-dir=', 'd', "directory to install to"),
    ]

    def initialize_options(self):
        self.install_dir = None

    def finalize_options(self):
        self.set_undefined_options('install_lib',('install_dir','install_dir'))
        ei_cmd = self.get_finalized_command("egg_info")
        basename = pkg_resources.Distribution(
            None, None, ei_cmd.egg_name, ei_cmd.egg_version
        ).egg_name()+'.egg-info'
        self.source = ei_cmd.egg_info
        self.target = os.path.join(self.install_dir, basename)
        self.outputs = [self.target]

    def run(self):
        self.run_command('egg_info')
        target = self.target
        if os.path.isdir(self.target) and not os.path.islink(self.target):
            dir_util.remove_tree(self.target, dry_run=self.dry_run)
        elif os.path.exists(self.target):
            self.execute(os.unlink,(self.target,),"Removing "+self.target)
        if not self.dry_run:
            pkg_resources.ensure_directory(self.target)
        self.execute(self.copytree, (),
            "Copying %s to %s" % (self.source, self.target)
        )
        self.install_namespaces()

    def get_outputs(self):
        return self.outputs

    def copytree(self):
        # Copy the .egg-info tree to site-packages
        def skimmer(src,dst):
            # filter out source-control directories; note that 'src' is always
            # a '/'-separated path, regardless of platform.  'dst' is a
            # platform-specific path.
            for skip in '.svn/','CVS/':
                if src.startswith(skip) or '/'+skip in src:
                    return None
            self.outputs.append(dst)
            log.debug("Copying %s to %s", src, dst)
            return dst
        unpack_archive(self.source, self.target, skimmer)

























    def install_namespaces(self):
        nsp = self._get_all_ns_packages()
        if not nsp: return
        filename,ext = os.path.splitext(self.target)
        filename += '-nspkg.pth'; self.outputs.append(filename)
        log.info("Installing %s",filename)
        if not self.dry_run:
            f = open(filename,'wt')
            for pkg in nsp:
                # ensure pkg is not a unicode string under Python 2.7
                pkg = str(pkg)
                pth = tuple(pkg.split('.'))
                trailer = '\n'
                if '.' in pkg:
                    trailer = (
                        "; m and setattr(sys.modules[%r], %r, m)\n"
                        % ('.'.join(pth[:-1]), pth[-1])
                    )
                f.write(
                    "import sys,types,os; "
                    "p = os.path.join(sys._getframe(1).f_locals['sitedir'], "
                        "*%(pth)r); "
                    "ie = os.path.exists(os.path.join(p,'__init__.py')); "
                    "m = not ie and "
                        "sys.modules.setdefault(%(pkg)r,types.ModuleType(%(pkg)r)); "
                    "mp = (m or []) and m.__dict__.setdefault('__path__',[]); "
                    "(p not in mp) and mp.append(p)%(trailer)s"
                    % locals()
                )
            f.close()

    def _get_all_ns_packages(self):
        nsp = {}
        for pkg in self.distribution.namespace_packages or []:
            pkg = pkg.split('.')
            while pkg:
                nsp['.'.join(pkg)] = 1
                pkg.pop()
        nsp=list(nsp)
        nsp.sort()  # set up shorter names first
        return nsp


site-packages/setuptools/command/__init__.py000064400000001051151733464040015240 0ustar00__all__ = [
    'alias', 'bdist_egg', 'bdist_rpm', 'build_ext', 'build_py', 'develop',
    'easy_install', 'egg_info', 'install', 'install_lib', 'rotate', 'saveopts',
    'sdist', 'setopt', 'test', 'install_egg_info', 'install_scripts',
    'register', 'bdist_wininst', 'upload_docs',
]

from setuptools.command import install_scripts
import sys

from distutils.command.bdist import bdist

if 'egg' not in bdist.format_commands:
    bdist.format_command['egg'] = ('bdist_egg', "Python .egg file")
    bdist.format_commands.append('egg')

del bdist, sys
site-packages/setuptools/command/saveopts.py000064400000001301151733464040015343 0ustar00import distutils, os
from setuptools import Command
from setuptools.command.setopt import edit_config, option_base

class saveopts(option_base):
    """Save command-line options to a file"""

    description = "save supplied options to setup.cfg or other config file"

    def run(self):
        dist = self.distribution
        settings = {}

        for cmd in dist.command_options:

            if cmd=='saveopts':
                continue    # don't save our own options!

            for opt,(src,val) in dist.get_option_dict(cmd).items():
                if src=="command line":
                    settings.setdefault(cmd,{})[opt] = val

        edit_config(self.filename, settings, self.dry_run)

site-packages/setuptools/command/sdist.py000064400000020225151733464050014634 0ustar00import os
import re
import sys
from glob import glob

import pkg_resources
from distutils.command.sdist import sdist as _sdist
from distutils.util import convert_path
from distutils import log
from setuptools import svn_utils

READMES = ('README', 'README.rst', 'README.txt')


def walk_revctrl(dirname=''):
    """Find all files under revision control"""
    for ep in pkg_resources.iter_entry_points('setuptools.file_finders'):
        for item in ep.load()(dirname):
            yield item


#TODO will need test case
class re_finder(object):

    def __init__(self, path, pattern, postproc=None):
        self.pattern = pattern
        self.postproc = postproc
        self.path = convert_path(path)

    def _finder(self, dirname, filename):
        f = open(filename,'rU')
        try:
            data = f.read()
        finally:
            f.close()
        for match in self.pattern.finditer(data):
            path = match.group(1)
            if self.postproc:
                #postproc used to be used when the svn finder
                #was an re_finder for calling unescape
                path = self.postproc(path)
            yield svn_utils.joinpath(dirname,path)
    def __call__(self, dirname=''):
        path = svn_utils.joinpath(dirname, self.path)

        if os.path.isfile(path):
            for path in self._finder(dirname,path):
                if os.path.isfile(path):
                    yield path
                elif os.path.isdir(path):
                    for item in self(path):
                        yield item


def _default_revctrl(dirname=''):
    'Primary svn_cvs entry point'
    for finder in finders:
        for item in finder(dirname):
            yield item


finders = [
    re_finder('CVS/Entries', re.compile(r"^\w?/([^/]+)/", re.M)),
    svn_utils.svn_finder,
]



class sdist(_sdist):
    """Smart sdist that finds anything supported by revision control"""

    user_options = [
        ('formats=', None,
         "formats for source distribution (comma-separated list)"),
        ('keep-temp', 'k',
         "keep the distribution tree around after creating " +
         "archive file(s)"),
        ('dist-dir=', 'd',
         "directory to put the source distribution archive(s) in "
         "[default: dist]"),
        ]

    negative_opt = {}

    def run(self):
        self.run_command('egg_info')
        ei_cmd = self.get_finalized_command('egg_info')
        self.filelist = ei_cmd.filelist
        self.filelist.append(os.path.join(ei_cmd.egg_info,'SOURCES.txt'))
        self.check_readme()

        # Run sub commands
        for cmd_name in self.get_sub_commands():
            self.run_command(cmd_name)

        # Call check_metadata only if no 'check' command
        # (distutils <= 2.6)
        import distutils.command
        if 'check' not in distutils.command.__all__:
            self.check_metadata()

        self.make_distribution()

        dist_files = getattr(self.distribution,'dist_files',[])
        for file in self.archive_files:
            data = ('sdist', '', file)
            if data not in dist_files:
                dist_files.append(data)

    def __read_template_hack(self):
        # This grody hack closes the template file (MANIFEST.in) if an
        #  exception occurs during read_template.
        # Doing so prevents an error when easy_install attempts to delete the
        #  file.
        try:
            _sdist.read_template(self)
        except:
            sys.exc_info()[2].tb_next.tb_frame.f_locals['template'].close()
            raise
    # Beginning with Python 2.7.2, 3.1.4, and 3.2.1, this leaky file handle
    #  has been fixed, so only override the method if we're using an earlier
    #  Python.
    has_leaky_handle = (
        sys.version_info < (2,7,2)
        or (3,0) <= sys.version_info < (3,1,4)
        or (3,2) <= sys.version_info < (3,2,1)
    )
    if has_leaky_handle:
        read_template = __read_template_hack

    def add_defaults(self):
        standards = [READMES,
                     self.distribution.script_name]
        for fn in standards:
            if isinstance(fn, tuple):
                alts = fn
                got_it = 0
                for fn in alts:
                    if os.path.exists(fn):
                        got_it = 1
                        self.filelist.append(fn)
                        break

                if not got_it:
                    self.warn("standard file not found: should have one of " +
                              ', '.join(alts))
            else:
                if os.path.exists(fn):
                    self.filelist.append(fn)
                else:
                    self.warn("standard file '%s' not found" % fn)

        optional = ['test/test*.py', 'setup.cfg']
        for pattern in optional:
            files = list(filter(os.path.isfile, glob(pattern)))
            if files:
                self.filelist.extend(files)

        # getting python files
        if self.distribution.has_pure_modules():
            build_py = self.get_finalized_command('build_py')
            self.filelist.extend(build_py.get_source_files())
            # This functionality is incompatible with include_package_data, and
            # will in fact create an infinite recursion if include_package_data
            # is True.  Use of include_package_data will imply that
            # distutils-style automatic handling of package_data is disabled
            if not self.distribution.include_package_data:
                for _, src_dir, _, filenames in build_py.data_files:
                    self.filelist.extend([os.path.join(src_dir, filename)
                                          for filename in filenames])

        if self.distribution.has_ext_modules():
            build_ext = self.get_finalized_command('build_ext')
            self.filelist.extend(build_ext.get_source_files())

        if self.distribution.has_c_libraries():
            build_clib = self.get_finalized_command('build_clib')
            self.filelist.extend(build_clib.get_source_files())

        if self.distribution.has_scripts():
            build_scripts = self.get_finalized_command('build_scripts')
            self.filelist.extend(build_scripts.get_source_files())

    def check_readme(self):
        for f in READMES:
            if os.path.exists(f):
                return
        else:
            self.warn(
                "standard file not found: should have one of " +', '.join(READMES)
            )

    def make_release_tree(self, base_dir, files):
        _sdist.make_release_tree(self, base_dir, files)

        # Save any egg_info command line options used to create this sdist
        dest = os.path.join(base_dir, 'setup.cfg')
        if hasattr(os,'link') and os.path.exists(dest):
            # unlink and re-copy, since it might be hard-linked, and
            # we don't want to change the source version
            os.unlink(dest)
            self.copy_file('setup.cfg', dest)

        self.get_finalized_command('egg_info').save_version_info(dest)

    def _manifest_is_not_generated(self):
        # check for special comment used in 2.7.1 and higher
        if not os.path.isfile(self.manifest):
            return False

        fp = open(self.manifest, 'rbU')
        try:
            first_line = fp.readline()
        finally:
            fp.close()
        return first_line != '# file GENERATED by distutils, do NOT edit\n'.encode()

    def read_manifest(self):
        """Read the manifest file (named by 'self.manifest') and use it to
        fill in 'self.filelist', the list of files to include in the source
        distribution.
        """
        log.info("reading manifest file '%s'", self.manifest)
        manifest = open(self.manifest, 'rbU')
        for line in manifest:
            # The manifest must contain UTF-8. See #303.
            if sys.version_info >= (3,):
                try:
                    line = line.decode('UTF-8')
                except UnicodeDecodeError:
                    log.warn("%r not UTF-8 decodable -- skipping" % line)
                    continue
            # ignore comments and blank lines
            line = line.strip()
            if line.startswith('#') or not line:
                continue
            self.filelist.append(line)
        manifest.close()
site-packages/setuptools/command/develop.py000064400000014457151733464050015156 0ustar00from setuptools.command.easy_install import easy_install
from distutils.util import convert_path, subst_vars
from pkg_resources import Distribution, PathMetadata, normalize_path
from distutils import log
from distutils.errors import DistutilsError, DistutilsOptionError
import os, sys, setuptools, glob

class develop(easy_install):
    """Set up package for development"""

    description = "install package in 'development mode'"

    user_options = easy_install.user_options + [
        ("uninstall", "u", "Uninstall this source package"),
        ("egg-path=", None, "Set the path to be used in the .egg-link file"),
    ]

    boolean_options = easy_install.boolean_options + ['uninstall']

    command_consumes_arguments = False  # override base

    def run(self):
        if self.uninstall:
            self.multi_version = True
            self.uninstall_link()
        else:
            self.install_for_development()
        self.warn_deprecated_options()

    def initialize_options(self):
        self.uninstall = None
        self.egg_path = None
        easy_install.initialize_options(self)
        self.setup_path = None
        self.always_copy_from = '.'   # always copy eggs installed in curdir



    def finalize_options(self):
        ei = self.get_finalized_command("egg_info")
        if ei.broken_egg_info:
            raise DistutilsError(
            "Please rename %r to %r before using 'develop'"
            % (ei.egg_info, ei.broken_egg_info)
            )
        self.args = [ei.egg_name]




        easy_install.finalize_options(self)
        self.expand_basedirs()
        self.expand_dirs()
        # pick up setup-dir .egg files only: no .egg-info
        self.package_index.scan(glob.glob('*.egg'))

        self.egg_link = os.path.join(self.install_dir, ei.egg_name+'.egg-link')
        self.egg_base = ei.egg_base
        if self.egg_path is None:
            self.egg_path = os.path.abspath(ei.egg_base)

        target = normalize_path(self.egg_base)
        if normalize_path(os.path.join(self.install_dir, self.egg_path)) != target:
            raise DistutilsOptionError(
                "--egg-path must be a relative path from the install"
                " directory to "+target
        )

        # Make a distribution for the package's source
        self.dist = Distribution(
            target,
            PathMetadata(target, os.path.abspath(ei.egg_info)),
            project_name = ei.egg_name
        )

        p = self.egg_base.replace(os.sep,'/')
        if p!= os.curdir:
            p = '../' * (p.count('/')+1)
        self.setup_path = p
        p = normalize_path(os.path.join(self.install_dir, self.egg_path, p))
        if  p != normalize_path(os.curdir):
            raise DistutilsOptionError(
                "Can't get a consistent path to setup script from"
                " installation directory", p, normalize_path(os.curdir))

    def install_for_development(self):
        if sys.version_info >= (3,) and getattr(self.distribution, 'use_2to3', False):
            # If we run 2to3 we can not do this inplace:

            # Ensure metadata is up-to-date
            self.reinitialize_command('build_py', inplace=0)
            self.run_command('build_py')
            bpy_cmd = self.get_finalized_command("build_py")
            build_path = normalize_path(bpy_cmd.build_lib)

            # Build extensions
            self.reinitialize_command('egg_info', egg_base=build_path)
            self.run_command('egg_info')

            self.reinitialize_command('build_ext', inplace=0)
            self.run_command('build_ext')
            
            # Fixup egg-link and easy-install.pth
            ei_cmd = self.get_finalized_command("egg_info")
            self.egg_path = build_path
            self.dist.location = build_path
            self.dist._provider = PathMetadata(build_path, ei_cmd.egg_info)    # XXX
        else:
            # Without 2to3 inplace works fine:
            self.run_command('egg_info')

            # Build extensions in-place
            self.reinitialize_command('build_ext', inplace=1)
            self.run_command('build_ext')
        
        self.install_site_py()  # ensure that target dir is site-safe
        if setuptools.bootstrap_install_from:
            self.easy_install(setuptools.bootstrap_install_from)
            setuptools.bootstrap_install_from = None

        # create an .egg-link in the installation dir, pointing to our egg
        log.info("Creating %s (link to %s)", self.egg_link, self.egg_base)
        if not self.dry_run:
            f = open(self.egg_link,"w")
            f.write(self.egg_path + "\n" + self.setup_path)
            f.close()
        # postprocess the installed distro, fixing up .pth, installing scripts,
        # and handling requirements
        self.process_distribution(None, self.dist, not self.no_deps)


    def uninstall_link(self):
        if os.path.exists(self.egg_link):
            log.info("Removing %s (link to %s)", self.egg_link, self.egg_base)
            egg_link_file = open(self.egg_link)
            contents = [line.rstrip() for line in egg_link_file]
            egg_link_file.close()
            if contents not in ([self.egg_path], [self.egg_path, self.setup_path]):
                log.warn("Link points to %s: uninstall aborted", contents)
                return
            if not self.dry_run:
                os.unlink(self.egg_link)
        if not self.dry_run:
            self.update_pth(self.dist)  # remove any .pth link to us
        if self.distribution.scripts:
            # XXX should also check for entry point scripts!
            log.warn("Note: you must uninstall or replace scripts manually!")

    def install_egg_scripts(self, dist):
        if dist is not self.dist:
            # Installing a dependency, so fall back to normal behavior
            return easy_install.install_egg_scripts(self,dist)

        # create wrapper scripts in the script dir, pointing to dist.scripts

        # new-style...
        self.install_wrapper_scripts(dist)

        # ...and old-style
        for script_name in self.distribution.scripts or []:
            script_path = os.path.abspath(convert_path(script_name))
            script_name = os.path.basename(script_path)
            f = open(script_path,'rU')
            script_text = f.read()
            f.close()
            self.install_script(dist, script_name, script_text, script_path)

site-packages/setuptools/command/bdist_wininst.py000064400000004353151733464050016372 0ustar00from distutils.command.bdist_wininst import bdist_wininst as _bdist_wininst
import os, sys

class bdist_wininst(_bdist_wininst):
    _good_upload = _bad_upload = None

    def create_exe(self, arcname, fullname, bitmap=None):
        _bdist_wininst.create_exe(self, arcname, fullname, bitmap)
        installer_name = self.get_installer_filename(fullname) 
        if self.target_version:
            pyversion = self.target_version
            # fix 2.5+ bdist_wininst ignoring --target-version spec
            self._bad_upload = ('bdist_wininst', 'any', installer_name)
        else:
            pyversion = 'any'
        self._good_upload = ('bdist_wininst', pyversion, installer_name)
        
    def _fix_upload_names(self):
        good, bad = self._good_upload, self._bad_upload
        dist_files = getattr(self.distribution, 'dist_files', [])
        if bad in dist_files:
            dist_files.remove(bad)
        if good not in dist_files:
            dist_files.append(good)

    def reinitialize_command (self, command, reinit_subcommands=0):
        cmd = self.distribution.reinitialize_command(
            command, reinit_subcommands)
        if command in ('install', 'install_lib'):
            cmd.install_lib = None  # work around distutils bug
        return cmd

    def run(self):
        self._is_running = True
        try:
            _bdist_wininst.run(self)
            self._fix_upload_names()
        finally:
            self._is_running = False


    if not hasattr(_bdist_wininst, 'get_installer_filename'):
        def get_installer_filename(self, fullname):
            # Factored out to allow overriding in subclasses
            if self.target_version:
                # if we create an installer for a specific python version,
                # it's better to include this in the name
                installer_name = os.path.join(self.dist_dir,
                                              "%s.win32-py%s.exe" %
                                               (fullname, self.target_version))
            else:
                installer_name = os.path.join(self.dist_dir,
                                              "%s.win32.exe" % fullname)
            return installer_name
    # get_installer_filename()
    


























site-packages/setuptools/command/setopt.py000064400000011714151733464050015027 0ustar00import distutils, os
from setuptools import Command
from distutils.util import convert_path
from distutils import log
from distutils.errors import *

__all__ = ['config_file', 'edit_config', 'option_base', 'setopt']


def config_file(kind="local"):
    """Get the filename of the distutils, local, global, or per-user config

    `kind` must be one of "local", "global", or "user"
    """
    if kind=='local':
        return 'setup.cfg'
    if kind=='global':
        return os.path.join(
            os.path.dirname(distutils.__file__),'distutils.cfg'
        )
    if kind=='user':
        dot = os.name=='posix' and '.' or ''
        return os.path.expanduser(convert_path("~/%spydistutils.cfg" % dot))
    raise ValueError(
        "config_file() type must be 'local', 'global', or 'user'", kind
    )















def edit_config(filename, settings, dry_run=False):
    """Edit a configuration file to include `settings`

    `settings` is a dictionary of dictionaries or ``None`` values, keyed by
    command/section name.  A ``None`` value means to delete the entire section,
    while a dictionary lists settings to be changed or deleted in that section.
    A setting of ``None`` means to delete that setting.
    """
    from setuptools.compat import ConfigParser
    log.debug("Reading configuration from %s", filename)
    opts = ConfigParser.RawConfigParser()
    opts.read([filename])
    for section, options in settings.items():
        if options is None:
            log.info("Deleting section [%s] from %s", section, filename)
            opts.remove_section(section)
        else:
            if not opts.has_section(section):
                log.debug("Adding new section [%s] to %s", section, filename)
                opts.add_section(section)
            for option,value in options.items():
                if value is None:
                    log.debug("Deleting %s.%s from %s",
                        section, option, filename
                    )
                    opts.remove_option(section,option)
                    if not opts.options(section):
                        log.info("Deleting empty [%s] section from %s",
                                  section, filename)
                        opts.remove_section(section)
                else:
                    log.debug(
                        "Setting %s.%s to %r in %s",
                        section, option, value, filename
                    )
                    opts.set(section,option,value)

    log.info("Writing %s", filename)
    if not dry_run:
        f = open(filename,'w'); opts.write(f); f.close()

class option_base(Command):
    """Abstract base class for commands that mess with config files"""
    
    user_options = [
        ('global-config', 'g',
                 "save options to the site-wide distutils.cfg file"),
        ('user-config', 'u',
                 "save options to the current user's pydistutils.cfg file"),
        ('filename=', 'f',
                 "configuration file to use (default=setup.cfg)"),
    ]

    boolean_options = [
        'global-config', 'user-config',
    ]    

    def initialize_options(self):
        self.global_config = None
        self.user_config   = None
        self.filename = None

    def finalize_options(self):
        filenames = []
        if self.global_config:
            filenames.append(config_file('global'))
        if self.user_config:
            filenames.append(config_file('user'))
        if self.filename is not None:
            filenames.append(self.filename)
        if not filenames:
            filenames.append(config_file('local'))
        if len(filenames)>1:
            raise DistutilsOptionError(
                "Must specify only one configuration file option",
                filenames
            )
        self.filename, = filenames    




class setopt(option_base):
    """Save command-line options to a file"""

    description = "set an option in setup.cfg or another config file"

    user_options = [
        ('command=', 'c', 'command to set an option for'),
        ('option=',  'o',  'option to set'),
        ('set-value=',   's', 'value of the option'),
        ('remove',   'r', 'remove (unset) the value'), 
    ] + option_base.user_options

    boolean_options = option_base.boolean_options + ['remove']

    def initialize_options(self):
        option_base.initialize_options(self)
        self.command = None
        self.option = None
        self.set_value = None
        self.remove = None

    def finalize_options(self):
        option_base.finalize_options(self)
        if self.command is None or self.option is None:
            raise DistutilsOptionError("Must specify --command *and* --option")
        if self.set_value is None and not self.remove:
            raise DistutilsOptionError("Must specify --set-value or --remove")

    def run(self):
        edit_config(
            self.filename, {
                self.command: {self.option.replace('-','_'):self.set_value}
            },
            self.dry_run
        )






site-packages/setuptools/command/egg_info.py000064400000033760151733464050015273 0ustar00"""setuptools.command.egg_info

Create a distribution's .egg-info directory and contents"""

import os
import re
import sys

from setuptools import Command
import distutils.errors
from distutils import log
from setuptools.command.sdist import sdist
from setuptools.compat import basestring
from setuptools import svn_utils
from distutils.util import convert_path
from distutils.filelist import FileList as _FileList
from pkg_resources import (parse_requirements, safe_name, parse_version,
    safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename)
from setuptools.command.sdist import walk_revctrl


class egg_info(Command):
    description = "create a distribution's .egg-info directory"

    user_options = [
        ('egg-base=', 'e', "directory containing .egg-info directories"
                           " (default: top of the source tree)"),
        ('tag-svn-revision', 'r',
            "Add subversion revision ID to version number"),
        ('tag-date', 'd', "Add date stamp (e.g. 20050528) to version number"),
        ('tag-build=', 'b', "Specify explicit tag to add to version number"),
        ('no-svn-revision', 'R',
            "Don't add subversion revision ID [default]"),
        ('no-date', 'D', "Don't include date stamp [default]"),
    ]

    boolean_options = ['tag-date', 'tag-svn-revision']
    negative_opt = {'no-svn-revision': 'tag-svn-revision',
                    'no-date': 'tag-date'}

    def initialize_options(self):
        self.egg_name = None
        self.egg_version = None
        self.egg_base = None
        self.egg_info = None
        self.tag_build = None
        self.tag_svn_revision = 0
        self.tag_date = 0
        self.broken_egg_info = False
        self.vtags = None

    def save_version_info(self, filename):
        from setuptools.command.setopt import edit_config
        values = dict(
            egg_info=dict(
                tag_svn_revision=0,
                tag_date=0,
                tag_build=self.tags(),
            )
        )
        edit_config(filename, values)

    def finalize_options(self):
        self.egg_name = safe_name(self.distribution.get_name())
        self.vtags = self.tags()
        self.egg_version = self.tagged_version()

        try:
            list(
                parse_requirements('%s==%s' % (self.egg_name,self.egg_version))
            )
        except ValueError:
            raise distutils.errors.DistutilsOptionError(
                "Invalid distribution name or version syntax: %s-%s" %
                (self.egg_name,self.egg_version)
            )

        if self.egg_base is None:
            dirs = self.distribution.package_dir
            self.egg_base = (dirs or {}).get('',os.curdir)

        self.ensure_dirname('egg_base')
        self.egg_info = to_filename(self.egg_name)+'.egg-info'
        if self.egg_base != os.curdir:
            self.egg_info = os.path.join(self.egg_base, self.egg_info)
        if '-' in self.egg_name: self.check_broken_egg_info()

        # Set package version for the benefit of dumber commands
        # (e.g. sdist, bdist_wininst, etc.)
        #
        self.distribution.metadata.version = self.egg_version

        # If we bootstrapped around the lack of a PKG-INFO, as might be the
        # case in a fresh checkout, make sure that any special tags get added
        # to the version info
        #
        pd = self.distribution._patched_dist
        if pd is not None and pd.key==self.egg_name.lower():
            pd._version = self.egg_version
            pd._parsed_version = parse_version(self.egg_version)
            self.distribution._patched_dist = None

    def write_or_delete_file(self, what, filename, data, force=False):
        """Write `data` to `filename` or delete if empty

        If `data` is non-empty, this routine is the same as ``write_file()``.
        If `data` is empty but not ``None``, this is the same as calling
        ``delete_file(filename)`.  If `data` is ``None``, then this is a no-op
        unless `filename` exists, in which case a warning is issued about the
        orphaned file (if `force` is false), or deleted (if `force` is true).
        """
        if data:
            self.write_file(what, filename, data)
        elif os.path.exists(filename):
            if data is None and not force:
                log.warn(
                    "%s not set in setup(), but %s exists", what, filename
                )
                return
            else:
                self.delete_file(filename)

    def write_file(self, what, filename, data):
        """Write `data` to `filename` (if not a dry run) after announcing it

        `what` is used in a log message to identify what is being written
        to the file.
        """
        log.info("writing %s to %s", what, filename)
        if sys.version_info >= (3,):
            data = data.encode("utf-8")
        if not self.dry_run:
            f = open(filename, 'wb')
            f.write(data)
            f.close()

    def delete_file(self, filename):
        """Delete `filename` (if not a dry run) after announcing it"""
        log.info("deleting %s", filename)
        if not self.dry_run:
            os.unlink(filename)

    def tagged_version(self):
        version = self.distribution.get_version()
        # egg_info may be called more than once for a distribution,
        # in which case the version string already contains all tags.
        if self.vtags and version.endswith(self.vtags):
            return safe_version(version)
        return safe_version(version + self.vtags)

    def run(self):
        self.mkpath(self.egg_info)
        installer = self.distribution.fetch_build_egg
        for ep in iter_entry_points('egg_info.writers'):
            writer = ep.load(installer=installer)
            writer(self, ep.name, os.path.join(self.egg_info,ep.name))

        # Get rid of native_libs.txt if it was put there by older bdist_egg
        nl = os.path.join(self.egg_info, "native_libs.txt")
        if os.path.exists(nl):
            self.delete_file(nl)

        self.find_sources()

    def tags(self):
        version = ''
        if self.tag_build:
            version+=self.tag_build
        if self.tag_svn_revision and (
            os.path.exists('.svn') or os.path.exists('PKG-INFO')
        ):  version += '-r%s' % self.get_svn_revision()
        if self.tag_date:
            import time
            version += time.strftime("-%Y%m%d")
        return version

    @staticmethod
    def get_svn_revision():
        return str(svn_utils.SvnInfo.load(os.curdir).get_revision())

    def find_sources(self):
        """Generate SOURCES.txt manifest file"""
        manifest_filename = os.path.join(self.egg_info,"SOURCES.txt")
        mm = manifest_maker(self.distribution)
        mm.manifest = manifest_filename
        mm.run()
        self.filelist = mm.filelist

    def check_broken_egg_info(self):
        bei = self.egg_name+'.egg-info'
        if self.egg_base != os.curdir:
            bei = os.path.join(self.egg_base, bei)
        if os.path.exists(bei):
            log.warn(
                "-"*78+'\n'
                "Note: Your current .egg-info directory has a '-' in its name;"
                '\nthis will not work correctly with "setup.py develop".\n\n'
                'Please rename %s to %s to correct this problem.\n'+'-'*78,
                bei, self.egg_info
            )
            self.broken_egg_info = self.egg_info
            self.egg_info = bei     # make it work for now

class FileList(_FileList):
    """File list that accepts only existing, platform-independent paths"""

    def append(self, item):
        if item.endswith('\r'):     # Fix older sdists built on Windows
            item = item[:-1]
        path = convert_path(item)

        if sys.version_info >= (3,):
            try:
                if os.path.exists(path) or os.path.exists(path.encode('utf-8')):
                    self.files.append(path)
            except UnicodeEncodeError:
                # Accept UTF-8 filenames even if LANG=C
                if os.path.exists(path.encode('utf-8')):
                    self.files.append(path)
                else:
                    log.warn("'%s' not %s encodable -- skipping", path,
                        sys.getfilesystemencoding())
        else:
            if os.path.exists(path):
                self.files.append(path)


class manifest_maker(sdist):

    template = "MANIFEST.in"

    def initialize_options(self):
        self.use_defaults = 1
        self.prune = 1
        self.manifest_only = 1
        self.force_manifest = 1

    def finalize_options(self):
        pass

    def run(self):
        self.filelist = FileList()
        if not os.path.exists(self.manifest):
            self.write_manifest()   # it must exist so it'll get in the list
        self.filelist.findall()
        self.add_defaults()
        if os.path.exists(self.template):
            self.read_template()
        self.prune_file_list()
        self.filelist.sort()
        self.filelist.remove_duplicates()
        self.write_manifest()

    def write_manifest(self):
        """Write the file list in 'self.filelist' (presumably as filled in
        by 'add_defaults()' and 'read_template()') to the manifest file
        named by 'self.manifest'.
        """
        # The manifest must be UTF-8 encodable. See #303.
        if sys.version_info >= (3,):
            files = []
            for file in self.filelist.files:
                try:
                    file.encode("utf-8")
                except UnicodeEncodeError:
                    log.warn("'%s' not UTF-8 encodable -- skipping" % file)
                else:
                    files.append(file)
            self.filelist.files = files

        files = self.filelist.files
        if os.sep!='/':
            files = [f.replace(os.sep,'/') for f in files]
        self.execute(write_file, (self.manifest, files),
                     "writing manifest file '%s'" % self.manifest)

    def warn(self, msg):    # suppress missing-file warnings from sdist
        if not msg.startswith("standard file not found:"):
            sdist.warn(self, msg)

    def add_defaults(self):
        sdist.add_defaults(self)
        self.filelist.append(self.template)
        self.filelist.append(self.manifest)
        rcfiles = list(walk_revctrl())
        if rcfiles:
            self.filelist.extend(rcfiles)
        elif os.path.exists(self.manifest):
            self.read_manifest()
        ei_cmd = self.get_finalized_command('egg_info')
        self.filelist.include_pattern("*", prefix=ei_cmd.egg_info)

    def prune_file_list(self):
        build = self.get_finalized_command('build')
        base_dir = self.distribution.get_fullname()
        self.filelist.exclude_pattern(None, prefix=build.build_base)
        self.filelist.exclude_pattern(None, prefix=base_dir)
        sep = re.escape(os.sep)
        self.filelist.exclude_pattern(sep+r'(RCS|CVS|\.svn)'+sep, is_regex=1)


def write_file(filename, contents):
    """Create a file with the specified name and write 'contents' (a
    sequence of strings without line terminators) to it.
    """
    contents = "\n".join(contents)
    if sys.version_info >= (3,):
        contents = contents.encode("utf-8")
    f = open(filename, "wb")        # always write POSIX-style manifest
    f.write(contents)
    f.close()

def write_pkg_info(cmd, basename, filename):
    log.info("writing %s", filename)
    if not cmd.dry_run:
        metadata = cmd.distribution.metadata
        metadata.version, oldver = cmd.egg_version, metadata.version
        metadata.name, oldname = cmd.egg_name, metadata.name
        try:
            # write unescaped data to PKG-INFO, so older pkg_resources
            # can still parse it
            metadata.write_pkg_info(cmd.egg_info)
        finally:
            metadata.name, metadata.version = oldname, oldver

        safe = getattr(cmd.distribution,'zip_safe',None)
        from setuptools.command import bdist_egg
        bdist_egg.write_safety_flag(cmd.egg_info, safe)

def warn_depends_obsolete(cmd, basename, filename):
    if os.path.exists(filename):
        log.warn(
            "WARNING: 'depends.txt' is not used by setuptools 0.6!\n"
            "Use the install_requires/extras_require setup() args instead."
        )


def write_requirements(cmd, basename, filename):
    dist = cmd.distribution
    data = ['\n'.join(yield_lines(dist.install_requires or ()))]
    for extra,reqs in (dist.extras_require or {}).items():
        data.append('\n\n[%s]\n%s' % (extra, '\n'.join(yield_lines(reqs))))
    cmd.write_or_delete_file("requirements", filename, ''.join(data))

def write_toplevel_names(cmd, basename, filename):
    pkgs = dict.fromkeys(
        [
            k.split('.',1)[0]
            for k in cmd.distribution.iter_distribution_names()
        ]
    )
    cmd.write_file("top-level names", filename, '\n'.join(pkgs)+'\n')


def overwrite_arg(cmd, basename, filename):
    write_arg(cmd, basename, filename, True)

def write_arg(cmd, basename, filename, force=False):
    argname = os.path.splitext(basename)[0]
    value = getattr(cmd.distribution, argname, None)
    if value is not None:
        value = '\n'.join(value)+'\n'
    cmd.write_or_delete_file(argname, filename, value, force)

def write_entries(cmd, basename, filename):
    ep = cmd.distribution.entry_points

    if isinstance(ep,basestring) or ep is None:
        data = ep
    elif ep is not None:
        data = []
        for section, contents in ep.items():
            if not isinstance(contents,basestring):
                contents = EntryPoint.parse_group(section, contents)
                contents = '\n'.join(map(str,contents.values()))
            data.append('[%s]\n%s\n\n' % (section,contents))
        data = ''.join(data)

    cmd.write_or_delete_file('entry points', filename, data, True)

def get_pkg_info_revision():
    # See if we can get a -r### off of PKG-INFO, in case this is an sdist of
    # a subversion revision
    #
    if os.path.exists('PKG-INFO'):
        f = open('PKG-INFO','rU')
        for line in f:
            match = re.match(r"Version:.*-r(\d+)\s*$", line)
            if match:
                return int(match.group(1))
        f.close()
    return 0
site-packages/setuptools/command/install.py000064400000007741151733464050015164 0ustar00import setuptools, sys, glob
from distutils.command.install import install as _install
from distutils.errors import DistutilsArgError

class install(_install):
    """Use easy_install to install the package, w/dependencies"""

    user_options = _install.user_options + [
        ('old-and-unmanageable', None, "Try not to use this!"),
        ('single-version-externally-managed', None,
            "used by system package builders to create 'flat' eggs"),
    ]
    boolean_options = _install.boolean_options + [
        'old-and-unmanageable', 'single-version-externally-managed',
    ]
    new_commands = [
        ('install_egg_info', lambda self: True),
        ('install_scripts',  lambda self: True),
    ]
    _nc = dict(new_commands)

    def initialize_options(self):
        _install.initialize_options(self)
        self.old_and_unmanageable = None
        self.single_version_externally_managed = None
        self.no_compile = None  # make DISTUTILS_DEBUG work right!

    def finalize_options(self):
        _install.finalize_options(self)
        if self.root:
            self.single_version_externally_managed = True
        elif self.single_version_externally_managed:
            if not self.root and not self.record:
                raise DistutilsArgError(
                    "You must specify --record or --root when building system"
                    " packages"
                )

    def handle_extra_path(self):
        if self.root or self.single_version_externally_managed:
            # explicit backward-compatibility mode, allow extra_path to work
            return _install.handle_extra_path(self)

        # Ignore extra_path when installing an egg (or being run by another
        # command without --root or --single-version-externally-managed
        self.path_file = None
        self.extra_dirs = ''


    def run(self):
        # Explicit request for old-style install?  Just do it
        if self.old_and_unmanageable or self.single_version_externally_managed:
            return _install.run(self)

        # Attempt to detect whether we were called from setup() or by another
        # command.  If we were called by setup(), our caller will be the
        # 'run_command' method in 'distutils.dist', and *its* caller will be
        # the 'run_commands' method.  If we were called any other way, our
        # immediate caller *might* be 'run_command', but it won't have been
        # called by 'run_commands'.  This is slightly kludgy, but seems to
        # work.
        #
        caller = sys._getframe(2)
        caller_module = caller.f_globals.get('__name__','')
        caller_name = caller.f_code.co_name

        if caller_module != 'distutils.dist' or caller_name!='run_commands':
            # We weren't called from the command line or setup(), so we
            # should run in backward-compatibility mode to support bdist_*
            # commands.
            _install.run(self)
        else:
            self.do_egg_install()






    def do_egg_install(self):

        easy_install = self.distribution.get_command_class('easy_install')

        cmd = easy_install(
            self.distribution, args="x", root=self.root, record=self.record,
        )
        cmd.ensure_finalized()  # finalize before bdist_egg munges install cmd
        cmd.always_copy_from = '.'  # make sure local-dir eggs get installed

        # pick up setup-dir .egg files only: no .egg-info
        cmd.package_index.scan(glob.glob('*.egg'))

        self.run_command('bdist_egg')
        args = [self.distribution.get_command_obj('bdist_egg').egg_output]

        if setuptools.bootstrap_install_from:
            # Bootstrap self-installation of setuptools
            args.insert(0, setuptools.bootstrap_install_from)

        cmd.args = args
        cmd.run()
        setuptools.bootstrap_install_from = None

# XXX Python 3.1 doesn't see _nc if this is inside the class
install.sub_commands = [
        cmd for cmd in _install.sub_commands if cmd[0] not in install._nc
    ] + install.new_commands
















#
site-packages/setuptools/__pycache__/svn_utils.cpython-33.pyc000064400000064210151733464050020401 0ustar00�
�Re�Ec@siddlZddlZddlZddlmZddlZddlZddlZddl	Z	ddl
Z
ddlZddlm
Z
ddlmZyddlZWn!ek
r�ddljZYnXddlmZmZeedddd�Zdd	�Zd
d�Zdd
�Zdd�Zdd�Ze�Z ddd�Z!dd�Z"ddd�Z#dd�Z$dd�Z%Gdd�de&�Z'Gdd �d e'�Z(Gd!d"�d"e(�Z)Gd#d$�d$e'�Z*dd%d&�Z+Gd'd(�d(e&�Z,Gd)d*�d*e,�Z-Gd+d,�d,e,�Z.e/d-krex(e+ej0d.�D]Z1e2e1�qNWndS(/iN(ulog(uunicode(uunescape(uPopenuPIPEcCspy;t|d|d|dtjdk�}|j�|}Wntk
rSdSYnXt||�}|j|fS(Nustdoutustderrushelluwin32iu(iu(u_PopenusysuplatformucommunicateuOSErrorudecode_as_stringu
returncode(uargsustdoutustderruencodingustreamuprocudata((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu_run_commands
	u_run_commandcCs0|jd�d}djdd�|jD��S(NuscheduleiucSs+g|]!}|j|jkr|j�qS((unodeTypeu	TEXT_NODEu	nodeValue(u.0ut((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu
<listcomp>2s	u'_get_entry_schedule.<locals>.<listcomp>(ugetElementsByTagNameujoinu
childNodes(uentryuschedule((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu_get_entry_schedule0su_get_entry_schedulecCs0|jd�d}djdd�|jD��S(NupropertyiucSs+g|]!}|j|jkr|j�qS((unodeTypeu	TEXT_NODEu	nodeValue(u.0ut((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu
<listcomp>9s	u(_get_target_property.<locals>.<listcomp>(ugetElementsByTagNameujoinu
childNodes(utargetu
property_text((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu_get_target_property7su_get_target_propertycCs+tjdkr!|jd�}n|}|S(Niiuutf-8(ii(usysuversion_infouencode(udecoded_strudata((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu
_get_xml_data>su
_get_xml_datacGs6|s|dkr#tjj|�Stjj||�S(Nu.(uosupathujoin(uprefixusuffix((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyujoinpathGsujoinpathcCs�yLtj�}|s"|dkr5tj�d}n|rKtj|�nWn!tjtfk
rod}YnXtj	dk}|s�ddg|S|j
d�r�|r�dS|SdS(NuUS-ASCIIiudarwinuutf-8umac-(ulocaleugetpreferredencodingugetdefaultlocaleucodecsulookupuErroruLookupErroruNoneusysuplatformu
startswith(uencodinguis_osx((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyudetermine_console_encodingLsudetermine_console_encodingcCsL|dkrt}nt|t�s6|j|�}ntjd|�}|S(u�
    Decode the console or file output explicitly using getpreferredencoding.
    The text paraemeter should be a encoded string, if not no decode occurs
    If no encoding is given, getpreferredencoding is used.  If encoding is
    specified, that is used instead.  This would be needed for SVN --xml
    output.  Unicode is explicitly put in composed NFC form.

    --xml should be UTF-8 (SVN Issue 2938) the discussion on the Subversion
    DEV List from 2007 seems to indicate the same.
    uNFCN(uNoneu_console_encodingu
isinstanceuunicodeudecodeuunicodedatau	normalize(utextuencoding((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyudecode_as_stringis
	udecode_as_stringcCs�tjjjt|��}t�}x||D]t\}}|dkr+|jdkr+|j|�t|�j	d�s�|j
|jd�|jd�f�q�q+q+W|dd�S(u+Parse the entries from a recursive info xmlu
START_ELEMENTuentryudeleteupathukindiN(uxmludomupulldomuparseStringu
_get_xml_dataulistunodeNameu
expandNodeu_get_entry_scheduleu
startswithuappendugetAttribute(udecoded_strudocuentriesueventunode((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuparse_dir_entries�s	
uparse_dir_entriesuc	Cstjj|�}tjj|�}tjjjt|��}t	�}x�|D]�\}}|dkrO|j
dkrO|j|�tjj|jd��}tjj|�j
|�r�|t|�dd�}nt|�}x-t|�D]}|jt||��q�WqOqOW|S(u!Parse a propget svn:externals xmlu
START_ELEMENTutargetupathiN(uosupathunormpathunormcaseuxmludomupulldomuparseStringu
_get_xml_dataulistunodeNameu
expandNodeugetAttributeu
startswithulenu_get_target_propertyuparse_external_propuappendujoinpath(	udecoded_struprefixudocu	externalsueventunodeupathudatauexternal((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuparse_externals_xml�s	
!uparse_externals_xmlcCs�g}x�|j�D]�}|j�}|s1qntjdkrR|jd�}ntj|�}tjd	kr�dd�|D�}ntj|d
�dr�|d}n
|d}t	|dd�}|j
tjj
|��qW|S(u�
    Parse the value of a retrieved svn:externals entry.

    possible token setups (with quotng and backscaping in laters versions)
        URL[@#] EXT_FOLDERNAME
        [-r#] URL EXT_FOLDERNAME
        EXT_FOLDERNAME [-r#] URL
    iiuutf-8cSsg|]}|jd��qS(uutf-8(udecode(u.0ux((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu
<listcomp>�s	u'parse_external_prop.<locals>.<listcomp>iuencoding(ii(iii����i����(u
splitlinesulstripusysuversion_infouencodeushlexusplituurlparseuurlsplitudecode_as_stringuappenduosupathunormpath(ulinesu	externalsulineuexternal((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuparse_external_prop�s 	

uparse_external_propc	
Cs�d}t|d�}d}z�x�t|jd�D]}|j�}t|�dkr1|\}}|jt|��}|dkr�||kr�d}q�|dkr�|r�Pq�q1q1WWd|j	�X|S(NurtuiuKuVFT(
uFalseuopenuiterureadlineusplitulenureaduintuTrueuclose(	ufilenameukeyufoundufudataulineupartsukindulength((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuparse_prop_file�s	uparse_prop_filecBs�|EeZdZdZedd��Zejdej�Z	e
ddd��Zddd	�Zd
d�Z
edd
��Zedd��Zdd�Zdd�Zddd�Zdd�Zdd�ZdS(uSvnInfou�
    Generic svn_info object.  No has little knowledge of how to extract
    information.  Use cls.load to instatiate according svn version.

    Paths are not filesystem encoded.
    cCs?tdddg�\}}|dkr7|r7|j�SdSdS(Nusvnu	--versionu--quietiu(u_run_commandustrip(ucodeudata((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuget_svn_version�s
uSvnInfo.get_svn_versionu!(?:([\-0-9]+):)?(\d+)([a-z]*)\s*$uc	Cshtjj|�}tdd|g�\}}tjj|d�}tjjtjj|d��p�tjjtjj|d��p�tjjtjj|d��}t|j�jd��}y'tdd	�|dd
�D��}Wnt	k
rt�}YnX|st
|�S|s.|s.|dkrHtjd
t
�t|�S|dkr^t|�St|�S(Nusvnuinfou.svnuentriesu	dir-propsu
dir-prop-baseu.css|]}t|�VqdS(N(uint(u.0ux((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu	<genexpr>suSvnInfo.load.<locals>.<genexpr>iiiu?No SVN 1.3+ command found: falling back on pre 1.7 .svn parsingi(ii(ii(uosupathunormpathu_run_commandujoinuisfileutupleuget_svn_versionusplitu
ValueErroruSvnInfouwarningsuwarnuDeprecationWarninguSvnFileInfou	Svn13Infou	Svn15Info(	uclsudirnameunormdirucodeudatausvn_diruhas_svnusvn_versionubase_svn_version((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuload�s(!!!'

	

uSvnInfo.loadcCs||_d|_d|_dS(N(upathuNoneu_entriesu
_externals(uselfupath((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu__init__s		uSvnInfo.__init__cCshtdd|jg�\}}|r5tjd�dS|jj|�}|r`t|jd��SdSdS(u<Retrieve the directory revision informatino using svnversionu
svnversionu-cusvnversion failediiN(u_run_commandupathuloguwarnurevision_reumatchuintugroup(uselfucodeudatauparsed((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuget_revisions
uSvnInfo.get_revisioncCs(|jdkr!|j�|_n|jS(N(u_entriesuNoneuget_entries(uself((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuentries(suSvnInfo.entriescCs(|jdkr!|j�|_n|jS(N(u
_externalsuNoneu
get_externals(uself((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu	externals.suSvnInfo.externalsccsx|jD]}|Vq
WdS(uR
        Iterate over the svn:external references in the repository path.
        N(u	externals(uselfuitem((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuiter_externals4suSvnInfo.iter_externalsccs8x1|jD]&\}}|j�dkr
|Vq
q
WdS(uR
        Iterate over the non-deleted file entries in the repository path
        ufileN(uentriesulower(uselfuitemukind((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu
iter_files;suSvnInfo.iter_filesccsI|r|jVnx1|jD]&\}}|j�dkr|VqqWdS(uR
        Iterate over the non-deleted file entries in the repository path
        udirN(upathuentriesulower(uselfuinclude_rootuitemukind((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu	iter_dirsCs
uSvnInfo.iter_dirscCsgS(N((uself((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuget_entriesMsuSvnInfo.get_entriescCsgS(N((uself((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu
get_externalsPsuSvnInfo.get_externalsNT(u__name__u
__module__u__qualname__u__doc__ustaticmethoduget_svn_versionureucompileuIurevision_reuclassmethoduloadu__init__uget_revisionupropertyuentriesu	externalsuiter_externalsu
iter_filesuTrueu	iter_dirsuget_entriesu
get_externals(u
__locals__((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuSvnInfo�s


uSvnInfocBs,|EeZdZdd�Zdd�ZdS(u	Svn13InfocCsKtdddd|jgdd�\}}|rAtjd�gSt|�S(Nusvnuinfou-Ru--xmluencodinguutf-8usvn info failed(u_run_commandupathulogudebuguparse_dir_entries(uselfucodeudata((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuget_entriesUs
uSvn13Info.get_entriescCs�dddg}g}x�|j�D]�}t||gdd�\}}|dkrdtjd�gSxKt|�D]=}|r�tjj||�}n|jtjj	|��qqWq"W|S(Nusvnupropgetu
svn:externalsuencodinguutf-8iusvn propget failed(
u	iter_dirsu_run_commanduloguwarnuparse_external_propuosupathujoinuappendunormpath(uselfucmduresultufolderucodeulinesuexternal((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu
get_externals_s
!uSvn13Info.get_externalsN(u__name__u
__module__u__qualname__uget_entriesu
get_externals(u
__locals__((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu	Svn13InfoTs
u	Svn13InfocBs |EeZdZdd�ZdS(u	Svn15InfocCsiddd|jddg}t|dd�\}}|rJtjd�gSt|d	tjj|j��S(
Nusvnupropgetu
svn:externalsu-Ru--xmluencodinguutf-8usvn propget faileduprefix(upathu_run_commandulogudebuguparse_externals_xmluosuabspath(uselfucmducodeulines((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu
get_externalsss
uSvn15Info.get_externalsN(u__name__u
__module__u__qualname__u
get_externals(u
__locals__((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu	Svn15Inforsu	Svn15Infocse|EeZdZd�fdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z�S(uSvnFileInfoucs,tt|�j|�d|_d|_dS(N(usuperuSvnFileInfou__init__uNoneu_directoriesu	_revision(uselfupath(u	__class__(u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu__init__~s	uSvnFileInfo.__init__ccs�t|dd�}tjj|�r�tj|�}|d|j�fVx�|j�D]x}t	|�}t||�}tjj|�r�|ddfVqTtjj|�rTx|j
|�D]}|Vq�WqTqTWndS(Nu.svnuentriesFT(ujoinpathuosupathuisfileuSVNEntriesFileuloaduFalseuparse_revisionuget_undeleted_recordsudecode_as_stringuTrueuNoneuisdiru	_walk_svn(uselfubaseu
entry_fileuentriesupathuitem((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu	_walk_svn�suSvnFileInfo._walk_svncCs�t�}d}xa|j|j�D]M\}}}|rM|j|df�q"|j|df�t||�}q"W||_||_dS(Niufileudir(ulistu	_walk_svnupathuappendumaxu_entriesu	_revision(uselfuentriesurevupathuisfileudir_rev((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu_build_entries�s	"	uSvnFileInfo._build_entriescCs#|jdkr|j�n|jS(N(u_entriesuNoneu_build_entries(uself((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuget_entries�s
uSvnFileInfo.get_entriescCs#|jdkr|j�n|jS(N(u	_revisionuNoneu_build_entries(uself((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuget_revision�s
uSvnFileInfo.get_revisioncCs�ddgddgg}g}x�|j�D]�}d}x8|D]0}t||�}tjj|�r>|}q>q>W|dk	r+t|d�}t|dd�}|jt	|��q+q+W|S(Nu.svnu
dir-prop-baseu	dir-propsu
svn:externalsuencodinguutf-8(
u	iter_dirsuNoneujoinpathuosupathuisfileuparse_prop_fileudecode_as_stringuextenduparse_external_prop(uselfu
prop_filesu	externalsudirnameu	prop_fileu	rel_partsufilenameuext_prop((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu
get_externals�s	

uSvnFileInfo.get_externals(	u__name__u
__module__u__qualname__u__init__u	_walk_svnu_build_entriesuget_entriesuget_revisionu
get_externals(u
__locals__((u	__class__u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuSvnFileInfo|suSvnFileInfoccsqtj|�}x|j�D]}|VqWx?|j�D]1}tj|�}x|j�D]}|VqZWq8WdS(N(uSvnInfouloadu
iter_filesuiter_externals(udirnameuinfoupathusub_infousub_path((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu
svn_finder�s	u
svn_findercBsP|EeZdZdd�Zedd��Zedd��Zdd�Zd	S(
uSVNEntriesFilecCs
||_dS(N(udata(uselfudata((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu__init__�suSVNEntriesFile.__init__c
CsItjj|dd�}t|�}ztj|�}Wd|j�X|S(Nu.svnuentries(uosupathujoinuopenuSVNEntriesFileureaduclose(uclass_ubaseufilenameufuresult((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuload�suSVNEntriesFile.loadcCs5|j�}|jd�}ttg|}||�S(Nu<?xml(ureadu
startswithuSVNEntriesFileTextuSVNEntriesFileXML(uclass_ufileobjudatauis_xml((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuread�suSVNEntriesFile.readcCs|j�dg}t|�S(Ni(uparse_revision_numbersumax(uselfuall_revs((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuparse_revision�suSVNEntriesFile.parse_revisionN(u__name__u
__module__u__qualname__u__init__uclassmethoduloadureaduparse_revision(u
__locals__((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuSVNEntriesFile�s
uSVNEntriesFilecBsw|EeZdZidd6dd6dd6Zdd�Zd	d
�Zdd�Zd
d�Zdd�Zdd�Z	dS(uSVNEntriesFileTextiu1.4.xi	u1.5.xi
u1.6.xcCs|jS(N(usections(uself((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu__get_cached_sections�su(SVNEntriesFileText.__get_cached_sectionscCs�d}|jj|�}dd�ttj|�D�}yEt|djd��}||jj�kr{t	j
d|�nWntk
r�dSYnX||_|j
|_|jS(Nu
cSsg|]}|�qS(((u.0ux((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu
<listcomp>�s	u3SVNEntriesFileText.get_sections.<locals>.<listcomp>iuUnknown subversion verson %d(udatausplitumapustru
splitlinesuintupopuknown_svn_versionsuvaluesuloguwarnu
ValueErrorusectionsu(_SVNEntriesFileText__get_cached_sectionsuget_sections(uselfuSECTION_DIVIDERusectionsusvn_version((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuget_sections�s
		uSVNEntriesFileText.get_sectionscCst|j��S(N(ubooluget_sections(uself((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuis_valid�suSVNEntriesFileText.is_validcCs|j�ddS(Nii(uget_sections(uself((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuget_urlsuSVNEntriesFileText.get_urlcs)d��fdd�|j�D�}|S(Ni	cs<g|]2}t|��kr|�rt|���qS((ulenuint(u.0usection(urevision_line_number(u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu
<listcomp>s	u=SVNEntriesFileText.parse_revision_numbers.<locals>.<listcomp>(uget_sections(uselfurev_numbers((urevision_line_numberu-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuparse_revision_numberssu)SVNEntriesFileText.parse_revision_numberscs/dd���fdd�|j�D�}|S(NcSs0|o/|do/t|�dkp/|ddkS(Niiiudelete(ulen(us((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu<lambda>su:SVNEntriesFileText.get_undeleted_records.<locals>.<lambda>cs&g|]}�|�r|d�qS(i((u.0usection(u	undeleted(u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu
<listcomp>s	u<SVNEntriesFileText.get_undeleted_records.<locals>.<listcomp>(uget_sections(uselfuresult((u	undeletedu-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuget_undeleted_recordssu(SVNEntriesFileText.get_undeleted_recordsN(
u__name__u
__module__u__qualname__uknown_svn_versionsu(_SVNEntriesFileText__get_cached_sectionsuget_sectionsuis_validuget_urluparse_revision_numbersuget_undeleted_records(u
__locals__((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuSVNEntriesFileText�s

uSVNEntriesFileTextcBsD|EeZdZdd�Zdd�Zdd�Zdd�Zd	S(
uSVNEntriesFileXMLcCsdS(NT(uTrue(uself((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuis_validsuSVNEntriesFileXML.is_validcCs(tjd�}|j|j�jd�S(uGet repository URLu
url="([^"]+)"i(ureucompileusearchudataugroup(uselfuurlre((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuget_urlsuSVNEntriesFileXML.get_urlcCs,tjd�}dd�|j|j�D�S(Nucommitted-rev="(\d+)"cSs%g|]}t|jd���qS(i(uintugroup(u.0um((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu
<listcomp>$s	u<SVNEntriesFileXML.parse_revision_numbers.<locals>.<listcomp>(ureucompileufinditerudata(uselfurevre((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuparse_revision_numbers!s	u(SVNEntriesFileXML.parse_revision_numberscCs8tjdtj�}dd�|j|j�D�}|S(Nu%name="([^"]+)"(?![^>]+deleted="true")cSs%g|]}t|jd���qS(i(uunescapeugroup(u.0umatch((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu
<listcomp>,s	u;SVNEntriesFileXML.get_undeleted_records.<locals>.<listcomp>(ureucompileuIufinditerudata(uselfuentries_patternuresults((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuget_undeleted_records(s	u'SVNEntriesFileXML.get_undeleted_recordsN(u__name__u
__module__u__qualname__uis_validuget_urluparse_revision_numbersuget_undeleted_records(u
__locals__((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyuSVNEntriesFileXMLsuSVNEntriesFileXMLu__main__i(3uosureusysu	distutilsuloguxml.dom.pulldomuxmlushlexulocaleucodecsuunicodedatauwarningsusetuptools.compatuunicodeuxml.sax.saxutilsuunescapeuurlparseuImportErroruurllib.parseuparseu
subprocessuPopenu_PopenuPIPEu_PIPEuNoneu_run_commandu_get_entry_scheduleu_get_target_propertyu
_get_xml_dataujoinpathudetermine_console_encodingu_console_encodingudecode_as_stringuparse_dir_entriesuparse_externals_xmluparse_external_propuparse_prop_fileuobjectuSvnInfou	Svn13Infou	Svn15InfouSvnFileInfou
svn_finderuSVNEntriesFileuSVNEntriesFileTextuSVNEntriesFileXMLu__name__uargvunameuprint(((u-/tmp/pip-k8wh6o-build/setuptools/svn_utils.pyu<module>sN
		$t
B
3site-packages/setuptools/__pycache__/archive_util.cpython-33.pyc000064400000015235151733464050021034 0ustar00�
�Re�c@s�dZdddddddgZdd	lZdd	lZdd	lZdd	lZdd	lZdd
lmZddl	m
Z
Gdd�de
�Zd
d�Zed	dd�Zedd�Zedd�Zedd�ZeeefZd	S(u/Utilities for extracting common archive formatsuunpack_archiveuunpack_zipfileuunpack_tarfileudefault_filteruUnrecognizedFormatuextraction_driversuunpack_directoryiN(uensure_directory(uDistutilsErrorcBs|EeZdZdZdS(uUnrecognizedFormatu#Couldn't recognize the archive typeN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u0/tmp/pip-k8wh6o-build/setuptools/archive_util.pyuUnrecognizedFormat
scCs|S(u@The default progress/filter callback; returns True for all files((usrcudst((u0/tmp/pip-k8wh6o-build/setuptools/archive_util.pyudefault_filtersc
Cs[xT|ptD]6}y||||�Wntk
r>w
Yq
XdSq
Wtd|��dS(u�Unpack `filename` to `extract_dir`, or raise ``UnrecognizedFormat``

    `progress_filter` is a function taking two arguments: a source path
    internal to the archive ('/'-separated), and a filesystem path where it
    will be extracted.  The callback must return the desired extract path
    (which may be the same as the one passed in), or else ``None`` to skip
    that file or directory.  The callback can thus be used to report on the
    progress of the extraction, as well as to filter the items extracted or
    alter their extraction paths.

    `drivers`, if supplied, must be a non-empty sequence of functions with the
    same signature as this function (minus the `drivers` argument), that raise
    ``UnrecognizedFormat`` if they do not support extracting the designated
    archive type.  The `drivers` are tried in sequence until one is found that
    does not raise an error, or until all are exhausted (in which case
    ``UnrecognizedFormat`` is raised).  If you do not supply a sequence of
    drivers, the module's ``extraction_drivers`` constant will be used, which
    means that ``unpack_zipfile`` and ``unpack_tarfile`` will be tried, in that
    order.
    Nu!Not a recognized archive type: %s(uextraction_driversuUnrecognizedFormat(ufilenameuextract_diruprogress_filterudriversudriver((u0/tmp/pip-k8wh6o-build/setuptools/archive_util.pyuunpack_archive*s
c
CsGtjj|�s(td|f��nid|f|6}xtj|�D]�\}}}||\}}xD|D]<}	||	dtjj||	�f|tjj||	�<qqWx�|D]�}
||
}tjj||
�}|||
|�}|s�q�nt|�tjj||
�}
tj|
|�tj	|
|�q�WqKWdS(u�"Unpack" a directory, using the same interface as for archives

    Raises ``UnrecognizedFormat`` if `filename` is not a directory
    u%s is not a directoryuu/N(
uosupathuisdiruUnrecognizedFormatuwalkujoinuensure_directoryushutilucopyfileucopystat(
ufilenameuextract_diruprogress_filterupathsubaseudirsufilesusrcudstudufunameutarget((u0/tmp/pip-k8wh6o-build/setuptools/archive_util.pyuunpack_directorySs"
:


c
Cs\tj|�s%td|f��ntj|�}zx|j�D]}|j}|jd�sDd|jd�kr}qDntj	j
||jd��}|||�}|s�qDn|jd�r�t|�nMt|�|j
|j�}t|d�}z|j|�Wd|j�~X|jd?}	|	rDtj||	�qDqDWWd|j�XdS(u�Unpack zip `filename` to `extract_dir`

    Raises ``UnrecognizedFormat`` if `filename` is not a zipfile (as determined
    by ``zipfile.is_zipfile()``).  See ``unpack_archive()`` for an explanation
    of the `progress_filter` argument.
    u%s is not a zip fileu/u..uwbNi(uzipfileu
is_zipfileuUnrecognizedFormatuZipFileuinfolistufilenameu
startswithusplituosupathujoinuendswithuensure_directoryureaduopenuwriteucloseu
external_attruchmod(
ufilenameuextract_diruprogress_filteruzuinfounameutargetudataufuunix_attributes((u0/tmp/pip-k8wh6o-build/setuptools/archive_util.pyuunpack_zipfile|s2	$



c	Cs�ytj|�}Wn(tjk
r=td|f��YnXz�dd�|_xl|D]d}|j}|jd�rWd|jd�krWtj	j
||jd��}x||dk	r'|j�s�|j
�r'|j}|j
�rtj
tj|j�|�}tj|�}n|j|�}q�W|dk	r�|j�sL|j�r�|||�}|r�|jtj�r�|dd�}ny|j||�Wq�tjk
r�Yq�Xq�q�qWqWWd	SWd|j�XdS(
u�Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir`

    Raises ``UnrecognizedFormat`` if `filename` is not a tarfile (as determined
    by ``tarfile.open()``).  See ``unpack_archive()`` for an explanation
    of the `progress_filter` argument.
    u/%s is not a compressed or uncompressed tar filecWsdS(N(uNone(uargs((u0/tmp/pip-k8wh6o-build/setuptools/archive_util.pyu<lambda>�su unpack_tarfile.<locals>.<lambda>u/u..Nii����T(utarfileuopenuTarErroruUnrecognizedFormatuchownunameu
startswithusplituosupathujoinuNoneuislnkuissymulinknameu	posixpathudirnameunormpathu
_getmemberuisfileuisdiruendswithusepu_extract_memberuExtractErroruTrueuclose(	ufilenameuextract_diruprogress_filterutarobjumemberunameu
prelim_dstulinkpathu	final_dst((u0/tmp/pip-k8wh6o-build/setuptools/archive_util.pyuunpack_tarfile�s8
	%'	$(u__doc__u__all__uzipfileutarfileuosushutilu	posixpathu
pkg_resourcesuensure_directoryudistutils.errorsuDistutilsErroruUnrecognizedFormatudefault_filteruNoneuunpack_archiveuunpack_directoryuunpack_zipfileuunpack_tarfileuextraction_drivers(((u0/tmp/pip-k8wh6o-build/setuptools/archive_util.pyu<module>s<(),*site-packages/setuptools/__pycache__/dist.cpython-33.pyc000064400000113630151733464060017320 0ustar00�
�Re$c@s�dgZddlZddlZddlZddlZddlZddlZddlZddlm	Z
ddlmZm
Z
mZddlmZddlmZmZddlZdd�Zee
�Z
eefZd	d
�Zdd�Zd
d�Zdd�Zdd�Zdd�Zdd�Zdd�Z dd�Z!dd�Z"Gdd�de
�Z	x)ej#ej$ej%fD]Z&e	e&_	q�WGdd�d�Z'dS( uDistributioniN(uDistribution(uDistutilsOptionErroruDistutilsPlatformErroruDistutilsSetupError(uRequire(u
numeric_typesu
basestringcCsNx"|jjd�r$|j\}qW|jjd�sJtd|��n|S(u�Protect against re-patching the distutils if reloaded

    Also ensures that no other distutils extension monkeypatched the distutils
    first.
    u
setuptoolsu	distutilsu(distutils has already been patched by %r(u
__module__u
startswithu	__bases__uAssertionError(ucls((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyu_get_unpatchedsu_get_unpatchedcCsey*tjjd|�}|js)t�Wn4ttttfk
r`td||f��YnXdS(Nux=u4%r must be importable 'module:attrs' string (got %r)(	u
pkg_resourcesu
EntryPointuparseuextrasuAssertionErroru	TypeErroru
ValueErroruAttributeErroruDistutilsSetupError(udistuattruvalueuep((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyucheck_importable$sucheck_importablecCsZydj|�|kst�Wn4ttttfk
rUtd||f��YnXdS(u*Verify that value is a string list or Noneuu%%r must be a list of strings (got %r)N(ujoinuAssertionErroru	TypeErroru
ValueErroruAttributeErroruDistutilsSetupError(udistuattruvalue((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyuassert_string_list/s
uassert_string_listcCs�t|||�x�|D]�}|j|�sCtdd|��nd|krdj|jd�dd��}||kr�tjjd||�q�qqWdS(u(Verify that namespace packages are validu1Distribution contains no modules or packages for unamespace package %ru.Niu^WARNING: %r is declared as a package namespace, but %r is not: please correct this in setup.pyi����(uassert_string_listuhas_contents_foruDistutilsSetupErrorujoinusplitu	distutilsuloguwarn(udistuattruvalueunspuparent((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyu	check_nsp7s
"	u	check_nspc
Cs�y}xv|j�D]h\}}d|kre|jdd�\}}tj|�retd|��qenttj|��qWWn'ttt	fk
r�td��YnXdS(u+Verify that extras_require mapping is validu:iuInvalid environment marker: u�'extras_require' must be a dictionary whose values are strings or lists of strings containing valid project/version requirement specifiers.N(
uitemsusplitu
pkg_resourcesuinvalid_markeruDistutilsSetupErrorulistuparse_requirementsu	TypeErroru
ValueErroruAttributeError(udistuattruvalueukuvum((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyucheck_extrasHsucheck_extrascCs/t|�|kr+td||f��ndS(u)Verify that value is True, False, 0, or 1u#%r must be a boolean value (got %r)N(ubooluDistutilsSetupError(udistuattruvalue((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyuassert_boolXsuassert_boolcCsIyttj|��Wn+ttfk
rDtd|f��YnXdS(u9Verify that install_requires is a valid requirements listu^%r must be a string or list of strings containing valid project/version requirement specifiersN(ulistu
pkg_resourcesuparse_requirementsu	TypeErroru
ValueErroruDistutilsSetupError(udistuattruvalue((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyucheck_requirements^sucheck_requirementscCsIytjj|�Wn.tk
rDtj�d}t|��YnXdS(u)Verify that entry_points map is parseableiN(u
pkg_resourcesu
EntryPointu	parse_mapu
ValueErrorusysuexc_infouDistutilsSetupError(udistuattruvalueue((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyucheck_entry_pointsgs

ucheck_entry_pointscCs"t|t�std��ndS(Nutest_suite must be a string(u
isinstanceu
basestringuDistutilsSetupError(udistuattruvalue((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyucheck_test_suiteosucheck_test_suitecCs~t|t�rjxX|j�D]C\}}t|t�s;Pnyt|�Wqtk
r^PYqXqWdSnt|d��dS(u@Verify that value is a dictionary of package names to glob listsNuI must be a dictionary mapping package names to lists of wildcard patterns(u
isinstanceudictuitemsustruiteru	TypeErroruDistutilsSetupError(udistuattruvalueukuv((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyucheck_package_datass

ucheck_package_datacCs=x6|D].}tjd|�stjjd|�qqWdS(Nu\w+(\.\w+)*uZWARNING: %r not a valid package name; please use only.-separated package names in setup.py(ureumatchu	distutilsuloguwarn(udistuattruvalueupkgname((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyucheck_packages�s

	ucheck_packagescBsO|EeZdZdZd4Zdd�Zd4dd�Zdd�Zdd	�Z	d
d�Z
dd
�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�Zd2d3�Zd4S(5uDistributionu�Distribution with support for features, 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.

     'features' **deprecated** -- a dictionary mapping option names to
        'setuptools.Feature'
        objects.  Features are a portion of the distribution that can be
        included or excluded based on user options, inter-feature dependencies,
        and availability on the current system.  Excluded features are omitted
        from all setup commands, including source and binary distributions, so
        you can create multiple distributions from the same source tree.
        Feature names should be valid Python identifiers, except that they may
        contain the '-' (minus) sign.  Features can be included or excluded
        via the command line options '--with-X' and '--without-X', where 'X' is
        the name of the feature.  Whether a feature is included by default, and
        whether you are allowed to control this from the command line, is
        determined by the Feature object.  See the 'Feature' class for more
        information.

     '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.  They are used by the feature subsystem to configure the
    distribution for the included and excluded features.
    cCs�|sd|ksd|kr#dStjt|d��j�}tjjj|�}|dk	r�|jd�r�tj	t|d��|_
||_ndS(NunameuversionuPKG-INFO(u
pkg_resourcesu	safe_nameustruloweruworking_setuby_keyugetuNoneuhas_metadatausafe_versionu_versionu
_patched_dist(uselfuattrsukeyudist((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyupatch_missing_pkg_info�su#Distribution.patch_missing_pkg_infoc	Cs}t|d�}|s!i|_n|p*i}d|ksEd|krRtj�ng|_i|_g|_|o�|jdd�|_	|j
|�|dk	r�|jdg�|_t|d|j�n|r�d|kr�|j
|jd��nx?tjd�D].}t||j�st||jd�qqWtj||�t|jjt�ryt|jj�|j_ndS(Nupackage_dataufeaturesurequire_featuresusrc_rootudependency_linksusetup_requiresudistutils.setup_keywords(uhasattrupackage_datauFeatureuwarn_deprecatedurequire_featuresufeaturesu
dist_filesupopuNoneusrc_rootupatch_missing_pkg_infoudependency_linksuassert_string_listufetch_build_eggsu
pkg_resourcesuiter_entry_pointsunameusetattru
_Distributionu__init__u
isinstanceumetadatauversionu
numeric_typesustr(uselfuattrsuhave_package_datau_attrs_dictuep((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyu__init__�s,
			
uDistribution.__init__cCs)tj|�}|jr%|j�n|S(u3Process features after parsing command line options(u
_Distributionuparse_command_lineufeaturesu_finalize_features(uselfuresult((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyuparse_command_line�s	
uDistribution.parse_command_linecCsd|jdd�S(u;Convert feature name to corresponding option attribute nameuwith_u-u_(ureplace(uselfuname((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyu_feature_attrname�suDistribution._feature_attrnamecCsPddlm}m}x3|j||�d|j�D]}|j|�q5WdS(uResolve pre-setup requirementsi(uworking_setuparse_requirementsu	installerN(u
pkg_resourcesuworking_setuparse_requirementsuresolveufetch_build_egguadd(uselfurequiresuworking_setuparse_requirementsudist((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyufetch_build_eggss	uDistribution.fetch_build_eggscCs�tj|�|jr#|j�nxgtjd�D]V}t||jd�}|dk	r3|j	d|j
�|j�||j|�q3q3Wt|dd�r�dd�|jD�|_n	g|_dS(Nudistutils.setup_keywordsu	installeruconvert_2to3_doctestscSs"g|]}tjj|��qS((uosupathuabspath(u.0up((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyu
<listcomp>s	u1Distribution.finalize_options.<locals>.<listcomp>(
u
_Distributionufinalize_optionsufeaturesu_set_global_opts_from_featuresu
pkg_resourcesuiter_entry_pointsugetattrunameuNoneurequireufetch_build_egguloaduconvert_2to3_doctests(uselfuepuvalue((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyufinalize_optionss
	
 uDistribution.finalize_optionsc	Csgy|j}g|j_Wn>tk
rYddlm}|jidgd6�}|j�|jd�}d}x*|j	�D]}||kr~||=q~q~W|j
r�|j
d
d
�}d|kr�|ddj�|}nd|f|d<n||d
dgdtj
dddddd
dddddddddd�
}|j�||_YnX|j|�S(u Fetch an egg needed for buildingi(ueasy_installueasy_installuscript_argsu
find_linksu	site_dirsu	index_urluoptimizeuallow_hostsNiusetupuargsuxuinstall_diruexclude_scriptsualways_copyubuild_directoryueditableuupgradeu
multi_versionu	no_reportuuser(u
find_linksu	site_dirsu	index_urluoptimizeu	site_dirsuallow_hostsTF(u_egg_fetcheru
package_indexuto_scanuAttributeErrorusetuptools.command.easy_installueasy_installu	__class__uparse_config_filesuget_option_dictukeysudependency_linksusplituosucurdiruTrueuFalseuNoneuensure_finalized(	uselfurequcmdueasy_installudistuoptsukeepukeyulinks((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyufetch_build_eggs2	

	
uDistribution.fetch_build_eggcCsg}|jj�}x�|jj�D]�\}}|j|d�|j|�|jr%|j}d}d}|j	�s�||}}n|j
d|dd||f�|j
d|dd||f�d||d|<q%q%W||j|_|_||_|_
dS(u;Add --with-X/--without-X options based on optional featuresu
 (default)uuwith-uinclude uwithout-uexclude N(unegative_optucopyufeaturesuitemsu_set_featureuNoneuvalidateuoptionaludescriptionuinclude_by_defaultuappenduglobal_optionsufeature_optionsufeature_negopt(uselfugounounameufeatureudescruincdefuexcdef((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyu_set_global_opts_from_features;s 
		""u+Distribution._set_global_opts_from_featurescCs�xj|jj�D]Y\}}|j|�}|sI|dkr|j�r|j|�|j|d�qqWxL|jj�D];\}}|j|�s}|j|�|j|d�q}q}WdS(u9Add/remove features and resolve dependencies between themiiN(ufeaturesuitemsufeature_is_includeduNoneuinclude_by_defaultu
include_inu_set_featureuexclude_from(uselfunameufeatureuenabled((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyu_finalize_featuresSs

uDistribution._finalize_featurescCsv||jkr|j|SxUtjd|�D]1}|jd|j�|j�|j|<}|SWtj||�SdS(u(Pluggable version of get_command_class()udistutils.commandsu	installerN(ucmdclassu
pkg_resourcesuiter_entry_pointsurequireufetch_build_egguloadu
_Distributionuget_command_class(uselfucommanduepucmdclass((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyuget_command_classdsuDistribution.get_command_classcCs[xKtjd�D]:}|j|jkr|jd�}||j|j<qqWtj|�S(Nudistutils.commandsF(u
pkg_resourcesuiter_entry_pointsunameucmdclassuloaduFalseu
_Distributionuprint_commands(uselfuepucmdclass((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyuprint_commandsps
uDistribution.print_commandscCst||j|�|�dS(uSet feature's inclusion statusN(usetattru_feature_attrname(uselfunameustatus((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyu_set_featurewsuDistribution._set_featurecCst||j|��S(uAReturn 1 if feature is included, 0 if excluded, 'None' if unknown(ugetattru_feature_attrname(uselfuname((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyufeature_is_included{su Distribution.feature_is_includedcCs`|j|�dkr8|j|j}t|d��n|j|j|�|j|d�dS(u)Request inclusion of feature named 'name'iu2 is required, but was excluded or is not availableiN(ufeature_is_includedufeaturesudescriptionuDistutilsOptionErroru
include_inu_set_feature(uselfunameudescr((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyuinclude_featuresuDistribution.include_featurecKsZxS|j�D]E\}}t|d|d�}|rB||�q
|j||�q
WdS(u�Add items to distribution that are named in keyword arguments

        For example, 'dist.exclude(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.
        u	_include_N(uitemsugetattruNoneu
_include_misc(uselfuattrsukuvuinclude((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyuinclude�s

uDistribution.includecs��d�|jr8��fdd�|jD�|_n|jrf��fdd�|jD�|_n|jr���fdd�|jD�|_ndS(u9Remove packages, modules, and extensions in named packageu.cs2g|](}|�kr|j��r|�qS((u
startswith(u.0up(upackageupfx(u(/tmp/pip-k8wh6o-build/setuptools/dist.pyu
<listcomp>�s	u0Distribution.exclude_package.<locals>.<listcomp>cs2g|](}|�kr|j��r|�qS((u
startswith(u.0up(upackageupfx(u(/tmp/pip-k8wh6o-build/setuptools/dist.pyu
<listcomp>�s	cs8g|].}|j�kr|jj��r|�qS((unameu
startswith(u.0up(upackageupfx(u(/tmp/pip-k8wh6o-build/setuptools/dist.pyu
<listcomp>�s	N(upackagesu
py_modulesuext_modules(uselfupackage((upackageupfxu(/tmp/pip-k8wh6o-build/setuptools/dist.pyuexclude_package�s
	%	%	uDistribution.exclude_packagecCsD|d}x3|j�D]%}||ks8|j|�rdSqWdS(u<Return true if 'exclude_package(package)' would do somethingu.NT(uiter_distribution_namesu
startswithuTrue(uselfupackageupfxup((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyuhas_contents_for�s
uDistribution.has_contents_forcs�t�t�s(td|�f��nyt||�}Wn"tk
r_td|��YnX|dk	r�t|t�r�t|d��n,|r�t||�fdd�|D��ndS(uAHandle 'exclude()' for list/tuple attrs without a special handleru(%s: setting must be a list or tuple (%r)u %s: No such distribution settingu4: this setting cannot be changed via include/excludecs"g|]}|�kr|�qS(((u.0uitem(uvalue(u(/tmp/pip-k8wh6o-build/setuptools/dist.pyu
<listcomp>�s	u.Distribution._exclude_misc.<locals>.<listcomp>N(u
isinstanceusequenceuDistutilsSetupErrorugetattruAttributeErroruNoneusetattr(uselfunameuvalueuold((uvalueu(/tmp/pip-k8wh6o-build/setuptools/dist.pyu
_exclude_misc�s
uDistribution._exclude_misccs�t|t�s(td||f��nyt||��Wn"tk
r_td|��YnX�dkrt|||�nIt�t�s�t|d��n't||��fdd�|D��dS(uAHandle 'include()' for list/tuple attrs without a special handleru%s: setting must be a list (%r)u %s: No such distribution settingu4: this setting cannot be changed via include/excludecs"g|]}|�kr|�qS(((u.0uitem(uold(u(/tmp/pip-k8wh6o-build/setuptools/dist.pyu
<listcomp>�s	u.Distribution._include_misc.<locals>.<listcomp>N(u
isinstanceusequenceuDistutilsSetupErrorugetattruAttributeErroruNoneusetattr(uselfunameuvalue((uoldu(/tmp/pip-k8wh6o-build/setuptools/dist.pyu
_include_misc�s
uDistribution._include_misccKsZxS|j�D]E\}}t|d|d�}|rB||�q
|j||�q
WdS(uRemove 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.
        u	_exclude_N(uitemsugetattruNoneu
_exclude_misc(uselfuattrsukuvuexclude((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyuexclude�s

uDistribution.excludecCs?t|t�s%td|f��ntt|j|��dS(Nu.packages: setting must be a list or tuple (%r)(u
isinstanceusequenceuDistutilsSetupErrorulistumapuexclude_package(uselfupackages((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyu_exclude_packages�suDistribution._exclude_packagesc
Cs�|jj|_|jj|_|d}|jd�}xY||kr�||\}}||=ddl}|j|d�|dd�<|d}q:Wtj|||�}|j	|�}	t
|	dd�r�d|f|j|�d<|dk	r�gSn|S(Niualiasesiucommand_consumes_argumentsucommand lineuargsT(u	__class__uglobal_optionsunegative_optuget_option_dictushlexusplituTrueu
_Distributionu_parse_command_optsuget_command_classugetattruNone(
uselfuparseruargsucommandualiasesusrcualiasushlexunargsu	cmd_class((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyu_parse_command_optss"
u Distribution._parse_command_optscCs'i}x|jj�D]	\}}x�|j�D]�\}\}}|dkrSq/n|jdd�}|dkr�|j|�}|jj�}|jt|di��xZ|j�D](\}	}
|
|kr�|	}d}Pq�q�Wt	d��n|dkrd}n||j
|i�|<q/WqW|S(	uhReturn 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.
        ucommand lineu_u-iunegative_optuShouldn't be able to get hereiN(ucommand_optionsuitemsureplaceuget_command_objunegative_optucopyuupdateugetattruNoneuAssertionErroru
setdefault(uselfuducmduoptsuoptusrcuvalucmdobjuneg_optunegupos((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyuget_cmdline_options s(
	u Distribution.get_cmdline_optionsccs�x|jpfD]}|VqWx|jp.fD]}|Vq/Wxe|jpMfD]T}t|t�rr|\}}n	|j}|jd�r�|dd�}n|VqNWdS(u@Yield all packages, modules, and extension names in distributionumoduleNii����(upackagesu
py_modulesuext_modulesu
isinstanceutupleunameuendswith(uselfupkgumoduleuextunameu	buildinfo((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyuiter_distribution_namesHs			u$Distribution.iter_distribution_namescCs6ddl}|jdks$|jr4tj||�Sddl}t|j|j�setj||�S|jj	j
�d	kr�tj||�S|jj	}|jj}|jdkr�dp�d}|jj}|j|jj�d|||�|_ztj||�SWd|j|jj�||||�|_XdS(
u�If 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.
        iNiuutf-8uutf8uwin32u
(i(uutf-8uutf8(usysuversion_infou
help_commandsu
_Distributionuhandle_display_optionsuiou
isinstanceustdoutu
TextIOWrapperuencodinguloweruerrorsuplatformuNoneuline_bufferingudetach(uselfuoption_orderusysuiouencodinguerrorsunewlineuline_buffering((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyuhandle_display_optionsZs$!u#Distribution.handle_display_optionsN(u__name__u
__module__u__qualname__u__doc__uNoneu
_patched_distupatch_missing_pkg_infou__init__uparse_command_lineu_feature_attrnameufetch_build_eggsufinalize_optionsufetch_build_eggu_set_global_opts_from_featuresu_finalize_featuresuget_command_classuprint_commandsu_set_featureufeature_is_includeduinclude_featureuincludeuexclude_packageuhas_contents_foru
_exclude_miscu
_include_miscuexcludeu_exclude_packagesu_parse_command_optsuget_cmdline_optionsuiter_distribution_namesuhandle_display_options(u
__locals__((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyuDistribution�s6B
 	(cBsw|EeZdZdZedd��Zdddffdd�Zdd�Z	dd	�Z
d
d�Zdd
�ZdS(uFeatureu�
    **deprecated** -- The `Feature` facility was never completely implemented
    or supported, `has reported issues
    <https://bitbucket.org/pypa/setuptools/issue/58>`_ and will be removed in
    a future version.

    A subset of the distribution that can be excluded if unneeded/wanted

    Features are created using these keyword arguments:

      'description' -- a short, human readable description of the feature, to
         be used in error messages, and option help messages.

      'standard' -- if true, the feature is included by default if it is
         available on the current system.  Otherwise, the feature is only
         included if requested via a command line '--with-X' option, or if
         another included feature requires it.  The default setting is 'False'.

      'available' -- if true, the feature is available for installation on the
         current system.  The default setting is 'True'.

      'optional' -- if true, the feature's inclusion can be controlled from the
         command line, using the '--with-X' or '--without-X' options.  If
         false, the feature's inclusion status is determined automatically,
         based on 'availabile', 'standard', and whether any other feature
         requires it.  The default setting is 'True'.

      'require_features' -- a string or sequence of strings naming features
         that should also be included if this feature is included.  Defaults to
         empty list.  May also contain 'Require' objects that should be
         added/removed from the distribution.

      'remove' -- a string or list of strings naming packages to be removed
         from the distribution if this feature is *not* included.  If the
         feature *is* included, this argument is ignored.  This argument exists
         to support removing features that "crosscut" a distribution, such as
         defining a 'tests' feature that removes all the 'tests' subpackages
         provided by other features.  The default for this argument is an empty
         list.  (Note: the named package(s) or modules must exist in the base
         distribution when the 'setup()' function is initially called.)

      other keywords -- any other keyword arguments are saved, and passed to
         the distribution's 'include()' and 'exclude()' methods when the
         feature is included or excluded, respectively.  So, for example, you
         could pass 'packages=["a","b"]' to cause packages 'a' and 'b' to be
         added or removed from the distribution as appropriate.

    A feature must include at least one 'requires', 'remove', or other
    keyword argument.  Otherwise, it can't affect the distribution in any way.
    Note also that you can subclass 'Feature' to create your own specialized
    feature types that modify the distribution in other ways when included or
    excluded.  See the docstrings for the various methods here for more detail.
    Aside from the methods, the only feature attributes that distributions look
    at are 'description' and 'optional'.
    cCstjdtdd�dS(NumFeatures are deprecated and will be removed in a future version. See http://bitbucket.org/pypa/setuptools/65.u
stackleveli(uwarningsuwarnuDeprecationWarning(((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyuwarn_deprecated�suFeature.warn_deprecatedc	Ks�|j�||_||_||_||_t|ttf�rO|f}ndd�|D�|_dd�|D�}|r�||d<nt|t�r�|f}n||_	||_
|r�|r�|r�td��ndS(NcSs%g|]}t|t�r|�qS((u
isinstanceustr(u.0ur((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyu
<listcomp>�s	u$Feature.__init__.<locals>.<listcomp>cSs%g|]}t|t�s|�qS((u
isinstanceustr(u.0ur((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyu
<listcomp>�s	urequire_featuresugFeature %s: must define 'require_features', 'remove', or at least one of 'packages', 'py_modules', etc.(uwarn_deprecatedudescriptionustandardu	availableuoptionalu
isinstanceustruRequireurequire_featuresuremoveuextrasuDistutilsSetupError(	uselfudescriptionustandardu	availableuoptionalurequire_featuresuremoveuextrasuer((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyu__init__�s$
				
		uFeature.__init__cCs|jo|jS(u+Should this feature be included by default?(u	availableustandard(uself((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyuinclude_by_default�suFeature.include_by_defaultcCsT|jst|jd��n|j|j�x|jD]}|j|�q9WdS(uEnsure feature and its requirements are included in distribution

        You may override this in a subclass to perform additional operations on
        the distribution.  Note that this method may be called more than once
        per feature, and so should be idempotent.

        u2 is required,but is not available on this platformN(u	availableuDistutilsPlatformErrorudescriptionuincludeuextrasurequire_featuresuinclude_feature(uselfudistuf((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyu
include_in�s
	uFeature.include_incCsA|j|j�|jr=x!|jD]}|j|�q#WndS(u2Ensure feature is excluded from distribution

        You may override this in a subclass to perform additional operations on
        the distribution.  This method will be called at most once per
        feature, and only after all included features have been asked to
        include themselves.
        N(uexcludeuextrasuremoveuexclude_package(uselfudistuitem((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyuexclude_from�s
	uFeature.exclude_fromcCsFx?|jD]4}|j|�s
td|j||f��q
q
WdS(u�Verify that feature makes sense in context of distribution

        This method is called by the distribution just before it parses its
        command line.  It checks to ensure that the 'remove' attribute, if any,
        contains only valid package/module names that are present in the base
        distribution when 'setup()' is called.  You may override it in a
        subclass to perform any other required validation of the feature
        against a target distribution.
        ug%s wants to be able to remove %s, but the distribution doesn't contain any packages or modules under %sN(uremoveuhas_contents_foruDistutilsSetupErrorudescription(uselfudistuitem((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyuvalidate
s
uFeature.validateNFT(
u__name__u
__module__u__qualname__u__doc__ustaticmethoduwarn_deprecateduFalseuTrueu__init__uinclude_by_defaultu
include_inuexclude_fromuvalidate(u
__locals__((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyuFeature�s7	uFeature((u__all__ureuosusysuwarningsu
distutils.logu	distutilsudistutils.coreu
distutils.cmduDistributionu
_Distributionudistutils.errorsuDistutilsOptionErroruDistutilsPlatformErroruDistutilsSetupErrorusetuptools.dependsuRequireusetuptools.compatu
numeric_typesu
basestringu
pkg_resourcesu_get_unpatchedutupleulistusequenceucheck_importableuassert_string_listu	check_nspucheck_extrasuassert_boolucheck_requirementsucheck_entry_pointsucheck_test_suiteucheck_package_dataucheck_packagesudistucoreucmdumoduleuFeature(((u(/tmp/pip-k8wh6o-build/setuptools/dist.pyu<module>s<			��
site-packages/setuptools/__pycache__/py31compat.cpython-33.pyc000064400000001424151733464060020352 0ustar00�
�Re�c@saddgZyddlmZmZWn4ek
r\ddlmZmZdd�ZYnXdS(uget_config_varsuget_pathi(uget_config_varsuget_path(uget_config_varsuget_python_libcCs+|dkrtd��nt|dk�S(NuplatlibupurelibuName must be purelib or platlib(uplatlibupurelib(u
ValueErroruget_python_lib(uname((u./tmp/pip-k8wh6o-build/setuptools/py31compat.pyuget_pathsN(u__all__u	sysconfiguget_config_varsuget_pathuImportErrorudistutils.sysconfiguget_python_lib(((u./tmp/pip-k8wh6o-build/setuptools/py31compat.pyu<module>s

site-packages/setuptools/__pycache__/py27compat.cpython-33.pyc000064400000001430151733464060020354 0ustar00�
�Re2c@s@dZddlZdd�Zejdkr<dd�ZndS(u2
Compatibility Support for Python 2.7 and earlier
iNcCs
|j|�S(uB
	Given an HTTPMessage, return all headers matching a given key.
	(uget_all(umessageukey((u./tmp/pip-k8wh6o-build/setuptools/py27compat.pyuget_all_headerssuget_all_headersicCs
|j|�S(N(u
getheaders(umessageukey((u./tmp/pip-k8wh6o-build/setuptools/py27compat.pyuget_all_headerss(i(u__doc__usysuget_all_headersuversion_info(((u./tmp/pip-k8wh6o-build/setuptools/py27compat.pyu<module>ssite-packages/setuptools/__pycache__/compat.cpython-33.pyc000064400000011107151733464060017634 0ustar00�
�Re�	c@s<ddlZddlZejddkr�dZeZddlZddlZddl	m	Z	e	Z
eZdd�Zdd�Z
dd�ZddlmZddlZdd	lmZdd
lmZddlmZdd�ZeZejZd
d�ZeeefZe Z e!Z!e"Z#ddl$m%Z%m&Z&m'Z'ddl(Z(ddl(m)Z)m*Z*m+Z+m,Z,m-Z-ddl.m.Z.m/Z/m0Z0m1Z1m2Z2ej3Z4e5d�n�d Ze"ZddlZddl7Zddl8m	Z	m
Z
dd�Zdd�Z
dd�Zddl9mZddl:j;Zddl<mZmZddl<mZdd�ZeZejZeZeefZe=Z e"Z!e#Z#ddl>m*Z*m+Z+ddl?j@Z(ddl?m)Z)m%Z%m'Z'ddlAm.Z.m/Z/m,Z,m-Z-m0Z0m1Z1m2Z2m&Z&ej4Z4dddd�Zddd�ZCdS(!iNi(uStringIOcCs|jS(N(u	func_code(uo((u*/tmp/pip-k8wh6o-build/setuptools/compat.pyu<lambda>
su<lambda>cCs|jS(N(ufunc_globals(uo((u*/tmp/pip-k8wh6o-build/setuptools/compat.pyu<lambda>scCs|jS(N(uim_func(uo((u*/tmp/pip-k8wh6o-build/setuptools/compat.pyu<lambda>s(uname2codepoint(u
HTTPServer(uSimpleHTTPRequestHandler(uBaseHTTPRequestHandlercCs
|j�S(N(u	iteritems(uo((u*/tmp/pip-k8wh6o-build/setuptools/compat.pyu<lambda>scCs
|j�S(N(unext(uo((u*/tmp/pip-k8wh6o-build/setuptools/compat.pyu<lambda>s(uurl2pathnameusplittagupathname2url(uurlopenu	HTTPErroruURLErroruunquoteu	splituser(uurlparseu
urlunparseuurljoinuurlsplitu
urlunsplitu8def reraise(tp, value, tb=None):
    raise tp, value, tb(uStringIOuBytesIOcCs|jS(N(u__code__(uo((u*/tmp/pip-k8wh6o-build/setuptools/compat.pyu<lambda>,scCs|jS(N(u__globals__(uo((u*/tmp/pip-k8wh6o-build/setuptools/compat.pyu<lambda>-scCs|jS(N(u__func__(uo((u*/tmp/pip-k8wh6o-build/setuptools/compat.pyu<lambda>.s(u
HTTPServeruSimpleHTTPRequestHandlercCs
|j�S(N(uitems(uo((u*/tmp/pip-k8wh6o-build/setuptools/compat.pyu<lambda>3s(u	HTTPErroruURLError(uurlopenuurl2pathnameupathname2url(uurlparseu
urlunparseuunquoteu	splituseruurljoinuurlsplitu
urlunsplitusplittagc
Csz|dkrt�}n|dkr-|}nt|d�}z|j�}Wd|j�Xtt||d�||�dS(Nurbuexec(uNoneuglobalsuopenureaducloseuexecucompile(ufnuglobsulocsufusource((u*/tmp/pip-k8wh6o-build/setuptools/compat.pyuexecfileDs	uexecfilecCs+|j|k	r!|j|��n|�dS(N(u
__traceback__uwith_traceback(utpuvalueutb((u*/tmp/pip-k8wh6o-build/setuptools/compat.pyureraisePsureraiseFT(Dusysu	itertoolsuversion_infouFalseuPY3u
basestringu__builtin__ubuiltinsuConfigParseruStringIOuBytesIOuexecfileu	func_codeufunc_globalsuim_funcuhtmlentitydefsuname2codepointuhttplibuBaseHTTPServeru
HTTPServeruSimpleHTTPServeruSimpleHTTPRequestHandleruBaseHTTPRequestHandleru	iteritemsulongu	long_typeumaxintumaxsizeunextuintufloatu
numeric_typesuunichruunicodeustrubytesuurllibuurl2pathnameusplittagupathname2urluurllib2uurlopenu	HTTPErroruURLErroruunquoteu	splituseruurlparseu
urlunparseuurljoinuurlsplitu
urlunsplituifilterfalseufilterfalseuexecuTrueuconfigparseruiou
html.entitiesuhttp.clientuclientuhttp.serveruchruurllib.erroruurllib.requesturequestuurllib.parseuNoneureraise(((u*/tmp/pip-k8wh6o-build/setuptools/compat.pyu<module>sv	((	
	:	site-packages/setuptools/__pycache__/__init__.cpython-33.pyc000064400000011273151733464060020114 0ustar00�
�Re�c@sldZddlZddlZddlZddlZddlmZddlm	Z	ddl
Zddlm
Z
ddlmZmZmZddlmZdd	d
ddd
dgZejjZdZdZdgZdfdd�ZejjZee�ZGdd�de�Zeej_ejdd�Z e ej!_ e"ede#ej$j%d���Z&dS(u@Extensions to the 'distutils' for large or complex distributionsiN(uCommand(uconvert_path(u	Extension(uDistributionuFeatureu_get_unpatched(uRequireusetupuDistributionuFeatureuCommandu	ExtensionuRequireu
find_packagesu
lib2to3.fixesu.cs.g}t|�dfg}x�|r�|jd�\}}x�tj|�D]�}tjj||�}d|ko�tjj|�o�tjjtjj|d��}|rI|j||�|j|||df�qIqIWqWxGt	|�dgD]2�ddl
m���fdd�|D�}q�W|S(	u�Return a list all Python packages found within directory 'where'

    'where' should be supplied as a "cross-platform" (i.e. URL-style) path; it
    will be converted to the appropriate local path syntax.  'exclude' is a
    sequence of package names to exclude; '*' can be used as a wildcard in the
    names, such that 'foo.*' will exclude all subpackages of 'foo' (but not
    'foo' itself).
    uiu.u__init__.pyuez_setup(ufnmatchcasecs%g|]}�|��s|�qS(((u.0uitem(ufnmatchcaseupat(u,/tmp/pip-k8wh6o-build/setuptools/__init__.pyu
<listcomp>7s	u!find_packages.<locals>.<listcomp>(uconvert_pathupopuosulistdirupathujoinuisdiruisfileuappendulistufnmatchufnmatchcase(uwhereuexcludeuoutustackuprefixunameufnulooks_like_package((ufnmatchcaseupatu,/tmp/pip-k8wh6o-build/setuptools/__init__.pyu
find_packagess 		!& cBs>|EeZdZejZdZdd�Zddd�ZdS(uCommandcKsAtj||�x*|j�D]\}}t|||�qWdS(N(u_Commandu__init__uitemsusetattr(uselfudistukwukuv((u,/tmp/pip-k8wh6o-build/setuptools/__init__.pyu__init__CsuCommand.__init__icKsFtj|||�}x*|j�D]\}}t|||�q"W|S(N(u_Commandureinitialize_commanduitemsusetattr(uselfucommandureinit_subcommandsukwucmdukuv((u,/tmp/pip-k8wh6o-build/setuptools/__init__.pyureinitialize_commandIsuCommand.reinitialize_commandNF(	u__name__u
__module__u__qualname__u_Commandu__doc__uFalseucommand_consumes_argumentsu__init__ureinitialize_command(u
__locals__((u,/tmp/pip-k8wh6o-build/setuptools/__init__.pyuCommand>s	cs�g}x�tj|�D]�\�}}�tjksM�jtjtj�r`�dd��n�r��fdd�|D�}n|jttjj|��qW|S(u^Find all files under 'dir' and return the list of full filenames
    (relative to 'dir').
    iNcs%g|]}tjj�|��qS((uosupathujoin(u.0uf(ubase(u,/tmp/pip-k8wh6o-build/setuptools/__init__.pyu
<listcomp>Zs	ufindall.<locals>.<listcomp>(	uosuwalkucurdiru
startswithusepuextendufilterupathuisfile(udiru	all_filesudirsufiles((ubaseu,/tmp/pip-k8wh6o-build/setuptools/__init__.pyufindallQs( ufindalludont_write_bytecodeuPYTHONDONTWRITEBYTECODET('u__doc__uosusysudistutils.coreu	distutilsudistutils.filelistuCommandu_Commandudistutils.utiluconvert_pathusetuptools.versionu
setuptoolsusetuptools.extensionu	Extensionusetuptools.distuDistributionuFeatureu_get_unpatchedusetuptools.dependsuRequireu__all__uversionu__version__uNoneubootstrap_install_fromuTrueurun_2to3_on_doctestsulib2to3_fixer_packagesu
find_packagesucoreusetupucurdirufindallufilelistugetattrubooluenvironugetu_dont_write_bytecode(((u,/tmp/pip-k8wh6o-build/setuptools/__init__.pyu<module>s2		
	site-packages/setuptools/__pycache__/ssl_support.cpython-33.pyc000064400000021711151733464060020750 0ustar00�
�Re�c@scddlZddlZddlZddlZddlZddlmZmZddlmZyddl	Z	Wne
k
r�dZ	YnXdddddgZd	j
�j�ZeZZxpd
ddgfd
ddgffD]J\ZZx;eD]3Zyedeef�Wq�e
k
r(Yq�Xq�Wq�We	dk	oLeeefkZyddl	mZmZWnWe
k
r�y$ddlmZddlmZWne
k
r�dZdZYnXYnXes�Gdd�de�Znesddd�Zdd�ZnGdd�de�ZGdd�de�Zddd�Zda dd �Z!d!d�Z"dS("iN(uResolutionErroruExtractionError(uurllib2uVerifyingHTTPSHandlerufind_ca_bundleuis_availableu
cert_pathsu
opener_foru�
/etc/pki/tls/certs/ca-bundle.crt
/etc/ssl/certs/ca-certificates.crt
/usr/share/ssl/certs/ca-bundle.crt
/usr/local/share/certs/ca-root.crt
/etc/ssl/cert.pem
/System/Library/OpenSSL/certs/cert.pem
uHTTPSHandleruurllib2uurllib.requestuHTTPSConnectionuhttplibuhttp.clientufrom %s import %s(uCertificateErrorumatch_hostname(uCertificateError(umatch_hostnamecBs|EeZdZdS(uCertificateErrorN(u__name__u
__module__u__qualname__(u
__locals__((u//tmp/pip-k8wh6o-build/setuptools/ssl_support.pyuCertificateError8suCertificateErroric
CsXg}|sdS|jd�}|d}|dd�}|jd�}||krmtdt|���n|s�|j�|j�kS|dkr�|jd�nY|jd�s�|jd�r�|jtj	|��n"|jtj	|�j
d	d
��x$|D]}|jtj	|��qWtjddj|�d
tj
�}	|	j|�S(upMatching according to RFC 6125, section 6.4.3

        http://tools.ietf.org/html/rfc6125#section-6.4.3
        u.iiNu*u,too many wildcards in certificate DNS name: u[^.]+uxn--u\*u[^.]*u\Au\.u\ZF(uFalseusplitucountuCertificateErrorurepruloweruappendu
startswithureuescapeureplaceucompileujoinu
IGNORECASEumatch(
udnuhostnameu
max_wildcardsupatsupartsuleftmostu	remainderu	wildcardsufragupat((u//tmp/pip-k8wh6o-build/setuptools/ssl_support.pyu_dnsname_match<s*
"
&u_dnsname_matchcCs[|std��ng}|jdf�}xC|D];\}}|dkr4t||�r_dS|j|�q4q4W|s�xc|jdf�D]L}xC|D];\}}|dkr�t||�r�dS|j|�q�q�Wq�Wnt|�dkrtd|d	jtt|��f��n;t|�dkrKtd
||df��ntd��dS(
u=Verify that *cert* (in decoded format as returned by
        SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 and RFC 6125
        rules are followed, but IP addresses are not accepted for *hostname*.

        CertificateError is raised on failure. On success, the function
        returns nothing.
        uempty or no certificateusubjectAltNameuDNSNusubjectu
commonNameiu&hostname %r doesn't match either of %su, uhostname %r doesn't match %riu=no appropriate commonName or subjectAltName fields were found(	u
ValueErrorugetu_dnsname_matchuappendulenuCertificateErrorujoinumapurepr(ucertuhostnameudnsnamesusanukeyuvalueusub((u//tmp/pip-k8wh6o-build/setuptools/ssl_support.pyumatch_hostnameps.%umatch_hostnamecBs2|EeZdZdZdd�Zdd�ZdS(uVerifyingHTTPSHandleru=Simple verifying handler: no auth, subclasses, timeouts, etc.cCs||_tj|�dS(N(u	ca_bundleuHTTPSHandleru__init__(uselfu	ca_bundle((u//tmp/pip-k8wh6o-build/setuptools/ssl_support.pyu__init__�s	uVerifyingHTTPSHandler.__init__cs�j�fdd�|�S(Ncst|�j|�S(N(uVerifyingHTTPSConnu	ca_bundle(uhostukw(uself(u//tmp/pip-k8wh6o-build/setuptools/ssl_support.pyu<lambda>�su2VerifyingHTTPSHandler.https_open.<locals>.<lambda>(udo_open(uselfureq((uselfu//tmp/pip-k8wh6o-build/setuptools/ssl_support.pyu
https_open�su VerifyingHTTPSHandler.https_openN(u__name__u
__module__u__qualname__u__doc__u__init__u
https_open(u
__locals__((u//tmp/pip-k8wh6o-build/setuptools/ssl_support.pyuVerifyingHTTPSHandler�scBs2|EeZdZdZdd�Zdd�ZdS(uVerifyingHTTPSConnu@Simple verifying connection: no auth, subclasses, timeouts, etc.cKs tj|||�||_dS(N(uHTTPSConnectionu__init__u	ca_bundle(uselfuhostu	ca_bundleukw((u//tmp/pip-k8wh6o-build/setuptools/ssl_support.pyu__init__�suVerifyingHTTPSConn.__init__cCs�tj|j|jft|dd��}t|d�rat|dd�ra||_|j�nt	j
|dt	jd|j�|_yt
|jj�|j�Wn5tk
r�|jjtj�|jj��YnXdS(Nusource_addressu_tunnelu_tunnel_hostu	cert_reqsuca_certs(usocketucreate_connectionuhostuportugetattruNoneuhasattrusocku_tunnelussluwrap_socketu
CERT_REQUIREDu	ca_bundleumatch_hostnameugetpeercertuCertificateErrorushutdownu	SHUT_RDWRuclose(uselfusock((u//tmp/pip-k8wh6o-build/setuptools/ssl_support.pyuconnect�s$!	


uVerifyingHTTPSConn.connectN(u__name__u
__module__u__qualname__u__doc__u__init__uconnect(u
__locals__((u//tmp/pip-k8wh6o-build/setuptools/ssl_support.pyuVerifyingHTTPSConn�suVerifyingHTTPSConncCstjt|pt���jS(u@Get a urlopen() replacement that uses ca_bundle for verification(uurllib2ubuild_openeruVerifyingHTTPSHandlerufind_ca_bundleuopen(u	ca_bundle((u//tmp/pip-k8wh6o-build/setuptools/ssl_support.pyu
opener_for�scsxtdk	rtjSyddlm�Wntk
r?dSYnXG�fdd�d��}|dddg�atjS(Ni(uCertFilecs,|EeZdZff�fdd�ZdS(u$get_win_certfile.<locals>.MyCertFilecsL�j|�x|D]}|j|�qW|j|�tj|j�dS(N(u__init__uaddstoreuaddcertsuatexituregisteruclose(uselfustoresucertsustore(uCertFile(u//tmp/pip-k8wh6o-build/setuptools/ssl_support.pyu__init__�s



u-get_win_certfile.<locals>.MyCertFile.__init__N(u__name__u
__module__u__qualname__u__init__(u
__locals__(uCertFile(u//tmp/pip-k8wh6o-build/setuptools/ssl_support.pyu
MyCertFile�su
MyCertFileustoresuCAuROOT(u	_wincertsuNoneunameuwincertstoreuCertFileuImportError(u
MyCertFile((uCertFileu//tmp/pip-k8wh6o-build/setuptools/ssl_support.pyuget_win_certfile�s
	uget_win_certfilec
Cswtjdkrt�Sx$tD]}tjj|�r|SqWytjdd�SWntt	t
fk
rrdSYnXdS(u*Return an existing CA bundle path, or Noneuntucertifiu
cacert.pemN(uosunameuget_win_certfileu
cert_pathsupathuisfileu
pkg_resourcesuresource_filenameuImportErroruResolutionErroruExtractionErroruNone(u	cert_path((u//tmp/pip-k8wh6o-build/setuptools/ssl_support.pyufind_ca_bundle�s
(#uosusocketuatexitureu
pkg_resourcesuResolutionErroruExtractionErrorusetuptools.compatuurllib2ussluImportErroruNoneu__all__ustripusplitu
cert_pathsuobjectuHTTPSHandleruHTTPSConnectionuwhatuwhereumoduleuexecuis_availableuCertificateErrorumatch_hostnameubackports.ssl_match_hostnameu
ValueErroru_dnsname_matchuVerifyingHTTPSHandleruVerifyingHTTPSConnu
opener_foru	_wincertsuget_win_certfileufind_ca_bundle(((u//tmp/pip-k8wh6o-build/setuptools/ssl_support.pyu<module>sV
	






4)
site-packages/setuptools/__pycache__/site-patch.cpython-33.pyc000064400000003754151733464060020423 0ustar00�
�Rer	c@s)dd�Zedkr%e�[ndS(cCs�ddl}ddl}ddl}|jjd�}|dksX|jdkra|rag}n|j|j�}t	|di�}|j
t|�d�}|j
jt
�}x�|D]�}||ks�|r�q�n|j|�}|dk	r |jd�}|dk	r�|jd�Pq�q�y.ddl}	|	jd|g�\}
}}Wntk
rew�YnX|
dkrxq�nz|	jd|
||�Wd|
j�XPq�Wtd��tdd�|j
D��}
t	|d	d�}d|_x|D]}t|�q�W|j|7_t|d�\}}d}g}x�|j
D]�}t|�\}}||kr}|dkr}t|�}n||
ks�|dkr�|j|�q>|j||�|d
7}q>W||j
dd�<dS(Niu
PYTHONPATHuwin32upath_importer_cacheusiteu$Couldn't find the real 'site' modulecSs&g|]}t|�ddf�qS(i(umakepath(u.0uitem((u./tmp/pip-k8wh6o-build/setuptools/site-patch.pyu
<listcomp>+s	u__boot.<locals>.<listcomp>u__egginserti(usysuosuos.pathuenvironugetuNoneuplatformusplitupathsepugetattrupathulenudirnameu__file__ufind_moduleuload_moduleuimpuImportErrorucloseudictu__egginsertu
addsitedirumakepathuappenduinsert(usysuosu
PYTHONPATHupicustdpathumydiruitemuimporteruloaderuimpustreamupathudescruknown_pathsuoldposudundu	insert_atunew_pathupunp((u./tmp/pip-k8wh6o-build/setuptools/site-patch.pyu__boots^$"	

"
	
u__bootusiteN(u__bootu__name__(((u./tmp/pip-k8wh6o-build/setuptools/site-patch.pyu<module>sHsite-packages/setuptools/__pycache__/lib2to3_ex.cpython-33.pyc000064400000007212151733464060020325 0ustar00�
�Re�c@sxdZddlmZddlmZddlmZmZddl	Z	Gdd�de�Z
Gdd	�d	e�ZdS(
uy
Customized Mixin2to3 support:

 - adds support for converting doctests


This module raises an ImportError on Python 2.
i(u	Mixin2to3(ulog(uRefactoringTooluget_fixers_from_packageNcBs8|EeZdZdd�Zdd�Zdd�ZdS(uDistutilsRefactoringToolcOstj||�dS(N(uloguerror(uselfumsguargsukw((u./tmp/pip-k8wh6o-build/setuptools/lib2to3_ex.pyu	log_errorsu"DistutilsRefactoringTool.log_errorcGstj||�dS(N(uloguinfo(uselfumsguargs((u./tmp/pip-k8wh6o-build/setuptools/lib2to3_ex.pyulog_messagesu$DistutilsRefactoringTool.log_messagecGstj||�dS(N(ulogudebug(uselfumsguargs((u./tmp/pip-k8wh6o-build/setuptools/lib2to3_ex.pyu	log_debugsu"DistutilsRefactoringTool.log_debugN(u__name__u
__module__u__qualname__u	log_errorulog_messageu	log_debug(u
__locals__((u./tmp/pip-k8wh6o-build/setuptools/lib2to3_ex.pyuDistutilsRefactoringToolsuDistutilsRefactoringToolcBs;|EeZdZddd�Zdd�Zdd�ZdS(	u	Mixin2to3cCs�|jjdk	rdS|s dStjddj|��|j�|j�|r�tj	r�t
|j�}|j|dddd�q�nt
j||�dS(NuFixing u uwriteu
doctests_onlyT(udistributionuuse_2to3uTrueuloguinfoujoinu_Mixin2to3__build_fixer_namesu_Mixin2to3__exclude_fixersu
setuptoolsurun_2to3_on_doctestsuDistutilsRefactoringToolufixer_namesurefactoru
_Mixin2to3urun_2to3(uselfufilesudoctestsur((u./tmp/pip-k8wh6o-build/setuptools/lib2to3_ex.pyurun_2to3s

	uMixin2to3.run_2to3cCs�|jr
dSg|_x'tjD]}|jjt|��q W|jjdk	r�x-|jjD]}|jjt|��q_WndS(N(ufixer_namesu
setuptoolsulib2to3_fixer_packagesuextenduget_fixers_from_packageudistributionuuse_2to3_fixersuNone(uselfup((u./tmp/pip-k8wh6o-build/setuptools/lib2to3_ex.pyu__build_fixer_names+s		uMixin2to3.__build_fixer_namescCsqt|dg�}|jjdk	r:|j|jj�nx0|D](}||jkrA|jj|�qAqAWdS(Nuexclude_fixers(ugetattrudistributionuuse_2to3_exclude_fixersuNoneuextendufixer_namesuremove(uselfuexcluded_fixersu
fixer_name((u./tmp/pip-k8wh6o-build/setuptools/lib2to3_ex.pyu__exclude_fixers4s
uMixin2to3.__exclude_fixersNF(u__name__u
__module__u__qualname__uFalseurun_2to3u_Mixin2to3__build_fixer_namesu_Mixin2to3__exclude_fixers(u
__locals__((u./tmp/pip-k8wh6o-build/setuptools/lib2to3_ex.pyu	Mixin2to3s	u	Mixin2to3(u__doc__udistutils.utilu	Mixin2to3u
_Mixin2to3u	distutilsulogulib2to3.refactoruRefactoringTooluget_fixers_from_packageu
setuptoolsuDistutilsRefactoringTool(((u./tmp/pip-k8wh6o-build/setuptools/lib2to3_ex.pyu<module>s
site-packages/setuptools/__pycache__/package_index.cpython-33.pyc000064400000134625151733464060021146 0ustar00�
�Re
�c@s�dZddlZddlZddlZddlZddlZddlZddlZddlm	Z	ddl
mZmZm
Z
mZmZmZmZmZmZmZmZmZmZddlmZddlmZddlmZddlmZm 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-dd	lm.Z.dd
l/m0Z0ddl1m2Z2ddl3m4Z4ej5d
�Z6ej5dej7�Z8ej5d�Z9ej5dej7�j:Z;dj<�Z=ddddgZ>dZ?dd�Z@dd�ZAeBdd�ZCeBdd�ZDeBdd�ZEeBeeBdd�ZFeBd d!�ZGd"d#�ZHej5d$ej7�ZIeHd%d&��ZJd'ejKdd(�ed)�djKfZLGd*d+�d+eM�ZNGd,d-�d-eN�ZOGd.d�de�ZPej5d/�jQZRd0d1�ZSd2d3�ZTd4d5�ZUdd6d7�ZVd8d9�ZWGd:d;�d;eM�ZXGd<d=�d=e-j-�ZYejZd>d?�Z[eVe?�e[�Z[d@dA�Z\dBdC�Z]dS(Du#PyPI and direct package downloadingiN(uwraps(
u
CHECKOUT_DISTuDistributionuBINARY_DISTunormalize_pathuSOURCE_DISTurequireuEnvironmentufind_distributionsu	safe_nameusafe_versionuto_filenameuRequirementuDEVELOP_DIST(ussl_support(ulog(uDistutilsError(uurllib2uhttplibuStringIOu	HTTPErroruurlparseu
urlunparseuunquoteu	splituseruurl2pathnameuname2codepointuunichruurljoinuurlsplitu
urlunsplituConfigParser(ufilterfalse(u	translate(ustrip_fragment(uget_all_headersu^egg=([-A-Za-z0-9_.]+)$uhref\s*=\s*['"]?([^'"> ]+)u�<a href="([^"#]+)">([^<]+)</a>
\s+\(<a (?:title="MD5 hash"
\s+)href="[^?]+\?:action=show_md5&amp;digest=([0-9a-f]{32})">md5</a>\)u([-+.a-z0-9]{2,}):u.tar.gz .tar.bz2 .tar .zip .tgzuPackageIndexudistros_for_urluparse_bdist_wininstuinterpret_distro_nameicCs|j�}d\}}}|jd�r�|jd�rR|dd�}d}q�|jdd�r�|dd�}|dd�}d}q�|jd
�r�|dd�}d}q�|jd
d�r�|dd�}|dd�}d}q�n|||fS(u=Return (base,pyversion) or (None,None) for possible .exe nameu.exeu
.win32.exeNi
uwin32u	.win32-pyiiiu.win-amd64.exeiu	win-amd64u
.win-amd64-pyi(NNNi����i�i����i����i�i�i��i����i����i��(uloweruNoneuendswithu
startswith(unameulowerubaseupy_veruplat((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuparse_bdist_wininst.s$			cCs�t|�\}}}}}}t|jd�d�}|dkrk|dkrkt|jd�d�}nd|kr�|jdd�\}}n||fS(	Nu/iusourceforge.netudownloadiu#i����i����(uurlparseuunquoteusplit(uurluschemeuserverupathu
parametersuqueryufragmentubase((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuegg_info_for_urlFsuegg_info_for_urlccs�t|�\}}xt|||�D]}|Vq%W|r�tj|�}|r�x1t||jd�|dt�D]}|VqqWq�ndS(uEYield egg or source distribution objects that might be found at a URLiu
precedenceN(uegg_info_for_urludistros_for_locationuEGG_FRAGMENTumatchuinterpret_distro_nameugroupu
CHECKOUT_DIST(uurlumetadataubaseufragmentudistumatch((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyudistros_for_urlNs	"cCs�|jd�r"|dd�}n|jd�rSd|krStj|||�gS|jd�r�t|�\}}}|dk	r�t||||t|�SnxDtD]<}|j|�r�|dt|��}t|||�Sq�WgS(u:Yield egg or source distribution objects based on basenameu.egg.zipNiu.eggu-u.exei����(	uendswithuDistributionu
from_locationuparse_bdist_wininstuNoneuinterpret_distro_nameuBINARY_DISTu
EXTENSIONSulen(ulocationubasenameumetadatauwin_baseupy_veruplatformuext((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyudistros_for_locationZs
udistros_for_locationcCs"tt|�tjj|�|�S(uEYield possible egg or source distribution objects based on a filename(udistros_for_locationunormalize_pathuosupathubasename(ufilenameumetadata((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyudistros_for_filenameosudistros_for_filenamec	cs�|jd�}|sdxLt|dd��D]1\}}t|�dkr,|jd�r,dSq,Wnxmtdt|�d�D]R}t||dj|d|��dj||d��d|d|d	|�Vq~WdS(
u�Generate 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!
    u-iNiupy2.iu
py_versionu
precedenceuplatform(usplitu	enumerateulenu
startswithurangeuDistributionujoin(	ulocationubasenameumetadatau
py_versionu
precedenceuplatformupartsuiup((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuinterpret_distro_namevs#! 5ccs�t�}|j}|dkrMxgt|j|�D]}||�|Vq1Wn;x8|D]0}||�}||krT||�|VqTqTWdS(uHList unique elements, preserving order. Remember all elements ever seen.N(usetuadduNoneufilterfalseu__contains__(uiterableukeyuseenuseen_adduelementuk((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuunique_everseen�s		


uunique_everseencs"t���fdd��}|S(us
    Wrap a function returning an iterable such that the resulting iterable
    only ever yields unique items.
    cst�||��S(N(uunique_everseen(uargsukwargs(ufunc(u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuwrapper�suunique_values.<locals>.wrapper(uwraps(ufuncuwrapper((ufuncu1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu
unique_values�su
unique_valuesu(<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>ccsx�tj|�D]�}|j�\}}tttj|j�jd���}d|ksgd|krx7t	j|�D]#}t
|t|jd���VqwWqqWxddD]\}|j
|�}|d	kr�t	j||�}|rt
|t|jd���Vqq�q�WdS(
uEFind rel="homepage" and rel="download" links in `page`, yielding URLsu,uhomepageudownloadiu
<th>Home Pageu<th>Download URLN(u
<th>Home Pageu<th>Download URLi����(uRELufinditerugroupsusetumapustrustripulowerusplituHREFuurljoinu
htmldecodeugroupufindusearch(uurlupageumatchutagurelurelsupos((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyufind_external_links�s'(
ufind_external_linksuPython-urllib/%s setuptools/%siu
setuptoolscBs>|EeZdZdZdd�Zdd�Zdd�ZdS(	uContentCheckeruP
    A null content checker that defines the interface for checking content
    cCsdS(u3
        Feed a block of data to the hash.
        N((uselfublock((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyufeed�suContentChecker.feedcCsdS(uC
        Check the hash. Return False if validation fails.
        T(uTrue(uself((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuis_valid�suContentChecker.is_validcCsdS(uu
        Call reporter with information about the checker (hash name)
        substituted into the template.
        N((uselfureporterutemplate((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyureport�suContentChecker.reportN(u__name__u
__module__u__qualname__u__doc__ufeeduis_validureport(u
__locals__((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuContentChecker�suContentCheckercBse|EeZdZejd�Zdd�Zedd��Zdd�Z	dd	�Z
d
d�ZdS(
uHashCheckeruK(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)=(?P<expected>[a-f0-9]+)cCs(||_tj|�|_||_dS(N(u	hash_nameuhashlibunewuhashuexpected(uselfu	hash_nameuexpected((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu__init__�s	uHashChecker.__init__cCsLt|�d}|st�S|jj|�}|s<t�S||j��S(u5Construct a (possibly null) ContentChecker from a URLii����(uurlparseuContentCheckerupatternusearchu	groupdict(uclsuurlufragmentumatch((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyufrom_url�suHashChecker.from_urlcCs|jj|�dS(N(uhashuupdate(uselfublock((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyufeed�suHashChecker.feedcCs|jj�|jkS(N(uhashu	hexdigestuexpected(uself((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuis_valid�suHashChecker.is_validcCs||j}||�S(N(u	hash_name(uselfureporterutemplateumsg((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyureports
uHashChecker.reportN(u__name__u
__module__u__qualname__ureucompileupatternu__init__uclassmethodufrom_urlufeeduis_validureport(u
__locals__((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuHashChecker�s	uHashCheckercs�|EeZdZdZddGdHdIdd�ZdJdd�ZdJdd	�Z	dJd
d�Z
dd
�Zdd�Zdd�Z
dd�ZdHdd�Zdd�ZdH�fdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�ZdJdJdJdHd$d%�ZdJdJd&d'�Zd(d)�Zd*Zd+d,�Zd-d.�ZdHd/d0�Zd1d2�Zd3d4�Zd5d6�Z d7d8�Z!d9d:�Z"e#dJd;d<��Z$d=d>�Z%d?d@�Z&dAdB�Z'dCdD�Z(dEdF�Z)�S(KuPackageIndexu;A distribution index that scans web pages for download URLsuhttps://pypi.python.org/simpleu*cOs�tj|||�|dd|jd��|_i|_i|_i|_tjdj	t
t|���j|_
g|_|r�tjr�|s�tj�r�tj|�|_ntj|_dS(Nu/u|(uEnvironmentu__init__uendswithu	index_urluscanned_urlsufetched_urlsu
package_pagesureucompileujoinumapu	translateumatchuallowsuto_scanussl_supportuis_availableufind_ca_bundleu
opener_foruopeneruurllib2uurlopen(uselfu	index_urluhostsu	ca_bundleu
verify_ssluargsukw((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu__init__	s!			'	!uPackageIndex.__init__c

CsU||jkr|rdSd|j|<t|�sD|j|�dStt|��}|r�|j|�sodS|jd|�n|s�|s�||jkr�tt	|j
|��dS|j|�s�d|j|<dS|jd|�d|j|<|j|d|�}|dkrdSd|j|j<d|jjdd�j�krZ|j�dS|j}|j�}t|t�s�t|t�r�d}n|jjd	�p�d}|j|d
�}n|j�xBtj|�D]1}t|t|jd���}	|j|	�q�W|j|j �rQt!|dd�d
krQ|j"||�}ndS(u<Evaluate a URL as a possible download, and maybe retrieve itNuFound link: %su
Reading %su<Download error on %s: %%s -- Some packages may not be found!uhtmlucontent-typeuulatin-1ucharsetuignoreiucodei�T(#uscanned_urlsuTrueu
URL_SCHEMEuprocess_filenameulistudistros_for_urluurl_okudebugufetched_urlsumapuadduinfouopen_urluNoneuurluheadersugetulowerucloseureadu
isinstanceustru	HTTPErroru	get_paramudecodeuHREFufinditeruurljoinu
htmldecodeugroupuprocess_urlu
startswithu	index_urlugetattru
process_index(
uselfuurluretrieveudistsufubaseupageucharsetumatchulink((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuprocess_urlsN



!
		
*uPackageIndex.process_urlcCs�tjj|�s&|jd|�dStjj|�r�|r�tjj|�}x9tj|�D]%}|jtjj||�d�qaWnt
|�}|r�|jd|�tt
|j|��ndS(Nu
Not found: %su	Found: %sT(uosupathuexistsuwarnuisdirurealpathulistdiruprocess_filenameujoinuTrueudistros_for_filenameudebugulistumapuadd(uselfufnunestedupathuitemudists((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuprocess_filenameHs&uPackageIndex.process_filenamecCs}t|�}|r-|jd�j�dksF|jt|�d�rJdSd}|rit||��n|j||�dS(NiufileuN
Note: Bypassing %s (disallowed host; see http://bit.ly/1dg9ijs for details).
T(u
URL_SCHEMEugroupuloweruallowsuurlparseuTrueuDistutilsErroruwarn(uselfuurlufatalusumsg((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuurl_okXs:uPackageIndex.url_okcCsfx_|D]W}tjj|�rx<tj|�D](}|jd�r/|j||�q/q/WqqWdS(Nu	.egg-link(uosupathuisdirulistdiruendswithu
scan_egg_link(uselfusearch_pathuitemuentry((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuscan_egg_linkscs

uPackageIndex.scan_egg_linkscCs�dd�ttjttjj||���D�}t|�dkr�xXttjj||d��D]4}tjj||�|_	t
|_|j|�qfWndS(NcSsg|]}|r|�qS(((u.0u_f((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu
<listcomp>ks	u.PackageIndex.scan_egg_link.<locals>.<listcomp>ii(
umapustrustripuopenuosupathujoinulenufind_distributionsulocationuSOURCE_DISTu
precedenceuadd(uselfupathuentryulinesudist((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu
scan_egg_linkjs"&	uPackageIndex.scan_egg_linkc

s�fdd�}xRtj|�D]A}y&|t|t|jd����Wq"tk
rbYq"Xq"W||�\}}|rxyt||�D]h}t|�\}}	|jd�r�|	r�|r�|d||f7}q��j	|�n�j
|�q�Wtjdd�|�SdSd	S(
u#Process the contents of a PyPI pagecs�|j�j�r�ttt|t�j�d�jd���}t|�dkr�d|dkr�t|d�}t|d�}d�j
j|j�i�|<t
|�t
|�fSndS(Nu/iu#iiT(NN(u
startswithu	index_urlulistumapuunquoteulenusplitu	safe_nameusafe_versionuTrueu
package_pagesu
setdefaultuloweruto_filenameuNone(ulinkupartsupkguver(uself(u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuscanus+"u(PackageIndex.process_index.<locals>.scaniu.pyu
#egg=%s-%scSsd|jddd�S(Nu<a href="%s#md5=%s">%s</a>iii(ugroup(um((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu<lambda>�su,PackageIndex.process_index.<locals>.<lambda>uN(
uHREFufinditeruurljoinu
htmldecodeugroupu
ValueErrorufind_external_linksuegg_info_for_urluendswithuneed_version_infouscan_urluPYPI_MD5usub(
uselfuurlupageuscanumatchupkguverunew_urlubaseufrag((uselfu1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu
process_indexss$&
	uPackageIndex.process_indexcCs|jd|�dS(NuPPage at %s links to .py file(s) without version info; an index scan is required.(uscan_all(uselfuurl((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuneed_version_info�suPackageIndex.need_version_infocGsO|j|jkr;|r+|j||�n|jd�n|j|j�dS(Nu6Scanning index of all packages (this may take a while)(u	index_urlufetched_urlsuwarnuinfouscan_url(uselfumsguargs((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuscan_all�s
uPackageIndex.scan_allcCs�|j|j|jd�|jj|j�sN|j|j|jd�n|jj|j�ss|j|�nx3t|jj|jf��D]}|j|�q�WdS(Nu/(	uscan_urlu	index_urluunsafe_nameu
package_pagesugetukeyuproject_nameunot_found_in_indexulist(uselfurequirementuurl((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu
find_packages�s%uPackageIndex.find_packagescsk|j�|j|�x8||jD])}||kr;|S|jd||�q%Wtt|�j||�S(Nu%s does not match %s(uprescanu
find_packagesukeyudebugusuperuPackageIndexuobtain(uselfurequirementu	installerudist(u	__class__(u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuobtain�s

uPackageIndex.obtaincCsi|j|jd|�|j�se|j�tj|�td|jjtj	j
|�f��ndS(u-
        checker is a ContentChecker
        uValidating %%s checksum for %su7%s validation failed for %s; possible download problem?N(ureportudebuguis_validucloseuosuunlinkuDistutilsErroruhashunameupathubasename(uselfucheckerufilenameutfp((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu
check_hash�s

uPackageIndex.check_hashcCsrxk|D]c}|jdksJt|�sJ|jd�sJtt|��rZ|j|�q|jj|�qWdS(u;Add `urls` to the list that will be prescanned for searchesufile:N(uto_scanuNoneu
URL_SCHEMEu
startswithulistudistros_for_urluscan_urluappend(uselfuurlsuurl((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuadd_find_links�s

uPackageIndex.add_find_linkscCs2|jr%tt|j|j��nd|_dS(u7Scan urls scheduled for prescanning (e.g. --find-links)N(uto_scanulistumapuscan_urluNone(uself((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuprescan�s	uPackageIndex.prescancCsN||jr |jd}}n|jd}}|||j�|j�dS(Nu#Couldn't retrieve index page for %ru3Couldn't find index page for %r (maybe misspelled?)(ukeyuinfouwarnuunsafe_nameuscan_all(uselfurequirementumethumsg((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyunot_found_in_index�s

uPackageIndex.not_found_in_indexcCs�t|t�s�t|�}|r||j|jd�||�}t|�\}}|jd�rx|j|||�}n|Stj	j
|�r�|Sytj|�}Wq�tk
r�t
d|f��Yq�Xnt|j||�dd�S(uLocate 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.
        iu.pyu1Not a URL, existing file, or requirement spec: %rulocationN(u
isinstanceuRequirementu
URL_SCHEMEu
_download_urlugroupuegg_info_for_urluendswithu	gen_setupuosupathuexistsuparseu
ValueErroruDistutilsErrorugetattrufetch_distributionuNone(uselfuspecutmpdiruschemeufoundubaseufragment((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyudownload�s"
uPackageIndex.downloadc		sN�jd|�i�d	}d	����fdd�}|rf�j��j|�||�}n|d	k	r�|p�|||�}n|d	kr��jd	k	r��j�||�}n|d	kr�|r��j|�||�}n|d	kr�jd�rdpd|�n/�jd|�|jd�j|j|��Sd	S(
u|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.
        uSearching for %scs�|dkr�}nx�||jD]q}|jtkrn�rn|�kr#�jd|�d�|<q#q#n||kr#|jtks��r#|Sq#WdS(Nu&Skipping development or system egg: %si(uNoneukeyu
precedenceuDEVELOP_DISTuwarnuSOURCE_DIST(urequenvudist(u
develop_okuselfuskippedusource(u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyufind1s	
"u-PackageIndex.fetch_distribution.<locals>.findu2No local packages or download links found for %s%sua source distribution of uuBest match: %sulocationN(	uinfouNoneuprescanu
find_packagesuto_scanuwarnucloneudownloadulocation(	uselfurequirementutmpdiru
force_scanusourceu
develop_okulocal_indexudistufind((u
develop_okuselfuskippedusourceu1/tmp/pip-k8wh6o-build/setuptools/package_index.pyufetch_distributions.




uPackageIndex.fetch_distributioncCs/|j||||�}|dk	r+|jSdS(u3Obtain 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(ufetch_distributionuNoneulocation(uselfurequirementutmpdiru
force_scanusourceudist((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyufetch[suPackageIndex.fetchc
Csbtj|�}|r=dd�t||jd�d�D�p@g}t|�dkr3tjj|�}tjj	|�|kr�tjj
||�}ddlm}|||�s�t
j||�|}q�nttjj
|d�d�}	|	jd|dj|djtjj|�df�|	j�|S|rRtd	||f��ntd
��dS(NcSsg|]}|jr|�qS((uversion(u.0ud((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu
<listcomp>ks	u*PackageIndex.gen_setup.<locals>.<listcomp>ii(usamefileusetup.pyuwuIfrom setuptools import setup
setup(name=%r, version=%r, py_modules=[%r])
u�Can't unambiguously interpret project/version identifier %r; any dashes in the name or version should be escaped using underscores. %rupCan't process plain .py files without an '#egg=name-version' suffix to enable automatic setup script generation.(uEGG_FRAGMENTumatchuinterpret_distro_nameugroupuNoneulenuosupathubasenameudirnameujoinusetuptools.command.easy_installusamefileushutilucopy2uopenuwriteuproject_nameuversionusplitextucloseuDistutilsError(
uselfufilenameufragmentutmpdirumatchudistsubasenameudstusamefileufile((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu	gen_setuphs4	
uPackageIndex.gen_setupi c
Cs�|jd|�d\}}}zHtj|�}|jt|��}t|t�rwtd||j	|j
f��n|j�}d}|j}	d	}
d|kr�t|d�}t
tt|��}
|j||||	|
�nt|d�}xY|j|	�}|rK|j|�|j|�|d7}|j||||	|
�q�Pq�|j|||�|SWd|r}|j�n|r�|j�nXdS(
NuDownloading %suCan't download %s: %s %siiucontent-lengthuContent-Lengthuwb(NNNi����(uinfouNoneuHashCheckerufrom_urluopen_urlustrip_fragmentu
isinstanceu	HTTPErroruDistutilsErrorucodeumsgudl_blocksizeuget_all_headersumaxumapuintu
reporthookuopenureadufeeduwriteu
check_hashuclose(
uselfuurlufilenameufputfpuinfoucheckeruheadersublocknumubsusizeusizesublock((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu_download_to�s>	



uPackageIndex._download_tocCsdS(N((uselfuurlufilenameublocknumublksizeusize((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu
reporthook�suPackageIndex.reporthookcCs�|jd�rt|�Syt||j�SWn�ttjfk
r�tj�d}dj	dd�|j
D��}|r�|j||�ntd||f��Yn.t
jk
r�tj�d}|SYnt
jk
r)tj�d}|r|j||j�ntd||jf��Yn�tjk
r�tj�d}|re|j||j�ntd||jf��YnTtjk
r�tj�d}|r�|j||�ntd||f��YnXdS(	Nufile:iu cSsg|]}t|��qS((ustr(u.0uarg((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu
<listcomp>�s	u)PackageIndex.open_url.<locals>.<listcomp>u%s %suDownload error for %s: %su;%s returned a bad status line. The server might be down, %s(u
startswithu
local_openuopen_with_authuopeneru
ValueErroruhttplibu
InvalidURLusysuexc_infoujoinuargsuwarnuDistutilsErroruurllib2u	HTTPErroruURLErrorureasonu
BadStatusLineulineu
HTTPException(uselfuurluwarninguvumsg((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuopen_url�s@
uPackageIndex.open_urlcCsBt|�\}}|rLx7d|krH|jdd�jdd�}qWnd}|jd�rt|dd�}ntjj||�}|dks�|jd	�r�|j||�S|d
ks�|jd�r�|j||�S|jd�r�|j	||�S|d
krt
t|�d�S|j|d�|j||�SdS(Nu..u.u\u_u__downloaded__u.egg.zipiusvnusvn+ugitugit+uhg+ufileii����T(uegg_info_for_urlureplaceuendswithuosupathujoinu
startswithu
_download_svnu
_download_gitu_download_hguurl2pathnameuurlparseuurl_okuTrueu_attempt_download(uselfuschemeuurlutmpdirunameufragmentufilename((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu
_download_url�s$%uPackageIndex._download_urlcCs|j|d�dS(NT(uprocess_urluTrue(uselfuurl((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuscan_url�suPackageIndex.scan_urlcCsK|j||�}d|jdd�j�krC|j|||�S|SdS(Nuhtmlucontent-typeu(u_download_tougetuloweru_download_html(uselfuurlufilenameuheaders((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu_attempt_downloadsuPackageIndex._attempt_downloadcCs�t|�}xW|D]O}|j�rtjd|�r^|j�tj|�|j||�SPqqW|j�tj|�td|��dS(Nu <title>([^- ]+ - )?Revision \d+:uUnexpected HTML page found at (	uopenustripureusearchucloseuosuunlinku
_download_svnuDistutilsError(uselfuurluheadersufilenameufileuline((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu_download_html	s




uPackageIndex._download_htmlc
Cs`|jdd�d}d}|j�jd�r/d|kr/t|�\}}}}}}	|r/|jd�r/d|d	d�kr/|d	d�jdd�\}}t|�\}
}|
r,d
|
kr�|
jd
d�\}}
d||
f}n
d|
}|}t||||||	f�}q,q/n|jd
||�tjd|||f�|S(Nu#iiuusvn:u@u//u/iu:u --username=%s --password=%su --username=u'Doing subversion checkout from %s to %susvn checkout%s -q %s %s(	usplituloweru
startswithuurlparseu	splituseru
urlunparseuinfouosusystem(uselfuurlufilenameucredsuschemeunetlocupathupuqufuauthuhostuuserupw((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu
_download_svns"!,"
'uPackageIndex._download_svncCs�t|�\}}}}}|jdd�d}|jdd�d}d}d|krt|jdd�\}}nt||||df�}||fS(Nu+iu#iu@ui����(uurlsplitusplituNoneursplitu
urlunsplit(uurlu
pop_prefixuschemeunetlocupathuqueryufragurev((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu_vcs_split_rev_from_url,su$PackageIndex._vcs_split_rev_from_urlcCs�|jdd�d}|j|dd	�\}}|jd||�tjd||f�|dk	r�|jd|�tjd||f�n|S(
Nu#iiu
pop_prefixuDoing git clone from %s to %sugit clone --quiet %s %suChecking out %su"(cd %s && git checkout --quiet %s)T(usplitu_vcs_split_rev_from_urluTrueuinfouosusystemuNone(uselfuurlufilenameurev((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu
_download_git>s	uPackageIndex._download_gitcCs�|jdd�d}|j|dd	�\}}|jd||�tjd||f�|dk	r�|jd|�tjd||f�n|S(
Nu#iiu
pop_prefixuDoing hg clone from %s to %suhg clone --quiet %s %suUpdating to %su(cd %s && hg up -C -r %s >&-)T(usplitu_vcs_split_rev_from_urluTrueuinfouosusystemuNone(uselfuurlufilenameurev((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu_download_hgNs	uPackageIndex._download_hgcGstj||�dS(N(ulogudebug(uselfumsguargs((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyudebug^suPackageIndex.debugcGstj||�dS(N(uloguinfo(uselfumsguargs((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuinfoasuPackageIndex.infocGstj||�dS(N(uloguwarn(uselfumsguargs((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuwarndsuPackageIndex.warn(u*NTF(*u__name__u
__module__u__qualname__u__doc__uNoneuTrueu__init__uFalseuprocess_urluprocess_filenameuurl_okuscan_egg_linksu
scan_egg_linku
process_indexuneed_version_infouscan_allu
find_packagesuobtainu
check_hashuadd_find_linksuprescanunot_found_in_indexudownloadufetch_distributionufetchu	gen_setupudl_blocksizeu_download_tou
reporthookuopen_urlu
_download_urluscan_urlu_attempt_downloadu_download_htmlu
_download_svnustaticmethodu_vcs_split_rev_from_urlu
_download_gitu_download_hgudebuguinfouwarn(u
__locals__((u	__class__u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuPackageIndexsL
0	*		)A
*$(u!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?cCs3t|t�s|S|dkr)t|�St|�S(Ni�(u
isinstanceuintuunichruchr(uc((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuuchrks

uuchrcCs�|jd�}|jd�r:t|dd�d�}nC|jd�rbt|dd��}ntj||jd��}t|�S(Niu#xiiu#i(ugroupu
startswithuintuname2codepointugetuuchr(umatchuwhat((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu
decode_entityqsu
decode_entitycCs
tt|�S(u'Decode HTML entities in the given text.(u
entity_subu
decode_entity(utext((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu
htmldecode{su
htmldecodecs�fdd�}|S(Ncs��fdd�}|S(Ncs?tj�}tj��z�||�SWdtj|�XdS(N(usocketugetdefaulttimeoutusetdefaulttimeout(uargsukwargsuold_timeout(ufuncutimeout(u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu_socket_timeout�s

u@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeout((ufuncu_socket_timeout(utimeout(ufuncu1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu_socket_timeout�su'socket_timeout.<locals>._socket_timeout((utimeoutu_socket_timeout((utimeoutu1/tmp/pip-k8wh6o-build/setuptools/package_index.pyusocket_timeouts	usocket_timeoutcCsCt|�}|j�}tj|�}|j�}|jdd�S(uq
    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
    u
u(uunquoteuencodeubase64uencodestringudecodeureplace(uauthuauth_su
auth_bytesu
encoded_bytesuencoded((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu_encode_auth�s
u_encode_authcBs>|EeZdZdZdd�Zdd�Zdd�ZdS(	u
Credentialu:
    A username/password pair. Use like a namedtuple.
    cCs||_||_dS(N(uusernameupassword(uselfuusernameupassword((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu__init__�s	uCredential.__init__ccs|jV|jVdS(N(uusernameupassword(uself((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu__iter__�suCredential.__iter__cCsdt|�S(Nu%(username)s:%(password)s(uvars(uself((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu__str__�suCredential.__str__N(u__name__u
__module__u__qualname__u__doc__u__init__u__iter__u__str__(u
__locals__((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu
Credential�su
CredentialcBsJ|EeZdZdd�Zedd��Zdd�Zdd�Zd	S(
u
PyPIConfigcCsutjdddgd�}tjj||�tjjtjjd�d�}tjj|�rq|j	|�ndS(u%
        Load from ~/.pypirc
        uusernameupasswordu
repositoryuu~u.pypircN(
udictufromkeysuConfigParseru__init__uosupathujoinu
expanduseruexistsuread(uselfudefaultsurc((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu__init__�s
!uPyPIConfig.__init__cs5�fdd��j�D�}tt�j|��S(Ncs.g|]$}�j|d�j�r|�qS(u
repository(ugetustrip(u.0usection(uself(u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu
<listcomp>�s	u2PyPIConfig.creds_by_repository.<locals>.<listcomp>(usectionsudictumapu_get_repo_cred(uselfusections_with_repositories((uselfu1/tmp/pip-k8wh6o-build/setuptools/package_index.pyucreds_by_repository�suPyPIConfig.creds_by_repositorycCsO|j|d�j�}|t|j|d�j�|j|d�j��fS(Nu
repositoryuusernameupassword(ugetustripu
Credential(uselfusectionurepo((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu_get_repo_cred�suPyPIConfig._get_repo_credcCs7x0|jj�D]\}}|j|�r|SqWdS(u�
        If the URL indicated appears to be a repository defined in this
        config, return the credential for that repository.
        N(ucreds_by_repositoryuitemsu
startswith(uselfuurlu
repositoryucred((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyufind_credential�suPyPIConfig.find_credentialN(u__name__u
__module__u__qualname__u__init__upropertyucreds_by_repositoryu_get_repo_credufind_credential(u
__locals__((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu
PyPIConfig�s	u
PyPIConfigcCs�t|�\}}}}}}|jd�r?tjd��n|d	kr`t|�\}}	nd
}|s�t�j|�}
|
r�t|
�}|
j	|f}t
jd|�q�n|rdt|�}t
||	||||f�}tj|�}
|
jd|�ntj|�}
|
jdt�||
�}|r�t|j�\}}}}}}||kr�||	kr�t
||||||f�|_q�n|S(u4Open a urllib2 request, handling HTTP authenticationu:unonnumeric port: ''uhttpuhttpsu*Authenticating as %s for %s (from .pypirc)uBasic u
Authorizationu
User-Agent(uhttpuhttpsN(uurlparseuendswithuhttplibu
InvalidURLu	splituseruNoneu
PyPIConfigufind_credentialustruusernameuloguinfou_encode_authu
urlunparseuurllib2uRequestu
add_headeru
user_agentuurl(uurluopeneruschemeunetlocupathuparamsuqueryufraguauthuhostucreduinfounew_urlurequestufpus2uh2upath2uparam2uquery2ufrag2((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyuopen_with_auth�s2!'uopen_with_authcCs|S(N((uurl((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu
fix_sf_urlsu
fix_sf_urlcCsut|�\}}}}}}t|�}tjj|�rItj|�S|jd�r=tjj|�r=g}x�tj	|�D]�}	|	dkr�t
tjj||	�d�}
|
j�}|
j
�Pn.tjjtjj||	��r�|	d7}	n|jd|	|	f�q�Wd|ddj|�}d\}}
nd\}}
}id
d6}t|||
|t|��S(u7Read a local path, with special support for directoriesu/u
index.htmluru<a href=%r>%s</a>u<html><head><title>%s</title>u</head><body>%s</body></html>u
i�uOKi�uPath not foundu	Not foundu	text/htmlucontent-type(i�uOK(i�uPath not foundu	Not found(uurlparseuurl2pathnameuosupathuisfileuurllib2uurlopenuendswithuisdirulistdiruopenujoinureaducloseuappendu	HTTPErroruStringIO(uurluschemeuserverupathuparamuqueryufragufilenameufilesufufpubodyustatusumessageuheaders((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu
local_opens*
!
!

u
local_open(^u__doc__usysuosureushutilusocketubase64uhashlibu	functoolsuwrapsu
pkg_resourcesu
CHECKOUT_DISTuDistributionuBINARY_DISTunormalize_pathuSOURCE_DISTurequireuEnvironmentufind_distributionsu	safe_nameusafe_versionuto_filenameuRequirementuDEVELOP_DISTu
setuptoolsussl_supportu	distutilsulogudistutils.errorsuDistutilsErrorusetuptools.compatuurllib2uhttplibuStringIOu	HTTPErroruurlparseu
urlunparseuunquoteu	splituseruurl2pathnameuname2codepointuunichruurljoinuurlsplitu
urlunsplituConfigParserufilterfalseufnmatchu	translateusetuptools.py26compatustrip_fragmentusetuptools.py27compatuget_all_headersucompileuEGG_FRAGMENTuIuHREFuPYPI_MD5umatchu
URL_SCHEMEusplitu
EXTENSIONSu__all__u_SOCKET_TIMEOUTuparse_bdist_wininstuegg_info_for_urluNoneudistros_for_urludistros_for_locationudistros_for_filenameuinterpret_distro_nameuunique_everseenu
unique_valuesuRELufind_external_linksuversionu
user_agentuobjectuContentCheckeruHashCheckeruPackageIndexusubu
entity_subuuchru
decode_entityu
htmldecodeusocket_timeoutu_encode_authu
Credentialu
PyPIConfiguurlopenuopen_with_authu
fix_sf_urlu
local_open(((u1/tmp/pip-k8wh6o-build/setuptools/package_index.pyu<module>spXd			"
'!��e
'+site-packages/setuptools/__pycache__/script template.cpython-33.pyc000064400000000420151733464060021445 0ustar00�
�Re�c@s&dZddlZejdd�dS(u%(spec)riNu%(script_name)r(u__requires__u
pkg_resourcesu
run_script(((u3/tmp/pip-k8wh6o-build/setuptools/script template.pyu<module>ssite-packages/setuptools/__pycache__/sandbox.cpython-33.pyc000064400000037742151733464060020024 0ustar00�
�Re
'c@s�ddlZddlZddlZddlZddlZddlZddlZddlZejdkr�ddl	j
jjj
ZnejejZy
eZWnek
r�dZYnXeZddlmZddlmZddlmZmZdddd	gZd
d	�ZGdd�d�Zeed�rJejgZ ngZ y'dd
l!m"Z"e j#e"��["Wne$k
r�YnXGdd�de�Z%ej&ej'dd�dj(�D��Z)Gdd�de�Z*dS(iNujava(uDistutilsError(uworking_set(ubuiltinsuexecfileuAbstractSandboxuDirectorySandboxuSandboxViolationu	run_setupcstj�}tjdd�}tjdd�}tjjtjj���}tjj|d�}tjj|�s�tj	|�nt
j}tjj
��tj�}z�|t
_tj|�yv�gt|�tjdd�<tjjd|�tj�tjjdd��t|�j�fdd��Wn>tk
rztj�d}	|	jrv|	jdrv�nYnXWdtj|�tjj���fdd	�tjD�}
tttjj|
��tj|�|tjdd�<|tjdd�<|t
_XdS(
u8Run a distutils setup script, sandboxed in its directoryNutempicSs
|j�S(N(uactivate(udist((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu<lambda>0surun_setup.<locals>.<lambda>cstdi�d6dd6�S(Nusetup.pyu__file__u__main__u__name__(uexecfile((usetup_script(u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu<lambda>2sics2g|](}|�kr|jd�r|�qS(u
encodings.(u
startswith(u.0umod_name(usave_modules(u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu
<listcomp>As	urun_setup.<locals>.<listcomp>( uosugetcwdusysuargvupathuabspathudirnameujoinuisdirumakedirsutempfileutempdirumodulesucopyu
pkg_resourcesu__getstate__uchdirulistuinsertuworking_setu__init__u	callbacksuappenduDirectorySandboxurunu
SystemExituexc_infouargsu__setstate__uupdateumapu__delitem__(usetup_scriptuargsuold_diru	save_argvu	save_pathu	setup_dirutemp_dirusave_tmpupr_stateuvudel_modules((usave_modulesusetup_scriptu+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu	run_setups@		
 



cBs�|EeZdZdZd4Zdd�Zdd�Zdd�Zdd	�Z	x<d
ddgD]+Z
eee
�r\e	e
�e
�e
<q\q\Wd3d
d�Zer�ede�Znede�Zxlddddddddddddddddd d!d"gD]+Z
eee
�ree
�e
�e
<qqWd#d$�Zx9d%d&gD]+Z
eee
�rIee
�e
�e
<qIqIWd'd(�Zx9d)d*gD]+Z
eee
�r�ee
�e
�e
<q�q�Wd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3S(5uAbstractSandboxuDWrap 'os' module and 'open()' builtin for virtualizing setup scriptscs&�fdd�tt�D��_dS(Ncs5g|]+}|jd�rt�|�r|�qS(u_(u
startswithuhasattr(u.0uname(uself(u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu
<listcomp>Ts	u,AbstractSandbox.__init__.<locals>.<listcomp>(udiru_osu_attrs(uself((uselfu+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu__init__RsuAbstractSandbox.__init__cCs1x*|jD]}tt|t||��q
WdS(N(u_attrsusetattruosugetattr(uselfusourceuname((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu_copyXsuAbstractSandbox._copycCs{zB|j|�tr%|jt_n|jt_d|_|�SWdd|_tr`tt_ntt_|jt	�XdS(uRun 'func' under os sandboxingNTF(
u_copyu_fileubuiltinsufileu_openuopenuTrueu_activeuFalseu_os(uselfufunc((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyurun\s
			uAbstractSandbox.runcs(tt�����fdd�}|S(Ncs@|jr-|j�||||�\}}n�||||�S(N(u_activeu_remap_pair(uselfusrcudstuargsukw(unameuoriginal(u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyuwrapns	$u3AbstractSandbox._mk_dual_path_wrapper.<locals>.wrap(ugetattru_os(unameuwrap((unameuoriginalu+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu_mk_dual_path_wrapperlsu%AbstractSandbox._mk_dual_path_wrapperurenameulinkusymlinkcs.�ptt�����fdd�}|S(Ncs4|jr$|j�|||�}n�|||�S(N(u_activeu_remap_input(uselfupathuargsukw(unameuoriginal(u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyuwrapys	u5AbstractSandbox._mk_single_path_wrapper.<locals>.wrap(ugetattru_os(unameuoriginaluwrap((unameuoriginalu+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu_mk_single_path_wrapperwsu'AbstractSandbox._mk_single_path_wrapperufileuopenustatulistdiruchdiruchmoduchownumkdiruremoveuunlinkurmdiruutimeulchownuchrootulstatu	startfileumkfifoumknodupathconfuaccesscs(tt�����fdd�}|S(NcsM|jr=|j�|||�}|j��|||��S�|||�S(N(u_activeu_remap_inputu
_remap_output(uselfupathuargsukw(unameuoriginal(u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyuwrap�s	u4AbstractSandbox._mk_single_with_return.<locals>.wrap(ugetattru_os(unameuwrap((unameuoriginalu+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu_mk_single_with_return�su&AbstractSandbox._mk_single_with_returnureadlinkutempnamcs(tt�����fdd�}|S(Ncs,�||�}|jr(|j�|�S|S(N(u_activeu
_remap_output(uselfuargsukwuretval(unameuoriginal(u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyuwrap�s	u'AbstractSandbox._mk_query.<locals>.wrap(ugetattru_os(unameuwrap((unameuoriginalu+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu	_mk_query�suAbstractSandbox._mk_queryugetcwdutmpnamcCs|S(u=Called to remap or validate any path, whether input or output((uselfupath((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu_validate_path�suAbstractSandbox._validate_pathcOs
|j|�S(uCalled for path inputs(u_validate_path(uselfu	operationupathuargsukw((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu_remap_input�suAbstractSandbox._remap_inputcCs
|j|�S(uCalled for path outputs(u_validate_path(uselfu	operationupath((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu
_remap_output�suAbstractSandbox._remap_outputcOs6|j|d|||�|j|d|||�fS(u?Called for path pairs like rename, link, and symlink operationsu-fromu-to(u_remap_input(uselfu	operationusrcudstuargsukw((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu_remap_pair�suAbstractSandbox._remap_pairNF(u__name__u
__module__u__qualname__u__doc__uFalseu_activeu__init__u_copyurunu_mk_dual_path_wrapperunameuhasattru_osulocalsuNoneu_mk_single_path_wrapperu_fileu_openu_mk_single_with_returnu	_mk_queryu_validate_pathu_remap_inputu
_remap_outputu_remap_pair(u
__locals__((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyuAbstractSandboxMs>		udevnull(uGetGeneratePathcBs�|EeZdZdZejdddddddd	d
ddd
dg
�ZdgZedd�Z	dd�Z
er�ddd�Znddd�Zdd�Z
dd�Zdd�Zdd �Zd!d"�Zd#d$d%�Zd&S('uDirectorySandboxu<Restrict operations to a single subdirectory - pseudo-chrootuopenuchmoduchownumkdiruremoveuunlinkurmdiruutimeulchownuchrootumkfifoumknodutempnamu.*lib2to3.*\.pickle$cCsctjjtjj|��|_tjj|jd�|_dd�|D�|_tj	|�dS(NucSs.g|]$}tjjtjj|���qS((uosupathunormcaseurealpath(u.0upath((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu
<listcomp>�s	u-DirectorySandbox.__init__.<locals>.<listcomp>(
uosupathunormcaseurealpathu_sandboxujoinu_prefixu_exceptionsuAbstractSandboxu__init__(uselfusandboxu
exceptions((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu__init__�s
!	
uDirectorySandbox.__init__cOst|||��dS(N(uSandboxViolation(uselfu	operationuargsukw((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu
_violation�suDirectorySandbox._violationurcOsK|dkr8|j|�r8|jd||||�nt||||�S(NururturburUuUufile(ururturburUuU(u_oku
_violationu_file(uselfupathumodeuargsukw((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu_file�suDirectorySandbox._filecOsK|dkr8|j|�r8|jd||||�nt||||�S(NururturburUuUuopen(ururturburUuU(u_oku
_violationu_open(uselfupathumodeuargsukw((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu_open�suDirectorySandbox._opencCs|jd�dS(Nutmpnam(u
_violation(uself((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyutmpnam�suDirectorySandbox.tmpnamcCss|j}zYd|_tjjtjj|��}|j|�p`||jkp`|j|j	�SWd||_XdS(NF(
u_activeuFalseuosupathunormcaseurealpathu	_exemptedu_sandboxu
startswithu_prefix(uselfupathuactiveurealpath((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu_ok�s		uDirectorySandbox._okcsT�fdd�|jD�}�fdd�|jD�}tj||�}t|�S(Nc3s|]}�j|�VqdS(N(u
startswith(u.0u	exception(ufilepath(u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu	<genexpr>�su-DirectorySandbox._exempted.<locals>.<genexpr>c3s!|]}tj|��VqdS(N(ureumatch(u.0upattern(ufilepath(u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu	<genexpr>�s(u_exceptionsu_exception_patternsu	itertoolsuchainuany(uselfufilepathu
start_matchesupattern_matchesu
candidates((ufilepathu+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu	_exempted�s

uDirectorySandbox._exemptedcOsH||jkrD|j|�rD|j|tjj|�||�n|S(uCalled for path inputs(u	write_opsu_oku
_violationuosupathurealpath(uselfu	operationupathuargsukw((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu_remap_inputs%uDirectorySandbox._remap_inputcOsF|j|�s |j|�r<|j|||||�n||fS(u?Called for path pairs like rename, link, and symlink operations(u_oku
_violation(uselfu	operationusrcudstuargsukw((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu_remap_pair	s uDirectorySandbox._remap_pairi�cOsR|t@r9|j|�r9|jd|||||�ntj|||||�S(uCalled for low-level os.open()uos.open(uWRITE_FLAGSu_oku
_violationu_osuopen(uselfufileuflagsumodeuargsukw((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyuopensuDirectorySandbox.openN(u__name__u
__module__u__qualname__u__doc__udictufromkeysu	write_opsu_exception_patternsu_EXCEPTIONSu__init__u
_violationu_fileu_openutmpnamu_oku	_exemptedu_remap_inputu_remap_pairuopen(u
__locals__((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyuDirectorySandbox�s 		
cCs"g|]}tt|d��qS(i(ugetattru_os(u.0ua((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu
<listcomp>s	u
<listcomp>u4O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC O_TEMPORARYcBs&|EeZdZdZdd�ZdS(uSandboxViolationuEA setup script attempted to modify the filesystem outside the sandboxcCsd|jS(Nu�SandboxViolation: %s%r %s

The package setup script has attempted to modify files on your system
that are not within the EasyInstall build area, and has been aborted.

This package cannot be safely installed by EasyInstall, and may not
support alternate installation locations even if you run its setup
script by hand.  Please inform the package's author and the EasyInstall
maintainers to find out if a fix or workaround is available.(uargs(uself((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu__str__s	uSandboxViolation.__str__N(u__name__u
__module__u__qualname__u__doc__u__str__(u
__locals__((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyuSandboxViolations(+uosusysutempfileuoperatoru	functoolsu	itertoolsureu
pkg_resourcesunameu$org.python.modules.posix.PosixModuleupythonumodulesuposixuPosixModuleu_osufileu_fileu	NameErroruNoneuopenu_openudistutils.errorsuDistutilsErroruworking_setusetuptools.compatubuiltinsuexecfileu__all__u	run_setupuAbstractSandboxuhasattrudevnullu_EXCEPTIONSuwin32com.client.gencacheuGetGeneratePathuappenduImportErroruDirectorySandboxureduceuor_usplituWRITE_FLAGSuSandboxViolation(((u+/tmp/pip-k8wh6o-build/setuptools/sandbox.pyu<module>sF

0h
Ssite-packages/setuptools/__pycache__/depends.cpython-33.pyc000064400000017024151733464070020000 0ustar00�
�ReMc@sddlmZddlZddlZddlZddlmZmZmZmZddl	m
Z
mZddddgZGd	d�d�Z
d
d�Zddd�Zdddd�Zddd�Zejjd�s�ejdkr[[ejd�ejd�ndS(i(u
generatorsN(u
PKG_DIRECTORYuPY_COMPILEDu	PY_SOURCEu	PY_FROZEN(u
StrictVersionuLooseVersionuRequireufind_moduleuget_module_constantuextract_constantcBsw|EeZdZdZddddd�Zdd�Zdd�Zdd	d
d�Zddd
�Z	ddd�Z
dS(uRequireu7A prerequisite to building or installing a distributionucCsn|dkr!|dk	r!t}n|dk	rQ||�}|dkrQd}qQn|jjt��|`dS(Nu__version__(uNoneu
StrictVersionu__dict__uupdateulocalsuself(uselfunameurequested_versionumoduleuhomepageu	attributeuformat((u+/tmp/pip-k8wh6o-build/setuptools/depends.pyu__init__
s	uRequire.__init__cCs*|jdk	r#d|j|jfS|jS(u0Return full package/distribution name, w/versionu%s-%sN(urequested_versionuNoneuname(uself((u+/tmp/pip-k8wh6o-build/setuptools/depends.pyu	full_namesuRequire.full_namecCs=|jdkp<|jdkp<t|�dko<||jkS(u%Is 'version' sufficiently up-to-date?uunknownN(u	attributeuNoneuformatustrurequested_version(uselfuversion((u+/tmp/pip-k8wh6o-build/setuptools/depends.pyu
version_ok$suRequire.version_okuunknownc
Cs�|jdkray6t|j|�\}}}|r@|j�n|SWqatk
r]dSYqaXnt|j|j||�}|dk	r�||k	r�|jdk	r�|j|�S|S(u�Get version number of installed module, 'None', or 'default'

        Search 'paths' for module.  If not found, return 'None'.  If found,
        return the extracted version attribute, or 'default' if no version
        attribute was specified, or the value cannot be determined without
        importing the module.  The version is formatted according to the
        requirement's version format (if any), unless it is 'None' or the
        supplied 'default'.
        N(u	attributeuNoneufind_moduleumoduleucloseuImportErroruget_module_constantuformat(uselfupathsudefaultufupuiuv((u+/tmp/pip-k8wh6o-build/setuptools/depends.pyuget_version*s

'
uRequire.get_versioncCs|j|�dk	S(u/Return true if dependency is present on 'paths'N(uget_versionuNone(uselfupaths((u+/tmp/pip-k8wh6o-build/setuptools/depends.pyu
is_presentFsuRequire.is_presentcCs,|j|�}|dkrdS|j|�S(u>Return true if dependency is present and up-to-date on 'paths'NF(uget_versionuNoneuFalseu
version_ok(uselfupathsuversion((u+/tmp/pip-k8wh6o-build/setuptools/depends.pyu
is_currentKsuRequire.is_currentN(u__name__u
__module__u__qualname__u__doc__uNoneu__init__u	full_nameu
version_okuget_versionu
is_presentu
is_current(u
__locals__((u+/tmp/pip-k8wh6o-build/setuptools/depends.pyuRequire
sc
cs�ddlm}ddlm}m}|d|j�}t|j�}d}d}x�||kr�||}||kr�||d||dd|}	|d7}||kr�|	td	�}qVq�nd
}	|d7}||	fVqVWd
S(u>Yield '(op,arg)' pair for each operation in code object 'code'i(uarray(u
HAVE_ARGUMENTuEXTENDED_ARGubiiiiiN(uarrayudisu
HAVE_ARGUMENTuEXTENDED_ARGuco_codeulenu	long_typeuNone(
ucodeuarrayu
HAVE_ARGUMENTuEXTENDED_ARGubytesueofuptruextended_arguopuarg((u+/tmp/pip-k8wh6o-build/setuptools/depends.pyu
_iter_codeSs"
"
	
u
_iter_codec
Cs�|jd�}x�|r�|jd�}tj||�\}}\}}}}	|tkrv|pgdg}|g}q|rtd||f��qqW|	S(u7Just like 'imp.find_module()', but with package supportu.iu__init__uCan't find %r in %s(usplitupopuimpufind_moduleu
PKG_DIRECTORYuImportError(
umoduleupathsupartsupartufupathusuffixumodeukinduinfo((u+/tmp/pip-k8wh6o-build/setuptools/depends.pyufind_module|s	(ic
Cs!y%t||�\}}\}}}Wntk
r=dSYnXz�|tkrl|jd�tj|�}	n�|tkr�tj	|�}	no|t
kr�t|j�|d�}	nH|tj
kr�tj||||||f�nttj
||d�SWd|r|j�nXt|	||�S(u�Find 'module' by searching 'paths', and extract 'symbol'

    Return 'None' if 'module' does not exist on 'paths', or it does not define
    'symbol'.  If the module defines 'symbol' as a constant, return the
    constant.  Otherwise, return 'default'.iuexecN(ufind_moduleuImportErroruNoneuPY_COMPILEDureadumarshaluloadu	PY_FROZENuimpuget_frozen_objectu	PY_SOURCEucompileusysumodulesuload_moduleugetattrucloseuextract_constant(
umoduleusymboludefaultupathsufupathusuffixumodeukinducode((u+/tmp/pip-k8wh6o-build/setuptools/depends.pyuget_module_constant�s$%
	
"c
Cs�||jkrdSt|j�j|�}d}d}d}|}xdt|�D]V\}}	||krx|j|	}qP|	|kr�||ks�||kr�|S|}qPWdS(uExtract the constant value of 'symbol' from 'code'

    If the name 'symbol' is bound to a constant value by the Python code
    object 'code', return that value.  If 'symbol' is bound to an expression,
    return 'default'.  Otherwise, return 'None'.

    Return value is based on the first assignment to 'symbol'.  'symbol' must
    be a global, or at least a non-"fast" local in the code block.  That is,
    only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol'
    must be present in 'code.co_names'.
    iZiaidN(uco_namesuNoneulistuindexu
_iter_codeu	co_consts(
ucodeusymboludefaultuname_idxu
STORE_NAMEuSTORE_GLOBALu
LOAD_CONSTuconstuopuarg((u+/tmp/pip-k8wh6o-build/setuptools/depends.pyuextract_constant�s
$ujavauclii����i����(u
__future__u
generatorsusysuimpumarshalu
PKG_DIRECTORYuPY_COMPILEDu	PY_SOURCEu	PY_FROZENudistutils.versionu
StrictVersionuLooseVersionu__all__uRequireu
_iter_codeuNoneufind_moduleuget_module_constantuextract_constantuplatformu
startswithuremove(((u+/tmp/pip-k8wh6o-build/setuptools/depends.pyu<module>s$"I)))"!
site-packages/setuptools/__pycache__/extension.cpython-33.pyc000064400000005255151733464070020375 0ustar00�
�Re|c@s�ddlZddlZddlZddlmZeejj�Zdd�Z	Gdd�de�ZGdd�de�Z
eej_eej_d	ejkr�eejd	_ndS(
iN(u_get_unpatchedcCsNd}xA|D]9}yt|ddg�jdSWq
tk
rEYq
Xq
WdS(u9
    Return True if Cython or Pyrex can be imported.
    uCython.Distutils.build_extuPyrex.Distutils.build_extufromlistu	build_ext(uCython.Distutils.build_extuPyrex.Distutils.build_extTF(u
__import__u	build_extuTrueu	ExceptionuFalse(upyrex_implsu
pyrex_impl((u-/tmp/pip-k8wh6o-build/setuptools/extension.pyu
have_pyrex	s

	u
have_pyrexcBs2|EeZdZdZdd�Zdd�ZdS(u	Extensionu7Extension that uses '.c' files in place of '.pyx' filescOs-tj|||�t�s)|j�ndS(N(u
_Extensionu__init__u
have_pyrexu_convert_pyx_sources_to_c(uselfuargsukw((u-/tmp/pip-k8wh6o-build/setuptools/extension.pyu__init__s	uExtension.__init__cCs+dd�}tt||j��|_dS(uconvert .pyx extensions to .ccSs*|jd�r&|dd�d}n|S(Nu.pyxiu.ci����(uendswith(usource((u-/tmp/pip-k8wh6o-build/setuptools/extension.pyupyx_to_c"su5Extension._convert_pyx_sources_to_c.<locals>.pyx_to_cN(ulistumapusources(uselfupyx_to_c((u-/tmp/pip-k8wh6o-build/setuptools/extension.pyu_convert_pyx_sources_to_c su#Extension._convert_pyx_sources_to_cN(u__name__u
__module__u__qualname__u__doc__u__init__u_convert_pyx_sources_to_c(u
__locals__((u-/tmp/pip-k8wh6o-build/setuptools/extension.pyu	Extensionsu	ExtensioncBs|EeZdZdZdS(uLibraryu=Just like a regular Extension, but built as a library insteadN(u__name__u
__module__u__qualname__u__doc__(u
__locals__((u-/tmp/pip-k8wh6o-build/setuptools/extension.pyuLibrary(suLibraryudistutils.command.build_ext(
usysudistutils.coreu	distutilsudistutils.extensionusetuptools.distu_get_unpatcheducoreu	Extensionu
_Extensionu
have_pyrexuLibraryu	extensionumodules(((u-/tmp/pip-k8wh6o-build/setuptools/extension.pyu<module>ssite-packages/setuptools/__pycache__/py26compat.cpython-33.pyc000064400000001707151733464070020363 0ustar00�
�Re�c@sPdZddlZddlmZdd�Zejd
krLdd	�ZndS(u2
Compatibility Support for Python 2.6 and earlier
iN(usplittagcCst|�\}}|S(u�
	In `Python 8280 <http://bugs.python.org/issue8280>`_, Python 2.7 and
	later was patched to disregard the fragment when making URL requests.
	Do the same for Python 2.6 and earlier.
	(usplittag(uurlufragment((u./tmp/pip-k8wh6o-build/setuptools/py26compat.pyustrip_fragment	sustrip_fragmentiicCs|S(N((ux((u./tmp/pip-k8wh6o-build/setuptools/py26compat.pyu<lambda>su<lambda>(ii(u__doc__usysusetuptools.compatusplittagustrip_fragmentuversion_info(((u./tmp/pip-k8wh6o-build/setuptools/py26compat.pyu<module>s
	site-packages/setuptools/__pycache__/script template (dev).cpython-33.pyc000064400000000765151733464070022342 0ustar00�
�Re7c@swdZddlZddlmZed�[dZejdkrQee�n"eee	e�j
�ed��dS(u%(spec)riN(urequireu%(dev_path)riuexec(ii(u__requires__usysu
pkg_resourcesurequireu__file__uversion_infouexecfileuexecucompileuopenuread(((u9/tmp/pip-k8wh6o-build/setuptools/script template (dev).pyu<module>s

site-packages/setuptools/__pycache__/version.cpython-33.pyc000064400000000250151733464070020034 0ustar00�
�Rec@s
dZdS(u2.0N(u__version__(((u+/tmp/pip-k8wh6o-build/setuptools/version.pyu<module>ssite-packages/setuptools/ssl_support.py000064400000016757151733464070014506 0ustar00import os
import socket
import atexit
import re

import pkg_resources
from pkg_resources import ResolutionError, ExtractionError
from setuptools.compat import urllib2

try:
    import ssl
except ImportError:
    ssl = None

__all__ = [
    'VerifyingHTTPSHandler', 'find_ca_bundle', 'is_available', 'cert_paths',
    'opener_for'
]

cert_paths = """
/etc/pki/tls/certs/ca-bundle.crt
/etc/ssl/certs/ca-certificates.crt
/usr/share/ssl/certs/ca-bundle.crt
/usr/local/share/certs/ca-root.crt
/etc/ssl/cert.pem
/System/Library/OpenSSL/certs/cert.pem
""".strip().split()


HTTPSHandler = HTTPSConnection = object

for what, where in (
    ('HTTPSHandler', ['urllib2','urllib.request']),
    ('HTTPSConnection', ['httplib', 'http.client']),
):
    for module in where:
        try:
            exec("from %s import %s" % (module, what))
        except ImportError:
            pass

is_available = ssl is not None and object not in (HTTPSHandler, HTTPSConnection)


try:
    from ssl import CertificateError, match_hostname
except ImportError:
    try:
        from backports.ssl_match_hostname import CertificateError
        from backports.ssl_match_hostname import match_hostname
    except ImportError:
        CertificateError = None
        match_hostname = None

if not CertificateError:
    class CertificateError(ValueError):
        pass

if not match_hostname:
    def _dnsname_match(dn, hostname, max_wildcards=1):
        """Matching according to RFC 6125, section 6.4.3

        http://tools.ietf.org/html/rfc6125#section-6.4.3
        """
        pats = []
        if not dn:
            return False

        # Ported from python3-syntax:
        # leftmost, *remainder = dn.split(r'.')
        parts = dn.split(r'.')
        leftmost = parts[0]
        remainder = parts[1:]

        wildcards = leftmost.count('*')
        if wildcards > max_wildcards:
            # Issue #17980: avoid denials of service by refusing more
            # than one wildcard per fragment.  A survey of established
            # policy among SSL implementations showed it to be a
            # reasonable choice.
            raise CertificateError(
                "too many wildcards in certificate DNS name: " + repr(dn))

        # speed up common case w/o wildcards
        if not wildcards:
            return dn.lower() == hostname.lower()

        # RFC 6125, section 6.4.3, subitem 1.
        # The client SHOULD NOT attempt to match a presented identifier in which
        # the wildcard character comprises a label other than the left-most label.
        if leftmost == '*':
            # When '*' is a fragment by itself, it matches a non-empty dotless
            # fragment.
            pats.append('[^.]+')
        elif leftmost.startswith('xn--') or hostname.startswith('xn--'):
            # RFC 6125, section 6.4.3, subitem 3.
            # The client SHOULD NOT attempt to match a presented identifier
            # where the wildcard character is embedded within an A-label or
            # U-label of an internationalized domain name.
            pats.append(re.escape(leftmost))
        else:
            # Otherwise, '*' matches any dotless string, e.g. www*
            pats.append(re.escape(leftmost).replace(r'\*', '[^.]*'))

        # add the remaining fragments, ignore any wildcards
        for frag in remainder:
            pats.append(re.escape(frag))

        pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)
        return pat.match(hostname)

    def match_hostname(cert, hostname):
        """Verify that *cert* (in decoded format as returned by
        SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 and RFC 6125
        rules are followed, but IP addresses are not accepted for *hostname*.

        CertificateError is raised on failure. On success, the function
        returns nothing.
        """
        if not cert:
            raise ValueError("empty or no certificate")
        dnsnames = []
        san = cert.get('subjectAltName', ())
        for key, value in san:
            if key == 'DNS':
                if _dnsname_match(value, hostname):
                    return
                dnsnames.append(value)
        if not dnsnames:
            # The subject is only checked when there is no dNSName entry
            # in subjectAltName
            for sub in cert.get('subject', ()):
                for key, value in sub:
                    # XXX according to RFC 2818, the most specific Common Name
                    # must be used.
                    if key == 'commonName':
                        if _dnsname_match(value, hostname):
                            return
                        dnsnames.append(value)
        if len(dnsnames) > 1:
            raise CertificateError("hostname %r "
                "doesn't match either of %s"
                % (hostname, ', '.join(map(repr, dnsnames))))
        elif len(dnsnames) == 1:
            raise CertificateError("hostname %r "
                "doesn't match %r"
                % (hostname, dnsnames[0]))
        else:
            raise CertificateError("no appropriate commonName or "
                "subjectAltName fields were found")


class VerifyingHTTPSHandler(HTTPSHandler):
    """Simple verifying handler: no auth, subclasses, timeouts, etc."""

    def __init__(self, ca_bundle):
        self.ca_bundle = ca_bundle
        HTTPSHandler.__init__(self)

    def https_open(self, req):
        return self.do_open(
            lambda host, **kw: VerifyingHTTPSConn(host, self.ca_bundle, **kw), req
        )


class VerifyingHTTPSConn(HTTPSConnection):
    """Simple verifying connection: no auth, subclasses, timeouts, etc."""
    def __init__(self, host, ca_bundle, **kw):
        HTTPSConnection.__init__(self, host, **kw)
        self.ca_bundle = ca_bundle

    def connect(self):
        sock = socket.create_connection(
            (self.host, self.port), getattr(self, 'source_address', None)
        )

        # Handle the socket if a (proxy) tunnel is present
        if hasattr(self, '_tunnel') and getattr(self, '_tunnel_host', None):
            self.sock = sock
            self._tunnel()

        self.sock = ssl.wrap_socket(
            sock, cert_reqs=ssl.CERT_REQUIRED, ca_certs=self.ca_bundle
        )
        try:
            match_hostname(self.sock.getpeercert(), self.host)
        except CertificateError:
            self.sock.shutdown(socket.SHUT_RDWR)
            self.sock.close()
            raise

def opener_for(ca_bundle=None):
    """Get a urlopen() replacement that uses ca_bundle for verification"""
    return urllib2.build_opener(
        VerifyingHTTPSHandler(ca_bundle or find_ca_bundle())
    ).open


_wincerts = None

def get_win_certfile():
    global _wincerts
    if _wincerts is not None:
        return _wincerts.name

    try:
        from wincertstore import CertFile
    except ImportError:
        return None

    class MyCertFile(CertFile):
        def __init__(self, stores=(), certs=()):
            CertFile.__init__(self)
            for store in stores:
                self.addstore(store)
            self.addcerts(certs)
            atexit.register(self.close)

    _wincerts = MyCertFile(stores=['CA', 'ROOT'])
    return _wincerts.name


def find_ca_bundle():
    """Return an existing CA bundle path, or None"""
    if os.name=='nt':
        return get_win_certfile()
    else:
        for cert_path in cert_paths:
            if os.path.isfile(cert_path):
                return cert_path
    try:
        return pkg_resources.resource_filename('certifi', 'cacert.pem')
    except (ImportError, ResolutionError, ExtractionError):
        return None
site-packages/setuptools/svn_utils.py000064400000042670151733464070014130 0ustar00import os
import re
import sys
from distutils import log
import xml.dom.pulldom
import shlex
import locale
import codecs
import unicodedata
import warnings
from setuptools.compat import unicode
from xml.sax.saxutils import unescape

try:
    import urlparse
except ImportError:
    import urllib.parse as urlparse

from subprocess import Popen as _Popen, PIPE as _PIPE

#NOTE: Use of the command line options require SVN 1.3 or newer (December 2005)
#      and SVN 1.3 hasn't been supported by the developers since mid 2008.

#subprocess is called several times with shell=(sys.platform=='win32')
#see the follow for more information:
#       http://bugs.python.org/issue8557
#       http://stackoverflow.com/questions/5658622/
#              python-subprocess-popen-environment-path


def _run_command(args, stdout=_PIPE, stderr=_PIPE, encoding=None, stream=0):
    #regarding the shell argument, see: http://bugs.python.org/issue8557
    try:
        proc = _Popen(args, stdout=stdout, stderr=stderr,
                      shell=(sys.platform == 'win32'))

        data = proc.communicate()[stream]
    except OSError:
        return 1, ''

    #doubled checked and
    data = decode_as_string(data, encoding)

    #communciate calls wait()
    return proc.returncode, data


def _get_entry_schedule(entry):
    schedule = entry.getElementsByTagName('schedule')[0]
    return "".join([t.nodeValue
                    for t in schedule.childNodes
                    if t.nodeType == t.TEXT_NODE])


def _get_target_property(target):
    property_text = target.getElementsByTagName('property')[0]
    return "".join([t.nodeValue
                    for t in property_text.childNodes
                    if t.nodeType == t.TEXT_NODE])


def _get_xml_data(decoded_str):
    if sys.version_info < (3, 0):
        #old versions want an encoded string
        data = decoded_str.encode('utf-8')
    else:
        data = decoded_str
    return data


def joinpath(prefix, *suffix):
    if not prefix or prefix == '.':
        return os.path.join(*suffix)
    return os.path.join(prefix, *suffix)

def determine_console_encoding():
    try:
        #try for the preferred encoding
        encoding = locale.getpreferredencoding()

        #see if the locale.getdefaultlocale returns null
        #some versions of python\platforms return US-ASCII
        #when it cannot determine an encoding
        if not encoding or encoding == "US-ASCII":
            encoding = locale.getdefaultlocale()[1]

        if encoding:
            codecs.lookup(encoding)  # make sure a lookup error is not made

    except (locale.Error, LookupError):
        encoding = None

    is_osx = sys.platform == "darwin"
    if not encoding:
        return ["US-ASCII", "utf-8"][is_osx]
    elif encoding.startswith("mac-") and is_osx:
        #certain versions of python would return mac-roman as default
        #OSX as a left over of earlier mac versions.
        return "utf-8"
    else:
        return encoding

_console_encoding = determine_console_encoding()

def decode_as_string(text, encoding=None):
    """
    Decode the console or file output explicitly using getpreferredencoding.
    The text paraemeter should be a encoded string, if not no decode occurs
    If no encoding is given, getpreferredencoding is used.  If encoding is
    specified, that is used instead.  This would be needed for SVN --xml
    output.  Unicode is explicitly put in composed NFC form.

    --xml should be UTF-8 (SVN Issue 2938) the discussion on the Subversion
    DEV List from 2007 seems to indicate the same.
    """
    #text should be a byte string

    if encoding is None:
        encoding = _console_encoding

    if not isinstance(text, unicode):
        text = text.decode(encoding)

    text = unicodedata.normalize('NFC', text)

    return text


def parse_dir_entries(decoded_str):
    '''Parse the entries from a recursive info xml'''
    doc = xml.dom.pulldom.parseString(_get_xml_data(decoded_str))
    entries = list()

    for event, node in doc:
        if event == 'START_ELEMENT' and node.nodeName == 'entry':
            doc.expandNode(node)
            if not _get_entry_schedule(node).startswith('delete'):
                entries.append((node.getAttribute('path'),
                                node.getAttribute('kind')))

    return entries[1:]  # do not want the root directory


def parse_externals_xml(decoded_str, prefix=''):
    '''Parse a propget svn:externals xml'''
    prefix = os.path.normpath(prefix)
    prefix = os.path.normcase(prefix)

    doc = xml.dom.pulldom.parseString(_get_xml_data(decoded_str))
    externals = list()

    for event, node in doc:
        if event == 'START_ELEMENT' and node.nodeName == 'target':
            doc.expandNode(node)
            path = os.path.normpath(node.getAttribute('path'))

            if os.path.normcase(path).startswith(prefix):
                path = path[len(prefix)+1:]

            data = _get_target_property(node)
            #data should be decoded already
            for external in parse_external_prop(data):
                externals.append(joinpath(path, external))

    return externals  # do not want the root directory


def parse_external_prop(lines):
    """
    Parse the value of a retrieved svn:externals entry.

    possible token setups (with quotng and backscaping in laters versions)
        URL[@#] EXT_FOLDERNAME
        [-r#] URL EXT_FOLDERNAME
        EXT_FOLDERNAME [-r#] URL
    """
    externals = []
    for line in lines.splitlines():
        line = line.lstrip()  # there might be a "\ "
        if not line:
            continue

        if sys.version_info < (3, 0):
            #shlex handles NULLs just fine and shlex in 2.7 tries to encode
            #as ascii automatiically
            line = line.encode('utf-8')
        line = shlex.split(line)
        if sys.version_info < (3, 0):
            line = [x.decode('utf-8') for x in line]

        #EXT_FOLDERNAME is either the first or last depending on where
        #the URL falls
        if urlparse.urlsplit(line[-1])[0]:
            external = line[0]
        else:
            external = line[-1]

        external = decode_as_string(external, encoding="utf-8")
        externals.append(os.path.normpath(external))

    return externals


def parse_prop_file(filename, key):
    found = False
    f = open(filename, 'rt')
    data = ''
    try:
        for line in iter(f.readline, ''):    # can't use direct iter!
            parts = line.split()
            if len(parts) == 2:
                kind, length = parts
                data = f.read(int(length))
                if kind == 'K' and data == key:
                    found = True
                elif kind == 'V' and found:
                    break
    finally:
        f.close()

    return data


class SvnInfo(object):
    '''
    Generic svn_info object.  No has little knowledge of how to extract
    information.  Use cls.load to instatiate according svn version.

    Paths are not filesystem encoded.
    '''

    @staticmethod
    def get_svn_version():
        code, data = _run_command(['svn', '--version', '--quiet'])
        if code == 0 and data:
            return data.strip()
        else:
            return ''

    #svnversion return values (previous implementations return max revision)
    #   4123:4168     mixed revision working copy
    #   4168M         modified working copy
    #   4123S         switched working copy
    #   4123:4168MS   mixed revision, modified, switched working copy
    revision_re = re.compile(r'(?:([\-0-9]+):)?(\d+)([a-z]*)\s*$', re.I)

    @classmethod
    def load(cls, dirname=''):
        normdir = os.path.normpath(dirname)
        code, data = _run_command(['svn', 'info', normdir])
        # Must check for some contents, as some use empty directories
        # in testcases
        svn_dir = os.path.join(normdir, '.svn')
        has_svn = (os.path.isfile(os.path.join(svn_dir, 'entries')) or
                   os.path.isfile(os.path.join(svn_dir, 'dir-props')) or
                   os.path.isfile(os.path.join(svn_dir, 'dir-prop-base')))

        svn_version = tuple(cls.get_svn_version().split('.'))

        try:
            base_svn_version = tuple(int(x) for x in svn_version[:2])
        except ValueError:
            base_svn_version = tuple()

        if not has_svn:
            return SvnInfo(dirname)

        if code or not base_svn_version or base_svn_version < (1, 3):
            warnings.warn(("No SVN 1.3+ command found: falling back "
                           "on pre 1.7 .svn parsing"), DeprecationWarning)
            return SvnFileInfo(dirname)

        if base_svn_version < (1, 5):
            return Svn13Info(dirname)

        return Svn15Info(dirname)

    def __init__(self, path=''):
        self.path = path
        self._entries = None
        self._externals = None

    def get_revision(self):
        'Retrieve the directory revision informatino using svnversion'
        code, data = _run_command(['svnversion', '-c', self.path])
        if code:
            log.warn("svnversion failed")
            return 0

        parsed = self.revision_re.match(data)
        if parsed:
            return int(parsed.group(2))
        else:
            return 0

    @property
    def entries(self):
        if self._entries is None:
            self._entries = self.get_entries()
        return self._entries

    @property
    def externals(self):
        if self._externals is None:
            self._externals = self.get_externals()
        return self._externals

    def iter_externals(self):
        '''
        Iterate over the svn:external references in the repository path.
        '''
        for item in self.externals:
            yield item

    def iter_files(self):
        '''
        Iterate over the non-deleted file entries in the repository path
        '''
        for item, kind in self.entries:
            if kind.lower() == 'file':
                yield item

    def iter_dirs(self, include_root=True):
        '''
        Iterate over the non-deleted file entries in the repository path
        '''
        if include_root:
            yield self.path
        for item, kind in self.entries:
            if kind.lower() == 'dir':
                yield item

    def get_entries(self):
        return []

    def get_externals(self):
        return []


class Svn13Info(SvnInfo):
    def get_entries(self):
        code, data = _run_command(['svn', 'info', '-R', '--xml', self.path],
                                  encoding="utf-8")

        if code:
            log.debug("svn info failed")
            return []

        return parse_dir_entries(data)

    def get_externals(self):
        #Previous to 1.5 --xml was not supported for svn propget and the -R
        #output format breaks the shlex compatible semantics.
        cmd = ['svn', 'propget', 'svn:externals']
        result = []
        for folder in self.iter_dirs():
            code, lines = _run_command(cmd + [folder], encoding="utf-8")
            if code != 0:
                log.warn("svn propget failed")
                return []
            #lines should a str
            for external in parse_external_prop(lines):
                if folder:
                    external = os.path.join(folder, external)
                result.append(os.path.normpath(external))

        return result


class Svn15Info(Svn13Info):
    def get_externals(self):
        cmd = ['svn', 'propget', 'svn:externals', self.path, '-R', '--xml']
        code, lines = _run_command(cmd, encoding="utf-8")
        if code:
            log.debug("svn propget failed")
            return []
        return parse_externals_xml(lines, prefix=os.path.abspath(self.path))


class SvnFileInfo(SvnInfo):

    def __init__(self, path=''):
        super(SvnFileInfo, self).__init__(path)
        self._directories = None
        self._revision = None

    def _walk_svn(self, base):
        entry_file = joinpath(base, '.svn', 'entries')
        if os.path.isfile(entry_file):
            entries = SVNEntriesFile.load(base)
            yield (base, False, entries.parse_revision())
            for path in entries.get_undeleted_records():
                path = decode_as_string(path)
                path = joinpath(base, path)
                if os.path.isfile(path):
                    yield (path, True, None)
                elif os.path.isdir(path):
                    for item in self._walk_svn(path):
                        yield item

    def _build_entries(self):
        entries = list()

        rev = 0
        for path, isfile, dir_rev in self._walk_svn(self.path):
            if isfile:
                entries.append((path, 'file'))
            else:
                entries.append((path, 'dir'))
                rev = max(rev, dir_rev)

        self._entries = entries
        self._revision = rev

    def get_entries(self):
        if self._entries is None:
            self._build_entries()
        return self._entries

    def get_revision(self):
        if self._revision is None:
            self._build_entries()
        return self._revision

    def get_externals(self):
        prop_files = [['.svn', 'dir-prop-base'],
                      ['.svn', 'dir-props']]
        externals = []

        for dirname in self.iter_dirs():
            prop_file = None
            for rel_parts in prop_files:
                filename = joinpath(dirname, *rel_parts)
                if os.path.isfile(filename):
                    prop_file = filename

            if prop_file is not None:
                ext_prop = parse_prop_file(prop_file, 'svn:externals')
                #ext_prop should be utf-8 coming from svn:externals
                ext_prop = decode_as_string(ext_prop, encoding="utf-8")
                externals.extend(parse_external_prop(ext_prop))

        return externals


def svn_finder(dirname=''):
    #combined externals due to common interface
    #combined externals and entries due to lack of dir_props in 1.7
    info = SvnInfo.load(dirname)
    for path in info.iter_files():
        yield path

    for path in info.iter_externals():
        sub_info = SvnInfo.load(path)
        for sub_path in sub_info.iter_files():
            yield sub_path


class SVNEntriesFile(object):
    def __init__(self, data):
        self.data = data

    @classmethod
    def load(class_, base):
        filename = os.path.join(base, '.svn', 'entries')
        f = open(filename)
        try:
            result = SVNEntriesFile.read(f)
        finally:
            f.close()
        return result

    @classmethod
    def read(class_, fileobj):
        data = fileobj.read()
        is_xml = data.startswith('<?xml')
        class_ = [SVNEntriesFileText, SVNEntriesFileXML][is_xml]
        return class_(data)

    def parse_revision(self):
        all_revs = self.parse_revision_numbers() + [0]
        return max(all_revs)


class SVNEntriesFileText(SVNEntriesFile):
    known_svn_versions = {
        '1.4.x': 8,
        '1.5.x': 9,
        '1.6.x': 10,
    }

    def __get_cached_sections(self):
        return self.sections

    def get_sections(self):
        SECTION_DIVIDER = '\f\n'
        sections = self.data.split(SECTION_DIVIDER)
        sections = [x for x in map(str.splitlines, sections)]
        try:
            # remove the SVN version number from the first line
            svn_version = int(sections[0].pop(0))
            if not svn_version in self.known_svn_versions.values():
                log.warn("Unknown subversion verson %d", svn_version)
        except ValueError:
            return
        self.sections = sections
        self.get_sections = self.__get_cached_sections
        return self.sections

    def is_valid(self):
        return bool(self.get_sections())

    def get_url(self):
        return self.get_sections()[0][4]

    def parse_revision_numbers(self):
        revision_line_number = 9
        rev_numbers = [
            int(section[revision_line_number])
            for section in self.get_sections()
            if (len(section) > revision_line_number
                and section[revision_line_number])
        ]
        return rev_numbers

    def get_undeleted_records(self):
        undeleted = lambda s: s and s[0] and (len(s) < 6 or s[5] != 'delete')
        result = [
            section[0]
            for section in self.get_sections()
            if undeleted(section)
        ]
        return result


class SVNEntriesFileXML(SVNEntriesFile):
    def is_valid(self):
        return True

    def get_url(self):
        "Get repository URL"
        urlre = re.compile('url="([^"]+)"')
        return urlre.search(self.data).group(1)

    def parse_revision_numbers(self):
        revre = re.compile(r'committed-rev="(\d+)"')
        return [
            int(m.group(1))
            for m in revre.finditer(self.data)
        ]

    def get_undeleted_records(self):
        entries_pattern = \
            re.compile(r'name="([^"]+)"(?![^>]+deleted="true")', re.I)
        results = [
            unescape(match.group(1))
            for match in entries_pattern.finditer(self.data)
        ]
        return results


if __name__ == '__main__':
    for name in svn_finder(sys.argv[1]):
        print(name)
site-packages/setuptools/archive_util.py000064400000014711151733464070014553 0ustar00"""Utilities for extracting common archive formats"""


__all__ = [
    "unpack_archive", "unpack_zipfile", "unpack_tarfile", "default_filter",
    "UnrecognizedFormat", "extraction_drivers", "unpack_directory",
]

import zipfile, tarfile, os, shutil, posixpath
from pkg_resources import ensure_directory
from distutils.errors import DistutilsError

class UnrecognizedFormat(DistutilsError):
    """Couldn't recognize the archive type"""

def default_filter(src,dst):
    """The default progress/filter callback; returns True for all files"""   
    return dst























def unpack_archive(filename, extract_dir, progress_filter=default_filter,
    drivers=None
):
    """Unpack `filename` to `extract_dir`, or raise ``UnrecognizedFormat``

    `progress_filter` is a function taking two arguments: a source path
    internal to the archive ('/'-separated), and a filesystem path where it
    will be extracted.  The callback must return the desired extract path
    (which may be the same as the one passed in), or else ``None`` to skip
    that file or directory.  The callback can thus be used to report on the
    progress of the extraction, as well as to filter the items extracted or
    alter their extraction paths.

    `drivers`, if supplied, must be a non-empty sequence of functions with the
    same signature as this function (minus the `drivers` argument), that raise
    ``UnrecognizedFormat`` if they do not support extracting the designated
    archive type.  The `drivers` are tried in sequence until one is found that
    does not raise an error, or until all are exhausted (in which case
    ``UnrecognizedFormat`` is raised).  If you do not supply a sequence of
    drivers, the module's ``extraction_drivers`` constant will be used, which
    means that ``unpack_zipfile`` and ``unpack_tarfile`` will be tried, in that
    order.
    """
    for driver in drivers or extraction_drivers:
        try:
            driver(filename, extract_dir, progress_filter)
        except UnrecognizedFormat:
            continue
        else:
            return
    else:
        raise UnrecognizedFormat(
            "Not a recognized archive type: %s" % filename
        )







def unpack_directory(filename, extract_dir, progress_filter=default_filter):
    """"Unpack" a directory, using the same interface as for archives

    Raises ``UnrecognizedFormat`` if `filename` is not a directory
    """
    if not os.path.isdir(filename):
        raise UnrecognizedFormat("%s is not a directory" % (filename,))

    paths = {filename:('',extract_dir)}
    for base, dirs, files in os.walk(filename):
        src,dst = paths[base]
        for d in dirs:
            paths[os.path.join(base,d)] = src+d+'/', os.path.join(dst,d)
        for f in files:
            name = src+f
            target = os.path.join(dst,f)
            target = progress_filter(src+f, target)
            if not target:
                continue    # skip non-files
            ensure_directory(target)
            f = os.path.join(base,f)
            shutil.copyfile(f, target)
            shutil.copystat(f, target)


















def unpack_zipfile(filename, extract_dir, progress_filter=default_filter):
    """Unpack zip `filename` to `extract_dir`

    Raises ``UnrecognizedFormat`` if `filename` is not a zipfile (as determined
    by ``zipfile.is_zipfile()``).  See ``unpack_archive()`` for an explanation
    of the `progress_filter` argument.
    """

    if not zipfile.is_zipfile(filename):
        raise UnrecognizedFormat("%s is not a zip file" % (filename,))

    z = zipfile.ZipFile(filename)
    try:
        for info in z.infolist():
            name = info.filename

            # don't extract absolute paths or ones with .. in them
            if name.startswith('/') or '..' in name.split('/'):
                continue

            target = os.path.join(extract_dir, *name.split('/'))
            target = progress_filter(name, target)
            if not target:
                continue
            if name.endswith('/'):
                # directory
                ensure_directory(target)
            else:
                # file
                ensure_directory(target)
                data = z.read(info.filename)
                f = open(target,'wb')
                try:
                    f.write(data)
                finally:
                    f.close()
                    del data
            unix_attributes = info.external_attr >> 16
            if unix_attributes:
                os.chmod(target, unix_attributes)
    finally:
        z.close()


def unpack_tarfile(filename, extract_dir, progress_filter=default_filter):
    """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir`

    Raises ``UnrecognizedFormat`` if `filename` is not a tarfile (as determined
    by ``tarfile.open()``).  See ``unpack_archive()`` for an explanation
    of the `progress_filter` argument.
    """
    try:
        tarobj = tarfile.open(filename)
    except tarfile.TarError:
        raise UnrecognizedFormat(
            "%s is not a compressed or uncompressed tar file" % (filename,)
        )
    try:
        tarobj.chown = lambda *args: None   # don't do any chowning!
        for member in tarobj:
            name = member.name
            # don't extract absolute paths or ones with .. in them
            if not name.startswith('/') and '..' not in name.split('/'):
                prelim_dst = os.path.join(extract_dir, *name.split('/'))

                # resolve any links and to extract the link targets as normal files
                while member is not None and (member.islnk() or member.issym()):
                    linkpath = member.linkname
                    if member.issym():
                        linkpath = posixpath.join(posixpath.dirname(member.name), linkpath)
                        linkpath = posixpath.normpath(linkpath)
                    member = tarobj._getmember(linkpath)

                if member is not None and (member.isfile() or member.isdir()):
                    final_dst = progress_filter(name, prelim_dst)
                    if final_dst:
                        if final_dst.endswith(os.sep):
                            final_dst = final_dst[:-1]
                        try:
                            tarobj._extract_member(member, final_dst)  # XXX Ugh
                        except tarfile.ExtractError:
                            pass    # chown/chmod/mkfifo/mknode/makedev failed
        return True
    finally:
        tarobj.close()

extraction_drivers = unpack_directory, unpack_zipfile, unpack_tarfile
site-packages/setuptools/sandbox.py000064400000023412151733464070013531 0ustar00import os
import sys
import tempfile
import operator
import functools
import itertools
import re

import pkg_resources

if os.name == "java":
    import org.python.modules.posix.PosixModule as _os
else:
    _os = sys.modules[os.name]
try:
    _file = file
except NameError:
    _file = None
_open = open
from distutils.errors import DistutilsError
from pkg_resources import working_set

from setuptools.compat import builtins, execfile

__all__ = [
    "AbstractSandbox", "DirectorySandbox", "SandboxViolation", "run_setup",
]

def run_setup(setup_script, args):
    """Run a distutils setup script, sandboxed in its directory"""
    old_dir = os.getcwd()
    save_argv = sys.argv[:]
    save_path = sys.path[:]
    setup_dir = os.path.abspath(os.path.dirname(setup_script))
    temp_dir = os.path.join(setup_dir,'temp')
    if not os.path.isdir(temp_dir): os.makedirs(temp_dir)
    save_tmp = tempfile.tempdir
    save_modules = sys.modules.copy()
    pr_state = pkg_resources.__getstate__()
    try:
        tempfile.tempdir = temp_dir
        os.chdir(setup_dir)
        try:
            sys.argv[:] = [setup_script]+list(args)
            sys.path.insert(0, setup_dir)
            # reset to include setup dir, w/clean callback list
            working_set.__init__()
            working_set.callbacks.append(lambda dist:dist.activate())
            DirectorySandbox(setup_dir).run(
                lambda: execfile(
                    "setup.py",
                    {'__file__':setup_script, '__name__':'__main__'}
                )
            )
        except SystemExit:
            v = sys.exc_info()[1]
            if v.args and v.args[0]:
                raise
            # Normal exit, just return
    finally:
        pkg_resources.__setstate__(pr_state)
        sys.modules.update(save_modules)
        # remove any modules imported within the sandbox
        del_modules = [
            mod_name for mod_name in sys.modules
            if mod_name not in save_modules
            # exclude any encodings modules. See #285
            and not mod_name.startswith('encodings.')
        ]
        list(map(sys.modules.__delitem__, del_modules))
        os.chdir(old_dir)
        sys.path[:] = save_path
        sys.argv[:] = save_argv
        tempfile.tempdir = save_tmp


class AbstractSandbox:
    """Wrap 'os' module and 'open()' builtin for virtualizing setup scripts"""

    _active = False

    def __init__(self):
        self._attrs = [
            name for name in dir(_os)
                if not name.startswith('_') and hasattr(self,name)
        ]

    def _copy(self, source):
        for name in self._attrs:
            setattr(os, name, getattr(source,name))

    def run(self, func):
        """Run 'func' under os sandboxing"""
        try:
            self._copy(self)
            if _file:
                builtins.file = self._file
            builtins.open = self._open
            self._active = True
            return func()
        finally:
            self._active = False
            if _file:
                builtins.file = _file
            builtins.open = _open
            self._copy(_os)

    def _mk_dual_path_wrapper(name):
        original = getattr(_os,name)
        def wrap(self,src,dst,*args,**kw):
            if self._active:
                src,dst = self._remap_pair(name,src,dst,*args,**kw)
            return original(src,dst,*args,**kw)
        return wrap

    for name in ["rename", "link", "symlink"]:
        if hasattr(_os,name): locals()[name] = _mk_dual_path_wrapper(name)

    def _mk_single_path_wrapper(name, original=None):
        original = original or getattr(_os,name)
        def wrap(self,path,*args,**kw):
            if self._active:
                path = self._remap_input(name,path,*args,**kw)
            return original(path,*args,**kw)
        return wrap

    if _file:
        _file = _mk_single_path_wrapper('file', _file)
    _open = _mk_single_path_wrapper('open', _open)
    for name in [
        "stat", "listdir", "chdir", "open", "chmod", "chown", "mkdir",
        "remove", "unlink", "rmdir", "utime", "lchown", "chroot", "lstat",
        "startfile", "mkfifo", "mknod", "pathconf", "access"
    ]:
        if hasattr(_os,name): locals()[name] = _mk_single_path_wrapper(name)

    def _mk_single_with_return(name):
        original = getattr(_os,name)
        def wrap(self,path,*args,**kw):
            if self._active:
                path = self._remap_input(name,path,*args,**kw)
                return self._remap_output(name, original(path,*args,**kw))
            return original(path,*args,**kw)
        return wrap

    for name in ['readlink', 'tempnam']:
        if hasattr(_os,name): locals()[name] = _mk_single_with_return(name)

    def _mk_query(name):
        original = getattr(_os,name)
        def wrap(self,*args,**kw):
            retval = original(*args,**kw)
            if self._active:
                return self._remap_output(name, retval)
            return retval
        return wrap

    for name in ['getcwd', 'tmpnam']:
        if hasattr(_os,name): locals()[name] = _mk_query(name)

    def _validate_path(self,path):
        """Called to remap or validate any path, whether input or output"""
        return path

    def _remap_input(self,operation,path,*args,**kw):
        """Called for path inputs"""
        return self._validate_path(path)

    def _remap_output(self,operation,path):
        """Called for path outputs"""
        return self._validate_path(path)

    def _remap_pair(self,operation,src,dst,*args,**kw):
        """Called for path pairs like rename, link, and symlink operations"""
        return (
            self._remap_input(operation+'-from',src,*args,**kw),
            self._remap_input(operation+'-to',dst,*args,**kw)
        )


if hasattr(os, 'devnull'):
    _EXCEPTIONS = [os.devnull,]
else:
    _EXCEPTIONS = []

try:
    from win32com.client.gencache import GetGeneratePath
    _EXCEPTIONS.append(GetGeneratePath())
    del GetGeneratePath
except ImportError:
    # it appears pywin32 is not installed, so no need to exclude.
    pass

class DirectorySandbox(AbstractSandbox):
    """Restrict operations to a single subdirectory - pseudo-chroot"""

    write_ops = dict.fromkeys([
        "open", "chmod", "chown", "mkdir", "remove", "unlink", "rmdir",
        "utime", "lchown", "chroot", "mkfifo", "mknod", "tempnam",
    ])

    _exception_patterns = [
        # Allow lib2to3 to attempt to save a pickled grammar object (#121)
        '.*lib2to3.*\.pickle$',
    ]
    "exempt writing to paths that match the pattern"

    def __init__(self, sandbox, exceptions=_EXCEPTIONS):
        self._sandbox = os.path.normcase(os.path.realpath(sandbox))
        self._prefix = os.path.join(self._sandbox,'')
        self._exceptions = [
            os.path.normcase(os.path.realpath(path))
            for path in exceptions
        ]
        AbstractSandbox.__init__(self)

    def _violation(self, operation, *args, **kw):
        raise SandboxViolation(operation, args, kw)

    if _file:
        def _file(self, path, mode='r', *args, **kw):
            if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path):
                self._violation("file", path, mode, *args, **kw)
            return _file(path,mode,*args,**kw)

    def _open(self, path, mode='r', *args, **kw):
        if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path):
            self._violation("open", path, mode, *args, **kw)
        return _open(path,mode,*args,**kw)

    def tmpnam(self):
        self._violation("tmpnam")

    def _ok(self, path):
        active = self._active
        try:
            self._active = False
            realpath = os.path.normcase(os.path.realpath(path))
            return (
                self._exempted(realpath)
                or realpath == self._sandbox
                or realpath.startswith(self._prefix)
            )
        finally:
            self._active = active

    def _exempted(self, filepath):
        start_matches = (
            filepath.startswith(exception)
            for exception in self._exceptions
        )
        pattern_matches = (
            re.match(pattern, filepath)
            for pattern in self._exception_patterns
        )
        candidates = itertools.chain(start_matches, pattern_matches)
        return any(candidates)

    def _remap_input(self, operation, path, *args, **kw):
        """Called for path inputs"""
        if operation in self.write_ops and not self._ok(path):
            self._violation(operation, os.path.realpath(path), *args, **kw)
        return path

    def _remap_pair(self, operation, src, dst, *args, **kw):
        """Called for path pairs like rename, link, and symlink operations"""
        if not self._ok(src) or not self._ok(dst):
            self._violation(operation, src, dst, *args, **kw)
        return (src,dst)

    def open(self, file, flags, mode=0x1FF, *args, **kw):    # 0777
        """Called for low-level os.open()"""
        if flags & WRITE_FLAGS and not self._ok(file):
            self._violation("os.open", file, flags, mode, *args, **kw)
        return _os.open(file,flags,mode, *args, **kw)

WRITE_FLAGS = functools.reduce(
    operator.or_, [getattr(_os, a, 0) for a in
        "O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC O_TEMPORARY".split()]
)

class SandboxViolation(DistutilsError):
    """A setup script attempted to modify the filesystem outside the sandbox"""

    def __str__(self):
        return """SandboxViolation: %s%r %s

The package setup script has attempted to modify files on your system
that are not within the EasyInstall build area, and has been aborted.

This package cannot be safely installed by EasyInstall, and may not
support alternate installation locations even if you run its setup
script by hand.  Please inform the package's author and the EasyInstall
maintainers to find out if a fix or workaround is available.""" % self.args



























#
site-packages/setuptools/script template.py000064400000000243151733464070015170 0ustar00# EASY-INSTALL-SCRIPT: %(spec)r,%(script_name)r
__requires__ = """%(spec)r"""
import pkg_resources
pkg_resources.run_script("""%(spec)r""", """%(script_name)r""")
site-packages/setuptools/__init__.py000064400000006365151733464070013642 0ustar00"""Extensions to the 'distutils' for large or complex distributions"""

import os
import sys
import distutils.core
import distutils.filelist
from distutils.core import Command as _Command
from distutils.util import convert_path

import setuptools.version
from setuptools.extension import Extension
from setuptools.dist import Distribution, Feature, _get_unpatched
from setuptools.depends import Require

__all__ = [
    'setup', 'Distribution', 'Feature', 'Command', 'Extension', 'Require',
    'find_packages'
]

__version__ = setuptools.version.__version__

bootstrap_install_from = None

# If we run 2to3 on .py files, should we also convert docstrings?
# Default: yes; assume that we can detect doctests reliably
run_2to3_on_doctests = True
# Standard package names for fixer packages
lib2to3_fixer_packages = ['lib2to3.fixes']

def find_packages(where='.', exclude=()):
    """Return a list all Python packages found within directory 'where'

    'where' should be supplied as a "cross-platform" (i.e. URL-style) path; it
    will be converted to the appropriate local path syntax.  'exclude' is a
    sequence of package names to exclude; '*' can be used as a wildcard in the
    names, such that 'foo.*' will exclude all subpackages of 'foo' (but not
    'foo' itself).
    """
    out = []
    stack=[(convert_path(where), '')]
    while stack:
        where,prefix = stack.pop(0)
        for name in os.listdir(where):
            fn = os.path.join(where,name)
            looks_like_package = (
                '.' not in name
                and os.path.isdir(fn)
                and os.path.isfile(os.path.join(fn, '__init__.py'))
            )
            if looks_like_package:
                out.append(prefix+name)
                stack.append((fn, prefix+name+'.'))
    for pat in list(exclude)+['ez_setup']:
        from fnmatch import fnmatchcase
        out = [item for item in out if not fnmatchcase(item,pat)]
    return out

setup = distutils.core.setup

_Command = _get_unpatched(_Command)

class Command(_Command):
    __doc__ = _Command.__doc__

    command_consumes_arguments = False

    def __init__(self, dist, **kw):
        # Add support for keyword arguments
        _Command.__init__(self,dist)
        for k,v in kw.items():
            setattr(self,k,v)

    def reinitialize_command(self, command, reinit_subcommands=0, **kw):
        cmd = _Command.reinitialize_command(self, command, reinit_subcommands)
        for k,v in kw.items():
            setattr(cmd,k,v)    # update command with keywords
        return cmd

distutils.core.Command = Command    # we can't patch distutils.cmd, alas

def findall(dir = os.curdir):
    """Find all files under 'dir' and return the list of full filenames
    (relative to 'dir').
    """
    all_files = []
    for base, dirs, files in os.walk(dir):
        if base==os.curdir or base.startswith(os.curdir+os.sep):
            base = base[2:]
        if base:
            files = [os.path.join(base, f) for f in files]
        all_files.extend(filter(os.path.isfile, files))
    return all_files

distutils.filelist.findall = findall    # fix findall bug in distutils.

# sys.dont_write_bytecode was introduced in Python 2.6.
_dont_write_bytecode = getattr(sys, 'dont_write_bytecode',
    bool(os.environ.get("PYTHONDONTWRITEBYTECODE")))
site-packages/setuptools/site-patch.py000064400000004562151733464070014141 0ustar00def __boot():
    import sys, os, os.path
    PYTHONPATH = os.environ.get('PYTHONPATH')
    if PYTHONPATH is None or (sys.platform=='win32' and not PYTHONPATH):
        PYTHONPATH = []
    else:
        PYTHONPATH = PYTHONPATH.split(os.pathsep)

    pic = getattr(sys,'path_importer_cache',{})
    stdpath = sys.path[len(PYTHONPATH):]
    mydir = os.path.dirname(__file__)
    #print "searching",stdpath,sys.path

    for item in stdpath:
        if item==mydir or not item:
            continue    # skip if current dir. on Windows, or my own directory
        importer = pic.get(item)
        if importer is not None:
            loader = importer.find_module('site')
            if loader is not None:
                # This should actually reload the current module
                loader.load_module('site')
                break
        else:
            try:
                import imp # Avoid import loop in Python >= 3.3
                stream, path, descr = imp.find_module('site',[item])
            except ImportError:
                continue
            if stream is None:
                continue
            try:
                # This should actually reload the current module
                imp.load_module('site',stream,path,descr)
            finally:
                stream.close()
            break
    else:
        raise ImportError("Couldn't find the real 'site' module")

    #print "loaded", __file__

    known_paths = dict([(makepath(item)[1],1) for item in sys.path]) # 2.2 comp

    oldpos = getattr(sys,'__egginsert',0)   # save old insertion position
    sys.__egginsert = 0                     # and reset the current one

    for item in PYTHONPATH:
        addsitedir(item)

    sys.__egginsert += oldpos           # restore effective old position
    
    d,nd = makepath(stdpath[0])
    insert_at = None
    new_path = []

    for item in sys.path:
        p,np = makepath(item)

        if np==nd and insert_at is None:
            # We've hit the first 'system' path entry, so added entries go here
            insert_at = len(new_path)

        if np in known_paths or insert_at is None:
            new_path.append(item)
        else:
            # new path after the insert point, back-insert it
            new_path.insert(insert_at, item)
            insert_at += 1
            
    sys.path[:] = new_path

if __name__=='site':    
    __boot()
    del __boot
    







site-packages/setuptools/depends.py000064400000014115151733464070013515 0ustar00from __future__ import generators
import sys, imp, marshal
from imp import PKG_DIRECTORY, PY_COMPILED, PY_SOURCE, PY_FROZEN
from distutils.version import StrictVersion, LooseVersion

__all__ = [
    'Require', 'find_module', 'get_module_constant', 'extract_constant'
]

class Require:
    """A prerequisite to building or installing a distribution"""

    def __init__(self,name,requested_version,module,homepage='',
        attribute=None,format=None
    ):

        if format is None and requested_version is not None:
            format = StrictVersion

        if format is not None:
            requested_version = format(requested_version)
            if attribute is None:
                attribute = '__version__'

        self.__dict__.update(locals())
        del self.self


    def full_name(self):
        """Return full package/distribution name, w/version"""
        if self.requested_version is not None:
            return '%s-%s' % (self.name,self.requested_version)
        return self.name


    def version_ok(self,version):
        """Is 'version' sufficiently up-to-date?"""
        return self.attribute is None or self.format is None or \
            str(version) != "unknown" and version >= self.requested_version


    def get_version(self, paths=None, default="unknown"):

        """Get version number of installed module, 'None', or 'default'

        Search 'paths' for module.  If not found, return 'None'.  If found,
        return the extracted version attribute, or 'default' if no version
        attribute was specified, or the value cannot be determined without
        importing the module.  The version is formatted according to the
        requirement's version format (if any), unless it is 'None' or the
        supplied 'default'.
        """

        if self.attribute is None:
            try:
                f,p,i = find_module(self.module,paths)
                if f: f.close()
                return default
            except ImportError:
                return None

        v = get_module_constant(self.module,self.attribute,default,paths)

        if v is not None and v is not default and self.format is not None:
            return self.format(v)

        return v


    def is_present(self,paths=None):
        """Return true if dependency is present on 'paths'"""
        return self.get_version(paths) is not None


    def is_current(self,paths=None):
        """Return true if dependency is present and up-to-date on 'paths'"""
        version = self.get_version(paths)
        if version is None:
            return False
        return self.version_ok(version)


def _iter_code(code):

    """Yield '(op,arg)' pair for each operation in code object 'code'"""

    from array import array
    from dis import HAVE_ARGUMENT, EXTENDED_ARG

    bytes = array('b',code.co_code)
    eof = len(code.co_code)

    ptr = 0
    extended_arg = 0

    while ptr<eof:

        op = bytes[ptr]

        if op>=HAVE_ARGUMENT:

            arg = bytes[ptr+1] + bytes[ptr+2]*256 + extended_arg
            ptr += 3

            if op==EXTENDED_ARG:
                extended_arg = arg * long_type(65536)
                continue

        else:
            arg = None
            ptr += 1

        yield op,arg










def find_module(module, paths=None):
    """Just like 'imp.find_module()', but with package support"""

    parts = module.split('.')

    while parts:
        part = parts.pop(0)
        f, path, (suffix,mode,kind) = info = imp.find_module(part, paths)

        if kind==PKG_DIRECTORY:
            parts = parts or ['__init__']
            paths = [path]

        elif parts:
            raise ImportError("Can't find %r in %s" % (parts,module))

    return info
























def get_module_constant(module, symbol, default=-1, paths=None):

    """Find 'module' by searching 'paths', and extract 'symbol'

    Return 'None' if 'module' does not exist on 'paths', or it does not define
    'symbol'.  If the module defines 'symbol' as a constant, return the
    constant.  Otherwise, return 'default'."""

    try:
        f, path, (suffix,mode,kind) = find_module(module,paths)
    except ImportError:
        # Module doesn't exist
        return None

    try:
        if kind==PY_COMPILED:
            f.read(8)   # skip magic & date
            code = marshal.load(f)
        elif kind==PY_FROZEN:
            code = imp.get_frozen_object(module)
        elif kind==PY_SOURCE:
            code = compile(f.read(), path, 'exec')
        else:
            # Not something we can parse; we'll have to import it.  :(
            if module not in sys.modules:
                imp.load_module(module,f,path,(suffix,mode,kind))
            return getattr(sys.modules[module],symbol,None)

    finally:
        if f:
            f.close()

    return extract_constant(code,symbol,default)








def extract_constant(code,symbol,default=-1):
    """Extract the constant value of 'symbol' from 'code'

    If the name 'symbol' is bound to a constant value by the Python code
    object 'code', return that value.  If 'symbol' is bound to an expression,
    return 'default'.  Otherwise, return 'None'.

    Return value is based on the first assignment to 'symbol'.  'symbol' must
    be a global, or at least a non-"fast" local in the code block.  That is,
    only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol'
    must be present in 'code.co_names'.
    """

    if symbol not in code.co_names:
        # name's not there, can't possibly be an assigment
        return None

    name_idx = list(code.co_names).index(symbol)

    STORE_NAME = 90
    STORE_GLOBAL = 97
    LOAD_CONST = 100

    const = default

    for op, arg in _iter_code(code):

        if op==LOAD_CONST:
            const = code.co_consts[arg]
        elif arg==name_idx and (op==STORE_NAME or op==STORE_GLOBAL):
            return const
        else:
            const = default
            
if sys.platform.startswith('java') or sys.platform == 'cli':
    # XXX it'd be better to test assertions about bytecode instead...
    del extract_constant, get_module_constant
    __all__.remove('extract_constant')
    __all__.remove('get_module_constant')


site-packages/setuptools/dist.py000064400000077444151733464070013054 0ustar00__all__ = ['Distribution']

import re
import os
import sys
import warnings
import distutils.log
import distutils.core
import distutils.cmd
from distutils.core import Distribution as _Distribution
from distutils.errors import (DistutilsOptionError, DistutilsPlatformError,
    DistutilsSetupError)

from setuptools.depends import Require
from setuptools.compat import numeric_types, basestring
import pkg_resources

def _get_unpatched(cls):
    """Protect against re-patching the distutils if reloaded

    Also ensures that no other distutils extension monkeypatched the distutils
    first.
    """
    while cls.__module__.startswith('setuptools'):
        cls, = cls.__bases__
    if not cls.__module__.startswith('distutils'):
        raise AssertionError(
            "distutils has already been patched by %r" % cls
        )
    return cls

_Distribution = _get_unpatched(_Distribution)

sequence = tuple, list

def check_importable(dist, attr, value):
    try:
        ep = pkg_resources.EntryPoint.parse('x='+value)
        assert not ep.extras
    except (TypeError,ValueError,AttributeError,AssertionError):
        raise DistutilsSetupError(
            "%r must be importable 'module:attrs' string (got %r)"
            % (attr,value)
        )


def assert_string_list(dist, attr, value):
    """Verify that value is a string list or None"""
    try:
        assert ''.join(value)!=value
    except (TypeError,ValueError,AttributeError,AssertionError):
        raise DistutilsSetupError(
            "%r must be a list of strings (got %r)" % (attr,value)
        )
def check_nsp(dist, attr, value):
    """Verify that namespace packages are valid"""
    assert_string_list(dist,attr,value)
    for nsp in value:
        if not dist.has_contents_for(nsp):
            raise DistutilsSetupError(
                "Distribution contains no modules or packages for " +
                "namespace package %r" % nsp
            )
        if '.' in nsp:
            parent = '.'.join(nsp.split('.')[:-1])
            if parent not in value:
                distutils.log.warn(
                    "WARNING: %r is declared as a package namespace, but %r"
                    " is not: please correct this in setup.py", nsp, parent
                )

def check_extras(dist, attr, value):
    """Verify that extras_require mapping is valid"""
    try:
        for k,v in value.items():
            if ':' in k:
                k,m = k.split(':',1)
                if pkg_resources.invalid_marker(m):
                    raise DistutilsSetupError("Invalid environment marker: "+m)
            list(pkg_resources.parse_requirements(v))
    except (TypeError,ValueError,AttributeError):
        raise DistutilsSetupError(
            "'extras_require' must be a dictionary whose values are "
            "strings or lists of strings containing valid project/version "
            "requirement specifiers."
        )

def assert_bool(dist, attr, value):
    """Verify that value is True, False, 0, or 1"""
    if bool(value) != value:
        raise DistutilsSetupError(
            "%r must be a boolean value (got %r)" % (attr,value)
        )
def check_requirements(dist, attr, value):
    """Verify that install_requires is a valid requirements list"""
    try:
        list(pkg_resources.parse_requirements(value))
    except (TypeError,ValueError):
        raise DistutilsSetupError(
            "%r must be a string or list of strings "
            "containing valid project/version requirement specifiers" % (attr,)
        )
def check_entry_points(dist, attr, value):
    """Verify that entry_points map is parseable"""
    try:
        pkg_resources.EntryPoint.parse_map(value)
    except ValueError:
        e = sys.exc_info()[1]
        raise DistutilsSetupError(e)

def check_test_suite(dist, attr, value):
    if not isinstance(value,basestring):
        raise DistutilsSetupError("test_suite must be a string")

def check_package_data(dist, attr, value):
    """Verify that value is a dictionary of package names to glob lists"""
    if isinstance(value,dict):
        for k,v in value.items():
            if not isinstance(k,str): break
            try: iter(v)
            except TypeError:
                break
        else:
            return
    raise DistutilsSetupError(
        attr+" must be a dictionary mapping package names to lists of "
        "wildcard patterns"
    )

def check_packages(dist, attr, value):
    for pkgname in value:
        if not re.match(r'\w+(\.\w+)*', pkgname):
            distutils.log.warn(
                "WARNING: %r not a valid package name; please use only"
                ".-separated package names in setup.py", pkgname
            )


class Distribution(_Distribution):
    """Distribution with support for features, 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.

     'features' **deprecated** -- a dictionary mapping option names to
        'setuptools.Feature'
        objects.  Features are a portion of the distribution that can be
        included or excluded based on user options, inter-feature dependencies,
        and availability on the current system.  Excluded features are omitted
        from all setup commands, including source and binary distributions, so
        you can create multiple distributions from the same source tree.
        Feature names should be valid Python identifiers, except that they may
        contain the '-' (minus) sign.  Features can be included or excluded
        via the command line options '--with-X' and '--without-X', where 'X' is
        the name of the feature.  Whether a feature is included by default, and
        whether you are allowed to control this from the command line, is
        determined by the Feature object.  See the 'Feature' class for more
        information.

     '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.  They are used by the feature subsystem to configure the
    distribution for the included and excluded features.
    """

    _patched_dist = None

    def patch_missing_pkg_info(self, attrs):
        # Fake up a replacement for the data that would normally come from
        # PKG-INFO, but which might not yet be built if this is a fresh
        # checkout.
        #
        if not attrs or 'name' not in attrs or 'version' not in attrs:
            return
        key = pkg_resources.safe_name(str(attrs['name'])).lower()
        dist = pkg_resources.working_set.by_key.get(key)
        if dist is not None and not dist.has_metadata('PKG-INFO'):
            dist._version = pkg_resources.safe_version(str(attrs['version']))
            self._patched_dist = dist

    def __init__(self, attrs=None):
        have_package_data = hasattr(self, "package_data")
        if not have_package_data:
            self.package_data = {}
        _attrs_dict = attrs or {}
        if 'features' in _attrs_dict or 'require_features' in _attrs_dict:
            Feature.warn_deprecated()
        self.require_features = []
        self.features = {}
        self.dist_files = []
        self.src_root = attrs and attrs.pop("src_root", None)
        self.patch_missing_pkg_info(attrs)
        # Make sure we have any eggs needed to interpret 'attrs'
        if attrs is not None:
            self.dependency_links = attrs.pop('dependency_links', [])
            assert_string_list(self,'dependency_links',self.dependency_links)
        if attrs and 'setup_requires' in attrs:
            self.fetch_build_eggs(attrs.pop('setup_requires'))
        for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'):
            if not hasattr(self,ep.name):
                setattr(self,ep.name,None)
        _Distribution.__init__(self,attrs)
        if isinstance(self.metadata.version, numeric_types):
            # Some people apparently take "version number" too literally :)
            self.metadata.version = str(self.metadata.version)

    def parse_command_line(self):
        """Process features after parsing command line options"""
        result = _Distribution.parse_command_line(self)
        if self.features:
            self._finalize_features()
        return result

    def _feature_attrname(self,name):
        """Convert feature name to corresponding option attribute name"""
        return 'with_'+name.replace('-','_')

    def fetch_build_eggs(self, requires):
        """Resolve pre-setup requirements"""
        from pkg_resources import working_set, parse_requirements
        for dist in working_set.resolve(
            parse_requirements(requires), installer=self.fetch_build_egg
        ):
            working_set.add(dist)

    def finalize_options(self):
        _Distribution.finalize_options(self)
        if self.features:
            self._set_global_opts_from_features()

        for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'):
            value = getattr(self,ep.name,None)
            if value is not None:
                ep.require(installer=self.fetch_build_egg)
                ep.load()(self, ep.name, value)
        if getattr(self, 'convert_2to3_doctests', None):
            # XXX may convert to set here when we can rely on set being builtin
            self.convert_2to3_doctests = [os.path.abspath(p) for p in self.convert_2to3_doctests]
        else:
            self.convert_2to3_doctests = []

    def fetch_build_egg(self, req):
        """Fetch an egg needed for building"""

        try:
            cmd = self._egg_fetcher
            cmd.package_index.to_scan = []
        except AttributeError:
            from setuptools.command.easy_install import easy_install
            dist = self.__class__({'script_args':['easy_install']})
            dist.parse_config_files()
            opts = dist.get_option_dict('easy_install')
            keep = (
                'find_links', 'site_dirs', 'index_url', 'optimize',
                'site_dirs', 'allow_hosts'
            )
            for key in opts.keys():
                if key not in keep:
                    del opts[key]   # don't use any other settings
            if self.dependency_links:
                links = self.dependency_links[:]
                if 'find_links' in opts:
                    links = opts['find_links'][1].split() + links
                opts['find_links'] = ('setup', links)
            cmd = easy_install(
                dist, args=["x"], install_dir=os.curdir, exclude_scripts=True,
                always_copy=False, build_directory=None, editable=False,
                upgrade=False, multi_version=True, no_report=True, user=False
            )
            cmd.ensure_finalized()
            self._egg_fetcher = cmd
        return cmd.easy_install(req)

    def _set_global_opts_from_features(self):
        """Add --with-X/--without-X options based on optional features"""

        go = []
        no = self.negative_opt.copy()

        for name,feature in self.features.items():
            self._set_feature(name,None)
            feature.validate(self)

            if feature.optional:
                descr = feature.description
                incdef = ' (default)'
                excdef=''
                if not feature.include_by_default():
                    excdef, incdef = incdef, excdef

                go.append(('with-'+name, None, 'include '+descr+incdef))
                go.append(('without-'+name, None, 'exclude '+descr+excdef))
                no['without-'+name] = 'with-'+name

        self.global_options = self.feature_options = go + self.global_options
        self.negative_opt = self.feature_negopt = no

    def _finalize_features(self):
        """Add/remove features and resolve dependencies between them"""

        # First, flag all the enabled items (and thus their dependencies)
        for name,feature in self.features.items():
            enabled = self.feature_is_included(name)
            if enabled or (enabled is None and feature.include_by_default()):
                feature.include_in(self)
                self._set_feature(name,1)

        # Then disable the rest, so that off-by-default features don't
        # get flagged as errors when they're required by an enabled feature
        for name,feature in self.features.items():
            if not self.feature_is_included(name):
                feature.exclude_from(self)
                self._set_feature(name,0)

    def get_command_class(self, command):
        """Pluggable version of get_command_class()"""
        if command in self.cmdclass:
            return self.cmdclass[command]

        for ep in pkg_resources.iter_entry_points('distutils.commands',command):
            ep.require(installer=self.fetch_build_egg)
            self.cmdclass[command] = cmdclass = ep.load()
            return cmdclass
        else:
            return _Distribution.get_command_class(self, command)

    def print_commands(self):
        for ep in pkg_resources.iter_entry_points('distutils.commands'):
            if ep.name not in self.cmdclass:
                cmdclass = ep.load(False) # don't require extras, we're not running
                self.cmdclass[ep.name] = cmdclass
        return _Distribution.print_commands(self)

    def _set_feature(self,name,status):
        """Set feature's inclusion status"""
        setattr(self,self._feature_attrname(name),status)

    def feature_is_included(self,name):
        """Return 1 if feature is included, 0 if excluded, 'None' if unknown"""
        return getattr(self,self._feature_attrname(name))

    def include_feature(self,name):
        """Request inclusion of feature named 'name'"""

        if self.feature_is_included(name)==0:
            descr = self.features[name].description
            raise DistutilsOptionError(
                descr + " is required, but was excluded or is not available"
            )
        self.features[name].include_in(self)
        self._set_feature(name,1)

    def include(self,**attrs):
        """Add items to distribution that are named in keyword arguments

        For example, 'dist.exclude(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.
        """
        for k,v in attrs.items():
            include = getattr(self, '_include_'+k, None)
            if include:
                include(v)
            else:
                self._include_misc(k,v)

    def exclude_package(self,package):
        """Remove packages, modules, and extensions in named package"""

        pfx = package+'.'
        if self.packages:
            self.packages = [
                p for p in self.packages
                    if p != package and not p.startswith(pfx)
            ]

        if self.py_modules:
            self.py_modules = [
                p for p in self.py_modules
                    if p != package and not p.startswith(pfx)
            ]

        if self.ext_modules:
            self.ext_modules = [
                p for p in self.ext_modules
                    if p.name != package and not p.name.startswith(pfx)
            ]

    def has_contents_for(self,package):
        """Return true if 'exclude_package(package)' would do something"""

        pfx = package+'.'

        for p in self.iter_distribution_names():
            if p==package or p.startswith(pfx):
                return True

    def _exclude_misc(self,name,value):
        """Handle 'exclude()' for list/tuple attrs without a special handler"""
        if not isinstance(value,sequence):
            raise DistutilsSetupError(
                "%s: setting must be a list or tuple (%r)" % (name, value)
            )
        try:
            old = getattr(self,name)
        except AttributeError:
            raise DistutilsSetupError(
                "%s: No such distribution setting" % name
            )
        if old is not None and not isinstance(old,sequence):
            raise DistutilsSetupError(
                name+": this setting cannot be changed via include/exclude"
            )
        elif old:
            setattr(self,name,[item for item in old if item not in value])

    def _include_misc(self,name,value):
        """Handle 'include()' for list/tuple attrs without a special handler"""

        if not isinstance(value,sequence):
            raise DistutilsSetupError(
                "%s: setting must be a list (%r)" % (name, value)
            )
        try:
            old = getattr(self,name)
        except AttributeError:
            raise DistutilsSetupError(
                "%s: No such distribution setting" % name
            )
        if old is None:
            setattr(self,name,value)
        elif not isinstance(old,sequence):
            raise DistutilsSetupError(
                name+": this setting cannot be changed via include/exclude"
            )
        else:
            setattr(self,name,old+[item for item in value if item not in old])

    def exclude(self,**attrs):
        """Remove 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.
        """
        for k,v in attrs.items():
            exclude = getattr(self, '_exclude_'+k, None)
            if exclude:
                exclude(v)
            else:
                self._exclude_misc(k,v)

    def _exclude_packages(self,packages):
        if not isinstance(packages,sequence):
            raise DistutilsSetupError(
                "packages: setting must be a list or tuple (%r)" % (packages,)
            )
        list(map(self.exclude_package, packages))

    def _parse_command_opts(self, parser, args):
        # Remove --with-X/--without-X options when processing command args
        self.global_options = self.__class__.global_options
        self.negative_opt = self.__class__.negative_opt

        # First, expand any aliases
        command = args[0]
        aliases = self.get_option_dict('aliases')
        while command in aliases:
            src,alias = aliases[command]
            del aliases[command]    # ensure each alias can expand only once!
            import shlex
            args[:1] = shlex.split(alias,True)
            command = args[0]

        nargs = _Distribution._parse_command_opts(self, parser, args)

        # Handle commands that want to consume all remaining arguments
        cmd_class = self.get_command_class(command)
        if getattr(cmd_class,'command_consumes_arguments',None):
            self.get_option_dict(command)['args'] = ("command line", nargs)
            if nargs is not None:
                return []

        return nargs

    def get_cmdline_options(self):
        """Return 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.
        """

        d = {}

        for cmd,opts in self.command_options.items():

            for opt,(src,val) in opts.items():

                if src != "command line":
                    continue

                opt = opt.replace('_','-')

                if val==0:
                    cmdobj = self.get_command_obj(cmd)
                    neg_opt = self.negative_opt.copy()
                    neg_opt.update(getattr(cmdobj,'negative_opt',{}))
                    for neg,pos in neg_opt.items():
                        if pos==opt:
                            opt=neg
                            val=None
                            break
                    else:
                        raise AssertionError("Shouldn't be able to get here")

                elif val==1:
                    val = None

                d.setdefault(cmd,{})[opt] = val

        return d

    def iter_distribution_names(self):
        """Yield all packages, modules, and extension names in distribution"""

        for pkg in self.packages or ():
            yield pkg

        for module in self.py_modules or ():
            yield module

        for ext in self.ext_modules or ():
            if isinstance(ext,tuple):
                name, buildinfo = ext
            else:
                name = ext.name
            if name.endswith('module'):
                name = name[:-6]
            yield name

    def handle_display_options(self, option_order):
        """If 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.
        """
        import sys

        if sys.version_info < (3,) or self.help_commands:
            return _Distribution.handle_display_options(self, option_order)

        # Stdout may be StringIO (e.g. in tests)
        import io
        if not isinstance(sys.stdout, io.TextIOWrapper):
            return _Distribution.handle_display_options(self, option_order)

        # Don't wrap stdout if utf-8 is already the encoding. Provides
        #  workaround for #334.
        if sys.stdout.encoding.lower() in ('utf-8', 'utf8'):
            return _Distribution.handle_display_options(self, option_order)

        # Print metadata in UTF-8 no matter the platform
        encoding = sys.stdout.encoding
        errors = sys.stdout.errors
        newline = sys.platform != 'win32' and '\n' or None
        line_buffering = sys.stdout.line_buffering

        sys.stdout = io.TextIOWrapper(
            sys.stdout.detach(), 'utf-8', errors, newline, line_buffering)
        try:
            return _Distribution.handle_display_options(self, option_order)
        finally:
            sys.stdout = io.TextIOWrapper(
                sys.stdout.detach(), encoding, errors, newline, line_buffering)


# Install it throughout the distutils
for module in distutils.dist, distutils.core, distutils.cmd:
    module.Distribution = Distribution


class Feature:
    """
    **deprecated** -- The `Feature` facility was never completely implemented
    or supported, `has reported issues
    <https://bitbucket.org/pypa/setuptools/issue/58>`_ and will be removed in
    a future version.

    A subset of the distribution that can be excluded if unneeded/wanted

    Features are created using these keyword arguments:

      'description' -- a short, human readable description of the feature, to
         be used in error messages, and option help messages.

      'standard' -- if true, the feature is included by default if it is
         available on the current system.  Otherwise, the feature is only
         included if requested via a command line '--with-X' option, or if
         another included feature requires it.  The default setting is 'False'.

      'available' -- if true, the feature is available for installation on the
         current system.  The default setting is 'True'.

      'optional' -- if true, the feature's inclusion can be controlled from the
         command line, using the '--with-X' or '--without-X' options.  If
         false, the feature's inclusion status is determined automatically,
         based on 'availabile', 'standard', and whether any other feature
         requires it.  The default setting is 'True'.

      'require_features' -- a string or sequence of strings naming features
         that should also be included if this feature is included.  Defaults to
         empty list.  May also contain 'Require' objects that should be
         added/removed from the distribution.

      'remove' -- a string or list of strings naming packages to be removed
         from the distribution if this feature is *not* included.  If the
         feature *is* included, this argument is ignored.  This argument exists
         to support removing features that "crosscut" a distribution, such as
         defining a 'tests' feature that removes all the 'tests' subpackages
         provided by other features.  The default for this argument is an empty
         list.  (Note: the named package(s) or modules must exist in the base
         distribution when the 'setup()' function is initially called.)

      other keywords -- any other keyword arguments are saved, and passed to
         the distribution's 'include()' and 'exclude()' methods when the
         feature is included or excluded, respectively.  So, for example, you
         could pass 'packages=["a","b"]' to cause packages 'a' and 'b' to be
         added or removed from the distribution as appropriate.

    A feature must include at least one 'requires', 'remove', or other
    keyword argument.  Otherwise, it can't affect the distribution in any way.
    Note also that you can subclass 'Feature' to create your own specialized
    feature types that modify the distribution in other ways when included or
    excluded.  See the docstrings for the various methods here for more detail.
    Aside from the methods, the only feature attributes that distributions look
    at are 'description' and 'optional'.
    """

    @staticmethod
    def warn_deprecated():
        warnings.warn(
            "Features are deprecated and will be removed in a future "
                "version. See http://bitbucket.org/pypa/setuptools/65.",
            DeprecationWarning,
            stacklevel=3,
        )

    def __init__(self, description, standard=False, available=True,
            optional=True, require_features=(), remove=(), **extras):
        self.warn_deprecated()

        self.description = description
        self.standard = standard
        self.available = available
        self.optional = optional
        if isinstance(require_features,(str,Require)):
            require_features = require_features,

        self.require_features = [
            r for r in require_features if isinstance(r,str)
        ]
        er = [r for r in require_features if not isinstance(r,str)]
        if er: extras['require_features'] = er

        if isinstance(remove,str):
            remove = remove,
        self.remove = remove
        self.extras = extras

        if not remove and not require_features and not extras:
            raise DistutilsSetupError(
                "Feature %s: must define 'require_features', 'remove', or at least one"
                " of 'packages', 'py_modules', etc."
            )

    def include_by_default(self):
        """Should this feature be included by default?"""
        return self.available and self.standard

    def include_in(self,dist):

        """Ensure feature and its requirements are included in distribution

        You may override this in a subclass to perform additional operations on
        the distribution.  Note that this method may be called more than once
        per feature, and so should be idempotent.

        """

        if not self.available:
            raise DistutilsPlatformError(
                self.description+" is required,"
                "but is not available on this platform"
            )

        dist.include(**self.extras)

        for f in self.require_features:
            dist.include_feature(f)

    def exclude_from(self,dist):

        """Ensure feature is excluded from distribution

        You may override this in a subclass to perform additional operations on
        the distribution.  This method will be called at most once per
        feature, and only after all included features have been asked to
        include themselves.
        """

        dist.exclude(**self.extras)

        if self.remove:
            for item in self.remove:
                dist.exclude_package(item)

    def validate(self,dist):

        """Verify that feature makes sense in context of distribution

        This method is called by the distribution just before it parses its
        command line.  It checks to ensure that the 'remove' attribute, if any,
        contains only valid package/module names that are present in the base
        distribution when 'setup()' is called.  You may override it in a
        subclass to perform any other required validation of the feature
        against a target distribution.
        """

        for item in self.remove:
            if not dist.has_contents_for(item):
                raise DistutilsSetupError(
                    "%s wants to be able to remove %s, but the distribution"
                    " doesn't contain any packages or modules under %s"
                    % (self.description, item, item)
                )
site-packages/setuptools/extension.py000064400000002574151733464070014115 0ustar00import sys
import distutils.core
import distutils.extension

from setuptools.dist import _get_unpatched

_Extension = _get_unpatched(distutils.core.Extension)

def have_pyrex():
    """
    Return True if Cython or Pyrex can be imported.
    """
    pyrex_impls = 'Cython.Distutils.build_ext', 'Pyrex.Distutils.build_ext'
    for pyrex_impl in pyrex_impls:
        try:
            # from (pyrex_impl) import build_ext
            __import__(pyrex_impl, fromlist=['build_ext']).build_ext
            return True
        except Exception:
            pass
    return False


class Extension(_Extension):
    """Extension that uses '.c' files in place of '.pyx' files"""

    def __init__(self, *args, **kw):
        _Extension.__init__(self, *args, **kw)
        if not have_pyrex():
            self._convert_pyx_sources_to_c()

    def _convert_pyx_sources_to_c(self):
        "convert .pyx extensions to .c"
        def pyx_to_c(source):
            if source.endswith('.pyx'):
                source = source[:-4] + '.c'
            return source
        self.sources = list(map(pyx_to_c, self.sources))

class Library(Extension):
    """Just like a regular Extension, but built as a library instead"""

distutils.core.Extension = Extension
distutils.extension.Extension = Extension
if 'distutils.command.build_ext' in sys.modules:
    sys.modules['distutils.command.build_ext'].Extension = Extension
site-packages/setuptools/py31compat.py000064400000000614151733464070014072 0ustar00__all__ = ['get_config_vars', 'get_path']

try:
    # Python 2.7 or >=3.2
    from sysconfig import get_config_vars, get_path
except ImportError:
    from distutils.sysconfig import get_config_vars, get_python_lib
    def get_path(name):
        if name not in ('platlib', 'purelib'):
            raise ValueError("Name must be purelib or platlib")
        return get_python_lib(name=='platlib')
site-packages/setuptools/package_index.py000064400000114015151733464070014655 0ustar00"""PyPI and direct package downloading"""
import sys
import os
import re
import shutil
import socket
import base64
import hashlib
from functools import wraps

from pkg_resources import (
    CHECKOUT_DIST, Distribution, BINARY_DIST, normalize_path, SOURCE_DIST,
    require, Environment, find_distributions, safe_name, safe_version,
    to_filename, Requirement, DEVELOP_DIST,
)
from setuptools import ssl_support
from distutils import log
from distutils.errors import DistutilsError
from setuptools.compat import (urllib2, httplib, StringIO, HTTPError,
                               urlparse, urlunparse, unquote, splituser,
                               url2pathname, name2codepoint,
                               unichr, urljoin, urlsplit, urlunsplit,
                               ConfigParser)
from setuptools.compat import filterfalse
from fnmatch import translate
from setuptools.py26compat import strip_fragment
from setuptools.py27compat import get_all_headers

EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.]+)$')
HREF = re.compile("""href\\s*=\\s*['"]?([^'"> ]+)""", re.I)
# this is here to fix emacs' cruddy broken syntax highlighting
PYPI_MD5 = re.compile(
    '<a href="([^"#]+)">([^<]+)</a>\n\s+\\(<a (?:title="MD5 hash"\n\s+)'
    'href="[^?]+\?:action=show_md5&amp;digest=([0-9a-f]{32})">md5</a>\\)'
)
URL_SCHEME = re.compile('([-+.a-z0-9]{2,}):',re.I).match
EXTENSIONS = ".tar.gz .tar.bz2 .tar .zip .tgz".split()

__all__ = [
    'PackageIndex', 'distros_for_url', 'parse_bdist_wininst',
    'interpret_distro_name',
]

_SOCKET_TIMEOUT = 15

def parse_bdist_wininst(name):
    """Return (base,pyversion) or (None,None) for possible .exe name"""

    lower = name.lower()
    base, py_ver, plat = None, None, None

    if lower.endswith('.exe'):
        if lower.endswith('.win32.exe'):
            base = name[:-10]
            plat = 'win32'
        elif lower.startswith('.win32-py',-16):
            py_ver = name[-7:-4]
            base = name[:-16]
            plat = 'win32'
        elif lower.endswith('.win-amd64.exe'):
            base = name[:-14]
            plat = 'win-amd64'
        elif lower.startswith('.win-amd64-py',-20):
            py_ver = name[-7:-4]
            base = name[:-20]
            plat = 'win-amd64'
    return base,py_ver,plat


def egg_info_for_url(url):
    scheme, server, path, parameters, query, fragment = urlparse(url)
    base = unquote(path.split('/')[-1])
    if server=='sourceforge.net' and base=='download':    # XXX Yuck
        base = unquote(path.split('/')[-2])
    if '#' in base: base, fragment = base.split('#',1)
    return base,fragment

def distros_for_url(url, metadata=None):
    """Yield egg or source distribution objects that might be found at a URL"""
    base, fragment = egg_info_for_url(url)
    for dist in distros_for_location(url, base, metadata): yield dist
    if fragment:
        match = EGG_FRAGMENT.match(fragment)
        if match:
            for dist in interpret_distro_name(
                url, match.group(1), metadata, precedence = CHECKOUT_DIST
            ):
                yield dist

def distros_for_location(location, basename, metadata=None):
    """Yield egg or source distribution objects based on basename"""
    if basename.endswith('.egg.zip'):
        basename = basename[:-4]    # strip the .zip
    if basename.endswith('.egg') and '-' in basename:
        # only one, unambiguous interpretation
        return [Distribution.from_location(location, basename, metadata)]
    if basename.endswith('.exe'):
        win_base, py_ver, platform = parse_bdist_wininst(basename)
        if win_base is not None:
            return interpret_distro_name(
                location, win_base, metadata, py_ver, BINARY_DIST, platform
            )
    # Try source distro extensions (.zip, .tgz, etc.)
    #
    for ext in EXTENSIONS:
        if basename.endswith(ext):
            basename = basename[:-len(ext)]
            return interpret_distro_name(location, basename, metadata)
    return []  # no extension matched

def distros_for_filename(filename, metadata=None):
    """Yield possible egg or source distribution objects based on a filename"""
    return distros_for_location(
        normalize_path(filename), os.path.basename(filename), metadata
    )


def interpret_distro_name(
        location, basename, metadata, py_version=None, precedence=SOURCE_DIST,
        platform=None
        ):
    """Generate 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!
    """
    # Generate alternative interpretations of a source distro name
    # Because some packages are ambiguous as to name/versions split
    # e.g. "adns-python-1.1.0", "egenix-mx-commercial", etc.
    # So, we generate each possible interepretation (e.g. "adns, python-1.1.0"
    # "adns-python, 1.1.0", and "adns-python-1.1.0, no version").  In practice,
    # the spurious interpretations should be ignored, because in the event
    # there's also an "adns" package, the spurious "python-1.1.0" version will
    # compare lower than any numeric version number, and is therefore unlikely
    # to match a request for it.  It's still a potential problem, though, and
    # in the long run PyPI and the distutils should go for "safe" names and
    # versions in distribution archive names (sdist and bdist).

    parts = basename.split('-')
    if not py_version:
        for i,p in enumerate(parts[2:]):
            if len(p)==5 and p.startswith('py2.'):
                return # It's a bdist_dumb, not an sdist -- bail out

    for p in range(1,len(parts)+1):
        yield Distribution(
            location, metadata, '-'.join(parts[:p]), '-'.join(parts[p:]),
            py_version=py_version, precedence = precedence,
            platform = platform
        )

# From Python 2.7 docs
def unique_everseen(iterable, key=None):
    "List unique elements, preserving order. Remember all elements ever seen."
    # unique_everseen('AAAABBBCCDAABBB') --> A B C D
    # unique_everseen('ABBCcAD', str.lower) --> A B C D
    seen = set()
    seen_add = seen.add
    if key is None:
        for element in filterfalse(seen.__contains__, iterable):
            seen_add(element)
            yield element
    else:
        for element in iterable:
            k = key(element)
            if k not in seen:
                seen_add(k)
                yield element

def unique_values(func):
    """
    Wrap a function returning an iterable such that the resulting iterable
    only ever yields unique items.
    """
    @wraps(func)
    def wrapper(*args, **kwargs):
        return unique_everseen(func(*args, **kwargs))
    return wrapper

REL = re.compile("""<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>""", re.I)
# this line is here to fix emacs' cruddy broken syntax highlighting

@unique_values
def find_external_links(url, page):
    """Find rel="homepage" and rel="download" links in `page`, yielding URLs"""

    for match in REL.finditer(page):
        tag, rel = match.groups()
        rels = set(map(str.strip, rel.lower().split(',')))
        if 'homepage' in rels or 'download' in rels:
            for match in HREF.finditer(tag):
                yield urljoin(url, htmldecode(match.group(1)))

    for tag in ("<th>Home Page", "<th>Download URL"):
        pos = page.find(tag)
        if pos!=-1:
            match = HREF.search(page,pos)
            if match:
                yield urljoin(url, htmldecode(match.group(1)))

user_agent = "Python-urllib/%s setuptools/%s" % (
    sys.version[:3], require('setuptools')[0].version
)

class ContentChecker(object):
    """
    A null content checker that defines the interface for checking content
    """
    def feed(self, block):
        """
        Feed a block of data to the hash.
        """
        return

    def is_valid(self):
        """
        Check the hash. Return False if validation fails.
        """
        return True

    def report(self, reporter, template):
        """
        Call reporter with information about the checker (hash name)
        substituted into the template.
        """
        return

class HashChecker(ContentChecker):
    pattern = re.compile(
        r'(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)='
        r'(?P<expected>[a-f0-9]+)'
    )

    def __init__(self, hash_name, expected):
        self.hash_name = hash_name
        self.hash = hashlib.new(hash_name)
        self.expected = expected

    @classmethod
    def from_url(cls, url):
        "Construct a (possibly null) ContentChecker from a URL"
        fragment = urlparse(url)[-1]
        if not fragment:
            return ContentChecker()
        match = cls.pattern.search(fragment)
        if not match:
            return ContentChecker()
        return cls(**match.groupdict())

    def feed(self, block):
        self.hash.update(block)

    def is_valid(self):
        return self.hash.hexdigest() == self.expected

    def report(self, reporter, template):
        msg = template % self.hash_name
        return reporter(msg)


class PackageIndex(Environment):
    """A distribution index that scans web pages for download URLs"""

    def __init__(
            self, index_url="https://pypi.python.org/simple", hosts=('*',),
            ca_bundle=None, verify_ssl=True, *args, **kw
            ):
        Environment.__init__(self,*args,**kw)
        self.index_url = index_url + "/"[:not index_url.endswith('/')]
        self.scanned_urls = {}
        self.fetched_urls = {}
        self.package_pages = {}
        self.allows = re.compile('|'.join(map(translate,hosts))).match
        self.to_scan = []
        if verify_ssl and ssl_support.is_available and (ca_bundle or ssl_support.find_ca_bundle()):
            self.opener = ssl_support.opener_for(ca_bundle)
        else: self.opener = urllib2.urlopen

    def process_url(self, url, retrieve=False):
        """Evaluate a URL as a possible download, and maybe retrieve it"""
        if url in self.scanned_urls and not retrieve:
            return
        self.scanned_urls[url] = True
        if not URL_SCHEME(url):
            self.process_filename(url)
            return
        else:
            dists = list(distros_for_url(url))
            if dists:
                if not self.url_ok(url):
                    return
                self.debug("Found link: %s", url)

        if dists or not retrieve or url in self.fetched_urls:
            list(map(self.add, dists))
            return  # don't need the actual page

        if not self.url_ok(url):
            self.fetched_urls[url] = True
            return

        self.info("Reading %s", url)
        self.fetched_urls[url] = True   # prevent multiple fetch attempts
        f = self.open_url(url, "Download error on %s: %%s -- Some packages may not be found!" % url)
        if f is None: return
        self.fetched_urls[f.url] = True
        if 'html' not in f.headers.get('content-type', '').lower():
            f.close()   # not html, we can't process it
            return

        base = f.url     # handle redirects
        page = f.read()
        if not isinstance(page, str): # We are in Python 3 and got bytes. We want str.
            if isinstance(f, HTTPError):
                # Errors have no charset, assume latin1:
                charset = 'latin-1'
            else:
                charset = f.headers.get_param('charset') or 'latin-1'
            page = page.decode(charset, "ignore")
        f.close()
        for match in HREF.finditer(page):
            link = urljoin(base, htmldecode(match.group(1)))
            self.process_url(link)
        if url.startswith(self.index_url) and getattr(f,'code',None)!=404:
            page = self.process_index(url, page)

    def process_filename(self, fn, nested=False):
        # process filenames or directories
        if not os.path.exists(fn):
            self.warn("Not found: %s", fn)
            return

        if os.path.isdir(fn) and not nested:
            path = os.path.realpath(fn)
            for item in os.listdir(path):
                self.process_filename(os.path.join(path,item), True)

        dists = distros_for_filename(fn)
        if dists:
            self.debug("Found: %s", fn)
            list(map(self.add, dists))

    def url_ok(self, url, fatal=False):
        s = URL_SCHEME(url)
        if (s and s.group(1).lower()=='file') or self.allows(urlparse(url)[1]):
            return True
        msg = ("\nNote: Bypassing %s (disallowed host; see "
            "http://bit.ly/1dg9ijs for details).\n")
        if fatal:
            raise DistutilsError(msg % url)
        else:
            self.warn(msg, url)

    def scan_egg_links(self, search_path):
        for item in search_path:
            if os.path.isdir(item):
                for entry in os.listdir(item):
                    if entry.endswith('.egg-link'):
                        self.scan_egg_link(item, entry)

    def scan_egg_link(self, path, entry):
        lines = [_f for _f in map(str.strip,
                                  open(os.path.join(path, entry))) if _f]
        if len(lines)==2:
            for dist in find_distributions(os.path.join(path, lines[0])):
                dist.location = os.path.join(path, *lines)
                dist.precedence = SOURCE_DIST
                self.add(dist)

    def process_index(self,url,page):
        """Process the contents of a PyPI page"""
        def scan(link):
            # Process a URL to see if it's for a package page
            if link.startswith(self.index_url):
                parts = list(map(
                    unquote, link[len(self.index_url):].split('/')
                ))
                if len(parts)==2 and '#' not in parts[1]:
                    # it's a package page, sanitize and index it
                    pkg = safe_name(parts[0])
                    ver = safe_version(parts[1])
                    self.package_pages.setdefault(pkg.lower(),{})[link] = True
                    return to_filename(pkg), to_filename(ver)
            return None, None

        # process an index page into the package-page index
        for match in HREF.finditer(page):
            try:
                scan(urljoin(url, htmldecode(match.group(1))))
            except ValueError:
                pass

        pkg, ver = scan(url)   # ensure this page is in the page index
        if pkg:
            # process individual package page
            for new_url in find_external_links(url, page):
                # Process the found URL
                base, frag = egg_info_for_url(new_url)
                if base.endswith('.py') and not frag:
                    if ver:
                        new_url+='#egg=%s-%s' % (pkg,ver)
                    else:
                        self.need_version_info(url)
                self.scan_url(new_url)

            return PYPI_MD5.sub(
                lambda m: '<a href="%s#md5=%s">%s</a>' % m.group(1,3,2), page
            )
        else:
            return ""   # no sense double-scanning non-package pages

    def need_version_info(self, url):
        self.scan_all(
            "Page at %s links to .py file(s) without version info; an index "
            "scan is required.", url
        )

    def scan_all(self, msg=None, *args):
        if self.index_url not in self.fetched_urls:
            if msg: self.warn(msg,*args)
            self.info(
                "Scanning index of all packages (this may take a while)"
            )
        self.scan_url(self.index_url)

    def find_packages(self, requirement):
        self.scan_url(self.index_url + requirement.unsafe_name+'/')

        if not self.package_pages.get(requirement.key):
            # Fall back to safe version of the name
            self.scan_url(self.index_url + requirement.project_name+'/')

        if not self.package_pages.get(requirement.key):
            # We couldn't find the target package, so search the index page too
            self.not_found_in_index(requirement)

        for url in list(self.package_pages.get(requirement.key,())):
            # scan each page that might be related to the desired package
            self.scan_url(url)

    def obtain(self, requirement, installer=None):
        self.prescan()
        self.find_packages(requirement)
        for dist in self[requirement.key]:
            if dist in requirement:
                return dist
            self.debug("%s does not match %s", requirement, dist)
        return super(PackageIndex, self).obtain(requirement,installer)

    def check_hash(self, checker, filename, tfp):
        """
        checker is a ContentChecker
        """
        checker.report(self.debug,
            "Validating %%s checksum for %s" % filename)
        if not checker.is_valid():
            tfp.close()
            os.unlink(filename)
            raise DistutilsError(
                "%s validation failed for %s; "
                "possible download problem?" % (
                                checker.hash.name, os.path.basename(filename))
            )

    def add_find_links(self, urls):
        """Add `urls` to the list that will be prescanned for searches"""
        for url in urls:
            if (
                self.to_scan is None        # if we have already "gone online"
                or not URL_SCHEME(url)      # or it's a local file/directory
                or url.startswith('file:')
                or list(distros_for_url(url))   # or a direct package link
            ):
                # then go ahead and process it now
                self.scan_url(url)
            else:
                # otherwise, defer retrieval till later
                self.to_scan.append(url)

    def prescan(self):
        """Scan urls scheduled for prescanning (e.g. --find-links)"""
        if self.to_scan:
            list(map(self.scan_url, self.to_scan))
        self.to_scan = None     # from now on, go ahead and process immediately

    def not_found_in_index(self, requirement):
        if self[requirement.key]:   # we've seen at least one distro
            meth, msg = self.info, "Couldn't retrieve index page for %r"
        else:   # no distros seen for this name, might be misspelled
            meth, msg = (self.warn,
                "Couldn't find index page for %r (maybe misspelled?)")
        meth(msg, requirement.unsafe_name)
        self.scan_all()

    def download(self, spec, tmpdir):
        """Locate 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.
        """
        if not isinstance(spec,Requirement):
            scheme = URL_SCHEME(spec)
            if scheme:
                # It's a url, download it to tmpdir
                found = self._download_url(scheme.group(1), spec, tmpdir)
                base, fragment = egg_info_for_url(spec)
                if base.endswith('.py'):
                    found = self.gen_setup(found,fragment,tmpdir)
                return found
            elif os.path.exists(spec):
                # Existing file or directory, just return it
                return spec
            else:
                try:
                    spec = Requirement.parse(spec)
                except ValueError:
                    raise DistutilsError(
                        "Not a URL, existing file, or requirement spec: %r" %
                        (spec,)
                    )
        return getattr(self.fetch_distribution(spec, tmpdir),'location',None)

    def fetch_distribution(
            self, requirement, tmpdir, force_scan=False, source=False,
            develop_ok=False, local_index=None
            ):
        """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.
        """
        # process a Requirement
        self.info("Searching for %s", requirement)
        skipped = {}
        dist = None

        def find(req, env=None):
            if env is None:
                env = self
            # Find a matching distribution; may be called more than once

            for dist in env[req.key]:

                if dist.precedence==DEVELOP_DIST and not develop_ok:
                    if dist not in skipped:
                        self.warn("Skipping development or system egg: %s",dist)
                        skipped[dist] = 1
                    continue

                if dist in req and (dist.precedence<=SOURCE_DIST or not source):
                    return dist

        if force_scan:
            self.prescan()
            self.find_packages(requirement)
            dist = find(requirement)

        if local_index is not None:
            dist = dist or find(requirement, local_index)

        if dist is None and self.to_scan is not None:
            self.prescan()
            dist = find(requirement)

        if dist is None and not force_scan:
            self.find_packages(requirement)
            dist = find(requirement)

        if dist is None:
            self.warn(
                "No local packages or download links found for %s%s",
                (source and "a source distribution of " or ""),
                requirement,
            )
        else:
            self.info("Best match: %s", dist)
            return dist.clone(location=self.download(dist.location, tmpdir))

    def fetch(self, requirement, tmpdir, force_scan=False, source=False):
        """Obtain 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.
        """
        dist = self.fetch_distribution(requirement,tmpdir,force_scan,source)
        if dist is not None:
            return dist.location
        return None

    def gen_setup(self, filename, fragment, tmpdir):
        match = EGG_FRAGMENT.match(fragment)
        dists = match and [
            d for d in
            interpret_distro_name(filename, match.group(1), None) if d.version
        ] or []

        if len(dists)==1:   # unambiguous ``#egg`` fragment
            basename = os.path.basename(filename)

            # Make sure the file has been downloaded to the temp dir.
            if os.path.dirname(filename) != tmpdir:
                dst = os.path.join(tmpdir, basename)
                from setuptools.command.easy_install import samefile
                if not samefile(filename, dst):
                    shutil.copy2(filename, dst)
                    filename=dst

            file = open(os.path.join(tmpdir, 'setup.py'), 'w')
            file.write(
                "from setuptools import setup\n"
                "setup(name=%r, version=%r, py_modules=[%r])\n"
                % (
                    dists[0].project_name, dists[0].version,
                    os.path.splitext(basename)[0]
                )
            )
            file.close()
            return filename

        elif match:
            raise DistutilsError(
                "Can't unambiguously interpret project/version identifier %r; "
                "any dashes in the name or version should be escaped using "
                "underscores. %r" % (fragment,dists)
            )
        else:
            raise DistutilsError(
                "Can't process plain .py files without an '#egg=name-version'"
                " suffix to enable automatic setup script generation."
            )

    dl_blocksize = 8192
    def _download_to(self, url, filename):
        self.info("Downloading %s", url)
        # Download the file
        fp, tfp, info = None, None, None
        try:
            checker = HashChecker.from_url(url)
            fp = self.open_url(strip_fragment(url))
            if isinstance(fp, HTTPError):
                raise DistutilsError(
                    "Can't download %s: %s %s" % (url, fp.code,fp.msg)
                )
            headers = fp.info()
            blocknum = 0
            bs = self.dl_blocksize
            size = -1
            if "content-length" in headers:
                # Some servers return multiple Content-Length headers :(
                sizes = get_all_headers(headers, 'Content-Length')
                size = max(map(int, sizes))
                self.reporthook(url, filename, blocknum, bs, size)
            tfp = open(filename,'wb')
            while True:
                block = fp.read(bs)
                if block:
                    checker.feed(block)
                    tfp.write(block)
                    blocknum += 1
                    self.reporthook(url, filename, blocknum, bs, size)
                else:
                    break
            self.check_hash(checker, filename, tfp)
            return headers
        finally:
            if fp: fp.close()
            if tfp: tfp.close()

    def reporthook(self, url, filename, blocknum, blksize, size):
        pass    # no-op

    def open_url(self, url, warning=None):
        if url.startswith('file:'):
            return local_open(url)
        try:
            return open_with_auth(url, self.opener)
        except (ValueError, httplib.InvalidURL):
            v = sys.exc_info()[1]
            msg = ' '.join([str(arg) for arg in v.args])
            if warning:
                self.warn(warning, msg)
            else:
                raise DistutilsError('%s %s' % (url, msg))
        except urllib2.HTTPError:
            v = sys.exc_info()[1]
            return v
        except urllib2.URLError:
            v = sys.exc_info()[1]
            if warning:
                self.warn(warning, v.reason)
            else:
                raise DistutilsError("Download error for %s: %s"
                                     % (url, v.reason))
        except httplib.BadStatusLine:
            v = sys.exc_info()[1]
            if warning:
                self.warn(warning, v.line)
            else:
                raise DistutilsError(
                    '%s returned a bad status line. The server might be '
                    'down, %s' %
                    (url, v.line)
                )
        except httplib.HTTPException:
            v = sys.exc_info()[1]
            if warning:
                self.warn(warning, v)
            else:
                raise DistutilsError("Download error for %s: %s"
                                     % (url, v))

    def _download_url(self, scheme, url, tmpdir):
        # Determine download filename
        #
        name, fragment = egg_info_for_url(url)
        if name:
            while '..' in name:
                name = name.replace('..','.').replace('\\','_')
        else:
            name = "__downloaded__"    # default if URL has no path contents

        if name.endswith('.egg.zip'):
            name = name[:-4]    # strip the extra .zip before download

        filename = os.path.join(tmpdir,name)

        # Download the file
        #
        if scheme=='svn' or scheme.startswith('svn+'):
            return self._download_svn(url, filename)
        elif scheme=='git' or scheme.startswith('git+'):
            return self._download_git(url, filename)
        elif scheme.startswith('hg+'):
            return self._download_hg(url, filename)
        elif scheme=='file':
            return url2pathname(urlparse(url)[2])
        else:
            self.url_ok(url, True)   # raises error if not allowed
            return self._attempt_download(url, filename)

    def scan_url(self, url):
        self.process_url(url, True)

    def _attempt_download(self, url, filename):
        headers = self._download_to(url, filename)
        if 'html' in headers.get('content-type','').lower():
            return self._download_html(url, headers, filename)
        else:
            return filename

    def _download_html(self, url, headers, filename):
        file = open(filename)
        for line in file:
            if line.strip():
                # Check for a subversion index page
                if re.search(r'<title>([^- ]+ - )?Revision \d+:', line):
                    # it's a subversion index page:
                    file.close()
                    os.unlink(filename)
                    return self._download_svn(url, filename)
                break   # not an index page
        file.close()
        os.unlink(filename)
        raise DistutilsError("Unexpected HTML page found at "+url)

    def _download_svn(self, url, filename):
        url = url.split('#',1)[0]   # remove any fragment for svn's sake
        creds = ''
        if url.lower().startswith('svn:') and '@' in url:
            scheme, netloc, path, p, q, f = urlparse(url)
            if not netloc and path.startswith('//') and '/' in path[2:]:
                netloc, path = path[2:].split('/',1)
                auth, host = splituser(netloc)
                if auth:
                    if ':' in auth:
                        user, pw = auth.split(':',1)
                        creds = " --username=%s --password=%s" % (user, pw)
                    else:
                        creds = " --username="+auth
                    netloc = host
                    url = urlunparse((scheme, netloc, url, p, q, f))
        self.info("Doing subversion checkout from %s to %s", url, filename)
        os.system("svn checkout%s -q %s %s" % (creds, url, filename))
        return filename

    @staticmethod
    def _vcs_split_rev_from_url(url, pop_prefix=False):
        scheme, netloc, path, query, frag = urlsplit(url)

        scheme = scheme.split('+', 1)[-1]

        # Some fragment identification fails
        path = path.split('#',1)[0]

        rev = None
        if '@' in path:
            path, rev = path.rsplit('@', 1)

        # Also, discard fragment
        url = urlunsplit((scheme, netloc, path, query, ''))

        return url, rev

    def _download_git(self, url, filename):
        filename = filename.split('#',1)[0]
        url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True)

        self.info("Doing git clone from %s to %s", url, filename)
        os.system("git clone --quiet %s %s" % (url, filename))

        if rev is not None:
            self.info("Checking out %s", rev)
            os.system("(cd %s && git checkout --quiet %s)" % (
                filename,
                rev,
            ))

        return filename

    def _download_hg(self, url, filename):
        filename = filename.split('#',1)[0]
        url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True)

        self.info("Doing hg clone from %s to %s", url, filename)
        os.system("hg clone --quiet %s %s" % (url, filename))

        if rev is not None:
            self.info("Updating to %s", rev)
            os.system("(cd %s && hg up -C -r %s >&-)" % (
                filename,
                rev,
            ))

        return filename

    def debug(self, msg, *args):
        log.debug(msg, *args)

    def info(self, msg, *args):
        log.info(msg, *args)

    def warn(self, msg, *args):
        log.warn(msg, *args)

# This pattern matches a character entity reference (a decimal numeric
# references, a hexadecimal numeric reference, or a named reference).
entity_sub = re.compile(r'&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?').sub

def uchr(c):
    if not isinstance(c, int):
        return c
    if c>255: return unichr(c)
    return chr(c)

def decode_entity(match):
    what = match.group(1)
    if what.startswith('#x'):
        what = int(what[2:], 16)
    elif what.startswith('#'):
        what = int(what[1:])
    else:
        what = name2codepoint.get(what, match.group(0))
    return uchr(what)

def htmldecode(text):
    """Decode HTML entities in the given text."""
    return entity_sub(decode_entity, text)

def socket_timeout(timeout=15):
    def _socket_timeout(func):
        def _socket_timeout(*args, **kwargs):
            old_timeout = socket.getdefaulttimeout()
            socket.setdefaulttimeout(timeout)
            try:
                return func(*args, **kwargs)
            finally:
                socket.setdefaulttimeout(old_timeout)
        return _socket_timeout
    return _socket_timeout

def _encode_auth(auth):
    """
    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
    """
    auth_s = unquote(auth)
    # convert to bytes
    auth_bytes = auth_s.encode()
    # use the legacy interface for Python 2.3 support
    encoded_bytes = base64.encodestring(auth_bytes)
    # convert back to a string
    encoded = encoded_bytes.decode()
    # strip the trailing carriage return
    return encoded.replace('\n','')

class Credential(object):
    """
    A username/password pair. Use like a namedtuple.
    """
    def __init__(self, username, password):
        self.username = username
        self.password = password

    def __iter__(self):
        yield self.username
        yield self.password

    def __str__(self):
        return '%(username)s:%(password)s' % vars(self)

class PyPIConfig(ConfigParser.ConfigParser):

    def __init__(self):
        """
        Load from ~/.pypirc
        """
        defaults = dict.fromkeys(['username', 'password', 'repository'], '')
        ConfigParser.ConfigParser.__init__(self, defaults)

        rc = os.path.join(os.path.expanduser('~'), '.pypirc')
        if os.path.exists(rc):
            self.read(rc)

    @property
    def creds_by_repository(self):
        sections_with_repositories = [
            section for section in self.sections()
            if self.get(section, 'repository').strip()
        ]

        return dict(map(self._get_repo_cred, sections_with_repositories))

    def _get_repo_cred(self, section):
        repo = self.get(section, 'repository').strip()
        return repo, Credential(
            self.get(section, 'username').strip(),
            self.get(section, 'password').strip(),
        )

    def find_credential(self, url):
        """
        If the URL indicated appears to be a repository defined in this
        config, return the credential for that repository.
        """
        for repository, cred in self.creds_by_repository.items():
            if url.startswith(repository):
                return cred


def open_with_auth(url, opener=urllib2.urlopen):
    """Open a urllib2 request, handling HTTP authentication"""

    scheme, netloc, path, params, query, frag = urlparse(url)

    # Double scheme does not raise on Mac OS X as revealed by a
    # failing test. We would expect "nonnumeric port". Refs #20.
    if netloc.endswith(':'):
        raise httplib.InvalidURL("nonnumeric port: ''")

    if scheme in ('http', 'https'):
        auth, host = splituser(netloc)
    else:
        auth = None

    if not auth:
        cred = PyPIConfig().find_credential(url)
        if cred:
            auth = str(cred)
            info = cred.username, url
            log.info('Authenticating as %s for %s (from .pypirc)' % info)

    if auth:
        auth = "Basic " + _encode_auth(auth)
        new_url = urlunparse((scheme,host,path,params,query,frag))
        request = urllib2.Request(new_url)
        request.add_header("Authorization", auth)
    else:
        request = urllib2.Request(url)

    request.add_header('User-Agent', user_agent)
    fp = opener(request)

    if auth:
        # Put authentication info back into request URL if same host,
        # so that links found on the page will work
        s2, h2, path2, param2, query2, frag2 = urlparse(fp.url)
        if s2==scheme and h2==host:
            fp.url = urlunparse((s2,netloc,path2,param2,query2,frag2))

    return fp

# adding a timeout to avoid freezing package_index
open_with_auth = socket_timeout(_SOCKET_TIMEOUT)(open_with_auth)


def fix_sf_url(url):
    return url      # backward compatibility

def local_open(url):
    """Read a local path, with special support for directories"""
    scheme, server, path, param, query, frag = urlparse(url)
    filename = url2pathname(path)
    if os.path.isfile(filename):
        return urllib2.urlopen(url)
    elif path.endswith('/') and os.path.isdir(filename):
        files = []
        for f in os.listdir(filename):
            if f=='index.html':
                fp = open(os.path.join(filename,f),'r')
                body = fp.read()
                fp.close()
                break
            elif os.path.isdir(os.path.join(filename,f)):
                f+='/'
            files.append("<a href=%r>%s</a>" % (f,f))
        else:
            body = ("<html><head><title>%s</title>" % url) + \
                "</head><body>%s</body></html>" % '\n'.join(files)
        status, message = 200, "OK"
    else:
        status, message, body = 404, "Path not found", "Not found"

    headers = {'content-type': 'text/html'}
    return HTTPError(url, status, message, headers, StringIO(body))
site-packages/setuptools/lib2to3_ex.py000064400000003716151733464070014052 0ustar00"""
Customized Mixin2to3 support:

 - adds support for converting doctests


This module raises an ImportError on Python 2.
"""

from distutils.util import Mixin2to3 as _Mixin2to3
from distutils import log
from lib2to3.refactor import RefactoringTool, get_fixers_from_package
import setuptools

class DistutilsRefactoringTool(RefactoringTool):
    def log_error(self, msg, *args, **kw):
        log.error(msg, *args)

    def log_message(self, msg, *args):
        log.info(msg, *args)

    def log_debug(self, msg, *args):
        log.debug(msg, *args)

class Mixin2to3(_Mixin2to3):
    def run_2to3(self, files, doctests = False):
        # See of the distribution option has been set, otherwise check the
        # setuptools default.
        if self.distribution.use_2to3 is not True:
            return
        if not files:
            return
        log.info("Fixing "+" ".join(files))
        self.__build_fixer_names()
        self.__exclude_fixers()
        if doctests:
            if setuptools.run_2to3_on_doctests:
                r = DistutilsRefactoringTool(self.fixer_names)
                r.refactor(files, write=True, doctests_only=True)
        else:
            _Mixin2to3.run_2to3(self, files)

    def __build_fixer_names(self):
        if self.fixer_names: return
        self.fixer_names = []
        for p in setuptools.lib2to3_fixer_packages:
            self.fixer_names.extend(get_fixers_from_package(p))
        if self.distribution.use_2to3_fixers is not None:
            for p in self.distribution.use_2to3_fixers:
                self.fixer_names.extend(get_fixers_from_package(p))

    def __exclude_fixers(self):
        excluded_fixers = getattr(self, 'exclude_fixers', [])
        if self.distribution.use_2to3_exclude_fixers is not None:
            excluded_fixers.extend(self.distribution.use_2to3_exclude_fixers)
        for fixer_name in excluded_fixers:
            if fixer_name in self.fixer_names:
                self.fixer_names.remove(fixer_name)
site-packages/setuptools/py27compat.py000064400000000462151733464070014100 0ustar00"""
Compatibility Support for Python 2.7 and earlier
"""

import sys

def get_all_headers(message, key):
	"""
	Given an HTTPMessage, return all headers matching a given key.
	"""
	return message.get_all(key)

if sys.version_info < (3,):
	def get_all_headers(message, key):
		return message.getheaders(key)
site-packages/setuptools/py26compat.py000064400000000657151733464070014105 0ustar00"""
Compatibility Support for Python 2.6 and earlier
"""

import sys

from setuptools.compat import splittag

def strip_fragment(url):
	"""
	In `Python 8280 <http://bugs.python.org/issue8280>`_, Python 2.7 and
	later was patched to disregard the fragment when making URL requests.
	Do the same for Python 2.6 and earlier.
	"""
	url, fragment = splittag(url)
	return url

if sys.version_info >= (2,7):
	strip_fragment = lambda x: x
site-packages/setuptools/script template (dev).py000064400000000467151733464070016060 0ustar00# EASY-INSTALL-DEV-SCRIPT: %(spec)r,%(script_name)r
__requires__ = """%(spec)r"""
import sys
from pkg_resources import require
require("""%(spec)r""")
del require
__file__ = """%(dev_path)r"""
if sys.version_info < (3, 0):
    execfile(__file__)
else:
    exec(compile(open(__file__).read(), __file__, 'exec'))
site-packages/pip-1.5.6.dist-info/entry_points.txt000064400000000104151733464070015717 0ustar00[console_scripts]
pip3 = pip:main
pip3.3 = pip:main
pip = pip:main

site-packages/pip-1.5.6.dist-info/METADATA000064400000004703151733464070013535 0ustar00Metadata-Version: 2.0
Name: pip
Version: 1.5.6
Summary: A tool for installing and managing Python packages.
Home-page: https://pip.pypa.io/
Author: The pip developers
Author-email: python-virtualenv@groups.google.com
License: MIT
Keywords: easy_install distutils setuptools egg virtualenv
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Topic :: Software Development :: Build Tools
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.1
Classifier: Programming Language :: Python :: 3.2
Classifier: Programming Language :: Python :: 3.3
Provides-Extra: testing
Requires-Dist: pytest; extra == 'testing'
Requires-Dist: virtualenv (>=1.10); extra == 'testing'
Requires-Dist: scripttest (>=1.3); extra == 'testing'
Requires-Dist: mock; extra == 'testing'


Project Info
============

* Project Page: https://github.com/pypa/pip
* Install howto: https://pip.pypa.io/en/latest/installing.html
* Changelog: https://pip.pypa.io/en/latest/news.html
* Bug Tracking: https://github.com/pypa/pip/issues
* Mailing list: http://groups.google.com/group/python-virtualenv
* Docs: https://pip.pypa.io/
* User IRC: #pypa on Freenode.
* Dev IRC: #pypa-dev on Freenode.

Quickstart
==========

First, :doc:`Install pip <installing>`.

Install a package from `PyPI`_:

::

  $ pip install SomePackage
    [...]
    Successfully installed SomePackage

Show what files were installed:

::

  $ pip show --files SomePackage
    Name: SomePackage
    Version: 1.0
    Location: /my/env/lib/pythonx.x/site-packages
    Files:
     ../somepackage/__init__.py
     [...]

List what packages are outdated:

::

  $ pip list --outdated
    SomePackage (Current: 1.0 Latest: 2.0)

Upgrade a package:

::

  $ pip install --upgrade SomePackage
    [...]
    Found existing installation: SomePackage 1.0
    Uninstalling SomePackage:
      Successfully uninstalled SomePackage
    Running setup.py install for SomePackage
    Successfully installed SomePackage

Uninstall a package:

::

  $ pip uninstall SomePackage
    Uninstalling SomePackage:
      /my/env/lib/pythonx.x/site-packages/somepackage
    Proceed (y/n)? y
    Successfully uninstalled SomePackage


.. _PyPI: http://pypi.python.org/pypi/


site-packages/pip-1.5.6.dist-info/pydist.json000064400000002521151733464100014627 0ustar00{"exports": {"console_scripts": {"pip3": "pip:main", "pip3.3": "pip:main", "pip": "pip:main"}}, "contacts": [{"name": "The pip developers", "email": "python-virtualenv@groups.google.com", "role": "author"}], "run_requires": [{"requires": ["pytest", "virtualenv (>=1.10)", "scripttest (>=1.3)", "mock"], "extra": "testing"}], "summary": "A tool for installing and managing Python packages.", "project_urls": {"Home": "https://pip.pypa.io/"}, "extras": ["testing"], "test_requires": [{"requires": ["pytest", "virtualenv (>=1.10)", "scripttest (>=1.3)", "mock"]}], "generator": "bdist_wheel (0.22.0)", "license": "MIT", "name": "pip", "document_names": {"description": "DESCRIPTION.rst"}, "metadata_version": "2.0", "version": "1.5.6", "commands": {"wrap_console": {"pip3": "pip:main", "pip3.3": "pip:main", "pip": "pip:main"}}, "keywords": "easy_install distutils setuptools egg virtualenv", "classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Topic :: Software Development :: Build Tools", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.1", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3"]}site-packages/pip-1.5.6.dist-info/RECORD000064400000074055151733464100013334 0ustar00pip-1.5.6.data/scripts/pip3,sha256=nAVJqitsjrwZv6KSY8NlXstCc8XTvg-jrC2oBIV_1k8,274
pip-1.5.6.data/scripts/pip3.3,sha256=LyM_G2ymMdtOhRI_-JHYo36IIyzBGN8Qi69q_x5Cgkk,278
pip-1.5.6.data/scripts/pip,sha256=De0W2oww_P4dM50MGVfNpWeKo69Hnr6COf8DQL5QqsI,272
pip/index.py,sha256=CLPb0crVhOQ3aZpl4feUKpf1pVR6qLhBiJTa71PoIkM,40403
pip/pep425tags.py,sha256=jb5Rq395Gz_Uv8kn3L9Im1HX7EhEj8nqyYX0nXulzWo,2969
pip/locations.py,sha256=YyFyCLYADKgT5x-Ctj_LeZl5bEzkbBXuR2Iv8IbVqDA,6202
pip/cmdoptions.py,sha256=2E4AK_UNbyvJE6bmvlvsWhkrttE3jrwM_hNYpIecLfE,9330
pip/req.py,sha256=iuQoYf21dUNtwrBG4rkpzGdrsobLBmwAxy9yvsN4_xg,83753
pip/exceptions.py,sha256=wAoboA4PdhGN7xH-ayf_dcDFPYZe9XAivAlZJbOgCN4,1086
pip/__init__.py,sha256=WzANeRzRVWoA1cpCc_d_41hpcWFR90Auv8IpKToWzMw,9428
pip/util.py,sha256=rmGahY7tRBWTKqT42eA9k1tKyVTlOHq4w_NfBk4yt10,25124
pip/baseparser.py,sha256=DZKWTOA1OeD5mLyBUx183Jx-M16cqWOXPZZuJN4-4j8,8162
pip/basecommand.py,sha256=N_nE7BCcoMA7t2nRNTiJB8T__1XqI74SJI2G72VaM2E,6578
pip/runner.py,sha256=VkcZKNikprpDOSl2Y3m0FaQbdGuYsoHkxdhjtL0N3oA,431
pip/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116
pip/__main__.py,sha256=9JBJhprGRLUy1fEvAdufs0tsjKFAvFAY_nTde6GDkHk,116
pip/download.py,sha256=jnZvTGYutxPtgJvF0URMnsBGkTABNrfgFevu5QmscfE,22580
pip/wheel.py,sha256=BbXwXLwU5IqWU5sPieWErTbuI3sDHxGUUm24rzXebLI,20800
pip/log.py,sha256=1fW7cVRIRBhfqWz4JH2HhJRHzVQ4PJTRbolRj3S33f8,9455
pip/backwardcompat/__init__.py,sha256=AcP5dr3nL-4AGxSwsFIEUcf9ki0ROUFwfc0IrIeHaJI,3756
pip/vcs/git.py,sha256=ib3TqDwJyfjBnSRFKVe_HhNdwkmfcOZfJHbqt2RUOVg,7898
pip/vcs/mercurial.py,sha256=71ESfgxotPPPZjiH6sMTBWcj5TS8kjgJxVnWrRb3bwo,5820
pip/vcs/__init__.py,sha256=kS31hLmJ6BgKnBu8kvXKQlJEwoj1MxYE7wfRuFL-daM,8748
pip/vcs/bazaar.py,sha256=qUIuIqDJqwZ_nP6WR52YwvYVy1lvIUmvaT-IdxDYUHo,4943
pip/vcs/subversion.py,sha256=P31K7o83JdcipIyuEVlnpSp5KZqakb4OJ1PKT-FB7C8,10640
pip/commands/list.py,sha256=FHf7H35AajbCuymiG2z8xAGNSx8W5CNZKj6Hh2QGo38,6814
pip/commands/__init__.py,sha256=N_4io-oGcWF9-raDN5TYXbGlJFsx5po36HZmwgLso6I,2236
pip/commands/zip.py,sha256=KECCb3oCHxJqDT3kUEnlf0udp31Ckoe8oyEKdS7EKNQ,14821
pip/commands/show.py,sha256=ipjEcTrk-hgvFysSKJ5E9PSPXZGTuE3NIXLYvXnsdNk,2767
pip/commands/unzip.py,sha256=_PeTWKOd_iRxPt_7njQ8jGFpjX006vobn593tcIyeUc,185
pip/commands/uninstall.py,sha256=MF4zSLfMxnH3E8T673ORNWz0Bsc4C6LEI5KImpAQrck,2203
pip/commands/install.py,sha256=nKCSLKvUpYHWVZXP96XcyWVGQBoOnG635Tt1JxLx7Ts,13780
pip/commands/help.py,sha256=ETLg8xfv8uFwS3KvxmsCE-I56S15jUTvfkwaPAA18pE,927
pip/commands/completion.py,sha256=LnJgUrpGGO4x2Y8VdwhKda4kGZWMFO28P4jYzYT5Q8k,1838
pip/commands/bundle.py,sha256=tK8LU3Khjkrz65y3brNP71QOBkQCb9mlv9x8s1W02T4,1787
pip/commands/search.py,sha256=_4Mza0qEb6P1aDA2OROYd-KuOJg0NrITOtQoiCDJF5Q,4736
pip/commands/wheel.py,sha256=BLf-jQxO7BhiHho302fNGPsz9fA5NGjfGUSv33XmP9s,7714
pip/commands/freeze.py,sha256=Hyx1gzMaTFwTMcP98fwNCRVvvrWenX9j1RBziLCIo0A,4664
pip/_vendor/pkg_resources.py,sha256=0y2CkvxQcHCBVOmTCNvdMN8hTPPUogThjhkCxegggII,100025
pip/_vendor/__init__.py,sha256=f-xO4dF7jRP89yrL4h26_nULYgYTzgnTgUFlkDasJrc,266
pip/_vendor/re-vendor.py,sha256=PcdZ40d0ohMsdJmA4t0AeAWbPXi1tFsvAwA5KE5FGeY,773
pip/_vendor/six.py,sha256=whAS1kvmixxh-pKqb5qQ05-fHMnGjuKyU6m7_wa09O4,23462
pip/_vendor/distlib/index.py,sha256=D-Zz8pQ6Gtr4t7HlFebU36P9inMPSfExmit061S8DUk,19476
pip/_vendor/distlib/manifest.py,sha256=I-JG2bVBN3Zmf4gpt9MFjgsukcIt0rMrz95jQ1kwbgE,13497
pip/_vendor/distlib/scripts.py,sha256=0bIHpJFwyvymJ4CEnm1-x3AcJZbYTEkhBAKuas295Ic,12307
pip/_vendor/distlib/markers.py,sha256=iRrVWwpyVwjkKJSX8NEQ92_MRMwpROcfNGKCD-Ch1QM,6282
pip/_vendor/distlib/resources.py,sha256=H9QmD7R_8t-iLxZne9EnjAHAdSEbJ22PYotEppOGxts,9432
pip/_vendor/distlib/t64.exe,sha256=71TYxgPfviERRKhyYaXPx2pl4o4ugs5zNWuIMLlm7ss,94720
pip/_vendor/distlib/w64.exe,sha256=haGpLW73-UaPHkjhKaQVPTBJCZ9Lg1rMBZdhpi7f_V8,91648
pip/_vendor/distlib/__init__.py,sha256=kTBiZ-2Ndb1k7wb8yCvl7iRBCDTnvaOR15qf32RgvsY,581
pip/_vendor/distlib/version.py,sha256=FgTBNWH7dDY12fqTFy6nATw21wV8kKJw5G19aFouwDE,22996
pip/_vendor/distlib/util.py,sha256=UBy5ki-nyb0nJyM_-TlXSfni_cEOI4r6LzglMMB_1zc,51230
pip/_vendor/distlib/compat.py,sha256=pVILHBDu1P72lO1lEgPFpwRWGs4Cj2-eo_xOPLKjprk,38875
pip/_vendor/distlib/locators.py,sha256=Vi88LbYqF981rmCc8dbD9qnmt5MeJzv7qiAlvgrK3vs,46946
pip/_vendor/distlib/database.py,sha256=reYrKl6tqHs3eOrMrdXX4W0OGlBqathuqSzCy-696MI,49138
pip/_vendor/distlib/t32.exe,sha256=snr0x6iR5Yd7ZndiuvGMuuQGg8VklUc5538uQcOeVYQ,91136
pip/_vendor/distlib/wheel.py,sha256=TUMl4Pzri_jglkvr2jZ4GJfWAumG3VNzT2CaW7oBXQQ,38259
pip/_vendor/distlib/w32.exe,sha256=QoyveFPxLH-db4j2YDzb-VmP7DmGT1vHwPOLGpzc3uw,87040
pip/_vendor/distlib/metadata.py,sha256=IS0Q8hNbQWEhaLtItUlLxYC3j9zVtFD76DgXbHxcRZE,36815
pip/_vendor/distlib/_backport/tarfile.py,sha256=bjyTNONZb-YEXrHFLExOSuagtSOoPaONP2UUoxwkAqE,92627
pip/_vendor/distlib/_backport/__init__.py,sha256=bqS_dTOH6uW9iGgd0uzfpPjo6vZ4xpPZ7kyfZJ2vNaw,274
pip/_vendor/distlib/_backport/misc.py,sha256=KWecINdbFNOxSOP1fGF680CJnaC6S4fBRgEtaYTw0ig,971
pip/_vendor/distlib/_backport/sysconfig.cfg,sha256=swZKxq9RY5e9r3PXCrlvQPMsvOdiWZBTHLEbqS8LJLU,2617
pip/_vendor/distlib/_backport/shutil.py,sha256=AUi8718iRoJ9K26mRi-rywtt8Gx7ykvrvbUbZszjfYE,25650
pip/_vendor/distlib/_backport/sysconfig.py,sha256=7WdYP0wbw8izH1eAEGNA-HXUyJrhzIAGK_LniUs4UNI,26958
pip/_vendor/html5lib/ihatexml.py,sha256=MT12cVXAKaW-ALUkUeN175HpUP73xK8wAIpPzQ8cgfI,16581
pip/_vendor/html5lib/inputstream.py,sha256=qa-xwqbm-w250UR-uVzooXPSHFI4Ho6drLhPl7VWvHI,30636
pip/_vendor/html5lib/__init__.py,sha256=6fwIe3NEcpx7aLb1bBXUpsDgJFE9PnbpRADB7i2QhBw,714
pip/_vendor/html5lib/constants.py,sha256=w_Lrxu8h6qE4KATYy0SL5hiJ5ebuB28SlCcdXUHf6to,87346
pip/_vendor/html5lib/html5parser.py,sha256=qMHEOEahKSZzLHHkqLRVbuIJYgAteVR-nmkjMp59Tvw,117029
pip/_vendor/html5lib/utils.py,sha256=T-BFeUVGJDjVCRbNoqar2qxn8jEoCOOJXE1nH0nDHEQ,2545
pip/_vendor/html5lib/tokenizer.py,sha256=6Uf8sDUkvNn661bcBSBYUCTfXzSs9EyCTiPcj5PAjYI,76929
pip/_vendor/html5lib/sanitizer.py,sha256=sg7g5CXF9tfvykIoSVAvA8647MgScy3ncZC7IYH-8SA,16428
pip/_vendor/html5lib/treewalkers/lxmletree.py,sha256=vWfXWK3GOSrq2trQm2aPmIRWPhVuYDZ3g9Fu8hUeBQg,6215
pip/_vendor/html5lib/treewalkers/pulldom.py,sha256=9W6i8yWtUzayV6EwX-okVacttHaqpQZwdBCc2S3XeQ4,2302
pip/_vendor/html5lib/treewalkers/__init__.py,sha256=44g-xYZEoYxzkMu6CepBTLm4m-g9iy7Vm_IG8PWAbhY,2323
pip/_vendor/html5lib/treewalkers/genshistream.py,sha256=IbBFrlgi-59-K7P1zm0d7ZFIknBN4c5E57PHJDkx39s,2278
pip/_vendor/html5lib/treewalkers/etree.py,sha256=waFU6dxcV5y4SEMyxZpQ9M4I5pKpMmCtUSN1GbuCVcE,4625
pip/_vendor/html5lib/treewalkers/_base.py,sha256=hnL6zMgGJoGqEJYKVKveDmfpz1d2xriyuuau6479xq4,6919
pip/_vendor/html5lib/treewalkers/dom.py,sha256=mAg05wBWN2k-CGPoo0KNxa55QAlHciNccp8AezCa8j8,1457
pip/_vendor/html5lib/treebuilders/__init__.py,sha256=Xz4X6B5DA1R-5GyRa44j0sJwfl6dUNyb0NBu9-7sK3U,3405
pip/_vendor/html5lib/treebuilders/etree.py,sha256=etbO6yQlyV46rWlj9mSyVqQOWrgoHgyJ01Tut4lWZkk,12621
pip/_vendor/html5lib/treebuilders/_base.py,sha256=Xf0FZVcVwIQS6tEseJdj5wKbYucbNCnbAsnsG4lONis,13711
pip/_vendor/html5lib/treebuilders/dom.py,sha256=ylkIlwEV2NsIWBpwEtfqF0LVoCGg4oXazEWs4-486jk,8469
pip/_vendor/html5lib/treebuilders/etree_lxml.py,sha256=z3Bnfm2MstEEb_lbaAeicl5l-ab6MSQa5Q1ZZreK7Pc,14031
pip/_vendor/html5lib/trie/datrie.py,sha256=EQpqSfkZRuTbE-DuhW7xMdVDxdZNZ0CfmnYfHA_3zxM,1178
pip/_vendor/html5lib/trie/__init__.py,sha256=mec5zyJ5wIKRM8819gIcIsYQwncg91rEmPwGH1dG3Ho,212
pip/_vendor/html5lib/trie/_base.py,sha256=WGY8SGptFmx4O0aKLJ54zrIQOoyuvhS0ngA36vAcIcc,927
pip/_vendor/html5lib/trie/py.py,sha256=wXmQLrZRf4MyWNyg0m3h81m9InhLR7GJ002mIIZh-8o,1775
pip/_vendor/html5lib/serializer/__init__.py,sha256=xFXFP-inaTNlbnau5c5DGrH_O8yPm-C6HWbJxpiSqFE,490
pip/_vendor/html5lib/serializer/htmlserializer.py,sha256=bSXUuFJB6s-ODOl0nzFN0UA6xlQRU-BwYamPeJvsNSE,12909
pip/_vendor/html5lib/filters/inject_meta_charset.py,sha256=xllv1I7unxhcyZTf3LTsv30wh2mAkT7wmTZx7zIhpuY,2746
pip/_vendor/html5lib/filters/optionaltags.py,sha256=4ozLwBgMRaxe7iqxefLQpDhp3irK7YHo9LgSGsvZYMw,10500
pip/_vendor/html5lib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
pip/_vendor/html5lib/filters/whitespace.py,sha256=LbOUcC0zQ9z703KNZrArOr0kVBO7OMXjKjucDW32LU4,1142
pip/_vendor/html5lib/filters/_base.py,sha256=z-IU9ZAYjpsVsqmVt7kuWC63jR11hDMr6CVrvuao8W0,286
pip/_vendor/html5lib/filters/alphabeticalattributes.py,sha256=fpRLbz6TCe5yXEkGmyMlJ80FekWsTR-sHk3Ano0U9LQ,624
pip/_vendor/html5lib/filters/lint.py,sha256=6rlGRUTxD5KWwEVoXVHI_PeyUHN6Vw2v_ovg0YiHsDA,4306
pip/_vendor/html5lib/filters/sanitizer.py,sha256=MvGUs_v2taWPgGhjxswRSUiHfxrqMUhsNPz-eSeUYUQ,352
pip/_vendor/html5lib/treeadapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
pip/_vendor/html5lib/treeadapters/sax.py,sha256=3of4vvaUYIAic7pngebwJV24hpOS7Zg9ggJa_WQegy4,1661
pip/_vendor/requests/models.py,sha256=OYZOkemxZPpeTp5cvhdx-gAnl9bW82wdnGIr4uoVH20,26436
pip/_vendor/requests/cacert.pem,sha256=ak7q_q8ozHdQ9ff27U-E1vCNrLisFRQSMy9zJkdpQlM,308434
pip/_vendor/requests/hooks.py,sha256=9vNiuiRHRd5Qy6BX_0p1H3NsUzDo1M_HaFR2AFL41Tg,820
pip/_vendor/requests/exceptions.py,sha256=z-3QpicafKtIh85bMEaClL2OpNPdsc6TP_83KcsVh8Y,1877
pip/_vendor/requests/__init__.py,sha256=Rl423kV-MBTFDiTtEOJiP9CuaubFSi8rHaqzq1KBN0w,1856
pip/_vendor/requests/cookies.py,sha256=BjMKtrI8TXQD5oQVeToYtkRBF149eI85UhWsBGwsJac,16686
pip/_vendor/requests/adapters.py,sha256=fp4t_woMNJPv8vikcrLbkkDxhJHJMZ3h8MlgtKvpuE8,14608
pip/_vendor/requests/compat.py,sha256=JGrJPV2YGatzwrexl9kSt8Z8QtmFboRZH9ywsLK_MMA,2556
pip/_vendor/requests/sessions.py,sha256=kwPPNj1M3D6yfHPcygUERvfqWaSx8odBijhqKTqRX_Q,22290
pip/_vendor/requests/status_codes.py,sha256=LYpqLv4AEKuTPby-QSvgl_gI7fcVlUDqSBcndIwX-Qg,3136
pip/_vendor/requests/certs.py,sha256=wSaqhSNoB0igp6Da-hWw0jtXICKXBbL8aS9swthlt50,544
pip/_vendor/requests/structures.py,sha256=d7f7ZXZZzgZtvrBQBZA1boJYX_QlP1YqL-_xtpzImGw,3541
pip/_vendor/requests/auth.py,sha256=x2bFqHK3Lkbm7qPUyh_dAqYLTDTotBi-1za9EpCdA0U,6123
pip/_vendor/requests/utils.py,sha256=MxSUha_2szwhfLKmGg5bolxt6lA6OghSvVZ4xMZwQhM,19973
pip/_vendor/requests/api.py,sha256=4xrabBN80yaqHxsomHVQD09v2VndgCz1cSsEnRvGGL0,4344
pip/_vendor/requests/packages/__init__.py,sha256=aXkbNCjM_WhryRBocE4AaA_p7-CTxL5LOutY7XzKm4s,62
pip/_vendor/requests/packages/chardet/big5prober.py,sha256=XX96C--6WKYW36mL-z7pJSAtc169Z8ZImByCP4pEN9A,1684
pip/_vendor/requests/packages/chardet/euckrfreq.py,sha256=T5saK5mImySG5ygQPtsp6o2uKulouCwYm2ElOyFkJqU,45978
pip/_vendor/requests/packages/chardet/langthaimodel.py,sha256=-k7djh3dGKngAGnt3WfuoJN7acDcWcmHAPojhaUd7q4,11275
pip/_vendor/requests/packages/chardet/euctwfreq.py,sha256=G_I0BW9i1w0ONeeUwIYqV7_U09buIHdqh-wNHVaql7I,34872
pip/_vendor/requests/packages/chardet/sbcharsetprober.py,sha256=Xq0lODqJnDgxglBiQI4BqTFiPbn63-0a5XNA5-hVu7U,4793
pip/_vendor/requests/packages/chardet/euckrprober.py,sha256=Wo7dnZ5Erw_nB4H-m5alMiOxOuJUmGHlwCSaGqExDZA,1675
pip/_vendor/requests/packages/chardet/escprober.py,sha256=q5TcQKeVq31WxrW7Sv8yjpZkjEoaHO8S92EJZ9hodys,3187
pip/_vendor/requests/packages/chardet/gb2312freq.py,sha256=M2gFdo_qQ_BslStEchrPW5CrPEZEacC0uyDLw4ok-kY,36011
pip/_vendor/requests/packages/chardet/sjisprober.py,sha256=1RjpQ2LU2gvoEB_4O839xDQVchWx2fG_C7_vXh52P5I,3734
pip/_vendor/requests/packages/chardet/__init__.py,sha256=8-39Dg2qEuod5DNN7RMdn2ZYOO9zFU3fFfaE80iDWGc,1295
pip/_vendor/requests/packages/chardet/latin1prober.py,sha256=g67gqZ2z89LUOlR7BZEAh4-p5a1yGWss9nWy8FCNm8Q,5241
pip/_vendor/requests/packages/chardet/langcyrillicmodel.py,sha256=fkcd5OvogUp-GrNDWAZPgkYsSRCD2omotAEvqjlmLKE,17725
pip/_vendor/requests/packages/chardet/charsetgroupprober.py,sha256=0lKk7VE516fgMw119tNefFqLOxKfIE9WfdkpIT69OKU,3791
pip/_vendor/requests/packages/chardet/chardistribution.py,sha256=cUARQFr1oTLXeJCDQrDRkUP778AvSMzhSCnG8VLCV58,9226
pip/_vendor/requests/packages/chardet/eucjpprober.py,sha256=5IpfSEjAb7h3hcGMd6dkU80O900C2N6xku28rdYFKuc,3678
pip/_vendor/requests/packages/chardet/mbcharsetprober.py,sha256=9rOCjDVsmSMp6e7q2syqak22j7lrbUZhJhMee2gbVL0,3268
pip/_vendor/requests/packages/chardet/langhungarianmodel.py,sha256=SXwuUzh49_cBeMXhshRHdrhlkz0T8_pZWV_pdqBKNFk,12536
pip/_vendor/requests/packages/chardet/langhebrewmodel.py,sha256=4ASl5vzKJPng4H278VHKtRYC03TpQpenlHTcsmZH1rE,11318
pip/_vendor/requests/packages/chardet/escsm.py,sha256=7iljEKN8lXTh8JFXPUSwlibMno6R6ksq4evLxbkzfro,7839
pip/_vendor/requests/packages/chardet/jisfreq.py,sha256=ZcL4R5ekHHbP2KCYGakVMBsiKqZZZAABzhwi-uRkOps,47315
pip/_vendor/requests/packages/chardet/big5freq.py,sha256=D8oTdz-GM7Jg8TsaWJDm65vM_OLHC3xub6qUJ3rOgsQ,82594
pip/_vendor/requests/packages/chardet/compat.py,sha256=5mm6yrHwef1JEG5OxkPJlSq5lkjLVpEGh3iPgFBkpkM,1157
pip/_vendor/requests/packages/chardet/gb2312prober.py,sha256=VWnjoRa83Y6V6oczMaxyUr0uy48iCnC2nzk9zfEIRHc,1681
pip/_vendor/requests/packages/chardet/utf8prober.py,sha256=7tdNZGrJY7jZUBD483GGMkiP0Tx8Fp-cGvWHoAsilHg,2652
pip/_vendor/requests/packages/chardet/universaldetector.py,sha256=GkZdwNyNfbFWC8I1uqnzyhOUF7favWCqCOKqdQlx6gQ,6831
pip/_vendor/requests/packages/chardet/sbcsgroupprober.py,sha256=8hLyH8RAG-aohBo7o_KciWVgRo42ZE_zEtuNG1JMRYI,3291
pip/_vendor/requests/packages/chardet/constants.py,sha256=-UnY8U7EP7z9fTyd09yq35BEkSFEAUAiv9ohd1DW1s4,1335
pip/_vendor/requests/packages/chardet/langbulgarianmodel.py,sha256=ZyPsA796MSVhYdfWhMCgKWckupAKAnKqWcE3Cl3ej6o,12784
pip/_vendor/requests/packages/chardet/euctwprober.py,sha256=upS2P6GuT5ujOxXYw-RJLcT7A4PTuo27KGUKU4UZpIQ,1676
pip/_vendor/requests/packages/chardet/langgreekmodel.py,sha256=QHMy31CH_ot67UCtmurCEKqKx2WwoaKrw2YCYYBK2Lw,12628
pip/_vendor/requests/packages/chardet/hebrewprober.py,sha256=8pdoUfsVXf_L4BnJde_BewS6H2yInV5688eu0nFhLHY,13359
pip/_vendor/requests/packages/chardet/chardetect.py,sha256=8g-dRSA97bSE6M25Tqe1roKKtl3XHSMnqi6vTzpHNV0,1141
pip/_vendor/requests/packages/chardet/charsetprober.py,sha256=Z48o2KiOj23FNqYH8FqzhH5m1qdm3rI8DcTm2Yqtklg,1902
pip/_vendor/requests/packages/chardet/mbcssm.py,sha256=UuiA4Ic8vEc0XpTKDneqZyiH2TwGuFVZxOxWJep3X_4,19608
pip/_vendor/requests/packages/chardet/mbcsgroupprober.py,sha256=SHRzNPLpDXfMJLA8phCHVU0WgqbgDCNxDQMolGX_7yk,1967
pip/_vendor/requests/packages/chardet/jpcntx.py,sha256=9fJ9oS0BUarcdZNySwmzVRuT03sYdClSmFwXDj3yVNg,19104
pip/_vendor/requests/packages/chardet/codingstatemachine.py,sha256=E85rYhHVMw9xDEJVgiQhp0OnLGr6i2r8_7QOWMKTH08,2318
pip/_vendor/requests/packages/chardet/cp949prober.py,sha256=FMvdLyB7fejPXRsTbca7LK1P3RUvvssmjUNyaEfz8zY,1782
pip/_vendor/requests/packages/urllib3/request.py,sha256=cXTcrr9d50Rt213ZXLgCf53KNWxe4LQ8lxSV1HBYa9E,5808
pip/_vendor/requests/packages/urllib3/exceptions.py,sha256=T-ILeqVPpEvrOYAq8XEyTF0X8XRWcFVGT2gMrF00km0,3364
pip/_vendor/requests/packages/urllib3/filepost.py,sha256=tWPY33HnFM_RPpEU9PHv9D34n67w8ZRt80ZSsWIv0Kk,2512
pip/_vendor/requests/packages/urllib3/__init__.py,sha256=sLIKv9dGJjDloiVXUBBjXDWWq8bM66kcvTH2SU_WZKg,1701
pip/_vendor/requests/packages/urllib3/response.py,sha256=ff9-9sZkghNWCyeoECvImHspITTum7KOM20J2ia4SAw,10347
pip/_vendor/requests/packages/urllib3/fields.py,sha256=UuTJzGxUc9H1LPYZnD3f8GW308Vx_znb5pt4yimORsI,5976
pip/_vendor/requests/packages/urllib3/_collections.py,sha256=Oh1gxPZRqtOSy3pTV0pWQ949t9sjRAFMautsHiHP_pY,6557
pip/_vendor/requests/packages/urllib3/connection.py,sha256=eug-y4_dOa-x9bxDlURwpqlZuQDhl9Tjre5D1S5bijE,6533
pip/_vendor/requests/packages/urllib3/connectionpool.py,sha256=8eDsWYJzKYOyXMiP4CJqtLeychOw3iD_P20Ov-dbGUs,26904
pip/_vendor/requests/packages/urllib3/poolmanager.py,sha256=bMYHdNaVI5O4YrJHr1T6tE2RYHEMzM2_K0cTy7uzX2M,8977
pip/_vendor/requests/packages/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
pip/_vendor/requests/packages/urllib3/contrib/ntlmpool.py,sha256=VJ-GjxpYITxSj4UDKX0iqvHwaatyg2RA3PaTym5Wp6w,4741
pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.py,sha256=D1cbFXSoWj4ahM0azQdvIDFkvNnzMLxOvo1wnMrPo8M,15086
pip/_vendor/requests/packages/urllib3/packages/__init__.py,sha256=EKCTAOjZtPR_HC50e7X8hS5j4bkFkN87XZOT-Wdpfus,74
pip/_vendor/requests/packages/urllib3/packages/six.py,sha256=U-rO-WBrFS8PxHeamSl6okKCjqPF18NhiZb0qPZ67XM,11628
pip/_vendor/requests/packages/urllib3/packages/ordered_dict.py,sha256=HtHphtStJlorzQqoIat8zUH0lqLns416gfSO9y_aSAQ,8936
pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py,sha256=cOWMIn1orgJoA35p6pSzO_-Dc6iOX9Dhl6D2sL9b_2o,460
pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py,sha256=fK28k37hL7-D79v9iM2fHgNK9Q1Pw0M7qVRL4rkfFjQ,3778
pip/_vendor/requests/packages/urllib3/util/request.py,sha256=-mIHA_M2aZwEmW5PpNfxEi9B47YDmFcoTW5FvQ7prf4,1924
pip/_vendor/requests/packages/urllib3/util/timeout.py,sha256=WGx3s4593QcpwyHLY1FpFZgGPiTdL26A2nJhsZa9Rj8,9236
pip/_vendor/requests/packages/urllib3/util/__init__.py,sha256=nI42Lb9ShOOOl_uRDyJfZP_nxHCR4wTFJXmDa_GEe7c,622
pip/_vendor/requests/packages/urllib3/util/url.py,sha256=ftfW-i1XtyFZEOEKfXLkKNmM7APmgNHbtcGWYr-6xdI,4273
pip/_vendor/requests/packages/urllib3/util/response.py,sha256=EVO-5Q1Wc9K61i3RIhPB83CXfnvZpphL_NNp0SLznzI,354
pip/_vendor/requests/packages/urllib3/util/ssl_.py,sha256=0SJbyE9KURi8IjmOwo8sqmmit4sRkXf9eg_ODWOhSD0,4235
pip/_vendor/requests/packages/urllib3/util/connection.py,sha256=Df5MeJaIpPigbIxEa87ojZ7qxXm1-V9dhnc2m7S6lNA,1348
pip/_vendor/_markerlib/markers.py,sha256=YuFp0-osufFIoqnzG3L0Z2fDCx4Vln3VUDeXJ2DA_1I,3979
pip/_vendor/_markerlib/__init__.py,sha256=2hgtRuYDOrimZF9-ENCkrP8gnJ59HZEtlk-zoTEvn1Y,564
pip/_vendor/colorama/ansi.py,sha256=spKO9jqXAB9POAj6M3bZLrdCf-W9wUVeDCqF664WSGs,1039
pip/_vendor/colorama/initialise.py,sha256=sL44vQFKG5BAoFgoIxfhH0wG2NnLBw9mtnWFVtXkHGs,1297
pip/_vendor/colorama/winterm.py,sha256=RhWJPcGA_T1knfS-84AXpQ0C7cn8XWE6iQkqy1GPsmk,4206
pip/_vendor/colorama/__init__.py,sha256=eABG0aR8L-8JfIiftmvixrDZvqHawB7KIIxiRdKsi1k,217
pip/_vendor/colorama/ansitowin32.py,sha256=C0mA80tFRvkdHVTHzvyrCzsI0CNQ1gY9ng6deCxkbGY,6664
pip/_vendor/colorama/win32.py,sha256=tMAHgaTSySAt5BI5hBoID6oshHIYnJBlUqDsOoHbV0w,4911
pip-1.5.6.dist-info/DESCRIPTION.rst,sha256=n5sT7bxCOnG9ej7TtEjjARQZ_n2ECqWFDiJK88BM0u0,1422
pip-1.5.6.dist-info/RECORD,,
pip-1.5.6.dist-info/METADATA,sha256=lUBJx4V5mJY0jPlxYlu1x4YUNML-AN4dn4Dv-EFX8-Y,2499
pip-1.5.6.dist-info/WHEEL,sha256=SXYYsi-y-rEGIva8sB8iKF6bAFD6YDhmqHX5hI3fc0o,110
pip-1.5.6.dist-info/pydist.json,sha256=dWd43njFFdIOoXBWKB94FC8b_27-Fmu8cIcoyeGEe6I,1361
pip-1.5.6.dist-info/entry_points.txt,sha256=qqYf5oRjyrrYv-a-0MnFqbCif4F6oY_kyR-jQTzaels,68
pip-1.5.6.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
/opt/alt/python33/bin/pip,sha256=drKvwXvW5Oaq3nxOcd1FzZkrrW8RATX_LtVFxY9rbpU,218
/opt/alt/python33/bin/pip3,sha256=drKvwXvW5Oaq3nxOcd1FzZkrrW8RATX_LtVFxY9rbpU,218
/opt/alt/python33/bin/pip3.3,sha256=drKvwXvW5Oaq3nxOcd1FzZkrrW8RATX_LtVFxY9rbpU,218
pip/vcs/__pycache__/__init__.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/escprober.cpython-33.pyc,,
pip/_vendor/html5lib/filters/__pycache__/_base.cpython-33.pyc,,
pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/util/__pycache__/__init__.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/contrib/__pycache__/ntlmpool.cpython-33.pyc,,
pip/_vendor/colorama/__pycache__/win32.cpython-33.pyc,,
pip/_vendor/distlib/__pycache__/version.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/sbcharsetprober.cpython-33.pyc,,
pip/commands/__pycache__/uninstall.cpython-33.pyc,,
pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-33.pyc,,
pip/_vendor/requests/__pycache__/compat.cpython-33.pyc,,
pip/_vendor/html5lib/__pycache__/html5parser.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/langthaimodel.cpython-33.pyc,,
pip/__pycache__/__main__.cpython-33.pyc,,
pip/commands/__pycache__/install.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/contrib/__pycache__/__init__.cpython-33.pyc,,
pip/_vendor/html5lib/trie/__pycache__/datrie.cpython-33.pyc,,
pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-33.pyc,,
pip/__pycache__/pep425tags.cpython-33.pyc,,
pip/_vendor/html5lib/__pycache__/tokenizer.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/mbcharsetprober.cpython-33.pyc,,
pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/hebrewprober.cpython-33.pyc,,
pip/__pycache__/index.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/langbulgarianmodel.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/__pycache__/connectionpool.cpython-33.pyc,,
pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-33.pyc,,
pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-33.pyc,,
pip/vcs/__pycache__/git.cpython-33.pyc,,
pip/_vendor/requests/__pycache__/exceptions.cpython-33.pyc,,
pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-33.pyc,,
pip/_vendor/distlib/__pycache__/metadata.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/gb2312freq.cpython-33.pyc,,
pip/_vendor/html5lib/treewalkers/__pycache__/pulldom.cpython-33.pyc,,
pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-33.pyc,,
pip/_vendor/__pycache__/six.cpython-33.pyc,,
pip/commands/__pycache__/list.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/big5freq.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/compat.cpython-33.pyc,,
pip/_vendor/html5lib/__pycache__/sanitizer.cpython-33.pyc,,
pip/_vendor/_markerlib/__pycache__/markers.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/mbcssm.cpython-33.pyc,,
pip/_vendor/colorama/__pycache__/initialise.cpython-33.pyc,,
pip/_vendor/requests/__pycache__/utils.cpython-33.pyc,,
pip/_vendor/__pycache__/pkg_resources.cpython-33.pyc,,
pip/__pycache__/wheel.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/util/__pycache__/url.cpython-33.pyc,,
pip/__pycache__/basecommand.cpython-33.pyc,,
pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-33.pyc,,
pip/_vendor/requests/__pycache__/structures.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/charsetgroupprober.cpython-33.pyc,,
pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-33.pyc,,
pip/commands/__pycache__/search.cpython-33.pyc,,
pip/_vendor/distlib/__pycache__/locators.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/__pycache__/exceptions.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/gb2312prober.cpython-33.pyc,,
pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-33.pyc,,
pip/_vendor/colorama/__pycache__/winterm.cpython-33.pyc,,
pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-33.pyc,,
pip/_vendor/html5lib/__pycache__/constants.cpython-33.pyc,,
pip/_vendor/requests/__pycache__/cookies.cpython-33.pyc,,
pip/_vendor/requests/__pycache__/models.cpython-33.pyc,,
pip/_vendor/__pycache__/re-vendor.cpython-33.pyc,,
pip/_vendor/distlib/__pycache__/compat.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/sjisprober.cpython-33.pyc,,
pip/__pycache__/__init__.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/__pycache__/fields.cpython-33.pyc,,
pip/_vendor/_markerlib/__pycache__/__init__.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/escsm.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/jisfreq.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/util/__pycache__/connection.cpython-33.pyc,,
pip/commands/__pycache__/completion.cpython-33.pyc,,
pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-33.pyc,,
pip/_vendor/distlib/__pycache__/wheel.cpython-33.pyc,,
pip/_vendor/distlib/__pycache__/index.cpython-33.pyc,,
pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-33.pyc,,
pip/__pycache__/runner.cpython-33.pyc,,
pip/commands/__pycache__/show.cpython-33.pyc,,
pip/__pycache__/req.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/__pycache__/_collections.cpython-33.pyc,,
pip/_vendor/requests/__pycache__/adapters.cpython-33.pyc,,
pip/vcs/__pycache__/subversion.cpython-33.pyc,,
pip/_vendor/distlib/_backport/__pycache__/misc.cpython-33.pyc,,
pip/_vendor/html5lib/serializer/__pycache__/__init__.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/euctwfreq.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/__pycache__/filepost.cpython-33.pyc,,
pip/commands/__pycache__/__init__.cpython-33.pyc,,
pip/_vendor/requests/__pycache__/api.cpython-33.pyc,,
pip/commands/__pycache__/bundle.cpython-33.pyc,,
pip/_vendor/html5lib/__pycache__/inputstream.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/charsetprober.cpython-33.pyc,,
pip/_vendor/distlib/__pycache__/scripts.cpython-33.pyc,,
pip/_vendor/requests/__pycache__/__init__.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-33.pyc,,
pip/__pycache__/log.cpython-33.pyc,,
pip/_vendor/html5lib/trie/__pycache__/_base.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/__pycache__/poolmanager.cpython-33.pyc,,
pip/_vendor/requests/packages/__pycache__/__init__.cpython-33.pyc,,
pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-33.pyc,,
pip/vcs/__pycache__/bazaar.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/big5prober.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/__pycache__/request.cpython-33.pyc,,
pip/_vendor/html5lib/treewalkers/__pycache__/_base.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/contrib/__pycache__/pyopenssl.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-33.pyc,,
pip/_vendor/distlib/__pycache__/__init__.cpython-33.pyc,,
pip/_vendor/distlib/__pycache__/util.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/packages/__pycache__/six.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/langcyrillicmodel.cpython-33.pyc,,
pip/_vendor/colorama/__pycache__/ansitowin32.cpython-33.pyc,,
pip/__pycache__/util.cpython-33.pyc,,
pip/commands/__pycache__/help.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/euckrfreq.cpython-33.pyc,,
pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-33.pyc,,
pip/_vendor/colorama/__pycache__/ansi.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/__pycache__/__init__.cpython-33.pyc,,
pip/_vendor/html5lib/treewalkers/__pycache__/genshistream.cpython-33.pyc,,
pip/commands/__pycache__/unzip.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/sbcsgroupprober.cpython-33.pyc,,
pip/_vendor/__pycache__/__init__.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/mbcsgroupprober.cpython-33.pyc,,
pip/_vendor/html5lib/treebuilders/__pycache__/_base.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/chardistribution.cpython-33.pyc,,
pip/_vendor/distlib/__pycache__/markers.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/util/__pycache__/request.cpython-33.pyc,,
pip/commands/__pycache__/freeze.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/constants.cpython-33.pyc,,
pip/_vendor/requests/__pycache__/status_codes.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/universaldetector.cpython-33.pyc,,
pip/commands/__pycache__/wheel.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/euckrprober.cpython-33.pyc,,
pip/_vendor/html5lib/filters/__pycache__/lint.cpython-33.pyc,,
pip/__pycache__/exceptions.cpython-33.pyc,,
pip/commands/__pycache__/zip.cpython-33.pyc,,
pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-33.pyc,,
pip/backwardcompat/__pycache__/__init__.cpython-33.pyc,,
pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/langgreekmodel.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/packages/__pycache__/__init__.cpython-33.pyc,,
pip/_vendor/requests/__pycache__/sessions.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/packages/__pycache__/ordered_dict.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/latin1prober.cpython-33.pyc,,
pip/_vendor/distlib/__pycache__/resources.cpython-33.pyc,,
pip/_vendor/requests/__pycache__/certs.cpython-33.pyc,,
pip/_vendor/html5lib/__pycache__/ihatexml.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/langhungarianmodel.cpython-33.pyc,,
pip/__pycache__/cmdoptions.cpython-33.pyc,,
pip/_vendor/html5lib/__pycache__/__init__.cpython-33.pyc,,
pip/__pycache__/baseparser.cpython-33.pyc,,
pip/_vendor/html5lib/serializer/__pycache__/htmlserializer.cpython-33.pyc,,
pip/_vendor/distlib/__pycache__/database.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/util/__pycache__/timeout.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/jpcntx.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/codingstatemachine.cpython-33.pyc,,
pip/_vendor/distlib/__pycache__/manifest.cpython-33.pyc,,
pip/_vendor/html5lib/treewalkers/__pycache__/lxmletree.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/__pycache__/response.cpython-33.pyc,,
pip/_vendor/html5lib/trie/__pycache__/py.cpython-33.pyc,,
pip/_vendor/html5lib/trie/__pycache__/__init__.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/eucjpprober.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/euctwprober.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/utf8prober.cpython-33.pyc,,
pip/_vendor/requests/__pycache__/auth.cpython-33.pyc,,
pip/__pycache__/locations.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/langhebrewmodel.cpython-33.pyc,,
pip/vcs/__pycache__/mercurial.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/__pycache__/connection.cpython-33.pyc,,
pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-33.pyc,,
pip/_vendor/html5lib/__pycache__/utils.cpython-33.pyc,,
pip/__pycache__/status_codes.cpython-33.pyc,,
pip/_vendor/colorama/__pycache__/__init__.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/chardetect.cpython-33.pyc,,
pip/_vendor/requests/__pycache__/hooks.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/util/__pycache__/ssl_.cpython-33.pyc,,
pip/__pycache__/download.cpython-33.pyc,,
pip/_vendor/requests/packages/urllib3/util/__pycache__/response.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/__init__.cpython-33.pyc,,
pip/_vendor/requests/packages/chardet/__pycache__/cp949prober.cpython-33.pyc,,
site-packages/pip-1.5.6.dist-info/top_level.txt000064400000000004151733464100015144 0ustar00pip
site-packages/pip-1.5.6.dist-info/DESCRIPTION.rst000064400000002616151733464100014742 0ustar00
Project Info
============

* Project Page: https://github.com/pypa/pip
* Install howto: https://pip.pypa.io/en/latest/installing.html
* Changelog: https://pip.pypa.io/en/latest/news.html
* Bug Tracking: https://github.com/pypa/pip/issues
* Mailing list: http://groups.google.com/group/python-virtualenv
* Docs: https://pip.pypa.io/
* User IRC: #pypa on Freenode.
* Dev IRC: #pypa-dev on Freenode.

Quickstart
==========

First, :doc:`Install pip <installing>`.

Install a package from `PyPI`_:

::

  $ pip install SomePackage
    [...]
    Successfully installed SomePackage

Show what files were installed:

::

  $ pip show --files SomePackage
    Name: SomePackage
    Version: 1.0
    Location: /my/env/lib/pythonx.x/site-packages
    Files:
     ../somepackage/__init__.py
     [...]

List what packages are outdated:

::

  $ pip list --outdated
    SomePackage (Current: 1.0 Latest: 2.0)

Upgrade a package:

::

  $ pip install --upgrade SomePackage
    [...]
    Found existing installation: SomePackage 1.0
    Uninstalling SomePackage:
      Successfully uninstalled SomePackage
    Running setup.py install for SomePackage
    Successfully installed SomePackage

Uninstall a package:

::

  $ pip uninstall SomePackage
    Uninstalling SomePackage:
      /my/env/lib/pythonx.x/site-packages/somepackage
    Proceed (y/n)? y
    Successfully uninstalled SomePackage


.. _PyPI: http://pypi.python.org/pypi/


site-packages/pip-1.5.6.dist-info/WHEEL000064400000000156151733464100013211 0ustar00Wheel-Version: 1.0
Generator: bdist_wheel (0.22.0)
Root-Is-Purelib: true
Tag: py2-none-any
Tag: py3-none-any

site-packages/setuptools-2.0.dist-info/zip-safe000064400000000002151733464100015332 0ustar00
site-packages/setuptools-2.0.dist-info/entry_points.txt000064400000005325151733464100017204 0ustar00[egg_info.writers]
dependency_links.txt = setuptools.command.egg_info:overwrite_arg
eager_resources.txt = setuptools.command.egg_info:overwrite_arg
depends.txt = setuptools.command.egg_info:warn_depends_obsolete
top_level.txt = setuptools.command.egg_info:write_toplevel_names
entry_points.txt = setuptools.command.egg_info:write_entries
requires.txt = setuptools.command.egg_info:write_requirements
PKG-INFO = setuptools.command.egg_info:write_pkg_info
namespace_packages.txt = setuptools.command.egg_info:overwrite_arg

[setuptools.installation]
eggsecutable = setuptools.command.easy_install:bootstrap

[setuptools.file_finders]
svn_cvs = setuptools.command.sdist:_default_revctrl

[distutils.commands]
install_scripts = setuptools.command.install_scripts:install_scripts
build_ext = setuptools.command.build_ext:build_ext
egg_info = setuptools.command.egg_info:egg_info
bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm
build_py = setuptools.command.build_py:build_py
install_egg_info = setuptools.command.install_egg_info:install_egg_info
install_lib = setuptools.command.install_lib:install_lib
register = setuptools.command.register:register
develop = setuptools.command.develop:develop
sdist = setuptools.command.sdist:sdist
rotate = setuptools.command.rotate:rotate
alias = setuptools.command.alias:alias
test = setuptools.command.test:test
bdist_egg = setuptools.command.bdist_egg:bdist_egg
install = setuptools.command.install:install
saveopts = setuptools.command.saveopts:saveopts
upload_docs = setuptools.command.upload_docs:upload_docs
setopt = setuptools.command.setopt:setopt
easy_install = setuptools.command.easy_install:easy_install
bdist_wininst = setuptools.command.bdist_wininst:bdist_wininst

[distutils.setup_keywords]
exclude_package_data = setuptools.dist:check_package_data
zip_safe = setuptools.dist:assert_bool
install_requires = setuptools.dist:check_requirements
eager_resources = setuptools.dist:assert_string_list
extras_require = setuptools.dist:check_extras
use_2to3_fixers = setuptools.dist:assert_string_list
tests_require = setuptools.dist:check_requirements
convert_2to3_doctests = setuptools.dist:assert_string_list
test_loader = setuptools.dist:check_importable
include_package_data = setuptools.dist:assert_bool
test_suite = setuptools.dist:check_test_suite
packages = setuptools.dist:check_packages
entry_points = setuptools.dist:check_entry_points
dependency_links = setuptools.dist:assert_string_list
use_2to3 = setuptools.dist:assert_bool
use_2to3_exclude_fixers = setuptools.dist:assert_string_list
package_data = setuptools.dist:check_package_data
namespace_packages = setuptools.dist:check_nsp

[console_scripts]
easy_install = setuptools.command.easy_install:main
easy_install-3.3 = setuptools.command.easy_install:main

site-packages/setuptools-2.0.dist-info/METADATA000064400000213042151733464100015006 0ustar00Metadata-Version: 2.0
Name: setuptools
Version: 2.0
Summary: Easily download, build, install, upgrade, and uninstall Python packages
Home-page: https://pypi.python.org/pypi/setuptools
Author: Python Packaging Authority
Author-email: distutils-sig@python.org
License: PSF or ZPL
Keywords: CPAN PyPI distutils eggs package management
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Python Software Foundation License
Classifier: License :: OSI Approved :: Zope Public License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.1
Classifier: Programming Language :: Python :: 3.2
Classifier: Programming Language :: Python :: 3.3
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: System :: Archiving :: Packaging
Classifier: Topic :: System :: Systems Administration
Classifier: Topic :: Utilities
Provides-Extra: ssl:sys_platform=='win32'
Requires-Dist: wincertstore (==0.1); extra == "ssl:sys_platform=='win32'"
Provides-Extra: certs
Requires-Dist: certifi (==0.0.8); extra == 'certs'

===============================
Installing and Using Setuptools
===============================

.. contents:: **Table of Contents**


-------------------------
Installation Instructions
-------------------------

Upgrading from Distribute
=========================

Currently, Distribute disallows installing Setuptools 0.7+ over Distribute.
You must first uninstall any active version of Distribute first (see
`Uninstalling`_).

Upgrading from Setuptools 0.6
=============================

Upgrading from prior versions of Setuptools is supported. Initial reports
good success in this regard.

Windows
=======

The recommended way to install setuptools on Windows is to download
`ez_setup.py`_ and run it. The script will download the appropriate .egg
file and install it for you.

.. _ez_setup.py: https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py

For best results, uninstall previous versions FIRST (see `Uninstalling`_).

Once installation is complete, you will find an ``easy_install`` program in
your Python ``Scripts`` subdirectory.  For simple invocation and best results,
add this directory to your ``PATH`` environment variable, if it is not already
present.


Unix-based Systems including Mac OS X
=====================================

Download `ez_setup.py`_ and run it using the target Python version. The script
will download the appropriate version and install it for you::

    > wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | python

Note that you will may need to invoke the command with superuser privileges to
install to the system Python::

    > wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | sudo python

Alternatively, on Python 2.6 and later, Setuptools may be installed to a
user-local path::

    > wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py
    > python ez_setup.py --user


Python 2.4 and Python 2.5 support
=================================

Setuptools 2.0 and later requires Python 2.6 or later. To install setuptools
on Python 2.4 or Python 2.5, use the bootstrap script for Setuptools 1.x:
https://bitbucket.org/pypa/setuptools/raw/bootstrap-py24/ez_setup.py.


Advanced Installation
=====================

For more advanced installation options, such as installing to custom
locations or prefixes, download and extract the source
tarball from `Setuptools on PyPI <https://pypi.python.org/pypi/setuptools>`_
and run setup.py with any supported distutils and Setuptools options.
For example::

    setuptools-x.x$ python setup.py --prefix=/opt/setuptools

Use ``--help`` to get a full options list, but we recommend consulting
the `EasyInstall manual`_ for detailed instructions, especially `the section
on custom installation locations`_.

.. _EasyInstall manual: https://pythonhosted.org/setuptools/EasyInstall
.. _the section on custom installation locations: https://pythonhosted.org/setuptools/EasyInstall#custom-installation-locations


Downloads
=========

All setuptools downloads can be found at `the project's home page in the Python
Package Index`_.  Scroll to the very bottom of the page to find the links.

.. _the project's home page in the Python Package Index: https://pypi.python.org/pypi/setuptools

In addition to the PyPI downloads, the development version of ``setuptools``
is available from the `Bitbucket repo`_, and in-development versions of the
`0.6 branch`_ are available as well.

.. _Bitbucket repo: https://bitbucket.org/pypa/setuptools/get/default.tar.gz#egg=setuptools-dev
.. _0.6 branch: http://svn.python.org/projects/sandbox/branches/setuptools-0.6/#egg=setuptools-dev06

Uninstalling
============

On Windows, if Setuptools was installed using an ``.exe`` or ``.msi``
installer, simply use the uninstall feature of "Add/Remove Programs" in the
Control Panel.

Otherwise, to uninstall Setuptools or Distribute, regardless of the Python
version, delete all ``setuptools*`` and ``distribute*`` files and
directories from your system's ``site-packages`` directory
(and any other ``sys.path`` directories) FIRST.

If you are upgrading or otherwise plan to re-install Setuptools or Distribute,
nothing further needs to be done. If you want to completely remove Setuptools,
you may also want to remove the 'easy_install' and 'easy_install-x.x' scripts
and associated executables installed to the Python scripts directory.

--------------------------------
Using Setuptools and EasyInstall
--------------------------------

Here are some of the available manuals, tutorials, and other resources for
learning about Setuptools, Python Eggs, and EasyInstall:

* `The EasyInstall user's guide and reference manual`_
* `The setuptools Developer's Guide`_
* `The pkg_resources API reference`_
* `Package Compatibility Notes`_ (user-maintained)
* `The Internal Structure of Python Eggs`_

Questions, comments, and bug reports should be directed to the `distutils-sig
mailing list`_.  If you have written (or know of) any tutorials, documentation,
plug-ins, or other resources for setuptools users, please let us know about
them there, so this reference list can be updated.  If you have working,
*tested* patches to correct problems or add features, you may submit them to
the `setuptools bug tracker`_.

.. _setuptools bug tracker: https://bitbucket.org/pypa/setuptools/issues
.. _Package Compatibility Notes: https://pythonhosted.org/setuptools/PackageNotes
.. _The Internal Structure of Python Eggs: https://pythonhosted.org/setuptools/formats.html
.. _The setuptools Developer's Guide: https://pythonhosted.org/setuptools/setuptools.html
.. _The pkg_resources API reference: https://pythonhosted.org/setuptools/pkg_resources.html
.. _The EasyInstall user's guide and reference manual: https://pythonhosted.org/setuptools/easy_install.html
.. _distutils-sig mailing list: http://mail.python.org/pipermail/distutils-sig/


-------
Credits
-------

* The original design for the ``.egg`` format and the ``pkg_resources`` API was
  co-created by Phillip Eby and Bob Ippolito.  Bob also implemented the first
  version of ``pkg_resources``, and supplied the OS X operating system version
  compatibility algorithm.

* Ian Bicking implemented many early "creature comfort" features of
  easy_install, including support for downloading via Sourceforge and
  Subversion repositories.  Ian's comments on the Web-SIG about WSGI
  application deployment also inspired the concept of "entry points" in eggs,
  and he has given talks at PyCon and elsewhere to inform and educate the
  community about eggs and setuptools.

* Jim Fulton contributed time and effort to build automated tests of various
  aspects of ``easy_install``, and supplied the doctests for the command-line
  ``.exe`` wrappers on Windows.

* Phillip J. Eby is the seminal author of setuptools, and
  first proposed the idea of an importable binary distribution format for
  Python application plug-ins.

* Significant parts of the implementation of setuptools were funded by the Open
  Source Applications Foundation, to provide a plug-in infrastructure for the
  Chandler PIM application.  In addition, many OSAF staffers (such as Mike
  "Code Bear" Taylor) contributed their time and stress as guinea pigs for the
  use of eggs and setuptools, even before eggs were "cool".  (Thanks, guys!)

* Since the merge with Distribute, Jason R. Coombs is the
  maintainer of setuptools.  The project is maintained in coordination with
  the Python Packaging Authority (PyPA) and the larger Python community.

.. _files:

=======
CHANGES
=======

---
2.0
---

* `Issue #121 <https://bitbucket.org/pypa/setuptools/issue/121>`_: Exempt lib2to3 pickled grammars from DirectorySandbox.
* `Issue #41 <https://bitbucket.org/pypa/setuptools/issue/41>`_: Dropped support for Python 2.4 and Python 2.5. Clients requiring
  setuptools for those versions of Python should use setuptools 1.x.
* Removed ``setuptools.command.easy_install.HAS_USER_SITE``. Clients
  expecting this boolean variable should use ``site.ENABLE_USER_SITE``
  instead.
* Removed ``pkg_resources.ImpWrapper``. Clients that expected this class
  should use ``pkgutil.ImpImporter`` instead.

-----
1.4.2
-----

* `Issue #116 <https://bitbucket.org/pypa/setuptools/issue/116>`_: Correct TypeError when reading a local package index on Python
  3.

-----
1.4.1
-----

* `Issue #114 <https://bitbucket.org/pypa/setuptools/issue/114>`_: Use ``sys.getfilesystemencoding`` for decoding config in
  ``bdist_wininst`` distributions.

* `Issue #105 <https://bitbucket.org/pypa/setuptools/issue/105>`_ and `Issue #113 <https://bitbucket.org/pypa/setuptools/issue/113>`_: Establish a more robust technique for
  determining the terminal encoding::

    1. Try ``getpreferredencoding``
    2. If that returns US_ASCII or None, try the encoding from
       ``getdefaultlocale``. If that encoding was a "fallback" because Python
       could not figure it out from the environment or OS, encoding remains
       unresolved.
    3. If the encoding is resolved, then make sure Python actually implements
       the encoding.
    4. On the event of an error or unknown codec, revert to fallbacks
       (UTF-8 on Darwin, ASCII on everything else).
    5. On the encoding is 'mac-roman' on Darwin, use UTF-8 as 'mac-roman' was
       a bug on older Python releases.

    On a side note, it would seem that the encoding only matters for when SVN
    does not yet support ``--xml`` and when getting repository and svn version
    numbers. The ``--xml`` technique should yield UTF-8 according to some
    messages on the SVN mailing lists. So if the version numbers are always
    7-bit ASCII clean, it may be best to only support the file parsing methods
    for legacy SVN releases and support for SVN without the subprocess command
    would simple go away as support for the older SVNs does.

---
1.4
---

* `Issue #27 <https://bitbucket.org/pypa/setuptools/issue/27>`_: ``easy_install`` will now use credentials from .pypirc if
  present for connecting to the package index.
* `Pull Request #21 <https://bitbucket.org/pypa/setuptools/pull-request/21>`_: Omit unwanted newlines in ``package_index._encode_auth``
  when the username/password pair length indicates wrapping.

-----
1.3.2
-----

* `Issue #99 <https://bitbucket.org/pypa/setuptools/issue/99>`_: Fix filename encoding issues in SVN support.

-----
1.3.1
-----

* Remove exuberant warning in SVN support when SVN is not used.

---
1.3
---

* Address security vulnerability in SSL match_hostname check as reported in
  `Python #17997 <http://bugs.python.org/issue17997>`_.
* Prefer `backports.ssl_match_hostname
  <https://pypi.python.org/pypi/backports.ssl_match_hostname>`_ for backport
  implementation if present.
* Correct NameError in ``ssl_support`` module (``socket.error``).

---
1.2
---

* `Issue #26 <https://bitbucket.org/pypa/setuptools/issue/26>`_: Add support for SVN 1.7. Special thanks to Philip Thiem for the
  contribution.
* `Issue #93 <https://bitbucket.org/pypa/setuptools/issue/93>`_: Wheels are now distributed with every release. Note that as
  reported in `Issue #108 <https://bitbucket.org/pypa/setuptools/issue/108>`_, as of Pip 1.4, scripts aren't installed properly
  from wheels. Therefore, if using Pip to install setuptools from a wheel,
  the ``easy_install`` command will not be available.
* Setuptools "natural" launcher support, introduced in 1.0, is now officially
  supported.

-----
1.1.7
-----

* Fixed behavior of NameError handling in 'script template (dev).py' (script
  launcher for 'develop' installs).
* ``ez_setup.py`` now ensures partial downloads are cleaned up following
  a failed download.
* `Distribute #363 <https://bitbucket.org/tarek/distribute/issue/363>`_ and `Issue #55 <https://bitbucket.org/pypa/setuptools/issue/55>`_: Skip an sdist test that fails on locales
  other than UTF-8.

-----
1.1.6
-----

* `Distribute #349 <https://bitbucket.org/tarek/distribute/issue/349>`_: ``sandbox.execfile`` now opens the target file in binary
  mode, thus honoring a BOM in the file when compiled.

-----
1.1.5
-----

* `Issue #69 <https://bitbucket.org/pypa/setuptools/issue/69>`_: Second attempt at fix (logic was reversed).

-----
1.1.4
-----

* `Issue #77 <https://bitbucket.org/pypa/setuptools/issue/77>`_: Fix error in upload command (Python 2.4).

-----
1.1.3
-----

* Fix NameError in previous patch.

-----
1.1.2
-----

* `Issue #69 <https://bitbucket.org/pypa/setuptools/issue/69>`_: Correct issue where 404 errors are returned for URLs with
  fragments in them (such as #egg=).

-----
1.1.1
-----

* `Issue #75 <https://bitbucket.org/pypa/setuptools/issue/75>`_: Add ``--insecure`` option to ez_setup.py to accommodate
  environments where a trusted SSL connection cannot be validated.
* `Issue #76 <https://bitbucket.org/pypa/setuptools/issue/76>`_: Fix AttributeError in upload command with Python 2.4.

---
1.1
---

* `Issue #71 <https://bitbucket.org/pypa/setuptools/issue/71>`_ (`Distribute #333 <https://bitbucket.org/tarek/distribute/issue/333>`_): EasyInstall now puts less emphasis on the
  condition when a host is blocked via ``--allow-hosts``.
* `Issue #72 <https://bitbucket.org/pypa/setuptools/issue/72>`_: Restored Python 2.4 compatibility in ``ez_setup.py``.

---
1.0
---

* `Issue #60 <https://bitbucket.org/pypa/setuptools/issue/60>`_: On Windows, Setuptools supports deferring to another launcher,
  such as Vinay Sajip's `pylauncher <https://bitbucket.org/pypa/pylauncher>`_
  (included with Python 3.3) to launch console and GUI scripts and not install
  its own launcher executables. This experimental functionality is currently
  only enabled if  the ``SETUPTOOLS_LAUNCHER`` environment variable is set to
  "natural". In the future, this behavior may become default, but only after
  it has matured and seen substantial adoption. The ``SETUPTOOLS_LAUNCHER``
  also accepts "executable" to force the default behavior of creating launcher
  executables.
* `Issue #63 <https://bitbucket.org/pypa/setuptools/issue/63>`_: Bootstrap script (ez_setup.py) now prefers Powershell, curl, or
  wget for retrieving the Setuptools tarball for improved security of the
  install. The script will still fall back to a simple ``urlopen`` on
  platforms that do not have these tools.
* `Issue #65 <https://bitbucket.org/pypa/setuptools/issue/65>`_: Deprecated the ``Features`` functionality.
* `Issue #52 <https://bitbucket.org/pypa/setuptools/issue/52>`_: In ``VerifyingHTTPSConn``, handle a tunnelled (proxied)
  connection.

Backward-Incompatible Changes
=============================

This release includes a couple of backward-incompatible changes, but most if
not all users will find 1.0 a drop-in replacement for 0.9.

* `Issue #50 <https://bitbucket.org/pypa/setuptools/issue/50>`_: Normalized API of environment marker support. Specifically,
  removed line number and filename from SyntaxErrors when returned from
  `pkg_resources.invalid_marker`. Any clients depending on the specific
  string representation of exceptions returned by that function may need to
  be updated to account for this change.
* `Issue #50 <https://bitbucket.org/pypa/setuptools/issue/50>`_: SyntaxErrors generated by `pkg_resources.invalid_marker` are
  normalized for cross-implementation consistency.
* Removed ``--ignore-conflicts-at-my-risk`` and ``--delete-conflicting``
  options to easy_install. These options have been deprecated since 0.6a11.

-----
0.9.8
-----

* `Issue #53 <https://bitbucket.org/pypa/setuptools/issue/53>`_: Fix NameErrors in `_vcs_split_rev_from_url`.

-----
0.9.7
-----

* `Issue #49 <https://bitbucket.org/pypa/setuptools/issue/49>`_: Correct AttributeError on PyPy where a hashlib.HASH object does
  not have a `.name` attribute.
* `Issue #34 <https://bitbucket.org/pypa/setuptools/issue/34>`_: Documentation now refers to bootstrap script in code repository
  referenced by bookmark.
* Add underscore-separated keys to environment markers (markerlib).

-----
0.9.6
-----

* `Issue #44 <https://bitbucket.org/pypa/setuptools/issue/44>`_: Test failure on Python 2.4 when MD5 hash doesn't have a `.name`
  attribute.

-----
0.9.5
-----

* `Python #17980 <http://bugs.python.org/issue17980>`_: Fix security vulnerability in SSL certificate validation.

-----
0.9.4
-----

* `Issue #43 <https://bitbucket.org/pypa/setuptools/issue/43>`_: Fix issue (introduced in 0.9.1) with version resolution when
  upgrading over other releases of Setuptools.

-----
0.9.3
-----

* `Issue #42 <https://bitbucket.org/pypa/setuptools/issue/42>`_: Fix new ``AttributeError`` introduced in last fix.

-----
0.9.2
-----

* `Issue #42 <https://bitbucket.org/pypa/setuptools/issue/42>`_: Fix regression where blank checksums would trigger an
  ``AttributeError``.

-----
0.9.1
-----

* `Distribute #386 <https://bitbucket.org/tarek/distribute/issue/386>`_: Allow other positional and keyword arguments to os.open.
* Corrected dependency on certifi mis-referenced in 0.9.

---
0.9
---

* `package_index` now validates hashes other than MD5 in download links.

---
0.8
---

* Code base now runs on Python 2.4 - Python 3.3 without Python 2to3
  conversion.

-----
0.7.8
-----

* `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Yet another fix for yet another regression.

-----
0.7.7
-----

* `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Repair AttributeError created in last release (redo).
* `Issue #30 <https://bitbucket.org/pypa/setuptools/issue/30>`_: Added test for get_cache_path.

-----
0.7.6
-----

* `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Repair AttributeError created in last release.

-----
0.7.5
-----

* `Issue #21 <https://bitbucket.org/pypa/setuptools/issue/21>`_: Restore Python 2.4 compatibility in ``test_easy_install``.
* `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Merged additional warning from Distribute 0.6.46.
* Now honor the environment variable
  ``SETUPTOOLS_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT`` in addition to the now
  deprecated ``DISTRIBUTE_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT``.

-----
0.7.4
-----

* `Issue #20 <https://bitbucket.org/pypa/setuptools/issue/20>`_: Fix comparison of parsed SVN version on Python 3.

-----
0.7.3
-----

* `Issue #1 <https://bitbucket.org/pypa/setuptools/issue/1>`_: Disable installation of Windows-specific files on non-Windows systems.
* Use new sysconfig module with Python 2.7 or >=3.2.

-----
0.7.2
-----

* `Issue #14 <https://bitbucket.org/pypa/setuptools/issue/14>`_: Use markerlib when the `parser` module is not available.
* `Issue #10 <https://bitbucket.org/pypa/setuptools/issue/10>`_: ``ez_setup.py`` now uses HTTPS to download setuptools from PyPI.

-----
0.7.1
-----

* Fix NameError (`Issue #3 <https://bitbucket.org/pypa/setuptools/issue/3>`_) again - broken in bad merge.

---
0.7
---

* Merged Setuptools and Distribute. See docs/merge.txt for details.

Added several features that were slated for setuptools 0.6c12:

* Index URL now defaults to HTTPS.
* Added experimental environment marker support. Now clients may designate a
  PEP-426 environment marker for "extra" dependencies. Setuptools uses this
  feature in ``setup.py`` for optional SSL and certificate validation support
  on older platforms. Based on Distutils-SIG discussions, the syntax is
  somewhat tentative. There should probably be a PEP with a firmer spec before
  the feature should be considered suitable for use.
* Added support for SSL certificate validation when installing packages from
  an HTTPS service.

-----
0.7b4
-----

* `Issue #3 <https://bitbucket.org/pypa/setuptools/issue/3>`_: Fixed NameError in SSL support.

------
0.6.49
------

* Move warning check in ``get_cache_path`` to follow the directory creation
  to avoid errors when the cache path does not yet exist. Fixes the error
  reported in `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_.

------
0.6.48
------

* Correct AttributeError in ``ResourceManager.get_cache_path`` introduced in
  0.6.46 (redo).

------
0.6.47
------

* Correct AttributeError in ``ResourceManager.get_cache_path`` introduced in
  0.6.46.

------
0.6.46
------

* `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Issue a warning if the PYTHON_EGG_CACHE or otherwise
  customized egg cache location specifies a directory that's group- or
  world-writable.

------
0.6.45
------

* `Distribute #379 <https://bitbucket.org/tarek/distribute/issue/379>`_: ``distribute_setup.py`` now traps VersionConflict as well,
  restoring ability to upgrade from an older setuptools version.

------
0.6.44
------

* ``distribute_setup.py`` has been updated to allow Setuptools 0.7 to
  satisfy use_setuptools.

------
0.6.43
------

* `Distribute #378 <https://bitbucket.org/tarek/distribute/issue/378>`_: Restore support for Python 2.4 Syntax (regression in 0.6.42).

------
0.6.42
------

* External links finder no longer yields duplicate links.
* `Distribute #337 <https://bitbucket.org/tarek/distribute/issue/337>`_: Moved site.py to setuptools/site-patch.py (graft of very old
  patch from setuptools trunk which inspired PR `#31 <https://bitbucket.org/pypa/setuptools/issue/31>`_).

------
0.6.41
------

* `Distribute #27 <https://bitbucket.org/tarek/distribute/issue/27>`_: Use public api for loading resources from zip files rather than
  the private method `_zip_directory_cache`.
* Added a new function ``easy_install.get_win_launcher`` which may be used by
  third-party libraries such as buildout to get a suitable script launcher.

------
0.6.40
------

* `Distribute #376 <https://bitbucket.org/tarek/distribute/issue/376>`_: brought back cli.exe and gui.exe that were deleted in the
  previous release.

------
0.6.39
------

* Add support for console launchers on ARM platforms.
* Fix possible issue in GUI launchers where the subsystem was not supplied to
  the linker.
* Launcher build script now refactored for robustness.
* `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Resources extracted from a zip egg to the file system now also
  check the contents of the file against the zip contents during each
  invocation of get_resource_filename.

------
0.6.38
------

* `Distribute #371 <https://bitbucket.org/tarek/distribute/issue/371>`_: The launcher manifest file is now installed properly.

------
0.6.37
------

* `Distribute #143 <https://bitbucket.org/tarek/distribute/issue/143>`_: Launcher scripts, including easy_install itself, are now
  accompanied by a manifest on 32-bit Windows environments to avoid the
  Installer Detection Technology and thus undesirable UAC elevation described
  in `this Microsoft article
  <http://technet.microsoft.com/en-us/library/cc709628%28WS.10%29.aspx>`_.

------
0.6.36
------

* `Pull Request #35 <https://bitbucket.org/pypa/setuptools/pull-request/35>`_: In `Buildout #64 <https://github.com/buildout/buildout/issues/64>`_, it was reported that
  under Python 3, installation of distutils scripts could attempt to copy
  the ``__pycache__`` directory as a file, causing an error, apparently only
  under Windows. Easy_install now skips all directories when processing
  metadata scripts.

------
0.6.35
------


Note this release is backward-incompatible with distribute 0.6.23-0.6.34 in
how it parses version numbers.

* `Distribute #278 <https://bitbucket.org/tarek/distribute/issue/278>`_: Restored compatibility with distribute 0.6.22 and setuptools
  0.6. Updated the documentation to match more closely with the version
  parsing as intended in setuptools 0.6.

------
0.6.34
------

* `Distribute #341 <https://bitbucket.org/tarek/distribute/issue/341>`_: 0.6.33 fails to build under Python 2.4.

------
0.6.33
------

* Fix 2 errors with Jython 2.5.
* Fix 1 failure with Jython 2.5 and 2.7.
* Disable workaround for Jython scripts on Linux systems.
* `Distribute #336 <https://bitbucket.org/tarek/distribute/issue/336>`_: `setup.py` no longer masks failure exit code when tests fail.
* Fix issue in pkg_resources where try/except around a platform-dependent
  import would trigger hook load failures on Mercurial. See pull request 32
  for details.
* `Distribute #341 <https://bitbucket.org/tarek/distribute/issue/341>`_: Fix a ResourceWarning.

------
0.6.32
------

* Fix test suite with Python 2.6.
* Fix some DeprecationWarnings and ResourceWarnings.
* `Distribute #335 <https://bitbucket.org/tarek/distribute/issue/335>`_: Backed out `setup_requires` superceding installed requirements
  until regression can be addressed.

------
0.6.31
------

* `Distribute #303 <https://bitbucket.org/tarek/distribute/issue/303>`_: Make sure the manifest only ever contains UTF-8 in Python 3.
* `Distribute #329 <https://bitbucket.org/tarek/distribute/issue/329>`_: Properly close files created by tests for compatibility with
  Jython.
* Work around `Jython #1980 <http://bugs.jython.org/issue1980>`_ and `Jython #1981 <http://bugs.jython.org/issue1981>`_.
* `Distribute #334 <https://bitbucket.org/tarek/distribute/issue/334>`_: Provide workaround for packages that reference `sys.__stdout__`
  such as numpy does. This change should address
  `virtualenv `#359 <https://bitbucket.org/pypa/setuptools/issue/359>`_ <https://github.com/pypa/virtualenv/issues/359>`_ as long
  as the system encoding is UTF-8 or the IO encoding is specified in the
  environment, i.e.::

     PYTHONIOENCODING=utf8 pip install numpy

* Fix for encoding issue when installing from Windows executable on Python 3.
* `Distribute #323 <https://bitbucket.org/tarek/distribute/issue/323>`_: Allow `setup_requires` requirements to supercede installed
  requirements. Added some new keyword arguments to existing pkg_resources
  methods. Also had to updated how __path__ is handled for namespace packages
  to ensure that when a new egg distribution containing a namespace package is
  placed on sys.path, the entries in __path__ are found in the same order they
  would have been in had that egg been on the path when pkg_resources was
  first imported.

------
0.6.30
------

* `Distribute #328 <https://bitbucket.org/tarek/distribute/issue/328>`_: Clean up temporary directories in distribute_setup.py.
* Fix fatal bug in distribute_setup.py.

------
0.6.29
------

* `Pull Request #14 <https://bitbucket.org/pypa/setuptools/pull-request/14>`_: Honor file permissions in zip files.
* `Distribute #327 <https://bitbucket.org/tarek/distribute/issue/327>`_: Merged pull request `#24 <https://bitbucket.org/pypa/setuptools/issue/24>`_ to fix a dependency problem with pip.
* Merged pull request `#23 <https://bitbucket.org/pypa/setuptools/issue/23>`_ to fix https://github.com/pypa/virtualenv/issues/301.
* If Sphinx is installed, the `upload_docs` command now runs `build_sphinx`
  to produce uploadable documentation.
* `Distribute #326 <https://bitbucket.org/tarek/distribute/issue/326>`_: `upload_docs` provided mangled auth credentials under Python 3.
* `Distribute #320 <https://bitbucket.org/tarek/distribute/issue/320>`_: Fix check for "createable" in distribute_setup.py.
* `Distribute #305 <https://bitbucket.org/tarek/distribute/issue/305>`_: Remove a warning that was triggered during normal operations.
* `Distribute #311 <https://bitbucket.org/tarek/distribute/issue/311>`_: Print metadata in UTF-8 independent of platform.
* `Distribute #303 <https://bitbucket.org/tarek/distribute/issue/303>`_: Read manifest file with UTF-8 encoding under Python 3.
* `Distribute #301 <https://bitbucket.org/tarek/distribute/issue/301>`_: Allow to run tests of namespace packages when using 2to3.
* `Distribute #304 <https://bitbucket.org/tarek/distribute/issue/304>`_: Prevent import loop in site.py under Python 3.3.
* `Distribute #283 <https://bitbucket.org/tarek/distribute/issue/283>`_: Reenable scanning of `*.pyc` / `*.pyo` files on Python 3.3.
* `Distribute #299 <https://bitbucket.org/tarek/distribute/issue/299>`_: The develop command didn't work on Python 3, when using 2to3,
  as the egg link would go to the Python 2 source. Linking to the 2to3'd code
  in build/lib makes it work, although you will have to rebuild the module
  before testing it.
* `Distribute #306 <https://bitbucket.org/tarek/distribute/issue/306>`_: Even if 2to3 is used, we build in-place under Python 2.
* `Distribute #307 <https://bitbucket.org/tarek/distribute/issue/307>`_: Prints the full path when .svn/entries is broken.
* `Distribute #313 <https://bitbucket.org/tarek/distribute/issue/313>`_: Support for sdist subcommands (Python 2.7)
* `Distribute #314 <https://bitbucket.org/tarek/distribute/issue/314>`_: test_local_index() would fail an OS X.
* `Distribute #310 <https://bitbucket.org/tarek/distribute/issue/310>`_: Non-ascii characters in a namespace __init__.py causes errors.
* `Distribute #218 <https://bitbucket.org/tarek/distribute/issue/218>`_: Improved documentation on behavior of `package_data` and
  `include_package_data`. Files indicated by `package_data` are now included
  in the manifest.
* `distribute_setup.py` now allows a `--download-base` argument for retrieving
  distribute from a specified location.

------
0.6.28
------

* `Distribute #294 <https://bitbucket.org/tarek/distribute/issue/294>`_: setup.py can now be invoked from any directory.
* Scripts are now installed honoring the umask.
* Added support for .dist-info directories.
* `Distribute #283 <https://bitbucket.org/tarek/distribute/issue/283>`_: Fix and disable scanning of `*.pyc` / `*.pyo` files on
  Python 3.3.

------
0.6.27
------

* Support current snapshots of CPython 3.3.
* Distribute now recognizes README.rst as a standard, default readme file.
* Exclude 'encodings' modules when removing modules from sys.modules.
  Workaround for `#285 <https://bitbucket.org/pypa/setuptools/issue/285>`_.
* `Distribute #231 <https://bitbucket.org/tarek/distribute/issue/231>`_: Don't fiddle with system python when used with buildout
  (bootstrap.py)

------
0.6.26
------

* `Distribute #183 <https://bitbucket.org/tarek/distribute/issue/183>`_: Symlinked files are now extracted from source distributions.
* `Distribute #227 <https://bitbucket.org/tarek/distribute/issue/227>`_: Easy_install fetch parameters are now passed during the
  installation of a source distribution; now fulfillment of setup_requires
  dependencies will honor the parameters passed to easy_install.

------
0.6.25
------

* `Distribute #258 <https://bitbucket.org/tarek/distribute/issue/258>`_: Workaround a cache issue
* `Distribute #260 <https://bitbucket.org/tarek/distribute/issue/260>`_: distribute_setup.py now accepts the --user parameter for
  Python 2.6 and later.
* `Distribute #262 <https://bitbucket.org/tarek/distribute/issue/262>`_: package_index.open_with_auth no longer throws LookupError
  on Python 3.
* `Distribute #269 <https://bitbucket.org/tarek/distribute/issue/269>`_: AttributeError when an exception occurs reading Manifest.in
  on late releases of Python.
* `Distribute #272 <https://bitbucket.org/tarek/distribute/issue/272>`_: Prevent TypeError when namespace package names are unicode
  and single-install-externally-managed is used. Also fixes PIP issue
  449.
* `Distribute #273 <https://bitbucket.org/tarek/distribute/issue/273>`_: Legacy script launchers now install with Python2/3 support.

------
0.6.24
------

* `Distribute #249 <https://bitbucket.org/tarek/distribute/issue/249>`_: Added options to exclude 2to3 fixers

------
0.6.23
------

* `Distribute #244 <https://bitbucket.org/tarek/distribute/issue/244>`_: Fixed a test
* `Distribute #243 <https://bitbucket.org/tarek/distribute/issue/243>`_: Fixed a test
* `Distribute #239 <https://bitbucket.org/tarek/distribute/issue/239>`_: Fixed a test
* `Distribute #240 <https://bitbucket.org/tarek/distribute/issue/240>`_: Fixed a test
* `Distribute #241 <https://bitbucket.org/tarek/distribute/issue/241>`_: Fixed a test
* `Distribute #237 <https://bitbucket.org/tarek/distribute/issue/237>`_: Fixed a test
* `Distribute #238 <https://bitbucket.org/tarek/distribute/issue/238>`_: easy_install now uses 64bit executable wrappers on 64bit Python
* `Distribute #208 <https://bitbucket.org/tarek/distribute/issue/208>`_: Fixed parsed_versions, it now honors post-releases as noted in the documentation
* `Distribute #207 <https://bitbucket.org/tarek/distribute/issue/207>`_: Windows cli and gui wrappers pass CTRL-C to child python process
* `Distribute #227 <https://bitbucket.org/tarek/distribute/issue/227>`_: easy_install now passes its arguments to setup.py bdist_egg
* `Distribute #225 <https://bitbucket.org/tarek/distribute/issue/225>`_: Fixed a NameError on Python 2.5, 2.4

------
0.6.21
------

* `Distribute #225 <https://bitbucket.org/tarek/distribute/issue/225>`_: FIxed a regression on py2.4

------
0.6.20
------

* `Distribute #135 <https://bitbucket.org/tarek/distribute/issue/135>`_: Include url in warning when processing URLs in package_index.
* `Distribute #212 <https://bitbucket.org/tarek/distribute/issue/212>`_: Fix issue where easy_instal fails on Python 3 on windows installer.
* `Distribute #213 <https://bitbucket.org/tarek/distribute/issue/213>`_: Fix typo in documentation.

------
0.6.19
------

* `Distribute #206 <https://bitbucket.org/tarek/distribute/issue/206>`_: AttributeError: 'HTTPMessage' object has no attribute 'getheaders'

------
0.6.18
------

* `Distribute #210 <https://bitbucket.org/tarek/distribute/issue/210>`_: Fixed a regression introduced by `Distribute #204 <https://bitbucket.org/tarek/distribute/issue/204>`_ fix.

------
0.6.17
------

* Support 'DISTRIBUTE_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT' environment
  variable to allow to disable installation of easy_install-${version} script.
* Support Python >=3.1.4 and >=3.2.1.
* `Distribute #204 <https://bitbucket.org/tarek/distribute/issue/204>`_: Don't try to import the parent of a namespace package in
  declare_namespace
* `Distribute #196 <https://bitbucket.org/tarek/distribute/issue/196>`_: Tolerate responses with multiple Content-Length headers
* `Distribute #205 <https://bitbucket.org/tarek/distribute/issue/205>`_: Sandboxing doesn't preserve working_set. Leads to setup_requires
  problems.

------
0.6.16
------

* Builds sdist gztar even on Windows (avoiding `Distribute #193 <https://bitbucket.org/tarek/distribute/issue/193>`_).
* `Distribute #192 <https://bitbucket.org/tarek/distribute/issue/192>`_: Fixed metadata omitted on Windows when package_dir
  specified with forward-slash.
* `Distribute #195 <https://bitbucket.org/tarek/distribute/issue/195>`_: Cython build support.
* `Distribute #200 <https://bitbucket.org/tarek/distribute/issue/200>`_: Issues with recognizing 64-bit packages on Windows.

------
0.6.15
------

* Fixed typo in bdist_egg
* Several issues under Python 3 has been solved.
* `Distribute #146 <https://bitbucket.org/tarek/distribute/issue/146>`_: Fixed missing DLL files after easy_install of windows exe package.

------
0.6.14
------

* `Distribute #170 <https://bitbucket.org/tarek/distribute/issue/170>`_: Fixed unittest failure. Thanks to Toshio.
* `Distribute #171 <https://bitbucket.org/tarek/distribute/issue/171>`_: Fixed race condition in unittests cause deadlocks in test suite.
* `Distribute #143 <https://bitbucket.org/tarek/distribute/issue/143>`_: Fixed a lookup issue with easy_install.
  Thanks to David and Zooko.
* `Distribute #174 <https://bitbucket.org/tarek/distribute/issue/174>`_: Fixed the edit mode when its used with setuptools itself

------
0.6.13
------

* `Distribute #160 <https://bitbucket.org/tarek/distribute/issue/160>`_: 2.7 gives ValueError("Invalid IPv6 URL")
* `Distribute #150 <https://bitbucket.org/tarek/distribute/issue/150>`_: Fixed using ~/.local even in a --no-site-packages virtualenv
* `Distribute #163 <https://bitbucket.org/tarek/distribute/issue/163>`_: scan index links before external links, and don't use the md5 when
  comparing two distributions

------
0.6.12
------

* `Distribute #149 <https://bitbucket.org/tarek/distribute/issue/149>`_: Fixed various failures on 2.3/2.4

------
0.6.11
------

* Found another case of SandboxViolation - fixed
* `Distribute #15 <https://bitbucket.org/tarek/distribute/issue/15>`_ and `Distribute #48 <https://bitbucket.org/tarek/distribute/issue/48>`_: Introduced a socket timeout of 15 seconds on url openings
* Added indexsidebar.html into MANIFEST.in
* `Distribute #108 <https://bitbucket.org/tarek/distribute/issue/108>`_: Fixed TypeError with Python3.1
* `Distribute #121 <https://bitbucket.org/tarek/distribute/issue/121>`_: Fixed --help install command trying to actually install.
* `Distribute #112 <https://bitbucket.org/tarek/distribute/issue/112>`_: Added an os.makedirs so that Tarek's solution will work.
* `Distribute #133 <https://bitbucket.org/tarek/distribute/issue/133>`_: Added --no-find-links to easy_install
* Added easy_install --user
* `Distribute #100 <https://bitbucket.org/tarek/distribute/issue/100>`_: Fixed develop --user not taking '.' in PYTHONPATH into account
* `Distribute #134 <https://bitbucket.org/tarek/distribute/issue/134>`_: removed spurious UserWarnings. Patch by VanLindberg
* `Distribute #138 <https://bitbucket.org/tarek/distribute/issue/138>`_: cant_write_to_target error when setup_requires is used.
* `Distribute #147 <https://bitbucket.org/tarek/distribute/issue/147>`_: respect the sys.dont_write_bytecode flag

------
0.6.10
------

* Reverted change made for the DistributionNotFound exception because
  zc.buildout uses the exception message to get the name of the
  distribution.

-----
0.6.9
-----

* `Distribute #90 <https://bitbucket.org/tarek/distribute/issue/90>`_: unknown setuptools version can be added in the working set
* `Distribute #87 <https://bitbucket.org/tarek/distribute/issue/87>`_: setupt.py doesn't try to convert distribute_setup.py anymore
  Initial Patch by arfrever.
* `Distribute #89 <https://bitbucket.org/tarek/distribute/issue/89>`_: added a side bar with a download link to the doc.
* `Distribute #86 <https://bitbucket.org/tarek/distribute/issue/86>`_: fixed missing sentence in pkg_resources doc.
* Added a nicer error message when a DistributionNotFound is raised.
* `Distribute #80 <https://bitbucket.org/tarek/distribute/issue/80>`_: test_develop now works with Python 3.1
* `Distribute #93 <https://bitbucket.org/tarek/distribute/issue/93>`_: upload_docs now works if there is an empty sub-directory.
* `Distribute #70 <https://bitbucket.org/tarek/distribute/issue/70>`_: exec bit on non-exec files
* `Distribute #99 <https://bitbucket.org/tarek/distribute/issue/99>`_: now the standalone easy_install command doesn't uses a
  "setup.cfg" if any exists in the working directory. It will use it
  only if triggered by ``install_requires`` from a setup.py call
  (install, develop, etc).
* `Distribute #101 <https://bitbucket.org/tarek/distribute/issue/101>`_: Allowing ``os.devnull`` in Sandbox
* `Distribute #92 <https://bitbucket.org/tarek/distribute/issue/92>`_: Fixed the "no eggs" found error with MacPort
  (platform.mac_ver() fails)
* `Distribute #103 <https://bitbucket.org/tarek/distribute/issue/103>`_: test_get_script_header_jython_workaround not run
  anymore under py3 with C or POSIX local. Contributed by Arfrever.
* `Distribute #104 <https://bitbucket.org/tarek/distribute/issue/104>`_: remvoved the assertion when the installation fails,
  with a nicer message for the end user.
* `Distribute #100 <https://bitbucket.org/tarek/distribute/issue/100>`_: making sure there's no SandboxViolation when
  the setup script patches setuptools.

-----
0.6.8
-----

* Added "check_packages" in dist. (added in Setuptools 0.6c11)
* Fixed the DONT_PATCH_SETUPTOOLS state.

-----
0.6.7
-----

* `Distribute #58 <https://bitbucket.org/tarek/distribute/issue/58>`_: Added --user support to the develop command
* `Distribute #11 <https://bitbucket.org/tarek/distribute/issue/11>`_: Generated scripts now wrap their call to the script entry point
  in the standard "if name == 'main'"
* Added the 'DONT_PATCH_SETUPTOOLS' environment variable, so virtualenv
  can drive an installation that doesn't patch a global setuptools.
* Reviewed unladen-swallow specific change from
  http://code.google.com/p/unladen-swallow/source/detail?spec=svn875&r=719
  and determined that it no longer applies. Distribute should work fine with
  Unladen Swallow 2009Q3.
* `Distribute #21 <https://bitbucket.org/tarek/distribute/issue/21>`_: Allow PackageIndex.open_url to gracefully handle all cases of a
  httplib.HTTPException instead of just InvalidURL and BadStatusLine.
* Removed virtual-python.py from this distribution and updated documentation
  to point to the actively maintained virtualenv instead.
* `Distribute #64 <https://bitbucket.org/tarek/distribute/issue/64>`_: use_setuptools no longer rebuilds the distribute egg every
  time it is run
* use_setuptools now properly respects the requested version
* use_setuptools will no longer try to import a distribute egg for the
  wrong Python version
* `Distribute #74 <https://bitbucket.org/tarek/distribute/issue/74>`_: no_fake should be True by default.
* `Distribute #72 <https://bitbucket.org/tarek/distribute/issue/72>`_: avoid a bootstrapping issue with easy_install -U

-----
0.6.6
-----

* Unified the bootstrap file so it works on both py2.x and py3k without 2to3
  (patch by Holger Krekel)

-----
0.6.5
-----

* `Distribute #65 <https://bitbucket.org/tarek/distribute/issue/65>`_: cli.exe and gui.exe are now generated at build time,
  depending on the platform in use.

* `Distribute #67 <https://bitbucket.org/tarek/distribute/issue/67>`_: Fixed doc typo (PEP 381/382)

* Distribute no longer shadows setuptools if we require a 0.7-series
  setuptools.  And an error is raised when installing a 0.7 setuptools with
  distribute.

* When run from within buildout, no attempt is made to modify an existing
  setuptools egg, whether in a shared egg directory or a system setuptools.

* Fixed a hole in sandboxing allowing builtin file to write outside of
  the sandbox.

-----
0.6.4
-----

* Added the generation of `distribute_setup_3k.py` during the release.
  This closes `Distribute #52 <https://bitbucket.org/tarek/distribute/issue/52>`_.

* Added an upload_docs command to easily upload project documentation to
  PyPI's https://pythonhosted.org. This close issue `Distribute #56 <https://bitbucket.org/tarek/distribute/issue/56>`_.

* Fixed a bootstrap bug on the use_setuptools() API.

-----
0.6.3
-----

setuptools
==========

* Fixed a bunch of calls to file() that caused crashes on Python 3.

bootstrapping
=============

* Fixed a bug in sorting that caused bootstrap to fail on Python 3.

-----
0.6.2
-----

setuptools
==========

* Added Python 3 support; see docs/python3.txt.
  This closes `Old Setuptools #39 <http://bugs.python.org/setuptools/issue39>`_.

* Added option to run 2to3 automatically when installing on Python 3.
  This closes issue `Distribute #31 <https://bitbucket.org/tarek/distribute/issue/31>`_.

* Fixed invalid usage of requirement.parse, that broke develop -d.
  This closes `Old Setuptools #44 <http://bugs.python.org/setuptools/issue44>`_.

* Fixed script launcher for 64-bit Windows.
  This closes `Old Setuptools #2 <http://bugs.python.org/setuptools/issue2>`_.

* KeyError when compiling extensions.
  This closes `Old Setuptools #41 <http://bugs.python.org/setuptools/issue41>`_.

bootstrapping
=============

* Fixed bootstrap not working on Windows. This closes issue `Distribute #49 <https://bitbucket.org/tarek/distribute/issue/49>`_.

* Fixed 2.6 dependencies. This closes issue `Distribute #50 <https://bitbucket.org/tarek/distribute/issue/50>`_.

* Make sure setuptools is patched when running through easy_install
  This closes `Old Setuptools #40 <http://bugs.python.org/setuptools/issue40>`_.

-----
0.6.1
-----

setuptools
==========

* package_index.urlopen now catches BadStatusLine and malformed url errors.
  This closes `Distribute #16 <https://bitbucket.org/tarek/distribute/issue/16>`_ and `Distribute #18 <https://bitbucket.org/tarek/distribute/issue/18>`_.

* zip_ok is now False by default. This closes `Old Setuptools #33 <http://bugs.python.org/setuptools/issue33>`_.

* Fixed invalid URL error catching. `Old Setuptools #20 <http://bugs.python.org/setuptools/issue20>`_.

* Fixed invalid bootstraping with easy_install installation (`Distribute #40 <https://bitbucket.org/tarek/distribute/issue/40>`_).
  Thanks to Florian Schulze for the help.

* Removed buildout/bootstrap.py. A new repository will create a specific
  bootstrap.py script.


bootstrapping
=============

* The boostrap process leave setuptools alone if detected in the system
  and --root or --prefix is provided, but is not in the same location.
  This closes `Distribute #10 <https://bitbucket.org/tarek/distribute/issue/10>`_.

---
0.6
---

setuptools
==========

* Packages required at build time where not fully present at install time.
  This closes `Distribute #12 <https://bitbucket.org/tarek/distribute/issue/12>`_.

* Protected against failures in tarfile extraction. This closes `Distribute #10 <https://bitbucket.org/tarek/distribute/issue/10>`_.

* Made Jython api_tests.txt doctest compatible. This closes `Distribute #7 <https://bitbucket.org/tarek/distribute/issue/7>`_.

* sandbox.py replaced builtin type file with builtin function open. This
  closes `Distribute #6 <https://bitbucket.org/tarek/distribute/issue/6>`_.

* Immediately close all file handles. This closes `Distribute #3 <https://bitbucket.org/tarek/distribute/issue/3>`_.

* Added compatibility with Subversion 1.6. This references `Distribute #1 <https://bitbucket.org/tarek/distribute/issue/1>`_.

pkg_resources
=============

* Avoid a call to /usr/bin/sw_vers on OSX and use the official platform API
  instead. Based on a patch from ronaldoussoren. This closes issue `#5 <https://bitbucket.org/pypa/setuptools/issue/5>`_.

* Fixed a SandboxViolation for mkdir that could occur in certain cases.
  This closes `Distribute #13 <https://bitbucket.org/tarek/distribute/issue/13>`_.

* Allow to find_on_path on systems with tight permissions to fail gracefully.
  This closes `Distribute #9 <https://bitbucket.org/tarek/distribute/issue/9>`_.

* Corrected inconsistency between documentation and code of add_entry.
  This closes `Distribute #8 <https://bitbucket.org/tarek/distribute/issue/8>`_.

* Immediately close all file handles. This closes `Distribute #3 <https://bitbucket.org/tarek/distribute/issue/3>`_.

easy_install
============

* Immediately close all file handles. This closes `Distribute #3 <https://bitbucket.org/tarek/distribute/issue/3>`_.

-----
0.6c9
-----

 * Fixed a missing files problem when using Windows source distributions on
   non-Windows platforms, due to distutils not handling manifest file line
   endings correctly.

 * Updated Pyrex support to work with Pyrex 0.9.6 and higher.

 * Minor changes for Jython compatibility, including skipping tests that can't
   work on Jython.

 * Fixed not installing eggs in ``install_requires`` if they were also used for
   ``setup_requires`` or ``tests_require``.

 * Fixed not fetching eggs in ``install_requires`` when running tests.

 * Allow ``ez_setup.use_setuptools()`` to upgrade existing setuptools
   installations when called from a standalone ``setup.py``.

 * Added a warning if a namespace package is declared, but its parent package
   is not also declared as a namespace.

 * Support Subversion 1.5

 * Removed use of deprecated ``md5`` module if ``hashlib`` is available

 * Fixed ``bdist_wininst upload`` trying to upload the ``.exe`` twice

 * Fixed ``bdist_egg`` putting a ``native_libs.txt`` in the source package's
   ``.egg-info``, when it should only be in the built egg's ``EGG-INFO``.

 * Ensure that _full_name is set on all shared libs before extensions are
   checked for shared lib usage.  (Fixes a bug in the experimental shared
   library build support.)

 * Fix to allow unpacked eggs containing native libraries to fail more
   gracefully under Google App Engine (with an ``ImportError`` loading the
   C-based module, instead of getting a ``NameError``).

-----
0.6c7
-----

 * Fixed ``distutils.filelist.findall()`` crashing on broken symlinks, and
   ``egg_info`` command failing on new, uncommitted SVN directories.

 * Fix import problems with nested namespace packages installed via
   ``--root`` or ``--single-version-externally-managed``, due to the
   parent package not having the child package as an attribute.

-----
0.6c6
-----

 * Added ``--egg-path`` option to ``develop`` command, allowing you to force
   ``.egg-link`` files to use relative paths (allowing them to be shared across
   platforms on a networked drive).

 * Fix not building binary RPMs correctly.

 * Fix "eggsecutables" (such as setuptools' own egg) only being runnable with
   bash-compatible shells.

 * Fix ``#!`` parsing problems in Windows ``.exe`` script wrappers, when there
   was whitespace inside a quoted argument or at the end of the ``#!`` line
   (a regression introduced in 0.6c4).

 * Fix ``test`` command possibly failing if an older version of the project
   being tested was installed on ``sys.path`` ahead of the test source
   directory.

 * Fix ``find_packages()`` treating ``ez_setup`` and directories with ``.`` in
   their names as packages.

-----
0.6c5
-----

 * Fix uploaded ``bdist_rpm`` packages being described as ``bdist_egg``
   packages under Python versions less than 2.5.

 * Fix uploaded ``bdist_wininst`` packages being described as suitable for
   "any" version by Python 2.5, even if a ``--target-version`` was specified.

-----
0.6c4
-----

 * Overhauled Windows script wrapping to support ``bdist_wininst`` better.
   Scripts installed with ``bdist_wininst`` will always use ``#!python.exe`` or
   ``#!pythonw.exe`` as the executable name (even when built on non-Windows
   platforms!), and the wrappers will look for the executable in the script's
   parent directory (which should find the right version of Python).

 * Fix ``upload`` command not uploading files built by ``bdist_rpm`` or
   ``bdist_wininst`` under Python 2.3 and 2.4.

 * Add support for "eggsecutable" headers: a ``#!/bin/sh`` script that is
   prepended to an ``.egg`` file to allow it to be run as a script on Unix-ish
   platforms.  (This is mainly so that setuptools itself can have a single-file
   installer on Unix, without doing multiple downloads, dealing with firewalls,
   etc.)

 * Fix problem with empty revision numbers in Subversion 1.4 ``entries`` files

 * Use cross-platform relative paths in ``easy-install.pth`` when doing
   ``develop`` and the source directory is a subdirectory of the installation
   target directory.

 * Fix a problem installing eggs with a system packaging tool if the project
   contained an implicit namespace package; for example if the ``setup()``
   listed a namespace package ``foo.bar`` without explicitly listing ``foo``
   as a namespace package.

-----
0.6c3
-----

 * Fixed breakages caused by Subversion 1.4's new "working copy" format

-----
0.6c2
-----

 * The ``ez_setup`` module displays the conflicting version of setuptools (and
   its installation location) when a script requests a version that's not
   available.

 * Running ``setup.py develop`` on a setuptools-using project will now install
   setuptools if needed, instead of only downloading the egg.

-----
0.6c1
-----

 * Fixed ``AttributeError`` when trying to download a ``setup_requires``
   dependency when a distribution lacks a ``dependency_links`` setting.

 * Made ``zip-safe`` and ``not-zip-safe`` flag files contain a single byte, so
   as to play better with packaging tools that complain about zero-length
   files.

 * Made ``setup.py develop`` respect the ``--no-deps`` option, which it
   previously was ignoring.

 * Support ``extra_path`` option to ``setup()`` when ``install`` is run in
   backward-compatibility mode.

 * Source distributions now always include a ``setup.cfg`` file that explicitly
   sets ``egg_info`` options such that they produce an identical version number
   to the source distribution's version number.  (Previously, the default
   version number could be different due to the use of ``--tag-date``, or if
   the version was overridden on the command line that built the source
   distribution.)

-----
0.6b4
-----

 * Fix ``register`` not obeying name/version set by ``egg_info`` command, if
   ``egg_info`` wasn't explicitly run first on the same command line.

 * Added ``--no-date`` and ``--no-svn-revision`` options to ``egg_info``
   command, to allow suppressing tags configured in ``setup.cfg``.

 * Fixed redundant warnings about missing ``README`` file(s); it should now
   appear only if you are actually a source distribution.

-----
0.6b3
-----

 * Fix ``bdist_egg`` not including files in subdirectories of ``.egg-info``.

 * Allow ``.py`` files found by the ``include_package_data`` option to be
   automatically included.  Remove duplicate data file matches if both
   ``include_package_data`` and ``package_data`` are used to refer to the same
   files.

-----
0.6b1
-----

 * Strip ``module`` from the end of compiled extension modules when computing
   the name of a ``.py`` loader/wrapper.  (Python's import machinery ignores
   this suffix when searching for an extension module.)

------
0.6a11
------

 * Added ``test_loader`` keyword to support custom test loaders

 * Added ``setuptools.file_finders`` entry point group to allow implementing
   revision control plugins.

 * Added ``--identity`` option to ``upload`` command.

 * Added ``dependency_links`` to allow specifying URLs for ``--find-links``.

 * Enhanced test loader to scan packages as well as modules, and call
   ``additional_tests()`` if present to get non-unittest tests.

 * Support namespace packages in conjunction with system packagers, by omitting
   the installation of any ``__init__.py`` files for namespace packages, and
   adding a special ``.pth`` file to create a working package in
   ``sys.modules``.

 * Made ``--single-version-externally-managed`` automatic when ``--root`` is
   used, so that most system packagers won't require special support for
   setuptools.

 * Fixed ``setup_requires``, ``tests_require``, etc. not using ``setup.cfg`` or
   other configuration files for their option defaults when installing, and
   also made the install use ``--multi-version`` mode so that the project
   directory doesn't need to support .pth files.

 * ``MANIFEST.in`` is now forcibly closed when any errors occur while reading
   it.  Previously, the file could be left open and the actual error would be
   masked by problems trying to remove the open file on Windows systems.

------
0.6a10
------

 * Fixed the ``develop`` command ignoring ``--find-links``.

-----
0.6a9
-----

 * The ``sdist`` command no longer uses the traditional ``MANIFEST`` file to
   create source distributions.  ``MANIFEST.in`` is still read and processed,
   as are the standard defaults and pruning.  But the manifest is built inside
   the project's ``.egg-info`` directory as ``SOURCES.txt``, and it is rebuilt
   every time the ``egg_info`` command is run.

 * Added the ``include_package_data`` keyword to ``setup()``, allowing you to
   automatically include any package data listed in revision control or
   ``MANIFEST.in``

 * Added the ``exclude_package_data`` keyword to ``setup()``, allowing you to
   trim back files included via the ``package_data`` and
   ``include_package_data`` options.

 * Fixed ``--tag-svn-revision`` not working when run from a source
   distribution.

 * Added warning for namespace packages with missing ``declare_namespace()``

 * Added ``tests_require`` keyword to ``setup()``, so that e.g. packages
   requiring ``nose`` to run unit tests can make this dependency optional
   unless the ``test`` command is run.

 * Made all commands that use ``easy_install`` respect its configuration
   options, as this was causing some problems with ``setup.py install``.

 * Added an ``unpack_directory()`` driver to ``setuptools.archive_util``, so
   that you can process a directory tree through a processing filter as if it
   were a zipfile or tarfile.

 * Added an internal ``install_egg_info`` command to use as part of old-style
   ``install`` operations, that installs an ``.egg-info`` directory with the
   package.

 * Added a ``--single-version-externally-managed`` option to the ``install``
   command so that you can more easily wrap a "flat" egg in a system package.

 * Enhanced ``bdist_rpm`` so that it installs single-version eggs that
   don't rely on a ``.pth`` file.  The ``--no-egg`` option has been removed,
   since all RPMs are now built in a more backwards-compatible format.

 * Support full roundtrip translation of eggs to and from ``bdist_wininst``
   format.  Running ``bdist_wininst`` on a setuptools-based package wraps the
   egg in an .exe that will safely install it as an egg (i.e., with metadata
   and entry-point wrapper scripts), and ``easy_install`` can turn the .exe
   back into an ``.egg`` file or directory and install it as such.


-----
0.6a8
-----

 * Fixed some problems building extensions when Pyrex was installed, especially
   with Python 2.4 and/or packages using SWIG.

 * Made ``develop`` command accept all the same options as ``easy_install``,
   and use the ``easy_install`` command's configuration settings as defaults.

 * Made ``egg_info --tag-svn-revision`` fall back to extracting the revision
   number from ``PKG-INFO`` in case it is being run on a source distribution of
   a snapshot taken from a Subversion-based project.

 * Automatically detect ``.dll``, ``.so`` and ``.dylib`` files that are being
   installed as data, adding them to ``native_libs.txt`` automatically.

 * Fixed some problems with fresh checkouts of projects that don't include
   ``.egg-info/PKG-INFO`` under revision control and put the project's source
   code directly in the project directory.  If such a package had any
   requirements that get processed before the ``egg_info`` command can be run,
   the setup scripts would fail with a "Missing 'Version:' header and/or
   PKG-INFO file" error, because the egg runtime interpreted the unbuilt
   metadata in a directory on ``sys.path`` (i.e. the current directory) as
   being a corrupted egg.  Setuptools now monkeypatches the distribution
   metadata cache to pretend that the egg has valid version information, until
   it has a chance to make it actually be so (via the ``egg_info`` command).

-----
0.6a5
-----

 * Fixed missing gui/cli .exe files in distribution.  Fixed bugs in tests.

-----
0.6a3
-----

 * Added ``gui_scripts`` entry point group to allow installing GUI scripts
   on Windows and other platforms.  (The special handling is only for Windows;
   other platforms are treated the same as for ``console_scripts``.)

-----
0.6a2
-----

 * Added ``console_scripts`` entry point group to allow installing scripts
   without the need to create separate script files.  On Windows, console
   scripts get an ``.exe`` wrapper so you can just type their name.  On other
   platforms, the scripts are written without a file extension.

-----
0.6a1
-----

 * Added support for building "old-style" RPMs that don't install an egg for
   the target package, using a ``--no-egg`` option.

 * The ``build_ext`` command now works better when using the ``--inplace``
   option and multiple Python versions.  It now makes sure that all extensions
   match the current Python version, even if newer copies were built for a
   different Python version.

 * The ``upload`` command no longer attaches an extra ``.zip`` when uploading
   eggs, as PyPI now supports egg uploads without trickery.

 * The ``ez_setup`` script/module now displays a warning before downloading
   the setuptools egg, and attempts to check the downloaded egg against an
   internal MD5 checksum table.

 * Fixed the ``--tag-svn-revision`` option of ``egg_info`` not finding the
   latest revision number; it was using the revision number of the directory
   containing ``setup.py``, not the highest revision number in the project.

 * Added ``eager_resources`` setup argument

 * The ``sdist`` command now recognizes Subversion "deleted file" entries and
   does not include them in source distributions.

 * ``setuptools`` now embeds itself more thoroughly into the distutils, so that
   other distutils extensions (e.g. py2exe, py2app) will subclass setuptools'
   versions of things, rather than the native distutils ones.

 * Added ``entry_points`` and ``setup_requires`` arguments to ``setup()``;
   ``setup_requires`` allows you to automatically find and download packages
   that are needed in order to *build* your project (as opposed to running it).

 * ``setuptools`` now finds its commands, ``setup()`` argument validators, and
   metadata writers using entry points, so that they can be extended by
   third-party packages.  See `Creating distutils Extensions
   <http://pythonhosted.org/setuptools/setuptools.html#creating-distutils-extensions>`_
   for more details.

 * The vestigial ``depends`` command has been removed.  It was never finished
   or documented, and never would have worked without EasyInstall - which it
   pre-dated and was never compatible with.

------
0.5a12
------

 * The zip-safety scanner now checks for modules that might be used with
   ``python -m``, and marks them as unsafe for zipping, since Python 2.4 can't
   handle ``-m`` on zipped modules.

------
0.5a11
------

 * Fix breakage of the "develop" command that was caused by the addition of
   ``--always-unzip`` to the ``easy_install`` command.

-----
0.5a9
-----

 * Include ``svn:externals`` directories in source distributions as well as
   normal subversion-controlled files and directories.

 * Added ``exclude=patternlist`` option to ``setuptools.find_packages()``

 * Changed --tag-svn-revision to include an "r" in front of the revision number
   for better readability.

 * Added ability to build eggs without including source files (except for any
   scripts, of course), using the ``--exclude-source-files`` option to
   ``bdist_egg``.

 * ``setup.py install`` now automatically detects when an "unmanaged" package
   or module is going to be on ``sys.path`` ahead of a package being installed,
   thereby preventing the newer version from being imported.  If this occurs,
   a warning message is output to ``sys.stderr``, but installation proceeds
   anyway.  The warning message informs the user what files or directories
   need deleting, and advises them they can also use EasyInstall (with the
   ``--delete-conflicting`` option) to do it automatically.

 * The ``egg_info`` command now adds a ``top_level.txt`` file to the metadata
   directory that lists all top-level modules and packages in the distribution.
   This is used by the ``easy_install`` command to find possibly-conflicting
   "unmanaged" packages when installing the distribution.

 * Added ``zip_safe`` and ``namespace_packages`` arguments to ``setup()``.
   Added package analysis to determine zip-safety if the ``zip_safe`` flag
   is not given, and advise the author regarding what code might need changing.

 * Fixed the swapped ``-d`` and ``-b`` options of ``bdist_egg``.

-----
0.5a8
-----

 * The "egg_info" command now always sets the distribution metadata to "safe"
   forms of the distribution name and version, so that distribution files will
   be generated with parseable names (i.e., ones that don't include '-' in the
   name or version).  Also, this means that if you use the various ``--tag``
   options of "egg_info", any distributions generated will use the tags in the
   version, not just egg distributions.

 * Added support for defining command aliases in distutils configuration files,
   under the "[aliases]" section.  To prevent recursion and to allow aliases to
   call the command of the same name, a given alias can be expanded only once
   per command-line invocation.  You can define new aliases with the "alias"
   command, either for the local, global, or per-user configuration.

 * Added "rotate" command to delete old distribution files, given a set of
   patterns to match and the number of files to keep.  (Keeps the most
   recently-modified distribution files matching each pattern.)

 * Added "saveopts" command that saves all command-line options for the current
   invocation to the local, global, or per-user configuration file.  Useful for
   setting defaults without having to hand-edit a configuration file.

 * Added a "setopt" command that sets a single option in a specified distutils
   configuration file.

-----
0.5a7
-----

 * Added "upload" support for egg and source distributions, including a bug
   fix for "upload" and a temporary workaround for lack of .egg support in
   PyPI.

-----
0.5a6
-----

 * Beefed up the "sdist" command so that if you don't have a MANIFEST.in, it
   will include all files under revision control (CVS or Subversion) in the
   current directory, and it will regenerate the list every time you create a
   source distribution, not just when you tell it to.  This should make the
   default "do what you mean" more often than the distutils' default behavior
   did, while still retaining the old behavior in the presence of MANIFEST.in.

 * Fixed the "develop" command always updating .pth files, even if you
   specified ``-n`` or ``--dry-run``.

 * Slightly changed the format of the generated version when you use
   ``--tag-build`` on the "egg_info" command, so that you can make tagged
   revisions compare *lower* than the version specified in setup.py (e.g. by
   using ``--tag-build=dev``).

-----
0.5a5
-----

 * Added ``develop`` command to ``setuptools``-based packages.  This command
   installs an ``.egg-link`` pointing to the package's source directory, and
   script wrappers that ``execfile()`` the source versions of the package's
   scripts.  This lets you put your development checkout(s) on sys.path without
   having to actually install them.  (To uninstall the link, use
   use ``setup.py develop --uninstall``.)

 * Added ``egg_info`` command to ``setuptools``-based packages.  This command
   just creates or updates the "projectname.egg-info" directory, without
   building an egg.  (It's used by the ``bdist_egg``, ``test``, and ``develop``
   commands.)

 * Enhanced the ``test`` command so that it doesn't install the package, but
   instead builds any C extensions in-place, updates the ``.egg-info``
   metadata, adds the source directory to ``sys.path``, and runs the tests
   directly on the source.  This avoids an "unmanaged" installation of the
   package to ``site-packages`` or elsewhere.

 * Made ``easy_install`` a standard ``setuptools`` command, moving it from
   the ``easy_install`` module to ``setuptools.command.easy_install``.  Note
   that if you were importing or extending it, you must now change your imports
   accordingly.  ``easy_install.py`` is still installed as a script, but not as
   a module.

-----
0.5a4
-----

 * Setup scripts using setuptools can now list their dependencies directly in
   the setup.py file, without having to manually create a ``depends.txt`` file.
   The ``install_requires`` and ``extras_require`` arguments to ``setup()``
   are used to create a dependencies file automatically.  If you are manually
   creating ``depends.txt`` right now, please switch to using these setup
   arguments as soon as practical, because ``depends.txt`` support will be
   removed in the 0.6 release cycle.  For documentation on the new arguments,
   see the ``setuptools.dist.Distribution`` class.

 * Setup scripts using setuptools now always install using ``easy_install``
   internally, for ease of uninstallation and upgrading.

-----
0.5a1
-----

 * Added support for "self-installation" bootstrapping.  Packages can now
   include ``ez_setup.py`` in their source distribution, and add the following
   to their ``setup.py``, in order to automatically bootstrap installation of
   setuptools as part of their setup process::

    from ez_setup import use_setuptools
    use_setuptools()

    from setuptools import setup
    # etc...

-----
0.4a2
-----

 * Added ``ez_setup.py`` installer/bootstrap script to make initial setuptools
   installation easier, and to allow distributions using setuptools to avoid
   having to include setuptools in their source distribution.

 * All downloads are now managed by the ``PackageIndex`` class (which is now
   subclassable and replaceable), so that embedders can more easily override
   download logic, give download progress reports, etc.  The class has also
   been moved to the new ``setuptools.package_index`` module.

 * The ``Installer`` class no longer handles downloading, manages a temporary
   directory, or tracks the ``zip_ok`` option.  Downloading is now handled
   by ``PackageIndex``, and ``Installer`` has become an ``easy_install``
   command class based on ``setuptools.Command``.

 * There is a new ``setuptools.sandbox.run_setup()`` API to invoke a setup
   script in a directory sandbox, and a new ``setuptools.archive_util`` module
   with an ``unpack_archive()`` API.  These were split out of EasyInstall to
   allow reuse by other tools and applications.

 * ``setuptools.Command`` now supports reinitializing commands using keyword
   arguments to set/reset options.  Also, ``Command`` subclasses can now set
   their ``command_consumes_arguments`` attribute to ``True`` in order to
   receive an ``args`` option containing the rest of the command line.

-----
0.3a2
-----

 * Added new options to ``bdist_egg`` to allow tagging the egg's version number
   with a subversion revision number, the current date, or an explicit tag
   value.  Run ``setup.py bdist_egg --help`` to get more information.

 * Misc. bug fixes

-----
0.3a1
-----

 * Initial release.


site-packages/setuptools-2.0.dist-info/pydist.json000064400000010700151733464100016106 0ustar00{"generator": "bdist_wheel (0.22.0)", "summary": "Easily download, build, install, upgrade, and uninstall Python packages", "name": "setuptools", "license": "PSF or ZPL", "project_urls": {"Home": "https://pypi.python.org/pypi/setuptools"}, "classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: Python Software Foundation License", "License :: OSI Approved :: Zope Public License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.1", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Archiving :: Packaging", "Topic :: System :: Systems Administration", "Topic :: Utilities"], "metadata_version": "2.0", "contacts": [{"email": "distutils-sig@python.org", "role": "author", "name": "Python Packaging Authority"}], "keywords": "CPAN PyPI distutils eggs package management", "exports": {"egg_info.writers": {"dependency_links.txt": "setuptools.command.egg_info:overwrite_arg", "depends.txt": "setuptools.command.egg_info:warn_depends_obsolete", "top_level.txt": "setuptools.command.egg_info:write_toplevel_names", "entry_points.txt": "setuptools.command.egg_info:write_entries", "eager_resources.txt": "setuptools.command.egg_info:overwrite_arg", "requires.txt": "setuptools.command.egg_info:write_requirements", "namespace_packages.txt": "setuptools.command.egg_info:overwrite_arg", "PKG-INFO": "setuptools.command.egg_info:write_pkg_info"}, "setuptools.installation": {"eggsecutable": "setuptools.command.easy_install:bootstrap"}, "setuptools.file_finders": {"svn_cvs": "setuptools.command.sdist:_default_revctrl"}, "distutils.commands": {"build_ext": "setuptools.command.build_ext:build_ext", "egg_info": "setuptools.command.egg_info:egg_info", "easy_install": "setuptools.command.easy_install:easy_install", "bdist_rpm": "setuptools.command.bdist_rpm:bdist_rpm", "build_py": "setuptools.command.build_py:build_py", "install_scripts": "setuptools.command.install_scripts:install_scripts", "install_lib": "setuptools.command.install_lib:install_lib", "register": "setuptools.command.register:register", "develop": "setuptools.command.develop:develop", "sdist": "setuptools.command.sdist:sdist", "rotate": "setuptools.command.rotate:rotate", "alias": "setuptools.command.alias:alias", "test": "setuptools.command.test:test", "bdist_egg": "setuptools.command.bdist_egg:bdist_egg", "install": "setuptools.command.install:install", "saveopts": "setuptools.command.saveopts:saveopts", "upload_docs": "setuptools.command.upload_docs:upload_docs", "setopt": "setuptools.command.setopt:setopt", "install_egg_info": "setuptools.command.install_egg_info:install_egg_info", "bdist_wininst": "setuptools.command.bdist_wininst:bdist_wininst"}, "distutils.setup_keywords": {"exclude_package_data": "setuptools.dist:check_package_data", "zip_safe": "setuptools.dist:assert_bool", "install_requires": "setuptools.dist:check_requirements", "eager_resources": "setuptools.dist:assert_string_list", "extras_require": "setuptools.dist:check_extras", "tests_require": "setuptools.dist:check_requirements", "convert_2to3_doctests": "setuptools.dist:assert_string_list", "test_loader": "setuptools.dist:check_importable", "packages": "setuptools.dist:check_packages", "use_2to3_fixers": "setuptools.dist:assert_string_list", "entry_points": "setuptools.dist:check_entry_points", "include_package_data": "setuptools.dist:assert_bool", "dependency_links": "setuptools.dist:assert_string_list", "test_suite": "setuptools.dist:check_test_suite", "use_2to3": "setuptools.dist:assert_bool", "use_2to3_exclude_fixers": "setuptools.dist:assert_string_list", "package_data": "setuptools.dist:check_package_data", "namespace_packages": "setuptools.dist:check_nsp"}, "console_scripts": {"easy_install": "setuptools.command.easy_install:main", "easy_install-3.3": "setuptools.command.easy_install:main"}}, "extras": ["certs", "ssl:sys_platform=='win32'"], "run_requires": [{"extra": "certs", "requires": ["certifi (==0.0.8)"]}, {"requires": ["wincertstore (==0.1)"], "environment": "extra == \"ssl:sys_platform=='win32'\""}], "version": "2.0", "document_names": {"description": "DESCRIPTION.rst"}, "commands": {"wrap_console": {"easy_install": "setuptools.command.easy_install:main", "easy_install-3.3": "setuptools.command.easy_install:main"}}}site-packages/setuptools-2.0.dist-info/dependency_links.txt000064400000000335151733464100017761 0ustar00https://pypi.python.org/packages/source/c/certifi/certifi-0.0.8.tar.gz#md5=dc5f5e7f0b5fc08d27654b17daa6ecec
https://pypi.python.org/packages/source/w/wincertstore/wincertstore-0.1.zip#md5=2f9accbebe8f7b4c06ac7aa83879b81c
site-packages/setuptools-2.0.dist-info/RECORD000064400000016004151733464100014603 0ustar00pkg_resources.py,sha256=PTsVwvKZOvKRb0fpUA4EMxtWeAqimPdbQo4VcL_oVfY,98911
easy_install.py,sha256=MDC9vt5AxDsXX5qcKlBz2TnW6Tpuv_AobnfhCJ9X3PM,126
setuptools-2.0.data/scripts/easy_install,sha256=CCoKwnAC2FcNUE_BiA2Sn5rrWuy2yAqjEl-Zyp-rSoY,305
setuptools-2.0.data/scripts/easy_install-3.3,sha256=p5bT6BJgkt-Sp1fvihRe_23DCKjCycFDiLHHPl1PmOI,313
setuptools-2.0.dist-info/DESCRIPTION.rst,sha256=HvlYC-3n9_8lxg3FLymgsd4SbA4aQwI6tEh98kDZTDE,69872
setuptools-2.0.dist-info/RECORD,,
setuptools-2.0.dist-info/METADATA,sha256=zCZIX5URU19O4g_YhIIpgT2k3uZyCriLmWgkTrM_by4,71202
setuptools-2.0.dist-info/WHEEL,sha256=SXYYsi-y-rEGIva8sB8iKF6bAFD6YDhmqHX5hI3fc0o,110
setuptools-2.0.dist-info/pydist.json,sha256=7H8MWi-USVUvFXtOR8SWM_rvk6svEwsO90b2BkIlE60,4544
setuptools-2.0.dist-info/zip-safe,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
setuptools-2.0.dist-info/entry_points.txt,sha256=8UfG56I_B3Dj-gOC482iTtjEFl2zWCf8UYWzB1dV_Hc,2773
setuptools-2.0.dist-info/top_level.txt,sha256=oqE8UYllpusLpVeDajAOvzsNJOdUG0bQelgPBUV_QZk,49
setuptools-2.0.dist-info/dependency_links.txt,sha256=H84NpZJcSa-8h9mn-ZONhSwqx6F9qdpEAzLiHqI7NX8,221
_markerlib/markers.py,sha256=YuFp0-osufFIoqnzG3L0Z2fDCx4Vln3VUDeXJ2DA_1I,3979
_markerlib/__init__.py,sha256=GSmhZqvAitLJHhSgtqqusfq2nJ_ClP3oy3Lm0uZLIsU,552
setuptools/py31compat.py,sha256=95J21c4_2pcNOrScsHvAMDA-HUO-93qDWn9W_71Sv8o,396
setuptools/script template (dev).py,sha256=fZZQIwfK2-F1tF0ld6Sh141zltAD6ubIa525WH6cMz8,311
setuptools/__init__.py,sha256=Sn0OUGFc_YlwGw2A3glq08IkDCcqssSoJTNwZK3cnJA,3317
setuptools/ssl_support.py,sha256=wnK1ffiiA7TrLYseT5A1qwNJuKelxMu9o3L4E270mD4,7663
setuptools/version.py,sha256=A3Ub7Z2q2OEONprXnC5jlQ8x525YffgG93hA9M4DAIk,20
setuptools/lib2to3_ex.py,sha256=6jPF9sJuHiz0cyg4cwIBLl2VMAxcl3GYSZwWAOuJplU,1998
setuptools/compat.py,sha256=DhySZMeNA-fmaMiESpefR2T0G1lV1k47xgHpXsB1NGU,2556
setuptools/depends.py,sha256=MZYC62GbkiR-H-w56YonoPCVttPfYxhTK6kZ07FpGXc,6221
setuptools/extension.py,sha256=Lxj67VzDEYORY-oEW9U-SP9JL3s-O9Sgk9BOwtvVLdQ,1404
setuptools/py26compat.py,sha256=ggKS8_aZWWHHS792vF3uXp5vmUkGNk3vjLreLTHr_-Q,431
setuptools/py27compat.py,sha256=CGj-jZcFgHUkrEdLvArkxHj96tAaMbG2-yJtUVU7QVI,306
setuptools/archive_util.py,sha256=4knsPzl_EjgtRu5-3G4tN5m0GIRcsiZOGJ1vjqaV3jg,6601
setuptools/script template.py,sha256=VpRgZSPN7tulpU94pWiFkKPzhHXonxnBZh2hjPIGAxY,163
setuptools/svn_utils.py,sha256=GMqvFLBQyD3dx06qQuA8H-fTUhAYK5ma4USzoR1iKfk,17848
setuptools/dist.py,sha256=PbBXveYctz6VclEdkt9Ysjon-OyAMxiWXaa3hvjw4rg,32548
setuptools/package_index.py,sha256=VKTKT2NijHEWrxmrqa57QfDHMaaI44KeSKhJeFZCfcw,38925
setuptools/site-patch.py,sha256=SeMejq4jWSvvCdCPktirf2278IwLWET5FQ8c0R9F2zo,2418
setuptools/sandbox.py,sha256=wXVdRCIL4pVWiGVgYjQKKoP0UmIduT5nZDO2rKH8Y2k,9994
setuptools/command/develop.py,sha256=svjNIfZbyne63KcNMjxwr8L_rw8XZW8j0T09stYLOGE,6447
setuptools/command/build_ext.py,sha256=k65J3ZUZzQw62U-5Xt7NuQ0UuWMUhU0-sIUpuxcqA7M,11854
setuptools/command/install_scripts.py,sha256=va2sHUlpGZNxOB3V5Z4ZuqnD-1mrccE9M2n6014xSXM,2068
setuptools/command/upload_docs.py,sha256=3vxqDQS1yh47cTaNEcu16ltHz5Gr764z4NB3OM7HFzc,6807
setuptools/command/install_egg_info.py,sha256=_QGULrbm0ueuGxldzPoGB7QdSd2g4bhU8qhzL8fR17w,3833
setuptools/command/__init__.py,sha256=XeM2FtxUGjx9ipxX4xnHsfMOSplYVQpgXvXDEe2cEz0,553
setuptools/command/setopt.py,sha256=akZNG_5z74x6NmhgNm0Opxc-cPO-6jV7SRC5i98TAVE,5068
setuptools/command/sdist.py,sha256=0inyxsLJMwSIB-nnea6qM-JF7J3ZzTbpPl5YgSiL6FQ,8341
setuptools/command/bdist_rpm.py,sha256=knEihWuGchIAzJlxp3iuJomX2kiTlgWnbw7dM38bXQk,2025
setuptools/command/easy_install.py,sha256=f8UMeiYpalnpZdtLwa-Vo5vz3pVf26kif2iQ1w66V30,72716
setuptools/command/install_lib.py,sha256=y7jrhIP0DG7_hO-MiYHCoBwf4ctdUhQcST9RtyvAkG4,2486
setuptools/command/install.py,sha256=8b2aDpZyH6E9u4dyPfEKmu_FrG5q5hUfchagFW-3Ysk,4065
setuptools/command/egg_info.py,sha256=tv-uFbNLnypUOUkwM4HZ_MjBAQiYcz654Pj5vgRouZw,14320
setuptools/command/rotate.py,sha256=zBjgakDOmqXL2abaxS9qpZu-jNBWVH0L3oaAUvZFwHE,2062
setuptools/command/register.py,sha256=a3b1P-yqZJGAh6ONEtmgzeSyCZ6hdItlCL9eFKnCYbo,277
setuptools/command/bdist_egg.py,sha256=U0cNWkqDHAppQFBwl8cB2tWxEYz7dTGDMlPpagmU0jc,18718
setuptools/command/bdist_wininst.py,sha256=mU8EplmcWQ71cyE6S-fXCF4p3wh7UaOHu3q8qgKR8UI,2283
setuptools/command/saveopts.py,sha256=r9oreFEGkaEn3a6FuWKvaIpigz6oQFayKcD7Jhn-RgI,705
setuptools/command/build_py.py,sha256=DrLl-zFXlM0BX2vAS4LS_arxKbCYVlDPczTFecrGJpo,8440
setuptools/command/alias.py,sha256=tO3iC_Kem0gj2QQEFVi3E5HXGewhaD5WoCeBrK7VuWY,2486
setuptools/command/test.py,sha256=rIOoFLV990UvprR50fLT5mUZvRu7O3q9reHc1IV76z0,5932
/opt/alt/python33/bin/easy_install,sha256=L-aGK8KsrFPPLFjacpRzftvKF8k5iBrVGaRkmn6aD0Y,246
/opt/alt/python33/bin/easy_install-3.3,sha256=L-aGK8KsrFPPLFjacpRzftvKF8k5iBrVGaRkmn6aD0Y,246
setuptools/__pycache__/dist.cpython-33.pyc,,
setuptools/__pycache__/py31compat.cpython-33.pyc,,
setuptools/__pycache__/depends.cpython-33.pyc,,
__pycache__/pkg_resources.cpython-33.pyc,,
setuptools/command/__pycache__/build_py.cpython-33.pyc,,
setuptools/command/__pycache__/upload_docs.cpython-33.pyc,,
setuptools/command/__pycache__/build_ext.cpython-33.pyc,,
setuptools/command/__pycache__/sdist.cpython-33.pyc,,
setuptools/__pycache__/py26compat.cpython-33.pyc,,
setuptools/__pycache__/py27compat.cpython-33.pyc,,
setuptools/command/__pycache__/saveopts.cpython-33.pyc,,
setuptools/command/__pycache__/egg_info.cpython-33.pyc,,
setuptools/command/__pycache__/rotate.cpython-33.pyc,,
setuptools/command/__pycache__/install_egg_info.cpython-33.pyc,,
setuptools/command/__pycache__/bdist_wininst.cpython-33.pyc,,
setuptools/command/__pycache__/develop.cpython-33.pyc,,
setuptools/command/__pycache__/bdist_egg.cpython-33.pyc,,
setuptools/__pycache__/extension.cpython-33.pyc,,
setuptools/__pycache__/version.cpython-33.pyc,,
setuptools/command/__pycache__/register.cpython-33.pyc,,
setuptools/__pycache__/sandbox.cpython-33.pyc,,
setuptools/command/__pycache__/test.cpython-33.pyc,,
setuptools/command/__pycache__/install.cpython-33.pyc,,
_markerlib/__pycache__/__init__.cpython-33.pyc,,
setuptools/command/__pycache__/easy_install.cpython-33.pyc,,
_markerlib/__pycache__/markers.cpython-33.pyc,,
setuptools/command/__pycache__/bdist_rpm.cpython-33.pyc,,
setuptools/__pycache__/ssl_support.cpython-33.pyc,,
setuptools/__pycache__/lib2to3_ex.cpython-33.pyc,,
setuptools/__pycache__/svn_utils.cpython-33.pyc,,
setuptools/command/__pycache__/alias.cpython-33.pyc,,
setuptools/__pycache__/__init__.cpython-33.pyc,,
setuptools/__pycache__/compat.cpython-33.pyc,,
setuptools/__pycache__/script template (dev).cpython-33.pyc,,
setuptools/command/__pycache__/install_lib.cpython-33.pyc,,
setuptools/__pycache__/site-patch.cpython-33.pyc,,
setuptools/__pycache__/package_index.cpython-33.pyc,,
setuptools/__pycache__/archive_util.cpython-33.pyc,,
setuptools/__pycache__/script template.cpython-33.pyc,,
setuptools/command/__pycache__/setopt.cpython-33.pyc,,
__pycache__/easy_install.cpython-33.pyc,,
setuptools/command/__pycache__/install_scripts.cpython-33.pyc,,
setuptools/command/__pycache__/__init__.cpython-33.pyc,,
site-packages/setuptools-2.0.dist-info/top_level.txt000064400000000061151733464100016430 0ustar00easy_install
_markerlib
setuptools
pkg_resources
site-packages/setuptools-2.0.dist-info/DESCRIPTION.rst000064400000210360151733464100016220 0ustar00===============================
Installing and Using Setuptools
===============================

.. contents:: **Table of Contents**


-------------------------
Installation Instructions
-------------------------

Upgrading from Distribute
=========================

Currently, Distribute disallows installing Setuptools 0.7+ over Distribute.
You must first uninstall any active version of Distribute first (see
`Uninstalling`_).

Upgrading from Setuptools 0.6
=============================

Upgrading from prior versions of Setuptools is supported. Initial reports
good success in this regard.

Windows
=======

The recommended way to install setuptools on Windows is to download
`ez_setup.py`_ and run it. The script will download the appropriate .egg
file and install it for you.

.. _ez_setup.py: https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py

For best results, uninstall previous versions FIRST (see `Uninstalling`_).

Once installation is complete, you will find an ``easy_install`` program in
your Python ``Scripts`` subdirectory.  For simple invocation and best results,
add this directory to your ``PATH`` environment variable, if it is not already
present.


Unix-based Systems including Mac OS X
=====================================

Download `ez_setup.py`_ and run it using the target Python version. The script
will download the appropriate version and install it for you::

    > wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | python

Note that you will may need to invoke the command with superuser privileges to
install to the system Python::

    > wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | sudo python

Alternatively, on Python 2.6 and later, Setuptools may be installed to a
user-local path::

    > wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py
    > python ez_setup.py --user


Python 2.4 and Python 2.5 support
=================================

Setuptools 2.0 and later requires Python 2.6 or later. To install setuptools
on Python 2.4 or Python 2.5, use the bootstrap script for Setuptools 1.x:
https://bitbucket.org/pypa/setuptools/raw/bootstrap-py24/ez_setup.py.


Advanced Installation
=====================

For more advanced installation options, such as installing to custom
locations or prefixes, download and extract the source
tarball from `Setuptools on PyPI <https://pypi.python.org/pypi/setuptools>`_
and run setup.py with any supported distutils and Setuptools options.
For example::

    setuptools-x.x$ python setup.py --prefix=/opt/setuptools

Use ``--help`` to get a full options list, but we recommend consulting
the `EasyInstall manual`_ for detailed instructions, especially `the section
on custom installation locations`_.

.. _EasyInstall manual: https://pythonhosted.org/setuptools/EasyInstall
.. _the section on custom installation locations: https://pythonhosted.org/setuptools/EasyInstall#custom-installation-locations


Downloads
=========

All setuptools downloads can be found at `the project's home page in the Python
Package Index`_.  Scroll to the very bottom of the page to find the links.

.. _the project's home page in the Python Package Index: https://pypi.python.org/pypi/setuptools

In addition to the PyPI downloads, the development version of ``setuptools``
is available from the `Bitbucket repo`_, and in-development versions of the
`0.6 branch`_ are available as well.

.. _Bitbucket repo: https://bitbucket.org/pypa/setuptools/get/default.tar.gz#egg=setuptools-dev
.. _0.6 branch: http://svn.python.org/projects/sandbox/branches/setuptools-0.6/#egg=setuptools-dev06

Uninstalling
============

On Windows, if Setuptools was installed using an ``.exe`` or ``.msi``
installer, simply use the uninstall feature of "Add/Remove Programs" in the
Control Panel.

Otherwise, to uninstall Setuptools or Distribute, regardless of the Python
version, delete all ``setuptools*`` and ``distribute*`` files and
directories from your system's ``site-packages`` directory
(and any other ``sys.path`` directories) FIRST.

If you are upgrading or otherwise plan to re-install Setuptools or Distribute,
nothing further needs to be done. If you want to completely remove Setuptools,
you may also want to remove the 'easy_install' and 'easy_install-x.x' scripts
and associated executables installed to the Python scripts directory.

--------------------------------
Using Setuptools and EasyInstall
--------------------------------

Here are some of the available manuals, tutorials, and other resources for
learning about Setuptools, Python Eggs, and EasyInstall:

* `The EasyInstall user's guide and reference manual`_
* `The setuptools Developer's Guide`_
* `The pkg_resources API reference`_
* `Package Compatibility Notes`_ (user-maintained)
* `The Internal Structure of Python Eggs`_

Questions, comments, and bug reports should be directed to the `distutils-sig
mailing list`_.  If you have written (or know of) any tutorials, documentation,
plug-ins, or other resources for setuptools users, please let us know about
them there, so this reference list can be updated.  If you have working,
*tested* patches to correct problems or add features, you may submit them to
the `setuptools bug tracker`_.

.. _setuptools bug tracker: https://bitbucket.org/pypa/setuptools/issues
.. _Package Compatibility Notes: https://pythonhosted.org/setuptools/PackageNotes
.. _The Internal Structure of Python Eggs: https://pythonhosted.org/setuptools/formats.html
.. _The setuptools Developer's Guide: https://pythonhosted.org/setuptools/setuptools.html
.. _The pkg_resources API reference: https://pythonhosted.org/setuptools/pkg_resources.html
.. _The EasyInstall user's guide and reference manual: https://pythonhosted.org/setuptools/easy_install.html
.. _distutils-sig mailing list: http://mail.python.org/pipermail/distutils-sig/


-------
Credits
-------

* The original design for the ``.egg`` format and the ``pkg_resources`` API was
  co-created by Phillip Eby and Bob Ippolito.  Bob also implemented the first
  version of ``pkg_resources``, and supplied the OS X operating system version
  compatibility algorithm.

* Ian Bicking implemented many early "creature comfort" features of
  easy_install, including support for downloading via Sourceforge and
  Subversion repositories.  Ian's comments on the Web-SIG about WSGI
  application deployment also inspired the concept of "entry points" in eggs,
  and he has given talks at PyCon and elsewhere to inform and educate the
  community about eggs and setuptools.

* Jim Fulton contributed time and effort to build automated tests of various
  aspects of ``easy_install``, and supplied the doctests for the command-line
  ``.exe`` wrappers on Windows.

* Phillip J. Eby is the seminal author of setuptools, and
  first proposed the idea of an importable binary distribution format for
  Python application plug-ins.

* Significant parts of the implementation of setuptools were funded by the Open
  Source Applications Foundation, to provide a plug-in infrastructure for the
  Chandler PIM application.  In addition, many OSAF staffers (such as Mike
  "Code Bear" Taylor) contributed their time and stress as guinea pigs for the
  use of eggs and setuptools, even before eggs were "cool".  (Thanks, guys!)

* Since the merge with Distribute, Jason R. Coombs is the
  maintainer of setuptools.  The project is maintained in coordination with
  the Python Packaging Authority (PyPA) and the larger Python community.

.. _files:

=======
CHANGES
=======

---
2.0
---

* `Issue #121 <https://bitbucket.org/pypa/setuptools/issue/121>`_: Exempt lib2to3 pickled grammars from DirectorySandbox.
* `Issue #41 <https://bitbucket.org/pypa/setuptools/issue/41>`_: Dropped support for Python 2.4 and Python 2.5. Clients requiring
  setuptools for those versions of Python should use setuptools 1.x.
* Removed ``setuptools.command.easy_install.HAS_USER_SITE``. Clients
  expecting this boolean variable should use ``site.ENABLE_USER_SITE``
  instead.
* Removed ``pkg_resources.ImpWrapper``. Clients that expected this class
  should use ``pkgutil.ImpImporter`` instead.

-----
1.4.2
-----

* `Issue #116 <https://bitbucket.org/pypa/setuptools/issue/116>`_: Correct TypeError when reading a local package index on Python
  3.

-----
1.4.1
-----

* `Issue #114 <https://bitbucket.org/pypa/setuptools/issue/114>`_: Use ``sys.getfilesystemencoding`` for decoding config in
  ``bdist_wininst`` distributions.

* `Issue #105 <https://bitbucket.org/pypa/setuptools/issue/105>`_ and `Issue #113 <https://bitbucket.org/pypa/setuptools/issue/113>`_: Establish a more robust technique for
  determining the terminal encoding::

    1. Try ``getpreferredencoding``
    2. If that returns US_ASCII or None, try the encoding from
       ``getdefaultlocale``. If that encoding was a "fallback" because Python
       could not figure it out from the environment or OS, encoding remains
       unresolved.
    3. If the encoding is resolved, then make sure Python actually implements
       the encoding.
    4. On the event of an error or unknown codec, revert to fallbacks
       (UTF-8 on Darwin, ASCII on everything else).
    5. On the encoding is 'mac-roman' on Darwin, use UTF-8 as 'mac-roman' was
       a bug on older Python releases.

    On a side note, it would seem that the encoding only matters for when SVN
    does not yet support ``--xml`` and when getting repository and svn version
    numbers. The ``--xml`` technique should yield UTF-8 according to some
    messages on the SVN mailing lists. So if the version numbers are always
    7-bit ASCII clean, it may be best to only support the file parsing methods
    for legacy SVN releases and support for SVN without the subprocess command
    would simple go away as support for the older SVNs does.

---
1.4
---

* `Issue #27 <https://bitbucket.org/pypa/setuptools/issue/27>`_: ``easy_install`` will now use credentials from .pypirc if
  present for connecting to the package index.
* `Pull Request #21 <https://bitbucket.org/pypa/setuptools/pull-request/21>`_: Omit unwanted newlines in ``package_index._encode_auth``
  when the username/password pair length indicates wrapping.

-----
1.3.2
-----

* `Issue #99 <https://bitbucket.org/pypa/setuptools/issue/99>`_: Fix filename encoding issues in SVN support.

-----
1.3.1
-----

* Remove exuberant warning in SVN support when SVN is not used.

---
1.3
---

* Address security vulnerability in SSL match_hostname check as reported in
  `Python #17997 <http://bugs.python.org/issue17997>`_.
* Prefer `backports.ssl_match_hostname
  <https://pypi.python.org/pypi/backports.ssl_match_hostname>`_ for backport
  implementation if present.
* Correct NameError in ``ssl_support`` module (``socket.error``).

---
1.2
---

* `Issue #26 <https://bitbucket.org/pypa/setuptools/issue/26>`_: Add support for SVN 1.7. Special thanks to Philip Thiem for the
  contribution.
* `Issue #93 <https://bitbucket.org/pypa/setuptools/issue/93>`_: Wheels are now distributed with every release. Note that as
  reported in `Issue #108 <https://bitbucket.org/pypa/setuptools/issue/108>`_, as of Pip 1.4, scripts aren't installed properly
  from wheels. Therefore, if using Pip to install setuptools from a wheel,
  the ``easy_install`` command will not be available.
* Setuptools "natural" launcher support, introduced in 1.0, is now officially
  supported.

-----
1.1.7
-----

* Fixed behavior of NameError handling in 'script template (dev).py' (script
  launcher for 'develop' installs).
* ``ez_setup.py`` now ensures partial downloads are cleaned up following
  a failed download.
* `Distribute #363 <https://bitbucket.org/tarek/distribute/issue/363>`_ and `Issue #55 <https://bitbucket.org/pypa/setuptools/issue/55>`_: Skip an sdist test that fails on locales
  other than UTF-8.

-----
1.1.6
-----

* `Distribute #349 <https://bitbucket.org/tarek/distribute/issue/349>`_: ``sandbox.execfile`` now opens the target file in binary
  mode, thus honoring a BOM in the file when compiled.

-----
1.1.5
-----

* `Issue #69 <https://bitbucket.org/pypa/setuptools/issue/69>`_: Second attempt at fix (logic was reversed).

-----
1.1.4
-----

* `Issue #77 <https://bitbucket.org/pypa/setuptools/issue/77>`_: Fix error in upload command (Python 2.4).

-----
1.1.3
-----

* Fix NameError in previous patch.

-----
1.1.2
-----

* `Issue #69 <https://bitbucket.org/pypa/setuptools/issue/69>`_: Correct issue where 404 errors are returned for URLs with
  fragments in them (such as #egg=).

-----
1.1.1
-----

* `Issue #75 <https://bitbucket.org/pypa/setuptools/issue/75>`_: Add ``--insecure`` option to ez_setup.py to accommodate
  environments where a trusted SSL connection cannot be validated.
* `Issue #76 <https://bitbucket.org/pypa/setuptools/issue/76>`_: Fix AttributeError in upload command with Python 2.4.

---
1.1
---

* `Issue #71 <https://bitbucket.org/pypa/setuptools/issue/71>`_ (`Distribute #333 <https://bitbucket.org/tarek/distribute/issue/333>`_): EasyInstall now puts less emphasis on the
  condition when a host is blocked via ``--allow-hosts``.
* `Issue #72 <https://bitbucket.org/pypa/setuptools/issue/72>`_: Restored Python 2.4 compatibility in ``ez_setup.py``.

---
1.0
---

* `Issue #60 <https://bitbucket.org/pypa/setuptools/issue/60>`_: On Windows, Setuptools supports deferring to another launcher,
  such as Vinay Sajip's `pylauncher <https://bitbucket.org/pypa/pylauncher>`_
  (included with Python 3.3) to launch console and GUI scripts and not install
  its own launcher executables. This experimental functionality is currently
  only enabled if  the ``SETUPTOOLS_LAUNCHER`` environment variable is set to
  "natural". In the future, this behavior may become default, but only after
  it has matured and seen substantial adoption. The ``SETUPTOOLS_LAUNCHER``
  also accepts "executable" to force the default behavior of creating launcher
  executables.
* `Issue #63 <https://bitbucket.org/pypa/setuptools/issue/63>`_: Bootstrap script (ez_setup.py) now prefers Powershell, curl, or
  wget for retrieving the Setuptools tarball for improved security of the
  install. The script will still fall back to a simple ``urlopen`` on
  platforms that do not have these tools.
* `Issue #65 <https://bitbucket.org/pypa/setuptools/issue/65>`_: Deprecated the ``Features`` functionality.
* `Issue #52 <https://bitbucket.org/pypa/setuptools/issue/52>`_: In ``VerifyingHTTPSConn``, handle a tunnelled (proxied)
  connection.

Backward-Incompatible Changes
=============================

This release includes a couple of backward-incompatible changes, but most if
not all users will find 1.0 a drop-in replacement for 0.9.

* `Issue #50 <https://bitbucket.org/pypa/setuptools/issue/50>`_: Normalized API of environment marker support. Specifically,
  removed line number and filename from SyntaxErrors when returned from
  `pkg_resources.invalid_marker`. Any clients depending on the specific
  string representation of exceptions returned by that function may need to
  be updated to account for this change.
* `Issue #50 <https://bitbucket.org/pypa/setuptools/issue/50>`_: SyntaxErrors generated by `pkg_resources.invalid_marker` are
  normalized for cross-implementation consistency.
* Removed ``--ignore-conflicts-at-my-risk`` and ``--delete-conflicting``
  options to easy_install. These options have been deprecated since 0.6a11.

-----
0.9.8
-----

* `Issue #53 <https://bitbucket.org/pypa/setuptools/issue/53>`_: Fix NameErrors in `_vcs_split_rev_from_url`.

-----
0.9.7
-----

* `Issue #49 <https://bitbucket.org/pypa/setuptools/issue/49>`_: Correct AttributeError on PyPy where a hashlib.HASH object does
  not have a `.name` attribute.
* `Issue #34 <https://bitbucket.org/pypa/setuptools/issue/34>`_: Documentation now refers to bootstrap script in code repository
  referenced by bookmark.
* Add underscore-separated keys to environment markers (markerlib).

-----
0.9.6
-----

* `Issue #44 <https://bitbucket.org/pypa/setuptools/issue/44>`_: Test failure on Python 2.4 when MD5 hash doesn't have a `.name`
  attribute.

-----
0.9.5
-----

* `Python #17980 <http://bugs.python.org/issue17980>`_: Fix security vulnerability in SSL certificate validation.

-----
0.9.4
-----

* `Issue #43 <https://bitbucket.org/pypa/setuptools/issue/43>`_: Fix issue (introduced in 0.9.1) with version resolution when
  upgrading over other releases of Setuptools.

-----
0.9.3
-----

* `Issue #42 <https://bitbucket.org/pypa/setuptools/issue/42>`_: Fix new ``AttributeError`` introduced in last fix.

-----
0.9.2
-----

* `Issue #42 <https://bitbucket.org/pypa/setuptools/issue/42>`_: Fix regression where blank checksums would trigger an
  ``AttributeError``.

-----
0.9.1
-----

* `Distribute #386 <https://bitbucket.org/tarek/distribute/issue/386>`_: Allow other positional and keyword arguments to os.open.
* Corrected dependency on certifi mis-referenced in 0.9.

---
0.9
---

* `package_index` now validates hashes other than MD5 in download links.

---
0.8
---

* Code base now runs on Python 2.4 - Python 3.3 without Python 2to3
  conversion.

-----
0.7.8
-----

* `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Yet another fix for yet another regression.

-----
0.7.7
-----

* `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Repair AttributeError created in last release (redo).
* `Issue #30 <https://bitbucket.org/pypa/setuptools/issue/30>`_: Added test for get_cache_path.

-----
0.7.6
-----

* `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Repair AttributeError created in last release.

-----
0.7.5
-----

* `Issue #21 <https://bitbucket.org/pypa/setuptools/issue/21>`_: Restore Python 2.4 compatibility in ``test_easy_install``.
* `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Merged additional warning from Distribute 0.6.46.
* Now honor the environment variable
  ``SETUPTOOLS_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT`` in addition to the now
  deprecated ``DISTRIBUTE_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT``.

-----
0.7.4
-----

* `Issue #20 <https://bitbucket.org/pypa/setuptools/issue/20>`_: Fix comparison of parsed SVN version on Python 3.

-----
0.7.3
-----

* `Issue #1 <https://bitbucket.org/pypa/setuptools/issue/1>`_: Disable installation of Windows-specific files on non-Windows systems.
* Use new sysconfig module with Python 2.7 or >=3.2.

-----
0.7.2
-----

* `Issue #14 <https://bitbucket.org/pypa/setuptools/issue/14>`_: Use markerlib when the `parser` module is not available.
* `Issue #10 <https://bitbucket.org/pypa/setuptools/issue/10>`_: ``ez_setup.py`` now uses HTTPS to download setuptools from PyPI.

-----
0.7.1
-----

* Fix NameError (`Issue #3 <https://bitbucket.org/pypa/setuptools/issue/3>`_) again - broken in bad merge.

---
0.7
---

* Merged Setuptools and Distribute. See docs/merge.txt for details.

Added several features that were slated for setuptools 0.6c12:

* Index URL now defaults to HTTPS.
* Added experimental environment marker support. Now clients may designate a
  PEP-426 environment marker for "extra" dependencies. Setuptools uses this
  feature in ``setup.py`` for optional SSL and certificate validation support
  on older platforms. Based on Distutils-SIG discussions, the syntax is
  somewhat tentative. There should probably be a PEP with a firmer spec before
  the feature should be considered suitable for use.
* Added support for SSL certificate validation when installing packages from
  an HTTPS service.

-----
0.7b4
-----

* `Issue #3 <https://bitbucket.org/pypa/setuptools/issue/3>`_: Fixed NameError in SSL support.

------
0.6.49
------

* Move warning check in ``get_cache_path`` to follow the directory creation
  to avoid errors when the cache path does not yet exist. Fixes the error
  reported in `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_.

------
0.6.48
------

* Correct AttributeError in ``ResourceManager.get_cache_path`` introduced in
  0.6.46 (redo).

------
0.6.47
------

* Correct AttributeError in ``ResourceManager.get_cache_path`` introduced in
  0.6.46.

------
0.6.46
------

* `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Issue a warning if the PYTHON_EGG_CACHE or otherwise
  customized egg cache location specifies a directory that's group- or
  world-writable.

------
0.6.45
------

* `Distribute #379 <https://bitbucket.org/tarek/distribute/issue/379>`_: ``distribute_setup.py`` now traps VersionConflict as well,
  restoring ability to upgrade from an older setuptools version.

------
0.6.44
------

* ``distribute_setup.py`` has been updated to allow Setuptools 0.7 to
  satisfy use_setuptools.

------
0.6.43
------

* `Distribute #378 <https://bitbucket.org/tarek/distribute/issue/378>`_: Restore support for Python 2.4 Syntax (regression in 0.6.42).

------
0.6.42
------

* External links finder no longer yields duplicate links.
* `Distribute #337 <https://bitbucket.org/tarek/distribute/issue/337>`_: Moved site.py to setuptools/site-patch.py (graft of very old
  patch from setuptools trunk which inspired PR `#31 <https://bitbucket.org/pypa/setuptools/issue/31>`_).

------
0.6.41
------

* `Distribute #27 <https://bitbucket.org/tarek/distribute/issue/27>`_: Use public api for loading resources from zip files rather than
  the private method `_zip_directory_cache`.
* Added a new function ``easy_install.get_win_launcher`` which may be used by
  third-party libraries such as buildout to get a suitable script launcher.

------
0.6.40
------

* `Distribute #376 <https://bitbucket.org/tarek/distribute/issue/376>`_: brought back cli.exe and gui.exe that were deleted in the
  previous release.

------
0.6.39
------

* Add support for console launchers on ARM platforms.
* Fix possible issue in GUI launchers where the subsystem was not supplied to
  the linker.
* Launcher build script now refactored for robustness.
* `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Resources extracted from a zip egg to the file system now also
  check the contents of the file against the zip contents during each
  invocation of get_resource_filename.

------
0.6.38
------

* `Distribute #371 <https://bitbucket.org/tarek/distribute/issue/371>`_: The launcher manifest file is now installed properly.

------
0.6.37
------

* `Distribute #143 <https://bitbucket.org/tarek/distribute/issue/143>`_: Launcher scripts, including easy_install itself, are now
  accompanied by a manifest on 32-bit Windows environments to avoid the
  Installer Detection Technology and thus undesirable UAC elevation described
  in `this Microsoft article
  <http://technet.microsoft.com/en-us/library/cc709628%28WS.10%29.aspx>`_.

------
0.6.36
------

* `Pull Request #35 <https://bitbucket.org/pypa/setuptools/pull-request/35>`_: In `Buildout #64 <https://github.com/buildout/buildout/issues/64>`_, it was reported that
  under Python 3, installation of distutils scripts could attempt to copy
  the ``__pycache__`` directory as a file, causing an error, apparently only
  under Windows. Easy_install now skips all directories when processing
  metadata scripts.

------
0.6.35
------


Note this release is backward-incompatible with distribute 0.6.23-0.6.34 in
how it parses version numbers.

* `Distribute #278 <https://bitbucket.org/tarek/distribute/issue/278>`_: Restored compatibility with distribute 0.6.22 and setuptools
  0.6. Updated the documentation to match more closely with the version
  parsing as intended in setuptools 0.6.

------
0.6.34
------

* `Distribute #341 <https://bitbucket.org/tarek/distribute/issue/341>`_: 0.6.33 fails to build under Python 2.4.

------
0.6.33
------

* Fix 2 errors with Jython 2.5.
* Fix 1 failure with Jython 2.5 and 2.7.
* Disable workaround for Jython scripts on Linux systems.
* `Distribute #336 <https://bitbucket.org/tarek/distribute/issue/336>`_: `setup.py` no longer masks failure exit code when tests fail.
* Fix issue in pkg_resources where try/except around a platform-dependent
  import would trigger hook load failures on Mercurial. See pull request 32
  for details.
* `Distribute #341 <https://bitbucket.org/tarek/distribute/issue/341>`_: Fix a ResourceWarning.

------
0.6.32
------

* Fix test suite with Python 2.6.
* Fix some DeprecationWarnings and ResourceWarnings.
* `Distribute #335 <https://bitbucket.org/tarek/distribute/issue/335>`_: Backed out `setup_requires` superceding installed requirements
  until regression can be addressed.

------
0.6.31
------

* `Distribute #303 <https://bitbucket.org/tarek/distribute/issue/303>`_: Make sure the manifest only ever contains UTF-8 in Python 3.
* `Distribute #329 <https://bitbucket.org/tarek/distribute/issue/329>`_: Properly close files created by tests for compatibility with
  Jython.
* Work around `Jython #1980 <http://bugs.jython.org/issue1980>`_ and `Jython #1981 <http://bugs.jython.org/issue1981>`_.
* `Distribute #334 <https://bitbucket.org/tarek/distribute/issue/334>`_: Provide workaround for packages that reference `sys.__stdout__`
  such as numpy does. This change should address
  `virtualenv `#359 <https://bitbucket.org/pypa/setuptools/issue/359>`_ <https://github.com/pypa/virtualenv/issues/359>`_ as long
  as the system encoding is UTF-8 or the IO encoding is specified in the
  environment, i.e.::

     PYTHONIOENCODING=utf8 pip install numpy

* Fix for encoding issue when installing from Windows executable on Python 3.
* `Distribute #323 <https://bitbucket.org/tarek/distribute/issue/323>`_: Allow `setup_requires` requirements to supercede installed
  requirements. Added some new keyword arguments to existing pkg_resources
  methods. Also had to updated how __path__ is handled for namespace packages
  to ensure that when a new egg distribution containing a namespace package is
  placed on sys.path, the entries in __path__ are found in the same order they
  would have been in had that egg been on the path when pkg_resources was
  first imported.

------
0.6.30
------

* `Distribute #328 <https://bitbucket.org/tarek/distribute/issue/328>`_: Clean up temporary directories in distribute_setup.py.
* Fix fatal bug in distribute_setup.py.

------
0.6.29
------

* `Pull Request #14 <https://bitbucket.org/pypa/setuptools/pull-request/14>`_: Honor file permissions in zip files.
* `Distribute #327 <https://bitbucket.org/tarek/distribute/issue/327>`_: Merged pull request `#24 <https://bitbucket.org/pypa/setuptools/issue/24>`_ to fix a dependency problem with pip.
* Merged pull request `#23 <https://bitbucket.org/pypa/setuptools/issue/23>`_ to fix https://github.com/pypa/virtualenv/issues/301.
* If Sphinx is installed, the `upload_docs` command now runs `build_sphinx`
  to produce uploadable documentation.
* `Distribute #326 <https://bitbucket.org/tarek/distribute/issue/326>`_: `upload_docs` provided mangled auth credentials under Python 3.
* `Distribute #320 <https://bitbucket.org/tarek/distribute/issue/320>`_: Fix check for "createable" in distribute_setup.py.
* `Distribute #305 <https://bitbucket.org/tarek/distribute/issue/305>`_: Remove a warning that was triggered during normal operations.
* `Distribute #311 <https://bitbucket.org/tarek/distribute/issue/311>`_: Print metadata in UTF-8 independent of platform.
* `Distribute #303 <https://bitbucket.org/tarek/distribute/issue/303>`_: Read manifest file with UTF-8 encoding under Python 3.
* `Distribute #301 <https://bitbucket.org/tarek/distribute/issue/301>`_: Allow to run tests of namespace packages when using 2to3.
* `Distribute #304 <https://bitbucket.org/tarek/distribute/issue/304>`_: Prevent import loop in site.py under Python 3.3.
* `Distribute #283 <https://bitbucket.org/tarek/distribute/issue/283>`_: Reenable scanning of `*.pyc` / `*.pyo` files on Python 3.3.
* `Distribute #299 <https://bitbucket.org/tarek/distribute/issue/299>`_: The develop command didn't work on Python 3, when using 2to3,
  as the egg link would go to the Python 2 source. Linking to the 2to3'd code
  in build/lib makes it work, although you will have to rebuild the module
  before testing it.
* `Distribute #306 <https://bitbucket.org/tarek/distribute/issue/306>`_: Even if 2to3 is used, we build in-place under Python 2.
* `Distribute #307 <https://bitbucket.org/tarek/distribute/issue/307>`_: Prints the full path when .svn/entries is broken.
* `Distribute #313 <https://bitbucket.org/tarek/distribute/issue/313>`_: Support for sdist subcommands (Python 2.7)
* `Distribute #314 <https://bitbucket.org/tarek/distribute/issue/314>`_: test_local_index() would fail an OS X.
* `Distribute #310 <https://bitbucket.org/tarek/distribute/issue/310>`_: Non-ascii characters in a namespace __init__.py causes errors.
* `Distribute #218 <https://bitbucket.org/tarek/distribute/issue/218>`_: Improved documentation on behavior of `package_data` and
  `include_package_data`. Files indicated by `package_data` are now included
  in the manifest.
* `distribute_setup.py` now allows a `--download-base` argument for retrieving
  distribute from a specified location.

------
0.6.28
------

* `Distribute #294 <https://bitbucket.org/tarek/distribute/issue/294>`_: setup.py can now be invoked from any directory.
* Scripts are now installed honoring the umask.
* Added support for .dist-info directories.
* `Distribute #283 <https://bitbucket.org/tarek/distribute/issue/283>`_: Fix and disable scanning of `*.pyc` / `*.pyo` files on
  Python 3.3.

------
0.6.27
------

* Support current snapshots of CPython 3.3.
* Distribute now recognizes README.rst as a standard, default readme file.
* Exclude 'encodings' modules when removing modules from sys.modules.
  Workaround for `#285 <https://bitbucket.org/pypa/setuptools/issue/285>`_.
* `Distribute #231 <https://bitbucket.org/tarek/distribute/issue/231>`_: Don't fiddle with system python when used with buildout
  (bootstrap.py)

------
0.6.26
------

* `Distribute #183 <https://bitbucket.org/tarek/distribute/issue/183>`_: Symlinked files are now extracted from source distributions.
* `Distribute #227 <https://bitbucket.org/tarek/distribute/issue/227>`_: Easy_install fetch parameters are now passed during the
  installation of a source distribution; now fulfillment of setup_requires
  dependencies will honor the parameters passed to easy_install.

------
0.6.25
------

* `Distribute #258 <https://bitbucket.org/tarek/distribute/issue/258>`_: Workaround a cache issue
* `Distribute #260 <https://bitbucket.org/tarek/distribute/issue/260>`_: distribute_setup.py now accepts the --user parameter for
  Python 2.6 and later.
* `Distribute #262 <https://bitbucket.org/tarek/distribute/issue/262>`_: package_index.open_with_auth no longer throws LookupError
  on Python 3.
* `Distribute #269 <https://bitbucket.org/tarek/distribute/issue/269>`_: AttributeError when an exception occurs reading Manifest.in
  on late releases of Python.
* `Distribute #272 <https://bitbucket.org/tarek/distribute/issue/272>`_: Prevent TypeError when namespace package names are unicode
  and single-install-externally-managed is used. Also fixes PIP issue
  449.
* `Distribute #273 <https://bitbucket.org/tarek/distribute/issue/273>`_: Legacy script launchers now install with Python2/3 support.

------
0.6.24
------

* `Distribute #249 <https://bitbucket.org/tarek/distribute/issue/249>`_: Added options to exclude 2to3 fixers

------
0.6.23
------

* `Distribute #244 <https://bitbucket.org/tarek/distribute/issue/244>`_: Fixed a test
* `Distribute #243 <https://bitbucket.org/tarek/distribute/issue/243>`_: Fixed a test
* `Distribute #239 <https://bitbucket.org/tarek/distribute/issue/239>`_: Fixed a test
* `Distribute #240 <https://bitbucket.org/tarek/distribute/issue/240>`_: Fixed a test
* `Distribute #241 <https://bitbucket.org/tarek/distribute/issue/241>`_: Fixed a test
* `Distribute #237 <https://bitbucket.org/tarek/distribute/issue/237>`_: Fixed a test
* `Distribute #238 <https://bitbucket.org/tarek/distribute/issue/238>`_: easy_install now uses 64bit executable wrappers on 64bit Python
* `Distribute #208 <https://bitbucket.org/tarek/distribute/issue/208>`_: Fixed parsed_versions, it now honors post-releases as noted in the documentation
* `Distribute #207 <https://bitbucket.org/tarek/distribute/issue/207>`_: Windows cli and gui wrappers pass CTRL-C to child python process
* `Distribute #227 <https://bitbucket.org/tarek/distribute/issue/227>`_: easy_install now passes its arguments to setup.py bdist_egg
* `Distribute #225 <https://bitbucket.org/tarek/distribute/issue/225>`_: Fixed a NameError on Python 2.5, 2.4

------
0.6.21
------

* `Distribute #225 <https://bitbucket.org/tarek/distribute/issue/225>`_: FIxed a regression on py2.4

------
0.6.20
------

* `Distribute #135 <https://bitbucket.org/tarek/distribute/issue/135>`_: Include url in warning when processing URLs in package_index.
* `Distribute #212 <https://bitbucket.org/tarek/distribute/issue/212>`_: Fix issue where easy_instal fails on Python 3 on windows installer.
* `Distribute #213 <https://bitbucket.org/tarek/distribute/issue/213>`_: Fix typo in documentation.

------
0.6.19
------

* `Distribute #206 <https://bitbucket.org/tarek/distribute/issue/206>`_: AttributeError: 'HTTPMessage' object has no attribute 'getheaders'

------
0.6.18
------

* `Distribute #210 <https://bitbucket.org/tarek/distribute/issue/210>`_: Fixed a regression introduced by `Distribute #204 <https://bitbucket.org/tarek/distribute/issue/204>`_ fix.

------
0.6.17
------

* Support 'DISTRIBUTE_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT' environment
  variable to allow to disable installation of easy_install-${version} script.
* Support Python >=3.1.4 and >=3.2.1.
* `Distribute #204 <https://bitbucket.org/tarek/distribute/issue/204>`_: Don't try to import the parent of a namespace package in
  declare_namespace
* `Distribute #196 <https://bitbucket.org/tarek/distribute/issue/196>`_: Tolerate responses with multiple Content-Length headers
* `Distribute #205 <https://bitbucket.org/tarek/distribute/issue/205>`_: Sandboxing doesn't preserve working_set. Leads to setup_requires
  problems.

------
0.6.16
------

* Builds sdist gztar even on Windows (avoiding `Distribute #193 <https://bitbucket.org/tarek/distribute/issue/193>`_).
* `Distribute #192 <https://bitbucket.org/tarek/distribute/issue/192>`_: Fixed metadata omitted on Windows when package_dir
  specified with forward-slash.
* `Distribute #195 <https://bitbucket.org/tarek/distribute/issue/195>`_: Cython build support.
* `Distribute #200 <https://bitbucket.org/tarek/distribute/issue/200>`_: Issues with recognizing 64-bit packages on Windows.

------
0.6.15
------

* Fixed typo in bdist_egg
* Several issues under Python 3 has been solved.
* `Distribute #146 <https://bitbucket.org/tarek/distribute/issue/146>`_: Fixed missing DLL files after easy_install of windows exe package.

------
0.6.14
------

* `Distribute #170 <https://bitbucket.org/tarek/distribute/issue/170>`_: Fixed unittest failure. Thanks to Toshio.
* `Distribute #171 <https://bitbucket.org/tarek/distribute/issue/171>`_: Fixed race condition in unittests cause deadlocks in test suite.
* `Distribute #143 <https://bitbucket.org/tarek/distribute/issue/143>`_: Fixed a lookup issue with easy_install.
  Thanks to David and Zooko.
* `Distribute #174 <https://bitbucket.org/tarek/distribute/issue/174>`_: Fixed the edit mode when its used with setuptools itself

------
0.6.13
------

* `Distribute #160 <https://bitbucket.org/tarek/distribute/issue/160>`_: 2.7 gives ValueError("Invalid IPv6 URL")
* `Distribute #150 <https://bitbucket.org/tarek/distribute/issue/150>`_: Fixed using ~/.local even in a --no-site-packages virtualenv
* `Distribute #163 <https://bitbucket.org/tarek/distribute/issue/163>`_: scan index links before external links, and don't use the md5 when
  comparing two distributions

------
0.6.12
------

* `Distribute #149 <https://bitbucket.org/tarek/distribute/issue/149>`_: Fixed various failures on 2.3/2.4

------
0.6.11
------

* Found another case of SandboxViolation - fixed
* `Distribute #15 <https://bitbucket.org/tarek/distribute/issue/15>`_ and `Distribute #48 <https://bitbucket.org/tarek/distribute/issue/48>`_: Introduced a socket timeout of 15 seconds on url openings
* Added indexsidebar.html into MANIFEST.in
* `Distribute #108 <https://bitbucket.org/tarek/distribute/issue/108>`_: Fixed TypeError with Python3.1
* `Distribute #121 <https://bitbucket.org/tarek/distribute/issue/121>`_: Fixed --help install command trying to actually install.
* `Distribute #112 <https://bitbucket.org/tarek/distribute/issue/112>`_: Added an os.makedirs so that Tarek's solution will work.
* `Distribute #133 <https://bitbucket.org/tarek/distribute/issue/133>`_: Added --no-find-links to easy_install
* Added easy_install --user
* `Distribute #100 <https://bitbucket.org/tarek/distribute/issue/100>`_: Fixed develop --user not taking '.' in PYTHONPATH into account
* `Distribute #134 <https://bitbucket.org/tarek/distribute/issue/134>`_: removed spurious UserWarnings. Patch by VanLindberg
* `Distribute #138 <https://bitbucket.org/tarek/distribute/issue/138>`_: cant_write_to_target error when setup_requires is used.
* `Distribute #147 <https://bitbucket.org/tarek/distribute/issue/147>`_: respect the sys.dont_write_bytecode flag

------
0.6.10
------

* Reverted change made for the DistributionNotFound exception because
  zc.buildout uses the exception message to get the name of the
  distribution.

-----
0.6.9
-----

* `Distribute #90 <https://bitbucket.org/tarek/distribute/issue/90>`_: unknown setuptools version can be added in the working set
* `Distribute #87 <https://bitbucket.org/tarek/distribute/issue/87>`_: setupt.py doesn't try to convert distribute_setup.py anymore
  Initial Patch by arfrever.
* `Distribute #89 <https://bitbucket.org/tarek/distribute/issue/89>`_: added a side bar with a download link to the doc.
* `Distribute #86 <https://bitbucket.org/tarek/distribute/issue/86>`_: fixed missing sentence in pkg_resources doc.
* Added a nicer error message when a DistributionNotFound is raised.
* `Distribute #80 <https://bitbucket.org/tarek/distribute/issue/80>`_: test_develop now works with Python 3.1
* `Distribute #93 <https://bitbucket.org/tarek/distribute/issue/93>`_: upload_docs now works if there is an empty sub-directory.
* `Distribute #70 <https://bitbucket.org/tarek/distribute/issue/70>`_: exec bit on non-exec files
* `Distribute #99 <https://bitbucket.org/tarek/distribute/issue/99>`_: now the standalone easy_install command doesn't uses a
  "setup.cfg" if any exists in the working directory. It will use it
  only if triggered by ``install_requires`` from a setup.py call
  (install, develop, etc).
* `Distribute #101 <https://bitbucket.org/tarek/distribute/issue/101>`_: Allowing ``os.devnull`` in Sandbox
* `Distribute #92 <https://bitbucket.org/tarek/distribute/issue/92>`_: Fixed the "no eggs" found error with MacPort
  (platform.mac_ver() fails)
* `Distribute #103 <https://bitbucket.org/tarek/distribute/issue/103>`_: test_get_script_header_jython_workaround not run
  anymore under py3 with C or POSIX local. Contributed by Arfrever.
* `Distribute #104 <https://bitbucket.org/tarek/distribute/issue/104>`_: remvoved the assertion when the installation fails,
  with a nicer message for the end user.
* `Distribute #100 <https://bitbucket.org/tarek/distribute/issue/100>`_: making sure there's no SandboxViolation when
  the setup script patches setuptools.

-----
0.6.8
-----

* Added "check_packages" in dist. (added in Setuptools 0.6c11)
* Fixed the DONT_PATCH_SETUPTOOLS state.

-----
0.6.7
-----

* `Distribute #58 <https://bitbucket.org/tarek/distribute/issue/58>`_: Added --user support to the develop command
* `Distribute #11 <https://bitbucket.org/tarek/distribute/issue/11>`_: Generated scripts now wrap their call to the script entry point
  in the standard "if name == 'main'"
* Added the 'DONT_PATCH_SETUPTOOLS' environment variable, so virtualenv
  can drive an installation that doesn't patch a global setuptools.
* Reviewed unladen-swallow specific change from
  http://code.google.com/p/unladen-swallow/source/detail?spec=svn875&r=719
  and determined that it no longer applies. Distribute should work fine with
  Unladen Swallow 2009Q3.
* `Distribute #21 <https://bitbucket.org/tarek/distribute/issue/21>`_: Allow PackageIndex.open_url to gracefully handle all cases of a
  httplib.HTTPException instead of just InvalidURL and BadStatusLine.
* Removed virtual-python.py from this distribution and updated documentation
  to point to the actively maintained virtualenv instead.
* `Distribute #64 <https://bitbucket.org/tarek/distribute/issue/64>`_: use_setuptools no longer rebuilds the distribute egg every
  time it is run
* use_setuptools now properly respects the requested version
* use_setuptools will no longer try to import a distribute egg for the
  wrong Python version
* `Distribute #74 <https://bitbucket.org/tarek/distribute/issue/74>`_: no_fake should be True by default.
* `Distribute #72 <https://bitbucket.org/tarek/distribute/issue/72>`_: avoid a bootstrapping issue with easy_install -U

-----
0.6.6
-----

* Unified the bootstrap file so it works on both py2.x and py3k without 2to3
  (patch by Holger Krekel)

-----
0.6.5
-----

* `Distribute #65 <https://bitbucket.org/tarek/distribute/issue/65>`_: cli.exe and gui.exe are now generated at build time,
  depending on the platform in use.

* `Distribute #67 <https://bitbucket.org/tarek/distribute/issue/67>`_: Fixed doc typo (PEP 381/382)

* Distribute no longer shadows setuptools if we require a 0.7-series
  setuptools.  And an error is raised when installing a 0.7 setuptools with
  distribute.

* When run from within buildout, no attempt is made to modify an existing
  setuptools egg, whether in a shared egg directory or a system setuptools.

* Fixed a hole in sandboxing allowing builtin file to write outside of
  the sandbox.

-----
0.6.4
-----

* Added the generation of `distribute_setup_3k.py` during the release.
  This closes `Distribute #52 <https://bitbucket.org/tarek/distribute/issue/52>`_.

* Added an upload_docs command to easily upload project documentation to
  PyPI's https://pythonhosted.org. This close issue `Distribute #56 <https://bitbucket.org/tarek/distribute/issue/56>`_.

* Fixed a bootstrap bug on the use_setuptools() API.

-----
0.6.3
-----

setuptools
==========

* Fixed a bunch of calls to file() that caused crashes on Python 3.

bootstrapping
=============

* Fixed a bug in sorting that caused bootstrap to fail on Python 3.

-----
0.6.2
-----

setuptools
==========

* Added Python 3 support; see docs/python3.txt.
  This closes `Old Setuptools #39 <http://bugs.python.org/setuptools/issue39>`_.

* Added option to run 2to3 automatically when installing on Python 3.
  This closes issue `Distribute #31 <https://bitbucket.org/tarek/distribute/issue/31>`_.

* Fixed invalid usage of requirement.parse, that broke develop -d.
  This closes `Old Setuptools #44 <http://bugs.python.org/setuptools/issue44>`_.

* Fixed script launcher for 64-bit Windows.
  This closes `Old Setuptools #2 <http://bugs.python.org/setuptools/issue2>`_.

* KeyError when compiling extensions.
  This closes `Old Setuptools #41 <http://bugs.python.org/setuptools/issue41>`_.

bootstrapping
=============

* Fixed bootstrap not working on Windows. This closes issue `Distribute #49 <https://bitbucket.org/tarek/distribute/issue/49>`_.

* Fixed 2.6 dependencies. This closes issue `Distribute #50 <https://bitbucket.org/tarek/distribute/issue/50>`_.

* Make sure setuptools is patched when running through easy_install
  This closes `Old Setuptools #40 <http://bugs.python.org/setuptools/issue40>`_.

-----
0.6.1
-----

setuptools
==========

* package_index.urlopen now catches BadStatusLine and malformed url errors.
  This closes `Distribute #16 <https://bitbucket.org/tarek/distribute/issue/16>`_ and `Distribute #18 <https://bitbucket.org/tarek/distribute/issue/18>`_.

* zip_ok is now False by default. This closes `Old Setuptools #33 <http://bugs.python.org/setuptools/issue33>`_.

* Fixed invalid URL error catching. `Old Setuptools #20 <http://bugs.python.org/setuptools/issue20>`_.

* Fixed invalid bootstraping with easy_install installation (`Distribute #40 <https://bitbucket.org/tarek/distribute/issue/40>`_).
  Thanks to Florian Schulze for the help.

* Removed buildout/bootstrap.py. A new repository will create a specific
  bootstrap.py script.


bootstrapping
=============

* The boostrap process leave setuptools alone if detected in the system
  and --root or --prefix is provided, but is not in the same location.
  This closes `Distribute #10 <https://bitbucket.org/tarek/distribute/issue/10>`_.

---
0.6
---

setuptools
==========

* Packages required at build time where not fully present at install time.
  This closes `Distribute #12 <https://bitbucket.org/tarek/distribute/issue/12>`_.

* Protected against failures in tarfile extraction. This closes `Distribute #10 <https://bitbucket.org/tarek/distribute/issue/10>`_.

* Made Jython api_tests.txt doctest compatible. This closes `Distribute #7 <https://bitbucket.org/tarek/distribute/issue/7>`_.

* sandbox.py replaced builtin type file with builtin function open. This
  closes `Distribute #6 <https://bitbucket.org/tarek/distribute/issue/6>`_.

* Immediately close all file handles. This closes `Distribute #3 <https://bitbucket.org/tarek/distribute/issue/3>`_.

* Added compatibility with Subversion 1.6. This references `Distribute #1 <https://bitbucket.org/tarek/distribute/issue/1>`_.

pkg_resources
=============

* Avoid a call to /usr/bin/sw_vers on OSX and use the official platform API
  instead. Based on a patch from ronaldoussoren. This closes issue `#5 <https://bitbucket.org/pypa/setuptools/issue/5>`_.

* Fixed a SandboxViolation for mkdir that could occur in certain cases.
  This closes `Distribute #13 <https://bitbucket.org/tarek/distribute/issue/13>`_.

* Allow to find_on_path on systems with tight permissions to fail gracefully.
  This closes `Distribute #9 <https://bitbucket.org/tarek/distribute/issue/9>`_.

* Corrected inconsistency between documentation and code of add_entry.
  This closes `Distribute #8 <https://bitbucket.org/tarek/distribute/issue/8>`_.

* Immediately close all file handles. This closes `Distribute #3 <https://bitbucket.org/tarek/distribute/issue/3>`_.

easy_install
============

* Immediately close all file handles. This closes `Distribute #3 <https://bitbucket.org/tarek/distribute/issue/3>`_.

-----
0.6c9
-----

 * Fixed a missing files problem when using Windows source distributions on
   non-Windows platforms, due to distutils not handling manifest file line
   endings correctly.

 * Updated Pyrex support to work with Pyrex 0.9.6 and higher.

 * Minor changes for Jython compatibility, including skipping tests that can't
   work on Jython.

 * Fixed not installing eggs in ``install_requires`` if they were also used for
   ``setup_requires`` or ``tests_require``.

 * Fixed not fetching eggs in ``install_requires`` when running tests.

 * Allow ``ez_setup.use_setuptools()`` to upgrade existing setuptools
   installations when called from a standalone ``setup.py``.

 * Added a warning if a namespace package is declared, but its parent package
   is not also declared as a namespace.

 * Support Subversion 1.5

 * Removed use of deprecated ``md5`` module if ``hashlib`` is available

 * Fixed ``bdist_wininst upload`` trying to upload the ``.exe`` twice

 * Fixed ``bdist_egg`` putting a ``native_libs.txt`` in the source package's
   ``.egg-info``, when it should only be in the built egg's ``EGG-INFO``.

 * Ensure that _full_name is set on all shared libs before extensions are
   checked for shared lib usage.  (Fixes a bug in the experimental shared
   library build support.)

 * Fix to allow unpacked eggs containing native libraries to fail more
   gracefully under Google App Engine (with an ``ImportError`` loading the
   C-based module, instead of getting a ``NameError``).

-----
0.6c7
-----

 * Fixed ``distutils.filelist.findall()`` crashing on broken symlinks, and
   ``egg_info`` command failing on new, uncommitted SVN directories.

 * Fix import problems with nested namespace packages installed via
   ``--root`` or ``--single-version-externally-managed``, due to the
   parent package not having the child package as an attribute.

-----
0.6c6
-----

 * Added ``--egg-path`` option to ``develop`` command, allowing you to force
   ``.egg-link`` files to use relative paths (allowing them to be shared across
   platforms on a networked drive).

 * Fix not building binary RPMs correctly.

 * Fix "eggsecutables" (such as setuptools' own egg) only being runnable with
   bash-compatible shells.

 * Fix ``#!`` parsing problems in Windows ``.exe`` script wrappers, when there
   was whitespace inside a quoted argument or at the end of the ``#!`` line
   (a regression introduced in 0.6c4).

 * Fix ``test`` command possibly failing if an older version of the project
   being tested was installed on ``sys.path`` ahead of the test source
   directory.

 * Fix ``find_packages()`` treating ``ez_setup`` and directories with ``.`` in
   their names as packages.

-----
0.6c5
-----

 * Fix uploaded ``bdist_rpm`` packages being described as ``bdist_egg``
   packages under Python versions less than 2.5.

 * Fix uploaded ``bdist_wininst`` packages being described as suitable for
   "any" version by Python 2.5, even if a ``--target-version`` was specified.

-----
0.6c4
-----

 * Overhauled Windows script wrapping to support ``bdist_wininst`` better.
   Scripts installed with ``bdist_wininst`` will always use ``#!python.exe`` or
   ``#!pythonw.exe`` as the executable name (even when built on non-Windows
   platforms!), and the wrappers will look for the executable in the script's
   parent directory (which should find the right version of Python).

 * Fix ``upload`` command not uploading files built by ``bdist_rpm`` or
   ``bdist_wininst`` under Python 2.3 and 2.4.

 * Add support for "eggsecutable" headers: a ``#!/bin/sh`` script that is
   prepended to an ``.egg`` file to allow it to be run as a script on Unix-ish
   platforms.  (This is mainly so that setuptools itself can have a single-file
   installer on Unix, without doing multiple downloads, dealing with firewalls,
   etc.)

 * Fix problem with empty revision numbers in Subversion 1.4 ``entries`` files

 * Use cross-platform relative paths in ``easy-install.pth`` when doing
   ``develop`` and the source directory is a subdirectory of the installation
   target directory.

 * Fix a problem installing eggs with a system packaging tool if the project
   contained an implicit namespace package; for example if the ``setup()``
   listed a namespace package ``foo.bar`` without explicitly listing ``foo``
   as a namespace package.

-----
0.6c3
-----

 * Fixed breakages caused by Subversion 1.4's new "working copy" format

-----
0.6c2
-----

 * The ``ez_setup`` module displays the conflicting version of setuptools (and
   its installation location) when a script requests a version that's not
   available.

 * Running ``setup.py develop`` on a setuptools-using project will now install
   setuptools if needed, instead of only downloading the egg.

-----
0.6c1
-----

 * Fixed ``AttributeError`` when trying to download a ``setup_requires``
   dependency when a distribution lacks a ``dependency_links`` setting.

 * Made ``zip-safe`` and ``not-zip-safe`` flag files contain a single byte, so
   as to play better with packaging tools that complain about zero-length
   files.

 * Made ``setup.py develop`` respect the ``--no-deps`` option, which it
   previously was ignoring.

 * Support ``extra_path`` option to ``setup()`` when ``install`` is run in
   backward-compatibility mode.

 * Source distributions now always include a ``setup.cfg`` file that explicitly
   sets ``egg_info`` options such that they produce an identical version number
   to the source distribution's version number.  (Previously, the default
   version number could be different due to the use of ``--tag-date``, or if
   the version was overridden on the command line that built the source
   distribution.)

-----
0.6b4
-----

 * Fix ``register`` not obeying name/version set by ``egg_info`` command, if
   ``egg_info`` wasn't explicitly run first on the same command line.

 * Added ``--no-date`` and ``--no-svn-revision`` options to ``egg_info``
   command, to allow suppressing tags configured in ``setup.cfg``.

 * Fixed redundant warnings about missing ``README`` file(s); it should now
   appear only if you are actually a source distribution.

-----
0.6b3
-----

 * Fix ``bdist_egg`` not including files in subdirectories of ``.egg-info``.

 * Allow ``.py`` files found by the ``include_package_data`` option to be
   automatically included.  Remove duplicate data file matches if both
   ``include_package_data`` and ``package_data`` are used to refer to the same
   files.

-----
0.6b1
-----

 * Strip ``module`` from the end of compiled extension modules when computing
   the name of a ``.py`` loader/wrapper.  (Python's import machinery ignores
   this suffix when searching for an extension module.)

------
0.6a11
------

 * Added ``test_loader`` keyword to support custom test loaders

 * Added ``setuptools.file_finders`` entry point group to allow implementing
   revision control plugins.

 * Added ``--identity`` option to ``upload`` command.

 * Added ``dependency_links`` to allow specifying URLs for ``--find-links``.

 * Enhanced test loader to scan packages as well as modules, and call
   ``additional_tests()`` if present to get non-unittest tests.

 * Support namespace packages in conjunction with system packagers, by omitting
   the installation of any ``__init__.py`` files for namespace packages, and
   adding a special ``.pth`` file to create a working package in
   ``sys.modules``.

 * Made ``--single-version-externally-managed`` automatic when ``--root`` is
   used, so that most system packagers won't require special support for
   setuptools.

 * Fixed ``setup_requires``, ``tests_require``, etc. not using ``setup.cfg`` or
   other configuration files for their option defaults when installing, and
   also made the install use ``--multi-version`` mode so that the project
   directory doesn't need to support .pth files.

 * ``MANIFEST.in`` is now forcibly closed when any errors occur while reading
   it.  Previously, the file could be left open and the actual error would be
   masked by problems trying to remove the open file on Windows systems.

------
0.6a10
------

 * Fixed the ``develop`` command ignoring ``--find-links``.

-----
0.6a9
-----

 * The ``sdist`` command no longer uses the traditional ``MANIFEST`` file to
   create source distributions.  ``MANIFEST.in`` is still read and processed,
   as are the standard defaults and pruning.  But the manifest is built inside
   the project's ``.egg-info`` directory as ``SOURCES.txt``, and it is rebuilt
   every time the ``egg_info`` command is run.

 * Added the ``include_package_data`` keyword to ``setup()``, allowing you to
   automatically include any package data listed in revision control or
   ``MANIFEST.in``

 * Added the ``exclude_package_data`` keyword to ``setup()``, allowing you to
   trim back files included via the ``package_data`` and
   ``include_package_data`` options.

 * Fixed ``--tag-svn-revision`` not working when run from a source
   distribution.

 * Added warning for namespace packages with missing ``declare_namespace()``

 * Added ``tests_require`` keyword to ``setup()``, so that e.g. packages
   requiring ``nose`` to run unit tests can make this dependency optional
   unless the ``test`` command is run.

 * Made all commands that use ``easy_install`` respect its configuration
   options, as this was causing some problems with ``setup.py install``.

 * Added an ``unpack_directory()`` driver to ``setuptools.archive_util``, so
   that you can process a directory tree through a processing filter as if it
   were a zipfile or tarfile.

 * Added an internal ``install_egg_info`` command to use as part of old-style
   ``install`` operations, that installs an ``.egg-info`` directory with the
   package.

 * Added a ``--single-version-externally-managed`` option to the ``install``
   command so that you can more easily wrap a "flat" egg in a system package.

 * Enhanced ``bdist_rpm`` so that it installs single-version eggs that
   don't rely on a ``.pth`` file.  The ``--no-egg`` option has been removed,
   since all RPMs are now built in a more backwards-compatible format.

 * Support full roundtrip translation of eggs to and from ``bdist_wininst``
   format.  Running ``bdist_wininst`` on a setuptools-based package wraps the
   egg in an .exe that will safely install it as an egg (i.e., with metadata
   and entry-point wrapper scripts), and ``easy_install`` can turn the .exe
   back into an ``.egg`` file or directory and install it as such.


-----
0.6a8
-----

 * Fixed some problems building extensions when Pyrex was installed, especially
   with Python 2.4 and/or packages using SWIG.

 * Made ``develop`` command accept all the same options as ``easy_install``,
   and use the ``easy_install`` command's configuration settings as defaults.

 * Made ``egg_info --tag-svn-revision`` fall back to extracting the revision
   number from ``PKG-INFO`` in case it is being run on a source distribution of
   a snapshot taken from a Subversion-based project.

 * Automatically detect ``.dll``, ``.so`` and ``.dylib`` files that are being
   installed as data, adding them to ``native_libs.txt`` automatically.

 * Fixed some problems with fresh checkouts of projects that don't include
   ``.egg-info/PKG-INFO`` under revision control and put the project's source
   code directly in the project directory.  If such a package had any
   requirements that get processed before the ``egg_info`` command can be run,
   the setup scripts would fail with a "Missing 'Version:' header and/or
   PKG-INFO file" error, because the egg runtime interpreted the unbuilt
   metadata in a directory on ``sys.path`` (i.e. the current directory) as
   being a corrupted egg.  Setuptools now monkeypatches the distribution
   metadata cache to pretend that the egg has valid version information, until
   it has a chance to make it actually be so (via the ``egg_info`` command).

-----
0.6a5
-----

 * Fixed missing gui/cli .exe files in distribution.  Fixed bugs in tests.

-----
0.6a3
-----

 * Added ``gui_scripts`` entry point group to allow installing GUI scripts
   on Windows and other platforms.  (The special handling is only for Windows;
   other platforms are treated the same as for ``console_scripts``.)

-----
0.6a2
-----

 * Added ``console_scripts`` entry point group to allow installing scripts
   without the need to create separate script files.  On Windows, console
   scripts get an ``.exe`` wrapper so you can just type their name.  On other
   platforms, the scripts are written without a file extension.

-----
0.6a1
-----

 * Added support for building "old-style" RPMs that don't install an egg for
   the target package, using a ``--no-egg`` option.

 * The ``build_ext`` command now works better when using the ``--inplace``
   option and multiple Python versions.  It now makes sure that all extensions
   match the current Python version, even if newer copies were built for a
   different Python version.

 * The ``upload`` command no longer attaches an extra ``.zip`` when uploading
   eggs, as PyPI now supports egg uploads without trickery.

 * The ``ez_setup`` script/module now displays a warning before downloading
   the setuptools egg, and attempts to check the downloaded egg against an
   internal MD5 checksum table.

 * Fixed the ``--tag-svn-revision`` option of ``egg_info`` not finding the
   latest revision number; it was using the revision number of the directory
   containing ``setup.py``, not the highest revision number in the project.

 * Added ``eager_resources`` setup argument

 * The ``sdist`` command now recognizes Subversion "deleted file" entries and
   does not include them in source distributions.

 * ``setuptools`` now embeds itself more thoroughly into the distutils, so that
   other distutils extensions (e.g. py2exe, py2app) will subclass setuptools'
   versions of things, rather than the native distutils ones.

 * Added ``entry_points`` and ``setup_requires`` arguments to ``setup()``;
   ``setup_requires`` allows you to automatically find and download packages
   that are needed in order to *build* your project (as opposed to running it).

 * ``setuptools`` now finds its commands, ``setup()`` argument validators, and
   metadata writers using entry points, so that they can be extended by
   third-party packages.  See `Creating distutils Extensions
   <http://pythonhosted.org/setuptools/setuptools.html#creating-distutils-extensions>`_
   for more details.

 * The vestigial ``depends`` command has been removed.  It was never finished
   or documented, and never would have worked without EasyInstall - which it
   pre-dated and was never compatible with.

------
0.5a12
------

 * The zip-safety scanner now checks for modules that might be used with
   ``python -m``, and marks them as unsafe for zipping, since Python 2.4 can't
   handle ``-m`` on zipped modules.

------
0.5a11
------

 * Fix breakage of the "develop" command that was caused by the addition of
   ``--always-unzip`` to the ``easy_install`` command.

-----
0.5a9
-----

 * Include ``svn:externals`` directories in source distributions as well as
   normal subversion-controlled files and directories.

 * Added ``exclude=patternlist`` option to ``setuptools.find_packages()``

 * Changed --tag-svn-revision to include an "r" in front of the revision number
   for better readability.

 * Added ability to build eggs without including source files (except for any
   scripts, of course), using the ``--exclude-source-files`` option to
   ``bdist_egg``.

 * ``setup.py install`` now automatically detects when an "unmanaged" package
   or module is going to be on ``sys.path`` ahead of a package being installed,
   thereby preventing the newer version from being imported.  If this occurs,
   a warning message is output to ``sys.stderr``, but installation proceeds
   anyway.  The warning message informs the user what files or directories
   need deleting, and advises them they can also use EasyInstall (with the
   ``--delete-conflicting`` option) to do it automatically.

 * The ``egg_info`` command now adds a ``top_level.txt`` file to the metadata
   directory that lists all top-level modules and packages in the distribution.
   This is used by the ``easy_install`` command to find possibly-conflicting
   "unmanaged" packages when installing the distribution.

 * Added ``zip_safe`` and ``namespace_packages`` arguments to ``setup()``.
   Added package analysis to determine zip-safety if the ``zip_safe`` flag
   is not given, and advise the author regarding what code might need changing.

 * Fixed the swapped ``-d`` and ``-b`` options of ``bdist_egg``.

-----
0.5a8
-----

 * The "egg_info" command now always sets the distribution metadata to "safe"
   forms of the distribution name and version, so that distribution files will
   be generated with parseable names (i.e., ones that don't include '-' in the
   name or version).  Also, this means that if you use the various ``--tag``
   options of "egg_info", any distributions generated will use the tags in the
   version, not just egg distributions.

 * Added support for defining command aliases in distutils configuration files,
   under the "[aliases]" section.  To prevent recursion and to allow aliases to
   call the command of the same name, a given alias can be expanded only once
   per command-line invocation.  You can define new aliases with the "alias"
   command, either for the local, global, or per-user configuration.

 * Added "rotate" command to delete old distribution files, given a set of
   patterns to match and the number of files to keep.  (Keeps the most
   recently-modified distribution files matching each pattern.)

 * Added "saveopts" command that saves all command-line options for the current
   invocation to the local, global, or per-user configuration file.  Useful for
   setting defaults without having to hand-edit a configuration file.

 * Added a "setopt" command that sets a single option in a specified distutils
   configuration file.

-----
0.5a7
-----

 * Added "upload" support for egg and source distributions, including a bug
   fix for "upload" and a temporary workaround for lack of .egg support in
   PyPI.

-----
0.5a6
-----

 * Beefed up the "sdist" command so that if you don't have a MANIFEST.in, it
   will include all files under revision control (CVS or Subversion) in the
   current directory, and it will regenerate the list every time you create a
   source distribution, not just when you tell it to.  This should make the
   default "do what you mean" more often than the distutils' default behavior
   did, while still retaining the old behavior in the presence of MANIFEST.in.

 * Fixed the "develop" command always updating .pth files, even if you
   specified ``-n`` or ``--dry-run``.

 * Slightly changed the format of the generated version when you use
   ``--tag-build`` on the "egg_info" command, so that you can make tagged
   revisions compare *lower* than the version specified in setup.py (e.g. by
   using ``--tag-build=dev``).

-----
0.5a5
-----

 * Added ``develop`` command to ``setuptools``-based packages.  This command
   installs an ``.egg-link`` pointing to the package's source directory, and
   script wrappers that ``execfile()`` the source versions of the package's
   scripts.  This lets you put your development checkout(s) on sys.path without
   having to actually install them.  (To uninstall the link, use
   use ``setup.py develop --uninstall``.)

 * Added ``egg_info`` command to ``setuptools``-based packages.  This command
   just creates or updates the "projectname.egg-info" directory, without
   building an egg.  (It's used by the ``bdist_egg``, ``test``, and ``develop``
   commands.)

 * Enhanced the ``test`` command so that it doesn't install the package, but
   instead builds any C extensions in-place, updates the ``.egg-info``
   metadata, adds the source directory to ``sys.path``, and runs the tests
   directly on the source.  This avoids an "unmanaged" installation of the
   package to ``site-packages`` or elsewhere.

 * Made ``easy_install`` a standard ``setuptools`` command, moving it from
   the ``easy_install`` module to ``setuptools.command.easy_install``.  Note
   that if you were importing or extending it, you must now change your imports
   accordingly.  ``easy_install.py`` is still installed as a script, but not as
   a module.

-----
0.5a4
-----

 * Setup scripts using setuptools can now list their dependencies directly in
   the setup.py file, without having to manually create a ``depends.txt`` file.
   The ``install_requires`` and ``extras_require`` arguments to ``setup()``
   are used to create a dependencies file automatically.  If you are manually
   creating ``depends.txt`` right now, please switch to using these setup
   arguments as soon as practical, because ``depends.txt`` support will be
   removed in the 0.6 release cycle.  For documentation on the new arguments,
   see the ``setuptools.dist.Distribution`` class.

 * Setup scripts using setuptools now always install using ``easy_install``
   internally, for ease of uninstallation and upgrading.

-----
0.5a1
-----

 * Added support for "self-installation" bootstrapping.  Packages can now
   include ``ez_setup.py`` in their source distribution, and add the following
   to their ``setup.py``, in order to automatically bootstrap installation of
   setuptools as part of their setup process::

    from ez_setup import use_setuptools
    use_setuptools()

    from setuptools import setup
    # etc...

-----
0.4a2
-----

 * Added ``ez_setup.py`` installer/bootstrap script to make initial setuptools
   installation easier, and to allow distributions using setuptools to avoid
   having to include setuptools in their source distribution.

 * All downloads are now managed by the ``PackageIndex`` class (which is now
   subclassable and replaceable), so that embedders can more easily override
   download logic, give download progress reports, etc.  The class has also
   been moved to the new ``setuptools.package_index`` module.

 * The ``Installer`` class no longer handles downloading, manages a temporary
   directory, or tracks the ``zip_ok`` option.  Downloading is now handled
   by ``PackageIndex``, and ``Installer`` has become an ``easy_install``
   command class based on ``setuptools.Command``.

 * There is a new ``setuptools.sandbox.run_setup()`` API to invoke a setup
   script in a directory sandbox, and a new ``setuptools.archive_util`` module
   with an ``unpack_archive()`` API.  These were split out of EasyInstall to
   allow reuse by other tools and applications.

 * ``setuptools.Command`` now supports reinitializing commands using keyword
   arguments to set/reset options.  Also, ``Command`` subclasses can now set
   their ``command_consumes_arguments`` attribute to ``True`` in order to
   receive an ``args`` option containing the rest of the command line.

-----
0.3a2
-----

 * Added new options to ``bdist_egg`` to allow tagging the egg's version number
   with a subversion revision number, the current date, or an explicit tag
   value.  Run ``setup.py bdist_egg --help`` to get more information.

 * Misc. bug fixes

-----
0.3a1
-----

 * Initial release.


site-packages/setuptools-2.0.dist-info/WHEEL000064400000000156151733464110014473 0ustar00Wheel-Version: 1.0
Generator: bdist_wheel (0.22.0)
Root-Is-Purelib: true
Tag: py2-none-any
Tag: py3-none-any

site-packages/pkg_resources.py000064400000301137151733464110012523 0ustar00"""Package resource API
--------------------

A resource is a logical file contained within a package, or a logical
subdirectory thereof.  The package resource API expects resource names
to have their path parts separated with ``/``, *not* whatever the local
path separator is.  Do not use os.path operations to manipulate resource
names being passed into the API.

The package resource API is designed to work with normal filesystem packages,
.egg files, and unpacked .egg files.  It can also work in a limited way with
.zip files and with custom PEP 302 loaders that support the ``get_data()``
method.
"""

import sys
import os
import time
import re
import imp
import zipfile
import zipimport
import warnings
import stat
import functools
import pkgutil
from pkgutil import get_importer

try:
    from urlparse import urlparse, urlunparse
except ImportError:
    from urllib.parse import urlparse, urlunparse

try:
    frozenset
except NameError:
    from sets import ImmutableSet as frozenset
try:
    basestring
    next = lambda o: o.next()
    from cStringIO import StringIO as BytesIO
except NameError:
    basestring = str
    from io import BytesIO
    def execfile(fn, globs=None, locs=None):
        if globs is None:
            globs = globals()
        if locs is None:
            locs = globs
        exec(compile(open(fn).read(), fn, 'exec'), globs, locs)

# capture these to bypass sandboxing
from os import utime
try:
    from os import mkdir, rename, unlink
    WRITE_SUPPORT = True
except ImportError:
    # no write support, probably under GAE
    WRITE_SUPPORT = False

from os import open as os_open
from os.path import isdir, split

# Avoid try/except due to potential problems with delayed import mechanisms.
if sys.version_info >= (3, 3) and sys.implementation.name == "cpython":
    import importlib._bootstrap as importlib_bootstrap
else:
    importlib_bootstrap = None

try:
    import parser
except ImportError:
    pass

def _bypass_ensure_directory(name, mode=0x1FF):  # 0777
    # Sandbox-bypassing version of ensure_directory()
    if not WRITE_SUPPORT:
        raise IOError('"os.mkdir" not supported on this platform.')
    dirname, filename = split(name)
    if dirname and filename and not isdir(dirname):
        _bypass_ensure_directory(dirname)
        mkdir(dirname, mode)


_state_vars = {}

def _declare_state(vartype, **kw):
    g = globals()
    for name, val in kw.items():
        g[name] = val
        _state_vars[name] = vartype

def __getstate__():
    state = {}
    g = globals()
    for k, v in _state_vars.items():
        state[k] = g['_sget_'+v](g[k])
    return state

def __setstate__(state):
    g = globals()
    for k, v in state.items():
        g['_sset_'+_state_vars[k]](k, g[k], v)
    return state

def _sget_dict(val):
    return val.copy()

def _sset_dict(key, ob, state):
    ob.clear()
    ob.update(state)

def _sget_object(val):
    return val.__getstate__()

def _sset_object(key, ob, state):
    ob.__setstate__(state)

_sget_none = _sset_none = lambda *args: None


def get_supported_platform():
    """Return this platform's maximum compatible version.

    distutils.util.get_platform() normally reports the minimum version
    of Mac OS X that would be required to *use* extensions produced by
    distutils.  But what we want when checking compatibility is to know the
    version of Mac OS X that we are *running*.  To allow usage of packages that
    explicitly require a newer version of Mac OS X, we must also know the
    current version of the OS.

    If this condition occurs for any other platform with a version in its
    platform strings, this function should be extended accordingly.
    """
    plat = get_build_platform()
    m = macosVersionString.match(plat)
    if m is not None and sys.platform == "darwin":
        try:
            plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3))
        except ValueError:
            pass    # not Mac OS X
    return plat

__all__ = [
    # Basic resource access and distribution/entry point discovery
    'require', 'run_script', 'get_provider',  'get_distribution',
    'load_entry_point', 'get_entry_map', 'get_entry_info', 'iter_entry_points',
    'resource_string', 'resource_stream', 'resource_filename',
    'resource_listdir', 'resource_exists', 'resource_isdir',

    # Environmental control
    'declare_namespace', 'working_set', 'add_activation_listener',
    'find_distributions', 'set_extraction_path', 'cleanup_resources',
    'get_default_cache',

    # Primary implementation classes
    'Environment', 'WorkingSet', 'ResourceManager',
    'Distribution', 'Requirement', 'EntryPoint',

    # Exceptions
    'ResolutionError','VersionConflict','DistributionNotFound','UnknownExtra',
    'ExtractionError',

    # Parsing functions and string utilities
    'parse_requirements', 'parse_version', 'safe_name', 'safe_version',
    'get_platform', 'compatible_platforms', 'yield_lines', 'split_sections',
    'safe_extra', 'to_filename', 'invalid_marker', 'evaluate_marker',

    # filesystem utilities
    'ensure_directory', 'normalize_path',

    # Distribution "precedence" constants
    'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', 'DEVELOP_DIST',

    # "Provider" interfaces, implementations, and registration/lookup APIs
    'IMetadataProvider', 'IResourceProvider', 'FileMetadata',
    'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider',
    'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider',
    'register_finder', 'register_namespace_handler', 'register_loader_type',
    'fixup_namespace_packages', 'get_importer',

    # Deprecated/backward compatibility only
    'run_main', 'AvailableDistributions',
]

class ResolutionError(Exception):
    """Abstract base for dependency resolution errors"""
    def __repr__(self):
        return self.__class__.__name__+repr(self.args)

class VersionConflict(ResolutionError):
    """An already-installed version conflicts with the requested version"""

class DistributionNotFound(ResolutionError):
    """A requested distribution was not found"""

class UnknownExtra(ResolutionError):
    """Distribution doesn't have an "extra feature" of the given name"""
_provider_factories = {}

PY_MAJOR = sys.version[:3]
EGG_DIST = 3
BINARY_DIST = 2
SOURCE_DIST = 1
CHECKOUT_DIST = 0
DEVELOP_DIST = -1

def register_loader_type(loader_type, provider_factory):
    """Register `provider_factory` to make providers for `loader_type`

    `loader_type` is the type or class of a PEP 302 ``module.__loader__``,
    and `provider_factory` is a function that, passed a *module* object,
    returns an ``IResourceProvider`` for that module.
    """
    _provider_factories[loader_type] = provider_factory

def get_provider(moduleOrReq):
    """Return an IResourceProvider for the named module or requirement"""
    if isinstance(moduleOrReq,Requirement):
        return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0]
    try:
        module = sys.modules[moduleOrReq]
    except KeyError:
        __import__(moduleOrReq)
        module = sys.modules[moduleOrReq]
    loader = getattr(module, '__loader__', None)
    return _find_adapter(_provider_factories, loader)(module)

def _macosx_vers(_cache=[]):
    if not _cache:
        import platform
        version = platform.mac_ver()[0]
        # fallback for MacPorts
        if version == '':
            import plistlib
            plist = '/System/Library/CoreServices/SystemVersion.plist'
            if os.path.exists(plist):
                if hasattr(plistlib, 'readPlist'):
                    plist_content = plistlib.readPlist(plist)
                    if 'ProductVersion' in plist_content:
                        version = plist_content['ProductVersion']

        _cache.append(version.split('.'))
    return _cache[0]

def _macosx_arch(machine):
    return {'PowerPC':'ppc', 'Power_Macintosh':'ppc'}.get(machine,machine)

def get_build_platform():
    """Return this platform's string for platform-specific distributions

    XXX Currently this is the same as ``distutils.util.get_platform()``, but it
    needs some hacks for Linux and Mac OS X.
    """
    try:
        # Python 2.7 or >=3.2
        from sysconfig import get_platform
    except ImportError:
        from distutils.util import get_platform

    plat = get_platform()
    if sys.platform == "darwin" and not plat.startswith('macosx-'):
        try:
            version = _macosx_vers()
            machine = os.uname()[4].replace(" ", "_")
            return "macosx-%d.%d-%s" % (int(version[0]), int(version[1]),
                _macosx_arch(machine))
        except ValueError:
            # if someone is running a non-Mac darwin system, this will fall
            # through to the default implementation
            pass
    return plat

macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)")
darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)")
get_platform = get_build_platform   # XXX backward compat


def compatible_platforms(provided,required):
    """Can code for the `provided` platform run on the `required` platform?

    Returns true if either platform is ``None``, or the platforms are equal.

    XXX Needs compatibility checks for Linux and other unixy OSes.
    """
    if provided is None or required is None or provided==required:
        return True     # easy case

    # Mac OS X special cases
    reqMac = macosVersionString.match(required)
    if reqMac:
        provMac = macosVersionString.match(provided)

        # is this a Mac package?
        if not provMac:
            # this is backwards compatibility for packages built before
            # setuptools 0.6. All packages built after this point will
            # use the new macosx designation.
            provDarwin = darwinVersionString.match(provided)
            if provDarwin:
                dversion = int(provDarwin.group(1))
                macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2))
                if dversion == 7 and macosversion >= "10.3" or \
                        dversion == 8 and macosversion >= "10.4":

                    #import warnings
                    #warnings.warn("Mac eggs should be rebuilt to "
                    #    "use the macosx designation instead of darwin.",
                    #    category=DeprecationWarning)
                    return True
            return False    # egg isn't macosx or legacy darwin

        # are they the same major version and machine type?
        if provMac.group(1) != reqMac.group(1) or \
                provMac.group(3) != reqMac.group(3):
            return False

        # is the required OS major update >= the provided one?
        if int(provMac.group(2)) > int(reqMac.group(2)):
            return False

        return True

    # XXX Linux and other platforms' special cases should go here
    return False


def run_script(dist_spec, script_name):
    """Locate distribution `dist_spec` and run its `script_name` script"""
    ns = sys._getframe(1).f_globals
    name = ns['__name__']
    ns.clear()
    ns['__name__'] = name
    require(dist_spec)[0].run_script(script_name, ns)

run_main = run_script   # backward compatibility

def get_distribution(dist):
    """Return a current distribution object for a Requirement or string"""
    if isinstance(dist,basestring): dist = Requirement.parse(dist)
    if isinstance(dist,Requirement): dist = get_provider(dist)
    if not isinstance(dist,Distribution):
        raise TypeError("Expected string, Requirement, or Distribution", dist)
    return dist

def load_entry_point(dist, group, name):
    """Return `name` entry point of `group` for `dist` or raise ImportError"""
    return get_distribution(dist).load_entry_point(group, name)

def get_entry_map(dist, group=None):
    """Return the entry point map for `group`, or the full entry map"""
    return get_distribution(dist).get_entry_map(group)

def get_entry_info(dist, group, name):
    """Return the EntryPoint object for `group`+`name`, or ``None``"""
    return get_distribution(dist).get_entry_info(group, name)


class IMetadataProvider:

    def has_metadata(name):
        """Does the package's distribution contain the named metadata?"""

    def get_metadata(name):
        """The named metadata resource as a string"""

    def get_metadata_lines(name):
        """Yield named metadata resource as list of non-blank non-comment lines

       Leading and trailing whitespace is stripped from each line, and lines
       with ``#`` as the first non-blank character are omitted."""

    def metadata_isdir(name):
        """Is the named metadata a directory?  (like ``os.path.isdir()``)"""

    def metadata_listdir(name):
        """List of metadata names in the directory (like ``os.listdir()``)"""

    def run_script(script_name, namespace):
        """Execute the named script in the supplied namespace dictionary"""


class IResourceProvider(IMetadataProvider):
    """An object that provides access to package resources"""

    def get_resource_filename(manager, resource_name):
        """Return a true filesystem path for `resource_name`

        `manager` must be an ``IResourceManager``"""

    def get_resource_stream(manager, resource_name):
        """Return a readable file-like object for `resource_name`

        `manager` must be an ``IResourceManager``"""

    def get_resource_string(manager, resource_name):
        """Return a string containing the contents of `resource_name`

        `manager` must be an ``IResourceManager``"""

    def has_resource(resource_name):
        """Does the package contain the named resource?"""

    def resource_isdir(resource_name):
        """Is the named resource a directory?  (like ``os.path.isdir()``)"""

    def resource_listdir(resource_name):
        """List of resource names in the directory (like ``os.listdir()``)"""


class WorkingSet(object):
    """A collection of active distributions on sys.path (or a similar list)"""

    def __init__(self, entries=None):
        """Create working set from list of path entries (default=sys.path)"""
        self.entries = []
        self.entry_keys = {}
        self.by_key = {}
        self.callbacks = []

        if entries is None:
            entries = sys.path

        for entry in entries:
            self.add_entry(entry)

    def add_entry(self, entry):
        """Add a path item to ``.entries``, finding any distributions on it

        ``find_distributions(entry, True)`` is used to find distributions
        corresponding to the path entry, and they are added.  `entry` is
        always appended to ``.entries``, even if it is already present.
        (This is because ``sys.path`` can contain the same value more than
        once, and the ``.entries`` of the ``sys.path`` WorkingSet should always
        equal ``sys.path``.)
        """
        self.entry_keys.setdefault(entry, [])
        self.entries.append(entry)
        for dist in find_distributions(entry, True):
            self.add(dist, entry, False)

    def __contains__(self,dist):
        """True if `dist` is the active distribution for its project"""
        return self.by_key.get(dist.key) == dist

    def find(self, req):
        """Find a distribution matching requirement `req`

        If there is an active distribution for the requested project, this
        returns it as long as it meets the version requirement specified by
        `req`.  But, if there is an active distribution for the project and it
        does *not* meet the `req` requirement, ``VersionConflict`` is raised.
        If there is no active distribution for the requested project, ``None``
        is returned.
        """
        dist = self.by_key.get(req.key)
        if dist is not None and dist not in req:
            raise VersionConflict(dist,req)     # XXX add more info
        else:
            return dist

    def iter_entry_points(self, group, name=None):
        """Yield entry point objects from `group` matching `name`

        If `name` is None, yields all entry points in `group` from all
        distributions in the working set, otherwise only ones matching
        both `group` and `name` are yielded (in distribution order).
        """
        for dist in self:
            entries = dist.get_entry_map(group)
            if name is None:
                for ep in entries.values():
                    yield ep
            elif name in entries:
                yield entries[name]

    def run_script(self, requires, script_name):
        """Locate distribution for `requires` and run `script_name` script"""
        ns = sys._getframe(1).f_globals
        name = ns['__name__']
        ns.clear()
        ns['__name__'] = name
        self.require(requires)[0].run_script(script_name, ns)

    def __iter__(self):
        """Yield distributions for non-duplicate projects in the working set

        The yield order is the order in which the items' path entries were
        added to the working set.
        """
        seen = {}
        for item in self.entries:
            if item not in self.entry_keys:
                # workaround a cache issue
                continue

            for key in self.entry_keys[item]:
                if key not in seen:
                    seen[key]=1
                    yield self.by_key[key]

    def add(self, dist, entry=None, insert=True):
        """Add `dist` to working set, associated with `entry`

        If `entry` is unspecified, it defaults to the ``.location`` of `dist`.
        On exit from this routine, `entry` is added to the end of the working
        set's ``.entries`` (if it wasn't already present).

        `dist` is only added to the working set if it's for a project that
        doesn't already have a distribution in the set.  If it's added, any
        callbacks registered with the ``subscribe()`` method will be called.
        """
        if insert:
            dist.insert_on(self.entries, entry)

        if entry is None:
            entry = dist.location
        keys = self.entry_keys.setdefault(entry,[])
        keys2 = self.entry_keys.setdefault(dist.location,[])
        if dist.key in self.by_key:
            return      # ignore hidden distros

        self.by_key[dist.key] = dist
        if dist.key not in keys:
            keys.append(dist.key)
        if dist.key not in keys2:
            keys2.append(dist.key)
        self._added_new(dist)

    def resolve(self, requirements, env=None, installer=None):
        """List all distributions needed to (recursively) meet `requirements`

        `requirements` must be a sequence of ``Requirement`` objects.  `env`,
        if supplied, should be an ``Environment`` instance.  If
        not supplied, it defaults to all distributions available within any
        entry or distribution in the working set.  `installer`, if supplied,
        will be invoked with each requirement that cannot be met by an
        already-installed distribution; it should return a ``Distribution`` or
        ``None``.
        """

        requirements = list(requirements)[::-1]  # set up the stack
        processed = {}  # set of processed requirements
        best = {}  # key -> dist
        to_activate = []

        while requirements:
            req = requirements.pop(0)   # process dependencies breadth-first
            if req in processed:
                # Ignore cyclic or redundant dependencies
                continue
            dist = best.get(req.key)
            if dist is None:
                # Find the best distribution and add it to the map
                dist = self.by_key.get(req.key)
                if dist is None:
                    if env is None:
                        env = Environment(self.entries)
                    dist = best[req.key] = env.best_match(req, self, installer)
                    if dist is None:
                        #msg = ("The '%s' distribution was not found on this "
                        #       "system, and is required by this application.")
                        #raise DistributionNotFound(msg % req)

                        # unfortunately, zc.buildout uses a str(err)
                        # to get the name of the distribution here..
                        raise DistributionNotFound(req)
                to_activate.append(dist)
            if dist not in req:
                # Oops, the "best" so far conflicts with a dependency
                raise VersionConflict(dist,req) # XXX put more info here
            requirements.extend(dist.requires(req.extras)[::-1])
            processed[req] = True

        return to_activate    # return list of distros to activate

    def find_plugins(self, plugin_env, full_env=None, installer=None,
            fallback=True):
        """Find all activatable distributions in `plugin_env`

        Example usage::

            distributions, errors = working_set.find_plugins(
                Environment(plugin_dirlist)
            )
            map(working_set.add, distributions)  # add plugins+libs to sys.path
            print 'Could not load', errors        # display errors

        The `plugin_env` should be an ``Environment`` instance that contains
        only distributions that are in the project's "plugin directory" or
        directories. The `full_env`, if supplied, should be an ``Environment``
        contains all currently-available distributions.  If `full_env` is not
        supplied, one is created automatically from the ``WorkingSet`` this
        method is called on, which will typically mean that every directory on
        ``sys.path`` will be scanned for distributions.

        `installer` is a standard installer callback as used by the
        ``resolve()`` method. The `fallback` flag indicates whether we should
        attempt to resolve older versions of a plugin if the newest version
        cannot be resolved.

        This method returns a 2-tuple: (`distributions`, `error_info`), where
        `distributions` is a list of the distributions found in `plugin_env`
        that were loadable, along with any other distributions that are needed
        to resolve their dependencies.  `error_info` is a dictionary mapping
        unloadable plugin distributions to an exception instance describing the
        error that occurred. Usually this will be a ``DistributionNotFound`` or
        ``VersionConflict`` instance.
        """

        plugin_projects = list(plugin_env)
        plugin_projects.sort()  # scan project names in alphabetic order

        error_info = {}
        distributions = {}

        if full_env is None:
            env = Environment(self.entries)
            env += plugin_env
        else:
            env = full_env + plugin_env

        shadow_set = self.__class__([])
        list(map(shadow_set.add, self))   # put all our entries in shadow_set

        for project_name in plugin_projects:

            for dist in plugin_env[project_name]:

                req = [dist.as_requirement()]

                try:
                    resolvees = shadow_set.resolve(req, env, installer)

                except ResolutionError:
                    v = sys.exc_info()[1]
                    error_info[dist] = v    # save error info
                    if fallback:
                        continue    # try the next older version of project
                    else:
                        break       # give up on this project, keep going

                else:
                    list(map(shadow_set.add, resolvees))
                    distributions.update(dict.fromkeys(resolvees))

                    # success, no need to try any more versions of this project
                    break

        distributions = list(distributions)
        distributions.sort()

        return distributions, error_info

    def require(self, *requirements):
        """Ensure that distributions matching `requirements` are activated

        `requirements` must be a string or a (possibly-nested) sequence
        thereof, specifying the distributions and versions required.  The
        return value is a sequence of the distributions that needed to be
        activated to fulfill the requirements; all relevant distributions are
        included, even if they were already activated in this working set.
        """
        needed = self.resolve(parse_requirements(requirements))

        for dist in needed:
            self.add(dist)

        return needed

    def subscribe(self, callback):
        """Invoke `callback` for all distributions (including existing ones)"""
        if callback in self.callbacks:
            return
        self.callbacks.append(callback)
        for dist in self:
            callback(dist)

    def _added_new(self, dist):
        for callback in self.callbacks:
            callback(dist)

    def __getstate__(self):
        return (
            self.entries[:], self.entry_keys.copy(), self.by_key.copy(),
            self.callbacks[:]
        )

    def __setstate__(self, e_k_b_c):
        entries, keys, by_key, callbacks = e_k_b_c
        self.entries = entries[:]
        self.entry_keys = keys.copy()
        self.by_key = by_key.copy()
        self.callbacks = callbacks[:]


class Environment(object):
    """Searchable snapshot of distributions on a search path"""

    def __init__(self, search_path=None, platform=get_supported_platform(), python=PY_MAJOR):
        """Snapshot distributions available on a search path

        Any distributions found on `search_path` are added to the environment.
        `search_path` should be a sequence of ``sys.path`` items.  If not
        supplied, ``sys.path`` is used.

        `platform` is an optional string specifying the name of the platform
        that platform-specific distributions must be compatible with.  If
        unspecified, it defaults to the current platform.  `python` is an
        optional string naming the desired version of Python (e.g. ``'3.3'``);
        it defaults to the current version.

        You may explicitly set `platform` (and/or `python`) to ``None`` if you
        wish to map *all* distributions, not just those compatible with the
        running platform or Python version.
        """
        self._distmap = {}
        self._cache = {}
        self.platform = platform
        self.python = python
        self.scan(search_path)

    def can_add(self, dist):
        """Is distribution `dist` acceptable for this environment?

        The distribution must match the platform and python version
        requirements specified when this environment was created, or False
        is returned.
        """
        return (self.python is None or dist.py_version is None
            or dist.py_version==self.python) \
            and compatible_platforms(dist.platform,self.platform)

    def remove(self, dist):
        """Remove `dist` from the environment"""
        self._distmap[dist.key].remove(dist)

    def scan(self, search_path=None):
        """Scan `search_path` for distributions usable in this environment

        Any distributions found are added to the environment.
        `search_path` should be a sequence of ``sys.path`` items.  If not
        supplied, ``sys.path`` is used.  Only distributions conforming to
        the platform/python version defined at initialization are added.
        """
        if search_path is None:
            search_path = sys.path

        for item in search_path:
            for dist in find_distributions(item):
                self.add(dist)

    def __getitem__(self,project_name):
        """Return a newest-to-oldest list of distributions for `project_name`
        """
        try:
            return self._cache[project_name]
        except KeyError:
            project_name = project_name.lower()
            if project_name not in self._distmap:
                return []

        if project_name not in self._cache:
            dists = self._cache[project_name] = self._distmap[project_name]
            _sort_dists(dists)

        return self._cache[project_name]

    def add(self,dist):
        """Add `dist` if we ``can_add()`` it and it isn't already added"""
        if self.can_add(dist) and dist.has_version():
            dists = self._distmap.setdefault(dist.key,[])
            if dist not in dists:
                dists.append(dist)
                if dist.key in self._cache:
                    _sort_dists(self._cache[dist.key])

    def best_match(self, req, working_set, installer=None):
        """Find distribution best matching `req` and usable on `working_set`

        This calls the ``find(req)`` method of the `working_set` to see if a
        suitable distribution is already active.  (This may raise
        ``VersionConflict`` if an unsuitable version of the project is already
        active in the specified `working_set`.)  If a suitable distribution
        isn't active, this method returns the newest distribution in the
        environment that meets the ``Requirement`` in `req`.  If no suitable
        distribution is found, and `installer` is supplied, then the result of
        calling the environment's ``obtain(req, installer)`` method will be
        returned.
        """
        dist = working_set.find(req)
        if dist is not None:
            return dist
        for dist in self[req.key]:
            if dist in req:
                return dist
        return self.obtain(req, installer) # try and download/install

    def obtain(self, requirement, installer=None):
        """Obtain a distribution matching `requirement` (e.g. via download)

        Obtain a distro that matches requirement (e.g. via download).  In the
        base ``Environment`` class, this routine just returns
        ``installer(requirement)``, unless `installer` is None, in which case
        None is returned instead.  This method is a hook that allows subclasses
        to attempt other ways of obtaining a distribution before falling back
        to the `installer` argument."""
        if installer is not None:
            return installer(requirement)

    def __iter__(self):
        """Yield the unique project names of the available distributions"""
        for key in self._distmap.keys():
            if self[key]: yield key

    def __iadd__(self, other):
        """In-place addition of a distribution or environment"""
        if isinstance(other,Distribution):
            self.add(other)
        elif isinstance(other,Environment):
            for project in other:
                for dist in other[project]:
                    self.add(dist)
        else:
            raise TypeError("Can't add %r to environment" % (other,))
        return self

    def __add__(self, other):
        """Add an environment or distribution to an environment"""
        new = self.__class__([], platform=None, python=None)
        for env in self, other:
            new += env
        return new


AvailableDistributions = Environment    # XXX backward compatibility


class ExtractionError(RuntimeError):
    """An error occurred extracting a resource

    The following attributes are available from instances of this exception:

    manager
        The resource manager that raised this exception

    cache_path
        The base directory for resource extraction

    original_error
        The exception instance that caused extraction to fail
    """


class ResourceManager:
    """Manage resource extraction and packages"""
    extraction_path = None

    def __init__(self):
        self.cached_files = {}

    def resource_exists(self, package_or_requirement, resource_name):
        """Does the named resource exist?"""
        return get_provider(package_or_requirement).has_resource(resource_name)

    def resource_isdir(self, package_or_requirement, resource_name):
        """Is the named resource an existing directory?"""
        return get_provider(package_or_requirement).resource_isdir(
            resource_name
        )

    def resource_filename(self, package_or_requirement, resource_name):
        """Return a true filesystem path for specified resource"""
        return get_provider(package_or_requirement).get_resource_filename(
            self, resource_name
        )

    def resource_stream(self, package_or_requirement, resource_name):
        """Return a readable file-like object for specified resource"""
        return get_provider(package_or_requirement).get_resource_stream(
            self, resource_name
        )

    def resource_string(self, package_or_requirement, resource_name):
        """Return specified resource as a string"""
        return get_provider(package_or_requirement).get_resource_string(
            self, resource_name
        )

    def resource_listdir(self, package_or_requirement, resource_name):
        """List the contents of the named resource directory"""
        return get_provider(package_or_requirement).resource_listdir(
            resource_name
        )

    def extraction_error(self):
        """Give an error message for problems extracting file(s)"""

        old_exc = sys.exc_info()[1]
        cache_path = self.extraction_path or get_default_cache()

        err = ExtractionError("""Can't extract file(s) to egg cache

The following error occurred while trying to extract file(s) to the Python egg
cache:

  %s

The Python egg cache directory is currently set to:

  %s

Perhaps your account does not have write access to this directory?  You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.
""" % (old_exc, cache_path)
        )
        err.manager = self
        err.cache_path = cache_path
        err.original_error = old_exc
        raise err

    def get_cache_path(self, archive_name, names=()):
        """Return absolute location in cache for `archive_name` and `names`

        The parent directory of the resulting path will be created if it does
        not already exist.  `archive_name` should be the base filename of the
        enclosing egg (which may not be the name of the enclosing zipfile!),
        including its ".egg" extension.  `names`, if provided, should be a
        sequence of path name parts "under" the egg's extraction location.

        This method should only be called by resource providers that need to
        obtain an extraction location, and only for names they intend to
        extract, as it tracks the generated names for possible cleanup later.
        """
        extract_path = self.extraction_path or get_default_cache()
        target_path = os.path.join(extract_path, archive_name+'-tmp', *names)
        try:
            _bypass_ensure_directory(target_path)
        except:
            self.extraction_error()

        self._warn_unsafe_extraction_path(extract_path)

        self.cached_files[target_path] = 1
        return target_path

    @staticmethod
    def _warn_unsafe_extraction_path(path):
        """
        If the default extraction path is overridden and set to an insecure
        location, such as /tmp, it opens up an opportunity for an attacker to
        replace an extracted file with an unauthorized payload. Warn the user
        if a known insecure location is used.

        See Distribute #375 for more details.
        """
        if os.name == 'nt' and not path.startswith(os.environ['windir']):
            # On Windows, permissions are generally restrictive by default
            #  and temp directories are not writable by other users, so
            #  bypass the warning.
            return
        mode = os.stat(path).st_mode
        if mode & stat.S_IWOTH or mode & stat.S_IWGRP:
            msg = ("%s is writable by group/others and vulnerable to attack "
                "when "
                "used with get_resource_filename. Consider a more secure "
                "location (set with .set_extraction_path or the "
                "PYTHON_EGG_CACHE environment variable)." % path)
            warnings.warn(msg, UserWarning)

    def postprocess(self, tempname, filename):
        """Perform any platform-specific postprocessing of `tempname`

        This is where Mac header rewrites should be done; other platforms don't
        have anything special they should do.

        Resource providers should call this method ONLY after successfully
        extracting a compressed resource.  They must NOT call it on resources
        that are already in the filesystem.

        `tempname` is the current (temporary) name of the file, and `filename`
        is the name it will be renamed to by the caller after this routine
        returns.
        """

        if os.name == 'posix':
            # Make the resource executable
            mode = ((os.stat(tempname).st_mode) | 0x16D) & 0xFFF # 0555, 07777
            os.chmod(tempname, mode)

    def set_extraction_path(self, path):
        """Set the base path where resources will be extracted to, if needed.

        If you do not call this routine before any extractions take place, the
        path defaults to the return value of ``get_default_cache()``.  (Which
        is based on the ``PYTHON_EGG_CACHE`` environment variable, with various
        platform-specific fallbacks.  See that routine's documentation for more
        details.)

        Resources are extracted to subdirectories of this path based upon
        information given by the ``IResourceProvider``.  You may set this to a
        temporary directory, but then you must call ``cleanup_resources()`` to
        delete the extracted files when done.  There is no guarantee that
        ``cleanup_resources()`` will be able to remove all extracted files.

        (Note: you may not change the extraction path for a given resource
        manager once resources have been extracted, unless you first call
        ``cleanup_resources()``.)
        """
        if self.cached_files:
            raise ValueError(
                "Can't change extraction path, files already extracted"
            )

        self.extraction_path = path

    def cleanup_resources(self, force=False):
        """
        Delete all extracted resource files and directories, returning a list
        of the file and directory names that could not be successfully removed.
        This function does not have any concurrency protection, so it should
        generally only be called when the extraction path is a temporary
        directory exclusive to a single process.  This method is not
        automatically called; you must call it explicitly or register it as an
        ``atexit`` function if you wish to ensure cleanup of a temporary
        directory used for extractions.
        """
        # XXX

def get_default_cache():
    """Determine the default cache location

    This returns the ``PYTHON_EGG_CACHE`` environment variable, if set.
    Otherwise, on Windows, it returns a "Python-Eggs" subdirectory of the
    "Application Data" directory.  On all other systems, it's "~/.python-eggs".
    """
    try:
        return os.environ['PYTHON_EGG_CACHE']
    except KeyError:
        pass

    if os.name!='nt':
        return os.path.expanduser('~/.python-eggs')

    app_data = 'Application Data'   # XXX this may be locale-specific!
    app_homes = [
        (('APPDATA',), None),       # best option, should be locale-safe
        (('USERPROFILE',), app_data),
        (('HOMEDRIVE','HOMEPATH'), app_data),
        (('HOMEPATH',), app_data),
        (('HOME',), None),
        (('WINDIR',), app_data),    # 95/98/ME
    ]

    for keys, subdir in app_homes:
        dirname = ''
        for key in keys:
            if key in os.environ:
                dirname = os.path.join(dirname, os.environ[key])
            else:
                break
        else:
            if subdir:
                dirname = os.path.join(dirname,subdir)
            return os.path.join(dirname, 'Python-Eggs')
    else:
        raise RuntimeError(
            "Please set the PYTHON_EGG_CACHE enviroment variable"
        )

def safe_name(name):
    """Convert an arbitrary string to a standard distribution name

    Any runs of non-alphanumeric/. characters are replaced with a single '-'.
    """
    return re.sub('[^A-Za-z0-9.]+', '-', name)


def safe_version(version):
    """Convert an arbitrary string to a standard version string

    Spaces become dots, and all other non-alphanumeric characters become
    dashes, with runs of multiple dashes condensed to a single dash.
    """
    version = version.replace(' ','.')
    return re.sub('[^A-Za-z0-9.]+', '-', version)


def safe_extra(extra):
    """Convert an arbitrary string to a standard 'extra' name

    Any runs of non-alphanumeric characters are replaced with a single '_',
    and the result is always lowercased.
    """
    return re.sub('[^A-Za-z0-9.]+', '_', extra).lower()


def to_filename(name):
    """Convert a project or version name to its filename-escaped form

    Any '-' characters are currently replaced with '_'.
    """
    return name.replace('-','_')

_marker_names = {
    'os': ['name'], 'sys': ['platform'],
    'platform': ['version','machine','python_implementation'],
    'python_version': [], 'python_full_version': [], 'extra':[],
}

_marker_values = {
    'os_name': lambda: os.name,
    'sys_platform': lambda: sys.platform,
    'python_full_version': lambda: sys.version.split()[0],
    'python_version': lambda:'%s.%s' % (sys.version_info[0], sys.version_info[1]),
    'platform_version': lambda: _platinfo('version'),
    'platform_machine': lambda: _platinfo('machine'),
    'python_implementation': lambda: _platinfo('python_implementation') or _pyimp(),
}

def _platinfo(attr):
    try:
        import platform
    except ImportError:
        return ''
    return getattr(platform, attr, lambda:'')()

def _pyimp():
    if sys.platform=='cli':
        return 'IronPython'
    elif sys.platform.startswith('java'):
        return 'Jython'
    elif '__pypy__' in sys.builtin_module_names:
        return 'PyPy'
    else:
        return 'CPython'

def normalize_exception(exc):
    """
    Given a SyntaxError from a marker evaluation, normalize the error message:
     - Remove indications of filename and line number.
     - Replace platform-specific error messages with standard error messages.
    """
    subs = {
        'unexpected EOF while parsing': 'invalid syntax',
        'parenthesis is never closed': 'invalid syntax',
    }
    exc.filename = None
    exc.lineno = None
    exc.msg = subs.get(exc.msg, exc.msg)
    return exc


def invalid_marker(text):
    """Validate text as a PEP 426 environment marker; return exception or False"""
    try:
        evaluate_marker(text)
    except SyntaxError:
        return normalize_exception(sys.exc_info()[1])
    return False

def evaluate_marker(text, extra=None, _ops={}):
    """
    Evaluate a PEP 426 environment marker on CPython 2.4+.
    Return a boolean indicating the marker result in this environment.
    Raise SyntaxError if marker is invalid.

    This implementation uses the 'parser' module, which is not implemented on
    Jython and has been superseded by the 'ast' module in Python 2.6 and
    later.
    """

    if not _ops:

        from token import NAME, STRING
        import token
        import symbol
        import operator

        def and_test(nodelist):
            # MUST NOT short-circuit evaluation, or invalid syntax can be skipped!
            return functools.reduce(operator.and_, [interpret(nodelist[i]) for i in range(1,len(nodelist),2)])

        def test(nodelist):
            # MUST NOT short-circuit evaluation, or invalid syntax can be skipped!
            return functools.reduce(operator.or_, [interpret(nodelist[i]) for i in range(1,len(nodelist),2)])

        def atom(nodelist):
            t = nodelist[1][0]
            if t == token.LPAR:
                if nodelist[2][0] == token.RPAR:
                    raise SyntaxError("Empty parentheses")
                return interpret(nodelist[2])
            raise SyntaxError("Language feature not supported in environment markers")

        def comparison(nodelist):
            if len(nodelist)>4:
                raise SyntaxError("Chained comparison not allowed in environment markers")
            comp = nodelist[2][1]
            cop = comp[1]
            if comp[0] == NAME:
                if len(nodelist[2]) == 3:
                    if cop == 'not':
                        cop = 'not in'
                    else:
                        cop = 'is not'
            try:
                cop = _ops[cop]
            except KeyError:
                raise SyntaxError(repr(cop)+" operator not allowed in environment markers")
            return cop(evaluate(nodelist[1]), evaluate(nodelist[3]))

        _ops.update({
            symbol.test: test, symbol.and_test: and_test, symbol.atom: atom,
            symbol.comparison: comparison, 'not in': lambda x,y: x not in y,
            'in': lambda x,y: x in y, '==': operator.eq, '!=': operator.ne,
        })
        if hasattr(symbol,'or_test'):
            _ops[symbol.or_test] = test

    def interpret(nodelist):
        while len(nodelist)==2: nodelist = nodelist[1]
        try:
            op = _ops[nodelist[0]]
        except KeyError:
            raise SyntaxError("Comparison or logical expression expected")
            raise SyntaxError("Language feature not supported in environment markers: "+symbol.sym_name[nodelist[0]])
        return op(nodelist)

    def evaluate(nodelist):
        while len(nodelist)==2: nodelist = nodelist[1]
        kind = nodelist[0]
        name = nodelist[1]
        #while len(name)==2: name = name[1]
        if kind==NAME:
            try:
                op = _marker_values[name]
            except KeyError:
                raise SyntaxError("Unknown name %r" % name)
            return op()
        if kind==STRING:
            s = nodelist[1]
            if s[:1] not in "'\"" or s.startswith('"""') or s.startswith("'''") \
                    or '\\' in s:
                raise SyntaxError(
                    "Only plain strings allowed in environment markers")
            return s[1:-1]
        raise SyntaxError("Language feature not supported in environment markers")

    return interpret(parser.expr(text).totuple(1)[1])

def _markerlib_evaluate(text):
    """
    Evaluate a PEP 426 environment marker using markerlib.
    Return a boolean indicating the marker result in this environment.
    Raise SyntaxError if marker is invalid.
    """
    import _markerlib
    # markerlib implements Metadata 1.2 (PEP 345) environment markers.
    # Translate the variables to Metadata 2.0 (PEP 426).
    env = _markerlib.default_environment()
    for key in env.keys():
        new_key = key.replace('.', '_')
        env[new_key] = env.pop(key)
    try:
        result = _markerlib.interpret(text, env)
    except NameError:
        e = sys.exc_info()[1]
        raise SyntaxError(e.args[0])
    return result

if 'parser' not in globals():
    # fallback to less-complete _markerlib implementation if 'parser' module
    #  is not available.
    evaluate_marker = _markerlib_evaluate

class NullProvider:
    """Try to implement resources and metadata for arbitrary PEP 302 loaders"""

    egg_name = None
    egg_info = None
    loader = None

    def __init__(self, module):
        self.loader = getattr(module, '__loader__', None)
        self.module_path = os.path.dirname(getattr(module, '__file__', ''))

    def get_resource_filename(self, manager, resource_name):
        return self._fn(self.module_path, resource_name)

    def get_resource_stream(self, manager, resource_name):
        return BytesIO(self.get_resource_string(manager, resource_name))

    def get_resource_string(self, manager, resource_name):
        return self._get(self._fn(self.module_path, resource_name))

    def has_resource(self, resource_name):
        return self._has(self._fn(self.module_path, resource_name))

    def has_metadata(self, name):
        return self.egg_info and self._has(self._fn(self.egg_info,name))

    if sys.version_info <= (3,):
        def get_metadata(self, name):
            if not self.egg_info:
                return ""
            return self._get(self._fn(self.egg_info,name))
    else:
        def get_metadata(self, name):
            if not self.egg_info:
                return ""
            return self._get(self._fn(self.egg_info,name)).decode("utf-8")

    def get_metadata_lines(self, name):
        return yield_lines(self.get_metadata(name))

    def resource_isdir(self,resource_name):
        return self._isdir(self._fn(self.module_path, resource_name))

    def metadata_isdir(self,name):
        return self.egg_info and self._isdir(self._fn(self.egg_info,name))

    def resource_listdir(self,resource_name):
        return self._listdir(self._fn(self.module_path,resource_name))

    def metadata_listdir(self,name):
        if self.egg_info:
            return self._listdir(self._fn(self.egg_info,name))
        return []

    def run_script(self,script_name,namespace):
        script = 'scripts/'+script_name
        if not self.has_metadata(script):
            raise ResolutionError("No script named %r" % script_name)
        script_text = self.get_metadata(script).replace('\r\n','\n')
        script_text = script_text.replace('\r','\n')
        script_filename = self._fn(self.egg_info,script)
        namespace['__file__'] = script_filename
        if os.path.exists(script_filename):
            execfile(script_filename, namespace, namespace)
        else:
            from linecache import cache
            cache[script_filename] = (
                len(script_text), 0, script_text.split('\n'), script_filename
            )
            script_code = compile(script_text,script_filename,'exec')
            exec(script_code, namespace, namespace)

    def _has(self, path):
        raise NotImplementedError(
            "Can't perform this operation for unregistered loader type"
        )

    def _isdir(self, path):
        raise NotImplementedError(
            "Can't perform this operation for unregistered loader type"
        )

    def _listdir(self, path):
        raise NotImplementedError(
            "Can't perform this operation for unregistered loader type"
        )

    def _fn(self, base, resource_name):
        if resource_name:
            return os.path.join(base, *resource_name.split('/'))
        return base

    def _get(self, path):
        if hasattr(self.loader, 'get_data'):
            return self.loader.get_data(path)
        raise NotImplementedError(
            "Can't perform this operation for loaders without 'get_data()'"
        )

register_loader_type(object, NullProvider)


class EggProvider(NullProvider):
    """Provider based on a virtual filesystem"""

    def __init__(self,module):
        NullProvider.__init__(self,module)
        self._setup_prefix()

    def _setup_prefix(self):
        # we assume here that our metadata may be nested inside a "basket"
        # of multiple eggs; that's why we use module_path instead of .archive
        path = self.module_path
        old = None
        while path!=old:
            if path.lower().endswith('.egg'):
                self.egg_name = os.path.basename(path)
                self.egg_info = os.path.join(path, 'EGG-INFO')
                self.egg_root = path
                break
            old = path
            path, base = os.path.split(path)

class DefaultProvider(EggProvider):
    """Provides access to package resources in the filesystem"""

    def _has(self, path):
        return os.path.exists(path)

    def _isdir(self,path):
        return os.path.isdir(path)

    def _listdir(self,path):
        return os.listdir(path)

    def get_resource_stream(self, manager, resource_name):
        return open(self._fn(self.module_path, resource_name), 'rb')

    def _get(self, path):
        stream = open(path, 'rb')
        try:
            return stream.read()
        finally:
            stream.close()

register_loader_type(type(None), DefaultProvider)

if importlib_bootstrap is not None:
    register_loader_type(importlib_bootstrap.SourceFileLoader, DefaultProvider)


class EmptyProvider(NullProvider):
    """Provider that returns nothing for all requests"""

    _isdir = _has = lambda self,path: False
    _get = lambda self,path: ''
    _listdir = lambda self,path: []
    module_path = None

    def __init__(self):
        pass

empty_provider = EmptyProvider()


def build_zipmanifest(path):
    """
    This builds a similar dictionary to the zipimport directory
    caches.  However instead of tuples, ZipInfo objects are stored.

    The translation of the tuple is as follows:
      * [0] - zipinfo.filename on stock pythons this needs "/" --> os.sep
              on pypy it is the same (one reason why distribute did work
              in some cases on pypy and win32).
      * [1] - zipinfo.compress_type
      * [2] - zipinfo.compress_size
      * [3] - zipinfo.file_size
      * [4] - len(utf-8 encoding of filename) if zipinfo & 0x800
              len(ascii encoding of filename) otherwise
      * [5] - (zipinfo.date_time[0] - 1980) << 9 |
               zipinfo.date_time[1] << 5 | zipinfo.date_time[2]
      * [6] - (zipinfo.date_time[3] - 1980) << 11 |
               zipinfo.date_time[4] << 5 | (zipinfo.date_time[5] // 2)
      * [7] - zipinfo.CRC
    """
    zipinfo = dict()
    zfile = zipfile.ZipFile(path)
    #Got ZipFile has not __exit__ on python 3.1
    try:
        for zitem in zfile.namelist():
            zpath = zitem.replace('/', os.sep)
            zipinfo[zpath] = zfile.getinfo(zitem)
            assert zipinfo[zpath] is not None
    finally:
        zfile.close()
    return zipinfo


class ZipProvider(EggProvider):
    """Resource support for zips and eggs"""

    eagers = None

    def __init__(self, module):
        EggProvider.__init__(self,module)
        self.zipinfo = build_zipmanifest(self.loader.archive)
        self.zip_pre = self.loader.archive+os.sep

    def _zipinfo_name(self, fspath):
        # Convert a virtual filename (full path to file) into a zipfile subpath
        # usable with the zipimport directory cache for our target archive
        if fspath.startswith(self.zip_pre):
            return fspath[len(self.zip_pre):]
        raise AssertionError(
            "%s is not a subpath of %s" % (fspath,self.zip_pre)
        )

    def _parts(self,zip_path):
        # Convert a zipfile subpath into an egg-relative path part list
        fspath = self.zip_pre+zip_path  # pseudo-fs path
        if fspath.startswith(self.egg_root+os.sep):
            return fspath[len(self.egg_root)+1:].split(os.sep)
        raise AssertionError(
            "%s is not a subpath of %s" % (fspath,self.egg_root)
        )

    def get_resource_filename(self, manager, resource_name):
        if not self.egg_name:
            raise NotImplementedError(
                "resource_filename() only supported for .egg, not .zip"
            )
        # no need to lock for extraction, since we use temp names
        zip_path = self._resource_to_zip(resource_name)
        eagers = self._get_eager_resources()
        if '/'.join(self._parts(zip_path)) in eagers:
            for name in eagers:
                self._extract_resource(manager, self._eager_to_zip(name))
        return self._extract_resource(manager, zip_path)

    @staticmethod
    def _get_date_and_size(zip_stat):
        size = zip_stat.file_size
        date_time = zip_stat.date_time + (0, 0, -1)  # ymdhms+wday, yday, dst
        #1980 offset already done
        timestamp = time.mktime(date_time)
        return timestamp, size

    def _extract_resource(self, manager, zip_path):

        if zip_path in self._index():
            for name in self._index()[zip_path]:
                last = self._extract_resource(
                    manager, os.path.join(zip_path, name)
                )
            return os.path.dirname(last)  # return the extracted directory name

        timestamp, size = self._get_date_and_size(self.zipinfo[zip_path])

        if not WRITE_SUPPORT:
            raise IOError('"os.rename" and "os.unlink" are not supported '
                          'on this platform')
        try:

            real_path = manager.get_cache_path(
                self.egg_name, self._parts(zip_path)
            )

            if self._is_current(real_path, zip_path):
                return real_path

            outf, tmpnam = _mkstemp(".$extract", dir=os.path.dirname(real_path))
            os.write(outf, self.loader.get_data(zip_path))
            os.close(outf)
            utime(tmpnam, (timestamp,timestamp))
            manager.postprocess(tmpnam, real_path)

            try:
                rename(tmpnam, real_path)

            except os.error:
                if os.path.isfile(real_path):
                    if self._is_current(real_path, zip_path):
                        # the file became current since it was checked above,
                        #  so proceed.
                        return real_path
                    elif os.name=='nt':     # Windows, del old file and retry
                        unlink(real_path)
                        rename(tmpnam, real_path)
                        return real_path
                raise

        except os.error:
            manager.extraction_error()  # report a user-friendly error

        return real_path

    def _is_current(self, file_path, zip_path):
        """
        Return True if the file_path is current for this zip_path
        """
        timestamp, size = self._get_date_and_size(self.zipinfo[zip_path])
        if not os.path.isfile(file_path):
            return False
        stat = os.stat(file_path)
        if stat.st_size!=size or stat.st_mtime!=timestamp:
            return False
        # check that the contents match
        zip_contents = self.loader.get_data(zip_path)
        f = open(file_path, 'rb')
        file_contents = f.read()
        f.close()
        return zip_contents == file_contents

    def _get_eager_resources(self):
        if self.eagers is None:
            eagers = []
            for name in ('native_libs.txt', 'eager_resources.txt'):
                if self.has_metadata(name):
                    eagers.extend(self.get_metadata_lines(name))
            self.eagers = eagers
        return self.eagers

    def _index(self):
        try:
            return self._dirindex
        except AttributeError:
            ind = {}
            for path in self.zipinfo:
                parts = path.split(os.sep)
                while parts:
                    parent = os.sep.join(parts[:-1])
                    if parent in ind:
                        ind[parent].append(parts[-1])
                        break
                    else:
                        ind[parent] = [parts.pop()]
            self._dirindex = ind
            return ind

    def _has(self, fspath):
        zip_path = self._zipinfo_name(fspath)
        return zip_path in self.zipinfo or zip_path in self._index()

    def _isdir(self,fspath):
        return self._zipinfo_name(fspath) in self._index()

    def _listdir(self,fspath):
        return list(self._index().get(self._zipinfo_name(fspath), ()))

    def _eager_to_zip(self,resource_name):
        return self._zipinfo_name(self._fn(self.egg_root,resource_name))

    def _resource_to_zip(self,resource_name):
        return self._zipinfo_name(self._fn(self.module_path,resource_name))

register_loader_type(zipimport.zipimporter, ZipProvider)


class FileMetadata(EmptyProvider):
    """Metadata handler for standalone PKG-INFO files

    Usage::

        metadata = FileMetadata("/path/to/PKG-INFO")

    This provider rejects all data and metadata requests except for PKG-INFO,
    which is treated as existing, and will be the contents of the file at
    the provided location.
    """

    def __init__(self,path):
        self.path = path

    def has_metadata(self,name):
        return name=='PKG-INFO'

    def get_metadata(self,name):
        if name=='PKG-INFO':
            f = open(self.path,'rU')
            metadata = f.read()
            f.close()
            return metadata
        raise KeyError("No metadata except PKG-INFO is available")

    def get_metadata_lines(self,name):
        return yield_lines(self.get_metadata(name))


class PathMetadata(DefaultProvider):
    """Metadata provider for egg directories

    Usage::

        # Development eggs:

        egg_info = "/path/to/PackageName.egg-info"
        base_dir = os.path.dirname(egg_info)
        metadata = PathMetadata(base_dir, egg_info)
        dist_name = os.path.splitext(os.path.basename(egg_info))[0]
        dist = Distribution(basedir,project_name=dist_name,metadata=metadata)

        # Unpacked egg directories:

        egg_path = "/path/to/PackageName-ver-pyver-etc.egg"
        metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO'))
        dist = Distribution.from_filename(egg_path, metadata=metadata)
    """

    def __init__(self, path, egg_info):
        self.module_path = path
        self.egg_info = egg_info


class EggMetadata(ZipProvider):
    """Metadata provider for .egg files"""

    def __init__(self, importer):
        """Create a metadata provider from a zipimporter"""

        self.zipinfo = build_zipmanifest(importer.archive)
        self.zip_pre = importer.archive+os.sep
        self.loader = importer
        if importer.prefix:
            self.module_path = os.path.join(importer.archive, importer.prefix)
        else:
            self.module_path = importer.archive
        self._setup_prefix()

_declare_state('dict', _distribution_finders = {})

def register_finder(importer_type, distribution_finder):
    """Register `distribution_finder` to find distributions in sys.path items

    `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
    handler), and `distribution_finder` is a callable that, passed a path
    item and the importer instance, yields ``Distribution`` instances found on
    that path item.  See ``pkg_resources.find_on_path`` for an example."""
    _distribution_finders[importer_type] = distribution_finder


def find_distributions(path_item, only=False):
    """Yield distributions accessible via `path_item`"""
    importer = get_importer(path_item)
    finder = _find_adapter(_distribution_finders, importer)
    return finder(importer, path_item, only)

def find_in_zip(importer, path_item, only=False):
    metadata = EggMetadata(importer)
    if metadata.has_metadata('PKG-INFO'):
        yield Distribution.from_filename(path_item, metadata=metadata)
    if only:
        return  # don't yield nested distros
    for subitem in metadata.resource_listdir('/'):
        if subitem.endswith('.egg'):
            subpath = os.path.join(path_item, subitem)
            for dist in find_in_zip(zipimport.zipimporter(subpath), subpath):
                yield dist

register_finder(zipimport.zipimporter, find_in_zip)

def find_nothing(importer, path_item, only=False):
    return ()
register_finder(object,find_nothing)

def find_on_path(importer, path_item, only=False):
    """Yield distributions accessible on a sys.path directory"""
    path_item = _normalize_cached(path_item)

    if os.path.isdir(path_item) and os.access(path_item, os.R_OK):
        if path_item.lower().endswith('.egg'):
            # unpacked egg
            yield Distribution.from_filename(
                path_item, metadata=PathMetadata(
                    path_item, os.path.join(path_item,'EGG-INFO')
                )
            )
        else:
            # scan for .egg and .egg-info in directory
            for entry in os.listdir(path_item):
                lower = entry.lower()
                if lower.endswith('.egg-info') or lower.endswith('.dist-info'):
                    fullpath = os.path.join(path_item, entry)
                    if os.path.isdir(fullpath):
                        # egg-info directory, allow getting metadata
                        metadata = PathMetadata(path_item, fullpath)
                    else:
                        metadata = FileMetadata(fullpath)
                    yield Distribution.from_location(
                        path_item,entry,metadata,precedence=DEVELOP_DIST
                    )
                elif not only and lower.endswith('.egg'):
                    for dist in find_distributions(os.path.join(path_item, entry)):
                        yield dist
                elif not only and lower.endswith('.egg-link'):
                    entry_file = open(os.path.join(path_item, entry))
                    try:
                        entry_lines = entry_file.readlines()
                    finally:
                        entry_file.close()
                    for line in entry_lines:
                        if not line.strip(): continue
                        for item in find_distributions(os.path.join(path_item,line.rstrip())):
                            yield item
                        break
register_finder(pkgutil.ImpImporter,find_on_path)

if importlib_bootstrap is not None:
    register_finder(importlib_bootstrap.FileFinder, find_on_path)

_declare_state('dict', _namespace_handlers={})
_declare_state('dict', _namespace_packages={})


def register_namespace_handler(importer_type, namespace_handler):
    """Register `namespace_handler` to declare namespace packages

    `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
    handler), and `namespace_handler` is a callable like this::

        def namespace_handler(importer,path_entry,moduleName,module):
            # return a path_entry to use for child packages

    Namespace handlers are only called if the importer object has already
    agreed that it can handle the relevant path item, and they should only
    return a subpath if the module __path__ does not already contain an
    equivalent subpath.  For an example namespace handler, see
    ``pkg_resources.file_ns_handler``.
    """
    _namespace_handlers[importer_type] = namespace_handler

def _handle_ns(packageName, path_item):
    """Ensure that named package includes a subpath of path_item (if needed)"""
    importer = get_importer(path_item)
    if importer is None:
        return None
    loader = importer.find_module(packageName)
    if loader is None:
        return None
    module = sys.modules.get(packageName)
    if module is None:
        module = sys.modules[packageName] = imp.new_module(packageName)
        module.__path__ = []
        _set_parent_ns(packageName)
    elif not hasattr(module,'__path__'):
        raise TypeError("Not a package:", packageName)
    handler = _find_adapter(_namespace_handlers, importer)
    subpath = handler(importer,path_item,packageName,module)
    if subpath is not None:
        path = module.__path__
        path.append(subpath)
        loader.load_module(packageName)
        module.__path__ = path
    return subpath

def declare_namespace(packageName):
    """Declare that package 'packageName' is a namespace package"""

    imp.acquire_lock()
    try:
        if packageName in _namespace_packages:
            return

        path, parent = sys.path, None
        if '.' in packageName:
            parent = '.'.join(packageName.split('.')[:-1])
            declare_namespace(parent)
            if parent not in _namespace_packages:
                __import__(parent)
            try:
                path = sys.modules[parent].__path__
            except AttributeError:
                raise TypeError("Not a package:", parent)

        # Track what packages are namespaces, so when new path items are added,
        # they can be updated
        _namespace_packages.setdefault(parent,[]).append(packageName)
        _namespace_packages.setdefault(packageName,[])

        for path_item in path:
            # Ensure all the parent's path items are reflected in the child,
            # if they apply
            _handle_ns(packageName, path_item)

    finally:
        imp.release_lock()

def fixup_namespace_packages(path_item, parent=None):
    """Ensure that previously-declared namespace packages include path_item"""
    imp.acquire_lock()
    try:
        for package in _namespace_packages.get(parent,()):
            subpath = _handle_ns(package, path_item)
            if subpath: fixup_namespace_packages(subpath,package)
    finally:
        imp.release_lock()

def file_ns_handler(importer, path_item, packageName, module):
    """Compute an ns-package subpath for a filesystem or zipfile importer"""

    subpath = os.path.join(path_item, packageName.split('.')[-1])
    normalized = _normalize_cached(subpath)
    for item in module.__path__:
        if _normalize_cached(item)==normalized:
            break
    else:
        # Only return the path if it's not already there
        return subpath

register_namespace_handler(pkgutil.ImpImporter,file_ns_handler)
register_namespace_handler(zipimport.zipimporter,file_ns_handler)

if importlib_bootstrap is not None:
    register_namespace_handler(importlib_bootstrap.FileFinder, file_ns_handler)


def null_ns_handler(importer, path_item, packageName, module):
    return None

register_namespace_handler(object,null_ns_handler)


def normalize_path(filename):
    """Normalize a file/dir name for comparison purposes"""
    return os.path.normcase(os.path.realpath(filename))

def _normalize_cached(filename,_cache={}):
    try:
        return _cache[filename]
    except KeyError:
        _cache[filename] = result = normalize_path(filename)
        return result

def _set_parent_ns(packageName):
    parts = packageName.split('.')
    name = parts.pop()
    if parts:
        parent = '.'.join(parts)
        setattr(sys.modules[parent], name, sys.modules[packageName])


def yield_lines(strs):
    """Yield non-empty/non-comment lines of a ``basestring`` or sequence"""
    if isinstance(strs,basestring):
        for s in strs.splitlines():
            s = s.strip()
            if s and not s.startswith('#'):     # skip blank lines/comments
                yield s
    else:
        for ss in strs:
            for s in yield_lines(ss):
                yield s

LINE_END = re.compile(r"\s*(#.*)?$").match         # whitespace and comment
CONTINUE = re.compile(r"\s*\\\s*(#.*)?$").match    # line continuation
DISTRO = re.compile(r"\s*((\w|[-.])+)").match    # Distribution or extra
VERSION = re.compile(r"\s*(<=?|>=?|==|!=)\s*((\w|[-.])+)").match  # ver. info
COMMA = re.compile(r"\s*,").match               # comma between items
OBRACKET = re.compile(r"\s*\[").match
CBRACKET = re.compile(r"\s*\]").match
MODULE = re.compile(r"\w+(\.\w+)*$").match
EGG_NAME = re.compile(
    r"(?P<name>[^-]+)"
    r"( -(?P<ver>[^-]+) (-py(?P<pyver>[^-]+) (-(?P<plat>.+))? )? )?",
    re.VERBOSE | re.IGNORECASE
).match

component_re = re.compile(r'(\d+ | [a-z]+ | \.| -)', re.VERBOSE)
replace = {'pre':'c', 'preview':'c','-':'final-','rc':'c','dev':'@'}.get

def _parse_version_parts(s):
    for part in component_re.split(s):
        part = replace(part,part)
        if not part or part=='.':
            continue
        if part[:1] in '0123456789':
            yield part.zfill(8)    # pad for numeric comparison
        else:
            yield '*'+part

    yield '*final'  # ensure that alpha/beta/candidate are before final

def parse_version(s):
    """Convert a version string to a chronologically-sortable key

    This is a rough cross between distutils' StrictVersion and LooseVersion;
    if you give it versions that would work with StrictVersion, then it behaves
    the same; otherwise it acts like a slightly-smarter LooseVersion. It is
    *possible* to create pathological version coding schemes that will fool
    this parser, but they should be very rare in practice.

    The returned value will be a tuple of strings.  Numeric portions of the
    version are padded to 8 digits so they will compare numerically, but
    without relying on how numbers compare relative to strings.  Dots are
    dropped, but dashes are retained.  Trailing zeros between alpha segments
    or dashes are suppressed, so that e.g. "2.4.0" is considered the same as
    "2.4". Alphanumeric parts are lower-cased.

    The algorithm assumes that strings like "-" and any alpha string that
    alphabetically follows "final"  represents a "patch level".  So, "2.4-1"
    is assumed to be a branch or patch of "2.4", and therefore "2.4.1" is
    considered newer than "2.4-1", which in turn is newer than "2.4".

    Strings like "a", "b", "c", "alpha", "beta", "candidate" and so on (that
    come before "final" alphabetically) are assumed to be pre-release versions,
    so that the version "2.4" is considered newer than "2.4a1".

    Finally, to handle miscellaneous cases, the strings "pre", "preview", and
    "rc" are treated as if they were "c", i.e. as though they were release
    candidates, and therefore are not as new as a version string that does not
    contain them, and "dev" is replaced with an '@' so that it sorts lower than
    than any other pre-release tag.
    """
    parts = []
    for part in _parse_version_parts(s.lower()):
        if part.startswith('*'):
            if part<'*final':   # remove '-' before a prerelease tag
                while parts and parts[-1]=='*final-': parts.pop()
            # remove trailing zeros from each series of numeric parts
            while parts and parts[-1]=='00000000':
                parts.pop()
        parts.append(part)
    return tuple(parts)
class EntryPoint(object):
    """Object representing an advertised importable object"""

    def __init__(self, name, module_name, attrs=(), extras=(), dist=None):
        if not MODULE(module_name):
            raise ValueError("Invalid module name", module_name)
        self.name = name
        self.module_name = module_name
        self.attrs = tuple(attrs)
        self.extras = Requirement.parse(("x[%s]" % ','.join(extras))).extras
        self.dist = dist

    def __str__(self):
        s = "%s = %s" % (self.name, self.module_name)
        if self.attrs:
            s += ':' + '.'.join(self.attrs)
        if self.extras:
            s += ' [%s]' % ','.join(self.extras)
        return s

    def __repr__(self):
        return "EntryPoint.parse(%r)" % str(self)

    def load(self, require=True, env=None, installer=None):
        if require: self.require(env, installer)
        entry = __import__(self.module_name, globals(),globals(), ['__name__'])
        for attr in self.attrs:
            try:
                entry = getattr(entry,attr)
            except AttributeError:
                raise ImportError("%r has no %r attribute" % (entry,attr))
        return entry

    def require(self, env=None, installer=None):
        if self.extras and not self.dist:
            raise UnknownExtra("Can't require() without a distribution", self)
        list(map(working_set.add,
            working_set.resolve(self.dist.requires(self.extras),env,installer)))

    #@classmethod
    def parse(cls, src, dist=None):
        """Parse a single entry point from string `src`

        Entry point syntax follows the form::

            name = some.module:some.attr [extra1,extra2]

        The entry name and module name are required, but the ``:attrs`` and
        ``[extras]`` parts are optional
        """
        try:
            attrs = extras = ()
            name,value = src.split('=',1)
            if '[' in value:
                value,extras = value.split('[',1)
                req = Requirement.parse("x["+extras)
                if req.specs: raise ValueError
                extras = req.extras
            if ':' in value:
                value,attrs = value.split(':',1)
                if not MODULE(attrs.rstrip()):
                    raise ValueError
                attrs = attrs.rstrip().split('.')
        except ValueError:
            raise ValueError(
                "EntryPoint must be in 'name=module:attrs [extras]' format",
                src
            )
        else:
            return cls(name.strip(), value.strip(), attrs, extras, dist)

    parse = classmethod(parse)

    #@classmethod
    def parse_group(cls, group, lines, dist=None):
        """Parse an entry point group"""
        if not MODULE(group):
            raise ValueError("Invalid group name", group)
        this = {}
        for line in yield_lines(lines):
            ep = cls.parse(line, dist)
            if ep.name in this:
                raise ValueError("Duplicate entry point", group, ep.name)
            this[ep.name]=ep
        return this

    parse_group = classmethod(parse_group)

    #@classmethod
    def parse_map(cls, data, dist=None):
        """Parse a map of entry point groups"""
        if isinstance(data,dict):
            data = data.items()
        else:
            data = split_sections(data)
        maps = {}
        for group, lines in data:
            if group is None:
                if not lines:
                    continue
                raise ValueError("Entry points must be listed in groups")
            group = group.strip()
            if group in maps:
                raise ValueError("Duplicate group name", group)
            maps[group] = cls.parse_group(group, lines, dist)
        return maps

    parse_map = classmethod(parse_map)


def _remove_md5_fragment(location):
    if not location:
        return ''
    parsed = urlparse(location)
    if parsed[-1].startswith('md5='):
        return urlunparse(parsed[:-1] + ('',))
    return location


class Distribution(object):
    """Wrap an actual or potential sys.path entry w/metadata"""
    PKG_INFO = 'PKG-INFO'

    def __init__(self, location=None, metadata=None, project_name=None,
            version=None, py_version=PY_MAJOR, platform=None,
            precedence=EGG_DIST):
        self.project_name = safe_name(project_name or 'Unknown')
        if version is not None:
            self._version = safe_version(version)
        self.py_version = py_version
        self.platform = platform
        self.location = location
        self.precedence = precedence
        self._provider = metadata or empty_provider

    #@classmethod
    def from_location(cls,location,basename,metadata=None,**kw):
        project_name, version, py_version, platform = [None]*4
        basename, ext = os.path.splitext(basename)
        if ext.lower() in _distributionImpl:
            # .dist-info gets much metadata differently
            match = EGG_NAME(basename)
            if match:
                project_name, version, py_version, platform = match.group(
                    'name','ver','pyver','plat'
                )
            cls = _distributionImpl[ext.lower()]
        return cls(
            location, metadata, project_name=project_name, version=version,
            py_version=py_version, platform=platform, **kw
        )
    from_location = classmethod(from_location)

    hashcmp = property(
        lambda self: (
            getattr(self,'parsed_version',()),
            self.precedence,
            self.key,
            _remove_md5_fragment(self.location),
            self.py_version,
            self.platform
        )
    )
    def __hash__(self): return hash(self.hashcmp)
    def __lt__(self, other):
        return self.hashcmp < other.hashcmp
    def __le__(self, other):
        return self.hashcmp <= other.hashcmp
    def __gt__(self, other):
        return self.hashcmp > other.hashcmp
    def __ge__(self, other):
        return self.hashcmp >= other.hashcmp
    def __eq__(self, other):
        if not isinstance(other, self.__class__):
            # It's not a Distribution, so they are not equal
            return False
        return self.hashcmp == other.hashcmp
    def __ne__(self, other):
        return not self == other

    # These properties have to be lazy so that we don't have to load any
    # metadata until/unless it's actually needed.  (i.e., some distributions
    # may not know their name or version without loading PKG-INFO)

    #@property
    def key(self):
        try:
            return self._key
        except AttributeError:
            self._key = key = self.project_name.lower()
            return key
    key = property(key)

    #@property
    def parsed_version(self):
        try:
            return self._parsed_version
        except AttributeError:
            self._parsed_version = pv = parse_version(self.version)
            return pv

    parsed_version = property(parsed_version)

    #@property
    def version(self):
        try:
            return self._version
        except AttributeError:
            for line in self._get_metadata(self.PKG_INFO):
                if line.lower().startswith('version:'):
                    self._version = safe_version(line.split(':',1)[1].strip())
                    return self._version
            else:
                raise ValueError(
                    "Missing 'Version:' header and/or %s file" % self.PKG_INFO, self
                )
    version = property(version)

    #@property
    def _dep_map(self):
        try:
            return self.__dep_map
        except AttributeError:
            dm = self.__dep_map = {None: []}
            for name in 'requires.txt', 'depends.txt':
                for extra,reqs in split_sections(self._get_metadata(name)):
                    if extra:
                        if ':' in extra:
                            extra, marker = extra.split(':',1)
                            if invalid_marker(marker):
                                reqs=[] # XXX warn
                            elif not evaluate_marker(marker):
                                reqs=[]
                        extra = safe_extra(extra) or None
                    dm.setdefault(extra,[]).extend(parse_requirements(reqs))
            return dm
    _dep_map = property(_dep_map)

    def requires(self,extras=()):
        """List of Requirements needed for this distro if `extras` are used"""
        dm = self._dep_map
        deps = []
        deps.extend(dm.get(None,()))
        for ext in extras:
            try:
                deps.extend(dm[safe_extra(ext)])
            except KeyError:
                raise UnknownExtra(
                    "%s has no such extra feature %r" % (self, ext)
                )
        return deps

    def _get_metadata(self,name):
        if self.has_metadata(name):
            for line in self.get_metadata_lines(name):
                yield line

    def activate(self,path=None):
        """Ensure distribution is importable on `path` (default=sys.path)"""
        if path is None: path = sys.path
        self.insert_on(path)
        if path is sys.path:
            fixup_namespace_packages(self.location)
            list(map(declare_namespace, self._get_metadata('namespace_packages.txt')))

    def egg_name(self):
        """Return what this distribution's standard .egg filename should be"""
        filename = "%s-%s-py%s" % (
            to_filename(self.project_name), to_filename(self.version),
            self.py_version or PY_MAJOR
        )

        if self.platform:
            filename += '-'+self.platform
        return filename

    def __repr__(self):
        if self.location:
            return "%s (%s)" % (self,self.location)
        else:
            return str(self)

    def __str__(self):
        try: version = getattr(self,'version',None)
        except ValueError: version = None
        version = version or "[unknown version]"
        return "%s %s" % (self.project_name,version)

    def __getattr__(self,attr):
        """Delegate all unrecognized public attributes to .metadata provider"""
        if attr.startswith('_'):
            raise AttributeError(attr)
        return getattr(self._provider, attr)

    #@classmethod
    def from_filename(cls,filename,metadata=None, **kw):
        return cls.from_location(
            _normalize_cached(filename), os.path.basename(filename), metadata,
            **kw
        )
    from_filename = classmethod(from_filename)

    def as_requirement(self):
        """Return a ``Requirement`` that matches this distribution exactly"""
        return Requirement.parse('%s==%s' % (self.project_name, self.version))

    def load_entry_point(self, group, name):
        """Return the `name` entry point of `group` or raise ImportError"""
        ep = self.get_entry_info(group,name)
        if ep is None:
            raise ImportError("Entry point %r not found" % ((group,name),))
        return ep.load()

    def get_entry_map(self, group=None):
        """Return the entry point map for `group`, or the full entry map"""
        try:
            ep_map = self._ep_map
        except AttributeError:
            ep_map = self._ep_map = EntryPoint.parse_map(
                self._get_metadata('entry_points.txt'), self
            )
        if group is not None:
            return ep_map.get(group,{})
        return ep_map

    def get_entry_info(self, group, name):
        """Return the EntryPoint object for `group`+`name`, or ``None``"""
        return self.get_entry_map(group).get(name)

    def insert_on(self, path, loc = None):
        """Insert self.location in path before its nearest parent directory"""

        loc = loc or self.location
        if not loc:
            return

        nloc = _normalize_cached(loc)
        bdir = os.path.dirname(nloc)
        npath= [(p and _normalize_cached(p) or p) for p in path]

        for p, item in enumerate(npath):
            if item==nloc:
                break
            elif item==bdir and self.precedence==EGG_DIST:
                # if it's an .egg, give it precedence over its directory
                if path is sys.path:
                    self.check_version_conflict()
                path.insert(p, loc)
                npath.insert(p, nloc)
                break
        else:
            if path is sys.path:
                self.check_version_conflict()
            path.append(loc)
            return

        # p is the spot where we found or inserted loc; now remove duplicates
        while 1:
            try:
                np = npath.index(nloc, p+1)
            except ValueError:
                break
            else:
                del npath[np], path[np]
                p = np  # ha!

        return

    def check_version_conflict(self):
        if self.key=='setuptools':
            return      # ignore the inevitable setuptools self-conflicts  :(

        nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt'))
        loc = normalize_path(self.location)
        for modname in self._get_metadata('top_level.txt'):
            if (modname not in sys.modules or modname in nsp
                    or modname in _namespace_packages):
                continue
            if modname in ('pkg_resources', 'setuptools', 'site'):
                continue
            fn = getattr(sys.modules[modname], '__file__', None)
            if fn and (normalize_path(fn).startswith(loc) or
                       fn.startswith(self.location)):
                continue
            issue_warning(
                "Module %s was already imported from %s, but %s is being added"
                " to sys.path" % (modname, fn, self.location),
            )

    def has_version(self):
        try:
            self.version
        except ValueError:
            issue_warning("Unbuilt egg for "+repr(self))
            return False
        return True

    def clone(self,**kw):
        """Copy this distribution, substituting in any changed keyword args"""
        for attr in (
            'project_name', 'version', 'py_version', 'platform', 'location',
            'precedence'
        ):
            kw.setdefault(attr, getattr(self,attr,None))
        kw.setdefault('metadata', self._provider)
        return self.__class__(**kw)

    #@property
    def extras(self):
        return [dep for dep in self._dep_map if dep]
    extras = property(extras)


class DistInfoDistribution(Distribution):
    """Wrap an actual or potential sys.path entry w/metadata, .dist-info style"""
    PKG_INFO = 'METADATA'
    EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])")

    @property
    def _parsed_pkg_info(self):
        """Parse and cache metadata"""
        try:
            return self._pkg_info
        except AttributeError:
            from email.parser import Parser
            self._pkg_info = Parser().parsestr(self.get_metadata(self.PKG_INFO))
            return self._pkg_info

    @property
    def _dep_map(self):
        try:
            return self.__dep_map
        except AttributeError:
            self.__dep_map = self._compute_dependencies()
            return self.__dep_map

    def _preparse_requirement(self, requires_dist):
        """Convert 'Foobar (1); baz' to ('Foobar ==1', 'baz')
        Split environment marker, add == prefix to version specifiers as
        necessary, and remove parenthesis.
        """
        parts = requires_dist.split(';', 1) + ['']
        distvers = parts[0].strip()
        mark = parts[1].strip()
        distvers = re.sub(self.EQEQ, r"\1==\2\3", distvers)
        distvers = distvers.replace('(', '').replace(')', '')
        return (distvers, mark)

    def _compute_dependencies(self):
        """Recompute this distribution's dependencies."""
        from _markerlib import compile as compile_marker
        dm = self.__dep_map = {None: []}

        reqs = []
        # Including any condition expressions
        for req in self._parsed_pkg_info.get_all('Requires-Dist') or []:
            distvers, mark = self._preparse_requirement(req)
            parsed = next(parse_requirements(distvers))
            parsed.marker_fn = compile_marker(mark)
            reqs.append(parsed)

        def reqs_for_extra(extra):
            for req in reqs:
                if req.marker_fn(override={'extra':extra}):
                    yield req

        common = frozenset(reqs_for_extra(None))
        dm[None].extend(common)

        for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []:
            extra = safe_extra(extra.strip())
            dm[extra] = list(frozenset(reqs_for_extra(extra)) - common)

        return dm


_distributionImpl = {
    '.egg': Distribution,
    '.egg-info': Distribution,
    '.dist-info': DistInfoDistribution,
    }


def issue_warning(*args,**kw):
    level = 1
    g = globals()
    try:
        # find the first stack frame that is *not* code in
        # the pkg_resources module, to use for the warning
        while sys._getframe(level).f_globals is g:
            level += 1
    except ValueError:
        pass
    from warnings import warn
    warn(stacklevel = level+1, *args, **kw)


def parse_requirements(strs):
    """Yield ``Requirement`` objects for each specification in `strs`

    `strs` must be an instance of ``basestring``, or a (possibly-nested)
    iterable thereof.
    """
    # create a steppable iterator, so we can handle \-continuations
    lines = iter(yield_lines(strs))

    def scan_list(ITEM,TERMINATOR,line,p,groups,item_name):

        items = []

        while not TERMINATOR(line,p):
            if CONTINUE(line,p):
                try:
                    line = next(lines)
                    p = 0
                except StopIteration:
                    raise ValueError(
                        "\\ must not appear on the last nonblank line"
                    )

            match = ITEM(line,p)
            if not match:
                raise ValueError("Expected "+item_name+" in",line,"at",line[p:])

            items.append(match.group(*groups))
            p = match.end()

            match = COMMA(line,p)
            if match:
                p = match.end() # skip the comma
            elif not TERMINATOR(line,p):
                raise ValueError(
                    "Expected ',' or end-of-list in",line,"at",line[p:]
                )

        match = TERMINATOR(line,p)
        if match: p = match.end()   # skip the terminator, if any
        return line, p, items

    for line in lines:
        match = DISTRO(line)
        if not match:
            raise ValueError("Missing distribution spec", line)
        project_name = match.group(1)
        p = match.end()
        extras = []

        match = OBRACKET(line,p)
        if match:
            p = match.end()
            line, p, extras = scan_list(
                DISTRO, CBRACKET, line, p, (1,), "'extra' name"
            )

        line, p, specs = scan_list(VERSION,LINE_END,line,p,(1,2),"version spec")
        specs = [(op,safe_version(val)) for op,val in specs]
        yield Requirement(project_name, specs, extras)


def _sort_dists(dists):
    tmp = [(dist.hashcmp,dist) for dist in dists]
    tmp.sort()
    dists[::-1] = [d for hc,d in tmp]


class Requirement:
    def __init__(self, project_name, specs, extras):
        """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!"""
        self.unsafe_name, project_name = project_name, safe_name(project_name)
        self.project_name, self.key = project_name, project_name.lower()
        index = [(parse_version(v),state_machine[op],op,v) for op,v in specs]
        index.sort()
        self.specs = [(op,ver) for parsed,trans,op,ver in index]
        self.index, self.extras = index, tuple(map(safe_extra,extras))
        self.hashCmp = (
            self.key, tuple([(op,parsed) for parsed,trans,op,ver in index]),
            frozenset(self.extras)
        )
        self.__hash = hash(self.hashCmp)

    def __str__(self):
        specs = ','.join([''.join(s) for s in self.specs])
        extras = ','.join(self.extras)
        if extras: extras = '[%s]' % extras
        return '%s%s%s' % (self.project_name, extras, specs)

    def __eq__(self,other):
        return isinstance(other,Requirement) and self.hashCmp==other.hashCmp

    def __contains__(self,item):
        if isinstance(item,Distribution):
            if item.key != self.key: return False
            if self.index: item = item.parsed_version  # only get if we need it
        elif isinstance(item,basestring):
            item = parse_version(item)
        last = None
        compare = lambda a, b: (a > b) - (a < b) # -1, 0, 1
        for parsed,trans,op,ver in self.index:
            action = trans[compare(item,parsed)] # Indexing: 0, 1, -1
            if action=='F':
                return False
            elif action=='T':
                return True
            elif action=='+':
                last = True
            elif action=='-' or last is None:   last = False
        if last is None: last = True    # no rules encountered
        return last

    def __hash__(self):
        return self.__hash

    def __repr__(self): return "Requirement.parse(%r)" % str(self)

    #@staticmethod
    def parse(s):
        reqs = list(parse_requirements(s))
        if reqs:
            if len(reqs)==1:
                return reqs[0]
            raise ValueError("Expected only one requirement", s)
        raise ValueError("No requirements found", s)

    parse = staticmethod(parse)

state_machine = {
    #       =><
    '<': '--T',
    '<=': 'T-T',
    '>': 'F+F',
    '>=': 'T+F',
    '==': 'T..',
    '!=': 'F++',
}


def _get_mro(cls):
    """Get an mro for a type or classic class"""
    if not isinstance(cls,type):
        class cls(cls,object): pass
        return cls.__mro__[1:]
    return cls.__mro__

def _find_adapter(registry, ob):
    """Return an adapter factory for `ob` from `registry`"""
    for t in _get_mro(getattr(ob, '__class__', type(ob))):
        if t in registry:
            return registry[t]


def ensure_directory(path):
    """Ensure that the parent directory of `path` exists"""
    dirname = os.path.dirname(path)
    if not os.path.isdir(dirname):
        os.makedirs(dirname)

def split_sections(s):
    """Split a string or iterable thereof into (section,content) pairs

    Each ``section`` is a stripped version of the section header ("[section]")
    and each ``content`` is a list of stripped lines excluding blank lines and
    comment-only lines.  If there are any such lines before the first section
    header, they're returned in a first ``section`` of ``None``.
    """
    section = None
    content = []
    for line in yield_lines(s):
        if line.startswith("["):
            if line.endswith("]"):
                if section or content:
                    yield section, content
                section = line[1:-1].strip()
                content = []
            else:
                raise ValueError("Invalid section heading", line)
        else:
            content.append(line)

    # wrap up last segment
    yield section, content

def _mkstemp(*args,**kw):
    from tempfile import mkstemp
    old_open = os.open
    try:
        os.open = os_open   # temporarily bypass sandboxing
        return mkstemp(*args,**kw)
    finally:
        os.open = old_open  # and then put it back


# Set up global resource manager (deliberately not state-saved)
_manager = ResourceManager()
def _initialize(g):
    for name in dir(_manager):
        if not name.startswith('_'):
            g[name] = getattr(_manager, name)
_initialize(globals())

# Prepare the master working set and make the ``require()`` API available
_declare_state('object', working_set = WorkingSet())
try:
    # Does the main program list any requirements?
    from __main__ import __requires__
except ImportError:
    pass # No: just use the default working set based on sys.path
else:
    # Yes: ensure the requirements are met, by prefixing sys.path if necessary
    try:
        working_set.require(__requires__)
    except VersionConflict:     # try it without defaults already on sys.path
        working_set = WorkingSet([])    # by starting with an empty path
        for dist in working_set.resolve(
            parse_requirements(__requires__), Environment()
        ):
            working_set.add(dist)
        for entry in sys.path:  # add any missing entries from sys.path
            if entry not in working_set.entries:
                working_set.add_entry(entry)
        sys.path[:] = working_set.entries   # then copy back to sys.path

require = working_set.require
iter_entry_points = working_set.iter_entry_points
add_activation_listener = working_set.subscribe
run_script = working_set.run_script
run_main = run_script   # backward compatibility
# Activate all distributions already on sys.path, and ensure that
# all distributions added to the working set in the future (e.g. by
# calling ``require()``) will get activated as well.
add_activation_listener(lambda dist: dist.activate())
working_set.entries=[]
list(map(working_set.add_entry,sys.path)) # match order