Ë
    ±bjO”  ã                   ó8  — d Z ddlZddlZddlZddlmZmZ ddlmZ ddl	m
Z
mZmZmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ d=dededz  defd„Zd>dedededefd„Zd?dedededefd„Zdededdfd„Zd=dededz  dedz  fd„Zdedefd„Z dedefd„Z!dedededz  fd„Z"dededdfd„Z#dededededz  fd„Z$d ed!ede%fd"„Z&d#edefd$„Z'	 	 d@ded#eded%edz  d&e(de%fd'„Z)deddfd(„Z*dAded)e%defd*„Z+	 	 dBded+ed,edz  d-edz  de,eeef   dz  f
d.„Z-	 dCdeded,ed/ede%f
d0„Z.d=dededz  defd1„Z/dDdededz  d)e%defd2„Z0	 	 	 	 dEded+ed,edz  d-edz  dedz  dedz  defd3„Z1d4d5d6d7d8d9œZ2dede%fd:„Z3	 	 	 dFded;ed+ed,edz  d-edz  dedz  defd<„Z4y)Gu[   
Exchange page tasks â€” open via nav hover, then read Suggested Teams + Active Exchanges.
é    N)ÚPageÚLocator)Úhuman_delay)ÚACTIVE_EXCHANGES_ITEMÚSUGGESTED_TEAMS_LISTÚSUGGESTED_TEAMS_ULÚSEARCH_INPUT)Úsession_store)Úensure_hudl_session)Úclose_hudl_popups)Úraise_if_hudl_forbidden)Úparse_team_liÚpageÚteam_idÚreturnc              ƒ   ó  K  — t        | «      ƒ d{  –—† }t        | «      ƒ d{  –—†  |xs dj                  «       }|j                  «       st	        d«      ‚d|› �}t        d|› d|› d�«       t        j                  |«       | j                  |d¬	«      ƒ d{  –—†  t        d
d«      ƒ d{  –—†  t        | «      ƒ d{  –—†  	 ddl
m}m}  || «      ƒ d{  –—† r || «      ƒ d{  –—†  t        | |d¬«      ƒ d{  –—†  t        j                  | j                   «       dd| j                   |d|› �dœ}|j#                  d«      xs t        j$                  «       }|r||d<   |S 7 �ŒX7 �ŒH7 ŒÔ7 ŒÂ7 Œ±7 Œš7 ŒŒ# t        $ r Y Œ•w xY w7 Œ‡­w)u˜   
    Open Exchanges for a specific Hudl team_id (from Playwright team switch).

    Requires dynamic team_id â€” opens /manage/exchanges/{team_id}.
    NÚ zjteam_id required (dynamic from Playwright team switch). Select Football/Basketball in Organizations first.z&https://www.hudl.com/manage/exchanges/z"Direct navigating to exchanges at z
 (team_id=Ú)Údomcontentloaded©Ú
wait_untilç      ø?g      @r   )Ú_close_smooth_modal_wizardÚ_modal_openÚexchange©r   ÚareaÚokÚopen_exchangezOpened Exchange for team )ÚstatusÚactionÚurlr   ÚmessageÚstorage_warning)r   r   ÚstripÚisdigitÚ
ValueErrorÚprintr
   Úset_exchanges_urlÚgotor   Ú app.automation.tasks.cancel_backr   r   Ú	Exceptionr   Úmark_logged_inr"   ÚgetÚget_storage_warning)	r   r   Úlogin_resultÚexplicit_idÚtargetr   r   Úresultr$   s	            úD/var/www/html/sergio/sergio-backend/app/automation/tasks/exchange.pyr   r      s–  è ø€ ô -¨TÓ2×2€LÜ
˜DÓ
!×!Ð!à’=˜b×'Ñ'Ó)€KØ×ÑÔ ÜðAó
ð 	
ð
 6°k°]ÐC€FÜ	Ð.¨v¨h°jÀÀÈQÐ
OÔPÜ×#Ñ# FÔ+Ø
�)‰)�FÐ'9ˆ)Ó
:×:Ð:Ü
�c˜3Ó
×ÐÜ
˜DÓ
!×!Ð!ðß\á˜TÓ"×"Ð"Ù,¨TÓ2×2Ð2ô
 " $°À*Ô
M×MÐMä× Ñ  §¡Ô*àØ!Ø�x‰xØØ.¨{¨mÐ<ñ€Fð #×&Ñ&Ð'8Ó9Ò`¼]×=^Ñ=^Ó=`€OÙØ$3ˆÐ Ñ!Ø€MðQ 3ùØ!ùð ;øØøØ!øð #øØ2ùÜò Ùðúð Nús«   ‚F
‘E)’F
¤E,¥A5F
ÂE/ÂF
Â.E1Â/F
ÃE3ÃF
ÃE9 ÃE5ÃE9 Ã*E7Ã+E9 Ã/F
Ä FÄA)F
Å,F
Å/F
Å1F
Å3F
Å5E9 Å7E9 Å9	FÆF
ÆFÆF
ÚitemsÚ
max_roundsc              ƒ   ó<  K  — d}d}t        |«      D ]g  }|j                  «       ƒ d{  –—† }||k(  r|dz  }|dk\  r n>d}|}| j                  j                  dd«      ƒ d{  –—†  t	        dd«      ƒ d{  –—†  Œi |j                  «       ƒ d{  –—† S 7 Œk7 Œ47 Œ"7 Œ
­w)z-Scroll page so lazy-loaded list items appear.r   Né   é   é¼  ç333333ã?)ÚrangeÚcountÚmouseÚwheelr   )r   r5   r6   Ú
prev_countÚstable_roundsÚ_r=   s          r4   Ú_scroll_until_stablerC   I   s¢   è ø€ à€JØ€Mä�:ÖˆØ—k‘k“m×#ˆØ�JÒØ˜QÑˆMØ Ò!ÙàˆMØˆ
Ø�j‰j×Ñ˜q #Ó&×&Ð&Ü˜#˜qÓ!×!Ñ!ð ð —‘“×Ðð $øð 	'øØ!øàúsE   ‚&B¨B©8BÁ!BÁ"BÁ5BÁ6BÂBÂBÂBÂBÂBÚlist_locatorc              ƒ   óä  K  — | j                  d«      j                  }d}d}t        |«      D ]œ  }|j                  «       ƒ d{  –—† }||k(  r|dz  }|dk\  r nsd}|}|j                  «       ƒ d{  –—† dkD  r|j	                  d«      ƒ d{  –—†  n$| j
                  j                  dd«      ƒ d{  –—†  t        dd	«      ƒ d{  –—†  Œž |j                  «       ƒ d{  –—† S 7 Œ 7 Œu7 Œ[7 Œ87 Œ&7 Œ­w)
zKScroll the Hudl sidebar list container so every exchange row is in the DOM.ú#ex-list-currentr   Nr8   r9   z)el => { el.scrollTop = el.scrollHeight; }r:   ç      à?çš™™™™™é?)ÚlocatorÚfirstr<   r=   Úevaluater>   r?   r   )r   rD   r6   Ú	containerr@   rA   rB   r=   s           r4   Ú_scroll_active_exchanges_listrM   ]   sì   è ø€ à—‘Ð/Ó0×6Ñ6€IØ€JØ€Mä�:ÖˆØ"×(Ñ(Ó*×*ˆØ�JÒØ˜QÑˆMØ Ò!ÙàˆMØˆ
à—‘Ó"×" QÒ&Ø×$Ñ$Ð%PÓQ×QÑQà—*‘*×"Ñ" 1 cÓ*×*Ð*Ü˜#˜sÓ#×#Ñ#ð ð  ×#Ñ#Ó%×%Ð%ð +øð #øØQøà*øØ#øà%úsl   ‚AC0ÁC$Á,C0Á0C&Á1C0ÂC(Â$C0Â1C*Â2C0ÃC,ÃC0ÃC.Ã C0Ã&C0Ã(C0Ã*C0Ã,C0Ã.C0Úlic              ƒ   ó&  K  — | j                  d«      j                  }|j                  «       ƒ d{  –—† dkD  r|j                  d«      ƒ d{  –—†  n|j	                  «       ƒ d{  –—†  t        j                  d«      ƒ d{  –—†  y7 ŒW7 Œ=7 Œ&7 Œ­w)zPScroll the sidebar container so the target exchange row is visible before click.rF   Nr   aª  (el) => {
                const container = document.getElementById('ex-list-current');
                if (!container) {
                    el.scrollIntoView({ block: 'center' });
                    return;
                }
                const elRect = el.getBoundingClientRect();
                const containerRect = container.getBoundingClientRect();
                if (elRect.top < containerRect.top) {
                    container.scrollTop -= (containerRect.top - elRect.top + 24);
                } else if (elRect.bottom > containerRect.bottom) {
                    container.scrollTop += (elRect.bottom - containerRect.bottom + 24);
                }
            }çš™™™™™É?)rI   rJ   r=   rK   Úscroll_into_view_if_neededÚasyncioÚsleep)r   rN   rL   s      r4   Ú_scroll_exchange_row_into_viewrT   v   sƒ   è ø€ à—‘Ð/Ó0×6Ñ6€IØ�_‰_Ó× Ò"Ø�k‰kðó
÷ 	
ñ 	
ð" ×+Ñ+Ó-×-Ð-Ü
�-‰-˜Ó
×Ñð' øð	
øð" 	.øØúsE   ‚/B±B	²BÁBÁBÁ&BÁ'BÂBÂBÂBÂBÂBc              ƒ   ó  K  — | j                  d«      ƒ d {  –—† }|rd|v r|S |�Tt        j                  d|j                  «      }| j	                  d«      ƒ d {  –—† }|r|rd|j                  d«      › d|› �S y 7 Œc7 Œ"­w)Na&  (el) => {
            const link = el.querySelector('a[href*="/exchanges/"]');
            if (link) return link.getAttribute('href');
            const parent = el.closest('a[href*="/exchanges/"]');
            if (parent) return parent.getAttribute('href');
            return null;
        }ú/exchanges/ú/teams/(\d+)zdata-exchange-idú/teams/r8   )rK   ÚreÚsearchr"   Úget_attributeÚgroup)rN   r   ÚhrefÚ
team_matchÚrow_ids        r4   Ú_get_exchange_hrefr`   �   s�   è ø€ Ø—‘ð	ó÷ €Dñ � Ñ%ØˆàÐÜ—Y‘Y˜°·±Ó9ˆ
Ø×'Ñ'Ð(:Ó;×;ˆÙ‘jØ˜Z×-Ñ-¨aÓ0Ð1°¸V¸HÐEÐEØð#øð <ús"   ‚A?—A;˜AA?ÁA=Á!A?Á=A?r]   c                 ó^   — | j                  d«      r| S | j                  d«      rd| › �S d| › �S )NÚhttpÚ/zhttps://www.hudl.comzhttps://www.hudl.com/)Ú
startswith)r]   s    r4   Ú_abs_hudl_urlre   ¤   s9   € Ø‡��vÔØˆØ‡��sÔØ% d VÐ,Ð,Ø" 4 &Ð)Ð)ó    r"   c                 óš   — d| vry| j                  d«      d   j                  d«      d   j                  d«      d   j                  d«      S )NrV   r   éÿÿÿÿÚ?r   Ú#rc   )Úsplitr%   )r"   s    r4   Ú_exchange_id_from_urlrl   ¬   sL   € Ø˜CÑØØ�9‰9�]Ó# BÑ'×-Ñ-¨cÓ2°1Ñ5×;Ñ;¸CÓ@ÀÑC×IÑIÈ#ÓNÐNrf   Úindexc              ƒ   ó"  K  — | j                  d«      ƒ d {  –—† }|sy |j                  d«      }t        |xs d«      }|xs t        |«      |j                  d«      xs d|j                  d«      xs d|j                  d«      xs d|dœS 7 Œu­w)Na‚  (el) => {
            const who = el.querySelector('.ex-who');
            if (!who) return null;
            const divs = who.querySelectorAll(':scope > div');
            const date = (divs[0]?.innerText || '').trim();
            const name = (divs[1]?.innerText || '').trim();
            const message = (divs[2]?.innerText || '').trim();
            if (!name && !message) return null;
            const link = el.querySelector('a[href*="/exchanges/"]')
                || el.closest('a[href*="/exchanges/"]');
            const href = link ? link.getAttribute('href') : null;
            return { date, name, message, href };
        }r]   r   ÚdateÚnamer#   )ÚidÚtimerp   Úprocessr]   )rK   r.   rl   Ústr)rN   rm   Úrowr]   Úexchange_ids        r4   Ú_parse_active_exchange_lirw   ²   s’   è ø€ Ø—‘ð	ó÷ €Cñ Øà�7‰7�6‹?€DÜ'¨ª
°Ó3€Kð Ò'œS ›ZØ—‘˜“Ò% 2Ø—‘˜“Ò% 2Ø—7‘7˜9Ó%Ò+¨Øñð ð+ús   ‚B—B˜A6Bc              ƒ   ó°  K  — t        | |«      ƒ d{  –—†  |j                  d«      j                  }|j                  «       ƒ d{  –—† dkD  r9	 |j	                  d¬«      ƒ d{  –—†  t        j                  d«      ƒ d{  –—†  y|j                  d	«      j                  }|j                  «       ƒ d{  –—† dkD  r	 |j	                  d¬«      ƒ d{  –—†  nL|j                  «       ƒ d{  –—†  |j                  d
«      ƒ d{  –—†  	 |j	                  d¬«      ƒ d{  –—†  t        j                  d«      ƒ d{  –—†  y7 �Œ07 Œÿ7 Œã# t
        $ r |j	                  d¬«      ƒ d{  –—†7   Y �Œw xY w7 Œó7 ŒÁ7 Œ¥# t
        $ r |j	                  d¬«      ƒ d{  –—†7   Y Œ|w xY w7 Œ¸7 Œ¡7 Œˆ# t
        $ r |j	                  d¬«      ƒ d{  –—†7   Y Œ¬w xY w7 Œ—­w)zFClick the exchange row using the same target Hudl uses in the sidebar.Nza[href*="/exchanges/"]r   éˆ  )ÚtimeoutT)Úforcer;   z'xpath=.//div[contains(@class,"ex-who")]z,el => el.scrollIntoView({ block: 'center' }))
rT   rI   rJ   r=   Úclickr,   rR   rS   rQ   rK   )r   rN   ÚlinkÚ	clickables       r4   Ú_click_active_exchange_rowr   Ñ   s—  è ø€ ä
(¨¨rÓ
2×2Ð2à�:‰:Ð.Ó/×5Ñ5€DØ�Z‰Z‹\×˜AÒð	)Ø—*‘* T�*Ó*×*Ð*ô �m‰m˜CÓ × Ð Øà—
‘
ÐDÓE×KÑK€IØ�_‰_Ó× Ò"ð	.Ø—/‘/¨$�/Ó/×/Ñ/ð ×+Ñ+Ó-×-Ð-Ø�k‰kÐHÓI×IÐIð	'Ø—(‘( 4�(Ó(×(Ð(ô �-‰-˜Ó
×Ñð3 3ùð øà*ùÜò 	)Ø—*‘* 4�*Ó(×(Ô(ð	)úà øð øà/ùÜò 	.Ø—/‘/¨�/Ó-×-Ó-ð	.úð 	.øØIøà(ùÜò 	'Ø—(‘( �(Ó&×&Ó&ð	'úð ús/  ‚G’E“2GÁEÁGÁE	 Á#EÁ$E	 Á(GÂ E4Â3GÂ4E6Â5GÂ=E: ÃE8ÃE: ÃGÃ+F$Ã,GÄF&ÄGÄ
F* ÄF(Ä F* Ä$GÄ<GÄ=GÅGÅE	 Å	E1Å'E*Å(E1Å-GÅ0E1Å1GÅ6GÅ8E: Å:F!ÆFÆF!ÆGÆ F!Æ!GÆ&GÆ(F* Æ*GÇGÇ	GÇGÇGÇGÚexpected_namec              ƒ   óT  K  — t        | |«      ƒ d{  –—†  t        || «      ƒ d{  –—† }|rYt        |«      }| j                  |dd¬«      ƒ d{  –—†  t	        | «      ƒ d{  –—†  t        j                  d«      ƒ d{  –—†  |S t        | |«      ƒ d{  –—†  |S 7 Œ‰7 Œw7 ŒP7 Œ?7 Œ$7 Œ­w)z‡
    Open an exchange's detail view. Prefer direct URL navigation (most reliable),
    then fall back to clicking the sidebar row.
    Nr   é¨a  ©r   rz   ç      ð?)rT   r`   re   r*   r   rR   rS   r   )r   rN   r€   r]   Ú
target_urls        r4   Ú_open_active_exchange_rowr†   ï   s¦   è ø€ ô )¨¨rÓ
2×2Ð2Ü# B¨Ó-×-€DáÜ" 4Ó(ˆ
Ø�i‰i˜
Ð/AÈ5ˆiÓQ×QÐQÜ Ó%×%Ð%Ü�m‰m˜CÓ × Ð ØÐä
$ T¨2Ó
.×.Ð.Ø€Kð 3øØ-øð 	RøØ%øØ øð /úsg   ‚B(’B“B(¦B§(B(ÁB ÁB(Á"B"Á#B(Á?B$Â B(ÂB&ÂB(ÂB(Â B(Â"B(Â$B(Â&B(ÚcurrentÚexpectedc                 óŽ   — | j                  «       j                  «       } |j                  «       j                  «       }| r|sy| |k(  S ©NF)r%   Úlower)r‡   rˆ   s     r4   Ú_school_name_matchesrŒ     s>   € Ø�m‰m‹o×#Ñ#Ó%€GØ�~‰~Ó×%Ñ%Ó'€HÙ™(ØØ�hÑÐrf   Údetails_panec              ƒ   óÌ   K  — | j                  d«      j                  }|j                  «       ƒ d {  –—† dk(  ry|j                  «       ƒ d {  –—† j	                  «       S 7 Œ.7 Œ­w)Nú.ex-details-schoolr   r   )rI   rJ   r=   Ú
inner_textr%   )r�   Úschool_locators     r4   Ú_get_details_school_namer’     sX   è ø€ Ø!×)Ñ)Ð*>Ó?×EÑE€NØ×!Ñ!Ó#×# qÒ(ØØ ×+Ñ+Ó-×-×4Ñ4Ó6Ð6ð $øà-ús!   ‚/A$±A ²A$ÁA"ÁA$Á"A$Úexpected_hrefÚ	timeout_sc              ƒ   ó°  K  — |j                  d«      j                  }t        j                  «       |z   }t        j                  «       |k  rƒ|j	                  «       ƒ d{  –—† dkD  r3|j                  «       ƒ d{  –—† j                  «       }t        ||«      ryt        j                  d«      ƒ d{  –—†  t        j                  «       |k  rŒƒy7 Œp7 ŒW7 Œ!­w)z=Wait until the details header reflects the selected exchange.r�   Nr   Tg333333Ã?F)
rI   rJ   rr   Ú	monotonicr=   r�   r%   rŒ   rR   rS   )r   r�   r€   r“   r”   r‘   Údeadliner‡   s           r4   Ú_wait_for_details_school_namer˜     s±   è ø€ ð "×)Ñ)Ð*>Ó?×EÑE€NÜ�~‰~Ó )Ñ+€Hä
�.‰.Ó
˜XÒ
%Ø×%Ñ%Ó'×'¨!Ò+Ø+×6Ñ6Ó8×8×?Ñ?ÓAˆGÜ# G¨]Ô;ØÜ�m‰m˜DÓ!×!Ð!ô �.‰.Ó
˜XÓ
%ð ð (øØ8øð 	"ús<   ‚ACÁCÁ CÁ:CÁ;7CÂ2CÂ3CÃCÃCÃCc              ƒ   ól  K  — d| j                   j                  «       vr1t        | «      ƒ d{  –—†  t        j                  d«      ƒ d{  –—†  yt        | «      ƒ d{  –—†  | j                   j                  d«      d   j                  d«      }|j                  d«      st        j                  d|«      ryt        j                  d	| j                   «      }|r|j                  d
«      › d�}net        j                  d| j                   «      }|r|j                  d
«      }n1t        | «      ƒ d{  –—†  t        j                  d«      ƒ d{  –—†  y| j                  |dd¬«      ƒ d{  –—†  t        | «      ƒ d{  –—†  t        j                  d«      ƒ d{  –—†  y7 �Œt7 �ŒZ7 �ŒI7 Œx7 Œ]7 ŒB7 Œ17 Œ­w)zLOpen the exchanges list page so the sidebar shows every active row reliably.r   NrG   ri   r   rc   ú
/exchangesz/manage/exchanges/\d+$z$(https?://[^/]+/teams/\d+)/exchangesr8   z%(https?://[^/]+/manage/exchanges/\d+)r   r‚   rƒ   rH   )r"   r‹   r   rR   rS   r   rk   ÚrstripÚendswithrY   rZ   r\   r*   )r   ÚpathÚmatchÚlist_urlÚmanage_matchs        r4   Ú_navigate_to_exchanges_homer¡   )  sb  è ø€ à˜Ÿ™Ÿ™Ó)Ñ)Ü˜DÓ!×!Ð!Ü�m‰m˜CÓ × Ð Øä
˜DÓ
!×!Ð!Ø�8‰8�>‰>˜#Ó˜qÑ!×(Ñ(¨Ó-€DØ‡}�}�\Ô"¤b§i¡iÐ0IÈ4Ô&PØä�I‰IÐ=¸t¿x¹xÓH€EÙØ—k‘k !“nÐ% ZÐ0‰ä—y‘yÐ!IÈ4Ï8É8ÓTˆÙØ#×)Ñ)¨!Ó,‰Hä Ó%×%Ð%Ü—-‘- Ó$×$Ð$Øà
�)‰)�HÐ);ÀUˆ)Ó
K×KÐKÜ
˜DÓ
!×!Ð!Ü
�-‰-˜Ó
×Ñð/ 	"ùØ ùð "ùð &øØ$øð LøØ!øØúsŽ   ‚+F4­F!®F4Á
F$ÁF4ÁF'ÁCF4Ä1F*Ä2F4ÅF,ÅF4Å+F.Å,F4Å>F0Å?F4ÆF2ÆF4Æ$F4Æ'F4Æ*F4Æ,F4Æ.F4Æ0F4Æ2F4Úfull_scrollc              ƒ   óØ   K  — t        | «      ƒ d{  –—†  | j                  d«      }|j                  j                  dd¬«      ƒ d{  –—†  |rt	        | |«      ƒ d{  –—†  |S 7 ŒR7 Œ7 Œ
­w)zXEnsure the exchange sidebar list is on screen. Skip full scroll unless loading all rows.Nú#ex-list-current ul liÚvisibleé'  ©Ústaterz   )r¡   rI   rJ   Úwait_forrM   )r   r¢   rD   s      r4   Ú_ensure_exchange_list_visiblerª   F  sk   è ø€ ä
% dÓ
+×+Ð+à—<‘<Ð 8Ó9€LØ
×
Ñ
×
%Ñ
%¨I¸uÐ
%Ó
E×EÐEÙÜ+¨D°,Ó?×?Ð?ØÐð ,øð Føà?ús3   ‚A*‘A$’5A*ÁA&ÁA*ÁA(ÁA*Á&A*Á(A*Úexchange_nameÚexchange_indexrv   c              ƒ   ó¬  K  — t        | d¬«      ƒ d{  –—† }|j                  «       ƒ d{  –—† }g }t        |«      D ];  }t        |j	                  |«      |«      ƒ d{  –—† }|sŒ)|j                  ||f«       Œ= |rk|D ��cg c]  \  }}t        |d   |«      sŒ||f‘Œ }	}}|	rC|�%|	D ]   \  }}||k(  sŒ|j	                  |«      ||fc S  |	d   \  }}|j	                  |«      ||fS |r4|D ]/  \  }}|j                  d«      |k(  sŒ|j	                  |«      ||fc S  |�%|D ]   \  }}||k(  sŒ|j	                  |«      ||fc S  y7 �Œ37 �Œ7 Œíc c}}w ­w)uí   
    Resolve the target exchange row. Priority:
    1) School name (most reliable â€” UI index can differ from live Hudl list)
    2) Hudl exchange id from sidebar link
    3) Exact list index only when it matches the requested name
    T©r¢   Nrp   r   rq   )rª   r=   r<   rw   ÚnthÚappendrŒ   r.   )
r   r«   r¬   rv   rD   r=   Úparsed_rowsÚiru   Úname_matchess
             r4   Ú_resolve_active_exchange_targetr´   Q  sŒ  è ø€ ô 7°tÈÔN×N€LØ×$Ñ$Ó&×&€EØ*,€Kä�5Ž\ˆÜ-¨l×.>Ñ.>¸qÓ.AÀ1ÓE×EˆÚØ×Ñ  3˜xÕ(ð ñ
 á#.ô
Ù#.™˜˜CÔ2FÀsÈ6Á{ÐTaÕ2bˆQ�ŠH ;ð 	ñ 
ñ ØÐ)Û*‘F�A�sØ˜NÓ*Ø+×/Ñ/°Ó2°C¸Ð:Ò:ð +ð " !‘_‰FˆAˆsØ×#Ñ# AÓ&¨¨QÐ.Ð.áÛ!‰FˆAˆsØ�w‰w�t‹} Ó+Ø#×'Ñ'¨Ó*¨C°Ð2Ò2ð "ð Ð!Û!‰FˆAˆsØ�NÓ"Ø#×'Ñ'¨Ó*¨C°Ð2Ò2ð "ð ð? OùØ&ùð Fúó

ùsb   ‚E“E”E«E	¬2EÁEÁEÁ&EÂEÂEÂ EÂ5AEÄ&EÄ.EÅ	EÅEÅEÚ	max_stepsc              ƒ   ó  K  — | j                  d«      j                  }d}|j                  «       ƒ d{  –—† |k  r¡||k  rœ|j                  «       ƒ d{  –—† dkD  r|j                  d«      ƒ d{  –—†  n$| j                  j                  dd«      ƒ d{  –—†  t        j                  d«      ƒ d{  –—†  |dz  }|j                  «       ƒ d{  –—† |k  r||k  rŒœ||j                  «       ƒ d{  –—† k  S 7 ŒÃ7 Œ¥7 Œ‹7 Œh7 ŒM7 Œ27 Œ­w)zBScroll the sidebar only enough to make the target index available.rF   r   Nz*el => { el.scrollTop += el.clientHeight; }iô  rP   r8   )rI   rJ   r=   rK   r>   r?   rR   rS   )r   rD   r¬   rµ   rL   Ústepss         r4   Ú _ensure_exchange_index_availabler¸     sð   è ø€ ð —‘Ð/Ó0×6Ñ6€IØ€EØ×"Ñ"Ó$×
$¨Ò
6¸5À9Ò;LØ—‘Ó"×" QÒ&Ø×$Ñ$Ð%QÓR×RÑRà—*‘*×"Ñ" 1 cÓ*×*Ð*Ü�m‰m˜CÓ × Ð Ø�‰
ˆð ×"Ñ"Ó$×
$¨Ò
6¸5À9Ó;Lð  ,×"4Ñ"4Ó"6×6Ñ6Ð6ð %øØ"øØRøà*øØ øð %øð 7ús�   ‚1D³C7´DÁC9ÁDÁ/C;Á0$DÂC=ÂDÂ1C?Â2DÃDÃDÃDÃ0DÃ1DÃ9DÃ;DÃ=DÃ?DÄDÄDc           	   ƒ   ó 	  K  — |xs dj                  «       }| j                  xs d}d|j                  «       v}|j                  «       rd|› �|vr
d|› d�|vrd}|rt	        | |xs d¬«      ƒ d{  –—†  nTt        | «      ƒ d{  –—†  t        | «      ƒ d{  –—†  t        d	d
«      ƒ d{  –—†  t        | |xs dd¬«      ƒ d{  –—†  	 | j                  t        «      j                  j                  dd¬«      ƒ d{  –—†  | j                  t         «      }| j                  d«      }	 | j                  t"        «      j                  j                  dd¬«      ƒ d{  –—†  t%        | |«      ƒ d{  –—†  t'        | |«      ƒ d{  –—†  g }	t)        |j+                  «       ƒ d{  –—† «      D ]9  }
t-        |j/                  |
«      |
«      ƒ d{  –—† }|sŒ)|	j1                  |«       Œ; g }|j+                  «       ƒ d{  –—† }t)        |«      D ]9  }
t3        |j/                  |
«      |
«      ƒ d{  –—† }|sŒ)|j1                  |«       Œ; t        dt5        |	«      › dt5        |«      › d| j                  › d�«       d| j                  |	t5        |	«      |t5        |«      d œ}t7        j8                  «       }|r||d!<   |S 7 �ŒM7 �Œ<7 �Œ,7 �Œ7 �Œ7 �ŒÎ# t        $ �r}}t        | |xs dd¬«      ƒ d{  –—†7   t        d|› d�«       	 | j                  d¬«      ƒ d{  –—†7   t        dd«      ƒ d{  –—†7   t        | «      ƒ d{  –—†7   n$# t        $ r}t        d|› �«       Y d}~nd}~ww xY wt        | |xs dd¬«      ƒ d{  –—†7   	 | j                  t        «      j                  j                  dd¬«      ƒ d{  –—†7   nˆ# t        $ r| t        | |xs dd¬«      ƒ d{  –—†7   t        d«       t	        | |xs d¬«      ƒ d{  –—†7   | j                  t        «      j                  j                  dd¬«      ƒ d{  –—†7   Y nw xY wY d}~�ŒNd}~ww xY w7 �Œü# t        $ r Y �Œw xY w7 �Œû7 �Œê7 �ŒÎ7 �Œ§7 �Œz7 �ŒL­w)"zP
    GET API: Suggested Teams + Active Exchanges (scrolls if list is long).
    r   r   rV   rX   rš   TN©r   r8   r   r   r¥   i@  r§   z,SEARCH_INPUT not visible on exchanges page: z. Reloading...r   r   é   é   zReload failed: z>Still not visible. Attempting to open exchange from scratch...i˜:  r¤   Úattachedry   zExchange data scraped: z suggested, z active (url=r   r   )r    r"   Úsuggested_teamsÚsuggested_teams_countÚactive_exchangesÚactive_exchanges_countr$   )r%   r"   r‹   r&   r   r   r   r   r   rI   r	   rJ   r©   r,   r(   Úreloadr   r   rC   rM   r<   r=   r   r¯   r°   rw   Úlenr
   r/   )r   r   Úexplicitr‡   Ú
needs_openÚeÚ
reload_errÚsuggested_locatorÚactive_list_locatorr¾   r²   ru   rÀ   Úactive_countr3   r$   s                   r4   Úget_exchange_datarË   ’  s)  è ø€ ð ’˜2×$Ñ$Ó&€HØ�h‰hŠn˜"€GØ 7§=¡=£?Ð2€JØ×ÑÔ ¨H¨:Ð6¸gÑEÈGÐT\ÐS]Ð]gÐJhÐpwÑJwØˆ
áÜ˜D¨(Ò*:°dÔ;×;Ñ;ä! $Ó'×'Ð'Ü Ó%×%Ð%Ü˜!˜SÓ!×!Ð!Ü% d°HÒ4DÀÈ:ÔV×VÐVð\Ø�l‰lœ<Ó(×.Ñ.×7Ñ7¸iÐQUÐ7ÓV×VÐVð& Ÿ™Ô%9Ó:ÐØŸ,™,Ð'?Ó@ÐðØ�l‰lÔ-Ó.×4Ñ4×=Ñ=ÀJÐX\Ð=Ó]×]Ð]ô ˜tÐ%6Ó
7×7Ð7Ü
'¨Ð.AÓ
B×BÐBà€OÜÐ*×0Ñ0Ó2×2Ö3ˆÜ!Ð"3×"7Ñ"7¸Ó":¸AÓ>×>ˆÚØ×"Ñ" 3Õ'ð 4ð
 ÐØ,×2Ñ2Ó4×4€LÜ�<Ö ˆÜ-Ð.A×.EÑ.EÀaÓ.HÈ!ÓL×LˆÚØ×#Ñ# CÕ(ð !ô
 
Ø
!¤# oÓ"6Ð!7°|ÜÐÓ Ð
! ¨t¯x©x¨j¸ð	;ôð Ø�x‰xØ*Ü!$ _Ó!5Ø,Ü"%Ð&6Ó"7ñ€Fô $×7Ñ7Ó9€OÙØ$3ˆÐ Ñ!Ø€MðG 	<ùà'ùØ%ùØ!ùØVùð 	WúÜó \Ü% d°HÒ4DÀÈ:ÔV×VÑVÜÐ<¸Q¸C¸~ÐNÔOð	2Ø—+‘+Ð);�+Ó<×<Ñ<Ü˜a Ó#×#Ñ#Ü# DÓ)×)Ò)øÜò 	2Ü�O J <Ð0×1Ñ1ûð	2úä% d°HÒ4DÀÈ:ÔV×VÑVð	\Ø—,‘,œ|Ó,×2Ñ2×;Ñ;À)ÐUYÐ;ÓZ×ZÒZøÜò 	\Ü)¨$¸Ò8HÀDÈzÔZ×ZÑZÜÐRÔSÜ ¨hÒ.>¸$Ô?×?Ñ?Ø—,‘,œ|Ó,×2Ñ2×;Ñ;À)ÐUZÐ;Ó[×[Ó[ð		\ÿüð\úð, 	^úÜò Úðúð 8ùØBùð 3ùØ>ùð
 5ùàLûsù  ‚A.Q>Á0J=Á1Q>ÂK ÂQ>ÂKÂQ>Â+KÂ,Q>ÃK	ÃQ>Ã3K Ã>KÃ?K Ä&Q>Ä*3Q ÅQÅQ Å"Q>Å1Q,Å2Q>ÆQ/ÆQ>Æ$Q2Æ%)Q>ÇQ5ÇQ>Ç(Q>Ç>Q8Ç?0Q>È/Q;È0Q>È7BQ>Ë Q>ËQ>ËQ>Ë	Q>ËK Ë
QËQË.K1Ë/QÌM	ÌLÌM	Ì.L1Ì/M	ÍMÍM	ÍQÍ		M*ÍM%Í QÍ%M*Í*QÎNÎQÎ	3OÎ<N?Î=OÏQÏQÏ!O$Ï"$QÐP	Ð8QÐ?QÑ QÑQÑQÑQÑQ>ÑQÑQ>ÑQ Ñ	Q)Ñ%Q>Ñ(Q)Ñ)Q>Ñ/Q>Ñ2Q>Ñ5Q>Ñ8Q>Ñ;Q>c           
   ƒ   ó  K  — 	 |xs dj                  «       }| j                  xs d}d|j                  «       v}|j                  «       rd|› �|vr
d|› d�|vrd}|rt	        | |xs d¬«      ƒ d{  –—†  n't        | «      ƒ d{  –—†  t        d	d
«      ƒ d{  –—†  t        | |xs d¬«      ƒ d{  –—† }|j                  «       ƒ d{  –—† }g }t        |«      D ]Z  }	t        |j                  |	«      |	«      ƒ d{  –—† }
|
sŒ)|j                  |
d   |
d   |
d   |
d   |
j                  d«      dœ«       Œ\ dd|t        |«      |xs d| j                  dœS 7 Œç7 ŒÕ7 ŒÃ7 Œ¬7 Œ–7 Œe# t        $ r}dt!        |«      dœcY d}~S d}~ww xY w­w)zý
    GET task to fetch currently active exchanges from //div[@id="ex-list-current"]/ul/li
    Inside each li, there is .//div[@class="ex-who"] which has 3 direct child divs:
    ./div[1]  <<-- date
    ./div[2]  <<-- name
    ./div[3]  <<-- message
    r   r   rV   rX   rš   TNrº   rG   r8   r®   rq   rr   rp   rs   r]   )rq   ro   rp   r#   r]   r   Úget_active_exchanges)r    r!   Ú	exchangesr=   r   r"   Úerror©r    r#   )r%   r"   r‹   r&   r   r   r   rª   r=   r<   rw   r¯   r°   r.   rÃ   r,   rt   )r   r   r¢   rÄ   r‡   rÅ   rD   r=   rÎ   r²   ru   rÆ   s               r4   rÍ   rÍ   ã  sœ  è ø€ ð$6Ø’M˜r×(Ñ(Ó*ˆØ—(‘(’.˜bˆØ w§}¡}£Ð6ˆ
Ø×ÑÔ K°¨zÐ":À'Ñ"IÐPWÐX`ÐWaÐakÐNlÐt{ÑN{ØˆJáÜ ¨hÒ.>¸$Ô?×?Ñ?ä# DÓ)×)Ð)Ü˜c 1Ó%×%Ð%ä:¸4È[ÒM`Ð\`Ôa×aˆØ"×(Ñ(Ó*×*ˆØˆ	Ü�u–ˆAÜ1°,×2BÑ2BÀ1Ó2EÀqÓI×IˆCÚØ× Ñ Ø˜d™)Ø ™KØ ™KØ" 9™~ØŸG™G F›Oñ"õ ð ð Ø,Ø"Ü˜“^ØÒ' 4Ø—8‘8ñ
ð 	
ð' @øà)øØ%øàaøØ*øð Jùô$ ò 6Ø!¬c°!«fÑ5Õ5ûð6üs¨   ‚F	„A-E% Á1EÁ2E% ÂEÂE% ÂEÂE% Â2EÂ3E% Ã
E!Ã2E% Ã=E#Ã>E% ÄAE% ÅF	ÅE% ÅE% ÅE% ÅE% Å!E% Å#E% Å%	FÅ.FÅ;FÅ<F	ÆFÆF	c           	   ƒ   óD  K  — 	 |s|€	|s|sdddœS |xs dj                  «       }|j                  «       r4| j                  xs d}d|› �|vrd|› d�|vrt        | |¬	«      ƒ d{  –—†  |�|d
k  r	dd|› d�dœS d}|}	|}
d}| j	                  d«      j
                  }d}d| j                  j                  «       v �rpt        d|xs |› d�«       	 | j	                  d«      }|j
                  j                  dd¬«      ƒ d{  –—†  |j                  «       ƒ d{  –—† }d}d}d}t        |«      D ]{  }|j                  |«      }t        ||«      ƒ d{  –—† }|sŒ+d}|r|j                  d«      |k(  rd}n,|r|j                  d«      |k(  rd}n|rt        |d   |«      rd}|sŒu|}|}|} n |r}t        d|› d�«       t        | |«      ƒ d{  –—†  |j                  dd¬«      ƒ d{  –—†  |d   }	|j                  d«      xs |}
t!        | ||	|
d¬«      ƒ d{  –—† rt        d «       d}|�sÜ|�r%d|v �r t%        |«      }| j'                  |d#d$¬%«      ƒ d{  –—†  t)        | «      ƒ d{  –—†  |j	                  d&«      j
                  }|j                  dd¬«      ƒ d{  –—†  t        d'«      D ]I  }|j+                  «       ƒ d{  –—† j                  «       }|r nt-        j.                  d(«      ƒ d{  –—†  ŒK |j                  dd)¬«      ƒ d{  –—†  t1        |«      ƒ d{  –—† }|s	dd*|› d�dœS |rt        ||«      sdd+|› d,|› d�dœS |}	d}�n|�r“t3        j4                  d-| j                  «      }|s3t7        | «      ƒ d{  –—†  t3        j4                  d-| j                  «      }|sdd.dœS d|j9                  d/«      › d|› �}
t%        |
«      }| j'                  |d#d$¬%«      ƒ d{  –—†  t)        | «      ƒ d{  –—†  |j	                  d&«      j
                  }|j                  dd¬«      ƒ d{  –—†  t        d'«      D ]I  }|j+                  «       ƒ d{  –—† j                  «       }|r nt-        j.                  d(«      ƒ d{  –—†  ŒK |j                  dd)¬«      ƒ d{  –—†  t1        |«      ƒ d{  –—† }|s	dd0|› d�dœS |rt        ||«      sdd1|› d,|› d�dœS |}	d}�nxt;        | |||«      ƒ d{  –—† }|s|xs t=        |«      }dd2|› d3�dœS |\  }}}|d   }	|j                  d«      xs |
}
|
�r%d|
v �r t%        |
«      }| j'                  |d#d$¬%«      ƒ d{  –—†  t)        | «      ƒ d{  –—†  |j	                  d&«      j
                  }|j                  dd¬«      ƒ d{  –—†  t        d'«      D ]I  }|j+                  «       ƒ d{  –—† j                  «       }|r nt-        j.                  d(«      ƒ d{  –—†  ŒK |j                  dd)¬«      ƒ d{  –—†  t1        |«      ƒ d{  –—† }|s	dd*|
› d�dœS |rt        ||«      sdd+|› d,|› d�dœS |}	d}d}|s¤|�¢t?        | ||	«      ƒ d{  –—† }|
s|r|}
|j                  dd)¬«      ƒ d{  –—†  t!        | ||	|
d4¬«      ƒ d{  –—† sTt?        | ||	«      ƒ d{  –—†  t!        | ||	|
d5¬«      ƒ d{  –—† s't1        |«      ƒ d{  –—† } dd6|	› d7�| rd8| › d9�nd:z   dœS |j	                  d;«      j
                  }!|!jA                  d<«      ƒ d{  –—† xs d}"|!j	                  d&«      j+                  «       ƒ d{  –—† j                  «       }#t        |#|	«      sdd=|#› d,|	› d�dœS g }$|!j	                  d>«      }%t        |%j                  «       ƒ d{  –—† «      D ]�  }|%j                  |«      }&|&j+                  «       ƒ d{  –—† j                  «       }'|&jA                  d<«      ƒ d{  –—† xs d}(d?})d@|(v rdA})ndB|(v rdC})ndD|(v rdE})ndF|(v rdG})ndH|(v rdI})|$jC                  |'|)|(dJœ«       Œ‘ d}*|j	                  dK«      j
                  }+|+j                  «       ƒ d{  –—† d
kD  r&|+j+                  «       ƒ d{  –—† j                  «       }*d},dLD ]c  }-|j	                  |-«      j
                  }.|.j                  «       ƒ d{  –—† d
kD  sŒ:|.j+                  «       ƒ d{  –—† j                  «       },|,sŒc n d}/dMD ]c  }0|j	                  |0«      j
                  }1|1j                  «       ƒ d{  –—† d
kD  sŒ:|1j+                  «       ƒ d{  –—† j                  «       }/|/sŒc n |/jE                  dN«      r|/jG                  dN«      r|/d/d }/g }2|j	                  dO«      }3t        |3j                  «       ƒ d{  –—† «      D �]3  }|3j                  |«      }4d}5|4j	                  dP«      }6|6j                  «       ƒ d{  –—† d
kD  r&|6j+                  «       ƒ d{  –—† j                  «       }5d}7|4j	                  dQ«      }8|8j                  «       ƒ d{  –—† d
kD  r&|8j+                  «       ƒ d{  –—† j                  «       }7d}9	 dRD ]Z  }:|4j	                  |:«      };|;j                  «       ƒ d{  –—† d
kD  sŒ0|;j
                  jA                  dS«      ƒ d{  –—† xs d}9|9sŒZ n |2jC                  |5|7|9dTœ«       �Œ6 dU|#|"|$|*|,|/|2dVœS 7 �
ŒÀ7 �
Œ'7 �
Œ7 �	ŒÜ7 �	Œd7 �	ŒL7 �	Œ# t"        $ r}t        d!|› d"�«       Y d}~�	Œ,d}~ww xY w7 �	Œ7 �Œ÷7 �ŒÄ7 �Œ¡7 �Œu7 �Œ[7 �ŒK7 �Œë7 �Œ‰7 �Œy7 �ŒF7 �Œ#7 �Œ÷7 �ŒÝ7 �ŒÍ7 �Œ�7 �Œ)7 �Œ7 �Œæ7 �ŒÃ7 �Œ—7 �Œ}7 �Œm7 �Œ,7 �Œ7 �Œù7 �Œç7 �ŒÒ7 �ŒÂ7 �Œ}7 �ŒU7 �Œ7 �ŒÕ7 �Œ±7 �Œ@7 �Œ(7 �Œã7 �ŒÊ7 �Œ7 �Œf7 �Œþ7 �Œ½7 �Œ¥7 �Œo7 �ŒW7 �Œ7 Œö# t"        $ r d}9Y Œ÷w xY w# t"        $ r}<dt=        |<«      dœcY d}<~<S d}<~<ww xY w­w)Wzˆ
    POST task to click a specific active exchange by school name (preferred)
    and scrape all rich data inside `div.ex-details`.
    NrÏ   z.Exchange name, index, id, or href is required.rÐ   r   rV   rX   rš   rº   r   zExchange index z is invalid.Fúdiv.ex-detailsrÎ   zVServer Optimization: Already on exchanges page. Attempting client-side SPA click for 'ú'.r¤   r¥   i¸  r§   rh   rq   Tr]   rp   zFound match at index z. Clicking row.ry   ç      @)r”   z1Client-side click succeeded. SPA content updated.z+Client-side SPA click failed or timed out: z!. Falling back to full page load.r   r‚   rƒ   r�   é   gš™™™™™¹?r¦   zCould not load exchange at 'zExchange href opened 'z' but expected 'rW   z4Could not resolve Hudl team for exchange navigation.r8   zCould not load exchange 'zExchange id opened 'z
Exchange 'z#' was not found in the active list.g       @g      @z!Details panel did not update to 'Ú'z (still showing 'z').Ú.ú.ex-details-headerÚclasszDetails panel shows 'z(.ex-actions .uni-btn, .ex-actions buttonÚunknownúex-action-archiveÚdeleteúex-action-cancelÚcancelúex-action-addÚaddúex-action-chooseÚchooseúex-action-declineÚdecline)ÚtextÚtypeÚclassesz.ex-contact-time)z3.ex-details-contact .ex-contact-name h4.uni-subheadz".ex-details-contact h4.uni-subheadz.ex-details-contact h4z.ex-contact-name h4)z.ex-details-messagez'.ex-details-contact .ex-details-messagez.ex-contact-messagez.ex-details-bodyÚ"z.ex-details-playlistz.ex-playlist-namez.ex-playlist-length)z.ex-playlist-thumb imgz.ex-playlist-thumbnail imgÚimgÚsrc)rp   ÚlengthÚ	thumb_urlr   )r    Úschool_nameÚheader_classÚbuttonsrr   Úsenderr#   Ú	playlists)$r%   r&   r"   r   rI   rJ   r‹   r(   r©   r=   r<   r¯   rw   r.   rŒ   r   r˜   r,   re   r*   r   r�   rR   rS   r’   rY   rZ   r¡   r\   r´   rt   r†   r[   r°   rd   rœ   )=r   r«   r¬   rv   r]   r   Úexplicit_teamr‡   rN   r€   r“   Únavigated_directlyr�   Úspa_navigatedrD   r=   Ú	target_liÚ
target_rowÚ
target_idxr²   Úli_locru   ÚmatchesÚspa_errr…   r‘   rB   Úscraped_namer^   ÚresolvedÚlabelÚopened_hrefÚcurrent_nameÚheaderrî   rí   rï   Úbtn_locatorsÚbtnrå   Ú
class_attrÚaction_typeÚ	time_textÚtime_locatorÚsender_textÚ
sender_selÚsender_locatorÚmessage_textÚmessage_selÚmessage_locatorrñ   Úplaylist_locatorsÚplÚpl_nameÚname_locÚ	pl_lengthÚlen_locÚimg_srcÚimg_selÚimg_locrÆ   s=                                                                r4   Úget_active_exchange_detailsr    s  è ø€ ð6Ù Ð!7ÁÑTXØ%Ð2bÑcÐcà š B×-Ñ-Ó/ˆØ× Ñ Ô"Ø—h‘h’n "ˆGà˜m˜_Ð-°WÑ<Ø˜m˜_¨JÐ7¸wÑFä# D°-Ô@×@Ð@àÐ%¨.¸1Ò*<Ø%°OÀNÐCSÐS_Ð2`ÑaÐaàˆØ%ˆØˆØ"ÐØ—|‘|Ð$4Ó5×;Ñ;ˆð ˆØ˜$Ÿ(™(Ÿ.™.Ó*Ò*ÜÐjÐkxò  lHð  }Hð  kIð  IKð  Lô  Mð(pà#Ÿ|™|Ð,DÓE�Ø"×(Ñ(×1Ñ1¸	È4Ð1ÓP×PÐPØ*×0Ñ0Ó2×2�ð !�	Ø!�
Ø�
ä˜už�AØ)×-Ñ-¨aÓ0�FÜ 9¸&À!Ó D×D�CÚØ"'˜Ù&¨3¯7©7°4«=¸KÒ+GØ&*™GÙ! c§g¡g¨f£o¸Ò&=Ø&*™GÙ*Ô/CÀCÈÁKÐQ^Ô/_Ø&*˜Gâ"Ø(.˜IØ),˜JØ)*˜JÙ!ð! &ñ$ ÜÐ1°*°¸_ÐMÔNÜ4°T¸9ÓE×EÐEØ&×/Ñ/°iÈÐ/ÓN×NÐNØ$.¨vÑ$6�MØ$.§N¡N°6Ó$:Ò$B¸d�Mä:¸4ÀÈ}Ð^kÐwzÔ{×{Ð{ÜÐQÔRØ(,˜ò Ú˜¨Ò-Ü*¨4Ó0�
Ø—i‘i 
Ð7IÐSX�iÓY×YÐYÜ'¨Ó-×-Ð-ð ".×!5Ñ!5Ð6JÓ!K×!QÑ!Q�Ø$×-Ñ-°IÀtÐ-ÓL×LÐLÜ˜rž�AØ*8×*CÑ*CÓ*E×$E×#LÑ#LÓ#N�LÙ#ÙÜ!Ÿ-™-¨Ó,×,Ñ,ð	 #ð #×+Ñ+°)ÀUÐ+ÓK×KÐKÜ%=¸lÓ%K×K�Ù#Ø&-Ð<XÐY]ÐX^Ð^`Ð:aÑbÐbÙ Ô)=¸lÈMÔ)Zà")à4°\°NÐBRÐS`ÐRaÐacÐdñð ð !-�Ø%)Ò"ÚÜŸY™Y ¸¿¹ÓA�
Ù!Ü5°dÓ;×;Ð;Ü!#§¡¨?¸D¿H¹HÓ!E�JÙ!Ø&-Ð:pÑqÐqØ")¨*×*:Ñ*:¸1Ó*=Ð)>¸kÈ+ÈÐ W�Ü*¨=Ó9�
Ø—i‘i 
Ð7IÐSX�iÓY×YÐYÜ'¨Ó-×-Ð-ð ".×!5Ñ!5Ð6JÓ!K×!QÑ!Q�Ø$×-Ñ-°IÀtÐ-ÓL×LÐLÜ˜rž�AØ*8×*CÑ*CÓ*E×$E×#LÑ#LÓ#N�LÙ#ÙÜ!Ÿ-™-¨Ó,×,Ñ,ð	 #ð #×+Ñ+°)ÀUÐ+ÓK×KÐKÜ%=¸lÓ%K×K�Ù#Ø&-Ð<UÐVaÐUbÐbdÐ:eÑfÐfÙ Ô)=¸lÈMÔ)Zà")à2°<°.Ð@PÐQ^ÐP_Ð_aÐbñð ð !-�Ø%)Ò"ä!@Ø˜-¨¸ó"÷ �ñ  Ø)Ò@¬S°Ó-@�Eà")Ø%/°¨wÐ6YÐ#Zñð ð +3Ñ'��C˜Ø # F¡�Ø #§¡¨£Ò @°=�â  ]°mÒ%CÜ!.¨}Ó!=�JØŸ)™) JÐ;MÐW\˜)Ó]×]Ð]Ü+¨DÓ1×1Ð1ð &2×%9Ñ%9Ð:NÓ%O×%UÑ%U�NØ(×1Ñ1¸	È4Ð1ÓP×PÐPÜ" 2žY˜Ø.<×.GÑ.GÓ.I×(I×'PÑ'PÓ'R˜Ù'Ù!Ü%Ÿm™m¨CÓ0×0Ñ0ð	 'ð '×/Ñ/°iÈÐ/ÓO×OÐOÜ)AÀ,Ó)O×#O�LÙ'à&-Ø)EÀmÀ_ÐTVÐ'Wñ ð ñ %Ô-AÀ,ÐP]Ô-^à&-à"8¸¸ÐFVÐWdÐVeÐegÐ hñ ð ð %1�MØ)-Ð&Ø�Bá%¨"¨.Ü$=¸dÀBÈÓ$V×V�Ù$©Ø$/�Mà"×+Ñ+°)ÀUÐ+ÓK×KÐKÜ:Ø˜,¨°}ÐPSô÷ ð ô 4°D¸"¸mÓL×LÐLÜ!>Ø˜l¨M¸=ÐTWô"÷ ð ô .FÀlÓ-S×'S˜à&-à"CÀMÀ?ÐRSÐ TÙLXÐ%6°|°nÀCÑ#HÐ^añ!cñ ð ð ×%Ñ%Ð&:Ó;×AÑAˆØ#×1Ñ1°'Ó:×:Ò@¸bˆØ#Ÿ^™^Ð,@ÓA×LÑLÓN×N×UÑUÓWˆÜ# K°Ô?à!à+¨K¨=Ð8HÈÈÐWYÐZñð ð ˆà—~‘~Ð&PÓQˆÜ˜\×/Ñ/Ó1×1Ö2ˆAØ×"Ñ" 1Ó%ˆCØŸ.™.Ó*×*×1Ñ1Ó3ˆDØ"×0Ñ0°Ó9×9Ò?¸RˆJð $ˆKØ" jÑ0Ø&‘Ø# zÑ1Ø&‘Ø  JÑ.Ø#‘Ø# zÑ1Ø&‘Ø$¨
Ñ2Ø'�à�N‰NØØ#Ø%ñõ ð% 3ð2 ˆ	Ø#×+Ñ+Ð,>Ó?×EÑEˆØ×#Ñ#Ó%×%¨Ò)Ø+×6Ñ6Ó8×8×?Ñ?ÓAˆIàˆó
ˆJð *×1Ñ1°*Ó=×CÑCˆNØ#×)Ñ)Ó+×+¨aÓ/Ø%3×%>Ñ%>Ó%@×@×GÑGÓI�ÚÙð
ð ˆó
ˆKð +×2Ñ2°;Ó?×EÑEˆOØ$×*Ñ*Ó,×,¨qÓ0Ø&5×&@Ñ&@Ó&B× B×IÑIÓK�ÚÙð
ð ×"Ñ" 3Ô'¨L×,AÑ,AÀ#Ô,FØ'¨¨"Ð-ˆLð ˆ	Ø(×0Ñ0Ð1GÓHÐÜÐ.×4Ñ4Ó6×6×7ˆAØ"×&Ñ& qÓ)ˆBØˆGØ—z‘zÐ"5Ó6ˆHØ—^‘^Ó%×%¨Ò)Ø!)×!4Ñ!4Ó!6×6×=Ñ=Ó?�àˆIØ—j‘jÐ!6Ó7ˆGØ—]‘]“_×$ qÒ(Ø#*×#5Ñ#5Ó#7×7×>Ñ>Ó@�	àˆGðó �Gð
 !Ÿj™j¨Ó1�GØ$Ÿ]™]›_×,¨qÓ0Ø(/¯©×(CÑ(CÀEÓ(J×"JÒ"PÈb˜Ú"Ù!ð ð ×ÑØØ#Ø$ñö ð7 8ðD Ø&Ø(ØØØ!Ø#Ø"ñ	
ð 		
ðS	 Aùð$ QùØ2ùð Eùð$ FùØNùð |úô ò pÜÐCÀGÀ9ÐLmÐn×oÒoûðpúð ZùØ-ùð Mùà$Eùð -ùàKùØKùð <ùð ZùØ-ùð Mùà$Eùð -ùàKùØKùðùð ^ùØ1ùð Qùà(Iùð 1ùàOùØ#Oùð$ Wùð Lùðùð Mùðùð (Tùð ;ùØNùð 2ùà*ùØ9ùð0 &ùØ8ùð ,ùØ@ùð -ùØ Bùð 7ùð &ùØ6ùð %ùØ7ùð -ùØ"Jùô ò Ø’ðûô& ò 6Ø!¬c°!«fÑ5Õ5ûð6üs  ‚p „o< �p ‘Ao< Á$l$Á%o< Á8p Á9Ao< Ã1l9 Ä l'Äl9 Äl*Ä8l9 Ål-Ål9 ÅA	l9 Æ#)l9 Çl0Çl9 Ç'l3Ç(1l9 Èl6Èl9 È+-o< ÉmÉo< É+m"É,5o< Ê!m%Ê"%o< Ëm(Ë.o< Ë6m+Ë7o< Ìm.Ìo< Ì&m1Ì'o< Ì5p Ì6o< Íp Í9o< Î	m4Î
*o< Î4p Î59o< Ï.m7Ï/o< Ðm:Ð5o< Ð7m=Ð8%o< Ñn Ñ.o< ÒnÒo< Ò)nÒ*o< Ò<n	Ò=o< Óp Óo< Ó%p Ó&o< Ó=nÓ>o< Ôp ÔA
o< Õ&nÕ'o< Õ9nÕ:5o< Ö/nÖ0%o< ×n×.o< ØnØo< Ø!nØ"o< Ø4n!Ø5o< Ùp Ùo< Ùp Ùo< Ù8n$Ù9 o< Ún'Úo< Ú1n*Ú2o< Ûn-Ûo< Ûn0Ûo< Û1n3Û2o< Ü	p Ü
/o< Ü9n6Ü:*o< Ý$n9Ý%)o< Þp Þ+o< Þ:n<Þ;/o< ß*n?ß+&o< àoàA3o< âoâo< â oâ!Ao< ã(oã)o< ã1o< äoäo< ä8o< åoåo< åo< å.oå/o< æAo< çoçAo< èoèo< è8oè98o< é1o é2o< êo#êo< ê")o+ëo&ëo+ëo+ë2o)ë3
o+ë>o+ì"o< ì#p ì$o< ì'l9 ì*l9 ì-l9 ì0l9 ì3l9 ì6l9 ì9	mímío< ímío< í"o< í%o< í(o< í+o< í.o< í1o< í4o< í7o< í:o< í=o< î o< îo< îo< î	o< îo< îo< îo< îo< îo< îo< îo< î!o< î$o< î'o< î*o< î-o< î0o< î3o< î6o< î9o< î<o< î?o< ïo< ïo< ïo< ïo< ïo< ïo< ïo< ïo< ïo< ïo< ï o< ï#o< ï&o+ï)o+ï+o9ï6o< ï8o9ï9o< ï<	pðpðpðp ðpðp rÛ   rÝ   rã   rá   rß   )rÜ   rÞ   rä   râ   rà   c              ƒ   ó6  ‡K  — d}|D ]  }| j                  |«      j                  }	 |j                  «       ƒ d{  –—† dkD  rF|j                  «       ƒ d{  –—† r.|j	                  «       ƒ d{  –—†  t        dd«      ƒ d{  –—†   yŒ� d}| j                  d«      }	 t        |j                  «       ƒ d{  –—† «      D ]¢  }|j                  |«      }|j                  «       ƒ d{  –—† sŒ-|j                  «       ƒ d{  –—† j                  «       j                  «       Št        ˆfd	„|D «       «      sŒv|j	                  «       ƒ d{  –—†  t        dd«      ƒ d{  –—†   y 	 y
7 �Œ,7 �Œ7 Œþ7 Œì# t        $ r Y �Œtw xY w7 ŒÉ7 Œ›7 Œ„7 Œ=7 Œ+# t        $ r Y y
w xY w­w)zÓ
    After clicking a destructive action (archive/cancel/decline) Hudl usually
    shows a confirmation modal. Try to click its primary/confirm button.
    Returns True if a confirmation button was clicked.
    )z.uni-modal .uni-btn-primaryz .uni-modal button.uni-btn-dangerz).uni-modal-actions button.uni-btn-primaryz&[role='dialog'] button.uni-btn-primaryNr   r„   çÍÌÌÌÌÌü?T)ÚconfirmÚyesÚarchiverÜ   zcancel exchangeÚremovez).uni-modal button, [role='dialog'] buttonc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w©N© )Ú.0Útrå   s     €r4   Ú	<genexpr>z-_confirm_hudl_action_modal.<locals>.<genexpr>Š  s   øè ø€ Ð4¡m �1˜”9¡mùs   ƒF)rI   rJ   r=   Ú
is_visibler|   r   r,   r<   r¯   r�   r%   r‹   Úany)r   Úconfirm_selectorsÚselectorr  Úconfirm_textsÚ
modal_btnsr²   rå   s          @r4   Ú_confirm_hudl_action_modalr)  k  sq  øè ø€ ðÐó &ˆØ�l‰l˜8Ó$×*Ñ*ˆð	Ø—Y‘Y“[×  1Ò$¨s¯~©~Ó/?×)?Ð)?Ø—i‘i“k×!Ð!Ü! # sÓ+×+Ð+Ùøð &ð Y€MØ—‘ÐIÓJ€JðÜ˜Z×-Ñ-Ó/×/Ö0ˆAØ—.‘. Ó#ˆCØŸ™Ó)×)Ð)ØØŸ.™.Ó*×*×1Ñ1Ó3×9Ñ9Ó;ˆDÜÓ4¡mÓ4Õ4Ø—i‘i“k×!Ð!Ü! # sÓ+×+Ð+Ùñ 1ð ð/ !ùÐ)?ùØ!øØ+ùäò 	Úð	úð 0øà)øà*øà!øØ+ùäò Øàðüsþ   ƒ#F§E0ºE&»E0ÁE)ÁE0Á-E,Á.E0ÂE.ÂE0ÂFÂF
 Â6F Â7/F
 Ã&FÃ'F
 Ã?FÄ 4F
 Ä5F
 ÅFÅ	F
 ÅFÅF
 Å"FÅ#F
 Å%FÅ&E0Å)E0Å,E0Å.E0Å0	E=Å9FÅ<E=Å=FÆ F
 ÆF
 ÆF
 ÆF
 ÆF
 Æ
	FÆFÆFÆFr  c           
   ƒ   ó  K  — |xs dj                  «       }t        j                  |«      }|s	dd|› d�dœS t        | ||||¬«      ƒ d{  –—† }|r|j                  d«      d	k7  r	|xs dd
dœS 	 | j	                  d«      j
                  }|j	                  d«      j
                  }	|	j	                  d|› �«      j
                  }
|
j                  «       ƒ d{  –—† dk(  rdd|› d|j                  d«      xs |› d�dœS |
j                  «       ƒ d{  –—† j                  «       }|
j                  «       ƒ d{  –—†  |
j                  «       ƒ d{  –—†  t        dd«      ƒ d{  –—†  t        | «      ƒ d{  –—† }t        | «      ƒ d{  –—†  t        dd«      ƒ d{  –—†  d	d|› �|| j                  d|xs |› d|j                  d«      xs |› d�dœS 7 �ŒŠ7 �Œ7 ŒÉ7 Œ¥7 Œ�7 Œ}7 Œl7 Œ[7 ŒI# t        $ r}dt!        |«      dœcY d}~S d}~ww xY w­w)z¡
    POST task: open a specific active exchange, then click its header action
    button (delete/cancel/decline/choose/add) and confirm any resulting modal.
    r   rÏ   zUnsupported action type 'rÓ   rÐ   )r«   r¬   rv   r]   Nr    r   z2Could not open the exchange to perform the action.rÒ   rØ   z.ex-actions .r   zNo 'z' button available for rí   r×   r„   r  rH   gffffffö?Úactive_exchange_z	Clicked 'z' for )r    r!   Ú	confirmedr"   r#   )r‹   Ú_ACTION_TYPE_CLASSr.   r  rI   rJ   r=   r�   r%   rQ   r|   r   r)  r   r"   r,   rt   )r   r  r«   r¬   rv   r]   Útarget_classÚdetailsr�   r   r  Úbtn_textr,  rÆ   s                 r4   Úclick_active_exchange_buttonr1  ”  s2  è ø€ ð Ò$ "×+Ñ+Ó-€KÜ%×)Ñ)¨+Ó6€LÙàØ2°;°-¸rÐBñ
ð 	
ô 0ØØ#Ø%ØØô÷ €Gñ �g—k‘k (Ó+¨tÒ3Øò 
ØØKñ
ð 	
ð
"6Ø—|‘|Ð$4Ó5×;Ñ;ˆØ×%Ñ%Ð&:Ó;×AÑAˆØ�n‰n˜}¨\¨NÐ;Ó<×BÑBˆà—‘“× Ò!à!à˜;˜-Ð'>Ø—{‘{ =Ó1ÒB°]ÐCÀ1ðFñð ð Ÿ.™.Ó*×*×1Ñ1Ó3ˆØ×,Ñ,Ó.×.Ð.Ø�i‰i‹k×ÐÜ˜#˜sÓ#×#Ð#ä4°TÓ:×:ˆ	Ü Ó%×%Ð%Ü˜#˜sÓ#×#Ð#ð Ø(¨¨Ð6Ø"Ø—8‘8à˜HÒ3¨Ð4°FØ—;‘;˜}Ó-Ò>°Ð?¸qðBñ	
ð 		
ðIùð$ ùð +øØ.øØøØ#øà:øØ%øØ#ùô ò 6Ø!¬c°!«fÑ5Õ5ûð6üsß   ‚AHÁ
GÁ#HÁ/A'G( ÃGÃ%G( Ã<HÃ=G( ÄGÄ%G( Ä6GÄ7G( ÅGÅG( Å"G Å#G( Å5G"Å6G( ÆG$Æ	G( ÆG&Æ6G( ÇHÇG( ÇG( ÇG( ÇG( Ç G( Ç"G( Ç$G( Ç&G( Ç(	H	Ç1HÇ>H	Ç?HÈH	È	Hr  )é   )é   )NrÔ   )F)NN)é   rŠ   )NNNN)NNN)5Ú__doc__rR   rY   rr   Úplaywright.async_apir   r   Úapp.automation.helpersr   Úapp.automation.selectorsr   r   r   r	   Úapp.automation.session_storer
   Úapp.automation.tasks.loginr   Úapp.automation.tasks.popupr   Ú app.automation.tasks.permissionsr   Úapp.automation.team_parserr   rt   Údictr   ÚintrC   rM   rT   r`   re   rl   rw   r   r†   ÚboolrŒ   r’   Úfloatr˜   r¡   rª   Útupler´   r¸   rË   rÍ   r  r-  r)  r1  r  rf   r4   Ú<module>rC     sá  ðñó Û 	Û ç .å .÷ó õ 7Ý :Ý 8Ý DÝ 4ñ.˜dð .¨S°4©Zð .À4ó .ñb Tð °'ð Àsð ÐTWó ñ(&¨dð &À'ð &ÐWZð &Ðdgó &ð2¨tð ¸ð ÀTó ñ2 ð °°t±ð ÀsÈTÁzó ð**˜ð * ó *ðO˜sð O só Oð¨ð ¸ð ÀÀtÁó ð>¨4ð °Wð Àó ð<Ø
ðàðð ðð 	ˆ4�Zó	ð. #ð °ð ¸ó ð7°ð 7¸Só 7ð !%ØñØ
ðàðð ðð ˜‘:ð	ð
 ðð 
óð(¨Dð °Tó ñ:¨dð Àð ÐRYó ð "&Ø"ñ	+Ø
ð+àð+ð ˜$‘Jð+ð �t‘ð	+ð
 ˆ7�D˜#ÐÑ Ñ%ó+ðd ñ	7Ø
ð7àð7ð ð7ð ð	7ð
 
ó7ñ&N $ð N°°t±ð NÀtó Nñb,6 Tð ,6°C¸$±Jð ,6ÐTXð ,6Ðeió ,6ðd "&Ø"ØØñK6Ø
ðK6àðK6ð ˜$‘JðK6ð �t‘ð	K6ð
 �‰*ðK6ð �4‰ZðK6ð 
óK6ðb
 "Ø Ø"Ø ØñÐ ð&¨4ð &°Dó &ðZ "&Ø"ØñE6Ø
ðE6àðE6ð ðE6ð ˜$‘Jð	E6ð
 �t‘ðE6ð �‰*ðE6ð 
ôE6rf   