§
    ƒØj�  ã                  ó„  — d dl mZ d dlmZ d dlmZ d dlZd dlmZmZ d dl	Z	d dl
Z
d dlmZmZ d dlZd dlmZ d dlmZmZ erd d	lmZmZ g d
¢Zg d¢Zedd…         Zded<   ded<   ded<   ded<   dVd„Zej        ZedWd„¦   «         Z eg d¢¦  «        ZedXd!„¦   «         Z edYd#„¦   «         Z dZd%„Z ej        fd[d(„Z!d\d*„Z"d]d^d,„Z#d_d`d1„Z$dad4„Z%d5Z&dbd7„Z'dcd9„Z(ddd=„Z)ded@„Z*	 dfdgdD„Z+dhdidH„Z,djdJ„Z-dkdM„Z.dNdOœdldP„Z/dmdQ„Z0dndodR„Z1i Z2 e3 e4e¦  «        ¦  «        D ]nZ5ee5         Z6e6 7                    ¦   «         Z8e5e2e6<   e5e2e8<   e5e2 e9e5¦  «         e1e5¦  «        z   <   ee5         Z:e:e6k    re: 7                    ¦   «         Z;e5e2e:<   e5e2e;<   Œo[5[6[8[:[; G dS„ dTej<        ¦  «        Z=e/e0gZ>e?dUk    rd dlZ ej@        e=¦  «         dS dS )pé    )Úannotations)ÚFraction)ÚcacheN)ÚiscloseÚgcd)ÚoverloadÚTYPE_CHECKING)Údefaults)Ú
OffsetQLInÚOffsetQL)ÚSequenceÚ
Collection)ÚaddFloatPrecisionÚapproximateGCDÚcontiguousListÚdecimalToTupletÚdotMultiplierÚ	fromRomanÚgroupContiguousIntegersÚmixedNumeralÚmusicOrdinalsÚnearestMultipleÚnumToIntOrFloatÚopFracÚordinalAbbreviationÚordinalsÚordinalsToNumbersÚroundToHalfIntegerÚstrTrimFloatÚtoRomanÚunitBoundaryProportionÚunitNormalizeProportionÚweightedSelection)ÚZerothÚFirstÚSecondÚThirdÚFourthÚFifthÚSixthÚSeventhÚEighthÚNinthÚTenthÚEleventhÚTwelfthÚ
ThirteenthÚ
FourteenthÚ	FifteenthÚ	SixteenthÚSeventeenthÚ
EighteenthÚ
NineteenthÚ	TwentiethzTwenty-firstzTwenty-secondÚUnisoné   ÚOctaveé   zDouble-octaveé   zTriple-octaveé   Úvaluer   Úreturnúint | floatc                óÀ   — 	 t          | ¦  «        }n5# t          t          f$ r! t          | ¦  «        } t          | ¦  «        }Y nw xY wt	          || d¬¦  «        r|S | dz   S )aÂ  
    Given a number, return an integer if it is very close to an integer,
    otherwise, return a float.

    This routine is very important for conversion of
    :class:`~music21.pitch.Accidental` objects' `.alter`  attribute
    in musicXML must be 1 (not 1.0) for sharp and -1 (not -1.0) for flat,
    but allows for 0.5 for half-sharp.

    >>> common.numToIntOrFloat(1.0)
    1
    >>> common.numToIntOrFloat(1.00003)
    1.00003
    >>> common.numToIntOrFloat(1.5)
    1.5
    >>> common.numToIntOrFloat(2)
    2
    >>> common.numToIntOrFloat(-5)
    -5
    >>> common.numToIntOrFloat(1.0000000005)
    1
    >>> common.numToIntOrFloat(0.999999999)
    1

    >>> sharp = pitch.Accidental('sharp')
    >>> common.numToIntOrFloat(sharp.alter)
    1
    >>> halfFlat = pitch.Accidental('half-flat')
    >>> common.numToIntOrFloat(halfFlat.alter)
    -0.5

    Can also take in a string representing an int or float

    >>> common.numToIntOrFloat('1.0')
    1
    >>> common.numToIntOrFloat('1')
    1
    >>> common.numToIntOrFloat('1.25')
    1.25

    Others raise a ValueError

    >>> common.numToIntOrFloat('one')
    Traceback (most recent call last):
    ValueError: could not convert string to float: 'one'

    Fractions also become ints or floats

    >>> from fractions import Fraction
    >>> common.numToIntOrFloat(Fraction(1, 2))
    0.5
    >>> common.numToIntOrFloat(Fraction(4, 3))
    1.333333333...

    Note: Decimal objects are not supported.
    g�íµ ÷Æ°>©Úabs_tolç        )ÚroundÚ
ValueErrorÚ	TypeErrorÚfloatr   )r?   ÚintVals     ú�/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/common/numberTools.pyr   r   H   sw   € ðrÝ�u‘”ˆˆøÝ�	Ð"ð ð ð Ý�e‘”ˆÝ�u‘”ˆˆˆðøøøõ ˆv�u dÐ+Ñ+Ô+ð Øˆà�3‰;Ðs   ‚ ’/AÁAÚnÚintÚdútuple[int, int]c                óŠ  — |t           k    r| |fS | }|}d\  }}}}	 | |z  }|||z  z   }	|	t           k    rn|||||z  z   |	f\  }}}}|| ||z  z
  }} Œ5t           |z
  |z  }
||
|z  z   }||
|z  z   }|}|}t          ||z  ||z  z
  ¦  «        }||z  }t          ||z  ||z  z
  ¦  «        }||z  }||z  ||z  z
  }|dk    r||fS ||fS )aW  
    Used in opFrac

    Copied from fractions.limit_denominator.  Their method
    requires creating three new Fraction instances to get one back.
    This doesn't create any call before Fraction.

    DENOM_LIMIT is hardcoded to defaults.limitOffsetDenominator for speed.

    returns a new n, d.

    >>> common.numberTools._preFracLimitDenominator(100001, 300001)
    (1, 3)

    >>> from fractions import Fraction
    >>> Fraction(100_000_000_001, 30_0000_000_001).limit_denominator(65535)
    Fraction(1, 3)
    >>> Fraction(100001, 300001).limit_denominator(65535)
    Fraction(1, 3)

    Timing differences are huge!

    t is timeit.timeit::

        t('Fraction(*common.numberTools._preFracLimitDenominator(*x.as_integer_ratio()))',
           setup='x = 1000001/3000001; from music21 import common; from fractions import Fraction',
           number=100000)
        1.0814228057861328

        t('Fraction(x).limit_denominator(65535)',
           setup='x = 1000001/3000001; from fractions import Fraction',
           number=100000)
        7.941488981246948

    Nothing changed in 2023, in fact, it's faster now with the cache, and even
    without the cache, it's still 4x faster.

    Proof of working:

    >>> import random
    >>> myWay = lambda x: Fraction(*common.numberTools._preFracLimitDenominator(
    ...     *x.as_integer_ratio()))
    >>> theirWay = lambda x: Fraction(x).limit_denominator(65535)

    >>> for _ in range(50):
    ...     x = random.random()
    ...     if myWay(x) != theirWay(x):
    ...         print(f'boo: {x}, {myWay(x)}, {theirWay(x)}')

    (n.b. -- nothing printed)
    )r   r:   r:   r   Tr   )ÚDENOM_LIMITÚabs)rL   rN   ÚnOrgÚdOrgÚp0Úq0Úp1Úq1ÚaÚq2ÚkÚbound1nÚbound1dÚbound2nÚbound2dÚbound1minusS_nÚbound1minusS_dÚbound2minusS_nÚbound2minusS_dÚ
differences                       rK   Ú_preFracLimitDenominatorre   �   s;  € ðl 	�KÒÐØ�1ˆvˆØ€DØ€DØ�N€BˆˆB�ðØ�‰FˆØ�!�b‘&‰[ˆØ•ÒÐØØ˜R  a¨"¡f¡¨bÐ0‰ˆˆB��BØ�!�a˜!‘e‘)ˆ1ˆðõ 
�rÑ	˜bÑ €AØ�1�r‘6‰k€GØ�1�r‘6‰k€GØ€GØ€Gå˜' D™.¨T°G©^Ñ<Ñ=Ô=€NØ˜G‘^€NÝ˜' D™.¨T°G©^Ñ<Ñ=Ô=€NØ˜G‘^€NØ  >Ñ1°nÀ~Ñ6UÑV€JØ�Q‚€à˜Ð!Ð!à˜Ð!Ð!ó    )g      °?g      ¸?g      À?g      È?ç      Ð?g      Ø?ç      à?ç      è?ç      ð?ç      ø?ç       @ç      @ç      @ç      @ÚnumrI   c                ó   — d S ©N© ©rp   s    rK   r   r   í   ó   € à€Crf   úfloat | Fractionc                ó   — d S rr   rs   rt   s    rK   r   r   ñ   ru   rf   r   c                ó¢  — | t           v r| dz   S t          | ¦  «        }|t          u rY|                      ¦   «         }|d         t          k    r2t          t          |Ž Ž }|j        }||dz
  z  dk    r|j        |dz   z  S |S | S |t          u r| dz   S |t
          u r"| j        }||dz
  z  dk    r| j        |dz   z  S | S | €dS t          | t          ¦  «        r| dz   S t          | t          ¦  «        rt          t          | ¦  «        ¦  «        S t          | t
          ¦  «        r"| j        }||dz
  z  dk    r| j        |dz   z  S | S t          d| › �¦  «        ‚)a  
    opFrac -> optionally convert a number to a fraction or back.

    Important music21 function for working with offsets and quarterLengths

    Takes in a number and converts it to a Fraction with denominator
    less than limitDenominator if it is not binary expressible; otherwise return a float.
    Or if the Fraction can be converted back to a binary expressible
    float then do so.

    This function should be called often to ensure that values being passed around are floats
    and ints wherever possible and fractions where needed.

    The naming of this method violates music21's general rule of no abbreviations, but it
    is important to make it short enough so that no one will be afraid of calling it often.
    It also doesn't have a setting for maxDenominator so that it will expand in
    Code Completion easily. That is to say, this function has been set up to be used, so please
    use it.

    This is a performance-critical operation. Do not alter it in any way without running
    many timing tests.

    >>> from fractions import Fraction
    >>> defaults.limitOffsetDenominator
    65535
    >>> common.opFrac(3)
    3.0
    >>> common.opFrac(1/3)
    Fraction(1, 3)
    >>> common.opFrac(1/4)
    0.25
    >>> f = Fraction(1, 3)
    >>> common.opFrac(f + f + f)
    1.0
    >>> common.opFrac(0.99999999842)
    1.0
    >>> common.opFrac(0.123456789)
    Fraction(10, 81)
    >>> common.opFrac(0.000001)
    0.0

    Please check against None before calling, but None is changed to 0.0

    >>> common.opFrac(None)
    0.0

    * Changed in v9.3: opFrac(None) should not be called.  If it is called,
      it now returns 0.0.
    rE   r:   r   NzCannot convert num: )Ú_KNOWN_PASSESÚtyperI   Úas_integer_ratiorQ   r   re   Ú_denominatorÚ
_numeratorrM   Ú
isinstancer   ÚdenominatorÚ	numeratorrH   )rp   ÚnumTypeÚirÚf_outrN   s        rK   r   r   ö   s“  € ðt �mÐÐØ�S‰yÐõ �3‰iŒi€GØ•%ÐÐð ×!Ò!Ñ#Ô#ˆØˆaŒ5•;ÒÐåÕ6¸Ð;Ð<ˆEàÔ"ˆAØ�Q˜‘U‘ Ò!Ð!àÔ'¨1¨s©7Ñ3Ð3à�ð ˆJØ	•Cˆˆà�S‰yÐØ	•HÐ	Ð	àÔˆØ��Q‘‰K˜AÒÐà”> Q¨¡WÑ-Ð-àˆJØ	ˆØˆsõ 
�C�Ñ	Ô	ð 6Ø�S‰yÐÝ	�C�Ñ	Ô	ð 	6Ý•e˜C‘j”jÑ!Ô!Ð!Ý	�C�Ñ	"Ô	"ð 6ØŒOˆØ��Q‘‰K˜AÒÐØ”= A¨¡GÑ,Ð,àˆJåÐ4¨sÐ4Ð4Ñ5Ô5Ð5rf   Úexprúnumbers.Realc                óö  — t          | t          ¦  «        sat          t          | ¦  «        d¦  «        \  }}t          |¦  «                             |¦  «        }|dk     r|dz  }d|z
  }n:|dk    rd}|dz
  }n,t          t          | ¦  «        ¦  «        }| |z
  }|dk     r|dz  }|r2|rt          |¦  «        › d|› �S t          t          |¦  «        ¦  «        S |dk    rt          |¦  «        S t          d¦  «        S )a‡  
    Returns a string representing a mixedNumeral form of a number

    >>> common.mixedNumeral(1.333333)
    '1 1/3'
    >>> common.mixedNumeral(0.333333)
    '1/3'
    >>> common.mixedNumeral(-1.333333)
    '-1 1/3'
    >>> common.mixedNumeral(-0.333333)
    '-1/3'

    >>> common.mixedNumeral(0)
    '0'
    >>> common.mixedNumeral(-0)
    '0'

    Works with Fraction objects too

    >>> from fractions import Fraction
    >>> common.mixedNumeral(Fraction(31, 7))
    '4 3/7'
    >>> common.mixedNumeral(Fraction(1, 5))
    '1/5'
    >>> common.mixedNumeral(Fraction(-1, 5))
    '-1/5'
    >>> common.mixedNumeral(Fraction(-4, 5))
    '-4/5'
    >>> common.mixedNumeral(Fraction(-31, 7))
    '-4 3/7'

    Denominator is limited by default but can be changed.

    >>> common.mixedNumeral(2.0000001)
    '2'
    >>> common.mixedNumeral(2.0000001, limitDenominator=10000000)
    '2 1/10000000'
    rj   éÿÿÿÿr:   rE   r   ú )r~   r   ÚdivmodrI   Úlimit_denominatorrM   Ústr)r„   ÚlimitDenominatorÚquotientÚ	remainderÚremainderFracs        rK   r   r   i  s  € õP �d�HÑ%Ô%ð  Ý$¥U¨4¡[¤[°#Ñ6Ô6Ñˆ�)Ý  Ñ+Ô+×=Ò=Ð>NÑOÔOˆØ�bŠ=ˆ=Ø˜‰MˆHØ Ñ-ˆMˆMØ˜Š^ˆ^ØˆHØ)¨AÑ-ˆMøå•u˜T‘{”{Ñ#Ô#ˆØ˜x™ˆØ�aŠ<ˆ<Ø˜RÑˆMàð &Øð 	&Ý˜(‘m”mÐ5Ð5 mÐ5Ð5Ð5å•s˜8‘}”}Ñ%Ô%Ð%à˜AÒÐÝ�}Ñ%Ô%Ð%Ýˆq‰6Œ6€Mrf   úfloat | intc                óŒ   — t          | d¦  «        \  }}t          |¦  «        }|dk     rd}nd|cxk    rdk     rn nd}nd}||z   S )aâ  
    Given a floating-point number, round to the nearest half-integer. Returns int or float

    >>> common.roundToHalfInteger(1.2)
    1
    >>> common.roundToHalfInteger(1.35)
    1.5
    >>> common.roundToHalfInteger(1.8)
    2
    >>> common.roundToHalfInteger(1.6234)
    1.5

    0.25 rounds up:

    >>> common.roundToHalfInteger(0.25)
    0.5

    as does 0.75

    >>> common.roundToHalfInteger(0.75)
    1

    unlike python round function, does the same for 1.25 and 1.75

    >>> common.roundToHalfInteger(1.25)
    1.5
    >>> common.roundToHalfInteger(1.75)
    2

    negative numbers however, round up on the boundaries

    >>> common.roundToHalfInteger(-0.26)
    -0.5
    >>> common.roundToHalfInteger(-0.25)
    0
    rj   rg   r   ri   rh   r:   )r‰   rM   )rp   rJ   ÚfloatVals      rK   r   r   «  sm   € õJ ˜c 3Ñ'Ô'Ñ€FˆHÝ�‰[Œ[€FØ�$‚€ØˆˆØ	�Ð	 Ð	 Ò	 Ð	 ˜DÒ	 Ð	 Ð	 Ð	 Ð	 ØˆˆàˆØ�HÑÐrf   ç{®Gáz„?c                ó¢   — t          | t          ¦  «        rt          | ¦  «        } d}|D ]%}t          | ||¬¦  «        rt	          |¦  «        c S Œ&| S )a   
    Given a value that suggests a floating point fraction, like 0.33,
    return a Fraction or float that provides greater specification, such as Fraction(1, 3)

    >>> import fractions
    >>> common.addFloatPrecision(0.333)
    Fraction(1, 3)
    >>> common.addFloatPrecision(0.33)
    Fraction(1, 3)
    >>> common.addFloatPrecision(0.35) == fractions.Fraction(1, 3)
    False
    >>> common.addFloatPrecision(0.2) == 0.2
    True
    >>> common.addFloatPrecision(0.125)
    0.125
    >>> common.addFloatPrecision(1/7) == 1/7
    True
    )gUUUUUUÕ?gUUUUUUå?gUUUUUUÅ?g«ªªªªªê?rC   )r~   r‹   rI   r   r   )ÚxÚgrainÚvaluesÚvs       rK   r   r   Û  sj   € õ& �!•SÑÔð Ý�!‰HŒHˆð€Fàð ð ˆÝ�1�a Ð'Ñ'Ô'ð 	Ý˜!‘9”9ÐÐÐð	à€Hrf   é   ÚfloatNumÚmaxNumr‹   c                óð   — dt          |¦  «        z   dz   }|| z  }|                     d¦  «        }t          |¦  «        }t          |dz
  |dz   d¦  «        D ]}||         dk    r n|dz
  }Œ|d|…         }|S )aw  
    returns a string from a float that is at most maxNum of
    decimal digits long, but never less than 1.

    >>> common.strTrimFloat(42.3333333333)
    '42.3333'
    >>> common.strTrimFloat(42.3333333333, 2)
    '42.33'
    >>> common.strTrimFloat(6.66666666666666, 2)
    '6.67'
    >>> common.strTrimFloat(2.0)
    '2.0'
    >>> common.strTrimFloat(-5)
    '-5.0'
    z%.Úfú.r:   r‡   Ú0r   )r‹   ÚindexÚlenÚrange)rš   r›   ÚoffBuildStringÚoffÚ
offDecimalÚoffLenr    s          rK   r   r   ù  s‘   € ð" �S ™[œ[Ñ(¨3Ñ.€NØ
˜8Ñ
#€CØ—’˜3‘”€JÝ�‰XŒX€FÝ�v ‘z :°¡>°2Ñ6Ô6ð  ð  ˆØˆuŒ:˜ÒÐØˆEà˜a‘ZˆFˆFØ
ˆa�ˆhŒ-€CØ€Jrf   Úunitútuple[float, float, float]c                ó¤  — | dk     rt          d| › d�dz   d|› �z   ¦  «        ‚t          j        | |z  ¦  «        }|dz  }||z  }||dz   z  }|| cxk    r|k    rn nt          d|› d	|› �¦  «        ‚|| cxk    r	||z   k    r*n n'|t          | |z
  d
¦  «        t          | |z
  d
¦  «        fS |t          || z
  d
¦  «        t          | |z
  d
¦  «        fS )a>  
    Given a positive value `n`, return the nearest multiple of the supplied `unit` as well as
    the absolute difference (error) to seven significant digits and the signed difference.

    >>> print(common.nearestMultiple(0.25, 0.25))
    (0.25, 0.0, 0.0)
    >>> print(common.nearestMultiple(0.35, 0.25))
    (0.25, 0.1..., 0.1...)
    >>> print(common.nearestMultiple(0.20, 0.25))
    (0.25, 0.05..., -0.05...)

    Note that this one also has an error of 0.1, but it's a positive error off of 0.5

    >>> print(common.nearestMultiple(0.4, 0.25))
    (0.5, 0.1..., -0.1...)

    >>> common.nearestMultiple(0.4, 0.25)[0]
    0.5
    >>> common.nearestMultiple(23404.001, 0.125)[0]
    23404.0
    >>> common.nearestMultiple(23404.134, 0.125)[0]
    23404.125

    Error is always positive, but signed difference can be negative.

    >>> common.nearestMultiple(23404 - 0.0625, 0.125)
    (23403.875, 0.0625, 0.0625)

    >>> common.nearestMultiple(0.001, 0.125)[0]
    0.0

    >>> from math import isclose
    >>> isclose(common.nearestMultiple(0.25, 1 / 3)[0], 0.33333333, abs_tol=1e-7)
    True
    >>> isclose(common.nearestMultiple(0.55, 1 / 3)[0], 0.66666666, abs_tol=1e-7)
    True
    >>> isclose(common.nearestMultiple(234.69, 1 / 3)[0], 234.6666666, abs_tol=1e-7)
    True
    >>> isclose(common.nearestMultiple(18.123, 1 / 6)[0], 18.16666666, abs_tol=1e-7)
    True

    >>> common.nearestMultiple(-0.5, 0.125)
    Traceback (most recent call last):
    ValueError: n (-0.5) is less than zero. Thus, cannot find the nearest
        multiple for a value less than the unit, 0.125
    r   zn (z) is less than zero. z3Thus, cannot find the nearest multiple for a value zless than the unit, rl   r:   z"cannot place n between multiples: z, é   )rG   ÚmathÚfloorrF   )rL   r§   ÚmultÚhalfUnitÚmatchLowÚ	matchHighs         rK   r   r     s:  € ð^ 	ˆ1‚u€uÝÐ7˜qÐ7Ð7Ð7ØPñQà8°$Ð8Ð8ñ9ñ :ô :ð 	:õ Œ:�a˜$‘hÑÔ€DØ�c‰z€Hà�d‰{€HØ˜˜q™Ñ!€Ið �1Ð!Ð!Ò!Ð!˜	Ò!Ð!Ð!Ð!Ð!ÝÐU¸hÐUÐUÈ)ÐUÐUÑVÔVÐVà�1Ð-Ð-Ò-Ð-˜ HÑ,Ò-Ð-Ð-Ð-Ð-Ø�˜q 8™|¨QÑ/Ô/µ°q¸8±|ÀQÑ1GÔ1GÐGÐGð �% 	¨A¡¨qÑ1Ô1µ5¸¸Y¹ÈÑ3JÔ3JÐJÐJrf   )	rj   rk   g      ü?g      þ?g      ÿ?g     €ÿ?g     Àÿ?g     àÿ?g     ðÿ?Údotsc                óJ   — | dk     rt           |          S d| dz   z  dz
  d| z  z  S )aõ  
    dotMultiplier(dots) returns how long to multiply the note
    length of a note in order to get the note length with n dots

    Since dotMultiplier always returns a power of two in the denominator,
    the float will be exact.

    >>> from fractions import Fraction
    >>> Fraction(common.dotMultiplier(1))
    Fraction(3, 2)
    >>> Fraction(common.dotMultiplier(2))
    Fraction(7, 4)
    >>> Fraction(common.dotMultiplier(3))
    Fraction(15, 8)

    >>> common.dotMultiplier(0)
    1.0
    é	   é   rj   )Ú_DOT_LOOKUP)r±   s    rK   r   r   `  s5   € ð& ˆa‚x€xÝ˜4Ô Ð à�4˜#‘:Ñ #Ñ%¨!¨t©)Ñ4Ð4rf   ÚdecNumc                óÀ  — d„ }d}| dk    rt          d¦  «        ‚| dk     rd}d| z  } t          j        | ¦  «        \  }}| |z  } ||¦  «        \  }}|dk    rt          d¦  «        ‚||z  }t	          t          |¦  «        t          |¦  «        ¦  «        }||z  }||z  }|du rt          |¦  «        t          |¦  «        fS t          |¦  «        t          |¦  «        fS )aÑ  
    For simple decimals (usually > 1), a quick way to figure out the
    fraction in lowest terms that gives a valid tuplet.

    No it does not work really fast.  No it does not return tuplets with
    denominators over 100.  Too bad, math geeks.  This is real life.  :-)

    returns (numerator, denominator)

    >>> common.decimalToTuplet(1.5)
    (3, 2)
    >>> common.decimalToTuplet(1.25)
    (5, 4)

    If decNum is < 1, the denominator will be greater than the numerator:

    >>> common.decimalToTuplet(0.8)
    (4, 5)

    If decNum is <= 0, returns a ZeroDivisionError:

    >>> common.decimalToTuplet(-.02)
    Traceback (most recent call last):
    ZeroDivisionError: number must be greater than zero
    c                óÆ   — t          dd¦  «        D ]O}t          ||dz  ¦  «        D ]9}t          | ||z  d¬¦  «        r"t          |¦  «        t          |¦  «        fc c S Œ:ŒPdS )z#
        Utility function.
        r:   éè  r´   gH¯¼šò×z>rC   )r   r   )r¢   r   rM   )Úinner_workingr    Újs      rK   ÚfindSimpleFractionz+decimalToTuplet.<locals>.findSimpleFraction“  s‡   € õ ˜1˜d‘^”^ð 	0ð 	0ˆEÝ˜5 %¨!¡)Ñ,Ô,ð 0ð 0�Ý˜=¨!¨e©)¸TÐBÑBÔBð 0Ý ™FœF¥C¨¡J¤JÐ/Ð/Ð/Ð/Ð/Ð/ð0ð0ð ˆvrf   Fr   z number must be greater than zeror:   TzNo such luck)ÚZeroDivisionErrorr«   ÚmodfrG   r   rM   )	r¶   r¼   ÚflipNumeratorÚunused_remainderÚ
multiplierÚworkingÚjyÚiyÚmy_gcds	            rK   r   r   y  s  € ð4ð ð ð €MØ�‚{€{ÝÐ BÑCÔCÐCØ�‚z€zØˆØ�V‘ˆå#'¤9¨VÑ#4Ô#4Ñ Ð�jØ�zÑ!€Gà!Ð! 'Ñ*Ô*�H€Rˆà	ˆQ‚w€wÝ˜Ñ(Ô(Ð(àˆ*Ñ€BÝ•�R‘”�#˜b™'œ'Ñ"Ô"€FØ	ˆf‰€BØ	ˆf‰€Bà˜ÐÐÝ�B‘”�˜R™œÐ!Ð!å�B‘”�˜R™œÐ!Ð!rf   r—   úSequence[int | float]úlist[float]c                ó†   — d}| D ]}|dk     rt          d¦  «        ‚||z  }Œg }| D ]}|                     ||z  ¦  «         Œ|S )aŸ  
    Normalize values within the unit interval, where max is determined by the sum of the series.

    >>> common.unitNormalizeProportion([0, 3, 4])
    [0.0, 0.42857142857142855, 0.5714285714285714]
    >>> common.unitNormalizeProportion([1, 1, 1])
    [0.3333333..., 0.333333..., 0.333333...]

    Works fine with a mix of ints and floats:

    >>> common.unitNormalizeProportion([1.0, 1, 1.0])
    [0.3333333..., 0.333333..., 0.333333...]

    On 32-bit computers this number may be inexact even for small floats.
    On 64-bit it works fine.  This is the 32-bit output for this result.

        common.unitNormalizeProportion([0.2, 0.6, 0.2])
        [0.20000000000000001, 0.59999999999999998, 0.20000000000000001]

    Negative values should be shifted to positive region first:

    >>> common.unitNormalizeProportion([0, -2, -8])
    Traceback (most recent call last):
    ValueError: value members must be positive
    rE   zvalue members must be positive)rG   Úappend)r—   Ú	summationr•   r§   s       rK   r"   r"   ·  sm   € ð4 €IØð ð ˆØˆsŠ7ˆ7ÝÐ=Ñ>Ô>Ð>Ø�Q‰ˆ	ˆ	Ø€DØð %ð %ˆØ�Š�Q˜‘]Ñ$Ô$Ð$Ð$Ø€Krf   Úseriesúlist[tuple[int | float, float]]c                ó  — t          | ¦  «        }g }d}t          t          |¦  «        ¦  «        D ][}|t          |¦  «        dz
  k    r,|                     ||||         z   f¦  «         |||         z  }ŒD|                     |df¦  «         Œ\|S )aG  
    Take a series of parts with an implied sum, and create
    unit-interval boundaries proportional to the series components.

    >>> common.unitBoundaryProportion([1, 1, 2])
    [(0.0, 0.25), (0.25, 0.5), (0.5, 1.0)]
    >>> common.unitBoundaryProportion([9, 1, 1])
    [(0.0, 0.8...), (0.8..., 0.9...), (0.9..., 1.0)]
    rE   r:   rj   )r"   r¢   r¡   rÉ   )rË   r§   ÚboundsrÊ   r    s        rK   r!   r!   Ü  sœ   € õ # 6Ñ*Ô*€DØ€FØ€IÝ•s˜4‘y”yÑ!Ô!ð ,ð ,ˆØ•C˜‘I”I ‘MÒ!Ð!Ø�MŠM˜9 i°$°u´+Ñ&=Ð>Ñ?Ô?Ð?Ø˜˜eœÑ$ˆIˆIà�MŠM˜9 cÐ*Ñ+Ô+Ð+Ð+Ø€Mrf   ú	list[int]Úweightsúlist[int | float]c                óØ   — |� |¦   «         }nt          j         ¦   «         }t          |¦  «        }d}t          |¦  «        D ]"\  }\  }}||cxk    r|k     rn Œ| |         c S Œ#| |         S )aV  
    Given a list of values and an equal-sized list of weights,
    return a randomly selected value using the weight.

    Example: sum -1 and 1 for 100 values; should be
    around 0 or at least between -50 and 50 (99.99999% of the time)

    >>> -50 < sum([common.weightedSelection([-1, 1], [1, 1]) for x in range(100)]) < 50
    True
    Nr   )Úrandomr!   Ú	enumerate)r—   rÐ   ÚrandomGeneratorÚqÚ
boundariesr    ÚlowÚhighs           rK   r#   r#   ô  s�   € ð Ð"ØˆOÑÔˆˆåŒM‰OŒOˆå'¨Ñ0Ô0€JØ€EÝ'¨
Ñ3Ô3ð !ð !Ñˆ‰{��TØ�!ˆ?ˆ?Š?ˆ?�dŠ?ˆ?ˆ?ˆ?ˆ?Ø˜%”=Ð Ð Ð ð ð �%Œ=Ðrf   ç-Cëâ6?ú"Collection[int | float | Fraction]r–   c                óz  — t          t          | ¦  «        ¦  «        }d}| D ]0}||z  }|t          |¦  «        z
  }t          |d|¬¦  «        r|dz  }Œ1|t	          | ¦  «        k    r|S d}g }t          ¦   «         }	| D ]M}
g }|D ]1}|
|z  }|                     |¦  «         |	                     |¦  «         Œ2|                     |¦  «         ŒNg }|	D ]O}d}|D ] }|D ]}t          |||¬¦  «        r|dz  } nŒŒ!|t	          |¦  «        k    r|                     |¦  «         ŒP|st          d¦  «        ‚t          |¦  «        S )aÔ  
    Given a list of values, find the lowest common divisor of floating point values.

    >>> common.approximateGCD([2.5, 10, 0.25])
    0.25
    >>> common.approximateGCD([2.5, 10])
    2.5
    >>> common.approximateGCD([2, 10])
    2.0
    >>> common.approximateGCD([1.5, 5, 2, 7])
    0.5
    >>> common.approximateGCD([2, 5, 10])
    1.0
    >>> common.approximateGCD([2, 5, 10, 0.25])
    0.25
    >>> common.strTrimFloat(common.approximateGCD([1/3, 2/3]))
    '0.3333'
    >>> common.strTrimFloat(common.approximateGCD([5/3, 2/3, 4]))
    '0.3333'
    >>> common.strTrimFloat(common.approximateGCD([5/3, 2/3, 5]))
    '0.3333'
    >>> common.strTrimFloat(common.approximateGCD([5/3, 2/3, 5/6, 3/6]))
    '0.1667'
    r   rE   rC   r:   )rj   rl   rm   rn   g      @ro   g      @g       @g      "@g      $@g      &@g      (@g      *@g      ,@g      .@g      0@zcannot find a common divisor)
rI   ÚminrM   r   r¡   ÚsetrÉ   ÚaddrG   Úmax)r—   r–   ÚlowestÚcountr•   Úx_adjustÚfloatingValueÚdivisorsÚ	divisionsÚuniqueDivisionsr    ÚcollrN   r˜   ÚcommonUniqueDivisionss                  rK   r   r     s®  € õ2 •3�v‘;”;ÑÔ€Fð €EØð ð ˆØ�v‘:ˆØ ¥3 x¡=¤=Ñ0ˆå�= #¨uÐ5Ñ5Ô5ð 	Ø�Q‰JˆEøØ•�F‘”ÒÐØˆð€Hð €IÝ‘e”e€OØð ð ˆØˆØð 	#ð 	#ˆAØ˜‘	ˆAØ�KŠK˜‰NŒNˆNØ×Ò Ñ"Ô"Ð"Ð"Ø×Ò˜ÑÔÐÐàÐØð 
,ð 
,ˆØˆØð 	ð 	ˆDØð ð �å˜1˜a¨Ð/Ñ/Ô/ð Ø˜Q‘J�EØ�Eðøð •C˜	‘N”NÒ"Ð"Ø!×(Ò(¨Ñ+Ô+Ð+øØ ð 9ÝÐ7Ñ8Ô8Ð8ÝÐ$Ñ%Ô%Ð%rf   Úboolc                óˆ   — | d         }t          dt          | ¦  «        ¦  «        D ]}| |         }||dz   k    r dS |dz  }ŒdS )a£  
    returns bool True or False if a list containing ints
    contains only contiguous (increasing) values

    requires the list to be sorted first

    >>> l = [3, 4, 5, 6]
    >>> common.contiguousList(l)
    True
    >>> l.append(8)
    >>> common.contiguousList(l)
    False

    Sorting matters

    >>> l.append(7)
    >>> common.contiguousList(l)
    False
    >>> common.contiguousList(sorted(l))
    True
    r   r:   FT)r¢   r¡   )ÚinputListOrTupleÚcurrentMaxValr    ÚnewVals       rK   r   r   X  sb   € ð, % QÔ'€MÝ�q�#Ð.Ñ/Ô/Ñ0Ô0ð ð ˆØ! %Ô(ˆØ�] QÑ&Ò&Ð&Ø�5�5Ø˜ÑˆˆØˆ4rf   Úsrcúlist[list[int]]c                óØ  — t          | ¦  «        dk    r| gS g }g }|                      ¦   «          d}|t          | ¦  «        dz
  k     r£| |         }|                     |¦  «         | |dz            }||dz   k    r|                     |¦  «         g }|t          | ¦  «        dz
  k    r*|                     |¦  «         |                     |¦  «         |dz  }|t          | ¦  «        dz
  k     °£|S )a7  
    Given a list of integers, group contiguous values into sub lists

    >>> common.groupContiguousIntegers([3, 5, 6])
    [[3], [5, 6]]
    >>> common.groupContiguousIntegers([3, 4, 6])
    [[3, 4], [6]]
    >>> common.groupContiguousIntegers([3, 4, 6, 7])
    [[3, 4], [6, 7]]
    >>> common.groupContiguousIntegers([3, 4, 6, 7, 20])
    [[3, 4], [6, 7], [20]]
    >>> common.groupContiguousIntegers([3, 4, 5, 6, 7])
    [[3, 4, 5, 6, 7]]
    >>> common.groupContiguousIntegers([3])
    [[3]]
    >>> common.groupContiguousIntegers([3, 200])
    [[3], [200]]
    r:   r   r´   )r¡   ÚsortrÉ   )rï   ÚpostÚgroupÚiÚeÚeNexts         rK   r   r   w  sô   € õ& ˆ3�x„x�1‚}€}ØˆuˆØ€DØ€EØ‡H‚H�J„J€JØ	€AØ
�s�3‰xŒx˜!‰|Ò
Ð
Ø�ŒFˆØ�Š�Q‰ŒˆØ�A˜‘E”
ˆà�A˜‘EŠ>ˆ>à�KŠK˜ÑÔÐØˆEà•�C‘”˜1‘ÒÐà�LŠL˜ÑÔÐØ�KŠK˜ÑÔÐà	ˆQ‰ˆð �s�3‰xŒx˜!‰|Ò
Ð
ð" €Krf   F)ÚstrictModernc               ó6  — |                       ¦   «         }d}d}d}g }|D ]}||vrt          d|› �¦  «        ‚Œt          t          |¦  «        ¦  «        D ]¸}||         }||                     |¦  «                 }		 ||                     ||dz            ¦  «                 }
|
|	k    r*|	|v r&|r|
|	dz  k    rt          dd| › �z   ¦  «        ‚|	d	z  }	n|
|	k    rt          d
| › �¦  «        ‚n# t
          $ r Y nw xY w|                     |	¦  «         Œ¹d}|D ]}||z  }Œ|S )a{  

    Convert a Roman numeral (upper or lower) to an int

    https://code.activestate.com/recipes/81611-roman-numerals/

    >>> common.fromRoman('ii')
    2
    >>> common.fromRoman('vii')
    7

    Works with both IIII and IV forms:

    >>> common.fromRoman('MCCCCLXXXIX')
    1489
    >>> common.fromRoman('MCDLXXXIX')
    1489

    Some people consider this an error, but you see it in medieval and ancient roman documents:

    >>> common.fromRoman('ic')
    99

    unless strictModern is True

    >>> common.fromRoman('ic', strictModern=True)
    Traceback (most recent call last):
    ValueError: input contains an invalid subtraction element (modern interpretation): ic

    But things like this are never seen, and thus cause an error:

    >>> common.fromRoman('vx')
    Traceback (most recent call last):
    ValueError: input contains an invalid subtraction element: vx
    )r:   é
   éd   )ÚMÚDÚCÚLÚXÚVÚI)r¹   éô  rû   é2   rú   é   r:   z$value is not a valid roman numeral: r:   rú   z.input contains an invalid subtraction element z(modern interpretation): r‡   z/input contains an invalid subtraction element: r   )ÚupperrG   r¢   r¡   r    Ú
IndexErrorrÉ   )rp   rø   Ú
inputRomanÚsubtractionValuesÚnumsÚintsÚplacesÚcrõ   r?   Ú	nextValuerÊ   rL   s                rK   r   r   ¥  s£  € ðH —’‘”€JØ$ÐØ.€DØ)€DØ€FØð Rð RˆØ�Dˆ=ˆ=ÝÐPÀJÐPÐPÑQÔQÐQð õ •3�z‘?”?Ñ#Ô#ð ð ˆØ�qŒMˆØ�T—Z’Z ‘]”]Ô#ˆð	Ø˜TŸZšZ¨
°1°q±5Ô(9Ñ:Ô:Ô;ˆIØ˜5Ò Ð  UÐ.?Ð%?Ð%?Øð = I°¸±Ò$;Ð$;Ý$ØHØ;°cÐ;Ð;ñ<ñ=ô =ð =ð ˜‘��Ø˜UÒ"Ð"Ý ØKÀcÐKÐKñMô Mð Møøåð 	ð 	ð 	àˆDð	øøøð 	�Š�eÑÔÐÐØ€IØð ð ˆØ�Q‰ˆ	ˆ	ØÐs   Á:A,C'Ã'
C4Ã3C4c                ó\  — t          | t          ¦  «        st          dt          | ¦  «        › �¦  «        ‚d| cxk     rdk     sn t	          d¦  «        ‚d}d}d}t          t          |¦  «        ¦  «        D ]6}t          | ||         z  ¦  «        }|||         |z  z  }| ||         |z  z  } Œ7|S )a›  
    Convert a number from 1 to 3999 to a roman numeral

    >>> common.toRoman(2)
    'II'
    >>> common.toRoman(7)
    'VII'
    >>> common.toRoman(1999)
    'MCMXCIX'

    >>> common.toRoman('hi')
    Traceback (most recent call last):
    TypeError: expected integer, got <... 'str'>

    >>> common.toRoman(0)
    Traceback (most recent call last):
    ValueError: Argument must be between 1 and 3999
    zexpected integer, got r   i   z#Argument must be between 1 and 3999)r¹   é„  r  i�  rû   éZ   r  é(   rú   r³   r  r™   r:   )rü   ÚCMrý   ÚCDrþ   ÚXCrÿ   ÚXLr   ÚIXr  ÚIVr  Ú )r~   rM   rH   rz   rG   r¢   r¡   )rp   r  r
  Úresultrõ   râ   s         rK   r    r    í  sÅ   € õ& �c�3ÑÔð >ÝÐ<µ°c±´Ð<Ð<Ñ=Ô=Ð=Øˆsˆ>ˆ>Š>ˆ>�TŠ>ˆ>ˆ>ˆ>ÝÐ>Ñ?Ô?Ð?ØA€DØR€DØ€FÝ•3�t‘9”9ÑÔð ð ˆÝ�C˜$˜qœ'‘MÑ"Ô"ˆØ�$�q”'˜E‘/Ñ!ˆØˆt�AŒw˜‰ÑˆˆØ€Mrf   c                ó¤   — | dz  }|dv rd}n6| dz  }|dk    rd}n(|dv rd}n!|dk    rd	}n|d
k    rd}nt          d¦  «        ‚|dk    r|r|dz  }|S )z×
    Return the ordinal abbreviations for integers

    >>> common.ordinalAbbreviation(3)
    'rd'
    >>> common.ordinalAbbreviation(255)
    'th'
    >>> common.ordinalAbbreviation(255, plural=True)
    'ths'
    rû   )é   é   é   Úthrú   r:   Úst)r   r™   r  é   rª   r<   r³   r´   Úndé   ÚrdzSomething really weirdÚs)rG   )r?   ÚpluralÚvalueHundredthsró   ÚvalueMods        rK   r   r     s•   € ð ˜c‘k€OØ˜,Ð&Ð&Øˆˆà˜2‘:ˆØ�qŠ=ˆ=ØˆDˆDØÐ.Ð.Ð.ØˆDˆDØ˜Š]ˆ]ØˆDˆDØ˜Š]ˆ]ØˆDˆDåÐ5Ñ6Ô6Ð6àˆt‚|€|˜€|Ø�‰ˆØ€Krf   c                  ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚTestz*
    Tests not requiring file output.
    c                ó   — d S rr   rs   ©Úselfs    rK   ÚsetUpz
Test.setUpH  s   € Øˆrf   c                ó\   — dD ](\  }}|                       |t          |¦  «        ¦  «         Œ)d S )N))r:   r  )r#  ÚIII)r  r  )ÚassertEqualr    )r-  rï   Údsts      rK   ÚtestToRomanzTest.testToRomanK  s>   € Ø8ð 	0ð 	0‰HˆC�Ø×Ò˜S¥'¨#¡,¤,Ñ/Ô/Ð/Ð/ð	0ð 	0rf   c                óš  — |                       t          d         d¦  «         |                       t          d         d¦  «         |                       t          d         d¦  «         |                       t          d         d¦  «         |                       t          d         d¦  «         |                       t          d         d¦  «         |                       t          d	         d¦  «         |                       t          d
         d¦  «         |                       t          d         d¦  «         |                       t          d         d¦  «         d S )NÚunisonr:   r9   Úfirstr%   Ú1stÚoctaver<   r;   Úeighthr,   Ú8th)r1  r   r,  s    rK   ÚtestOrdinalsToNumberszTest.testOrdinalsToNumbersO  s   € Ø×ÒÕ*¨8Ô4°aÑ8Ô8Ð8Ø×ÒÕ*¨8Ô4°aÑ8Ô8Ð8Ø×ÒÕ*¨7Ô3°QÑ7Ô7Ð7Ø×ÒÕ*¨7Ô3°QÑ7Ô7Ð7Ø×ÒÕ*¨5Ô1°1Ñ5Ô5Ð5Ø×ÒÕ*¨8Ô4°aÑ8Ô8Ð8Ø×ÒÕ*¨8Ô4°aÑ8Ô8Ð8Ø×ÒÕ*¨8Ô4°aÑ8Ô8Ð8Ø×ÒÕ*¨8Ô4°aÑ8Ô8Ð8Ø×ÒÕ*¨5Ô1°1Ñ5Ô5Ð5Ð5Ð5rf   c                óì  — t          d¦  «        D ]P}d}t          d¦  «        D ]}|t          ddgddg¦  «        z  }Œ|                      d|cxk     odk     nc ¦  «         ŒQt          d¦  «        D ]P}d}t          d¦  «        D ]}|t          ddgddg¦  «        z  }Œ|                      d|cxk    od	k     nc ¦  «         ŒQt          d¦  «        D ]P}d}t          d¦  «        D ]}|t          ddgddg¦  «        z  }Œ|                      d
|cxk    odk    nc ¦  «         ŒQt          d¦  «        D ]C}d}t          d¦  «        D ]}|t          ddgddg¦  «        z  }Œ|                      |d¦  «         ŒDd S )Nrú   r   r¹   r‡   r:   iÿÿÿéú   i'  é   r  )r¢   r#   Ú
assertTruer1  )r-  r»   r•   rõ   Úunused_js        rK   ÚtestWeightedSelectionzTest.testWeightedSelection[  sâ  € å�r‘”ð 	,ð 	,ˆAØˆAÝ˜4‘[”[ð 8ð 8�àÕ&¨¨A w°°A°Ñ7Ô7Ñ7��à�OŠO˜D 1˜N˜NšN˜N sšN˜N˜N˜NÑ+Ô+Ð+Ð+õ �r‘”ð 	)ð 	)ˆAØˆAÝ˜4‘[”[ð ;ð ;�àÕ&¨¨1 v°°q¨zÑ:Ô:Ñ:��à�OŠO˜A ˜K˜KšK˜K RšK˜K˜K˜KÑ(Ô(Ð(Ð(å�r‘”ð 	.ð 	.ˆAØˆAÝ˜4‘[”[ð ;ð ;�àÕ&¨¨1 v°°5¨zÑ:Ô:Ñ:��à�OŠO˜C 1Ð,Ð,Ò,Ð,¨Ò,Ð,Ð,Ð,Ñ-Ô-Ð-Ð-å˜b™	œ	ð 	#ð 	#ˆHØˆAÝ˜4‘[”[ð 7ð 7�àÕ&¨¨1 v°°1¨vÑ6Ô6Ñ6��à×Ò˜Q Ñ"Ô"Ð"Ð"ð	#ð 	#rf   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r.  r3  r;  rA  rs   rf   rK   r*  r*  C  sZ   € € € € € ðð ðð ð ð0ð 0ð 0ð
6ð 
6ð 
6ð!#ð !#ð !#ð !#ð !#rf   r*  Ú__main__)r?   r   r@   rA   )rL   rM   rN   rM   r@   rO   )rp   rM   r@   rI   )rp   rv   r@   rv   )rp   r   r@   r   )r„   r…   )rp   r�   r@   r�   )r“   )r@   rv   )r™   )rš   rI   r›   rM   r@   r‹   )rL   rI   r§   rI   r@   r¨   )r±   rM   r@   rI   )r¶   rI   r@   rO   )r—   rÆ   r@   rÇ   )rË   rÆ   r@   rÌ   rr   )r—   rÏ   rÐ   rÑ   r@   rM   )rÚ   )r—   rÛ   r–   rI   r@   rI   )r@   rê   )rï   rÏ   r@   rð   )rp   r‹   r@   rM   )rp   rM   r@   r‹   )F)r?   rM   r@   r‹   )AÚ
__future__r   Ú	fractionsr   Ú	functoolsr   r«   r   r   ÚnumbersrÓ   Útypingr   r	   ÚunittestÚmusic21r
   Úmusic21.common.typesr   r   Úcollections.abcr   r   Ú__all__r   r   r   ÚlimitOffsetDenominatorrQ   re   Ú	frozensetry   r   r   r   r   r   r   rµ   r   r   r"   r!   r#   r   r   r   r   r    r   r   r¢   r¡   Úordinal_indexÚordinalNameÚlowerÚordinalNameLowerr‹   ÚmusicOrdinalNameÚmusicOrdinalNameLowerÚTestCaser*  Ú
_DOC_ORDERrB  ÚmainTestrs   rf   rK   ú<module>r\     sØ  ðð #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ð Ð Ø €€€Ø €€€Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø €€€à Ð Ð Ð Ð Ð Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5àð 5Ø4Ð4Ð4Ð4Ð4Ð4Ð4Ð4ðð ð €ð0ð ð €ð ˜˜˜”€Ø€ˆaÑ Ø€ˆaÑ Ø#€ˆbÑ Ø#€ˆbÑ ðBð Bð Bð BðJ Ô-€àðQ"ð Q"ð Q"ñ „ðQ"ðp �	ð ð ð ñ ô €ð
 
ðð ð ñ 
„ðð 
ðð ð ñ 
„ððp6ð p6ð p6ð p6ðh #+Ô"Að?ð ?ð ?ð ?ð ?ðD-ð -ð -ð -ð`ð ð ð ð ð<ð ð ð ð ð<CKð CKð CKð CKðL9€ð5ð 5ð 5ð 5ð2;"ð ;"ð ;"ð ;"ð|"ð "ð "ð "ðJð ð ð ð4 '+ðð ð ð ð ð:C&ð C&ð C&ð C&ð C&ðNð ð ð ð>*ð *ð *ð *ð\ ).ð Dð Dð Dð Dð Dð DðPð ð ð ðBð ð ð ð ð@ Ð Ø�U˜3˜3˜x™=œ=Ñ)Ô)ð Að A€MØ˜=Ô)€KØ"×(Ò(Ñ*Ô*ÐØ%2Ð�kÑ"Ø*7ÐÐ&Ñ'ØQ^Ð�c�c˜-Ñ(Ô(Ð+>Ð+>¸}Ñ+MÔ+MÑMÑNà$ ]Ô3ÐØ˜;Ò&Ð&Ø 0× 6Ò 6Ñ 8Ô 8ÐØ.;ÐÐ*Ñ+Ø3@ÐÐ/Ñ0øàØØØØð9#ð 9#ð 9#ð 9#ð 9#ˆ8Ôñ 9#ô 9#ð 9#ð| ˜Ð!€
ð ˆzÒÐØ€N€N€NØ€GÔ�TÑÔÐÐÐð Ðrf   