
    McgUx                     j   d Z ddlZddlmZ ddlZddlZddlmZ ddl	m
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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<d'Z, e-e.e/fd(fe.e/fd(fe.e/fd(fe0d(fe0d(fe0d(f)      Z1d* Z2d<d+Z3 e-e.e/fd(fe.e/fd(fe0d(fe0d(fe0d(f,      Z4d- Z5d. Z6d/ Z7d0Z8 e-e0d1fe.e/fd(fe.e/fd(fe.e/fd(fe.e/fd(fe.e/fd(fe.e/fd(fe0d(f2      Z9d3 Z:d=d4Z;d5 Z<d6 Z=d7 Z>d8Z?d9 Z@d: ZAeBd;k(  rddlCZC eCj                          yy)>z"Various low level data validators.    N)open)Mapping)numberTypesc                 P    t        | t              rydD ]  }t        | |      r y y)zY
    Some objects will likely come in that aren't
    dicts but are dict-ish enough.
    T)keysvaluesitemsF)
isinstancer   hasattr)valueattrs     V/var/www/html/bid-api/venv/lib/python3.12/site-packages/fontTools/ufoLib/validators.pyisDictEnoughr      s-    
 %!+ud# ,     c                     t        | |      S )(
    Generic. (Added at version 2.)
    )r
   )r   typs     r   genericTypeValidatorr      s     eS!!r   c                     t        | t        t        f      syt        |       }t        |      }||z
  ry| D ]  }t        |t              r y y)r   FT)r
   listtuplesetint)r   validValues	valuesSetvalidValuesSetr   s        r   genericIntListValidatorr   %   sO     ftUm,FI%N>!%%  r   c                 2    t        | t              sy| dk  ryy(
    Generic. (Added at version 3.)
    Fr   Tr
   r   r   s    r   genericNonNegativeIntValidatorr#   5        eS!qyr   c                 2    t        | t              sy| dk  ryyr   )r
   r   r"   s    r   !genericNonNegativeNumberValidatorr&   @   s     e[)qyr   c                 
   t        | t              sy|j                         D ]  \  }\  }}|s|| vs y | j                         D ]  }||vs y | j                         D ]   \  }}||   \  }}||st        ||      r  y y)r    FT)r
   r   r	   r   )r   	prototypekeyr   requiredvprototypeTypes          r   genericDictValidatorr-   K   s    
 eW% ) 1_c8e	 !2 zz|i  ++-Q"+C.x9X!]+   r   c                     g d}| |v S )
    Version 2+.
    )regularitalicboldzbold italic )r   optionss     r   "fontInfoStyleMapStyleNameValidatorr5   m   s     ;GGr   c                 >   t        | t              syt        |       dk(  ryg d}t        t        dft        df      }g }| D ]J  }t        ||      s y|d   }|d   }t        |      }|s yt        ||      }|s y|j                  |       L |t        |      k7  ryy)
    Version 3+.
    Fr   T)r            )rangeMaxPPEMrangeGaspBehaviorr;   r<   )
r
   r   lendictr   r-   r#   r   appendsorted)	r   validBehaviorsdictPrototype	ppemOrderrangeRecordppembehaviorppemValiditybehaviorValiditys	            r   )fontInfoOpenTypeGaspRangeRecordsValidatorrI   u   s     eT"
5zQ!NsDkdD\RMI#K?>*235d;28^L  F9%%r   c                 V   t        | t              syt        |       dk(  sy| j                  d      dk7  ry| j	                  d      \  }}|j                  d      dk7  ry|j                  d      dk7  ry|j	                  d      \  }}}t        |      dk7  ryt        |      dk7  ryt        |      dk7  ry	 t        |      }t        |      }t        |      }|dk  s|d	kD  ryt        j                  ||      d   }|dk  s||kD  ry|j	                  d      \  }}}	t        |      dk7  ryt        |      dk7  ryt        |	      dk7  ry	 t        |      }t        |      }t        |	      }	|d
k  s|dkD  ry|d
k  s|dkD  ry|	d
k  s|	dkD  ryy# t        $ r Y yw xY w# t        $ r Y yw xY w)r/   F    r8   /r9   :      r      ;   T)	r
   strr=   countsplitr   
ValueErrorcalendar
monthrange)
r   datetimeyearmonthdaymonthMaxDayhourminuteseconds
             r   $fontInfoOpenTypeHeadCreatedValidatorrb      s   
 eS!u:{{31S!JD$zz#!zz#!zz#D%
4yA~
5zQ
3x1}4yE
#h qyEBJ%%dE215K
Qw##::c?D&&
4yA~
6{a
6{a4yVV ax4"9zVb[zVb[9  &  s$   7!F 
!F 	FF	F('F(c                     t        | t              syt        t        dft        dft        dft        dft        df      }| D ]  }t        ||      r y y)r7   FT)nameID
platformID
encodingID
languageIDstring)r
   r   r>   r   rS   r-   )r   rB   
nameRecords      r   $fontInfoOpenTypeNameRecordsValidatorrj      s\     eT"T{;;;T{M 
#J>  r   c                 2    t        | t              sy| dk  ryy)r/   Fr   Tr!   r"   s    r   'fontInfoOpenTypeOS2WeightClassValidatorrl      r$   r   c                 >    t        | t              sy| dk  ry| dkD  ryy)r/   Fr8   	   Tr!   r"   s    r   &fontInfoOpenTypeOS2WidthClassValidatorro      s(     eS!qyqyr   c                     t        | t        t        f      syt        |       dk7  ry| D ]  }t        |t              r y y)z
    Version 2.
    F
   Tr
   r   r   r=   r   r   r   s     r   *fontInfoVersion2OpenTypeOS2PanoseValidatorrt      s@     ftUm,
6{b%%  r   c                     t        | t        t        f      syt        |       dk7  ry| D ]  }t        |t              s y|dk  s y y)r7   Frq   r   Trr   rs   s     r   *fontInfoVersion3OpenTypeOS2PanoseValidatorrv     sJ     ftUm,
6{b%%19	  r   c                     t        | t        t        f      syt        |       dk7  ry| D ]  }t        |t              r y | \  }}|dk  s|dkD  ry|dk  s|dkD  ryy)r/   Fr9   r         Trr   )r   r   classID
subclassIDs       r   'fontInfoOpenTypeOS2FamilyClassValidatorr|     sj     ftUm,
6{a%%  !GZ{glA~br   c                     t        | t        t        f      syt        |       dkD  ryt        |       dz  ry| D ]  }t        |t              r y y)r/   Frx   r9   Tr
   r   r   r=   r   rs   s     r    fontInfoPostscriptBluesValidatorr   +  N     ftUm,
6{R
6{Q%-  r   c                     t        | t        t        f      syt        |       dkD  ryt        |       dz  ry| D ]  }t        |t              r y y)r/   Frq   r9   Tr~   rs   s     r   %fontInfoPostscriptOtherBluesValidatorr   ;  r   r   c                     t        | t        t        f      syt        |       dkD  ry| D ]  }t        |t              r y y)r/   FrP   Tr~   rs   s     r    fontInfoPostscriptStemsValidatorr   K  s@     ftUm,
6{R%-  r   c                 8    t        t        dd            }| |vryy)r/   r8      FT)r   range)r   r   s     r   .fontInfoPostscriptWindowsCharacterSetValidatorr   Y  s"     uQ|$KKr   c                 B    t        t        df      }t        | |      syy)r7   T)idF)r>   rS   r-   r   rB   s     r   %fontInfoWOFFMetadataUniqueIDValidatorr   c  s"     S$K(M}5r   c                     t         dft         dft         dft         dfd}t        | |      syd| v r| j                  d      dvryy)r7   TF)nameurldirclassr   ltrrtlrS   r-   getr   s     r   #fontInfoWOFFMetadataVendorValidatorr   m  sS    
 dU|U|u	M  }5~%))E*.@r   c                    t        t        df      }t        | |      syt        | d         syt        dft        dft        dft        dft        dfd}| d   D ]*  }t        ||      s yd|v s|j                  d      dvs* y y)r7   T)creditsFr   )r   r   roler   r   r   r   )r>   r   r-   r=   rS   r   )r   rB   credits      r   $fontInfoWOFFMetadataCreditsValidatorr   ~  s     $.M}5uY dU|eU|uM 	"#FM:F?vzz%0F	 #
 r   c                 ~    t        t        dft        df      }t        | |      sy| d   D ]  }t	        |      r y y)r7   FT)r   textr   r>   rS   r   r-   fontInfoWOFFMetadataTextValuer   rB   r   s      r   (fontInfoWOFFMetadataDescriptionValidatorr     sC     c5\t=M}5f,T2  r   c                     t        t        dft        dft        df      }t        | |      syd| v r| d   D ]  }t	        |      r y y)r7   F)r   r   r   r   Tr   r   s      r   $fontInfoWOFFMetadataLicenseValidatorr     sP     c5\u3,OM}5&MD06 " r   c                 p    t        t        df      }t        | |      sy| d   D ]  }t        |      r y yr7   T)r   Fr   r>   r   r-   r   r   s      r   &fontInfoWOFFMetadataTrademarkValidatorr     =     tTl+M}5f,T2  r   c                 p    t        t        df      }t        | |      sy| d   D ]  }t        |      r y yr   r   r   s      r   &fontInfoWOFFMetadataCopyrightValidatorr     r   r   c                 ~    t         dft         dft         dfd}t        | |      syd| v r| j                  d      dvryy)r7   TF)r   r   r   r   r   r   r   s     r   %fontInfoWOFFMetadataLicenseeValidatorr     sF     "4[#ueUM}5~%))E*.@r   c                     t         dft         dft         dft         dfd}t        | |      syd| v r| j                  d      dvryyr7   TF)r   languager   r   r   r   r   r   s     r   r   r     S    
 d%LU|u	M  }5~%))E*.@r   c                 T    t        | t              sy| sy| D ]  }t        |      r y y)r7   FT)r
   r   &fontInfoWOFFMetadataExtensionValidator)r   	extensions     r   'fontInfoWOFFMetadataExtensionsValidatorr     s1     eT"	5i@  r   c                     t        t        dft        dft        df      }t        | |      syd| v r| d   D ]  }t	        |      r y | d   D ]  }t        |      r y y)r7   FT)namesr	   r   r   r	   )r>   r   rS   r-   *fontInfoWOFFMetadataExtensionNameValidator*fontInfoWOFFMetadataExtensionItemValidator)r   rB   r   items       r   r   r     sl     e}T4Lc5\RM}5%'ND=dC # g9$?  r   c                     t        t        dft        dft        df      }t        | |      sy| d   D ]  }t	        |      r y | d   D ]  }t        |      r y y)r7   FT)r   r   r   r   r   )r>   rS   r   r-   r   +fontInfoWOFFMetadataExtensionValueValidator)r   rB   r   vals       r   r   r     sd     S%LtdD\RM}5g9$?  X:3?  r   c                     t         dft         dft         dft         dfd}t        | |      syd| v r| j                  d      dvryyr   r   r   s     r   r   r     r   r   c                     t         dft         dft         dft         dfd}t        | |      syd| v r| j                  d      dvryyr   r   r   s     r   r   r   (  r   r   c                     t        | t              sy|
t               }| D ]:  }t        |      s y|j	                  d      }|$||v r y|j                  |       < yr7   F
identifierT)r
   r   r   guidelineValidatorr   add)r   identifiersguider   s       r   guidelinesValidatorr   >  sc     eT"e!%(YY|,
![(OOJ'  r   F)xyangler   colorr   c                 J   t        | t              sy| j                  d      }| j                  d      }| j                  d      }||y|||y|||y||dk  ry|dkD  ry| j                  d      }|t        |      sy| j                  d      }|t	        |      syy	)
r7   Fr   r   r   r   ih  r   r   T)r-   _guidelineDictPrototyper   identifierValidatorcolorValidator)r   r   r   r   r   r   s         r   r   r   [  s      '>?		#A		#AIIgEyQYyAI}5=193;<(J&9*&EIIgE!6r   c                     t        | t              sy|
t               }| D ]:  }t        |      s y|j	                  d      }|$||v r y|j                  |       < yr   )r
   r   r   anchorValidatorr   r   )r   r   anchorr   s       r   anchorsValidatorr     sc     eT"ev&ZZ-
![(OOJ'  r   )r   r   r   r   r   c                     t        | t              sy| j                  d      }| j                  d      }||y| j                  d      }|t        |      sy| j                  d      }|t	        |      syy)r7   Fr   r   r   r   T)r-   _anchorDictPrototyper   r   r   )r   r   r   r   r   s        r   r   r     sx      ';<		#A		#AyAI<(J&9*&EIIgE!6r   c                     d}d}t        | t              sy| syt        |       dkD  ry| D ]  }t        |      }||k  s||kD  s y y)z
    Version 3+.

    >>> identifierValidator("a")
    True
    >>> identifierValidator("")
    False
    >>> identifierValidator("a" * 101)
    False
        ~   Fd   T)r
   rS   r=   ord)r   validCharactersMinvalidCharactersMaxcs       r   r   r     s^     eS!
5zCF!!Q);%;  r   c                 4   t        | t              sy| j                  d      }t        |      dk7  ry|D ]D  }|j	                         }d}	 t        |      }d}|s	 t        |      }d}|s y|dk  r y|dkD  sD y y# t        $ r Y 0w xY w# t        $ r Y /w xY w)a  
    Version 3+.

    >>> colorValidator("0,0,0,0")
    True
    >>> colorValidator(".5,.5,.5,.5")
    True
    >>> colorValidator("0.5,0.5,0.5,0.5")
    True
    >>> colorValidator("1,1,1,1")
    True

    >>> colorValidator("2,0,0,0")
    False
    >>> colorValidator("0,2,0,0")
    False
    >>> colorValidator("0,0,2,0")
    False
    >>> colorValidator("0,0,0,2")
    False

    >>> colorValidator("1r,1,1,1")
    False
    >>> colorValidator("1,1g,1,1")
    False
    >>> colorValidator("1,1,1b,1")
    False
    >>> colorValidator("1,1,1,1a")
    False

    >>> colorValidator("1 1 1 1")
    False
    >>> colorValidator("1 1,1,1")
    False
    >>> colorValidator("1,1 1,1")
    False
    >>> colorValidator("1,1,1 1")
    False

    >>> colorValidator("1, 1, 1, 1")
    True
    F,rO   Tr   r8   )r
   rS   rU   r=   stripr   rV   float)r   partspart	converteds       r   r   r     s    V eS!KKE
5zQzz|		t9DI T{ 	 !8!8' (   		  s$   
A<B<	BB	BBs   PNG

T)fileNamexScalexyScaleyxScaleyScalexOffsetyOffsetr   c                 p    t        | t              sy| d   sy| j                  d      }|t        |      syy)r7   Fr   r   T)r-   _imageDictPrototyper   r   )r   r   s     r   imageValidatorr   3  s>      ':;IIgE!6r   c                 
   | ||J | 't        | d      5 }|j                  d      }ddd       n<||dd }n4|2|j                         }|j                  d      }|j                  |       t        k7  ryy# 1 sw Y   xY w)zG
    Version 3+.

    This checks the signature of the image data.
    Nrb   )Fz,Image does not begin with the PNG signature.TN)r   readtellseekpngSignature)pathdatafileObjf	signatureposs         r   pngValidatorr   C  s     t/73FFF$q	I 		!H			llnLLO	SL D s   A99Bc                    t        |t        j                  j                        r|}nt        j                  j                  |      }d}t        | t              sd|fS t               }t               }i }| D ]  }t        |t              sd|fc S t        |      dk(  sd|fc S |D ]  }t        |t              rd|fc c S  |\  }	}
|
dk7  r|
j                  d      s	dd|
z  fc S t        |	      dk(  r y|j                  |
      s	dd	|
z  fc S |	d
k(  r|
dk7  r y|	|v r	dd|	z  fc S |j                  |	       |
|v r	dd|
z  fc S |j                  |
       |
||	<    d|j                         v }|syy)zD
    Check the validity of layercontents.plist.
    Version 3+.
    z1layercontents.plist in not in the correct format.Fr9   glyphszglyphs.z3Invalid directory name (%s) in layercontents.plist.r   )Fz(Empty layer name in layercontents.plist.z A glyphset does not exist at %s.zpublic.default)FzIThe name public.default is being used by a layer that is not the default.z1The layer name %s is used by more than one layer.z0The directory %s is used by more than one layer.)Fz1The required default glyph set is not in the UFO.r   )r
   fsbaseFSosfsOSFSr   r   r=   rS   
startswithexistsr   r   )r   ufoPathOrFileSystem
fileSystembogusFileMessageusedLayerNamesusedDirectoriescontentsentryi	layerNamedirectoryNamefoundDefaults               r   layerContentsValidatorr  ]  s   
 %rwwzz2(
WW\\"56
JeT"&&&UNeOH%&***5zQ***Aa%...  $) 	=H$ ++I6I#$ 
 y>QD  /<}LLL((]h-F
 &CiO  	9%O+B]R  	M*+W Z x00LIr   c                    d}t        |       sd|fS i }i }| j                         D ]  \  }}t        |t              sd|fc S t        |t        t
        f      sd|fc S |s y|j                  d      sN|j                  d      s|j                  d      sqt        d      t        |      k(  r y|j                  d      r|}n|}|D ]1  }t        |t              sdd	|z  fc c S ||v rdd
|z  fc c S |||<   3  y)a  
    Check the validity of the groups.
    Version 3+ (though it's backwards compatible with UFO 1 and UFO 2).

    >>> groups = {"A" : ["A", "A"], "A2" : ["A"]}
    >>> groupsValidator(groups)
    (True, None)

    >>> groups = {"" : ["A"]}
    >>> valid, msg = groupsValidator(groups)
    >>> valid
    False
    >>> print(msg)
    A group has an empty name.

    >>> groups = {"public.awesome" : ["A"]}
    >>> groupsValidator(groups)
    (True, None)

    >>> groups = {"public.kern1." : ["A"]}
    >>> valid, msg = groupsValidator(groups)
    >>> valid
    False
    >>> print(msg)
    The group data contains a kerning group with an incomplete name.
    >>> groups = {"public.kern2." : ["A"]}
    >>> valid, msg = groupsValidator(groups)
    >>> valid
    False
    >>> print(msg)
    The group data contains a kerning group with an incomplete name.

    >>> groups = {"public.kern1.A" : ["A"], "public.kern2.A" : ["A"]}
    >>> groupsValidator(groups)
    (True, None)

    >>> groups = {"public.kern1.A1" : ["A"], "public.kern1.A2" : ["A"]}
    >>> valid, msg = groupsValidator(groups)
    >>> valid
    False
    >>> print(msg)
    The glyph "A" occurs in too many kerning groups.
    z,The group data is not in the correct format.F)FzA group has an empty name.zpublic.zpublic.kern1.zpublic.kern2.zpublic.kernN.)Fz@The group data contains a kerning group with an incomplete name.z-The group data %s contains an invalid member.z1The glyph "%s" occurs in too many kerning groups.r   )r   r	   r
   rS   r   r   r  r=   )r   bogusFormatMessagefirstSideMappingsecondSideMapping	groupName	glyphListd	glyphNames           r   groupsValidatorr    s1   X H((( %	9)c+,,,)dE]3,,,6	*''8AUAUB '3y>9 ##O4$%&	!)S1G)S  >KiW   )) '/ !.F r   c                 H   d}t        | t              sd|fS | j                         D ]y  \  }}t        |t              sd|fc S t        |t              sd|fc S |j                         D ]5  \  }}t        |t              sd|fc c S t        |t              r/d|fc c S  { y)aA  
    Check the validity of the kerning data structure.
    Version 3+ (though it's backwards compatible with UFO 1 and UFO 2).

    >>> kerning = {"A" : {"B" : 100}}
    >>> kerningValidator(kerning)
    (True, None)

    >>> kerning = {"A" : ["B"]}
    >>> valid, msg = kerningValidator(kerning)
    >>> valid
    False
    >>> print(msg)
    The kerning data is not in the correct format.

    >>> kerning = {"A" : {"B" : "100"}}
    >>> valid, msg = kerningValidator(kerning)
    >>> valid
    False
    >>> print(msg)
    The kerning data is not in the correct format.
    z.The kerning data is not in the correct format.Fr   )r
   r   r	   rS   r   )r   r  first
secondDictra   r   s         r   kerningValidatorr    s    . JdG$(((!ZZ\z%%,,,J0,,,'--/MFEfc*000{3000	 0 * r   z-The lib data is not in the correct format: %sc                    t        |       s#dt        |       j                  z  }dt        |z  fS | j	                         D ]  \  }} t        |t              sddt        |      j                  d|fc S |dk(  s;d}t        | t        t        f      s!dt        |       j                  z  }d||z  fc S | D ]5  }t        |t              rdt        |      j                  z  }d||z  fc c S   y	)
a  
    Check the validity of the lib.
    Version 3+ (though it's backwards compatible with UFO 1 and UFO 2).

    >>> lib = {"foo" : "bar"}
    >>> fontLibValidator(lib)
    (True, None)

    >>> lib = {"public.awesome" : "hello"}
    >>> fontLibValidator(lib)
    (True, None)

    >>> lib = {"public.glyphOrder" : ["A", "C", "B"]}
    >>> fontLibValidator(lib)
    (True, None)

    >>> lib = "hello"
    >>> valid, msg = fontLibValidator(lib)
    >>> valid
    False
    >>> print(msg)  # doctest: +ELLIPSIS
    The lib data is not in the correct format: expected a dictionary, ...

    >>> lib = {1: "hello"}
    >>> valid, msg = fontLibValidator(lib)
    >>> valid
    False
    >>> print(msg)
    The lib key is not properly formatted: expected str, found int: 1

    >>> lib = {"public.glyphOrder" : "hello"}
    >>> valid, msg = fontLibValidator(lib)
    >>> valid
    False
    >>> print(msg)  # doctest: +ELLIPSIS
    public.glyphOrder is not properly formatted: expected list or tuple,...

    >>> lib = {"public.glyphOrder" : ["A", 1, "B"]}
    >>> valid, msg = fontLibValidator(lib)
    >>> valid
    False
    >>> print(msg)  # doctest: +ELLIPSIS
    public.glyphOrder is not properly formatted: expected str,...
    expected a dictionary, found %sFz;The lib key is not properly formatted: expected str, found z: zpublic.glyphOrderz/public.glyphOrder is not properly formatted: %sz expected list or tuple, found %szexpected str, found %sr   )	r   type__name___bogusLibFormatMessager	   r
   rS   r   r   )r   reasonr)   bogusGlyphOrderMessager  s        r   fontLibValidatorr'  1  s    Z 2T%[5I5II,v555kkm
U#s#9%%s, 
 %%%V"edE]3;d5k>R>RR4v==="	!)S15Y8P8PPF "86"AAA # $  r   c                     t        |       s#dt        |       j                  z  }dt        |z  fS | j	                         D ]:  \  }} t        |t              sd|z  }dt        |z  fc S |dk(  s.t        |       r: y y)a,  
    Check the validity of the lib.
    Version 3+ (though it's backwards compatible with UFO 1 and UFO 2).

    >>> lib = {"foo" : "bar"}
    >>> glyphLibValidator(lib)
    (True, None)

    >>> lib = {"public.awesome" : "hello"}
    >>> glyphLibValidator(lib)
    (True, None)

    >>> lib = {"public.markColor" : "1,0,0,0.5"}
    >>> glyphLibValidator(lib)
    (True, None)

    >>> lib = {"public.markColor" : 1}
    >>> valid, msg = glyphLibValidator(lib)
    >>> valid
    False
    >>> print(msg)
    public.markColor is not properly formatted.
    r!  Fzkey (%s) should be a stringzpublic.markColor)Fz+public.markColor is not properly formatted.r   )r   r"  r#  r$  r	   r
   rS   r   )r   r%  r)   s      r   glyphLibValidatorr)  y  s    0 2T%[5I5II,v555kkm
U#s#2S8F06999$$!%(K $ r   __main__)N)NNN)E__doc__rW   ior   fs.baser   fs.osfscollections.abcr   fontTools.ufoLib.utilsr   r   r   r   r#   r&   r-   r5   rI   rb   rj   rl   ro   rt   rv   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r>   r   r   rS   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r$  r'  r)  r#  doctesttestmodr3   r   r   <module>r3     s   (     # .
" D89x&
"&  "0


	"" ",& U|UU|U<

u,U| !R& U|UU|U
u,U| 6>DV $4[%L% 5\5!5\5!%L% 5\5!5\5!,	  4BTTx$V I @P#L zGOO r   