
    JjQ                       d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlmZmZmZ ddlmZmZ ddlmZmZmZ dd	lmZmZmZ  ee      j5                         j6                  d
   Zedz  ZdZdZg dZ g dZ!dg dddg ddgZ"d!dZ#d"dZ$d#dZ%d$dZ&	 d%	 	 	 	 	 	 	 	 	 	 	 	 	 d&dZ'd'dZ(d(dZ)d)dZ*d)dZ+edfd*dZ,d+dZ-e.d k(  r e-        yy),z@Explain opcode 0x2c stops on the current route-pair descriptors.    )annotationsN)Path)Any)find_cns_stringsread_sectionsva_to_offset)DEFAULT_HANDLER_VAHANDLER_TABLE_VA)analyze_stream_effectdword_atsection_name_for_va)byte_athandler_entryu32_at   out,   
0x00542b0c)z!normal-route-descriptor-selectionzfrontier-reader-target-linkagezstrict-source-hotspot)zQnormal runtime selector/root execution selecting corrected route-pair descriptorszPfrontier reader branch outcome and field-map target linkage on a real route pathz,strict map1_01a source coordinate or hotspotHwanse2.exe).textzhandler tablezopcode 0x2c)pathfieldsz4out/save_selector_route_pair_descriptor_context.json)rowsfrontierReaderHexdescriptorTracegeometryExitWordHitCountc                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)r   fallbacks     P/home/exedev/hwanse/tools/summarize_save_selector_opcode2c_route_pair_context.py	load_jsonr'   ,   s*    ;;=::dnngn677    c                    g }t        d      D ]=  }t        | |t        |dz  z         }|t        ||      dk(  s-|j	                  |       ? t        t        |            S )N      r   )ranger   r
   r   appendsortedset)exesectionshandlersopcodehandlers        r&   table_handler_vasr5   2   sd    H* %3*:VaZ*GH#6x#IW#TOOG$% #h-  r(   c                v    t        ||      }||dz   t        |       kD  ry t        j                  d| |      d   S )Nr+   z<Ir   )r   lenstructunpack_from)r0   r1   vaoffsets       r&   read_u32r<   ;   s?    (B'F~!c#h.dC033r(   c                ^   t         t        dz  z   }t        | ||      t        |      nd }|dk7  rdt        dd|dddnd |ddS t	        |      }t        | |      }t        fd|D        d	z   
      }|| ||t        d|z
        z    nd}t        | |      }g }	g }
g }t        |      D ]  \  }}|z   }|dk(  s|
j                  d|dd|dd       |dkD  s3||dz
     dk(  s?|j                  d|dd|ddd|z   dz
  d||dz
  |dz    j                  d      d        t        t        dt        |      dz
              D ]6  }|z   }|||dz    dk(  s|	j                  d|dd|d||dz      d       8 t        |	D ch c]  }|j                  d      r|d    c}      }|j                  d      }t        |j                  dg       D ch c]$  }|j                  d      r|j                  d      & c}      }|
r|
d   nd }i dt        ddt        ddd|dddddd |d!d|dd"|d#t        |      d$|d%|	d&|d'|dgk(  r|d   nd d(|
d)|r|j                  d*      nd d+|d,|g k(  xr |dgk(  S c c}w c c}w )-Nr+   r   0x02x08xblocked)	opcodeHex
entryVaHexhandlerVaHexhandlerSectionpromotionStatusc              3  .   K   | ]  }|kD  s	|  y w)N ).0r:   
handler_vas     r&   	<genexpr>z$scan_full_handler.<locals>.<genexpr>P   s     ErR*_Es   
i   )defaultr   r(      )vaHex	offsetHexr      zCbyte is the first displacement byte of a near jmp, not a ret opcode )rN   rO   reasoninstructionVaHexinstructionBytesHex   s   @@)rN   rO   bytesrV   	scanBytesfixedAdvancesr3   rB   rC   	handlerVarD   rE   nextHandlerVaHexoldAnalyzerScanBytesfullHandlerSpanBytesoldAnalyzerFixedAdvancesfullHandlerFixedAdvancescorrectedFixedAdvancescorrectedFixedAdvanceBytesretSitestrueRetVaHexrN   falseRetSites"oldNoFixedAdvanceIsScannerArtifact)r
   OPCODEr   r   r   r5   minmaxr   	enumerater-   hexr,   r7   r.   get)r0   r1   entry_vahandler_sectionr;   all_handlersnext_handlercode
old_effectfixed_advances	ret_sitesfalse_ret_sitesindexbyter:   itemcorrected_fixed_advancesold_scan_bytesold_fixed_advancestrue_retrJ   s                       @r&   scan_full_handlerr|   B   s   &1*,H#x2JCMCY)(J?_cO_7fS\*xn-5?5KbC 01QU-(
 	
 (J/F$S(3LE\Ez\aOabLFLFX3vvA|j'@ AAB^aD&sHjAJNIO  t%4<Bs8}Rc{CSTUqyT%!)_4&&!"S]#%eC[!1c*,Z%-?!-CC,H(I+/	%!)+D+H+H+M(  s1c$i!m,- %eai O3!!bX!%-eai#   &"'88G 	W'  
  ^^K0NNN?B7!88G 	! 
 !*y}tH&r&& 	8C.) 	Z	
 	"Z,- 	/ 	bc 23 	 	D	 	#$6 	#N 	!": 	%E]bcadEd&>q&Ajn 	I 	W-t  	!" 	-.@B.F.jKchigjKj# '!s   J%-)J*c                   g }t               }|}t        |d      }	t        |      D ]  }
||v r|j                  |
d|ddd        |S |j	                  |       t        | ||      }t        | ||      }|||j                  |
d|ddd        |S t        | ||      }|j                  d      xs g }d }|t        k(  rdg}d	}|
|d|d|d|dd
|||d}||v r	||   |d<   nt        ||      d|d<   d|d|d<   |j                  d      r)t        | ||dz         }|d|dnd |d<   d|dz   d|d<   |j                  |       ||	k(  rd|d<    |S t        |      dk(  r|j                  d      s
||d   z  }`t        |      dk(  r|j                  d      rd|d<    |S |sd|d<    |S d|d<    |S  |S )N   r>   r@   loop)steprN   
stopReason
unreadablerX   r+   zhfull handler scan finds add [context+0x40], +4 after the old analyzer clipped on a jmp displacement byte)r   r:   rN   valuevalueHex)rX   overrideReasoncnsTpointer
pointerHexcanJumpToDwordAtPlus4branchTargetHex   fallthroughVaHexzfrontier-readerr   r   r   zbranch-or-fallthroughno-fixed-advancezmultiple-advances)r/   intr,   r-   addr   r   r   rk   rf   r   r<   r7   )r0   r1   strings	stream_vastop_reader_hex	max_stepsr   seenr:   stop_readerr   r3   r   r4   advancesoverride_reasonrowtargets                     r&   corrected_tracer      s    D5D	Bor*Ki  1:KK"RHVTU^ K] 	h+sHb)>U]KK"RH\Z[R KQ  Xv6;;/52VsH IO"S]U3K(	
 	
 &-	
 G CJ(E*6!C	N"$U3K 0C;;./c8R!V4F:@:Lr&%6RVC!"(*26#,&7C"#C 1C K x=Agkk2I&J(1+Bx=A'++.E"F 7C K  2C K 0LKe1d Kr(   c           	        | D cg c]  }|j                  d      |k(  r| }}| r| d   ni }t        |       | D cg c]%  }|j                  d      s|j                  d      ' c}t        |      |r|d   j                  d      nd |j                  d      |j                  d      |j                  d      dS c c}w c c}w )NrN   rY   rB   r   r   r   )	stepCountopcodesreachesFrontierReaderfrontierReaderStep	stopVaHexstopOpcodeHexr   )rk   r7   bool)trace
reader_hexr   reader_stepsstops        r&   trace_summaryr      s    777z) 	L  592DZ49RSSWW[=QCGGK(R!%l!3=Il1o11&9tXXg&+.hh|,  Ss   B;C C c                r   t        |       }t        | |      }t        | |      }g }|j                  d      xs g D ]  }|j                  d      r|j                  d      s'|j                  d      }t	        |d      }t        | ||||j                  d      xs t              }	|j                  d      xs i }
|j                  |j                  d      |j                  d	      ||j                  d
      |
t        |	|j                  d      xs t              |	|j                  d      |j                  d      d	        t        d |D              }t        d |D              }d}i d|j                  d      d|j                  d      d|j                  d      d|j                  d      d|j                  d      xs t        d|dt        |      d|d|dt        |      xr |t        |      k(  dddddddddt        d t        d!t        t        t              d"||t        d#S )$Nr   insideCurrentRootEntryRundescriptorHasRoutePairdescriptorHexr~   r   r   ru   rC   childPointerHexr   sourceToTargetAdjacent)	ru   rC   r   r   oldDescriptorTracecorrectedTracecorrectedTraceRowsr   r   c              3  j   K   | ]+  }|j                  d       xs i j                  d      s(d - yw)r   r   r   Nrk   rI   r   s     r&   rK   z build_summary.<locals>.<genexpr>   s.     tccgg>N6O6USU5Z5Z[r5sts   )33c              3  n   K   | ]-  }|j                  d       xs i j                  d      dk(  rd / yw)r   r   r   r   Nr   r   s     r&   rK   z build_summary.<locals>.<genexpr>   s;      GG()/R44\BFXX 	
s   35a^  The previous route-pair descriptor traces stopped at opcode 0x2c because the generic handler scanner clipped the handler at a 0xc3 byte inside a near-jump displacement. A full handler-span scan shows opcode 0x2c ends by advancing the stream pointer by four bytes. With that local correction, both non-negative current route-pair descriptors can be linearly traced to the frontier reader 0x00542b0c. This removes opcode 0x2c as the immediate trace blocker, but it does not promote map1_01a -> map2_02d because a strict source coordinate/hotspot and normal runtime selector execution proof are still missing.sourcer   selectorrootHexopcode2cHandlerroutePairDescriptorCountoldNoFixedAdvanceStopCount correctedTraceReachesReaderCount0correctedTraceAllRoutePairDescriptorsReachReaderstrictHotspotFoundFruntimeSelectionProven
proofFoundopcode2cRoutePairProofFoundfailedOpcode2cRoutePairGateIdsmissingEvidenceevidenceRefsrA   )evidenceRefCountrF   r   
conclusionremainingProofs)r   r   r|   rk   r   r   FRONTIER_READER_HEXr-   r   sumr7   r   #FAILED_OPCODE2C_ROUTE_PAIR_GATE_IDS$OPCODE2C_ROUTE_PAIR_MISSING_EVIDENCE!OPCODE2C_ROUTE_PAIR_EVIDENCE_REFS)r0   route_pair_descriptor_contextr1   r   r4   r   r   descriptor_hexdescriptor_var   	old_tracecorrected_reader_hitsold_no_fixed_countr   s                 r&   build_summaryr      s   S!HsH-GX.GD,008>B ww23377C[;\1NB/)--.ABYFY
 GG-.4"	WWW%'',/+"ww'89"++E3P3T3TUh3i  4A  nA  B"'(+0J(K&)gg.F&G

 
	0  tTtt  	> /33H=/33H= 	155jA 	044Y?	
 	:>>?RSjWj 	7 	#CI 	%&8 	+,A 	;DJ<mK`dghldmKm 	e 	!% 	e 	&u 	)*M  	?!" 	9#$   AB$ ?- r(   c                   | j                  d      xs i }ddd| j                  d       d| j                  d       dd	| j                  d
       d| j                  d       dd| j                  d       dd|j                  d       dd|j                  d       d|j                  d       d|j                  d       d|j                  d       d| j                  d       d| j                  d       d| j                  d       d| j                  d        d!| j                  d"       d#| j                  d$       d%d&j                  | j                  d'      xs g        d(t        | j                  d)      xs g        d*| j                  d+       d,| j                  d-       dd| j                  d.      xs ddd/dd0d1g}|j                  d2      xs g D ]\  }|j                  d3|j                  d4       d5|j                  d6       d7|j                  d8       d9|j                  d:       d;	       ^ |j                  d<      xs g D ]8  }|j                  d=|j                  d4       d>|j                  d?       d@       : |j                  dA      r6|j                  dB|j                  dA       dC|j                  dD       dE       |j	                  g dF       | j                  dG      xs g D ]  }|j                  dH      xs i }|j                  dI      xs i }|j                  dJ|j                  dK       dL|j                  dM       dN|j                  dO       d9|j                  dP       d5|j                  dQ       dR|j                  dS       dR|j                  dT       dL|j                  dO       d9|j                  dP       dE        |j	                  g dU       |j	                  dV | j                  dW      xs g D               |j                  d       dXj                  |      S )YNr   z.# Save Selector Opcode 0x2c Route-Pair Context z
- route: `r   z -> r   `z- selector: `r   z` root `r   z- frontier reader: `r   z- opcode 0x2c handler: `rD   z- old analyzer scan bytes: r\   z- full handler span bytes: r]   z- old fixed advances: r^   z- corrected fixed advances: r`   z- old no-fixed-advance stops: r   z/- corrected route-pair traces reaching reader: r   /r   z- strict hotspot found: r   z- runtime selection proven: r   z- proof found: r   z'- failed opcode 0x2c route-pair gates: z, r   z- missing evidence count: r   z- evidence refs: r   z- promotion status: `rF   r   z## Handler Spanz| kind | va | detail |z| --- | --- | --- |rd   z| false ret byte | `rN   z` | rR   z (`rT   z` at `rS   z`) |r_   z| fixed advance | `z` | `+rV   z	` bytes |rc   z| true ret | `z!` | final handler return before `r[   z` |)r   z## Corrected Route-Pair Tracesr   zc| index | descriptor | old stop | corrected steps | reaches reader | reader step | corrected stop |z.| ---: | --- | --- | ---: | --- | ---: | --- |r   r   r   z| ru   z | `r   z` | `r   r   r   z | r   r   )r   z## Remaining Proofsr   c              3  &   K   | ]	  }d |   yw)z- NrH   rI   rw   s     r&   rK   zmarkdown.<locals>.<genexpr>Z  s     N2dVNs   r   
)rk   joinr7   r-   extend)summaryr4   linessiter   r   	correcteds          r&   markdownr   #  s   kk+,2G8

W[[*+4H0E/FaH
J/0Y9O8PPQR
w{{+>?@B
"7;;~#>"?qA
%gkk2H&I%JK
%gkk2H&I%JK
 -G!H IJ
&w{{3K'L&MN
(5Q)R(ST
9'++Fh:i9jjklslwlw  yS  mT  lU  	V
"7;;/C#D"EF
&w{{3K'L&MN
'++l345
1$))GKKHh<i<omo2p1qr
$S5F)G)M2%N$OP
GKK(:;<=
,= >?qA
L!'R

 5E8 O,2 
"488G#4"5T$((8:L9MSQUQYQYZoQpPqqwx|  yA  yA  BT  yU  xV  VZ  [	

 67=2 b*488G+<*=VDHHWDUCVV_`ab{{>"~gkk.&A%BBcdkdodo  qC  eD  dE  EH  I  	J	LL   {{6"(b 
GG017R	GG,-3	!"$sww'?&@ Al+,F9==3M2Nd}}[)*#imm<S.T-UUX}}1234	l8S7TTZ[d[h[hit[uZvvy{	

 
LL01	LLN5F)G)M2NN	LL99Ur(   c                 t   | j                  d      xs i }g }|j                  d      xs g D ]  }|j                  dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   d	t        j                  t	        |j                  d
                   d	        |j                  d      xs g D ]p  }|j                  dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   d       r |j                  d      rn|j                  dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   d       g }| j                  d      xs g D ]m  }|j                  d      xs i }|j                  d      xs i }|j                  d|j                  d       dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   d	t        j                  t	        |j                  d                   d|j                  d        d!|j                  d"       d!|j                  d#       dt        j                  t	        |j                  d                   d	t        j                  t	        |j                  d                   d       p d$j                  d% | j                  d&      xs g D              }d'j                  d(d)d*d+d,d-d.d/d0d1d2t        j                  t	        | j                  d3                   d4t        j                  t	        | j                  d5                   d6t        j                  t	        | j                  d7                   d8t        j                  t	        |j                  d9                   d:| j                  d;       d<| j                  d=       d>t        j                  t	        | j                  d?                   d@dA| j                  dB       dCt        j                  dDj                  | j                  dE      xs g              dFt        | j                  dG      xs g        dH| j                  dI       d@	dJt        j                  | j                  dK      xs d$       dLdMdNdOd$j                  |       dPdQdRdOd$j                  |       dPdSdT| dUdVdWd$g      S )XNr   rd   z%<tr><td>false ret byte</td><td><code>rN   z</code></td><td>rR   z (<code>rT   z</code> at <code>rS   z</code>)</td></tr>r_   z$<tr><td>fixed advance</td><td><code>z</code></td><td><code>+rV   z</code> bytes</td></tr>rc   z<tr><td>true ret</td><td><code>z2</code></td><td>final handler return before <code>r[   z</code></td></tr>r   r   r   z<tr><td>ru   z</td><td><code>r   z</code></td><td><code>r   r   r   z	</td><td>r   r   r   c              3  N   K   | ]  }d t        j                  |       d  yw)z<li>z</li>N)htmlescaper   s     r&   rK   zhtml_page.<locals>.<genexpr>  s#     ftDKK-.e4fs   #%r   r   z<!doctype html>z<html lang="en">z<head>z  <meta charset="utf-8">zF  <meta name="viewport" content="width=device-width, initial-scale=1">z=  <title>Save Selector Opcode 0x2c Route-Pair Context</title>a$    <style>body{font-family:system-ui,sans-serif;background:#111;color:#eee;margin:24px}table{border-collapse:collapse;width:100%;max-width:1280px;margin-bottom:24px}td,th{border:1px solid #333;padding:6px 8px;text-align:left;vertical-align:top}th{background:#1f1f1f}code{color:#9bd4ff}</style>z</head>z<body>z7  <h1>Save Selector Opcode 0x2c Route-Pair Context</h1>z  <p>route <code>r   z -&gt; r   z</code>; selector <code>r   z</code>; handler <code>rD   z;</code>; corrected route-pair traces reaching reader <code>r   r   r   z </code>; promotion status <code>rF   z</code>.</p>z  <p>proof found <code>r   z3</code>; failed opcode 0x2c route-pair gates <code>,r   z </code>; missing evidence <code>r   z</code>; evidence refs <code>r   z  <p>r   z</p>z  <h2>Handler Span</h2>zH  <table><thead><tr><th>kind</th><th>va</th><th>detail</th></tr></thead>z	  <tbody>z</tbody></table>z&  <h2>Corrected Route-Pair Traces</h2>z  <table><thead><tr><th>index</th><th>descriptor</th><th>old stop</th><th>corrected steps</th><th>reaches reader</th><th>reader step</th><th>corrected stop</th></tr></thead>z  <h2>Remaining Proofs</h2>z  <ul>z</ul>z</body>z</html>)rk   r-   r   r   strr   r7   )	r   r4   	span_rowsr   
trace_rowsr   r   r   proofss	            r&   	html_pager   _  s'   kk+,2GIO,2 
S'):%;<= >;;s488H#5678SQUQYQYZoQpMqAr@s  tE  FJ  FQ  FQ  RU  VZ  V^  V^  _q  Vr  Rs  Ft  Eu u	

 67=2 
S'):%;<= >++c$((7*;&<=> ?	

 {{>"S^)D%EFG H559[[W[[QcEdAe5f4g h	
 J{{6"(b 
GG017R	GG,-3	777#$ %S)A%BCD ES|)D%EFGGXY]YdYdehiriviv  xC  jD  fE  ZF  YG G==-. /==!89: ;==!567 8S|)D%EFGGXY]YdYdehiriviv  xC  jD  fE  ZF  YG G
	

 WWfM^A_AeceffF99"PG 	oA
DKKGKK,A(BCDGDKKX[\c\g\ghp\qXrLsKt  uM  NR  NY  NY  Z]  ^e  ^i  ^i  jt  ^u  Zv  Nw  Mx  xO  PT  P[  P[  \_  `g  `k  `k  lz  `{  \|  P}  O~  ~y  zA  zE  zE  Fh  zi  yj  jk  ls  lw  lw  xR  lS  kT  Tt  uy  u@  u@  AD  EL  EP  EP  Qb  Ec  Ad  ue  tf  fr  	s
!'++l";!<<optp{p{|  }E  }E  FM  FQ  FQ  Rr  Fs  Fy  wy  }z  q{  p|  |\  ]`  ah  al  al  m~  a  aE  CE  ]F  \G  Gd  el  ep  ep  qC  eD  dE  EQ  	R
GKK5;<=TB!R
BGGI&''780 	x
BGGJ'((89%

1  r(   c                   |j                  dd       |dz  }|j                  t        j                  | dd      dz   d	       |9|j                  j                  dd       |j                  t        |       d	       |S )
NT)parentsexist_okz.save_selector_opcode2c_route_pair_context.jsonF   )ensure_asciiindentr   r   r   )mkdir
write_textr"   dumpsparentr   )r   out_dirhtml_outjson_outs       r&   write_outputsr     s    MM$M.IIH

7q9D@   dT:Ig.AOr(   c                    t        j                         } | j                  dt        t        dz         | j                  dt        t
               | j                  dt        t
        dz         | j                  dt               | j                         }t        |j                  j                         t        |j                  i             }t        ||j                  |j                        }t        d	|        y )
Nz--exer   )typerL   z	--out-dirz--route-pairz0save_selector_route_pair_descriptor_context.jsonz
--html-out)r   z(wrote opcode 0x2c route-pair context -> )argparseArgumentParseradd_argumentr   ROOTOUT
parse_argsr   r0   
read_bytesr'   
route_pairr   r   r   print)parserargsr   r   s       r&   mainr    s    $$&F
dD=4HI
$<
T3As;st
40D$//2&G WdllDMMBH	4XJ
?@r(   __main__)r   r   r%   r   returnr   )r0   rV   r1   
list[dict]r  z	list[int])r0   rV   r1   r	  r:   r   r  z
int | None)r0   rV   r1   r	  r  dict)0   )r0   rV   r1   r	  r   zdict[int, str]r   r   r   r   r   r   r  r	  )r   r	  r   r   r  r
  )r0   rV   r   r
  r  r
  )r   r
  r  r   )r   r
  r   r   r   zPath | Noner  r   )r  None)/__doc__
__future__r   r   r   r"   r8   pathlibr   typingr   probe_exe_scene_tablesr   r   r   summarize_script_handler_tabler	   r
   r   r   r   %summarize_save_selector_stream_tracesr   r   r   __file__resolver   r   r   rf   r   r   r   r   r'   r5   r<   r|   r   r   r   r   r   r   r  __name__rH   r(   r&   <module>r     s:   F "       P P O _ _ P P H~''*
Ul	" ' #
( $ ;
 G^	% !8!4F^ >	>> > 	>
 > > >B"CL9xDN 25d 
A zF r(   