Ë
     K¦jeP  ã            
      óZ  — U d Z ddlmZ ddlmZ ddlZddlmZ ddlZddl	m
Z
mZmZ ddlZddlZdZ eh d£«      Zg d	¢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 d!“d"d“d#d“dddd$d%œ¥i d&d“d'd“d(d“d)d“d*d“d+d“d,d“d-d“d.d“d/d“d0d“d1d“d2d3“d4d“d5d“d6d“d7d“d$d3dd8œ¥i d9d“d:d“d;d“d<d“d=d“d>d“d?d“d@d“dAd“dBd“dCdD“dEd“dFd“dGdH“dId“dJd3“i dKd“dLd“dMd“dNd“dOd“d,d“d-d$“dPd“dQd“dRdS“dTd“dUd“dVd“dWd$“dXdY“ddZ“ddZ“d[dZdZd\d]œ¥d^œZd_ed`<   daZ ej0                  dbj3                   e eej8                  e«      edc¬d«      «      ej<                  «      Z ej0                  de«      Z  ej0                  df«      Z! ej0                  dg«      Z" ej0                  dh«      Z# edc¬i«       G dj„ dk«      «       Z$d„dl„Z%d…dm„Z&d†dn„Z'd‡do„Z(dˆdp„Z)d‰dq„Z*dŠdr„Z+d‹ds„Z,dŒdt„Z-dŒdu„Z.d�dv„Z/dŽdw„Z0d�dx„Z1d�dy„Z2dzd{œd‘d|„Z3d’d}„Z4d“d~„Z5d”d„Z6d€d�œd•d‚„Z7d€d�œd–dƒ„Z8e7Z9e4Z:y)—aT  Local announcement and annual-report text research.

The module deliberately has no network or NLP-model dependency.  It provides a
small, deterministic text signal layer that can be used by later stages of the
pipeline and is explicit about keyword negation.  Scores are research signals,
not a substitute for reading the source document.
é    )Úannotations)Ú	dataclassN)ÚPath)ÚAnyÚIterableÚMappingz0.1.0>   ú.mdú.csvú.txtú.json)#Údocument_idÚsource_pathÚ	file_nameÚ	file_typeÚrecord_indexÚsource_codeÚsecurity_idÚtitleÚannouncement_dateÚreport_periodÚannouncement_typeÚtext_lengthÚtext_previewÚkeyword_hitsÚnegated_keyword_hitsÚnegated_termsÚrisk_keyword_hitsÚcatalyst_keyword_hitsÚmoat_keyword_hitsÚmanagement_keyword_hitsÚ
risk_termsÚcatalyst_termsÚ
moat_termsÚmanagement_termsÚ
risk_scoreÚcatalyst_scoreÚ
moat_scoreÚmanagement_scoreÚmanagement_risk_scoreÚ
risk_levelÚcatalyst_signalÚmoat_assessmentÚmanagement_assessmentÚevidenceÚmodel_versionu   é‡�å¤§é£Žé™©g       @u   ç»�è�¥é£Žé™©g      ø?u   è¯‰è®¼u   ä»²è£�g333333ó?u   å¤„ç½šgÍÌÌÌÌÌü?u   è¿�è§„u   å‡�å€¼gffffffö?u   å•†èª‰u   æµ�åŠ¨æ€§é£Žé™©u   å€ºåŠ¡g      ð?u   è¿�çº¦u   äº�æ�ŸgÍÌÌÌÌÌô?u   ä¸‹æ»‘gš™™™™™é?u   è´¨æŠ¼u   å†»ç»“gš™™™™™ù?u   é€€å¸‚u   å®¡è®¡æ„�è§�gffffffæ?)u   å†…æŽ§ç¼ºé™·u   ç›‘ç®¡õ   è°ƒæŸ¥u   é£Žé™©u   è®¢å�•õ   ä¸­æ ‡u   æ‰©äº§u   æŠ•äº§u   æ��ä»·u   æ¶¨ä»·õ   å›žè´­u   åˆ†çº¢õ   å¢žæŒ�õ   å¹¶è´­u   é‡�ç»„u   èŽ·æ‰¹u   çª�ç ´gš™™™™™ñ?u   åˆ›æ–°u   æˆ˜ç•¥å�ˆä½œu   äº§èƒ½u   ä¸šç»©é¢„å¢ž)u   å¢žé•¿u   ç­¾çº¦u	   æ–°äº§å“�u   ä¸“åˆ©u   æŠ€æœ¯å£�åž’u	   æŠ¤åŸŽæ²³u   å“�ç‰Œu   å®¢æˆ·ç²˜æ€§u   è½¬æ�¢æˆ�æœ¬u   è§„æ¨¡æ•ˆåº”u   ç½‘ç»œæ•ˆåº”u   æˆ�æœ¬ä¼˜åŠ¿u   ç‰Œç…§u   è®¤è¯�gÍÌÌÌÌÌì?u   å¸‚åœºä»½é¢�u   ç‹¬å®¶u   æ ¸å¿ƒæŠ€æœ¯g333333û?u   ç ”å�‘u   é•¿æœŸå�ˆä½œu	   ç®¡ç�†å±‚u	   è‘£äº‹ä¼šu   é«˜ç®¡u   è‚¡æ�ƒæ¿€åŠ±u   å‘˜å·¥æŒ�è‚¡u   ç‹¬ç«‹è‘£äº‹u   å®¡è®¡å§”å‘˜ä¼šu   è–ªé…¬g333333ã?u   è¯šä¿¡u   å†…éƒ¨æŽ§åˆ¶u   å†…æŽ§u   å®žé™…æŽ§åˆ¶äººu   å…³è�”äº¤æ˜“g333333ó¿g       Àg      ø¿g      À)r0   u   å¤±ä¿¡u   ä¾µå� u   è´¢åŠ¡é€ å�‡)ÚriskÚcatalystÚmoatÚ
managementzdict[str, dict[str, float]]Ú	_LEXICONS)u	   ä¸�æž„æˆ�u	   ä¸�å­˜åœ¨u	   æœªå�‘çŽ°u   æœªè§�u   å°šæœªu   å°šæ— u   æ²¡æœ‰u   æ— æ³•u   éš¾ä»¥u   å�¦è®¤u   æœªu   æ— u   ä¸�ÚnoÚnotÚwithoutÚ|T)ÚkeyÚreverseu<   (?<!\d)(20\d{2})[-/.å¹´](\d{1,2})[-/.æœˆ](\d{1,2})æ—¥?(?!\d)uD   (?<!\d)(20\d{2})(?:å¹´å¹´åº¦æŠ¥å‘Š|å¹´åº¦æŠ¥å‘Š|å¹´æŠ¥|è´¢æŠ¥)(?!\d)z7(?i)(?<![a-z0-9])(?:sh|sz|bj)[ ._-]?(\d{6})(?![a-z0-9])z(?<!\d)(\d{6})(?!\d))Úfrozenc                  ó@   — e Zd ZU ded<   ded<   ded<   ded<   ded<   y	)
Ú
KeywordHitÚstrÚtermÚ	dimensionÚfloatÚweightÚboolÚnegatedÚsentenceN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    ú<C:\FundamentalWorkbench\src\fundamental_mvp\text_research.pyrB   rB   S   s   … à
ƒIØƒNØƒMØƒMØ„MrP   rB   c                 ó6   — t        j                  t        ¬«      S )z;Return an empty frame with the stable text-research schema.©Úcolumns)ÚpdÚ	DataFrameÚTEXT_RESEARCH_COLUMNSrO   rP   rQ   Úempty_text_researchrX   \   s   € ä�<‰<Ô 5Ô6Ð6rP   c                ó¬   — | €g S t        | «      }|j                  «       r|j                  «       sg S t        d„ |j	                  d«      D «       d„ ¬«      S )zGRecursively discover supported local text files in deterministic order.c              3  ó„   K  — | ]8  }|j                  «       sŒ|j                  j                  «       t        v sŒ5|–— Œ: y ­w©N)Úis_fileÚsuffixÚlowerÚSUPPORTED_SUFFIXES)Ú.0Úpaths     rQ   Ú	<genexpr>z&discover_text_files.<locals>.<genexpr>i   s.   è ø€ Ðj™/�$¨T¯\©\­^ÀÇÁ×@QÑ@QÓ@SÔWiÒ@iŒ™/ùs   ‚A ˜ A ¹A Ú*c                ó>   — | j                  «       j                  «       S r[   )Úas_posixr^   )ra   s    rQ   Ú<lambda>z%discover_text_files.<locals>.<lambda>j   s   € ˜Ÿ™›×.Ñ.Ô0rP   ©r>   )r   ÚexistsÚis_dirÚsortedÚrglob)Ú
config_dirÚroots     rQ   Údiscover_text_filesrn   a   sM   € àÐØˆ	Ü�
Ó€DØ�;‰;Œ= §¡¤Øˆ	ÜÙj˜$Ÿ*™* Sœ/ÓjÙ0ôð rP   c                óš   — | j                  «       }dD ]  }	 |j                  |«      c S  |j                  dd¬«      S # t        $ r Y Œ6w xY w)N)ú	utf-8-sigúutf-8Úgb18030zutf-16rq   Úreplace)Úerrors)Ú
read_bytesÚdecodeÚUnicodeDecodeError)ra   ÚrawÚencodings      rQ   Ú_decoderz   n   sV   € Ø
�/‰/Ó
€CÛ?ˆð	Ø—:‘:˜hÓ'Ò'ð @ð
 �:‰:�g iˆ:Ó0Ð0øô "ò 	Ùð	ús   —>¾	A
Á	A
c                ó0  — | j                  «       D ��ci c]-  \  }}t        |«      j                  «       j                  «       |“Œ/ }}}|D ]C  }|j	                  |j                  «       «      }|€Œ%t        |«      j                  «       dvsŒA|c S  y c c}}w )N>   Ú ÚnanÚnone)ÚitemsrC   Ústripr^   Úget)ÚmappingÚnamesr>   ÚvalueÚfoldedÚnames         rQ   Ú
_key_valuer‡   x   s‚   € Ø@GÇÁÄÔPÁ±*°#°uŒc�#‹h�n‰nÓ×$Ñ$Ó&¨Ñ-À€FÑPÛˆØ—
‘
˜4Ÿ:™:›<Ó(ˆØÑ¤ U£×!1Ñ!1Ó!3Ð;NÒ!NØŠLð ð ùó Qs   ”2Bc                óÖ   — | �%t        | t        «      rt        j                  | «      ryt        | t        t
        t        f«      rt        j                  | dt        ¬«      S t        | «      S )Nr|   F)Úensure_asciiÚdefault)
Ú
isinstancerF   ÚnpÚisnanÚdictÚlistÚtupleÚjsonÚdumpsrC   )r„   s    rQ   Ú_as_textr“   �   sK   € Ø€}œ E¬5Ô1´b·h±h¸u´oØÜ�%œ$¤¤eÐ,Ô-Ü�z‰z˜%¨e¼SÔAÐAÜˆu‹:ÐrP   c           
     óä  — t        | t        «      r,g }| D ]  }|j                  t        |«      «       Œ |xs ddigS t        | t        «      rŒdD ]„  }| j                  |«      }t        |t        «      sŒ%t        |«      }| j                  «       D ��ci c]%  \  }}||k7  sŒt        |t        t        f«      rŒ#||“Œ' }}}|D �cg c]  }i |¥|¥‘Œ
 c}c S  | gS dt        | «      igS c c}}w c c}w )NÚcontentr|   )Údatar   ÚrecordsÚresultsu   å…¬å‘ŠÚannouncements)r‹   r�   ÚextendÚ_json_recordsrŽ   r�   r   r“   )	r„   r—   Úitemr>   ÚnestedÚkÚvÚsharedÚrecords	            rQ   r›   r›   ‰   sñ   € Ü�%œÔØ(*ˆÛˆDØ�N‰Nœ=¨Ó.Õ/ð àÒ+˜I r˜?Ð+Ð+Ü�%œÔãUˆCØ—Y‘Y˜s“^ˆFÜ˜&¤$Õ'Ü'¨Ó/�Ø+0¯;©;¬=Ôi©=¡4 1 a¸AÀ»HÌZÐXYÔ\`ÔbfÐ[gÕMh˜!˜Q™$¨=�ÑiÙ;BÓC¹7°Ð,˜6Ð, VÒ,¸7ÑCÒCð Vð ˆwˆØœ ›Ð(Ð)Ð)ùó jùÚCs   ÂC'Â C'Â7C'ÃC-c                ó‚  — t        | «      } | j                  j                  «       }	 |dv rdt        | «      igS |dk(  r't	        t        j                  t        | «      «      «      S |dk(  rudD ]/  }	 t        j                  | t        |¬«      j                  d«      } n �|j                  rg S |j                  «       D ��cg c]  \  }}|j!                  «       ‘Œ c}}S 	 g S # t        t        j                  j                  f$ r d}Y Œ�w xY wc c}}w # t"        t$        t
        j&                  t(        f$ r ddigcY S w xY w)	a  Read one local source and return one or more normalized raw records.

    CSV rows and JSON list members become separate records; plain text files
    produce one record.  Parsing errors are converted to an empty record so a
    single malformed source cannot break a batch run.
    >   r	   r   r•   r   r
   )rp   rq   rr   )Údtypery   r|   N)r   r]   r^   rz   r›   r‘   ÚloadsrU   Úread_csvrC   Úfillnarw   rt   ÚParserErrorÚemptyÚiterrowsÚto_dictÚOSErrorÚ
ValueErrorÚJSONDecodeErrorÚ	TypeError)ra   r]   ry   ÚframeÚ_Úrows         rQ   Úparse_text_filer²   ›   s1  € ô �‹:€DØ�[‰[×ÑÓ €Fð!Ø�_Ñ$Ø¤¨£Ð.Ð/Ð/Ø�WÒÜ ¤§¡¬G°D«MÓ!:Ó;Ð;Ø�VÒÛ=�ð!ÜŸK™K¨´CÀ(ÔK×RÑRÐSUÓV�EÙð >ð ˆ} §¢Ø�	Ø05·±Ô0@ÔAÑ0@¡f a¨�C—K‘K•MÐ0@ÒAÐAð ð €Iøô +¬B¯I©I×,AÑ,AÐBò !Ø ’Eð!üó BøÜ”Z¤×!5Ñ!5´yÐAò !Ø˜B�Ð Ò ð!úsR   §D ¹+D Á%
D Á0+C"ÂD Â.D ÃDÃD Ã"%D
ÄD Ä	D
Ä
	D Ä(D>Ä=D>c                óx  — d}t        | |«      }|�ct        |«      g}dD ]:  }t        | |f«      }|€Œt        |«      |vsŒ!|j                  t        |«      «       Œ< dj                  d„ |D «       «      S | j	                  «       D �cg c]  }t        |«      sŒt        |«      ‘Œ }}dj                  |«      S c c}w )N)r•   ÚtextÚbodyõ   æ­£æ–‡õ   å…¨æ–‡õ   å†…å®¹õ   å…¬å‘Šå†…å®¹Údocument)r   õ   å…¬å‘Šæ ‡é¢˜Úannouncement_titleÚsummaryu   æ‘˜è¦�Ú
c              3  ó&   K  — | ]	  }|sŒ|–— Œ y ­wr[   rO   )r`   Úparts     rQ   rb   z_record_text.<locals>.<genexpr>Ã   s   è ø€ Ð8©% $²4œ©%ùs   ‚Š)r‡   r“   ÚappendÚjoinÚvalues)r¡   Úcontent_namesr•   Úpartsr>   r„   rÃ   s          rQ   Ú_record_textrÆ   ¸   s²   € Øi€MÜ˜ Ó/€GØÐô ˜'Ó"Ð#ˆÛWˆCÜ˜v¨ vÓ.ˆEØÑ ¤X¨e£_¸EÒ%AØ—‘œX e›_Õ-ð Xð �y‰yÑ8©%Ó8Ó8Ð8Ø+1¯=©=¬?ÓN©? %¼hÀu½oŒh�u�o¨?€FÐNØ�9‰9�VÓÐùò Os   ÂB7ÂB7c                ót  — t        | «      }t        j                  d|«      }t        j                  |«      xs? |r$t        j                  |j	                  d«      «      nd xs t        j                  |«      }|r0t        t        |j                  «       «      \  }}}	 |d›d|d›d|d›�S y # t        $ r Y y w xY w)Nux   (?:å…¬å‘Šæ—¥æœŸ|å�‘å¸ƒæ—¥æœŸ|æŠ«éœ²æ—¥æœŸ|å�‘å¸ƒæ—¶é—´|å�‘å¸ƒæ—¥)\s*[:ï¼š]\s*(20\d{2}[-/.å¹´]\d{1,2}[-/.æœˆ]\d{1,2}æ—¥?)é   Ú04dÚ-Ú02d)	r“   ÚreÚsearchÚ_DATE_REÚgroupÚmapÚintÚgroupsr¬   )r„   r´   rx   ÚlabelledÚmatchÚyearÚmonthÚdays           rQ   Ú_date_valuerØ   È   sÀ   € Ü
�5‹/€CÜ�y‰yð  Uð  W[ó  \€Hä�‰˜Óò 	!Ù2:ŒH�O‰O˜HŸN™N¨1Ó-Ô.Àò	!ä�?‰?˜4Ó ð 
ñ
 Üœs E§L¡L£NÓ3Ñˆˆe�Sð	Ø˜3�Z˜q  s ¨1¨S°¨IÐ6Ð6ð øô ò 	Ùð	ús   ÂB+ Â+	B7Â6B7c                ó  — t        | «      }|xs |}t        j                  d|«      }|r|j                  d«      › d�S t        j                  d|t        j                  «      }|rz|j                  d«      xs |j                  d«      }|dv rddddd	œ|   }n|r|j                  «       rt        |«      nd }|r&|j                  d«      › d
|dz  d›d
g d¢|dz
     d›�S t        j                  |«      xs t        j                  |«      }|r|j                  d«      › d�S t        j                  |«      xs t        j                  |«      }	|	r0t        t        |	j                  «       «      \  }
}}	 |
d›d
|d›d
|d›�S y # t        $ r Y y w xY w)Nu7   (?<!\d)(20\d{2})å¹´(?:å�Šå¹´åº¦æŠ¥å‘Š|å�Šå¹´æŠ¥|ä¸­æŠ¥)rÈ   z-06-30uD   (?<!\d)(20\d{2})å¹´(?:ç¬¬?([ä¸€äºŒä¸‰å››1234])å­£åº¦æŠ¥å‘Š|Q([1-4]))é   é   >   õ   ä¸€õ   ä¸‰õ   äºŒõ   å››é   )rÜ   rÞ   rÝ   rß   rÊ   rË   )é   é   râ   rá   z-12-31rÉ   )r“   rÌ   rÍ   rÏ   ÚIÚisdigitrÑ   Ú_YEAR_RErÎ   rÐ   rÒ   r¬   )r„   r´   rx   Úperiod_textÚ
half_matchÚquarter_matchÚquarterÚquarter_numberÚ
year_matchrÔ   rÕ   rÖ   r×   s                rQ   Ú_report_periodrì   Ù   s¢  € Ü
�5‹/€CØ’+˜€KÜ—‘ÐUÐWbÓc€JÙØ×"Ñ" 1Ó%Ð& fÐ-Ð-Ü—I‘IÐeÐgrÔtv×txÑtxÓy€MÙØ×%Ñ% aÓ(ÒB¨M×,?Ñ,?ÀÓ,BˆØÐ2Ñ2Ø%&¨q¸À1ÑEÀgÑN‰Ná-4¸¿¹Ô9JœS œ\ÐPTˆNÙØ#×)Ñ)¨!Ó,Ð-¨Q¨~ÀÑ/AÀ#Ð.FÀaÒHXÐYgÐjkÑYkÑHlÐmpÐGqÐrÐrô —‘ Ó%Ò>¬¯©¸Ó)>€JÙØ×"Ñ" 1Ó%Ð& fÐ-Ð-Ü�O‰O˜CÓ Ò9¤H§O¡O°DÓ$9€EÙÜœs E§L¡L£NÓ3Ñˆˆe�Sð	Ø˜3�Z˜q  s ¨1¨S°¨IÐ6Ð6ð øô ò 	ØØð	ús   Å2F  Æ 	FÆFc                ó.  — t         j                  | «      }|r}t        j                  d|j                  d«      «      }|r|j                  d«      j	                  «       nd }|j                  d«      }|r|› d|› �nd |r|j                  «       › |› �fS d fS t        j                  | «      D ]i  }|j                  d«      }|j                  d«      sŒ&|j                  d«      rdn|j                  d«      rd	nd
}|› d|› �|j                  «       › |› �fc S  y)Nz(?i)(sh|sz|bj)r   rÈ   Ú.)Ú000Ú001Ú002Ú003Ú300Ú301Ú600Ú601Ú603Ú605Ú688Ú689Ú830Ú831Ú832Ú833Ú834Ú835Ú836Ú837Ú838Ú839Ú870Ú871Ú872)rõ   rö   r÷   rø   rù   rú   ÚSH)Ú8ÚBJÚSZ)NN)	Ú_CODE_RErÍ   rÌ   rÏ   Úupperr^   Ú_BARE_CODE_REÚfinditerÚ
startswith)r´   rÔ   Úprefix_matchÚprefixÚcodes        rQ   Ú_security_coder  ÷   s  € Ü�O‰O˜DÓ!€EÙÜ—y‘yÐ!2°E·K±KÀ³NÓCˆÙ2>�×#Ñ# AÓ&×,Ñ,Ô.ÀDˆØ�{‰{˜1‹~ˆÙ%+�&�˜˜4˜&Ñ!°ÑTZ¸&¿,¹,».Ð9IÈ$ÈÐ7PÐdÐdÐ`dÐdÐdô ×'Ñ'¨Ö-ˆØ�{‰{˜1‹~ˆØ�?‰?ð  Kõ  LØ!Ÿ_™_Ð-WÔX‘TÐgk×gvÑgvÐw}Ôg~Ñ_cð  EIˆFØ�X˜Q˜t˜fÐ%¨&¯,©,«.Ð)9¸$¸Ð'@Ð@Ò@ð	 .ð
 rP   c                ó’   — t        j                  d| «      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% c}S c c}w )Nu   (?<=[ã€‚ï¼�ï¼Ÿ!?;ï¼›\n]))rÌ   Úsplitr€   )r´   rJ   s     rQ   Ú
_sentencesr    s<   € Ü-/¯X©XÐ6QÐSWÔ-XÓmÑ-X Ð\d×\jÑ\jÕ\lˆH�N‰NÕÐ-XÑmÐmùÒms
   ™A¯Ac                ó„   — | d | }t        j                  d|«      d   }|dd  }t        t        j	                  |«      «      S )Nu   [,ï¼Œã€�:ï¼š]éÿÿÿÿiîÿÿÿ)rÌ   r  rH   Ú_NEGATION_RErÍ   )rJ   Ústartr  s      rQ   Ú_is_negatedr    sI   € ð �f�uÐ€Fô �X‰XÐ&¨Ó/°Ñ3€FØ�C�Dˆ\€FÜ”×#Ñ# FÓ+Ó,Ð,rP   c                ó\  ‡‡	‡
— g }t        | «      D �]  Š
t        j                  «       D ]ý  \  Š	}g }|j                  «       D ]�  \  }}t        j                  t        j
                  |«      ‰
t        j                  ¬«      D ]L  }|j                  |j                  «       |j                  «       ||t        ‰
|j                  «       «      f«       ŒN Œ� g }t        |d„ ¬«      D ](  Št        ˆfd„|D «       «      rŒ|j                  ‰«       Œ* |j                  ˆ	ˆ
fd„|D «       «       Œÿ �Œ |S )N)Úflagsc                ó$   — | d   | d   | d   z
   fS )Nr   rÈ   rO   )rœ   s    rQ   rf   z_collect_hits.<locals>.<lambda>%  s!   € À$ÀqÁ'ÈTÐRSÉWÐW[Ð\]ÑW^ÑM^ÐK_ÑA`rP   rg   c              3  óN   •K  — | ]  }‰d    |d   k  xr |d    ‰d   k  –— Œ y­w)r   rÈ   NrO   )r`   ÚpriorÚ	candidates     €rQ   rb   z _collect_hits.<locals>.<genexpr>&  s6   øè ø€ ÐaÑX`Èu�y ‘| e¨A¡hÑ.ÒJ°5¸±8¸iÈ¹lÑ3JÓJÑX`ùó   ƒ"%c           
   3  óN   •K  — | ]  \  }}}}}t        |‰||‰d d «      –— Œ y ­w)Né    )rB   )r`   r°   rD   rG   rI   rE   rJ   s        €€rQ   rb   z _collect_hits.<locals>.<genexpr>)  sB   øè ø€ ð  Bñ  yAÑYtÐYZÐ\]Ð_cÐekÐmtœ
 4¨°F¸GÀXÈdÈsÀ^×Tñ  yAùr#  )r  r9   r   rÌ   r  Úescaperã   rÁ   r  Úendr  rj   Úanyrš   )r´   ÚhitsÚlexiconÚ
candidatesrD   rG   rÔ   Úselectedr"  rE   rJ   s           @@@rQ   Ú_collect_hitsr-    s  ú€ Ø€DÜ˜t×$ˆÜ"+§/¡/Ö"3ÑˆI�wØBDˆJØ '§¡¦‘��fÜŸ[™[¬¯©°4«¸(Ì"Ï$É$×O�EØ×%Ñ% u§{¡{£}°e·i±i³kÀ4ÈÔQ\Ð]eÐgl×grÑgrÓgtÓQuÐ&vÕwñ Pð !0ð ACˆHÜ# JÑ4`×a�	ÜÓaÑX`ÓaÔaØØ—‘ 	Õ*ð bð �K‰Kô  Bñ  yAó  Bõ  Bò #4ð %ð  €KrP   F©Úpositive_onlyc          
     ó0  — | D �cg c]!  }|j                   |k(  sŒ|j                  rŒ |‘Œ# }}|r|D �cg c]  }|j                  dkD  sŒ|‘Œ }}t        d„ |D «       «      }|dk  ryt	        t        t        dd|z  |dz   z  «      «      d«      S c c}w c c}w )Nr   c              3  ó4   K  — | ]  }|j                   –— Œ y ­wr[   )rG   ©r`   Úhits     rQ   rb   z#_dimension_score.<locals>.<genexpr>1  s   è ø€ Ð+¡F˜Sˆc�j�j¡Fùó   ‚ç        ç      Y@ç       @rÚ   )rE   rI   rG   ÚsumÚroundrF   Úmin)r)  rE   r/  r3  rÃ   rx   s         rQ   Ú_dimension_scorer;  -  s‘   € Ù!ÓT™T�c S§]¡]°iÓ%?ÈÏËŠc˜T€FÐTÙÙ!'Ó:¡˜#¨3¯:©:¸«>’# ˆÐ:Ü
Ñ+¡FÓ+Ó
+€CØ
ˆa‚xØÜ””s˜5 %¨#¡+°°s±Ñ";Ó<Ó=¸qÓAÐAùò Uùâ:s   …BšB§B³BÁBc           
     óÀ  — t        | «      } t        | «      }|D �cg c]  }|j                  rŒ|‘Œ }}t        D ��ci c]#  }||D �cg c]  }|j                  |k(  sŒ|‘Œ c}“Œ% }}}d„ }dj                  t        j                  d„ |D «       «      «      }g }	|j                  «       D ]8  \  }}
|
sŒ	|	j                  |› d�dj                  d„ |
dd D «       «      z   «       Œ: t        |d	«      }t        |d
d¬«      }t        |dd¬«      }t        |dd¬«      }t        d„ |D «       «      }|r(t        t        t        dd|z  |dz   z  «      «      d«      nd}i dt        |«      “dt        |«      t        |«      z
  “d|“dt        |d	   «      “dt        |d
   «      “dt        |d   «      “dt        |d   «      “d ||d	   «      “d ||d
   «      “d ||d   «      “d ||d   «      “d|“d |“d!|“d"|“d#|“d$|d%k\  rd&n|d'k\  rd(nd)“|d%k\  rd*n|d'k\  rd(nd+|d%k\  rd*n|d'k\  rd(nd+|d,k\  r|d-k  rd.n|d,k\  rd/nd0d1j                  |	«      d2œ¥S c c}w c c}w c c}}w )3zDScore one document and return hit counts, scores and short evidence.c                óX   — dj                  t        j                  d„ | D «       «      «      S )NÚ;c              3  ó4   K  — | ]  }|j                   –— Œ y ­wr[   )rD   r2  s     rQ   rb   z/score_text.<locals>.<lambda>.<locals>.<genexpr>=  s   è ø€ Ð2NÁvÀ°3·8µ8Ávùr4  )rÂ   rŽ   Úfromkeys)rÃ   s    rQ   rf   zscore_text.<locals>.<lambda>=  s   € ˜CŸH™H¤T§]¡]Ñ2NÁvÓ2NÓ%NÔOrP   r>  c              3  óN   K  — | ]  }|j                   sŒ|j                  –— Œ y ­wr[   )rI   rD   r2  s     rQ   rb   zscore_text.<locals>.<genexpr>>  s   è ø€ Ð*S¹t¸ÀsÇ{Ã{¨3¯8­8¹tùs   ‚%”%Ú:u   ï¼›c              3  óZ   K  — | ]#  }|j                   › d |j                  dd › d�–— Œ% y­w)Ú(Né<   Ú))rD   rJ   r2  s     rQ   rb   zscore_text.<locals>.<genexpr>B  s4   è ø€ Ð8rÑgqÐ`c¸C¿H¹H¸:ÀQÀsÇ|Á|ÐTWÐUWÐGXÐFYÐYZÔ9[Ñgqùs   ‚)+Nrà   r5   r6   Tr.  r7   r8   c              3  ó    K  — | ]F  }|j                   d k(  sŒ|j                  rŒ |j                  dk  sŒ0t        |j                  «      –— ŒH y­w)r8   r   N)rE   rI   rG   Úabsr2  s     rQ   rb   zscore_text.<locals>.<genexpr>G  sP   è ø€ ð  G¹°#ÀÇÁÐR^ÓA^Ðgj×grÓgrÐwz÷  xBñ  xBð  EFó  xFœc #§*¡*Ÿo¹ùs   ‚A—A¤A´Ar6  r7  rÚ   r5  r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   é7   u   é«˜é   u   ä¸­u   ä½Žu   å¼ºu   å¼±é#   é-   u   å��å¼±u   è¾ƒå¥½u	   å¾…æ ¸å®žz | )r+   r,   r-   r.   )r“   r-  rI   r9   rE   rÂ   rŽ   r@  r   rÁ   r;  r8  r9  rF   r:  Úlen)r´   r)  r3  ÚactiverE   ÚhÚby_dimensionÚuniquer   r.   rÃ   r%   r&   r'   Úmanagement_qualityÚmanagement_risk_rawr)   s                    rQ   Ú
score_textrT  7  sL  € ä�D‹>€DÜ˜Ó€DÙ!Ó5™T�c¨¯«Šc˜T€FÐ5õ ~Gô  1Hñ  ~GÐpy°ÉÓ<kÉÀ1ÐRS×R]ÑR]ÐajÓRjºQÈÑ<kÑ1kð  ~G€Lñ  1HÙO€FØ—H‘HœTŸ]™]Ñ*S¹tÓ*SÓSÓT€MØ€HØ)×/Ñ/Ö1Ñˆ	�6ÚØ�O‰O˜y˜k¨˜O¨e¯j©jÑ8rÐgmÐnpÐopÑgqÓ8rÓ.rÑrÕsð 2ô " $¨Ó/€JÜ% d¨JÀdÔK€NÜ! $¨¸dÔC€JÜ)¨$°ÈDÔQÐÜñ  G¹ó  Gó  GÐñ wJœE¤%¬¨E°5Ð;NÑ3NÐReÐhkÑRkÑ3lÓ(mÓ"nÐpqÔrð  PSÐðØœ˜F›ðØ%;¼SÀ»YÌÈVËÑ=TðØVeÐgtðàœS ¨fÑ!5Ó6ðà8OÔQTÐUaÐblÑUmÓQnðð 	œS ¨fÑ!5Ó6ðð 9RÔSVÐWcÐdpÑWqÓSrðð 	‘f˜\¨&Ñ1Ó2ð	ð 5EÁfÈ\ÐZdÑMeÓFfð	ð
 	‘f˜\¨&Ñ1Ó2ðð
 5GÉÈ|Ð\hÑOiÓHjðð 	�jðð #3°Nðð EQÐR\ðð 	Ð.ðð 1HÐI^ðð 	˜z¨RÒ/‘e¸zÈRÒ?O±eÐUZðð %3°bÒ$8™5ÈÐZ\ÒH\¹uÐbgØ$.°"Ò$4™5ÀJÐRTÒDT¹5ÐZ_Ø-BÀbÒ-HÐM_ÐbdÒMd¡ð  xJð  NPò  xPÑksð  VaØ—J‘J˜xÓ(òð ùò 6ùÚ<kùó  1Hs'   ›I­I¼
IÁIÁIÁIÉIc                ó@   — | › d|d d › �}d}|D ]  \  }}||v sŒ|c S  y)Nr¾   i�  ))u   å¹´åº¦æŠ¥å‘ŠÚannual_report)u   å¹´æŠ¥rV  )u   å�Šå¹´åº¦æŠ¥å‘ŠÚsemiannual_report)u   å­£åº¦æŠ¥å‘ŠÚquarterly_report)u   ä¸šç»©é¢„å‘ŠÚearnings_forecast)u   ä¸šç»©å¿«æŠ¥Úearnings_flash)u   é£Žé™©æ��ç¤ºÚrisk_notice)u   è‚¡ä»½å›žè´­Úbuyback)r2   r\  )u   è‚¡ä¸œå¢žæŒ�Úshareholder_buy)r3   r]  )u   é‡�å¤§å�ˆå�ŒÚmajor_contract)r1   Úbid_win)u   èµ„äº§é‡�ç»„Úrestructuring)r4   Úmerger_acquisitionÚotherrO   )r   r´   r„   ÚchoicesÚmarkerÚresults         rQ   Ú_announcement_typerf  Y  s@   € Øˆg�R˜˜T˜c˜
�|Ð$€Eð€Gó "‰ˆ�Ø�UŠ?ØŠMð "ð rP   c                ó8  — t        |«      }t        |d«      }|�t        |«      j                  «       nd}|s7t	        j
                  d|«      }|r|j                  d«      j                  «       }|sbt	        j
                  d|«      }|r|j                  d«      j                  «       n*t        d„ |j                  «       D «       | j                  «      }t        | j                  dz   dj                  |j                  «       D �cg c]  }t        |«      ‘Œ c}«      z   dz   |z   «      \  }	}
t        t        |d	«      |«      }t        t        |d
«      |dz   |z   «      }t!        |«      }| j#                  «       }|j%                  «       › d|› �t'        |«      | j                  | j(                  j+                  «       j-                  d«      ||
|	|||t/        ||«      t1        |«      t	        j2                  dd|«      j                  «       d d dœ|¥dt4        i¥S c c}w )N)r   r»   r¼   Úsubjectu   æ ‡é¢˜r|   uN   (?m)^\s*(?:å…¬å‘Šæ ‡é¢˜|å…¬å‘Šå��ç§°|æ ‡é¢˜|è¯�åˆ¸ç®€ç§°)\s*[:ï¼š]\s*(.+?)\s*$rÈ   z(?m)^\s*#+\s*(.+?)\s*$c              3  ó^   K  — | ]%  }|j                  «       sŒ|j                  «       –— Œ' y ­wr[   )r€   )r`   Úlines     rQ   rb   z$_normalize_record.<locals>.<genexpr>r  s*   è ø€ ð  EAÑ^oÐVZÐsw×s}Ñs}ÕsÀTÇZÁZÇ\Ñ^oùs   ‚-˜-r¾   Ú )r   Údateu   å�‘å¸ƒæ—¥æœŸu   å…¬å‘Šæ—¥æœŸu	   å�‘å¸ƒæ—¥)r   Úperiodu	   æŠ¥å‘ŠæœŸu   æŠ¥å‘ŠæœŸé—´Ú#rî   z\s+i,  )r   r   r   r   r   r   r   r   r   r   r   r   r   r/   )rÆ   r‡   r“   r€   rÌ   rÍ   rÏ   ÚnextÚ
splitlinesÚstemr  r†   rÂ   rÃ   rØ   rì   rT  Úresolvere   rC   r]   r^   Úlstriprf  rM  ÚsubÚTEXT_RESEARCH_MODEL_VERSION)ra   r¡   Úindexr´   r   Ú
title_textÚlabelled_titleÚheadingr„   Úsource_code_idr   r   r   ÚscoresÚrelatives                  rQ   Ú_normalize_recordr}  h  sE  € Ü˜Ó€DÜ�vÐcÓd€EØ,1Ð,=”˜%“×&Ñ&Ô(À2€JÙÜŸ™Ð#tÐvzÓ{ˆÙØ'×-Ñ-¨aÓ0×6Ñ6Ó8ˆJÙÜ—)‘)Ð5°tÓ<ˆÙ18�W—]‘] 1Ó%×+Ñ+Ô-¼tñ  EAÐ^b×^mÑ^mÔ^oó  EAð  CG÷  CLñ  CLó  @Mˆ
Ü"0°·±¸TÑ1AÀCÇHÁHÐkq×kxÑkxÔkzÓM{ÑkzÐbgÌhÐW\ÍoÐkzÑM{ÓD|Ñ1|ð  @Dñ  2Dð  GKñ  2Kó  #LÑ€N�KÜ#¤J¨vð  8Bó  %Cð  EIó  JÐÜ"¤:¨fÐ6nÓ#oÐq{ð  Cñ  rCð  FJñ  rJó  K€MÜ˜Ó€FØ�|‰|‹~€Hà"×+Ñ+Ó-Ð.¨a°¨wÐ7ÌÈHËÐdh×dmÑdmØ—[‘[×&Ñ&Ó(×/Ñ/°Ó4ÀeØ"°>ÈJØ.ÀÜ/°
¸DÓAÔRUÐVZÓR[ÜŸ™˜v s¨DÓ1×7Ñ7Ó9¸$¸3Ð?ñð DJðð 	Ô4ñð ùò N|s   ÄHi€„ ©Ú	max_charsc          	     ó¤  — g }t        | «      D ]Œ  }t        t        |«      «      D ]s  \  }}t        |«      }|dkD  rBt	        |«      |kD  r4t        |«      }t        d„ |D «       d«      }|�t        ||   «      d| ||<   |j                  t        |||«      «       Œu ŒŽ |s
t        «       S t        j                  |«      j                  t        ¬«      S )zDDiscover and analyze all supported local files below ``config_dir``.r   c              3  óX   K  — | ]"  }t        |«      j                  «       d v sŒ|–— Œ$ y­w)>   rµ   r´   r•   rº   r·   r¸   r¶   r¹   N)rC   r^   )r`   r>   s     rQ   rb   z'analyze_text_sources.<locals>.<genexpr>‹  s.   è ø€ ð  $h±6¨C¼SÀ»X¿^¹^Ó=Mð  Rgò  >g¤C±6ùs   ‚ *£*NrS   )rn   Ú	enumerater²   rÆ   rM  rŽ   ro  r“   rÁ   r}  rX   rU   rV   ÚreindexrW   )rl   r  Úrowsra   rv  r¡   r´   Úcontent_keys           rQ   Úanalyze_text_sourcesr†  ƒ  sÖ   € à!#€DÜ# JÖ/ˆÜ&¤°tÓ'<Ö=‰MˆE�6Ü Ó'ˆDØ˜1Š}¤ T£¨YÒ!6Ü˜f›�Ü"ñ  $h±6ó  $hð  jnó  o�ØÐ*Ü*2°6¸+Ñ3FÓ*GÈ
ÈÐ*S�F˜;Ñ'Ø�K‰KÔ)¨$°¸Ó>Õ?ñ >ð 0ñ Ü"Ó$Ð$Ü�<‰<˜Ó×%Ñ%Ô.CÐ%ÓDÐDrP   c               ó†   — t        | d«      rt        | j                  «      dz  }n| �t        | «      }nd}t        ||¬«      S )zGConvenience alias accepting either a directory or an existing Settings.Úproject_rootÚconfigNr~  )Úhasattrr   rˆ  r†  )Úsettings_or_dirr  rm   s      rQ   Úbuild_text_researchrŒ  ”  sC   € äˆ Ô/Ü�O×0Ñ0Ó1°HÑ<‰Ø	Ð	$Ü�OÓ$‰àˆÜ °	Ô:Ð:rP   )Úreturnúpd.DataFrame)rl   ústr | Path | Noner�  z
list[Path])ra   r   r�  rC   )r‚   úMapping[str, Any]rƒ   zIterable[str]r�  r   )r„   r   r�  rC   )r„   r   r�  úlist[dict[str, Any]])ra   z
str | Pathr�  r‘  )r¡   r�  r�  rC   )r„   r   r´   rC   r�  z
str | None)r´   rC   r�  ztuple[str | None, str | None])r´   rC   r�  z	list[str])rJ   rC   r  rÑ   r�  rH   )r´   rC   r�  úlist[KeywordHit])r)  r’  rE   rC   r/  rH   r�  rF   )r´   rC   r�  údict[str, Any])r   rC   r´   rC   r�  rC   )ra   r   r¡   r�  rv  rÑ   r�  r“  )rl   r�  r  rÑ   r�  rŽ  )r‹  r   r  rÑ   r�  rŽ  );Ú__doc__Ú
__future__r   Údataclassesr   r‘   Úpathlibr   rÌ   Útypingr   r   r   ÚnumpyrŒ   ÚpandasrU   ru  Ú	frozensetr_   rW   r9   rN   Ú_NEGATION_WORDSÚcompilerÂ   rj   rÐ   r&  rM  rã   r  rÎ   rå   r  r  rB   rX   rn   rz   r‡   r“   r›   r²   rÆ   rØ   rì   r  r  r  r-  r;  rT  rf  r}  r†  rŒ  Úanalyze_text_documentsÚscore_text_documentrO   rP   rQ   Ú<module>r      s±  ðòõ #å !Û Ý Û 	ß )Ñ )ã Û ð &Ð ÙÒ?Ó@Ð ò
Ð ð Ø˜ðØ+¨SðØ2:¸CðØAIÈ3ðà�#ðà ðà&.°ðà5=¸sðàDUÐWZðð 	�#ðð   ðð '/°ðð 6>¸sðð EMÈcðð 	�#ð	ð   ð	ð '5°cð	ð LOØ °òðØ�#ðØ ðØ&.°ðØ5=¸sðØDLÈcðà�#ðà ðà&.°ðà5=¸sðàDLÈcðð 	�#ðð   ðð '/°ðð 6>¸sðð ESÐTWðð 	�#ð	ð & sð	ð 7:ÀSÐWZò	ðØ�#ðØ% sðØ,7¸ðØ>FÈðØM[Ð]`ðà˜ðà+¨Sðà2@À#ðàGUÐWZðð 	�#ðð   ðð '5°cðð <DÀSðð KYÐZ]ðð 	�#ð	ð & sð	ðØ�SðØ% sðØ,4°cðØ;IÈ3ðØP^Ð`cðà�#ðà ðà&4°cðà;LÈcðàS[Ð]`ðð 	�#ðð & sðð -5°cðð <MÈcðð 	˜ð	ð '¨ð	ð /7¸ð	ð IMØ $¸òñ)*€	Ð&ó ð:€ð ˆr�z‰z˜#Ÿ(™(¡6©#¨b¯i©i¸Ó*IÈsÐ\`Ô#aÓbÐdf×dhÑdhÓi€Øˆ2�:‰:ÐUÓV€ð ˆ2�:‰:Ð]Ó^€Øˆ2�:‰:ÐPÓQ€Ø�—
‘
Ð2Ó3€ñ �$Ô÷ð ó ðó7ó

ó1óóó*ó$ó:ó ó"ó<ó"nó	-óð* W\õ BóóDóð6 MVõ Eð" CLõ ;ð .Ð Ø Ñ rP   