ó
    àÅŸgÿÉ  ã                  ó(  • S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKJrJr  SSKJr  SSKJr  SSKJrJrJrJr  SSKJr  SS	KJr  SS
KJr  SSKJrJr  SSK J!r!J"r"  SSK#J$r$  SSK%J&r&J'r'  \!" \5      r " S S5      r( " S S5      r)\" SSS9 " S S5      5       r* " S S\5      r+\,\&\-\.\\/   \\/   4      4   r0 " S S5      r1 " S S\15      r2 " S S\15      r3 " S S \15      r4 " S! S"\Rj                  5      r6 " S# S$5      r7g)%zCode parsing for coverage.py.é    )ÚannotationsN)ÚIterableÚSequence)Ú	dataclass)ÚCodeType)ÚcastÚCallableÚOptionalÚProtocol)Úenv)Úcode_objects)Úshort_stack)ÚNoSourceÚ	NotPython)Úisolate_moduleÚ	nice_pair)Úgenerate_tokens)ÚTArcÚTLineNoc                  ó
  • \ rS rSrSr   S       SS jjrSS jrSS jr\R                  " SS9SS	 j5       r
SS
 jrSS jrSS jrSS jrSS jrSS jrSS jr\R                  SS j5       rS S jrS!S jrS!S jrSrg)"ÚPythonParseré!   z�Parse code to find executable lines, excluded lines, etc.

This information is all based on static analysis: no code execution is
involved.

Nc                óð  • U(       d  U(       d   S5       eU=(       d    SU l         Ub  Xl        OSSKJn   U" U R                   5      U l        X0l        SU l        [        5       U l	        [        5       U l
        [        5       U l        [        5       U l        [        5       U l        SU l        0 U l        SU l        SU l        0 U l        g! [         a!  n[        SU R                    SU 35      UeSnAff = f)	z¦
Source can be provided as `text`, the text itself, or `filename`, from
which the text will be read.  Excluded lines are those that match
`exclude`, a regex string.

z*PythonParser needs either text or filenamez<code>Nr   )Úget_python_sourcezNo source for code: 'z': F)ÚfilenameÚtextÚcoverage.pythonr   ÚOSErrorr   ÚexcludeÚ	_ast_rootÚsetÚ
statementsÚexcludedÚraw_statementsÚraw_excludedÚraw_docstringsÚshow_tokensÚ
_multilineÚ	_all_arcsÚ_missing_arc_fragmentsÚ_with_jump_fixers)Úselfr   r   r   r   Úerrs         ÚP/var/www/blue/EV-Temp_rev04/venv/lib/python3.13/site-packages/coverage/parser.pyÚ__init__ÚPythonParser.__init__(   sð   € ö –xÐMÐ!MÓMÐØ ×, HˆŒØÑØ!�Iå9ðYÙ-¨d¯m©mÓ<�”	ð Œð *.ˆŒô
 ),«ˆŒô '*£eˆŒô -0«EˆÔô +.«%ˆÔô -0«EˆÔð !ˆÔð 35ˆŒð ,0ˆŒØ<@ˆÔ#Ø@BˆÕøôQ ó YÜÐ!6°t·}±}°oÀSÈÈÐNÓOÐUXÐXûðYús   ·C
 Ã

C5ÃC0Ã0C5c           	     óŒ  ^ • [        5       nSnSn[        R                  " UT R                  [        R                  S9 H‚  nUR                  5       u  pgUT R                  R                  SX65      -   nUT R                  R                  SX75      -   n	UR                  U 4S j[        US-   U	S-   5       5       5        UnUnM„     U$ )zÂFind the lines matching a regex.

Returns a set of line numbers, the lines that contain a match for
`regex`. The entire line needn't match, just a part of it.
Handles multiline regex patterns.

r   )ÚflagsÚ
c              3  óX   >#   • U H   nTR                   R                  X5      v •  M"     g 7f©N©r(   Úget)Ú.0Úir,   s     €r.   Ú	<genexpr>Ú.PythonParser.lines_matching.<locals>.<genexpr>v   s%   øé € ÐbÑ>a¸˜4Ÿ?™?×.Ñ.¨q×4Ð4Ò>aùs   ƒ'*é   é   )	r!   ÚreÚfinditerr   Ú	MULTILINEÚspanÚcountÚupdateÚrange)
r,   ÚregexÚmatchesÚ
last_startÚlast_start_lineÚmatchÚstartÚendÚ
start_lineÚend_lines
   `         r.   Úlines_matchingÚPythonParser.lines_matchingf   s«   ø€ ô !$£ˆàˆ
ØˆÜ—[’[ ¨¯	©	¼¿¹ÔFˆEØŸ™›‰JˆEØ(¨4¯9©9¯?©?¸4ÀÓ+SÑSˆJØ&¨¯©¯©¸¸zÓ)OÑOˆHØ�N‰NÔb¼eÀJÐQRÁNÐT\Ð_`ÑT`Ô>aÓbÔbØˆJØ(ŠOñ Gð ˆó    c           
     ó¸
  • U R                   (       a:  U R                  U R                   5      U l        [        U R                  5      U l        SnSnSnSnSnSnU R
                  c   e[        U R
                  5      nU GHØ  u  p‰u  p«u  pËnU R                  (       aD  [        [        R                  R                  Xˆ5      <S S[        X¬45      <S SU	<S SU< 35        U[        R                  :X  a  US	-  nOìU[        R                  :X  a  US	-  nOÒU[        R                   :X  ay  U	S
:X  a[  US:X  aU  U R                  R#                  [%        XLS	-   5      5      nU(       d&  U(       a  U R                  R'                  U5        UnSnO]U	S;   a  US	-  nOQU	S;   a  US	-  nOEU[        R(                  :X  a1  U(       a(  XÄ:w  a#  [%        XLS	-   5       H  nX@R*                  U'   M     SnU	R-                  5       (       d  GM€  U[        R.                  :w  d  GM—  SnU(       a  GM£  U
nU(       a  X::  a  SnU(       d  GM½  U R                  R'                  U5        GMÛ     U(       dG  [1        U R
                  U R2                  S9nU R4                  R7                  UR9                  5       5        [:        R<                  R>                  (       a3  U R*                  (       a"  [A        U R4                  5      U R*                  S	'   U RC                  U R                  5      U l        U RD                  c   e[F        RH                  " U RD                  5       GH  n[K        U[F        RL                  [F        RN                  [F        RP                  [F        RR                  45      (       aÛ  URT                  (       aÊ  URT                  S   n[K        U[F        RV                  5      (       aœ  [K        URX                  [F        RZ                  5      (       as  [K        URX                  RX                  [\        5      (       aJ  U R^                  R7                  [%        UR`                  [c        [d        URf                  5      S	-   5      5        [K        U[F        RL                  [F        RN                  [F        RP                  45      (       d  GMm  [A        S URh                   5       UR`                  S9nU R                  R#                  [%        UUR`                  S	-   5      5      (       d  GMÌ  U R                  R7                  [%        U[c        [d        URf                  5      S	-   5      5        GM     g)zgParse the source to find the interesting facts about its lines.

A handful of attributes are updated.

r   FTNz>10Ú z>5Ú20r<   Ú:z([{z)]})r   c              3  ó6   #   • U H  oR                   v •  M     g 7fr5   ©Úlineno)r8   Úds     r.   r:   Ú*PythonParser._raw_parse.<locals>.<genexpr>ä   s   é € Ð!HÑ4G¨q§(¦(Ò4Gùs   ‚)Údefault)5r   rN   r%   r!   r#   r   r   r'   ÚprintÚtokenizeÚtok_namer7   r   ÚtokenÚINDENTÚDEDENTÚOPÚintersectionrD   ÚaddÚNEWLINEr(   ÚstripÚCOMMENTÚ
ByteParserr   r$   rC   Ú_find_statementsr   Ú
PYBEHAVIORÚmodule_firstline_1ÚminÚfirst_linesr    ÚastÚwalkÚ
isinstanceÚClassDefÚFunctionDefÚAsyncFunctionDefÚModuleÚbodyÚExprÚvalueÚConstantÚstrr&   rW   r   ÚintÚ
end_linenoÚdecorator_list)r,   ÚindentÚexclude_indentÚ	excludingÚ
first_lineÚemptyÚnestingÚtokgenÚtoktypeÚttextÚslinenoÚ_ÚelinenoÚltextÚshould_excludeÚlÚbyte_parserÚnodeÚfirsts                      r.   Ú
_raw_parseÚPythonParser._raw_parse{   sÛ  € ð �<�<Ø $× 3Ñ 3°D·L±LÓ AˆDÔÜ × 1Ñ 1Ó2ˆDŒMð ˆàˆàˆ	àˆ
àˆàˆà�y‰yÑ$Ð$Ð$Ü  §¡Ó+ˆÜAGÑ=ˆG™L˜W©,¨7¸Ø××ÜÜ×%Ñ%×)Ñ)¨'×;Ü˜wÐ0×1´5º%ðô ð œ%Ÿ,™,Ó&Ø˜!‘‘ØœEŸL™LÓ(Ø˜!‘‘ØœEŸH™HÓ$Ø˜C“< G¨q£LàŸ™×2Ñ2´5¸ÈqÁ[Ó3QÓRð #ö %®ð Ÿ™×)Ñ)¨'Ô2Ø)/˜Ø$(˜	øØ˜e“^Ø˜q‘L‘GØ˜e“^Ø˜q‘L�GøØœEŸM™MÓ)Þ 'Ó"7ô # :°q©yÖ9˜Ø-7Ÿ™¨Ó*ñ :à�
à�{‰{�}Œ} ¬H×,<Ñ,<Ö!<à�ß!‘zà!(�Jæ  VÓ%=Ø$)˜	ß ‘yØŸ™×)Ñ)¨'×2ñ[ BHö` Ü$ T§Y¡Y¸¿¹ÑGˆKØ×Ñ×&Ñ& {×'CÑ'CÓ'EÔFô
 �>‰>×,×,°··Ü!$ T×%8Ñ%8Ó!9ˆD�O‰O˜AÑà×(Ñ(¨¯©Ó7ˆŒð �~‰~Ñ)Ð)Ð)Ü—H’H˜TŸ^™^×,ˆDä˜$¤§¡¬s¯©Ä×@TÑ@TÔVY×V`ÑV`Ð a×bÑbØ—9—9Ø ŸI™I a™L�Eä" 5¬#¯(©(×3Ñ3Ü& u§{¡{´C·L±L×AÑAÜ& u§{¡{×'8Ñ'8¼#×>Ñ>à×+Ñ+×2Ñ2Ü! %§,¡,´´S¸%×:JÑ:JÓ0KÈaÑ0OÓPôô
 ˜$¤§¡¬s¯©Ä×@TÑ@TÐ U×VÔVÜ Ñ!H°D×4GÒ4GÓ!HÐRV×R]ÑR]Ñ^�
Ø—=‘=×-Ñ-¬e°JÀÇÁÈaÁÓ.P×QÔQØ—M‘M×(Ñ(¬¨z¼4ÄÀTÇ_Á_Ó;UÐXYÑ;YÓ)Z×[ò% -rP   iè  )Úmaxsizec                óŠ   • US:  a!  U R                   R                  U* U* 5      * nU$ U R                   R                  X5      nU$ )zAReturn the first line number of the statement including `lineno`.r   r6   )r,   rW   s     r.   r   ÚPythonParser.first_lineè   sJ   € ð �A‹:Ø—o‘o×)Ñ)¨6¨'°F°7Ó;Ð;ˆFð ˆð —_‘_×(Ñ(¨Ó8ˆFØˆrP   c                óL   • U Vs1 sH  o R                  U5      iM     sn$ s  snf )zrMap the line numbers in `linenos` to the correct first line of the
statement.

Returns a set of the first lines.

)r   )r,   ÚlinenosrŠ   s      r.   rl   ÚPythonParser.first_linesñ   s#   € ñ -4Ó4©G q—‘ Ö"©GÑ4Ð4ùÒ4s   …!c                ó$   • U R                  U5      $ )z)Implement `FileReporter.translate_lines`.)rl   )r,   Úliness     r.   Útranslate_linesÚPythonParser.translate_linesú   s   € à×Ñ Ó&Ð&rP   c                ó˜   • U R                  U5       VVs1 sH'  u  p#U R                  U5      U R                  U5      4iM)     snn$ s  snnf )z(Implement `FileReporter.translate_arcs`.)Úfix_with_jumpsr   )r,   ÚarcsÚaÚbs       r.   Útranslate_arcsÚPythonParser.translate_arcsþ   sA   € àGK×GZÑGZÐ[_ÔG`ÔaÑG`¹V¸a�—‘ Ó# T§_¡_°QÓ%7Ó8ÑG`ÒaÐaùÓas   •-Ac                ó   •  [         R                  " U R                  5      U l        U R	                  5         U R                  U R                  -  nU R                   U-
  nU R#                  U5      U-
  U l        g! [
        R                  [        [        4 ae  n[        US5      (       a  UR                  nOUR                  S   S   n[        SU R                   S3UR                  S   < SU 3-   5      UeSnAff = f)z©Parse source text to find executable lines, excluded lines, etc.

Sets the .excluded and .statements attributes, normalized to the first
line of multi-line statements.

rW   r<   r   zCouldn't parse 'z' as Python source: z	 at line N)rm   Úparser   r    rŽ   r\   Ú
TokenErrorÚIndentationErrorÚSyntaxErrorÚhasattrrW   Úargsr   r   r#   r&   r$   rl   r"   )r,   r-   rW   ÚignoreÚstartss        r.   Úparse_sourceÚPythonParser.parse_source  sç   € ð	Ü ŸYšY t§y¡yÓ1ˆDŒNØ�O‰OÔð —‘ ×!4Ñ!4Ñ4ˆØ×$Ñ$ vÑ-ˆØ×*Ñ*¨6Ó2°VÑ;ˆ�øô ×#Ñ#Ô%5´{ÐCó 	Ü�s˜H×%Ñ%ØŸ™‘àŸ™ !™ Q™�ÜØ" 4§=¡= /Ð1EÐFØ—8‘8˜A‘;‘/ ¨6¨(Ð3ñ4óð ðûð	ús   ‚5A9 Á9C=ÂA C8Ã8C=c                ór   • U R                   c  U R                  5         U R                   c   eU R                   $ )z«Get information about the arcs available in the code.

Returns a set of line number pairs.  Line numbers have been normalized
to the first line of multi-line statements.

)r)   Ú_analyze_ast©r,   s    r.   rœ   ÚPythonParser.arcs  s4   € ð �>‰>Ñ!Ø×ÑÔØ�~‰~Ñ)Ð)Ð)Ø�~‰~ÐrP   c                óR  • U R                   c   e[        U R                  U R                   U R                  U R                  5      nUR                  5         UR                  n[        R                  R                  (       a7  UR                  5       U l        U R                  (       a  U R                  U5      n[        5       U l        U HJ  u  p4U R                  U5      nU R                  U5      nXV:w  d  M.  U R                  R!                  XV45        ML     UR"                  U l        g)z[Run the AstArcAnalyzer and save its results.

`_all_arcs` is the set of arcs in the code.

N)r    ÚAstArcAnalyzerr   r$   r(   Úanalyzerœ   r   ri   Úexit_through_withÚwith_jump_fixersr+   r›   r!   r)   r   rc   Úmissing_arc_fragmentsr*   )r,   Úaaarœ   Úl1Úl2Úfl1Úfl2s          r.   r­   ÚPythonParser._analyze_ast&  sÜ   € ð �~‰~Ñ)Ð)Ð)Ü˜TŸ]™]¨D¯N©N¸D×<OÑ<OÐQU×Q`ÑQ`ÓaˆØ�‰ŒØ�x‰xˆÜ�>‰>×+×+Ø%(×%9Ñ%9Ó%;ˆDÔ"Ø×%×%Ø×*Ñ*¨4Ó0�ä›ˆŒÛ‰FˆBØ—/‘/ "Ó%ˆCØ—/‘/ "Ó%ˆCØ�zØ—‘×"Ñ" C :Ö.ñ	 ð '*×&?Ñ&?ˆÕ#rP   c                óÄ  • [        5       n[        5       nU H´  nX@R                  ;   d  M  US   nUR                  U5        U R                  U   u  pgX`R                  ;   aD  UR                  U5        U R                  U   u  pgUR                  U5        X`R                  ;   a  MD  UR                  XWS   45        UR                  U5        M¶     [        U5      U-  U-
  nU$ )a  Adjust arcs to fix jumps leaving `with` statements.

Consider this code:

    with open("/tmp/test", "w") as f1:
        a = 2
        b = 3
    print(4)

In 3.10+, we get traces for lines 1, 2, 3, 1, 4.  But we want to present
it to the user as if it had been 1, 2, 3, 4.  The arc 3->1 should be
replaced with 3->4, and 1->4 should be removed.

For this code, the fixers dict is {(3, 1): ((1, 4), (3, 4))}.  The key
is the actual measured arc from the end of the with block back to the
start of the with-statement.  The values are start_next (the with
statement to the next statement after the with), and end_next (the end
of the with-statement to the next statement after the with).

With nested with-statements, we have to trace through a few levels to
correct a longer chain of arcs.

r   r<   )r!   r+   rc   )r,   rœ   Ú	to_removeÚto_addÚarcÚend0Ú
start_nextÚend_nexts           r.   r›   ÚPythonParser.fix_with_jumps>  sÐ   € ô0 “Eˆ	Ü“ˆÛˆCØ×,Ñ,Õ,Ø˜1‘v�Ø—‘˜cÔ"Ø'+×'=Ñ'=¸cÑ'BÑ$�
Ø ×$:Ñ$:Ó:Ø—M‘M *Ô-Ø+/×+AÑ+AÀ*Ñ+MÑ(�JØ—M‘M (Ô+ð !×$:Ñ$:Õ:ð —
‘
˜D¨1¡+Ð.Ô/Ø—‘˜jÖ)ñ ô �D“	˜FÑ" iÑ/ˆØˆrP   c                ó  • [         R                  " [        5      nU R                  5        HQ  u  p#US:”  d   SU< SU R                   35       eX R
                  ;   a  M4  X0R
                  ;   a  ME  X==   S-  ss'   MS     U$ )zIGet a count of exits from that each line.

Excluded lines are excluded.

r   zl1=z  should be greater than zero in r<   )ÚcollectionsÚdefaultdictry   rœ   r   r#   )r,   Úexit_countsr·   r¸   s       r.   rÇ   ÚPythonParser.exit_countsf  sw   € ô +6×*AÒ*AÄ#Ó*FˆØ—i‘i–k‰FˆBØ˜“6ÐR˜c˜b™UÐ"BÀ4Ç=Á=À/ÐRÓR�6Ø—]‘]Ó"áØ—]‘]Ó"áØ‹O˜qÑ �Oñ "ð ÐrP   c                ó@   • Uc  US:  a  SnOSnUR                  US9nU$ )z=Apply some defaulting and formatting to an arc's description.r   zjump to the function exitzjump to line {lineno}rV   )Úformat)r,   Ú
action_msgrK   s      r.   Ú_finish_action_msgÚPythonParser._finish_action_msgz  s2   € àÑØ�Q‹wØ8‘
à4�
Ø×&Ñ&¨cÐ&Ð2ˆ
ØÐrP   c                óV  • U R                   c  U R                  5         U R                   c   eU R                   R                  X4S/5      n/ nU HG  u  pVU R                  Xb5      nSU SU 3nUb  USUR	                  US9 3-  nUR                  U5        MI     SR                  U5      $ )z5Provide an English sentence describing a missing arc.©NNzline z didn't z	 because rV   z or )r*   r­   r7   rÌ   rÊ   ÚappendÚjoin)r,   rJ   rK   Úfragment_pairsÚmsgsÚmissing_cause_msgrË   Úmsgs           r.   Úmissing_arc_descriptionÚ$PythonParser.missing_arc_description„  sÁ   € à×&Ñ&Ñ.Ø×ÑÔØ×.Ñ.Ñ:Ð:Ð:à×4Ñ4×8Ñ8¸%¸ÈÀ~ÓVˆàˆÛ-;Ñ)ÐØ×0Ñ0°ÓAˆJØ˜%˜ ¨¨Ð5ˆCØ Ñ,Ø˜Ð#4×#;Ñ#;À5Ð#;Ð#IÐ"JÐKÑK�à�K‰K˜Öñ .<ð �{‰{˜4Ó Ð rP   c                óÊ   • U R                   c  U R                  5         U R                   c   eU R                   R                  X4S/5      nU R                  US   S   U5      nU$ )z2Provide an English description of an arc's effect.rÏ   r   r<   )r*   r­   r7   rÌ   )r,   rJ   rK   rÒ   rË   s        r.   Úarc_descriptionÚPythonParser.arc_description—  sj   € à×&Ñ&Ñ.Ø×ÑÔØ×.Ñ.Ñ:Ð:Ð:à×4Ñ4×8Ñ8¸%¸ÈÀ~ÓVˆØ×,Ñ,¨^¸AÑ->¸qÑ-AÀ3ÓGˆ
ØÐrP   )r)   r    r*   r(   r+   r   r#   r   r&   r%   r$   r'   r"   r   )NNN)r   ú
str | Noner   rÛ   r   rÛ   ÚreturnÚNone)rE   rx   rÜ   úset[TLineNo]©rÜ   rÝ   )rW   r   rÜ   r   )r”   úIterable[TLineNo]rÜ   rÞ   )r—   rà   rÜ   rÞ   )rœ   zIterable[TArc]rÜ   ú	set[TArc])rÜ   rá   )rÜ   zdict[TLineNo, int])rË   rÛ   rK   r   rÜ   rx   )rJ   r   rK   r   rÜ   rx   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r/   rN   rŽ   Ú	functoolsÚ	lru_cacher   rl   r˜   rŸ   rª   rœ   r­   r›   rÇ   rÌ   rÖ   rÙ   Ú__static_attributes__© rP   r.   r   r   !   s¾   † ñð  Ø#Ø"ð	<Càð<Cð ð<Cð ð	<Cð
 
õ<Cô|ô*k\ðZ ×Ò Ñ&óó 'ðô5ô'ôbô<ô0
ô@ô0&ðP ×Ñóó ðô&ô!÷&rP   r   c                  óV   • \ rS rSrSr  S	       S
S jjrSS jrSS jrSS jrSr	g)rg   i¢  z3Parse bytecode to understand the structure of code.Nc                óN   • Xl         Ub  X l        g Uc   e[        XSSS9U l        g )NÚexecT)Údont_inherit)r   ÚcodeÚcompile)r,   r   rï   r   s       r.   r/   ÚByteParser.__init__¥  s2   € ð Œ	ØÑØ�IàÑ'Ð'Ð'ô   °ÀTÑJˆD�IrP   c                óB   ^ • U 4S j[        T R                  5       5       $ )aL  Iterate over all the code objects nested within this one.

The iteration includes `self` as its first value.

We skip code objects named `__annotate__` since they are deferred
annotations that usually are never run.  If there are errors in the
annotations, they will be caught by type checkers or other tools that
use annotations.

c              3  ón   >#   • U H+  nUR                   S :w  d  M  [        TR                  US9v •  M-     g7f)Ú__annotate__)rï   N)Úco_namerg   r   )r8   Úcr,   s     €r.   r:   Ú+ByteParser.child_parsers.<locals>.<genexpr>¿  s1   øé € ð 
á,�Ø�y‰y˜NÑ*ó *ŒJ�t—y‘y qÖ)Ú,ùs   ƒ5š5)r   rï   r®   s   `r.   Úchild_parsersÚByteParser.child_parsers´  s   ø€ ô
ä! $§)¡)Ô,ó
ð 	
rP   c              #  óÐ  #   • [        U R                  S5      (       a2  U R                  R                  5        H  u    pU(       d  M  Uv •  M     gU R                  R                  SSS2   nU R                  R                  SSS2   nSnU R                  R                  nSn[        X45       H*  u  p‰U(       a  Xe:w  a  Uv •  UnXx-  nU	S:¼  a  U	S-  n	Xi-  nM,     Xe:w  a  Uv •  gg7f)zŸYield the line numbers possible in this code object.

Uses co_lnotab described in Python/compile.c to find the
line numbers.  Produces a sequence: l0, l1, ...
Úco_linesr   Nr=   r<   é€   é   )r¦   rï   rû   Ú	co_lnotabÚco_firstlinenoÚzip)
r,   r†   ÚlineÚbyte_incrementsÚline_incrementsÚlast_line_numÚline_numÚbyte_numÚ	byte_incrÚ	line_incrs
             r.   Ú_line_numbersÚByteParser._line_numbersÅ  sæ   é € ô �4—9‘9˜j×)Ñ)à"Ÿi™i×0Ñ0Ö2‘
��1ß�4Ø”Jò 3ð
 #Ÿi™i×1Ñ1°!°$°Q°$Ñ7ˆOØ"Ÿi™i×1Ñ1°!°$°Q°$Ñ7ˆOà ˆMØ—y‘y×/Ñ/ˆHØˆHÜ(+¨OÖ(MÑ$�	ÞØÓ0Ø&šØ(0˜ØÑ)�HØ Ó$Ø Ñ&�IØÑ%’ñ )Nð Ó(Ø“ð )ùs   ‚AC&ÁBC&c              #  ón   #   • U R                  5        H  nUR                  5        Sh  v•N   M     g N	7f)zœFind the statements in `self.code`.

Produce a sequence of line numbers that start statements.  Recurses
into all code objects reachable from `self.code`.

N)rø   r	  )r,   Úbps     r.   rh   ÚByteParser._find_statementsä  s/   é € ð ×$Ñ$Ö&ˆBà×'Ñ'Ó)×)Ò)ò 'á)ùs   ‚'5©3ª
5)rï   r   rÏ   )r   rx   rï   zCodeType | Noner   rÛ   rÜ   rÝ   )rÜ   zIterable[ByteParser])rÜ   rà   )
râ   rã   rä   rå   ræ   r/   rø   r	  rh   ré   rê   rP   r.   rg   rg   ¢  sL   † Ù=ð
 !%Ø#ð	KàðKð ðKð ð	Kð
 
õKô
ô"÷>	*rP   rg   T)ÚfrozenÚorderc                  ó2   • \ rS rSr% SrS\S'   SrS\S'   Srg	)
ÚArcStartiô  a÷  The information needed to start an arc.

`lineno` is the line number the arc starts from.

`cause` is an English text fragment used as the `missing_cause_msg` for
AstArcAnalyzer.missing_arc_fragments.  It will be used to describe why an
arc wasn't executed, so should fit well into a sentence of the form,
"Line 17 didn't run because {cause}."  The fragment can include "{lineno}"
to have `lineno` interpolated into it.

As an example, this code::

    if something(x):        # line 1
        func(x)             # line 2
    more_stuff()            # line 3

would have two ArcStarts:

- ArcStart(1, "the condition on line 1 was always true")
- ArcStart(1, "the condition on line 1 was never true")

The first would be used to create an arc from 1 to 3, creating a message like
"line 1 didn't jump to line 3 because the condition on line 1 was always true."

The second would be used for the arc from 1 to 2, creating a message like
"line 1 didn't jump to line 2 because the condition on line 1 was never true."

r   rW   Ú rx   Úcauserê   N)râ   rã   rä   rå   ræ   Ú__annotations__r  ré   rê   rP   r.   r  r  ô  s   ‡ ñð8 ƒOØ€Eˆ3†OrP   r  c                  ó<   • \ rS rSrSr  S         SS jjrSrg)Ú	TAddArcFni  z&The type for AstArcAnalyzer.add_arc().Nc                ó   • g)a*  
Record an arc from `start` to `end`.

`missing_cause_msg` is a description of the reason the arc wasn't
taken if it wasn't taken.  For example, "the condition on line 10 was
never true."

`action_msg` is a description of what the arc does, like "jump to line
10" or "exit from function 'fooey'."

Nrê   ©r,   rJ   rK   rÔ   rË   s        r.   Ú__call__ÚTAddArcFn.__call__  s   � rP   rê   rÏ   ©
rJ   r   rK   r   rÔ   rÛ   rË   rÛ   rÜ   rÝ   )râ   rã   rä   rå   ræ   r  ré   rê   rP   r.   r  r    sG   † Ù0ð
 )-Ø!%ðàðð ðð &ð	ð
 ðð 
÷ð rP   r  c                  ó@   • \ rS rSrSrS	S jrS	S jrS	S jrS	S jrSr	g)
ÚBlocki.  a#  
Blocks need to handle various exiting statements in their own ways.

All of these methods take a list of exits, and a callable `add_arc`
function that they can use to add arcs if needed.  They return True if the
exits are handled, or False if the search should continue up the block
stack.
c                ó   • g)zProcess break exits.Frê   ©r,   ÚexitsÚadd_arcs      r.   Úprocess_break_exitsÚBlock.process_break_exits8  ó   € àrP   c                ó   • g)zProcess continue exits.Frê   r  s      r.   Úprocess_continue_exitsÚBlock.process_continue_exits<  r$  rP   c                ó   • g)zProcess raise exits.Frê   r  s      r.   Úprocess_raise_exitsÚBlock.process_raise_exits@  r$  rP   c                ó   • g)zProcess return exits.Frê   r  s      r.   Úprocess_return_exitsÚBlock.process_return_exitsD  r$  rP   rê   N©r   úset[ArcStart]r!  r  rÜ   Úbool)
râ   rã   rä   rå   ræ   r"  r&  r)  r,  ré   rê   rP   r.   r  r  .  s   † ñôôô÷rP   r  c                  ó6   • \ rS rSrSrSS jrS	S jrS	S jrSrg)
Ú	LoopBlockiI  z@A block on the block stack representing a `for` or `while` loop.c                ó.   • Xl         [        5       U l        g r5   )rJ   r!   Úbreak_exits)r,   rJ   s     r.   r/   ÚLoopBlock.__init__K  s   € àŒ
ä*-«%ˆÕrP   c                ó:   • U R                   R                  U5        g©NT)r4  rC   r  s      r.   r"  ÚLoopBlock.process_break_exitsQ  s   € Ø×Ñ×Ñ Ô&ØrP   c                óf   • U H+  nU" UR                   U R                  UR                  5        M-     gr7  )rW   rJ   r  ©r,   r   r!  Úxits       r.   r&  Ú LoopBlock.process_continue_exitsU  s'   € ÛˆCÙ�C—J‘J §
¡
¨C¯I©IÖ6ñ àrP   )r4  rJ   N)rJ   r   rÜ   rÝ   r.  )	râ   rã   rä   rå   ræ   r/   r"  r&  ré   rê   rP   r.   r2  r2  I  s   † ÙJô0ô÷rP   r2  c                  ó6   • \ rS rSrSrSS jrS	S jrS	S jrSrg)
ÚFunctionBlocki[  z>A block on the block stack representing a function definition.c                ó   • Xl         X l        g r5   ©rJ   Úname)r,   rJ   rA  s      r.   r/   ÚFunctionBlock.__init__]  s   € àŒ
à�	rP   c                ó†   • U H;  nU" UR                   U R                  * UR                  SU R                  < 35        M=     g)Nzexcept from function T©rW   rJ   r  rA  r:  s       r.   r)  Ú!FunctionBlock.process_raise_exitsc  ó<   € ÛˆCÙØ—
‘
˜TŸZ™Z˜K¨¯©Ø'¨¯	©	¡}Ð5öñ ð
 rP   c                ó†   • U H;  nU" UR                   U R                  * UR                  SU R                  < 35        M=     g)Nzreturn from function TrD  r:  s       r.   r,  Ú"FunctionBlock.process_return_exitsk  rF  rP   )rA  rJ   N)rJ   r   rA  rx   rÜ   rÝ   r.  )	râ   rã   rä   rå   ræ   r/   r)  r,  ré   rê   rP   r.   r>  r>  [  s   † ÙHôô÷rP   r>  c                  ó,   • \ rS rSrSrSS jrSS jrSrg)	ÚTryBlockit  z6A block on the block stack representing a `try` block.c                ó   • Xl         X l        g r5   )Úhandler_startÚfinal_start)r,   rL  rM  s      r.   r/   ÚTryBlock.__init__v  s   € à*Ôà&ÕrP   c                ó€   • U R                   b1  U H+  nU" UR                  U R                   UR                  5        M-     gr7  )rL  rW   r  r:  s       r.   r)  ÚTryBlock.process_raise_exits|  s5   € Ø×ÑÑ)Û�Ù˜Ÿ
™
 D×$6Ñ$6¸¿	¹	ÖBñ àrP   )rM  rL  N)rL  úTLineNo | NonerM  rQ  rÜ   rÝ   r.  )râ   rã   rä   rå   ræ   r/   r)  ré   rê   rP   r.   rJ  rJ  t  s   † Ù@ô'÷rP   rJ  c                  ó"   • \ rS rSrSrSS jrSrg)ÚNodeListiƒ  zµA synthetic fictitious node, containing a sequence of nodes.

This is used when collapsing optimized if-statements, to represent the
unconditional execution of one of the clauses.

c                ó8   • Xl         US   R                  U l        g ©Nr   ©rt   rW   )r,   rt   s     r.   r/   ÚNodeList.__init__Š  s   € ØŒ	Ø˜1‘g—n‘nˆ�rP   rV  N)rt   úSequence[ast.AST]rÜ   rÝ   )râ   rã   rä   rå   ræ   r/   ré   rê   rP   r.   rS  rS  ƒ  s   † ñ÷%rP   rS  c                  ó  • \ rS rSrSr          S,S jrS-S jrS.S jrS/S jrS0S jr	\	r
S1S jr  S2         S3S
 jjrS4S jrS5S jrS6S jrS7S jr\rS8S jr\r\rS9S jrS:S jr1 SkrS;S jr  S2       S<S jjrS=S jrS>S jrS?S jrS@S jrSAS jrSBS jrSBS jr SBS jr!SBS jr"SCS jr#SDS jr$\$r%SES  jr&SFS! jr'\'r(\$r)\$r*SGS" jr+\,RZ                  S#:¼  a  SHS$ jr.SIS% jr/SJS& jr0SKS' jr1SLS( jr2SMS) jr3SNS* jr4\4r5S+r6g	)Or±   i‘  aÇ  Analyze source text with an AST to find executable code paths.

The .analyze() method does the work, and populates these attributes:

`arcs`: a set of (from, to) pairs of the the arcs possible in the code.

`missing_arc_fragments`: a dict mapping (from, to) arcs to lists of
message fragments explaining why the arc is missing from execution::

    { (start, end): [(missing_cause_msg, action_msg), ...], }

For an arc starting from line 17, they should be usable to form complete
sentences like: "Line 17 didn't {action_msg} because {missing_cause_msg}".

NOTE: Starting in July 2024, I've been whittling this down to only report
arc that are part of true branches.  It's not clear how far this work will
go.

c                óÌ  • Xl         X l        U Vs1 sH  oTR                  XU5      iM     snU l        X@l        [        [        [        R                  " SS5      5      5      nU(       aY  [        SU R                   35        [        SU R                   35        [        [        R                  " U R                  SSS95        [        5       U l        [        R                  " [         5      U l        / U l        [        5       U l        [        5       U l        [        5       U l        [        5       U l        [        [        [        R                  " SS5      5      5      U l        g s  snf )	NÚCOVERAGE_AST_DUMPÚ0zStatements: zMultiline map: Té   )Úinclude_attributesr|   ÚCOVERAGE_TRACK_ARCS)r   Ú	root_noder7   r"   Ú	multiliner0  ry   ÚosÚgetenvr[   rm   Údumpr!   rœ   rÅ   rÆ   Úlistrµ   Úblock_stackÚcurrent_with_startsÚall_with_startsÚwith_entriesÚ
with_exitsÚdebug)r,   r   r`  r"   ra  rŠ   Údump_asts          r.   r/   ÚAstArcAnalyzer.__init__¦  s  € ð !ŒØ"ŒÙ8BÓC¹
°1Ÿ=™=¨Ö.¹
ÑCˆŒØ"Œô œœBŸIšIÐ&9¸3Ó?Ó@ÓAˆæä�L §¡Ð 1Ð2Ô3Ü�O D§N¡NÐ#3Ð4Ô5Ü”#—(’(˜4Ÿ>™>¸dÈ1ÑMÔNä"›uˆŒ	Ü4?×4KÒ4KÌDÓ4QˆÔ"Ø(*ˆÔô 25³ˆÔ Ü-0«UˆÔÜ'*£uˆÔÜ%(£UˆŒô œ#œbŸišiÐ(=¸sÓCÓDÓEˆ�
ùò7 Ds   ‘E!c                ó¸   • [         R                  " U R                  5       H6  nUR                  R                  n[        U SU-   S5      nUc  M.  U" U5        M8     g)zFExamine the AST tree from `self.root_node` to determine possible arcs.Ú_code_object__N)rm   rn   r`  Ú	__class__râ   Úgetattr)r,   rŒ   Ú	node_nameÚcode_object_handlers       r.   r²   ÚAstArcAnalyzer.analyzeÌ  sK   € ä—H’H˜TŸ^™^Ö,ˆDØŸ™×/Ñ/ˆIÜ")¨$Ð0@À9Ñ0LÈdÓ"SÐØ"Ó.Ù# DÖ)ò	 -rP   c                óî  • 0 nU R                    Vs1 sH+  nUS   U R                  ;   d  M  X R                  ;  d  M)  UiM-     nnU R                   H’  nU Vs1 sH  o"S   U:X  d  M  US   iM     nnU(       d  M*  [        U5      S:X  d   SU SU< 35       eUR	                  5       nU R
                   Vs1 sH  o"S   U:X  d  M  US   iM     nnU H  nXF4X†44XU4'   M     M”     U$ s  snf s  snf s  snf )a#  Get a dict with data for fixing jumps out of with statements.

Returns a dict.  The keys are arcs leaving a with-statement by jumping
back to its start.  The values are pairs: first, the arc from the start
to the next statement, then the arc that exits the with without going
to the start.

r   r<   zExpected one arc, got z with start = )rœ   rh  ri  ÚlenÚpoprj  )	r,   Úfixersr¿   Ú
with_nextsrJ   ÚnextsÚnxtÚendsrK   s	            r.   r´   ÚAstArcAnalyzer.with_jump_fixersÔ  s  € ð ˆð —y’yó
á �Ø�1‰v˜×-Ñ-Ñ-ó à25×=NÑ=NÑ2N÷ Ù ð 	ð 
ð
 ×)Ô)ˆEÙ'1ÓE¡z ¸±V¸u±_“V�S˜”V¡zˆEÐEÞÙÜ�u“: “?ÐTÐ&<¸U¸GÀ?È%ÉÐ$TÓT�?Ø—)‘)“+ˆCØ&*§o¢oÓI¡o˜s¸Q¹À5¹“F�C˜”F¡oˆDÐIÛ�Ø).¨°s°jÐ'A�˜U�|Ó$ó ñ *ð ˆùò
ùò Fùò
 Js'   ‘C(«C(¼C(ÁC-Á&	C-Â5C2Ã	C2c                ó  • U R                  U5      nUR                  (       aN  U R                  UR                  5      nU H,  nU R                  UR                  U* UR
                  S5        M.     g U R                  X"* 5        g )Nzexit the module)Úline_for_nodert   Úprocess_bodyr!  rW   r  ©r,   rŒ   rJ   r   r;  s        r.   Ú_code_object__ModuleÚ#AstArcAnalyzer._code_object__Moduleó  sd   € Ø×"Ñ" 4Ó(ˆØ�9�9Ø×%Ñ% d§i¡iÓ0ˆEÛ�Ø—‘˜SŸZ™Z¨%¨°·±Ð<MÖNò ð �L‰L˜ Õ'rP   c                ó
  • U R                  U5      nU R                  R                  [        X!R                  S95        U R                  UR                  5      nU R                  U5        U R                  R                  5         g )Nr@  )	r  rf  rÐ   r>  rA  r€  rt   r,  rw  ©r,   rŒ   rJ   r   s       r.   Ú_code_object__FunctionDefÚ(AstArcAnalyzer._code_object__FunctionDefý  sc   € Ø×"Ñ" 4Ó(ˆØ×Ñ×Ñ¤°EÇ	Á	Ñ JÔKØ×!Ñ! $§)¡)Ó,ˆØ×!Ñ! %Ô(Ø×Ñ×ÑÕrP   c                óÜ   • U R                  U5      nU R                  UR                  5      nU H:  nU R                  UR                  U* UR
                  SUR                  < 35        M<     g )Nzexit class )r  r€  rt   r!  rW   r  rA  r�  s        r.   Ú_code_object__ClassDefÚ%AstArcAnalyzer._code_object__ClassDef  sW   € Ø×"Ñ" 4Ó(ˆØ×!Ñ! $§)¡)Ó,ˆÛˆCØ�L‰L˜Ÿ™ e V¨S¯Y©Y¸+ÀdÇiÁiÁ]Ð8SÖTò rP   Nc           
     óX  • U R                   (       a+  [        SU SU SU< SU< 35        [        [        5       SS9  U R                  R	                  X45        XR
                  ;   a  U R                  R	                  X45        Uc  Ub!  U R                  X4   R                  X445        gg)z@Add an arc, including message fragments to use if it is missing.zAdding possible arc: (z, z): z

)rK   N)	rk  r[   r   rœ   rc   rg  ri  rµ   rÐ   r  s        r.   r!  ÚAstArcAnalyzer.add_arc  s¢   € ð �:�:ÜÐ*¨5¨'°°C°5¸Ð<MÑ;PÐPRÐS]ÑR`ÐaÔbÜ”+“- VÒ,Ø�	‰	�‰�u�lÔ#Ø×,Ñ,Ó,Ø×Ñ×!Ñ! 5 ,Ô/àÑ(¨JÑ,BØ×&Ñ&¨ |Ñ4×;Ñ;Ð=NÐ<[Õ\ð -CrP   c                ó,   • [        U R                  5      $ )z.Yield the blocks in nearest-to-farthest order.)Úreversedrf  r®   s    r.   Únearest_blocksÚAstArcAnalyzer.nearest_blocks  s   € ä˜×(Ñ(Ó)Ð)rP   c                ó  • UR                   R                  n[        [        [        [
        R                  /[        4      [        U SU-   S5      5      nUb	  U" U5      nOUR                  nU R                  R                  XD5      $ )zmWhat is the right line number to use for this node?

This dispatches to _line__Node functions where needed.

Ú_line__N)rp  râ   r   r
   r	   rm   ÚASTr   rq  rW   ra  r7   )r,   rŒ   rr  Úhandlerr  s        r.   r  ÚAstArcAnalyzer.line_for_node"  su   € ð —N‘N×+Ñ+ˆ	ÜÜ”XœsŸw™w˜i¬Ð0Ñ1Ñ2Ü�D˜) iÑ/°Ó6ó
ˆð ÑÙ˜4“=‰Dà—;‘;ˆDØ�~‰~×!Ñ! $Ó-Ð-rP   c                óv   • UR                   (       a  UR                   S   R                  nU$ UR                  nU$ )zSCompute first line number for things that can be decorated (classes and functions).r   )r{   rW   )r,   rŒ   rW   s      r.   Ú_line_decoratedÚAstArcAnalyzer._line_decorated8  s8   € à××Ø×(Ñ(¨Ñ+×2Ñ2ˆFð ˆð —[‘[ˆFØˆrP   c                ó8   • U R                  UR                  5      $ r5   )r  rv   ©r,   rŒ   s     r.   Ú_line__AssignÚAstArcAnalyzer._line__Assign@  s   € Ø×!Ñ! $§*¡*Ó-Ð-rP   c                óÀ   • UR                   (       aB  UR                   S   b  UR                   S   R                  $ UR                  S   R                  $ UR                  $ rU  )ÚkeysrW   Úvaluesrš  s     r.   Ú_line__DictÚAstArcAnalyzer._line__DictE  sK   € Ø�9�9Ø�y‰y˜‰|Ñ'Ø—y‘y ‘|×*Ñ*Ð*ð —{‘{ 1‘~×,Ñ,Ð,à—;‘;ÐrP   c                óx   • UR                   (       a  U R                  UR                   S   5      $ UR                  $ rU  )Úeltsr  rW   rš  s     r.   Ú_line__ListÚAstArcAnalyzer._line__ListS  s,   € Ø�9�9Ø×%Ñ% d§i¡i°¡lÓ3Ð3à—;‘;ÐrP   c                ó¢   • [         R                  R                  (       a  gUR                  (       a  U R	                  UR                  S   5      $ g©Nr<   r   )r   ri   rj   rt   r  rš  s     r.   Ú_line__ModuleÚAstArcAnalyzer._line__ModuleY  s7   € Ü�>‰>×,×,ØØ�Y�YØ×%Ñ% d§i¡i°¡lÓ3Ð3ð rP   >   ru   ÚPassÚAssertÚAssignÚDeleteÚGlobalÚImportÚNonlocalÚ	AnnAssignÚ	AugAssignÚ
ImportFromc                ón  • UR                   R                  n[        [        [        [
        R                  /[        [           4      [        U SU-   S5      5      nUb
  U" U5      nU$ [        R                  (       a  X R                  ;  a  [        SU 35      e[        U R                  U5      5      1nU$ )a¾  Find the set of arc starts that exit this node.

Return a set of ArcStarts, exits from this node to the next. Because a
node represents an entire sub-tree (including its children), the exits
from a node can be arbitrarily complex::

    if something(1):
        if other(2):
            doit(3)
        else:
            doit(5)

There are three exits from line 1: they start at lines 1, 3 and 5.
There are two exits from line 2: lines 3 and 5.

Ú	_handle__Nz*** Unhandled: )rp  râ   r   r
   r	   rm   r“  r!   r  rq  r   ÚTESTINGÚOK_TO_DEFAULTÚRuntimeErrorr  )r,   rŒ   rr  r”  Ú
arc_startss        r.   Ú
node_exitsÚAstArcAnalyzer.node_exitsh  sª   € ð" —N‘N×+Ñ+ˆ	ÜÜ”XœsŸw™w˜i¬¬X©Ð6Ñ7Ñ8Ü�D˜+¨	Ñ1°4Ó8ó
ˆð ÑÙ  ›ˆJð Ðô �{�{Ø×$6Ñ$6Ó6Ü&¨¸¸Ð'?Ó@Ð@ô # 4×#5Ñ#5°dÓ#;Ó<Ð=ˆJØÐrP   c                ó^  • Uc  Uc  [        5       nO	U1nOUb   eU HŒ  nU R                  U5      nXPR                  ;  a)  U R                  U5      nUc  M9  UnU R                  U5      nU H)  nU R	                  UR
                  XWR                  5        M+     U R                  U5      nMŽ     U$ )a›  Process the body of a compound statement.

`body` is the body node to process.

`from_start` is a single `ArcStart` that starts an arc into this body.
`prev_starts` is a set of ArcStarts that can all be the start of arcs
into this body.  Only one of `from_start` and `prev_starts` should be
given.

Records arcs within the body by calling `self.add_arc`.

Returns a set of ArcStarts, the exits from this body.

)r!   r  r"   Úfind_non_missing_noder!  rW   r  rº  )r,   rt   Ú
from_startÚprev_startsÚ	body_noderW   Úmaybe_body_nodeÚ
prev_starts           r.   r€  ÚAstArcAnalyzer.process_body‹  s¸   € ð( ÑØÑ!Ü!›e‘à)˜l‘àÑ%Ð%Ð%ó ˆIØ×'Ñ'¨	Ó2ˆFØŸ_™_Ó,Ø"&×"<Ñ"<¸YÓ"G�Ø"Ñ*ÙØ+�	Ø×+Ñ+¨IÓ6�Û)�
Ø—‘˜Z×.Ñ.°×8HÑ8HÖIñ *àŸ/™/¨)Ó4ŠKñ ð ÐrP   c                ó,  • U R                  U5      nX R                  ;   a  U$ [        [        [        [
        R                  /[        [
        R                     4      [        U SUR                  R                  -   S5      5      nUb
  U" U5      nU$ SnU$ )zîSearch `node` looking for a child that has not been optimized away.

This might return the node you started with, or it will work recursively
to find a child node in self.statements.

Returns a node, or None if none of the node remains.

Ú
_missing__N)
r  r"   r   r
   r	   rm   r“  rq  rp  râ   )r,   rŒ   rW   Ú
missing_fnÚret_nodes        r.   r½  Ú$AstArcAnalyzer.find_non_missing_node¶  sŽ   € ð ×#Ñ# DÓ)ˆØ—_‘_Ó$ØˆKäÜ”XœsŸw™w˜i¬´#·'±'Ñ):Ð:Ñ;Ñ<Ü�D˜,¨¯©×)@Ñ)@Ñ@À$ÓGó
ˆ
ð Ñ!Ù! $Ó'ˆHð ˆð ˆHØˆrP   c                óÈ   • U R                  [        UR                  5      5      nU(       a  U$ UR                  (       a$  U R                  [        UR                  5      5      $ g r5   )r½  rS  rt   Úorelse)r,   rŒ   Únon_missings      r.   Ú_missing__IfÚAstArcAnalyzer._missing__If×  sJ   € ð ×0Ñ0´¸$¿)¹)Ó1DÓEˆÞØÐØ�;�;Ø×-Ñ-¬h°t·{±{Ó.CÓDÐDØrP   c                óÈ   • / nUR                    H*  nU R                  U5      nUc  M  UR                  U5        M,     U(       d  g [        U5      S:X  a  US   $ [	        U5      $ r§  )rt   r½  rÐ   rv  rS  )r,   rŒ   Únon_missing_childrenÚchildÚmaybe_childs        r.   Ú_missing__NodeListÚ!AstArcAnalyzer._missing__NodeListâ  si   € ð  "ÐØ—Y”YˆEØ×4Ñ4°UÓ;ˆKØÓ&Ø$×+Ñ+¨KÖ8ñ ö $ØÜÐ#Ó$¨Ó)Ø'¨Ñ*Ð*ÜÐ,Ó-Ð-rP   c                óŒ  • U R                  [        UR                  5      5      nU(       d  g [        R                  " 5       nUR
                  Ul        [        R                  " 5       Ul        UR
                  UR                  l        SUR                  l        [        US5      (       d   eUR                  Ul        / Ul
        U$ )NÚTruert   )r½  rS  rt   rm   ÚWhilerW   ÚNameÚtestÚidr¦   rÊ  )r,   rŒ   Ú
body_nodesÚ	new_whiles       r.   Ú_missing__WhileÚAstArcAnalyzer._missing__Whileò  s‘   € Ø×/Ñ/´¸¿¹Ó0CÓDˆ
ÞØä—I’I“Kˆ	Ø%×,Ñ,ˆ	ÔÜŸš›ˆ	ŒØ *× 1Ñ 1ˆ	�‰ÔØ"ˆ	�‰ÔÜ�z 6×*Ñ*Ð*Ð*Ø#Ÿ™ˆ	ŒØˆ	ÔØÐrP   c                óž   • UR                   R                  nUS;   a  g[        U[        R                  5      (       a  UR
                  S;   a  gg)z Is this a compile-time constant?)rw   ÚNameConstantÚNumrà  )rÕ  ÚFalserÝ   Ú	__debug__r×  N)rp  râ   ro   rm   r×  rÙ  )r,   rŒ   rr  s      r.   Úis_constant_exprÚAstArcAnalyzer.is_constant_expr  sA   € à—N‘N×+Ñ+ˆ	ØÐ;Ó;ØÜ˜œcŸh™h×'Ñ'Ø�w‰wÐ@Ó@ØØrP   c                óv   • U R                  5        H%  nUR                  XR                  5      (       d  M%    g   g)z0Add arcs due to jumps from `exits` being breaks.N)r�  r"  r!  ©r,   r   Úblocks      r.   r"  Ú"AstArcAnalyzer.process_break_exits  ó-   € à×(Ñ(Ö*ˆEØ×(Ñ(¨·±×=Ó=Ùò +rP   c                óv   • U R                  5        H%  nUR                  XR                  5      (       d  M%    g   g)z3Add arcs due to jumps from `exits` being continues.N)r�  r&  r!  ræ  s      r.   r&  Ú%AstArcAnalyzer.process_continue_exits   s-   € à×(Ñ(Ö*ˆEØ×+Ñ+¨E·<±<×@Ó@Ùò +rP   c                óv   • U R                  5        H%  nUR                  XR                  5      (       d  M%    g   g)z0Add arcs due to jumps from `exits` being raises.N)r�  r)  r!  ræ  s      r.   r)  Ú"AstArcAnalyzer.process_raise_exits&  ré  rP   c                óv   • U R                  5        H%  nUR                  XR                  5      (       d  M%    g   g)z1Add arcs due to jumps from `exits` being returns.N)r�  r,  r!  ræ  s      r.   r,  Ú#AstArcAnalyzer.process_return_exits,  s-   € à×(Ñ(Ö*ˆEØ×)Ñ)¨%·±×>Ó>Ùò +rP   c                óp   • U R                  U5      n[        USS9nU R                  U15        [        5       $ )Nz*the break on line {lineno} wasn't executed©r  )r  r  r"  r!   )r,   rŒ   ÚhereÚbreak_starts       r.   Ú_handle__BreakÚAstArcAnalyzer._handle__Break=  s6   € Ø×!Ñ! $Ó'ˆÜ˜tÐ+WÑXˆØ× Ñ  + Ô/Ü‹uˆrP   c                ó˜  • UR                   nUR                   nUR                  nU(       a�  SnU H/  nU R                  U5      nUb  Xc:w  a  U R                  X65        UnM1     Uc   eU R                  X25        UnUR                  (       d/   SUR                  < SU R
                   SUR                    35       eUc   e[        U5      1$ )zBAdd arcs for things that can be decorated (classes and functions).NzOops: node.body = z in Ú@)rW   r{   r  r!  rt   r   r  )r,   rŒ   Ú	main_lineÚlastÚdecsÚdec_nodeÚ	dec_starts          r.   Ú_handle_decoratedÚ AstArcAnalyzer._handle_decoratedC  sÈ   € à!Ÿ[™[ˆ	Ø#Ÿ{™{ˆØ×"Ñ"ˆÞØˆDÛ �Ø ×.Ñ.¨xÓ8�	ØÑ#¨	Ó(9Ø—L‘L Ô1Ø ’ñ	 !ð
 Ñ#Ð#Ð#Ø�L‰L˜Ô)ØˆDð
 —9—9ÐVÐ 3 t§y¡y¡n°D¸¿¹¸ÀqÈÏÉÈÐVÓV�9àÑÐÐÜ˜“ÐÐrP   c                óp   • U R                  U5      n[        USS9nU R                  U15        [        5       $ )Nz-the continue on line {lineno} wasn't executedrñ  )r  r  r&  r!   )r,   rŒ   rò  Úcontinue_starts       r.   Ú_handle__ContinueÚ AstArcAnalyzer._handle__Continue]  s7   € Ø×!Ñ! $Ó'ˆÜ! $Ð.]Ñ^ˆØ×#Ñ# ^Ð$4Ô5Ü‹uˆrP   c                ó8  • U R                  UR                  5      nU R                  R                  [	        US95        [        USS9nU R                  UR                  US9nU H)  nU R                  UR                  X%R                  5        M+     U R                  R                  5       n[        U[        5      (       d   eUR                  n[        USS9nUR                  (       a   U R                  UR                  US9nXG-  nU$ UR                  U5        U$ )N©rJ   z'the loop on line {lineno} never startedrñ  ©r¾  z)the loop on line {lineno} didn't complete)r  Úiterrf  rÐ   r2  r  r€  rt   r!  rW   r  rw  ro   r4  rÊ  rc   )r,   rŒ   rJ   r¾  r   r;  Úmy_blockÚ
else_exitss           r.   Ú_handle__ForÚAstArcAnalyzer._handle__Forc  sö   € Ø×"Ñ" 4§9¡9Ó-ˆØ×Ñ×Ñ¤	°Ñ 6Ô7Ü˜eÐ+TÑUˆ
Ø×!Ñ! $§)¡)¸
Ð!ÐCˆãˆCØ�L‰L˜Ÿ™ U¯I©IÖ6ñ à×#Ñ#×'Ñ'Ó)ˆÜ˜(¤I×.Ñ.Ð.Ð.Ø×$Ñ$ˆÜ˜eÐ+VÑWˆ
Ø�;�;Ø×*Ñ*¨4¯;©;À:Ð*ÐNˆJØÑˆEð ˆð �I‰I�jÔ!ØˆrP   c                óÐ   • U R                  UR                  5      n[        USS9nU R                  UR                  US9n[        USS9nX@R                  UR
                  US9-  nU$ )Nú-the condition on line {lineno} was never truerñ  r  ú.the condition on line {lineno} was always true)r  rØ  r  r€  rt   rÊ  )r,   rŒ   rJ   r¾  r   s        r.   Ú_handle__IfÚAstArcAnalyzer._handle__If|  sj   € Ø×"Ñ" 4§9¡9Ó-ˆÜ˜eÐ+ZÑ[ˆ
Ø×!Ñ! $§)¡)¸
Ð!ÐCˆÜ˜eÐ+[Ñ\ˆ
Ø×"Ñ" 4§;¡;¸:Ð"ÐFÑFˆØˆrP   )é   é
   c                óZ  • U R                  U5      nUn[        5       nUR                   HX  nU R                  UR                  5      nU R	                  X6S5        [        USS9nX@R                  UR                  US9-  nUnMZ     WR                  n[        U[        R                  5      (       a0  UR                  S   n[        U[        R                  5      (       a  M0  [        U[        R                  5      (       aG  UR                  b:  UR                  n[        U[        R                  5      (       a  UR                  b  M:  [        U[        R                  5      =(       a#    UR                  S L =(       a    UR                  S L n	U	(       d  UR                  [        WSS95        U$ )Nz+the pattern on line {lineno} always matchedz*the pattern on line {lineno} never matchedrñ  r  éÿÿÿÿ)r  r!   ÚcasesÚpatternr!  r  r€  rt   ro   rm   ÚMatchOrÚpatternsÚMatchAsÚguardrc   )
r,   rŒ   rJ   rG   r   ÚcaseÚ
case_startr¾  r  Úhad_wildcards
             r.   Ú_handle__MatchÚAstArcAnalyzer._handle__Match…  sZ  € Ø×&Ñ& tÓ,ˆEØˆJÜ“EˆEØŸ
œ
�Ø!×/Ñ/°·±Ó=�
Ø—‘˜ZÐ5bÔcÜ%ØØFñ�
ð ×*Ñ*¨4¯9©9ÀÐ*ÐLÑL�Ø'’
ñ #ð —l‘lˆGÜ˜W¤c§k¡k×2Ñ2Ø!×*Ñ*¨2Ñ.�ô ˜W¤c§k¡k×2Ó2ä˜W¤c§k¡k×2Ñ2°w·±Ñ7RØ!Ÿ/™/�ô ˜W¤c§k¡k×2Ñ2°w·±Ó7Rô ˜7¤C§K¡KÓ0÷ 'Ø—O‘O tÐ+÷'à—J‘J $Ð&ð ö  Ø—	‘	Ü˜ZÐ/\Ñ]ôð ˆLrP   c                ón   • U R                  U5      nU R                  UR                  [        U5      S9nU$ )Nr  )r  r€  rt   r  r…  s       r.   Ú_handle__NodeListÚ AstArcAnalyzer._handle__NodeList¥  s4   € Ø×"Ñ" 4Ó(ˆØ×!Ñ! $§)¡)¼À»Ð!ÐHˆØˆrP   c                óp   • U R                  U5      n[        USS9nU R                  U15        [        5       $ )Nz*the raise on line {lineno} wasn't executedrñ  )r  r  r)  r!   )r,   rŒ   rò  Úraise_starts       r.   Ú_handle__RaiseÚAstArcAnalyzer._handle__Raiseª  s6   € Ø×!Ñ! $Ó'ˆÜ˜tÐ+WÑXˆØ× Ñ  + Ô/ä‹uˆrP   c                óp   • U R                  U5      n[        USS9nU R                  U15        [        5       $ )Nz+the return on line {lineno} wasn't executedrñ  )r  r  r,  r!   )r,   rŒ   rò  Úreturn_starts       r.   Ú_handle__ReturnÚAstArcAnalyzer._handle__Return±  s6   € Ø×!Ñ! $Ó'ˆÜ Ð,YÑZˆØ×!Ñ! < .Ô1ä‹uˆrP   c                óÂ  • UR                   (       a  U R                  UR                   S   5      nOS nUR                  (       a  U R                  UR                  S   5      nOS nUc  Uc   e[        X#5      nU R                  R                  U5        U R                  U5      nU R                  UR                  [        U5      S9nUR                  (       a  S Ul	        OU R                  R                  5         [        5       nUR                   (       aK  UR                    H;  nU R                  U5      nSn	[        X)S9n
XpR                  UR                  U
S9-  nM=     UR                  (       a  U R                  UR                  US9nXg-  nUR                  (       a?  U R                  R                  5         UnU R                  UR                  US9nU(       a  UnU$ )Nr   r  z3the exception caught by line {lineno} didn't happenrñ  )r¿  )Úhandlersr  Ú	finalbodyrJ  rf  rÐ   r€  rt   r  rL  rw  r!   rÊ  )r,   rŒ   rL  rM  Ú	try_blockrJ   r   Úhandler_exitsÚhandler_nodeÚ
from_causer¾  Ú
final_fromÚfinal_exitss                r.   Ú_handle__TryÚAstArcAnalyzer._handle__Try¸  s—  € Ø�=�=Ø ×.Ñ.¨t¯}©}¸QÑ/?Ó@‰Mà ˆMà�>�>Ø×,Ñ,¨T¯^©^¸AÑ->Ó?‰KàˆKð Ñ(¨KÑ,CÐCÐCÜ˜]Ó8ˆ	Ø×Ñ×Ñ 	Ô*à×"Ñ" 4Ó(ˆØ×!Ñ! $§)¡)¼À»Ð!ÐHˆð
 �>�>Ø&*ˆIÕ#à×Ñ× Ñ Ô"ä'*£uˆà�=�=Ø $§¤�Ø $× 2Ñ 2°<Ó @�ØR�
Ü% mÑF�
Ø×!2Ñ!2°<×3DÑ3DÐQ[Ð!2Ð!\Ñ\’ñ	 !.ð �;�;Ø×%Ñ% d§k¡k¸uÐ%ÐEˆEàÑˆà�>�>Ø×Ñ× Ñ Ô"ØˆJà×+Ñ+¨D¯N©NÈ
Ð+ÐSˆKæð $�àˆrP   c                óR  • U R                  UR                  5      =p#U R                  UR                  5      nSnU(       a  Sn[        R                  R
                  (       a  SnU(       a  U R                  UR                  S   5      nU R                  R                  [        US95        [        USS9nU R                  UR                  US9nU H)  nU R                  UR                  X8R                  5        M+     [        5       nU R                  R!                  5       n	[#        U	[        5      (       d   eUR%                  U	R&                  5        [        USS9nUR(                  (       a   U R                  UR(                  US9n
Xz-  nU$ U(       d  UR+                  U5        U$ )	NFTr   r  r  rñ  r  r  )r  rØ  rã  r   ri   Úkeep_constant_testrt   rf  rÐ   r2  r  r€  r!  rW   r  r!   rw  ro   rC   r4  rÊ  rc   )r,   rŒ   rJ   Úto_topÚconstant_testÚtop_is_body0r¾  r   r;  r  r  s              r.   Ú_handle__WhileÚAstArcAnalyzer._handle__Whileï  sX  € Ø×+Ñ+¨D¯I©IÓ6Ð6ˆØ×-Ñ-¨d¯i©iÓ8ˆØˆÞØˆLÜ�>‰>×,×,Ø ˆLÞØ×'Ñ'¨¯	©	°!©Ó5ˆFØ×Ñ×Ñ¤	°Ñ 7Ô8Ü˜eÐ+ZÑ[ˆ
Ø×!Ñ! $§)¡)¸
Ð!ÐCˆÛˆCØ�L‰L˜Ÿ™ V¯Y©YÖ7ñ ä“ˆØ×#Ñ#×'Ñ'Ó)ˆÜ˜(¤I×.Ñ.Ð.Ð.Ø�‰�X×)Ñ)Ô*Ü˜eÐ+[Ñ\ˆ
Ø�;�;Ø×*Ñ*¨4¯;©;À:Ð*ÐNˆJØÑˆEð
 ˆö !Ø—	‘	˜*Ô%ØˆrP   c                ó"  • [         R                  R                  (       a4  UR                   Vs/ sH  o R	                  UR
                  5      PM     nnOU R	                  U5      /n[         R                  R                  (       a?  U H9  nU R                  R                  U5        U R                  R                  U5        M;     U R                  UR                  [        US   5      S9n[         R                  R                  (       a�  US   nU R                  R                  U5        [        U5      1nU(       aN  U HF  nU R                  UR                  U5        U R                   R                  UR                  U45        MH     UnU$ s  snf )Nr  r  )r   ri   Úexit_with_through_ctxmgrÚitemsr  Úcontext_exprr³   rg  rc   rh  r€  rt   r  Úremover!  rW   rj  )r,   rŒ   Úitemr©   rJ   r   Ú	with_exitr;  s           r.   Ú_handle__WithÚAstArcAnalyzer._handle__With  s0  € Ü�>‰>×2×2ØHLÏ
Ê
ÓSÉ
À×(Ñ(¨×):Ñ):Ö;É
ˆFÐSˆFà×(Ñ(¨Ó.Ð/ˆFÜ�>‰>×+×+Û�Ø×(Ñ(×,Ñ,¨UÔ3Ø×$Ñ$×(Ñ(¨Ö/ñ  ð ×!Ñ! $§)¡)¼ÀÈÁÓ8LÐ!ÐMˆä�>‰>×+×+Ø˜2‘JˆEØ×$Ñ$×+Ñ+¨EÔ2Ü! %›Ð)ˆIÞÛ �CØ—L‘L §¡¨UÔ3Ø—O‘O×'Ñ'¨¯©°UÐ(;Ö<ñ !ð "�àˆùò) Ts   ®#F)rh  rœ   rf  rg  rk  r   rµ   ra  r`  r"   ri  rj  )
r   rx   r`  úast.ASTr"   rÞ   ra  zdict[TLineNo, TLineNo]rÜ   rÝ   rß   )rÜ   zdict[TArc, tuple[TArc, TArc]])rŒ   ú
ast.ModulerÜ   rÝ   )rŒ   úast.FunctionDefrÜ   rÝ   )rŒ   zast.ClassDefrÜ   rÝ   rÏ   r  )rÜ   zIterable[Block])rŒ   rE  rÜ   r   )rŒ   rG  rÜ   r   )rŒ   z
ast.AssignrÜ   r   )rŒ   zast.DictrÜ   r   )rŒ   zast.ListrÜ   r   )rŒ   rF  rÜ   r   )rŒ   rE  rÜ   r/  )rt   rX  r¾  zArcStart | Noner¿  zset[ArcStart] | NonerÜ   r/  )rŒ   rE  rÜ   úast.AST | None)rŒ   úast.IfrÜ   rH  )rŒ   rS  rÜ   rH  )rŒ   ú	ast.WhilerÜ   rH  )rŒ   rE  rÜ   rÛ   )r   r/  rÜ   rÝ   )rŒ   z	ast.BreakrÜ   r/  )rŒ   rG  rÜ   r/  )rŒ   zast.ContinuerÜ   r/  )rŒ   zast.ForrÜ   r/  )rŒ   rI  rÜ   r/  )rŒ   z	ast.MatchrÜ   r/  )rŒ   rS  rÜ   r/  )rŒ   z	ast.RaiserÜ   r/  )rŒ   z
ast.ReturnrÜ   r/  )rŒ   zast.TryrÜ   r/  )rŒ   rJ  rÜ   r/  )rŒ   zast.WithrÜ   r/  )7râ   rã   rä   rå   ræ   r/   r²   r´   r‚  r†  Ú_code_object__AsyncFunctionDefr‰  r!  r�  r  r—  r›  Ú_line__ClassDefr   Ú_line__FunctionDefÚ_line__AsyncFunctionDefr¤  r¨  r·  rº  r€  r½  rÌ  rÒ  rÜ  rã  r"  r&  r)  r,  rô  rý  Ú_handle__ClassDefr  r	  Ú_handle__AsyncForÚ_handle__FunctionDefÚ_handle__AsyncFunctionDefr  ÚsysÚversion_infor  r   r$  r(  r3  r:  rC  Ú_handle__AsyncWithré   rê   rP   r.   r±   r±   ‘  sÁ  † ñð($Fàð$Fð ð$Fð !ð	$Fð
 *ð$Fð 
ô$FôL*ôô>(ôð &?Ð"ôUð )-Ø!%ð]àð]ð ð]ð &ð	]ð
 ð]ð 
õ]ô$*ô.ô,ô.ð &€Oô	ð )ÐØ-Ðôôò€Mô
!ðL '+Ø,0ð	)àð)ð $ð)ð *ð	)ð
 
õ)ôVôB	ô.ô ôô2ôôôô"ô ð0 *Ðôôð( %Ðà,ÐØ 1Ðôð ×Ñ˜7Ó"ô	ô@ô
ôô5ônô:ð0 'ÓrP   r±   )8ræ   Ú
__future__r   rm   rç   rÅ   rb  r>   rS  r^   r\   Úcollections.abcr   r   Údataclassesr   Útypesr   Útypingr   r	   r
   r   Úcoverager   Úcoverage.bytecoder   Úcoverage.debugr   Úcoverage.exceptionsr   r   Úcoverage.miscr   r   Úcoverage.phystokensr   Úcoverage.typesr   r   r   rg   r  r  Údictre  Útuplerx   ÚTArcFragmentsr  r2  r>  rJ  r“  rS  r±   rê   rP   r.   Ú<module>re     s  ðñ $å "ã 
Û Û Û 	Û 	Û 
Û Û ç .Ý !Ý ß 5Ó 5å Ý *Ý &ß 3ß 3Ý /ß (á�BÓ€÷~ñ ~÷BK*ñ K*ñd �$˜dÑ#÷ð ó $ðôB�ô ð, �T˜4  h¨s¡m°X¸c±]Ð&BÑ CÑDÐDÑE€÷ñ ô6�ô ô$�Eô ô2ˆuô ô	%ˆs�w‰wô 	%÷S
'ò S
'rP   