
    WJjn                    R   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	 ddl
mZ ej                  j                  d e e	e      j!                         j"                               ddlmZ  e	e      j!                         j(                  d   Zedz  Zd	Zd
Zeez
  ZdZdZeZdZg dZg dZg dZ ddddddddddddgZ!d-dZ"d-dZ#d.dZ$d/dZ%d0dZ&d1dZ'd2d Z(d3d!Z)d4d"Z*d5d#Z+d6d$Z,d7d%Z-d8d&Z.	 	 d9	 	 	 	 	 	 	 d:d'Z/d;d(Z0d;d)Z1edfd<d*Z2d=d+Z3e4d,k(  r e3        yy)>zGSummarize static indirect candidates for opcode 0x24 mode1 source byte.    )annotationsN)Path)Any)read_sections   outiY iHY     i Y `   )eaxecxedxebxespebpesiedi)z&static-base-plus-mode1-offset-producerznearby-base-mode1-window-writezruntime-watchpoint-trace)zAstatic base+0x38 producer for opcode 0x24 mode1 source 0x0059e348z2nearby-base short-window write covering 0x0059e348z8runtime watchpoint trace proving the 0x0059e348 producerHwanse2.exez/global base, base+offset, and nearby-base scans)pathdescriptionz3out/save_selector_opcode24_mode1_source_writes.jsonz.direct/static source-write scan for 0x0059e348z-out/save_selector_selection_buffer_bases.jsonz.known global selection-buffer base assignmentsz"out/runtime_trace_feasibility.jsonz-runtime watchpoint trace availability blockerc                    d| dS )N0x08x values    T/home/exedev/hwanse/tools/summarize_save_selector_opcode24_mode1_indirect_context.pyhex32r   .       c{    c                    d| dS )Nr   02xr   r   s    r   hex8r"   2   r   r   c                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)r   fallbacks     r   	load_jsonr,   6   s*    ;;=::dnngn677r   c                ^    t        d t        |       D              }|| |d   |d   |d   z    fS )Nc              3  2   K   | ]  }|d    dk(  s|  yw)namez.textNr   ).0sections     r   	<genexpr>ztext_section.<locals>.<genexpr>=   s     [wSZ@Z7[s   rawraw_size)nextr   )exer1   s     r   text_sectionr7   <   s;    [-*<[[GC'*:M)MNNNr   c                    t        j                  d|      }g }| j                  |      }|dk\  r,|j                  |       | j                  ||dz         }|dk\  r,|S )Nz<Ir   r   )structpackfindappend)datatargetneedlerefsposs        r   find_dword_refsrB   A   s\    [[v&FD
))F
C
(Ciia( ( Kr   c                6   |dk\  r| |dz
  | dk(  r	dddddd dS |dk\  r)| |dz
  | d	v r| |d
z
     dk(  }|rdnddd|rdnd ddddS |d
k\  rt| |d
z
     }|dv r3|dk(  r	dd
dd
dddS |dk(  r	dddd
dddS |dk(  r	dd
dd
dddS dddd
dddS d|cxk  rd k  rn nt         |dz
     }d!dd| d"d
d#|dS |d$k(  r	d!dd%d
d&d dS |d'k\  rL| |d'z
     d(k(  rA| |dz
     d)v r7| |d
z
     }|d*z  d+k(  r'| |dz
     d,k(  }|rdnddd-| |dz
     d.d/|d.d0d'd1d dS |dk\  rB| |dz
     d2v r8| |dz
     }| |d
z
     }|d*z  d+k(  r |d3v }|rdnd|d4v rd
ndd5|d.d/|d.d0dd6d dS |dk\  r4| |dz
     d7v r*| |dz
     }| |d
z
     }|d+k(  rd|d8k(  rd
ndd5|d.d9dd:d dS d;d d<d=d;d dS )>N   s   ǀ   zaddress-write   zmov dword ptr [eax+0xa8], imm32context-a8-imm32)
accessKindwidthinstructioninstructionPrefixBytesinstructionKindregister   >      f   fr      writereadzmov zds:[addr], axzax, ds:[addr]zdirect-moffs16ax>            rP   rT   zmov al, ds:[addr]zdirect-moffs8alrU   zmov eax, ds:[addr]zdirect-moffs32r   rV   zmov ds:[addr], alzmov ds:[addr], eax      address, imm32mov-reg-imm32h   z
push imm32
push-imm32   f   >               ra   zopcode 0x66 0xr!   	 modrm 0xz direct disp32zdirect-modrm16>      ra      rb   >   rf   ra   >   rf   rg   	opcode 0xzdirect-modrm>      rc   ri   z modrm 0x05 direct disp32zdirect-imm-storeunknownzunclassified dword immediater   )	REG_NAMES)r=   rA   rQ   opcoderegmodrms         r   classify_dword_refro   K   s?   
axDq3'+FF)<&'1
 	
 axDq3'+EES1W%%*'!U/!PQ&'/
 	
 axcAg--~"(#6./'6 $  ~"(#7./'7 %  ~")#6./'6 $  &3*+#3!  6!T!FTM*C'!%cU'2*+#2  T>'+*+#/   axDqMT)d37m|.KS1W4<4qMT)E).gF!/S1Wc/B)ERU;Vde*+#3   axDqM%==cAgS1W4<4l*E).gF$4!!*6#,ic{.Y*+#1   axDqM\1cAgS1WD=%$n!!*6#,6OP*+#5    5"#$ r   c                l   t        |       \  }}g }t        ||      D ]  }t        ||      }t        d||j	                  d      xs dz
        }|j                  t        |      t        |d   |z         t        |d   |z         ||d   |d   |d   |d   |d   d		        |j                  d
        |S )Nr   rJ   varG   rH   rI   rK   rL   )		targetHexrefVaHexinstructionVaHex	dataIndexrG   rH   rI   rK   rL   c                    | d   S )Nrs   r   )rows    r   <lambda>z"scan_target_refs.<locals>.<lambda>   s
    c*o r   key)r7   rB   ro   maxgetr<   r   sort)r6   r>   textr=   rowsrA   refinstruction_indexs           r   scan_target_refsr      s    c"JD$DtV,  s+3#''2J*K*Pq#QRvd4j3./ %d4j3D&D El+\}-"#45J

 
	 	II-I.Kr   c                .   |dz   t        |       k  rQ| |   dk(  rI| |dz      d|z   k(  r;t        j                  d| |dz         d   }|t        |dz        d	t        |    d
ddS |dz   t        |       k  rQ| |   dk(  rI| |dz      d|z   k(  r;t        j                  d| |dz         d   }|t        |dz        d	t        |    dddS |dk(  rI|dz   t        |       k  r8| |   dk(  r0t        j                  d| |dz         d   }|t        |dz        dddS |dz   t        |       k  rr| |   dk(  rj| |dz      }|dz	  dz  }|dz  }|dk(  rP||k(  rKt        j                  d| |dz         d   }|t        |dz        dt        |dz	  dz      dt        |    dddS y )Nr_      r      brM   r      zadd z, imm8)offset	offsetHexnextInstructionnextInstructionBytesrD      <i    r[   rd   zadd eax, imm32      zlea z, [z+imm32])lenr9   unpack_fromr"   rk   r   )r=   	after_imm	reg_indexr   rn   modrms          r   decode_next_base_offsetr      s   1}D	!d9o&=$yST}BUY]`iYiBi##Cy1}=a@ftm,!%i	&:%;6B$%	
 	
 1}D	!d9o&=$yST}BUY]`iYiBi##D$	A>qAv
23!%i	&:%;7C$%	
 	
 A~)a-3t94iD9P##D$	A>qAv
23/$%	
 	
 1}D	!d9o&=Y]#zT!T\!8i''dIMB1EF "6J#67%))UaZ44G*H)IYW`MaLbbi#j()	  r   c                   |t        |       k  xr | |   dk(  }|r|dz   n|}|dz   t        |       kD  ry | |   }|dvry | |dz      }|dz	  dz  }|dz  }|dz   }	|}
|dk(  r)|	t        |       k\  ry | |	   }|	dz  }	|dz  }
|d	k(  r|
d
k(  ry |d	k(  r|d
k(  ry |
|k7  s|dvry |dk(  r2|	t        |       k\  ry t        j                  d| |	      d	   }|	dz   |z
  }n4|	dz   t        |       kD  ry t        j                  d| |	      d	   }|	dz   |z
  }|dv rdnd}|dv rd}n|rd}nd}||t        |      t        |      ||dk(  rt	        |dz        nt        |dz        d|dd|ddt
        |    d|dk(  rt	        |dz        nt        |dz         d	|dS )Nr`   r   rM   >   rf   ra   rg   rb   ri   rc   rD   r_   r   rE   r   rd   >   r   rM   r   r   >   rf   ra   ri   rc   rQ   rR   >   rf   rg   ri   r   r   rh   r!   re   z [+])rG   rH   	opcodeHexmodrmHexdisplacementdisplacementHexrI   
byteLength)r   r9   r   r"   r   rk   )r=   indexbase_regprefix66opcode_indexrl   rn   r   r   
disp_indexbasesibr   lengthaccessrH   s                   r   decode_mem_access_with_baser     sO   s4y 8T%[D%8H (519eLa#d)#,F99!"EA:
C	B!JD	QwT":a
Tz!8		bAgx3f,
axT"))#tZ@Ca%'>CI%))$jA!Da%'"::WF##	&\K$?Bax5
!:;TR^aeReMf"6#,ic{"YxEXDYYZ  @C  GH  @H[`ampzaz[{  NR  S_  bf  Sf  Ng  [h  hi  j	 	r   c                6    t        | ||      }|r|d   |k7  ry |S )Nr   )r   )r=   r   r   target_offsetr   s        r   decode_mem_access_atr   :  s'    (uh?FVN+}<Mr   c                   t        |       \  }}g }g }|D ]&  }|j                  d      dk7  r|j                  d      }|t        vr3t        j                  |      }t	        |d         }	|	dz   }
t        ||
|      }|rR|j                  |d   ||d   |d   t        t        |d   z         t        |d	   |
z         |d
   |d   t        k(  d       t        t        |      |
t        z         }t        |
|      D ]@  }t        |||t              }|s|j                  |d   t        |d	   |z         |d|       B ) |j                  d        |j                  d        ||fS )NrK   r\   rL   ru   rE   rt   r   r   rq   r   )baseLoadVaHexrL   r   r   rr   nextInstructionVaHexr   equalsMode1Offset)r   accessVaHexrL   c                    | d   S )Nr   r   items    r   rx   z'scan_base_offset_rows.<locals>.<lambda>d  s    d?&; r   ry   c                    | d   S )Nr   r   r   s    r   rx   z'scan_base_offset_rows.<locals>.<lambda>e  s    d=&9 r   )r7   r|   rk   r   intr   r<   r   GLOBAL_BUFFER_BASEMODE1_OFFSETminr   WINDOW_BYTESranger   r}   )r6   	base_rowsr~   r=   offset_rowswindow_rowsrw   rm   r   rA   r   decoded
window_endr   r   s                  r   scan_base_offset_rowsr   A  s   c"JD$KK 77$%8ggj!iOOC(	#k"#!G	)$	9E!$%7!8!(+$[1"#58I#IJ(-d4j9.D(E#*+<#=%,X%6,%F	  	 TI$<=
9j1 	E)$y,OF""%();%<#(de);#< #$ 	$ 	-> ;<9:##r   c                   t        |       \  }}g }t        t        t        dz         D ]5  }t	        | |      D ]"  }|j                  d      dk7  r|j                  d      }|t        vr3t        j                  |      }t        |d         }|dz   }	t        t        |      |	t        z         }
t        |	|
      D ]  }t        |||      }|s||d   z   }t        |j                  d      xs d	      }|t        cxk  xr |t        |d      z   k  nc }|s]|j                  t!        |      |d
   t!        |d   |z         |t!        |dz        |d|        % 8 |j#                  d        |S )Nr   rK   r\   rL   ru   rE   r   rH   r   rt   rq   r   )baseHexr   r   rL   rr   coversMode1Sourcec                    | d   | d   | d   fS )Nr   r   r   r   r   s    r   rx   z.scan_nearby_base_window_rows.<locals>.<lambda>  s    Yo1F]H[\ r   ry   )r7   r   NEARBY_BASE_SCAN_STARTNEARBY_BASE_SCAN_ENDr   r|   rk   r   r   r   r   NEARBY_BASE_WINDOW_BYTESr   MODE1_SOURCEr{   r<   r   r}   )r6   r~   r=   r   rZ   rw   rm   r   rA   r   r   r   r   r>   rH   covers_mode1s                   r   scan_nearby_base_window_rowsr   i  s   c"JD$D/1E1IJ #C1 	Cww()_<''*%C)#!,Ic+&'CaISY	4L(LMJy*5 4T5)L 6.#99FJJw/415%NUA8NN#$W~%();%<#(de);#< #!&v
':!;)5  	: 	II\I]Kr   c                b    | j                         D ci c]  \  }}|dk7  s|| c}}S c c}}w )Nru   )items)rw   rz   r   s      r   compact_rowr     s+    ),K:3{8JCJKKKs   ++c           	        |xs i }|xs i }t        | t              }t        | t              }t        | |      \  }}t	        |       }|D cg c]  }|j                  d      dk(  r| }	}|D cg c]  }|j                  d      dk(  r| }
}|D cg c]  }|j                  d      dv r| }}|D cg c]  }|j                  d      dv r| }}|D cg c]  }|j                  d      dk(  r| }}|D cg c]  }|j                  d      s| }}|D cg c]  }|j                  d      dk(  r| }}|D cg c]  }|j                  d      dk(  r| }}|j                  d	      xs g D cg c]%  }|j                  d
      t        t              k(  r|' }}|j                  dt        |            |j                  d      |j                  d      |j                  d      d}t        |      dk(  xr> t        |      dk(  xr. t        |      dk(  xr t        |      dk(  xr t        |      dk(  }|rdnd}i dt        t              dt        t              dt        t              dt        dt        t               dt        t               dt        dt        |      dt        |	      dt        |
      dt        |      dt        |      dt        |      d t        |      d!t        |      d"t        |      d#t        |      d$t        |      i d%t        |      d&t        |      d't        |      d(|d)|d*|d+|d,|d-|d.|d/|d0|D cg c]  }t        |       c}d1|D cg c]  }t        |       c}d2|d3d4d5d4d6t        t         t"        t        t"              d7|d8S c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )9NrK   rF   r\   rG   >   rR   rQ   >   r^   r\   rQ   r   immediateAssignmentsr   exactMode1RefCountcoveringWriteCountindexedWriteCandidateCountaddressProducerCandidateCount)r   r   r   r   r   ac  The static 0x0059e310 base-reference scan found global selection-buffer assignments and direct flag/input/object-state uses, but no immediate 0x0059e310+0x38 materialization and no short-window store to [base+0x38]. A wider nearby-base scan also found no short-window write through an alternate base such as 0x0059e340+0x08. The only exact 0x0059e348 reference is still the opcode 0x24 mode1 read, so this scan does not prove an indirect producer. This is a bounded static scan, not a full runtime data-flow proof; route promotion remains blocked until a runtime producer or stricter control-flow proof appears.zAt least one static base-derived candidate reaches 0x0059e348; inspect candidate rows before treating the mode1 source as unresolved.mode1SourceHexglobalBufferBaseHexmode1OffsetHexwindowBytesnearbyBaseScanRangeHexz..nearbyBaseWindowBytesglobalBaseDirectRefCountglobalBaseAssignmentCountglobalBaseMovImmediateCountglobalBaseDirectDataAccessCount%globalBaseKnownContextAssignmentCountmode1DirectRefCountmode1DirectWriteCountmode1AddressImmediateCountbasePlusOffsetRowCount!basePlusMode1OffsetCandidateCount#baseWindowMode1AccessCandidateCount"baseWindowMode1WriteCandidateCount)nearbyBaseWindowMode1AccessCandidateCount(nearbyBaseWindowMode1WriteCandidateCountdirectProducerSummaryknownContextBaseAssignmentsbasePlusOffsetRowsbasePlusMode1OffsetCandidatesbaseWindowMode1AccessCandidatesbaseWindowMode1WriteCandidates%nearbyBaseWindowMode1AccessCandidates$nearbyBaseWindowMode1WriteCandidatesglobalBaseDirectRefsmode1DirectRefsnoStaticBaseIndirectCandidate
proofFoundFopcode24Mode1IndirectProofFound"failedOpcode24Mode1IndirectGateIdsblocked)missingEvidenceevidenceRefsevidenceRefCountpromotionStatus
conclusion)r   r   r   r   r   r|   r   r   r"   r   r   r   r   r   r   'FAILED_OPCODE24_MODE1_INDIRECT_GATE_IDS(OPCODE24_MODE1_INDIRECT_MISSING_EVIDENCE%OPCODE24_MODE1_INDIRECT_EVIDENCE_REFS)r6   mode1_source_writesselection_buffer_basesr   
mode1_rowsr   r   nearby_base_window_rowsrw   global_assignment_rowsbase_mov_rowsbase_direct_data_rowsmode1_address_rowsmode1_write_rowsmode1_offset_rowsmode1_window_writesnearby_base_window_writesknown_base_assignmentsdirect_summary!no_static_base_indirect_candidater   s                        r   build_summaryr    s{   
 .339r &89I!#|4J4S)DK:3? 77$%);; 	  77$%8 	M  77< $55 	  77$%)HH 	  77< G+ 	  #cgg.A&B 
 77< G+ 	  +!77< G+ 	! ! *--.DEK779'9!:: 	  2556JCPZO\1556JK&9&=&=>Z&[)<)@)@A`)a	N 	" 	0"#q(	0!"a'	0 #$)	0 )*a/ & -	& U (%-(u%78( 	$|,( 	|	(
 	!U+A%B$C2eL`FaEb"c( 	 !9( 	#C	N( 	$S)?%@( 	&s='9( 	*3/D+E( 	05K1L( 	s:( 	 %5!6( 	%c*<&=( 	!#k"2(  	,S1B-C!(" 	.s;/?#($ 	-c2E.F%(& 	4S9P5Q'(( 	3C8Q4R)(* 	 +(, 	&'=-(. 	k/(0 	():1(2 	*;3(4 	)*=5(6 	01H7(8 	/0I9(: 	Y GcS!1 G;(< 	
CK,C=(> 	()J?(@ 	eA(B 	*5C(D 	-.UE(F D= EF$ O( (G





!
t !HCsH   O.O	O3OO8OOO"<O'2*O,&O1
 O6
c                   ddd| d    dd| d    dd| d	    dd
| d    d| d    d| d    d| d    d| d    d| d    d| d    d| d    d| d    dd| d    d| d    dd | d!    dd"| d#    dd| d$   dd%dg}|j                  d& | d'   D               |j                  g d(       |j                  d) | d*   D               |j                  g d+       |j                  d, | d-   D               |j                  g d.       | d/   D ]>  }|j                  d0|d1    d2|d3    d4|d5    d6|d7    d6|d8    d9|d:    d2|d;    d<       @ | d/   s|j                  d=       |j                  g d>       | d?   D ]8  }|j                  d0|d1    d6|d@    d2|d3    dA|dB    dA|dC    d4|dD    dE       : | d?   s|j                  d=       |j                  g dF       | dG   D ]D  }|j                  d0|dH    d6|d1    d6|d@    d2|d3    d4|d7    d2|dB    dA|dC    d4|dD    dE       F | dG   s|j                  dI       |j                  g dJ       | dK   D ]3  }|j                  d0|dL    d2|dB    dA|dC   |dC   ndM d4|dD    dE	       5 |j                  g dN       | dO   D ]9  }|j                  d0|dL    d2|dB    dA|dC   |dC   ndM dA|dP    d4|dD    dE       ; |j                  d       dQj                  |      S )RNz2# Save Selector Opcode 0x24 Mode1 Indirect Context z- mode1 source: `r   `z- global buffer base: `r   z"- mode1 offset from global base: `r   z- global base direct refs: r   z#- global base context assignments: r   z"- global base mov-immediate refs: r   z- exact mode1 refs: r   z- exact mode1 direct writes: r   z"- exact mode1 address immediates: r   z%- base plus mode1-offset candidates: r   z-- short-window [base+0x38] write candidates: r   z- nearby-base scan range: `r   z-- nearby-base short-window write candidates: r   z- proofFound: `r   z$- opcode24Mode1IndirectProofFound: `r   z- promotion status: `r   r   z## Failed Gatesc              3  (   K   | ]
  }d | d  yw)- `r  Nr   r0   r   s     r   r2   zmarkdown.<locals>.<genexpr>$  s     Y43tfAYs   r   )r  z## Missing Evidencer  c              3  &   K   | ]	  }d |   yw)z- Nr   r  s     r   r2   zmarkdown.<locals>.<genexpr>*  s     D2dVDs   r   )r  z## Evidence Refsr  c              3  8   K   | ]  }d |d    d|d      yw)r  r   z`: r   Nr   r0   rw   s     r   r2   zmarkdown.<locals>.<genexpr>0  s/       c&k]#c-012s   r   )r  z## Base Plus Offset Rowsr  zL| base load | register | offset | target | next instruction | mode1 offset |z%| --- | --- | --- | --- | --- | --- |r   z| `r   z` | rL   z | `r   z` | `rr   r    r   r   z |z| - | - | - | - | - | - |)r  z+## Short-Window Base+0x38 Access Candidatesr  z>| base load | access | register | kind | width | instruction |z&| --- | --- | --- | --- | ---: | --- |r   r   z | rG   rH   rI   z` |)r  z&## Nearby-Base Mode1 Access Candidatesr  zN| base | base load | access | register | target | kind | width | instruction |z2| --- | --- | --- | --- | --- | --- | ---: | --- |r   r   z!| - | - | - | - | - | - | - | - |)r  z ## Exact Mode1 Direct Referencesr  z&| ref | access | width | instruction |z| --- | --- | ---: | --- |r   rt   -)r  z ## Global Base Direct Referencesr  z-| ref | access | width | kind | instruction |z | --- | --- | ---: | --- | --- |r   rK   
)extendr<   join)summarylinesrw   s      r   markdownr   
  s   <

G$456a8
!'*?"@!AC
,W5E-F,GqI
%g.H&I%JK
-g6Q.R-ST
,W5R-S,TU
w'<=>?
'0G(H'IJ
,W5Q-R,ST
/8[0\/]^
7@d8e7fg
%g.F&G%HJ
7@j8k7lm
',/02
.w7X/Y.ZZ[\
(9 :;1=


/E2 
LLY73W+XYY	LL  
 
LLD1B)CDD	LL  
 
LL >*  
LL   +, 
#o&'tC
O+<D[AQ@R SK !s+A'B&C1SIZE[D\\`&'(,	

 '(01	LL   89 
#o&'uS-?,@S_DUUX< !S\N$s=7I6J#O	


 4501	LL   >? 
#i.!s?';&<E#mBTAUUY:tC$4#5T#l:K9LCPST[P\~ ^M"#3(	

 :;89	LL   () 
#()*$s</@.A"7|7s7|SAc-FXEYY\^	


 
LL   -. 
#()*$s</@.A"7|7s7|SASIZE[D\ ]M"#3(	

 
LL99Ur   c           
        dj                  d | d   D              }dj                  d | d   D              }dj                  d | d   D              }dj                  d | d	   D              }dj                  d
 | d   D              }dj                  d | d   D              }dj                  d | d   D              }dj                  d | d   D              }dj                  g dddddt        j                  | d          ddt        j                  | d          ddt        j                  | d          dd| d    d d!| d"    d d#| d$    d d%| d&    d d'| d(    d d)| d*    d d+| d,    d d-| d.    d d/t        j                  | d0          dd1| d2    d d3t        j                  t        | d4                dd5t        j                  | d6          dd7d8t        j                  | d9          d:d;d| d7d<d| d7d=d| d7d>d?|xs d@dAdBdC|xs dDdAdEdF|xs dGdAdHdI|dAdJdK|dA      S )LNr  c              3  Z  K   | ]  }d t        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d          d	t        j                  |d
          d|d    d  yw)<tr><td><code>r   </code></td><td>rL   </td><td><code>r   </code></td><td><code>rr   r   r  r   r   z
</td></tr>Nhtmlescaper  s     r   r2   zhtml_page.<locals>.<genexpr>~  s      
 	[[_!567 8{{3z?+, -[[[!123 4[[[!123 4[[%;!<=>aCPaLb@c?d e&'( )	
s   B)B+r   c              3  (  K   | ]  }d t        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d          d|d    d	t        j                  |d
          d  yw)r#  r   r&  r   r$  rL   	</td><td>rG   rH   r%  rI   </code></td></tr>Nr'  r  s     r   r2   zhtml_page.<locals>.<genexpr>  s      
 	[[_!567 8[[]!345 6{{3z?+, -{{3|,-. /7|n [[]!345 6	
s   BBr   c              3    K   | ]  }d t        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d	          d
|d    dt        j                  |d          d  yw)r#  r   r&  r   r   r$  rL   r%  rr   rG   r+  rH   rI   r,  Nr'  r  s     r   r2   zhtml_page.<locals>.<genexpr>  s       	[[Y01 2[[_!567 8[[]!345 6{{3z?+, -[[[!123 4{{3|,-. /7|n [[]!345 6		s   CCr   c              3     K   | ]_  }d t        j                  |d          dt        j                  |d          d|d   |d   nd dt        j                  |d	          d
	 a yw)r#  rt   r$  rG   r+  rH   Nr  r%  rI   r,  r'  r  s     r   r2   zhtml_page.<locals>.<genexpr>  s       	[[%7!89: ;{{3|,-. /"7|7s7|SA B[[]!345 6		s   A%A'r   c              3    K   | ]x  }d t        j                  |d          dt        j                  |d          d|d   |d   nd dt        j                  |d          d	t        j                  |d
          d z yw)r#  rt   r$  rG   r+  rH   Nr  rK   r%  rI   r,  r'  r  s     r   r2   zhtml_page.<locals>.<genexpr>  s      	 	[[%7!89: ;{{3|,-. /"7|7s7|SA B{{30123 4[[]!345 6		s   A>B r   r  c              3  N   K   | ]  }d t        j                  |       d  yw)
<li><code></code></li>Nr'  r  s     r   r2   zhtml_page.<locals>.<genexpr>  s+       T[[&'|4   #%r   c              3  N   K   | ]  }d t        j                  |       d  yw)z<li></li>Nr'  r  s     r   r2   zhtml_page.<locals>.<genexpr>  s+       t{{4 !'r3  r   c              3     K   | ]9  }d t        j                  |d          dt        j                  |d          d ; yw)r1  r   z	</code>: r   r5  Nr'  r  s     r   r2   zhtml_page.<locals>.<genexpr>  sE       T[[V-.iCDV8W7XX]^s   ?Ar   zd<!doctype html><meta charset="utf-8"><title>Save Selector Opcode 0x24 Mode1 Indirect Context</title>z<style>body{font-family:system-ui,sans-serif;background:#111;color:#eee;max-width:1180px;margin:24px auto}table{border-collapse:collapse}td,th{border:1px solid #444;padding:6px 8px;vertical-align:top}code{color:#9bd4ff}</style>z9<h1>Save Selector Opcode 0x24 Mode1 Indirect Context</h1>z<ul>z<li>mode1 source: <code>r   r2  z<li>global buffer base: <code>r   z<li>mode1 offset: <code>r   z<li>global base direct refs: r   r5  z%<li>global base context assignments: r   z$<li>global base mov-immediate refs: r   z<li>exact mode1 refs: r   z<li>exact mode1 direct writes: r   z$<li>exact mode1 address immediates: r   z'<li>base plus mode1-offset candidates: r   z/<li>short-window [base+0x38] write candidates: r   z"<li>nearby-base scan range: <code>r   z/<li>nearby-base short-window write candidates: r   z<li>proofFound: <code>r   z<li>promotion status: <code>r   z</ul>z<p>r   z</p>z<h2>Failed Gates</h2>z<h2>Missing Evidence</h2>z<h2>Evidence Refs</h2>z<h2>Base Plus Offset Rows</h2>z<table><thead><tr><th>base load</th><th>register</th><th>offset</th><th>target</th><th>next instruction</th><th>mode1 offset</th></tr></thead><tbody>z7<tr><td colspan="6">No base-plus-offset rows.</td></tr>z</tbody></table>z1<h2>Short-Window Base+0x38 Access Candidates</h2>z<table><thead><tr><th>base load</th><th>access</th><th>register</th><th>kind</th><th>width</th><th>instruction</th></tr></thead><tbody>zL<tr><td colspan="6">No short-window [base+0x38] access candidates.</td></tr>z,<h2>Nearby-Base Mode1 Access Candidates</h2>z<table><thead><tr><th>base</th><th>base load</th><th>access</th><th>register</th><th>target</th><th>kind</th><th>width</th><th>instruction</th></tr></thead><tbody>zL<tr><td colspan="8">No nearby-base short-window access candidates.</td></tr>z&<h2>Exact Mode1 Direct References</h2>zc<table><thead><tr><th>ref</th><th>access</th><th>width</th><th>instruction</th></tr></thead><tbody>z&<h2>Global Base Direct References</h2>zp<table><thead><tr><th>ref</th><th>access</th><th>width</th><th>kind</th><th>instruction</th></tr></thead><tbody>)r  r(  r)  str)	r  r   r   nearby_rowsr  r   failed_gatesmissing_evidenceevidence_refss	            r   	html_pager<  }  s   )) 
 /0
 
K )) 
 <=
 
K ))  BC K   ,- J 		 	 12	 	I 77 @A L ww -.  GG >* M 99 0p0 	n0 	D0 		0
 #4;;w7G/H#I"J,W0 )W=R5S)T(UUab0 #4;;w7G/H#I"J,W0 (0J(K'LER0 08S0T/UUZ[0 /w7T/U.VV[\0 !)>!? @F0 *'2I*J)K5Q0 /w7S/T.UUZ[0 2':]2^1__de0 :'Bf:g9hhmn0  -T[[AY9Z-[,\\hi!0" :'Bl:m9nnst#0$ !S1F-G!H IV%0& 't{{7;L3M'N&O|\'0( 	)0* dkk',/016+0, 	 -0. |nE"/00 	$102  &304 	!506 }oU#708 	)90: 	`;0< 	PP=0> 	?0@ 	<A0B 	RC0D 	eeE0F 	G0H 	7I0J 	nK0L 	eeM0N 	O0P 	1Q0R 	nS0T 	U0V 	W0X 	1Y0Z 	{[0\ 	]0^ 	_0 0 0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_okz2save_selector_opcode24_mode1_indirect_context.jsonFrM   )ensure_asciiindentr  r$   r%   )mkdir
write_textr(   dumpsparentr<  )r  out_dirhtml_outjson_outs       r   write_outputsrI    s    MM$M.MMH

7q9D@   dT:Ig.AOr   c                 p   t        j                  t              } | j                  dt        t
        dz         | j                  dt        t        dz         | j                  dt        t        dz         | j                  d	t        t               | j                  d
t               | j                         }t        |j                  j                         t        |j                  i       t        |j                  i             }t        ||j                  |j                         }t#        d|        y )N)r   z--exer   )typedefaultz--mode1-source-writesz/save_selector_opcode24_mode1_source_writes.jsonz--selection-buffer-basesz)save_selector_selection_buffer_bases.jsonz	--out-dirz
--html-out)rK  z)wrote opcode24 mode1 indirect context -> )argparseArgumentParser__doc__add_argumentr   ROOTOUT
parse_argsr  r6   
read_bytesr,   r   r  rI  rF  rG  print)parserargsr  rH  s       r   mainrX     s    $$9F
dD=4HI
/dCJ{D{|
2sMxGxy
$<
40D$**B/$--r2G
 WdllDMMBH	5hZ
@Ar   __main__)r   r   returnr7  )r   r   r+   r   rZ  r   )r6   bytesrZ  ztuple[dict, bytes])r=   r[  r>   r   rZ  z	list[int])r=   r[  rA   r   rZ  dict)r6   r[  r>   r   rZ  
list[dict])r=   r[  r   r   r   r   rZ  dict | None)r=   r[  r   r   r   r   rZ  r^  )
r=   r[  r   r   r   r   r   r   rZ  r^  )r6   r[  r   r]  rZ  ztuple[list[dict], list[dict]])r6   r[  rZ  r]  )rw   r\  rZ  r\  )NN)r6   r[  r   r^  r  r^  rZ  r\  )r  r\  rZ  r7  )r  r\  rF  r   rG  zPath | NonerZ  r   )rZ  None)5rO  
__future__r   rM  r(  r(   r9   syspathlibr   typingr   r   insertr7  __file__resolverE  probe_exe_scene_tablesr   r>  rQ  rR  r   r   r   r   r   r   r   rk   r   r   r   r   r"   r,   r7   rB   ro   r   r   r   r   r   r   r   r  r   r<  rI  rX  __name__r   r   r   <module>ri     s   M "     
   3tH~--/667 8 0 H~''*
Ul 00# #  D	+ '
, ( +\]B  TD  E<M}~1Bqr	) %8O
yx*%P3l%$P!HL (,*.v	v$v (v 
	vrpfsl 25d 
B" zF r   