
    UHj?                       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 ddlmZmZmZ  e	e      j                         j,                  d   Zedz  Zd	Zd
ZdZdZdhZddh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'd,dZ(d-dZ)	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d.dZ*	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d/dZ+	 	 	 	 	 	 	 	 	 	 	 	 	 	 d0dZ,d1dZ-efd2dZ.d3d Z/e0d!k(  r e/        yy)4zKScan map1_01a manifest record neighborhoods for strict source point tables.    )annotationsN)Path)read_point_table)find_cns_stringsread_sectionsva_to_offset   outmap1_01amap2_02d`   i@  z.textz.rdataz.datac                    d| dS )N0x08x )values    C/home/exedev/hwanse/tools/summarize_map1_01a_manifest_point_scan.pyva_hexr      s    c{    c                    | j                  d      }d}|j                  |      st        |  d      t        j                  |t        |      d  j                  d            S )Nutf-8encodingzwindow.HWANSE_MAPS = z. does not contain the expected maps.js wrapperz;
)	read_text
startswith
ValueErrorjsonloadslenrstrip)pathtextprefixs      r   parse_maps_jsr$       s[    >>7>+D$F??6"D6!OPQQ::d3v;<(//677r   c                v    t        ||      }||dz   t        |       kD  ry t        j                  d| |      d   S )N   <Ir   )r   r   structunpack_from)datasectionsvaoffsets       r   dword_at_var.   (   s?    (B'F~!c$i/dD&1!44r   c                T    | D ]#  }|d   }|d   |d   z   }||cxk  r	|k  s|c S  % y )Nrawraw_sizer   )r+   r-   sectionstartends        r   section_for_offsetr5   /   sI     enwz22F S N !
 r   c                   d}g }|D ]  }|d   |vr|d   }	|d   |d   z   }
| |	|
 }t        dt        dt        |      dz
        d      D ]v  }t        j                  d||      d   }||cxk  r|k  sn +|dz  }t        |      |k\  r?|j                  |d   |d	   |z   t        |d	   |z         |t        |      d
       x  ||dS )Nr   namer0   r1      r&   r'   r	   r,   )r2   refVarefVaHexr   valueHex)countsamples)rangemaxr   r(   r)   appendr   )r*   r+   start_vaend_vasection_namessample_limitr<   r=   r2   	raw_startraw_endr0   indexr   s                 r   scan_refs_to_rangerH   8   s    EG 6?-/EN	%.7:#669W%1c!SX\2A6 	E&&tS%8;E..QJE7||+NN"6? ."74=5#89"5M 	( w//r   c                    | j                  d      }t        |t              r|S | j                  d      }t        |t              rt	        |      S dS )NrecordVaHexrecordVanone)get
isinstancestrintr   )rowr   s     r   
record_hexrR   Y   sE    GGM"E%GGJE&uc26%=>>r   c                    | j                  d      xs g D ci c]$  }|j                  d      |j                  dd      & c}S c c}w )NrecordContextsrJ   roleunknownrM   )entry_contextrQ   s     r   role_by_recordrY   a   sN     !$$%56<" 		 ::  s   )Ac                    | D ci c]C  }t        |j                  d      t              r"t        |d         |j                  d      xs g E c}S c c}w )NrK   targets)rN   rM   rP   )event_transitionsrQ   s     r   event_targets_by_recordr]   h   sS     %cggj)3/ 	C
Ocggi06B6  s   AAc                   | D ]  }|j                  d      }|j                  d      }t        |t              rt        |t              sF||cxk  r|k  sRn Ud|j                  d      |t        |      |j                  |g       |j                  d      t        |j                  d      t              rt        |d         nd |t        |      d	c S  y )NrK   pointTableEndVazstrict-event-recordmappointTableVa)	kindr`   rK   rJ   r[   ra   pointTableVaHexr_   pointTableEndVaHex)rM   rN   rP   r   )scene_eventsevent_targetsfield_vaevent	record_vapoint_end_vas         r   event_owner_for_fieldrk   p   s     IIj)	yy!23)S)L#1N/</-yy'%%i0(,,Y; %		. 9DNuyyYgOhjmDn6%*?#@tx#/&,\&:
 
" r   c                   g }| D ]  }|j                  d      t        k7  r|j                  d      }t        |t              s>|j	                  |t        |      |j                  d      |j                  d      xs g |j                  d      xs g D cg c]  }|j                  d       c}|j                  d      d        |j                  d	 
       |S c c}w )Nr`   rK   
sceneIdHextilesetsfollowingResourcesr7   nextMapRefVaHex)rK   rJ   rm   rn   followingResourceNamesrp   c                    | d   S )NrK   r   )rQ   s    r   <lambda>z&manifest_record_rows.<locals>.<lambda>   s
    c*o r   )key)rM   MAPrN   rP   r@   r   sort)scene_manifestrowsrQ   ri   items        r   manifest_record_rowsrz      s    D 775>S GGJ'	)S)!!),'',/
+1rDGGGL`DaDgeg&hDtxx'7&h"ww'89
 	 	II-I.K	 'is   Cc                    d }| D ]  }|d   |k  r|} n |y |d   |j                  |d   d      |j                  d      dS )NrK   rJ   rV   rm   )rJ   rU   rm   rW   )recordsrolesrg   previousrecords        r   source_record_for_fieldr      sj    H *)H	
 .		(=19=ll<0 r   c
           	        ||v ry t        ||      y t        | |||d   |d         \  }
}|
sy t        | |||dz   t              }t        | |||dz   t              }t        |||      }t        ||	|      }|xs i j                  d      }|xs i j                  d      xs g }|t        k(  xr t        |v xr t        |      }|r-d|d    d|d    d	d
j                  |      xs d dt         d	}nd}i d|dt        |      d|dt        |      d|d|dt        |
      dt        |      d|
d d d|d d d|d   d|d   d|d   d|d   d |d!|S )"Nwidthheight   r`   r[   z&Point table is owned by strict event `z` `rJ   z` with targets , -z, not by a `z` source event.z]Point-like pointer is not attached to a strict map1_01a event record or target map code path.fieldVa
fieldVaHex	payloadVapayloadVaHexsourceRecord
ownerEventrawPointCountinBoundsPointCountfirstRawPoints   firstInBoundsPointsrangeTextRefCountr<   rangeDataRefCountrangeTextRefsr=   rangeDataRefspromotionEvidencereason)r   r   rH   REF_TEXT_SECTIONSREF_DATA_SECTIONSrk   r   rM   ru   FRONTIER_TARGETbooljoinr   r   )exer+   source_map_sizerg   r   stringsre   rf   source_recordsr}   
raw_pointsin_bounds_points	text_refs	data_refsowner_eventsource_record	owner_mapowner_targets	promotionr   s                       r   pointer_candidater      s5    He$,#3 !$ J  "3%GXYI"3%GXYI'mXNK+NE8LM"''.I &B++I6<"MS `_%E`$O_J`I4[5G4HKXeLfKg h IIm4;<L_^ 	
 q8fX& 	U 	u	
 	 	k 	Z 	c"23 	*Ra. 	/3 	Yw/ 	Yw/ 	9- 	9- 	Y  	&! r   c	                h   |d   t         z
  }	|d   t        z   }
g }t        |	|
d      D ]:  }t        | ||      }|t	        | |||||||||
      }|s*|j                  |       < i ||j                  |d   d      t        |	       dt        |
       t        |      t        d |D              |dS )NrK   r&   rJ   rV   z..c              3  D   K   | ]  }|j                  d       sd  yw)r   r	   NrW   ).0rQ   s     r   	<genexpr>z%scan_record_window.<locals>.<genexpr>	  s     )bSWWM`Ea!)bs     )rU   scanRangeHexpointLikePointerCountpromotableSourcePointCountpointLikePointers)
SCAN_BEFORE
SCAN_AFTERr>   r.   r   r@   rM   r   r   sum)r   r+   r   r   r   r   r}   re   rf   rA   rB   
candidatesrg   r   	candidates                  r   scan_record_windowr      s     j!K/HJ*,FJ(FA. )C84=%
	 i(#)$
		&/;!(+,Bvf~.>?!$Z&))bz)b&b' r   c                   t        |       }t        | |      }|t           }|d   |d   d}	t        |      }
t	        |      }t        |      }|
D cg c]  }t        | |||	||
|||	       }}|D cg c]/  }|j                  d      xs g D ]  }|j                  d      r| 1 }}}|D cg c]w  }|j                  d      xs g D ]]  }|j                  d      xs i j                  d      t        k7  r0t        |j                  d      xs i j                  d      xs g v r|_ y }}}d	}t        t        |	t        t              t        t              |t        |      t        |      d
|d
S c c}w c c}}w c c}}w )Nr   r   )r   r   r   r   r   r`   r[   a  The only strict-event-owned 24-point table found in the map1_01a manifest neighborhoods is owned by the strict map1_02b -> map1_01a event record at 0x00503350. It confirms the incoming route, but it is not a map1_01a source hotspot and it does not target map2_02d. Other short point-like reads come from tail/script blocks without a strict map1_01a event owner. No scanned record provides strict map1_01a source coordinate evidence for map1_01a -> map2_02d.blocked)
r`   frontierTargetsourceMapSizescanWindowBeforeHexscanWindowAfterHexr|   incomingPointTableCountstrictSourceHotspotFoundpromotionStatus
conclusion)r   r   ru   rz   rY   r]   r   rM   r   r   r   r   r   r   )r   map_datarw   re   r\   rX   r+   r   
source_mapr   r   r}   rf   r   r|   r   
promotableincomingr   s                      r   build_summaryr     s    S!HsH-G#J *7 3z(?STO).9N=)E+,=>M %  	
	
G   $78>B ==,- 	J  $78>B MM,'-22259S@Y]]<06B;;IFL"M	 	H 	O  )(%k2$Z0#&x=$($4$  Es   E024E5.A<E;c                d   g }g }| d   D ]  }|j                  dt        j                  |d          dt        j                  |d          dt        j                  |d          d|d    d	|d
    d	t        j                  dj                  |d         xs d       d       |j	                  d      xs g D ]M  }|j	                  d      xs i }|rN|j	                  d       d|j	                  d       ddj                  |j	                  d      xs g       xs d nd}dj                  d |j	                  d      xs g D              }|j                  dt        j                  |d          dt        j                  |d          dt        j                  |d          d|d    d|d    d	t        j                  |       d	|d    d	t        j                  |d           d	t        j                  |xs d       d       P  d!j                  g d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6t        j                  | d7          d8| d9    d:t        j                  | d;          d<d=t        j                  | d>          d?d@dA|dBdCdD|dBdEdFdG      S )HNr|   z<tr><td><code>rJ   z</code></td><td>rU   z</td><td><code>r   r   z	</td><td>r   r   rq   r   z
</td></tr>r   r   r`    z	 targets=,r[   zno strict event ownerc              3  6   K   | ]  }|d     d|d      yw)xr   yNr   )r   points     r   r   zhtml_page.<locals>.<genexpr>b  s#     t%*QuSzl;ts   r   z</code></td><td><code>r   r   r   z / r   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>map1_01a Manifest Point Scan</title>z	  <style>zg    :root { color-scheme: dark; font-family: system-ui, sans-serif; background: #101010; color: #eee; }z&    body { margin: 0; padding: 24px; }z,    h1 { margin: 0 0 8px; font-size: 24px; }z/    h2 { margin: 24px 0 8px; font-size: 18px; }z<    p { max-width: 1100px; color: #bbb; line-height: 1.45; }z[    table { width: 100%; border-collapse: collapse; margin: 12px 0 20px; font-size: 13px; }zi    th, td { border-bottom: 1px solid #303030; padding: 7px 8px; text-align: left; vertical-align: top; }zF    th { position: sticky; top: 0; background: #181818; color: #ddd; }z    code { color: #d7f0ff; }z
  </style>z</head>z<body>z'  <h1>map1_01a Manifest Point Scan</h1>z  <p>target <code>r   z&</code>; strict source hotspot found: r   z; promotion status <code>r   z</code></p>z  <p>r   z</p>z  <h2>Records</h2>z  <table><thead><tr><th>record</th><th>role</th><th>scan range</th><th>point-like pointers</th><th>promotable source points</th><th>following resources</th></tr></thead><tbody>z  </tbody></table>z  <h2>Point-Like Pointers</h2>z  <table><thead><tr><th>record</th><th>field</th><th>payload</th><th>raw/in-bounds</th><th>owner</th><th>promotion</th><th>reason</th><th>first points</th></tr></thead><tbody>z</body>z</html> )r@   htmlescaper   rM   )summaryrecord_rowspointer_rowsr   r   owner
owner_textpointss           r   	html_pager   M  s"   KL)$ VM%:;< =;;vf~./ 0VN%;<= >123 4678 9;;tyy0H)IJQcRS T		
  $78>B 	IMM,/52E  99U#$Aeii&>%?yRWR[R[\eRfRljlImItqtHuv, 
 YYtWlImIsqsttF![[)>?@ A![[<)@AB C![[>)BCD E 12#i@T6U5V W{{:./ 0 !456 7{{9X#678 9{{6=S12 3		> 99 ### 	# 	#	#
 	Q# 	8# 	# 	r# 	1# 	7# 	:# 	G# 	f# 	t# 	Q#  	'!#" 	##$ 	%#& 	'#( 	2)#* T[[1A)BCDDj-.
//HU\]nUoIpHqq|	~+#. GL12348/#0 	1#2 	{3#4 
5#6 	7#8 	)9#: 	z;#< 
=#> 	?#@ 	A#B 	C#D 	E# # #r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_ok!map1_01a_manifest_point_scan.jsonF   )ensure_asciiindentr   r   r   )mkdir
write_textr   dumps)r   out_dirs     r   write_outputsr     sC    MM$M.22>>

7q9D@ ? r   c                 D   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        d
z         | j                  dt        t        dz         | j                  dt        t        dz         | j                  dt        t               | j                         }t        |j                  j                         t        |j                        t        j                  |j                  j!                  d            t        j                  |j"                  j!                  d            t        j                  |j$                  j!                  d            t        j                  |j&                  j!                  d                  }t)        ||j*                         t-        d|j*                  dz          y )N)descriptionz--exezHwanse2.exe)typedefaultz--mapszmaps.jsz--scene-manifestzscene_manifest.jsonz--scene-eventszscene_events.jsonz--event-transitionszevent_transitions.jsonz--entry-contextzmap1_01a_entry_context.jsonz	--out-dirr   r   z&wrote map1_01a manifest point scan -> r   )argparseArgumentParser__doc__add_argumentr   ROOTOUT
parse_argsr   r   
read_bytesr$   mapsr   r   rw   r   re   r\   rX   r   r   print)parserargsr   s      r   mainr     s   $$9F
dD=4HI
tS9_E
*sEZ?Z[
(tSCV=VW
-D#H`B`a
)cDa>ab
$<Ddii 

4&&00'0BC

4$$...@A

4))33W3EF

4%%///ABG '4<<(	24<<Be3e2f
ghr   __main__)r   rP   returnrO   )r!   r   r   dict)r*   bytesr+   
list[dict]r,   rP   r   z
int | None)r+   r   r-   rP   r   dict | None)r   )r*   r   r+   r   rA   rP   rB   rP   rC   zset[str]rD   rP   r   r   )rQ   r   r   rO   )rX   r   r   dict[str, str])r\   r   r   dict[int, list[str]])re   r   rf   r   rg   rP   r   r   )rw   r   r   r   )r|   r   r}   r   rg   rP   r   r   )r   r   r+   r   r   r   rg   rP   r   rP   r   dict[int, str]re   r   rf   r   r   r   r}   r   r   r   )r   r   r+   r   r   r   r   r   r   r   r   r   r}   r   re   r   rf   r   r   r   )r   r   r   r   rw   r   re   r   r\   r   rX   r   r   r   )r   r   r   rO   )r   r   r   r   r   None)r   r   )1r   
__future__r   r   r   r   r(   syspathlibr   r!   insertrO   __file__resolveparentextract_scene_eventsr   probe_exe_scene_tablesr   r   r   r   r   r   ru   r   r   r   r   r   r   r$   r.   r5   rH   rR   rY   r]   rk   rz   r   r   r   r   r   r   r   __name__r   r   r   <module>r     sg   Q "     
  3tH~--/667 8 1 P P H~''*
Ul
I w' 85 0
00 0 	0
 0 0 
0B?*( 8	88 8 	8
 8 8 8 (8 8 8 8v'	'' ' 	'
 ' ' ' ' (' 
'T<	<< < 	<
 "< < 
<~EP 25 i, zF r   