
    *Kj=L                       d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	 ddl
mZmZmZ  ee      j                         j                   d   Zedz  Zed	z  Zed
z  ZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)d0d1d Z*d2d!Z+d3d"Z,d4d#Z-d5d$Z.d5d%Z/d6d&Z0d7d'Z1d8d(Z2d9d)Z3d:d*Z4d;d+Z5d<d,Z6d=d-Z7d>d.Z8e9d/k(  r e: e8             y)?a  Narrow the static frontier for the normal-field ESC/X HUD menu opener.

The region/window payloads and top-menu object sequence are already grounded.
This pass deliberately avoids re-decoding those payloads.  Instead it scans
the EXE at x86-function granularity and asks a narrower question:

* Do input-mask consumers and descriptor/menu materializers meet in the same
  function?
* If they do, is the function the known cancel/back handler, a movement
  controller, or a plausible normal-field open-menu producer?
    )annotationsN)Path)Any)offset_to_varead_sectionsva_to_offset   zHwanse2.exeoutwebiY iY iB it-B ivE ivE iPwE i0Y ipY i-D iC iA%C i##C ilM iG i$G i@ iA i-C iX iZY c                    | dS d| d| dS )N-0x0x )valuewidths     .tools/build_hud_menu_opener_frontier_review.pyhxr   9   s#    -3;r%%z):%;;    c                V    t        j                  | dd      S t        |       d      S )N T)quote)htmlescapestr)r   s    r   hr   =   s%    ;;U]r$GGE
$GGr   c                    	 t        j                  | j                  d            }t	        |t
              r|S i S # t        $ r i cY S w xY w)Nutf-8encoding)jsonloads	read_textFileNotFoundError
isinstancedict)pathdatas     r   	read_jsonr*   A   sL    zz$..'.:; dD)41r1  	s   %; A	A	c                V    | D ]  }|j                  d      dk(  s|c S  t        d      )Nname.textzmissing .text section)get
ValueError)sectionssections     r   text_sectionr2   I   s5     ;;v')N ,
--r   c                T   t        j                  d|      }g }|D ]  }|j                  d      dk7  rt        |d         }|t        |d         z   }| j	                  |||      }|dk7  sPt        ||      }	|	|j                  |	       | j	                  ||dz   |      }|dk7  r; |S )N<Ir,   r-   rawraw_sizer	   )structpackr.   intfindr   append)
exer0   r   needlerefsr1   startendposvas
             r   	text_refsrD   P   s    [[u%FD 
1;;v')GEN#c'*-..hhvuc*Rih,B~B((637C0C	 Ri
1 Kr   c                    t        j                  d|      }g }| j                  |      }|dk7  r:t        ||      }||j	                  |       | j                  ||dz         }|dk7  r:|S )Nr4   r7   r	   )r8   r9   r;   r   r<   )r=   r0   r   r>   r?   rB   rC   s          r   all_refsrF   a   sl    [[u%FD
((6
C
)(C(>KKOhhvsQw'	 )
 Kr   c           	     `   g }|D ]  }|j                  d      dk7  rt        |d         }|t        |d         z   }t        |t        ||dz
              D ]T  }| |   dk7  rt	        ||      }|t        j                  d| |dz         d	   }	|dz   |	z   |k(  sD|j                  |       V  |S )
Nr,   r-   r5   r6         z<ir	   r   )r.   r:   rangemaxr   r8   unpack_fromr<   )
r=   r0   	target_vahitsr1   r@   rA   offcall_varels
             r   
call_sitesrR   m   s    D %;;v')GEN#c'*-..E37 34 	%C3x4"8S1G$$T3a8;C{S I-G$	%% Kr   c                ^   t        |      }t        |d         }|t        |d         z   }g }|}	 | j                  d||      }|dk  rn%t        ||      }||j	                  |       |dz   }>t        t        |            }g }	t        |      D ]  \  }
}t        ||      }||
dz   t        |      k  r||
dz      nt        |d         t        |d         z   }|
dz   t        |      k  rt        ||      n|}||}|	j	                  |||t        ||      t        d||z
        d        |	S )Nr5   r6   s   Ur   r	   rC   )startVaendVastartOffendOffsize)r2   r:   r;   r   r<   sortedset	enumerater   lenrK   )r=   r0   r1   	raw_startraw_endstartsrB   hitrC   rowsindexstart_va	start_offnext_vanext_offs                  r   function_rangesrg      sd   8$GGEN#I#gj122GF
C
hhW57(C(>MM"Ag  CK F!#D$V, 
x 84	',qy3v;'>&#CPTDVY\]deo]pYqDq6;ai#f+6M<'2SZH 	# %i2Ax)34	

& Kr   c                d    | D ]+  }t        |d         |cxk  rt        |d         k  s'|c S  - y NrT   rU   r:   )	functionsrC   rows      r   find_functionrm      s?     s9~"8s3w<'88J 9 r   c                `    |t        | d         t        | d          j                  |      dk\  S )NrV   rW   r   )r:   r;   )rl   r=   patterns      r   contains_bytesrp      s1    s3z?#SX%78==gF!KKr   c                    t        | d         }t        | d         }|D cg c]  }||cxk  r|k  sn n| c}S c c}w ri   rj   )rl   r?   r@   rA   refs        r   refs_in_functionrs      s>    IE
c'l
C6C5C#5##5C666s   <<c                r   |j                         D ci c]5  \  }}t        | |      r$|t        | |      D cg c]  }t        |       c}7 }}}}|j                         D ci c]5  \  }}t        | |      r$|t        | |      D cg c]  }t        |       c}7 }}}}|D ch c]  }|j                  d      s| }	}|D ch c]  }|j                  d      s| }
}|D ch c]  }|j                  d      s| }}|D ch c]  }|j                  d      s| }}t	        |      }t        | d         }|t        k(  rd}d}d}ns|t        k(  rd	}d}d
}nc|t        k(  rd}d}d}nS|	r|r|
s	|sd}d}d}nD|
r|	s	|rd}d}d}n7|	r	|
rd}d}d}n,|	r	|rd}d}d}n!|rd}d}d}n|	rd}d}d}n|
rd}d}d}nd}d}d}t        | |d      }t        | |d       }t        |      t        t        | d!               | d"   |||||||d#
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 )$Nzinput.descriptor.ztopMenu.zmap.rT   known-cancel/back-handlerznegative-static-proofzfESC/X edge bit consumer, but it unwinds active descriptor state; this is cancel/back, not normal open.display-vm-base-pointer-binderz{Command byte selects a base pointer for the display/object VM; it reads input context but does not add the menu descriptor.+active-descriptor-field-movement-controllerzConsumes current input mask, active descriptors, and map collision data for field movement/collision; not an ESC/X menu opener.zfield-movement/controllerzcontext-onlyz6Input and map data meet in movement/collision context.zdescriptor-materializer-helperzEDescriptor helper/materializer context without direct input evidence.input+descriptor-intersectionzcandidate-reviewzRInput and descriptor data meet in one function; inspect manually before promotion.input+top-menu-intersectionzPInput and top-menu data meet in one function; inspect manually before promotion.ztop-menu-data-contextzTop-menu payload/data context.zinput-consumerzInput consumer only.zdescriptor-consumerzDescriptor consumer only.otherz:Reference/call context does not match the opener frontier.s   fY s   fY rU   rX   )
functionVaHexendVaHexrX   rolerefHitscallHitshasEdgeMaskReadhasCurrentMaskRead	promotionnote)
itemsrs   r   
startswithrZ   r:   KNOWN_CANCEL_HANDLER_VADISPLAY_VM_BASE_BINDER_VA%ACTIVE_DESCRIPTOR_FIELD_CONTROLLER_VArp   )rl   refs_by_namecalls_by_namer=   r,   r?   rr   ref_hits	call_hitsinput_namesdescriptor_names	top_names	map_namesmaterializer_callsrc   r~   r   r   has_cancel_bit_testhas_current_mask_reads                       r   classify_functionr      s    ',,. D$C& 	"23"=>3r#w>>H  (--/ D$C& 	"23"=>3r#w>>I 
 %-JD0I4JKJ)1TT__]5STT"*J$dooj.IJIJ"*F$doof.EFIFY3y>"H***+	w	.	./+	 M	:	:<+	 Q	+;I*"	G	+2D/"	V	).&	c	,&	a	&"	/	"	%	$"	*"	K(c3NO*35PQHs3w<()F.3  ? ?
 KTJFs^   #HH
H'#H
HH)H% H%
H*!H*+H/H/H4#H4HHc                    t         j                         } t        |       }t        | |      }t	        | |t
              t	        | |t              t	        | |t              t	        | |t              t	        | |t              t	        | |t              t	        | |t              t	        | |t              t	        | |t              t	        | |t              t	        | |t              t	        | |t               t	        | |t"              d}t%        | |t&              t%        | |t(              t%        | |t*              t%        | |t,              d}t/        |j1                         D ch c]  }|D ]  }|  c}}|j1                         D ch c]  }|D ]  }|  c}}z        }i }|D ]"  }t3        ||      }	|	s|	|t5        |	d         <   $ t/        |j1                         d       D 	cg c]  }	t7        |	|||        }
}	|
D 	cg c]  }	|	d   dv r|	 }}	|D 	cg c]  }	|	d   dvr|	d	   j9                  d
      r|	! }}	t;        | |t              }|d   }ddt=        t               dt?        |      t?        |
      tA        d |
D              tA        d |
D              t?        |      t?        |      t?        |      t?        |      |D cg c]  }tC        |       c}dd
|jE                         D ci c]  \  }}||D cg c]  }tC        |       c}! c}}}|jE                         D ci c]  \  }}||D cg c]  }tC        |       c}! c}}}||t/        |
D 	ch c]  }	|	d   	 c}	      D ci c]  tA        fd|
D               c}|
g dd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 c c}w )N)input.currentActionMaskinput.edgeActionMaskzdescriptor.activeCountzdescriptor.activeIdOrderzdescriptor.slotTablezdescriptor.slotPointerszdescriptor.objectPointerszdescriptor.rootTabletopMenu.objectSequenceztopMenu.intermediateRecordztopMenu.parentContextScriptzmap.collisionFlagsz	map.width)call.addDescriptorzcall.removeDescriptorzcall.rebuildDescriptorzcall.inputPackerrT   c                    t        | d         S )NrT   rj   )items    r   <lambda>zbuild_report.<locals>.<lambda>*  s    SiEY r   )keyr~   >   rv   rz   ry   rw   rx   >   rv   r   r   r   z&hwanse-hud-menu-opener-frontier-reviewz.tools/build_hud_menu_opener_frontier_review.pyz"normal-field-opener-still-unprovenc              3  R   K   | ]  }|d    j                         ddhz  sd ! yw)r   r   r   r	   N)keys.0rl   s     r   	<genexpr>zbuild_report.<locals>.<genexpr>J  s=       &NCYATATAVZs  vL  ZM  BMa  &Ns   ''c              3  L   K   | ]  }t        d  |d   D              sd  yw)c              3  >   K   | ]  }|j                  d         yw)ru   N)r   )r   r   s     r   r   z)build_report.<locals>.<genexpr>.<genexpr>K  s#       JClo#..YfJg  JCs   r   r	   N)anyr   s     r   r   zbuild_report.<locals>.<genexpr>K  s>       +Dc  JCsv  xA  tB  JC  GC1  +Ds   $$uU  x86 함수 단위 교집합에서도 normal-field ESC/X opener는 아직 증명되지 않았다. 입력 mask와 descriptor stack이 만나는 확정 함수는 cancel/back, display VM base binder, field movement/collision 계층으로 배제됐으며, top-menu object sequence 0x004ddc6c의 직접 ref는 여전히 data-context 1건뿐이다.)
functionCounttouchedFunctionCountinputFunctionCountdescriptorFunctionCountintersectionFunctionCountnormalOpenCandidateCounttopMenuSequenceTextRefCounttopMenuSequenceAllRefCounttopMenuSequenceAllRefsHexdecisionc              3  4   K   | ]  }|d    k(  sd  yw)r~   r	   Nr   )r   rl   r~   s     r   r   zbuild_report.<locals>.<genexpr>]  s     ECV1DaEs   )u   입력 bit 자체가 아니라 mode/state byte가 바뀐 뒤 0x62 add-descriptor가 실행되는 selected/root command stream을 찾아야 한다.u   topMenu sequence direct pointer는 data-only라서, parent/intermediate record를 고르는 selector table이나 descriptor id producer를 추적해야 한다.u   0x40/0x8a/0x87 계열 object VM selector producer가 +0x2f/+0x3d를 쓰는 위치는 이미 일부 확인됐으므로, 다음은 이 object가 어떤 descriptor id로 stack에 올라오는지 역추적한다.)kindsourcer=   statussummary
refsByNamecallsByNameintersectionFunctionsnormalOpenCandidates
roleCountsclassifiedFunctionsnextFrontier)#EXE
read_bytesr   rg   rD   CURRENT_ACTION_MASK_VAEDGE_ACTION_MASK_VAACTIVE_DESCRIPTOR_COUNT_VAACTIVE_DESCRIPTOR_ID_ORDER_VAACTIVE_DESCRIPTOR_SLOT_TABLE_VA"ACTIVE_DESCRIPTOR_SLOT_POINTERS_VA$ACTIVE_DESCRIPTOR_OBJECT_POINTERS_VADESCRIPTOR_ROOT_TABLE_VATOP_MENU_OBJECT_SEQUENCE_VATOP_MENU_INTERMEDIATE_RECORD_VA!TOP_MENU_PARENT_CONTEXT_SCRIPT_VAMAP_COLLISION_FLAGS_VAMAP_WIDTH_VArR   ADD_DESCRIPTOR_ROUTINE_VAREMOVE_DESCRIPTOR_ROUTINE_VAREBUILD_DESCRIPTOR_ROUTINE_VAINPUT_PACKER_VArY   valuesrm   r:   r   r.   rF   r   r\   sumr   r   )r=   r0   rk   r   r   r?   rC   touched_vascandidate_funcsrl   
classifiedintersectionsnormal_open_candidatestop_sequence_refs_alltop_sequence_text_refsrr   r,   r~   s                    `r   build_reportr     s
   
..
CS!HX.I $-S(<R#S )#x9L M"+C;U"V$-c8=Z$[ )#x9X Y#,S(<^#_%.sH>b%c )#x9Q R"+C;V"W&/X?^&_'0h@a'b'X7MNsHl;L  )h8QR!+C;W!X",S(<Y"Z&sHoF	M )<)<)>NN2"N"Nanauauaw  RHY]  CG  RH|~RT  RHRT  RH  H  IK13O 7Ir*36OCI/07 /0028YZ 	#|]C@J  
v; 
 
 	
M 
 !v;;;
O 45 	  %S(4OP)*BC 9B3x6 ^$'
O"%  &N:  &N  #N'*  +D
  +D  (D),]);(+,B(C+./E+F*-.C*D=R)Sc"S')Sm
" JVI[I[I]^^:4t6#bg66^JWJ]J]J_``JD$$73r#w77`!. 6 zBFBC
 #E:EEE
  *
?$ $C O  RH

0 *T 7^7`
  C
s`   N
N"N#=N($N-N2-N<:N7N<)O6OOO2O7N<Oc                l   | d   }d| d   fd|d   fd|d   fd|d   fd	d
|d    d|d    fg}dj                  d |D              }dj                  d | d   D              }dj                  d | d   D              }t        j                  | d      }dt        |d          d| d|xs d d| d| dS )Nr   r   ztouched funcsr   r   r   zopen candidatesr   ztop seq refsztext r   z / all r   r   c              3  X   K   | ]"  \  }}d t        |       dt        |       d $ yw)z<div class='card'><b>z
</b><span>z</span></div>Nr   )r   kvs      r   r   zrender_html.<locals>.<genexpr>r  s/     fX\XY[\/!vZ!v]Sfs   (*c              3  D  K   | ]  }d t        |d          dt        |d          dt        t        j                  |d   d             dt        t        j                  |d   d             dt        |d	          d
t        |j                  dd             d  yw)z<tr><td><code>r|   z</code><br>r~   z	</td><td>r   Fensure_asciir   r   z<br><span class='note'>r   r   z</span></td></tr>N)r   r"   dumpsr.   r   s     r   r   zrender_html.<locals>.<genexpr>s  s       	s?+,-[3v;8H IC	N?@A BC
O%@AB C[!"##:1SWWVR=P;Q:R S		s   BB r   c              3  :   K   | ]  }d t        |       d  yw)z<li>z</li>Nr   )r   r   s     r   r   zrender_html.<locals>.<genexpr>|  s     PagYe,Ps   r   Fr   a  <!doctype html>
<html lang="ko">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>HUD Menu Opener Frontier Review</title>
  <style>
    body { margin:0; background:#101318; color:#edf1f7; font-family:system-ui,sans-serif; }
    main { max-width:1280px; margin:0 auto; padding:24px; }
    a { color:#8ecbff; }
    .nav { display:flex; flex-wrap:wrap; gap:8px; margin-bottom:16px; }
    .chip { border:1px solid #334155; border-radius:999px; padding:6px 10px; text-decoration:none; background:#161b22; }
    .summary { display:grid; grid-template-columns:repeat(auto-fit,minmax(180px,1fr)); gap:12px; margin:16px 0; }
    .card { border:1px solid #2b3544; border-radius:8px; padding:12px; background:#161b22; }
    .card b { display:block; color:#9fb1c9; font-size:12px; text-transform:uppercase; }
    .card span { display:block; margin-top:8px; font-size:18px; overflow-wrap:anywhere; }
    section { border:1px solid #273244; border-radius:10px; padding:16px; margin:16px 0; background:#141922; overflow:auto; }
    table { border-collapse:collapse; width:100%; min-width:1080px; font-size:13px; }
    th,td { border-bottom:1px solid #283342; padding:8px; text-align:left; vertical-align:top; }
    th { color:#b9c7dc; background:#111722; }
    code { color:#dbeafe; overflow-wrap:anywhere; }
    .note { display:block; margin-top:6px; color:#9fb1c9; line-height:1.35; }
    pre { white-space:pre-wrap; background:#0b0f14; border:1px solid #253044; border-radius:8px; padding:12px; max-height:420px; overflow:auto; }
  </style>
</head>
<body>
<main>
  <div class="nav">
    <a class="chip" href="index.html">index</a>
    <a class="chip" href="../out/hud_menu_opener_boundary_review.json">opener boundary JSON</a>
    <a class="chip" href="hud_menu_preview.html">HUD menu preview</a>
    <a class="chip" href="menu_descriptor_stack_review.html">descriptor stack</a>
    <a class="chip" href="menu_cancel_window_consumer_review.html">cancel consumer</a>
  </div>
  <h1>HUD Menu Opener Frontier Review</h1>
  <p>r   z</p>
  <div class="summary">z</div>
  <section>
    <h2>Input / Descriptor Intersections</h2>
    <table>
      <thead><tr><th>function</th><th>refs</th><th>calls</th><th>promotion</th></tr></thead>
      <tbody>z.<tr><td colspan='4'>No intersections</td></tr>zR</tbody>
    </table>
  </section>
  <section>
    <h2>Next Frontier</h2>
    <ul>z</ul>
  </section>
  <section>
    <h2>Raw JSON</h2>
    <pre id="json"></pre>
  </section>
</main>
<script>
window.HWANSE_HUD_MENU_OPENER_FRONTIER_REVIEW = z;
document.getElementById('json').textContent = JSON.stringify(window.HWANSE_HUD_MENU_OPENER_FRONTIER_REVIEW, null, 2);
</script>
</body>
</html>
)joinr"   r   r   )reportr   cards	card_html
inter_rowsfrontierpayloads          r   render_htmlr   i  s1   YG	6(#$	'"89:	'"=>?	G$>?@	5)F!G HPWXtPuOvwxE f`effI  12 J wwP9OPPHjje4G#F 
 !{ #
 LLM N	
 

 1 29	 :m; ;r   c                 2   t               } t        j                  d       t        j                  d       t        dz  j	                  t        j                  | dd      dz   d	       t        d
z  j	                  t        |       d	       t        d       y)NT)exist_okz$hud_menu_opener_frontier_review.jsonF   )r   indent
r   r    z$hud_menu_opener_frontier_review.htmlz"hud_menu_opener_frontier_review okr   )	r   OUTmkdirWEB
write_textr"   r   r   print)r   s    r   mainr     s    ^FIItIIItI11==

6a84? >  	11==k&>Q\c=d	
./r   __main__)   )r   z
int | Noner   r:   returnr   )r   r   r   r   )r(   r   r   dict[str, Any])r0   list[dict[str, Any]]r   r   )r=   bytesr0   r   r   r:   r   	list[int])r=   r   r0   r   rM   r:   r   r   )r=   r   r0   r   r   r   )rk   r   rC   r:   r   zdict[str, Any] | None)rl   r   r=   r   ro   r   r   bool)rl   r   r?   r   r   r   )
rl   r   r   dict[str, list[int]]r   r   r=   r   r   r   )r   r   )r   r   r   r   )r   r:   );__doc__
__future__r   r   r"   r8   pathlibr   typingr   probe_exe_scene_tablesr   r   r   __file__resolveparentsROOTr   r   r   r   r   r   INPUT_POLL_DRIVER_VAr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r*   r2   rD   rF   rR   rg   rm   rp   rs   r   r   r   r   __name__
SystemExitr   r   r   <module>r     sK  
 #      L L H~''*
]
Ul
Ul#   ! '  * ", %/ "'1 $% & )  * ( ", $. !$ & (2 %# <H2."	&#LL7L^`FPf
 z
TV
 r   