
    M`p                     p   S r SSKJr  SSKrSSKrSSKrSSKrSSKr SSKJ	r	  SSKJrJr  SrSr SSKJrJr  SrS	rS
rSr\R4                  S:  a  \\4r " S S\5      r " S S\5      r " S S\5      r  " S S\\!5      r"S r#\RH                  " \RJ                  \#S9r&S\4S jr'\4S jr( " S S\)5      r* " S S\*5      r+ " S S\*5      r, " S  S!\*5      r- " S" S#\*5      r. " S$ S%\*5      r/ " S& S'\*5      r0 " S( S)\)5      r1 " S* S+\)5      r2S, r3g! \
 a    \r	 Nf = f! \
 a    SSKJrJr  \r Nf = f)-zApply JSON-Patches (RFC 6902)     )unicode_literalsN)MappingProxyType)JsonPointerJsonPointerException   )MutableMappingMutableSequenceu    Stefan Kögl <stefan@skoegl.net>z1.32z0https://github.com/stefankoegl/python-json-patchzModified BSD License)   r   c                       \ rS rSrSrSrg)JsonPatchExceptionJ   zBase Json Patch exception N__name__
__module____qualname____firstlineno____doc____static_attributes__r       +/usr/lib/python3/dist-packages/jsonpatch.pyr   r   J       #r   r   c                       \ rS rSrSrSrg)InvalidJsonPatchN   z+Raised if an invalid JSON Patch is created r   Nr   r   r   r   r   r   N   s    6r   r   c                       \ rS rSrSrSrg)JsonPatchConflictR   zRaised if patch could not be applied due to conflict situation such as:
- attempt to add object key when it already exists;
- attempt to operate with nonexistence object key;
- attempt to insert value to array at position beyond its size;
- etc.
r   Nr   r   r   r   r   r   R   s    r   r   c                       \ rS rSrSrSrg)JsonPatchTestFailed[   zA Test operation failed r   Nr   r   r   r   r    r    [   r   r   r    c                     [         R                  " [        5      nU  H  u  p#X   R                  U5        M     [	        S UR                  5        5       5      $ )z'Convert duplicate keys values to lists.c              3   V   #    U  H  u  pU[        U5      S :X  a  US   OU4v   M!     g7f)r   r   N)len).0keyvaluess      r   	<genexpr>multidict.<locals>.<genexpr>f   s1       )KC 
3v;!+fQi8(s   '))collectionsdefaultdictlistappenddictitems)ordered_pairsmdictr&   values       r   	multidictr3   _   sT     ##D)E#

%  $   !;;=  r   )object_pairs_hookFc                     [        U[        5      (       a  [        R                  XS9nO	[        XS9nUR	                  X5      $ )aL  Apply list of patches to specified json document.

:param doc: Document object.
:type doc: dict

:param patch: JSON patch as list of dicts or raw JSON-encoded string.
:type patch: list or str

:param in_place: While :const:`True` patch will modify target document.
                 By default patch will be applied to document copy.
:type in_place: bool

:param pointer_cls: JSON pointer class to use.
:type pointer_cls: Type[JsonPointer]

:return: Patched document object.
:rtype: dict

>>> doc = {'foo': 'bar'}
>>> patch = [{'op': 'add', 'path': '/baz', 'value': 'qux'}]
>>> other = apply_patch(doc, patch)
>>> doc is not other
True
>>> other == {'foo': 'bar', 'baz': 'qux'}
True
>>> patch = [{'op': 'add', 'path': '/baz', 'value': 'qux'}]
>>> apply_patch(doc, patch, in_place=True) == {'foo': 'bar', 'baz': 'qux'}
True
>>> doc == other
True
pointer_cls)
isinstance
basestring	JsonPatchfrom_stringapply)docpatchin_placer7   s       r   apply_patchr@   r   s>    B %$$%%e%E%9;;s%%r   c                 *    [         R                  XUS9$ )a  Generates patch by comparing two document objects. Actually is
a proxy to :meth:`JsonPatch.from_diff` method.

:param src: Data source document object.
:type src: dict

:param dst: Data source document object.
:type dst: dict

:param pointer_cls: JSON pointer class to use.
:type pointer_cls: Type[JsonPointer]

>>> src = {'foo': 'bar', 'numbers': [1, 3, 4, 8]}
>>> dst = {'baz': 'qux', 'numbers': [1, 4, 7]}
>>> patch = make_patch(src, dst)
>>> new = patch.apply(src)
>>> new == dst
True
r6   )r:   	from_diff)srcdstr7   s      r   
make_patchrE      s    * s[AAr   c                       \ rS rSrSr\4S jrS rS rS r	S r
\S 5       r\S	 5       r\R                  S
 5       rSrg)PatchOperation   z'A single operation inside a JSON Patch.c                 h   X l         UR                  S5      (       d  [        S5      e[        US   U R                   5      (       a  US   R                  U l        US   U l        O+US   U l         U R                  U R
                  5      U l        Xl        g ! [         a  n[        S5      eS nAff = f)Npathz#Operation must have a 'path' memberzInvalid 'path')	r7   __contains__r   r8   rJ   locationpointer	TypeError	operation)selfrO   r7   exs       r   __init__PatchOperation.__init__   s    &%%f--"#HIIi')9)9::%f-22DM$V,DL%f-DM9#//> #  9&'7889s   0 B 
B1!B,,B1c                     [        S5      e)zGAbstract method that applies a patch operation to the specified object.z%should implement the patch operation.)NotImplementedError)rP   objs     r   r<   PatchOperation.apply   s    !"IJJr   c                 Z    [        [        U R                  R                  5       5      5      $ N)hash	frozensetrO   r/   rP   s    r   __hash__PatchOperation.__hash__   s    Idnn224566r   c                 `    [        U[        5      (       d  gU R                  UR                  :H  $ NF)r8   rG   rO   rP   others     r   __eq__PatchOperation.__eq__   s%    %00~~00r   c                     X:X  + $ rY   r   ra   s     r   __ne__PatchOperation.__ne__       !!r   c                 R    SR                  U R                  R                  S S 5      $ )N/)joinrM   partsr\   s    r   rJ   PatchOperation.path   s"    xx**3B/00r   c                      [        U R                  R                  S   5      $ ! [         a    U R                  R                  S   s $ f = f)Nrk   )intrM   rm   
ValueErrorr\   s    r   r&   PatchOperation.key   sE    	*t||))"-.. 	*<<%%b))	*s   !$ #A
	A
c                     [        U5      U R                  R                  S'   U R                  R                  U l        U R                  U R
                  S'   g )Nrk   rJ   )strrM   rm   rJ   rL   rO   )rP   r2   s     r   r&   rr      s=    !$U2))!%vr   )rL   rO   rM   r7   N)r   r   r   r   r   r   rR   r<   r]   rc   rf   propertyrJ   r&   setterr   r   r   r   rG   rG      sb    1.9 #$K71
" 1 1 * * 	ZZ/ /r   rG   c                   *    \ rS rSrSrS rS rS rSrg)RemoveOperation   z/Removes an object property or an array element.c                     U R                   R                  U5      u  p# X#	 U$ ! [        [        4 a!  nSR	                  U5      n[        U5      eS nAff = f)Nz(can't remove a non-existent object '{0}')rM   to_lastKeyError
IndexErrorformatr   )rP   rV   subobjpartrQ   msgs         r   r<   RemoveOperation.apply   s[    ||++C0	)
 
	 *% 	)<CCDIC#C((	)s   # AAAc                 ~    U R                   U:X  a,  U R                  U:  a  U =R                  S-  sl        U$ US-  nU$ Nr   rJ   r&   rP   rJ   r&   s      r   _on_undo_removeRemoveOperation._on_undo_remove   s=    99xx3A 
 q
r   c                 ~    U R                   U:X  a,  U R                  U:  a  U =R                  S-  sl        U$ US-  nU$ r   r   r   s      r   _on_undo_addRemoveOperation._on_undo_add   =    99xx#~A 
 q
r   r   N	r   r   r   r   r   r<   r   r   r   r   r   r   rx   rx      s    9r   rx   c                   *    \ rS rSrSrS rS rS rSrg)AddOperationi  z,Adds an object property or an array element.c                 6    U R                   S   nU R                  R	                  U5      u  pE[        U[        5      (       aM  US:X  a  UR                  U5        U$ U[        U5      :  d  US:  a  [        S5      eUR                  XR5         U$ [        U[        5      (       a  Uc  UnU$ X$U'    U$ Uc#  [        SR                  [        U5      5      5      e[        SR                  U R                  U5      5      e! [         a  n[        S5      eS nAff = f)Nr2   /The operation does not contain a 'value' member-r   zcan't insert outside of listinvalid document type {0}2unable to fully resolve json pointer {0}, part {1})rO   r|   r   rM   r{   r8   r	   r-   r$   r   insertr   rN   r~   typerL   )rP   rV   r2   rQ   r   r   s         r   r<   AddOperation.apply	  s#   	CNN7+E
 ||++C0fo..s{e$& 
# F#tax'(FGG d* 
 //| 
  %t 
	 | ; B B4< PQQ'(\(c(cdhdqdqsw(xyy5  	C"AC C	Cs   C> >
DDDc                 ~    U R                   U:X  a,  U R                  U:  a  U =R                  S-  sl        U$ US-  nU$ r   r   r   s      r   r   AddOperation._on_undo_remove)  r   r   c                 ~    U R                   U:X  a,  U R                  U:  a  U =R                  S-  sl        U$ US-  nU$ r   r   r   s      r   r   AddOperation._on_undo_add1  r   r   r   Nr   r   r   r   r   r     s    6@r   r   c                   *    \ rS rSrSrS rS rS rSrg)ReplaceOperationi:  z?Replaces an object property or an array element by a new value.c                 >    U R                   S   nU R                  R	                  U5      u  pEUc  U$ US:X  a  [        S5      e[        U[        5      (       a!  U[        U5      :  d  US:  a  [        S5      eO[        U[        5      (       a"  XT;  a  SR                  U5      n[        U5      eOKUc#  [        SR                  [        U5      5      5      e[        S	R                  U R                  U5      5      eX$U'   U$ ! [         a  n[        S5      eS nAff = f)
Nr2   r   r   z7'path' with '-' can't be applied to 'replace' operationr   zcan't replace outside of listz)can't replace a non-existent object '{0}'r   r   )rO   r|   r   rM   r{   r8   r	   r$   r   r   r~   rN   r   rL   )rP   rV   r2   rQ   r   r   r   s          r   r<   ReplaceOperation.apply=  s%   	CNN7+E
 ||++C0<L3;"#\]]fo..s6{"dQh'(GHH '/ //!AHHN',, " | ; B B4< PQQ'(\(c(cdhdqdqsw(xyyt
7  	C"AC C	Cs   D 
DDDc                     U$ rY   r   r   s      r   r    ReplaceOperation._on_undo_remove]      
r   c                     U$ rY   r   r   s      r   r   ReplaceOperation._on_undo_add`  r   r   r   Nr   r   r   r   r   r   :  s    I@r   r   c                   n    \ rS rSrSrS r\S 5       r\S 5       r\R                  S 5       rS r
S rS	rg
)MoveOperationid  z?Moves an object property or an array element to a new location.c                     [        U R                  S   U R                  5      (       a  U R                  S   nOU R                  U R                  S   5      n UR                  U5      u  pE XE   nU R                  U:X  a  U$ [        U[        5      (       a+  U R                  R                  U5      (       a  [        S5      e[        SU R                  S   S.U R                  S9R                  U5      n[        SU R                  US.U R                  S9R                  U5      nU$ ! [         a  n[	        S5      eS nAff = f! [        [        4 a  n[        [        U5      5      eS nAff = f)	Nfrom.The operation does not contain a 'from' memberz*Cannot move values into their own childrenremoveoprJ   r6   addr   rJ   r2   )r8   rO   r7   r|   r   r{   r}   r   rt   rM   r   containsrx   r<   r   rL   rP   rV   from_ptrrQ   r   r   r2   s          r   r<   MoveOperation.applyg  sl   	B$..0$2B2BCC>>&1++DNN6,BC
  '',	-LE
 <<8#Jfn--%%h//#$PQQNN6*
 '') */s 	
 MM
 ''	) */s	 	 
;  	B"@B B	B *% 	-#CG,,	-s4   7D) D) -E )
E3D>>EE/E**E/c                 z    U R                  U R                  S   5      nSR                  UR                  S S 5      $ )Nr   rj   rk   )r7   rO   rl   rm   rP   r   s     r   	from_pathMoveOperation.from_path  s5    ##DNN6$:;xxs+,,r   c                     U R                  U R                  S   5      n [        UR                  S   5      $ ! [         a    UR                  S   s $ f = fNr   rk   )r7   rO   rp   rm   rN   r   s     r   from_keyMoveOperation.from_key  sR    ##DNN6$:;	&x~~b)** 	&>>"%%	&s   8 AAc                     U R                  U R                  S   5      n[        U5      UR                  S'   UR                  U R                  S'   g r   )r7   rO   rt   rm   rJ   )rP   r2   r   s      r   r   r     s?    ##DNN6$:; Zr!)vr   c                     U R                   U:X  a+  U R                  U:  a  U =R                  S-  sl        OUS-  nU R                  U:X  a,  U R                  U:  a  U =R                  S-  sl        U$ US-  nU$ r   r   r   rJ   r&   r   s      r   r   MoveOperation._on_undo_remove  sl    >>T!}}#"q99xx#~A 
 q
r   c                     U R                   U:X  a+  U R                  U:  a  U =R                  S-  sl        OUS-  nU R                  U:X  a,  U R                  U:  a  U =R                  S-  sl        U$ US-  nU$ r   r   r   s      r   r   MoveOperation._on_undo_add  sl    >>T!}}s""q99xx#~A 
 q
r   r   N)r   r   r   r   r   r<   ru   r   r   rv   r   r   r   r   r   r   r   r   d  sU    I#J - - & & __/ /
r   r   c                       \ rS rSrSrS rSrg)TestOperationi  z!Test value by specified location.c           
          U R                   R                  U5      u  p#Uc  UnOU R                   R                  X#5      n  U R                  S   nXF:w  a1  Sn[	        UR                  U[        U5      U[        U5      5      5      eU$ ! [         a  n[	        [        U5      5      eS nAff = f! [         a  n[        S5      eS nAff = f)Nr2   r   z0{0} ({1}) is not equal to tested value {2} ({3}))rM   r{   walkr   r    rt   rO   r|   r   r~   r   )rP   rV   r   r   valrQ   r2   r   s           r   r<   TestOperation.apply  s    	/<<//4LF|ll''5	CNN7+E
 <DC%cjjd3i16U'E F F 
 $ 	/%c"g..	/
  	C"AC C	Cs4   "B	 B	 B/ 	
B,B''B,/
C	9CC	r   Nr   r   r   r   r   r<   r   r   r   r   r   r     s
    +r   r   c                       \ rS rSrSrS rSrg)CopyOperationi  z@Copies an object property or an array element to a new location c                     U R                  U R                  S   5      nUR	                  U5      u  pE [
        R                  " XE   5      n[        SU R                  US.U R                   S9R                  U5      nU$ ! [         a  n[        S5      eS nAff = f! [        [        4 a  n[        [        U5      5      eS nAff = f)Nr   r   r   r   r6   )r7   rO   r|   r   r{   copydeepcopyr}   r   rt   r   rL   r<   r   s          r   r<   CopyOperation.apply  s    	B''v(>?H
  '',	-MM&,/E MM
 ''	) */s	 	 
!  	B"@B B	B *% 	-#CG,,	-s.   A? B ?
B	BBC,C  Cr   Nr   r   r   r   r   r     s
    Kr   r   c            	           \ rS rSr\" \R                  5      r\" \5      r	\
" \\\\\\S.5      r \4S jrS rS r\rS rS rS rS	 r\S
\4S j5       r\SS
\4S j5       rSS jr\S 5       r SS jr!S r"Sr#g
)r:   i  )r   r   replacemovetestr   c                 d    Xl         X l        U R                    H  nU R                  U5        M     g rY   )r>   r7   _get_operation)rP   r>   r7   r   s       r   rR   JsonPatch.__init__(  s+    
& **B# r   c                 "    U R                  5       $ )zstr(self) -> self.to_string())	to_stringr\   s    r   __str__JsonPatch.__str__3  s    ~~r   c                 ,    [        U R                  5      $ rY   )boolr>   r\   s    r   __bool__JsonPatch.__bool__7      DJJr   c                 ,    [        U R                  5      $ rY   )iterr>   r\   s    r   __iter__JsonPatch.__iter__<  r   r   c                 >    [        [        U R                  5      5      $ rY   )rZ   tuple_opsr\   s    r   r]   JsonPatch.__hash__?  s    E$))$%%r   c                 `    [        U[        5      (       d  gU R                  UR                  :H  $ r`   )r8   r:   r   ra   s     r   rc   JsonPatch.__eq__B  s%    %++yyEJJ&&r   c                     X:X  + $ rY   r   ra   s     r   rf   JsonPatch.__ne__G  rh   r   Nc                 H    U=(       d    U R                   nU" U5      nU " XSS9$ )a`  Creates JsonPatch instance from string source.

:param patch_str: JSON patch as raw string.
:type patch_str: str

:param loads: A function of one argument that loads a serialized
              JSON string.
:type loads: function

:param pointer_cls: JSON pointer class to use.
:type pointer_cls: Type[JsonPointer]

:return: :class:`JsonPatch` instance.
r6   )json_loader)cls	patch_strloadsr7   r   r>   s         r   r;   JsonPatch.from_stringJ  s'      .sI&522r   Tc                     U=(       d    U R                   n[        XXeS9nUR                  SSX5        [        UR	                  5       5      nU " XS9$ )a  Creates JsonPatch instance based on comparison of two document
objects. Json patch would be created for `src` argument against `dst`
one.

:param src: Data source document object.
:type src: dict

:param dst: Data source document object.
:type dst: dict

:param dumps: A function of one argument that produces a serialized
              JSON string.
:type dumps: function

:param pointer_cls: JSON pointer class to use.
:type pointer_cls: Type[JsonPointer]

:return: :class:`JsonPatch` instance.

>>> src = {'foo': 'bar', 'numbers': [1, 3, 4, 8]}
>>> dst = {'baz': 'qux', 'numbers': [1, 4, 7]}
>>> patch = JsonPatch.from_diff(src, dst)
>>> new = patch.apply(src)
>>> new == dst
True
r6    N)json_dumperDiffBuilder_compare_valuesr,   execute)	r   rC   rD   optimizationdumpsr7   r   builderopss	            r   rB   JsonPatch.from_diff^  sL    > .scMD#37??$%300r   c                 P    U=(       d    U R                   nU" U R                  5      $ )z!Returns patch set as JSON string.)r   r>   )rP   r   r   s      r   r   JsonPatch.to_string  s!    /t//4::&&r   c                 T    [        [        U R                  U R                  5      5      $ rY   )r   mapr   r>   r\   s    r   r   JsonPatch._ops  s    S,,djj9::r   c                     U(       d  [         R                  " U5      nU R                   H  nUR                  U5      nM     U$ )zApplies the patch to a given object.

:param obj: Document object.
:type obj: dict

:param in_place: Tweaks the way how patch would be applied - directly to
                 specified `obj` or to its copy.
:type in_place: bool

:return: Modified `obj`.
)r   r   r   r<   )rP   rV   r?   rO   s       r   r<   JsonPatch.apply  s8     --$CI//#&C # 
r   c                     SU;  a  [        S5      eUS   n[        U[        5      (       d  [        S5      eX R                  ;  a  [        SR	                  U5      5      eU R                  U   nU" XR
                  S9$ )Nr   z&Operation does not contain 'op' memberzOperation must be a stringzUnknown operation {0!r}r6   )r   r8   r9   
operationsr~   r7   )rP   rO   r   r   s       r   r   JsonPatch._get_operation  sx    y "#KLLt_"j))"#?@@__$"#<#C#CB#GHHoob!9*:*:;;r   )r>   r7   rY   )F)$r   r   r   r   staticmethodjsonr   r   
_jsonloadsr   r   rx   r   r   r   r   r   r  r   rR   r   r   __nonzero__r   r]   rc   rf   classmethodr;   rB   r   ru   r   r<   r   r   r   r   r   r:   r:     s    tzz*Kz*K!!## J,Z +6 	$   K &'
" *.K 3 3& (,D#"1 "1H'
 ; ;*<r   r:   c                       \ rS rSr\R
                  \4S jrS rS r	S r
S rS rS rS	 rS
 rS rS rS rS rS rSrg)r   i  c                 x    X0l         X@l        0 0 /U l        / / /U l        / =U l        nXl        X l        XUS /US S & g rY   )r   r7   index_storageindex_storage2_DiffBuilder__rootsrc_docdst_doc)rP   r  r  r   r7   roots         r   rR   DiffBuilder.__init__  sI    
& "X!2hdt$Qr   c                     U[        U5      4n U R                  U   nUR                  U5      nUc  U/XT'   g XT   R                  U5        g ! [         a"    U R
                  U   R                  XB45         g f = frY   )r   r  getr-   rN   r  )rP   r2   indexst	typed_keystoragestoreds          r   store_indexDiffBuilder.store_index  s~    DK(			?((,G[[+F~&+W""))%0 	?#**I+=>	?s   (A A )A87A8c                 N   U[        U5      4n U R                  U   R                  U5      nU(       a  UR                  5       $ g ! [         aU    U R
                  U   n[        [        U5      S-
  SS5       H&  nXV   S   U:X  d  M  UR                  U5      S   s  s $     g f = f)Nr   rk   r   )r   r  r  poprN   r  ranger$   )rP   r2   r  r  r  r  is          r   
take_indexDiffBuilder.take_index  s    DK(			-''+//	:Fzz|#   	-))"-G3w<>2r2:a=I-";;q>!,, 3	-s   4A >B$B$B$#B$c                 F    U R                   nUS   nX2U/=US'   US'   US   $ )Nr   r   r  )rP   r   r  lasts       r   r   DiffBuilder.insert  s4    {{Aw!,,Q$q'Awr   c                 (    Uu  p#nX2S'   X#S'   / US S & g )Nr   r   r   )rP   r  	link_prev	link_next_s        r   r   DiffBuilder.remove  s#    "'	a ! !ar   c              #   \   #    U R                   nUS   nX2La  US   v   US   nX2La  M  g g 7fNr      r#  )rP   startr  currs       r   	iter_fromDiffBuilder.iter_from  s7     {{Qxq'M7D    &,,c              #   \   #    U R                   nUS   nX!La  US   v   US   nX!La  M  g g 7fr,  r#  )rP   r  r/  s      r   r   DiffBuilder.__iter__  s7     {{Awq'M7D r2  c              #     #    U R                   nUS   nX!La  US   ULa  US   US   S   pCUR                  UR                  :X  ak  [        U5      [        :X  aX  [        U5      [        :X  aE  [        SUR                  UR                  S   S.U R                  S9R                  v   US   S   nM  US   R                  v   US   nX!La  M  g g 7f)Nr   r-  r   r2   r   r6   )r  rL   r   rx   r   r   rO   r7   )rP   r  r/  op_first	op_seconds        r   r   DiffBuilder.execute  s     {{AwAwd"&*1gtAwqz)$$	(:(::X/9Y<7*' ) 2 2!*!4!4W!=, $(#3#3	5 6?Y	?
  71:Dq'###7D s   C	CCc                    U R                  U[        5      nUb  US   n[        UR                  5      [        :X  aV  [        U5      [        :X  aC  U R                  U5       H.  nUR                  UR                  UR                  5      Ul        M0     U R                  U5        UR                  [        X5      :w  a=  [        SUR                  [        X5      S.U R                  S9nU R                  U5        g g [        S[        X5      US.U R                  S9nU R                  U5      nU R                  X8[         5        g )Nr-  r   r   r   rJ   r6   r   r   )r   
_ST_REMOVEr   r&   rp   r0  r   rJ   r   rL   
_path_joinr   r7   r   r   r  _ST_ADD)	rP   rJ   r&   itemr  r   vnew_op	new_indexs	            r   _item_addedDiffBuilder._item_added  s   j1qBBFF|s"tCyC'7.A..rww?BF / KK{{j33& KK&t1(  $//	1
 F# 4 ""4-#  ++	-F
 F+ITg6r   c                    [        S[        X5      S.U R                  S9nU R                  U[        5      nU R                  U5      nUb  US   nUR                  R                  U R                  5      S   n[        U5      [        :X  aC  U R                  U5       H.  n	U	R                  UR                  UR                  5      Ul        M0     U R                  U5        UR                   UR                   :w  a1  [#        SUR                   UR                   S.U R                  S9nXFS'   g U R                  U5        g U R%                  X6[&        5        g )Nr   r   r6   r-  r   r   r:  )rx   r<  r7   r   r=  r   rM   r{   r  r   r,   r0  r   rJ   r&   r   rL   r   r  r;  )
rP   rJ   r&   r>  r@  r  rA  r   
added_itemr?  s
             r   _item_removedDiffBuilder._item_removed  s!    t)"
 '') g.KK'	qB
 ++DLL9!<JJ4'.A^^BGGRVV<BF / KK"++-& "OOKK(  $//	1
  &! I& Tj9r   c           	      d    U R                  [        S[        X5      US.U R                  S95        g )Nr   r   r6   )r   r   r<  r7   )rP   rJ   r&   r>  s       r   _item_replacedDiffBuilder._item_replaced?  s4    $t)&
 ''	) 	*r   c                 X   [        UR                  5       5      n[        UR                  5       5      nXT-
  nXE-
  nU H!  nU R                  U[        U5      X(   5        M#     U H!  nU R	                  U[        U5      X8   5        M#     XE-   H  nU R                  XX(   X8   5        M     g rY   )setkeysrF  rt   rB  r   )	rP   rJ   rC   rD   src_keysdst_keys
added_keysremoved_keysr&   s	            r   _compare_dictsDiffBuilder._compare_dictsF  s    sxxz?sxxz?(
*CtSXsx8   CT3s8SX6  &C  CHch? 'r   c                 j   [        U5      [        U5      pT[        XE5      n[        XE5      n[        U5       H  nX:  a  X(   X8   pX:X  a  M  [	        U	[
        5      (       a2  [	        U
[
        5      (       a  U R                  [        X5      X5        M]  [	        U	[        5      (       a2  [	        U
[        5      (       a  U R                  [        X5      X5        M  U R                  XU	5        U R                  XU
5        M  XE:  a  U R                  XX(   5        M  U R                  XX8   5        M     g rY   )r$   maxminr  r8   r   rR  r<  r	   _compare_listsrF  rB  )rP   rJ   rC   rD   len_srclen_dstmax_lenmin_lenr&   oldnews              r   rW  DiffBuilder._compare_listsU  s    s8SXg'g'>C}8SXS:^44sN33''
4(=sH_55"388''
4(=sH &&t#6$$T4"""4#(;   CH5- "r   c                    [        U[        5      (       a1  [        U[        5      (       a  U R                  [        X5      X45        g [        U[        5      (       a1  [        U[        5      (       a  U R                  [        X5      X45        g U R                  U5      U R                  U5      :X  a  g U R                  XU5        g rY   )r8   r   rR  r<  r	   rW  r   rI  )rP   rJ   r&   rC   rD   s        r   r   DiffBuilder._compare_valuesq  s    c>**3//
4 5s@_--300
4 5s@ ZZ_

3/ 3/r   )__rootr  r   r  r  r7   r  N)r   r   r   r   r  r   r   rR   r  r   r   r   r0  r   r   rB  rF  rI  rR  rW  r   r   r   r   r   r   r     sS    /3zz{ %?-(72:B*@680r   r   c                 n    Uc  U $ U S-   [        U5      R                  SS5      R                  SS5      -   $ )Nrj   ~z~0z~1)rt   r   r   s     r   r<  r<    s9    
{#:C((d3;;CFFFr   )4r   
__future__r   r*   r   	functoolsr  systypesr   ImportErrorr.   jsonpointerr   r   r=  r;  collections.abcr   r	   unicodert   
__author____version____website____license__version_infobytesr9   	Exceptionr   r   r   AssertionErrorr    r3   partialr   r  r@   rE   objectrG   rx   r   r   r   r   r   r:   r   r<  r   r   r   <module>rv     s  B & '     
&
 : 
? 0
@$ vJ$ $7) 7* $,n $  tzzYG
 &+ %&P &1 B03/V 3/ln <1> 1h'~ 'TSN SlN 6N 2@< @<FT0& T0nGy    ;
Cs"   D D" DD"D54D5