ctx-tui 2.0.4

Manage repo-scoped work contexts: fresh checkouts wrapped in terminal multiplexer sessions
Documentation
�

"�j��	���%SSKrSSKrSSKrSSKrSSKJrJr SSKJr SSK	J
r
 SSKJrJ
r
 SSKJr SSKJrJr SSKJrJr SS	KJr SS
KJrJr SSKJr SSKJr SS
KJ r  SSK!J"r"J#r#J$r$J%r%J&r& SSK'J(r( SSK)J*r*J+r+J,r,J-r- SSK.J/r/J0r0J1r1 SSK2J3r3 SSK4J5r5J6r6 \"SS9"SS55r7\"SS9"SS55r8\7\8-r9Sr:Sr;\#\<\#\<\--r=S\<S\\<-4Sjr>S\0S\<S \?S\\<-4S!jr@\A"1S"k5rB\R�S\S4S#j5rD\"S$S%S&S'9\"S(S)S&S'94rE\F\S*4\GS+'\"S,S-S&S'9\"S.S/S&S'94rH\F\S*4\GS0'"S1S2\ \<S-5rI"S3S4\ S5rJS5S6S7S8.rK\L\<\F\F\<\<4S*44\GS9'S:rM"S;S<\ S5rN"S=S>\ \?5rOS?\<S@\<S\?4SAjrP"SBSC\%5rQ"SDSE\#\<\-5rR"SFSG\#\<5rS"SHSI\#\<5rT"SJSK\\9S-5rUg)L�N)�Callable�Iterator)�	dataclass)�partial)�Any�ClassVar)�Text)�on�work)�App�
ComposeResult)�Binding)�
Horizontal�Vertical)�
Coordinate)�	NoMatches)�ModalScreen)�Button�	DataTable�Footer�Input�Label)�CellDoesNotExist)�contexts�forge�repos�status)�Config�StatusColumn�Theme)�Context)�Multiplexer�MultiplexerErrorT)�frozenc� �\rSrSr%\\S'Srg)�OpenRequest��name�N��__name__�
__module__�__qualname__�__firstlineno__�str�__annotations__�__static_attributes__r)��A/Users/michael/dev/contexts/ctx/rewrite-it-in-rust/src/ctx/tui.pyr&r&s��

�Ir2r&c�:�\rSrSr%\\S'\\S'\S-\S'Srg)�
NewRequest� �repor(N�baser)r*r)r2r3r5r5 s��

�I�

�I�

��*�r2r5z|/-\g@�cell�returnc�d�[RRU5nU(a	[XS9$U$)z>Colour a status cell if its value is a well-known status word.��style)r�
STATUS_STYLES�getr	)r9r=s  r3�_styledr@1s*��� � �$�$�T�*�E�&+�4��"�5��5r2�column�	nerd_fontc��[R"XU5n[R"U5nU(a	[X4S9$U$)z?A column cell with its icon substituted and its colour applied.r<)r�	cell_icon�
cell_styler	)rAr9rB�displayr=s     r3�_render_cellrG7s6�����v�Y�7�G����d�#�E�).�4��%�;�G�;r2>	�new�open�delete�archive�add_repo�	unarchive�
empty_archive�
new_from_base�set_default_repoc#��# �[R"S5n[R"[R[R5n[R
"US5 Sv� [R
"US5 [R"U5 [R"U5 g![R
"US5 [R"U5 [R"U5 f=f7f)z@Keep subprocess stderr (git progress) from writing over the TUI.�N)�os�duprI�devnull�O_WRONLY�dup2�close)�savedrUs  r3�_silenced_stderrrZMs����
�F�F�1�I�E��g�g�b�j�j�"�+�+�.�G��
������
�
����q��
�����
������	����q��
�����
�����s �A
C4�
B,�(AC4�,AC1�1C4zj,l,down,rightzapp.focus_nextF��showzk,h,up,leftzapp.focus_previous.�_BUTTON_NAV_BINDINGS�leftzapp.prev_panel�rightzapp.next_panel�_PANEL_NAV_BINDINGSc	��^�\rSrSr%Sr\"SSSS9/r\\S'SS\	S	\	S
\	SS4U4S
jjjr
S\4Sjr\
"\R5S\RSS4Sj5rSSjrSrU=r$)�PromptScreen�iz@Lazygit-style single-line prompt: enter submits, escape cancels.�escape�cancelFr[�BINDINGS�title�placeholder�valuer:Nc�F>�[TU]5 XlX lX0lg�N)�super�__init__�_title�_placeholder�_value)�selfrgrhri�	__class__s    �r3rm�PromptScreen.__init__ns���
������'���r2c#�# �[SS9 [URSS9v� [URUR
S9v� SSS5 g!,(df   g=f7f)N�dialog��idF��markup)rh)rrrnrrpro�rqs r3�compose�PromptScreen.composets@���
��
"�����E�2�2������1B�1B�C�C�#�
"�
"�s�
A�7A�	A�
A�A�eventc�j�URR5nU(aURU5 ggrk)ri�strip�dismiss)rqr}ris   r3�_submit�PromptScreen._submitzs(�����!�!�#����L�L���r2c�&�URS5 grk�r�rzs r3�
action_cancel�PromptScreen.action_cancel�������T�r2)rornrp)�r��r:N)r+r,r-r.�__doc__rrfrr0r/rmr
r{r
r�	Submittedr�r�r1�
__classcell__�rrs@r3rbrbis����J�!�(�H�5�A�B�H�h�B��c������d���D��D������ �U�_�_� �� �� �
�r2rbc�|^�\rSrSr%Sr\"SSSS9\"SSSS9/r\\S'S	\	S
S4U4Sjjr
S
\4S
jrSSjr
SrU=r$)�AlertScreen�z-Message popup dismissed with escape or enter.rdrXFr[�enterrf�messager:Nc�.>�[TU]5 Xlgrk)rlrm�_message)rqr�rrs  �r3rm�AlertScreen.__init__�s���
�����
r2c#�~# �[SS9 [URSS9v� SSS5 g!,(df   g=f7f)NrurvFrx)rrr�rzs r3r{�AlertScreen.compose�s+���
��
"���
�
�e�4�4�#�
"�
"�s�
=�,�	=�
:�=c�&�URS5 grkr�rzs r3�action_close�AlertScreen.action_close�r�r2)r�r��r+r,r-r.r�rrfrr0r/rmr
r{r�r1r�r�s@r3r�r��sW���7�	��'��.����u�-��H�h��
 �� �� �5��5��r2r�))z
enter / spacezopen context)�ozopen the PR in the browser��n�new context��Nznew context from a base branch)�dzarchive context)�D�permanently delete context))z	enter / nr�r�)�azadd repo)�szset / clear default repo)r�zremove repo))r�zunarchive and open context)�uzunarchive contextr�r�)zd / Dr�)�ezempty the archive)rr�archived�_PANEL_KEYBINDINGS))uj / k / ↓ / ↑zmove within panel)zg / Gzjump to top / bottom)uh / l / ← / →zswitch panel)z	1 / 2 / 3z
jump to panel)�/zfuzzy filter by repo and name)�r�refresh)�?z	this help)z
q / ctrl+c�quitc�^�\rSrSr%Sr\"SSSS9\"SSSS9\"SSSS9/r\\S	'S
\	SS4U4S
jjr
S\4SjrSSjr
SrU=r$)�
HelpScreen��z<Keybinding reference for one panel, dismissed like an alert.rdrXFr[r��
question_markrf�panelr:Nc�.>�[TU]5 Xlgrk)rlrm�_panel)rqr�rrs  �r3rm�HelpScreen.__init__�s���
�����r2c#�# �[UR[-n[SS9 [	SURS35v� [	SRSU555v� SSS5 g!,(df   g=f7f)Nrurvz
Keybindings (�)�
c3�4# �UHupUSU3v� M g7f)z<16Nr))�.0�key�descs   r3�	<genexpr>�%HelpScreen.compose.<locals>.<genexpr>�s���!O�h���S��I�d�V�"4�h�s�)r�r��_COMMON_KEYBINDINGSrr�join)rq�bindingss  r3r{�HelpScreen.compose�s^���%�d�k�k�2�5H�H��
��
"��-����}�A�6�7�7���	�	�!O�h�!O�O�P�P�#�
"�
"�s�$A?�?A.�%	A?�.
A<�8A?c�&�URS5 grkr�rzs r3r��HelpScreen.action_close�r�r2)r�r�r�r�s@r3r�r��se���F�	��'��.����u�-����u�5��H�h���c��d��Q��Q��r2r�c��^�\rSrSr%Sr\"SSSS9/\Qr\\	S'S\
S	\
S
S4U4SjjrS
\4S
jr
\"\R S5SSj5r\"\R S5SSj5rSSjrSrU=r$)�
ConfirmScreen��z#Yes/no confirmation with a message.rdreFr[rfr��
confirm_labelr:Nc�:>�[TU]5 XlX lgrk)rlrmr��_confirm_label)rqr�r�rrs   �r3rm�ConfirmScreen.__init__�s���
�����
�+�r2c#�
# �[SS9 [URSS9v� [SS9 [	UR
SSS9v� [	S	S
S9v� SSS5 SSS5 g!,(df   N=f!,(df   g=f7f)NrurvFrx�buttons�error�confirm)�variantrw�Cancelre)rrr�rrr�rzs r3r{�ConfirmScreen.compose�sd���
��
"���
�
�e�4�4��y�)��T�0�0�'�i�P�P��X�(�3�3�*�#�
"�)�)��#�
"�s3�
B� A2�$A!�A2�	B�!
A/	�+A2�2
B�<Bz#confirmc�&�URS5 g)NTr�rzs r3�_confirm�ConfirmScreen._confirm�s�����T�r2z#cancelc�&�URS5 g�NFr�rzs r3�_cancel�ConfirmScreen._cancel�s�����U�r2c�&�URS5 gr�r�rzs r3r��ConfirmScreen.action_cancel�s�����U�r2)r�r�r�)r+r,r-r.r�rr]rfrr0r/rmr
r{r
r�Pressedr�r�r�r1r�r�s@r3r�r��s����-�	��(��/��	��H�h��
,��,�C�,�D�,�
4��4�����
�#��$������	�"��#���r2r��queryr(c�|^�[UR55m[U4SjUR555$)zATrue when the query's characters appear in order within the name.c3�,># �UH	oT;v� M g7frkr))r��ch�charss  �r3r��_fuzzy_match.<locals>.<genexpr>�s����3�]�r�U�{�]�s�)�iter�lower�all)r�r(r�s  @r3�_fuzzy_matchr��s*���������E��3�U�[�[�]�3�3�3r2c�R�\rSrSr%Sr\"SSSS9\"SSSS9\"S	S
SS9/r\\S'Sr	g
)�FilterInput��zKInline fuzzy-filter prompt; the target panel narrows as the query is typed.rdzapp.dismiss_filterFr[�downzapp.filter_cursor(1)�upzapp.filter_cursor(-1)rfr)N)
r+r,r-r.r�rrfrr0r1r)r2r3r�r��s<��U�	��.�U�;���.�U�;���-�E�:��H�h�r2r�c�B�\rSrSr%Sr\"SSSSS9SSS	/\Qr\\	S
'Sr
g)
�
ContextsTableizAContexts panel; its bindings surface in the footer while focused.�spacezapp.open�Open��key_display)r�zapp.open_przOpen PR)r�zapp.archive�Archive)r��
app.delete�Deleterfr)N�r+r,r-r.r�rr`rfrr0r1r)r2r3r�r�s6��K�	���V��A�'�'�%�	�

��H�h�r2r�c�2�\rSrSr%SrSSS/\Qr\\S'Sr	g)	�
ReposTableiz>Repos panel; its bindings surface in the footer while focused.)r�zapp.add_repo�Add repo)r�zapp.set_default_repozSet default)r�r�zRemove reporfr)N)
r+r,r-r.r�r`rfrr0r1r)r2r3r�r�s(��H�	*�4�*��
�	�H�h�r2r�c�@�\rSrSr%SrSS\"SSSS9S	/\Qr\\	S
'Sr
g)
�
ArchivedTableizAArchived panel; its bindings surface in the footer while focused.)r�z
app.unarchive�	Unarchive)r�r�r�r�r�Fr[)r�zapp.empty_archive�Emptyrfr)Nr�r)r2r3r�r�s4��K�	,�%���\��.�+�	�

��H�h�r2r�c�0^�\rSrSr%SrSr\\\S'Sr	\
"SSSS9\
"S	S
SS9\
"SSSS9S
\
"SSSS9\
"SSSSS9SS\
"SSSSS9\
"SSSSS9\
"SS SS9\
"S!S"SS9\
"S#S$SS9\
"S%S&SS9\
"S'S(SS9\
"S)S*SS9/r\\S+'S�S,\S-\
S.\S/S04U4S1jjjrS/\\\44U4S2jjrS/\4S3jrS�S4jr\S/\\\-4S5j5r\S/\\4S6j5r\S/\\4S7j5rS�S8jrS/\\4S9jrS:\S/S04S;jr S�S<jr!S:\S/S04S=jr"\#S:\S/S04S>j5r$S?\%S:\S/S04S@jr&S�SAjr'S�SBjr(SC\S/S04SDjr)S�SEjr*S/\+4SFjr,SG\+S/\S0-4SHjr-S/\%S0-4SIjr.S/\%S0-4SJjr/SK\SL\0\1SM4S/\S0-4SNjr2\3"\RhSO5S�SPj5r5\3"\RhSQ5S�SRj5r6\3"\RhSS5S�STj5r7S�SUjr8S�SVjr9S�SWjr:SX\S/S04SYjr;S�SZjr<S�S[jr=S�S\jr>S/\S0-4S]jr?S�S^jr@S�S_jrAS`\S/\B4SajrCS`\Sb\Sc\S0-S/S04SdjrD\#S`\Sb\Sc\S0-S/S04Sej5rES�SfjrFS�SgjrG\#Sh\S/S04Sij5rHS�SjjrIS�SkjrJ\#"SSl9S?\%Sm\S/S04Snj5rKS�SojrL\#"SSl9S�Spj5rMS�SqjrNS?\%Sr\Ss\O\%/\14S/S04StjrP\#"SSl9S?\%S/S04Suj5rQ\#"SSl9S?\%S/S04Svj5rR\#"SSl9S�Swj5rSS�SxjrT\#"SSl9S?\%S/S04Syj5rUS�SzjrV\#"SSl9S?\%S/S04S{j5rWS?\%S|\O/\14S/S04S}jrXS?\%S/S04S~jrYS�SjrZ\#"SSl9Sb\S/S04S�j5r[S�S�jr\S�S�jr]S�S�jr^SX\S/S04S�jr_\3"\`R�S�5S�\`R�S/S04S�j5rb\3"\`R�S�5S�S�j5rdS�S�jreS�S�jrfS�S�jrgS�S�jrhS�S�jriS�S�jrjS�rkU=rl$)��CtxTuii*z:Interactive manager for contexts and repos, lazygit-style.F�ENABLE_COMMAND_PALETTEa2

    #contexts { height: 7fr; }
    #bottom { height: 3fr; }
    #repos { width: 1fr; height: 100%; }
    #archived { width: 1fr; height: 100%; }
    #contexts, #repos, #archived {
        border: round $ctx-border-inactive;
        color: $ctx-foreground;
        /* A row cursor offers no horizontal scrolling, so wide content
           just clips; a scrollbar would only take up a row. */
        overflow-x: hidden;
        scrollbar-size-vertical: 1;
        scrollbar-background: ansi_default;
        scrollbar-color: ansi_bright_black;
        scrollbar-color-hover: ansi_white;
        scrollbar-color-active: ansi_white;
    }
    #contexts:focus, #repos:focus, #archived:focus {
        border: round $ctx-border-active;
    }
    #contexts.busy, #repos.busy, #archived.busy {
        text-style: dim;
    }
    /* Textual's ansi default is white-on-bright-blue, unreadable in many
       terminal palettes; stick to the terminal's own colours. */
    #contexts > .datatable--header, #repos > .datatable--header, #archived > .datatable--header {
        background: ansi_default;
        color: $ctx-foreground;
        text-style: bold;
    }
    /* lazygit-style selection: only the focused panel shows its cursor;
       bright-bold status colours keep their contrast on it. */
    #contexts > .datatable--cursor, #repos > .datatable--cursor, #archived > .datatable--cursor {
        background: ansi_default;
        color: $ctx-foreground;
        text-style: none;
    }
    #contexts:focus > .datatable--cursor,
    #repos:focus > .datatable--cursor,
    #archived:focus > .datatable--cursor {
        background: $ctx-selection;
        color: $ctx-foreground;
        text-style: bold;
    }
    #filter {
        display: none;
        height: 1;
        border: none;
        padding: 0 1;
        background: ansi_default;
        color: $ctx-foreground;
    }
    #dialog {
        padding: 1 2;
        width: 60;
        height: auto;
        border: round $foreground;
        background: $background;
        align-horizontal: center;
    }
    #dialog Label { margin-bottom: 1; width: 100%; }
    #dialog Input {
        background: ansi_default;
        color: $ctx-foreground;
        border: round $ctx-border-inactive;
    }
    #dialog Input:focus { border: round $ctx-border-active; }
    Input > .input--selection {
        background: $ctx-selection;
        color: $ctx-foreground;
    }
    #buttons { height: auto; align-horizontal: right; }
    #buttons Button { margin-left: 2; }
    PromptScreen, ConfirmScreen, AlertScreen, HelpScreen { align: center middle; }
    �1�focus_contextsr[�2�focus_repos�3�focus_archived)r�rHzNew contextr�rO�slash�filter�Filterr�r�)r�r��Refresh)�qr��Quitr��help�Helpr�zctrl+cr�T)r\�priority�h�
prev_panel�l�
next_panel�j�cursor_down�k�	cursor_up�g�
cursor_top�G�
cursor_bottomrf�cfg�mux�exit_on_openr:Nc�>�[TU]SS9 SUlXlX lX0l[
5UlSUl[
5Ul	SUl
/Ulg)NT)�
ansi_colorz	ansi-darkr)rlrm�theme�_cfg�_mux�
_exit_on_open�set�_busy�_spinner_frame�	_fetching�_filter_target�_filter_rows)rqrrrrrs    �r3rm�CtxTui.__init__�sV���	���D��)� ��
��	��	�)��"�u��
����#&�5���04���>@��r2c��>�[USS5nUbURO	[5n0[TU]5EUR
URURURS.E$)Nr#)zctx-foregroundz
ctx-selectionzctx-border-activezctx-border-inactive)	�getattrr"r rl�get_css_variables�
foreground�	selection�
border_active�border_inactive)rqrr"rrs   �r3r/�CtxTui.get_css_variables�sc���$�T�6�4�8�� �_��	�	�%�'��
��g�'�)�
�#�.�.�"�_�_�!&�!4�!4�#(�#8�#8�
�	
r2c#�# �[5 [SSSS9v� [SS9 [SSS9v� [	S	SS9v� SSS5 [S
S
S9v� SSS5 [
5v� g!,(df   N/=f!,(df   N,=f7f)Nr�row�
renderable)rw�cursor_type�cursor_foreground_priority�bottomrvr)rwr8r�r	)rwrh)rr�rr�r�r�rrzs r3r{�CtxTui.compose�sx����Z� ��5�\��
��x�(� �G��?�?�#�z�u�E�E�)���x�@�@���h��	)�(��
�Z�s2�B�A7�A&�A7�B�&
A4	�0A7�7
B�Bc��URn[SURR55nUR"SSSS/UQ76nUSSUlURnUR	SS5 URR	SSS5 UR5 URUR5 UR5 UR5 URSUR5 URR(aI[UR!55H+upVURU[#UR$U55 M- gg)	Nc3�T# �UHoRR5v� M  g7frk)r(�upper)r�r�s  r3r��"CtxTui.on_mount.<locals>.<genexpr>�s���F�5E��V�V�\�\�^�^�5E�s�&(�NAME�REPO�BRANCH�STATUS��URLg�������?)�_contexts_table�tupler#r�add_columns�_status_columns�_repos_table�_archived_table�_update_titles�call_after_refresh�_reload�
_sweep_worker�focus�set_interval�_spin�	enumerate�_poll_intervalsr�_poll_column)rq�	ctx_table�status_names�columns�
repo_table�index�intervals       r3�on_mount�CtxTui.on_mount�s���(�(�	��F�T�Y�Y�5E�5E�F�F���'�'����(�Z�\�Z��&�q�r�{����&�&�
����v�u�-����(�(����B�����	
������-������������#�t�z�z�*��9�9���#,�T�-A�-A�-C�#D����!�!�(�G�D�4E�4E�u�,M�N�$E�r2c�.�URS[5$)N�	#contexts��	query_onerrzs r3rF�CtxTui._contexts_table�����~�~�k�9�5�5r2c�.�URS[5$)N�#reposr`rzs r3rJ�CtxTui._repos_table�s���~�~�h�	�2�2r2c�.�URS[5$)N�	#archivedr`rzs r3rK�CtxTui._archived_table�rcr2c�X^^�TRb,TRnTR5 UR5 S/S[TRR
5--nTRnUR5 [R"TR5n[U4SjU5S5nUb#URU5 URSU5 UHfnXeLa[URSS9OURnUR"XvR [R""U5/UQ7SUR06 Mh UbUR$S:�aUR'SS	9 TR(nUR5 [*R,"TR5m[/[*R0"TR5U4S
jS9H@nUT:XaUS3OUn	URU	[*R2"TRU5US9 MB TR4n
U
R5 [R6"TR5HGnU
RURUR [R""U5URS9 MI TR95 g)
aRepaint the panels from what is cheap to read; statuses fill in after.

A status provider may take seconds per context (the GitHub built-ins
shell out to `gh`), which is more than the panels can wait for and far
more than the interface can stop responding for.
Nr��c3�l># �UH)nTRRU5(dM%Uv� M+ g7frk)r$�
is_current)r��crqs  �r3r��!CtxTui._reload.<locals>.<genexpr>�s$����C�4�a�4�9�9�+?�+?��+B���4�s�$4�	4rzbold bright_greenr<r��r6c�>�UT:gU4$rkr))r(�defaults �r3�<lambda>� CtxTui._reload.<locals>.<lambda>�s���$�RY�/�[_�I`r2)r�z *)r*�_drop_filterrP�lenr#rrF�clearr�
list_contexts�next�remove�insertr	r(�add_rowr7�current_branch�	row_count�move_cursorrJr�default_repo�sorted�
repo_names�repo_urlrK�
list_archived�_refresh_statuses)rq�filtered�blanksrV�ctxs�current�ctxr(rY�label�archived_tablerrs`          @r3rN�CtxTui._reload�s ������*��*�*�H������N�N�����S����!1�!1�2�2�3���(�(�	������%�%�d�i�i�0���C�4�C�T�J�����K�K�� ��K�K��7�#��C�@C��4����(;�<�TW�T\�T\�D����d�H�H�h�.E�.E�c�.J�b�V�b�Y\�Ya�Ya�b��
��9�#6�#6��#:��!�!�a�!�(��&�&�
������$�$�T�Y�Y�/���5�+�+�D�I�I�6�<`�a�D�#'�7�?�t�f�B�K��E����u�e�n�n�T�Y�Y��&E�4��P�b��-�-�������)�)�$�)�)�4�C��"�"�3�8�8�S�X�X�x�7N�7N�s�7S�Y\�Ya�Ya�"�b�5���� r2c	��[/URRVs/sH'n[[R"U5[5PM) sn-$s snf)z�Each status column's poll cadence: its provider's refresh interval.

The STATUS column and columns without an interval ride the base tick;
nothing polls faster than it.
)�_STATUS_POLL_SECONDSr#r�max�refresh_interval)rq�cols  r3rT�CtxTui._poll_intervalssN��%�%�OS�y�y�O_�O_�)
�O_��C��'�'��,�.B�C�O_�)
�
�	
��)
s�.ArZc�J�UR(dURU5 gg)zEKeep one status column live without a full (cursor-resetting) reload.N)r'�_refresh_column�rqrZs  r3rU�CtxTui._poll_column
s���z�z�� � ��'�r2c��[S[URR5-5HnUR	U5 M g�Nrk)�rangervr#rr�r�s  r3r��CtxTui._refresh_statusess3���1�s�4�9�9�#3�#3�4�4�5�E�� � ��'�6r2c�|�XR;agURRU5 URU5 grk)r)�add�_fetch_column_workerr�s  r3r��CtxTui._refresh_columns/���N�N�"�������5�!��!�!�%�(r2c��^^# �UU4Sj[R"TR55n[R"U6IShv�N TR
R
T5 gN !TR
R
T5 f=f7f)zAFetch one column's cells concurrently, painting each as it lands.c3�H># �UHnTRUT5v� M g7frk)�_fetch_cell)r�r�rZrqs  ��r3r��.CtxTui._fetch_column_worker.<locals>.<genexpr>s#����a�?`��t�'�'��U�3�3�?`�s�"N)rrxr#�asyncio�gatherr)�discard)rqrZ�fetchess`` r3r��CtxTui._fetch_column_workersc����	*�a�x�?U�?U�VZ�V_�V_�?`�a�G��.�.�'�*�*�*��N�N�"�"�5�)�
+���N�N�"�"�5�)�s/�B
�AA*�A(�A*�B
�(A*�*B�B
r�c�� # �US:Xa([[R"U5IShv�N5nOlURRUS-
n[R"X5IShv�N=(d SnU(a [XEURR5OSn[R"[[5 URRURURUUSS9 SSS5 gN�N�!,(df   g=f7f)Nrrkr�T)�update_width)r@r�	git_stater#�
column_statusrGrB�
contextlib�suppressrrrF�update_cellr(rI)rqr�rZ�renderedrAr9s      r3r��CtxTui._fetch_cell"s�����A�:�#*��1A�1A�#�1F�+F�#G�H��Y�Y�%�%�e�a�i�0�F��-�-�c�:�:�@�b�D�JN�|�F�$�)�)�2E�2E�F�TV�H��
 �
 �!1�9�
=�� � �,�,����$�.�.�u�5�x�d�
-�
�>�
=�,G�;�>�
=�s:�%D�C9�>D�&C;�'AD�<4C=�0
D�;D�=
D�Dc�r�UR(a&U=RS-
slUR5 ggr�)r'r(rLrzs r3rR�CtxTui._spin0s+���:�:����1�$�����!�r2c��[UR[[5-nSnUHSup4X0R;nUR	SU3[
5nXE(aSU3OS-UlURUS5 MU g)N))rz[1] Contexts)rz	[2] Repos)r�z[3] Archived�#� r��busy)�_SPINNER_FRAMESr(rvr'rar�border_title�	set_class)rq�frame�titles�table_idrgr��tables       r3rL�CtxTui._update_titles5sx���� 3� 3�c�/�6J� J�K��
��
 &�O�H��z�z�)�D��N�N�Q�x�j�>�9�=�E�!&��A�e�W�+�2�!F�E���O�O�D�&�)�	 &r2r�c�Z�URRU5 UR5 grk)r'r�rL)rqr�s  r3�_start_busy�CtxTui._start_busyBs���
�
���x� ����r2c�X�URR5 UR5 grk)r'rwrLrzs r3�_finish_busy�CtxTui._finish_busyFs���
�
�������r2c�~�URUR4HnURULdMUs $ UR$rk)rJrK�focusedrF�rqr�s  r3�
_active_table�CtxTui._active_tableJs<���'�'��)=�)=�>�E��|�|�u�$���?��#�#�#r2r�c��URS:XagUR[URS55RR
$)Nr)r~�coordinate_to_cell_keyr�
cursor_row�row_keyrir�s  r3�
_selected_key�CtxTui._selected_keyPs;���?�?�a����+�+�J�u�7G�7G��,K�L�T�T�Z�Z�Zr2c���URUR5nUcg[R"URU5$![
a UR
5 gf=f)zIResolve the cursor's context from disk; reloads and yields None if stale.N)r�rFr�find_contextr#�LookupErrorrN�rqr�s  r3�_selected_context�CtxTui._selected_contextUsW��� � ��!5�!5�6���;��	��(�(����C�8�8���	��L�L�N��	��� A�A�Ac���URUR5nUcg[R"URU5$![
a UR
5 gf=f)zPResolve the archived panel's cursor from disk; reloads and yields None if stale.N)r�rKr�
find_archivedr#r�rNr�s  r3�_selected_archived�CtxTui._selected_archivedasW��� � ��!5�!5�6���;��	��)�)�$�)�)�S�9�9���	��L�L�N��	�r��action�
parameters.c�z�U[;a1UR(d[UR[5(agg)zJCentrally disable mutating actions while a worker runs or a popup is open.NT)�_MUTATING_ACTIONSr'�
isinstance�screenr)rqr�r�s   r3�check_action�CtxTui.check_actionls(���&�&�D�J�J�*�T�[�[�R]�:^�:^��r2r_c�T�URSS5(aUR5 gg)NrIr))r��action_openrzs r3�_context_selected�CtxTui._context_selectedrs(�����V�R�(�(�����)r2rec�T�URSS5(aUR5 gg)NrHr))r��
action_newrzs r3�_repo_selected�CtxTui._repo_selectedxs$�����U�B�'�'��O�O��(r2rhc�T�URSS5(aUR5 gg)NrMr))r��_open_archivedrzs r3�_archived_selected�CtxTui._archived_selected}s&�����[�"�-�-����!�.r2c�8�URR5 grk)rFrPrzs r3�action_focus_contexts�CtxTui.action_focus_contexts�������"�"�$r2c�8�URR5 grk)rJrPrzs r3�action_focus_repos�CtxTui.action_focus_repos�s�������!r2c�8�URR5 grk)rKrPrzs r3�action_focus_archived�CtxTui.action_focus_archived�r�r2�stepc���URURUR/nURUR	55nX#U-[U5-R
5 grk)rFrJrKrZr�rvrP)rqr��tablesr�s    r3�_cycle_panel�CtxTui._cycle_panel�sS��#'�#7�#7��9J�9J�D�L`�L`�"a���,�,�t�1�1�3�4���$��#�f�+�-�.�4�4�6r2c�&�URS5 gr��r�rzs r3�action_next_panel�CtxTui.action_next_panel�s�����!�r2c�&�URS5 g)N�����rrzs r3�action_prev_panel�CtxTui.action_prev_panel�s�����"�r2c��UR5nUcgURR5(d%UR[	UR
55 g[
5 URRU5 SSS5 UR(aUR5 gg!,(df   N1=f![[R4a-nUR[[U555 SnAgSnAff=frk)r�r$�can_open_in_place�exitr&r(rZrIr#�
subprocess�CalledProcessError�push_screenr�r/r%�rqr��excs   r3r��CtxTui.action_open�s����$�$�&���;���y�y�*�*�,�,��I�I�k�#�(�(�+�,��	�!�#��	�	���s�#�$�
����I�I�K��$�#�� �*�"?�"?�@�	����[��S��2�3���	�s6�
B<�$B+�B<�+
B9�5B<�9B<�<D�#C>�>Dc��UR5nXRLaURUR5$[R"UR
5nUbU$XRLa UR5nUbUR$OUR5nUbUR$URUR5$)z�The target repo: the hovered repo on the repos panel, else the default.

With no default set, fall back to the hovered row's repo.
)
r�rJr�rr�r#rFr�r7r�)rq�activerrr�s    r3�
_repo_for_new�CtxTui._repo_for_new�s���
�#�#�%���&�&�&��%�%�d�&7�&7�8�8��$�$�T�Y�Y�/�����N��)�)�)��(�(�*�C����x�x����)�)�+�C����x�x���!�!�$�"3�"3�4�4r2c��^^�TR5mTcTR[S55 gS[S-SS4UU4SjjnTRTR	T5U5 g)N�'no repos registered; press a to add oner(r:c�<>�U(aTRTUS5 ggrk��_create)r(r7rqs ��r3�named� CtxTui.action_new.<locals>.named�s�������T�4��.�r2�rrr�r/�_name_prompt�rqrr7s` @r3r��CtxTui.action_new�sf����!�!�#���<����[�)R�S�T��	/��d�
�	/�t�	/�	/�	
����*�*�4�0�%�8r2c��^^�TR5mTcTR[S55 gS[S-SS4UU4SjjnTRTR	T5U5 g)Nrr(r:c�>^�T(dgS[S-SS4UUU4SjjnTR[ST3S5U5 g)Nr8r:c�<>�U(aTRTTU5 ggrkr)r8r(r7rqs ���r3�based�9CtxTui.action_new_from_base.<locals>.named.<locals>.based�s�����L�L��t�T�2�r2zBase branch for �branch�r/rrb)r(r"r7rqs` ��r3r�*CtxTui.action_new_from_base.<locals>.named�sG�����
3�C�$�J�
3�4�
3�
3�
���\�,<�T�F�*C�X�N�PU�Vr2rrs` @r3�action_new_from_base�CtxTui.action_new_from_base�sj����!�!�#���<����[�)R�S�T��	W��d�
�	W�t�	W�	W�	
����*�*�4�0�%�8r2r7c�^�[SU3S[R"UR55$)NzNew context for r()rbr�random_namer#)rqr7s  r3r�CtxTui._name_prompt�s+���.�t�f�5�v�x�?S�?S�TX�T]�T]�?^�_�_r2r(r8c���URR5(dUR[XU55 gUR	S5 URXU5 g)zFCreate in the background if we can stay running, else exit to the CLI.Nr)r$rr	r5r��_create_worker)rqr7r(r8s    r3r�CtxTui._create�sI���y�y�*�*�,�,��I�I�j��T�2�3������$����D��-r2c���# �[R"URXU5IShv�NnUR5 UR5 [5 URRU05 SSS5 UR"(aUR%5 ggNw![[[
[R4a=nUR5 UR[[U555 SnAgSnAff=f!,(df   N�=f![ [R4a-nUR[[U555 SnAgSnAff=f7frk)r�create_contextr#�
ValueError�FileExistsError�FileNotFoundErrorr
rr�rr�r/rNrZr$rIr#r%r	)rqr7r(r8r�rs      r3r-�CtxTui._create_worker�s���
	� �/�/��	�	�4�t�L�L�C�	
��������	�!�#��	�	���s�B�'�$�
����I�I�K��%M������)�)�	
�	�
�������[��S��2�3���	��$�#�� �*�"?�"?�@�	����[��S��2�3���	�s��E"�%B#�B!�B#� E"�
D�D�6D�>#E"�!B#�#$D�3C?�:E"�?D�E"�
D�D�E"�D�E�2#E�E"�E�E"c�.�UR5URLagURUR5nUcg[R"UR
5n[R"UR
X:XaSOU5 UR5 g)z9Toggle the selected repo as the default for new contexts.N)r�rJr�rr�r#rPrN)rqr(r�s   r3�action_set_default_repo�CtxTui.action_set_default_repo�sq������t�'8�'8�8���!�!�$�"3�"3�4���<���$�$�T�Y�Y�/��
���t�y�y�$�/�$�t�L����r2c�d^�S[S-SS4U4SjjnTR[SS5U5 g)N�urlr:c�Z>�U(a#TRS5 TRU5 gg�Nr)r��_add_repo_worker)r9rqs �r3�	submitted�)CtxTui.action_add_repo.<locals>.submitteds'����� � ��)��%�%�c�*�r2r�z	clone URLr%)rqr=s` r3�action_add_repo�CtxTui.action_add_repos3���	+�3��:�	+�$�	+�
	
����j�+�>�	�Jr2r9c��8# �[R"URU5IShv�N UR5 UR5 gN%![[R
4a-nUR
[[U555 SnANeSnAff=f7frk)rrLr#r2r
rrr�r/rNr�)rqr9rs   r3r<�CtxTui._add_repo_workersr���	4��.�.����C�0�0�0�	
��������	
1����!>�!>�?�	4����[��S��2�3�3��	4�s=�B�$A�A�A�!B�A�B�*#B�
B�B�Bc��UR5URLagUR5nUcgURS5 UR	USS9 g)Nr�F��
open_after)r�rKr�r��_unarchive_worker�rqr�s  r3�action_unarchive�CtxTui.action_unarchivesS������t�';�';�;���%�%�'���;������$����s�u��5r2c��UR5nUcgURR5(dG[R"UR
U5 UR[UR55 gURS5 URUSS9 g![a-nUR[[U555 SnAgSnAff=f)z@Enter on an archived context: unarchive it and open its session.Nr�TrD)r�r$rr�unarchive_contextr#�OSErrorrr�r/r	r&r(r�rFr
s   r3r��CtxTui._open_archived!s����%�%�'���;���y�y�*�*�,�,�
��*�*�4�9�9�c�:�
�I�I�k�#�(�(�+�,������$����s�t��4��
�
�� � ��S��X�!6�7���
�s�!B�
C�'#C�C)�threadrEc	�(�[R"URU5nUR
UR5 UR
UR5 U(dg[5 URRU5 SSS5 UR (aUR
UR"5 gg![[R
4aSnUR
UR5 UR
UR[[U555 SnAgSnAff=f!,(df   N�=f![[R
4a8nUR
UR[[U555 SnAgSnAff=frk)rrKr#rLr
r�call_from_threadr�rr�r/rNrZr$rIr#r%r	)rqr�rE�restoredrs     r3rF�CtxTui._unarchive_worker1s%��	��1�1�$�)�)�S�A�H�
	
���d�l�l�+����d�/�/�0���	�!�#��	�	���x�(�$�
����!�!�$�)�)�,�����6�6�7�	��!�!�$�"3�"3�4��!�!�$�"2�"2�K��C��4I�J���	��$�#�� �*�"?�"?�@�	��!�!�$�"2�"2�K��C��4I�J���	�sN�!B>�"
D?�,D.�D?�>D+�A	D&�&D+�.
D<�8D?�<D?�?F�.F�Fc�^�TR5TRLag[R"TR5nU(dgS[
S-SS4U4SjjnS[
U5S3nTR[US5U5 g)N�emptyr:c�X>�U(a"TRS5 TR5 gg)Nr�)r��_empty_archive_worker)rTrqs �r3�	confirmed�.CtxTui.action_empty_archive.<locals>.confirmedMs%����� � ��,��*�*�,�r2zPermanently delete all z archived context(s)?r�)	r�rKrr�r#�boolrvrr�)rqr�rWr�s`   r3�action_empty_archive�CtxTui.action_empty_archiveFsz�������t�';�';�;���)�)�$�)�)�4����	-�T�D�[�	-�T�	-�
,�C��M�?�:O�P������w��8�)�Dr2c	�<�[R"UR5 UR	UR5 UR	UR5 g![a8nUR	UR
[
[U555 SnANtSnAff=frk)
rrNr#rLrPrr�r/rNr�)rqrs  r3rV�CtxTui._empty_archive_workerUsx��	K��"�"�4�9�9�-�	
���d�l�l�+����d�/�/�0���	K��!�!�$�"2�"2�K��C��4I�J�J��	K�s� A�
B�#.B�Bc�b�UR5nXRLaUR5 gXRLa2UR	5nUbURUSUR5 ggXRLa2UR5nUbURUSUR5 ggg)Nr�r)
r�rJ�_delete_reporKr��_confirm_delete�_delete_archived_workerrFr��_delete_context_worker)rqrr�s   r3�
action_delete�CtxTui.action_delete^s����#�#�%���&�&�&�����
�+�+�
+��)�)�+�C����$�$�S�*�d�6R�6R�S��
�+�+�
+��(�(�*�C����$�$�S�*�d�6Q�6Q�R��,r2r��workerc�^^^^�/n[R"T5(aURS5 [R"T5(aURS5 U(a$TRSSRU5S3nSnOSTRS3nS	nS
[S-SS4UUUU4SjjnTR[XV5U5 g)
Nzuncommitted changeszunpushed commitsz has z and z. Permanently delete anyway?zForce deletezPermanently delete r�r�rJr:c�H>�U(aTRT5 T"T5 ggrk)r�)rJr�r�rqres ����r3rW�)CtxTui._confirm_delete.<locals>.confirmedzs ����� � ��'��s��r2)	r�is_dirty�append�unpushed_commits�	qualifiedr�rYrr�)rqr�r�re�problemsr�r�rWs````    r3r`�CtxTui._confirm_deleteks���������S�!�!��O�O�1�2��$�$�S�)�)��O�O�.�/������u�W�\�\�(�-C�,D�D`�a�G�"�E�+�C�M�M�?�!�<�G��E�	�d�T�k�	�d�	�	�
	
����w�6�	�Br2c	�(�[R"U5 URUR5 URUR5 g![a8nURUR[[
U555 SnANtSnAff=frk)	r�remove_contextrLrPrr�r/rNr�r
s   r3ra�CtxTui._delete_archived_worker�st��	K��#�#�C�(�	
���d�l�l�+����d�/�/�0���	K��!�!�$�"2�"2�K��C��4I�J�J��	K�s�A�
B�.B�Bc�2^�URTU4Sj5 g)Nc�0>�[R"T5$rk)rrp)r�s�r3rs�/CtxTui._delete_context_worker.<locals>.<lambda>�s���H�$;�$;�C�$@r2��	_teardownrGs `r3rb�CtxTui._delete_context_worker�s������s�@�Ar2c�D�[R"UR5 g)z;Finish any context deletions a previous run left half-done.N)r�sweep_deletingr#rzs r3rO�CtxTui._sweep_worker�s��	����	�	�*r2c��UR5URLagUR5nUcgURU5 grk)r�rFr��_open_pr_workerrGs  r3�action_open_pr�CtxTui.action_open_pr�s@������t�';�';�;���$�$�&���;�����S�!r2c	�"�[R"/SQURSSS9n[R"[R"UR
R
55URSSS9nURS:waIURR
5=(d SnURUR[U55 gg![a8nURUR[[U555 SnAgSnAff=f)N)�git�remotezget-url�originT)�cwd�capture_output�textrzcould not open the PR)r
�run�pathr�pr_view_command�stdoutrrLrPrr�r/�
returncode�stderr)rqr�r��resultrr�s      r3r|�CtxTui._open_pr_worker�s���	��^�^�6�C�H�H�UY�`d��F� �^�^��%�%�f�m�m�&9�&9�&;�<��H�H�#��	�F�����!��m�m�)�)�+�F�/F�G��!�!�$�"2�"2�K��4H�I�"���	��!�!�$�"2�"2�K��C��4I�J���	�s�A0C�
D�.D	�	Dc��UR5URLagUR5nUcgURS5 UR	U5 g)z@Archive the selected context straight away; it is cheap to undo.Nr)r�rFr�r��_archive_workerrGs  r3�action_archive�CtxTui.action_archive�sN������t�';�';�;���$�$�&���;������$����S�!r2c�6^^�TRTUU4Sj5 g)Nc�F>�[R"TRT5$rk)r�archive_contextr#)r�rqs��r3rs�(CtxTui._archive_worker.<locals>.<lambda>�s���H�$<�$<�T�Y�Y��$Lr2rurGs``r3r��CtxTui._archive_worker�s������s�L�Mr2rzc	���URRU5(a1URRU5(aURU5 U"5 URRU5(aURR	U5 URUR5 URUR5 g!URRU5(aURR	U5 ff=f![
[R4a8nURUR[[U555 SnAN�SnAff=frk)r$�existsrm�_switch_away�killrLr
rrPrr�r/rNr�)rqr�rzrs    r3rv�CtxTui._teardown�s��	K��y�y����$�$����)=�)=�c�)B�)B��!�!�#�&�

(����9�9�#�#�C�(�(��I�I�N�N�3�'�	
���d�l�l�+����d�/�/�0���9�9�#�#�C�(�(��I�I�N�N�3�'�)����6�6�7�	K��!�!�$�"2�"2�K��C��4I�J�J��	K�s0�AD�C
�;D�
>D�D�E �(.E�E c���[R"UR5H�nURUR:Xd URRU5(dM?[R"[[R5 [5 URRU5 SSS5 SSS5  g g!,(df   N=f!,(df   M�=f)z=Re-point the client at the most recent other running session.N)
rrxr#r(r$r�r�r�r#r
rrZrI)rqr��others   r3r��CtxTui._switch_away�s����+�+�D�I�I�6�E��z�z�S�X�X�%�T�Y�Y�-=�-=�e�-D�-D���$�$�%5�z�7T�7T�U�%�'��I�I�N�N�5�)�(��V�U�7�(�'��V�U�s$�	C�C�0	C�
C�C�
C&	c�^^�TRTR5mTcgS[S-SS4UU4SjjnSTS3nTR[	US5U5 g)NrJr:c�Z>�U(a#TRS5 TRT5 ggr;)r��_delete_repo_worker)rJr(rqs ��r3rW�&CtxTui._delete_repo.<locals>.confirmed�s'����� � ��)��(�(��.�r2z
Remove repo 'z'? Its contexts are left alone.�Remove)r�rJrYrr�)rqrWr�r(s`  @r3r_�CtxTui._delete_repo�se����!�!�$�"3�"3�4���<��	/�d�T�k�	/�d�	/�	/�
"�$��'F�G������w��9�9�Er2c	�^�[R"URU5 UR
UR5 UR
UR5 g![[R
4a8nUR
UR[[U555 SnAN�SnAff=frk)r�remove_repor#rLr
rrPrr�r/rNr�)rqr(rs   r3r��CtxTui._delete_repo_worker�s���	K����d�i�i��.�	
���d�l�l�+����d�/�/�0����6�6�7�	K��!�!�$�"2�"2�K��C��4I�J�J��	K�s�!A�B,�4.B'�'B,c���URbgUR5nXlXRLn/UlURHmnUR
R=(d SnURUR
5nU(a
USSU3OUnURRXFU45 Mo URS[5nSUlSUlUR5 g)Nr�rkr��#filterT)
r*r�rJr+�ordered_rowsr�ri�get_rowrjrarrFrP)rqr��	with_repor6r��cells�haystack�filter_inputs        r3�
action_filter�CtxTui.action_filter�s������*���"�"�$��#���!2�!2�2�	�����%�%�C��'�'�-�-�%�2�C��M�M�#�'�'�*�E�.7�%��(��1�S�E�*�S�H����$�$�c�U�%;�<�	&�
�~�~�i��7�����#������r2c�V�SUl/UlSURS[5lg)NFr�)r*r+rarrFrzs r3ru�CtxTui._drop_filters%��"������38����y�%�(�0r2c�<�URnUcgURU5nURnUR5 UR	5 UHupEnUR
"USU06 M UbUR
URU5S9 UR5 g)zERestore the full panel, keeping the cursor on the filtered selection.Nr�rp)	r*r�r+rurwr|r�
get_row_indexrP)rqr��selected�rowsr��	_haystackr�s       r3�action_dismiss_filter�CtxTui.action_dismiss_filters����#�#���=���%�%�e�,��� � ������
���
�%)�!�C�E��M�M�5�*�c�*�&*������%�"5�"5�h�"?��@�
���
r2c�\�URnUbURURU-S9 gg)Nrp)r*rr�)rqr�r�s   r3�action_filter_cursor�CtxTui.action_filter_cursors4���#�#�������%�"2�"2�T�"9��:�r2r�r}c���URnUcgUR5 URH5up4n[URU5(dM#UR
"USU06 M7 g)Nr�)r*rwr+r�rir|)rqr}r�r�r�r�s      r3�_filter_changed�CtxTui._filter_changedsU���#�#���=��
���
�$(�$5�$5� �C�5��E�K�K��2�2��
�
�u�.�#�.�%6r2c��URnUbURU5cgUR5 XRLaUR	5 gXR
LaUR
5 gUR5 grk)r*r�r�rJr�rKr�r�r�s  r3�_filter_submitted�CtxTui._filter_submitted%sm���#�#���=�D�.�.�u�5�=���"�"�$��%�%�%����!�
�*�*�
*��#�#�%��"�"�$r2c�$�UR5 grk)rNrzs r3�action_refresh�CtxTui.action_refresh2s�����r2c�z�UR[UR5R=(d S55 g)Nr)rr�r�rwrzs r3�action_help�CtxTui.action_help5s)������D�$6�$6�$8�$;�$;�$I�z�J�Kr2c�\�UR5nURURS-S9 g�Nrkrp�r�rr�r�s  r3�action_cursor_down�CtxTui.action_cursor_down8�,���"�"�$��
���e�.�.��2��3r2c�\�UR5nURURS-
S9 gr�r�r�s  r3�action_cursor_up�CtxTui.action_cursor_up<r�r2c�>�UR5RSS9 g)Nrrp)r�rrzs r3�action_cursor_top�CtxTui.action_cursor_top@s������(�(�Q�(�/r2c�\�UR5nURURS-
S9 gr�)r�rr~r�s  r3�action_cursor_bottom�CtxTui.action_cursor_bottomCs*���"�"�$��
���e�o�o��1��2r2)
r'r#r%r)r+r*r$r(rIr")Fr�)mr+r,r-r.r�rrrYr0�CSSrrfrr"rm�dictr/r/r
r{r\�propertyrr	rFrJrKrN�list�floatrT�intrUr�r�rr�r!r�rRrLr�r��	_AnyTabler�r�r�r�rG�objectr�r
�RowSelectedr�r�r�r�r�r�r�rrr�rr�r'rbrrr-r6r?r<rHr�rFrZrVrcrr`rarbrOr}r|r�r�rvr�r_r�r�rur�r�r�Changedr�r�r�r�r�r�r�r�r�r1r�r�s@r3rr*s@���D�.3��H�T�N�2�J�C�Z	��%�E�2���]��/���%�E�2�#���_�5�1����8��=�#������S�A���&�u�t�<���\��.���\��.���]��/���[�u�-���\��.���_�5�1�!�H�h��&A�F�A��A�D�A�UY�A�A�

�4��S��>�

�
��
�O�&�6��3��:�!6�6��6��3�i��n�3��3��6��3��6��6�'!�R
��e��
�(�#�(�$�(�
(�)�S�)�T�)�
�*��*��*�
�*��W��S��T��"�
*��C��D���$�y�$�[�9�[��t��[�

�7�T�>�
�	�G�d�N�	��3��E�&�#�+�4F��4�RV�;���	���{�+��,��
�	���x�(��)���	���{�+�"�,�"�%�"�%�7��7��7�
��� 5�s�T�z�5�*
9�9�$`��`��`�.�C�.�s�.�#��*�.��.�
����C��s�T�z��d��
��.	�K�
��#��$��
��6�5� 
���-�W�-�$�-�4�-��-�(
E�
���1��1�S�C��C�#&�C�08�'��F�9J�0K�C�	
�C�,
���1�7�1�t�1��1�
���B�'�B�d�B��B�
���+��+�"�
���J�7�J�t�J��J�$"�
���N�7�N�t�N��N�1�W�1�h�r�6�z�.B�1�t�1�(���D��F�
���1��1��1��1��$9�

�;��;��;�
��
�
�y�!�/�U�]�]�/�t�/�"�/������#�
%�$�
%��L�4�4�0�3�3r2r)Vr�r�rSr
�collections.abcrr�dataclassesr�	functoolsr�typingrr�	rich.textr	�textualr
r�textual.apprr
�textual.bindingr�textual.containersrr�textual.coordinater�textual.css.queryr�textual.screenr�textual.widgetsrrrrr�textual.widgets.data_tablerr�rrrr�
ctx.configrrr �ctx.contextsr!�ctx.multiplexerr"r#r&r5�Requestr�r�r/r�r@rYrG�	frozensetr��contextmanagerrZr]rGr0r`rbr�r�r�r�r�r�r�r�r�r�r�rr)r2r3�<module>r�s�����	��.�!�� ���*�#�3�)�'�&�C�C�7�.�.�2�2� �9��$�������$�������
�
"������
�c�N�Y�s�T�z�2�2�	�6�#�6�$��*�6�<��<�S�<�T�<�d�S�j�<��
������
�(�4�.�
��
���.�U�;��M�/�e�<�-��e�G�S�L�)���F�$�5�1��G�%�E�2�,��U�7�C�<�(���;�s�T�z�*��6�+�d�#��.���!>��D��e�E�#�s�(�O�S�$8�9�9�:��4	����T�"��.�K��%��@4��4�3�4�4�4��%��	�I�c�D�j�)�	���3���	�I�c�N�	�[3�S��4��
 �[3r2