
    ;OOf|              	          d dl mZmZ 	 d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZ dZdZdZdZdZd	Zd
Zi dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*Zd+d,j)                   ed-d.      D  cg c]
  }  e|        c}       z   Zd/Zd0d1ez   d2z   d3ez   d4z   gZ G d5 d6      ZdAd7Zd8 Zd9 Zd: Z G d; d<      Z e       a 	 	 dBd=Z! G d> d?      Z"d@ Z#yc c} w )C    )divisionprint_functionN)utila2  
// Urwid web (CGI/Asynchronous Javascript) display module
//    Copyright (C) 2004-2005  Ian Ward
//
//    This library is free software; you can redistribute it and/or
//    modify it under the terms of the GNU Lesser General Public
//    License as published by the Free Software Foundation; either
//    version 2.1 of the License, or (at your option) any later version.
//
//    This library is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//    Lesser General Public License for more details.
//
//    You should have received a copy of the GNU Lesser General Public
//    License along with this library; if not, write to the Free Software
//    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//
// Urwid web site: http://excess.org/urwid/

colours = new Object();
colours = {
    '0': "black",
    '1': "#c00000",
    '2': "green",
    '3': "#804000",
    '4': "#0000c0",
    '5': "#c000c0",
    '6': "teal",
    '7': "silver",
    '8': "gray",
    '9': "#ff6060",
    'A': "lime",
    'B': "yellow",
    'C': "#8080ff",
    'D': "#ff40ff",
    'E': "aqua",
    'F': "white"
};

keycodes = new Object();
keycodes = {
    8: "backspace", 9: "tab", 13: "enter", 27: "esc",
    33: "page up", 34: "page down", 35: "end", 36: "home",
    37: "left", 38: "up", 39: "right", 40: "down",
    45: "insert", 46: "delete",
    112: "f1", 113: "f2", 114: "f3", 115: "f4",
    116: "f5", 117: "f6", 118: "f7", 119: "f8",
    120: "f9", 121: "f10", 122: "f11", 123: "f12"
    };

var conn = null;
var char_width = null;
var char_height = null;
var screen_x = null;
var screen_y = null;

var urwid_id = null;
var send_conn = null;
var send_queue_max = 32;
var send_queue = new Array(send_queue_max);
var send_queue_in = 0;
var send_queue_out = 0;

var check_font_delay = 1000;
var send_more_delay = 100;
var poll_again_delay = 500;

var document_location = null;

var update_method = "multipart";

var sending = false;
var lastkeydown = null;

function setup_connection() {
    if (window.XMLHttpRequest) {
        conn = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        conn = new ActiveXObject("Microsoft.XMLHTTP");
    }

    if (conn == null) {
        set_status("Connection Failed");
        alert( "Can't figure out how to send request." );
        return;
    }
    try{
        conn.multipart = true;
    }catch(e){
        update_method = "polling";
    }
    conn.onreadystatechange = handle_recv;
    conn.open("POST", document_location, true);
    conn.setRequestHeader("X-Urwid-Method",update_method);
    conn.setRequestHeader("Content-type","text/plain");
    conn.send("window resize " +screen_x+" "+screen_y+"\n");
}

function do_poll() {
    if (urwid_id == null){
        alert("that's unpossible!");
        return;
    }
    if (window.XMLHttpRequest) {
        conn = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        conn = new ActiveXObject("Microsoft.XMLHTTP");
    }
    conn.onreadystatechange = handle_recv;
    conn.open("POST", document_location, true);
    conn.setRequestHeader("X-Urwid-Method","polling");
    conn.setRequestHeader("X-Urwid-ID",urwid_id);
    conn.setRequestHeader("Content-type","text/plain");
    conn.send("eh?");
}

function handle_recv() {
    if( ! conn ){ return;}
    if( conn.readyState != 4) {
        return;
    }
    if( conn.status == 404 && urwid_id != null) {
        set_status("Connection Closed");
        return;
    }
    if( conn.status == 403 && update_method == "polling" ) {
        set_status("Server Refused Connection");
        alert("This server does not allow polling clients.\n\n" +
            "Please use a web browser with multipart support " +
            "such as Mozilla Firefox");
        return;
    }
    if( conn.status == 503 ) {
        set_status("Connection Failed");
        alert("The server has reached its maximum number of "+
            "connections.\n\nPlease try again later.");
        return;
    }
    if( conn.status != 200) {
        set_status("Connection Failed");
        alert("Error from server: "+conn.statusText);
        return;
    }
    if( urwid_id == null ){
        urwid_id = conn.getResponseHeader("X-Urwid-ID");
        if( send_queue_in != send_queue_out ){
            // keys waiting
            do_send();
        }
        if(update_method=="polling"){
            set_status("Polling");
        }else if(update_method=="multipart"){
            set_status("Connected");
        }

    }

    if( conn.responseText == "" ){
        if(update_method=="polling"){
            poll_again();
        }
        return; // keepalive
    }
    if( conn.responseText == "Z" ){
        set_status("Connection Closed");
        update_method = null;
        return;
    }

    var text = document.getElementById('text');

    var last_screen = Array(text.childNodes.length);
    for( var i=0; i<text.childNodes.length; i++ ){
        last_screen[i] = text.childNodes[i];
    }

    var frags = conn.responseText.split("\n");
    var ln = document.createElement('span');
    var k = 0;
    for( var i=0; i<frags.length; i++ ){
        var f = frags[i];
        if( f == "" ){
            var br = document.getElementById('br').cloneNode(true);
            ln.appendChild( br );
            if( text.childNodes.length > k ){
                text.replaceChild(ln, text.childNodes[k]);
            }else{
                text.appendChild(ln);
            }
            k = k+1;
            ln = document.createElement('span');
        }else if( f.charAt(0) == "<" ){
            line_number = parseInt(f.substr(1));
            if( line_number == k ){
                k = k +1;
                continue;
            }
            var clone = last_screen[line_number].cloneNode(true);
            if( text.childNodes.length > k ){
                text.replaceChild(clone, text.childNodes[k]);
            }else{
                text.appendChild(clone);
            }
            k = k+1;
        }else{
            var span=make_span(f.substr(2),f.charAt(0),f.charAt(1));
            ln.appendChild( span );
        }
    }
    for( var i=k; i < text.childNodes.length; i++ ){
        text.removeChild(last_screen[i]);
    }

    if(update_method=="polling"){
        poll_again();
    }
}

function poll_again(){
    if(conn.status == 200){
        setTimeout("do_poll();",poll_again_delay);
    }
}


function load_web_display(){
    if( document.documentURI ){
        document_location = document.documentURI;
    }else{
        document_location = document.location;
    }

    document.onkeypress = body_keypress;
    document.onkeydown = body_keydown;
    document.onresize = body_resize;

    body_resize();
    send_queue_out = send_queue_in; // don't queue the first resize

    set_status("Connecting");
    setup_connection();

    setTimeout("check_fontsize();",check_font_delay);
}

function set_status( status ){
    var s = document.getElementById('status');
    var t = document.createTextNode(status);
    s.replaceChild(t, s.firstChild);
}

function make_span(s, fg, bg){
    d = document.createElement('span');
    d.style.backgroundColor = colours[bg];
    d.style.color = colours[fg];
    d.appendChild(document.createTextNode(s));

    return d;
}

function body_keydown(e){
    if (conn == null){
        return;
    }
    if (!e) var e = window.event;
    if (e.keyCode) code = e.keyCode;
    else if (e.which) code = e.which;

    var mod = "";
    var key;

    if( e.ctrlKey ){ mod = "ctrl " + mod; }
    if( e.altKey || e.metaKey ){ mod = "meta " + mod; }
    if( e.shiftKey && e.charCode == 0 ){ mod = "shift " + mod; }

    key = keycodes[code];

    if( key != undefined ){
        lastkeydown = key;
        send_key( mod + key );
        stop_key_event(e);
        return false;
    }
}

function body_keypress(e){
    if (conn == null){
        return;
    }

    if (!e) var e = window.event;
    if (e.keyCode) code = e.keyCode;
    else if (e.which) code = e.which;

    var mod = "";
    var key;

    if( e.ctrlKey ){ mod = "ctrl " + mod; }
    if( e.altKey || e.metaKey ){ mod = "meta " + mod; }
    if( e.shiftKey && e.charCode == 0 ){ mod = "shift " + mod; }

    if( e.charCode != null && e.charCode != 0 ){
        key = String.fromCharCode(e.charCode);
    }else if( e.charCode == null ){
        key = String.fromCharCode(code);
    }else{
        key = keycodes[code];
        if( key == undefined || lastkeydown == key ){
            lastkeydown = null;
            stop_key_event(e);
            return false;
        }
    }

    send_key( mod + key );
    stop_key_event(e);
    return false;
}

function stop_key_event(e){
    e.cancelBubble = true;
    if( e.stopPropagation ){
        e.stopPropagation();
    }
    if( e.preventDefault  ){
        e.preventDefault();
    }
}

function send_key( key ){
    if( (send_queue_in+1)%send_queue_max == send_queue_out ){
        // buffer overrun
        return;
    }
    send_queue[send_queue_in] = key;
    send_queue_in = (send_queue_in+1)%send_queue_max;

    if( urwid_id != null ){
        if (send_conn == undefined || send_conn.ready_state != 4 ){
            send_more();
            return;
        }
        do_send();
    }
}

function do_send() {
    if( ! urwid_id ){ return; }
    if( ! update_method ){ return; } // connection closed
    if( send_queue_in == send_queue_out ){ return; }
    if( sending ){
        //var queue_delta = send_queue_in - send_queue_out;
        //if( queue_delta < 0 ){ queue_delta += send_queue_max; }
        //set_status("Sending (queued "+queue_delta+")");
        return;
    }
    try{
        sending = true;
        //set_status("starting send");
        if( send_conn == null ){
            if (window.XMLHttpRequest) {
                send_conn = new XMLHttpRequest();
            } else if (window.ActiveXObject) {
                send_conn = new ActiveXObject("Microsoft.XMLHTTP");
            }
        }else if( send_conn.status != 200) {
            alert("Error from server: "+send_conn.statusText);
            return;
        }else if(send_conn.readyState != 4 ){
            alert("not ready on send connection");
            return;
        }
    } catch(e) {
        alert(e);
        sending = false;
        return;
    }
    send_conn.open("POST", document_location, true);
    send_conn.onreadystatechange = send_handle_recv;
    send_conn.setRequestHeader("Content-type","text/plain");
    send_conn.setRequestHeader("X-Urwid-ID",urwid_id);
    var tmp_send_queue_in = send_queue_in;
    var out = null;
    if( send_queue_out > tmp_send_queue_in ){
        out = send_queue.slice(send_queue_out).join("\n")
        if( tmp_send_queue_in > 0 ){
            out += "\n"  + send_queue.slice(0,tmp_send_queue_in).join("\n");
        }
    }else{
        out = send_queue.slice(send_queue_out,
             tmp_send_queue_in).join("\n");
    }
    send_queue_out = tmp_send_queue_in;
    //set_status("Sending");
    send_conn.send( out +"\n" );
}

function send_handle_recv() {
    if( send_conn.readyState != 4) {
        return;
    }
    if( send_conn.status == 404) {
        set_status("Connection Closed");
        update_method = null;
        return;
    }
    if( send_conn.status != 200) {
        alert("Error from server: "+send_conn.statusText);
        return;
    }

    sending = false;

    if( send_queue_out != send_queue_in ){
        send_more();
    }
}

function send_more(){
    setTimeout("do_send();",send_more_delay);
}

function check_fontsize(){
    body_resize()
    setTimeout("check_fontsize();",check_font_delay);
}

function body_resize(){
    var t = document.getElementById('testchar');
    var t2 = document.getElementById('testchar2');
    var text = document.getElementById('text');

    var window_width;
    var window_height;
    if (window.innerHeight) {
        window_width = window.innerWidth;
        window_height = window.innerHeight;
    }else{
        window_width = document.documentElement.clientWidth;
        window_height = document.documentElement.clientHeight;
        //var z = "CI:"; for(var i in bod){z = z + " " + i;} alert(z);
    }

    char_width = t.offsetLeft / 44;
    var avail_width = window_width-18;
    var avail_width_mod = avail_width % char_width;
    var x_size = (avail_width - avail_width_mod)/char_width;

    char_height = t2.offsetTop - t.offsetTop;
    var avail_height = window_height-text.offsetTop-10;
    var avail_height_mod = avail_height % char_height;
    var y_size = (avail_height - avail_height_mod)/char_height;

    text.style.width = x_size*char_width+"px";
    text.style.height = y_size*char_height+"px";

    if( screen_x != x_size || screen_y != y_size ){
        send_key("window resize "+x_size+" "+y_size);
    }
    screen_x = x_size;
    screen_y = y_size;
}

<         d   i   i @  black0zdark red1z
dark green2brown3z	dark blue4zdark magenta5z	dark cyan6
light gray7z	dark gray8z	light red9zlight greenAyellowBz
light blueCzlight magentaDz
light cyanEwhiteFz ????????????????????????????????        ah  
body {    margin: 8px 8px 8px 8px; border: 0;
    color: black; background-color: silver;
    font-family: fixed; overflow: hidden; }

form { margin: 0 0 8px 0; }

#text { position: relative;
    background-color: silver;
    width: 100%; height: 100%;
    margin: 3px 0 0 0; border: 1px solid #999; }

#page { position: relative;  width: 100%;height: 100%;}
z<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Urwid Web Display - z!</title>
<style type="text/css">
a  
</style>
</head>
<body id="body" onload="load_web_display()">
<div style="position:absolute; visibility:hidden;">
<br id="br"\>
<pre>The quick brown fox jumps over the lazy dog.<span id="testchar">X</span>
<span id="testchar2">Y</span></pre>
</div>
Urwid Web Display - <b>z[</b> -
Status: <span id="status">Set up</span>
<script type="text/javascript">
//<![CDATA[
z7
//]]>
</script>
<pre id="text"></pre>
</body>
</html>
c                       e Zd Zd Z ed       Zd Z	 ddZddZd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd ZddZy)Screenc                 .    i | _         d| _        d| _        y )NTF)palette	has_color_startedselfs    R/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/urwid/web_display.py__init__zScreen.__init__@  s        c                     | j                   S N)r'   r(   s    r*   <lambda>zScreen.<lambda>E  s
    DMM r,   c                     |D ]q  }t        |      dv r | j                  |   t        |      dk(  sJ d       |\  }}|| j                  vrt        d|z        | j                  |   | j                  |<   s y)zRegister a list of palette entries.

        l -- list of (name, foreground, background) or
             (name, same_as_other_name) palette entries.

        calls self.register_palette_entry for each item in l
        )r         zInvalid register_palette usagez palette entry '%s' doesn't existN)lenregister_palette_entryr%   	Exception)r)   litemname	like_names        r*   register_palettezScreen.register_paletteG  s      	9D4yE!+++d4t9>C#CC>"OD), B9 LMM!%i!8DLL	9r,   Nc                 D    |dk(  rd}|dk(  rd}|||f| j                   |<   y)a  Register a single palette entry.

        name -- new entry/attribute name
        foreground -- foreground colour
        background -- background colour
        mono -- monochrome terminal attribute

        See curses_display.register_palette_entry for more info.
        defaultr
   r   N)r%   )r)   r8   
foreground
backgroundmonos        r*   r4   zScreen.register_palette_entryZ  s3     " J"%J(*d;Tr,   c                      y)zNot yet implementedN )r)   enables     r*   set_mouse_trackingzScreen.set_mouse_trackingk      r,   c                      y)zDo nothing.NrA   )r)   argsvargss      r*   tty_signal_keyszScreen.tty_signal_keyso  rD   r,   c                    | j                   rt        j                  |       S t        j                  j                  d      }|j                  d      sJ |       |j                  dd      \  }}}}t        |      }t        |      }| j                  ||       i | _
        d| _        t        j                  d   | _        | j                  dv sJ | j                  dk(  rDt        j                   s4t        j"                  j%                  d	       t        j&                  d       t)        j(                  t        j*                  j-                  t        j.                  d
            }t1        |      t        j2                  k\  r4t        j"                  j%                  d       t        j&                  d       dt5        j6                  d      t5        j6                  d      fz  }t        j*                  j-                  t        j.                  d|z         | _        t        j:                  | j8                  dz   d       t=        j<                  t<        j>                  | j@                         t        jB                  | j8                  dz   t        jD                  t        jF                  z        | _$        d| _%        d|z   dz   | _&        | j                  dk(  rd|z   dz   | _&        t=        j<                  t<        jN                  | jP                         t=        jR                  tT               d| _         t        j                  |       S )z
        This function reads the initial screen size, generates a
        unique id and handles cleanup when fn exits.

        web_display.set_preferences(..) must be called before calling
        this function for the preferences to take effect
        2   window resize  r   r   HTTP_X_URWID_METHOD)	multipartpollingrO   Status: 403 Forbidden

z	urwid*.inzStatus: 503 Sever Busy

z%09d%09di ʚ;urwid.ini  r   zAContent-type: multipart/x-mixed-replace;boundary=ZZ
X-Urwid-ID: z


--ZZ
z&Content-type: text/plain
X-Urwid-ID: z


T)+r'   r   StoppingContextsysstdinread
startswithsplitint_set_screen_sizelast_screenlast_screen_widthosenvironupdate_method_prefsallow_pollingstdoutwriteexitglobpathjoinpipe_dirr3   max_clientsrandom	randrange	pipe_namemkfifosignalSIGTERM_cleanup_pipeopen
O_NONBLOCKO_RDONLYinput_fd
input_tailcontent_headSIGALRM_handle_alarmalarmALARM_DELAY)r)   client_initignore1ignore2xyclientsurwid_ids           r*   startzScreen.starts  st    ==''--iinnR(%%&67CC7)//A6!FFq!%!"ZZ(=>!!%<<<<*63G3GJJ<=HHQK))BGGLLEFw<6---JJ=>HHQKv//6U#% %foogh6FG
		$..&u-fnnT%7%78u 4MMBKK')#$%
 y('() 
 	fnnT%7%78k###D))r,   c                     | j                   sy	 | j                          t        j                  t        j                  t        j
                         | j                          d| _         y# t        $ r Y Uw xY w)z0
        Restore settings and clean up.
        NF)r'   _close_connectionr5   rn   ro   SIG_DFLrp   r(   s    r*   stopzScreen.stop  s^     }}	""$ 	fnnV^^4	  		s   A) )	A54A5c                      y r.   rA   r)   rF   s     r*   set_input_timeoutszScreen.set_input_timeouts  s    r,   c                 |    	 | j                           |       | j                          S # | j                          w xY w)zb
        Run the application main loop, calling start() first
        and stop() on exit.
        )r   r   )r)   fns     r*   run_wrapperzScreen.run_wrapper  s(    
	JJL4IIKDIIKs   ) ;c                 n   | j                   dk(  rY| j                  j                  d       | j                  j                         \  }}|j	                  d       |j                          | j                   dk(  r>t        j                  j                  d       t        j                  j                          y y )Npolling childr   ZrN   z
Z
--ZZ--
)
r_   server_socket
settimeoutacceptsendallcloserT   rb   rc   flush)r)   sockaddrs      r*   r   zScreen._close_connection  s    0))!,++224JD$LLJJL,JJ ! "JJ -r,   c                     | j                   sy 	 t        j                  | j                   dz          t        j                  | j                   dz          y # t        $ r Y y w xY w)NrR   .update)rl   r]   remover5   r   s     r*   rp   zScreen._cleanup_pipe  sL    ~~v	IIdnnU*+IIdnnY./ 		s   AA 	A A c                 R    |t         kD  rt         }|t        kD  rt        }||f| _        y)z&Set the screen size (within max size).N)MAX_COLSMAX_ROWSscreen_size)r)   colsrowss      r*   rZ   zScreen._set_screen_size  s(     (?D(?D:r,   c                    |\  }}|| j                   k7  ri | _        | j                  g}| j                  dk(  r|j                  }n| j                  dk(  r@t        j                  d       	 | j                  j                         \  }}j                  }n0t        j                  d       |j                  } |d       d| _        |j                         |k(  sJ |j                  |j                  \  }	}
ndx}	}
i }d}|j!                         D ]c  }|dz  }t#        |      }g }t%        |      }||
k(  r||	fz   }|j'                  |g       |gz   ||<   | j                  j'                  |d      }|||v r|}n|d   } |d	|z         {d}|D ]  \  }}}|j)                  t*              }|d
\  }}}n| j,                  |   \  }}}||
k(  rp||	k  rkt/        j0                  |dt3        |            }||z   |	kD  r!|j	                  t5        ||||	|z
               n|j	                  t5        |||             ||z  }|j	                  t5        |||               |dj7                  |      dz          f || _        || _         | j                  dk(  r{t        j8                  j;                  dj7                  |             t        j8                  j=                          t        j8                  j?                          | jA                          nt| j                  dk(  rj?                          nT |d       t        j8                  j;                  dj7                  |             t        j8                  j=                          t        j                  tB               y# t        j                  $ r t        j                  d       Y >w xY w)z#Send a screen update to the client.rO   r   r   z
r   N   z<%d
)r
   r   N
z
--ZZ
)"r\   r[   rv   r_   appendrn   ry   r   r   sockettimeoutrT   rd   r   r   cursorcontentlisttupleget	translate_trans_tabler%   r   
calc_widthr3   	code_spanrg   rb   rc   r   r   _fork_childrz   )r)   sizerr   r   sendqsendsr   cxcy
new_screenr   rowr6   sigold_line_numbersold_linecolacsrunfgbgr?   	run_widths                             r*   draw_screenzScreen.draw_screen  s[    t4)))!D""#*<<D?2LL!,,3354 99DLL!<<DL "Dvvx488XXFBNB
99; %	"CFAs)CA*CBwcREk(nnS4s:JsO#//33C>+(( H/2Hgh&(C # 5BmmL19!<JBr$!%aJBr$7sby $QC!"I9}r)3BsF"$ % 3B!789$CHHYsB34!5$ D!K%	"L &!%*JJRWWU^,JJJJ?2GGI JJRWWU^,JJk#Q >> s   *N (OOc                      y)z
        Force the screen to be completely repainted on the next
        call to draw_screen().

        (does nothing for web_display)
        NrA   r(   s    r*   clearzScreen.clearG  s     	r,   c                    t        | j                  dz          t        j                  | j                  dz   t        j                  t        j
                  z        | _        d| _        t        j                  t        j                  t        j                        }|j                  | j                  dz          |j                  d       |j                  t               || _        y)zw
        Fork a child to run CGI disconnected for polling update method.
        Force parent process to exit.
        z.errrR   r   r   r   N)	daemonizerl   r]   rq   rr   rs   rt   r_   r   AF_UNIXSOCK_STREAMbindlistenr   POLL_CONNECTr   )r)   r   s     r*   r   zScreen._fork_childQ  s    
 	4>>6)+u 4MMBKK'),MM&..&*<*<=	y(*		\"r,   c                    | j                   dv sJ | j                   dk(  r/	 | j                  j                         \  }}|j                          n=t        j                  j                  d       t        j                  j                          t        j                  t               y # t        j
                  $ r t        j                  d       Y Dw xY w)N)rN   r   r   r   z


--ZZ
)r_   r   r   r   r   r   rT   rd   rb   rc   r   rn   ry   rz   )r)   r   framer   r   s        r*   rx   zScreen._handle_alarm`  s    !!%BBBB0,,3354	
 JJ/0JJk# >> s   -B& &(CCc                     | j                   S )zReturn the screen size.)r   r(   s    r*   get_cols_rowszScreen.get_cols_rowsp  s    r,   c                 t   g }d}	 t        j                   | j                  gg g d      \  }}}|s|rg g fS g S t	        j
                  | j                  t              }t	        j                  | j                         t	        j                  | j                  dz   t        j                  t        j                  z        | _        |j                  d      }	| j                  |	d   z   |	d<   |	d   | _        |	dd D ]f  }
|
j                  d	      rB|
j                  d
d      \  }}}}t        |      }t        |      }| j!                  ||       d}V|j#                  |
       h |r|j#                  d       |r|g fS |S # t         j                  $ r*}|j                  d   dk(  r|r	g g fcY d}~S g cY d}~S  d}~ww xY w)zReturn pending input as a list.Fg      ?r   r1   NrR   r   r   rK   rL   r   Tzwindow resize)selectrt   errorrF   r]   rV   MAX_READr   rq   rl   rr   rs   rX   ru   rW   rY   rZ   r   )r)   raw_keysr6   resizedireadyoreadyereadyekeydatakeyskign1ign2r~   r   s                  r*   	get_inputzScreen.get_inputt  s   		#)==2c$+ F6& "uI''$--2
u 4MMBKK') }}T"//DG+Qr(cr 	A||,- !AT!AFF%%a+	 HH_%b5LI || 	vvayA~b5L		s/   'E: :F7F2$F7*F2+F71F22F7r.   )T)F)__name__
__module____qualname__r+   propertystartedr:   r4   rC   rH   r   r   r   r   r   rp   rZ   r   r   r   rx   r   r   rA   r,   r*   r#   r#   ?  sq    
 12G9( <":*x 	
&X$v$  ,r,   r#   c                 &   t         |   }t         |   }|dk\  rpt        j                  | dt        |       |      \  }}t        j                  | |t        |             }||z   | d | z   dz   |z   |z   | || z   dz   |z   |z   | |d  z   dz   S ||z   | z   dz   S )Nr   r   )_code_coloursr   calc_text_posr3   move_next_char)	r   r   r   r   code_fgcode_bgc_off_ignc2_offs	            r*   r   r     s    R!GR!G{((As1vv>t$$Qs1v67"QvY.5!"51378!"67,.23 	4  1$t++r,   c                 r    | j                  dd      } | j                  dd      } | j                  dd      } | S )z;Escape text so that it will be displayed safely within HTML&z&amp;<z&lt;>z&gt;)replace)texts    r*   html_escaper     s7    <<G$D<<F#D<<F#DKr,   c                  &    dt         j                  v S )z3
    Return True if this is a CGI web request.
    REQUEST_METHOD)r]   r^   rA   r,   r*   is_web_requestr     s     rzz))r,   c                  V   t               syt        j                  d   dk(  rMt        j                  j                  dt        t        j                        j                  t              z          yt        j                  d   dk7  rydt        j                  vryt        j                  d   } t        |       dkD  r t        j                  j                  d	       y| D ]'  }|d
vst        j                  j                  d        y t        j                  j                  dd      dk(  rt        j                  t        j                  t        j                        }	 |j!                  t        j"                  j                  t        j$                  d| z   dz                d|j'                  t(              z   }|r7t        j                  j                  |       |j'                  t(              }|r7y	 t        j,                  t        j"                  j                  t        j$                  d| z   dz         t        j.                        }t        j2                  j5                  t6              }t        j
                  ||j9                  d             t        j:                  |       t        j                  j                  d       y# t        j*                  $ r" t        j                  j                  d       Y yw xY w# t0        $ r" t        j                  j                  d       Y yw xY w)ar  
    Handle short requests such as passing keystrokes to the application
    or sending the initial html page.  If returns True, then this
    function recognised and handled a short request, and the calling
    script should immediately exit.

    web_display.set_preferences(..) should be called before calling this
    function for the preferences to take effect
    Fr   GETzContent-type: text/html

TPOSTHTTP_X_URWID_ID   zStatus: 414 URI Too Long


0123456789rP   rM   NrO   rQ   r   zContent-type: text/plain

zStatus: 404 Not Found

rR   ascii)r   r]   r^   rT   rb   rc   r   r`   app_namerg   
_html_pager3   r   r   r   r   connectrf   rh   recvBUF_SZr   rq   O_WRONLYOSErrorrU   rV   r   encoder   )r   cr   datafdr   s         r*   handle_short_requestr    sW    	zz"#u,

:(--j9: 	;	zz"#v-

*zz+,H
8}R 	

;< L  JJ<= 
zz~~+D1Y>MM&..&*<*<=
	IIrww||FOO *, .5affVnDD

  &vvf~  WWbggll6??HU"$&(kk3 iinnX&GHHRw'(HHRLJJ78% || 	JJ<=	  

89s&   BK 2AK= 2K:9K:=(L('L(c                       e Zd ZdZdZdZdZy)_PreferenceszUnnamed Application/tmpTr   N)r   r   r   r  rh   ra   ri   rA   r,   r*   r  r  
  s    $HHMKr,   r  c                 \    | t         _        |t         _        |t         _        |t         _        y)a  
    Set web_display preferences.

    app_name -- application name to appear in html interface
    pipe_dir -- directory for input pipes, daemon update sockets
                and daemon error logs
    allow_polling -- allow creation of daemon processes for
                     browsers without multipart support
    max_clients -- maximum concurrent client connections. This
               pool is shared by all urwid applications
               using the same pipe_dir
    N)r`   r  rh   ra   ri   )r  rh   ra   ri   s       r*   set_preferencesr    s"     FOFO(F$Fr,   c                       e Zd Zd Zd Zy)ErrorLogc                     || _         y r.   )errfile)r)   r  s     r*   r+   zErrorLog.__init__(  s	    r,   c                 N    t        | j                  d      j                  |       y )Nr   )rq   r  rc   )r)   errs     r*   rc   zErrorLog.write*  s    T\\#$$S)r,   N)r   r   r   r+   rc   rA   r,   r*   r  r  '  s    *r,   r  c                 x   t        j                         }|rt        j                  d       t        j                          t	        j                  t        j
                  t        j                         t        j                  d       t        j                         }|rt        j                  d       t        j                  d       t        dd      D ]  }	 t        j                  |        t        dd      t        _        t        dd      t        _        t!        |       t        _        y# t        $ r Y ew xY w)z-
    Detach process and become a daemon.
    r   /r   z	/dev/nullr   wN)r]   fork_exitsetsidrn   SIGHUPSIG_IGNumaskchdirranger   r  rq   rT   rU   rb   r  stderr)r  pidr  s      r*   r   r   .  s     '')C

IIK
MM&--0HHQK
'')C

HHSMAbk 	HHRL [%CIk#&CJ7$CJ  		s   D--	D98D9)r   )r  Tr   )$
__future__r   r   r]   rT   rn   rj   r   r   re   rQ   r   _js_coderz   r   r   r   r   r  r   rg   r#  chrr   
_css_styler  r#   r   r   r   r  r  r`   r  r  r   )r~   s   0r*   <module>r*     s  , 0 
 
      Pd 	Cs  C	
  3     # S     C!( "''5S>"Ba3q6"BCC
"  	  		
!
8a aH,*GT  
>B%** *%{ #Cs   C*
