§
    ‚Ûg~W  ã                   óP  — d Z g d¢ZddlmZ ddlmZ d„ Zd„ Zdd	„Zdd
„Z	d„ Z
dd„Zdddœd„Zdd„Z G d„ de¦  «        Zd„ Zdd„Zedk    rXddlZddlZ eej        ¦  «        dk    r ej         e¦   «         ¦  «          ej         ej        ¦   «         j        ¦  «         dS dS )z%Variation fonts interpolation models.)ÚnormalizeValueÚnormalizeLocationÚsupportScalarÚpiecewiseLinearMapÚVariationModelé    )ÚnoRoundé   )ÚVariationModelErrorc                 ó   — d„ | D ¦   «         S )Nc                 ó   — g | ]}|®|‘ŒS ©N© ©Ú.0Úls     úM/granary/edev/quantum/lib/python3.11/site-packages/fontTools/varLib/models.pyú
<listcomp>znonNone.<locals>.<listcomp>   s   € Ð,Ð,Ð,�!˜a˜mˆA˜m˜m˜mó    r   ©Úlsts    r   ÚnonNoner      s   € Ø,Ð,�sÐ,Ñ,Ô,Ð,r   c                 ó4   — t          d„ | D ¦   «         ¦  «        S )Nc              3   ó   K  — | ]}|d u V — Œ	d S r   r   r   s     r   ú	<genexpr>zallNone.<locals>.<genexpr>   s&   è è € Ð&Ð&˜Qˆq�DˆyÐ&Ð&Ð&Ð&Ð&Ð&r   ©Úallr   s    r   ÚallNoner      s   € ÝÐ&Ð& #Ð&Ñ&Ô&Ñ&Ô&Ð&r   Nc                 ó�   ‡ ‡‡— ‰€t          ˆ fd„|D ¦   «         ¦  «        S  ‰‰ ¦  «        Št          ˆˆfd„|D ¦   «         ¦  «        S )Nc              3   ó$   •K  — | ]
}‰|k    V — Œd S r   r   )r   ÚitemÚrefs     €r   r   zallEqualTo.<locals>.<genexpr>   s'   øè è € Ð/Ð/ 4�3˜$’;Ð/Ð/Ð/Ð/Ð/Ð/r   c              3   ó6   •K  — | ]}‰ ‰|¦  «        k    V — Œd S r   r   )r   r    ÚmappedÚmappers     €€r   r   zallEqualTo.<locals>.<genexpr>   s0   øè è € Ð6Ð6¨$ˆv˜˜ ™œÒ%Ð6Ð6Ð6Ð6Ð6Ð6r   r   )r!   r   r$   r#   s   ` `@r   Ú
allEqualTor%      s`   øøø€ Ø€~ÝÐ/Ð/Ð/Ð/¨3Ð/Ñ/Ô/Ñ/Ô/Ð/àˆV�C‰[Œ[€FÝÐ6Ð6Ð6Ð6Ð6°#Ð6Ñ6Ô6Ñ6Ô6Ð6r   c                 ó�   — | sdS t          | ¦  «        }	 t          |¦  «        }n# t          $ r Y dS w xY wt          |||¬¦  «        S )NT)r$   )ÚiterÚnextÚStopIterationr%   )r   r$   ÚitÚfirsts       r   ÚallEqualr,      sc   € Øð ØˆtÝ	ˆc‰Œ€BðÝ�R‘”ˆˆøÝð ð ð Øˆtˆtðøøøå�e˜R¨Ð/Ñ/Ô/Ð/s   •% ¥
3²3c                 óz   — t          | ¦  «        t          |¦  «        k    sJ ‚d„ t          || ¦  «        D ¦   «         S )Nc                 ó   — g | ]	\  }}|¯|‘Œ
S r   r   )r   r   Úts      r   r   zsubList.<locals>.<listcomp>,   s!   € Ð/Ð/Ð/‘$�!�Q¨QÐ/ˆAÐ/Ð/Ð/r   ©ÚlenÚzip)Útruthr   s     r   ÚsubListr4   *   s;   € Ýˆu‰:Œ:�˜S™œÒ!Ð!Ð!Ð!Ø/Ð/�#˜c 5™/œ/Ð/Ñ/Ô/Ð/r   Fc           
      óx  — |\  }}}||cxk    r|k    sn t          d|d›d|d›d|d›�¦  «        ‚|st          t          | |¦  «        |¦  «        } | |k    s||k    rdS | |k     r||k    s| |k    r||k    r| |z
  ||z
  z  S | |k    r||k    s#| |k     r||k    sJ d| › d|› d|› d|› d�	¦   «         ‚| |z
  ||z
  z  S )zÙNormalizes value based on a min/default/max triple.

    >>> normalizeValue(400, (100, 400, 900))
    0.0
    >>> normalizeValue(100, (100, 400, 900))
    -1.0
    >>> normalizeValue(650, (100, 400, 900))
    0.5
    z8Invalid axis values, must be minimum, default, maximum: z3.3fz, ç        zOoops... v=z
, triple=(ú))Ú
ValueErrorÚmaxÚmin)ÚvÚtripleÚextrapolateÚlowerÚdefaultÚuppers         r   r   r   /   sR  € ð #Ñ€Eˆ7�EØ�WÐ%Ð%Ò%Ð% Ò%Ð%Ð%Ð%Ýð:ØÐ9ð:ð :Ø$Ð9ð:ð :Ø-2Ð9ð:ð :ñ
ô 
ð 	
ð ð &Ý•�A�u‘”˜uÑ%Ô%ˆàˆG‚|€|�u ’~�~Øˆsà	ˆGŠˆ˜ Ò(Ð(¨a°'ªk¨k¸eÀwÒ>NÐ>NØ�G‘ ¨%¡Ñ0Ð0à�G’� ¨Ò 0Ð 0Ø�ŠKˆK˜E WÒ,Ð,Ð,ØB˜ÐBÐB eÐBÐB¨wÐBÐB¸%ÐBÐBÐBñ -Ô,Ð,à�G‘ ¨¡Ñ0Ð0r   )Úvalidatec                óÂ  — |r�t          |                      ¦   «         ¦  «        t          |                     ¦   «         ¦  «        k    sKJ t          |                      ¦   «         ¦  «        t          |                     ¦   «         ¦  «        z
  ¦   «         ‚i }|                     ¦   «         D ]6\  }}|                      ||d         ¦  «        }t	          |||¬¦  «        ||<   Œ7|S )aÓ  Normalizes location based on axis min/default/max values from axes.

    >>> axes = {"wght": (100, 400, 900)}
    >>> normalizeLocation({"wght": 400}, axes)
    {'wght': 0.0}
    >>> normalizeLocation({"wght": 100}, axes)
    {'wght': -1.0}
    >>> normalizeLocation({"wght": 900}, axes)
    {'wght': 1.0}
    >>> normalizeLocation({"wght": 650}, axes)
    {'wght': 0.5}
    >>> normalizeLocation({"wght": 1000}, axes)
    {'wght': 1.0}
    >>> normalizeLocation({"wght": 0}, axes)
    {'wght': -1.0}
    >>> axes = {"wght": (0, 0, 1000)}
    >>> normalizeLocation({"wght": 0}, axes)
    {'wght': 0.0}
    >>> normalizeLocation({"wght": -1}, axes)
    {'wght': 0.0}
    >>> normalizeLocation({"wght": 1000}, axes)
    {'wght': 1.0}
    >>> normalizeLocation({"wght": 500}, axes)
    {'wght': 0.5}
    >>> normalizeLocation({"wght": 1001}, axes)
    {'wght': 1.0}
    >>> axes = {"wght": (0, 1000, 1000)}
    >>> normalizeLocation({"wght": 0}, axes)
    {'wght': -1.0}
    >>> normalizeLocation({"wght": -1}, axes)
    {'wght': -1.0}
    >>> normalizeLocation({"wght": 500}, axes)
    {'wght': -0.5}
    >>> normalizeLocation({"wght": 1000}, axes)
    {'wght': 0.0}
    >>> normalizeLocation({"wght": 1001}, axes)
    {'wght': 0.0}
    r	   )r=   )ÚsetÚkeysÚitemsÚgetr   )ÚlocationÚaxesr=   rA   ÚoutÚtagr<   r;   s           r   r   r   N   sÏ   € ðN ð 
Ý�8—=’=‘?”?Ñ#Ô#¥s¨4¯9ª9©;¬;Ñ'7Ô'7Ò7Ð7Ð7½¸X¿]º]¹_¼_Ñ9MÔ9MÕPSØ�IŠI‰KŒKñQ
ô Q
ñ :
Ñ7Ô7Ð7ð €CØ—z’z‘|”|ð Fð F‰ˆˆVØ�LŠL˜˜f QœiÑ(Ô(ˆÝ! ! V¸ÐEÑEÔEˆˆC‰ˆØ€Jr   Tc                 ó‚  — |r|€t          d¦  «        ‚d}|                     ¦   «         D �]\  }\  }}}	|r8|dk    rŒ||k    s||	k    rŒ |dk     r|	dk    rŒ-|                      |d¦  «        }
n|| v sJ ‚| |         }
|
|k    rŒY|r„||         \  }}|
|k     r7||k    r1||k    r||	k     r||
|	z
  ||	z
  z  z  }Œ�||k     r||
|z
  ||z
  z  z  }Œ¢n<||
k     r6||	k    r0||k    r||k     r||
|z
  ||z
  z  z  }ŒÊ||k     r||
|	z
  ||	z
  z  z  }Œß|
|k    s|	|
k    rd} n&|
|k     r||
|z
  ||z
  z  z  }�Œ||
|	z
  ||	z
  z  z  }�Œ|S )a‡  Returns the scalar multiplier at location, for a master
    with support.  If ot is True, then a peak value of zero
    for support of an axis means "axis does not participate".  That
    is how OpenType Variation Font technology works.

    If extrapolate is True, axisRanges must be a dict that maps axis
    names to (axisMin, axisMax) tuples.

      >>> supportScalar({}, {})
      1.0
      >>> supportScalar({'wght':.2}, {})
      1.0
      >>> supportScalar({'wght':.2}, {'wght':(0,2,3)})
      0.1
      >>> supportScalar({'wght':2.5}, {'wght':(0,2,4)})
      0.75
      >>> supportScalar({'wght':2.5, 'wdth':0}, {'wght':(0,2,4), 'wdth':(-1,0,+1)})
      0.75
      >>> supportScalar({'wght':2.5, 'wdth':.5}, {'wght':(0,2,4), 'wdth':(-1,0,+1)}, ot=False)
      0.375
      >>> supportScalar({'wght':2.5, 'wdth':0}, {'wght':(0,2,4), 'wdth':(-1,0,+1)})
      0.75
      >>> supportScalar({'wght':2.5, 'wdth':.5}, {'wght':(0,2,4), 'wdth':(-1,0,+1)})
      0.75
      >>> supportScalar({'wght':3}, {'wght':(0,1,2)}, extrapolate=True, axisRanges={'wght':(0, 2)})
      -1.0
      >>> supportScalar({'wght':-1}, {'wght':(0,1,2)}, extrapolate=True, axisRanges={'wght':(0, 2)})
      -1.0
      >>> supportScalar({'wght':3}, {'wght':(0,2,2)}, extrapolate=True, axisRanges={'wght':(0, 2)})
      1.5
      >>> supportScalar({'wght':-1}, {'wght':(0,2,2)}, extrapolate=True, axisRanges={'wght':(0, 2)})
      -0.5
    Nz2axisRanges must be passed when extrapolate is Trueg      ð?r6   )Ú	TypeErrorrE   rF   )rG   ÚsupportÚotr=   Ú
axisRangesÚscalarÚaxisr>   Úpeakr@   r;   ÚaxisMinÚaxisMaxs                r   r   r   €   sü  € ðD ð N�zÐ)ÝÐLÑMÔMÐMØ€FØ&-§m¢m¡o¤oð (3ñ (3Ñ"ˆÑ"ˆu�d˜EØð 	à�sŠ{ˆ{ØØ�tŠ|ˆ|˜t eš|˜|ØØ�sŠ{ˆ{˜u sš{˜{ØØ—’˜T 3Ñ'Ô'ˆAˆAà˜8Ð#Ð#Ð#Ð#Ø˜”ˆAØ�Š9ˆ9Øàð 	Ø)¨$Ô/ÑˆG�WØ�7Š{ˆ{˜u¨Ò/Ð/Ø˜7’?�? t¨e¢| |Ø˜q 5™y¨T°E©\Ñ:Ñ:�FØØ˜t’^�^Ø˜q 5™y¨T°E©\Ñ:Ñ:�FØð $ð ˜1’� ¨EÒ!1Ð!1Ø˜d’?�? u¨t¢| |Ø˜q 5™y¨T°E©\Ñ:Ñ:�FØØ˜G’^�^Ø˜q 5™y¨T°E©\Ñ:Ñ:�FØà�Š:ˆ:˜ !š˜ØˆFØˆEàˆtŠ8ˆ8Ø�q˜5‘y T¨E¡\Ñ2Ñ2ˆF‰Fà�q˜5‘y T¨E¡\Ñ2Ñ2ˆF‰FØ€Mr   c                   óÞ   — e Zd ZdZ	 dddœd„Zd„ Zed„ ¦   «         Zeg fd„¦   «         Zd	„ Z	d
„ Z
d„ Zd„ Zedœd„Zedœd„Zd„ Zd„ Zed„ ¦   «         Zed„ ¦   «         Zd„ Zedœd„Zedœd„ZdS )r   a5  Locations must have the base master at the origin (ie. 0).

    If axis-ranges are not provided, values are assumed to be normalized to
    the range [-1, 1].

    If the extrapolate argument is set to True, then values are extrapolated
    outside the axis range.

      >>> from pprint import pprint
      >>> axisRanges = {'wght': (-180, +180), 'wdth': (-1, +1)}
      >>> locations = [       {'wght':100},       {'wght':-100},       {'wght':-180},       {'wdth':+.3},       {'wght':+120,'wdth':.3},       {'wght':+120,'wdth':.2},       {},       {'wght':+180,'wdth':.3},       {'wght':+180},       ]
      >>> model = VariationModel(locations, axisOrder=['wght'], axisRanges=axisRanges)
      >>> pprint(model.locations)
      [{},
       {'wght': -100},
       {'wght': -180},
       {'wght': 100},
       {'wght': 180},
       {'wdth': 0.3},
       {'wdth': 0.3, 'wght': 180},
       {'wdth': 0.3, 'wght': 120},
       {'wdth': 0.2, 'wght': 120}]
      >>> pprint(model.deltaWeights)
      [{},
       {0: 1.0},
       {0: 1.0},
       {0: 1.0},
       {0: 1.0},
       {0: 1.0},
       {0: 1.0, 4: 1.0, 5: 1.0},
       {0: 1.0, 3: 0.75, 4: 0.25, 5: 1.0, 6: 0.6666666666666666},
       {0: 1.0,
        3: 0.75,
        4: 0.25,
        5: 0.6666666666666667,
        6: 0.4444444444444445,
        7: 0.6666666666666667}]
    NF)rO   c                óB  ‡ ‡— t          t          d„ ‰D ¦   «         ¦  «        ¦  «        t          ‰¦  «        k    rt          d¦  «        ‚‰‰ _        |�|ng ‰ _        |‰ _        |€0|r‰                      ‰¦  «        }nd„ ‰D ¦   «         }d„ |D ¦   «         }|‰ _        d„ ‰D ¦   «         Š‰                      ‰‰ j        ¬¦  «        }t          ‰|¬¦  «        ‰ _
        ˆ fd„‰D ¦   «         ‰ _        ˆfd	„‰ j
        D ¦   «         ‰ _        ‰                      ¦   «          i ‰ _        d S )
Nc              3   ór   K  — | ]2}t          t          |                     ¦   «         ¦  «        ¦  «        V — Œ3d S r   )ÚtupleÚsortedrE   r   s     r   r   z*VariationModel.__init__.<locals>.<genexpr>  s:   è è € Ð?Ð?°•5� §¢¡	¤	Ñ*Ô*Ñ+Ô+Ð?Ð?Ð?Ð?Ð?Ð?r   zLocations must be unique.c                 ó@   — h | ]}|                      ¦   «         D ]}|’ŒŒS r   ©rD   ©r   ÚlocrQ   s      r   ú	<setcomp>z*VariationModel.__init__.<locals>.<setcomp>  s-   € ÐLÐLÐL CÀÇÂÁÄÐLÐL¸˜4ÐLÐLÐLÐLr   c                 ó   — i | ]}|d “ŒS ))éÿÿÿÿr	   r   )r   rQ   s     r   ú
<dictcomp>z+VariationModel.__init__.<locals>.<dictcomp>  s   € Ð@Ð@Ð@°˜d GÐ@Ð@Ð@r   c                 óJ   — g | ] }d „ |                      ¦   «         D ¦   «         ‘Œ!S )c                 ó&   — i | ]\  }}|d k    ¯||“ŒS ©r6   r   ©r   Úkr;   s      r   ra   z6VariationModel.__init__.<locals>.<listcomp>.<dictcomp>  s#   € Ð?Ð?Ð?™t˜q !°a¸3²h°h�a˜°h°h°hr   ©rE   ©r   r]   s     r   r   z+VariationModel.__init__.<locals>.<listcomp>  s/   € ÐUÐUÐUÀCÐ?Ð? s§y¢y¡{¤{Ð?Ñ?Ô?ÐUÐUÐUr   )Ú	axisOrder)Úkeyc                 óD   •— g | ]}‰j                              |¦  «        ‘ŒS r   ©Ú	locationsÚindex©r   r   Úselfs     €r   r   z+VariationModel.__init__.<locals>.<listcomp>  ó)   ø€ ÐCÐCÐC°A˜œ×,Ò,¨QÑ/Ô/ÐCÐCÐCr   c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r   ©rn   ©r   r   rm   s     €r   r   z+VariationModel.__init__.<locals>.<listcomp>  ó%   ø€ ÐJÐJÐJ°a˜yŸš¨qÑ1Ô1ÐJÐJÐJr   )r1   rC   r
   ÚorigLocationsri   r=   ÚcomputeAxisRangesrO   ÚgetMasterLocationsSortKeyFuncrY   rm   ÚmappingÚreverseMappingÚ_computeMasterSupportsÚ
_subModels)rp   rm   ri   r=   rO   ÚallAxesÚkeyFuncs   ``     r   Ú__init__zVariationModel.__init__  sY  øø€ õ �sÐ?Ð?°YÐ?Ñ?Ô?Ñ?Ô?Ñ@Ô@ÅCÈ	ÁNÄNÒRÐRÝ%Ð&AÑBÔBÐBà&ˆÔØ&/Ð&;˜˜ÀˆŒØ&ˆÔØÐØð AØ!×3Ò3°IÑ>Ô>�
�
àLÐL¨9ÐLÑLÔL�Ø@Ð@¸Ð@Ñ@Ô@�
Ø$ˆŒàUÐUÈ9ÐUÑUÔUˆ	Ø×4Ò4Ø ¤ð 5ñ 
ô 
ˆõ   	¨wÐ7Ñ7Ô7ˆŒð DÐCÐCÐC¸ÐCÑCÔCˆŒØJÐJÐJÐJ¸4¼>ÐJÑJÔJˆÔà×#Ò#Ñ%Ô%Ð%ØˆŒˆˆr   c                 ó  — d|vr| |fS t          d„ |D ¦   «         ¦  «        }| j                             |¦  «        }|€2t          t	          || j        ¦  «        | j        ¦  «        }|| j        |<   |t	          ||¦  «        fS )zºReturn a sub-model and the items that are not None.

        The sub-model is necessary for working with the subset
        of items when some are None.

        The sub-model is cached.Nc              3   ó   K  — | ]}|d uV — Œ	d S r   r   ©r   r;   s     r   r   z-VariationModel.getSubModel.<locals>.<genexpr>*  s&   è è € Ð1Ð1 a�A˜T�MÐ1Ð1Ð1Ð1Ð1Ð1r   )rX   r|   rF   r   r4   rv   ri   )rp   rE   rj   ÚsubModels       r   ÚgetSubModelzVariationModel.getSubModel!  s�   € ð �uÐÐØ˜�;ÐÝÐ1Ð1¨5Ð1Ñ1Ô1Ñ1Ô1ˆØ”?×&Ò& sÑ+Ô+ˆØÐÝ%¥g¨c°4Ô3EÑ&FÔ&FÈÌÑWÔWˆHØ#+ˆDŒO˜CÑ Ø�  eÑ,Ô,Ð,Ð,r   c                 óÞ   — i }d„ | D ¦   «         }| D ][}|D ]V}|                      |d¦  «        }|                      |||f¦  «        \  }}t          ||¦  «        t          ||¦  «        f||<   ŒWŒ\|S )Nc                 ó@   — h | ]}|                      ¦   «         D ]}|’ŒŒS r   r[   r\   s      r   r^   z3VariationModel.computeAxisRanges.<locals>.<setcomp>4  s-   € ÐDÐDÐD˜C¸¿º¹¼ÐDÐD°�4ÐDÐDÐDÐDr   r   )rF   r:   r9   )rm   rO   r}   r]   rQ   ÚvaluerS   rT   s           r   rw   z VariationModel.computeAxisRanges1  sŸ   € àˆ
ØDÐD 9ÐDÑDÔDˆØð 	Lð 	LˆCØð Lð L�ØŸš  aÑ(Ô(�Ø#-§>¢>°$¸À¸Ñ#GÔ#GÑ �˜Ý#& u¨gÑ#6Ô#6½¸EÀ7Ñ8KÔ8KÐ#K�
˜4Ñ Ð ðLð Ðr   c                 óL  — i | vrt          d¦  «        ‚i }| D ]|}t          |¦  «        dk    rŒt          t          |¦  «        ¦  «        }||         }||vrdh||<   |||         vsJ d|›d|›d|›�¦   «         ‚||                              |¦  «         Œ}d„ } |||¦  «        }|S )NzBase master not found.r	   r6   zValue "z" in axisPoints["z"] -->  c                 ó    ‡ ‡‡— d„ Šˆˆ ˆfd„}|S )Nc                 ó&   — | dk     rdn	| dk    rdndS )Nr   r`   r	   r   )r;   s    r   ÚsignzJVariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.signN  s    € Ø šU˜U�r�r¨a°!ªe¨e¨¨¸Ð:r   c           	      óÞ  •‡ — t          ‰ ¦  «        }ˆfd„‰                      ¦   «         D ¦   «         }ˆ fd„‰D ¦   «         }|                     ˆfd„t          ‰                      ¦   «         ¦  «        D ¦   «         ¦  «         |t          |¦  «         t          ˆfd„|D ¦   «         ¦  «        t          |¦  «        t          ˆ ˆfd„|D ¦   «         ¦  «        t          ˆ fd„|D ¦   «         ¦  «        fS )Nc                 ó6   •— g | ]\  }}|‰v ¯	|‰|         v ¯|‘ŒS r   r   )r   rQ   r‡   Ú
axisPointss      €r   r   z]VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<listcomp>S  sA   ø€ ð ð ð á#˜˜eØ˜zÐ)Ð)¨e°zÀ$Ô7GÐ.GÐ.Gð à.GÐ.GÐ.Gr   c                 ó   •— g | ]}|‰v ¯|‘Œ	S r   r   ©r   rQ   r]   s     €r   r   z]VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<listcomp>X  s   ø€ ÐIÐIÐI¨¸TÀS¸[¸[˜t¸[¸[¸[r   c                 ó   •— g | ]}|‰v¯|‘Œ	S r   r   ©r   rQ   ri   s     €r   r   z]VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<listcomp>Z  s#   ø€ ÐRÐRÐR˜d¸DÈ	Ð<QÐ<Q�TÐ<QÐ<QÐ<Qr   c              3   óN   •K  — | ]}|‰v r‰                      |¦  «        nd V — Œ dS )i   Nrs   r’   s     €r   r   z\VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<genexpr>_  sR   øè è € ð ð à ð 26¸Ð1BÐ1B˜	Ÿš¨Ñ-Ô-Ð-Èðð ð ð ð ð r   c              3   ó:   •K  — | ]} ‰‰|         ¦  «        V — Œd S r   r   )r   rQ   r]   r‹   s     €€r   r   z\VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<genexpr>d  s@   øè è € ð ð Ø,0˜˜˜S œY™œðð ð ð ð ð r   c              3   óB   •K  — | ]}t          ‰|         ¦  «        V — Œd S r   )Úabsr�   s     €r   r   z\VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<genexpr>g  s>   øè è € ð ð Ø+/�˜C œI™œðð ð ð ð ð r   )r1   rE   ÚextendrY   rD   rX   )r]   ÚrankÚonPointAxesÚorderedAxesri   rŽ   r‹   s   `   €€€r   rj   zIVariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.keyQ  sd  øø€ Ý˜3‘x”x�ðð ð ð à'*§y¢y¡{¤{ðñ ô �ð
 JÐIÐIÐI°	ÐIÑIÔI�Ø×"Ò"ØRÐRÐRÐR¥f¨S¯XªX©Z¬ZÑ&8Ô&8ÐRÑRÔRñô ð ð Ý˜Ñ%Ô%Ð%Ýð ð ð ð à$/ðñ ô ñ ô õ ˜+Ñ&Ô&Ýð ð ð ð ð Ø4?ðñ ô ñ ô õ ð ð ð ð Ø3>ðñ ô ñ ô ðð r   r   )rŽ   ri   rj   r‹   s   `` @r   ÚgetKeyz<VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKeyM  s>   øøø€ ð;ð ;ð ;ðð ð ð ð ð ð ð6 ˆJr   )r
   r1   r(   r'   Úadd)rm   ri   rŽ   r]   rQ   r‡   r›   Úrets           r   rx   z,VariationModel.getMasterLocationsSortKeyFunc<  sì   € à�YÐÐÝ%Ð&>Ñ?Ô?Ð?Øˆ
Øð 
	(ð 
	(ˆCÝ�3‰xŒx˜1Š}ˆ}ØÝ�˜S™	œ	‘?”?ˆDØ˜”IˆEØ˜:Ð%Ð%Ø$' 5�
˜4Ñ à˜Z¨Ô-Ð-Ð-Ð-Ð-Ø;@¸5¸5À$À$À$È
È
ÐSñ .Ô-Ð-à�tÔ× Ò  Ñ'Ô'Ð'Ð'ð	ð 	ð 	ðB ˆf�Z Ñ+Ô+ˆØˆ
r   c                 óÔ   ‡ ‡‡— ˆfd„|D ¦   «         }ˆ fd„|D ¦   «         ‰ _         d„ ‰ j         D ¦   «         Šˆ fd„‰D ¦   «         ‰ _        ˆfd„‰ j        D ¦   «         ‰ _        i ‰ _        |S )Nc                 ó    •— g | ]
}‰|         ‘ŒS r   r   )r   ÚidxÚmaster_lists     €r   r   z1VariationModel.reorderMasters.<locals>.<listcomp>t  s   ø€ Ð8Ð8Ð8¨�K Ô$Ð8Ð8Ð8r   c                 ó*   •— g | ]}‰j         |         ‘ŒS r   )rv   )r   r    rp   s     €r   r   z1VariationModel.reorderMasters.<locals>.<listcomp>u  s!   ø€ ÐIÐIÐI¸#˜dÔ0°Ô5ÐIÐIÐIr   c                 óJ   — g | ] }d „ |                      ¦   «         D ¦   «         ‘Œ!S )c                 ó&   — i | ]\  }}|d k    ¯||“ŒS rd   r   re   s      r   ra   z<VariationModel.reorderMasters.<locals>.<listcomp>.<dictcomp>w  s#   € Ð6Ð6Ð6‘d�a˜¨Q°#ªX¨XˆQ�¨X¨X¨Xr   rg   rh   s     r   r   z1VariationModel.reorderMasters.<locals>.<listcomp>v  s<   € ð 
ð 
ð 
Ø;>Ð6Ð6˜cŸiši™kœkÐ6Ñ6Ô6ð
ð 
ð 
r   c                 óD   •— g | ]}‰j                              |¦  «        ‘ŒS r   rl   ro   s     €r   r   z1VariationModel.reorderMasters.<locals>.<listcomp>y  rq   r   c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r   rs   rt   s     €r   r   z1VariationModel.reorderMasters.<locals>.<listcomp>z  ru   r   )rv   ry   rm   rz   r|   )rp   r¡   ry   Únew_listrm   s   ``  @r   ÚreorderMasterszVariationModel.reorderMastersq  s¥   øøø€ ð 9Ð8Ð8Ð8°Ð8Ñ8Ô8ˆØIÐIÐIÐIÀÐIÑIÔIˆÔð
ð 
ØBFÔBTð
ñ 
ô 
ˆ	ð DÐCÐCÐC¸ÐCÑCÔCˆŒØJÐJÐJÐJ¸4¼>ÐJÑJÔJˆÔØˆŒØˆr   c                 óX  — g | _         |                      ¦   «         }t          |¦  «        D �]i\  }}t          |                     ¦   «         ¦  «        }|d |…         D �]}t          |                     ¦   «         ¦  «        |k    rŒ)d}|                     ¦   «         D ]:\  }\  }}	}
||         d         |	k    s|||         d         cxk     r|
k     sn d} nŒ;|sŒ}i }d}|                     ¦   «         D ]g}||         d         }||v sJ ‚||         \  }}}
||
}}||k     r|}||z
  ||z
  z  }n||k     r|}||z
  |
|z
  z  }nŒO||k    ri }|}||k    r|||f||<   Œh|                     ¦   «         D ]
\  }}|||<   Œ�Œ| j                              |¦  «         �Œk|                      ¦   «          d S )NTr	   Fr`   )ÚsupportsÚ_locationsToRegionsÚ	enumeraterC   rD   rE   ÚappendÚ_computeDeltaWeights)rp   ÚregionsÚiÚregionÚlocAxesÚprev_regionÚrelevantrQ   r>   rR   r@   ÚbestAxesÚ	bestRatioÚvalÚlocVÚnewLowerÚnewUpperÚratior<   s                      r   r{   z%VariationModel._computeMasterSupports~  s5  € ØˆŒØ×*Ò*Ñ,Ô,ˆÝ" 7Ñ+Ô+ð 2	)ñ 2	)‰IˆAˆvÝ˜&Ÿ+š+™-œ-Ñ(Ô(ˆGà& r¨ rœ{ð .*ñ .*�å�{×'Ò'Ñ)Ô)Ñ*Ô*¨gÒ5Ð5Øà�Ø28·,²,±.´.ð ð Ñ.�DÑ.˜5 $¨à# DÔ)¨!Ô,°Ò4Ð4Ø  ;¨tÔ#4°QÔ#7Ð?Ð?Ò?Ð?¸%Ò?Ð?Ð?Ð?à#(˜Ø˜øØð Øð �Ø�	Ø'×,Ò,Ñ.Ô.ð Dð D�DØ% dÔ+¨AÔ.�CØ 6˜>˜>˜>˜>Ø)/°¬Ñ&�E˜4 Ø).°˜h�HØ˜T’z�zØ#&˜Ø!$ t¡°¸±Ñ =˜˜Ø š˜Ø#&˜Ø!$ t¡°¸±Ñ =˜˜ð !Ø˜yÒ(Ð(Ø#%˜Ø$)˜	Ø 	Ò)Ð)Ø*2°D¸(Ð)C˜ ™øà$,§N¢NÑ$4Ô$4ð *ð *‘L�D˜&Ø#)�F˜4‘L�Lñ*àŒM× Ò  Ñ(Ô(Ð(Ñ(Ø×!Ò!Ñ#Ô#Ð#Ð#Ð#r   c                 óð   — | j         }| j        }g }|D ]b}i }|                     ¦   «         D ]4\  }}|dk    rd|||         d         f||<   Œ ||         d         |df||<   Œ5|                     |¦  «         Œc|S )Nr   r	   )rm   rO   rE   r­   )rp   rm   rO   r¯   r]   r±   rQ   r¸   s           r   r«   z"VariationModel._locationsToRegions¶  s¡   € Ø”Nˆ	Ø”_ˆ
àˆØð 	#ð 	#ˆCØˆFØ!Ÿiši™kœkð Bð B‘
��dØ˜!’8�8Ø$% t¨Z¸Ô-=¸aÔ-@Ð#A�F˜4‘L�Là$.¨tÔ$4°QÔ$7¸¸qÐ#A�F˜4‘L�LØ�NŠN˜6Ñ"Ô"Ð"Ð"Øˆr   c                 óò   — g | _         t          | j        ¦  «        D ]Z\  }}i }t          | j        d |…         ¦  «        D ]\  }}t	          ||¦  «        }|r|||<   Œ| j                              |¦  «         Œ[d S r   )ÚdeltaWeightsr¬   rm   rª   r   r­   )rp   r°   r]   ÚdeltaWeightÚjrM   rP   s          r   r®   z#VariationModel._computeDeltaWeightsÅ  s—   € ØˆÔÝ ¤Ñ/Ô/ð 	2ð 	2‰FˆAˆsØˆKå'¨¬°b°q°bÔ(9Ñ:Ô:ð ,ð ,‘
��7Ý& s¨GÑ4Ô4�Øð ,Ø%+�K ‘NøØÔ×$Ò$ [Ñ1Ô1Ð1Ð1ð	2ð 	2r   ©Úroundc                ó¸  — t          |¦  «        t          | j        ¦  «        k    s+J t          |¦  «        t          | j        ¦  «        f¦   «         ‚| j        }g }t          | j        ¦  «        D ]k\  }}|||                  }|                     ¦   «         D ]%\  }}	|	dk    r|||         z  }Œ|||         |	z  z  }Œ&|                      ||¦  «        ¦  «         Œl|S )Nr	   )r1   r¾   rz   r¬   rE   r­   )
rp   ÚmasterValuesrÂ   ry   rI   r°   ÚweightsÚdeltarÀ   Úweights
             r   Ú	getDeltaszVariationModel.getDeltasÐ  sî   € Ý�<Ñ Ô ¥C¨Ô(9Ñ$:Ô$:Ò:Ð:Ð:Ý�ÑÔÝ�Ô!Ñ"Ô"ð=
Ñ:Ô:Ð:ð Ô%ˆØˆÝ# DÔ$5Ñ6Ô6ð 	%ð 	%‰JˆAˆwØ  ¨¤Ô,ˆEØ$Ÿ]š]™_œ_ð -ð -‘	��6Ø˜Q’;�;Ø˜S œV‘O�E�Eà˜S œV f™_Ñ,�E�EØ�JŠJ�u�u˜U‘|”|Ñ$Ô$Ð$Ð$Øˆ
r   c                ón   — |                       |¦  «        \  }}|                     ||¬¦  «        |j        fS )NrÁ   )r„   rÈ   rª   )rp   rE   rÂ   Úmodels       r   ÚgetDeltasAndSupportsz#VariationModel.getDeltasAndSupportsá  s6   € Ø×'Ò'¨Ñ.Ô.‰ˆˆuØ�Š˜u¨EˆÑ2Ô2°E´NÐBÐBr   c                 ó.   ‡ ‡— ˆˆ fd„‰ j         D ¦   «         S )zûReturn scalars for each delta, for the given location.
        If interpolating many master-values at the same location,
        this function allows speed up by fetching the scalars once
        and using them with interpolateFromMastersAndScalars().c                 óJ   •— g | ]}t          ‰|‰j        ‰j        ¬ ¦  «        ‘Œ S ))r=   rO   )r   r=   rO   )r   rM   r]   rp   s     €€r   r   z-VariationModel.getScalars.<locals>.<listcomp>ê  sH   ø€ ð 
ð 
ð 
ð õ Ø�W¨$Ô*:ÀtÄðñ ô ð
ð 
ð 
r   )rª   )rp   r]   s   ``r   Ú
getScalarszVariationModel.getScalarså  s8   øø€ ð

ð 
ð 
ð 
ð 
ð  œ=ð	
ñ 
ô 
ð 	
r   c                 óT  ‡ ‡— ‰                       |¦  «        Št          t          t          ‰ j        ¦  «        ¦  «        ¦  «        D ]8\  }}|                     ¦   «         D ]\  }}‰|xx         ‰|         |z  z  cc<   ŒŒ9ˆˆ fd„t          t          ‰¦  «        ¦  «        D ¦   «         Š‰S )a­  Return multipliers for each master, for the given location.
        If interpolating many master-values at the same location,
        this function allows speed up by fetching the scalars once
        and using them with interpolateFromValuesAndScalars().

        Note that the scalars used in interpolateFromMastersAndScalars(),
        are *not* the same as the ones returned here. They are the result
        of getScalars().c                 ó6   •— g | ]}‰‰j         |                  ‘ŒS r   )ry   )r   r°   rI   rp   s     €€r   r   z3VariationModel.getMasterScalars.<locals>.<listcomp>ÿ  s$   ø€ Ð=Ð=Ð=¨ˆs�4”< ”?Ô#Ð=Ð=Ð=r   )rÎ   ÚreversedÚlistr¬   r¾   rE   Úranger1   )rp   ÚtargetLocationr°   rÅ   rÀ   rÇ   rI   s   `     @r   ÚgetMasterScalarszVariationModel.getMasterScalarsñ  s´   øø€ ð �oŠo˜nÑ-Ô-ˆÝ"¥4­	°$Ô2CÑ(DÔ(DÑ#EÔ#EÑFÔFð 	*ð 	*‰JˆAˆwØ$Ÿ]š]™_œ_ð *ð *‘	��6Ø�A��”˜#˜aœ& 6™/Ñ)��‘�ð*ð >Ð=Ð=Ð=Ð=­Uµ3°s±8´8©_¬_Ð=Ñ=Ô=ˆØˆ
r   c                 óž   — d}t          | ¦  «        t          |¦  «        k    sJ ‚t          | |¦  «        D ]\  }}|sŒ||z  }|€|}Œ||z  }Œ|S )aV  Interpolate from values and scalars coefficients.

        If the values are master-values, then the scalars should be
        fetched from getMasterScalars().

        If the values are deltas, then the scalars should be fetched
        from getScalars(); in which case this is the same as
        interpolateFromDeltasAndScalars().
        Nr0   )ÚvaluesÚscalarsr;   r‡   rP   Úcontributions         r   ÚinterpolateFromValuesAndScalarsz.VariationModel.interpolateFromValuesAndScalars  st   € ð ˆÝ�6‰{Œ{�c '™lœlÒ*Ð*Ð*Ð*Ý  ¨Ñ1Ô1ð 	"ð 	"‰MˆE�6Øð ØØ  6™>ˆLØˆyØ ��à�\Ñ!��Øˆr   c                 ó8   — t                                | |¦  «        S )z>Interpolate from deltas and scalars fetched from getScalars().)r   rÚ   )ÚdeltasrØ   s     r   ÚinterpolateFromDeltasAndScalarsz.VariationModel.interpolateFromDeltasAndScalars  s   € õ ×=Ò=¸fÀgÑNÔNÐNr   c                 óX   — |                       |¦  «        }|                      ||¦  «        S )z)Interpolate from deltas, at location loc.)rÎ   rÝ   )rp   r]   rÜ   rØ   s       r   ÚinterpolateFromDeltasz$VariationModel.interpolateFromDeltas  s)   € à—/’/ #Ñ&Ô&ˆØ×3Ò3°F¸GÑDÔDÐDr   c                óX   — |                       |¦  «        }|                      ||¦  «        S )z0Interpolate from master-values, at location loc.)rÕ   rÚ   )rp   r]   rÄ   rÂ   rØ   s        r   ÚinterpolateFromMastersz%VariationModel.interpolateFromMasters#  s+   € à×'Ò'¨Ñ,Ô,ˆØ×3Ò3°LÀ'ÑJÔJÐJr   c                ó\   — |                       ||¬¦  «        }|                      ||¦  «        S )z²Interpolate from master-values, and scalars fetched from
        getScalars(), which is useful when you want to interpolate
        multiple master-values with the same location.rÁ   )rÈ   rÝ   )rp   rÄ   rØ   rÂ   rÜ   s        r   Ú interpolateFromMastersAndScalarsz/VariationModel.interpolateFromMastersAndScalars(  s/   € ð —’ °E�Ñ:Ô:ˆØ×3Ò3°F¸GÑDÔDÐDr   )NF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r„   Ústaticmethodrw   rx   r¨   r{   r«   r®   r   rÈ   rË   rÎ   rÕ   rÚ   rÝ   rß   rá   rã   r   r   r   r   r   Ñ   sÆ  € € € € € ð/ð /ðd 6;ðØJNðð ð ð ð ð<-ð -ð -ð  ðð ñ „\ðð Ø;=ð 2ð 2ð 2ñ „\ð2ðhð ð ð6$ð 6$ð 6$ðpð ð ð	2ð 	2ð 	2ð 07ð ð ð ð ð ð" 4;ð Cð Cð Cð Cð Cð

ð 

ð 

ðð ð ð" ðð ñ „\ðð, ðOð Oñ „\ðOðEð Eð Eð
 BIð Kð Kð Kð Kð Kð
 PWð Eð Eð Eð Eð Eð Eð Er   r   c                 óŒ  ‡ — |                      ¦   «         }|s‰ S ‰ |v r|‰          S t          |¦  «        }‰ |k     r‰ ||         z   |z
  S t          |¦  «        }‰ |k    r‰ ||         z   |z
  S t          ˆ fd„|D ¦   «         ¦  «        }t          ˆ fd„|D ¦   «         ¦  «        }||         }||         }|||z
  ‰ |z
  z  ||z
  z  z   S )Nc              3   ó(   •K  — | ]}|‰k     ¯|V — Œd S r   r   re   s     €r   r   z%piecewiseLinearMap.<locals>.<genexpr>=  ó'   øè è € Ð%Ð%�!˜q 1šu˜uˆA˜u˜u˜u˜uÐ%Ð%r   c              3   ó(   •K  — | ]}|‰k    ¯|V — Œd S r   r   re   s     €r   r   z%piecewiseLinearMap.<locals>.<genexpr>>  rë   r   )rD   r:   r9   )r;   ry   rD   rf   ÚaÚbÚvaÚvbs   `       r   r   r   0  sõ   ø€ Ø�<Š<‰>Œ>€DØð ØˆØˆD€y€yØ�qŒzÐÝˆD‰	Œ	€AØˆ1‚u€uØ�7˜1”:‰~ Ñ!Ð!ÝˆD‰	Œ	€AØˆ1‚u€uØ�7˜1”:‰~ Ñ!Ð!åÐ%Ð%Ð%Ð%�tÐ%Ñ%Ô%Ñ%Ô%€AÝÐ%Ð%Ð%Ð%�tÐ%Ñ%Ô%Ñ%Ô%€AØ	�Œ€BØ	�Œ€BØ��b‘˜Q ™UÑ# q¨1¡uÑ-Ñ-Ð-r   c                 óê  ‡
— ddl m} ddl}|                     dt          j        ¬¦  «        }|                     dddd	¬
¦  «         |                     d¬¦  «        }|                     dddt          ¬¦  «         |                     ddddd¬¦  «         | 	                    | ¦  «        }  || j
        ¬¦  «         ddlm} | j        r•ddlm}  |¦   «         }|                     | j        ¦  «         d„ |j        D ¦   «         }t#          d¦  «          ||¦  «         |                     ¦   «          t#          d¦  «         d„ |j        D ¦   «         } ||¦  «         nJd„ t'          t)          d¦  «        t)          d ¦  «        d!z   ¦  «        D ¦   «         Š
ˆ
fd"„| j        D ¦   «         }t-          |¦  «        }	t#          d#¦  «          ||	j        ¦  «         t#          d$¦  «          ||	j        ¦  «         dS )%z*Normalize locations on a given designspacer   )ÚconfigLoggerNzfonttools varLib.models)Údescriptionz
--loglevelÚLEVELÚINFOz Logging level (defaults to INFO))Úmetavarr?   ÚhelpT)Úrequiredz-dz--designspaceÚDESIGNSPACE)rö   Útypez-lz--locationsÚLOCATIONú+zFMaster locations as comma-separate coordinates. One must be all zeros.)rö   Únargsr÷   )Úlevel)Úpprint)ÚDesignSpaceDocumentc                 ó   — g | ]	}|j         ‘Œ
S r   ©rG   ©r   Úss     r   r   zmain.<locals>.<listcomp>h  ó   € Ð0Ð0Ð0˜q�”
Ð0Ð0Ð0r   zOriginal locations:zNormalized locations:c                 ó   — g | ]	}|j         ‘Œ
S r   r  r  s     r   r   zmain.<locals>.<listcomp>m  r  r   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r   )Úchr)r   Úcs     r   r   zmain.<locals>.<listcomp>p  s   € Ð>Ð>Ð>˜1•�A‘”Ð>Ð>Ð>r   ÚAÚZr	   c                 ó„   •— g | ]<}t          t          ‰d „ |                     d¦  «        D ¦   «         ¦  «        ¦  «        ‘Œ=S )c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r   )Úfloatr‚   s     r   r   z"main.<locals>.<listcomp>.<genexpr>r  s(   è è € Ð;Ð;¨�E !™HœHÐ;Ð;Ð;Ð;Ð;Ð;r   ú,)Údictr2   Úsplit)r   r  rH   s     €r   r   zmain.<locals>.<listcomp>q  sQ   ø€ ð 
ð 
ð 
ØBC�D•�TÐ;Ð;¨a¯gªg°c©l¬lÐ;Ñ;Ô;Ñ<Ô<Ñ=Ô=ð
ð 
ð 
r   zSorted locations:z	Supports:)Ú	fontToolsrò   ÚargparseÚArgumentParserÚmainrç   Úadd_argumentÚadd_mutually_exclusive_groupÚstrÚ
parse_argsÚloglevelrÿ   ÚdesignspaceÚfontTools.designspaceLibr   ÚreadÚsourcesÚprintÚ	normalizerÓ   Úordrm   r   rª   )Úargsrò   r  ÚparserÚgrouprÿ   r   ÚdocÚlocsrÊ   rH   s             @r   r  r  D  sf  ø€ à&Ð&Ð&Ð&Ð&Ð&Ø€O€O€Oà×$Ò$Ø!Ý”Lð %ñ ô €Fð ×ÒØØØØ/ð	 ñ ô ð ð ×/Ò/¸Ð/Ñ>Ô>€EØ	×Ò�t˜_°mÍ#ÐÑNÔNÐNØ	×ÒØØØØØUð ñ ô ð ð ×Ò˜TÑ"Ô"€Dà€L�t”}Ð%Ñ%Ô%Ð%ØÐÐÐÐÐàÔð 
Ø@Ð@Ð@Ð@Ð@Ð@à!Ð!Ñ#Ô#ˆØ�Š�Ô!Ñ"Ô"Ð"Ø0Ð0 C¤KÐ0Ñ0Ô0ˆÝÐ#Ñ$Ô$Ð$Øˆˆt‰ŒˆØ�Š‰ŒˆÝÐ%Ñ&Ô&Ð&Ø0Ð0 C¤KÐ0Ñ0Ô0ˆØˆˆt‰Œˆˆà>Ð>¥¥c¨#¡h¤hµ°C±´¸1±Ñ =Ô =Ð>Ñ>Ô>ˆð
ð 
ð 
ð 
ØGKÄ~ð
ñ 
ô 
ˆõ ˜4Ñ Ô €EÝ	Ð
ÑÔÐØ
€Fˆ5Œ?ÑÔÐÝ	ˆ+ÑÔÐØ
€Fˆ5Œ>ÑÔÐÐÐr   Ú__main__r   )F)TFN)rç   Ú__all__ÚfontTools.misc.roundToolsr   Úerrorsr
   r   r   r%   r,   r4   r   r   r   Úobjectr   r   r  rä   ÚdoctestÚsysr1   ÚargvÚexitÚtestmodÚfailedr   r   r   ú<module>r2     sÃ  ðØ +Ð +ðð ð €ð .Ð -Ð -Ð -Ð -Ð -Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'ð-ð -ð -ð'ð 'ð 'ð7ð 7ð 7ð 7ð0ð 0ð 0ð 0ð0ð 0ð 0ð
1ð 1ð 1ð 1ð>/ÀUð /ð /ð /ð /ð /ðdNð Nð Nð Nðb\Eð \Eð \Eð \Eð \E�Vñ \Eô \Eð \Eð~
.ð .ð .ð(5ð 5ð 5ð 5ðp ˆzÒÐØÐÐÐÐÐÐÐà
€sˆ3Œ8�}„}�qÒÐØˆŒ��‘”ÑÔÐà€C„Hˆ_ˆWŒ_ÑÔÔ%Ñ&Ô&Ð&Ð&Ð&ð Ðr   