��Z� � @ s� d d l Z d d l m Z m Z m Z e j d � Z d d � e d � D� Z d Z d Z e d Z e e Z e e d Z e e Z e j d � Z Gd d � d � Z Gd d � d � Z y d d l m Z m Z Wn e k r� e Z e Z Yn Xd S)� N)� ascii_letters�ascii_lowercase�digits�asciic C s( h | ] } d j | � j d � � q S)z%{:02X}r )�format�encode)�.0�i� r �/quoting.py� <setcomp> s r � z:/?#[]@z!$'()*,z+&=;z-._~s [A-Z0-9][A-Z0-9]c @ s: e Z d Z d d d d d d d d � Z d d � Z d S)� _PyQuoter�safe� � protected�qsFc C s | | _ | | _ | | _ d S)N)�_safe� _protected�_qs)�selfr r r r r r �__init__ s z_PyQuoter.__init__c C s | d k r d St | t � s+ t d � � | s5 d S| j d d d �} t � } d } | j } | t 7} | j s | d 7} | | j 7} | j d � } d } xh| t | � k r| | } | d 7} | rR| t k r� | d } | j | � t | � d k rt | � } | d d � } t j | � sP| j d � d } | d 8} q� y/ t t | d d � j d � d d �� } Wn2 t k r�| j d � d } | d 8} w� Yn X| | j k r�| j | � n/ | | k r�| j t | � � n | j | � d } q� t | � d k r� | t | � k r� | j d � d } | d 8} q� nJ | t d � k r�t � } | j | � | t | � k r� | j d � q� | j r�| t d � k r�| j t d � � q� | | k r�| j | � q� | j d j | � j d � � q� W| j d � S)NzArgument should be strr �utf8�errors�ignore� z+&=;r r � � � s %25� �base� �%� �+z%{:02X})� isinstance�str� TypeErrorr � bytearrayr �ALLOWEDr r �len�BASCII_LOWERCASE�append�bytes�_IS_HEX�match�extend�chr�int�decode� ValueError�ordr ) r �val�ret�pctr Zbsafe�idx�ch�buf�unquotedr r r �__call__ s� / $ #z_PyQuoter.__call__N)�__name__� __module__�__qualname__r r= r r r r r s r c @ s4 e Z d Z d d d d d d � Z d d � Z d S) �_PyUnquoter�unsafer r Fc C s4 | | _ | | _ t � | _ t d d � | _ d S)Nr T)�_unsafer �_Quoter�_quoter� _qs_quoter)r rB r r r r r h s z_PyUnquoter.__init__c C s� | d k r d St | t � s+ t d � � | s5 d Sd } d } t � } g } x�| D]�} | r� | | 7} t | � d k rW | j t | d d � d d �� | } d } qW | rOy | j d � } Wn t k r� Ynq X| j r | d k r | j | j | � � n5 | | j k r5| j | j | � � n | j | � | d d � =| d k rd| } qW | r}| j | � d } | d k r�| j s�| | j k r�| j d � qW | j d � qW | | j k r!| j d � t t | � � j � d d � } x | D] } | j | � qWqW | j | � qW W| r�y | j d � } Wn t k rl| j | � Ynd X| j r�| d k r�| j | j | � � n5 | | j k r�| j | j | � � n | j | � d j | � S) NzArgument should be strr r r r r! r z+=&;r"