
    IjU                       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Zddlm	Z	 ej                  j                  d e e	e      j                         j                               ddlmZmZmZ ddlmZ  e	e      j                         j,                  d   Zedz  Zd	g d
ddg ddgZg dZg dZddZddZd dZd!dZd"dZ 	 	 	 	 	 	 	 	 	 	 	 	 d#dZ!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)*zMTrace the current save-selector root writers that feed selectionBuffer[0x20].    )annotationsN)Path)find_cns_stringsread_sectionsva_to_offset)trace_stream   outz(out/save_selector_selection_writers.json)+currentFrontierRootWritersBeforeFirstReaderselectorRootContextselectionBufferOffsetHex)pathfieldsHwanse2.exe)zwriter stream dwordszopcode handler tablezactivation context dwords)z#source-predecessor-current-producerz"non-current-selected-pointer-storezruntime-branch-state-slot-proofzselected-root-execution)zSsource or predecessor opcode path that produces current root 2:0 before route entryz^non-current opcode 0x09/store path writing current root/range into selected pointer 0x0059de30zmruntime branch-state slot values proving current local writers choose the route slot on the normal route pathzOselected-root execution proof tying current writer paths to an external triggerc                "    | rt        | d      S d S )N   int)values    I/home/exedev/hwanse/tools/summarize_save_selector_current_writer_paths.py	parse_hexr   5   s    "3ub>,,    c                ,    t        | d      |dz  z	  dz  S )Nr         r   )	value_hexindexs     r   stream_plusr   9   s    	2519-55r   c                V   | j                  d      }| j                  d      xs d}t        |d      }t        |d      }|dk(  rdnd}|d	k(  r|d
kD  r
d| d|ddS d| d|dS |dk(  r
d| d|ddS |dk(  rd|ddS |dk(  rd|ddS |dk(  rt        |d      }d|ddS |dk(  ryy) N	opcodeHexvalueHex
0x00000000r	      r   primaryBranchStatesecondaryBranchState0x10   zcall helper 0x00410c90 for z with out-of-range argument 0x02xzZ; helper dispatch only handles 0x00..0x0b, so the table is left as inherited runtime statezfill z using helper argument 0x0x11zread z[selectionBuffer[0xz]] and gate next stream value0x12z=write selected active branch-state slot to selectionBuffer[0x]0x13z7write matching party/runtime slot to selectionBuffer[0x0x09z$store runtime stream pointer mode 0xz into 0x0059de300x20z>dispatch/load runtime object or party-member script references )getr   )stepopcoder   stream1stream2tablemodes          r   opcode_meaningr7   =   s!   XXk"F$4I)Q'G)Q'G$+qL 6LET>-eW4RSZ[^R_ `k k ug6wsmDDug0=Z[[NwWZm[\]]HQTUVWW9a(5d3Z?OPPOr   c                v    t        ||      }||dz   t        |       kD  ry t        j                  d| |      d   S )N   z<Ir   )r   lenstructunpack_from)exesectionsvaoffsets       r   dword_atrA   X   s?    (B'F~!c#h.dC033r   c                    t        | ||      }|y |dz  }d|dd|dd|dd}||v r	||   |d<   nt        ||      	d|d|d<   t        |      |d<   |S )	Nr   0x08xr(   )vaHexr!   r    cns
pointerHexmeaning)rA   r   r7   )r=   r>   stringsr?   r   r2   rows          r   context_wordrK   _   s    S(B'E}T\FbXs$&&C
 U^E
	h	&	2 s,L#C(C	NJr   c                ^   g }t        t        d|dz
        |d      D ]X  }t        | |||      }|s|j                  d      s#|j                  d      s|j                  d      sH|j	                  |       Z g }|D ]  }t        |j                  d            }t        |j                  d            }	||	<|	d	z  }
|	d
z	  d	z  }|
dk(  r)|dk(  r$|dz   |k(  r|j	                  |d   |d   ddd       |j                  d      d|dk(  s|j	                  |d   |d   ddd        ||dS )Nr   @   r9   rH   rG   rF   rE   r!   r   r   	   opcode09Mode0NextStreamzZopcode 0x09 mode 0 advances to the next dword and stores that stream pointer in 0x0059de30)rE   r!   kindrH   rC   rD   nearbyPointerToStreamStartz,nearby data word points at this stream start)contextRows
activators)rangemaxrK   r0   appendr   )r=   r>   rI   stream_start	writer_varowsr?   rJ   rS   r   r2   r6   s               r   activation_contextrZ   q   sd    DC<$./A> 3'26779!6#''%.KK J swww'(#''*-.:
d"T>daiBFl,BW
O1w	  77< bc(:$;;W
O4I	 ,   r   c                    }t        | ||d      }t        dz
  dz   d      D ]4  }|dk  r	t        | |||d      }t        fd|D              s-|}|} ||fS  ||fS )N   0   r	   r9   r   c              3  N   K   | ]  }|j                  d       ddk(    yw)rE   rC   rD   Nr0   ).0itemrX   s     r   	<genexpr>z%choose_trace_start.<locals>.<genexpr>   s(     KTtxx b3$88Ks   "%)r   rT   any)r=   r>   rI   rX   
best_start
best_tracestarttraces      `    r   choose_trace_startrh      s    Jc8WiDJy4'Q: 19S(GUB?KUKKJJz!! z!!r   c                    g }| xs i j                  d      xs g D ],  }|j                  d      }|s||vs|j                  |       . |S )NfieldRecordsmap)r0   rV   )contextmapsrecordnames       r   
field_mapsrp      sU    D=b%%n5; zz% D$KK Kr   c                   t        |       }t        | |      }|j                  d      xs g }g }|D ]  t        j                  d            }|!t        j                  d            xs d}|dz  }|dk(  rdnd}	t	        | |||      \  }
}g }|D ],  }t        |      }t        |      |d	<   |j                  |       . t        fd
t        |      D        d       }||d | ng }|||dz   d  ng }t        | |||
|      }|j                  i dj                  d      dj                  d      dd|
ddj                  d      dj                  d      dj                  d      xs i j                  d      dj                  d      xs i j                  d      xs g dt        j                  d            dt        dt        t              dddddt        dt        d t        d!d"d#|||||	ddd$j                  d      d%k(  r|d&k(  rd'n|dk(  rd(nd)|dk(  rd*nd+d,	        |S )-Nr   rE   r!   r   r      z0x13 clears selectionBuffer[stream+2], scans 12 runtime slots, compares 0x0059e344 bytes with slot fields +0x4a/+0x48, and stores the matching slot index back to selectionBuffer[stream+2].a  0x12 selects primaryBranchState when stream+1 is 0, otherwise secondaryBranchState. If runtime flag 0x00457744 is set it starts from the existing selectionBuffer[stream+2], then searches the 12-slot table for a nonzero state and stores that slot index back to selectionBuffer[stream+2].rH   c              3  p   K   | ]-  \  }}|j                  d       j                  d       k(  s*| / yw)rE   Nr_   )r`   r   r1   writers      r   rb   zbuild_rows.<locals>.<genexpr>   s2     h{udtxx?PTZT^T^_fTg?gUhs   +66r	   writerVaHexwriterValueHexstreamStartHexrC   rD   r   
stateTablerootHexr   selectedPointerHex
rootLabelslabelsrootFieldMapsevidenceRefsevidenceRefCount
proofFoundFcurrentWriterPathProofFoundfailedCurrentWriterPathGateIdsmissingEvidenceremainingProofspromotionStatuszblocked-current-internal-only
setupStepsz0x10 passes stream+2 to helper 0x00410c90. The helper dispatches only argument values 0x00..0x0b; out-of-range values such as 0x20 return without filling the 12-slot table.
0x00200012   z3primary local writer before current frontier readerz8runtime-slot local writer before current frontier readerz5secondary local writer before current frontier readerz[Treat this 0x13 value as an intermediate overwrite, then continue to the later 0x12 writer.zResolve the branch-state table values produced by the preceding 0x10 helper calls, then identify which slot 0x12 stores into selectionBuffer[0x20].)	followingStepsrg   activationContextwriterAlgorithmopcode12Algorithmopcode13Algorithmopcode10HelperRuleclassificationnextQuestion)r   r   r0   r   rh   dictr7   rV   next	enumeraterZ   rp   EVIDENCE_REFSr:   #FAILED_CURRENT_WRITER_PATH_GATE_IDS$CURRENT_WRITER_PATH_MISSING_EVIDENCE)r=   selection_writersr>   rI   writer_rowsrY   rX   writer_valuewriter_opcodewriter_algorithmtrace_startrg   
trace_rowsr1   ra   writer_indexsetup_stepsfollowing_steps
activationrt   s                      @r   
build_rowsr      s   S!HsH-G#''(UV\Z\KD Qfjj12	 J!78=A$t+ $r- 	 0Xw	RU
 	$D:D,T2DOd#	$ hi
&;h
 4@3Kj,/QS<H<T*\A%5%78Z\'XwYW
 3
6::g.3
fjj43
 ;s"343
 '

3M(N	3

 &**\23
 

#89?RDDEYZ3
 6::&;<BGGQWUW3
 Z

3H(IJ3
 M3
 M 23
 %3
 *53
 -.Q3
 C3
 C3
  >!3
" +#3
$ .!+/-vi
 ::j)\9mt>S F !D( PL !D( nW_3
 3	=Qd Kr   c                   dddddt        t               ddddd	j                  t               d
t        t               dddg}t        D ]J  }|j                  d|j                  d       dd	j                  |j                  d      xs g               L |j                  g d       |j                  d t        D               |j                  g d       | D ]6  }d	j                  d |j                  d      xs g D              xs d}d	j                  d |j                  d      xs g D              xs d}d	j                  d |j                  d      xs i j                  d      xs g D              xs d}|j                  d|d    d|d    d|d     d!| d!|j                  d"       d#d$j                  |j                  d%      xs g        d!d	j                  |j                  d&      xs g       xs d d!| d!| d!|d'    d(       9 | s|j                  d)       |j                  g d*       | D ]  }|j                  d+|d    d|j                  d,      xs |j                  d-      xs dd|j                  d.      xs ddd/dd0d1g
       |j                  d      xs i j                  d2      xs g D ]  }|j                  d3      xs |j                  d4      xs d}|j                  d|j                  d5       d6|j                  d7       d8|j                  d9       d|j                  d:      xs d d!| d(        |j                  d      xs i j                  d2      s|j                  d;       |j                  g d<       |j                  d=      xs g D ]  }	|j                  d|	j                  d>       d!|	j                  d5       d6|	j                  d7       d8|	j                  d9       d8|	j                  d?       d|	j                  d:      xs d d!|	j                  d@      xs d d(        |j                  d       ! dAj                  |      S )BNz$# Save Selector Current Writer Pathsr/   zqLocal traces for the current selector-root writers that appear before the `map1_01a -> map2_02d` frontier reader.z- evidence refs: ``z3- promotion status: `blocked-current-internal-only`z- proof found: Falsez- failed current-writer gates: , z- missing evidence count: z## Evidence Refsz- `r   z`: r   )r/   z## Missing Evidencer/   c              3  &   K   | ]	  }d |   yw)z- N r`   ra   s     r   rb   zmarkdown.<locals>.<genexpr>  s     N2dVNs   )r/   z## Writer Summaryr/   zX| writer | stream start | activation | root | maps | setup | following | next question |z1| --- | --- | --- | --- | --- | --- | --- | --- |c              3     K   | ]@  }|j                  d       r-|d    d|j                  d       d|j                  d         B ywrH   rE    r    Nr_   r`   r1   s     r   rb   zmarkdown.<locals>.<genexpr>'  sM      
xx	" G}oQtxx45Qtxx	7J6KL
s   AAr   -c              3     K   | ]v  }|j                  d       s|j                  d      rR|d    d|j                  d       d|j                  d       xs |j                  d      xs d j                          x ywrH   
stopReasonrE   r   r    r/   N)r0   stripr   s     r   rb   zmarkdown.<locals>.<genexpr>,  sv      
xx	"dhh|&< G}oQtxx45Qtxx	7J7jdhhWcNd7jhj6klrrt
s   A<A>r   c              3  6   K   | ]  }|d     d|d      yw)rE   r   rP   Nr   r   s     r   rb   zmarkdown.<locals>.<genexpr>1  s+      
 G}oQtF|n-
s   r   rS   z| ru   z `rv   z` | rw   z | ry   r   ,r{   r}   r   z |z!| - | - | - | - | - | - | - | - |)r/   z## Full Tracesr/   z### r   r   r   zActivation context:z/| va | value | opcode | meaning | pointer/cns |z| --- | --- | --- | --- | --- |rR   rG   rF   rE   z | `r!   z` | `r    rH   z| - | - | - | - | - |)r/   z9| step | va | value | opcode | handler | meaning | stop |z,| ---: | --- | --- | --- | --- | --- | --- |rg   r1   handlerVaHexr   
)r:   r   joinr   r   rV   r0   extend)
rY   linesrefrJ   setup	followingr   ra   pointerr1   s
             r   markdownr     s   .
{

S/02=
)$))4W*X)YZ
$S)M%N$OP

E  Us3776?+3tyy9J9Pb/Q.RSTU	LL01	LLN)MNN	LL    
		 
-3
 
  	 	
 II 
 017R
 
  	 	
 YY 
!45;@@NTRT
 
   	 	]#$Bs+;'<&=T#FVBWAXX[l#wwy!"!CHHSWW\-B-Hb$I#J#yy17R8?C@E7#i[X[>"#2	'	

, 89	LL+,  3}%&'GG%&L#''2E*FL"GG()/R!=-
 	 WW017R<<]KQr 	Dhh|,FF3GLLTXXg&'tDHHZ,@+AtxxP[G\F]]a88I&-#.c'">	 +,277FLL01 
 	
 GGG$* 	DLLTXXf%&c$((7*;)<D*AU@V WHH[)*%0H/I88I&-#.c$((<2H2OC1PPRT	 	RA B 99Ur   c                   dj                  d t        D              }g }g }| D ]  }dj                  d |j                  d      xs g D              xs d}dj                  d |j                  d      xs g D              xs d}dj                  d	 |j                  d
      xs i j                  d      xs g D              xs d}|j                  dt	        j
                  |d          dt	        j
                  |d          dt	        j
                  |d          d| dt	        j
                  |j                  d      xs d       dt	        j
                  dj                  |j                  d      xs g              dt	        j
                  dj                  |j                  d      xs g       xs d       d| d| dt	        j
                  |d          d       g }g }	|j                  d
      xs i j                  d      xs g D ]  }
|
j                  d      xs |
j                  d      xs d}|	j                  dt	        j
                  |
j                  d       xs d       dt	        j
                  |
j                  d!      xs d       dt	        j
                  |
j                  d"      xs d       dt	        j
                  |
j                  d#      xs d       dt	        j
                  |       d        |j                  d$      xs g D ]  }|j                  d%|j                  d&       dt	        j
                  |j                  d       xs d       dt	        j
                  |j                  d!      xs d       dt	        j
                  |j                  d"      xs d       dt	        j
                  |j                  d'      xs d       dt	        j
                  |j                  d#      xs d       dt	        j
                  |j                  d(      xs d       d         |j                  d)t	        j
                  |d          d*t	        j
                  |j                  d+      xs |j                  d,      xs d       d-t	        j
                  |j                  d.      xs d       d/dj                  |	      xs d0 d1dj                  |       d2        d3j                  g d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEt        t               dFdGdHt	        j
                  dj                  t                     dIt        t               dFdJ| dKdLdMd3j                  dN t        D              dOdPdQdRdj                  |      xs dS d2d3j                  |      dTdUd      S )VNr/   c              3     K   | ]m  }d t        j                  t        |j                  d                   dt        j                  dj	                  |j                  d      xs g              d o yw)z
<li><code>r   z	</code>: r   r   </li>N)htmlescapestrr0   r   )r`   r   s     r   rb   zhtml_page.<locals>.<genexpr>d  sf      
 		S1239;;tyy!2!8b9:
;	s   A3A5z<br>c           
   3     K   | ]S  }|j                  d       r@t        j                  |d    d|j                  d       d|j                  d               U ywr   )r0   r   r   r   s     r   rb   zhtml_page.<locals>.<genexpr>n  sV      
xx	" KK4=/488K+@*A488ICVBWXY
s   AAr   r   c           
   3  &  K   | ]  }|j                  d       s|j                  d      ret        j                  |d    d|j                  d       d|j                  d       xs |j                  d      xs d j                                 ywr   )r0   r   r   r   r   s     r   rb   zhtml_page.<locals>.<genexpr>s  s       
xx	"dhh|&< KK4=/488K+@*A488ICVCvZ^ZbZbcoZpCvtvBwx~~  A  B 
s   BBr   c           	   3  h   K   | ]*  }t        j                  |d     d|d    d|d           , yw)rE   r   rP   z: rH   Nr   r   r   s     r   rb   zhtml_page.<locals>.<genexpr>x  s?      !
 KK4=/4<.4	?:KLM!
s   02r   rS   z<tr><td><code>ru   z</code><br><code>rv   z</code></td><td><code>rw   z</code></td><td>z</td><td><code>ry   z</code><br>r   r{   z	</td><td>r   r}   r   z
</td></tr>rR   rG   rF   rE   r!   r    rH   rg   z<tr><td>r1   r   r   z<h2>z</h2><p>r   r   z</p><p>r   z</p><h3>Activation Context</h3><table><thead><tr><th>va</th><th>value</th><th>opcode</th><th>meaning</th><th>pointer/cns</th></tr></thead><tbody>z4<tr><td colspan="5">No activation context.</td></tr>z</tbody></table><h3>Trace</h3><table><thead><tr><th>step</th><th>va</th><th>value</th><th>opcode</th><th>handler</th><th>meaning</th><th>stop</th></tr></thead><tbody>z</tbody></table>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">z3  <title>Save Selector Current Writer Paths</title>z	  <style>z^    body { margin: 24px; background: #101010; color: #eee; font: 14px system-ui, sans-serif; }zJ    table { border-collapse: collapse; width: 100%; margin: 16px 0 28px; }zM    th, td { border: 1px solid #333; padding: 6px 8px; vertical-align: top; }z9    th { background: #1d1d1d; position: sticky; top: 0; }z    code { color: #f5d76e; }z
  </style>z</head>z<body>z-  <h1>Save Selector Current Writer Paths</h1>z  <p>Local traces for the current selector-root writers that appear before the <code>map1_01a -> map2_02d</code> frontier reader.</p>z  <p><b>Evidence refs:</b> z.</p>zM  <p><b>promotion status:</b> <code>blocked-current-internal-only</code>.</p>zJ  <p><b>proof found:</b> False; <b>failed current-writer gates:</b> <code>z"</code>; <b>missing evidence:</b> z  <h2>Evidence Refs</h2><ul>z</ul>z  <h2>Missing Evidence</h2>z  <ul>c              3  N   K   | ]  }d t        j                  |       d  yw)z    <li>r   Nr   r   s     r   rb   zhtml_page.<locals>.<genexpr>  s#     g$HT[[./u5gs   #%z  </ul>z  <h2>Writer Summary</h2>z  <table><thead><tr><th>writer</th><th>stream start</th><th>activation</th><th>root</th><th>maps</th><th>setup</th><th>following</th><th>next question</th></tr></thead>z	  <tbody>z-<tr><td colspan="8">No writer rows.</td></tr>z</body>z</html>)	r   r   r0   rV   r   r   r:   r   r   )rY   evidence_refssummary_rowstrace_sectionsrJ   r   r   r   
trace_bodyactivation_rowsra   r   r1   s                r   	html_pager   c  s   GG 
 ! M LN >
 
-3
 
  	 	
 KK  
 017R 
 
  	 	
 [[ !
!45;@@NTRT!
 
   	 	S%7899J4;;WZ[kWlKmJn oS)9%:;< =, SWWY%7%>3?@DKKX[X`X`adahahiuava|z|X}L~K @;;tyy)A)GRHOCPQ R' + ;;s>234 5		
 
WW017R<<]KQr 
	Dhh|,FF3G""![['):)AcBC D![[*)=)DEF G![[+)>)E#FG H{{488I#6#=#>? @{{7+, -
	 GGG$* 	Dxx'( )![['):)AcBC D![[*)=)DEF G![[+)>)E#FG H![[.)A)HSIJ K{{488I#6#=#>? @{{488L#9#@SAB C
	 	4;;s=123 4++cgg&78^CGGDW<X^\^_` a++cgg&:;ArBC D ggo.j2jk l ggj)**:<
	
i>
~ 99 !!! 	! 	#	!
 	Q! 	>! 	! 	i! 	U! 	X! 	D! 	'! 	! 	! 	!  	8!!" 	P#!$ &c-&8%9?%!& 	X'!( UUYU`U`adaiai  kN  bO  VP  UQ  Qs  tw  x\  t]  s^  ^c  	d)!* '}oU;+!, 	&-!. 	/!0 			gBfgg1!2 	3!4 	$5!6 	s7!8 BGGL)^-^__op9!: 			.!;!< 	=!> 	?!@ 	A! ! !r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       |:|j                  j                  dd       |j                  t        |       d	       y y )
NT)parentsexist_ok'save_selector_current_writer_paths.jsonF)r   :)ensure_ascii
separatorsr   utf-8encoding)mkdir
write_textjsondumpsparentr   )rY   out_dirhtml_outs      r   write_outputsr     s    MM$M.88DD

4e
CdJ E  dT:IdOg> r   c                 p   t        j                  t              } | j                  dt        t
        dz         | j                  dt        t        dz         | j                  dt        t               | j                  dt        d d	
       | j                         }t        |j                  j                         t        j                  |j                  j                  d                  }t        ||j                   |j"                         t%        dt'        |       d|j                   dz          y )N)descriptionz--exer   )typedefaultz--selection-writersz$save_selector_selection_writers.jsonz	--out-dirz
--html-outz!Optional HTML report output path.)r   r   helpr   r   zwrote z current writer path rows -> r   )argparseArgumentParser__doc__add_argumentr   ROOTOUT
parse_argsr   r=   
read_bytesr   loadsr   	read_textr   r   r   printr:   )parserargsrY   s      r   mainr     s    $$9F
dD=4HI
-D#HnBno
$<
4DghD

4))33W3EFD $dmm4	F3t9+:4<<Js;s:t
uvr   __main__)r   z
str | Nonereturn
int | None)r   r   r   r   r   r   )r1   r   r   r   )r=   bytesr>   
list[dict]r?   r   r   r   )
r=   r   r>   r   rI   dict[int, str]r?   r   r   dict | None)r=   r   r>   r   rI   r   rW   r   rX   r   r   r   )
r=   r   r>   r   rI   r   rX   r   r   ztuple[int, list[dict]])rl   r   r   z	list[str])r=   r   r   r   r   r   )rY   r   r   r   )rY   r   r   r   r   zPath | Noner   None)r   r   )*r   
__future__r   r   r   r   r;   syspathlibr   r   insertr   __file__resolver   probe_exe_scene_tablesr   r   r   %summarize_save_selector_stream_tracesr   r   r   r   r   r   r   r   r   r7   rA   rK   rZ   rh   rp   r   r   r   r   r   __name__r   r   r   <module>r     sJ   S "     
  3tH~--/667 8 P P > H~''*
Ul ;
 
$' #( $-664$'	'' ' 	'
 ' 
'T"WtTnjZ 58QU ?w zF r   