Ë
    Ü_Ëi¬V  ã                  ó>  — d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	m
Z
mZmZmZmZ ddlmZ ddlmZ ddlmZ ddlmZmZmZmZ dd	lmZmZ dd
lmZ erddlm Z  dZ! e"e!«      Z#dZ$ e"e$«      Z%dZ& e'g d¢«      Z(d&d„Z)d'd„Z*	 	 	 	 	 	 d(d„Z+e&fd)d„Z,h d£Z-d*d„Z.d+d„Z/d+d„Z0d+d„Z1d,d-d„Z2	 d.	 	 	 	 	 	 	 	 	 d/d„Z3e&fd0d„Z4 ejj                  d ejl                  d«      z   d z   «      Z7 e'g d!¢«      Z8d1d"„Z9	 	 	 	 	 	 d2d#„Z:e&ddddf	 	 	 	 	 	 	 	 	 	 	 	 	 d3d$„Z;d4d%„Z<y)5zŒTools to parse and validate a MongoDB URI.

.. seealso:: This module is compatible with both the synchronous and asynchronous PyMongo APIs.
é    )ÚannotationsN)ÚTYPE_CHECKINGÚAnyÚMappingÚMutableMappingÚOptionalÚSizedÚUnionÚcast)Úunquote_plus)Ú_have_dnspython)Ú_parse_ssl_options)ÚINTERNAL_URI_OPTION_NAME_MAPÚURI_OPTIONS_DEPRECATION_MAPÚ_CaseInsensitiveDictionaryÚget_validated_options)ÚConfigurationErrorÚ
InvalidURI)Ú_Address)Ú
SSLContextz
mongodb://zmongodb+srv://i‰i  ).ÚappnameÚauthMechanismÚauthMechanismPropertiesÚ
authSourceÚcompressorsÚconnectTimeoutMSÚdirectConnectionÚheartbeatFrequencyMSÚjournalÚloadBalancedÚlocalThresholdMSÚmaxIdleTimeMSÚmaxPoolSizeÚmaxConnectingÚmaxStalenessSecondsÚminPoolSizeÚ	proxyHostÚ	proxyPortÚproxyUsernameÚproxyPasswordÚreadConcernLevelÚreadPreferenceÚreadPreferenceTagsÚ
replicaSetÚ
retryReadsÚretryWritesÚserverMonitoringModeÚserverSelectionTimeoutMSÚserverSelectionTryOnceÚsocketTimeoutMSÚsrvMaxHostsÚsrvServiceNameÚsslÚtlsÚtlsAllowInvalidCertificatesÚtlsAllowInvalidHostnamesÚ	tlsCAFileÚtlsCertificateKeyFileÚtlsCertificateKeyFilePasswordÚ$tlsDisableCertificateRevocationCheckÚtlsDisableOCSPEndpointCheckÚtlsInsecureÚwÚwaitQueueTimeoutMSÚ
wTimeoutMSÚzlibCompressionLevelc                óx   — t        t        | «      «      D ]#  }| |   dk(  sŒ| ||dz    }t        |«      |k(  sŒ# y y)z²Check for unescaped percent signs.

    :param s: A string. `s` can have things like '%25', '%2525',
           and '%E2%85%A8' but cannot have unquoted percent like '%foo'.
    ú%é   TF)ÚrangeÚlenr   )ÚsÚiÚsubs      ú\/var/www/pod-logistic/pod-api/venv/lib/python3.12/site-packages/pymongo/uri_parser_shared.pyÚ_unquoted_percentrN   m   sL   € ô ”3�q“6‹]ò ˆØˆQ‰4�3‹;Ø�A˜˜A™�,ˆCô ˜CÓ  CÓ'Ùðð ó    c                óÎ   — d| v s| j                  d«      dkD  st        | «      rt        d«      ‚| j                  d«      \  }}}|st        d«      ‚t	        |«      t	        |«      fS )aZ  Validates the format of user information in a MongoDB URI.
    Reserved characters that are gen-delimiters (":", "/", "?", "#", "[",
    "]", "@") as per RFC 3986 must be escaped.

    Returns a 2-tuple containing the unescaped username followed
    by the unescaped password.

    :param userinfo: A string of the form <username>:<password>
    ú@ú:é   zXUsername and password must be escaped according to RFC 3986, use urllib.parse.quote_plusz&The empty string is not valid username)ÚcountrN   r   Ú	partitionr   )ÚuserinfoÚuserÚ_Úpasswds       rM   Úparse_userinforZ   }   sq   € ð ˆh�˜(Ÿ.™.¨Ó-°Ò1Ô5FÀxÔ5PÜð4ó
ð 	
ð
 ×(Ñ(¨Ó-�O€Dˆ!ˆVáÜÐAÓBÐBä˜Óœ|¨FÓ3Ð3Ð3rO   c                ó”   — | j                  d«      dk(  rt        d«      ‚| j                  d«      }|dk(  r| dd |fS | d| | |dz   d fS )a�  Validates an IPv6 literal host:port string.

    Returns a 2-tuple of IPv6 literal followed by port where
    port is default_port if it wasn't specified in entity.

    :param entity: A string that represents an IPv6 literal enclosed
                    in braces (e.g. '[::1]' or '[::1]:27017').
    :param default_port: The port number to use when one wasn't
                          specified in entity.
    ú]éÿÿÿÿzNan IPv6 address literal must be enclosed in '[' and ']' according to RFC 2732.z]:rS   é   N)ÚfindÚ
ValueError)ÚentityÚdefault_portrK   s      rM   Úparse_ipv6_literal_hostrc   •   sh   € ð ‡{�{�3Ó˜2ÒÜØ\ó
ð 	
ð 	�‰�DÓ€AØˆB‚wØ�a˜ˆ|˜\Ð)Ð)Ø�!�Aˆ;˜˜q 1™u˜w˜Ð'Ð'rO   c                ó@  — | }|}| d   dk(  rt        | |«      \  }}n]| j                  d«      r| |fS | j                  d«      dk7  r4| j                  d«      dkD  rt	        d«      ‚|j                  dd«      \  }}t        |t        «      r„|j                  «       sBt        d„ |D «       «      r%|D ]   }|j                  «       sŒt	        d	|›�«      ‚ t	        d
«      ‚t        |«      dkD  st        |«      dk  rt	        d«      ‚t        |«      }|j                  «       |fS )aq  Validates a host string

    Returns a 2-tuple of host followed by port where port is default_port
    if it wasn't specified in the string.

    :param entity: A host or host:port string where host could be a
                    hostname or IP address.
    :param default_port: The port number to use when one wasn't
                          specified in entity.
    r   ú[ú.sockrR   r]   rS   z’Reserved characters such as ':' must be escaped according RFC 2396. An IPv6 address literal must be enclosed in '[' and ']' according to RFC 2732.c              3  ó`   K  — | ]&  }|j                  «       xs |j                  «       –— Œ( y ­w©N)ÚisspaceÚisdigit)Ú.0Úcs     rM   ú	<genexpr>zparse_host.<locals>.<genexpr>É   s$   è ø€ Ò<°!�1—9‘9“;Ò- !§)¡)£+Ó-Ñ<ùs   ‚,.z$Port contains whitespace character: z‚Port contains non-digit characters. Hint: username and password must be escaped according to RFC 3986, use urllib.parse.quote_plusiÿÿ  z+Port must be an integer between 0 and 65535)rc   Úendswithr_   rT   r`   ÚsplitÚ
isinstanceÚstrrj   Úallri   ÚintÚlower)ra   rb   ÚhostÚportrl   s        rM   Ú
parse_hostrw   ¬   s.  € ð €DØ&2€DØˆa�y�CÒÜ,¨V°\ÓB‰
ˆ‰dØ	�‰˜Ô	!Ø�|Ð#Ð#Ø	�‰�SÓ	˜RÒ	Ø�<‰<˜Ó˜qÒ Üð1óð ð —Z‘Z  QÓ'‰
ˆˆdÜ�$œÔØ�|‰|Œ~äÑ<°tÔ<Ô<Øò W�AØ—y‘y•{Ü(Ð+OÐPQÈuÐ)UÓVÐVðWô ð8óð ô ˆt‹9�uÒ¤ D£	¨Q¢ÜÐJÓKÐKÜ�4‹yˆð �:‰:‹<˜ÐÐrO   >   ÚtlsallowinvalidhostnamesÚtlsallowinvalidcertificatesÚtlsdisableocspendpointcheckc                ób  — t        «       }| j                  |«      D ]�  }|j                  d«      \  }}|j                  «       dk(  r"|j                  |g «      j	                  |«       ŒL||v rt        j                  d|› d�d¬«       |j                  «       dk(  r|}nt        |«      }|||<   Œ’ |S )zËHelper method for split_options which creates the options dict.
    Also handles the creation of a list for the URI tag_sets/
    readpreferencetags portion, and the use of a unicode options string.
    ú=ÚreadpreferencetagszDuplicate URI option 'z'.r^   ©Ú
stacklevelÚauthmechanismproperties)r   ro   rt   Ú
setdefaultÚappendÚwarningsÚwarnr   )ÚoptsÚdelimÚoptionsÚurioptÚkeyÚvalueÚvals          rM   Ú_parse_optionsrŒ   ç   s­   € ô
 )Ó*€GØ—*‘*˜UÓ#ò ˆØ—\‘\ #Ó&‰
ˆˆUØ�9‰9‹;Ð.Ò.Ø×Ñ˜s BÓ'×.Ñ.¨uÕ5à�g‰~Ü—‘Ð 6°s°e¸2Ð>È1ÕMØ�y‰y‹{Ð7Ò7Ø‘ä" 5Ó)�ØˆG�CŠLðð €NrO   c                ó~  — | j                  d«      }|�?t        D ]6  }|| v sŒd}t        || j                  d«      | j                  |«      fz  «      ‚ | j                  d«      }|�.d| v r!d}t        |d| j                  d«      fz  «      ‚|du rd| d<   | j                  d«      }|�+dD ]&  }| j                  |«      du sŒd}t        ||fz  «      ‚ d	| v rgd
| v rcdd„} || j                  d	«      «       || j                  d
«      «      k7  r0d}t        || j                  d	«      | j                  d
«      fz  «      ‚| S )zËRaise appropriate errors when conflicting TLS options are present in
    the options dictionary.

    :param options: Instance of _CaseInsensitiveDictionary containing
          MongoDB URI options.
    Útlsinsecurez9URI options %s and %s cannot be specified simultaneously.ry   rz   TÚ
tlscrlfile)rŽ   ry   rz   zDURI option %s=True cannot be specified when CRL checking is enabled.r7   r8   c                ó<   — | dv r| dk(  S t        | t        «      r| S | S )N)ÚtrueÚfalser‘   )rp   Úbool)r‹   s    rM   Útruth_valuez-_handle_security_options.<locals>.truth_value$  s)   € ØÐ'Ñ'Ø˜f‘}Ð$Ü˜#œtÔ$Ø�
ØˆJrO   z=Can not specify conflicting values for URI options %s and %s.)r‹   r   Úreturnr   )ÚgetÚ_IMPLICIT_TLSINSECURE_OPTSr   Ú	cased_key)r‡   rŽ   ÚoptÚerr_msgÚtlsallowinvalidcertsr�   r”   s          rM   Ú_handle_security_optionsrœ   ý   s‡  € ð —+‘+˜mÓ,€KØÐÜ-ò 	ˆCØ�gŠ~ØU�Ü Ø˜w×0Ñ0°Ó?À×ARÑARÐSVÓAWÐXÑXóð ð	ð #Ÿ;™;Ð'DÓEÐØÐ'Ø(¨GÑ3ØQˆGÜØØ0°'×2CÑ2CÐDaÓ2bÐcñdóð ð   4Ñ'Ø59ˆGÐ1Ñ2ð —‘˜\Ó*€JØÐØ`ò 	3ˆCØ�{‰{˜3Ó 4Ò'Ø`�Ü  ¨C¨6Ñ!1Ó2Ð2ð	3ð
 �Ñ˜E WÑ,ó	ñ �w—{‘{ 5Ó)Ó*©k¸'¿+¹+ÀeÓ:LÓ.MÒMØUˆGÜ˜W¨×(9Ñ(9¸%Ó(@À'×BSÑBSÐTYÓBZÐ'[Ñ[Ó\Ð\à€NrO   c                óâ  — t        | «      D ]à  }|t        v sŒt        |   \  }}|dk(  rŒ|}|| v rSd}t        j                  || j	                  |«      | j	                  |«      fz  t
        d¬«       | j                  |«       Œvd}t        j                  || j	                  |«      |fz  t
        d¬«       Œ©|dk(  sŒ¯d}t        j                  || j	                  |«      |fz  t
        d¬«       Œâ | S )a;  Issue appropriate warnings when deprecated options are present in the
    options dictionary. Removes deprecated option key, value pairs if the
    options dictionary is found to also have the renamed option.

    :param options: Instance of _CaseInsensitiveDictionary containing
          MongoDB URI options.
    Úrenamedz0Deprecated option '%s' ignored in favor of '%s'.r^   r~   z,Option '%s' is deprecated, use '%s' instead.ÚremovedzOption '%s' is deprecated. %s.)Úlistr   rƒ   r„   r˜   ÚDeprecationWarningÚpop)r‡   ÚoptnameÚmodeÚmessageÚ
newoptnameÚwarn_msgs         rM   Ú_handle_option_deprecationsr¨   2  sþ   € ô ˜“=ò ˆØÔ1Ò1Ü7¸Ñ@‰MˆD�'Ø�yÒ Ø$�
Ø Ñ(ØQ�HÜ—M‘MØ  G×$5Ñ$5°gÓ$>À×@QÑ@QÐR\Ó@]Ð#^Ñ^Ü*Ø#$õð
 —K‘K Ô(ØØI�Ü—‘Ø × 1Ñ 1°'Ó :¸JÐGÑGÜ&Ø öð
 ˜Ó"Ø;�Ü—‘Ø × 1Ñ 1°'Ó :¸GÐDÑDÜ&Ø öð-ð8 €NrO   c                óÆ   — | j                  d«      }|�t        D ]  }|| |<   Œ	 t        | «      D ]/  }t        j                   |d«      }|€Œ| j	                  |«      | |<   Œ1 | S )zÓNormalizes option names in the options dictionary by converting them to
    their internally-used names.

    :param options: Instance of _CaseInsensitiveDictionary containing
          MongoDB URI options.
    rŽ   N)r–   r—   r    r   r¢   )r‡   rŽ   r™   r£   Úintnames        rM   Ú_normalize_optionsr«   Y  sw   € ð —+‘+˜mÓ,€KØÐÜ-ò 	'ˆCà&ˆG�CŠLð	'ô ˜“=ò 4ˆÜ.×2Ñ2°7¸DÓAˆØÑØ&Ÿ{™{¨7Ó3ˆG�GÒð4ð
 €NrO   Fc                ó   — t        | |«      S )aØ  Validates and normalizes options passed in a MongoDB URI.

    Returns a new dictionary of validated and normalized options. If warn is
    False then errors will be thrown for invalid options, otherwise they will
    be ignored and a warning will be issued.

    :param opts: A dict of MongoDB URI options.
    :param warn: If ``True`` then warnings will be logged and
          invalid options will be ignored. Otherwise invalid options will
          cause errors.
    )r   )r…   r„   s     rM   Úvalidate_optionsr­   o  s   € ô !  tÓ,Ð,rO   Tc                óú  — | j                  d«      }| j                  d«      }	 |dk\  r|dk\  rt        d«      ‚|dk\  rt        | d«      }n9|dk\  rt        | d«      }n'| j                  d«      dk7  rt        | d«      }nt        ‚t	        |«      }t        |«      }|rt        |«      }|r9t        t        t        ||«      «      }|j                  d	«      d
k(  rt        d«      ‚|S # t        $ r t        d«      d‚w xY w)aî  Takes the options portion of a MongoDB URI, validates each option
    and returns the options in a dictionary.

    :param opt: A string representing MongoDB URI options.
    :param validate: If ``True`` (the default), validate and normalize all
          options.
    :param warn: If ``False`` (the default), suppress all warnings raised
          during validation of options.
    :param normalize: If ``True`` (the default), renames all options to their
          internally-used names.
    ú&ú;r   z-Can not mix '&' and ';' for option separatorsr|   r]   Nz'MongoDB URI options are key=value pairsÚ
authsourceÚ z1the authSource database cannot be an empty string)r_   r   rŒ   r`   rœ   r¨   r«   r   r   r­   r–   )r…   Úvalidater„   Ú	normalizeÚand_idxÚsemi_idxr‡   s          rM   Úsplit_optionsr·   ~  s  € ð �i‰i˜‹n€GØ�y‰y˜‹~€HðNØ�aŠ<˜H¨šMÜÐLÓMÐMØ˜Š\Ü$ T¨3Ó/‰GØ˜Š]Ü$ T¨3Ó/‰GØ�Y‰Y�s‹^˜rÒ!Ü$ T¨4Ó0‰GäÐô ' wÓ/€Gä)¨'Ó2€GáÜ$ WÓ-ˆáÜÔ1Ô3CÀGÈTÓ3RÓSˆØ�;‰;�|Ó$¨Ò*ÜÐPÓQÐQà€Nøô ò NÜÐBÓCÈÐMðNús   ¤A C$ Ã$C:c                ó°   — g }| j                  d«      D ]?  }|st        d«      ‚|}|j                  d«      rd}|j                  t	        ||«      «       ŒA |S )a¢  Takes a string of the form host1[:port],host2[:port]... and
    splits it into (host, port) tuples. If [:port] isn't present the
    default_port is used.

    Returns a set of 2-tuples containing the host name (or IP) followed by
    port number.

    :param hosts: A string of the form host1[:port],host2[:port],...
    :param default_port: The port number to use when one wasn't specified
          for a host.
    ú,z(Empty host (or extra comma in host list)rf   N)ro   r   rn   r‚   rw   )Úhostsrb   Únodesra   rv   s        rM   Úsplit_hostsr¼   «  s`   € ð €EØ—+‘+˜cÓ"ò /ˆÙÜ$Ð%OÓPÐPØˆà�?‰?˜7Ô#ØˆDØ�‰”Z ¨Ó-Õ.ð/ð €LrO   re   z/ "$r\   )r±   r   Ú
replicasetr.   Úloadbalancedr    c                ó  — t        | «      dkD  r|j                  d«      rt        d«      ‚|j                  d«      rRt        | «      dkD  rt        d«      ‚|j                  d«      rt        d«      ‚|j                  d«      rt        d«      ‚y y )	NrS   Údirectconnectionz8Cannot specify multiple hosts with directConnection=truer¾   z4Cannot specify multiple hosts with loadBalanced=truez;Cannot specify directConnection=true with loadBalanced=truer½   z0Cannot specify replicaSet with loadBalanced=true)rI   r–   r   )r»   r‡   s     rM   Ú_check_optionsrÁ   Ì  sƒ   € ä
ˆ5ƒz�A‚~˜'Ÿ+™+Ð&8Ô9Ü Ð![Ó\Ð\à‡{�{�>Ô"Üˆu‹:˜Š>Ü$Ð%[Ó\Ð\Ø�;‰;Ð)Ô*Ü$Ð%bÓcÐcØ�;‰;�|Ô$Ü$Ð%WÓXÐXð %ð #rO   c                óÜ  — | si S t        | t        «      st        d«      ‚i }| j                  «       D ]·  \  }}t        |t        «      st        d|› d�«      ‚|j	                  dd«       t        |«      }t        |«      }t        |«      }t        t
        t        |«      «      }t        ||«      \  }}|€t        d«      ‚|rt        d«      ‚dD ]  }||v rt        d	|› �«      ‚|||<   Œ Œ¹ |S )
z!Parse KMS TLS connection options.zkms_tls_options must be a dictzkms_tls_options["z"] must be a dictr8   Tz!TLS is required for KMS providerszInsecure TLS options prohibited)r@   r9   r:   r>   z!Insecure TLS options prohibited: )rp   ÚdictÚ	TypeErrorÚitemsr�   r   rœ   r«   r   r­   r   r   )	Úkms_tls_optionsÚis_syncÚcontextsÚproviderr‡   r…   Ússl_contextÚallow_invalid_hostnamesÚns	            rM   Ú_parse_kms_tls_optionsrÍ   Ú  s  € ñ
 Øˆ	Ü�o¤tÔ,ÜÐ8Ó9Ð9Ø€HØ,×2Ñ2Ó4ò -Ñˆ�'Ü˜'¤4Ô(ÜÐ/°¨zÐ9JÐKÓLÐLØ×Ñ˜5 $Ô'Ü)¨'Ó2ˆÜ'¨Ó-ˆÜ! $Ó'ˆÜÔ.Ô0@ÀÓ0FÓGˆÜ/AÀ$ÈÓ/PÑ,ˆÐ,ØÐÜ$Ð%HÓIÐIÙ"Ü$Ð%FÓGÐGð
ò 	-ˆAð �D‰yÜ(Ð+LÈQÈCÐ)PÓQÐQØ!,ˆH�XÒñ	-ð-ð. €OrO   c                óÀ  — | j                  t        «      rd}| t        d  }ng| j                  t        «      r8t	        «       s"t
        j                  xs d}t        d|z  «      ‚d}| t        d  }nt        dt        › dt        › d�«      ‚|st        d«      ‚d }	d }
d }d }t        «       }|j                  d	«      \  }}}d
|v r|j                  d
«      \  }}}n|}|rGt        |«      }d|v r|j                  dd«      \  }}t        j                  |«      rt        d|z  «      ‚d }|r|j!                  t#        ||||«      «       d|v r$|j%                  d«      \  }}}t'        |«      \  }	}
n|}d
|v rt        d|z  «      ‚t        |«      }d }|xs |j)                  d«      }|rm|j)                  d«      rt        dt        › d�«      ‚t+        |d ¬«      }t-        |«      dk7  rt        t        › d�«      ‚|d   \  }}|�Lt        t        › d�«      ‚|s|j)                  d«      �t        d«      ‚|s|rt        d«      ‚t+        ||¬«      }t/        ||«       ||	|
||||dœS )NFÚpythonz�The "dnspython" module must be installed to use mongodb+srv:// URIs. To fix this error install pymongo again:
 %s -m pip install pymongo>=4.3Tz)Invalid URI scheme: URI must begin with 'z' or 'ú'z(Must provide at least one hostname or IPú?ú/ú.rS   zBad database name "%s"rQ   z;Any '/' in a unix domain socket must be percent-encoded: %sr5   r   z*Cannot specify directConnection=true with z URIs)rb   z. URIs must include one, and only one, hostnamer   z$ URIs must not include a port numberr6   zDThe srvServiceName option is only allowed with 'mongodb+srv://' URIszAThe srvMaxHosts option is only allowed with 'mongodb+srv://' URIs)ÚnodelistÚusernameÚpasswordÚdatabaseÚ
collectionr‡   Úfqdn)Ú
startswithÚSCHEMEÚ
SCHEME_LENÚ
SRV_SCHEMEr   ÚsysÚ
executabler   ÚSRV_SCHEME_LENr   r   rU   r   ro   Ú_BAD_DB_CHARSÚsearchÚupdater·   Ú
rpartitionrZ   r–   r¼   rI   rÁ   )Úurirb   r³   r„   r´   Úsrv_max_hostsÚis_srvÚscheme_freeÚpython_pathrW   rY   ÚdbaserØ   r‡   Úhost_plus_db_partrX   r…   Ú	host_partrV   rº   rÙ   r»   rv   s                          rM   Ú_validate_urirí   þ  s¶  € ð ‡~�~”fÔØˆØœ*˜+Ð&‰Ø	�‰œ
Ô	#ÜÔ ÜŸ.™.Ò4¨HˆKÜ$ð1ð 5@ñAóð ð ˆØœ.˜/Ð*‰äÐDÄVÀHÈFÔS]ÐR^Ð^_Ð`ÓaÐaáÜÐCÓDÐDà€DØ€FØ€EØ€JÜ(Ó*€Gà!,×!6Ñ!6°sÓ!;ÑÐ�q˜$Ø
ÐÑØ/×9Ñ9¸#Ó>Ñˆ	�1‘eà%ˆ	áÜ˜UÓ#ˆØ�%‰<Ø %§¡¨C°Ó 3ÑˆE�:Ü×Ñ Ô&ÜÐ5¸Ñ=Ó>Ð>àˆáØ�‰”} T¨8°T¸9ÓEÔFØ
ˆiÑØ&×1Ñ1°#Ó6Ñˆ�!�UÜ% hÓ/‰ˆ‰fàˆà
ˆe�|ÜÐVÐYbÑbÓcÐcä˜Ó€EØ€DØ!Ò? W§[¡[°Ó%?€MÙØ�;‰;Ð)Ô*Ü$Ð'QÔR\ÐQ]Ð]bÐ%cÓdÐdÜ˜E°Ô5ˆÜˆu‹:˜Š?Ü¤
˜|Ð+YÐZÓ[Ð[Ø˜1‘X‰
ˆˆdØÐÜ¤
˜|Ð+OÐPÓQÐQÙ˜Ÿ™Ð$4Ó5ÐAÜ ØRó
ð 	
ñ ™Ü ØOó
ð 	
ô ˜E°Ô=ˆä�5˜'Ô"ð ØØØØ ØØñð rO   c                ó²   — i }t         D ].  }|j                  «       | v sŒ| |   ||<   | j                  |«       Œ0 | j                  «       D ]
  \  }}|||<   Œ |S rh   )ÚURI_OPTIONSrt   r¢   rÅ   )r‡   Úcase_sensitiveÚoptionÚkÚvs        rM   Ú_make_options_case_sensitiverô   ^  si   € Ø€NÜò  ˆØ�<‰<‹>˜WÒ$Ø%,¨V¡_ˆN˜6Ñ"Ø�K‰K˜Õð ð —‘“ò ‰ˆˆ1Øˆ�qÒðàÐrO   )rJ   rq   r•   r“   )rV   rq   r•   ztuple[str, str])ra   rq   rb   úOptional[int]r•   z%tuple[str, Optional[Union[str, int]]])ra   rq   rb   rõ   r•   r   )r…   rq   r†   zOptional[str]r•   r   )r‡   r   r•   r   )F)r…   úMapping[str, Any]r„   r“   r•   úMutableMapping[str, Any])TFT)
r…   rq   r³   r“   r„   r“   r´   r“   r•   r÷   )rº   rq   rb   rõ   r•   zlist[_Address])r»   r	   r‡   rö   r•   ÚNone)rÆ   zOptional[Mapping[str, Any]]rÇ   r“   r•   zdict[str, SSLContext])rå   rq   rb   rõ   r³   r“   r„   r“   r´   r“   ræ   rõ   r•   údict[str, Any])r‡   r   r•   rù   )=Ú__doc__Ú
__future__r   ÚrerÞ   rƒ   Útypingr   r   r   r   r   r	   r
   r   Úurllib.parser   Ú!pymongo.asynchronous.srv_resolverr   Úpymongo.client_optionsr   Úpymongo.commonr   r   r   r   Úpymongo.errorsr   r   Úpymongo.typingsr   Úpymongo.pyopenssl_contextr   rÛ   rI   rÜ   rÝ   rà   ÚDEFAULT_PORTÚ	frozensetrï   rN   rZ   rc   rw   r—   rŒ   rœ   r¨   r«   r­   r·   r¼   ÚcompileÚescaperá   Ú_ALLOWED_TXT_OPTSrÁ   rÍ   rí   rô   © rO   rM   ú<module>r     sÒ  ðñ õ #ã 	Û 
Û ÷	÷ 	ó 	õ &å =Ý 5÷ó ÷ :Ý $áÝ4à	€Ù�‹[€
Ø€
Ù�Z“€Ø€áò/ó1€óhó 4ð0(Øð(Ø,ð(à*ó(ð. ;Gô 0òhÐ óó,2ój$óNô,-ð  MQð*Ø
ð*Øð*Ø,0ð*ØEIð*àó*ðZ ;Gô ð4 �—
‘
˜3  §¡¨7Ó!3Ñ3°cÑ9Ó:€áÚ\óÐ ó
Yð!Ø0ð!àð!ð ó!ðL #/ØØØØ#'ð]Ø	ð]àð]ð ð]ð ð	]ð
 ð]ð !ð]ð ó]ô@rO   