+
    ꯀjQY                     (   R t ^ RIt^ RIt^ RItRtRtRt. RR.R3NR	R
.R3NRR.R3NRR.R3NRR.R3NRR.R3NRRR.R3NRR.R3NRR.R3NRR.R3NRR.R3NRR.R3NR R!.R3NR"R#.R3NR$R%.R3NR&R'.R3NR(R).R3NR*R+.R3NR,R-.R3NR.R/.R3NR0R1.R3NR2R3.R3NR4R5.R3NR6R7.R3NR8R9.R3NR:R;.R3NR<R=.R3NR>R?.R3NR@RARB.R3NRCRD.R3NRERF.R3NRGRH.R3NRIRJ.R3NRKRL.R3NRMRN.R3NRORP.R3NRQRR.R3NRSRT.R3NRURV.R3NRWRX.R3NRYRZ.R3NR[R\.R3NR]R^.R3NR_R`.R3NRaRb.R3NRcRd.R3NReRf.R3NRgRh.R3NRiRj.R3NRkRl.R3NRmRn.R3NRoRp.R3NRqRr.R3NRsRt.R3NRuRv.R3NRwRx.R3NRyRz.R3NR{R|R}.R3NR~R.R3NRRR.R3NRR.R3NRRR.R3NRR.R3NRR.R3NRR.R3NRR.R3NRR.R3NRR.R3NRR.R3Nt] U u. uF+  q ^,          R8X  g   K  R^V ^,          ^ ,          9   g   K)  V NK-  	  up t]] U u. uF  q ]9  g   K  V NK  	  up ,           tR t	RRRRRRRR/t
/ tR t]P                  ! 4       t/ t/ t/ tR^ R^ R^ R^ R^ R^ R/ R/ RR/	t^t^R^R^R^R^R^R^R^	R^
R^R^R/t^tRR ltR tR tR t]3R ltRR ltRR ltR t/ t/ t0 Rmt 0 Rmt!^R^
R^R^R^R^+R/t"^xt#^t$/ t%^xt&RR lt'R t(R t)RR lt*R t+R t,^ RI-t.].P^                  Pa                  ].P^                  Pc                  ].P^                  Pe                  ]34      4      R4      t4R^ R^ R^ R^ /t5Rs6 ]7! ]44      ;_uu_ 4       t8]5Ps                  ]Pt                  ! ]84      4       RRR4       RR lt<RR lt=R# u up i u up i   + '       g   i     L&; i  ]; d     L2i ; i)u  
ALMACÉN DEL ESCÁNER — app híbrida (una cuenta, un cliente).

El módulo escáner del agente emite los mismos "kinds" que el escáner de producción
(batch/config/wcfg). Aquí se acumulan y se sirven en el MISMO formato que devolvía
`/api/data` del :8773, para que todo el bot (presets, auto-farm, rally, auto-join)
siga funcionando sin tocar su lógica: sólo cambia de dónde vienen los datos.

Origen del código de familias: evony-scout-pixel-v5/iscout_web.py (líneas 2670-2774).
⚠️ FAMILIES/_id2fam guardan el grupo en MINÚSCULA y group_of() devuelve Mayúscula.
   Ya hubo un bug por mezclarlos: comparar siempre en el mismo caso.
Ni,  i
  bosseventzShadow of Dawnzshadow of dawnshadowzDawn Sanctuaryzdawn sanctuaryzDawn Templezdawn templezEclipse Strongholdzeclipse strongholdzFlame Cerberuszflame cerberusCerberuscerberuszKnight Bayardbayardzbayar knightHarpyharpyPerytonperytonMinotaurminotaurGriffingriffinIfritifrit
Kamaitachi
kamaitachiFafnirfafnirBehemothbehemothPhoenixphoenixJormungandrjormungandrTyphontyphonAmmitammitCentaurcentaurWerewolfwerewolfYashayashaRedcapredcapzSkeleton Dragonzskeleton dragon	Manticore	manticoreZombiezombieAiravataairavataGhidorahghidorahz
Nine-tailsz
nine-tailsz
nine tailszStymphalian BirdstymphalianKrakenkrakenAzazelazazel	Leviathan	leviathanGarmrgarmrzNormal Barbary Pirateznormal barbary piratezElite Barbary Piratezelite barbary pirateHydrahydraWarlordwarlordYmirymirPanzpan zLava Turtlezlava turtleSphinxsphinxWitchwitchGolemgolemz
Mire Squidz
mire squidPumpkinpumpkinVikingvikingzGolden Goblinzgolden goblinzArctic Barbarianzarctic barbarianAglaopeaglaopeNasunasuzGugler KnightguglerCarcinuscarcinus	Serpopard	serpopardzSavage Tiger Gladiatorzsavage tigerTaotietaotieNiannianzCranky Snowmanzcranky snowmansnowmanSurtrsurtrzAngry Turkeyzangry turkeyturkeyzFortress Pyramidzfortress pyramidzEaster Bunnyzeaster bunnybunnyotherSantasantazMysterious Witchzmysterious witchzFerris Wheelzferris wheelzCelebration Squadzcelebration squadzAres Statuezares statuezFire Spiritzfire spiritzBosses (Boss)(boss)c                    a T ;'       g    R P                  4       o\        ;QJ d    V3R lV 4       F  '       g   K   R# 	  R# ! V3R lV 4       4      # ) c              3   ,   <"   T F	  qS9   x  K  	  R # 5iN .0kns   & @/Users/danicosta/Desktop/Evony/Evony-hibrid-app/scanner_store.py	<genexpr>fam_match.<locals>.<genexpr>k        #s!Avs   TF)lowerany)namekwsrh   s   &&@ri   	fam_matchrr   i   s@    	A3#s#33#3#3#s###    BossEventOtherc                j  a \         P                  V 4      pVe   V# T ;'       g    RP                  4       oRp\         F^  w  r4p\        ;QJ d    V3R lV 4       F  '       g   K   RM	  RM! V3R lV 4       4      '       g   KH  \
        P                  VR4      p M	  RS9   d   RpV\         V &   V# )zFClasifica un monstruo: Boss | Event | Shadow of Dawn | Other | Normal.ra   Normalc              3   ,   <"   T F	  qS9   x  K  	  R # 5irc   rd   re   s   & ri   rj   group_of.<locals>.<genexpr>w   rl   rm   TFr_   rt   )_GROUP_CACHEgetrn   FAMILIESro   _GROUP_LABEL)rp   cachedresdisprq   grprh   s   &     @ri   group_ofr   o   s    d#F	A
C"33#s#333#s###""31C5 # q=CLJrs   objsbatchescfg_nwcfg_n
last_batchserversweepmtscan_onTcastlefarmgarrisonruins	king_citysub_citysnowberg
guild_cityguild_store
guild_farm	boss_tilec                @   \        \        P                  ! 4       4      p\        ;_uu_ 4        V'       d   \        V4      \        R&   T ;'       g    .  F  p \        VP	                  R^ 4      ;'       g    ^ 4      p\        VP	                  R^ 4      ;'       g    ^ 4      pV'       d	   V'       g   K`  R\        VP	                  R^ 4      ;'       g    ^ 4      R\        VP	                  R^ 4      ;'       g    ^ 4      R\        VP	                  R^ 4      ;'       g    ^ 4      RVRVR	V/\
        WE3&   K  	  \        \
        4      \        R
&   \        R;;,          ^,          uu&   V\        R&   RRR4       R#   \         d     EK4  i ; i  + '       g   i     R# ; i)z8Lote de objetos del mapa que manda el agente cada 1,5 s.r   wxwytidlvxytsr   r   r   N)inttime_LOCKSTATEr|   OBJS	Exceptionlen)itemsr   nowitr   r   s   &&    ri   ingest_batchr      s=   
diik
C	!&kE(O++2+BtQ,,1-3rvvdA7K7K!3Lq #SQ)<)<1%=tSPTVWI]I]\]E^ $c"&&q/*>*>Q&?aaQUWZ \aV  D	fiA!l 
   
se   #FFE96$E9E9*E92F4E9$E98$E9E93<F9F		FF			FF	c                     \         ;_uu_ 4        T ;'       g    / P                  4        F  w  rV\        \        V4      &   K  	  \	        \        4      \
        R &   RRR4       R#   + '       g   i     R# ; i)r   N)r   r   CFGstrr   r   )cfgrg   vs   &  ri   ingest_configr      sH    	YYB%%'DACAK (Sg 
   AA%%A6	c                     \         ;_uu_ 4        T ;'       g    / P                  4        F  w  rV\        \        V4      &   K  	  \	        \        4      \
        R &   RRR4       R#   + '       g   i     R# ; i)r   N)r   r   WCFGr   r   r   )wcfgrg   r   s   &  ri   ingest_wcfgr      sH    	ZZR&&(DADQL )d)h 
r   c                    \         ;_uu_ 4        V P                  R / 4      ;'       g    / \        R &   V P                  R/ 4      ;'       g    / \        R&   \        V P                  RR4      4      \        R&   V P                  R4      '       d   \	        V R,          4      \        R&   RRR4       R#   + '       g   i     R# ; i)r   r   onTr   r   N)r   r|   r   boolr   )ps   &ri   ingest_metricsr      s    	w+11rgeeD"o++ddD 12i55??!!H+.E(O 
s   <B2AB22C	c                4   V\         8w  d   \        P                  \        V 4      4      M\        P                  \        V 4      4      pV'       d/   VP                  R4      '       d   VR,          R8w  d
   VR,          # R\        T ;'       g    ^ 4      ,          # )zNombre legible del objeto. Sin config del juego devolvemos 'id<N>', que es
exactamente lo que el bot ya sabe descartar (no es un monstruo nombrable).rp   ?zid%d)
RESOURCE_Tr   r|   r   r   r   )oidr   cs   && ri   name_ofr      sd     *_C$((3s82DAQUU6]]qyC/yCqM!!rs   c                   \        \        P                  ! 4       4      p. p\        ;_uu_ 4        \        P	                  4        EF  w  w  r4pVR,          pV '       d   V\
        8w  d   K'  WR,          ,
          pV\        8  d   KC  \        VR,          V4      p\        P                  \        VR,          4      4      ;'       g    / p	VR,          ;'       g&    \        V	P                  R^ 4      ;'       g    ^ 4      p
TP                  RTRTRTRT
R	\        V4      RVR,          R
\        V	P                  R
^ 4      ;'       g    ^ 4      RV/4       EK  	  RRR4       V#   + '       g   i     T# ; i)u  Filas en el MISMO formato que devolvía /api/data del escáner externo:
{x, y, name, level, group, id, power, seen_age}.

seen_age = segundos desde la última vez que el barrido vio el tile. El bot lo usa
para no marchar a fantasmas: filtra con ventanas distintas según el grupo (los
boss/event son estacionarios y toleran 45 min; los roaming, 5 min).
Devolvemos TODO el histórico on-map y que filtre el bot, igual que hacía el V4.
r   r   r   r   levelr   r   rp   grouppowerseen_ageN)r   r   r   r   r   	MONSTER_TONMAP_RALLYr   r   r|   r   appendr   float)monsters_onlyr   outr   r   or   agenmr   r   s   &          ri   map_rowsr      s&    diik
C
C	IFQA#Ai$-C[ 4!$BAdG%++A477Cgq 1 6 6Q7BJJQQGR"tQtWquuWa055A6C	  & 
" J# 
" Js%   BE"E"E"8AE"E""E3	c           	        \        \        P                  ! 4       4      \        T ;'       g    \        ^,          4      ,
          p\        ;_uu_ 4        \        P                  4        UUu. uF  w  r#VR,          V8  g   K  VNK  	  pppV F
  p\        V K  	  \        P                  4        UUu. uF?  w  r%V'       g   K  \        P                  ! 4       V,
          \        ^,          8  g   K=  VNKA  	  upp F  p\        P                  VR4       K  	  \        \        4      \        R&   RRR4       \        X4      # u uppi u uppi   + '       g   i     L'; i)uL   Descarta lo que lleva demasiado tiempo sin verse (evita crecer sin límite).r   Nr   )r   r   r   r   r   r   _UNKNOWNUNKNOWN_RETRYpopr   r   )max_agecutoffrg   r   deadr   xys   &      ri   pruner      s    G$>$>{Q ??F	"jjl?ldaag.>l?AQ "*.."2b"2b1TYY[2=MP]`aPa=a11"2bBLLT" cD	f 
 t9 @ c	 
s<   E*E 
E 
*E1E
)E
0E
67E EE	c                  r   \         ;_uu_ 4        R \        \        4      R\        R,          R\        R,          R\        R,          R\        R,          R\        R,          R\        R,          R	\	        \        R	,          4      R
\	        \        R
,          4      /	uuRRR4       #   + '       g   i     R# ; i)r   r   r   r   r   r   r   r   r   r   r   N)r   r   r   r   dictrd   rs   ri   statusr      sr    	CIy%	*:5>65?eHo|U<5HuY'T%.)4eDk1B
 
s   BB%%B6	marchwaywaitcombatscoutc                j   \         P                   ! 4       p. p\        ;_uu_ 4        \        \        P	                  4       R R7       FL  w  r4V'       d   W,
          \
        8  d   K   V\        V&   VP                  V4       \        V4      V 8  g   KL   M	  RRR4       V#   + '       g   i     T# ; i)u	  Devuelve hasta max_n tiles pendientes de resolver y los marca como pedidos.
El tope es a propósito: los scans dirigidos viajan por el MISMO canal que las
marchas, así que pedir muchos de golpe reproduce la saturación que nos costó que
no saliera ninguna marcha.c                     V ^,          # )   rd   )kvs   &ri   <lambda>$take_unknown_tiles.<locals>.<lambda>)  s    bers   keyN)r   r   sortedr   r   r   r   r   )max_nr   r   r   r   s   &    ri   take_unknown_tilesr   !  s    
 ))+C
C	X^^-3CDFBch.HRLJJrN3x5  E 
 J 
 Js   A(B!B!!B2	c                    \        \        P                  ! 4       4      p\        ;_uu_ 4        T ;'       g    .  F  p \        VP                  R ^ 4      ;'       g    ^ 4      pV'       g   K3  \	        V4      q!VR&   V\
        V&   \        VP                  R^ 4      ;'       g    ^ 4      \        VP                  R^ 4      ;'       g    ^ 4      rTV'       d3   V'       d)   WE3\        9  d   WE3\        9  d   R\        WE3&   K  K  K  K  K  	  \
        P                  4        UUu. uFX  w  rg\        VP                  R^ 4      ;'       g    ^ 4      V\        ,
          8:  g   K<  WR,          ,
          \        8  g   KV  VNKZ  	  pppV F
  p\
        V K  	  RRR4       R#   \         d     EKs  i ; iu uppi   + '       g   i     R# ; i)trpts_recvtxty        teN)r   r   r   r|   r   MARCHESr   r   r   r   LANDED_GRACEMARCH_STALE)	r   r   mr   r   r   rg   r   r   s	   &        ri   ingest_marchesr   3  sj   
diik
C	"A!%%q/..Q/GQy\ QUU4^00q13quuT1~7J7J3KB""!52((:R),HbX& ;S!5"2  &mmo jodaquuT1~**+s\/AA GJy\GY]hFh o jA
 # 
  j 
sk   F7FF+F7-AFF"F #F7#$F1
F1
!F1
;F1
F7F.	)F7-F.	.	F77G	c                    \         ;_uu_ 4        T ;'       g    .  EF  p \        VP                  R ^ 4      ;'       g    ^ 4      pV'       g   K4  \        P                  V4      ;'       g    / pR TRVP                  R4      ;'       g    VP                  R4      ;'       g    RRVP                  R4      ;'       g    VP                  R4      ;'       g    RR\        VP                  R^ 4      ;'       g    ^ 4      ;'       g    VP                  R^ 4      R\        VP                  R^ 4      ;'       g    ^ 4      ;'       g    VP                  R^ 4      R\        VP                  R^ 4      ;'       g    ^ 4      ;'       g    VP                  R^ 4      /\        V&   EK  	  RRR4       R#   \         d     EK  i ; i  + '       g   i     R# ; i)uidrp   ra   taggidr   r   N)r   r   r|   PLAYERSr   )r   r   r   prevs   &   ri   ingest_playersr   J  sg   	"A!%%q/..Q/{{3'--2 %s &f(O(O&9I(O(OR %quuU|'L'Ltxx'L'L" %s155?+?+?a'@'V'VDHHUTUDV $c!%%a.*=*=A&>&S&S$((4QRBS $c!%%a.*=*=A&>&S&S$((4QRBS U  
   
s   GF.F.GF.,F.
F.#F.>F. F.8F.0F.7F.0F.6F.F.G.F>	9G=F>	>GG	c                   \        \        P                  ! 4       4      p. p\        ;_uu_ 4        / p\        P	                  4        Fe  p\        VP                  R^ 4      ;'       g    ^ 4      \        VP                  R^ 4      ;'       g    ^ 4      rV'       g   KV  V	'       g   K`  WvW3&   Kg  	  / p
\        P	                  4        EF  p\        VP                  R^ 4      ;'       g    ^ 4      pV\        9  d   K6  \        VP                  R^ 4      ;'       g    ^ 4      pW\        ,
          8:  d   Kn  WKR,          ,
          \        8  d   K  \        VP                  R^ 4      ;'       g    ^ 4      \        VP                  R^ 4      ;'       g    ^ 4      rV'       d	   V'       g   K  V
P                  W3. 4      P                  V4       EK  	  V
P                  4        EFa  w  w  rp\        VR R	7      p\        VP                  R
^ 4      ;'       g    ^ 4      p\        P                  V4      ;'       g    / p\        VP                  R^ 4      ;'       g    ^ 4      pV '       d
   VV 8X  d   K  VP                  W34      pV'       d=   V'       d5   V'       d-   \        VP                  R^ 4      ;'       g    ^ 4      V8X  d   K  \        P                  W34      ;'       g    / p\        VP                  R^ 4      ;'       g    ^ 4      p\        VP                  R^ 4      ;'       g    ^ 4      p\        P                  \!        V4      4      ;'       g    / p\        VP                  R^ 4      ;'       g    ^ 4      ;'       g&    \        VP                  R^ 4      ;'       g    ^ 4      pV\"        8X  d:   V'       d2   \%        VV4      pVP'                  R4      '       g   \)        V4      MRpM~VP                  W34      pV'       d   T;'       g    / P                  RR4      MRp\*        P                  VR4      pV'       g)   V'       d!   \*        P                  VR4      ;'       g    Rp\        VP                  R^ 4      ;'       g    ^ 4      pV'       g&   V'       d   V'       d   VV8X  d   V\"        8w  d   EK  TP                  / RVbRVbRVbRVbRVP                  RR4      bRVP                  RR4      bRT;'       g&    \        VP                  R^ 4      ;'       g    ^ 4      bRVbRVbRVbR\-        ^ \        VP                  R^ 4      ;'       g    ^ 4      V,
          4      bR\.        P                  VR4      bRV\0        9   d   RMRbR\3        V4      bR\        VP                  R^ 4      ;'       g    ^ 4      V8*  bR \        VP                  R!^ 4      ;'       g    ^ 4      bR"\        VP                  R"^ 4      ;'       g    ^ 4      bR#\        VP                  R#^ 4      ;'       g    ^ 4      /C4       EKd  	  R$R$R$4       VP5                  R% R	7       V#   + '       g   i     L%; i)&u+  Ataques activos en el formato que consume el bot.

Cada fila: mty, tx, ty, uid, tag, name, tg_id, tlevel, tname, tgroup, eta, phase,
kind, count. Es una versión directa de lo que servía `/api/attacks` del escáner,
sin sus filtros de relocation/SVS (dependían de su censo completo de jugadores).
r   r   mtyr   r   r   r   c                 L    \        V P                  R ^ 4      ;'       g    ^ 4      # )r   r   r|   )zs   &ri   r   attacks.<locals>.<lambda>  s    QUU4^-@-@q)Ars   r   owr   r   r   r   r   r   ra   rp   r   tg_idtsubtleveltnametgroupetaphasekindalliancesolocountlandedwar_idwarsxsyNc                     V R ,          # )r  rd   )as   &ri   r   r    s    1U8rs   )r   r   r   r   valuesr|   r   ATTACK_MTYSr   r   
setdefaultr   r   minr   r   r   r   r   
startswithr   T_LABELmax
PHASE_NAME	ALLY_MTYSr   sort)own_uidown_gidinclude_helpsskip_relocationsr   r   
tile_ownerr   r   r   by_tgtr   r  r   r   r   msleadr   plr   
owner_herer   otr   r   r	  r
  r  owners   &&&&                          ri   attacksr/  ]  sS    diik
C
C	
!AtQ,,1-s155q>3F3FQ/Grbb'(B8$ "
 !AaeeE1o**+C+%QUU4^((q)B<''	l"k1tQ,,1-s155q>3F3FQ/GRrh+2215 " #LLNLHRbrABDdhhtQ',,1-CS!''RBbffUA&++!,C3'>#1JJ33z~~eUV?W?\?\[\;]ad;d""((bAQUU3]''a(BaeeD!n))*CC!''RAtQ,,1-LLQUU7A5F5K5K!1LFY3R(050@0@0F0F%B #x09>"))&"5B R,#KKB/552Edhhua(--A.C!w33'>bT]oJJ sb s rvveR(	
 vr* ==DHHVQ$7$<$<1 = &  & s1c$((4"3"8"8q9C?@ R0 cY&6
F R #dhhtQ/4415< #dhhua055A6  c$((4+00q1!  48TXXdA=N=S=SRS9T! ? +/ 
P HH#H$JS 
s   7Y"'#Y"Y"Y"&A Y"'1Y"AY"+#Y"Y"&BY"7 Y"Y"'*Y"Y"Y"8*Y"# Y"$Y")+Y" Y"6Y"Y"#Y"=AY"2Y"Y"Y") Y"
Y"Y"!Y")AY"Y"%4Y"A#Y">(Y"'%Y"%Y"3Y""Y2	c                  (  a  \        \        P                  ! 4       4      o \        ;_uu_ 4        R \        \        4      R\        \
        4      R\        V 3R l\        P                  4        4       4      /uuRRR4       #   + '       g   i     R# ; i)marchesplayersactivec              3      <"   T F3  p\        VP                  R ^ 4      ;'       g    ^ 4      S8  g   K/  ^x  K5  	  R# 5i)r   Nr  )rf   r   r   s   & ri   rj   !marches_status.<locals>.<genexpr>  s5     \)9AStQATATST=UX[=[aa)9s   ">	>
>N)r   r   r   r   r   r   sumr  )r   s   @ri   marches_statusr7    sR    
diik
C	3w<CL#\)9\\^ 
s   AB  B	c           
     `   \        T ;'       g    ^ 4      \        T;'       g    ^ 4      rV '       d	   V'       g   R# \        ;_uu_ 4        \        P                  4        F  p\        VP	                  R^ 4      ;'       g    ^ 4      V 8X  g   K/  \        VP	                  R^ 4      ;'       g    ^ 4      V8X  g   K[  \        VP	                  R^ 4      ;'       g    ^ 4      \        VP	                  R^ 4      ;'       g    ^ 4      3u uuRRR4       # 	  RRR4       R#   + '       g   i     R# ; i)u   uid del jugador cuyo castillo está en ese tile. Sirve para deducir el uid propio a
partir de las coordenadas de la ciudad, que es lo único que expone la cuenta.r   r   r   r   N)    r9  )r   r   r   r  r|   )r   r   r   s   && ri   uid_atr:    s     q\3rwwQ<R	!A155q>&&Q'2-#aeeD!n6I6I2Jb2P155?//a0#aeeE1o6J6J2KKK 
! 
 K	 
 Ks6   
5D 	DD,	D:D#D<	DDD-	zscan_progress.jsonidxorderpassr   r   c                N   \         P                   ! 4       p\        T ;'       g    ^ 4      p \        T;'       g    ^ 4      pV ^ 8:  d   R# V \        R&   V\        R&   \        T;'       g    ^ 4      \        R&   \        V4      \        R&   V\        ,
          V8  d   R# Vs \        R,           p\        VR4      ;_uu_ 4       p\        P                  ! \        V4       RRR4       \        P                  ! V\        4       R#   + '       g   i     L-; i  \         d     R# i ; i)u   Guarda el índice del barrido (throttled). Escritura atómica: no dejar un JSON a
medias si el proceso muere durante el volcado.Nr;  r<  r=  r   z.tmpw)r   r   _prog_prog_last_save
_PROG_PATHopenjsondump_osreplacer   )r;  r<  passesmin_intervalr   tmpfs   &&&&   ri   save_progressrL    s     ))+C
chhQ-CUZZa
axE%LgFKKa@Pf`cdg`hRWX\R]
_|+O6!#s^^qIIeQ C$ ^  s*    !D D#D D	D D$#D$c                    \        \        P                  R^ 4      ;'       g    ^ 4      p\        T ;'       g!    \        P                  R^ 4      ;'       g    ^ 4      p V '       d	   W8  d   ^ # \        ^ V4      # )u   Índice desde el que el agente debe retomar el barrido. Se clampa al tamaño de la
vuelta actual por si los parámetros del sweep cambiaron (order distinto).r;  r<  )r   r@  r|   r  )r<  r;  s   & ri   resume_indexrN    s\     eiiq!&&Q
'C337A.33!4Eq#;rs   )r   r   )r9  )Trc   >      
            +   >   rQ  rR  rS  )   )r9  r9  FT)   )>__doc__	threadingr   rD  
ONMAP_FARMr   RALLY_GROUPS_ONMAPr}   _FAM_OTHER_FIRSTrr   r~   r{   r   RLockr   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/  r7  r:  osrF  pathjoindirnameabspath__file__rB  r@  rA  rC  _fupdateloadr   rL  rN  )rK  s   0ri   <module>rf     sc     
& M)*:M )*:M :	M
 018<M )*9M 8M >2F;M 	8M 8M 8M 8M 	8M  8!M" 
8#M$ 8%M& 8'M( 8)M* 
8+M, 	8-M. 8/M0 81M2 	83M4 
85M6 *+87M8 89M: 
8;M< 8=M> 8?M@ |4f=AMB 8CMD 
8EMF 
8GMH 8IMJ 	8KMP 67AQMR 56ASMT 	9UMV 9WMX 9YMZ 9[M\ 9]M^ 
9_M` 	9aMb 	9cMd 9eMf 9gMh 
9iMj )9kMl +,9mMn 9oMp 9qMr 
9sMt 9uMv 9wMx /9yMz 
9{M| 9}M~ )95w?M@ 	9AMB 2G<CMD +,9EMH 17;IMJ 	9KML +,9MMN (9OMP -.9QMR 9SMT 9UMX 
8YMb  (Rx!Q47?Aw!A$q'?QAAxR (P(Q?O6Oqq(PP$ (<LgW^_( 				 Ay!Wa1!XqRrt		 	 h61j!Waj!ZL"m|R. 
"("$/  ">

" 
%	'2ub&"eR2wW

   $.&Rj^
* XX]]388++CHH,<,<X,FGI]^
	7Avq$2		j		RTYYr]# 
*S SPZ 
	 		sN   >M*M*)M*7M/M/$N 4"M4N 4N	?N N NN