
    @j}d                       S r SSKJr  SSKrSSKrSSKr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  SSKJr  SSKJr  SSKJrJrJrJrJr  SrS	rS
rSSSSS.rSrSrSrSrSrSr S)S jr!Sr"Sr#Sr$Sr%Sr&\" SS9 " S S5      5       r'S*S  jr(S*S! jr)S+S" jr* " S# S$5      r+S,S% jr,S-S& jr-S-S' jr.\/S(:X  a  \0" \." 5       5      eg).a  
NWAL Scanner Weather V3
WeatherBug Spark Lightning Bridge v003

Purpose
-------
Loads the WeatherBug Spark page in Playwright, captures its lightning JSONP
response, extracts raw strike coordinates, keeps a rolling history, filters
to a broad Southeast coverage box, and writes local JSON files for the
broadcast server.

Output files
------------
spark_lightning.json
spark_lightning_status.json

Install
-------
python -m pip install playwright
python -m playwright install chromium

Run
---
python spark_lightning_bridge_v003.py
    )annotationsN)	dataclass)Path)Any)BrowserBrowserContextPageResponseasync_playwrightv003g:q9dA@g0Ug     C@g      8@g     Xg     Rnorthsouthwesteast   Z   -   g_fA@g,eXU   c           	     &    [        [        R                  R                  S[	        U S-  5      5      5      R                  5       n[        R                  " UR                  SS95      n[        U[        5      (       a  U$ 0 $ ! [         a    0 s $ f = f)NNWALS_LOCATION_PROFILEzlocation_profile.jsonutf-8encoding)r   osenvirongetstrresolvejsonloads	read_text
isinstancedict	Exception)base_dirprofile_pathvalues      spark_lightning_bridge_v003.pyload_location_profiler*   A   s|    BJJNN+CSTkIkElmnvvx

<1171CD"5$//u7R7 	s   A<B ?B BB
   g?   zShttps://lxapp.weatherbug.net/v2/lxapp_impl.html?lat={lat:.6f}&lon={lon:.6f}&v=1.2.0)z/api/lx/lightning/v2/sparkzlightning/v2/sparkT)frozenc                  R    \ rS rSr% S\S'   S\S'   S\S'   \SS j5       rSS jrS	rg
)Strike[   floatlatlonint	timestampc                V    U R                   S SU R                  S SU R                   3$ )Nz.5f:r2   r3   r5   selfs    r)   id	Strike.ida   s,     ((3q#a/?@@    c           
         U R                   U R                  U R                  U R                  U R                  S-  [	        SXR                  -
  5      SS.$ )N  r   weatherbug_spark)r;   r2   r3   r5   timestamp_msage_secondsprovider)r;   r2   r3   r5   max)r:   now_ss     r)   as_dictStrike.as_dictg   sH    ''8888 NNT1q%.."89*
 	
r=    N)returnr   )rE   r4   rI   dict[str, Any])	__name__
__module____qualname____firstlineno____annotations__propertyr;   rF   __static_attributes__rH   r=   r)   r/   r/   [   s*    	J	JNA A
	
r=   r/   c                   Sn[         R                  " U 5      n[         R                  " U5      n[         R                  " X -
  5      n[         R                  " X1-
  5      n[         R                  " US-  5      S-  [         R                  " U5      [         R                  " U5      -  [         R                  " US-  5      S-  -  -   n	US-  [         R                  " [         R
                  " U	5      [         R
                  " SU	-
  5      5      -  $ )NgɅ@      )mathradianssincosatan2sqrt)
lat1lon1lat2lon2radius_milesphi1phi2dphidlambdaas
             r)   haversine_milesre   s   s    L<<D<<D<<$Dll4;'Ga
((4.488D>
)DHHWq[,AQ,F
F	G  !djj1tyyQ7GHHHr=   c                (   [         R                  " U 5      n[         R                  " U5      n[         R                  " X1-
  5      n[         R                  " U5      [         R                  " U5      -  n[         R                  " U5      [         R                  " U5      -  [         R                  " U5      [         R                  " U5      -  [         R                  " U5      -  -
  n[         R                  " [         R
                  " Xx5      5      S-   S-  $ )Nih  )rU   rV   rW   rX   degreesrY   )	r[   r\   r]   r^   r`   ra   rc   yxs	            r)   bearing_degreesrj      s    <<D<<Dll4;'GDHHTN*A$'
((4.488D>
)DHHW,=
=	>  LLA)*S0C77r=   c                8    / SQnU[        U S-   S-  5      S-     $ )N)NNNENEENEEESESESSESSSWSWWSWWWNWNWNNWg     &@g     6@   )r4   )rg   labelss     r)   compass_directionr~      s)    F #w4/02566r=   c                      \ rS rSr                          SS jrSS jr\SS j5       r\SS j5       rSS jr	SS jr
SS jrSS	 jrSS
 jrSS jrSS jrSS jrSrg)SparkBridge   c                   Xl         X l        X0l        X@l        US-  U l        X`l        Xpl        Xl        Xl        Xl	        Xl
        Xl        0 U l        S U l        S U l        S U l        SU l        SU l        SU l        SU l        [)        5       U l        [,        R.                  " 5       U l        S U l        SU l        S U l        S U l        US-  U l        US-  U l        g )N<   r   Tzspark_lightning.jsonzspark_lightning_status.json)
output_dir
center_lat
center_lonboundshistory_secondsstale_secondsreload_secondsheadlessreference_namereference_latreference_lonmonitoring_radiistrikeslast_capture_wall_timelast_source_timestamp
last_errorcapture_counttotal_source_recordstotal_in_bounds_recordsrunningsetprevious_published_idsasyncioLock_write_lockwrite_failure_started_atwrite_failure_countlast_write_errorlast_successful_write_at	data_pathstatus_path)r:   r   r   r   r   history_minutesr   r   r   r   r   r   r   s                r)   __init__SparkBridge.__init__   s     %$$.3*, ,** 0*,48#15"&*$%!'($03#"<<>6:%#$ ,06:%#&<<%(EEr=   c                    U R                   S   Us=:*  =(       a    U R                   S   :*  Os  =(       a/    U R                   S   Us=:*  =(       a    U R                   S   :*  $ s  $ )Nr   r   r   r   )r   )r:   r2   r3   s      r)   	in_boundsSparkBridge.in_bounds   sY    KK C??4;;w+?? BF#sAAdkk&.AA	
A	
r=   c                    U R                  5       n U R                  S5      nU R                  S5      nUS:  d  X!::  a  [        S5      eXS-   U R                  5       n[        R
                  " U5      $ )N()r   z"Spark response was not valid JSONPrT   )stripfindrfind
ValueErrorr    r!   )textstartendpayloads       r)   parse_jsonpSparkBridge.parse_jsonp   sd    zz|		#jjo19ABBqy3'--/zz'""r=   c                   U R                   R                  SSS9  [        R                  " U R                  S-   S[        U R                   5      S9u  p# [        R                  " USSS9 n[        R                  " XS	S
S9  UR                  S5        UR                  5         [        R                  " UR                  5       5        SSS5        U$ ! , (       d  f       U$ = f! [         av     [        R                  " U5        O! [          a     Of = f[        R"                  R%                  U5      (       a(   [        R&                  " U5        e ! [          a     e f = fe f = f)z=Write and fsync a temporary JSON file beside the destination.Tparentsexist_ok.z.tmp)prefixsuffixdirwr   r   rS   ),: )indent
separators
N)parentmkdirtempfilemkstempnamer   r   fdopenr    dumpwriteflushfsyncfilenor%   closeOSErrorpathexistsunlink)r   r   fdtmp_namehandles        r)   _write_temp_jsonSparkBridge._write_temp_json   s$    	$6''99s?DKK 

	2sW5		'!LT")	 6
 O 65
 O 
	 ww~~h''IIh'   
	ss   C" *AC	C" 
CC" C" "
E"-DE"
DE"D'E"9EE"
EE"EE"c                  #    Sn U R                  X5      n[        S[        S-   5       H`  n [        R                  " X15        Sn  U(       a=  [        R
                  R                  U5      (       a   [        R                  " U5        ggg    U(       a=  [        R
                  R                  U5      (       a   [        R                  " U5        ggg! [         a     gf = f! [         a  nU[        :  ay  [        U5      R                   SU 3U l         SnA  U(       aM  [        R
                  R                  U5      (       a(   [        R                  " U5        g! [         a     gf = fgg[        R                  " [        5      I Sh  vN     SnAGMq  SnAf[         a  n[!        USS5      S:X  a  U[        :  ay  [        U5      R                   SU 3U l         SnA  U(       aM  [        R
                  R                  U5      (       a(   [        R                  " U5        g! [         a     gf = fgg[        R                  " [        5      I Sh  vN     SnAGM<  e SnAff = f! [         a     gf = f! ["         a}  n[        U5      R                   SU 3U l         SnAU(       aM  [        R
                  R                  U5      (       a(   [        R                  " U5        g! [         a     gf = fggSnAff = f! U(       aM  [        R
                  R                  U5      (       a(   [        R                  " U5        f ! [         a     f f = ff f = f7f)a  
Atomically replace a JSON output file.

Windows may temporarily deny os.replace() while another process has the
destination open. Retry that operation and return False instead of
raising after all attempts. The caller can then continue running and
publish again on the next capture.
NrT   Tr   Fwinerror   )r   rangeWRITE_RETRY_ATTEMPTSr   replacer   r   r   r   PermissionErrortyperK   r   r   sleepWRITE_RETRY_DELAY_SECONDSgetattrr%   )r:   r   r   r   attemptexcs         r)   atomic_json_writeSparkBridge.atomic_json_write   s      $%	,,T;H $81$<=JJx.#H4 BGGNN844IIh' 5x= >2 
 BGGNN844IIh' 5x  9 ' C"66#Cy112"SE: -  %( BGGNN844IIh'  5x% "--(ABBBB 
sJ5:"&::#'9#5#5"6b > !1 $) BGGNN844IIh'  5x &mm,EFFF 
(    	'+Cy'9'9&:"SE$BD!BGGNN844IIh'  5x		 BGGNN844IIh'  5xs  M"'I? C$I? +M"3C 	M"I? +M";I/ M"
C!M" C!!M"$
I,.)FI? +M"E M"
E,)M"+E,,M"1FFFI? I,(:I'"I? '+M"H* )M"*
H74M"6H77M"<I'II'I? &I''I,,I? /
I<9M";I<<M"?
L	L(L	 ,+M"K/ .M"/
K<9M";K<<M"LL	 	,M6MM
MMMMM"c                    XR                   -
  nU R                  R                  5        VVs/ s H  u  p4UR                  U:  d  M  UPM     nnnU H  nU R                  R	                  US 5        M!     g s  snnf N)r   r   itemsr5   pop)r:   rE   cutoff	strike_idstrike	stale_idss         r)   prune_historySparkBridge.prune_history#  su    --- &*\\%7%7%9
%9!	&( %9 	 

 #ILLY- #
s   A5A5c                  ^#    U R                    IS h  vN   [        [        R                  " 5       5      nU R                  U5        [	        U R
                  R                  5       S SS9nU Vs1 s H  o3R                  iM     nnX@R                  -
  nU Vs/ s H/  nUR                  U;   d  M  XR                  -
  [        ::  d  M-  UPM1     nn/ nU H  n[        U R                  U R                  UR                  UR                  5      n[!        U R                  U R                  UR                  UR                  5      n	UR#                  XU45        M     S n
U(       a]  [%        US S9u  pn['        US5      ['        U	5      [)        U	5      UR                  UR                  [+        SXR                  -
  5      S.n
U R,                   V^s0 s HG  mS	[/        T5      R1                  5       (       a  [        T5      OTS
 S3[3        U4S jU 5       5      _MI     nnU R4                  c  S O+['        [        R                  " 5       U R4                  -
  S5      nU R4                  S L=(       a    US L=(       a    XR6                  :*  nS[8        UUS-  U R:                  S-  U R<                  U R>                  U R                  U R                  S.[A        U5      [A        U5      U RB                  U
UU Vs/ s H  o3RE                  U5      PM     snU Vs/ s H  o3RE                  U5      PM     snS.n0 SS_S[8        _SU(       a  SOS_SU_SU_SU R6                  _SU R4                  c  S O[        U R4                  5      _SU RB                  _S[A        U5      _S[A        U5      _SU RF                  _SU RH                  _SU RJ                  _S U R<                  _S!US!   _S"U
_S#U_U RL                  U RN                  U RP                  U RR                  c  S O[        U RR                  5      S$.EnU RU                  U RV                  U5      I S h  vN nU RU                  U RX                  U5      I S h  vN nU=(       a    UnU(       a  U RZ                  b;  ['        [        R                  " 5       U RZ                  -
  S5      n[]        S%U S&35        S U l-        SU l(        S U l'        [        R                  " 5       U l)        X@l         S S S 5      IS h  vN   gU =RP                  S-  sl(        U RZ                  c  [        R                  " 5       U l-        [        R                  " 5       U RZ                  -
  n[]        S'U RP                   S(US) S*U RN                   35        U[^        :  a  []        S+US) S,35         S S S 5      IS h  vN   g- GNs  snf s  snf s  snf s  snf s  snf  GN GNx N N)! , IS h  vN  (       d  f       g = f7f).Nc                    U R                   $ r   )r5   )r   s    r)   <lambda>+SparkBridge.write_outputs.<locals>.<lambda>4  s
    6#3#3r=   T)keyreversec                    U S   $ Nr   rH   )rows    r)   r   r   S  s	    CPQFr=   )r   rT   r   )distance_milesrj   	directionr   r5   rB   within_g_milesc              3  >   >#    U  H  u  n  o!T::  d  M  S v   M     g7f)rT   NrH   ).0miles_radiuss      r)   	<genexpr>,SparkBridge.write_outputs.<locals>.<genexpr>_  s     N]keQvo]s   	r@   r?   r   )r   r2   r3   )rC   bridge_versiongenerated_atgenerated_at_msr   coveragereference_pointstrike_countnew_strike_countlatest_strike_timestampnearest_strikeradius_countsnew_strikesr   rC   r  statushealthystale_or_startingcapture_age_secondsstale_after_secondslast_capture_epochr  r  r  r   last_source_record_countlast_in_bounds_record_countr
  r  r  r  )r   r   r   last_successful_write_epochz&[SPARK] output writes recovered after sz9[SPARK] output write busy; keeping bridge alive (failure z, age z.1fzs): z7[SPARK] WARNING: output files have remained locked for z@s; capture will continue and publishing will retry automaticallyF)0r   r4   timer   sortedr   valuesr;   r   r5   NEW_STRIKE_WINDOW_SECONDSre   r   r   r2   r3   rj   appendminroundr~   rD   r   r1   
is_integersumr   r   VERSIONr   r   r   lenr   rF   r   r   r   r   r   r   r   r   r   r   r   printWRITE_WARNING_AFTER_SECONDS)r:   rE   sorted_strikesr   current_idsnew_idsr  distance_rowsr  bearingnearestr  r  capture_ager  datar  data_ok	status_ok	writes_okoutage_secondsfailure_ages              `          r)   write_outputsSparkBridge.write_outputs-  s    ###		$Eu%###%3N 4BB>99>KB!$?$??G -,F99'  ,,,0II ,   M('&&&&JJJJ	 *&&&&JJJJ	 $$ef%=> ) G),]@R)S&&+E1o',W~!27!;!'!'!1!1#&q%2B2B*B#C #33 4F v)A)A)C)C#f+PQRRXYN]NNO3   ..6 499;)D)DDaH  ++47 6t+6#5#55  /") %#(4<#'#7#72#= KK //----$
 !$N 3$'$4+/+E+E")!.DOPK&u 5KP@NOfNN51O%D*. ' w)4G 7	
 &{ &t'9'9 %22: T889 *4+E+E N 3 #C$4  !3!3  +D,E,E!" .t/K/K#$ DKK%& "4(9#:'( !')*  +, #oo$($9$9'+'?'? 44< T::;9F@ !224>>4HHG"44T5E5EvNNI-II00<%*		d&C&CC&N @)*!-
 15-+,((,%04		-.9+S $##V $$)$,,404		-))+(E(EEK 445 6"3'tD,A,A+BD 99&s+ ,:: { $## CFD  QOF INm $###s   XWXAW20WW2W1W	WDW2AWCW25WW2W# /D W2W(#W23W+4BW2XW.XB"W2;XW0XW2+W2.X0X2X	8W;9X	Xc                  ^#    UR                   R                  5       m[        U4S j[         5       5      (       d  g  UR	                  5       I S h  vN nU R                  U5      nU=(       d    0 R                  S5      =(       d    0 R                  S5      =(       d    / nU(       d  [        S5        g [        [        R                  " 5       5      nSnU R                  nU H  n [        US   5      n	[        US   5      n
[        US   5      n[        R                   " U	5      (       a:  [        R                   " U
5      (       a  S	U	s=::  a  S
::  a  O  OSU
s=::  a  S::  d  O  M  U R#                  X5      (       d  M  XS-   :  a  M  XU R$                  -
  S-
  :  a  M  ['        XUS9nXR(                  UR*                  '   US-  nUc  UO
[-        X{5      nM     [        R                  " 5       U l        Xpl
        S U l        U =R2                  S-  sl        [5        U5      U l        X`l        U R;                  5       I S h  vN   [        SU R2                   S[5        U5       SU S[5        U R(                  5       35        g  GN3! [        [        [        4 a     GM  f = f Nb! [<         a  n[?        U5      R@                   SU 3U l         U R;                  5       I S h  vN    O6! [<         a)  n[?        U5      R@                   SU 3U l!         S nAOS nAff = f[        SU R0                   35         S nAg S nAff = f7f)Nc              3  ,   >#    U  H	  oT;   v   M     g 7fr   rH   )r  marker	url_lowers     r)   r  /SparkBridge.process_response.<locals>.<genexpr>  s     G5F6Y&5Fs   rplgz[SPARK] ignored empty responser   lalotir   iL   i,  x   r8   rT   z[SPARK] capture=z source=z southeast=z	 rolling=r   z[SPARK] response error: )"urlloweranySPARK_URL_MARKERSr   r   r   r'  r4   r  r   r1   KeyError	TypeErrorr   rU   isfiniter   r   r/   r   r;   rD   r   r   r   r&  r   r   r6  r%   r   rK   r   )r:   responser   r   recordsrE   accepted	latest_tsrecordr2   r3   r5   r   r   	write_excr;  s                  @r)   process_responseSparkBridge.process_response  s    LL&&(	G5FGGGG	@!(D&&t,G B++C06B;;EBHbG
 67		$EH22I!t-Ct-C #F3K 0I
 MM#&&c**s(b(*s*~~c// s{*t';';;cAACIF*0VYY'A)2):II@Y	; "> +/))+D')2&"DO!#(+GD%+3($$&&&"4#5#5"6 7g,{8* =t||,-/o )( !)Z8 B '  
	@!%c!3!3 4Bse<DO((***  I//09+> %% ,T__,=>??
	@s   :MJ& JA"J& 4M51J& '*JD0J& J$AJ& MJ& J!J&  J!!J& &
M0L=K*#K&$K*)L=*
L4LL=LL=8M=MMc                :   ^ #    UR                  SU 4S j5        g 7f)NrK  c                N   > [         R                  " TR                  U 5      5      $ r   )r   create_taskrQ  )rK  r:   s    r)   r   )SparkBridge.attach_page.<locals>.<lambda>  s    W001F1Fx1PQr=   )on)r:   pages   ` r)   attach_pageSparkBridge.attach_page  s     Q	
s   c                  #    [         R                  U R                  U R                  S9nU R                  (       GaA   [        SU 35        UR                  USSS9I S h  vN   [        R                  " 5       nU R                  (       a  [        R                  " 5       U-
  U R                  :  a  [        R                  " S5      I S h  vN   U R                  5       I S h  vN   U R                  b<  [        R                  " 5       U R                  -
  U R                  :  a  [        S5        O9U R                  (       a(  [        R                  " 5       U-
  U R                  :  a  M  U R                  (       a  GM@  g g  GN N N! [         a  n[        U5      R                    SU 3U l         U R                  5       I S h  vN    O6! [         a)  n[        U5      R                    SU 3U l         S nAOS nAff = f[        S	U R"                   35        [        R                  " S
5      I S h  vN     S nANS nAff = f7f)N)r2   r3   z[SPARK] loading domcontentloadedi`  )
wait_untiltimeoutrS   z"[SPARK] feed stale; reloading pager   z[SPARK] page error: r   )SPARK_PAGE_TEMPLATEformatr   r   r   r'  gotor  r   r   r   r6  r   r   r%   r   rK   r   r   )r:   rX  rD  startedr   rP  s         r)   keep_page_aliveSparkBridge.keep_page_alive!  s    !(( ) 

 lll'(./ii0BFiSSS))+lltyy{W'<t?R?R'R!--***,,... 33? IIK$*E*EE,,- BC lltyy{W'<t?R?R'R lll T +.  	'%)#Y%7%7$83%"@,,...  	?334BykB )) ,T__,=>?mmA&&&	's   ;I"F  E?!A)F 
FF "F#AF /I07F )I=I?F F F 
IH<0G
GG
	H<

G=G83H<8G==4H<1H42H<7I<IIc                  #    U R                   R                  SSS9  U R                  5       I S h  vN   [        5        IS h  vN nUR                  R                  U R                  / SQS9I S h  vN nUR                  SSS.SS	9I S h  vN nUR                  5       I S h  vN nU R                  U5      I S h  vN    U R                  U5      I S h  vN   UR                  5       I S h  vN   UR                  5       I S h  vN   S S S 5      IS h  vN   g  N N N N N Ni NQ N; N%! UR                  5       I S h  vN    UR                  5       I S h  vN    f = f NN! , IS h  vN  (       d  f       g = f7f)
NTr   )z%--disable-background-timer-throttlingz(--disable-backgrounding-occluded-windowsz --disable-renderer-backgrounding)r   argsi   i  )widthheightzen-US)viewportlocale)r   r   r6  r   chromiumlaunchr   new_contextnew_pagerY  rc  r   )r:   
playwrightbrowsercontextrX  s        r)   runSparkBridge.runC  sL    dT:  """#%%%/%8%8%?%? &@ &  G -4,?,?#'37 -@ - 'G !))++D""4(((&**4000mmo%%mmo%%) &%% 	#% ' ,( 1%% mmo%%mmo%%) &%%%s  .FDFDF*E(1D!2E(D#E($D%%E(=D'>E(D/D)D/E(/D+0E(D-E(FE&FF!E(#E(%E('E()D/+E(-E(/E#E
E#E
E##E(&F(E?.E1/E?;Fc                    SU l         g )NF)r   r9   s    r)   stopSparkBridge.stop]  s	    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   N)r   r   r   r1   r   r1   r   zdict[str, float]r   r4   r   r4   r   r4   r   boolr   r   r   r1   r   r1   r   zlist[float]rI   None)r2   r1   r3   r1   rI   rw  )r   r   rI   rJ   )r   r   r   r   rI   r   )r   r   r   r   rI   rw  )rE   r4   rI   rx  )rI   rw  )rK  r
   rI   rx  )rX  r	   rI   rx  )rI   rx  )rK   rL   rM   rN   r   r   staticmethodr   r   r   r   r6  rQ  rY  rc  rr  ru  rQ   rH   r=   r)   r   r      s    ,F,F ,F 	,F
 !,F ,F ,F ,F ,F ,F ,F ,F &,F 
,F\
 # #  60d.^@L@\
 'D&4r=   r   c                 L   [         R                  " SS9n U R                  SSSS9  U R                  S[        [        S9  U R                  S	[        [
        S9  U R                  S
[        [        S9  U R                  S[        [        S9  U R                  S[        [        S9  U R                  SSSS9  U R                  S[        [        S   S9  U R                  S[        [        S   S9  U R                  S[        [        S   S9  U R                  S[        [        S   S9  U $ )Nz6Capture and normalize WeatherBug Spark lightning data.)descriptionz--output-dirr   zADirectory for Spark JSON output files. Default: current directory)defaulthelpz--lat)r   r|  z--lonz--history-minutesz--stale-secondsz--reload-secondsz--show-browser
store_truez"Show Chromium for troubleshooting.)actionr}  z--northr   z--southr   z--westr   z--eastr   )argparseArgumentParseradd_argumentr1   DEFAULT_CENTER_LATDEFAULT_CENTER_LONr4   DEFAULT_HISTORY_MINUTESDEFAULT_STALE_SECONDSDEFAULT_RELOAD_SECONDSDEFAULT_BOUNDS)parsers    r)   build_parserr  a  sF   $$LF P  
 e5GH
e5GH
'  
 %  
 &  
 1  
 	~g7NO
	~g7NO
unV6LM
unV6LMMr=   c                 r  #    [        5       R                  5       n [        [        [        5      R                  5       R                  5      n[        UR                  S5      [        5      (       a  UR                  S0 5      O0 n[        UR                  S5      [        5      (       a  UR                  S0 5      O0 n[        UR                  S5      [        5      (       a  UR                  S0 5      O0 n[        UR                  S5      [        5      (       a  UR                  S0 5      O0 nUR                  S/ SQ5      n[        U[        5      (       a-  U Vs/ s H  n[        U5      S:  d  M  [        U5      PM!     snO/ SQnU(       d  / SQnU R                  [        :X  a*  [        UR                  S	U R                  5      5      U l        U R                  [        :X  a*  [        UR                  S
U R                  5      5      U l        S HI  n[!        X5      ["        U   :X  d  M  [%        X[        UR                  U[!        X5      5      5      5        MK     U R&                  S:  a  [)        S5      eU R*                  U R,                  :  a  [)        S5      eU R.                  U R0                  :  a  [)        S5      e[3        [        U R4                  5      R                  5       U R                  U R                  U R,                  U R*                  U R.                  U R0                  S.U R&                  U R6                  U R8                  U R:                  (       + [=        UR                  SS5      5      [        UR                  S	[>        5      5      [        UR                  S
[@        5      5      US9n	[B        RD                  " 5       n
S H5  n[!        [F        US 5      nUc  M   U
RI                  XRJ                  5        M7     U	RO                  5       I S h  vN   gs  snf ! [L         a     Md  f = f N7f)N	lightning	referencecaptureCenterr
  monitoringRadiiMiles)r+      2   d   r   )g      $@g      9@g      I@g      Y@latitude	longituder   rT   z$--history-minutes must be at least 1z!--south must be less than --northz--west must be less than --eastreferenceNamezFlorence, Alabama)r   r   r   r   r   r   r   r   r   r   r   r   )SIGINTSIGTERM)(r  
parse_argsr*   r   __file__r   r   r#   r   r$   listr1   r2   r  r3   r  r   r  setattrr   
SystemExitr   r   r   r   r   r   r   r   show_browserr   REFERENCE_LATREFERENCE_LONr   get_running_loopsignaladd_signal_handlerru  NotImplementedErrorrr  )rf  profiler  r  capture_centerr
  radiir(   r   bridgeloopsignal_namesigs                r)   
async_mainr    s9    >$$&D#DN$:$:$<$C$CDG0:7;;{;SUY0Z0ZK,`bI2<Y]];=WY]2^2^	k2.dfI;EimmTcFdfj;k;kY]]?B7qsN0:9==;TVZ0[0[y}}Z,acHMM02CDEEOPUW[E\E\uAueeq0@\U5\uAb{E) xx%%++JABxx%%++KBC14!44DuX\\#wt7I%JKL 2 a?@@zzTZZ<==yyDII:;;(0028888ZZZZIIII	
 ,,((**&&&9==:MNOIMM*mDEIMM+}EF#F( ##%D,fk40?''[[9	 - **,e B\ '  sP   EP7P/P>B'P7)F9P7'P$P7P5
P7$
P2.P71P22P7c                 `     [         R                  " [        5       5      $ ! [         a     gf = fr   )r   rr  r  KeyboardInterruptrH   r=   r)   mainr    s*    {{:<(( s     
--__main__)r&   r   rI   rJ   )
r[   r1   r\   r1   r]   r1   r^   r1   rI   r1   )rg   r1   rI   r   )rI   zargparse.ArgumentParser)rI   r4   )1__doc__
__future__r   r  r   r    rU   r   r  r   r  dataclassesr   pathlibr   typingr   playwright.async_apir   r   r	   r
   r   r%  r  r  r  r  r  r  r  r  r  r*   r   r   r(  r_  rG  r/   re   rj   r~   r   r  r  r  rK   r  rH   r=   r)   <module>r     s  4 #     	    !   Z Z    	           + 
  $
 
 
.
I	87H HV#L;| z
TV
 r=   