ó
    oñ:iƒ~  ã                  óÆ  • % S r SSKJr  SSKrSSKJrJr  SSKJr  SSK	J
s  Jr  SSKJrJrJrJr  SSKJr  SSKJr  \\\\\\\\   S	4   4   \4   4   rSFS
 jrSGS jrSHS jrSFS jrSFS jr SIS jr!SFS jr"SFS jr#SFS jr$SFS jr%SFS jr&SFS jr'SJS jr(SJS jr)SJS jr*SJS jr+SJS jr,SJS jr-SFS jr.SFS jr/SFS jr0SFS  jr1SFS! jr2SFS" jr3SFS# jr4SFS$ jr5SFS% jr6SFS& jr7SFS' jr8SFS( jr9SFS) jr:SFS* jr;SFS+ jr<SKSLS, jjr=\" \>\?4S-4\>\?4S-4\>\?4S-4\S-4\S-4\S-4S.9r@S\AS/'   SFS0 jrBSKSLS1 jjrC\" \>\?4S-4\>\?4S-4\S-4\S-4\S-4S29rDS\AS3'   SFS4 jrESFS5 jrFSFS6 jrGS7rHS8\AS9'   \" \S:4\>\?4S-4\>\?4S-4\>\?4S-4\>\?4S-4\>\?4S-4\>\?4S-4\S-4S;9rIS\AS<'   S= rJ   SM       SNS> jjrK      SOS? jrLSPS@ jrMSQSA jrNSBrOSPSC jrPSPSD jrQ\RSE:X  a  SSKSrS\SR¨                  " 5         gg)Rz"Various low level data validators.é    )ÚannotationsN)ÚMappingÚSequence)Úopen)ÚAnyÚTypeÚOptionalÚUnion)ÚIntFloat)ÚnumberTypes.c                ó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     Ú^/srv/projetos/modelo_ml_acdoc/venv/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   € ô �fœt¤U˜m×,Ñ,ØÜ�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*   :   ó!   € ô �eœS×!Ñ!ØØˆqƒyØØr   c                ó>   • [        U [        5      (       d  gU S:  a  ggr&   )r   r   r)   s    r   Ú!genericNonNegativeNumberValidatorr-   E   s!   € ô �eœ[×)Ñ)ØØˆqƒyØØr   ÚGenericDictc                ó>  • [        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   ÚgenericDictValidatorr5   P   s‘   € ô
 �eœW×%Ñ%Øà )§¡Ö 1Ñˆ‰_ˆcÞÙØÕÙñ	 !2ð �z‰zŽ|ˆØÕÙñ ð —+‘+–-‰ˆØ"+¡.ÑˆØ‰9žXÙÜ˜!×+Ó+Ùñ  ð r   c                ó   • / SQnX;   $ )ú
Version 2+.
)ÚregularÚitalicÚboldzbold italic© )r   Úoptionss     r   Ú"fontInfoStyleMapStyleNameValidatorr=   r   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ÚrangeGaspBehaviorrC   rD   )
r   r   ÚlenÚdictr    r5   r*   r$   ÚappendÚsorted)	r   ÚvalidBehaviorsÚdictPrototypeÚ	ppemOrderÚrangeRecordÚppemÚbehaviorÚppemValidityÚbehaviorValiditys	            r   Ú)fontInfoOpenTypeGaspRangeRecordsValidatorrQ   z   s¶   € ô �eœT×"Ñ"ØÜ
ˆ5ƒz�QƒØÚ!€NÜ!%Ü˜4�[´T¸4°Lñ"€Mð €IÛˆÜ# K×?Ñ?ÙØ˜>Ñ*ˆØÐ2Ñ3ˆÜ5°dÓ;ˆÞÙÜ2°8ÓLÐÞÙØ×Ñ˜Öñ ð ”F˜9Ó%Ó%ØØ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                  " Xg5      S   n	US:  d  X‰:”  a  gUR	                  S5      u  p«n[        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)r7   Fé   Ú r@   Ú/rA   Ú:é   é   r   é   é;   T)	r   ÚstrrE   ÚcountÚsplitr    Ú
ValueErrorÚcalendarÚ
monthrange)r   ÚstrDateÚstrTimeÚstrYearÚstrMonthÚstrDayÚintYearÚintMonthÚintDayÚmonthMaxDayÚstrHourÚ	strMinuteÚ	strSecondÚintHourÚ	intMinuteÚ	intSeconds                   r   Ú$fontInfoOpenTypeHeadCreatedValidatorrp   ˜   sÂ  € ô
 �eœS×!Ñ!Øäˆu‹:˜ÓØØ‡{�{�3Ó˜1ÓØØ—{‘{ 3Ó'Ñ€GØ‡}�}�SÓ˜QÓØØ‡}�}�SÓ˜QÓØà '§¡¨cÓ 2Ñ€G�vÜ
ˆ7ƒ|�qÓØÜ
ˆ8ƒ}˜ÓØÜ
ˆ6ƒ{�aÓØðÜ�g“,ˆÜ�x“=ˆÜ�V“ˆð �!ƒ|�x "“}ØÜ×%Ò% gÓ8¸Ñ;€KØ�ƒz�VÓ)Øà$+§M¡M°#Ó$6Ñ!€G˜	Ü
ˆ7ƒ|�qÓØÜ
ˆ9ƒ~˜ÓØÜ
ˆ9ƒ~˜ÓØðÜ�g“,ˆÜ˜	“Nˆ	Ü˜	“Nˆ	ð �ƒ{�g “lØØ�1ƒ}˜	 B›ØØ�1ƒ}˜	 B›Øàøô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)r?   FT)ÚnameIDÚ
platformIDÚ
encodingIDÚ
languageIDÚstring)r   r   rF   r    r[   r5   )r   rJ   Ú
nameRecords      r   Ú$fontInfoOpenTypeNameRecordsValidatorrx   Ô   s`   € ô �eœT×"Ñ"ØÜ!%Ü�Tˆ{Ü˜�;Ü˜�;Ü˜�;Ü�Tˆ{ñ"€Mó ˆ
Ü# J×>Ó>Ùñ ð r   c                ó>   • [        U [        5      (       d  gU S:  a  gg)r7   Fr   Tr(   r)   s    r   Ú'fontInfoOpenTypeOS2WeightClassValidatorrz   ç   r+   r   c                óL   • [        U [        5      (       d  gU S:  a  gU S:”  a  gg)r7   Fr@   é	   Tr(   r)   s    r   Ú&fontInfoOpenTypeOS2WidthClassValidatorr}   ò   s+   € ô �eœS×!Ñ!ØØˆqƒyØØˆqƒyØØ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   rE   r    ©r   r   s     r   Ú*fontInfoVersion2OpenTypeOS2PanoseValidatorr‚   ÿ   sF   € ô �fœt¤U˜m×,Ñ,ØÜ
ˆ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)r?   Fr   r   Tr€   r�   s     r   Ú*fontInfoVersion3OpenTypeOS2PanoseValidatorr„     sP   € ô �fœt¤U˜m×,Ñ,ØÜ
ˆ6ƒ{�bÓØÛˆÜ˜%¤×%Ñ%ÙØ�1�9Ùñ	 ð 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)r7   FrA   r   é   é   Tr€   )r   r   ÚclassIDÚ
subclassIDs       r   Ú'fontInfoOpenTypeOS2FamilyClassValidatorrŠ     sn   € ô �fœt¤U˜m×,Ñ,ØÜ
ˆ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)r7   Fr†   rA   T©r   r   r   rE   r   r�   s     r   Ú fontInfoPostscriptBluesValidatorr�   2  óT   € ô �fœt¤U˜m×,Ñ,ØÜ
ˆ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)r7   Fr   rA   TrŒ   r�   s     r   Ú%fontInfoPostscriptOtherBluesValidatorr�   B  rŽ   r   c                óœ   • [        U [        [        45      (       d  g[        U 5      S:”  a  gU  H  n[        U[        5      (       a  M    g   g)r7   FrX   TrŒ   r�   s     r   Ú fontInfoPostscriptStemsValidatorr’   R  sF   € ô �fœt¤U˜m×,Ñ,ØÜ
ˆ6ƒ{�RÓØÛˆÜ˜%¤×-Ó-Ùñ ð r   c                ó:   • [        [        SS5      5      nX;  a  gg)r7   r@   é   FT)r   Úrange)r   r!   s     r   Ú.fontInfoPostscriptWindowsCharacterSetValidatorr–   `  s    € ô ”u˜Q “|Ó$€KØÓØØr   c                óD   • [        [        S4S9n[        X5      (       d  gg)r?   T)ÚidF)rF   r[   r5   ©r   rJ   s     r   Ú%fontInfoWOFFMetadataUniqueIDValidatorrš   j  s#   € ô "&¬#¨t¨Ñ!5€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)r?   TF)ÚnameÚurlÚdirÚclassrž   ©ÚltrÚrtl©r[   r5   Úgetr™   s     r   Ú#fontInfoWOFFMetadataVendorValidatorr¥   t  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)r?   T)ÚcreditsFr§   )rœ   r�   Úrolerž   rŸ   rž   r    )rF   r   r5   rE   r[   r¤   )r   rJ   Úcredits      r   Ú$fontInfoWOFFMetadataCreditsValidatorrª   …  s›   € ô "&¬t°T¨lÑ!;€MÜ ×5Ñ5ØÜˆu�YÑ× Ñ Øä�d�Ü�Uˆ|Ü�e�Ü�Uˆ|Ü�u�ñ€Mð ˜	Ô"ˆÜ# F×:Ñ:ÙØ�F�?˜vŸz™z¨%Ó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)r?   FT)r�   Útextr¬   ©rF   r[   r   r5   ÚfontInfoWOFFMetadataTextValue©r   rJ   r¬   s      r   Ú(fontInfoWOFFMetadataDescriptionValidatorr°   �  sG   € ô "&¬3°¨,¼dÀD¸\Ñ!J€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)r?   F)r�   r¬   r˜   r¬   Tr­   r¯   s      r   Ú$fontInfoWOFFMetadataLicenseValidatorr²   ª  sY   € ô "&Ü�%ˆL¤ e˜}´#°u°ñ"€Mô   ×5Ñ5ØØ�ƒØ˜&”MˆDÜ0°×6Ó6Ùñ "ð r   c                ó€   • [        [        S4S9n[        X5      (       d  gU S    H  n[        U5      (       a  M    g   g©r?   T)r¬   Fr¬   ©rF   r   r5   r®   r¯   s      r   Ú&fontInfoWOFFMetadataTrademarkValidatorr¶   º  óA   € ô "&¬D°$¨<Ñ!8€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)r?   TF)rœ   rž   rŸ   rž   r    r£   r™   s     r   Ú%fontInfoWOFFMetadataLicenseeValidatorr»   Ô  sM   € ô
 �d�Ü�Uˆ|Ü�u�ñ"€Mô
   ×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©r?   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)r?   FT)r   r   Ú&fontInfoWOFFMetadataExtensionValidator)r   Ú	extensions     r   Ú'fontInfoWOFFMetadataExtensionsValidatorrÃ   õ  s7   € ô �eœT×"Ñ"ØÞØÛˆ	Ü5°i×@Ó@Ùñ ð 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)r?   FT)Únamesr   r˜   rÅ   r   )rF   r   r[   r5   Ú*fontInfoWOFFMetadataExtensionNameValidatorÚ*fontInfoWOFFMetadataExtensionItemValidator)r   rJ   rœ   Úitems       r   rÁ   rÁ     sx   € ô "&Ü�Uˆm¤D¨$ <´S¸%°Lñ"€Mô   ×5Ñ5ØØ�%ÓØ˜'”NˆDÜ=¸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)r?   FT)r˜   rÅ   r   rÅ   r   )rF   r[   r   r5   rÆ   Ú+fontInfoWOFFMetadataExtensionValueValidator)r   rJ   rœ   Úvals       r   rÇ   rÇ     sp   € ô "&Ü�ˆ<¤ d˜|´T¸4°Lñ"€Mô   ×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Ê   9  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©r?   FÚ
identifierT)r   r   r   ÚguidelineValidatorr¤   Úadd)r   ÚidentifiersÚguiderÐ   s       r   ÚguidelinesValidatorrÕ   O  sg   € ô �eœT×"Ñ"ØØÑÜ“eˆÛˆÜ! %×(Ñ(ÙØ—Y‘Y˜|Ó,ˆ
ØÓ!ØÓ(ÙØ�O‰O˜JÖ'ñ ð r   F)ÚxÚyÚanglerœ   ÚcolorrÐ   Ú_guidelineDictPrototypec                ó‚  • [        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	)
r?   FrÖ   r×   rØ   r   ih  rÐ   rÙ   T)r5   rÚ   r¤   ÚidentifierValidatorÚcolorValidator)r   rÖ   r×   rØ   rÐ   rÙ   s         r   rÑ   rÑ   l  sË   € ô   Ô'>×?Ñ?ØØ�	‰	�#‹€AØ�	‰	�#‹€AØ�I‰I�gÓ€Eà�y�Q‘YØà�y�A‘IØÑØà�}˜™¨5©=ØàÑØ�1‹9ØØ�3‹;Øà—‘˜<Ó(€JØÑÔ&9¸*×&EÑ&EØà�I‰I�gÓ€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   € ô �eœT×"Ñ"ØØÑÜ“eˆÛˆÜ˜v×&Ñ&ÙØ—Z‘Z Ó-ˆ
ØÓ!ØÓ(ÙØ�O‰O˜JÖ'ñ ð r   )rÖ   r×   rœ   rÙ   rÐ   Ú_anchorDictPrototypec                ó  • [        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)r?   FrÖ   r×   rÐ   rÙ   T)r5   râ   r¤   rÜ   rÝ   )r   rÖ   r×   rÐ   rÙ   s        r   rß   rß   ±  s�   € ô   Ô';×<Ñ<ØØ�	‰	�#‹€AØ�	‰	�#‹€Aà�y�A‘IØà—‘˜<Ó(€JØÑÔ&9¸*×&EÑ&EØà�I‰I�gÓ€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XA:  d  XB:”  d  M    g   g)z{
Version 3+.

>>> identifierValidator("a")
True
>>> identifierValidator("")
False
>>> identifierValidator("a" * 101)
False
é    é~   Féd   T)r   r[   rE   Úord)r   ÚvalidCharactersMinÚvalidCharactersMaxÚcÚis        r   rÜ   rÜ   Ì  s[   € ð ÐØÐÜ�eœS×!Ñ!ØÞØÜ
ˆ5ƒz�CÓØÛˆÜ�‹FˆØÓ! QÕ%;Ùñ ð r   c                óf  • [        U [        5      (       d  gU R                  S5      n[        U5      S:w  a  gU HT  nUR	                  5       nSn [        U5      nSnU(       d   [        U5      nSnU(       d    gSWs=::  a
  S::  a  MP     g    g   g! [         a     NBf = 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Ú,rW   Tr   r@   )r   r[   r]   rE   Ústripr    r^   Úfloat)r   ÚpartsÚpartÚ	convertedÚnumbers        r   rÝ   rÝ   ë  sÂ   € ôV �eœS×!Ñ!ØØ�K‰K˜Ó€EÜ
ˆ5ƒz�QƒØÛˆØ�z‰z‹|ˆØˆ	ð	Ü˜“YˆFØˆIö ðÜ˜t›�Ø �	ö ÙØ�FÕ˜aÖÙð  Ùñ% ð& øô ó 	Ùð	ûô ó Ùðús$   ÁBÁ%B#Â
B ÂB Â#
B0Â/B0s   ‰PNG

ÚbytesÚpngSignatureT)ÚfileNameÚxScaleÚxyScaleÚyxScaleÚyScaleÚxOffsetÚyOffsetrÙ   Ú_imageDictPrototypec                ó�   • [        U [        5      (       d  gU S   (       d  gU R                  S5      nUb  [        U5      (       d  gg)r?   Fr÷   rÙ   T)r5   rþ   r¤   rÝ   )r   rÙ   s     r   ÚimageValidatorr   C  sD   € ô   Ô':×;Ñ;Øà�×Øà�I‰I�gÓ€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Úseekrö   )ÚpathÚdataÚfileObjÚfÚ	signatureÚposs         r   ÚpngValidatorr  S  s“   € ð Ñ˜tÑ/°7Ñ3FÐFÐFØÑÜ�$˜Ô ØŸ™˜q›	ˆI÷ Ðà	Ñ	Ø˜˜!�H‰	Ø	Ñ	Ø�l‰l‹nˆØ—L‘L “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  pšU
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        X¦U	'   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.FrA   Ú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   rE   r[   Ú
startswithÚexistsrÒ   r   )r   ÚufoPathOrFileSystemÚ
fileSystemÚbogusFileMessageÚusedLayerNamesÚusedDirectoriesÚcontentsÚentryrì   Ú	layerNameÚdirectoryNameÚfoundDefaults               r   ÚlayerContentsValidatorr"  q  sÂ  € ô Ð%¤r§w¡w§z¡z×2Ñ2Ø(‰
ä—W‘W—\‘\Ð"5Ó6ˆ
àJÐä�eœT×"Ñ"ØÐ&Ð&Ð&ä“U€NÜ“e€OØ€HÜˆä˜%¤×&Ñ&ØÐ*Ð*Ò*Ü�5‹z˜Q‹ØÐ*Ð*Ò*ÛˆAÜ˜a¤×%Ó%ØÐ.Ð.Ô.ñ ð $)Ñ ˆ	à˜HÓ$Ø ×+Ñ+¨I×6Ñ6àØIØ#ñ$ðò ô
 ˆy‹>˜QÓÙDà× Ñ  ×/Ñ/ØÐ<¸}ÑLÐLÒLàÐ(Ó(¨]¸hÓ-Fñð
 Ó&àØCÀiÑOðò ð 	×Ñ˜9Ô%ØÓ+àØBÀ]ÑRðò ð 	×Ñ˜MÔ*à+�ÔñW ðZ ˜xŸ™Ó0Ñ0€LÞØ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   r[   r   r   r  rE   )r   ÚbogusFormatMessageÚfirstSideMappingÚsecondSideMappingÚ	groupNameÚ	glyphListÚdÚ	glyphNames           r   ÚgroupsValidatorr+  ½  sF  € ðX HÐÜ˜×ÑØÐ(Ð(Ð(Ø')ÐØ(*ÐØ %§¡§Ñˆ	Ü˜)¤c×+Ñ+ØÐ,Ð,Ò,Ü˜)¤d¬E ]×3Ñ3ØÐ,Ð,Ò,ÞÙ6Ø×Ñ 	×*Ó*Ø×'Ñ'¨×8Ñ8À×AUÑAUØ÷Bñ Bñ ä�Ó'¬3¨y«>Ó9ñð ×#Ñ# O×4Ñ4Ø$‘à%�Û&�	Ü! )¬S×1Ñ1àØGÈ)ÑSðô ð “>àØKÈiÑ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   r[   r   )r	  r$  ÚfirstÚ
secondDictÚsecondr   s         r   ÚkerningValidatorr0    sµ   € ð. JÐÜ�dœG×$Ñ$ØÐ(Ð(Ð(Ø!ŸZ™Zž\ÑˆÜ˜%¤×%Ñ%ØÐ,Ð,Ò,Ü˜J¬×0Ñ0ØÐ,Ð,Ò,Ø'×-Ñ-Ö/‰MˆFÜ˜f¤c×*Ñ*ØÐ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   r[   r   r   )r   Úreasonr1   ÚbogusGlyphOrderMessager*  s        r   ÚfontLibValidatorr8  G  sù   € ôZ ˜×ÑØ2´T¸%³[×5IÑ5IÑIˆØÔ,¨vÑ5Ð5Ð5Ø—k‘k–m‰
ˆÜ˜#œs×#Ñ#Ùä˜“9×%Ô%¢sð,ðò ð
 Ð%Õ%Ø%VÐ"Ü˜e¤d¬E ]×3Ñ3Ø;¼dÀ5»k×>RÑ>RÑR�ØÐ4Ñ=Ð=Ò=Û"�	Ü! )¬S×1Ó1Ø5¼¸Y»×8PÑ8PÑP�FØ Ð"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.
r2  Fzkey (%s) should be a stringzpublic.markColor)Fz+public.markColor is not properly formatted.r  )r   r3  r4  r5  r   r   r[   rÝ   )r   r6  r1   s      r   ÚglyphLibValidatorr:  �  sŠ   € ô0 ˜×ÑØ2´T¸%³[×5IÑ5IÑIˆØÔ,¨vÑ5Ð5Ð5Ø—k‘k–m‰
ˆÜ˜#œs×#Ñ#Ø2°SÑ8ˆFØÔ0°6Ñ9Ð9Ò9àÐ$Õ$Ü! %×(Ó(ÙKñ $ð r   Ú__main__)r   r   ÚreturnÚbool)r   r   r   z	Type[Any]r<  r=  )r   r   r!   zSequence[int]r<  r=  )r   r   r0   r.   r<  r=  )r   r   r<  r=  )N)r   r   rÓ   zOptional[set[str]]r<  r=  )NNN)r  zOptional[str]r	  zOptional[bytes]r
  zOptional[Any]r<  ztuple[bool, Any])r   r   r  zUnion[str, fs.base.FS]r<  útuple[bool, Optional[str]])r   r   r<  r>  )r	  r   r<  r>  )UÚ__doc__Ú
__future__r   r_   Úcollections.abcr   r   Úior   ÚfontTools.misc.filesystemÚmiscÚ
filesystemr  Útypingr   r   r	   r
   ÚfontTools.annotationsr   ÚfontTools.ufoLib.utilsr   rF   r[   r   r3  r=  r.   r   r   r$   r*   r-   r5   r=   rQ   rp   rx   rz   r}   r‚   r„   rŠ   r�   r�   r’   r–   rš   r¥   rª   r°   r²   r¶   r¹   r»   r®   rÃ   rÁ   rÇ   rÆ   rÊ   rÕ   r    rð   rÚ   Ú__annotations__rÑ   rá   râ   rß   rÜ   rÝ   rö   rþ   r   r  r"  r+  r0  r5  r8  r:  r4  ÚdoctestÚtestmodr;   r   r   Ú<module>rL     sº  ðÚ (å "ã ß -Ý ç &Ð &ß -Ó -å *Ý .à�3˜˜e D¨%°°S±	¸3°Ñ*?Ð$?Ñ@À$ÐFÑGÐGÑH€ô
ô"ôô ôôôDôô<9ôxô&ô
ôôô"ô&ô ô ôôôô"ô0
ôô 
ô
ôô ô"ôô&ô$ô"ö,ñ& (,ØˆU€|�UÐØˆU€|�UÐØ�ˆ<˜Ð
Ø
ˆuˆØ�ˆ,Ø�Uˆ|ñ(Ð ˜ó ô!öRñ& %)ØˆU€|�UÐØˆU€|�UÐØ
ˆuˆØ�ˆ,Ø�Uˆ|ñ%Ð �kó ôô6ô>CðT +€ˆeÓ *á#'Ø�4ˆ[Ø�%ˆL˜%Ð Ø�5ˆ\˜5Ð!Ø�5ˆ\˜5Ð!Ø�%ˆL˜%Ð Ø�5ˆ\˜5Ð!Ø�5ˆ\˜5Ð!Ø�ˆ,ñ	$Ð �[ó 	òð" Ø Ø!ðØ
ðà
ðð ðð õ	ð<DØðDØ%;ðDàôDôXTôx$ðV IÐ ô@ôP#ðL ˆzÓÛà‡O‚OÕð r   