
    Ti                        d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
 ddl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	Zd
ZdZ ej6                  d      ZdZdZeefZdefdZ  G d d      Z! G d de!      Z" G d de"      Z# G d de!      Z$ G d de!      Z% G d de!      Z& G d de!      Z' G d d e&e$      Z( G d! d"e&      Z) G d# d$e'e%      Z*e#e"e$e(e)e*d%Z+y)&a  Protocol input serializes.

This module contains classes that implement input serialization
for the various AWS protocol types.

These classes essentially take user input, a model object that
represents what the expected input should look like, and it returns
a dictionary that contains the various parts of a request.  A few
high level design decisions:


* Each protocol type maps to a separate class, all inherit from
  ``Serializer``.
* The return value for ``serialize_to_request`` (the main entry
  point) returns a dictionary that represents a request.  This
  will have keys like ``url_path``, ``query_string``, etc.  This
  is done so that it's a) easy to test and b) not tied to a
  particular HTTP library.  See the ``serialize_to_request`` docstring
  for more details.

Unicode
-------

The input to the serializers should be text (str/unicode), not bytes,
with the exception of blob types.  Those are assumed to be binary,
and if a str/unicode type is passed in, it will be encoded as utf-8.
    N)ElementTree)validate)
formatdate)ParamValidationError)register_feature_id)
has_headeris_json_value_headerparse_to_aware_datetimepercent_encodeiso8601z%Y-%m-%dT%H:%M:%SZz%Y-%m-%dT%H:%M:%S.%fZz^[A-Za-z0-9\.\-]+$defaultmillisecondTc                 |    t        |    |      }|r*t        j                         }t        j                  ||      }|S )a3  Create a serializer for the given protocol.
    :param protocol_name: The protocol name to create a serializer for.
    :type protocol_name: str
    :param include_validation: Whether to include parameter validation.
    :type include_validation: bool
    :param timestamp_precision: Timestamp precision level.
        - 'default': Microseconds for ISO timestamps, seconds for Unix and RFC
        - 'millisecond': Millisecond precision (ISO/Unix), seconds for RFC
    :type timestamp_precision: str
    :return: A serializer instance for the given protocol.
    )timestamp_precision)SERIALIZERSr   ParamValidatorParamValidationDecorator)protocol_nameinclude_validationr   
serializer	validators        O/var/www/html/apipython/venv/lib/python3.12/site-packages/botocore/serialize.pycreate_serializerr   M   sA    " ]+/J ++-	66y*M
    c                   l    e Zd ZdZeZdZefdZd Z	d Z
d Zd Zd Zdd
Zd Zd Zd Zd Zd Zd Zy	)
SerializerPOSTutf-8c                 >    |t         vrt        d|       || _        y )Nz=Invalid timestamp precision found while creating serializer: )TIMESTAMP_PRECISION_OPTIONS
ValueError_timestamp_precision)selfr   s     r   __init__zSerializer.__init__p   s.    &AAOPcOde  %8!r   c                     t        d      )a  Serialize parameters into an HTTP request.

        This method takes user provided parameters and a shape
        model and serializes the parameters to an HTTP request.
        More specifically, this method returns information about
        parts of the HTTP request, it does not enforce a particular
        interface or standard for an HTTP request.  It instead returns
        a dictionary of:

            * 'url_path'
            * 'host_prefix'
            * 'query_string'
            * 'headers'
            * 'body'
            * 'method'

        It is then up to consumers to decide how to map this to a Request
        object of their HTTP library of choice.  Below is an example
        return value::

            {'body': {'Action': 'OperationName',
                      'Bar': 'val2',
                      'Foo': 'val1',
                      'Version': '2014-01-01'},
             'headers': {},
             'method': 'POST',
             'query_string': '',
             'host_prefix': 'value.',
             'url_path': '/'}

        :param parameters: The dictionary input parameters for the
            operation (i.e the user input).
        :param operation_model: The OperationModel object that describes
            the operation.
        serialize_to_requestNotImplementedError)r#   
parametersoperation_models      r   r&   zSerializer.serialize_to_requestw   s    H ""899r   c                 *    dd| j                   i dd}|S )N/ r   )url_pathquery_stringmethodheadersbody)DEFAULT_METHOD)r#   
serializeds     r   _create_default_requestz"Serializer._create_default_request   s(     ))

 r   c                     | j                   t        k(  r(|j                  dz  }|j                  d      d|ddz   S |j                  dkD  rt        }nt
        }|j                  |      S )zEReturn ISO8601 timestamp with precision based on timestamp_precision.  z%Y-%m-%dT%H:%M:%S.03dZr   )r"   TIMESTAMP_PRECISION_MILLISECONDmicrosecondstrftimeISO8601_MICROISO8601)r#   valuemillisecondstimestamp_formats       r   _timestamp_iso8601zSerializer._timestamp_iso8601   sr     $$(GG ,,4L23,s9K16MM
   1$#0 #* >>"233r   c                     | j                   t        k(  r:t        j                  |j	                               }|j
                  dz  dz  }||z   S t        t        j                  |j	                                     S )zBReturn unix timestamp with precision based on timestamp_precision.r7   g     @@)r"   r;   calendartimegm	timetupler<   int)r#   r@   base_timestamprA   s       r   _timestamp_unixtimestampz#Serializer._timestamp_unixtimestamp   sc     $$(GG%__U__->?N!--5?L!L00xu'89::r   c                     t        |t        j                        r,t        t        j                  |j                                     }t        |d      S )zSReturn RFC822 timestamp (always second precision - RFC doesn't support sub-second).T)usegmt)
isinstancedatetimerH   rE   rF   rG   r   r#   r@   s     r   _timestamp_rfc822zSerializer._timestamp_rfc822   s;     eX../(9:;E%--r   Nc                     || j                   }|j                         }t        |      }t        | d|       } ||      }|S )N_timestamp_)TIMESTAMP_FORMATlowerr
   getattr)r#   r@   rB   datetime_obj	converterfinal_values         r   _convert_timestamp_to_strz$Serializer._convert_timestamp_to_str   sR    ##44+113.u5DK0@/A"BC	-r   c                 :    |j                   j                  d|      S Nnameserializationget)r#   shapedefault_names      r   _get_serialized_namezSerializer._get_serialized_name   s     ""&&v|<<r   c                     t        |t              r|j                  | j                        }t	        j
                  |      j                         j                  | j                        S N)rM   strencodeDEFAULT_ENCODINGbase64	b64encodestripdecoderO   s     r   _get_base64zSerializer._get_base64   sM     eS!LL!6!67E&,,.55d6K6KLLr   c                    |j                   }|d|vry |d   }|j                  |S |j                  j                  }|j                         D cg c]"  \  }}|j                  j                  d      r|$ }}}i }	g }
|D ]2  }||   }t        j                  |      s|
j                  |       ||	|<   4 |
rt        ddj                  |
       d       |j                  di |	S c c}}w )N
hostPrefix	hostLabelz Invalid value for parameter(s): z, z?. Must contain only alphanumeric characters, hyphen, or period.)report )endpointinput_shapemembersitemsr^   r_   HOST_PREFIX_REmatchappendr   joinformat)r#   r)   r*   operation_endpointhost_prefix_expressioninput_membersmemberr`   host_labelsformat_kwargs
bad_labelsr\   params                r   _expand_host_prefixzSerializer._expand_host_prefix   s%   ,55&#55!3L!A&&.))'33;; "/!4!4!6
""&&{3 
 

 
 	(Dt$E!''.!!$'"'M$		(
 &6tyy7L6M N! !  -%,,=}==)
s   'C(c                 8    |j                   j                  d      S )N	flattenedr]   r#   r`   s     r   _is_shape_flattenedzSerializer._is_shape_flattened  s    ""&&{33r   c                 |    |t        d      k(  rd}|S |t        d      k(  rd}|S t        j                  |      rd}|S )NInfinityz	-InfinityNaN)floatmathisnanrO   s     r   _handle_floatzSerializer._handle_float  sN    E*%%E
 	 eK((E  ZZEr   c                 B    |j                   j                  r	d|d   d<   y y )Ntruer1   zx-amzn-query-mode)service_modelis_query_compatible)r#   r*   r4   s      r   _handle_query_compatible_traitz)Serializer._handle_query_compatible_trait  s&    ((<<9?Jy!"56 =r   rd   )__name__
__module____qualname__r3   dictMAP_TYPErg   TIMESTAMP_PRECISION_DEFAULTr$   r&   r5   rC   rJ   rP   rY   rb   rl   r   r   r   r   rq   r   r   r   r   g   s\    N
 H+F 8$:L4 ;.=
M >D4@r   r   c                   f    e Zd ZdZd ZddZddZddZddZddZ	ddZ
dd	Zdd
ZddZddZy)QuerySerializerr   c                 f   |j                   }| j                         }|j                  j                  d| j                        |d<   ddi|d<   | j                         }|j                  |d<   |j                  d   |d<   || j                  |||       ||d<   | j                  ||      }|||d	<   |S )
Nr0   Content-Typez0application/x-www-form-urlencoded; charset=utf-8r1   Action
apiVersionVersionr2   host_prefix)
rs   r5   httpr_   r3   r   r\   metadata
_serializer   )r#   r)   r*   r`   r4   body_paramsr   s          r   r&   z$QuerySerializer.serialize_to_request  s    ++113
.3377d)) 

8 N!

9
 mmo / 4 4H!0!9!9,!GIOOKU;(
6..z?K"(3J}%r   c                 d    t        | d|j                   | j                        } |||||       y )N_serialize_type_)prefixrU   	type_name_default_serialize)r#   r4   r@   r`   r   r0   s         r   r   zQuerySerializer._serialize1  s9     u/0##

 	z5%7r   c                     |j                   }|j                         D ]9  \  }}||   }| j                  ||      }|r| d| }| j                  ||||       ; y )Nr8   )rt   ru   rb   r   )	r#   r4   r@   r`   r   rt   keymember_shapemember_prefixs	            r   _serialize_type_structurez)QuerySerializer._serialize_type_structure@  sf    --++- 	LJC"3<L 55lCHM#)(!M? ;OOJ|]K	Lr   c                    |sd||<   y | j                  |      rl|}|j                  j                  j                  d      rr| j	                  |j                  d      }dj                  |j                  d      d d |gz         }n-|j                  j                  j                  dd      }| d| }t        |d      D ],  \  }}	| d| }
|j                  }| j                  ||	||
       . y )Nr-   r\   ra   r8   r~      )	r   r~   r^   r_   rb   ry   split	enumerater   )r#   r4   r@   r`   r   list_prefixr\   	list_nameielementelement_prefixelement_shapes               r   _serialize_type_listz$QuerySerializer._serialize_type_listI  s    !#Jv##E* K||))--f500B0O!hhv||C'8"'='FG2266vxHI#HAi[1K#E1- 	PJAw +}AaS1N!LLMOOJO	Pr   c                    | j                  |      r|}n| d}|dz   }|j                  }|j                  }| j                  |d      }	| j                  |d      }
t	        |d      D ]V  \  }}|j                  ||	      }|j                  ||
      }| j                  ||||       | j                  |||   ||       X y )Nz.entryz.{i}.{suffix}r   r   r@   r   )r   suffix)r   r   r@   rb   r   rz   r   )r#   r4   r@   r`   r   full_prefixtemplate	key_shapevalue_shape
key_suffixvalue_suffixr   r   
key_prefixvalue_prefixs                  r   _serialize_type_mapz#QuerySerializer._serialize_type_map\  s    ##E* K#HF+K0II	kk..yu.M
00gFq) 	OFAs!1Z@J#??Q|?DLOOJY
COOJc
KN		Or   c                 ,    | j                  |      ||<   y rd   rl   r#   r4   r@   r`   r   s        r   _serialize_type_blobz$QuerySerializer._serialize_type_blobl  s    !--e4
6r   c                 `    | j                  ||j                  j                  d            ||<   y NtimestampFormatrY   r^   r_   r   s        r   _serialize_type_timestampz)QuerySerializer._serialize_type_timestampp  s.    !;;5&&**+<=

6r   c                     |rd||<   y d||<   y Nr   falserq   r   s        r   _serialize_type_booleanz'QuerySerializer._serialize_type_booleanu  s    !'Jv!(Jvr   c                     |||<   y rd   rq   r   s        r   r   z"QuerySerializer._default_serialize{  s    "
6r   c                 ,    | j                  |      ||<   y rd   )r   r   s        r   _serialize_type_floatz%QuerySerializer._serialize_type_float~  s    !//6
6r   c                 ,    | j                  ||||       y rd   r   r   s        r   _serialize_type_doublez&QuerySerializer._serialize_type_double      "":ueVDr   Nr-   )r   r   r   rS   r&   r   r   r   r   r   r   r   r   r   r   rq   r   r   r   r     sC     08LP&O 5

)#7Er   r   c                       e Zd ZdZd ZddZy)EC2SerializeraU  EC2 specific customizations to the query protocol serializers.

    The EC2 model is almost, but not exactly, similar to the query protocol
    serializer.  This class encapsulates those differences.  The model
    will have be marked with a ``protocol`` of ``ec2``, so you don't need
    to worry about wiring this class up correctly.

    c                     d|j                   v r|j                   d   S d|j                   v r(|j                   d   }|d   j                         |dd  z   S |S )N	queryNamer\   r   r   )r^   upper)r#   r`   ra   r\   s       r   rb   z"EC2Serializer._get_serialized_name  sd     %---&&{33u*** &&v.D7==?T!"X--r   c                 z    t        |d      D ],  \  }}| d| }|j                  }| j                  ||||       . y )Nr   r8   )r   r~   r   )	r#   r4   r@   r`   r   r   r   r   r   s	            r   r   z"EC2Serializer._serialize_type_list  sH    #E1- 	PJAw &xq_N!LLMOOJO	Pr   Nr   )r   r   r   __doc__rb   r   rq   r   r   r   r     s     Pr   r   c                   R    e Zd ZdZd ZddZd Zd Zd Zd Z	d	 Z
d
 ZddZddZy)JSONSerializerunixtimestampc                    dj                  |j                  d   |j                        }|j                  d   }| j                         }|j                  j                  d| j                        |d<   |d| d|d<   | j                  ||       | j                         }|j                  }|| j                  |||       t        j                  |      j                  | j                        |d<   | j                  ||      }|||d	<   |S )
Nz{}.{}targetPrefixjsonVersionr0   zapplication/x-amz-json-)zX-Amz-Targetr   r1   r2   r   )rz   r   r\   r5   r   r_   r3   r   r   rs   r   jsondumpsrf   rg   r   )	r#   r)   r*   targetjson_versionr4   r2   rs   r   s	            r   r&   z#JSONSerializer.serialize_to_request  s   $$^4  
 '//>113
.3377d)) 

8 #5l^D!

9 	++OZH}}%11"OOD*k:!ZZ-44T5J5JK
6..z?K"(3J}%r   Nc                 b    t        | d|j                   | j                        } |||||       y Nr   r   r#   r4   r@   r`   r   r0   s         r   r   zJSONSerializer._serialize  s7    u/0##

 	z5%-r   c                    |j                   r|||<   y || j                         }|||<   |}|j                  }|j                         D ];  \  }}||   }	d|	j                  v r|	j                  d   }| j                  |||	|       = y r[   )is_document_typer   rt   ru   r^   r   )
r#   r4   r@   r`   r   new_serializedrt   
member_keymember_valuer   s
             r   r   z(JSONSerializer._serialize_type_structure  s    !!#JsO "&"0
3+
mmG,1KKM (
L&z2\777!-!;!;F!CJlJ	r   c                     | j                         }|||<   |j                         D ]#  \  }}| j                  |||j                  |       % y rd   )r   ru   r   r@   )r#   r4   r@   r`   r   map_objsub_key	sub_values           r   r   z"JSONSerializer._serialize_type_map  sH    --/!
3"'++- 	FGYOOGYWE	Fr   c                     g }|||<   |D ]6  }i }| j                  |||j                  d       |j                  |d          8 y )N__current__)r   r~   rx   )r#   r4   r@   r`   r   list_obj	list_itemwrappers           r   r   z#JSONSerializer._serialize_type_list  sM    "
3 	4IG
 OOGYmLOOGM23	4r   c                     |||<   y rd   rq   r#   r4   r@   r`   r   s        r   r   z!JSONSerializer._default_serialize  s    
3r   c                 `    | j                  ||j                  j                  d            ||<   y r   r   r  s        r   r   z(JSONSerializer._serialize_type_timestamp  s-    885&&**+<=

3r   c                 ,    | j                  |      ||<   y rd   r   r  s        r   r   z#JSONSerializer._serialize_type_blob  s    **51
3r   c                 v    t        |t        j                        rt        |      }| j	                  |      ||<   y rd   )rM   decimalDecimalr   r   r   s        r   r   z$JSONSerializer._serialize_type_float  s.    eW__-%LE!//6
6r   c                 ,    | j                  ||||       y rd   r   r   s        r   r   z%JSONSerializer._serialize_type_double  r   r   rd   r   )r   r   r   rS   r&   r   r   r   r   r   r   r   r   r   rq   r   r   r   r     s<    &8.,F
4 

27
Er   r   c                       e Zd ZdZdZdZdZdZdZdZ	dZ
dd
Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy	)CBORSerializerr   r                     Nc                     t        | d|j                         }|t        d|j                   d       |||||       y )Nr   zUnrecognized C2J type: z, unable to serialize request)rU   r   r!   r   s         r   _serialize_data_itemz#CBORSerializer._serialize_data_item  sS    !1%//1BCD>)%//): ;$ %  	z5%-r   c                    |dk\  r| j                   }n| j                  }d|z
  }| j                  |      \  }}| j                  ||      }|dk(  r|j	                  |       y |j	                  ||j                  |d      z          y )Nr   r   big)UNSIGNED_INT_MAJOR_TYPENEGATIVE_INT_MAJOR_TYPE"_get_additional_info_and_num_bytes_get_initial_byteextendto_bytes)	r#   r4   r@   r`   r   
major_typeadditional_info	num_bytesinitial_bytes	            r   _serialize_type_integerz&CBORSerializer._serialize_type_integer  s    A:55J55J JE%)%L%L&
" --j/J>l+lU^^Iu-MMNr   c                 ,    | j                  ||||       y rd   )r  r  s        r   _serialize_type_longz#CBORSerializer._serialize_type_long+  s    $$ZsCr   c                    t        |t              r|j                  d      }n&t        |t        t        f      s|j                         }t        |      }| j                  |      \  }}| j                  | j                  |      }|dk(  r|j                  |       n$|j                  ||j                  |d      z          |j                  |       y Nr   r   r  )rM   re   rf   bytes	bytearrayreadlenr  r  BLOB_MAJOR_TYPEr  r  )	r#   r4   r@   r`   r   lengthr  r  r  s	            r   r   z#CBORSerializer._serialize_type_blob.  s    eS!LL)EEE9#56 JJLEU%)%L%L&
" --  /
 >l+lV__Y-NNO% r   c                    |j                  d      }t        |      }| j                  |      \  }}| j                  | j                  |      }	|dk(  r|j                  |	|z          y |j                  |	|j                  |d      z   |z          y r"  )rf   r&  r  r  STRING_MAJOR_TYPEr  r  )
r#   r4   r@   r`   r   encodedr(  r  r  r  s
             r   _serialize_type_stringz%CBORSerializer._serialize_type_stringB  s    ,,w'W%)%L%L&
" --""O
 >lW45vy%@@7Jr   c                 8   t        |      }| j                  |      \  }}| j                  | j                  |      }|dk(  r|j	                  |       n$|j	                  ||j                  |d      z          |D ]  }	| j                  ||	|j                         ! y Nr   r  )r&  r  r  LIST_MAJOR_TYPEr  r  r  r~   )
r#   r4   r@   r`   r   r(  r  r  r  items
             r   r   z#CBORSerializer._serialize_type_listR  s    U%)%L%L&
" --  /
 >l+lV__Y-NNO 	FD%%j$E	Fr   c                    t        |      }| j                  |      \  }}| j                  | j                  |      }|dk(  r|j	                  |       n$|j	                  ||j                  |d      z          |j                         D ]?  \  }	}
| j                  ||	|j                         | j                  ||
|j                         A y r.  )
r&  r  r  MAP_MAJOR_TYPEr  r  ru   r  r   r@   )r#   r4   r@   r`   r   r(  r  r  r  key_itemr0  s              r   r   z"CBORSerializer._serialize_type_mapa  s    U%)%L%L&
" --
 >l+lV__Y-NNO#kkm 	ENHd%%j(EIIF%%j$D	Er   c                 f   || j                  |||j                         |j                         D ci c]  \  }}|	|| }}}t        |      }| j	                  |      \  }}	| j                  | j                  |      }
|	dk(  r|j                  |
       n$|j                  |
|j                  |	d      z          |j                  }|j                         D ]Q  \  }}||   }d|j                  v r|j                  d   }|+| j                  ||d d        | j                  |||       S y c c}}w )Nr   r  r\   )r  r   ru   r&  r  r  r2  r  r  rt   r^   r,  )r#   r4   r@   r`   r   kv
map_lengthr  r  r  rt   r   r   r   s                  r   r   z(CBORSerializer._serialize_type_structureq  s>   ?%%j#uG #(++-A$!Q1=AAAZ
%)%L%L&
" --
 >l+z229eDD --(- 	$J":.L333)77?
'++J
D$O))l	# Bs
   
D-D-c                    | j                  |      }d}| j                  | j                  |      }|j                  |       | j	                  |      \  }}	|	dk(  r.| j                  | j
                  |      }|j                  |       y | j                  | j
                  |      }|j                  ||j                  |	d      z          y )Nr   r   r  )rY   r  TAG_MAJOR_TYPEr  r  r  r  )
r#   r4   r@   r`   r   	timestamptagr  r  r  s
             r   r   z(CBORSerializer._serialize_type_timestamp  s    2259	--d.A.A3G,'%)%L%L&
" >11,,iL l+11,,oL y11)UCCr   c                     | j                  |      r!|j                  | j                  |             y | j                  | j                  d      }|j                  |t        j                  d|      z          y )N   z>f_is_special_numberr  _get_bytes_for_special_numbersr  FLOAT_AND_SIMPLE_MAJOR_TYPEstructpackr#   r4   r@   r`   r   r  s         r   r   z$CBORSerializer._serialize_type_float  i    ""5)33E:  1100"L lV[[u-EEFr   c                     | j                  |      r!|j                  | j                  |             y | j                  | j                  d      }|j                  |t        j                  d|      z          y )N   z>dr>  rD  s         r   r   z%CBORSerializer._serialize_type_double  rE  r   c                 f    |rdnd}|j                  | j                  | j                  |             y )N      )r  r  rA  )r#   r4   r@   r`   r   r  s         r   r   z&CBORSerializer._serialize_type_boolean  s2     %"2""00/	
r   c                 :    |dk  r|dfS |dk  ry|dk  ry|dk  ryy	)
N   r      )rL  r   i   )   r
  l        )r=  r  )rG     rq   rO   s     r   r  z1CBORSerializer._get_additional_info_and_num_bytes  s>     2:!8O S[ U] Z r   c                 6    |dz  }||z  j                  dd      S )Nr  r   r  )r  )r#   r  r  major_type_bytess       r   r  z CBORSerializer._get_initial_byte  s&     &? ?2<<QFFr   c                 t    t        |t        d      k(  |t        d      k(  t        j                  |      g      S )Ninf-inf)anyr   r   r   rO   s     r   r?  z!CBORSerializer._is_special_number  s8    u%v&

5!
 	
r   c                 8   d}| j                  | j                  |      }|t        d      k(  r|t        j                  dd      z   S |t        d      k(  r|t        j                  dd      z   S t        j                  |      r|t        j                  dd      z   S y )NrN  rS  z>Hi |  rT  i   i ~  )r  rA  r   rB  rC  r   r   )r#   r@   r  r  s       r   r@  z-CBORSerializer._get_bytes_for_special_numbers  s    --,,o
 E%L &++dF";;;eFm#&++dF";;;ZZ&++dF";;; r   rd   )r   r   r   r  r  r'  r*  r/  r2  r9  rA  r  r  r   r   r,  r   r   r   r   r   r   r   r  r  r?  r@  rq   r   r   r	  r	    s    OONN"#.O$D!( FE B,	G	G
,G

<r   r	  c                   t    e Zd ZdZdZdZg dZd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zy)BaseRestSerializera=  Base class for rest protocols.

    The only variance between the various rest protocols is the
    way that the body is serialized.  All other aspects (headers, uri, etc.)
    are the same and logic for serializing those aspects lives here.

    Subclasses must implement the ``_serialize_body_params`` method.

    r   rfc822)uriquerystringheaderr1   c                    | j                         }|j                  j                  d| j                        |d<   |j                  }| j                  ||      }|||d<   ||j                  d   |d<   |S |j                  }| j                         | j                         | j                         | j                         d}|j                         D ]  \  }}	|		| j                  |||	|        | j                  |j                  d   |d         |d<   d|j                  v r%| j                  |j                  d   |d         |d<   |d	   |d
<   |d   r|d   |d<   | j                  |||||       | j                  |||       |S )Nr0   r   
requestUrir.   )uri_path_kwargsquery_string_kwargsbody_kwargsr1   r_  authPath	auth_pathr`  r/   r1   )r5   r   r_   r3   rs   r   rt   r   ru   _partition_parameters_render_uri_template_serialize_payload_serialize_content_type)
r#   r)   r*   r4   r`   r   shape_memberspartitioned
param_nameparam_values
             r   r&   z'BaseRestSerializer.serialize_to_request
  s   113
.3377d)) 

8  ++..z?K"(3J}%=%4%9%9,%GJz"  $}}#'==?==?}}	
 (2'7'7'9 	#J"&&Zm		 "&!:!:  .<M0N"

: ---&*&?&?$$Z0-.'J{# &11F%G
>"y!$/	$:Jy!Z	
 	$$ZFr   c                     i }t        j                  d|      D ];  }|j                  d      rt        ||d d    d      ||<   +t        ||         ||<   =  |j                  di |S )Nz{(.*?)}+r   z/~)saferq   )refindallendswithr   rz   )r#   uri_templateparamsencoded_paramstemplate_params        r   re  z'BaseRestSerializer._render_uri_templateF  s      jj\B 	N&&s+1?>#2./d2~. 2@>*2~.	 #|""4^44r   c                    |j                   j                  d      }| j                  ||      r)|j                  |d      }| j                  |      }||d<   y |@|j                  |      }|| j	                  |||         |d<   y | j                         |d<   y |d   r| j	                  |d   |      |d<   y | j                  |      r| j                         |d<   y y )Npayloadr   r2   ra  )r^   r_   _has_streaming_payload_encode_payload_serialize_body_params_serialize_empty_body_requires_empty_body)	r#   ri  r)   r4   r`   rh  payload_memberbody_payloadr   s	            r   rf  z%BaseRestSerializer._serialize_payloadY  s     ,,00;&&~}E &>>.#>L//=L!-Jv' %..8K&%)%@%@~!>&
6" &*%?%?%A
6"'!%!<!<M*E"Jv &&u-!%!;!;!=Jv .r   c                      y)Nr   rq   r#   s    r   r{  z(BaseRestSerializer._serialize_empty_bodyy  s    r   c                      y)z
        Some protocols require varied Content-Type headers
        depending on user input. This allows subclasses to apply
        this conditionally.
        Nrq   )r#   r4   r`   rh  s       r   rg  z*BaseRestSerializer._serialize_content_type|  s     	r   c                      y)z
        Some protocols require a specific body to represent an empty
        payload. This allows subclasses to apply this conditionally.
        Frq   r   s     r   r|  z'BaseRestSerializer._requires_empty_body  s    
 r   c                 0    |duxr ||   j                   dv S )z5Determine if payload is streaming (a blob or string).N)blobstring)r   )r#   rw  rh  s      r   rx  z)BaseRestSerializer._has_streaming_payload  s,    d" 
}W'='G'G L
 (
 	
r   c                 \    t        |t              r|j                  | j                        S |S rd   )rM   re   rf   rg   )r#   r2   s     r   ry  z"BaseRestSerializer._encode_payload  s&    dC ;;t4455r   c                    ||   }|j                   j                  d      }|j                   j                  d|      }|dk(  r| j                  ||      }||d   |<   y |dk(  rt        |t              r|d   j                  |       y |j                  dk(  r2|D 	cg c]  }	| j                  |	|j                          }
}	|
|d   |<   y | j                  ||      }
|
|d   |<   y |dk(  r0||   }|s|j                  dk(  ry | j                  ||      |d	   |<   y |d	k(  r|}| j                  ||d	   |       y ||d
   |<   y c c}	w )Nlocationr\   rZ  r_  r[  r`  listr\  r1   ra  )
r^   r_   _get_uri_and_query_string_valuerM   r   updater   r~   _convert_header_value_do_serialize_header_map)r#   ri  rj  rk  rh  r~   r  key_nameuri_path_valuer@   	new_paramr`   header_prefixs                r   rd  z(BaseRestSerializer._partition_parameters  s    z*''++J7''++FJ?u!AAVN 8FK)*84&+t,1299+F!!V+ "- 88N	  @I128< @@	 @I128<!!*-E5??f#</3/I/I{0K	"8, " %M
 )){95{ 6AK&z2=s   #D?c                 4   |j                   dk(  rt        |      j                         S |j                   dk(  r8|j                  j	                  d| j
                        }| j                  ||      S |j                   dv rt        | j                  |            S |S )Nbooleanr:  r   r   double)r   re   rT   r^   r_   QUERY_STRING_TIMESTAMP_FORMATrY   r   )r#   rk  r~   rB   s       r   r  z2BaseRestSerializer._get_uri_and_query_string_value  s    y({#))++,%3377!4#E#E  11-  !44t))+677r   c                 H    |j                         D ]  \  }}||z   }|||<    y rd   )ru   )r#   r  r1   
user_inputr   valfull_keys          r   r  z+BaseRestSerializer._do_serialize_header_map  s2    "((* 	$HC$s*H #GH	$r   c                     t        d      Nrz  r'   )r#   rs  r`   s      r   rz  z)BaseRestSerializer._serialize_body_params      !":;;r   c                 4   |j                   dk(  rot        |      }t        j                  |j	                               }|j
                  j                  d| j                        }t        | j                  ||            S |j                   dk(  rv|j                  j                   dk(  r!|D cg c]  }|| j                  |       }}n+|D cg c]   }|| j                  |j                  |      " }}dj                  |      S t        |      r&| j                  t!        j"                  |d            S |j                   dk(  rt        |      j%                         S |j                   d	v rt        | j'                  |            S t        |      S c c}w c c}w )
Nr:  r   r  r  ,)r  :)
separatorsr  r  )r   r
   rE   rF   utctimetupler^   r_   HEADER_TIMESTAMP_FORMATre   rY   r~   _escape_header_list_stringr  ry   r	   rl   r   r   rT   r   )r#   r`   r@   rV   r:  rB   r6  converted_values           r   r  z(BaseRestSerializer._convert_header_value  s   ??k)259L (A(A(CDI$2266!4#?#?  ..y:JK  __&||%%1 ##} 33A6# # ##} ..u||Q?# #
 88O,,!%( ##DJJu$LMM__	)u:##%%__ 33t))%011u:+##s   +F%Fc                 F    d|v sd|v rd|j                  dd      z   dz   S |S )N"r  z\")replacerO   s     r   r  z-BaseRestSerializer._escape_header_list_string  s1     %<3%<sE22S88Lr   N)r   r   r   r   r  r  KNOWN_LOCATIONSr&   re  rf  r{  rg  r|  rx  ry  rd  r  r  rz  r  r  rq   r   r   rX  rX    sh     %.!& BO:x5&>@

1Af$
<!Fr   rX  c                   (    e Zd ZdZd Zd Zd Zd Zy)BaseRpcV2Serializera`  Base class for RPCv2 protocols.

    The only variance between the various RPCv2 protocols is the
    way that the body is serialized.  All other aspects (headers, uri, etc.)
    are the same and logic for serializing those aspects lives here.

    Subclasses must implement the ``_serialize_body_params``  and
    ``_serialize_headers`` methods.

    c                     | j                         }|j                  j                  d   }|j                  }d| d| |d<   |j                  }|| j                  |||       | j                  ||       |S )Nr   z	/service/z/operation/r.   )r5   r   r   r\   rs   rf  _serialize_headers)r#   r)   r*   r4   service_nameoperation_namers   s          r   r&   z(BaseRpcV2Serializer.serialize_to_request  s    113
&44==nM(--~[0@A 	: &11"##J
KH
O<r   c                 2    | j                  ||      }||d<   y )Nr2   )rz  )r#   r)   r4   r`   r~  s        r   rf  z&BaseRpcV2Serializer._serialize_payload(  s    22:uE)
6r   c                     t        d      )Nr  r'   )r#   r4   r*   s      r   r  z&BaseRpcV2Serializer._serialize_headers,  s    !"677r   c                     t        d      r  r'   )r#   r)   r`   s      r   rz  z*BaseRpcV2Serializer._serialize_body_params/  r  r   N)r   r   r   r   r&   rf  r  rz  rq   r   r   r  r    s    	 *8<r   r  c                   $    e Zd Zd Zd Zd Zd Zy)RestJSONSerializerc                      y)Ns   {}rq   r  s    r   r{  z(RestJSONSerializer._serialize_empty_body4  s    r   c                 h    |j                   j                         D ]  \  }}d|j                  vs y y)zq
        Serialize an empty JSON object whenever the shape has
        members not targeting a location.
        r  TF)rt   ru   r^   )r#   r`   r~   r  s       r   r|  z'RestJSONSerializer._requires_empty_body7  s:    
 !==..0 	KFC!2!22	 r   c                     |j                   j                  d      }| j                  ||      ry|d   dk7  }t        d|d         }|r|s	d|d   d<   yyy)z?Set Content-Type to application/json for all structured bodies.rw  Nr2   r   r   r1   zapplication/json)r^   r_   rx  r   )r#   r4   r`   rh  rw  has_bodyhas_content_types          r   rg  z*RestJSONSerializer._serialize_content_typeA  sh    %%)))4&&w>f%,%nj6KL,4FJy!.1 -8r   c                     | j                         }| j                  |||       t        j                  |      j	                  | j
                        S rd   )r   r   r   r   rf   rg   )r#   rs  r`   serialized_bodys       r   rz  z)RestJSONSerializer._serialize_body_paramsM  s=    --/7zz/*11$2G2GHHr   N)r   r   r   r{  r|  rg  rz  rq   r   r   r  r  3  s    
GIr   r  c                   X    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zy)RestXMLSerializerr   c                     |j                   d   }t        j                  d      }| j                  ||||       t	        |      d   }t        j
                  || j                        S )Nr\   r-   r   )encoding)r^   r   Elementr   r  tostringrg   )r#   rs  r`   	root_namepseudo_root	real_roots         r   rz  z(RestXMLSerializer._serialize_body_paramsV  s\    ''/	!))"-v{I>%a(	##I8M8MNNr   c                 b    t        | d|j                   | j                        } |||||       y r   r   )r#   r`   rs  xmlnoder\   r0   s         r   r   zRestXMLSerializer._serialize]  s7    u/0##

 	wt,r   c                 ~   t        j                  ||      }| j                  ||       |j                         D ]  \  }}|j                  |   }|j
                  j                  d|      }	| y |j
                  j                  d      r|j
                  d   }
||j                  |
<   o| j                  ||||	        y )Nr\   xmlAttribute)	r   
SubElement_add_xml_namespaceru   rt   r^   r_   attribr   )r#   r  rs  r`   r\   structure_noder   r@   r   member_namexml_attribute_names              r   r   z+RestXMLSerializer._serialize_type_structuree  s    $//>~6 ,,. 	NJC ==-L&4488EK
 }))--n=%1%?%?%G"<A%%&89OOL%M	Nr   c                    |j                   }|j                  j                  d      r|}|}n2|j                  j                  dd      }t        j                  ||      }| j                  ||       |D ]  }| j                  ||||        y )Nr   r\   r~   )r~   r^   r_   r   r  r  r   )	r#   r  rs  r`   r\   r   element_name	list_noder0  s	            r   r   z&RestXMLSerializer._serialize_type_listz  s    ||"";/LI'5599&(KL#..w=Iy1 	IDOOL$	<H	Ir   c                    | j                  |      s(t        j                  ||      }| j                  ||       |j	                         D ]  \  }}| j                  |      rt        j                  ||      nt        j                  d      }| j                  |j                  d      }	| j                  |j                  d      }
| j                  |j                  |||	       | j                  |j                  |||
        y )Nentryr   r   r@   )	r   r   r  r  ru   rb   r   r@   r   )r#   r  rs  r`   r\   noder   r@   sub_noder  val_names              r   r   z%RestXMLSerializer._serialize_type_map  s     ''.))'48D##E40 ,,. 	DJC ++E2 &&w5 ++D': 
 000OH00' 1 H OOEIIsHh?OOEKK(C	Dr   c                 p    t        j                  ||      }|rd}nd}||_        | j                  ||       y r   )r   r  textr  )r#   r  rs  r`   r\   r  	str_values          r   r   z)RestXMLSerializer._serialize_type_boolean  s:     %%gt4II	t,r   c                     t        j                  ||      }| j                  |      |_        | j	                  ||       y rd   )r   r  rl   r  r  r#   r  rs  r`   r\   r  s         r   r   z&RestXMLSerializer._serialize_type_blob  s6    %%gt4$$V,	t,r   c                     t        j                  ||      }t        | j                  ||j                  j                  d                  |_        | j                  ||       y r   )r   r  re   rY   r^   r_   r  r  r  s         r   r   z+RestXMLSerializer._serialize_type_timestamp  sW    %%gt4**++//0AB
	
 	t,r   c                     t        j                  ||      }t        | j                  |            |_        | j                  ||       y rd   )r   r  re   r   r  r  r  s         r   r   z'RestXMLSerializer._serialize_type_float  s;    %%gt4**623	t,r   c                 ,    | j                  ||||       y rd   r   )r#   r  rs  r`   r\   s        r   r   z(RestXMLSerializer._serialize_type_double  s    ""7FE4@r   c                 t    t        j                  ||      }t        |      |_        | j	                  ||       y rd   )r   r  re   r  r  r  s         r   r   z$RestXMLSerializer._default_serialize  s/    %%gt4K	t,r   c                    d|j                   v rq|j                   d   }d}t        |t              r/|j                  d      r|d|d    z  }|d   |j                  |<   y t        |t
              r||j                  |<   y y y )NxmlNamespacexmlnsr   r  rZ  )r^   rM   r   r_   r  re   )r#   r`   r  namespace_metadataattribute_names        r   r  z$RestXMLSerializer._add_xml_namespace  s    U000!&!4!4^!D$N,d3%))(3"*<X*F)G&HHN8J9%%n5 .48J%%n5 5 1r   N)r   r   r   rS   rz  r   r   r   r   r   r   r   r   r   r   r  rq   r   r   r  r  S  sJ     O-N*
ID4
--
--
A-
Kr   r  c                   .     e Zd ZdZ fdZd Zd Z xZS )RpcV2CBORSerializerr   c                 :    t        d       t        | 	  ||      S )NPROTOCOL_RPC_V2_CBOR)r   superr&   )r#   r)   r*   	__class__s      r   r&   z(RpcV2CBORSerializer.serialize_to_request  s    23w+JHHr   c                 R    t               }| j                  |||       t        |      S rd   )r$  r  r#  )r#   r)   rs   r2   s       r   rz  z*RpcV2CBORSerializer._serialize_body_params  s%    {!!$
K@T{r   c                     d|d   d<   |j                   rd}nd}| j                  ||       |d   dk7  }t        d|d         }||d   d	<   |s|r	||d   d<   y y y )
Nzrpc-v2-cborr1   zsmithy-protocolz"application/vnd.amazon.eventstreamzapplication/cborr2   r   r   Accept)has_event_stream_outputr   r   )r#   r4   r*   
header_valr  r  s         r   r  z&RpcV2CBORSerializer._serialize_headers  s    3@
9/022=J+J++OZHf%,%nj6KL*4
9h'H4>Jy!.1 %-r   )r   r   r   rS   r&   rz  r  __classcell__)r  s   @r   r  r    s    &I
?r   r  )ec2queryr   z	rest-jsonzrest-xmlzsmithy-rpc-v2-cbor),r   rh   rE   rN   r  r   r   ro  rB  	xml.etreer   botocorer   botocore.compatr   botocore.exceptionsr   botocore.useragentr   botocore.utilsr   r	   r
   r   DEFAULT_TIMESTAMP_FORMATr?   r>   compilerv   r   r;   r    r   r   r   r   r   r	  rX  r  r  r  r  r   rq   r   r   <module>r     s?  8       	  !  & 4 2  % 
'12' "/ #  34l@ l@^lEj lE^PO P<`EZ `EFo<Z o<dQ Qh$<* $<NI+^ I@K* KD?-~ ?< #!-r   