
    !0ix                     
   S SK r S SKrS SKrS SKrS SKrS SKJrJrJrJ	r	  S SK
Jr  S SKJrJrJr  S SKJr  S SKrS SKrS SKJr  S SKJr  S SKrS SKJr  S S	KJr  S SKrS S
KJr  S SK J!r!   S SK"r"Sr# S SK%r%Sr& S SK'J(r(  S SK)J*r+  Sr,\-R]                  SS5      r/S\	\-   S\-4S jr0Sr1\ Rd                  " \1SS9  \" SS9r3S SK4r4S SK5r5S SK6J7r7  S SK8J8r8  S SK9r9\ Rt                  Rw                  SS5      r<Sr=Sr>\ Rt                  Rw                  SS 5      S!:H  r?\4R                  " S"5      rA\AR                  \4R                  5        \7" \<\=\>S#S$9rD\4R                  " S%S&5      rF\DR                  \F5        \AR                  \D5        \ Rt                  Rw                  S'S 5      S!:X  a3  \4R                  " 5       rJ\JR                  \F5        \AR                  \J5        S( rKSS)\-S*\\\-\4      S+\	\-   S,\	\   S-\L4
S. jjrMSS/\-S0\-S1\\\-\4      S2\\-\4   S3\-S-\L4S4 jjrN\R                  " S55      rP\R                  " S6\R                  S79rR\R                  " S8\R                  S79rS\R                  " S9\R                  S79rTS:rUSS; jrVSS<\\-   S=\-S>\	\\-\-4      S\\-   4S? jjrWS@\-S\-4SA jrXS@\-S\-4SB jrY\R                  " SC5      r[S@\-S\-4SD jr\SESFSGSH.r]S\-S\-4SI jr^SJ\-S\-4SK jr_0 SLSM_SNSO_SPSQ_SRSS_STSU_SVSW_SXSY_SZS[_S\S]_S^S__S`Sa_SbSc_SdSe_SfSg_ShSi_SjSe_r`0 SkSl_SmSn_SoSp_SqSr_SsSt_SuSY_SvSw_SxSy_SzS{_S|S}_S~Sp_SS_SS_SS_SS_SS_SSp_SSaSSS[SSSS}S.	Era\" SS9SS\-S\-S\-4S jj5       rbSS\-S\-S\-4S jjrcSS\-S\dS\\-   4S jjre\" SS9SS\-S\dS\\-   4S jj5       rfSS\-S\dS\\-   4S jjrgSS\-S\dS\\-   4S jjrhS\-S\-4S jriSk\-Sm\-S\j4S jrkSFSFSFSGSFS.rlS\-S\-4S jrmSk\-Sm\-S\j4S jrnS\-S\-S\j4S jroS\\-\4   S\\\-\4      4S jrpS\-S\-S\j4S jrqS\-S\-S\j4S jrrS\-S\-S\j4S jrsS\-S\-S\j4S jrtSS\-S\-S\jS\jS\\-\4   4
S jjruS\	\-   S\-4S jrvS\-S\L4S jrwS\	\-   S\-4S jrxS\\\-\4      S\	\\-\4      4S jryS*\\\-\4      S\\\-\4      4S jrzS\R6                  S\4S jr{SS\R6                  S-\LS\\\-\d4      4S jjr|SS\R6                  S\\-\d4   S\-S\dS\-4
S jjr}SS\-S\dS-\LS\\-\\\-\4      4   4S jjr~S\-4S jr " S S\5      r\3GR                  S5      \" S5      4S\4S jj5       rg! \$ a    Sr"Sr# GNf = f! \$ a    Sr& GNf = f! \$ a    Sr, GNf = f)    N)ListDictAnyOptional)	lru_cache)FastAPIHTTPExceptionBody)	BaseModel)extract_text)convert_from_path)Output)Image)fuzz)LevenshteinTF)	sanscript)transliterateu   ০১২৩৪৫৬৭৮৯
0123456789sreturnc                 F   U (       d  g[        U 5      R                  5       nUR                  SS5      R                  SS5      nUR                  [        5      n[
        R                  " SSU5      n[
        R                  " SSU5      n[
        R                  " SSU5      nU$ )	N         ‌z\s*\/\s*/\s+z^[^\w\/\-]+|[^\w\/\-]+$)strstripreplace	translate_BN_DIGITS_TRANSresub)r   s2s     */var/www/html/land-doc-ocr/chatgpt_main.pybn_digits_to_asciir'   4   s    	QB	Hc	"	*	*8R	8B	&	'B	S"	%B	B	B	*B	3BI    	downloadsexist_okz3LandDoc OCR - OpenCV ROI Table Extraction + Matcher)title)RotatingFileHandler)datetimeLANDDOC_LOGzlanddoc_extraction.logi      LANDDOC_LOG_DEBUG01landdoczutf-8)maxBytesbackupCountencodingz%%(asctime)s %(levelname)s %(message)sz%Y-%m-%dT%H:%M:%S%zLANDDOC_DEBUG_CONSOLEc                      [         R                  " U SS9$ ! [         a!    [         R                  " [        U 5      SS9s $ f = f)NF)ensure_ascii)jsondumps	Exceptionr   )objs    r&   
_safe_jsonr?   [   s<    8zz#E22 8zz#c(778s    (AAfile_urlrecsocr_textextradebugc                 8   SU [         R                  " 5       R                  5       S-   Ub  [        U5      OSUS.nU(       a  UR	                  U5        U(       a#  U(       a  [        U5      S:  a  US S S-   OUUS'   [
        R                  [        U5      5        g )Nfile_extractionZr   )eventfile	timestamp
recs_countrA   i  z...ocr_text_preview)r.   utcnow	isoformatlenupdateloggerinfor?   )r@   rA   rB   rC   rD   payloads         r&   log_file_extractionrT   a   s    "__&002S8#'#3c$iG uCFx=SWCWx'>]e"#
KK
7#$r(   
request_idfarmertop_candidatesbestdecisionc                     SU UUUU[         R                  " 5       R                  5       S-   S.n[        R	                  [        U5      5        g )Nfarmer_matchrG   )rH   rU   rV   rY   rW   rX   rJ   )r.   rM   rN   rQ   rR   r?   )rU   rV   rW   rX   rY   rD   rS   s          r&   log_farmer_matchr\   o   sF     (__&002S8G KK
7#$r(   [\u0980-\u09FF]ua   (?:দা\s*গ|দাগ|দাগ নং|দাগ:|দাগঃ)\s*[:\-]?\s*([0-9A-Za-z\/\-]+))flagsu   (?:খত(?:ি|িয়া|িয়|িয়|ান)?\s*(?:নং|ন|No\.?|No|number)?|khatian\s*(?:no|no\.|number))\s*[:\-]?\s*([0-9A-Za-z\/\-]+)u   (?:রায়ত(?:ের)?\s*নাম|রায়তের নাম|রায়ত নাম|মালিক(?:ের)?\s*নাম)   c                   #    U R                  XSS9 IS h  vN nUR                  5         [        R                  " US5      I S h  vN nUR                  R                  S5        S h  vN nUR                  U5      I S h  vN   M$   Nr NE N# N
 UR                  5       I S h  vN    S S S 5      IS h  vN    g ! , IS h  vN  (       d  f       g = f7f)N<   )headerstimeoutwbi   )getraise_for_statusaiofilesopencontentiter_chunkedwriteclose)sessionurl	dest_pathrb   respfchunks          r&   download_filers      s     {{3{<<--	400<<44Y? 	!%''%.  	 =0	!  @ggi =<<<<<s   CB
C+B>BB>&B*B+B.B>BB>
CB>BB>B>&B)'B>,C7B:8C>CCCCurlsdest_dirrb   c                   ^^^#    [         R                  " USS9  [        R                  " [        5      m[
        R                  " 5        IS h  vN m/ n[        U 5       H  u  pE[         R                  R                  UR                  S5      S   5      S   =(       d    SnSU U 3n[         R                  R                  X5      nXX4UUU4S jjn	UR                  [        R                  " U	" 5       5      5        M     [        R                  " U6 I S h  vN n
S S S 5      IS h  vN   U
$  N N N
! , IS h  vN  (       d  f       W
$ = f7f)	NTr*   ?r      z.pdfdoc_c                    >#    T IS h  vN   [        TXTS9I S h  vN   S S S 5      IS h  vN   U$  N) N N
! , IS h  vN  (       d  f       U$ = f7f)N)rb   )rs   )uprb   semsesss     r&   _dldownload_all.<locals>._dl   s?     3'aGDDD 3 D 33sH   A4A:6:A8A:AA AAA)osmakedirsasyncio	SemaphoreMAX_CONCURRENCYaiohttpClientSession	enumeratepathsplitextsplitjoinappendcreate_taskgather)rt   ru   rb   tasksirn   extfnr   r   resr}   r~   s     `        @@r&   download_allr      s     KK4(


O
,C$$&&$oFA''""399S>!#45a8BFCs3%B77<<-D   LL,,SU34 & NNE** '& J ' + '&& Js[   A	ED.ECD4D0D4E'D2(E0D42E4E:D=;EEr   c                      [        U 5      nU(       a  [        UR                  5       5      S:  a  U$ g! [         a     gf = f)NP   r   )r   rO   r   r=   )r   ts     r&   extract_text_from_pdfr      sF    QWWY"$H   s   04 
A Ac           	          / n[        U SS9nU H(  nUR                  [        R                  " USSS95        M*     SR	                  U5      $ )N,  dpiben+engz--oem 1 --psm 6langconfig
)r   r   pytesseractimage_to_stringr   )r   partsimagesimgs       r&   ocr_pdfr      sH    Et-F[009M^_` 99Ur(      c                    ^ #    [         R                  " 5       nU 4S jn[         IS h  vN   UR                  S U5      I S h  vN sS S S 5      IS h  vN   $  N/ N N	! , IS h  vN  (       d  f       g = f7f)Nc                  <   >  [        T 5      $ ! [         a     gf = f)Nr   )r   r=   )r   s   r&   _syncocr_pdf_async.<locals>._sync   s$    	4=  		s   
 
)r   get_running_loopOCR_SEMrun_in_executor)r   loopr   s   `  r&   ocr_pdf_asyncr      sJ     ##%D
 w))$66 ww6 wwwsV   &A9AA9AAAA9AA9AA9A6%A(&A62A9u   মণ্ডলr   r   )u   মন্ডলr   r   c                 b    [         R                  5        H  u  pU R                  X5      n M     U $ N)COMMON_REPLACEMENTSitemsr    )r   kvs      r&   apply_common_replacementsr      s)    #))+IIaO ,Hr(   namec                     U (       d  g[         R                  " SSU 5      n[        U5      n[         R                  " SSU5      R                  5       nU$ )Nr   [\x00-\x1F]+r   r   )r#   r$   r   r   )r   r   s     r&   normalize_bengali_namer      sD    
T*A!!$A
vsA$$&AHr(   khu   খghu   ঘchu   চjhu   ঝthu   থdhu   ধphu   ফbhu   ভshu   শshhu   ষssu   সngu   ঙnyu   ঞrru   ঢ়tru	   ত্রgnau   অbu   বcu   কdu   দeu   এrq   gu   গhu   হr   u   ইju   জr   lu   লmu   মnu   নou   ওr|   u   পq   রu   তu   উu	   ক্সu   য়)	rr   r   r{   r   wxyzi   )maxsizebn_name
scheme_outc                     [        XS9$ )Nr   )transliterate_forward_indic)r   r   s     r&   "transliterate_forward_indic_cachedr      s    &wFFr(   c                 H   U (       d  g[        U 5      n[        (       d  [        R                  " SSU5      $ [        R
                  [        R                  [        R                  [        R                  S.nSn [        U[        R                  UR                  U[        R
                  5      5      n[        R                  " SSU5      R                  5       $ ! [         a?    [        U[        R                  [        R
                  5      n N[! [         a    Sn  Njf = ff = f)Nr   r   r   )KOLKATAITRANSIASTWX)r   _HAS_INDIC_TRANSr#   r$   r   r   r   r   r   it_transliterateBENGALIre   r=   r   )r   r   bn
scheme_mapouts        r&   r   r      s    2		(BBFF63$;;&..):J:JT]TbTbjsjvjvwJ
C#r9#4#4jnnZQZQbQb6cd 66&#s#))++  ##B	(9(99;L;LMS"#"#s*   99C 
D!")DDD!DD!max_variantsc                   ^^ / m[        5       mUU4S jn[        U SS9nU" U5        U" UR                  5       5        U" UR                  SS5      5        U" UR                  SS5      R                  5       5        [        (       ai   [        [        U 5      [        R                  [        R                  5      nU" U5        U" UR                  5       5        U" UR                  SS5      5        [        T5      S S   HB  nU" UR                  SS5      5        [        U5      S:  d  M,  U" US S	 5        U" US
S  5        MD     TS U $ ! [         a     Nef = f)Nc                    > U (       d  g [         R                  " SSU R                  5       5      nUT;  a#  TR                  U5        TR	                  U5        g g )Nr   r   )r#   r$   r   addr   )r   x2seenvariantss     r&   r   &generate_forward_variants.<locals>.add   s>    &VVFC+T>488B<)<>r(   r   r   r   r   r   r      rx   )setr   lowerr    r   r   r   r   r   r   r=   listrO   )r   r   r   r   itrr   r   r   s         @@r&   generate_forward_variantsr     s   H#%4= 	+7yIAFC	NC		#r 23S39K9Q9Q9S5T	"#9'#BIDUDUW`WgWghCHc#))+&CKKR,@(A(^AAIIdC !q6A:s1Sb6{C!"J  M\""	 $s   A(E	 	
EEen_namec                     [        XS9$ )Nr   )reverse_transliterate_indic)r  r   s     r&   "reverse_transliterate_indic_cachedr     s    &wJJr(   c                    U (       d  / $ [         R                  " SSU 5      R                  5       R                  5       n[         R                  " SSU5      n/ n[	        5       n[
        (       d  [        X5      $ [        R                  [        R                  [        R                  [        R                  /nU Hl  n[        U5      U:  a    O\ [        X&[        R                  5      n[        U5      nU(       a+  Xt;  a$  UR!                  U5        UR#                  U5        Mj  Ml  Mn     UR'                  5       n[        U5      U:  a  [        U5      S:  ar   [        SR)                  U5      [        R                  [        R                  5      n	[        U	5      n	U	(       a'  X;  a"  UR!                  U	5        UR#                  U	5        US U $ ! [$         a     GM#  f = f! [$         a     N#f = f)Nz[^a-zA-Z0-9\s]r   r   rx   r   )r#   r$   r   r   r   r   _fallback_reverse_variantsr   r   r   r   r   rO   r   r   r   r   r   r=   r   r   )
r  r   r   r   r   stylessrcr   toksjoineds
             r&   r  r    st   2I
 #w/557==?A
vsAAH#%4$>w$UU	 1 19>>9<<PFx=L(%	#!!)*;*;<B'+BbndhhrlHOOB4Gnr  779D
8}|#D	A	%bggdmY5E5EyGXGXYF+F3F&,dhhv.>PV@WM\"" "(" $s&   AGA1G 
GG
G,+G,c                 *   [         R                  " SSU R                  5       5      R                  5       nUR	                  5       nU(       d  / $ S[
        S[
        4S jnU Vs/ s H
  oT" U5      PM     nnSR                  U Vs/ s H  oU(       d  M  UPM     sn5      nSR                  U Vs/ s H  oU(       d  M  UPM     sn5      n/ n	U(       a  U	R                  U5        U(       a  X:w  a  U	R                  U5        U	S U $ s  snf s  snf s  snf )Nz[^a-z0-9\s]r   tokr   c                    Sn/ nU[        U 5      :  a  US-   [        U 5      ::  a3  XUS-    [        ;   a$  UR                  [        XUS-       5        US-  nMT  US-   [        U 5      ::  a3  XUS-    [        ;   a$  UR                  [        XUS-       5        US-  nM  X   o2R                  [        R	                  US5      5        US-  nU[        U 5      :  a  M  SR                  U5      $ )Nr   r   r   r   rx   )rO   _DOUBLE_MAPr   _SINGLE_MAPre   r   )r  r   r   r   s       r&   roman_to_bn/_fallback_reverse_variants.<locals>.roman_to_bn  s    Rs#c(l1uC S1Q3Z;%>

;WZ]^_`]`WaKb@cefjkekefmu1uC S1Q3Z;%>

;WZ]^_`]`WaKb@cefjkekefmuBKOOB$;<a1fa #c(l wws|r(   r   )r#   r$   r   r   r   r   r   r   )
r  r   r   r  r  r   	bn_tokensspacedr  r   s
             r&   r  r    s    
~sGMMO4::<A779D   *..AQI.XX)1)Qqq)12FRWWQZE`QZA^_aQZE`=aF
Cszz&!&"CJJv$6} /1E`s   #D
DD/
D=Dr   c                    [        U =(       d    S5      nU(       d  gUR                  SS5      R                  SS5      R                  SS5      R                  SS5      nUR                  SS	5      R                  SS	5      nUR                  [        5      n[        R
                  " S
SU5      n[        R
                  " SSU5      R                  5       nU$ )Nr   u   ঃ:u   ।u   –-u   —u   ্রr   u   [^ঀ-৾0-9\s]r   r   )r   r    r!   r"   r#   r$   r   )r   r   s     r&   normalize_bn_for_comparer  ,  s    rxR(AR			%%%eR088DLLUTWXA			(E"**>5AA	$%A
!2q)A
vsA$$&AHr(   c                    [        U 5      n [        U5      nU (       a  U(       d  g[        R                  " X5      S-  n[        R                  " X5      nSU-  SU-  -   nU$ ! [         a    [        R
                  " X5      n NEf = f)N              Y@gffffff?g333333?)r  r   normalized_similarityr=   r   ratiopartial_ratio)r   r   levpartscores        r&   bn_string_similarityr#  6  ss     #A)A!)DQAc006>a#D#Id
"EL ,DJJq,c,s   A" " BB).,r  'z  api_namec                     U =(       d    SR                  5       R                  5       n[        R                  5        H  u  p#UR	                  X#5      nM     [
        R                  " SSU5      R                  5       $ )Nr   r   r   )r   r   EN_REPLACE_MAPr   r    r#   r$   )r'  r   r   r   s       r&   normalize_api_namer*  @  sX    	R &&(A$$&AIIaO&66&#q!''))r(   c                    U =(       d    SR                  5       R                  5       o=(       d    SR                  5       R                  5       nU (       a  U(       d  g[        (       d	  X:X  a  S$ S$  [        R                  " U 5      =(       d    Sn[        R                  " U5      =(       d    SnU(       a  U(       d  g[
        R                  " X#5      $ ! [         a     gf = f)Nr   r  r  )r   r   _HAS_JELLYFISH	jellyfish	metaphoner   r  r=   )r   r   mambs       r&   token_phonetic_scorer1  E  s    	
b!AR'8'>'>'@1Ac>16%:s:!  #)r	0C0CA0F0L"2Czz"!! S s   2AC ?C 
C"!C"api_tokcand_tokc                    U =(       d    SR                  5       o=(       d    SR                  5       nU (       a  U(       d  g[        R                  " X5      n[        R                  " X5      n[        R                  " X5      n[
        R                  " X5      S-  n[        X5      nSU-  SU-  -   SU-  -   SU-  -   SU-  -   $ ! [         a    Sn N6f = f)Nr   r  r  皙?g333333?gffffff?)	r   r   r  r  token_sort_ratior   r  r=   r1  )r2  r3  t1t2t3r   phons          r&   token_score_enr;  O  s    }"##%G>r2H2H2Jx(3	G	&B			G	.B			w	1B00CeK2D"9tby 4"9,tcz9D4KGG Ccs   C CCfile_mapc           	         / nU R                  5        H  u  p#UR                  S0 5      R                  5        H  u  pE[        U[        5      (       a+  UR                  S5      =(       d    UR                  SS5      nOU=(       d    SnS nUR                  S5      (       a  US   S   nUR	                  XbXtS.5        M     M     U$ )Nkhatian_mapr   rawr   daagsr   )r   rI   daag_no
khatian_no)r   re   
isinstancedictr   )r<  r   r@   fmapr   valr   daags           r&   #generate_bn_candidates_from_filemaprH  [  s    
C"..*xxr288:GB#t$$WWT]8cggeR&8YBDxx  G}Q'JJbtVW ; + Jr(   c                    [        U 5      nU(       d  g[        USS9nSnU H  n[        R                  " SSUR	                  5       5      R                  5       n[        R                  " X&5      n[        R                  " X&5      n[        R                  " X&5      S-  n	SU-  SU-  -   S	U	-  -   n
X:  d  M  U
nM     US-  $ !   Sn	 N)= f)
Nr     r  [^0-9a-z\s]r   r  g?      ?r5  )r*  r  r#   r$   r   r   r   token_set_ratior  r   r  )r'  r   api_normr   rX   r   v_normtsprr   combineds              r&   match_forwardrS  j  s    !(+HC("=HDQWWY7==?!!(3144XFNS"9tby(4#:5?8D  %< 	cs   CCc                     U (       d  g[        U SS9nSn[        U5      nU H  n[        XE5      nXc:  d  M  UnM     US-  $ )Nr  rJ  r  r  )r  r  r#  )r'  r   rvrX   bn_normcandscs          r&   match_reverserY  y  sK    C	+H2	FBD226!'09Rd  %<r(   bn1bn2c                    U (       a  U(       d  g[        U 5      R                  5       n[        U5      R                  5       nU(       a  U(       d  g[        UR                  5       S   UR                  5       S   5      S-  $ )Nr  r   r  )r  r   r#  r   )rZ  r[  r   r   s       r&   surname_similarity_bnr]    s\    c# %++-A3KC3P3V3V3XqAc	"qwwy}=EEr(   c                    [        U5      nUR                  5       nU(       a  US   OSn[        U 5      nUR                  5       (       a  UR                  5       S   OSnSn [        U SS9nU HV  n	U	R                  5       (       a  U	R                  5       S   OSn
U
(       d  M6  U(       d  M?  [	        XJ5      S-  nX:  d  MT  UnMX     Sn [        USS9=(       d    SnU(       aE  [        R                  " S	S
UR                  5       5      R                  5       R                  5       S   OSnU(       a  U(       a  [        Xn5      S-  n[        X|5      $ ! [
         a    Sn Nf = f! [
         a    Sn N+f = f)Nr   r   r     r  r  r   r   rK  r   )r  r   r*  r  r#  r=   r   r#   r$   r   r   r;  max)r'  r   rV  r  bn_firstrN  	api_firstbest_bn_space	rev_candsrcrc_firstrX  best_en_spacefwd	fwd_firsts                  r&   first_name_similarityrj    sG   &r*GI(y|bH!(+H'/~~'7'7 #RIM6xaP	B(*

rxxz!}HxHH)(=E%r}	  M0	JPbSVBFF>3		<BBDJJLQO\^	N94X[`4`M },,    s7   ">E $E -E E A=E% E"!E"%E43E4surname_boostsurname_thresholdc                 ,   [        X5      n[        X5      nXE:  a  UOUodU:  a  SOSnSn [        U SS9n	Sn
U	 H  n[        X5      nX:  d  M  Un
M     U
nUnU(       a  X:  a  [        SXb-   5      n[        X5      nXEXXS.$ ! [         a    Sn N;f = f)Nforwardreverser  r_   r        ?)forward_scorereverse_score
best_scorebest_directionsurname_similarityrj  )rS  rY  r  r]  r=   minrj  )r'  r   rk  rl  rq   r   	base_bestbest_dirsurname_simrd  
best_rev_sre  ssimboostedfn_sims                  r&   hybrid_matchr~    s    h#Ax)DQVIFy	HK(6xaP	
B(0D t*  !G9SiNgEh7"80F'  ~I  k  k	 'Ck's   B B BBc                 (   U (       d  g[         R                  " SS[        U 5      5      n U R                  SS5      R                  SS5      R                  SS5      R                  SS5      n [         R                  " SSU 5      R	                  5       n U $ )	Nr   z[\x00-\x1F\x7F]+r      ﻿   ​r   r   r   )r#   r$   r   r    r   )r   s    r&   strip_control_charsr    sw    R
"CQ0A			(3''5==hrJRRSYZ]^A
vsA$$&AHr(   c                     U (       d  g[        U 5      n[        R                  " SU5      (       a  g[        R                  " SU5      n[	        U5      S:  a  gg)NFu8   \bদাগ\b|\bদাগ\s*নং\b|\bদােগর\br]   r   T)r  r#   searchfindallrO   )r   r%   bengali_letterss      r&   is_valid_raiter_textr    sI    U	Q	B	yyLbQQZ_jj!3R8O
?ar(   kh_rawc                     U (       d  g[        [        U 5      5      n[        R                  " SSU5      nUR	                  [
        5      n[        R                  " SU5      nU(       a  UR                  S5      $ U$ )Nr   r   z([0-9]{1,6}(?:\/[0-9]{1,4})?)rx   )r  r   r#   r$   r!   r"   r  group)r  r   r   s      r&   normalize_khatian_rawr    s\    "CK(A
vr1A	$%A
		2A6A
Hr(   
candidatesc                    S nSnU  H|  nUR                  S5      =(       d    Sn[        U5      n[        U5      (       d  M:  [        [        R
                  " SU5      5      nUS-  [        U5      -   nXr:  d  Mr  Un0 UESU0EnM~     U$ )Nr   raiterr   r]   
   raiter_clean)re   r  r  rO   r#   r  )r  rX   rs  r   r?  cleanedbengr"  s           r&   pick_best_raiter_for_khatianr    s    DbeeHo#%c*#G,,h2::0':;r	CL(J'E!'E^W'E  Kr(   c           	         U (       d  / $ U  H  nUR                  S5      =(       d    SUS'   [        UR                  S5      =(       d    S5      US'   UR                  S5      =(       d    SUS'   [        US   5      US'   UR                  S5      =(       d    SUS'   US   (       a  [        [	        US   5      5      OUR                  S5      =(       d    SUS'   M     0 nU  H>  nUR                  S5      =(       d    SnUR                  U/ 5      R                  U5        M@     / nUR                  5        H  u  p5[        U5      nU(       aH  UR                  UR                  S5      U=(       d    S UR                  S5      [        U5      S	.5        M_  [        US
 S9nUR                  UR                  S5      U=(       d    S UR                  S5      =(       d    SR                  5       [        U5      S	.5        M     [        5       n/ n	U Hc  n
U
R                  S5       SU
R                  S5       SU
R                  S5       3nX;  d  MA  UR                  U5        U	R                  U
5        Me     U	$ )Nr  r   
raiter_rawkhatiankhatian_rawrG  daag_rawr  )rG  r  r  source_countc                 r    [        [        R                  " SU R                  S5      =(       d    S5      5      $ )Nr]   r  r   )rO   r#   r  re   r   s    r&   <lambda>!clean_recs_list.<locals>.<lambda>  s(    BJJ?QSTSXSXYaSbShfh4i0jr(   key::)re   r  r  r'   r   
setdefaultr   r   r  rO   r`  r   r   r   )rA   r   by_khr   r  r  rX   fallbackr   r   r   r  s               r&   clean_recs_listr    s5   %%//R,)!%%/*?R@(55+1r-,Q}-=>)f+*>?
m&s1Z='9:QRQVQVW]Q^Qdbd&	  EUU9#R ''*  G[[]	+E2NNDHHV$4tW[W_W_`nWo  BE  FK  BL  M  N5&jkHNNHLL$8RZ4\d\h\hiq\r\xvx[[  \B  TW  X]  T^  _  ` # 5D#vr!%%	"2!32aeeHo5FG?DHHSM3::a=  Jr(   img_pilc                     [         R                  " U 5      nUR                  S:X  a'  [        R                  " U[        R
                  5      nU$ UnU$ )Nr   )nparrayndimcv2cvtColorCOLOR_RGB2GRAY)r  arrgrays      r&   image_to_gray_cvr    sD    
((7
C
xx1}||C!3!34 K Kr(   c           	         [         (       d  / $ [        U 5      n[        R                  " USS5      n[        R                  " US[        R
                  [        R                  SS5      n[        R                  " [        R                  [        SUR                  S   S-  5      S45      n[        R                  " [        R                  S[        SUR                  S   S	-  5      45      n[        R                  " U[        R                  USS
9n[        R                  " U[        R                  USS
9n[        R                  " Xx5      n	[        R                  " [        R                  S5      n
[        R                  " XSS
9n[        R                  " U[        R                   [        R"                  5      u  p/ nUR                  S S u  nnU H  n[        R$                  " U5      u  nnnnUS:  d  US:  a  M,  UUS-  :  a  UUS-  :  a  M@  ['        [)        SUS-  5      5      n['        [)        SUS-  5      5      n[        SUU-
  5      n[        SUU-
  5      n[)        UU-
  UUS-  -   5      n[)        UU-
  UUS-  -   5      nUR+                  UUUUS.5        M     [-        US S9n/ nU H  nU(       d  UR+                  U5        M  US   nUS   US   US   S-  -   :  ar  [)        US   US   5      n[)        US   US   5      n [        US   US   -   US   US   -   5      U-
  n![        US   US   -   US   US   -   5      U -
  n"UU U!U"S.US'   M  UR+                  U5        M     U$ )N)r   r   r         	   r  rx   (   r   )
iterationsr      皙?g{Gz?g?rJ  )r   r   r   r   c                     U S   $ )Nr    )r   s    r&   r  &detect_table_rois_cv.<locals>.<lambda>  s    afr(   r  r   r   r   333333?r   r   )_HAS_CV2r  r  GaussianBluradaptiveThresholdADAPTIVE_THRESH_MEAN_CTHRESH_BINARY_INVgetStructuringElement
MORPH_RECTr`  shapemorphologyEx
MORPH_OPENr   dilatefindContoursRETR_EXTERNALCHAIN_APPROX_SIMPLEboundingRectintrv  r   sorted)#r  rD   r  blurr   horiz_kernelvert_kernelhoriz_lines
vert_linesmaskkernel	connectedcontours_roisr   r   cntr   r   wwhhpad_xpad_yrxryrwrhmergedr   lastnxr   nrnhs#                                      r&   detect_table_rois_cvr    s   8	G$DD%+D			tS#*D*DcF[F[]_ab	cB,,S^^c"djjQRmUWFW>XZ[=\]L++CNNQB

STWYHY@Z<[\K""2s~~|PQRK!!"cnnkaPJ77;+D&&s~~u=F

4A6I""9c.?.?AXAXYKHD::bq>DAq$$S)	!Br7b2gx#:"qv+xCBtG$%CBsFO$AeG_3q!E'?b2r%'z"QrT2eAg:)>B"2BR89  $,-DFMM!hbzS6DIS	#--T#Y#'Bc$s)QsV.DT#YtCy(!C&3-82=BT#YtCy(!C&3-82=B!"=F2JMM!  Mr(   roir   psmc                 p   US   US   US   US   4u  pEpgU R                  XEXF-   XW-   45      nSU 3n	[        R                  " XU	S9n
[        R                  " SSU
5      n
U
R                  S	S5      R                  S
S5      R                  SS5      n
[        R                  " SSU
5      R                  5       $ )Nr   r   r   r   z--oem 1 --psm r   r   r   r  r  r   r   )cropr   r   r#   r$   r    r   )r  r  r   r  r   r   r   r   r  cfgtxts              r&   ocr_roi_textr  #  s    #hC#c(CH4GA<<QS&D3%
 C

%
%dc
BC
&&#s
+C
++hs
#
+
+HS
9
A
A&
MC66&#s#))++r(   pdf_pathr   c           
      (   [         (       d  / / S.$ [        XS9n/ n/ n[        U5       GHD  u  pg[        XrS9nU(       a$  [        R                  SU S[        U5       35        U GH  n	[        XySSS9n
U
(       a  [        U
R                  5       5      S	:  a  M5  U
R                  5        Vs/ s H)  oR                  5       (       d  M  UR                  5       PM+     nnU H  nS
U;   d  SU;   d  SU;   d  SU;   d  M  [        R                  " SUR                  SS5      5      nU(       d  MM  UR                  S5      R                  [        5      nUR!                  XUS.5        M     [        U5       GH8  u  pSU;   d  SU;   d  SUR#                  5       ;   d  M(  [        R                  " SUR                  SS5      5      nU(       a$  UR                  S5      R                  [        5      OSnSnUS-   [        U5      :  a-  XS-      n[        [        R$                  " SU5      5      S	:  a  UnU(       d_  [        R&                  " SUSS9n[        U5      S:  a:  [        [        R$                  " SUS   5      5      S	:  a  US   R                  5       nUR!                  UUXiS.5        GM;     U H  n[        [        R$                  " SU5      5      S:  d  M)  [        UR'                  5       5      S::  d  MH  [        R                  " SU
R                  SS5      5      nU(       a$  UR                  S5      R                  [        5      OSnUR!                  UXU	S.5        M     GM     GMG     S nU" USS/5      nU" U/ SQ5      nXES.$ s  snf )Nr@  khatiansr   rD   zpage z rois: r   r_   )r   r  r   u	   দাগu
   দা গu   দাগ নংu
   দাগ:u.   ([0-9০১২৩৪৫৬৭৮৯\/\-]{1,8})r   r   rx   )daag_label_line
daag_valuepageu   খতu   খতিয়ানr  r]   z[:\-])maxsplit)r  r  r  r     c                    ^ [        5       n/ nU  HA  m[        U4S jU 5       5      nXB;  d  M  UR                  U5        UR                  T5        MC     U$ )Nc              3   H   >#    U  H  nTR                  US 5      v   M     g7f)r   N)re   ).0r   its     r&   	<genexpr>Aextract_tables_via_opencv.<locals>.dedupe_list.<locals>.<genexpr>W  s     1DqbffQrllDs   ")r   tupler   r   )lstkeysr   r   r   r  s        @r&   dedupe_list.extract_tables_via_opencv.<locals>.dedupe_listT  sI    uBcB1D11A}SZZ^  
r(   r  r  )r  r  r  )r  r   r   r  rQ   rR   rO   r  r   
splitlinesr#   r  r    r  r!   r"   r   r   r  r   )r  r   rD   pages
daag_itemskhatian_itemspidxr   r  r  r  lnlinesr   rF  r   r   r  rW  r   r  s                        r&   extract_tables_via_opencvr
  ,  s   8,,h0EJMu%	#C5KK%vWSYK89CsiQ?C#ciik*Q.*-..*:I*:BhhjZRXXZ*:EI"$(:>PTV>VZfjlZl		"SUWU_U_`cegUhiAqggaj223CD"))b]a*bc   #5)r>%9R%?9PRPXPXPZCZ		"SUWU_U_`cegUhiACD--.>?"BFsSZ'$qSzrzz*<dCDI%)F! "2 Bu:>c"**=OQVWXQY2Z.[]^.^%*1X^^%5F!((R6SW)de * rzz"4b9:a?C
OWXDX		"SUXU`U`adfhUijACD--.>?"B!((R2\_)`a	 3 	 &D Z,)?@J/LMM;;I Js   ,NNtextc                    [         R                  " SSU =(       d    S5      nUR                  5        Vs/ s H)  o"R                  5       (       d  M  UR                  5       PM+     nn[        R                  U =(       d    S5       Vs/ s H!  oDR                  S5      R                  5       PM#     nnU Vs/ s H  of(       d  M  [        U5      PM     nn/ n[        R                  U =(       d    S5       GH  nUR                  5       oXS-    n
U
R                  5        H  nUR                  5       n[        R                  U5      (       d  M/  S[        U5      s=::  a  S::  d  MG  O  MK  U(       a  US   OS nS nU [        SUR                  5       S	-
  5      UR                  5       S	-    n[        R                  U5      nU(       a*  UR                  S5      R                  5       n[        U5      nUR!                  XUS
.5        M     GM     [#        U5       H  u  nn[         R                  " SU5      nU(       d  M&  UR                  S5      n[        U5      n[%        SS5       H{  nUU-   [        U5      :  d  M  UUU-      n[        R                  U5      (       d  M;  S[        U5      s=::  a  S::  d  MS  O  MW  U(       a  US   OS nUR!                  UUUS
.5          M     M     ['        5       n/ nU Hd  nUR)                  S5       SUR)                  S5       SUR)                  S5       3nUU;  d  MB  UR+                  U5        UR!                  U5        Mf     U$ s  snf s  snf s  snf )Nz\rr   r   rx   r   r      r      )rG  r  r  z!\b([0-9]{1,6}(?:\/[0-9]{1,4})?)\br  x   rG  r  r  r  )r#   r$   r  r   DAAG_REfinditerr  r'   RAITER_LABEL_REend
BENGALI_REr  rO   r`  start
KHATIAN_REr   r   ranger   re   r   )r  	text_normr  r	  r   	daags_rawr   r@  resultsr  snippetrG  r   backkmr  r   mnumkid_rawkidr   nxtr   r   r   r  s                             r&   %extract_daag_khatian_raiter_from_textr"  `  s   uT4:2.I"+"6"6"8G"8BHHJZRXXZ"8EG-4-=-=djb-IJ-I!!#-IIJ,5;Iq""IE;G%%djb1Ci#8$$&BB  $$c"g)<)<)<#(uQxdC!'')C-0!%%'#+>&&t,XXa[..0F+F3BrJK ' 2 5!2yy=rB4jjmG$W-C1QZQ3U#!*C!((--!s3x2F32F2F+0uQxdPS'TU   " 5D#vr!%%	"2!32aeeHo5FGd?DHHSM3::a=  JC HJ;s   M M (M%4
M*M*c                       \ rS rSr% \\   \S'   \\   \S'   \\   \S'   \\   \S'   \\S'   Sr\	\
   \S'   S	r\	\   \S
'   Srg	)SimpleCheckRequesti  rG  r  rV   files	thresholdF	force_ocrNrU   r  )__name__
__module____qualname____firstlineno__r   r   __annotations__floatr'  r   boolrU   __static_attributes__r  r(   r&   r$  r$    sK    
s)O#YI9 %Ix~% $J$r(   r$  z/quick_check.reqc                   #     [        U R                  5      n[        S[	        SU5      5      n[        U SS 5      =(       d    [        [        R                  " 5       5      nSnSnSnSnSn[        R                  " S	S
9n  [        U R                  U5      I S h  vN n	0 n[!        5       n[!        5       n[#        [        U SS5      5      n[%        U R                  U	5       GH  u  nn/ / S.n [&        (       a  [)        USSS9n/ 0 0 S.nSnU(       Ga}  UR/                  S5      (       d  UR/                  S5      (       GaP  UR/                  S/ 5       Ha  nUR/                  S5      =(       d    Sn[1        U5      nU(       d  M1  UUS   ;  d  M<  US   R3                  U5        UR5                  U5        Mc     UR/                  S/ 5       H  n[1        UR/                  S5      =(       d    S5      nUR/                  S5      =(       d    Sn[7        U5      nU(       d  MT  U=(       d    U=(       d    SUUR/                  S5      S.US   U'   UR5                  U5        US   U   R/                  S5      (       d  M  UUS    US   U   S   '   M     SnU(       Gd  SnU(       a  [9        U5      I S h  vN nOB[;        U5      nU(       a  [=        UR?                  5       5      S!:  a  [9        U5      I S h  vN n[A        U5      n[C        U5      n [E        UU[F        (       a  UOS S"U0[F        S#9  U GH?  nUR/                  S%5      (       a,  [1        [        UR/                  S%5      =(       d    S5      5      OS nUR/                  S5      =(       d    S n[7        UR/                  S5      =(       d    S5      nU(       a.  UUS   ;  a%  US   R3                  U5        UR5                  U5        U(       d  M  U=(       d    UR/                  S5      =(       d    SUR/                  S5      S&.US   U'   UR5                  U5        US   U   R/                  S5      (       d  GM.  UUS    US   U   S   '   GMB     O7 [E        UUR/                  S/ 5      UR/                  S/ 5      -   S S'S(0[F        S#9  UX'   GM     / n/ n U RH                   HD  n![1        [        U!5      5      U;  d  M  UR3                  [        U!5      U R                  S*.5        MF     U RJ                   HD  n"[1        [        U"5      5      U;  d  M  U R3                  [        U"5      U R                  S+.5        MF     [M        U5      n#/ n$/ n%U RN                   GH[  n&SS S S S S SSSSS,.
n'/ n(U# GH?  n)U)R/                  S5      n*U*(       d  M  [Q        U&U*XVS-9n+U+S.   n,U(R3                  U*U)R/                  S/5      U)R/                  S05      U)R/                  S15      U,U+R/                  S25      U+R/                  S35      U+R/                  S45      U+R/                  S55      S6.	5        U,U'S.   :  d  M  U+R/                  S55      n-U-c  [S        U&U*5      n-U'RU                  U,U*U)R/                  S/5      U)R/                  S05      U)R/                  S15      U+S7   U+S2   U+S3   U+R/                  S4S5      U-S,.
5        GMB     [W        U(S8 SS99S S: n. U'S.   U:  d  U'S4   U:  a  U'S5   U:  a  S;OS<n/[Y        UU&U.U'U/[F        S=9  U'S.   U:  n0U'S4   U:  =(       a    U'S5   U:  n1U0=(       d    U1n2Sn3U0(       a  U'S5   U:  a  Sn3U2(       a@  U%R3                  U&U'S?   U'S@   U'SA   U'SB   U'S.   U'SC   U'S2   U'S3   U'S4   U'S5   U3U.SD.5        GM  U$R3                  U&U'S.   U'S@   U'S?   U'SA   U'SB   U'SC   U'S2   U'S3   U'S4   U'S5   U.SE.5        GM^     [=        U5      [=        U 5      -   [=        U$5      -   [=        U5      [=        U 5      [=        U$5      SF.n4U4SG   SH:X  a  SIOSJn5 [*        R[                  []        SKU[=        U5      [=        U 5      [=        U$5      U5[^        R`                  " 5       Rc                  5       SL-   SM.5      5        UU U$U4U5U%SO.[        R                  " USS9  $ ! [         a    Sn GNf = f GN*! [         a'  n
[        R                  " USS9  [        SSU
 3S9eS n
A
ff = f! [         a&  n
[*        R-                  SU
5        / / S.n S n
A
GN"S n
A
ff = f GN~ GN>! [         a    [*        R-                  S$U5         GN(f = f! [         a    [*        R-                  S)U5         GNf = f! [         a    [*        R-                  S>U&5         GNf = f! [         a    [*        R-                  SNU5         GN9f = f! [        R                  " USS9  f = f7f)PNg      ?r  rp  rU   r  g?r  rL  quickcheck_)prefixT)ignore_errorsi  zdownload_error: )status_codedetailr'  Fr  r   )r   rD   z$extract_tables_via_opencv failed: %s)r@  r>  bn_to_khatianr@  r  r  r   r  r  )r   r?  orig_khatianr>  r   r7  r   cleaned_recs)rB   rC   rD   z!log_file_extraction failed for %srG  )r   r?  methodopencv_tablez)log_file_extraction (table) failed for %s)rG  files_checked)r  r<  )
rs  best_bn	best_file	best_daagbest_khatian	directionrq  rr  ru  rj  )rk  rl  rs  rI   rA  rB  rq  rr  ru  rj  )	r   rI   rG  r  r"  rq  rr  ru  rj  rt  c                     U S   $ )Nr"  r  r  s    r&   r  quick_check.<locals>.<lambda>  s    '
r(   )r  ro  r   matchedmissingr  z%log_farmer_match failed for farmer %sr>  r=  r?  r@  rA  )rV   matched_filefound_bengalirA  rB  r"  rA  rq  rr  ru  rj  weak_firstnamerW   )rV   rs  rG  rI   rA  rB  rA  rq  rr  ru  rj  rW   )total_mismatchesdaag_mismatcheskhatian_mismatchesfarmer_mismatchesrI  r   ACCEPTEDREJECTEDrequest_summaryrG   )rH   rU   missing_daagmissing_khatianmissing_farmerstatusrJ   z$Failed to log request_summary for %s)rP  rQ  rR  summaryrS  matches)2r-  r&  r=   r`  rv  getattrr   uuiduuid4tempfilemkdtempr   r%  shutilrmtreer	   r   r.  zipr  r
  rQ   	exceptionre   r'   r   r   r   r   r   rO   r   r"  r  rT   VERBOSE_LOG_OCRrG  r  rH  rV   r~  rj  rP   r  r\   rR   r?   r.   rM   rN   )6r0  r&  rU   SURNAME_REQUIREDFIRSTNAME_REQUIREDSURNAME_BOOSTSURNAME_THRESHOLDFIRSTNAME_SAFETY_FLOORtempd
downloadedr   r<  global_daagsglobal_khatiansuse_ocrr@   
local_pathtablesrE  used_table_extractionr   r   r   r   bn_rawrV  r  raw_recsrA   r   rG  rP  rQ  dqkqbn_candidatesrR  matches_foundfarmer_qbest_overallcands_scoresrW  r   r   r"  r}  rW   rY   is_high_scoreis_strict_component_matchstructured_matchweak_firstname_flagrT  rS  s6                                                         r&   quick_checkrz    sR
    #--(	 CS),-IlD1FS5FJ M!M2Ex1	P+CIIu==J
 u%wsK78$'		:$> Hj!r2F786zsRWXF
  RHD$)!6::g..&**Z2H2HGR0Al+1rA*1-AqQd7m3W,,Q/1A1A!1D	 1  J3A+AEE),<,BCBUU8_2F4V<Gr9@9PF9PbY_qrqvqv  xA  rB  3C]+B/'++B/.r266t<<SUD1$}2Eb2I$2OP 4 )-%(!.z!::D0<D3tzz|#4r#9%2:%>>@F&x0T'(__Tbfo}  @D  oE  M\  ] AKL55QW==-c!%%-2E2.FG^bDy)1TB4QUU8_5JKGDM 9W,,T2L4D4DT4Jr9@9YAEE(O9YWYbcbgbghpbq2r]+B/'++B/.r266t<<SUD1$}2Eb2I$2OP \'&**Z2LvzzZaceOf2fqu  G  HV  ~W  _n  o "&HI %?L ((B!#b'*,>##SWsyy$QR  ++B!#b'*/A&&3r7SYY'WX  <HE

H*-$T)-tRV-0325PSUL L%XXd^"8R}rL)##dhhv&6@S`d`h`hiu`v"SWW_5M`c`g`ghw`x*-''2F*Gbebibi  kB  cC% 
 <55 WW%<=F~0EhPR0Sv ''&+RXIY%)XXi%8$((S_J`%()9%:SQ`Ma),_)=UXU\U\]qsvUw17)  &* $L6JTXYZ\[\]NT)5l)Cy)PUabvUw  |L  VL  Q]  ^u  Qv  zL  QL9  T] X~|U]etu *,79DM)56J)KO_)_  *`dp  rI  eJ  N`  e`%,I0I"'.E!FI_!_&*#$$&$0$=%1)%<+K8".~">),7!-k!:%1/%B%1/%B*67K*L-9:Q-R&9&4&   %%&".|"<%1)%<(5+K8".~">!-k!:%1/%B%1/%B*67K*L-9:Q-R&4' u #R (+<'83;O'ORUVdRe'e&),&7),_)=(+N(;=  ''9:a?Z	QKK
,=:ehiuev69/6J\_`n\oy191B1L1L1NQT1T$V W X !-dr"fP 	e40K  	 > 	PMM%t4C:J1#8NOO	P  7  !GK#%267< ;  ? ! T$$%H(ST$ ! \$$%PRZ[\b  T  !H(STh  	QCZP	Q 	e40s  g*b1 A&g*c cc Ag .c;A<g g Bg Ag :6g 0d.1Ag 3d14g  d4/Cg 4A&g g 76e-2g #Ag 7Dg Bg &1fDg .A%f) g g*1c=g* cg*c 
c8"c33c88g ;
d+d& g &d++g 1g 4 eg eg  e?;g >e??g  f&"g %f&&g ) g	g gg g''g*)NNF)Fr   )r   )rJ  )r_  )r  r  )r   r_   )r   F)r   r#   r[  rY  r   typingr   r   r   r   	functoolsr   fastapir   r	   r
   pydanticr   r   rg   pdfminer.high_levelr   	pdf2imager   r   r   PILr   numpyr  	rapidfuzzr   rapidfuzz.distancer   r  r  r=   r-  r,  indic_transliterationr   indic_transliteration.sanscriptr   r   r   r   	maketransr"   r'   DOWNLOAD_DIRr   apploggingr;   logging.handlersr-   r.   rW  environre   LOG_PATHLOG_MAX_BYTESLOG_BACKUP_COUNTr_  	getLoggerrQ   setLevelINFOfh	Formatter	formattersetFormatter
addHandlerStreamHandlerr   r?   r.  rT   r\   compiler  Ir  r  r  r   rs   r   r   r   r   r   r   r   r   r   r  r  r   r   r  r  r  r  r  r  r-  r#  r)  r*  r1  r;  rH  rS  rY  r]  rj  r~  r  r  r  r  r  r  r  r  r
  r"  r$  postrz  r  r(   r&   <module>r     s0	  
 
 	    , ,  0 0    , '      *HN
/Q
 ==!A<P 	(3- 	C 	  L4 (IJ  0  ::>>-)AB  **..!4c:cA			9	%  MGWbijEG\]	 	    " ::>>)3/36				 BOOI
b8%# %T$s3w--@ %HUXM %goptgu %  DH %
% 
%c 
%4SQTWCV 
%^bcfgjcj^k 
%wz 
%  DH 
% ZZ*+

**y  BD  BF  BF  GZZ _
$$
 **  l  tv  tx  tx  y T#Y # cRUg@W cghkcl $  # #  

A
7c 7c 7 +<sVXY   
  %u"E+/8<eEI5%u"E+0%9=uFJE 	% x "&{ 59%U(+U47@CULOQVX[]bU(+U47@CULOQVX[]b  UUQV]hot  |A 4G G GUX G G, ,# ,c ,#s ## #tCy #$ 4K K3 KtTWy K K# #C #S	 #. # DI &  C C E  s#>* * *
!C !C !E !	HC 	H3 	H5 	H$sCx. T$sTWx.EY C S U C S U Fs F F F-C -S -U -2k3 kC k kX] khlmprumuhv k$8C= S C D (3- C 
T$s3w--@ 
XdSVWZSZmE\ 
$tCG}- $tCG}2E 8ekk c &%++ &d &T$sSVw-EX &P,%++ ,DSM , ,UX ,_b ,1< 1<# 1<D 1<SWX[]abfgjkngnbo]pXpSq 1<h# #L% % .04S	 H1- H1 H1g  
CH  N  s6   ,U 3U :U- 
UUU*)U*-U98U9