
    :Qg5[                        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Zd dl	Z	d dl
Z
d dlmZmZmZmZ d dlmZ d dlmZmZmZ d dlmZ d dlmZ d dlmZ  G d d	      Z G d
 d      Z G d de      Z 	 d dl!Z"e"jF                  Z$e"jJ                  Z&e"jN                  Z(e"jR                  Z*e"jV                  Z,e"jZ                  Z.e"j^                  Z0e"jb                  Z2e"jf                  Z4e"jj                  Z6e"jn                  Z8e"jr                  Z:e"jv                  Z<e"jz                  Z>e"j~                  Z@e"j                  ZBe"j                  ZDe"j                  ZFe"j                  ZHe"j                  ZJe"j                  ZLe*e,e.e0e2e4e6e8e:e<e>e@eBeDeFeHeJfZNeLeFeHeJfZO ePeN      ZQeQj                  e(       eQD  ci c]  } | j                  |  c} ZT	 d dlUmVZW  ej                  eS      ZYe j                  j                  Z\e j                  j                  Z^ edj                  e\e^            Z`e\dk(  Zae\dk(  Zbe\dk(  Zc edej                        Zf G d dege
j                        Zid Zjd ZkelZmecreYj                  d       dZbear e j                  d       ebxr	  epe d      Zqe"r' eke"j                        dk  r e j                  d       egesfZtegZuesZvewfeOz   ZxeyezewefeNz   Z{ej                  ej                  ej                  ej                  fZ~ej                  fZej                  ej                  fZe{e~z   Zee(fZetez   ez   ez    ed      fz   Z G d de      Zej                  j                  ej                  j                  e            Zd Zd!Zd"Zd#Zd$Zg d%Zdid&Z G d' d(      Z G d) d*      Z G d+ d,e      Z G d- d.e      Z G d/ d0e      Z G d1 d2      Z G d3 d4e      Z e       Z e       Z e       Z e       ZemZ G d5 d6eP      Zd7 Zd8 Zd9 Z e ejJ                  d:            Zd; Zd< Zd= Zd> Zd? Zd@ ZdA ZdBdCdDZdjdEZ G dF dGe      ZdH ZdkdIZdkdJZ G dK dL      Z e       Z ejn                  dMe        G dN dO      ZdP ZdQ ZdR ZdSdTefdUdTefdVdTefgZdW ZdX ZdY ZdZ Zd[ Zd\ Zeye0eze@ee@iZd] Zd ed       dfd^Zd_ Z G d` daei      Z G db dce      Z G dd deei      Zeǐj                  eɐj                  eǐj                  eɐj                  eǐj                  eɐj                  eǐj                  eɐj                  iZeҐj                         D ci c]  \  }}||
 c}}ZdfZ G dg dhe      Zy# eM$ r0 dZ"dZ$eZ&eZ(eZ*eZ,eZ.eZ0eZ2eZ4eZ6eZ8eZ:eZ<eZ>eZ@eZBeZDeZFeZHeZJeZLY Jw xY wc c} w # eM$ r eZWY 	w xY wc c}}w )l    N)
NamedTupleAnyListOptional)literal_eval)DecimallocalcontextInvalidOperation)repeat)StableSetEq)Timerc                       e Zd Zy)np_typeN__name__
__module____qualname__     L/var/www/html/answerous/venv/lib/python3.12/site-packages/deepdiff/helper.pyr   r          r   r   c                       e Zd Zy)pydantic_base_model_typeNr   r   r   r   r   r      r   r   r   c                       e Zd Zd Zy)
SetOrderedc                 *    t        t        |             S N)strlistselfs    r   __repr__zSetOrdered.__repr__    s    4:r   N)r   r   r   r"   r   r   r   r   r      s    r   r   znumpy not available)	BaseModelz{}.{}         c                       e Zd Zd Zd Zy)EnumBasec                 "    d| j                    dS )za
        We need to add a single quotes so we can easily copy the value when we do ipdb.
        'namer    s    r   r"   zEnumBase.__repr__{   s     499+Qr   c                     | j                   S r   r+   r    s    r   __str__zEnumBase.__str__   s    yyr   Nr   r   r   r"   r.   r   r   r   r(   r(   z   s     r   r(   c                     	 t        |       S # t        $ rD g }| D ]  }|t        v s|j                  |        |rt        dj	                  |            cY S Y yw xY w)zI
    Tries to extract some number from a string.

    12c becomes 12
     r   )int	ExceptionNUMERICSappendjoin)valueresultchars      r   _int_or_zeror:      sc    	5z  	$Dxd#	$ rwwv''s   
 A/AAc           
      :   | j                  d      } t        |       dkD  r| dd } n/t        |       dk  r!| j                  dgdt        |       z
  z         t        t	        t        |             D cg c]  \  }}d|dz  z  t        |      z   c}}      S c c}}w )z,
    Converts:

    '1.23.5' to 1023005
    .r%   N0
   )splitlenextendsum	enumeratereversedr:   )versionivs      r   get_semvar_as_integerrH      s     mmC G
7|a"1+	W	uCL 012)HWDU:VW$!QQUl1o-WXXWs   1B
z;Python 4 is not supported yet. Switching logic to Python 3.Tz\Python 2 is not supported anymore. The last version of DeepDiff that supported Py2 was 3.3.0pypy_translation_infoix zPThe minimum required Numpy version is 1.19.0. Please upgrade your Numpy package.c                   "    e Zd ZU eed<   eed<   y)IndexedHashindexesitemN)r   r   r   r   __annotations__r   r   r   r   rK   rK      s    M
Ir   rK   z!>*idz{}:{}treetext_delta)__objclass__r,   r7   c                 n    t        |       } t        |       |kD  rdj                  | d|dz
   | d         } | S )z.Short representation of item if it is too longz{}...{}Nr%   )reprr@   format)rM   
max_lengths     r   
short_reprrX      s=    :D
4y:_j1n 5tBx@Kr   c                       e Zd ZdZy)ListItemRemovedOrAddedz!Class of conditions to be checkedNr   r   r   __doc__r   r   r   rZ   rZ      s    +r   rZ   c                       e Zd Zd ZeZy)
OtherTypesc                 L    dj                  | j                  j                        S )Nz	Error: {})rV   	__class__r   r    s    r   r"   zOtherTypes.__repr__   s    !!$.."9"9::r   Nr/   r   r   r   r^   r^      s    ; Gr   r^   c                       e Zd Zy)SkippedNr   r   r   r   rb   rb      r   r   rb   c                       e Zd Zy)UnprocessedNr   r   r   r   rd   rd      r   r   rd   c                       e Zd Zy)	NotHashedNr   r   r   r   rf   rf      r   r   rf   c                       e Zd ZdZd ZeZy)
NotPresenta  
    In a change tree, this indicated that a previously existing object has been removed -- or will only be added
    in the future.
    We previously used None for this but this caused problem when users actually added and removed None. Srsly guys? :D
    c                      y)Nznot presentr   r    s    r   r"   zNotPresent.__repr__   s    r   N)r   r   r   r\   r"   r.   r   r   r   rh   rh      s     Gr   rh   c                       e Zd ZdZy)CannotComparezN
    Exception when two items cannot be compared in the compare function.
    Nr[   r   r   r   rk   rk          	r   rk   c                       e Zd ZdZy)indexed_setz
    A set class that lets you get an item by index

    >>> a = indexed_set()
    >>> a.add(10)
    >>> a.add(20)
    >>> a[0]
    10
    Nr[   r   r   r   rn   rn   &  s    r   rn   c                     | |hz  S r   r   )parents_idsitem_ids     r   add_to_frozen_setrr   2  s    '""r   c                 R    | r"t        | t              r| h} | S t        |       } | S d } | S r   )
isinstancestringsset)itemss    r   (convert_item_or_items_into_set_else_nonerx   6  s;    eW%GE
 L JE L Lr   c                    | yt               }| D ]  }|j                  d      r|j                  |       &|j                         r+|j                  d| d       |j                  d| d       a|d   j                         r|j                  d| d       |j                  d|        |j                  d| d        |S )	z
    Sometimes the users want to just pass
    [key] instead of root[key] for example.
    Here we automatically add all sorts of variations that might match
    the path they were supposed to pass. 
    Nrootzroot['z']zroot[]r   zroot.)r   
startswithaddisdigit)pathsr8   paths      r   add_root_to_pathsr   A  s     }\F .??6"JJt||~

VD6,-

U4&?+a"

VD6,-

U4&>*

VD6,-. Mr   r1   c                     | rOt        | t        t        f      r| g} | D cg c])  }t        |t              r|nt        j                  |      + } }| S d } | S c c}w r   )rt   ru   RE_COMPILED_TYPErecompile)rw   rF   s     r   5convert_item_or_items_into_compiled_regexes_else_noner   ]  s_    eg'789GERWXQj$452::a=HXX L L Ys   .Ac                 @    dj                  t        t        |             S )ze
    Adding some characters to id so they are not just integers to reduce the risk of collision.
    z{}{})rV   	ID_PREFIXidobjs    r   get_idr   g  s     ==BsG,,r   c                     t        | t              r| j                  j                  S t        |       t        u r| S t        |       S )zN
    Get the type of object or if it is a class, return the class itself.
    )rt   
np_ndarraydtypetyper   s    r   get_typer   n  s6     #z"yy~~s)t#32c2r   c                     t         |    S r   )numpy_dtype_str_to_type)	dtype_strs    r   numpy_dtype_string_to_typer   w  s    "9--r   c                     t        |       |v S r   )r   rM   
type_groups     r   type_in_type_groupr   {  s    D>Z''r   c                 v    t        | |      xs, t        | t              xr t        | |      xs t        | |      S r   )rt   r   
issubclassr   r   s     r   type_is_subclass_of_type_groupr     s;    dJ' 0tT"Cz$
'C0dJ/0r   c                     	 t        t        j                  j                  t        d|       d      5 }|j                         }d d d        |S # 1 sw Y   S xY w# t        $ r d}Y |S w xY w)Nz../docs/rzSFailed to load the docstrings. Please visit: https://zepworks.com/deepdiff/current/)openosr   r6   current_dirreadr3   )doc_filenamedoc_filedocs      r   get_docr     sj    d"'',,{JEsK 	"x--/C	" J		" J  dcJds.   /A AA AA A A('A(z{:.%sf}z{:.%se})fec           
         	 t         |   }t	        | t
              s| S t	        | t              r]t               5 }t        t        t        | dz                    |z   |_        	 | j                  t        dd|z  z               } ddd       n|t	        | t              rO| j                  dj                  t!        | j"                  ||      t!        | j$                  ||                  } nt'        | |	      } |d
k(  rt)        |       } | dk(  rt        |       } ||z  j                  |       }|dk(  rt+        j,                  dd|      }|S # t        $ r t        dj                  |            dw xY w# t        $ r9 |xj                  dz  c_        | j                  t        dd|z  z               } Y 1w xY w# 1 sw Y   xY w)zC
    Convert numbers to string considering significant digits.
    zPnumber_format_notation got invalid value of {}. The valid values are 'f' and 'e'N   z0.r=   z{real}+{imag}j)numbersignificant_digitsnumber_format_notation)realimag)r   ndigitsr   g        r   z(?<=e(\+|\-))0(?=\d)+r1   )patternreplstring)number_formattingKeyError
ValueErrorrV   rt   numbersr   r	   r@   r   absprecquantizeInvalidDecimalOperationonly_complex_numberr`   number_to_stringr   r   roundr2   r   sub)r   r   r   usingctxr8   s         r   r   r     s   V!"89 fg&	FG	$^ 
	Ss 3s6Q;/014FFCHS>P8P1P)QR
	S 
	S 
F/	0!!##%!;;'9+A
 &!;;'9+A $ 
  f.@A"[F}V ((008F$,

 Mm  Vkrr  tJ  K  L  RV  	VV + S A>P8P1P)QR	S
	S 
	Ss4   	E	 )F6! E1	%E.1>F3/F62F33F66F?c                       e Zd ZdZy)DeepDiffDeprecationWarningz8
    Use this warning instead of DeprecationWarning
    Nr[   r   r   r   r   r     rl   r   r   c              #   8   K   | D ]  }|D ]
  }||fz      yw)z
    Get the Cartesian product of two iterables

    **parameters**

    a: list of lists
    b: iterable to do the Cartesian product
    Nr   )abrF   js       r   cartesian_productr     s1        	Aqd(N	s   c                 F    |d}| D ]  }t        |t        |            } |S )z
    Cartesian product of a dimentions iterable.
    This is mainly used to traverse Numpy ndarrays.

    Each array has dimentions that are defines in ndarray.shape
    )r   )r   range)
dimentionsr8   	dimensions      r   cartesian_product_of_shaper     s3     ~ =	"65+;<=Mr   c              #   z   K   || j                   }|dd }t        |      D ]  }| }|D ]  }||   }	 ||f  yw)zA
    Convert a multi dimensional numpy array to list of rows
    NrT   )shaper   )r   r   r   
path_tupler8   indexs         r   get_numpy_ndarray_rowsr     s]      }		sJ0< !
 	#EE]F	#&  	!s   9;c                        e Zd Zd ZeZd ZeZy)	_NotFoundc                      yNFr   )r!   others     r   __eq__z_NotFound.__eq__  s    r   c                      y)Nz	not foundr   r    s    r   r"   z_NotFound.__repr__  s    r   N)r   r   r   r   __req__r"   r.   r   r   r   r   r     s     G Gr   r   oncec                   .    e Zd ZdZd Zd Zd Zd Zd Zy)RepeatedTimerz`
    Threaded Repeated Timer by MestreLion
    https://stackoverflow.com/a/38317060/1497443
    c                     d | _         || _        || _        || _        t	        j                         | _        || _        d| _        | j                          y r   )	_timerintervalfunctionargstime
start_timekwargs
is_runningstart)r!   r   r   r   r   s        r   __init__zRepeatedTimer.__init__  sB      	))+

r   c                 V    t        t        j                         | j                  z
        S r   )r2   r   r   r    s    r   _get_duration_seczRepeatedTimer._get_duration_sec(  s    499;011r   c                 ~    d| _         | j                           | j                  | j                  i | j                   y r   )r   r   r   r   r   r    s    r   _runzRepeatedTimer._run+  s-    

tyy0DKK0r   c                     | j                   j                  | j                                | j                  sGt	        | j
                  | j                        | _        | j                  j                          d| _        y y )N)durationT)	r   updater   r   r   r   r   r   r   r    s    r   r   zRepeatedTimer.start0  sY    D$:$:$<=tyy9DKKK"DO r   c                 h    | j                         }| j                  j                          d| _        |S r   )r   r   cancelr   )r!   r   s     r   stopzRepeatedTimer.stop7  s,    ))+r   N)	r   r   r   r\   r   r   r   r   r   r   r   r   r   r     s     
21
#r   r   c                     t        |       S r   )r   paramss    r   _eval_decimalr   >  s    6?r   c                 H    d|  d} t        |       } t        j                  |  S N())r   datetimer   s    r   _eval_datetimer   B  s*    ]F&!Ff%%r   c                 H    d|  d} t        |       } t        j                  |  S r   )r   r   dater   s    r   
_eval_dater   H  s(    ]F&!F==&!!r   zDecimal(r   zdatetime.datetime(zdatetime.date(c                    	 t        |       S # t        t        f$ rg t        D ]\  \  }}}| j	                  |      s| j                  |      s+| t        |      t        |        j                  d      } ||      c cY S   w xY w)z-
    An extended version of literal_eval
    z'")r   SyntaxErrorr   LITERAL_EVAL_PRE_PROCESSr|   endswithr@   strip)rM   beginendfuncr   s        r   literal_eval_extendedr  U  s    D!!$  8 	$E3u%$--*<c%j3s8)4::6BF|#		$
 	s   
 -BB1B Bc                 Z    | j                   dz  | j                  z   dz  | j                  z   S )N<   )hourminutesecond)ts    r   time_to_secondsr  d  s'    FFRK!(("b(18833r   c                    | re| dk(  r|j                  d      }nM| dk(  r|j                  dd      }n4| dk(  r|j                  ddd      }n| dk(  r|j                  dddd	      }t        |t        j                        r,|j                  t        j                  j                  
      }|S t        |t        j
                        rt        |      }|S )Nr  r   )microsecondr  )r  r  r  )r  r  r  day)r  r  r  r  )tzinfo)replacert   r   timezoneutcr   r  )truncate_datetimer   s     r   datetime_normalizer  h  s    (++!+,C(*++QA+6C&(++Qqa+@C%'++1Qqa+HC#x(()kk!2!2!6!6k7 J 
C	'c"Jr   c                 $    | dvrt        d      | S )z+
    Validates truncate_datetime value
    >   Nr  r  r  r  z5truncate_datetime must be second, minute, hour or day)r   )r  s    r   get_truncate_datetimer  y  s      IIPQQr   c                  >   t        |       }t        j                  |  }t        j                  |gt	        t         |       |      }t        d      gt        d|      }t        |       D ]  \  }}||d||z
      ||df<    |j                  |d      j                  S )zk
    Cartesian product of Numpy arrays by Paul Panzer
    https://stackoverflow.com/a/49445693/1497443
    )r   N.rT   )
r@   npresult_typeemptymapslicer   rC   reshapeT)arrayslar   arridxrF   r   s          r   cartesian_product_numpyr'    s    
 
VBNNF#E
((B*S&)*%
8C
+
(tR(
(C&! &1GR!VoAsF&;;r2   r   c                 6    | t        j                  | |          S )z
    Numpy Array A - B
    return items in A that are not in B
    By Divakar
    https://stackoverflow.com/a/52417967/1497443
    )r  isin)ABs     r   diff_numpy_arrayr,    s     bggam^r   c                     t        |       }t        t        |            t        t        t
        hv r.t        fd|D              rnd}t        j                  |d      S y)z
    Return with the numpy dtype if the array can be converted to a non-object numpy array.
    Originally written by mgilson https://stackoverflow.com/a/13252348/1497443
    This is the modified version.
    c              3   8   K   | ]  }t        |      u   y wr   )r   ).0x
first_types     r   	<genexpr>z?get_homogeneous_numpy_compatible_type_of_seq.<locals>.<genexpr>  s     !Ha47j#8!Hs   F)	iterr   nextr2   floatr   allPYTHON_TYPE_TO_NUMPY_TYPEget)seqiseqtype_r1  s      @r   ,get_homogeneous_numpy_compatible_type_of_seqr<    sU     9Dd4j!Jc5'**!!H4!HH
e(,,UE::r   c                    |r.i }|D ]%  }	 t        | |      }t        |      r|dk(  s!|||<   ' |S | j                  j	                         }d| j
                  j                   d}|D ]0  }||v s'|s
|j                  d      s|j                  |      r.||= 2 t        |       D ]R  }||vs||vs|r'|s|j                  d      r$|j                  |      r6t        | |      }t        |      rN|||<   T |S # t        $ r Y w xY w)zk
    Get the detailed dictionary of an object.

    This is used so we retrieve object properties too.
    rR   ___)	getattrcallabler3   __dict__copyr`   r   r|   dir)r   ignore_private_variablesignore_keysinclude_keysr8   keyr7   private_var_prefixs           r   detailed__dict__rJ    s.     	(C(S)  #*?"'F3K	(2 M! ""$ !7!7 8; 	 Cf}(S^^D-A#..YkJl3K		 
 s8 	(C& S%;009MVYVdVdewVx  S)"'F3K	( M-  s   C<<	D	D	c                 D   g }| j                         j                         D ]S  \  }}|| j                  v r*|| j                  |   k7  s'|j                  | d|       >|j                  | d|       U | j                  j
                   ddj                  |       dS )N=r   z, r   )_asdictrw   _field_defaultsr5   r`   r   r6   )r!   fieldsfieldr7   s       r   named_tuple_reprrQ    s    F,,. 0uD(((,,U33q	23MMUG1UI./0 nn%%&a		&(9':!<<r   c                       e Zd ZdZdZdZdZy)	OpcodeTaginsertdeleteequalr  N)r   r   r   rT  rU  rV  r  r   r   r   rS  rS    s    FFEGr   rS  c                   |    e Zd ZU eed<   eed<   eed<   eed<   eed<   dZeee	      ed<   dZ
eee	      ed<   exZZy)	Opcodetagt1_from_indext1_to_indext2_from_indext2_to_indexN
old_values
new_values)r   r   r   r   rN   r2   r^  r   r   r   r_  rQ  r"   r.   r   r   r   rX  rX    sO    	H&*Jc#*&*Jc#*))Hwr   rX  c                   P    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dZdZdZdZy)FlatDataActionvalues_changedtype_changesset_item_addedset_item_removeddictionary_item_addeddictionary_item_removediterable_item_addediterable_item_removediterable_item_movediterable_items_insertediterable_items_deletediterable_items_replacediterable_items_equalattribute_removedattribute_addedunordered_iterable_item_addedunordered_iterable_item_removedN)r   r   r   rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  r   r   r   ra  ra    sd    %N!L%N)37/3/7571+'O$C!&G#r   ra  
unknown___c                       e Zd ZU eed<   eed<   eZee	   ed<   eZ
ee	   ed<   eZee	   ed<   eZee	   ed<   dZee   ed<   dZee   ed	<   dZee   ed
<   dZee   ed<   dZee   ed<   exZZy)FlatDeltaRowr   actionr7   	old_valuer   old_typeNnew_pathrZ  r[  r\  r]  )r   r   r   r   rN   ra  UnkownValueCoder7   r   r   rw  r   rx  ry  rZ  r2   r[  r\  r]  rQ  r"   r.   r   r   r   ru  ru    s    
J*E8C=*.Ix}.)D(3-)-Hhsm-#Hhtn##'M8C='!%K#%#'M8C='!%K#%))Hwr   ru  )   )r   r   )sysr   r   mathr   uuidloggingwarningsr   r   enumtypingr   r   r   r   astr   decimalr   r	   r
   r   	itertoolsr   orderly_setr   SetOrderedBase	threadingr   r   r   r   numpyr  arraynp_array_factoryndarrayr   bool_np_bool_int8np_int8int16np_int16int32np_int32int64np_int64uint8np_uint8uint16	np_uint16uint32	np_uint32uint64	np_uint64intpnp_intpuintpnp_uintpfloat32
np_float32float64
np_float64double	np_doublefloatingnp_floating	complex64np_complex64
complex128np_complex128cdouble
np_cdoublecomplexfloatingnp_complexfloatingImportErrornumpy_numbersnumpy_complex_numbersrv   numpy_dtypesr}   r   r   pydantic.mainr#   PydanticBaseModel	getLoggerloggerversion_infomajorpy_major_versionminorpy_minor_versionrV   py_current_versionpy2py3py4	frozensetdigitsr4   r   Enumr(   r:   rH   dictdict_warningexithasattrpypy3__version__bytesru   unicode_type
bytes_typecomplexr   r2   r5  only_numbersr   	timedelta	datetimesUUIDuuidstimesr   boolbooleansr   basic_typesrK   r   dirnameabspath__file__r   r   KEY_TO_VAL_STR	TREE_VIEW	TEXT_VIEW
DELTA_VIEWENUM_INCLUDE_KEYSrX   rZ   r^   rb   rd   rf   rh   r3   rk   unprocessedskipped
not_hashed
notpresent	RemapDictrn   rr   rx   r   r   r   r   r   r   r   r   r   r   r   r   DeprecationWarningr   r   r   r   r   	not_foundsimplefilterr   r   r   r   r  r  r  r  r  r'  r,  r7  r<  rJ  rQ  rS  rX  ra  rT  rk  rU  rl  r  rm  rV  rn  OPCODE_TAG_TO_FLAT_DATA_ACTIONrw   FLAT_DATA_ACTION_TO_OPCODE_TAGrz  ru  )rM   rF   rG   s   000r   <module>r     s   
 	 	         2 2  V V  6 	 		 	 
.,2 xxJxxHggGxxHxxHxxHxxH		I		I		IggGxxHJJ		I++K<<LMMMJ++ Xx8y)Wh
I{L:	  mZ  =!     %1 DMM4 1<
 
		8	$##)) ##)) W^^,<>NOP !!! V]]#sDII $Y  	
NNPQ
CCHHkl545 

/'
9CHH_`,
j#88 UGW-=x/A/A8==Q					HMM*

"(%'(2d4j^C*  ggoobggooh78			
5 	 	
 	j 		* 		
 	
 
	I 	 m
)[
\
 	0	# 	#2 


2' -3.(0 
	 <~	!3 	!
 
 K	   f8 9# #L&" m$3/sJ' 4"! 	:Z  48Y[_c !H
= 	*Z 	*HX H* n<<n;;~==OO^88	"  4R3W3W3Y!Z41a!Q$!Z  *: *a  !	B,JHGHHHHIIIGHJJIKLMJ -!v  101R "[s0   ;V 1W		W 2W1WWWW