Ë „æ\wìãó¦—ddlZddlZddlmZddlmZmZmZddlmZ Gd„de «Z d „Z d „Z d „Zd „ZGd „d«Zd„Zd„Zd,d„ZdZej*d«Zej*d«ZGd„d«Zd„Zd„Zd„Zd„Zej*d«ZdZdZd„Z d„Z!Gd„de «Z"d „Z#d!„Z$d"„Z%d-d#„Z&d$„Z'd%„Z(d&„Z)d'„Z*d(„Z+d)„Z,d*„Z-d+„Z.y).éNé)Úhex)ÚerrorÚ requirementsÚutilé)Údocketcó—eZdZd„Zy)ÚNodeMapcó2—tjd|z«‚)Nsunknown node: %s)rÚ RevlogError)ÚselfÚxs úAusr/lib/python3.12/site-packages/mercurial/revlogutils/nodemap.pyÚ __missing__zNodeMap.__missing__s€Ü×ÑÐ 3°aÑ 7Ó8Ð8óN)Ú__name__Ú __module__Ú __qualname__r©rrr r s„ó9rr có—y)zrhook point for test This let tests to have things happens between the docket reading and the data readingNrrrrÚtest_race_hook_1rs€ð  rcó—tj|jvrytj|jvry|j«}t d||j «t d||j jj«y)zoThe stream clone might needs to remove some file if persisten nodemap was dropped while stream cloning N) rÚREVLOGV1_REQUIREMENTÚNODEMAP_REQUIREMENTÚ unfilteredÚdelete_nodemapÚ changelogÚ manifestlogÚ _rootstoreÚ_revlog)ÚrepoÚunfis rÚpost_stream_cleanupr$$sl€ô×(Ñ(°×0AÑ0AÑAØÜ×'Ñ'¨4×+<Ñ+<Ñ<ØØ �?‰?Ó €DÜ�4˜˜tŸ~™~Ô.Ü�4˜˜t×/Ñ/×:Ñ:×BÑBÕCrcóž—|j€y|jj|j«}|syd}tj |||tj z«\}|t k7ry|tj z }tj |||tj z«}|\}}}}} |tj z }t||||z«} ||z }|| _ |||| z| _ || _ || _ t|| «} |jjjd«} t!« |j| «5} | r+ t#j$t#j&| |««}n| j+|«}ddd«t/«|kry| |fS#t($rd}YŒ(wxYw#1swYŒ-xYw#t,$rYywxYw)z'read the nodemap for a revlog from diskNrópersistent-nodemap.mmapr)Ú _nodemap_fileÚopenerÚtryreadÚ S_VERSIONÚunpackÚsizeÚONDISK_VERSIONÚS_HEADERÚ NodeMapDocketÚtip_revÚtip_nodeÚ data_lengthÚ data_unusedÚ_rawdata_filepathÚoptionsÚgetrrÚbufferÚmmapreadÚ ValueErrorÚreadÚFileNotFoundErrorÚlen)ÚrevlogÚpdataÚoffsetÚversionÚheadersÚuid_sizer0r2r3Ú tip_node_sizer ÚfilenameÚuse_mmapÚfdÚdatas rÚpersisted_datarH1sº€à ×ÑÐ#ØØ �M‰M× !Ñ ! &×"6Ñ"6Ó 7€EÙ ØØ €FÜ×!Ñ! %¨°¼)¿.¹.Ñ1HÐ"IÓJ�J€WØ”.Ò ØØ Œi�n‰nÑ€FÜ�o‰o˜e F¨V´h·m±mÑ-CÐDÓE€GØAHÑ>€Hˆg�{ K°Ø Œh�m‰mÑ€FÜ ˜5 ¨&°8Ñ*;Ð<Ó =€FØ ˆhÑ€FØ€F„NؘF V¨mÑ%;Ð<€F„OØ$€FÔØ$€FÔä  ¨Ó0€HØ�}‰}×$Ñ$×(Ñ(Ð)CÓD€HäÔð Ø �]‰]˜8Ô $¨ÙðÜŸ;™;¤t§}¡}°R¸Ó'EÓF‘Dð —w‘w˜{Ó+�÷%ô ˆ4ƒy�;ÒØØ �4ˆ<Ðøô"òà’Dðú÷ %Ð $ûô òÙðúsNÄ8GÅ F4Å )F#Å6F4ÆGÆ# F1Æ.F4Æ0F1Æ1F4Æ4F=Æ9GÇ G Ç G cóЇ—‰jry‰j€yd‰jz}|j|«ry|j|ˆfd„«|j |ˆfd„«y)zšInstall whatever is needed transaction side to persist a nodemap on disk (only actually persist the nodemap if this is relevant for this revlog) Nsnm-revlog-persistent-nodemap-%scó •—t|‰d¬«S)NT)Úpending©Úpersist_nodemap©Útrr=s €rÚz*setup_persistent_nodemap..ksø€¤°°FÀDÕ Ircó•—t|‰«S©NrLrNs €rrPz*setup_persistent_nodemap..ms ø€¬?¸2¸vÔ+Fr)Ú_inliner'Ú hasfinalizeÚ addpendingÚ addfinalize)rOr=Ú callback_ids ` rÚsetup_persistent_nodemaprX\sbø€ð ‡~‚~ØØ ×ÑÐ#Øð5°v×7KÑ7KÑK€KØ ‡~�~�kÔ"ØØ‡M�MØÓIôð‡N�N�;Ó FÕGrcó:—eZdZdZd„Zd„Zd„Zd„Zd„Zd„Z d„Z y ) Ú_NoTransactionzCtransaction like object to update the nodemap outside a transactioncó—i|_yrR©Ú _postclose©rs rÚ__init__z_NoTransaction.__init__ss €Øˆ�rcó"—||j|<yrRr\)rrWÚ callback_funcs rÚ addpostclosez_NoTransaction.addpostclosevs€Ø'4ˆ�‰˜ Ò$rcó—yrRr©rÚargsÚkwargss rÚ registertmpz_NoTransaction.registertmpyó€Ø rcó—yrRrrds rÚ addbackupz_NoTransaction.addbackup|rhrcó—yrRrrds rÚaddz_NoTransaction.addrhrcó—yrRrrds rÚaddabortz_NoTransaction.addabort‚rhrcó—yrRr)rres rÚ_reportz_NoTransaction._report…rhrN) rrrÚ__doc__r_rbrgrjrlrnrprrrrZrZps(„ÙMòò5ò ò ò ò ó rrZcó—|jry|j€yt«}t||«t |j «D]}|j |d«Œy)z¡update the persistent nodemap right now To be used for updating the nodemap on disk outside of a normal transaction setup (eg, `debugupdatecache`). N)rSr'rZrMÚsortedr])r=ÚnotrÚks rÚupdate_persistent_nodemaprv‰sU€ð ‡~‚~ØØ ×ÑÐ#Øä Ó €DÜ�D˜&Ô!Ü �D—O‘OÖ $ˆØˆ�‰˜Ñ˜4Õ ñ%rcó0—|j}tjd|z«}|jj |j «}|jj |«D]/}|j|«sŒ|jj|«Œ1y)z.Delete nodemap data on disk for a given revlogs"(^|/)%s(-[0-9a-f]+\.nd|\.n(\.a)?)$N) ÚradixÚreÚcompiler(ÚdirnameÚ _indexfileÚlistdirÚmatchÚsvfsÚ tryunlink)rOr"r=ÚprefixÚpatternÚdirpathÚfs rrršsp€à �\‰\€FÜ�j‰jÐ?À&ÑHÓI€GØ�m‰m×#Ñ# F×$5Ñ$5Ó6€GØ �]‰]× "Ñ " 7Ö +ˆØ �=‰=˜Õ Ø �I‰I× Ñ  Õ "ñ,rc ó ‡‡‡‡—t|dd«rtjd«‚|j€*|rt |«|_nd}tj|«‚t j |jd«}|j}t j |jd«}|jjjd«}d} |�rR|��O|jj«} |jj«\} } } | jt| «z} | j | z}| | k7rd} nè| |d zkrd} nÝt#|| «Š|j%‰| j«|j‰d «5}|j'| j«|j)| «|r^|r#|j'd «|j+| «}n9|j-«t j.t j0|| ««}ddd«| | _|| _| �€t3«} t#|| «Št j |jd «r|jj5«} nt7|j«} |jj8Šˆˆfd „}d‰z}|j;||«|j‰d«5}|j)| «|rG|r| }nB|j-«t j.t j0|t| «««}ddd«t| «| _|j=« _|jA| j>«| _!|j}|r|dz }|jE|«n|jG|«|j|dd¬«5}|j)| jI««ddd«| |_|r|jjK| «tM|| «Š‰r?t|d|j«Šˆˆfd„}d|jz}|jO||«yy#1swY�ŒSxYw#1swY�ŒAxYw#1swYŒ–xYw)z-Write nodemap data on disk for a given revlogÚ filteredrevsrz.cannot persist nodemap of a filtered changelogNz?calling persist nodemap on a revlog without the feature enabledÚnodemap_data_incrementalÚupdate_nodemap_datar&é sr+rÚnodemap_data_allcó•—‰‰«yrRr)rOÚdatafiler€s €€rÚabortckz persist_nodemap..abortckäs ø€Ù �hÕ rs delete-%ssw+s.aówT)Ú atomictempÚ _realopenercó6•—‰D]}‰j|«ŒyrR)r€)rOÚoldfileÚoldsÚrealvfss €€rÚcleanupz persist_nodemap..cleanup sø€Û�Ø×!Ñ! 'Õ*ñ rsrevlog-cleanup-nodemap-%s)(ÚgetattrrÚProgrammingErrorr'Úget_nodemap_filerÚ safehasattrÚindexÚ_nodemap_docketr(r5r6Úcopyr‡r2r<r3r4rlÚseekÚwriter:Úflushr7r8r/rŠÚpersistent_datar€rnÚtiprevr0Únoder1rgrjÚ serializerˆÚ_other_rawdata_filepathrb)rOr=rKÚforceÚmsgÚcan_incrementalÚ ondisk_docketÚ feed_datarErGÚ target_docketÚ src_docketÚdata_changed_countÚ new_lengthÚ new_unusedrFÚnew_datar�rWÚ file_pathÚfpr•rŒr“r”r€s @@@@rrMrM¤sÄû€äˆv�~ rÔ*Ü×$Ñ$Ø <ó ð ð×ÑÐ#Ù Ü#3°FÓ#;ˆFÕ àSˆCÜ×(Ñ(¨Ó-Ð -ä×&Ñ& v§|¡|Ð5OÓP€OØ×*Ñ*€MÜ× Ñ  §¡Ð/DÓE€IØ�}‰}×$Ñ$×(Ñ(Ð)CÓD€Hà €Dâ˜=Ñ4Ø×.Ñ.×3Ñ3Ó5ˆ ð �L‰L× 1Ñ 1Ó 3ñ  Ø Ø Ø à"×.Ñ.´°T³Ñ:ˆ Ø"×.Ñ.Ð1CÑCˆ Ø ˜Ò &؉DØ ˜J¨™OÒ ,؉Dä(¨°Ó?ˆHð �F‰F�8˜]×6Ñ6Ô 7Ø—‘˜x¨Ô/°2Ø—‘˜ ×1Ñ1Ô2Ø—‘˜”ÙÙØŸ™ œ Ø#%§7¡7¨:Ó#6™àŸ™œ Ü#'§;¡;¬t¯}©}¸RÀÓ/LÓ#M˜÷0ð)3ˆMÔ %Ø(2ˆMÔ %à �|ä%›ˆ Ü$ V¨]Ó;ˆÜ × Ñ ˜FŸL™LÐ*<Ô =Ø—<‘<×0Ñ0Ó2‰Dä" 6§<¡<Ó0ˆDð—M‘M×+Ñ+ˆ õ ð# XÑ-ˆ ð � ‰ �K Ô)Ø �]‰]˜8 UÔ +¨rØ �H‰H�TŒNÙÙØ#‘Hà—H‘H”JÜ#Ÿ{™{¬4¯=©=¸¼SÀ»YÓ+GÓH�H÷,ô%(¨£Iˆ Ô!Ø"ŸM™M›O€MÔØ#Ÿ[™[¨×)>Ñ)>Ó?€MÔð×$Ñ$€IÙØ�Uш Ø �‰�yÕ!à � ‰ �YÔà �‰�y $°4ˆÔ 8¸BØ �‰�×(Ñ(Ó*Ô+÷ 9à*€FÔÙØ� ‰ ×(Ñ(¨¸ÔAô # 6¨=Ó 9€D٠ܘ& -°·±Ó?ˆõ +ð3°V×5IÑ5IÑIˆ Ø �‰˜  WÕ-ð ÷0Ñ/ú÷D,Ñ +ú÷( 9Ð 8ús&ÆB Q ËAQ-Ï Q:Ñ Q*Ñ-Q7Ñ:Rz>Bz>BQQQQcó0—eZdZdZdd„Zd„Zd„Zd„Zd„Zy) r/z}metadata associated with persistent nodemap data The persistent data may come from disk or be on their way to disk. Ncóv—|€tj«}||_d|_d|_d|_d|_y)Nr)Ú docket_modÚmake_uidÚuidr0r1r2r3)rr¶s rr_zNodeMapDocket.__init__5sD€Ø ˆ;Ü×%Ñ%Ó'ˆCðˆŒðˆŒ ðˆŒ ð  ˆÔðˆÕrcóº—t|j¬«}|j|_|j|_|j|_|j |_|S)N)r¶)r/r¶r0r1r2r3)rÚnews rrœzNodeMapDocket.copyQsE€Ü §¡Ô)ˆØ—l‘lˆŒ Ø—}‘}ˆŒ Ø×*Ñ*ˆŒØ×*Ñ*ˆŒØˆ rcóÔ—|j|jkry|j|jkDry|j|jkry|j|jkDryy)Néÿÿÿÿrr©r¶r2©rÚothers rÚ__cmp__zNodeMapDocket.__cmp__YsY€Ø �8‰8�e—i‘iÒ ØØ �8‰8�e—i‘iÒ ØØ × Ñ  × 1Ñ 1Ò 1ØØ × Ñ  × 1Ñ 1Ò 1ØØrcój—|j|jk(xr|j|jk(SrRr»r¼s rÚ__eq__zNodeMapDocket.__eq__ds+€Ø�x‰x˜5Ÿ9™9Ñ$ÒN¨×)9Ñ)9¸U×=NÑ=NÑ)NÐNrcó¼—g}|jtjt««t |j «|j |j|jt |j«f}|jtj|Ž«|j|j «|j|j«dj|«S)z9return serialized bytes for a docket using the passed uidr) Úappendr*Úpackr-r<r¶r0r2r3r1r.Újoin)rrGrAs rr£zNodeMapDocket.serializegs˜€àˆØ � ‰ ”I—N‘N¤>Ó2Ô3ä �—‘‹MØ �L‰LØ × Ñ Ø × Ñ Ü �— ‘ Ó ð  ˆð � ‰ ”H—M‘M 7Ð+Ô,Ø � ‰ �D—H‘HÔØ � ‰ �D—M‘MÔ"Ø�x‰x˜‹~ÐrrR) rrrrqr_rœr¾rÀr£rrrr/r//s!„ñó ò8ò òOórr/có<—|j}d||jfzS)z9The (vfs relative) nodemap's rawdata file for a given uids%s-%s.nd)rxr¶)r=r r�s rr4r4xs€à �\‰\€FØ ˜& &§*¡*Ð-Ñ -Ð-rcóh—|j}tjd|z«}t||«}|jj |«}|jj |«}g}|jj|«D]+}|j|«sŒ||k7sŒ|j|«Œ-|S)Ns(^|/)%s-[0-9a-f]+\.nd$) rxryrzr4r(Úbasenamer{r}r~rÂ) r=r r�r‚Ú new_file_pathÚ new_file_namerƒÚothersr„s rr¤r¤~s—€Ø �\‰\€FÜ�j‰jÐ3°fÑ<Ó=€GÜ% f¨fÓ5€MØ—M‘M×*Ñ*¨=Ó9€MØ�m‰m×#Ñ# MÓ2€GØ €FØ �]‰]× "Ñ " 7Ö +ˆØ �=‰=˜Õ   ]Ó 2Ø �M‰M˜!Õ ð,ð €Mrcó.—t|«}t|«S)zAreturn the persistent binary form for a nodemap for a given index)Ú _build_trieÚ _persist_trie)ršÚtries rr r ¤s€ä �uÓ €DÜ ˜Ó Ðrcób—t|||«\}}|tjzt||¬«fS)zGreturn the incremental update for persistent nodemap from a given index)Ú existing_idx)Ú _update_trieÚS_BLOCKr,rÍ)ršÚrootÚmax_idxÚlast_revÚ changed_blockrÎs rÚupdate_persistent_datarתs5€ä& u¨d°HÓ=Ñ€M�4àœŸ ™ Ñ$Ü�d¨Ô1ð ðrz>llllllllllllllllrºcó—|tz S)zøReturn the number used to represent the rev in the tree. (or retrieve a rev number from such representation) Note that this is an involution, a function equal to its inverse (i.e. which gives the identity when applied to itself). )Ú REV_OFFSET)Úrevs rÚ_transform_revrÛºs€ð”:Ñ Ð Ðrcó—t|d«S)z/turn an hexadecimal digit into a proper integeré)Úint)Ú hex_digits rÚ_to_intràÅs€ä ˆy˜"Ó Ðrcó(‡—eZdZdZˆfd„Zd„ZˆxZS)ÚBlockzOrepresent a block of the Trie contains up to 16 entry indexed from 0 to 15có8•—tt|� «d|_yrR)Úsuperrâr_Ú ondisk_id)rÚ __class__s €rr_zBlock.__init__Ïsø€Ü Œe�TÑ#Ô%àˆ�rcó>‡—tˆfd„td«D««S)Nc3ó@•K—|]}‰j|«–—Œy­wrR)r6)Ú.0Úirs €rÚ z!Block.__iter__..Õsøèø€Ð3© A�D—H‘H˜Q—K©ùsƒrÝ)ÚiterÚranger^s`rÚ__iter__zBlock.__iter__Ôsø€ÜÓ3¬¨r¬Ó3Ó3Ð3r)rrrrqr_rîÚ __classcell__)ræs@rrârâÊsø„ñ4ôö 4rrâcóŒ—t«}tt|««D]"}t||d«}t |d|||«Œ$|S)zËbuild a nodemap trie The nodemap stores revision number for each unique prefix. Each block is a dictionary with keys in `[0, 15]`. Values are either another block or a revision number. ér)rârír<rÚ_insert_into_block)ršrÓrÚÚ current_hexs rrÌrÌØsG€ô ‹7€DÜ”S˜“ZÖ ˆÜ˜% ™* Q™-Ó(ˆ ܘ5 ! T¨3° Õ<ð!ð €Krc óŽ—d}t|dzt|««D]%}t||d«}|t|d|||«z }Œ'||fS)Úconsumerrrñ)rír<rrò)ršrÓrÕÚchangedrÚrós rrÑrÑçsV€à€GÜ�X ‘\¤3 u£:Ö.ˆÜ˜% ™* Q™-Ó(ˆ ØÔ% e¨Q°°c¸;ÓGÑG‰ð/ð �Dˆ=Ðrcó`—d}|j�d|_t|||dz«}|j|«}|€|||<|St|t«r|t ||dz|||«z }|St ||d«}|} t«} | ||<t ||dz| | |«t ||dz| ||«|S)a7insert a new revision in a block index: the index we are adding revision for level: the depth of the current block in the trie block: the block currently being considered current_rev: the revision number we are adding current_hex: the hexadecimal representation of the of that revision rNrñ)råràr6Ú isinstanceÚdictròrrâ) ršÚlevelÚblockÚ current_revrórörßÚentryÚ other_hexÚ other_revr¸s rròròðsÞ€ð€GØ ‡�Ð"؈ŒÜ˜  E¨E°A©IÐ6Ó7€IØ �I‰I�iÓ €EØ €}à&ˆˆiÑð €Nô �Eœ4Ô àÔ%Ø �5˜1‘9˜e [°+ó ñ ˆð €Nô ˜˜e™  Q™Ó(ˆ ؈ Ü‹gˆØˆˆiÑܘ5 %¨!¡)¨S°)¸YÔGܘ5 %¨!¡)¨S°+¸{ÔKØ €Nrcó—i}|�|dz}nd}g}t|«D]\}|j�|j|t|«<Œ(t|«|z|t|«<|j t ||««Œ^dj |«S)zaturn a nodemap trie into persistent binary data See `_build_trie` for nodemap trie structurerrr)Ú _walk_trieråÚidr<rÂÚ_persist_blockrÄ)rÓrÐÚ block_mapÚbase_idxÚchunksÚtns rrÍrÍs‰€ð€IØÐØ !Ñ#‰àˆØ €FÜ˜ÖˆØ �<‰<Ð #Ø "§ ¡ ˆI”b˜“fÒ ä # F£ ¨hÑ 6ˆI”b˜“fÑ Ø �M‰Mœ.¨¨YÓ7Õ 8ð ð �8‰8�FÓ Ðrc#ó K—t|j««D]*\}}t|t«sŒt |«D]}|–—ŒŒ,|–—y­w)zcyield all the block in a trie Children blocks are always yield before their parent block. N)rsÚitemsrørùr)rûÚ__ÚitemÚ sub_blocks rrr%sFèø€ô ˜UŸ[™[›]Ö+‰ ˆˆTÜ �dœDÕ !Ü'¨Ö-� Ø“ñ.ð,ð ƒKùs ‚0A³AcóP‡—tˆfd„|D««}tj|ŽS)zŒproduce persistent binary data for a single block Children block are assumed to be already persisted and present in block_map. c3ó6•K—|]}t|‰«–—Œy­wrR)Ú _to_value)réÚvrs €rrëz!_persist_block..7søèø€Ð=±*¨Q”˜1˜i×(±*ùsƒ)ÚtuplerÒrÃ)Ú block_noderrGs ` rrr1s$ø€ô Ó=±*Ó=Ó =€DÜ �<‰<˜Ð Ðrcód—|€tSt|t«r|t|«St |«S)zpersist any value as an integer)ÚNO_ENTRYrørùrrÛ)r rs rrr;s0€à €|ÜˆÜ �Dœ$Ô Øœ˜D›Ñ"Ð"ä˜dÓ#Ð#rcóš—t|«tjzdk7r3d}tj|tjt|«fz«‚|s t «dfSi}g}t dt|«tj«D]i}t «}t|«|_|||j<|||tjz}tj|«}|j||f«Œk|D]>\}}t|«D]+\} } | tk(rŒ| dk\r || || <Œt| «|| <Œ-Œ@tjzfS)z,parse parse nodemap data into a nodemap Triers:nodemap data size is not a multiple of block size (%d): %dN) r<rÒr,rÚAbortrârírår+rÂÚ enumeraterrÛ) rGr¦rÚ new_blocksrêrûÚ block_dataÚvaluesÚbÚidxrs rÚ parse_datarEs+€ä ˆD‹ ”G—L‘LÑ  QÒ&ØKˆÜ�k‰k˜#¤§¡¬s°4«yÐ 9Ñ9Ó:Ð:Ù Ü‹w˜ˆ}ÐØ€IØ€JÜ �1”c˜$“i¤§¡Ö .ˆÜ“ˆÜ˜i›.ˆŒØ%*ˆ �%—/‘/Ñ"ؘ!˜a¤'§,¡,Ñ.Ð/ˆ Ü—‘  Ó+ˆØ×ј5 &˜/Õ*ð /ó ‰ ˆˆ6Ü Ö'‰FˆC�Ø”HŠ}ØØ�a’Ø" 1™��#’ä'¨Ó*��#’ñ (ð ð �!”w—|‘|Ñ#Ð #Ð#rcóP—d}|jdt|«z«t|«\}}tt |««}|jdt|«z«t t|««D]†}||vrd|z}|j |«d}n|j|«t|t||d««} | €d|z}|j |«d}Œg| |k7sŒmd|| fz}|j |«d}Œˆ|r(t|«D]}d |z}|j |«Œd}|S) zBverify that the provided nodemap data are valid for the given idexrsrevisions in index: %d srevisions in nodemap: %d s$ revision missing from nodemap: %d rrñs/ revision node does not match any entries: %d s? revision node does not match the expected revision: %d != %d s" extra revisions in nodemap: %d ) Ústatusr<rÚsetÚ_all_revisionsríÚ write_errÚremoveÚ _find_noderrs) ÚuiršrGÚretrÓr Úall_revsÚrr¦Únm_revs rÚ check_datar*cs1€à €C؇I�IÐ,´°E³ Ñ:Ô;ܘ$Ó�H€Dˆ"Ü”> $Ó'Ó(€H؇I�IÐ,´°H³ Ñ=Ô>Ü ”3�u“:Ö ˆØ �HÑ Ø:¸QÑ>ˆCØ �L‰L˜Ô ؉Cà �O‰O˜AÔ Ü˜D¤# e¨A¡h¨q¡kÓ"2Ó3ˆØ ˆ>ØEÈÑIˆCØ �L‰L˜Ô ؉CØ �q‹[ðØ!" F  ñ,ð ð �L‰L˜Ô ؉Cð%ñ(ܘÖ!ˆAØ8¸1Ñ<ˆCØ �L‰L˜Õ ð"ðˆØ €Jrc#óhK—t|«D] }|D]}|�t|t«rŒ|–—ŒŒ"y­w)z%return all revisions stored in a TrieN)rrørâ)rÓrûrs rr!r!†s5èø€ä˜DÖ!ˆÛˆA؈yœJ q¬%Ô0ØØ‹Gññ"ùs‚02có~—|jt|dd««}t|t«rt ||dd«S|S)z.find the revision associated with a given noderrN)r6ràrørùr$)rûr¢rýs rr$r$�s=€à �I‰I”g˜d 1 Q˜iÓ(Ó )€EÜ�%œÔܘ%  a b Ó*Ð*Ø €Lrcó�—|jr,|jdz}|jj|«r|S|jdzS)Ns.n.as.n)Ú _trypendingrxr(Úexists)r=Ú pending_paths rr˜r˜—s@€Ø ×ÒØ—|‘| gÑ-ˆ Ø �=‰=× Ñ   Ô -ØÐ Ø �<‰<˜%Ñ Ðr)FFrR)/ryÚstructr¢rÚrrrr r´rùr rr$rHrXrZrvrrMr-ÚStructr*r.r/r4r¤r r×rÒrrÙrÛràrârÌrÑròrÍrrrrr*r!r$r˜rrrÚr4sðó Û å÷ñõ #ô9ˆdô9ò  ò Dò(òVH÷( ñ ò2!ò"#óm.ðL€Ø ˆF�M‰M˜$Ó € Ø ˆ6�=‰=˜Ó "€÷FñFòR.ò òLò ð ˆ&�-‰-Ð(Ó )€à €à € òòô 4ˆDô 4ò òòóDò& òò$ò$ò< òFòó r