ó
    «´j{  ã                   ó^  • S r SSKrSSKr\R                  " \5      R                  5       R                  S   r\S-  r\S-  r	\S-  r
\S-  r\S-  r\S	-  S
-  r\S-  S-  r/ SQr/ SQr/ SQr\R$                  " S5      r\R$                  " S\R(                  5      rS rS rS rS rS rS rg)zâShared helpers: locate the project, parse change fragments (Markdown + YAML-like front matter).

Only the YAML subset used by the template is supported on purpose, so the tools
need nothing beyond the Python standard library.
é    Né   Ú
RULEFOLDERÚchangeszTEAM.mdzFEATURE-REGISTRY.mdzCHANGELOG.mdÚDOCzAPI.mdÚappÚroutes)ÚfeatureÚbugfixÚrefactorÚsecurityÚdocsÚinfraÚtestÚchore)ÚbackendÚapizweb-uir   r   zproject-wide)ÚidÚtitleÚdateÚauthorÚtypeÚscopeÚstatusÚsecurity_impactz$^CHG-(\d{3}|\d{8}-[A-Z]{2,3}-\d{2})$z^---\s*\n(.*?)\n---\s*\n?(.*)$c                 ó´   • U R                  5       n [        U 5      S:¼  a  U S   U S   :X  a  U S   S;   a  U SS $ U R                  5       nUS;   a  gUS;   a  g	U $ )
Nr   r   éÿÿÿÿz"'é   )ÚtrueÚyesT)ÚfalseÚnoF)ÚstripÚlenÚlower)ÚvÚlows     ÚMF:\Solutions\Thinkera\Publishers\TikTokManager\RULEFOLDER\tools\_fragments.pyÚ_scalarr(      sa   € Ø	�‰‹	€AÜ
ˆ1ƒv�ƒ{�q˜‘t˜q ™u“}¨¨1©°«Ø��2ˆwˆØ
�'‰'‹)€CØ
ˆoÓØØ
ˆoÓØØ€Hó    c                 óš   • [         R                  " SU 5       Vs/ s H$  oR                  5       (       d  M  [        U5      PM&     sn$ s  snf )Nz"[^"]*"|\'[^\']*\'|[^,]+)ÚreÚfindallr"   r(   )ÚsÚxs     r'   Ú_split_listr/   &   s4   € Ü "§
¢
Ð+FÈÔ JÓXÒ J˜1ÏgÉgÏi‹JŒG�AŽJÑ JÑXÐXùÒXs
   šA¶Ac                 ól  • [         R                  U 5      nU(       d  S U 4$ 0 S p2UR                  S5      R                  5        GH\  nUR	                  5       (       a$  UR                  5       R                  S5      (       a  M?  UR	                  5       nUR                  S5      (       aW  UbT  UR                  U5      n[        U[        5      (       d  US;   a  / OU/X#'   X#   R                  [        USS  5      5        M¼  SU;  a  MÄ  UR                  S5      u  p7nUR	                  5       UR	                  5       pƒUR                  S5      (       aB  UR                  S5      (       a,  USS	 R	                  5       n	U	(       a  [        U	5      O/ X#'   GMO  [        U5      X#'   GM_     X!R                  S5      4$ )
Nr   Ú#z- )Ú Nr   Ú:Ú[Ú]r   )Ú_FM_REÚmatchÚgroupÚ
splitlinesr"   ÚlstripÚ
startswithÚgetÚ
isinstanceÚlistÚappendr(   Ú	partitionÚendswithr/   )
ÚtextÚmÚdataÚkeyÚlineÚstrippedÚcurÚ_ÚvalÚinners
             r'   Úparse_frontmatterrL   *   sY  € Ü�‰�TÓ€AÞØ�TˆzÐØ�Dˆ#Ø—‘˜“
×%Ñ%×'ˆØ�z‰z�|‰|˜tŸ{™{›}×7Ñ7¸×<Ñ<ÙØ—:‘:“<ˆØ×Ñ˜t×$Ñ$¨©Ø—(‘(˜3“-ˆCÜ˜c¤4×(Ñ(Ø"%¨Ó"3™B¸#¸�‘	Ø‰I×ÑœW X¨a¨b \Ó2Ô3ÙØ�d‹?ÙØ—n‘n SÓ)‰ˆ�Ø—9‘9“; §	¡	£ˆSØ�>‰>˜#×Ñ 3§<¡<°×#4Ñ#4Ø˜˜"�I—O‘OÓ%ˆEÞ.3œ EÔ*¸ˆDŒIä ›ˆDŒIñ% (ð& —‘˜“ÐÐr)   c                  ó&  • / n [        [        R                  S5      5       H\  nUR                  R	                  S5      (       a  M%  [        UR                  SS95      u  p#U R                  U=(       d    0 X1S.5        M^     U R                  S S9  U $ )zRReturn fragments sorted by (date, id). Each is a dict with 'meta', 'body', 'path'.z*.mdrI   úutf-8©Úencoding)ÚmetaÚbodyÚpathc                 óz   • [        U S   R                  SS5      5      [        U S   R                  SS5      5      4$ )NrQ   r   r2   r   )Ústrr<   )Úfs    r'   Ú<lambda>Ú load_fragments.<locals>.<lambda>M   s2   € œC  &¡	§¡¨f°bÓ 9Ó:¼CÀÀ&Á	ÇÁÈdÐTVÓ@WÓ<XÑYr)   )rE   )	ÚsortedÚCHANGESÚglobÚnamer;   rL   Ú	read_textr?   Úsort)ÚoutÚprQ   rR   s       r'   Úload_fragmentsra   E   sy   € à
€CÜ”G—L‘L Ó(Ö)ˆØ�6‰6×Ñ˜S×!Ñ!ÙÜ& q§{¡{¸G {Ð'DÓE‰
ˆØ�
‰
˜DŸJ B°Ñ@ÖAñ	 *ð
 ‡H�HÑY€HÑZØ€Jr)   c                 óL   • U b  U S:X  a  / $ [        U [        5      (       a  U $ U /$ )Nr2   )r=   r>   )r%   s    r'   Úas_listrc   Q   s+   € Ø�y�A˜“GØˆ	Ü˜1œd×#Ñ#ˆ1Ð,¨!¨Ð,r)   c                  ó*  • 0 0 p[         R                  5       (       d  X4$ [         R                  SS9R                  5        HÈ  nUR	                  5       R	                  S5      R                  S5       Vs/ s H  o3R	                  5       PM     nn[        U5      S:¼  d  M_  [        R                  " SUS   5      (       d  M€  US   XS   '   [        R
                  " SUS	   5       H   nS
U;   d  M  US   XR                  5       '   M"     MÊ     X4$ s  snf )z‘Return ({email: code}, {code: name}) parsed from the table in TEAM.md.

The email cell may hold several addresses separated by spaces or commas.
rN   rO   Ú|é   z
[A-Z]{2,3}r   r   z[\s,]+r   Ú@)
ÚTEAMÚexistsr]   r9   r"   Úsplitr#   r+   Ú	fullmatchr$   )Úby_emailÚnamesrF   ÚcÚcellsÚtokens         r'   Ú	read_teamrq   W   sâ   € ð
 ˜"ˆeÜ�;‰;�=‰=ØˆÐÜ—‘¨�Ð0×;Ñ;Ö=ˆØ$(§J¡J£L×$6Ñ$6°sÓ$;×$AÑ$AÀ#Ô$FÓGÒ$F˜q—‘–Ñ$FˆÐGÜˆu‹:˜�?œrŸ|š|¨M¸5À¹8×DÓDØ# A™hˆE˜‘(‰OÜŸš )¨U°1©XÖ6�Ø˜%•<Ø.3°A©h�HŸ[™[›]Ó+ó 7ñ	 >ð ˆ?Ðùò Hs   Á4D)Ú__doc__Úpathlibr+   ÚPathÚ__file__ÚresolveÚparentsÚROOTÚRULESrZ   rh   ÚREGISTRYÚ	CHANGELOGÚAPI_DOCÚ
ROUTES_DIRÚTYPESÚSCOPESÚREQUIREDÚcompileÚID_REÚSr6   r(   r/   rL   ra   rc   rq   © r)   r'   Ú<module>r…      sÕ   ðñó
 Û 	à‡|‚|�HÓ×%Ñ%Ó'×/Ñ/°Ñ2€Øˆ|Ñ€Ø
�)Ñ
€ØˆyÑ€ØÐ(Ñ(€Ø�NÑ"€	Ø
�‰,˜Ñ
!€Ø�E‰\˜HÑ$€
âW€Ú	F€ÚZ€Ø
�
Š
Ð:Ó;€à	�ŠÐ5°r·t±tÓ	<€ò	òYòò6	ò-ór)   