
    hUx                     `   S r SSKrSSKJr  SSKrSSKrSSKJr  SSK	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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&S" r'S# r(S$ r)S% r*S& r+S<S' jr,\-" \.\/4S(4\.\/4S(4\.\/4S(4\0S(4\0S(4\0S(4S)9r1S* r2S<S+ jr3\-" \.\/4S(4\.\/4S(4\0S(4\0S(4\0S(4S,9r4S- r5S. r6S/ r7S0r8\-" \0S14\.\/4S(4\.\/4S(4\.\/4S(4\.\/4S(4\.\/4S(4\.\/4S(4\0S(4S29r9S3 r:S=S4 jr;S5 r<S6 r=S7 r>S8r?S9 r@S: rA\BS;:X  a  SSKCrC\CR                  " 5         gg)>z"Various low level data validators.    N)open)Mapping)numberTypesc                 f    [        U [        5      (       a  gS H  n[        X5      (       a  M    g   g)zM
Some objects will likely come in that aren't
dicts but are dict-ish enough.
T)keysvaluesitemsF)
isinstancer   hasattr)valueattrs     M/var/www/html/env/lib/python3.13/site-packages/fontTools/ufoLib/validators.pyisDictEnoughr      s1    
 %!!+u## ,     c                     [        X5      $ ) 
Generic. (Added at version 2.)
)r
   )r   typs     r   genericTypeValidatorr      s     e!!r   c                     [        U [        [        45      (       d  g[        U 5      n[        U5      nX#-
  (       a  gU  H  n[        U[        5      (       a  M    g   g)r   FT)r
   listtuplesetint)r   validValues	valuesSetvalidValuesSetr   s        r   genericIntListValidatorr   %   sS     ftUm,,FI%N!%%%  r   c                 >    [        U [        5      (       d  gU S:  a  gg 
Generic. (Added at version 3.)
Fr   Tr
   r   r   s    r   genericNonNegativeIntValidatorr#   5   !     eS!!qyr   c                 >    [        U [        5      (       d  gU S:  a  ggr   )r
   r   r"   s    r   !genericNonNegativeNumberValidatorr&   @   s!     e[))qyr   c                 >   [        U [        5      (       d  gUR                  5        H  u  nu  p4U(       d  M  X ;  d  M    g   U R                  5        H
  nX!;  d  M
    g   U R                  5        H)  u  p%X   u  pdUc	  U(       d  M  [        XV5      (       a  M)    g   g)r    FT)r
   r   r	   r   )r   	prototypekeyr   requiredvprototypeTypes          r   genericDictValidatorr-   K   s    
 eW%% ) 1_c	 !2 zz|  ++-"+.9X!++   r   c                     / SQnX;   $ )
Version 2+.
)regularitalicboldzbold italic )r   optionss     r   "fontInfoStyleMapStyleNameValidatorr5   m   s     ;Gr   c                 d   [        U [        5      (       d  g[        U 5      S:X  a  g/ SQn[        [        S4[        S4S9n/ nU  HX  n[        XB5      (       d    gUS   nUS   n[        U5      nU(       d    g[        Xa5      nU(       d    gUR                  U5        MZ     U[        U5      :w  a  gg)
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                    [        U [        5      (       d  g[        U 5      S:X  d  gU R                  S5      S:w  a  gU R	                  S5      u  pUR                  S5      S:w  a  gUR                  S5      S:w  a  gUR	                  S5      u  p4n[        U5      S:w  a  g[        U5      S:w  a  g[        U5      S:w  a  g [        U5      n[        U5      n[        U5      nUS:  d  US	:  a  g[        R                  " X45      S   nUS:  d  XV:  a  gUR	                  S5      u  pxn	[        U5      S:w  a  g[        U5      S:w  a  g[        U	5      S:w  a  g [        U5      n[        U5      n[        U	5      n	US
:  d  US:  a  gUS
:  d  US:  a  gU	S
:  d  U	S:  a  gg! [         a     gf = f! [         a     gf = f)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%%d215K
Qw##::c?D&
4yA~
6{a
6{a4yVV ax4"9zVb[zVb[9  &  s$   !F" !F2 "
F/.F/2
F?>F?c                     [        U [        5      (       d  g[        [        S4[        S4[        S4[        S4[        S4S9nU  H  n[        X!5      (       a  M    g   g)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                 >    [        U [        5      (       d  gU S:  a  gg)r/   Fr   Tr!   r"   s    r   'fontInfoOpenTypeOS2WeightClassValidatorrl      r$   r   c                 L    [        U [        5      (       d  gU S:  a  gU S:  a  gg)r/   Fr8   	   Tr!   r"   s    r   &fontInfoOpenTypeOS2WidthClassValidatorro      s+     eS!!qyqyr   c                     [        U [        [        45      (       d  g[        U 5      S:w  a  gU  H  n[        U[        5      (       a  M    g   g)z
Version 2.
F
   Tr
   r   r   r=   r   r   r   s     r   *fontInfoVersion2OpenTypeOS2PanoseValidatorrt      sF     ftUm,,
6{b%%%  r   c                     [        U [        [        45      (       d  g[        U 5      S:w  a  gU  H"  n[        U[        5      (       d    gUS:  d  M"    g   g)r7   Frq   r   Trr   rs   s     r   *fontInfoVersion3OpenTypeOS2PanoseValidatorrv     sP     ftUm,,
6{b%%%19	  r   c                     [        U [        [        45      (       d  g[        U 5      S:w  a  gU  H  n[        U[        5      (       a  M    g   U u  p#US:  d  US:  a  gUS:  d  US:  a  gg)r/   Fr9   r         Trr   )r   r   classID
subclassIDs       r   'fontInfoOpenTypeOS2FamilyClassValidatorr|     sn     ftUm,,
6{a%%%  !G{glA~br   c                     [        U [        [        45      (       d  g[        U 5      S:  a  g[        U 5      S-  (       a  gU  H  n[        U[        5      (       a  M    g   g)r/   Frx   r9   Tr
   r   r   r=   r   rs   s     r    fontInfoPostscriptBluesValidatorr   +  T     ftUm,,
6{R
6{Q%--  r   c                     [        U [        [        45      (       d  g[        U 5      S:  a  g[        U 5      S-  (       a  gU  H  n[        U[        5      (       a  M    g   g)r/   Frq   r9   Tr~   rs   s     r   %fontInfoPostscriptOtherBluesValidatorr   ;  r   r   c                     [        U [        [        45      (       d  g[        U 5      S:  a  gU  H  n[        U[        5      (       a  M    g   g)r/   FrP   Tr~   rs   s     r    fontInfoPostscriptStemsValidatorr   K  sF     ftUm,,
6{R%--  r   c                 :    [        [        SS5      5      nX;  a  gg)r/   r8      FT)r   range)r   r   s     r   .fontInfoPostscriptWindowsCharacterSetValidatorr   Y  s      uQ|$Kr   c                 D    [        [        S4S9n[        X5      (       d  gg)r7   T)idF)r>   rS   r-   r   rB   s     r   %fontInfoWOFFMetadataUniqueIDValidatorr   c  s#     S$K(M55r   c                     [         S4[         S4[         S4[         S4S.n[        X5      (       d  gSU ;   a  U R                  S5      S;  a  gg)r7   TF)nameurldirclassr   ltrrtlrS   r-   getr   s     r   #fontInfoWOFFMetadataVendorValidatorr   m  sT    
 dU|U|u	M  55~%))E*.@r   c                 2   [        [        S4S9n[        X5      (       d  g[        U S   5      (       d  g[        S4[        S4[        S4[        S4[        S4S.nU S    H4  n[        X!5      (       d    gSU;   d  M  UR                  S5      S;  d  M4    g   g)r7   T)creditsFr   )r   r   roler   r   r   r   )r>   r   r-   r=   rS   r   )r   rB   credits      r   $fontInfoWOFFMetadataCreditsValidatorr   ~  s     $.M55uY  dU|eU|uM 	"#F::F?vzz%0F	 #
 r   c                     [        [        S4[        S4S9n[        X5      (       d  gU S    H  n[	        U5      (       a  M    g   g)r7   FT)r   textr   r>   rS   r   r-   fontInfoWOFFMetadataTextValuer   rB   r   s      r   (fontInfoWOFFMetadataDescriptionValidatorr     sG     c5\t=M55f,T22  r   c                     [        [        S4[        S4[        S4S9n[        X5      (       d  gSU ;   a  U S    H  n[	        U5      (       a  M    g   g)r7   F)r   r   r   r   Tr   r   s      r   $fontInfoWOFFMetadataLicenseValidatorr     sT     c5\u3,OM55&MD066 " r   c                     [        [        S4S9n[        X5      (       d  gU S    H  n[        U5      (       a  M    g   gr7   T)r   Fr   r>   r   r-   r   r   s      r   &fontInfoWOFFMetadataTrademarkValidatorr     A     tTl+M55f,T22  r   c                     [        [        S4S9n[        X5      (       d  gU S    H  n[        U5      (       a  M    g   gr   r   r   s      r   &fontInfoWOFFMetadataCopyrightValidatorr     r   r   c                     [         S4[         S4[         S4S.n[        X5      (       d  gSU ;   a  U R                  S5      S;  a  gg)r7   TF)r   r   r   r   r   r   r   s     r   %fontInfoWOFFMetadataLicenseeValidatorr     sG     "4[#ueUM55~%))E*.@r   c                     [         S4[         S4[         S4[         S4S.n[        X5      (       d  gSU ;   a  U R                  S5      S;  a  ggr7   TF)r   languager   r   r   r   r   r   s     r   r   r     T    
 d%LU|u	M  55~%))E*.@r   c                 v    [        U [        5      (       d  gU (       d  gU  H  n[        U5      (       a  M    g   g)r7   FT)r
   r   &fontInfoWOFFMetadataExtensionValidator)r   	extensions     r   'fontInfoWOFFMetadataExtensionsValidatorr     s7     eT""	5i@@  r   c                     [        [        S4[        S4[        S4S9n[        X5      (       d  gSU ;   a  U S    H  n[	        U5      (       a  M    g   U S    H  n[        U5      (       a  M    g   g)r7   FT)namesr	   r   r   r	   )r>   r   rS   r-   *fontInfoWOFFMetadataExtensionNameValidator*fontInfoWOFFMetadataExtensionItemValidator)r   rB   r   items       r   r   r     ss     e}T4Lc5\RM55%'ND=dCC # g9$??  r   c                     [        [        S4[        S4[        S4S9n[        X5      (       d  gU S    H  n[	        U5      (       a  M    g   U S    H  n[        U5      (       a  M    g   g)r7   FT)r   r   r   r   r   )r>   rS   r   r-   r   +fontInfoWOFFMetadataExtensionValueValidator)r   rB   r   vals       r   r   r     sk     S%LtdD\RM55g9$??  X:3??  r   c                     [         S4[         S4[         S4[         S4S.n[        X5      (       d  gSU ;   a  U R                  S5      S;  a  ggr   r   r   s     r   r   r     r   r   c                     [         S4[         S4[         S4[         S4S.n[        X5      (       d  gSU ;   a  U R                  S5      S;  a  ggr   r   r   s     r   r   r   (  r   r   c                     [        U [        5      (       d  gUc
  [        5       nU  HC  n[        U5      (       d    gUR	                  S5      nUc  M+  X1;   a    gUR                  U5        ME     gr7   F
identifierT)r
   r   r   guidelineValidatorr   add)r   identifiersguider   s       r   guidelinesValidatorr   >  sg     eT""e!%((YY|,
!(OOJ'  r   F)xyangler   colorr   c                    [        U [        5      (       d  gU R                  S5      nU R                  S5      nU R                  S5      nUc  Uc  gUb  Uc  Ub  gUb  Ub  Uc  gUb  US:  a  gUS:  a  gU R                  S5      nUb  [        U5      (       d  gU R                  S5      nUb  [	        U5      (       d  gg	)
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&EIIgE!6!6r   c                     [        U [        5      (       d  gUc
  [        5       nU  HC  n[        U5      (       d    gUR	                  S5      nUc  M+  X1;   a    gUR                  U5        ME     gr   )r
   r   r   anchorValidatorr   r   )r   r   anchorr   s       r   anchorsValidatorr     sg     eT""ev&&ZZ-
!(OOJ'  r   )r   r   r   r   r   c                    [        U [        5      (       d  gU R                  S5      nU R                  S5      nUb  Uc  gU R                  S5      nUb  [        U5      (       d  gU R                  S5      nUb  [	        U5      (       d  gg)r7   Fr   r   r   r   T)r-   _anchorDictPrototyper   r   r   )r   r   r   r   r   s        r   r   r     s      ';<<		#A		#AyAI<(J&9*&E&EIIgE!6!6r   c                     SnSn[        U [        5      (       d  gU (       d  g[        U 5      S:  a  gU  H  n[        U5      nX1:  d  X2:  d  M    g   g)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                 `   [        U [        5      (       d  gU R                  S5      n[        U5      S:w  a  gU HQ  nUR	                  5       nSn [        U5      nSnU(       d   [        U5      nSnU(       d    gUS:  a    gUS:  d  MQ    g   g! [         a     N?f = f! [         a     N:f = f)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$   B%B 
BB 
B-,B-s   PNG

T)fileNamexScalexyScaleyxScaleyScalexOffsetyOffsetr   c                     [        U [        5      (       d  gU S   (       d  gU R                  S5      nUb  [        U5      (       d  gg)r7   Fr   r   T)r-   _imageDictPrototyper   r   )r   r   s     r   imageValidatorr   3  sD      ':;;IIgE!6!6r   c                 "   U c  Uc  Uc   eU b'  [        U S5       nUR                  S5      nSSS5        O>Ub  USS nO5Ub2  UR                  5       nUR                  S5      nUR                  U5        W[        :w  a  gg! , (       d  f       N= f)z;
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   B  
Bc                 F   [        U[        R                  R                  5      (       a  UnO[        R                  R                  U5      nSn[        U [        5      (       d  SU4$ [        5       n[        5       n0 nU  GH  n[        U[        5      (       d  SU4s  $ [        U5      S:X  d  SU4s  $ U H   n[        U[        5      (       a  M  SU4s  s  $    Uu  pU
S:w  a  U
R                  S5      (       d	  SSU
-  4s  $ [        U	5      S:X  a    gUR                  U
5      (       d	  SS	U
-  4s  $ U	S
:X  a  U
S:w  a    gX;   a	  SSU	-  4s  $ UR                  U	5        X;   a	  SSU
-  4s  $ UR                  U
5        XU	'   GM     SUR                  5       ;   nU(       d  gg)z8
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2(
WW\\"56
JeT""&&&UNeOH%&&***5zQ***Aa%%...  $) 	H$ ++I66I#$ 
 y>QD  //<}LLL((]h-F
 &CiO  	9%+B]R  	M*+W Z x00LIr   c                 h   Sn[        U 5      (       d  SU4$ 0 n0 nU R                  5        GH  u  pE[        U[        5      (       d  SU4s  $ [        U[        [
        45      (       d  SU4s  $ U(       d    gUR                  S5      (       d  Mc  UR                  S5      (       d  UR                  S5      (       d  M  [        S5      [        U5      :X  a    gUR                  S5      (       a  UnOUnU H7  n[        U[        5      (       d  SS	U-  4s  s  $ Xv;   a  SS
U-  4s  s  $ XFU'   M9     GM     g)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    sF   X H((( %	)c++,,,)dE]33,,,6	**''88AUAUB B '3y>9 ##O44$%&	!)S11G)S  >KiW   )) '/ !.F r   c                 ~   Sn[        U [        5      (       d  SU4$ U R                  5        H  u  p#[        U[        5      (       d  SU4s  $ [        U[        5      (       d  SU4s  $ UR                  5        H?  u  pE[        U[        5      (       d  SU4s  s  $ [        U[        5      (       a  M9  SU4s  s  $    M     g)a  
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\%%%,,,J00,,,'--/MFfc**000{33000	 0 * r   z-The lib data is not in the correct format: %sc                    [        U 5      (       d#  S[        U 5      R                  -  nS[        U-  4$ U R	                  5        H  u  p [        U[        5      (       d!  SS[        U5      R                  < SU< 34s  $ US:X  d  MC  Sn[        U [        [        45      (       d   S[        U 5      R                  -  nSX1-  4s  $ U  H:  n[        U[        5      (       a  M  S[        U5      R                  -  nSX1-  4s  s  $    M     g	)
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
#s##9%%s, 
 %%%V"edE]33;d5k>R>RR4==="	!)S115Y8P8PPF "8"AAA # $  r   c                    [        U 5      (       d#  S[        U 5      R                  -  nS[        U-  4$ U R	                  5        HF  u  p [        U[        5      (       d  SU-  nS[        U-  4s  $ US:X  d  M4  [        U 5      (       a  MF    g   g)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
#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OO r   