
    Jjhz                       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
  ee      j                         j                  d   Zedz  ZdZ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d,dZd-dZd.dZ	 	 	 	 	 	 	 	 	 	 d/dZ d0dZ!	 	 	 	 	 	 	 	 	 	 	 	 	 	 d1dZ"	 	 	 d2	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d3dZ#d4dZ$d4dZ%edfd5dZ&d6dZ'e(d k(  r e'        yy)7z@Summarize the original EXE title/start selected-pointer context.    )annotationsN)Path)Any   outz2:0
0x00540714c                L   d| i}|j                  |j                         D ci c]  \  }}|	|dk7  s|| c}}       g }|j                         D ]6  \  }}t        |      j                  dd      }|j	                  | d|        8 ddj                  |      z   S c c}}w )Nmap ,z%2C=z../web/game.html?&)updateitemsstrreplaceappendjoin)map_nameparamsquerykeyvaluepairstexts          B/home/exedev/hwanse/tools/summarize_runtime_title_start_context.pyweb_urlr      s    HE	LLv||~ceARW\`bWb#u*cdEkkm &
U5z!!#u-uAdV_%& %00 ds   
B 
B 
B 
c                    | j                         s|S 	 t        j                  | j                  d            S # t        t        j
                  f$ r |cY S w xY w)Nutf-8encoding)existsjsonloads	read_textOSErrorJSONDecodeError)pathfallbacks     r   	load_jsonr*      sN    ;;=zz$..'.:;;T))* s   $9 AAc                    |rd|vry |j                  dd      \  }}	 t        |      }t        |      }| D ]/  }|j                  d      |k(  s|j                  d      |k(  s-|c S  y # t        $ r Y y w xY w)N:r   groupslot)splitint
ValueErrorget)	selectorsselector
group_text	slot_textr-   r.   rows          r   selector_rowr8   &   s    s(*$NN32J	J9~  777u$D)@J   s   A) )	A54A5c                |    i }| D ])  }|j                  d      }t        |t              s%|||<   + t        |      |fS )NselectedPointer)r2   
isinstancer0   sorted)r3   contextsr7   roots       r   selector_rangesr?   5   sJ    H !ww()dC  HTN! (X%%    c                   | |sy t        j                  ||       dz
  }|dk  ry ||   }|dz   t        |      k  r||dz      n|dz   }| |k\  ry ||   }|j                  d       d|j                  d       d|dd|dd	| |z
  d
dS )Nr   r   i @  r-   r,   r.   0x08xz+0xx)r4   rootHex
rootEndHexrelativeOffsetHex)bisectbisect_rightlenr2   )varootsr=   indexr>   endr7   s          r   selector_context_for_varO   >   s    	zr*Q.Eqy<D#ai#e*4%	
$-C	Sy
4.Cwww'(#''&/):;Sz?3s)n"29Q-0	 r@   c                @    | sy 	 t        | d      S # t        $ r Y y w xY w)N   )r0   r1   )r   s    r   int_hexrR   Q   s+    5"~ s    	c                n    | D cg c]%  }|j                  d      s|j                  d      ' c}S c c}w )Nfilenamer2   )rowsr7   s     r   plain_cns_namesrW   Z   s*    +/GC377:3FCGGJGGGs   22c                   g }t        | t              rB|j                  |        | j                         D ]  }|j	                  t        |              |S t        | t              r!| D ]  }|j	                  t        |              |S N)r;   dictr   valuesextendwalk_objectslist)r   foundchilds      r   r]   r]   ^   s{    E%U\\^ 	.ELLe,-	.
 L 
E4	  	.ELLe,-	.Lr@   c                   |sg S g }t               }t        |       D ]  }|j                  d      xs i }||j                  d      xs g vr0|j                  d      }||v rF|j                  |       |j	                  |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      d	        t        |d
       S )NselectorRootContextlabelsvaHex	operation	opcodeHexmeaningnextDwordHexnextDwordCns)rd   re   rf   rg   rh   ri   c                ,    | j                  d      xs dS )Nrd   r   rU   )r7   s    r   <lambda>z#rows_for_selector.<locals>.<lambda>   s    (8(>B r@   r   )setr]   r2   addr   r<   )selection_writersr4   rV   seenr7   contextr   s          r   rows_for_selectorrr   j   s    	D5D-. ''/06BGKK17R8ggg$;WWW%--wwy)GGN3GGN3
 	  $>??r@   c                    t        | |      }|s|g g ddS ||j                  d      |j                  d      xs g t        |j                  d      xs g       |j                  d      xs g dS )Nr   )r4   	fieldMaps	linkedCnsfieldMapCountselectedPointerHexrt   ru   )r4   rw   rt   rv   ru   )r8   r2   rJ   )r3   r4   r7   s      r   selector_summaryrx      s{    
y(
+C 	
 	
 !gg&:;WW[)/RSWW[17R8WW[)/R r@   c                p    | D ci c]&  }|j                  d      s|j                  d      |( c}S c c}w )NnamerU   )cns_payloadsr7   s     r   payload_lookupr|      s-    ,8LSCGGFOCGGFOS LLLs   33c           	         |j                  |       xs i }| |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      dS )NkindwidthheightbpppaletteColorsdecodedSize)rz   r~   r   r   r   r   r   rU   )rz   payloadspayloads      r   payload_summaryr      sj    ll4 &BGF#W%++h'{{5! _5{{=1 r@   c                    t               }g }| D ]5  }|r||v r
|j                  |       |j                  t        ||             7 |S rY   )rm   rn   r   r   )namesr   rp   rV   rz   s        r   payload_summariesr      sN    5DD 5tt|OD(34	5
 Kr@   c                    | j                  d      6| j                  d      %| j                  d       d| j                  d       nd}| j                  d       d| j                  d       d| S )Nr   r   rD   -rz   r,   r~   rU   )r7   sizes     r   payload_labelr      sx     777'CGGH,=,I 777
Acggh/01 	
 ggfoa0$88r@   c           
     (   g }| D ]  }|j                  d      |k7  r|j                  d      }|j                  |j                  d      t        |||      |j                  d      |j                  d      xs g |j                  d      d        |S )Nr
   recordVarecordVaHex
sceneIdHextilesetsresourceSource)r   selectorContextr   r   r   )r2   r   rO   )manifestr   rL   r=   rV   r7   	record_vas          r   manifest_records_forr      s     D 
775>X%GGJ'	77=16y%R'',/
+1r!gg&67
 		
 Kr@   c                l   i }| D ]  }|j                  d      xs g D ]o  }|j                  d      xs i }|j                  d      xs d}|j                  |||j                  d      |j                  d      dg g g g d      }|d	xx   d
z  cc<   |j                  d      |d   vr#|d   j                  |j                  d             |j                  d      r#|d   j                  |j                  d             |j                  d      r9|j                  d      |d   vr#|d   j                  |j                  d             dj                  |j                  d      xs g       }|sS||d   vs\|d   j                  |       r  |j	                         D ]i  }t        d |d   D              |d<   t        |d         |d<   t        |d         |d<   t        |d         |d<   |d   sT|d   d    d|d   d    |d<   k dd
dddt        |j	                         fd      S )Nrecordsr   r4   outside-selector-rangesrE   rF   r   )r4   rE   rF   recordCountmaps	recordVassceneIdstilesetFamiliesr   r   r
   r   r   r   r   r   r   r   r   c              3  &   K   | ]	  }|s|  y wrY    .0rz   s     r   	<genexpr>z"record_clusters.<locals>.<genexpr>   s      J$T Js   z..recordSpanHex   c   )8:0z16:0z11:0r   c                8    j                  | d   d      | d   fS )Nr4   2   rU   )r7   orders    r   rk   z!record_clusters.<locals>.<lambda>   s#    eiiJQS6TVYZdVe5f r@   rl   )r2   
setdefaultr   r   r[   r<   )	candidate_rowsclusters	candidaterecordrq   labelclusterr   r   s	           @r   record_clustersr      sO    "H# <	mmI.4" 	<Fjj!239rGKK
+H/HE)) %&{{95")++l";#$!# "')	G M"a'"}}U#76?:&&y}}U';<zz-($++FJJ},EFzz,'FJJ|,DGT^L_,_
#**6::l+CDxx

: 6 <"=HHG4E,FF)*11(;3	<<6 ??$ `  J'&/ JJ%gk&:;$WZ%89
%+G4E,F%G!";*1+*>q*A)B"W[EYZ\E]D^'_GO$` q!KE(//#)fggr@   c                H   t        |      }t        |      }g }t        |       D ]  \  }	}
t        ||
||      }|r|d   ni }|j                  |	dz   |
|t	        |      t        |D ch c]%  }|j                  d      s|j                  d      ' c}      |D cg c]%  }|j                  d      s|j                  d      ' c}|j                  d      xs g |j                  d      |
|v |
|v t        |
dddd      t        |
dd	      d
|
 d        |S c c}w c c}w )Nr   r   r   r   r   r      )	saveGroupsaveSloteventsoverview)r   r   z../web/map_review.html?map=)r   r
   r   r   r   r   r   r   inWebConfirmedReachable inSaveSelectorCandidateReachableopenUrlwalkUrl	reviewUrl)rm   	enumerater   r   rJ   r<   r2   r   )
field_mapsr   confirmed_reachablecandidate_reachablerL   r=   	confirmedr   rV   rM   r   r   first_recordr   s                 r   candidate_mapsr      s0    '(I'(ID$Z0 x&x5(K%,wqz"QYw<wkVRXR\R\]iRj

< 8klBIgVZZXeMf&**]3g$((4:*../?@'/9'<08I0Ex1qUVWx1qA6xjA
 	$ K  lgs   %D<DD0Dc           	     `  2 | j                  d      2t        |2      }t        |      \  }	}
| j                  d      xs |xs i j                  d      xs g }| j                  d      xs |xs i j                  d      xs g }|j                  d      }|j                  d      xs g }|j                  d      xs g }t        |      }t	        |j                  |            }t	        |j                  |            }t        ||xs g |||	|
      }t        |      }|j                  d	      xs i }|j                  d
      xs i }|j                  d      }t        | j                  d      xs g       }|j                  d      }|j                  d      }| j                  d      }|xs i j                  d      xs |xs i j                  d      }t        |      }t        2fd|D        i       }|j                  d      xs g D cg c]  }t        |       } }| D cg c]  }||	 } }| rdt        |       ddt        |       dnd }!| j                  d      xs g }"|"D #cg c]  }#t        |#j                  d             }$}#|$D cg c]  }||	 }$}|$rdt        |$      ddt        |$      dnd }%| j                  d      xs g D &cg c]  }&|&j                  d      dv r|& }'}&t        ||      }(t        |xs i |      })t        |xs g       }*t	        |(j                  d      |)D cg c]%  }|j                  d      s|j                  d      ' c}z   D +ch c]  }+|+r|+ c}+      },i d|j                  d      d|j                  d      d|j                  d      xs i j                  d       d!|d"|(j                  d      d#|(j                  d$      d%|(j                  d      d&|(j                  d      d'|)d(t!        d) |)D              d*t!        d+ |)D              d,|,d-t#        |,|*      d.|j                  d/      d0|r|(j                  d$      d1k(  rd2nd3d4d5}-t%        |d uxr | xr |t        |       kD        }.t%        |d uxr) |$xr% t        |$      |cxk  xr t        |$      d6z   k  nc       }/2d7k(  r|.r|/rd8nd9}0d:}1i d;d<d |d=| j                  d>      d?2d@|dA| j                  dB      dC| j                  dC      dDt&        dEt(        d|d$t+        |      dF|dG|dH|!dI|%dJ|'dK|-i dL|.dM|/dN|0dO|d|dPt#        ||*      dQdR|v dS|j                  d      dT|j                  d      dU|j                  d      xs i j                  d       dV|j                  d      dW|j                  d/      dX|dY|j                  dZ      d[|d\|d]|||d5d^|1d_S c c}w c c}w c c}#w c c}w c c}&w c c}w c c}+w )`NselectedPointerContextSelectorselectedPointerContextFieldMapsrt   selectedPointerContextResourcesru   startMapreachableFromStart'saveSelectorCandidateReachableFromStartbaselineSelectedPointerContextfinalSelectedPointerContextr4   nearbyCnsStringssequenceCountanyReachedRouteSelectorContextselectedPointerStaticValueHexrw   rE   c              3  L   K   | ]  }|j                  d       k(  s|  yw)r4   NrU   )r   r   selected_selectors     r   r   z build_summary.<locals>.<genexpr>E  s"     n'ZAX\mAmgns   $$r   rB   rC   z..0xrd   nearbySelectionWriterRowsri   >   aaa.cnscompile.cns	title.cnsfromPointerHex baselineSelectedPointerStaticHexfromSelectortoPointerHexfinalSampleselectedPointerStaticHex
toSelectortoSelectedRootHextoFieldMapCountrv   toFieldMapstoLinkedCnstoSelectionRowstoSelectionReaderCountc              3  J   K   | ]  }|j                  d       dk(  sd  yw)re   readerr   NrU   r   r7   s     r   r   z build_summary.<locals>.<genexpr>k  "     %kC#''R]J^bjJja%k   ##toSelectionWriterCountc              3  J   K   | ]  }|j                  d       dk(  sd  yw)re   writerr   NrU   r   s     r   r   z build_summary.<locals>.<genexpr>l  r   r   toReferencedCnstoResourcePayloadskeyBufferChangedSelectedPointer#keyBufferPokeChangedSelectedPointerclassificationr   znon-field-map-resource-contextzfield-map-or-unresolved-contextpromotionStatuszdiagnostic-only   r   z$title-resource-tail-not-field-recordzselector-context-unresolveda6  The original EXE runtime title/start sample resolves to selector 8:0, but the live pointer is past selector 8:0's map5_* field-record cluster and lands near the compile/aaa/title resource tail. The map5_* field records are duplicated in selector 16:0 and 11:0 too, so they are reused scene lists rather than a unique new-game start proof. The current web confirmed start remains map1_02b and confirmed progression reaches only map1_02b -> map1_01a. This separates title/start diagnostics from the blocked map1_01a -> map2_02d route and does not promote selector 2:0.	objectivez\classify the original EXE title/start selected-pointer context against the current web routeselectedPointerRuntimeHexselectedPointerRuntimeValueHexselectedPointerSelectorselectedPointerRootHexselectedPointerRangeHexselectedPointerContextRangeHex%selectedPointerEqualsCurrentRouteRootcurrentRouteSelectorcurrentRouteRootHexcandidateMapsrecordClustersselector8FieldRecordSpanHextitleResourceTailSpanHextitleResourceWriterRowsinputTransitionContext%livePointerAfterSelector8FieldRecords livePointerNearTitleResourceTaillivePointerClassification	resourcesnearbyCnsPayloadshasTitleResourceNearbyr   inputProbeBaselinePointerHexinputProbeBaselineSelectorinputProbeFinalPointerHexinputProbeFinalSelector)inputProbeKeyBufferChangedSelectedPointerkeySequenceCountkeySequenceReachedCurrentRootanyReachedCurrentRoot&keySequenceReachedRouteSelectorContextwebConfirmedStartMapwebConfirmedReachableF)#webConfirmedOverlapWithTitleContext,saveSelectorCandidateOverlapWithTitleContextr   routePromotionAllowed
conclusion)r2   r8   r?   rm   r<   intersectionr   r   rW   rR   nextminmaxrx   rr   r|   sumr   boolCURRENT_ROUTE_SELECTORCURRENT_ROUTE_ROOT_HEXrJ   )3runtime_memory_contextruntime_input_proberuntime_key_sequence_probeplayable_progressr3   scene_manifestro   r{   r7   rL   r=   r   r	  web_start_mapr   r   	field_setconfirmed_overlapcandidate_overlap
candidatesr   baseline_contextfinal_contextfinal_selector
nearby_cnskey_sequence_countreached_routeselected_pointerselected_rootlive_pointerselector8_clusterr   selector8_record_vas
field_spannearby_rowsitem
nearby_vastitle_tail_spanr   title_resource_writersfinal_selector_summaryfinal_selector_rowsr   rz   final_selector_cnsinput_transitionlive_after_field_recordslive_near_title_taillive_pointer_classificationr  r   s3                                                     @r   build_summaryrE    sc    /223ST
y"3
4C%i0OE8""#DE 	I2??;'	  	""#DE 	I2??;'	 
 &))*5M+//0DEK+//0YZ`^`JIy556IJKy556IJK"J z*H*../OPVTV'++,IJPbM"&&z2N !7!;!;<N!O!USUVJ377H.223STM-112QRYBOO$89d>N>TRT=Y=YZc=dM+,LnXnprs8I8M8Mk8Z8`^`auGENaa/CYeuGXEYY   S%&s+44H0I#/NO%)  ),,-?@FBK9DE'$((7+,EJE%/EE53D%EJE  S_S!c*oc%:; 
 4778STZXZ::n%)PP 	  .iH+,=,C^Tl0b1H"&&{32Ea3Q_I`sww~&ab! 	 	! -112TU(,,Z8 	,00?E2JJKef 	n	
 	3778LM 	155oF 	-11+> 	-11+> 	. 	!#%k3F%k"k 	!#%k3F%k"k 	- 	/0BHM 	*+>+B+BCh+i 	"8"<"<_"MQR"R -2%( 	,),  $D  	5 	53344 
  D  	F	F
O|Es:/EE %*BG[ 	/*  	q (s("$4( 	$%;%?%?@`%a( 	"#4	(
 	!-( 	"#9#=#=>^#_( 	01G1K1KLs1t( 	 6( 	5( 	Z( 	Z( 	( 	(( 	&z( 	#O(  	"#9!(" 	!"2#($ 	01I%(& 	+,@'(( 	$%@)(* 	Y+(, 	J-(. 	.z8D/(0 	!+";1(2 	'(;(?(?@b(c3(4 	%&6&:&::&F5(6 	$&9&=&=m&L&RPR%W%WXr%s7(8 	"=#4#4Z#@9(: 	45H5L5LMr5s;(< 	.=(> 	()C)G)GH_)`?(@ 	1-A(B 	C(D 	 !4E(F 0A8I,!& O( (Q bY FE
 b!s<   X%X-X,!XXXX!:X&
X&
+X+c                >   ddd| j                  d       dd| j                  d       dd| j                  d	       dd
| j                  d       dd| j                  d       dd| j                  d       d| j                  d       d| j                  d       dddj                  | j                  d      xs g       xs d ddj                  | j                  d      xs g       xs d d| j                  d       d| j                  d       d| j                  d      xs i j                  d        d!| j                  d      xs i j                  d"       dd#| j                  d      xs i j                  d$       dd%| j                  d&       dd'| j                  d(       dd)| j                  d*       dd+| j                  d,       dd| j                  d-      xs ddd.dd/d0g}| j                  d1      xs g D ]  }|j                  d2|j                  d3       d4|j                  d5       d6t        |j                  d7      xs g        d8|j                  d9      xs d: d4dj                  |j                  d;      xs g       xs d: d6d<j                  |j                  d=      xs g       xs d: d>        |j	                  g d?       | j                  d@      xs g D ]  }|j                  dA|j                  dB       d8|j                  dC       d4dj                  |j                  d;      xs g       xs d: d6|j                  d5       d6dj                  |j                  dD      xs g       xs d: d6|j                  dE       d6|j                  dF       dG|j                  dH       dI|j                  dJ       dK|j                  dL       dM        |j	                  g dN       | j                  d      xs i }|j	                  dO|j                  d        dP|j                  dQ       ddR|j                  d"       dP|j                  dS       ddT|j                  dU       ddV|j                  dW       dXdj                  |j                  dY      xs g       xs d: dZdj                  |j                  d[      xs g       xs d: d\dj                  d] |j                  d^      xs g D              xs d: d_|j                  d`       da|j                  db       ddc|j                  d$       dddddeg       |j                  df      xs g D ]  }|j                  d2|j                  dg       d4|j                  dh       d8|j                  di       dj|j                  dk      xs |j                  dl      xs d: d4|j                  dm      xs d: d>        |j	                  g dn       |j	                  do | j                  dp      xs g D               |j	                  g dq       |j	                  dr | j                  ds      xs g D               |j                  d       dtj                  |      S )uNz# Runtime Title Start Contextr   z- selected pointer: `r   `z- selected selector: `r   z- selected root: `r   z- current route selector: `r   z- current route root: `r   z- equals current route root: r   z- title resource nearby: r  z- web confirmed start: `r  z,- web confirmed overlap with title context: , r  nonez#- save-selector candidate overlap: r  z- key sequence count: r  z%- key sequence reached selector 2:0: r  z- input transition: `r  r   z -> r   z$- input transition classification: `r   z - live pointer classification: `r  z#- selector 8:0 field-record span: `r  z- title resource tail span: `r  z- promotion status: `r   r  z## Record Clustersz;| selector | records | maps | span | scene ids | tilesets |z'| --- | ---: | ---: | --- | --- | --- |r  z| `r4   z` | r   z | r   z | `r   r   r   ; r   z |)r   z## Candidate Mapsr   z_| order | map | scene ids | records | tilesets | confirmed | candidate | open | walk | review |z?| ---: | --- | --- | ---: | --- | --- | --- | --- | --- | --- |r   z| r   r
   r   r   r   z
 | [open](r   z) | [walk](r   z) | [review](r   z) |)r   z## Input Transition Contextr   z	- from: `z` `r   z- to: `r   z- to selected root: `r   z- to field maps: r   z- to linked CNS: r   z- to referenced CNS: r   z- to resource payloads: c              3  2   K   | ]  }t        |        y wrY   r   r   s     r   r   zmarkdown.<locals>.<genexpr>  s     ,vC]3-?,v   r   z- selection rows: readers `r   z` / writers `r   z- classification: `z%| va | op | opcode | next | meaning |z| --- | --- | --- | --- | --- |r   rd   re   rf   z` | `ri   rh   rg   )r   z## Field Mapsr   c              3  (   K   | ]
  }d | d  ywz- `rG  Nr   r   s     r   r   zmarkdown.<locals>.<genexpr>  s     J43tfAJ   rt   )r   z## Nearby CNS Stringsr   c              3  (   K   | ]
  }d | d  ywrO  r   r   s     r   r   zmarkdown.<locals>.<genexpr>  s     Q43tfAQrP  r   
)r2   r   r   rJ   r\   )summarylinesr7   
transitions       r   markdownrV    s$   '

,F GHJ
 -F!G HJ
W[[)ABC1E
%gkk2H&I%J!L
!'++.C"D!EQG
'4[(\']^
#GKK0H$I#JK
"7;;/E#F"GqI
6tyyMrAsAywy7z  8E  E  7F  	G
-diiDr8s8ywy.z  /E  E  .F  	G
 -?!@ AB
/<d0e/fg
-E!F!L" Q QR` abbfhohshs  uM  iN  iT  RT  hY  hY  Zf  hg  gh  hi  	j
.<T0U0[Y[/`/`aq/r.sstu
*7;;7R+S*TTUV
-gkk:W.X-YYZ[
'4N(O'PPQR
,= >?qA
L!'R

E17E: {{+,2 
#''*%&d377=+A*B#3776?(b)*$sww/G/N3.Otyy,23:s;3yy!239r:AcB"F	

 
LL   {{?+1r 
!"$swwu~&6dyy,23:s;3ww}%&cyy,23:s;3ww012#ww9:; <ggi() *ggi() *,-S2
	

 
LL  
 56<"J	LL
JNN>233z~~FV7W6XXYZ
*.../s:>>.3Q2RRST

/B CDAF
JNN+<=>?
DIIjnn]&C&IrJQcRS
		*..9J*K*Qr R YVYZ[
"499,v:>>ZnKoKusu,v#v#}z}"~
%jnn5M&N%O}]g]k]k  mE  ^F  ]G  GH  	I
jnn-=>?qA
/)  ~~/06B 
#'''"#4(<'=T#''+BVAW X'I377>+BIcJ$swwW`OaOhehNiikm	


 
LL  
 
LLJ7;;{+C+IrJJ	LL23	LLQ7;;7I+J+PbQQ	LL99Ur@   c                   dj                  d | j                  d      xs g D              }dj                  d | j                  d      xs g D              }dj                  d | j                  d      xs g D              }dj                  d | j                  d	      xs g D              }| j                  d
      xs i }dj                  d |j                  d      xs g D              }dj                  g dddddt        j                  t	        | j                  d                   ddt        j                  t	        | j                  d                   ddt        j                  t	        | j                  d                   ddt        j                  t	        | j                  d                   ddt        j                  t	        | j                  d                   ddt        j                  t	        | j                  d                   dd t        j                  t	        | j                  d!                   dd"t        j                  d#j                  | j                  d$      xs g       xs d%       dd&t        j                  d#j                  | j                  d'      xs g       xs d%       dd(t        j                  t	        | j                  d)                   dd*t        j                  t	        | j                  d+                   dd,t        j                  t	        |j                  d-                   d.t        j                  t	        |j                  d/                   dd0t        j                  t	        |j                  d1                   dd2t        j                  t	        | j                  d3                   dd4t        j                  t	        | j                  d5                   dd6t        j                  t	        | j                  d7                   dd8t        j                  t	        | j                  d9                   dd:d;t        j                  t	        | j                  d<      xs d             d=d>d?|d@dAdB|d@dCdDt        j                  t	        |j                  d-                   dEt        j                  t	        |j                  dF                   dGt        j                  t	        |j                  d/                   dEt        j                  t	        |j                  dH                   dIt        j                  t	        |j                  dJ                   dKt        j                  d#j                  |j                  dL      xs g       xs dM       dNt        j                  d#j                  |j                  dO      xs g       xs dM       dPt        j                  d#j                  dQ |j                  dR      xs g D              xs dM       dSt        j                  t	        |j                  d1                   dTdU|d@dVd| d:dWd| d:      S )XNr   c              3  `   K   | ]&  }d t        j                  t        |             d ( ywz
<li><code></code></li>Nhtmlescaper   r   s     r   r   zhtml_page.<locals>.<genexpr>  s/       T[[T+,L9   ,.rt   c              3  `   K   | ]&  }d t        j                  t        |             d ( ywrY  r[  r   s     r   r   zhtml_page.<locals>.<genexpr>  s/       T[[T+,L9r^  r   c              3    K   | ]I  }d t        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        t	        |j                  d      xs g                    dt        j                  t        |j                  d      xs d             dt        j                  d	j                  |j                  d
      xs g       xs d       dt        j                  dj                  |j                  d      xs g       xs d       d L yw)<tr><td><code>r4   </code></td><td>r   	</td><td>r   </td><td><code>r   r   rH  r   rJ  r   
</td></tr>N)r\  r]  r   r2   rJ   r   r   s     r   r   zhtml_page.<locals>.<genexpr>  s     
 	[[SWWZ%8!9:; <{{3sww}5678 9{{3s3776?#8b9:;< =[[SWW_%=%D!EFG H{{499SWWZ%8%>B?F3GH I{{499SWW->%?%E2FM#NO P	
s   EEr  c              3    K   | ]  }d t        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  dj	                  |j                  d      xs g       xs d       dt        j                  t        |j                  d	                   dt        j                  dj	                  |j                  d
      xs g       xs d       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t        j                  t        |j                  d                   d  yw)z<tr><td>r   rd  r
   rb  rH  r   r   rc  r   r   r   r   z</td><td><a href="r   z">open</a></td><td><a href="r   z">walk</a></td><td><a href="r   z">review</a></td></tr>N)r\  r]  r   r2   r   r   s     r   r   zhtml_page.<locals>.<genexpr>*  s      	{{3swww/012 3[[SWWU^!456 7{{499SWWZ%8%>B?F3GH I{{3sww}5678 9{{499SWWZ%8%>B?F3GH I{{3sww'@ABCD E{{3sww'IJKLM NS);%<=> ?S);%<=> ?S)=%>?@ A	s   G7G9r   r  c              3  (  K   | ]	  }d t        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d      xs |j                  d      xs d	             dt        j                  t        |j                  d
      xs d	             d  yw)ra  rd   rb  re   rd  rf   z</code></td><td><code>ri   rh   r   rg   re  N)r\  r]  r   r2   r   s     r   r   zhtml_page.<locals>.<genexpr>:  s      	 	[[SWWW%5!678 9{{3sww{3456 7[[SWW[%9!:;< =[[SWW^%<%^@W%^[^!_`a b{{3swwy18S9:; <		s   DDr   rR  zO<!doctype html><meta charset="utf-8"><title>Runtime Title Start Context</title>z<style>body{font-family:system-ui,sans-serif;background:#111;color:#eee;max-width:1100px;margin:24px auto}table{border-collapse:collapse;width:100%}td,th{border:1px solid #444;padding:6px 8px;vertical-align:top}a{color:#9bd4ff}code{color:#9bd4ff}</style>z$<h1>Runtime Title Start Context</h1>z<ul>z<li>selected pointer: <code>r   rZ  z<li>selected selector: <code>r   z<li>selected root: <code>r   z<li>current route root: <code>r   z<li>equals current route root: r   z</li>z<li>title resource nearby: r  z<li>web confirmed start: <code>r  z.<li>web confirmed overlap with title context: rH  r  rI  z%<li>save-selector candidate overlap: r  z<li>key sequence count: r  z'<li>key sequence reached selector 2:0: r  z<li>input transition: <code>r   z -&gt; r   z+<li>input transition classification: <code>r   z'<li>live pointer classification: <code>r  z*<li>selector 8:0 field-record span: <code>r  z$<li>title resource tail span: <code>r  z<li>promotion status: <code>r   z</ul>z<p>r  z</p>z<h2>Record Clusters</h2>z<table><thead><tr><th>selector</th><th>records</th><th>maps</th><th>span</th><th>scene ids</th><th>tilesets</th></tr></thead><tbody>z</tbody></table>z<h2>Candidate Maps</h2>z<table><thead><tr><th>order</th><th>map</th><th>scene ids</th><th>records</th><th>tilesets</th><th>confirmed</th><th>candidate</th><th>open</th><th>walk</th><th>review</th></tr></thead><tbody>z!<h2>Input Transition Context</h2>z<p>From <code>z</code> <code>r   z</code> to <code>r   z!</code>. Final field maps: <code>r   z</code>; linked CNS: <code>r   r   z</code>; referenced CNS: <code>r   z</code>; payloads: <code>c              3  2   K   | ]  }t        |        y wrY   rL  r   s     r   r   zhtml_page.<locals>.<genexpr>j  s     0zs1C0zrM  r   z</code>; classification: <code>z</code>.</p>zh<table><thead><tr><th>va</th><th>op</th><th>opcode</th><th>next</th><th>meaning</th></tr></thead><tbody>z<h2>Field Maps</h2>z<h2>Nearby CNS Strings</h2>)r   r2   r\  r]  r   )rS  field_items	cns_itemscluster_rowsr   rU  transition_rowss          r   	html_pagerm    s   '' KK,2 K  KK 239r I 77 
 ;;/06B
 
L WW  ;;/52 N 56<"Jgg 	 >>"34:	 	O 99 /[/ 	I/ 	// 		/
 't{{3w{{C]7^3_'`&aamn/ (CD]8^4_(`'aamn/ $DKKGKK@X4Y0Z$[#\\hi/ )SEZ9[5\)](^^jk/ *$++c'++Fm:n6o*p)qqvw/ &dkk#gkkBZ6[2\&]%^^cd/ *$++c'++F\:]6^*_)``lm/ 9TYYw{{  \A  PB  PH  FH  FI  FS  MS  :T  9U  UZ  	[/ 0DIIgkk  SA  GB  GH  FH  =I  =S  MS  1T  0U  UZ  	[/ #4;;s7;;?Q3R/S#T"UUZ[/ 2$++c'++NvBw>x2y1zz  	A/  't{{3z~~n7U3V'W&XX_`d`k`klopzp~p~  @L  qM  mN  aO  `P  P\  	]!/" 6dkk#jnnUeFfBg6h5iiuv#/$ 2$++c'++NiBj>k2l1mmyz%/& 5T[[W[[QnEoAp5q4rr~'/( /t{{3w{{Ke?f;g/h.iiuv)/* 't{{3w{{CT7U3V'W&XXde+/, 	-/. dkk#gkk,7=2>?@E//0 	#1/2 	O3/4 	5/6 	7/8 	"9/: 	K;/< 	=/> 	?/@ 	,A/B S)G%HIJ.Y]YdYdehisiwiw  yI  jJ  fK  ZL  YM MKKJNN<$@ ABC>RVR]R]^ablbpbpq  cA  _B  SC  RD D##';;s:>>BS3T/U#V"W X![[:>>-3P3VTV)W)^[^_` a!!%TYYz~~FW7X7^\^-_-fcf!g h i;;tyy0zz~~^rOsOywy0z'z  (B  B  C  D D!!%S@P1Q-R!S TT`	bC/P 	sQ/R 	S/T 	U/V 	W/X {m5!Y/Z 	&[/\ yk]/ / /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 runtime_title_start_context.jsonFr   )ensure_asciiindentrR  r   r    )mkdir
write_textr#   dumpsparentrm  )rS  out_dirhtml_outjson_outs       r   write_outputsrz  v  s    MM$M.;;H

7q9D@   dT:Ig.AOr@   c                    t        j                  t              } | j                  dt        t
               | j                  dt        d d       | j                         }t        t        |j                  dz  i       t        |j                  dz  i       t        |j                  d	z  i       t        |j                  d
z  i       t        |j                  dz  g       t        |j                  dz  g       t        |j                  dz  i       t        |j                  dz  g             }t        ||j                  |j                        }t        d|        y )N)descriptionz	--out-dir)typedefaultz
--html-outzHOptional legacy HTML output path. JSON is the default retained artifact.)r}  r~  helpz$runtime_memory_snapshot_context.jsonzruntime_input_path_probe.jsonzruntime_key_sequence_probe.jsonzplayable_progress.jsonzsave_scene_selectors.jsonzscene_manifest.jsonz$save_selector_selection_writers.jsonzcns_payloads.jsonz%wrote runtime title start context -> )argparseArgumentParser__doc__add_argumentr   OUT
parse_argsrE  r*   rw  rz  rx  print)parserargsrS  ry  s       r   mainr    s(   $$9F
$<
W	   D$,,!GGL$,,!@@"E$,,!BBBG$,,!992>$,,!<<bA$,,!66;$,,!GGL$,,!44b9	G WdllDMMBH	1(
<=r@   __main__)r   r   r   r   returnr   )r(   r   r)   r   r  r   )r3   
list[dict]r4   
str | Noner  dict | None)r3   r  r  z!tuple[list[int], dict[int, dict]])rK   
int | NonerL   	list[int]r=   dict[int, dict]r  r  )r   r  r  r  )rV   r  r  	list[str])r   r   r  r  )ro   rZ   r4   r  r  r  )r3   r  r4   r  r  rZ   )r{   r  r  dict[str, dict])rz   r   r   r  r  rZ   )r   r  r   r  r  r  )r7   rZ   r  r   )
r   r  r   r   rL   r  r=   r  r  r  )r   r  r  r  )r   r  r   r  r   r  r   r  rL   r  r=   r  r  r  )NNN)r#  rZ   r$  rZ   r%  rZ   r&  rZ   r3   r  r'  list[dict] | Nonero   r  r{   r  r  rZ   )rS  rZ   r  r   )rS  rZ   rw  r   rx  zPath | Noner  r   )r  None))r  
__future__r   r  rH   r\  r#   pathlibr   typingr   __file__resolvero  ROOTr  r!  r"  r   r*   r8   r?   rO   rR   rW   r]   rr   rx   r|   r   r   r   r   r   r   rE  rV  rm  rz  r  __name__r   r@   r   <module>r     s   F "       H~''*
Ul % 1&&H	@0$M
9  	
 *%hP # #	
   L )-%)&*` `` !%` 	`
 ` &` #` $` 
`FZz]@ 25d 
>0 zF r@   