
    @j6                       % 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
J
r
Jr  SSKJr  SrSrSrS	rS
rSrSrSrSr\R.                  " 5       rSqS\S'   SqSS jrSS jrSSS jjrSS jrSS jr SS jr!SS S jjr"g)!zLocal utility outage providers for the NWAL Scanner platform.

Normalizes Florence Electricity and Sheffield Utilities into the county-shaped
JSON payload expected by the existing broadcast display.
    )annotationsN)datetimetimezone)Anyz5http://68.208.116.30:7576/data/outageSummary.json?v=2zAhttps://ebill.sheffieldutils.org/maps/Outage_Web_Map/maps/GWT.rpcz https://ebill.sheffieldutils.orgz5https://ebill.sheffieldutils.org/maps/Outage_Web_Map/z:https://ebill.sheffieldutils.org/maps/Outage_Web_Map/maps/ 1D9BF682AF8D25FA7709856C83E9910Fz7|0|4|https://ebill.sheffieldutils.org/maps/Outage_Web_Map/maps/|612278413EC26C34D54A3907AA0CDFD8|coop.nisc.oms.webmap.services.RpcCombinedOutageDetailsService|getCombinedOutageDetails|1|2|3|4|0|<   i  zdict[str, Any] | None_cacheg        c                     [         R                  " [        R                  5      R	                  5       R                  SS5      $ )N+00:00Z)r   nowr   utc	isoformatreplace     outage_sources.py_utc_now_isor   (   s+    <<%//199(CHHr   c           	        U (       d  g  [         R                  " [        U 5      R                  SS5      5      nUR                  c  UR                  [
        R                  S9n[        S[        [         R                  " [
        R                  5      UR                  [
        R                  5      -
  R                  5       5      5      $ ! [         a     g f = f)Nr   r   )tzinfor   )r   fromisoformatstrr   r   r   r   maxintr   
astimezonetotal_seconds	Exception)valuedts     r   _parse_iso_age_secondsr    ,   s    ##CJ$6$6sH$EF998<<0B1c8<<5hll8SSbbdeff s   B=C 
CCc                    [         R                  " 5       n[        R                  R	                  XUS9 nUR                  5       sS S S 5        $ ! , (       d  f       g = f)N)timeoutcontext)sslcreate_default_contexturllibrequesturlopenread)r'   r"   r#   responses       r   _fetch_bytesr+   8   s?    ((*G			'		Jh}} 
K	J	Js   A
Ac                    [         R                  R                  [        SSSSSS.S9n [	        U 5      n[
        R                  " UR                  S5      5      n[        UR                  S5      =(       d    S	5      n[        UR                  S
5      =(       d    S	5      nUR                  S5      =(       d"    UR                  S5      =(       d
    [        5       n[        U5      nSSSUU[        UR                  S5      =(       d
    US	:  a  SOS	5      USS[        US L=(       a	    U[        :  UUR                  S5      UR                  S5      UR                  S5      S.S.$ )Nz!application/json, text/plain, */*no-cachezhttp://68.208.116.30:7576/z/NWALScannerPlatform/018 (+local outage adapter))AcceptCache-ControlPragmaReferer
User-Agent)headers	utf-8-sigcustomersOutNowr   customersServed
updateTimelastUpdated01077
LauderdaleALoutageCount   Florence Electricityz!Florence Electricity service areacustomersAffectedcustomersRestoredstreetsAffected)r?   r@   rA   )US_Full_FIPS
CountyName	StateAbbrCustomersTrackedCustomersOutOutageEventsLastUpdatedDateTimeProviderNameProviderArea	SourceURLStale
AgeSeconds
RawSummary)r&   r'   RequestFLORENCE_URLr+   jsonloadsdecoder   getr   r    STALE_AFTER_SECONDS)r'   rawpayloadcustomers_outcustomers_servedupdatedages          r   fetch_florencer\   >   s>   nn$$9' 3K
 % 	G w
CjjK01G$56;!<M7;;'89>Q?kk,'W7;;}+EWG
 
)C  ",%GKK6YPQ@Q1WXZ&.;!D>S+>%>!(-@!A!(-@!A&{{+<=
 r   c           	     	   U R                  S5      (       d  [        S5      e[        R                  " U SS  5      n[	        U[
        5      (       a'  [        U5      S:  d  [	        US   [
        5      (       d  [        S5      eUS S nUS   nU Vs/ s H:  n[	        U[        5      (       d  M  [        R                  " SU5      (       d  M8  UPM<     nn/ n/ n[        S[        S[        U5      S-
  5      5       GH  n X(S	-      X(S
-      X(S-      X(S-      4u  pp[	        U	[        [        45      (       a  [        [        U	5      5      S:  a  U
S:X  a  [	        U[        [        45      (       a  [        [        U5      5      S:  as  US:X  aj  X(S-      n[	        U[        5      (       aL  SUs=::  a  S::  a=  O  M  UR                  U5        UR                  [        U	5      [        U5      S.5        M  M  M  GM  GM  GM  GM
  GM  GM     / n/ n[%        5       n['        Xg5       HK  u  nnUS   US   4nUU;   a  M  UR)                  U5        UR                  U5        UR                  U5        MM     [+        S [-        U5       5       S 5      n[+        S [-        U5       5       S 5      n[+        S [-        U5       5       S 5      n[-        U5       VVs0 s H@  u  p[	        U[        5      (       d  M  [        R                  " SU5      (       d  M:  US	-   U_MB     nnn0 n0 nUGb  U(       Ga  [-        U5       GH  u  nnUU;  a  M  US
-   [        U5      :  a  M#  Ub  X(S	-      U:w  a  M3  Ub  X(S
-      U:w  a  MC  UU   nS nS nUS:  a_  X(S	-
     U:X  aT  X(S
-
     n[	        U[        5      (       a  US:  a  UnX(S-
     U:X  a$  X(S-
     n[	        U[        5      (       a  US:  a  UnOCUS:  a=  X(S	-
     U* :X  a1  SnX(S
-
     U:X  a$  X(S-
     n[	        U[        5      (       a  US:  a  UnUb  UUU'   Uc  GM  UUU'   GM
     U(       a  [/        UR1                  5       5      OS nUb  Un Sn!O)U(       a  U(       d  [        U5      n Sn!O[/        U5      n Sn!U [        [        U5      [        U5      5      UUUUUU!S.$ s  snf ! [         ["        [        4 a     GM  f = fs  snnf )Nz//OKz(Sheffield returned a non-OK GWT response   z'Unexpected Sheffield GWT response shapez\d{6,}r   
   r=         i 7   	   i@B )xyre   rf   c              3     #    U  H;  u  p[        U[        5      (       d  M  UR                  S 5      (       d  M4  US-   v   M=     g7f)zjava.lang.Integer/r=   N
isinstancer   
startswith.0iitems      r   	<genexpr>-_decode_sheffield_response.<locals>.<genexpr>   s<      \-?'!%dC0 59__EY5Z A-?   AAAc              3     #    U  H;  u  p[        U[        5      (       d  M  UR                  S 5      (       d  M4  US-   v   M=     g7f)z+cc.nisc.oms.clientandserver.v2.pojo.Region/r=   Nrh   rk   s      r   ro   rp      s<      z2Dwq *4 5 #:>//Jw:x #QU2Drq   c              3  @   #    U  H  u  pUS :X  d  M  US-   v   M     g7f)zZip Code Regionsr=   Nr   rk   s      r   ro   rp      s(      ;1Cga#'99 "AE1Cs   z\d{5}zcustomers-summary-by-zipzevent-count-fallbackzdecoded-marker-counts-fallback)rX   outage_events
outage_idscustomer_countszip_outageszip_customers_servedcoordinatesparse_quality)rj   
ValueErrorrQ   rR   ri   listlenr   re	fullmatchranger   r   floatabsappend
IndexError	TypeErrorsetzipaddnext	enumeratesumvalues)"textstreamr   stringsrn   ru   rv   ry   rm   re   x_typerf   y_typecountdedup_countsdedup_coordsseen_coordscoordkeyinteger_refregion_class_refregion_name_refzip_refsrw   rx   r   zip_codeoutage_countserved_countpossible_outpossible_servedsummary_totalrX   rz   s"                                     r   _decode_sheffield_responser   f   s   ??6""CDDZZQR!Ffd##s6{QjPRUY>Z>ZBCCCR[FRjG
 ! dC  	%'\\)T%B 	   "$O*,K1c!S[2-./	#)a%=&Q-APV[\W\P]#] Aq1sEl++E!H0FbLq3,//CaMF4JbL1ueS))a5.EI.E#**51&&U1XE!H'EF /F) ! 5K/ ! 1G+	 0" !L+-L,/EKO9uSz5:&+E"E" :(  \Yw-? \]acK z)G2D z{A ;71C ;<@BO+4W+= K+=dC( -/\\(D-I At+=H K #%K+-8!&)HAuH$1uF#*v!e}/O+1uAQ0QHLL Av&Q-;6%!e}lC00\Q5F#/La%=K/&,UmO!/377Oq<P'6 aFq5Mk\9 a%=K/&,UmO!/377Oq<P'6'(4H%'1=$X.G *J 2=C**,-$M
  %2	LJ.L)8 'S_c,.?@ '" 4#&	 	i2 Iz2 		BKs=   S -S S >B:S:7SS"4S"
S"SSc                    [         R                  R                  [        [        R                  S5      SSSSS[        [        S[        [        SS.
S	9n [        U S
S9nUR                  SSS9n[        U5      n[        5       n0 SS_SS_SS_SS_S[        US   5      _S[        US   5      _SU_SS_SS_S [        _S!S"_S#S_S$US%   _S&US'   _S(US)   _S*UR                  S+0 5      _S,UR                  S-0 5      _$ ).Nzutf-8POSTz*/*r-   ztext/x-gwt-rpc; charset=UTF-8z#Mozilla/5.0 NWALScannerPlatform/018mv)
r.   r/   r0   zContent-TypeOriginr1   r2   zX-GWT-Module-BasezX-GWT-Permutationz!coop.nisc.outagewebmap.configName)datamethodr3      )r"   r4   r   )errorsrB   01033rC   ColbertrD   r;   rE   r   rF   rX   rG   rt   rH   rI   Sheffield UtilitiesrJ   z)Sheffield Utilities electric service arearK   rL   FrM   ParseQualityrz   	OutageIDsru   CustomerCountsrv   
ZipOutagesrw   ZipCustomersServedrx   )r&   r'   rO   SHEFFIELD_URLSHEFFIELD_BODYencodeSHEFFIELD_ORIGINSHEFFIELD_REFERERSHEFFIELD_MODULE_BASESHEFFIELD_PERMUTATIONr+   rS   r   r   r   rT   )r'   rV   r   decodedrZ   s        r   fetch_sheffieldr      s   nn$$""7+' ;&(?!6!615
	 % G" w
+C::k):4D(.GnGi 	T 	A	
 	GO45 	GO45 	w 	- 	C 	] 	 	a 	0 	W\* 	'"34  	gkk-4!" 	gkk*@"E# r   c                  ^ [         R                   " 5       n[           U (       d0  [        b)  U[        -
  [        :  a  [        [        5      sS S S 5        $ [        nS S S 5        / n/ nS[        4S[        44 H}  u  pV U" 5       nUR                  U5        UR                  USUR                  SS5      UR                  SS5      UR                  S5      [        UR                  S5      5      S	.5        M     W(       a  [        UR                  S5      [        5      (       ai  U V	s1 s H  oR                  S5      iM     n
n	US    H@  nUR                  S5      U
;  d  M  [        U5      nSUS'   SUS'   UR                  U5        MB     SSS.mUR!                  U4S jS9  [        U5      S[#        5       UU[%        S U 5       5      [%        S U 5       5      S.n[           Uq[         R                   " 5       qS S S 5        [        U5      $ ! , (       d  f       GN= f! [         a:  nUR                  US
[        U5      S.5        [        SU SU 3SS9   S nAGM  S nAff = fs  sn	f ! , (       d  f       Nw= f)Nr>   r   TrF   r   rG   rH   rL   )providerokcustomersOutoutageEventsrZ   staleF)r   r   errorz
[OUTAGES] z fetch failed: )flushcountiesrI   Fallbackr=   )r9   r   c                Z   > TR                  [        U R                  SS5      5      S5      $ )NrB    c   )rT   r   )corders    r   <lambda>#get_local_outages.<locals>.<lambda>O  s     		#aeeNB.G*H" Mr   )r   zlocal-utility-aggregatorc              3  h   #    U  H(  n[        UR                  S 5      =(       d    S5      v   M*     g7f)rF   r   Nr   rT   rl   r   s     r   ro   $get_local_outages.<locals>.<genexpr>W  &      S(QQUU>%:%?a!@!@(   02c              3  h   #    U  H(  n[        UR                  S 5      =(       d    S5      v   M*     g7f)rG   r   Nr   r   s     r   ro   r   X  r   r   )successsourcegeneratedAtr   	providerstotalCustomersOuttotalOutageEvents)time_cache_lockr	   _cache_timeCACHE_SECONDSdictr\   r   r   rT   boolr   r   printri   r|   sortr   r   )forcer   previousr   provider_statusprovider_namefetchercountyexcr   current_namesoldfallbackresultr   s                 @r   get_local_outagesr     s8    ))+C	+k0AM0Q< 
  

 &(H,.O 
 0	0#	PYFOOF#"") &

>1 = &

>1 =!::&;<fjj12$ #4 Jx||J7>>8@A1~.AJ'Cww~&m;9$(!'+$) ( !$EMMMMN >,#~$  S( SS  S( SSF 
iik 
 <w 
.  	P"")S$ 
 J}o_SEB$OO	P B* 
s<   .HH=A7H"'I)%I.
H"
I&,.I!!I&.
I<)returnr   )r   r   r   z
int | None)r`   )r'   zurllib.request.Requestr"   r   r   bytes)r   dict[str, Any])r   r   r   r   )F)r   r   r   r   )#__doc__
__future__r   rQ   r~   r$   	threadingr   urllib.requestr&   r   r   typingr   rP   r   r   r   r   r   r   r   rU   Lockr   r	   __annotations__r   r   r    r+   r\   r   r   r   r   r   r   <module>r      s    #  	 
    ' FS5 K T : *   nn $ $I	%PJZ)X?r   