
    IEiy              	         d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dl	Zd dl
mZ d dlmZmZmZmZmZmZ d dlmZ dd
ZdddZddZddZi ddddddddd d!d"d!d#d$d%d$d&d'd(d'd)d*d+d*d,d-d.d-d/d0d1d0d2d3i d4d3d5d6d7d6d8d9d:d9d;d<d=d>d?d@dAd@dBdCdDdEdFdEdGdHdIdHdJdKdLdKZh dMZddPZddSZddVZddWZddZZdd]Z dd^ddcZ!ddeZ"e G df dg                      Z#ddiZ$ddmZ%dddnddodpdqdrdsddZ&dS )    )annotationsN)	dataclass)AnyDictListOptionalTupleCallable)get_identity_defaultspayloadDict[str, Any]returnOptional[str]c                   |                      d          }t          |t                    r|                     d          }t          |t                    r&|                     d          }|rt          |          S |                     d          }t          |t                    rI|rGt          |d         t                    r,|d                              d          }|rt          |          S |                      d          }t          |t                    r&|                     d          }|rt          |          S dS )z
    Your PHP output:
    {
      "status":"success",
      "data":{
        "config":{"yolo_model_path":"C:\\...\\best.pt"},
        "rules":[{"yolo_model_path":"C:\\...\\best.pt", ...}]
      }
    }
    dataconfigyolo_model_pathrulesr   N)get
isinstancedictstrlist)r   r   cfgpr   s        '/var/www/html/policy_provider_llm_v2.py_extract_yolo_model_pathr      s&    ;;vD$ hhx  c4   	)**A 1vv!!eT"" 	u 	E!Hd1K1K 	a.//A 1vv ++h

C#t GG%&& 	q66M4          (@   urlr   params	timeout_sfloatretriesintc                   dd l }dd l}dd l}|j                            d |                                D                       }| d| v rdndz   |z   }ddddd	d
d}	|j                            d          }
|
rd|
 |	d<   d }t          |dz             D ]}	 |j	        
                    ||	d          }|j	                            ||          5 }t          |dd           p|                                }|                                }|j                            dd          }|j                            dd          pd                                }|                                }d d d            n# 1 swxY w Y   |dk    r'	 |                    |          }n# t&          $ r Y nw xY w	 |                    d          }n'# t*          $ r |                    dd          }Y nw xY w|pd                                }|st/          d| d| d| d          |                    d           rud!|d d"                                         v sd#|d d$                                         v r9|d d%                             d&d'          }t/          d(| d| d| d)|           	 t5          j        |          c S # t4          j        $ r?}|d d%                             d&d'          }t/          d*| d| d| d)|           |d }~ww xY w# |j        j        $ r}|}	 |                                }	 |                    dd          }n# t&          $ r t?          |          }Y nw xY w|pdd d%                             d&d'          }n# t&          $ r d}Y nw xY w|j         d+k    rt/          d,| d)|           |||k     r tC          j"        d-d.|z  z             Y d }~Rt/          d/| d0| d)|           |d }~wt&          $ rC}|}||k     r tC          j"        d-d.|z  z             Y d }~t/          d1| d0|           |d }~ww xY wt/          d1| d0|           )2Nr   c                    i | ]
\  }}|||S N ).0kvs      r   
<dictcomp>z"_http_get_json.<locals>.<dictcomp><   s     R R R$!QAMAMMMr   ?&zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36z!application/json, text/plain, */*zen-US,en;q=0.9,fa;q=0.8zhttps://chat.fxtrendo.com/closezgzip, deflate)z
User-AgentAcceptzAccept-LanguageReferer
ConnectionzAccept-EncodingKYC_RULES_TOKENzBearer Authorization   GET)headersmethod)timeoutstatuszContent-Type zContent-Encodinggzipzutf-8zlatin-1replace)errorszEmpty response body (status=z, url=z, ctype=)<z<html   
cloudflarei  iX  
z\nz7Non-JSON response (likely WAF/Cloudflare HTML). status=z
, preview=zJSON decode failed. status=i  z&403 Forbidden from policy server. url=g?r    zHTTP error from z: zFailed to fetch JSON from )#osr>   urllib.errorparse	urlencodeitemsenvironr   rangerequestRequesturlopengetattrgetcodegeturlr9   lowerread
decompress	ExceptiondecodeUnicodeDecodeErrorlstripRuntimeError
startswithr?   jsonloadsJSONDecodeErrorerror	HTTPErrorr   codetimesleep)r!   r"   r#   r%   rF   r>   urllibqsfullr9   tokenlast_errireqrespr<   	final_urlctypeencrawtexttpreviewjeebody	body_texts                              r   _http_get_jsonrw   7   s   IIIKKK			 R R&,,.. R R R	S	SB##-2D- 64/* G JNN,--E 5#4U#4#4 $(H7Q; BP BPA	P.((wu(MMC''Y'?? "4 x66H$,,.. KKMM	((<<|''(:B??E2LLNNiikk" " " " " " " " " " " " " " " f}}//#..CC    D?zz'**% ? ? ?zz)Iz>>? ##%%A m"#k&#k#kPY#k#kch#k#k#klll||C   g4C4&@&@LTUVZWZVZT[TaTaTcTcDcDcDSD'//$66"Z$Z Z,5Z Z?DZ ZPWZ Z  
z$''''''   DSD'//$66")& ) )	 ) )SX ) )&) )   |% 	Y 	Y 	YHvvxx* $GI F FII  * * * #D		III*$?DSD199$FF    v}}"#eD#e#e\c#e#efflmm7{{
3!q&>***P$PP!PPwPPQQWXX 	P 	P 	PH7{{
3!q&>***GDGGAGGHHaO	P FDFFHFF
G
GGs  9LBE3'L3E7	7L:E7	;	LFL
F(%L'F((L,GL!G&#L%G&&B>L%J;;L	
:LL		LQO=N3M
NM'$N&M''#N
O=NO=NAO=$O==Q
"Q2QQr-   r   c                   | d S t          | t          t          f          r| S t          | t                    r|                                 }|sd S |                    d          r|                    d          s*|                    d          r<|                    d          r'	 t          j        |          S # t          $ r | cY S w xY w| S )N{}[])
r   r   r   r   stripr[   endswithr\   r]   rV   )r-   ss     r   _coerce_jsonr      s    yt!dD\"" !S GGII 	4LL 	!**S// 	q||C7H7H 	QZZX[__ 	z!}}$   Hs   %B9 9CCList[Dict[str, Any]]c                J   t          |                     d          t                    r<t          | d                             d          t                    r| d         d         S t          |                     d          t                    r| d         S t          |                     d          t                    r;| d         }|r1t          |d         t                    rd|d         v s
d|d         v r|S |                                 D ]\  }}t          |t                    r2t          |                    d          t                    r
|d         c S t          |t                    r5|r3t          |d         t                    rd|d         v s
d|d         v r|c S g S )Nr   r   r   required_stepsvalidation_logic)r   r   r   r   rJ   )r   lst_r-   s       r   _find_rules_listr      s   '++f%%t,, (GFO<O<OPW<X<XZ^1_1_ (vw'''++g&&--  w'++f%%t,, fo 	:c!fd++ 	1ASV1K1KOaehijekOkOkJ  1a 	:aeeGnnd#C#C 	W:a 	1 	AaD$)?)? 	1Q4''+=1+E+EIr   Document_Bodydocument_bodyzDocument BodyPhoto	doc_photoz	Doc PhotozDoc Logodoc_logoDoc_Logoz	Full Name	full_name	Full_Namez
First Name
first_name
First_Namez	Last Name	last_name	Last_Namez	ID Number	id_number	ID_NumberzPassport Nopassport_noPassport_Noz
Birth Date
birth_date
Birth_DatezExpiry Dateexpiry_dateExpiry_Datez
Issue Date
issue_date
Issue_DateGendergenderNationalitynationalityzMRZ ZonemrzMRZ_ZoneAddressaddress
QR_Barcode
qr_barcodez
QR BarcodeIssuing_Authorityissuing_authorityzIssuing AuthorityPlace_of_Birthplace_of_birthzPlace of Birth>   r   r   r   r   r   countrydefaultsc                    |                     d          pt          j                             d          }|rt          |          S | pd                                                                }|dk    rdS dS )z+Used to pick OCR language hint for the LLM.ocr_locale_hintKYC_OCR_LOCALE_HINTr=   IRfaen)r   rF   rK   r   r}   upper)r   r   r-   cs       r   _infer_ocr_locale_hintr      so    &''P2:>>:O+P+PA 1vv	B%%''ADyyt4r   
class_namelogicc                p   |                     d          p|                     d          pd                                                                }|dv r|S | pd                                }d|v rdS d|v rdS d|v sd|v s|                    d	          rd
S d|v sd|v rdS d|v sd|v s
d|v s|dk    rdS dS )Ntypeocr_kindr=   >   r   datenonerp   numericr   r   numberz nonor   qrbarcoder   photologor   rp   )r   r}   rS   r~   )r   r   rq   cns       r   _infer_ocr_kindr     s    	6			9eii
33	9r@@BBHHJJA666

	!	!	#	#B{{u||v2~~"D(9(9yrzzY"__v"}}"2(=(=AVAVv6r   keyTuple[str, bool, bool, float]c                    | dv rdS | dv rdS dS )N>   r   r   )exactTTg@>   r   r   r   )fuzzyTTg?)optionalFF      ?r*   )r   s    r   _default_match_for_keyr     s,    
***''
666''((r   c                   i }d| v r|                      d          |d<   nd| v r|                      d          |d<   d| v r|                      d          |d<   nd| v r|                      d          |d<   d| v r|                      d          |d<   nd| v r|                      d          |d<   dD ]}|| v r| |         ||<   dD ]}|| v r| |         ||<   |S )	a^  
    Extracts constraint-like keys from validation_logic.

    Supports common aliases:
      - len -> length
      - min_len -> min_length
      - max_len -> max_length

    Also passes through checksum-related params (weights/mod/check_index/check_rule) so the engine
    can run deterministic validators without hard-coding per-country logic.
    lengthlen
min_lengthmin_len
max_lengthmax_len)prefixregex
must_parse)weightsweight_listmodcheck_index
check_rule)r   )r   r   r,   s      r   _constraints_from_logicr     s#    A 5ii))(	%ii&&(u))L11,	e		))I..,u))L11,	e		))I..,.  ::8AaD L  ::8AaDHr   xOptional[bool]c                    | d S t          | t                    r| S t          | t          t          f          rt          |           S t          | t                    r2|                                                                 }|dv rdS |dv rdS d S )N>   1yonyestrueenabledrequiredT>   0nr   offr   falsedisabledr   F)r   boolr&   r$   r   r}   rS   )r   r   s     r   _to_boolr   G  s    yt!T !c5\"" Aww!S GGIIOOFFF4PPP54r   variantr   c                L   i }dD ]N}t          |                     |                    }t          |t                    r|                    |           OdD ]e}t          |t                    r"t          |                    |                    nd}t          |t                    r|                    |           fd| v r$d|vr d|vrd|vr|                     d          |d<   d| v rd	|vr|                     d          |d	<   d
| v rd|vr|                     d
          |d<   |S )a  
    New rule: Face is either ENABLED (required) or DISABLED. No optional mode.

    Reads in order:
      1) validation_logic['__face__' or 'face_match' or '_face' or 'selfie']
      2) variant['face_match' or 'face_policy' or 'selfie_policy' ...]
      3) flat keys on variant
    )
face_matchface_policyselfieselfie_policy)__face__r   _facer   Nrequire_face_matchr   moder   face_match_threshold	thresholdface_metricmetric)r   r   r   r   update)r   r   outr,   r-   s        r   _extract_face_policy_on_offr   W  sY    C F  Q((a 	JJqMMM ;  5?@PRV5W5WaL)--a00111]aa 	JJqMMM w&&IS,@,@VSVEVEV[emp[p[p %9::I(([-C-C";;'=>>KHC$7$7M22HJr   )r   class_id_to_nameDict[int, str]doc_typeOptional[Dict[str, Any]]c                   |pi }t          |                    d          p t          j                            d          pd          }t	          |                    d          pt          j                            d                    pd}t          |                     d                    pg }t          |t                     rt          |          pg }t          |t                    sg }d |D             }t          |                     d	                    pi }	t          |	t                     rt          |	          pi }	t          |	t                    si }	t          |		                                          D ]\  }
}	 t          |
          }n# t          $ r Y "w xY wt          |t                    s<t	          |                    d
          p)|                    d          p|                    d                    }|r|                    |           t          |          }|	                                D ]5}	 |                    t          |                     &# t          $ r Y 2w xY wg }t          |          D ]y}|                    |          }|st                               ||                                                                                    dd                    }|	                    t          |                    p|	                    |          pi }t          |t                    si }	 t)          ||||t+          |                    }nI# t          $ r<}t-          j        t0                                        d||||           d }Y d }~nd }~ww xY wt          |t                    r(|r&t          |          }|                    |           |}t7          ||          }t9          |          \  }}}}t          |                    d|                    }t+          |                    d|                    }t+          |                    d|                    }t;          |                    d|                    }t;          |                    d|                    d||v rdnd                              }t;          |                    d|                    dd                              }t=          |          }t          |                    d          pm|                    d          pX|                    d          pCt          |t                    r|                    d          nd p|                    dd          pd          } |                    d          }!|                                dk    r|d k    r|!pd!}!| pd"} t          |                    d#|                    d#|t@          v rd$nd%                    pd%          }"|                    d&          }#t          |#t                     r|#g}#|#t          |#t                    sd }#|!                    i d'|gd(|d
t+          ||v           d|d|d)|d|d*t;          |                    d*|                    d*d+                              d| d|!d,|d|d|d|d#|"d&|#           {|                     d-          p)|                     d.          p|                     d/          }$|                     d0          p-|                                 d|                                 d|$ }%|                    d1          }&|&|rtE          |          nd }&tG          | |	          }'t          |'                    d2          pd                                                                          }(t	          |'                    d3          p)|'                    d
          p|'                    d4                    })t+          |                    d4d                    }*|(d5v rd6}*n|(d7v rd}*n|)t+          |)          }*t          |'                    d8          p|                    d9d:                    }+t;          |'                    d;|                    d<d=                              },i d>|                                 d|                                 d|% d/|$d0|%d?|d@|dAtI          ||          dB|d1|&dCt;          |                    dCdD                    dEt;          |                    dEdF                    dGt;          |                    dGdH                    dIt;          |                    dIdJ                    dKt;          |                    dKd=                    dLt;          |                    dLdM                    dNt;          |                    dNdO                    d4t+          |*          d9t          |+          t;          |,          |                    dPg           t+          |                    dQd6                    t;          |                    dRdS                    dT}-|-S )UNidentity_rules_pathKYC_IDENTITY_RULES_PATHr=   strict_identity_registryKYC_STRICT_IDENTITY_REGISTRYFr   c                n    h | ]2}t          |                                          #t          |          3S r*   )r   isdigitr&   )r+   r   s     r   	<setcomp>z8build_doc_config_payload_from_variant.<locals>.<setcomp>  s3    GGGqc!ffnn6F6FGCFFGGGr   r   r   require
must_exist r   )r   r  	field_keypathstrictzBidentity_defaults_load_failed country=%s doc_type=%s key=%s err=%s
match_type
match_gate
must_matchweightmin_det_confgffffff?      ?min_ocr_conf皙?expected_lenr   r   r   	validatorr   r   iran_national_code
   max_candidatesr    r7   input_aliasesclass_namesr   r   match_thresholdg333333?constraintsidrule_id
variant_idvariant_namemin_detected_fields_countr   r   r   >   r   r   r  r   	mandatoryT>   r   r   r   r   r   r   score01r   r   g      ?doc_idr   r  r   r   approve_min_coverager   approve_min_extractiong(\?approve_min_match_coregq=
ףp?approve_min_match_all        review_min_coveragereject_below_coverageg      ?approve_no_input_extra_bufferg?
swap_pairsenable_name_swapname_swap_margingQ?)r   r4  r5  r6  )%r   r   rF   rK   r   r   r   r   r   rJ   r&   rV   addsetkeyssorted_CANON_KEYSr}   rS   r?   r   r   logging	getLogger__name__warningr   r   r   r$   r   r   
_CORE_KEYSappendr   r   r   ).r   r  r  r   r   r  strict_identityr   required_idsr   _cid_k_logic_cidrj   idsr,   r   cidr   r   r   identity_defaultsrt   mergedr   r  r  r  r  r  r  r#  r  r  r  r   r&  r'  	min_countr   r   enabled_flagr   r   r   r   s.                                                 r   %build_doc_config_payload_from_variantrM  y  s    ~2H hll+@AAtRZ^^TmEnEntrtuux||,FGGy2:>>ZxKyKyzz  D  DO!'++.>"?"?@@FBN.#&& <%n55;nd++ GGNGGGL#GKK0B$C$CDDJ"C(( @'(899?R&--  /557788 	# 	#	v;;DD 	 	 	H	&$'' 	vzz*--bI1F1Fb&**UaJbJbcc 	#T"""
l

C""$$  	GGCFFOOOO 	 	 	H	 #%Ec{{ ] ]%))#..
 	ooj**:*:*<*<*B*B*D*D*L*LSRU*V*VWW $$SXX..Q2B2F2Fs2K2KQr%&& 	E
	% 5!(O,,! ! !  	% 	% 	%h''//0tv}  @H  JM  OP  Q  Q  Q $	% '.. 	3D 	+,,FMM%   E":u555KC5P5P2
J
F<<<==
%))L*==>>
%))L*==>>
uyy62233UYY~x||N\_co\o\oTXTXuy7z7z{{||UYY~x||NTX7Y7YZZ[[-e44		.)) 99X&&99U## 2<K1N1NXKOOH---TX <<22	
 	
 	
 IIk**	==??d""sk'9'9!9%9I'-2LUYY'7FV]`dn]n]nXYXYtu9v9vww|{|}}		/22mS)) 	,*OM$Zt-L-L$ M 
J<
3
 SL011

 L
 L
 
 *
 uUYY/@(,,O`bfBgBg%h%hii
 L
 
 ;
" f#
$ *%
& *'
* n+
, ]-
 	 	 	 	2 T""Ygkk)&<&<YL@Y@YJ;;~..fW]]__2f2fx~~GWGW2f2fZd2f2fL899I)5?C%%%4	 .g7GHHK{v&&,"--3355;;==DKOOI66~+//*:U:U~YdYhYhi}Y~Y~Lhll+?GGHH DDD!	8	8	8"		!!,//kooh//Y8<<y3Y3YZZK hllKacg>h>h!i!ijjW]]__HHx~~'7'7HH,HHj 	 	7	
 	H 	1'8DD 	 	$Y 	hll3I3&O&O P P 	!%5Mt(T(T"U"U 	!%5Mt(T(T"U"U 	 x||4KS'Q'Q!R!R  	uX\\2G%N%NOO!" 	 x||4KT'R'R!S!S#& 	(x||<[]a/b/b)c)c'* 	d#566+, 	s;''-. !&&: ; ;ll<44 .@$!G!GHH!(,,/A4"H"HII7  G: Ns<    F
FF "I##
I0/I0!M%%
N+/2N&&N+payloadsc                   i }| D ]}|                     d          pg D ]}t          |t                    st          |                     d          pd          }|s@||vrt          |          }d|d<   |||<   ^||         }t	          t          t	          |                     dd                    t	          |                     dd                                        |d<   t	          t          t	          |                     dd	                    t	          |                     dd	                                        |d<   t          t          t          |                     d
d          pd          t          |                     d
d          pd                              |d
<   | r| d         ni }dt          |                     d          pd          t          |                     d          pd          t          |                     d          p|                     d          pd          t          |	                                          ddd}|S )am  
    Creates a "union" payload to run ONE extraction (YOLO crops + LLM OCR) for all fields.
    For each key, we keep:
      - min_det_conf: minimum across variants (to not miss)
      - min_ocr_conf: minimum across variants
      - max_candidates: maximum across variants
      - weight/match settings don't matter for extraction, but kept from the first rule
    r   r   r=   Fr   r  r  r  r  r  r7   r   union_extractionr   r  r   locale_hintN)r+  r   r  r   r   r(  r   )
r   r   r   r   r$   minr&   maxr   values)	rN  by_keyr   rr   rrcurbaseunion_payloads	            r   _merge_union_payloadr[  C  sU    )+F  %%..&B 	 	Aa&& aeeEll(b))C &  !WW!&: sSk&+Ccggnd6S6S0T0TV[\]\a\abprv\w\wVxVx,y,y&z&zN#&+Ccggnd6S6S0T0TV[\]\a\abprv\w\wVxVx,y,y&z&zN#(+CCGG<La4P4P4UTU0V0VX[\]\a\abrtu\v\v\{z{X|X|,},}(~(~$%%	$ #*8A;;D$txx	**0b11,,233txx(9::[dhh}>U>U[Y[\\fmmoo&&%)#	 	M r   c                  L    e Zd ZU ded<   ded<   ded<   ded<   ded<   d	ed
<   dS )VariantCandidater   r'  payload_doc_iddecisionr   scoresz	List[str]reasonsr	   sort_keyN)r>  
__module____qualname____annotations__r*   r   r   r]  r]  n  sR         MMMOOOOOr   r]  dc                b    | pd                                 } | dk    rdS | dk    rdS | dk    rdS dS )	Nr=   APPROVE   REVIEWr    REJECTr7   r   )r   )rf  s    r   _decision_rankrl  x  sD    	
bAI~~qH}}qH}}q1r   r_  r`  r	   c           	        |pi }|                     d          }|                     d          }|                     dd          }|                     dd          }|                     d          }|                     d          }t          |           t          ||nd          t          ||nd          t          ||nd          t          |          t          |          t          ||nd          fS )	N
match_core	match_all
extractionr0  coveragefacefinal_scoreg      )r   rl  r$   )	r_  r`  r   mcmaexcovrr  rs  s	            r   _candidate_sort_keyrx    s    "A	
|		B	
{		B	
|S	!	!B
%%
C
 
 C55==D%%&&Kx  [4kk$??BNbb--BNbb--b		c

d&ddD11 r   Fr   r  g333333?rC   )selfie_image_path
user_inputdebugr   device	yolo_confyolo_ioumax_detphp_endpoint_url
model_pathdoc_image_pathllm_ocr*Callable[[Dict[str, Any]], Dict[str, Any]]ry  rz  Optional[Dict[str, str]]r{  r   r|  r}  r~  r  c                <   |
pi }
|pi }t          |||dt          |
                    dd                    t          |
                    dd                              }t	          |                    dd                                                    d	k    r)d d d
i d|                    d           gi d}|	r||d<   |S t          |          }|r|}|sd d d
i dgi d}|	r||d<   |S |	r t          d|           t          d|           |                     |          }t          |j
                  }t          |          }|sd d d
i dgi d}|	r||d<   |S g }g }g }|D ]~}t          |t                    st          |||||
          }|                    |           |                    |                     |                     |                    |           |sd d d
i dgi d}|	r||d<   |S |                    |||||          }t#          |          }|                     |          }|                    ||||d |	          }|d         }|d         }d } t'          d |D                       }!|!rt|rk|                    di                               d          p(|                    di                               d          }"|                     |||"          } nd d dd d} d }#d }$d }%g }&t+          |          D ]\  }'}(||'         }||'         })t-          j        |          }*t-          j        |          }+|                     |*|+|(           |                     |*|+|(|           |(j        r| nd },|                    |(|*||,|	           }-t	          |-                    d!          pd          }.|-                    d"          pi }/t9          |.|/          }0t	          |                    d#                    |.|/|-                    d$          pg |-                    d%          pi |(j        rd&nd'|(j        r|sd(gng d)}1|&                    t;          t	          |                    d*                    t	          |                    d#                    |.|/|1                    d$          pg |0+                     |#|0|#k    r|0}#|1}$|)}%|$d d d
i dgi d}|	r||d<   |S t	          |$                    d#                    t	          |$                    d#                    |$                    d!          |$                    d"          |$                    d$          |$                    d%          |$                    d,          |$                    d-          d.}|	rnd/ t=          |&d0 d12          D             |d3<   |%|d4<   ||d<   ||d5<   ||d<   ||d<   | |d6<   |                    d7          |d7<   |                    d8          |d8<   |S )9N)r   r   policy_timeout_sr   policy_retriesr    )r"   r#   r%   r<   r=   successrj  zpolicy_fetch_failed:message)selected_variant_doc_idselected_variantr_  r`  ra  	per_field
raw_policy!yolo_model_path_missing_in_policyz#[KYC] yolo_model_path(from server):z[KYC] yolo_model_path(used):no_variants_found)r   r  r  r   r   no_variant_executed)confiour|  r  )r  rz  r{  fields	internalsc              3  8   K   | ]}t          |d d          V  dS )r   FN)rP   )r+   r   s     r   	<genexpr>z'run_kyc_auto_variant.<locals>.<genexpr>#  s/      ^^#GC)=uEE^^^^^^r   quadsr   r   )r  ry  doc_photo_quadselfie_missing)r*  cosinereasondetails)rz  	face_packr{  r_  r`  r+  ra  r  r   r   upload_selfie_required)r+  r_  r`  ra  r  selfie_mode
next_stepsr'  )r'  r^  r_  r`  ra  rb  r  r  )r  r  r_  r`  ra  r  r  r  c                    g | ]	}|j         
S r*   )__dict__)r+   r   s     r   
<listcomp>z(run_kyc_auto_variant.<locals>.<listcomp>w  s    $s$s$sAQZ$s$s$sr   c                    | j         S r)   )rb  )r   s    r   <lambda>z&run_kyc_auto_variant.<locals>.<lambda>w  s
    YZYc r   T)r   reversevariant_candidatesbest_variant_raw_rule
detectionsrr  
llm_bundlellm_response_raw)rw   r$   r   r&   r   rS   r   print
get_enginer   r!  r   r   rM  rA  doc_config_from_payloaddetectr[  extract_with_llmanycompute_face_pack	enumeratecopydeepcopyapply_config_swapsapply_name_swap_if_neededr   scorerx  r]  r:  )2kyc_engine_moduler  r  r  r   r  r  ry  rz  r{  r   r|  r}  r~  r  r   r   server_model_pathenginer  variantsvariant_payloadsvariant_cfgsraw_variantsr-   doc_cfg_payloaddetsrZ  	union_cfgpackbase_fieldsbase_internalsface_pack_globalany_face_requiredquadbest_keybest_resultbest_variant_raw	cand_listidxr   vrawr  r  r  scoringr_  r`  skress2                                                     r   run_kyc_auto_variantr    s   * ~2H!rJ  W55%7>>??HLL!115566	  G 7;;x$$%%++--::'+ $ Gw{{9/E/EGGH
 
  	( 'C
 199 '&
 '+ $ ;<
 
  	( 'C
 :35FGGG,j999 ))*55FF.//  ((H '+ $ +,
 
  	( 'C
 .0 L)+L  !T"" 	?-
 
 
 	000-EEoVVWWWA '+ $ -.
 
  	( 'C
 ==iXf^e=ffD ))9::M!99-HHI"" #  D x.K+&N ^^Q]^^^^^ 	n 	n!%%gr2266{CCs~GYGYZaceGfGfGjGjkrGsGsD0BB-"3#  C     ,04K[hlmm !%H,0K15(*Il++ '$ '$S*3/C {++M.11	,,VYDDD33FIsJWWW(+(>H$$D	,,sFzY^c,ddw{{:..4"55X&&," 622 /--h7788 {{9--3 [117R*-*@PJJj:=:PsYjs455qs
 
 	)_00@@AA228<<==GGI&&,"
 
 
 	 	 	 rH}}HK#'+ $ -.
 
  	( 'C
 $'{x'@'@#A#A 9 9::OOJ////(++??9-- __[11"}55!ool33	 	C  	?$s$s	OcOcmq9r9r9r$s$s$s !'7#$#L L#H)K&F HH\22L"&((+=">">Jr   )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   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  r  r   r   r   r   r  r   r   )rN  r   r   r   )rf  r   r   r&   )r_  r   r`  r   r   r	   )r  r   r  r   r  r   r   r   r  r   r  r  ry  r   rz  r  r{  r   r   r  r|  r   r}  r$   r~  r$   r  r&   r   r   )'
__future__r   r\   rb   r  rF   r<  urllib.parserd   urllib.requestdataclassesr   typingr   r   r   r   r	   r
   identity_registryr   r   rw   r   r   r;  r@  r   r   r   r   r   r   rM  r[  r]  rl  rx  r  r*   r   r   <module>r     s:   # " " " " "    				          ! ! ! ! ! ! = = = = = = = = = = = = = = = = 3 3 3 3 3 3       D_H _H _H _H _HD   "   (2_2 _2
 [2 2 
2 
2 2 2 ,2 ,2" #2$ %2( )2* +2. =/20 =124 ,52 26 ,72: =;2< ==2@ ,A2B ,C2F hG2H =I2L M2N O2R yS2X ,Y2Z ,[2\ ,]2^ ,_2` &a2b &c2 2h RQQ
      () ) ) )' ' ' 'T       P *.G G G G G GT( ( ( (V              > ,0/3-1'k k k k k k k kr   