grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026B J×Q ã @s¢dZddddddddd d d g Zyd d lmZWnek rBYnXd dlmZd dlmZd dl m Z d dl m Z dZ dZe efdd„Ze efdd„Zefdd„Zefdd„Zefdd„Zefdd„Zefdd„Zefd d!„Zefd"d#„Zefd$d%„Zefd&d'„Zefd(d)„Zefd*d+„Zefd,d-„Zd.efd/efd0efgd0efd1efd.efgd1efd0efd/efgd/efd.efd1efgd2œZd3d„Zd4d„Z yd d5lm Z Wnek �r´YnXGd6d „d ƒZ!yd d7lm!Z!Wnek �rêYnXGd8d „d e"ƒZ#ed9d:d;dd?„d?e%ƒZ&e"ƒfe'e(he)e*e+fd@dA„Z,dRdDd„Z-dEdF„Z.yd dGlm.Z.Wnek �rrYnXdHdI„Z/dSdKdL„Z0dMdN„Z1dOdP„Z2dQd „Z3dJS)TzEfunctools.py - Tools for working with functions and callable objects Úupdate_wrapperÚwrapsÚWRAPPER_ASSIGNMENTSÚWRAPPER_UPDATESÚtotal_orderingÚ cmp_to_keyÚ lru_cacheÚreduceÚpartialÚ partialmethodÚsingledispatché)r)Úget_cache_token)Ú namedtuple)Úrecursive_repr)ÚRLock)Ú __module__Ú__name__Ú __qualname__Ú__doc__Ú__annotations__)Ú__dict__c Csnx<|D]4}yt||ƒ}Wntk r,YqXt|||ƒqWx$|D]}t||ƒ t||iƒ¡qDW||_|S)aUpdate a wrapper function to look like the wrapped function wrapper is the function to be updated wrapped is the original function assigned is a tuple naming the attributes assigned directly from the wrapped function to the wrapper function (defaults to functools.WRAPPER_ASSIGNMENTS) updated is a tuple naming the attributes of the wrapper that are updated with the corresponding attribute from the wrapped function (defaults to functools.WRAPPER_UPDATES) )ÚgetattrÚAttributeErrorÚsetattrÚupdateÚ __wrapped__)ÚwrapperÚwrappedÚassignedÚupdatedÚattrÚvalue©r"ú./opt/alt/python37/lib64/python3.7/functools.pyr%s  cCstt|||d�S)a‹Decorator factory to apply update_wrapper() to a wrapper function Returns a decorator that invokes update_wrapper() with the decorated function as the wrapper argument and the arguments to wraps() as the remaining arguments. Default arguments are as for update_wrapper(). This is a convenience function to simplify applying partial() to update_wrapper(). )rrr)r r)rrrr"r"r#rCs cCs$| |¡}||kr|S| o"||kS)zIReturn a > b. Computed by @total_ordering from (not a < b) and (a != b).)Ú__lt__)ÚselfÚotherÚNotImplementedÚ op_resultr"r"r#Ú _gt_from_lt[s r)cCs| |¡}|p||kS)zEReturn a <= b. Computed by @total_ordering from (a < b) or (a == b).)r$)r%r&r'r(r"r"r#Ú _le_from_ltbs r*cCs| |¡}||kr|S| S)z=Return a >= b. Computed by @total_ordering from (not a < b).)r$)r%r&r'r(r"r"r#Ú _ge_from_ltgs r+cCs$| |¡}||kr|S| p"||kS)zJReturn a >= b. Computed by @total_ordering from (not a <= b) or (a == b).)Ú__le__)r%r&r'r(r"r"r#Ú _ge_from_lens r-cCs"| |¡}||kr|S|o ||kS)zFReturn a < b. Computed by @total_ordering from (a <= b) and (a != b).)r,)r%r&r'r(r"r"r#Ú _lt_from_leus r.cCs| |¡}||kr|S| S)z=Return a > b. Computed by @total_ordering from (not a <= b).)r,)r%r&r'r(r"r"r#Ú _gt_from_le|s r/cCs$| |¡}||kr|S| o"||kS)zIReturn a < b. Computed by @total_ordering from (not a > b) and (a != b).)Ú__gt__)r%r&r'r(r"r"r#Ú _lt_from_gtƒs r1cCs| |¡}|p||kS)zEReturn a >= b. Computed by @total_ordering from (a > b) or (a == b).)r0)r%r&r'r(r"r"r#Ú _ge_from_gtŠs r2cCs| |¡}||kr|S| S)z=Return a <= b. Computed by @total_ordering from (not a > b).)r0)r%r&r'r(r"r"r#Ú _le_from_gt�s r3cCs$| |¡}||kr|S| p"||kS)zJReturn a <= b. Computed by @total_ordering from (not a >= b) or (a == b).)Ú__ge__)r%r&r'r(r"r"r#Ú _le_from_ge–s r5cCs"| |¡}||kr|S|o ||kS)zFReturn a > b. Computed by @total_ordering from (a >= b) and (a != b).)r4)r%r&r'r(r"r"r#Ú _gt_from_ge�s r6cCs| |¡}||kr|S| S)z=Return a < b. Computed by @total_ordering from (not a >= b).)r4)r%r&r'r(r"r"r#Ú _lt_from_ge¤s r7r0r,r4r$)r$r,r0r4csZ‡fdd„tDƒ}|stdƒ‚t|ƒ}x.t|D]"\}}||kr0||_tˆ||ƒq0WˆS)z6Class decorator that fills in missing ordering methodscs(h|] }tˆ|dƒtt|dƒk r|’qS)N)rÚobject)Ú.0Úop)Úclsr"r#ú ½sz!total_ordering..z6must define at least one ordering operation: < > <= >=)Ú_convertÚ ValueErrorÚmaxrr)r;ÚrootsÚrootÚopnameÚopfuncr")r;r#rºscsG‡fdd„dtƒ}|S)z,Convert a cmp= function into a key= functioncsZeZdZdgZdd„Z‡fdd„Z‡fdd„Z‡fdd „Z‡fd d „Z‡fd d „Z dZ dS)zcmp_to_key..KÚobjcSs ||_dS)N)rD)r%rDr"r"r#Ú__init__Ðszcmp_to_key..K.__init__csˆ|j|jƒdkS)Nr )rD)r%r&)Úmycmpr"r#r$Òszcmp_to_key..K.__lt__csˆ|j|jƒdkS)Nr )rD)r%r&)rFr"r#r0Ôszcmp_to_key..K.__gt__csˆ|j|jƒdkS)Nr )rD)r%r&)rFr"r#Ú__eq__Öszcmp_to_key..K.__eq__csˆ|j|jƒdkS)Nr )rD)r%r&)rFr"r#r,Øszcmp_to_key..K.__le__csˆ|j|jƒdkS)Nr )rD)r%r&)rFr"r#r4Úszcmp_to_key..K.__ge__N) rrrÚ __slots__rEr$r0rGr,r4Ú__hash__r")rFr"r#ÚKÎs     rJ)r8)rFrJr")rFr#rÌs)rcsJeZdZdZdZ‡fdd„Zdd„Zeƒdd„ƒZd d „Z d d „Z ‡Z S) r zSNew function with partial application of the given arguments and keywords. )ÚfuncÚargsÚkeywordsrÚ __weakref__csœ|s tdƒ‚t|ƒdkr tdƒ‚|^}}}t|ƒs:tdƒ‚t|ƒ}t|dƒrv|j|}|j ¡}| |¡|}~|j }t t |ƒ  |¡}||_ ||_||_|S)Nz1descriptor '__new__' of partial needs an argumentéz*type 'partial' takes at least one argumentz#the first argument must be callablerK) Ú TypeErrorÚlenÚcallableÚtupleÚhasattrrLrMÚcopyrrKÚsuperr Ú__new__)rLrMr;rKZtmpkwr%)Ú __class__r"r#rWñs(      zpartial.__new__cOs:|s tdƒ‚|^}}|j ¡}| |¡|j|j|ž|ŽS)Nz2descriptor '__call__' of partial needs an argument)rPrMrUrrKrL)rLrMr%Z newkeywordsr"r"r#Ú__call__ s   zpartial.__call__cCs‚t|ƒj}t|jƒg}| dd„|jDƒ¡| dd„|j ¡Dƒ¡t|ƒjdkrld|›dd  |¡›d�S|›dd  |¡›d�S) Ncss|]}t|ƒVqdS)N)Úrepr)r9Úxr"r"r#ú sz#partial.__repr__..css |]\}}|›d|›�VqdS)ú=Nr")r9ÚkÚvr"r"r#r\sÚ functoolsz functools.ú(z, ú)) ÚtyperrZrKÚextendrLrMÚitemsrÚjoin)r%ÚqualnamerLr"r"r#Ú__repr__s  zpartial.__repr__cCs*t|ƒ|jf|j|j|jpd|jp$dffS)N)rcrKrLrMr)r%r"r"r#Ú __reduce__szpartial.__reduce__cCsÌt|tƒstdƒ‚t|ƒdkr0tdt|ƒ›�ƒ‚|\}}}}t|ƒrrt|tƒrr|dk r`t|tƒrr|dk rzt|tƒsztdƒ‚t|ƒ}|dkr�i}nt|ƒtk r¤t|ƒ}|dkr°i}||_||_||_ ||_ dS)Nz(argument to __setstate__ must be a tupleézexpected 4 items in state, got zinvalid partial state) Ú isinstancerSrPrQrRÚdictrcrrKrLrM)r%ÚstaterKrLÚkwdsÚ namespacer"r"r#Ú __setstate__ s(    zpartial.__setstate__) rrrrrHrWrYrrhrirpÚ __classcell__r"r")rXr#r ês  )r c@s<eZdZdZdd„Zdd„Zdd„Zdd „Zed d „ƒZ d S) r zÂMethod descriptor with partial application of the given arguments and keywords. Supports wrapping existing descriptors and handles non-descriptor callables as instance methods. cOsÌt|ƒdkr|^}}}n>|s&tdƒ‚n0d|krB| d¡}|^}}ntdt|ƒdƒ‚t|ƒ}t|ƒs~t|dƒs~td |¡ƒ‚t|tƒr¶|j |_ |j ||_ |j   ¡|_ |j   |¡n||_ ||_ ||_ dS)NrOz8descriptor '__init__' of partialmethod needs an argumentrKz8type 'partialmethod' takes at least one argument, got %déÚ__get__z${!r} is not callable or a descriptor)rQrPÚpoprSrRrTÚformatrkr rKrLrMrUr)rLrMr%rKr"r"r#rEFs*        zpartialmethod.__init__cCsNd tt|jƒ¡}d dd„|j ¡Dƒ¡}d}|j|jj|jj |j ||d�S)Nz, css|]\}}d ||¡VqdS)z{}={!r}N)ru)r9r^r_r"r"r#r\isz)partialmethod.__repr__..z*{module}.{cls}({func}, {args}, {keywords}))Úmoduler;rKrLrM) rfÚmaprZrLrMrerurXrrrK)r%rLrMÚ format_stringr"r"r#rhgs  zpartialmethod.__repr__cs‡fdd„}ˆj|_ˆ|_|S)Ncs<ˆj ¡}| |¡|^}}|fˆjt|ƒ}ˆj||ŽS)N)rMrUrrLrSrK)rLrMÚ call_keywordsÚ cls_or_selfÚrestÚ call_args)r%r"r#Ú_methodss   z3partialmethod._make_unbound_method.._method)Ú__isabstractmethod__Ú_partialmethod)r%r}r")r%r#Ú_make_unbound_methodrs z"partialmethod._make_unbound_methodcCs€t|jddƒ}d}|dk rd|||ƒ}||jk rdt|f|jž|jŽ}y |j|_Wntk rbYnX|dkr|| ¡ ||¡}|S)Nrs) rrKr rLrMÚ__self__rr€rs)r%rDr;ÚgetÚresultÚnew_funcr"r"r#rs}s   zpartialmethod.__get__cCst|jddƒS)Nr~F)rrK)r%r"r"r#r~�sz"partialmethod.__isabstractmethod__N) rrrrrErhr€rsÚpropertyr~r"r"r"r#r >s !  Ú CacheInfoÚhitsÚmissesÚmaxsizeÚcurrsizec@s(eZdZdZdZefdd„Zdd„ZdS)Ú _HashedSeqzà This class guarantees that hash() will be called no more than once per element. This is important because the lru_cache() will hash the key multiple times on a cache miss. Ú hashvaluecCs||dd…<||ƒ|_dS)N)rŒ)r%ÚtupÚhashr"r"r#rE¤s z_HashedSeq.__init__cCs|jS)N)rŒ)r%r"r"r#rI¨sz_HashedSeq.__hash__N)rrrrrHrŽrErIr"r"r"r#r‹›s r‹c s˜|}|r*||7}x| ¡D] } || 7}qW|rl||‡fdd„|Dƒƒ7}|r�||‡fdd„| ¡Dƒƒ7}n$||ƒdkr�ˆ|dƒ|kr�|dSt|ƒS)a‘Make a cache key from optionally typed positional and keyword arguments The key is constructed in a way that is flat as possible rather than as a nested structure that would take more memory. If there is only a single argument and its data type is known to cache its hash value, then that argument is returned without a wrapper. This saves space and improves lookup speed. c3s|]}ˆ|ƒVqdS)Nr")r9r_)rcr"r#r\Ãsz_make_key..c3s|]}ˆ|ƒVqdS)Nr")r9r_)rcr"r#r\Åsrrr )reÚvaluesr‹) rLrnÚtypedÚkwd_markÚ fasttypesrSrcrQÚkeyÚitemr")rcr#Ú _make_key«s  r•é€Fcs:tˆtƒrˆdkr(d‰nˆdk r(tdƒ‚‡‡fdd„}|S)a«Least-recently-used cache decorator. If *maxsize* is set to None, the LRU features are disabled and the cache can grow without bound. If *typed* is True, arguments of different types will be cached separately. For example, f(3.0) and f(3) will be treated as distinct calls with distinct results. Arguments to the cached function must be hashable. View the cache statistics named tuple (hits, misses, maxsize, currsize) with f.cache_info(). Clear the cache and statistics with f.cache_clear(). Access the underlying function with f.__wrapped__. See: http://en.wikipedia.org/wiki/Cache_replacement_policies#Least_recently_used_(LRU) r Nz)Expected maxsize to be an integer or Nonecst|ˆˆtƒ}t||ƒS)N)Ú_lru_cache_wrapperÚ _CacheInfor)Ú user_functionr)r‰r�r"r#Údecorating_functionìsz&lru_cache..decorating_function)rkÚintrP)r‰r�ršr")r‰r�r#rÊs csòtƒ‰t‰ d\‰‰‰‰i‰d‰ ‰ d‰ˆj‰ˆj‰tƒ‰ g‰ˆˆddgˆdd…<ˆ dkrh‡ ‡fdd„}nNˆ dkrŒ‡‡‡ ‡ ‡ ‡‡‡fdd„}n*‡‡‡‡‡‡‡‡‡ ‡ ‡ ‡ ‡ ‡‡‡fdd„}‡‡‡ ‡ ‡ ‡ fdd „}‡‡‡ ‡ ‡ ‡fd d „}||_||_|S) N)r rrrOér Fcsˆd7‰ˆ||Ž}|S)Nrrr")rLrnrƒ)rˆr™r"r#rs z#_lru_cache_wrapper..wrappercsHˆ||ˆƒ}ˆ|ˆƒ}|ˆk r*ˆd7‰|Sˆd7‰ˆ||Ž}|ˆ|<|S)Nrrr")rLrnr“rƒ)ÚcacheÚ cache_getr‡Úmake_keyrˆÚsentinelr�r™r"r#r s   c s2ˆ ||ˆƒ}ˆ �nˆ|ƒ}|dk rr|\}}}}||ˆ<||ˆ<ˆ ˆ}||ˆ<ˆ ˆ<||ˆ<ˆ |ˆ<ˆd7‰|Sˆ d7‰ WdQRXˆ||Ž}ˆ �–|ˆkržn†ˆrîˆ } || ˆ<|| ˆ<| ˆ‰ ˆ ˆ} ˆ ˆ} dˆ ˆ<ˆ ˆ<ˆ| =| ˆ|<n6ˆ ˆ}|ˆ ||g}||ˆ<ˆ ˆ<ˆ|<ˆƒˆ k‰WdQRX|S)Nrrr") rLrnr“ÚlinkZ link_prevZ link_nextZ_keyrƒZlastZoldrootZoldkeyZ oldresult)ÚKEYÚNEXTÚPREVÚRESULTr�ržÚ cache_lenÚfullr‡ÚlockrŸr‰rˆrAr�r™r"r#rsB     c s ˆ�ˆˆˆˆˆƒƒSQRXdS)zReport cache statisticsNr"r")r˜r¦r‡r¨r‰rˆr"r#Ú cache_infoTsz&_lru_cache_wrapper..cache_infoc s<ˆ�.ˆ ¡ˆˆddgˆdd…<d‰‰d‰WdQRXdS)z$Clear the cache and cache statisticsNr F)Úclearr")r�r§r‡r¨rˆrAr"r#Ú cache_clearYs z'_lru_cache_wrapper..cache_clear)r8r•r‚Ú__len__rr©r«)r™r‰r�r˜rr©r«r")r¢r£r¤r¥r˜r�ržr¦r§r‡r¨rŸr‰rˆrAr r�r™r#r—òs* *9 r—)r—cCsšg}x�dd„|Dƒ}|s|Sx:|D]2}|d}x$|D]}||dd…kr4d}Pq4WPq"W|dkrhtdƒ‚| |¡x|D]}|d|krx|d=qxWqWdS)zŒMerges MROs in *sequences* to a single MRO using the C3 algorithm. Adapted from http://www.python.org/download/releases/2.3/mro/. cSsg|] }|r|‘qSr"r")r9Úsr"r"r#ú xsz_c3_merge..r rrNzInconsistent hierarchy)Ú RuntimeErrorÚappend)Ú sequencesrƒÚs1Ú candidateÚs2Úseqr"r"r#Ú _c3_mergeps$     r¶Nc s$x8tt|jƒƒD]"\}‰tˆdƒrt|jƒ|}PqWd}ˆrFtˆƒng‰t|jd|…ƒ}g}t|j|d…ƒ}x8ˆD]0‰t|ˆƒrxt‡fdd„|jDƒƒsx| ˆ¡qxWx|D]‰ˆ  ˆ¡q²W‡fdd„|Dƒ}‡fdd„|Dƒ}‡fd d„|Dƒ} t |gg||| |g|g|gƒS) aƒComputes the method resolution order using extended C3 linearization. If no *abcs* are given, the algorithm works exactly like the built-in C3 linearization used for method resolution. If given, *abcs* is a list of abstract base classes that should be inserted into the resulting MRO. Unrelated ABCs are ignored and don't end up in the result. The algorithm inserts ABCs where their functionality is introduced, i.e. issubclass(cls, abc) returns True for the class itself but returns False for all its direct base classes. Implicit ABCs for a given class (either registered or inferred from the presence of a special method like __len__) are inserted directly after the last ABC explicitly listed in the MRO of said class. If two implicit ABCs end up next to each other in the resulting MRO, their ordering depends on the order of types in *abcs*. Ú__abstractmethods__r Nc3s|]}t|ˆƒVqdS)N)Ú issubclass)r9Úb)Úbaser"r#r\¨sz_c3_mro..csg|]}t|ˆd�‘qS))Úabcs)Ú_c3_mro)r9rº)r»r"r#r®¯sz_c3_mro..csg|]}t|ˆd�‘qS))r»)r¼)r9rº)r»r"r#r®°scsg|]}t|ˆd�‘qS))r»)r¼)r9rº)r»r"r#r®±s) Ú enumerateÚreversedÚ __bases__rTrQÚlistr¸Úanyr°Úremover¶) r;r»ÚiÚboundaryÚexplicit_basesÚabstract_basesÚ other_basesÚexplicit_c3_mrosÚabstract_c3_mrosÚ other_c3_mrosr")r»rºr#r¼‹s(    r¼csütˆjƒ‰‡‡fdd„‰‡fdd„ˆDƒ‰‡fdd„‰‡fdd„ˆDƒ‰tˆƒ‰g}xšˆD]’}g}x<| ¡D]0}|ˆkrltˆ|ƒrl| ‡fdd„|jDƒ¡qlW|s°| |¡qZ|jtd d �x,|D]$}x|D]}||krÎ| |¡qÎWqÄWqZWtˆ|d �S) zÛCalculates the method resolution order for a given class *cls*. Includes relevant abstract base classes (with their respective bases) from the *types* iterable. Uses a modified C3 linearization algorithm. cs|ˆkot|dƒotˆ|ƒS)NÚ__mro__)rTr¸)Útyp)Úbasesr;r"r#Ú is_relatedÁsz _compose_mro..is_relatedcsg|]}ˆ|ƒr|‘qSr"r")r9Ún)rÎr"r#r®Äsz _compose_mro..cs(x"ˆD]}||kr||jkrdSqWdS)NTF)rË)rÌr&)Útypesr"r#Úis_strict_baseÇs z$_compose_mro..is_strict_basecsg|]}ˆ|ƒs|‘qSr"r")r9rÏ)rÑr"r#r®Ìscsg|]}|ˆkr|‘qSr"r")r9r­)Útype_setr"r#r®ÕsT)r“Úreverse)r»)ÚsetrËÚ__subclasses__r¸r°ÚsortrQr¼)r;rÐÚmrorÌÚfoundÚsubÚsubclsr")rÍr;rÎrÑrÒrÐr#Ú _compose_mro¸s*      rÛcCsvt|| ¡ƒ}d}xX|D]P}|dk r\||krZ||jkrZ||jkrZt||ƒsZtd ||¡ƒ‚P||kr|}qW| |¡S)a^Returns the best matching implementation from *registry* for type *cls*. Where there is no registered implementation for a specific type, its method resolution order is used to find a more generic implementation. Note: if *registry* does not contain an implementation for the base *object* type, this function may return None. NzAmbiguous dispatch: {} or {})rÛÚkeysrËr¸r¯rur‚)r;Úregistryr×ÚmatchÚtr"r"r#Ú _find_implás     ràcs”ddl}ddl}i‰| ¡‰d‰‡‡‡fdd„‰d ‡‡‡‡fdd„ ‰‡‡fdd„}t|d d ƒ‰|ˆt<ˆ|_ˆ|_| ˆ¡|_ˆj |_ t ||ƒ|S) akSingle-dispatch generic function decorator. Transforms a function into a generic function, which can have different behaviours depending upon the type of its first argument. The decorated function acts as the default implementation, and additional implementations can be registered using the register() attribute of the generic function. r Nc s|ˆdk r"tƒ}ˆ|kr"ˆ ¡|‰y ˆ|}WnHtk rvy ˆ|}Wntk rht|ˆƒ}YnX|ˆ|<YnX|S)zÌgeneric_func.dispatch(cls) -> Runs the dispatch algorithm to return the best available implementation for the given *cls* registered on *generic_func*. N)r rªÚKeyErrorrà)r;Ú current_tokenÚimpl)Ú cache_tokenÚdispatch_cacherÝr"r#Údispatch s  z singledispatch..dispatchcs´|dkrˆtˆtƒr ‡‡fdd„Stˆdiƒ}|s@tdˆ›d�ƒ‚ˆ}ddlm}tt||ƒ ¡ƒƒ\}‰tˆtƒsˆt d |›d ˆ›d �ƒ‚|ˆˆ<ˆdkr¨t ˆd ƒr¨t ƒ‰ˆ  ¡|S) zƒgeneric_func.register(cls, func) -> func Registers a new implementation for the given *cls* on a *generic_func*. Ncs ˆˆ|ƒS)Nr")Úf)r;Úregisterr"r#Ú-óz2singledispatch..register..rz(Invalid first argument to `register()`: zS. Use either `@register(some_class)` or plain `@register` on an annotated function.r )Úget_type_hintszInvalid annotation for z. z is not a class.r·) rkrcrrPÚtypingrëÚnextÚiterreÚAssertionErrorrTr rª)r;rKÚannrëÚargname)rärårèrÝ)r;r#rè$s"    z singledispatch..registercs&|stˆ›d�ƒ‚ˆ|djƒ||ŽS)Nz( requires at least 1 positional argumentr )rPrX)rLÚkw)ræÚfuncnamer"r#rCszsingledispatch..wrapperrzsingledispatch function)N) rÐÚweakrefÚWeakKeyDictionaryrr8rèræÚMappingProxyTyperÝrªÚ _clear_cacher)rKrÐrôrr")rärærårórèrÝr#r ûs    )r–F)N)4rÚ__all__Ú _functoolsrÚ ImportErrorÚabcr Ú collectionsrÚreprlibrÚ_threadrrrrrr'r)r*r+r-r.r/r1r2r3r5r6r7r=rrr r8r r˜rÀr‹r›ÚstrrSrcrQr•rr—r¶r¼rÛràr r"r"r"r#ÚsŠ                    N[ (t -)