
    Cuh                    P   U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlmZmZm	Z	 d dl
mZ d dlmZmZmZmZmZ d dlmZ d dlZd dlmZmZmZmZmZ d dlmZmZ d d	lmZ d d
l m!Z! d dl"m#Z#  ed          Z$ ej%        d          Z& ee'          (                                j)        d         dz  Z* e e+e*                    Z, e!            Z-g dZ.g dZ/ ej0                    Z1d Z2ddZ3ddddddd Z4dd#Z5d$ Z6dd&Z7dd'Z8dd)Z9dd-Z:dd0Z;dd3Z< ej=        d4          d5f ej=        d6          d7f ej=        d8          d9fgZ>d:e?d;<   dd>Z@ddEZAddFZBddJZCddLZDddMZE ej=        dN          ZFddPZGdddUZHddWZI	 	 	 dddaZJe$K                    dbec          ddf            ZLe$K                    dg          dh             ZMe$K                    diec           edjk           edlk          fddo            ZNddrZOddsZPe$K                    dtec           edjk           edk           edk           edk           eduk           edvdwdxy          fdd~            ZQe$K                    dec          dd            ZRe$K                    dec          dd            ZSe$K                    dec           edk          fdd            ZTe$K                    dec          dd            ZUddZVddZWddZXe$K                    dec          dd            ZYe$Z                    dec           ed           ed           ed          fdd            Z[e$Z                    dec          e$Z                    dec          dd                        Z\g dZ]de?d<   ddZ^ddZ_ ej=        d          Z`ddZaddZbe$K                    dec           edlk          fdd            Zce$K                    dec          dd            ZddS )    )annotationsN)datetimedate	timedelta)Path)OptionalListDictAnyTuple)defaultdict)FastAPIRequestQueryFormHTTPException)HTMLResponseRedirectResponse)Jinja2Templates)
get_client)apply_decisionsz
GovBot Web)titlez
govbot.web   	templates)	directory)   한국전력공사   한국남동발전   한국중부발전   한국서부발전   한국남부발전   한국동서발전   한국수력원자력	   한전KPS	   한전KDN   한국전력기술   한전원자력연료)u   상임기관장   상임감사   상임이사   비상임이사c                     t                               d                              d                                          j        pg } d | D             S )Ngov_staff_current*c                0    i | ]}|d          |d         f|S )	person_idsource .0rs     #/var/www/html/bot/app/web/server.py
<dictcomp>z1_current_map_by_person_source.<locals>.<dictcomp>.   s'    ;;;Q{^Qx[)1;;;    )sbtableselectexecutedata)rowss    r4   _current_map_by_person_sourcer=   ,   sJ    88'((//44<<>>CIrD;;d;;;;r6   
person_ids	list[int]returndict[int, str]c                "   | si S t          t          d | D                                 }t                              d                              d                              d|                                          j        pg }d |D             S )Nc                0    g | ]}|t          |          S N)intr2   xs     r4   
<listcomp>z$_person_name_map.<locals>.<listcomp>3   s    CCC!Q]s1vv]]]r6   person_registryzperson_id,canonical_namer.   c                p    i | ]3}|d          |                     d          pt          |d                    4S )r.   canonical_name)getstrr1   s     r4   r5   z$_person_name_map.<locals>.<dictcomp>5   s=    [[[QRAkNQUU#344KAkN8K8K[[[r6   )sortedsetr7   r8   r9   in_r:   r;   )r>   uniqr<   s      r4   _person_name_maprR   0   s     	#CCzCCCDDEED88%&&--.HIIMMk[_``hhjjousuD[[VZ[[[[r6   u   입사(신규)   퇴사   부서이동   직위변경   전화변경u'   개명(권장: 퇴사/입사로 처리))NEWDEPARTEDMOVECHANGE_POSITIONCHANGE_PHONECHANGE_NAMEtrM   c                8    t                               | |           S rD   )	_EVENT_KOrL   )r]   s    r4   	_ev_labelr`   ?   s    ==Ar6   c                    t          t                    }| D ]%}||                    |          xx         dz  cc<   &t          |          S )N   )r   rE   rL   dict)itemskeycits       r4   _group_countrh   B   sK    CA  	"&&++!77Nr6   	List[str]c                   | g S t          | t                    rd | D             S t          | t                    r|                                 }|r|                                dk    rg S |                    d          r\|                    d          rG	 t          j        |          }t          |t                    rd |D             S n# t          $ r Y nw xY wd|v rd |
                                D             S d|v rd	 |                    d          D             S |gS t          |                                           gS )
Nc                    g | ]D}t          |                                          #t          |                                          ES r0   rM   striprF   s     r4   rH   z_as_list.<locals>.<listcomp>L   s9    >>>1s1vv||~~>A>>>r6   none[]c                    g | ]D}t          |                                          #t          |                                          ES r0   rl   rF   s     r4   rH   z_as_list.<locals>.<listcomp>U   s9    HHHqQHCFFLLNNHHHr6   
c                ^    g | ]*}|                                 |                                 +S r0   rm   r2   r]   s     r4   rH   z_as_list.<locals>.<listcomp>Y   s-    CCC!CAGGIICCCr6   |c                ^    g | ]*}|                                 |                                 +S r0   rt   ru   s     r4   rH   z_as_list.<locals>.<listcomp>[   s-    AAA!qwwyyAAGGIIAAAr6   )
isinstancelistrM   rm   lower
startswithendswithjsonloads	Exception
splitlinessplit)valsvs      r4   _as_listr   H   s`   
{	#t ?>>>>>>#s IIKK 	AGGII''I<< 	C 	JqMMa&& IHHAHHHHI   199CCq||~~CCCC!88AAqwws||AAAAs
HHNNs   4C 
CCc                R    t          |           }|rd                    |          ndS )Nrr   -)r   join)r   arrs     r4   _normalize_multiliner   _   s&    
3--C )499S>>>c)r6   rE   c                D    	 t          |           S # t          $ r Y dS w xY w)Nl    J))rE   r   )r   s    r4   _to_int_safer   c   s4    1vv   vvs    
r3   dict | Nonerc   c           
        | s	dddddddS d } ||                      d                     ||                      d                     ||                      d                     ||                      d                     ||                      d                     ||                      d	                    dS )
Nr   )r/   
departmentpositionnamephonetaskc                2    | pd                                 pdS )N r   rt   rG   s    r4   _sz_pack_row_for_table.<locals>._sl   s    qwBoo''.3.r6   r/   r   r   r   r   r   rL   )r3   r   s     r4   _pack_row_for_tabler   i   s     kSc3Y\fijjj..."QUU8__%%b|,,--BquuZ(())155==!!AEE'NN##155==!!  r6   dep
str | Nonec                   | sd S |                                  }t          j        dd|t          j                  }|                                }t
          D ]}|                    dd          |v r|c S d|v rdS d|v rdS d	|v sd
|v sd|v rdS d|v rdS d|v rdS d|v rdS d|v rdS d|v rdS d|v rdS d|v rdS d|v rdS d S )Nu    (?:\(주\)|㈜|주식회사|\s+)r   )flags KPSr#   KDNr$   KEPCOu   한국전력u   한전r   u   남동발전r   u   중부발전r   u   서부발전r   u   남부발전r    u   동서발전r!   u   수력원자력r"   u   전력기술r%   u   원자력연료r&   )rm   resubIupperCOMPANY_ORDERreplace)r   r   s0sUlbls        r4   _norm_company_labelr   y   sB    t		A	3R"$	G	G	GB	B  ;;sB2%%JJJ &{{;;{{;;"}}",,BG[G[$8$8$8$8$8$8$8$8$8$8B'>'>$8$8B'>'>4r6   posOptional[str]c                    | sd S |                                  }|                    dd          }d|v rdS d|v rdS d|v rd|vrdS d|v rdS |t          v r|S d S )Nr   r   u	   비상임r)   r'   u   감사위원r(   )rm   r   	POS_ORDER)r   p
p_no_spaces      r4   _normalize_positionr      s     t		A3##Ja  ##~{!33~~I~~4r6   uC   ^\s*(\d{4})[.\-\/년\s]*(\d{1,2})[.\-\/월\s]*(\d{1,2})[일\s]*\s*$ymdu2   ^\s*(\d{4})[.\-\/년\s]*(\d{1,2})[.\-\/월\s]*\s*$ymz^\s*(\d{4})\s*$yzList[Tuple[re.Pattern, str]]_DATE_PATTERNSr   2Tuple[Optional[int], Optional[int], Optional[int]]c                   | sdS t          |                                           }t          D ]\  }}|                    |          }|rt	          |                    d                    }|dk    rG|t	          |                    d                    t	          |                    d                    fc S |dk    r'|t	          |                    d                    d fc S |dk    r|d d fc S 	 t          j        |d d                                                   }|j	        |j
        |j        fS # t          $ r Y dS w xY w)	N)NNNrb   r   r      r   r   
   )rM   rm   r   matchrE   groupr   fromisoformatr   yearmonthdayr   )r   r]   patkindmr   ds          r4   _parse_date_partsr      sC     AA# 3 3	TIIaLL 	3AGGAJJAu}}QAGGAJJQWWQZZ%HHHHt||QAGGAJJ%====s{{Qd]222 "1SbS6**//11vqw%%       s   4AD6 6
EEOptional[int]r   r   assume_lastboolOptional[date]c                    | d S ||rdnd}||rt          j        | |          d         nd}	 t          | ||          S # t          $ r Y d S w xY w)N   rb   )calendar
monthranger   r   )r   r   r   r   s       r4   _parts_to_dater      s|    yty$BB1y,7>H1%%a((QAq!}}   tts   A   
AAc                >    | dS |r|dnd}|r|dnd}|  d| d| S )Nr   02dz??r0   )r   r   r   mmdds        r4   _fmt_date_displayr      sL    ys	"AdB	"AdB"rr6   rawr   tuple[str, Optional[date]]c                    | dS t          |                                           }|r|                                dk    rdS t          |          \  }}}t	          |||          }t          |||d          }||fS )N)r   Nrn   Tr   )rM   rm   rz   r   r   r   )r   r   r   r   r   dispcmp_ds          r4   _date_display_and_comparer      s    
{yCA 		V##y""GAq!Q1%%D1a555E;r6   gc                    t          | pd                                                                          }|sdS |dv rdS |dv rdS t          |           S )Nr   r   >      女   여성   여자ffemale   여r   >      男   남성   남자r   male   남r   )rM   rm   rz   )r   r   s     r4   _gender_labelr      s^    AG""$$ASS===ee;;;EEq66Mr6   c                (    t          |           dk    S )Nr   )r   )r   s    r4   
_is_femaler      s    u$$r6   u3   (?<![가-힣A-Za-z0-9])한전(?![가-힣A-Za-z0-9])careerc                p    | sdS t          |           }d|v rdS t                              |          rdS dS )NFr   T)rM   _KEPCO_WORD_REsearch)r   r]   s     r4   _is_kepco_alum_textr      sC    %%FAq  Q,5r6         @urltimeoutfloatc                    	 t          j                     }t          j        | |ddi          }t          t          j                     |z
  dz            }d|j        cxk    rdk     rn n|dk     rdnd	|d
S d|d
S # t
          $ r dd d
cY S w xY w)Nz
User-Agentz
govbot/1.0)r   headers     i  i  OKu   지연)labelmsu   불량)timerequestsrL   rE   status_coder   )r   r   t0r3   r   s        r4   _ping_statusr      s    /Y[[Lgl7STTT$)++"d*++!-%%%%#%%%%%&(4iiddXbIII!,,, / / /!...../s   A3A; 6A; ;BBr8   c                   t          j                    t          d          z
  }	 t                              |                               d                              d|                                                                          }t          |j
        pg           S # t          $ rL 	 t                              |                               d                              dd                              d	                                          }|j
        pg }n# t          $ r Y Y d
S w xY wd
}|D ]}|                    d          p|                    d          }|s/d }t          |                                          }	 t          j        |d d                   }nA# t          $ r4 	 t          j        |d d         d          }n# t          $ r d }Y nw xY wY nw xY w|r||k    r|dz  }|cY S w xY w)N   )hourszid,created_at
created_atr,   idTdescr   r   	posted_at   r   %Y-%m-%drb   )r   utcnowr   r7   r8   r9   gte	isoformatr:   lenr;   r   orderlimitrL   rM   rm   r   strptime)	r8   cutoffresr;   cntr3   tsdtr   s	            r4   _count_last_24hr     s   _!4!4!44Fhhuoo$$_5599,HXHXHZHZ[[ccee38>r"""   	((5//((--33Dt3DDJJ4PPXXZZC8>rDD 	 	 	111	 	 	A|$$:k(:(:B BBA+AcrcF33   !*1SbS6:>>BB    BBB
  bFllq


-s   A:B! !G8-A0DG8
D-(G8,D--AG8F$#G8$
G"/GG"G	G"G	G"G8!G""G87G8r   tag   source_label	title_keyurl_keytag_key
limit_scanList[Dict[str, Any]]c           	        t          j                                                    }	 t                              |                               d                              dd                              |                                          }|j	        pg }n# t          $ r g }Y nw xY wg }	|D ]}
t          |
                    d          p|
                    d          pd          d d         }||k    rZ|	                    ||
                    |          pd	|r|
                    |          nd |
                    |          |d
           |	S )Nr,   r  Tr  r  r  r   r   r   )srcr   r  r   r   )r   todayr  r7   r8   r9   r  r  r:   r;   r   rM   rL   append)r8   r  r  r  r  r  	today_strr  r<   rd   r3   r   s               r4   _today_items_fromr$    sU    
&&((Ihhuoo$$S))//4/@@FFzRRZZ\\x~2   "$E 	 	k""?aeeL&9&9?R@@"E	>>LL#y))0S*1;gtuuW~~     Ls   A0B B'&B'/)response_classrequestr   c                  K   t          ddddd          }t          ddddd           }||z   }	 t                              d	                              d
                              dd                              d                                          }|j        pg }n# t          $ r g }Y nw xY wg }t          j
                                                    }|D ]}t          |                    d          p|                    d          pd          d d         }	|	|k    rA|                    |                    d          pd|                    d          |	d           t          d          t!          d          dt          d          t!          d          dt          d          t!          d	          dd}
t"                              d| |||
d          S )Nmoef_idMOEFr   r   r  )r  r  r  motie_idMOTIEkepco_idzdepartment,posted_at,pdf_urlr  Tr  r   r  r  r   r   r   r   pdf_url)r   r   r   zhttps://www.moef.go.kr)pingcount24https://www.motie.go.krzhttps://www.alio.go.kr)r*  r,  ALIOz
index.html)r'  	gov_todaygroup_todaystatus)r$  r7   r8   r9   r  r  r:   r;   r   r   r!  r  rM   rL   r"  r   r  r   TemplateResponse)r'  
moef_todaymotie_todayr3  res_kk_rowsr4  r#  r3   r   r5  s              r4   indexr;  .  s     "9fQV`efffJ#J7TYcghhhK[(I$$++,JKKQQRV]aQbbhhilmmuuww!r    K
&&((I  k""?aeeL&9&9?R@@"E	>>eeL118SuuY''       &&>??O\eLfLfgg&'@AAo^hNiNijj%&>??O\fLgLghh F %%l"	5 5   s   A0B" "B10B1z/healthc                    K   ddiS )NokTr0   r0   r6   r4   healthr>  R  s      $<r6   z/gov/searchall)defaultr   r   qc                F  K   |pd                                 }g }|s t                              d| |||d          S 	 t                              d                              d          }|dv r|                    d|          }d| d}|                    d	| d
| d| d| d| 
          }|                    d          	                                }|j
        pg }n	# t          $ r}t                              d| d           	 t                              d                              d          }	|dv r|	                    d|          }	|	                    d          	                                j
        pg }
|                                fdfd|
D             }n6# t          $ r)}t                              d|            g }Y d }~nd }~ww xY wY d }~nd }~ww xY w|                    d            t                              d| |||d          S )Nr   zgov_search.html)r'  r   rA  r<   	gov_staffz*source,department,position,name,phone,task)r,  r*  r/   %zname.ilike.z,department.ilike.z,position.ilike.z,task.ilike.z,phone.ilike.r   z#gov_staff search fallback (reason: )  c                >     t           fddD                       S )Nc              3  p   K   | ]0}                     |d           pd                                 v V  1dS )r   NrL   rz   )r2   r   re   r3   s     r4   	<genexpr>z*gov_search.<locals>.hit.<locals>.<genexpr>n  sE      ||13155B<<#52"<"<">">>||||||r6   )r   r   r   r   r   )any)r3   re   s   `r4   hitzgov_search.<locals>.hitm  s+    |||||H{||||||r6   c                *    g | ]} |          |S r0   r0   )r2   r3   rL  s     r4   rH   zgov_search.<locals>.<listcomp>o  s&    ...!ss1vv.A...r6   zgov_staff fallback failed: c                b    |                      dd          pd|                      dd          pdfS )Nr   r   r   r   )r3   s    r4   <lambda>zgov_search.<locals>.<lambda>t  s2    QUU<44:AEE&"<M<M<SQST r6   re   )rm   r   r6  r7   r8   r9   eqor_r  r:   r;   r   loggerwarningrz   errorsort)r'  r   rA  q_normr<   querykwr  eq2r;   e2rL  re   s               @@r4   
gov_searchr]  V  s     g2__F!#D z))*;Y\cisw=x=xyyy%%,,-YZZ###HHXs++E]]]		wwwbwwRTwwbdwwsuwwxxkk$''))x~2   AQAAABBB	+&&--.Z[[B'''UU8S))HHTNN**,,18bD,,..C} } } } }....t...DD 	 	 	LL;r;;<<<DDDDDD	 	IITTIUUU%%&7WUX_eos9t9tuuusD    B!C# #
G)-G$BF)(G$)
G3GG$GG$$G)rowDict[str, Any]c                8   d}d}|                      d          }|                      d          }|r|sVt          |                      d          pd          }d|v r.|                    dd          }t          |          d	k    r|\  }}|r|r| d
| d| d| S d S )Nz,https://www.moef.go.kr/nw/notice/hrDetail.do4050300bbsIdpostIdr  r   r   rb   r   z?searchBbsId1=z&searchNttId1=z&menuNo=)rL   rM   r   r  )r^  
DETAIL_URLmenuNorb  rc  ridpartss          r4   _ensure_moef_urlrh  w  s    ?JFGGGEWWXF &f &#''$--%2&&#::IIc1%%E5zzQ %v Z ZYYEYYYYQWYYY4r6   c                H    d}|                      d          }|d S | d| dS )Nr1  r  z/kor/article/ATCL6e90bb9de/z/view?r   )r^  BASEaids      r4   _ensure_motie_urlrl    s7    $D
''$--C
{t::s::::r6   z/gov/timelinerb         d   )r@  gelestartendpage	page_sizec                z  K   |pd                                                                 dd} ||           ||          |pd}g }dd	}	dd
}
|dv r|                     |	                       |dv r|                     |
                       rfdfd|D             }srddfdfd|D             }d }|                    |d           t	          |          }|dz
  |z  }||z   }|||         }||k     }t
                              d| ||pd|pd|pd|||d          S )Nr   r   r   r@   r   c                    | sd S 	 t          j        t          |           d d         d                                          S # t          $ r Y d S w xY w)Nr   r	  )r   r  rM   r   r   r   s    r4   _to_datezgov_timeline.<locals>._to_date  sc     	4	$SVVCRC[*==BBDDD 	 	 	44	s   ;A 
AArb   r  c                    	 t                               d                              d                              dd                              d                                          } | j        pg }n6# t          $ r)}t          	                    d|            g }Y d }~nd }~ww xY w|D ]}d|d	<   t          |          |d
<   |S )Nr+  r,   r  Tr  r   zmotie_id fetch failed: r,  r/   r   )r7   r8   r9   r  r  r:   r;   r   rS  rT  rl  r  r;   rZ  r3   s       r4   fetch_motiez!gov_timeline.<locals>.fetch_motie  s    	((:&&--c2288D8IIOOPTUU]]__C8>rDD 	 	 	NN8Q88999DDDDDD	  	, 	,A!AhK(++AeHH   A0A3 3
B&=B!!B&c                    	 t                               d                              d                              dd                              d                                          } | j        pg }n6# t          $ r)}t          	                    d|            g }Y d }~nd }~ww xY w|D ]}d|d	<   t          |          |d
<   |S )Nr)  r,   r  Tr  r   zmoef_id fetch failed: r*  r/   r   )r7   r8   r9   r  r  r:   r;   r   rS  rT  rh  r{  s       r4   
fetch_moefz gov_timeline.<locals>.fetch_moef  s    	((9%%,,S117747HHNNtTT\\^^C8>rDD 	 	 	NN7A77888DDDDDD	  	+ 	+A AhK'**AeHHr}  )r,  r?  )r*  r?  c                    |                      d          pd                                }|                      d          pd                                }|v p|v S )Nr   r   r  rI  )r3   r   r  rW  s      r4   hit_textzgov_timeline.<locals>.hit_text  sV    UU7^^)r0022E55<<%2,,..CU?3fm3r6   c                *    g | ]} |          |S r0   r0   )r2   r3   r  s     r4   rH   z gov_timeline.<locals>.<listcomp>  &    111qXXa[[1111r6   c                    |                      d          p|                      d          }	 |r<t          j        t          |          d d         d                                          nd S # t
          $ r Y d S w xY w)Nr  r  r   r	  )rL   r   r  rM   r   r   )r3   r   s     r4   d_ofzgov_timeline.<locals>.d_of  s    k""9aeeL&9&9ALMWx(QjAAFFHHHSWW   tts   ?A, ,
A:9A:c                N     |           }|sdS r|k     rdS r|k    rdS dS NFTr0   )r3   r   r  e_dates_dates     r4   in_rangezgov_timeline.<locals>.in_range  sL    QA u !f**u !f**u4r6   c                *    g | ]} |          |S r0   r0   )r2   r3   r  s     r4   rH   z gov_timeline.<locals>.<listcomp>  r  r6   c                      fd} |d           |d          t                               d          pd          fS )Nc                    	 t          j        t                              |           pd          d d         d                                          S # t
          $ r t          j        cY S w xY w)Nr   r   r	  )r   r  rM   rL   r   r   min)kr3   s    r4   d_tryz-gov_timeline.<locals>.sort_key.<locals>.d_try  sl     (QUU1XX^)<)<SbS)A:NNSSUUU      x s   AA A-,A-r  r  r  r   )rM   rL   )r3   r  s   ` r4   sort_keyzgov_timeline.<locals>.sort_key  sV    	  	  	  	  	 
 k""EE,$7$7QUU4[[=NB9O9OPPr6   Tre   reversezgov_timeline.html)r'  r   rA  rr  rs  rt  r<   has_more)r   r   r@   r   )r@   r  )r@   r   )rm   rz   extendrV  r  r   r6  )r'  r   rA  rr  rs  rt  ru  ry  rd   r|  r  r  total	start_idxend_idx	page_rowsr  r  r  r  r  rW  r  s                    @@@@@@r4   gov_timeliner    s"      g2__$$&&F    Xe__FXc]]F91D"$E
 
 
 

 
 
 
 [[]]###
oZZ\\""" 2	4 	4 	4 	4 	4 2111E111 2 2	 	 	 		 	 	 	 	 	 	 2111E111Q Q Q 
JJ8TJ***JJEY&I)#Gi'(IH%%&9b5;BsybiX< <   r6   z/group/timelinec                  K   	 t                               d                              d                              d                                          }|j        pg }n6# t          $ r)}t                              d|            g }Y d }~nd }~ww xY wd t          t                    D             dfd
dd|                    fd           t                              d| |d          S )Nr-  z'department,posted_at,pdf_url,created_ati  zkepco_id fetch failed: c                    i | ]\  }}||	S r0   r0   )r2   ir   s      r4   r5   z"group_timeline.<locals>.<dictcomp>  s    AAAWQqAAAr6   r   r   r@   rE   c                R    t          |           }                    |pdd          S )Nr   i  )r   rL   )r   r   	order_maps     r4   
dept_orderz"group_timeline.<locals>.dept_order  s(    #C((}}U[b#...r6   any_sr   r   c                    t          | t          |           nd          \  }}}t          |||d          pt          j        S )Nr   Tr   )r   rM   r   r   r  )r  r   r   r   s       r4   parse_dtz group_timeline.<locals>.parse_dt   sB    #%2CCJJJLL1aaA4888DDHDr6   c                     |                      d                     |                      d                                                     fS )Nr   r  )rL   	toordinal)r3   r  r  s    r4   rO  z group_timeline.<locals>.<lambda>  sG    ZZl(;(;<<xxkHZHZ?[?[?e?e?g?g>gh r6   rP  zgroup_timeline.html)r'  r<   )r   r   r@   rE   )r  r   r@   r   )r7   r8   r9   r  r:   r;   r   rS  rT  	enumerater   rV  r   r6  )r'  r  r<   rZ  r  r  r  s       @@@r4   group_timeliner    s6     hhz""))*STTZZ[_``hhjjx~2   444555 BA	-(@(@AAAI/ / / / / /E E E E 	IIhhhhhIiii%%&;Z^=_=_```s   AA# #
B-BBz/group/executivec                  K   	 t                               d                              d                              d                                          }|j        pg }n6# t          $ r)}t                              d|            g }Y d }~nd }~ww xY wd t          D             d t          D             d t          D             |D ] }|
                    d          pd	                                }t          |          }|vr@|xx         d
z  cc<   t          |
                    d                    r|xx         d
z  cc<   t          |
                    d                    }|t          |
                    d                    \  }}	}
t          |
                    d                    \  }}}t!          |||d          }t#          |o
|t$          k               }t'          |          }||d<   t)          |
                    d                    |d<   t+          ||	|
          |d<   t+          |||          |d<   t-          |
                    d                    }|
                    d          pd                                }|dk    r| d| dn||d<   |         |                             |           d&d}t          D ])}d D ]$}|         |                             |!           %*fd"t          D             }t          fd#t2          D             }t4                              d$| ||d%          S )'N	kepco_orgr,   rF  kepco_org fetch failed: c                2    i | ]}|d  t           D             S )c                    i | ]}|g S r0   r0   )r2   r   s     r4   r5   z.group_executive.<locals>.<dictcomp>.<dictcomp>  s    1K1K1KA!R1K1K1Kr6   )r   r2   rf   s     r4   r5   z#group_executive.<locals>.<dictcomp>  s*    -c-c-cPQa1K1K1K1K1K-c-c-cr6   c                    i | ]}|d S r   r0   r  s     r4   r5   z#group_executive.<locals>.<dictcomp>  s    111aQ111r6   c                    i | ]}|d S r  r0   r  s     r4   r5   z#group_executive.<locals>.<dictcomp>  s    000QAq000r6   r   r   rb   genderr   rr  rs  Tr   _expiredr   _is_kepco_alum_start_disp	_end_dispr   r   (rE  
_name_liner   rc   r@   r   c                    t          |                     d                    \  }}}t          |||d          pt          j        S )Nrr  Fr   )r   rL   r   r   r  )r   r   r   r   s       r4   	start_keyz"group_executive.<locals>.start_key3  s=    #AEE'NN331aaA5999ETXEr6   )r(   r)   rP  c                2    g | ]}|         |         d S ))r   r  r0   )r2   rf   female_countstotal_countss     r4   rH   z#group_executive.<locals>.<listcomp>;  s*    bbbq}Q/,q/JJbbbr6   c                6    g | ]fd D             dS )c                ,    g | ]}|                  S r0   r0   )r2   rf   gridr   s     r4   rH   z.group_executive.<locals>.<listcomp>.<listcomp>=  s!    -J-J-JQd1gaj-J-J-Jr6   )r   cellsr0   )r2   r   columnsr  s    @r4   rH   z#group_executive.<locals>.<listcomp>=  s;    ___PQ-J-J-J-J-J'-J-J-JKK___r6   zgroup_executive.html)r'  r  r<   gender_stats)r   rc   r@   r   )r7   r8   r9   r  r:   r;   r   rS  rU  r   rL   rm   r   r   r   r   r   r   TODAYrc   r   r   r   r"  rV  r   r   r6  )r'  r  r   rZ  r3   dep_rawr   pos_normy1m1d1y2m2d2end_dtexpiredpersonr  r   r  r   r  rows_for_tplr  r  r  r  s                          @@@@r4   group_executiver    s     hh{##**3//55d;;CCEEhn"   333444 .d-cUb-c-c-cD11=111M00-000L + +55&&,"3355!'**d??SQaeeHoo&& 	$#!#&quuZ'8'899&quuW~~66
B&quuU||44
BB===v0&5.11a$z#6quuX#G#G  1"b" = =}/B;;{quuX//f$++--6<mm$222222|S	(""6****F F F F  - -4 	- 	-AIaL),,,,	- cbbbbTabbbLG_____U^___L%%&<$	? ?      AA$ $
B.BBz/group/executivescompanyc                V  K   	 t                               d                              d                              d                                          }|j        pg }n6# t          $ r)}t                              d|            g }Y d }~nd }~ww xY wt          d d          }|t          v r|n|d         dd
           dfdfd|D             }|s|rfd|D             }g }|D ]}|
                    d          p+|
                    d          p|
                    d          pd                                pd}	t          |
                    d                    \  }
}t          |
                    d                    \  }}t          |o
|t          k               }i ||	|
||t          |
                    d                    d}|                    |           |                    d            t$                              d| ||d          S )Nr  r,   '  r  r   r   r   r@   rM   c                V    | pd                     dd                                          S )Nr   r   )r   rm   rx  s    r4   _keyz%group_executives_detail.<locals>._keyR  s(    R  b))//111r6   r   r   c                    | sdS  |           }|k    rdS t          |           }|r |          k    rdS |v p|v S r  )r   )r   dep_keynormr  cur_keys      r4   _matchesz)group_executives_detail.<locals>._matchesW  sn     	5$s))g4"3'' 	DDJJ'))4'!7W%77r6   c                P    g | ]"} |                     d                      |#S r   r   )r2   r3   r  s     r4   rH   z+group_executives_detail.<locals>.<listcomp>b  s4    @@@a((155+>+>"?"?@@@@r6   c                f    g | ]-}            |                     d                     v +|.S r  r   )r2   r3   r  currents     r4   rH   z+group_executives_detail.<locals>.<listcomp>d  sA    QQQ!dd7mmttAEE,<O<O7P7P&P&PA&P&P&Pr6   r   r   r   r   rr  rs  r   )_task
_start_str_end_strr  _career_strc                F    t          |                     d                    S )Nr  )r   rL   r   s    r4   rO  z)group_executives_detail.<locals>.<lambda>p  s    QUU4[[ 9 9 r6   rP  zgroup_executive_detail.html)r'  tabsr  r<   r   r   r@   rM   )r   r   r@   r   )r7   r8   r9   r  r:   r;   r   rS  rU  r   rL   rm   r   r   r  r   r"  rV  r   r6  )r'  r  r  r   rZ  r  cur_rowsenrichedr3   r   
start_disp	start_cmpend_dispend_cmpr  r  r  r  r  r  s                   @@@@r4   group_executives_detailr  F  s     hh{##**3//55e<<DDFF(.b   333444 D M11ggtAwG2 2 2 2 d7mmG	8 	8 	8 	8 	8 	8 	8 A@@@3@@@H R RQQQQQsQQQH    fKwK1553D3DKRRTT[X[ 9!%%.. I I
I5aeeEllCC'w27U?33]A ]JH%6J155QY??6[6[] ] ]MM99M:::%%&C(F F   r  z/syncc           	       K   t                               d                              d                              dd                              d                                          j        pg }|s t                              d| g i i d          S d	 |D             }t                               d
                              d          	                    d|                                          j        pg }t          d           }|D ]$}||d                  |d         xx         dz  cc<   %t                               d                              d          	                    d|                                          j        pg }t          t                    }|D ]1}|                    d          dk    r||d         xx         dz  cc<   2t                              d| |t          |          t          |          d          S )Ningest_batchesr,   
started_atTr  rm  zsync_index.html)r'  r<   event_statspending_statsc                H    g | ]}|                     d           |d           S )batch_idr   )r2   bs     r4   rH   zsync_index.<locals>.<listcomp>  s-    EEE11553D3DE:EEEr6   gov_staff_eventszbatch_id,event_typer  c                 *    t          t                    S rD   )r   rE   r0   r6   r4   rO  zsync_index.<locals>.<lambda>  s    k#&6&6 r6   
event_typerb   match_decisionszbatch_id,decisiondecisionPENDING)r7   r8   r9   r  r  r:   r;   r   r6  rP   r   rE   rL   rc   )	r'  batches	batch_idsevr  rZ  decr  r   s	            r4   
sync_indexr   y  s     hh'((//44::<d:SSYYZ\]]eegglrprG ))*;2PR>
 >
   	 FEEEEI	$	%	%	,	,-B	C	C	G	G
T]	^	^	f	f	h	h	m	sqsB6677K 9 9AjM"1\?333q83333
(($
%
%
,
,-@
A
A
E
EjR[
\
\
d
d
f
f
k
qoqC$$M . .55	))!J-(((A-(((%%&7GK((4;N;N: :   r6   csv_str	list[str]c                t    | pd                                 }|sg S d |                    d          D             S )Nr   c                ^    g | ]*}|                                 |                                 +S r0   rt   ru   s     r4   rH   z%_event_labels_csv.<locals>.<listcomp>  s-    999!qwwyy9AGGII999r6   ,)rm   r   )r  r   s     r4   _event_labels_csvr    sB    	BA 	99qwws||9999r6   r  c           	     @    ddddddddd	                     | |           S )
Nu   신규rS   rT   rU   rV   u   업무변경u   이름변경u   변경없음)rW   rX   rY   rZ   r[   CHANGE_TASKr\   	NO_CHANGEr   )r  s    r4   
_label_korr
    s4    X~)>%n#	 
 
c!Qiir6   c                V    t          j        dd| pd                                          S N\s+r   )r   r   r   rx  s    r4   _normalize_namer    &    6&"qwB((..000r6   z/sync/batch/{batch_id}r  c           
       K   t                               d                              d                              d|                              d                                          j        pg }t                               d                              d                              d|                              d                              dd                              d	                                          j        pg }t                               d
                              d                              d|                                          j        pg }d |D             }t                      }i }|D ]1}|	                    |d         g           
                    |           2g g }
}	|D ]U}|d         }|                    d          }|                    |          }g }|                    |g           D ]}|                    d          }|                    ||f          }t          |pi                     d                    t          |                    d                    k    rD|
                    ||                    d          ||pi                     d          pdd           |||d}|r0|                    d          dk    r|

                    |           @|	
                    |           Wt                               d                              d                              d|                              d                                          j        pg }t          |          }t          |	          }t          |
          }t                              d| ||||d|	|
|d          S )Nstaging_gov_staffr,   r  
staging_idmatch_candidatesscoreTr  r  r  c                     i | ]}|d          |S )r  r0   r1   s     r4   r5   zsync_batch.<locals>.<dictcomp>  s    ;;;Qaoq;;;r6   r/   candidate_person_idr   r   )r.   r  prev_ctxr   )staging
candidatesr  r  AUTOr  event_idzsync_batch.html)r  pendingauto)r'  r  cardsrows_pending	rows_autoevents)r7   r8   r9   rQ  r  r:   r;   r  r=   
setdefaultr"  rL   r  r  r   r6  )r'  r  st	cand_rowsdec_rowsdec_by_stagingcur_mapcands_by_strf   r  r   r   r  r   r  	same_namepidprevitemconfirmed_eventsr  cnt_pendingcnt_autos                          r4   
sync_batchr0    s     	%	&	&	-	-c	2	2	5	5j(	K	K	Q	QR^	_	_	g	g	i	i	n	trtB+,,33C88	J	!	!%%"5"5eeG$e6O6OPUPUV[P\P\]d]d]f]fgkroq xx)**11#6699*hOOWWYY^dbdH;;(;;;N+--G#%K > >q33::1==== ")L & &|_
eeHoo  ,,	R00 		 		A%%-..C;;Sz**D
//7788OAEERXMM<Z<ZZZ  !$UU7^^ $!ZR,,V44;	" "    I3GG 	&377:&&&00T""""%%%%xx 233::3??BB:xXX^^_ijjrrtty}GGEl##K9~~H%%&7 [(KK$9"	: :   r6   z/sync/decide.r  choicec                F  K   d}d }d}d }|dk    rd}n0|dk    rd}d}d}n#	 t          |          }n# t          $ r d }Y nw xY w||||||d	}t                              d
                              |d                                           t          d| dd          S )NMANUALg      ?__NEW__z
manual-new__SKIP__SKIPg        zmanual-skip)r  r  r  r.   r  	rationaler  zbatch_id,staging_id)on_conflict/sync/batch/z?saved=1i.  )r   )rE   r   r7   r8   upsertr:   r   )	r'  r  r  r1  r  r.   r  r7  payloads	            r4   sync_decider<    s       HIEI 			:		!			FII 	 	 	III	 JHY G HH&&w<Q&RRZZ\\\=8===3OOOOs   2 A Az/sync/batch/{batch_id}/applyz/sync/apply/{batch_id}c                N   K   t          |           t          d| dd          S )Nr9  z
?applied=1i/  )r   r   )r   r   )r'  r  s     r4   sync_apply_batchr>    s6       H Cx C C CQTUUUUr6   ))u	   장관실r   u   장관)	   대변인rb   r?  )u   홍보담당관r      과장)u   홍보지원팀r      팀장)	   감사관rb   rB  )u   감사담당관r   r@  )u   제 1차관r   u   1차관)u   운영지원과rb   r@  )u   기획조정실rb      실장)u   정책기획관r      국장)u   기획재정담당관r   r@  )u   혁신행정담당관r   r@  )u   규제개혁법무담당관r   r@  )u   정보관리담당관r   r@  )u   정보보호담당관r   r@  )u   비상안전기획관r   rD  )u   산업재난담당관r   r@  )u   산업정책실rb   rC  )u   산업정책관r   rD  )u   산업정책과r   r@  )u   산업일자리혁신과r   r@  )u   산업환경과r   r@  )u   산업인공지능혁신과r   r@  )u   기업정책팀r   rA  )u   산업공급망정책관r   rD  )u   산업공급망정책과r   r@  )u   소재부품장비개발과r   r@  )u   철강세라믹과r   r@  )u   화학산업팀r   r@  )u   제조산업정책관r   rD  )u   기계로봇제조정책과r   r@  )u   자동차과r   r@  )u   조선해양플랜트과r   r@  )u   엔지니어링디자인과r   r@  )u   첨단민군혁신지원과r   r@  )u   첨단산업정책관r   rD  )u   반도체과r   r@  )u   배터리전기전자과r   r@  )u   바이오융합산업과r   r@  )u   섬유탄소나노과r   r@  )u   디스플레이가전팀r   rA  )u   산업기반실rb   rC  )u   산업기술융합정책관r   rD  )u   산업기술정책과r   r@  )u   산업기술개발과r   r@  )u   산업기술시장혁신과r   r@  )u   규제샌드박스팀r   rA  )u   지역경제정책관r   rD  )u   지역경제총괄과r   r@  )u   지역경제진흥과r   r@  )u   입지총괄과r   r@  )u   중견기업정책관r   rD  )u   중견기업정책과r   r@  )u   중견기업지원과r   r@  )u   유통물류과r   r@  )u   제 2차관r   u   2차관)u   에너지정책실rb   rC  )u   에너지정책관r   rD  )u   에너지정책과r   r@  )u   에너지효율과r   r@  )u   에너지기술과r   r@  )u   전력정책관r   rD  )u   전력산업정책과r   r@  )u   전력시장과r   r@  )u   신산업분산에너지과r   r@  )u   전력계통혁신과r   r@  )u   재생에너지정책관r   rD  )u   재생에너지정책과r   r@  )u   재생에너지산업과r   r@  )u   재생에너지보급과r   r@  )u   수소경제정책관r   rD  )u   수소경제정책과r   r@  )u   수소산업과r   r@  )u   에너지안전과r   r@  )u   자원산업정책국rb   rD  )u   자원안보정책과r   r@  )u   석유산업과r   r@  )u   가스산업과r   r@  )u   석탄산업과r   r@  )u   광물자원팀r   rA  )u   원전산업정책국rb   rD  )u   원전산업정책과r   r@  )u   원전환경과r   r@  )u   원전지역협력과r   r@  )u   원전전략기획관rb   rD  )u   원전수출진흥과r   r@  )u   원전수출협력과r   r@  )   통상교섭본부장r   rE  )   통상차관보rb   rF  )u   통상정책국rb   rD  )u   통상정책총괄과r   r@  )u   미주통상과r   r@  )u   구주통상과r   r@  )u   중남미대양주통상팀r   rA  )u   신통상전략지원관rb   rD  )u   신통상전략과r   r@  )u   디지털경제통상과r   r@  )u   기후에너지통상과r   r@  )u   통상협력국rb   rD  )u   통상협력총괄과r   r@  )u   동북아통상과r   r@  )u   아주통상과r   r@  )u   중동아프리카통상과r   r@  )u   통상교섭실rb   rC  )u   자유무역협정정책관r   rD  )u!   자유무역협정정책기획과r   r@  )u   자유무역협정이행과r   r@  )u   통상협정활용과r   r@  )u   인도태평양통상기획팀r   rA  )u   자유무역협정교섭관r   rD  )u!   자유무역협정협상총괄과r   r@  )u   자유무역협정상품과r   r@  )u$   자유무역협정서비스투자과r   r@  )u!   자유무역협정무역규범과r   r@  )u   다자통상법무관r   rD  )u   통상법무기획과r   r@  )u   세계무역기구과r   r@  )u   다자통상협력과r   r@  )u   통상분쟁대응과r   r@  )u   무역투자실rb   rC  )u   무역정책관r   rD  )u   무역정책과r   r@  )u   무역진흥과r   r@  )u   수출입과r   r@  )u   투자정책관r   rD  )u   투자정책과r   r@  )u   투자유치과r   r@  )u   해외투자과r   r@  )u   무역안보정책관r   rD  )u   무역안보정책과r   r@  )u   무역안보심사과r   r@  )u   기술안보과r   r@  )u   국가기술표준원rb      원장)u	   원장실r   rC  )u   지원총괄과r   r@  )u   표준정책국r   rD  )u   표준정책과r   r@  )u   국제표준협력과r   r@  )u   산업표준혁신과r   r@  )u   전기전자정보표준과r   r@  )u   기계융합산업표준과r   r@  )u!   바이오화학서비스표준과r   r@  )u$   국제표준화기구전략대응팀r   rA  )u   제품안전정책국r   rD  )u   제품안전정책과r   r@  )u   제품시장관리과r   r@  )u   제품안전정보과r   r@  )u   전기통신제품안전과r   r@  )u   생활어린이제품안전과r   r@  )u   적합성정책국r   rD  )u   시험인증정책과r   r@  )u   적합성평가과r   r@  )u   인증산업진흥과r   r@  )u   계량측정제도과r   r@  )u   기술규제대응국r   rD  )u   기술규제정책과r   r@  )u   무역기술장벽협상과r   r@  )u   기술규제조정과r   r@  )u   기술규제협력과r   r@  )u   무역위원회rb   	   위원장)   상임위원r   rI  )u   무역조사실r   rD  )u   무역구제정책과r   r@  )u   산업피해조사과r   r@  )u   덤핑조사과r   r@  )u   덤핑조사지원과r   r@  )u   불공정무역조사과r   r@  )u   판정지원과r   r@  )u   광업등록사무소rb      소장)u	   등록팀r   rA  )u	   심사팀r   rA  )u   동부광산안전사무소rb   rJ  )u   중부광산안전사무소rb   rJ  )u   서부광산안전사무소rb   rJ  )u   남부광산안전사무소rb   rJ  )u   전기위원회rb   rH  )u	   사무국r   u   사무국장)u   경제자유구역기획단rb   u   단장)u   정책기획팀r   rA  )u   혁신지원팀r   rA  )u   서비스투자지원팀r   rA  )u   개발투자지원팀r   rA  )u!   마산자유무역지역관리원rb   rG  u	   관리과r   r@  u   수출산업과r   r@  )u   투자홍보과r   r@  )u!   군산자유무역지역관리원rb   rG  rK  rL  )u   비상계획과r   r@  )u!   대불자유무역지역관리원rb   rG  rK  rL  )u!   동해자유무역지역관리원rb   rG  )u!   율촌자유무역지역관리원rb   rG  )u!   김제자유무역지역관리원rb   rG  rK  rL  )u!   울산자유무역지역관리원rb   rG  rK  rL  zlist[tuple[str, int, str]]_MOTIE_ORDER_POSc                V    t          j        dd| pd                                          S r  )r   r   rz   rx  s    r4   _nkrO    r  r6   c                    | dS |                                  }|                    dd          }t          j        dd|          }|                                S )u^   부서명 정규화: 공백/대소문자/자잘한 오타 보정(예: 베트남어 자모 등)Nr   u   এu   에r  )rm   r   r   r   rz   r   r]   s     r4   
_norm_deptrR    sM    yr			A			%A
vr1A7799r6   uE   [()\[\]{}＜＞〈〉【】]|직무대리|대행|겸임|파견|서리c                    | sdS t                               d|           }t          j        dd|          }|                                S )u]   직위 비교용 키: 괄호·수식(직무대리, 대행 등) 제거 + 공백제거소문자r   r  )_POS_STRIP_REr   r   rz   rQ  s     r4   _pos_keyrU    sE     r"a  A
vr1A7799r6   actualexpectedc                B    t          |           t          |          k    S )uH   직위 동등성: 완전일치 우선. (괄호/수식 제거 후 비교))rU  )rV  rW  s     r4   
_pos_equalrY    s    Fx1111r6   z/org/motie/headsc           
     r  K   	 t                               d                              d                              d                                          j        pg }n# t          $ r g }Y nw xY wt          t                    }|D ]=}|t          |
                    d                                                 |           >|pd                                                                }g }t          D ]!\  }}|dk    rt          |          }	|
                    |	g           }
fd|
D             }dd}|rt          ||d          d         nd }|r|
                    d          nd pd}|r|
                    d          nd p}|r|
                    d          nd pd}|r|
                    d          nd pd}|||||||rdndd}|r.|d                    |||||g                                          v r|                    |           #t"                              d| d||d          S )N	motie_orgz#department,position,name,phone,taskiP  r   r   u   장관정책보좌관c                Z    g | ]'}t          |                    d                     %|(S )r   )rY  rL   )r2   r3   expected_poss     r4   rH   z+org_motie_heads_ordered.<locals>.<listcomp>  s4    PPPqJquuZ/@/@,$O$OPPPPr6   r3   rc   r@   tuplec                    |                      d          r6t          |                      d                                                    rdnd}|                      d          pd}||fS )Nr   rb   r   r   r   )rL   rM   rm   )r3   	has_phoner   s      r4   rankz%org_motie_heads_ordered.<locals>.rank  s]    eeGnnTQUU7^^1D1D1J1J1L1LTSTIEE&MM'RDt$$r6   Tr  r   r   u   (공석)r   r   r   r   z
org-strictrn   )unitindentr   r   r   r   	_expected_srcr   zorg_heads.htmlu   산업통상자원부(MOTIE))r'  ministryrA  rd   )r3   rc   r@   r^  )r7   r8   r9   r  r:   r;   r   r   ry   rR  rL   r"  rm   rz   rM  rN   r   r   r6  )r'  rA  orgby_deptr3   re   rd   rb  rc  dept_keypoolcandsra  pickedr   r   r   r   r^  r]  s                      @r4   org_motie_heads_orderedrm    s     hh{##**+PQQWWX]^^ffhhmsqs    &1%6%6G ; ;
155..//077::::7//


!
!
#
#CE&6  "fl***d##{{8R(( QPPPDPPP	% 	% 	% 	%
 >CL4666q99'-7F###4FJ+1;J'''tL(.8G$$$D@S'-7F###4?C FcE4%0RF
 
  	cchhdC'EFFLLNNOOLL%%)GaZ_``  s   AA A.-A.z/tools/auto-lecturec                @   K   t                               dd| i          S )Nztools_auto_lecture.htmlr'  )r   r6  )r'  s    r4   tools_auto_lecturero    s"      %%&?)WAUVVVr6   )r>   r?   r@   rA   )r]   rM   r@   rM   )r@   ri   )r@   rM   )r@   rE   )r3   r   r@   rc   )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   r   r   r@   rM   )r   r   r@   r   )r   r   r@   rM   )r   r   r@   r   )r   r   r@   r   )r   )r   rM   r   r   r@   rc   )r8   rM   r@   rE   )r   r   r  r  )r8   rM   r  rM   r  rM   r  rM   r  r   r  rE   r@   r  )r'  r   )r'  r   r   rM   rA  rM   )r^  r_  r@   r   )r'  r   r   rM   rA  r   rr  r   rs  r   rt  r   ru  rE   )r'  r   r  r   )r  rM   r@   r  )r  rM   r@   rM   )r   rM   r@   rM   )r'  r   r  rM   )r'  r   r  rM   r  rE   r1  rM   r  )rV  r   rW  r   r@   r   )r'  r   rA  rM   )e
__future__r   loggingr}   r   r   r   r   r   r   pathlibr   typingr   r	   r
   r   r   collectionsr   r   fastapir   r   r   r   r   fastapi.responsesr   r   starlette.templatingr   app.services.supabase_servicer   app.sync2.pipeliner   app	getLoggerrS  __file__resolveparentsTEMPLATE_DIRrM   r   r7   r   r   r!  r  r=   rR   r_   r`   rh   r   r   r   r   r   r   compiler   __annotations__r   r   r   r   r   r   r   r   r   r  r$  rL   r;  r>  r]  rh  rl  r  r  r  r  r   r  r
  r  r0  postr<  r>  rM  rO  rR  rT  rU  rY  rm  ro  r0   r6   r4   <module>r     s   " " " " " " "   				   . . . . . . . . . .       3 3 3 3 3 3 3 3 3 3 3 3 3 3 # # # # # #  @ @ @ @ @ @ @ @ @ @ @ @ @ @ < < < < < < < < 0 0 0 0 0 0 4 4 4 4 4 4 . . . . . .
 gL!!!		<	(	(tH~~%%''/2[@Occ,&7&7888	Z\\
   SRR	

< < <\ \ \ \ %"< 	        .* * * *          .   * RZVWWY^_RZEFFMRZ"##S)0    
       "
 
 
 
   	 	 	 	   % % % % RSS   	/ 	/ 	/ 	/ 	/   : GNEJ(+    2 \**! ! ! +*!F    |4427%2F2F2FQVQV_aQbQbQb v v v v 54v@   ; ; ; ; 66 uU###uT*** 5...t,,,%***U2!444b b b b 76bH 	<88a a a 98a( 	L99< < < :9<| 	\::JO%X\J]J]J] - - - - ;:-d ..   /.0: : : :   1 1 1 1 	!,??. . . @?.` .66 DIId3ii$s))	P P P P 76P> 
(9IJJ
"3CDDV V V ED KJVJ0 J0 J0  J J J JZ1 1 1 1    
cdd   2 2 2 2 	L99=BU2=N=N=N 2 2 2 2 :92n 	|<<W W W =<W W Wr6   