Ë ý,j» îãó°—dZddlZddl­ddlmZddlmZmZddlm Z dZ dZ e d fZ d Z d Zd Zd ZdZdZdZGd„d«Zedk(rddlmZeddd¬«yy)zH An auto-completion window for IDLE, used by the autocomplete extension éN)Ú*)Ú Scrollbar)ÚFILESÚATTRS)ÚMC_SHIFTz<>z z z<>) zzz z zz z z z z z z!<>z zz zcól—eZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„Zd„Zd„Zy)ÚAutoCompleteWindowcó8—||_||_dx|_x|_|_dx|_|_d|_d|_d|_ d|_ d|_ d|_ d|_ dx|_x|_x|_x|_x|_|_d|_d|_y)NF)ÚwidgetÚtagsÚautocompletewindowÚlistboxÚ scrollbarÚorigselforegroundÚorigselbackgroundÚ completionsÚmorecompletionsÚmodeÚstartÚ startindexÚlasttypedstartÚuserwantswindowÚhideidÚ keypressidÚ listupdateidÚ winconfigidÚ keyreleaseidÚ doubleclickidÚlastkey_was_tabÚis_configuring)Úselfr r s ú-/usr/lib/python3.12/idlelib/autocomplete_w.pyÚ__init__zAutoCompleteWindow.__init__sÄ€àˆŒ àˆŒ àBFÐFˆÔÐF $¤,°´ð;?Ð>ˆÔ Ô!7àˆÔà#ˆÔàˆŒ àˆŒ àˆŒð#ˆÔð $ˆÔðIMð MˆŒ ð M�d”oð M¨Ô(9ð MØ Ô ð MØ#Ô0°4Ô3Eà$ˆÔà#ˆÕócó2—tt|j«t|««}d}||kr5|j|||k(r |dz }||kr|j|||k(rŒ |t|j«krM|jj d|j |fzd|j t|j«fz«|t|«kr9|jj d|j |fz||d|j«||_y)Nréú%s+%dc)ÚminÚlenrr ÚdeleterÚinsertr )r!ÚnewstartÚmin_lenÚis r"Ú _change_startz AutoCompleteWindow._change_start@sñ€Ü”c˜$Ÿ*™*“o¤s¨8£}Ó5ˆØ ˆØ�'Šk˜dŸj™j¨™m¨x¸©{Ò:Ø �‰FˆAð�'Šk˜dŸj™j¨™m¨x¸©{Ó:à Œs�4—:‘:‹Ò Ø �K‰K× Ñ ˜x¨4¯?©?¸AÐ*>Ñ>Ø'¨4¯?©?¼CÀÇ Á »OÐ*LÑLô Nà Œs�8‹}Ò Ø �K‰K× Ñ ˜x¨4¯?©?¸AÐ*>Ñ>Ø'¨¨˜|Ø#Ÿy™yô *ðˆ� r$cóΗd}t|j«}||kDr(||zdz}|j||k\r|}n|dz}||kDrŒ(t|t|j«dz «S)z�Find the first index in self.completions where completions[i] is greater or equal to s, or the last index if there is no such. rér&)r)rr()r!Úsr.ÚjÚms r"Ú_binary_searchz!AutoCompleteWindow._binary_searchNsu€ð ˆ”3�t×'Ñ'Ó(ˆqØ�!ŠeØ�Q‘˜1‘ ˆAØ×Ñ Ñ" aÒ'Ø‘à˜‘E�ð �!‹eô �1”c˜$×*Ñ*Ó+¨AÑ-Ó.Ð.r$có —|j|«}|j|dt|«|k7r|S|dz}t|j«}||kDr4||zdz}|j|dt|«|k7r|}n|dz}||kDrŒ4|dz }||k(r|j|S|j|}|j|}tt|«t|««} t|«}|| kr!||||k(r|dz }|| kr ||||k(rŒ|d|S)zßAssuming that s is the prefix of a string in self.completions, return the longest string which is a prefix of all the strings which s is a prefix of them. If s is not a prefix of a string, return s. Nr&r1)r5rr)r() r!r2Úfirstr.r3r4ÚlastÚ first_compÚ last_compr-s r"Ú_complete_stringz#AutoCompleteWindow._complete_string[s>€ð ×#Ñ# AÓ&ˆØ × Ñ ˜EÑ " 7¤C¨£FÐ +¨qÒ 0àˆHà �A‰IˆÜ �× Ñ Ó !ˆØ�!ŠeØ�Q‘˜1‘ ˆAØ×Ñ Ñ" 7¤C¨£FÐ+¨qÒ0Ø‘à˜‘E�ð �!‹eð �‰sˆà �DŠ=Ø×#Ñ# EÑ*Ð *ð×%Ñ% eÑ,ˆ Ø×$Ñ$ TÑ*ˆ Ü”c˜*“o¤s¨9£~Ó6ˆÜ �‹FˆØ�'Šk˜j¨™m¨y¸©|Ò;Ø �‰FˆAð�'Šk˜j¨™m¨y¸©|Ó;à˜"˜1ˆ~Ðr$có|—t|jj«d«}|jj|«|j}|j |}|j |«|k(r|}nKtt|«t|««}d}||kr!||||k(r|dz }||kr ||||k(rŒ|d|}|j|«|j |dt|j«|jk(r2|jj|j|j¬«y|jj|jjd«|jjd«¬«|jr®|j|_d|_|jj!dt"«|j D]"}|jj%t"|«Œ$|jj'|j |j««|j)«yy)zzCall when the selection of the Listbox has changed. Updates the Listbox display and calls _change_start. rr&N)ÚselectbackgroundÚselectforegroundÚbgÚfg)ÚintrÚ curselectionÚseerrr5r(r)r/rÚ configurerrÚcgetrr*ÚENDr+Ú select_setÚ_selection_changed)r!ÚcurselÚltsÚselstartr,r-r.Úitems r"rHz%AutoCompleteWindow._selection_changed{sæ€ô �T—\‘\×.Ñ.Ó0°Ñ3Ó4ˆà � ‰ ×Ñ˜Ô à×!Ñ!ˆØ×#Ñ# FÑ+ˆØ × Ñ ˜sÓ # vÒ -؉Häœ#˜c›(¤C¨£MÓ2ˆG؈AØ�g’+ # a¡&¨H°Q©KÒ"7Ø�Q‘�ð�g’+ # a¡&¨H°Q©KÓ"7à  �|ˆHØ ×ј8Ô$à × Ñ ˜FÑ #Ð$4¤S¨¯©£_Ð 5¸¿¹Ò Cà �L‰L× "Ñ "°D×4JÑ4JØ48×4JÑ4Jð #õ Lð �L‰L× "Ñ "°D·L±L×4EÑ4EÀdÓ4KØ48·L±L×4EÑ4EÀdÓ4Kð #ô Mð×#Ò#Ø#'×#7Ñ#7�Ô Ø'+�Ô$Ø— ‘ ×#Ñ# A¤sÔ+Ø ×,Ô,�DØ—L‘L×'Ñ'¬¨TÕ2ð-à— ‘ ×'Ñ'¨×(;Ñ(;¸D¿J¹JÓ(GÔHØ×'Ñ'Õ)ð$r$cóú—|\|_|_||_|jj |«|_|jj |j d«|_|rœ|j|j«}|j}|j|«|j|«}|j||k(rA|t|j«dz k(s!|j|dzdt|«|k7r||k(S||_ |j|_ t|j«x|_} | j!«| j#d« | j$j'dd| j(dd«t-| t.¬«x|_} t3| | j4d ¬ «x|_} |jD]} | j9t:| «Œ| j=d «|_| j=d «|_ | jC| jD¬ «| jGtHtJ¬«| jGtLtNd¬«| jQ«|j6jS|j|j««|jU«| jWtX|jZ«|_.|jjWtX|jZ«|_/| jatXtb«tdD]"} |jjatX| «Œ$|jjWtf|jh«|_5tlD]"} |jjatf| «Œ$|jjWtn|jp«|_9|jjatntt«| jWtv|jx«|_=d |_>| jWt~|j€«|_A| jWt„|j†«|_Dy#t*$rY�ŒúwxYw)z®Show the autocomplete list, bind events. If complete is True, complete the text, and if there is exactly one matching completion, don't open a list. r+r&Nz!::tk::unsupported::MacWindowStyleÚstyleÚhelpÚ noActivates)ÚorientF)ÚyscrollcommandÚexportselectionr>r=)Úcommand)ÚsideÚfillT)rUrVÚexpand)Errrr ÚindexrÚgetrr;r/r5r)rrÚToplevelr ÚwithdrawÚwm_overrideredirectÚtkÚcallÚ_wÚTclErrorrÚVERTICALrÚListboxÚsetrr+rFrErrÚconfigÚyviewÚpackÚRIGHTÚYÚLEFTÚBOTHÚliftrGrHÚbindÚHIDE_VIRTUAL_EVENT_NAMEÚ hide_eventÚhideaidÚhidewidÚ event_addÚHIDE_FOCUS_OUT_SEQUENCEÚHIDE_SEQUENCESÚKEYPRESS_VIRTUAL_EVENT_NAMEÚkeypress_eventrÚKEYPRESS_SEQUENCESÚKEYRELEASE_VIRTUAL_EVENT_NAMEÚkeyrelease_eventrÚKEYRELEASE_SEQUENCEÚLISTUPDATE_SEQUENCEÚlistselect_eventrr ÚWINCONFIG_SEQUENCEÚwinconfig_eventrÚDOUBLECLICK_SEQUENCEÚdoubleclick_eventr)r!Ú comp_listsrXÚcompleterÚ userWantsWinÚ completedrr.ÚacwrrrLÚseqs r"Ú show_windowzAutoCompleteWindow.show_window¡s†€ð2<Ñ.ˆÔ˜$Ô.؈Œ ØŸ+™+×+Ñ+¨EÓ2ˆŒØ—[‘[—_‘_ T§_¡_°hÓ?ˆŒ Ù Ø×-Ñ-¨d¯j©jÓ9ˆIØ—J‘JˆEØ × Ñ ˜yÔ )Ø×#Ñ# IÓ.ˆAØ×Ñ Ñ" iÒ/Ø”S˜×)Ñ)Ó*¨1Ñ,Ò,Ø× Ñ   1¡Ñ% o¤s¨9£~Ð6¸)ÒCà  EÑ)Ð)Ø+ˆÔØ"Ÿj™jˆÔä(0°·±Ó(=Ð=ˆÔ #Ø � ‰ ŒØ ×Ñ Ô"ð à �F‰F�K‰KÐ;¸WÀcÇfÁfØ  ô /ô&/¨s¼8Ô%DÐDˆŒ˜Ü!(¨¸Y¿]¹]Ø9>ô"@ð @ˆŒ �wà×$Ô$ˆDØ �N‰Nœ3 Õ %ð%à!(§¡Ð.@Ó!AˆÔØ!(§¡Ð.@Ó!AˆÔØ×Ñ §¡ÐÔ/Ø�‰œE¬ˆÔ*Ø� ‰ œ$¤T°$ˆ Ô7à �‰Œ ð � ‰ ×Ñ × 3Ñ 3°D·J±JÓ ?Ô@Ø ×ÑÔ!ð—x‘xÔ 7¸¿¹ÓIˆŒ Ø—{‘{×'Ñ'Ô(?ÀÇÁÓQˆŒ Ø � ‰ Ô-Ô/FÔGß!ˆCØ �K‰K× !Ñ !Ô"9¸3Õ ?ð"ðŸ+™+×*Ñ*Ô+FØ+/×+>Ñ+>ó@ˆŒç%ˆCØ �K‰K× !Ñ !Ô"=¸sÕ Cð&à ŸK™K×,Ñ,Ô-JØ-1×-BÑ-BóDˆÔà � ‰ ×ÑÔ;ÔÑ)>ó@ˆÔà#ˆÔØŸ8™8Ô$6¸×8LÑ8LÓMˆÔØ$Ÿ\™\Ô*>Ø*.×*@Ñ*@óBˆÔàøôOò Ú ð úsÅ)Q-Ñ- Q:Ñ9Q:c óØ—|jryd|_|j«sy |j}|j|j«|j |j«\}}}}|j }tj«jd«r|j«|j«|j«} }|j«|j«} } |j«t|td| |z ««z} |j!«|z} | ||zz | k\s|| kr| |z } n| | z} |j#d| | fz«|j%«|j'«tj«jd«r( j+t,|j.«d|_d|_y#t($rYŒ^wxYw#t($rYŒ)wxYw)NTÚWindowsrz+%d+%dF)r Ú is_activer rCrÚbboxr ÚplatformÚsystemÚ startswithÚupdateÚ winfo_widthÚ winfo_heightÚ winfo_rootxr(ÚmaxÚ winfo_rootyÚ wm_geometryÚ deiconifyÚupdate_idletasksr`Úunbindr|r)r!ÚeventÚtextÚxÚyÚcxÚcyr„Ú acw_widthÚ acw_heightÚ text_widthÚ text_heightÚnew_xÚnew_ys r"r}z"AutoCompleteWindow.winconfig_eventés´€Ø × Ò à à"ˆÔØ�~‰~ÔØ ð à—;‘;ˆDØ �H‰H�T—_‘_Ô %ØŸ9™9 T§_¡_Ó5‰LˆAˆq�"�bØ×)Ñ)ˆCÜ�‰Ó ×+Ñ+¨IÔ6ð — ‘ ” Ø$'§O¡OÓ$5°s×7GÑ7GÓ7I�zˆIØ&*×&6Ñ&6Ó&8¸$×:KÑ:KÓ:M˜ ˆJØ×$Ñ$Ó&¬¨Q´°A°zÀIÑ7MÓ0NÓ)OÑOˆEØ×$Ñ$Ó&¨Ñ*ˆEؘq 2™vÑ&¨*Ò4Ø�z’>à˜‘ ‘ð˜Ñ#�Ø �O‰O˜H¨¨u ~Ñ5Ô 6Ø �M‰MŒOØ × Ñ Ô "ô �?‰?Ó × 'Ñ '¨ Ô 2ð Ø— ‘ Ô-¨t×/?Ñ/?Ô@ð $ˆDÔ à#ˆÕøôò Ù ð ûôò Ùð ús$§EGÆ GÇ GÇGÇ G)Ç(G)có´—|jsy |jj«s|j«yy#t$r|j«YywxYw©N)r Ú focus_getÚ hide_windowÚKeyError©r!s r"Ú_hide_event_checkz$AutoCompleteWindow._hide_event_checksS€Ø×&Ò&Ø ð Ø×*Ñ*×4Ñ4Ô6Ø× Ñ Õ"ð7øäò ð × Ñ Ö ð ús�*;»AÁAcó —|j«rs|jtjk(r'|jj d|j «y|jtjk(r|j«yyy)Nr&) r‰ÚtypeÚ EventTypeÚFocusOutr ÚafterrªÚ ButtonPressr§©r!r˜s r"rnzAutoCompleteWindow.hide_event*sd€ð �>‰>Ô Ø�z‰zœY×/Ñ/Ò/ð— ‘ ×!Ñ! ! T×%;Ñ%;Õ<Ø—‘œy×4Ñ4Ò4à× Ñ Õ"ð5ð r$có¼—|j«rLd|_t|jj «d«}|j |j |«yy)NTr)r‰rrArrBr/r©r!r˜rIs r"r{z#AutoCompleteWindow.listselect_event7sN€Ø �>‰>Ô Ø#'ˆDÔ Ü˜Ÿ™×2Ñ2Ó4°QÑ7Ó8ˆFØ × Ñ ˜t×/Ñ/°Ñ7Õ 8ð r$có¬—t|jj«d«}|j|j|«|j «y)Nr)rArrBr/rr§r³s r"rz$AutoCompleteWindow.doubleclick_event=sC€ä�T—\‘\×.Ñ.Ó0°Ñ3Ó4ˆØ ×ј4×+Ñ+¨FÑ3Ô4Ø ×ÑÕr$có ‡—|j«sy|jŠt|d«r |j}nd}‰dk7rd|_t ‰«dk(s‰dvs|j tk(�r†‰dv�r�|tz�svt ‰«dk(r|j|j‰z«n³‰dk(r|j|jd z«n�‰d k(r|j|jd z«nk‰d k(r|j|jd z«nGt |j«dk(r|j«y|j|jdd«|j|_ |jjdt|jj!«d««|jj#|j%|j««|j'«y‰dk(r!|j)«|j«y|j t*k(r‰dvs!|j tk(r´‰dvr°|tzs¦t|jj!«d«}|j,|dt |j«|jk(r=|j t*k(s |jr|j|j,|«|j«y‰dv�r‘|�sŽd|_t|jj!«d«}‰dk(rd}nô‰dk(rt |j,«dz }nÖ‰dvr‘|jj1|jj3««|jj1d«z }‰dk(rt5d||z «}nn‰dk(sJ‚t7t |j,«dz ||z«}nA‰dk(rt5d|dz «}n,‰dk(sJ‚t7t |j,«dz |dz«}|jj|«|jj#|«|j'«|j|j,|«y‰dk(rr|sp|jrUt|jj!«d«}|j|j,|«|j«yd|_d|_yt9ˆfd„dD««ry|j:rÍ|j:dk\r¾|j|j|j:z«|j|_ |jjdt|jj!«d««|jj#|j%|j««|j'«y|j«y)NÚmc_staterÚTabFr&)Ú underscoreÚ BackSpace)ÚperiodÚminusr¸Ú_rºÚ.r»Ú-éÿÿÿÿÚbreakÚReturn)rºÚspaceÚ parenleftÚ parenrightÚ bracketleftÚ bracketright)ÚslashÚ backslashÚquotedblÚ apostrophe)ÚHomeÚEndÚPriorÚNextÚUpÚDownTrËrÌ)rÍrÎrÍrÎrÏrÐc3ó&•K—|]}|‰v–—Œ y­wr¥©)Ú.0r2Úkeysyms €r"Ú z4AutoCompleteWindow.keypress_event..¤s!øèø€ðEñ'D ��f”ñ'Dùsƒ)ÚShiftÚControlÚAltÚMetaÚCommandÚOptionÚ )r‰rÔÚhasattrr¶rr)rrrr/rr§rrÚ select_clearrArBrGr5rHr�rrrÚnearestr�r’r(ÚanyÚchar)r!r˜ÚstaterIÚnewselÚjumprÔs @r"ruz!AutoCompleteWindow.keypress_eventCsø€Ø�~‰~ÔØØ—‘ˆÜ �5˜*Ô %Ø—N‘N‰EàˆEØ �UŠ?Ø#(ˆDÔ Ü �‹K˜1Ò  Ð*EÑ EØ— ‘ œUÓ" vØ#ò($àœX˜IÓ%ä�6‹{˜aÒØ×"Ñ" 4§:¡:°Ñ#6Õ7ؘ<Ò'Ø×"Ñ" 4§:¡:°Ñ#3Õ4ؘ8Ò#Ø×"Ñ" 4§:¡:°Ñ#3Õ4ؘ7Ò"Ø×"Ñ" 4§:¡:°Ñ#3Õ4ô�t—z‘z“? aÒ'Ø×$Ñ$Ô&ØØ×"Ñ" 4§:¡:¨c¨r ?Ô3Ø"&§*¡*ˆDÔ Ø �L‰L× %Ñ % a¬¨T¯\©\×-FÑ-FÓ-HÈÑ-KÓ)LÔ MØ �L‰L× #Ñ # D×$7Ñ$7¸¿ ¹ Ó$CÔ DØ × #Ñ #Ô %Øà �xÒ Ø �M‰MŒOØ × Ñ Ô Øà�i‰iœ5Ò  Vðñ&ð�i‰iœ5Ò  VØ>ñ&?àœx˜iÒ'ô˜Ÿ™×2Ñ2Ó4°QÑ7Ó8ˆFØ×Ñ Ñ'Ð(8¬¨T¯Z©Z«Ð9¸T¿Z¹ZÒGØ—I‘I¤Ò&¨$¯*ª*Ø×"Ñ" 4×#3Ñ#3°FÑ#;Ô<Ø × Ñ Ô Øà ÐEÒ EÚà#'ˆDÔ Ü˜Ÿ™×2Ñ2Ó4°QÑ7Ó8ˆFØ˜ÒØ‘ؘ5’ܘT×-Ñ-Ó.¨qÑ0‘ØÐ,Ñ,Ø—|‘|×+Ñ+¨D¯L©L×,EÑ,EÓ,GÓHØ—|‘|×+Ñ+¨AÓ.ñ/�à˜WÒ$Ü   F¨4¡KÓ0‘Fà! VÒ+Ð+Ð+Ü ¤ T×%5Ñ%5Ó!6°qÑ!8¸&À¹+ÓF‘Fؘ4’ܘQ  q¡Ó)‘à Ò'Ð'Ð'ÜœS ×!1Ñ!1Ó2°1Ñ4°f¸Q±hÓ?�Ø �L‰L× %Ñ % fÔ -Ø �L‰L× #Ñ # FÔ +Ø × #Ñ #Ô %Ø × Ñ ˜t×/Ñ/°Ñ7Ô 8Øà˜Šo¡eØ×#Ò#ä˜TŸ\™\×6Ñ6Ó8¸Ñ;Ó<�Ø×"Ñ" 4×#3Ñ#3°FÑ#;Ô<Ø× Ñ Ô"Øð(,�Ô$Ø'+�Ô$Øä óEñ'DóEôEðà �ZŠZ˜EŸJ™J¨#Ò-à × Ñ ˜tŸz™z¨E¯J©JÑ6Ô 7Ø"&§*¡*ˆDÔ Ø �L‰L× %Ñ % a¬¨T¯\©\×-FÑ-FÓ-HÈÑ-KÓ)LÔ MØ �L‰L× #Ñ # D×$7Ñ$7¸¿ ¹ Ó$CÔ DØ × #Ñ #Ô %Øð × Ñ Ô Ør$cóú—|j«sy|jjd«|jjd|jt |j «fz«k7r|j «yy)Nr+r')r‰r rXrr)rr§r±s r"rxz#AutoCompleteWindow.keyrelease_event·sc€Ø�~‰~ÔØ Ø �;‰;× Ñ ˜XÓ &Ø �;‰;× Ñ ˜X¨¯©¼#¸d¿j¹j»/Ð(JÑJÓ Kò Lð × Ñ Õ ð Lr$có—|jduSr¥)r r©s r"r‰zAutoCompleteWindow.is_active¿s€Ø×&Ñ&¨dÐ2Ð2r$cóX—|j|j|j««yr¥)r/r;rr©s r"r�zAutoCompleteWindow.completeÂs€Ø ×ј4×0Ñ0°·±Ó<Õ=r$cóÀ—|j«sy|jjtt«t D]"}|j jt|«Œ$|jjt|j«|j jt|j«d|_d|_ tD]"}|j jt|«Œ$|j jt|j«d|_ |j jtt«|j jt|j«d|_|j jt"|j$«d|_|j&r1|jjt(|j&«d|_|j j+«|j,j/«d|_|j j/«d|_|jj/«d|_yr¥)r‰r Ú event_deletermrrrsr r—rorprvrtrrwryrrrzrrr|Ú focus_setrÚdestroy)r!r…s r"r§zAutoCompleteWindow.hide_windowÆs¶€Ø�~‰~ÔØ ð ×Ñ×,Ñ,Ô-DÜ-Dô Fç!ˆCØ �K‰K× $Ñ $Ô%<¸cÕ Bð"ð ×Ñ×&Ñ&Ô'>ÀÇ Á ÔMØ � ‰ ×ÑÔ2°D·L±LÔA؈Œ ؈Œ ß%ˆCØ �K‰K× $Ñ $Ô%@À#Õ Fð&à � ‰ ×ÑÔ6¸¿¹ÔH؈ŒØ � ‰ × Ñ Ô!>Ü!4ô 6à � ‰ ×ÑÔ8¸$×:KÑ:KÔLØ ˆÔØ � ‰ ×ÑÔ/°×1BÑ1BÔCØ ˆÔØ × Ò Ø × #Ñ #× *Ñ *Ô+=¸t×?OÑ?OÔ PØ#ˆDÔ ð � ‰ ×ÑÔð �‰×ÑÔ ØˆŒØ � ‰ ×ÑÔØˆŒ Ø ×Ñ×'Ñ'Ô)Ø"&ˆÕr$N)Ú__name__Ú __module__Ú __qualname__r#r/r5r;rHr†r}rªrnr{rrurxr‰r�r§rÒr$r"r r sZ„ò!$òF ò /òò@$*òLFòP3$òj ò #ò9ò ò ròhò3ò>ó%'r$r Ú__main__)Úmainz%idlelib.idle_test.test_autocomplete_wr1F)Ú verbosityÚexit)Ú__doc__r‹ÚtkinterÚ tkinter.ttkrÚidlelib.autocompleterrÚidlelib.multicallrrmrrrsrtrvrwryrzr|r~r rìÚunittestrðrÒr$r"Úrùs�ðñóäÝ!ç-Ý&à7ÐØ&ÐØ)¨?Ð;€Ø?ÐðCÐð!DÐØ$ÐØ*ÐØ"ÐØ2Ð÷P'ñP'ðf ˆzÒÝÙÐ 0¸AÀEÖJðr$