
    UHjT                       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Zddl	m
Z
mZ ddlmZ ej                  j                  d e ee      j%                         j&                               ddlmZmZmZ ddlmZ  ee      j%                         j4                  d   Zed	z  Zd
dhZh dZ ej>                  d      Z  ej>                  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*dZ+d+d,dZ,d-d.dZ-d/dZ.d0dZ/d0dZ0efd1dZ1d2dZ2e3d k(  r e2        yy)3z?Summarize CP949 Korean text candidates embedded in Hwanse2.exe.    )annotationsN)Counterdefaultdict)Path)offset_to_varead_sectionsva_to_offset)direct_text_calls   out.rdata.data>   r   .textr   z[\u3131-\u318e\uac00-\ud7a3]zF^[\u3131-\u318e\uac00-\ud7a3A-Za-z0-9 !?.,:;_+\-/()[\]{}'\"~%&*<>|=]+$c                    d| dS )N0x08x )values    =/home/exedev/hwanse/tools/summarize_korean_text_candidates.pyhex32r      s    c{    c                F    d| cxk  xr dk  nc xs d| cxk  xr dk  S c S )Nu   ㄱu   ㆎu   가u   힣r   )chars    r   	is_hangulr       s'    t'x'G8t+Gx+GG+GGr   c                    dj                  | j                  dd      j                  dd      j                               S )N 
)joinreplacesplit)texts    r   
clean_textr#   $   s2    88DLLs+33D#>DDFGGr   c                L    | D ]  }|d   |cxk  r|d   |d   z   k  s|c S  ! y )Nvaraw_sizer   )sectionsr%   sections      r   section_for_var)   (   s@     4=BD1D!DDN E r   c                     g d}g d}t         fd|D              ryt         fd|D              ryt               dk\  st         fdd	D              ry
y)N)	u	   기본기u	   공격기u   도구u   무기u	   방어구u   장비   저장u   레벨u	   경험치)u   에러u   파일u   읽기r+   u	   메모리u	   데이터c              3  &   K   | ]  }|v  
 y wNr   .0wordr"   s     r   	<genexpr>z classify_text.<locals>.<genexpr>2   s     
/D44<
/   zmenu-uic              3  &   K   | ]  }|v  
 y wr-   r   r.   s     r   r1   z classify_text.<locals>.<genexpr>4   s     
1D44<
1r2   z	system-ui   c              3  &   K   | ]  }|v  
 y wr-   r   )r/   r   r"   s     r   r1   z classify_text.<locals>.<genexpr>6   s     >tddl>r2   z!?.,zdialogue-likelabel)anylen)r"   
menu_wordssystem_wordss   `  r   classify_textr;   /   sM    wJUL

/J
//

1L
11
4yB#>v>>r   c                X   g }|D ]   }|d   t         vr|d   }| |||d   z    }d }t        |dz         D ]  \  }}|dk(  r|||z
  dk\  r||| }		 |	j                  d      }
t	        |
      }t        d	 |D              }|d
k\  ryt        |      d
k\  rkt        |      dk  r]t        j                  |      rHt        |||z         }|7|j                  |t        |      |d   t        |	      ||t        |      d       d }||}  |S # t        $ r |	j                  dd      }
Y w xY w)Nnamerawr&       r      cp949ignorec              3  8   K   | ]  }t        |      sd   yw)r   N)r   )r/   r   s     r   r1   z)iter_candidate_strings.<locals>.<genexpr>L   s     &MTYt_q&Ms         )r%   vaHexr(   
byteLengthr"   hangulCountclassification)TEXT_SECTIONS	enumeratedecodeUnicodeDecodeErrorr#   sumr8   PRINTABLE_REmatchr   appendr   r;   )exer'   rowsr(   	raw_startr>   startindexbyteblobdecodedr"   hangul_countr%   s                 r   iter_candidate_stringsr[   ;   sr   D $6?-/EN	)Y)<<=$S5[1 	KE4qy$!);uU+DA"&++g"6 &g.D#&&MT&M#ML$)INI,(..t4)(I4EF> KK&().r+26?.1$i(,/;2?2E)  }=	$J K3 . A"&++gx"@As   DD)(D)c           	        t        t              }|s|S |D ci c]  }t        j                  d|      | }}|D ]  }|d   t        vr|d   }| |||d   z    }|j                         D ]s  \  }	}|j                  |	      }
|
dk\  st        |||
z         }|+||   j                  |d   |t        |      |
dz  dk(  d       |j                  |	|
dz         }
|
dk\  rWu  |S c c}w )	N<Ir=   r>   r&   r   r@   )r(   refVarefVaHexalignedr   )
r   liststructpackREF_SECTIONSitemsfindr   rQ   r   )rR   r'   valuesrefsr   needlesr(   rT   r>   needlerV   ref_vas               r   find_value_refsrl   e   s   "-d"3D<BC5v{{4'.CGC 46?,.EN	)Y)<<=$]]_ 	4MFEHHV$E1*%h	E0AB%K&&#*6?!'$)&M#(19>	(  3 1*	44" K% Ds   C#c                \   g }| D ][  }|j                  d      xs g D ]A  }|j                  d      dk7  r|j                  |d   |d   |d   |d   |d   |d	   d
       C ] |j                  d        g }g }d }	|D ]:  }|	|d   |	z
  dk  r|j                  |       n|j                  |       |g}|d   }	< |r|j                  |       g }
|D ]  }|d   d   }|d   d   }t        d |D              }t	        |||t        d|dz
        |dz   ||      }|
j                  |t        |      |t        |      t        |      t        t        |j                                     |d d D cg c]  }|d   	 c}|d d t        |      |d d d
        |
j                  d        |
S c c}w )Nrh   r(   r   r^   r_   r%   rF   r"   rI   )r^   r_   textVa	textVaHexr"   rI   c                    | d   S )Nr^   r   rows    r   <lambda>zref_clusters.<locals>.<lambda>   s
    #g, r   key    r   c              3  &   K   | ]	  }|d      ywrI   Nr   r/   rr   s     r   r1   zref_clusters.<locals>.<genexpr>   s     !KC#&6"7!K   @            )
startVa
startVaHexendVaendVaHex
entryCountclassificationCountssampleTextsentriesinboundRefCountinboundRefsc                    | d    | d   fS )Nr   r   r   rq   s    r   rs   zref_clusters.<locals>.<lambda>   s    L 113y>B r   )getrQ   sortr   immediate_range_refsmaxr   r8   dictsortedre   )
candidatesrR   r'   
text_callsref_rowsrr   refclusterscurrentprevious_varS   clusterrU   endclassificationsinbound_refss                   r   ref_clustersr   ~   s   H 776?(b 
	Cwwy!W,OOW
Od) \F"%&6"7 
	 MM.M/HGK ##g,"<"DNN3OOG$eG'l#  D 
7#bk'"!!K7!KK+C:s1eVZlG[]`cg]ginpst,c
g,$(0E0E0G)H$I3:2A;?CCK?s|"<0',
 	" 	IIBICK @s   +F)c                   g }|D ]  }|d   t         vr|d   }	| |	|	|d   z    }
t        dt        dt        |
      dz
              D ]  }t	        j
                  d|
|      d   }||cxk  r|k  sn +t        ||	|z         }|||cxk  r|k  rn nK|j                  |d   |t        |      t        |      |dz  dk(  d|d   d	k(  rt        | |||      ni          |j                  d
        |d d S )Nr=   r>   r&   r      r]   r@   )r(   r^   r_   valueHexr`   r   c                    | d   dk7  | d   fS )Nr(   r   r^   r   rq   s    r   rs   z&immediate_range_refs.<locals>.<lambda>   s    s9~8#g,G r   rt   (   )rd   ranger   r8   rb   unpack_fromr   rQ   r   code_ref_contextr   )rR   r'   r   value_start	value_endcluster_startcluster_endrh   r(   rT   r>   rV   r   rk   s                 r   r   r      s2    D 6?,.EN	)Y)<<=1c!SX\23 	E&&tS%8;E55I5!(I,=>F~&!GK!GKK"6?!&M!%L 19> KRRX/]dJd#C:vFjl 	( 	IIGIH9r   c           	     d   t        d||z
        }||z   }t        ||      }t        ||      }	||	i S | ||	 }
t        d|dz
        }|dz   }|D cg c]5  }||d   cxk  r|k  r%n n"|d   |d   |d   |z
  |j                  d      d7 }}t        |      |
j	                  d      |d d	 d
S c c}w )Nr   0   callVa	callVaHextargetVaHex
scanMethod)r   r   deltaFromRefr   r   r}   )codeContextVaHexcodeContextBytesnearbyCalls)r   r	   r   r   hex)rR   r'   r   rk   beforeafterstart_vaend_va	start_offend_offdatascan_start_vascan_end_vacallcallss                  r   r   r      s     1fvo&He^FXx0I8V,GGO	y!D6B;'M2+K 	 DN9k9 k*. NV3((<0		
	E 	 "(O HHSMRay 	s   :B-c                   t        |       }t        | ||      \  }}t        | |      }t        | ||D ch c]  }|d   	 c}      }t	        t
              }	|D ]D  }|j                  |d   g       }
t        |
      |d<   |
d d |d<   |	|d      j                  |       F t        || ||      }|	j                         D ]  }|j                  d         g }t        |	      D ]  }|j                  |	|   d |         |j                  d        t        d	 |D              }t        d
 |D              }t        || |      }dt        |      t!        d |D              t#        t        |j%                                     t#        t        |j%                                     t        |      |t        |      |d d |d|dS c c}w )Nr%   refCountr   rh   rI   c                "    | d    | d    | d   fS )Nr   rH   r%   r   rq   s    r   rs   zbuild_summary.<locals>.<lambda>  s     C
O#3c-6H5H#d)"T r   rt   c                     | d   | d    | d   fS )NrI   r   r%   r   rq   s    r   rs   zbuild_summary.<locals>.<lambda>  s    3'7#83z?:JCPTI"V r   c              3  &   K   | ]	  }|d      ywry   r   rz   s     r   r1   z build_summary.<locals>.<genexpr>  s     AsS)*Ar{   c              3  R   K   | ]  }|j                  d d      dkD  s|d    ! yw)r   r   rI   Nr   rz   s     r   r1   z build_summary.<locals>.<genexpr>  s+     j#swwWacdOehiOi$4 5js   '
'z9CP949 Korean strings in Hwanse2.exe .rdata/.data sectionsc              3  L   K   | ]  }|j                  d d      dkD  sd  yw)r   r   r   Nr   rz   s     r   r1   z build_summary.<locals>.<genexpr>  s$     '^c377:WXCY\]C]'^s   $$rv   zThis is a text-location index, not a decoded dialogue system. It identifies Korean strings and code/data references so the next pass can connect text display handlers and event script opcodes.)scopecandidateCountreferencedCandidateCountr   referencedClassificationCountsrefClusterCountdirectTextCallScanMethoddirectTextCallCountrefClusterstextRoutineCandidates
conclusionr   )r   r
   r[   rl   r   ra   r   r8   rQ   r   rg   r   r   extendr   text_routine_candidatesrN   r   re   )rR   limit_per_classexe_pathr'   r   call_scan_methodr   rr   rh   by_classrow_refsr   rS   selectedr=   countsreferenced_countsroutine_candidatess                     r   build_summaryr      s   S!H#4S(H#M J 'X6J3
*K3t9*KLD&1$&7H 488CIr*h-JsmF%&'..s3	4
 JXzBH! V		T	UVHx  :'789:MMVMWAjAAFjjj03ILj/$''^Z'^$^ $VFLLN%; <*.v6G6M6M6O/P*Qx=$4":}!3f  # +Ls   F>c                r    t        |d      }t        ||      }|i S | |||z    }||j                  d      dS )N   r   )targetContextVaHextargetContextBytes)intr	   r   )rR   r'   va_hexlengthr%   offr   s          r   function_contextr     sK    	VRB
x
$C
{	s3< D$"hhsm r   c                    i }| D ]  }|j                  d      xs g D ]  }|j                  d      dk7  r|j                  d      xs g D ]  }|d   }|j                  ||ddt               g d      }|dxx   d	z  cc<   |d
   j                  |d          t	        |d         dk  s^|d   j                  |d   |j                  dg       d d |d   |d   d          g }	|j                         D ]j  }|	j                  i |j                         D 
ci c]  \  }
}|
d
k7  s|
| c}}
t	        |d
         t        |d
         dt        |||d                l |	j                  d        |	d d S c c}}
w )Nr   r(   r   r   r   r   )r   	callCountclusterCountr   examplesr   r   r   r   r   r}   r   r   r_   r   )clusterStartVaHexclusterSamplesr_   r   )r   clusterStartVaHexesc                "    | d    | d    | d   fS )Nr   r   r   r   rq   s    r   rs   z)text_routine_candidates.<locals>.<lambda>H  s"    K 003~3F2FMHZ[ r   rt   r~   )r   
setdefaultsetaddr8   rQ   rg   re   r   r   r   )r   rR   r'   groupedr   r   r   targetrr   rS   ru   r   s               r   r   r   (  s   !G ;;}-3 	Cwwy!W,.4" m,((#)!"$% # "2  K A% J##GL$9:s:'!+
O**-4\-B*1++mR*H!*L$'
O%)+%6	, 	, D~~  
,/IIKMjc53*;LsEzM
J0#)#j/#:
 sHc-.@A	
 	 	II[I\9 Ns   E:%E:c                   dd| d   dd| d    d| d    dt        j                  | d	   d
       dt        j                  | d   d
       d| j                  dd       d| j                  dd       d| j                  dd       ddddddg}| j                  d      xs g D ]  }dj                  |j                  d      xs g       j	                  dd      }dj                  d |j                  d g       d d! D              xs d}|j                  d"|d#    d$|d%    d&|d'    d(t        j                  |j                  d	      xs i d
       d(|xs d d(|j                  d)d       d(| d*        |j                  g d+       g }| j                  d      xs g D ]U  }|j                  d       xs g D ];  }|j                  d,      d-k7  s|j                  d.      s)|j                  ||f       = W |d d/ D ]g  \  }}dj                  d0 |j                  d1g       d d2 D              xs d}|j                  d"|d#    d$|d%    d3|d4    d3|d5    d&| d6|d.    d7       i |s|j                  d8       |j                  g d9       | j                  d:      xs g D ]n  }dj                  d; |j                  d<g       d d! D              }	|j                  d"|d=    d&|d>    d(|d?    d6|j                  d@      xs d d&|	xs d d*       p | j                  d:      s|j                  d8       |j                  g dA       | dB   D ]p  }dj                  dC |j                  dDg       d d! D              xs d}
|dE   j	                  dd      }|j                  dF|dG    d6|dH    d&|dI    d(| d(|
 d*       r dJj                  |      dJz   S )KNz# Korean Text Candidates r   z- candidates: r   z- referenced candidates: r   z- classification counts: r   Fensure_asciiz$- referenced classification counts: r   z- pointer table clusters: r   r   z- direct call scan: r   - (r   z calls)z## Pointer Table ClusterszK| range | entries | classes | samples | inbound refs | first inbound refs |z'| --- | ---: | --- | --- | ---: | --- |r   , r   |z\|c              3  6   K   | ]  }|d     d|d      ywr_   ->r   Nr   r/   r   s     r   r1   zmarkdown.<locals>.<genexpr>`  s-      
 :r#j/!23
   r   r@   z| `r   ..r   z` | r   z | r   z |)r   z## Text Code Referencesr   z5| cluster | ref | value | nearby calls | code bytes |z| --- | --- | --- | --- | --- |r(   r   r   r   c              3  6   K   | ]  }|d     d|d      ywr   r   r   Nr   r/   r   s     r   r1   zmarkdown.<locals>.<genexpr>w  s/      
 K !D$7#89
r   r   r   z` | `r_   r   z | `z` |z| - | - | - | - | - |)r   z## Text Routine Candidatesr   z7| target | calls | clusters | target bytes | examples |z!| --- | ---: | ---: | --- | --- |r   c           	   3  b   K   | ]'  }|d     d|d    ddj                  |d          d ) ywr   z near r_   r   /r   )Nr   r/   examples     r   r1   zmarkdown.<locals>.<genexpr>  sH      
 {#$F7:+>*?r#((7ScKdBeAffgh
   -/r   r   r   r   r   )r   z
## Stringsr   z)| class | VA | refs | text | first refs |z | --- | --- | ---: | --- | --- |r   c              3  &   K   | ]	  }|d      ywr_   Nr   r   s     r   r1   zmarkdown.<locals>.<genexpr>       LSZLr{   rh   r"   z| rI   rF   r   r   )jsondumpsr   r   r    rQ   r   )summarylinesrr   samplesinbound	code_rowsr   r   r   r   rh   r"   s               r   markdownr  L  s   "


!1234
#G,F$G#HI
#DJJw7M/N]b$c#de
.tzz'Bb:crw/x.yz
$W[[1BA%F$GH
w{{+EsKLBw{{[prsOtNuu|}
#
U1E" {{=)/R 

))CGGM28b9AA#uM)) 
ww}b1"15
 
   	 	#l#$Bs:&7tC<M;Nczz#''"89?ReTUUX~#c#''*;Q"?!@G9BP	


 
LL   I;;}-3 -;;}-3 	-Cwwy!W,CGG<N4Ogs^,	--
 "#2 
		 
r22A6
 
   	 	','(7:+>*?uS_DU VJ UG44F0G/HM	

 ,-	LL   {{239r 
99 
77:r22A6
 
 	#m$%T#k*:);3s>?R>S T,-45T(/c9J"N	

 ;;./,-	LL   |$ 
yyLCGGFB4G4KLLSPS6{""3.%&'tCL>c*o=NcRVQWWZ[_Z``bc	

 99Ud""r   c                   g }| d   D ]  }dj                  d |j                  dg       d d D              xs d}|j                  dt        j                  |d          d	t        j                  |d
          d|d    dt        j                  |d          dt        j                  |       d        g }| j                  d      xs g D ]U  }|j                  d      xs g D ];  }|j                  d      dk7  s|j                  d      s)|j                  ||f       = W dj                  ddddddddddd t        j                  | d!          d"d#| d$    d%| d&    d't        j                  | j                  d(d             d)| j                  d*d+       d,	d-d.d/d0j                  d1 | j                  d      xs g D              z   d2z   d3d4d/d0j                  d5 |d d6 D              xs d7z   d2z   d8d9d/d0j                  d: | j                  d;      xs g D              xs d<z   d2z   d=d>d/d0j                  |       d2d?d@d0g      S )ANr   r   c              3  &   K   | ]	  }|d      ywr  r   r   s     r   r1   zhtml_page.<locals>.<genexpr>  r  r{   rh      r   z<tr><td>rI   </td><td><code>rF   </code></td><td>r   	</td><td>r"   
</td></tr>r   r   r(   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>Korean Text Candidates</title>z  <style>body{font-family:system-ui,sans-serif;background:#101010;color:#eee;margin:24px}table{border-collapse:collapse;width:100%}td,th{border:1px solid #333;padding:6px 8px;vertical-align:top}th{background:#1d1d1d}code{color:#f5d76e}</style>z</head>z<body>z!  <h1>Korean Text Candidates</h1>z  <p>r   z</p>z  <p>candidates: r   z; referenced: r   z; direct call scan: r   r   r   r   z calls)</p>z!  <h2>Pointer Table Clusters</h2>z  <table><thead><tr><th>range</th><th>entries</th><th>classes</th><th>samples</th><th>inbound refs</th><th>first inbound refs</th></tr></thead>z	  <tbody>r   c              3  .  K   | ]  }d t        j                  |d          dt        j                  |d          d|d    dt        j                  t        j                  |j	                  d      xs i d	             dt        j                  d
j                  |j	                  d      xs g              d|j	                  dd       dt        j                  d
j                  d |j	                  dg       dd D              xs d       d  yw)<tr><td><code>r   r   r   r  r   r  r   Fr   r   r   r   r   c              3  6   K   | ]  }|d     d|d      ywr   r   r   s     r   r1   z&html_page.<locals>.<genexpr>.<genexpr>  s&     ({UXC
O+<Bs:>O)P({r   r   Nr@   r   r  )htmlescaper  r  r   r   rz   s     r   r1   zhtml_page.<locals>.<genexpr>  s      

 S%6784;;s:;W:X Y|$% &;;tzz#''2H*I*OR^cdef g;;tyy)?)E2FGH I77,a01 2;;tyy({\_\c\cdqsu\vwyxy\z({{   C  @C  D  E E

s   DDz</tbody></table>z  <h2>Text Code References</h2>zs  <table><thead><tr><th>cluster</th><th>ref</th><th>value</th><th>nearby calls</th><th>code bytes</th></tr></thead>c              3    K   | ]  \  }}d t        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  dj                  d	 |j                  d
g       dd D              xs d       dt        j                  |j                  d      xs d       d  yw)r  r   r   r   z</code></td><td><code>r_   r   r  r   c              3  6   K   | ]  }|d     d|d      ywr  r   r  s     r   r1   z&html_page.<locals>.<genexpr>.<genexpr>  s.       -G_c[0A/B"T-EXDY-Z  -Gr   r   Nr   r   r  r   z</code></td></tr>)r!  r"  r   r   )r/   r   r   s      r   r1   zhtml_page.<locals>.<genexpr>  s     	 !GS![[)>?@4;;wWaObCcBd e![[Z9: ;![[Z9: ;{{499  -Ggjgngno|  A  hB  CE  DE  hF  -G  $G  $N  KN  O  P P![[1C)D)KLM N	s   C C"r   z+<tr><td colspan="5">No text refs.</td></tr>z"  <h2>Text Routine Candidates</h2>zu  <table><thead><tr><th>target</th><th>calls</th><th>clusters</th><th>target bytes</th><th>examples</th></tr></thead>c              3  D  K   | ]  }d t        j                  |d          d|d    d|d    dt        j                  |j                  d      xs d       dt        j                  d	j                  d
 |j                  dg       dd D              xs d       d  yw)r  r   r  r   r  r   r  r   r   r   c           	   3  b   K   | ]'  }|d     d|d    ddj                  |d          d ) ywr  r  r	  s     r   r1   z&html_page.<locals>.<genexpr>.<genexpr>  sh       -v  OV0D/EVGT^L_K``bcfckckls  uE  mF  dG  cH  HI  .J  -vr  r   Nr@   r  )r!  r"  r   r   rz   s     r   r1   zhtml_page.<locals>.<genexpr>  s      	 ![[]);<= >;'( )>*+ ,![[1E)F)M#NO P{{499  -v  Z]  Za  Za  bl  np  Zq  rt  st  Zu  -v  $v  $}  z}  ~   	s   BB r   z4<tr><td colspan="5">No routine candidates.</td></tr>z  <h2>Strings</h2>zg  <table><thead><tr><th>class</th><th>VA</th><th>refs</th><th>text</th><th>first refs</th></tr></thead>z</body>z</html>)r   r   rQ   r!  r"  )r  rS   rr   rh   r  r   r   s          r   	html_pager'    s   D|$ 

yyLCGGFB4G4KLLSPS;;s#3456 7S\23 4z?# $;;s6{+, -;;t$% &	


 I;;}-3 -;;}-3 	-Cwwy!W,CGG<N4Ogs^,	--
 99"P1 	~+
GL12348
G$456nWMgEhDi j![[5OQT)UVW XKK-q12+	? 	, 	Z
'' 

 {{=17R

 

	
 	 	*}GG 	 %.crN	 	 
= =	
 	 	-GG 	 #;;'>?E2	 	 
F F	
 	 	q
BGGDM?"23
KF F Fr   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_okzkorean_text_candidates.jsonFrD   )r   indentr   zutf-8)encoding)mkdir
write_textr  r  )r  out_dirs     r   write_outputsr0    sC    MM$M.,,88

7q9D@ 9 r   c                    t        j                         } | j                  dt        t        dz         | j                  dt        t
               | j                  dt        d       | j                         }t        |j                  j                         |j                  |j                        }t        ||j                         y )Nz--exezHwanse2.exe)typedefaultz	--out-dirz--limit-per-classP   )argparseArgumentParseradd_argumentr   ROOTOUTr   
parse_argsr   rR   
read_bytesr   r0  r/  )parserargsr  s      r   mainr>    s    $$&F
dD=4HI
$<
+#rBDDHH//143G3GRG'4<<(r   __main__)r   r   returnstr)r   rA  r@  bool)r"   rA  r@  rA  )r'   
list[dict]r%   r   r@  zdict | None)rR   bytesr'   rC  r@  rC  )rR   rD  r'   rC  rg   zset[int]r@  zdict[int, list[dict]])
r   rC  rR   rD  r'   rC  r   rC  r@  rC  )rR   rD  r'   rC  r   rC  r   r   r   r   r   r   r   r   r@  rC  )
   r4   )rR   rD  r'   rC  r   rC  rk   r   r   r   r   r   r@  r   )r4  N)rR   rD  r   r   r   zPath | Noner@  r   )r   )
rR   rD  r'   rC  r   rA  r   r   r@  r   )r   rC  rR   rD  r'   rC  r@  rC  )r  r   r@  rA  )r  r   r/  r   r@  None)r@  rF  )4__doc__
__future__r   r5  r!  r  rerb   syscollectionsr   r   pathlibr   pathinsertrA  __file__resolveparentprobe_exe_scene_tablesr   r   r	   exe_call_scannerr
   r)  r8  r9  rJ   rd   compile	HANGUL_RErO   r   r   r#   r)   r;   r[   rl   r   r   r   r   r   r   r  r'  r0  r>  __name__r   r   r   <module>rW     s   E "    	  
 ,  3tH~--/667 8 L L . H~''*
Ul7#+BJJ67	rzzcdHH	'T2/d	  	
    N 	  	
   
D%P	!HT#nYx 25 ) zF r   