
    LjR                       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)d1d2d Z*d3d!Z+d4d"Z,d5d#Z-d6d$Z.d7d%Z/d8d&Z0d9d'Z1d:d(Z2d;d)Z3d<d*Z4d=d+Z5	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d>d,Z6d?d-Z7d@d.Z8dAd/Z9e:d0k(  r e; e9             y)Ba!  Classify the HUD/menu input consumer boundary.

The menu payload and top-menu sequence are grounded elsewhere.  This pass does
not try to rediscover those assets.  It asks a narrower question:

* Does the ESC/X edge bit consumer open the normal field menu?
* Or does it only consume cancel/back after an active descriptor stack exists?

The answer matters because the same input bit is used by several already-open
menu/status contexts.  Treating every 0x0200 consumer as an opener kept pulling
the analysis back into confirmed close/back code.
    )annotationsN)Path)Any)offset_to_varead_sectionsva_to_offset   zHwanse2.exeoutwebiY iY ivE i>Y i0Y ilY iC iA%C i##C ilM i@ iA i;@ it-B i-C i B i&B isB ipA iA i   c                    | dS d| d| dS )N-0x0x )valuewidths     1tools/build_hud_input_consumer_boundary_review.pyhxr   8   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                V    | D ]  }|j                  d      dk(  s|c S  t        d      )Nname.textzmissing .text section)get
ValueError)sectionssections     r   text_sectionr%   @   s5     ;;v')N ,
--r   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      }t        ||      }nt        |d         t        |d         z   }|}||}|	j	                  |||t        ||      t        d||z
        d        |	S )Nrawraw_sizes   Ur   r	   va)startVaendVastartOffendOffsize)r%   intfindr   appendsortedset	enumerater   lenmax)exer#   text	raw_startraw_endstartsposhitr)   rowsindexstart_va	start_offend_vaend_offs                  r   function_rangesrD   G   sS   !DDK I#d:.//GF
C
hhW57(C(>MM"Ag  CK F!#D$V, 
x 84	19s6{"EAI&F"8V4Gd_s4
+;'<<FG?G#%i1Aw23	

* Kr   c                    | D ]+  }t        |d         |cxk  rt        |d         k  s'|c S  - t        dt        |             )Nr*   r+   zfunction not found for )r/   r"   r   )	functionsr)   rows      r   find_functionrH   p   sS     s9~"8s3w<'88J 9 .r"vh7
88r   c                <    | t        |d         t        |d          S )Nr,   r-   r/   )r7   rG   s     r   read_function_bytesrK   w   s!    s3z?#SX%788r   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 )Nz<Ir   r    r'   r(   r	   )structpackr!   r/   r0   r   r1   )
r7   r#   r   needlerefsr$   startendr<   r)   s
             r   	text_refsrT   {   s    [[u%FD 
1;;v')GEN#c'*-..hhvuc*Rih,B~B((637C0C	 Ri
1 Kr   c                    t        | d         }t        | d         }|D cg c]  }||cxk  r|k  sn n| c}S c c}w )Nr*   r+   rJ   )rG   rQ   rR   rS   refs        r   refs_in_functionrW      s>    IE
c'l
C6C5C#5##5C666s   <<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    r'   r(         <ir	   r   )r!   r/   ranger6   r   rN   unpack_fromr1   )
r7   r#   	target_vahitsr$   rR   rS   offcall_varels
             r   
call_sitesrc      s    D %;;v')GEN#c'*-..E37 34 	%C3x4"8S1G$$T3a8;C{S I-G$	%% Kr   c                   g }t        |      }t        |d         }|t        |d         z   }t        |d         }t        |d         }t        |t        ||dz
              D ]b  }	| |	   dk7  rt	        ||	      }
|
t        j                  d| |	dz         d	   }|
dz   |z   }||cxk  r|k  sLn O|j                  |
|d
       d |S )Nr)   r(   r,   r-   rY   rZ   r[   r	   r   )callVatargetVa)r%   r/   r\   r6   r   rN   r]   r1   )r7   r#   rG   callsr8   
text_starttext_endrR   rS   r`   ra   rb   r^   s                r   call_targets_in_functionrj      s    "$E!DT$ZJCZ 011HJ E
c(m
CUCsQw/0 	Es8tx-?  sC!G4Q7aK#%	-X-LLGCD	E Lr   c                    t        | |      }g }|j                  |      }|dk\  rIt        |t        |d         |z         }||j	                  |       |j                  ||dz         }|dk\  rI|S )Nr   r,   r	   )rK   r0   r   r/   r1   )r7   r#   rG   patterndatar
   r<   r)   s           r   find_pattern_vasrn      sv    sC(DC
))G
C
((CJ$83$>?>JJrNiiq)	 (
 Jr   c                ,    t        t        | |            S )N)boolrW   )rG   	call_refss     r   contains_callrr      s     i011r   c                   t        | ||      }|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 }}
}	}t	        | ||d      }t	        | ||d      }|t        t        |d               t        t        |d               |d   ||||D cg c]  }t        |d         t        |d         d! c}|D cg c]  }t        |       c}|D cg c]  }t        |       c}t        |      t        |      t        ||d	         t        |j                  d
            |dS c c}w c c}}
}	w c c}w c c}}
}	w c c}w c c}w c c}w )Ns	   fY s   fY %fY r*   r+   r.   re   rf   )	callVaHextargetVaHexaddDescriptortopMenu.objectSequence)labelfunctionVaHexendVaHexr.   classificationrefHitscallHitscallTargetscancelBitTestVasHexcancelBitClearVasHexhasCancelBitTesthasCancelBitClearcallsAddDescriptorreferencesTopMenuSequencenote)	rj   itemsrW   r   rn   r/   rp   rr   r!   )r7   r#   rG   refs_by_namecalls_by_namerx   r{   r   rg   r   rQ   rV   ref_hits	call_hitscancel_testscancel_clearscallr)   s                     r   function_summaryr      s    %S(C8E ',,. D$C& 	"23"=>3r#w>>H  (--/ D$C& 	"23"=>3r#w>>I 
 $C38_`L$O	M CI/0s3w<()F( 

   X/!$z"23
 2>>22>2? @BB @ .!-0+C1OP%)(,,7O*P%Q+ ! ? ?(
  ? @sA   #F FF 4#F,F')F,$F30F8F=F 'F,c                    t         j                         } 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               t        | |t"              t        | |t$              t        | |t&              t        | |t(              d}t+        |t,              }t+        |t.              }t+        |t0              }t3        | ||||ddd      t3        | ||||ddd      t3        | ||||d	d
d      g}t5        |d   |d   z   D 	ch c]  }	t7        t+        ||	      d          c}	      }
g }|
D ]  }t+        ||      }|j9                  t;        |      t;        t7        |d               t=        ||d         D 	cg c]  }	t;        |	       c}	t=        ||d         D 	cg c]  }	t;        |	       c}	t?        ||d         tA        t=        ||d               t,        dt.        dt0        dtB        dtD        dijG                  |d      d        |d   }|d   }|d   }ddtI        t               di dtK        |      d t;        t,              d!t;        tL        d"      d#|d$   d%tA        |d&   jG                  d'            d(tA        |d&   jG                  d)            d*tA        |d&   jG                  d+            d,|d-   d.|d/   d0|d1   d2|d-   d3|d1   d4tO        d5 |D              d6tO        d7 |D              d8d9d:d;d<d=|||jQ                         D 	ci c]  \  }}||D 	cg c]  }	t;        |	       c}	! c}	}}|jQ                         D 	ci c]  \  }}||D 	cg c]  }	t;        |	       c}	! 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 )@N)input.currentActionMaskinput.edgeActionMaskdescriptor.activeCountdescriptor.activeCursordescriptor.slotPointerszdescriptor.tempStaterw   )rv   removeDescriptorrebuildDescriptorfocusOutfocusIn
menuResult
cursorMovemenuCursorApplyz0x0200 cancel/back consumerz$cancel/back-active-descriptor-unwinda  Consumes and clears edge input bit 0x0200, rewrites object+0x40 to the stream continuation, decrements/scans active descriptor cursor 0x0059e33e, and calls focus routines 0x00422093/0x004226e9. It has no call to addDescriptor and no top-menu sequence reference.z!menu-internal selector dispatcherzalready-open-menu-dispatcherzUses 0x0200 only inside an object payload dispatcher after menu state exists. It calls 0x0042af73, writes 0x0059dd6c, marks object+0xa8[...] = 0xff, clears the bit, and advances object+0xb0.zdirection edge selectorzdirection-navigation-onlyzConsumes direction edge bits 0x1/0x2/0x4/0x8 and calls 0x00410570 with direction indexes. It does not test 0x0200 and does not add descriptors.r   r   r*   r+   rv   rw   zcancel/back consumerzmenu-internal dispatcherzdirection selectorzinput poll driverz#field movement/collision controllerzinput consumer)ry   rz   edgeRefsHexcurrentRefsHexr   r   	knownRoler   r	      z)hwanse-hud-input-consumer-boundary-reviewz1tools/build_hud_input_consumer_boundary_review.pyz.input-consumers-grounded-opener-still-unproveninputConsumerFunctionCountcancelBackHandlerVaHexcancelBitHex   cancelBackClearsBitr   $cancelBackUsesActiveDescriptorCursorr|   r   cancelBackReferencesActiveCountr    cancelBackReferencesSlotPointersr   cancelBackCallsAddDescriptorr   #cancelBackReferencesTopMenuSequencer   #menuInternalDispatcherUsesCancelBitr   menuInternalCallsAddDescriptordirectionSelectorUsesCancelBit"inputConsumersCallingAddDescriptorc              3  ,   K   | ]  }|d    s	d  yw)r   r	   Nr   .0rG   s     r   	<genexpr>zbuild_report.<locals>.<genexpr>x  s     5tCZ]^rZsa5t   
(inputConsumersReferencingTopMenuSequencec              3  ,   K   | ]  }|d    s	d  yw)r   r	   Nr   r   s     r   r   zbuild_report.<locals>.<genexpr>y  s#       <B#`cd  aAA  <Br   normalFieldEscOpenerPromotedFr{   z?input/cancel consumers grounded; opener producer still unprovendecisionu\  0x0200 ESC/X edge bit의 주요 소비자는 메뉴 최초 opener가 아니라 active descriptor stack을 되감는 cancel/back 경계다. 0x0040c6cc는 bit clear, active cursor scan, focus in/out 호출만 수행하며 addDescriptor/top-menu sequence 근거가 없다. 0x0041d61b도 이미 열린 메뉴 내부 selector dispatcher로 분류된다.)u   ESC/X opener는 0x0200 bit consumer 자체가 아니라 field mode/state transition 또는 descriptor attachment producer에서 찾아야 한다.ui   0x0040c6cc/0x0041d61b는 close/back/internal dispatcher로 고정하고 반복 후보에서 제외한다.u   다음 증거는 active descriptor stack에 top-menu wrapper/sequence를 attach하는 producer, 또는 normal-field state에서 top-menu wrapper를 호출하는 상위 dispatcher다.)
kindsourcer7   statussummarykeyFunctionsinputConsumerFunctions
refsByNamecallsByNamenextFrontier))EXE
read_bytesr   rD   rT   CURRENT_ACTION_MASK_VAEDGE_ACTION_MASK_VAACTIVE_DESCRIPTOR_COUNT_VAACTIVE_DESCRIPTOR_CURSOR_VA"ACTIVE_DESCRIPTOR_SLOT_POINTERS_VAACTIVE_DESCRIPTOR_TEMP_STATE_VATOP_MENU_OBJECT_SEQUENCE_VArc   ADD_DESCRIPTOR_ROUTINE_VAREMOVE_DESCRIPTOR_ROUTINE_VAREBUILD_DESCRIPTOR_ROUTINE_VAFOCUS_OUT_ROUTINE_VAFOCUS_IN_ROUTINE_VAMENU_RESULT_ROUTINE_VACURSOR_MOVE_ROUTINE_VAMENU_CURSOR_APPLY_ROUTINE_VArH   CANCEL_BACK_HANDLER_VAMENU_INTERNAL_DISPATCHER_VADIRECTION_SELECTOR_HANDLER_VAr   r2   r/   r1   r   rW   rr   rp   INPUT_POLLER_VAFIELD_CONTROLLER_VAr!   r   r5   CANCEL_BIT_MASKsumr   )r7   r#   rF   r   r   
cancel_rowinternal_rowdirection_rowkey_functionsrV   input_consumer_startsinput_consumer_rowsr@   rG   cancel_summaryinternal_summarydirection_summaryr   rQ   reports                       r   build_reportr      s   
..
CS!HX.I $-S(<R#S )#x9L M"+C;U"V#,S(<W#X#,S(<^#_ )#x9X Y"+C;V"WL $C3LM&sH6RS'X7TUsH.BCc8-@A h0FG h0FG%c85QR	M y*@AJ ,GHL!)-JKM 	)2/	
 	/*<	
 	%'[	
=+MZ # $$=>NdAee	
 i-i89	
 ) 
Ix0""!#Hs3w<013CCVlIm3noC3o6FsLYrLs6t"us2c7"u&3C9W&X-12B3UmHn2o-p*,B/1K13G#%8')N #h 01	

( #1%N$Q'%a(;E3xB
(#.A*B
$b)?&@
 B2
 ">2E#F	

 3D	9R9V9VWp9q4r
 .tN94M4Q4QRj4k/l
 /^I5N5R5RSl5m0n
 +N;O,P
 2>B]3^
 23CDV3W
 -.>?S.T
 -.?@R.S
 1#5tCV5t2t
 7  <BI\  <B  9B
 +E
  _!
" a%
0 &"5IUI[I[I]^^:4t6#bg66^JWJ]J]J_``JD$$73r#w77`
C&FN MI	
  p"u^ 7^7`sB   P!P&3P+5P5P0P51Q>P< Q0P5<Qc                   | d   }d| d   fd|d   fd|d   fd|d   fd	|d
   fg}dj                  d |D              }dj                  d | d   D              }dj                  d | d   D              }dj                  d | d   D              }t        j                  | d      }dt        |d          d| d| d| d| d| dS )Nr   r   zinput funcsr   zcancel handlerr   z
cancel bitr   zopen promotedr   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>  s/     fX\XY[\/!vZ!v]Sfs   (*c              3    K   | ]  }d t        |d          dt        |d          dt        |d          dt        |d          dt        t        j                  |d	   d
             dt        t        j                  |d   d
             dt        dj                  |d         xs d       dt        dj                  |d         xs d       d  yw)<tr><td><code>ry   </code><br>rx   	</td><td>r{   z<br><span class='note'>r   z</span></td><td>r|   Fensure_asciir}   , r   r   z<br>clear: r   
</td></tr>N)r   jsondumpsjoinr   s     r   r   zrender_html.<locals>.<genexpr>  s      	 	s?+,-[3w<8I J%&'((?#f+?O PC	N?@A BC
O%@AB C3456=#>?{1TYYWZ[qWrMsMzwzK{J| }		s   CCr   c              3  "  K   | ]  }d t        |d          dt        |d          dt        dj                  |d         xs d       dt        dj                  |d         xs d       dt        |d	          dt        |d
          d  yw)r   ry   r   r   r   r   r   r   r   r   r   r   N)r   r   r   s     r   r   zrender_html.<locals>.<genexpr>  s      	 	s?+,-[3{;K9L8M N3}-.5#67 83/018S9: ;)*+, -0123 4		s   BBr   c              3  :   K   | ]  }d t        |       d  yw)z<li>z</li>Nr   )r   items     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 Input Consumer Boundary Review</title>
  <style>
    body { margin:0; background:#101318; color:#edf1f7; font-family:system-ui,sans-serif; }
    main { max-width:1320px; 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:1100px; 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="hud_menu_opener_frontier_review.html">opener frontier</a>
    <a class="chip" href="hud_active_group_gate_frontier_review.html">active group gate</a>
    <a class="chip" href="hud_menu_preview.html">HUD menu preview</a>
    <a class="chip" href="../out/hud_input_consumer_boundary_review.json">JSON</a>
  </div>
  <h1>HUD Input Consumer Boundary Review</h1>
  <p>r   z</p>
  <div class="summary">z</div>
  <section>
    <h2>Key Functions</h2>
    <table>
      <thead><tr><th>function</th><th>classification</th><th>refs</th><th>calls</th><th>0x0200 evidence</th></tr></thead>
      <tbody>z</tbody>
    </table>
  </section>
  <section>
    <h2>Input Consumer Inventory</h2>
    <table>
      <thead><tr><th>function</th><th>edge refs</th><th>current refs</th><th>calls addDescriptor</th><th>top-menu ref</th></tr></thead>
      <tbody>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_INPUT_CONSUMER_BOUNDARY_REVIEW = z;
document.getElementById('json').textContent = JSON.stringify(window.HWANSE_HUD_INPUT_CONSUMER_BOUNDARY_REVIEW, null, 2);
</script>
</body>
</html>
)r   r   r   r   )r   r   cards	card_htmlkey_rowsconsumer_rowsfrontierpayloads           r   render_htmlr     sD   YG	6(#$	 <=>	7#;<=	w~./	'"@ABE f`effIww 	 .)	 	H GG 	 23	 	M wwP9OPPHjje4G#F 
 !{ #
 Z  _ 	
 

 4 5<9 ={B B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_input_consumer_boundary_review.jsonFr   )r   indent
zutf-8)encodingz'hud_input_consumer_boundary_review.htmlz%hud_input_consumer_boundary_review okr   )	r   OUTmkdirWEB
write_textr   r   r   print)r   s    r   mainr    s    ^FIItIIItI44@@

6a84? A  	44@@VAT_f@g	
12r   __main__)   )r   z
int | Noner   r/   returnr   )r   r   r
  r   )r#   list[dict[str, Any]]r
  dict[str, Any])r7   bytesr#   r  r
  r  )rF   r  r)   r/   r
  r  )r7   r  rG   r  r
  r  )r7   r  r#   r  r   r/   r
  	list[int])rG   r  rQ   r  r
  r  )r7   r  r#   r  r^   r/   r
  r  )r7   r  r#   r  rG   r  r
  r  )
r7   r  r#   r  rG   r  rl   r  r
  r  )rG   r  rq   r  r
  rp   )r7   r  r#   r  rG   r  r   dict[str, list[int]]r   r  rx   r   r{   r   r   r   r
  r  )r
  r  )r   r  r
  r   )r
  r/   )<__doc__
__future__r   r   r   rN   pathlibr   typingr   probe_exe_scene_tablesr   r   r   __file__resolveparentsROOTr   r  r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r%   rD   rH   rK   rT   rW   rc   rj   rn   rr   r   r   r   r  __name__
SystemExitr   r   r   <module>r     s   #      L L H~''*
]
Ul
Ul#   ' ( %/ "", & )  * ( # (  *   !   # # ) <H.&R99"7&(	22	2"2 
2 '	2
 (2 2 2 2 2jOdbJ
 z
TV
 r   