Your IP : 13.58.163.45


Current Path : /sbin/
Upload File :
Current File : //sbin/shellinaboxd

ELF>`o@H�@8
@@@@00ppp�� &&&&&�
� ('('&('&PP���  ���DDP�td���44Q�tdR�td&&&&&�	�	/lib64/ld-linux-x86-64.so.2GNU�GNUGNU�28�Fgi#,-e'䉚4�
K��P8!�����ݣk��|ĉ�BE��)�Ĺ�@�qX8�]��|2�����!c�&��������{hU�#+<���' �Z�`��qUC�P�%L9��60��{�l��A���n) mZ�6N6 l@f��W��"�b���4`Jb����l�P�S������)$7�w�R�x��C=���t��{�q���@��z�$��JX0�dXb�G�"�H��Os�~[h�6�����_�=1;���2��9mZ����C�����!�3&��5&�!�3&��3&��3&��3&��3&��3&g@��-�3&��3&#�libz.so.1_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTabledeflatedeflateInit2_deflateEndlibpam_misc.so.0misc_convlibpam.so.0pam_open_sessionpam_close_sessionpam_set_itempam_get_itempam_startpam_acct_mgmtpam_endpam_authenticatelibssl.so.1.1TLS_server_methodSSL_get_servernameSSL_writeSSL_COMP_get_compression_methodsSSL_shutdownSSL_CTX_set_info_callbackSSL_set_SSL_CTXSSL_CTX_newSSL_CTX_use_certificate_ASN1SSL_CTX_callback_ctrlSSL_readOPENSSL_init_sslSSL_set_ex_dataSSL_CTX_check_private_keySSL_CTX_set_optionsSSL_get_errorSSL_set_accept_stateSSL_CTX_freeSSL_set_bioSSL_CTX_ctrlSSL_CTX_set_cipher_listSSL_get_rbioSSL_get_ex_dataSSL_newSSL_CTX_use_PrivateKey_ASN1SSL_freeSSL_ctrlSSL_get_wbiolibcrypto.so.1.1BIO_free_allBIO_nextERR_peek_errorBIO_popX509_freeBIO_new_socketBIO_f_bufferBIO_newd2i_X509BIO_ctrlERR_clear_errorOPENSSL_sk_zeroEC_KEY_freeEC_KEY_new_by_curve_nameBIO_pushlibutil.so.1login_ttyopenptylibc.so.6strcasestrfflush__printf_chksigwaitsetlocalesrandfopenstrncmpoptindstrrchr__longjmp_chkpipeclosedirnanosleep__read_chkinet_ntopsignalforksigprocmaskreaddir_r__stack_chk_failunlinklistenrealloc_exitsocketpairmemchrgetpidkillstrdupstrftimechmodstrtodsetutxentstrtolgetgrnam_rexeclecfsetispeedexeclpgethostbyname_rcallocstrlenprctlsigemptysetwarnstrstrstrcspn__errno_locationtcsetattrbindchdirmemcmpgetnameinfo__syslog_chkstrndupsetgroupsdup2pollsigaddsetgetpwuid_r__sigsetjmpstdoutfputcfputssetresgidmemcpyfclose__vsnprintf_chkstrtoulsetsockoptmallocstrcatumaskgetpeernameopendirgetenvsetresuidoptargstderrioctlalarm__snprintf_chkpututxlinegetuidreadlinksetrlimitgetopt_long__strncat_chkexecvpgetpwnam_rstrncasecmp__fxstatstrncatsendmsggethostnamechownfwritefreadgettimeofdaysigactiongeteuidgetresgidsigismemberwaitpidlocaltimeendutxentstrchrgetsocknameupdwtmp__vfprintf_chkfdopenacceptgetresuid__vsyslog_chkhstrerrortcgetattr__cxa_finalizesigpendingsetsidfcntlcfsetospeedgetgrgid_rptsname_r__xstatgetrlimitmemmoveunamegetgrouplist__strcat_chkstrcmprecvmsg__libc_start_maindirfdsetenvsysconf__environ_edata__bss_startLIBPAM_MISC_1.0GLIBC_2.2.5OPENSSL_1_1_0LIBPAM_1.0GLIBC_2.14GLIBC_2.4GLIBC_2.3.4GLIBC_2.11	
	q Ш?	
�� ui		�� m�� `/h� m�����	ii

	ti		���#	ui	�&&@p&&p && &&@&&��H&&X�P&&q�X&&u�`&&%�h&&��p&&ƽx&&(��&&��&&��&&���&&���&&ͺ�&&Ѻ�&&��&&��&&���&&���&&���&&���&&���&&���&&���&&��'&c�'&�� 0&��@0&��`0&
��0&��0&ƽ�0&��0&�1&!� 1&�@1&-�`1&5��1&D��1&L��1&T��1&d�2&l� 2&q�@2&y�`2&���2&���2&���2&���2&��3&�� 3&ʽ@3&��`3&ҽ�/&�/&*�/&;�/&B�/&J�/&�/&��3&��3&��3&��3&��3&��)&�)&�)&�)&�)&�)&�)&�)&�)&	�)&
�)&�)&�)&
�)&*&*&*&*& *&(*&0*&8*&@*&H*&P*&X*&`*&h*&p*&x*&�*& �*&!�*&"�*&#�*&$�*&%�*&&�*&'�*&(�*&)�*&+�*&,�*&-�*&.�*&/�*&0+&1+&2+&3+&4 +&5(+&60+&78+&8@+&9H+&:P+&<X+&=`+&>h+&?p+&@x+&A�+&C�+&D�+&E�+&F�+&G�+&H�+&I�+&J�+&K�+&L�+&M�+&N�+&O�+&P�+&Q�+&R,&S,&T,&U,&V ,&W(,&X0,&Y8,&Z@,&[H,&\P,&]X,&^`,&_h,&`p,&ax,&b�,&c�,&d�,&e�,&f�,&g�,&h�,&i�,&j�,&k�,&l�,&m�,&n�,&o�,&p�,&q�,&r-&s-&t-&u-&v -&w(-&x0-&y8-&z@-&{H-&|P-&}X-&~`-&�h-&�p-&�x-&��-&��-&��-&��-&��-&��-&��-&��-&��-&��-&��-&��-&��-&��-&��-&��-&�.&�.&�.&�.&� .&�(.&�0.&�8.&�@.&�H.&�P.&�X.&�`.&�h.&�p.&�x.&��.&��.&��.&��.&��.&��.&��.&��.&��.&��.&��.&��.&��.&��.&��.&��.&�/&�/&�/&�/&� /&�(/&�0/&�8/&�@/&�H/&�P/&�X/&�`/&�h/&�p/&�x/&��/&��/&��/&��/&��/&��/&��/&��/&���H��H�I�%H��t��H����5��%�%��%��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!������h
��������h��������h������h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h��Q������h��A������h��1������h��!������h��������h��������h������h �������h!��������h"�������h#�������h$�������h%�������h&�������h'��q������h(��a������h)��Q������h*��A������h+��1������h,��!������h-��������h.��������h/������h0�������h1��������h2�������h3�������h4�������h5�������h6�������h7��q������h8��a������h9��Q������h:��A������h;��1������h<��!������h=��������h>��������h?������h@�������hA��������hB�������hC�������hD�������hE�������hF�������hG��q������hH��a������hI��Q������hJ��A������hK��1������hL��!������hM��������hN��������hO������hP�������hQ��������hR�������hS�������hT�������hU�������hV�������hW��q������hX��a������hY��Q������hZ��A������h[��1������h\��!������h]��������h^��������h_������h`�������ha��������hb�������hc�������hd�������he�������hf�������hg��q������hh��a������hi��Q������hj��A������hk��1������hl��!������hm��������hn��������ho������hp�������hq��������hr�������hs�������ht�������hu�������hv�������hw��q������hx��a������hy��Q������hz��A������h{��1������h|��!������h}��������h~��������h������h��������h���������h��������h��������h��������h��������h��������h���q������h���a������h���Q������h���A������h���1������h���!������h���������h���������h�������h��������h���������h��������h��������h��������h��������h��������h���q������h���a������h���Q������h���A������h���1������h���!������h���������h���������h�������h��������h���������h��������h��������h��������h��������h��������h���q������h���a������h���Q������h���A������h���1������h���!������h���������h���������h�������h�������h�������h������h������h������h������h������h���q���h���a���h���Q���h���A���h���1���h���!���h������h������h�������h�������h�������h������h������h������h�������%��%D���%}�%D���%u�%D���%m�%D���%e�%D���%]�%D���%U�%D���%M�%D���%E�%D���%=�%D���%5�%D���%-�%D���%%�%D���%�%D���%�%D���%
�%D���%�%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%}�%D���%u�%D���%m�%D���%e�%D���%]�%D���%U�%D���%M�%D���%E�%D���%=�%D���%5�%D���%-�%D���%%�%D���%�%D���%�%D���%
�%D���%�%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%}�%D���%u�%D���%m�%D���%e�%D���%]�%D���%U�%D���%M�%D���%E�%D���%=�%D���%5�%D���%-�%D���%%�%D���%�%D���%�%D���%
�%D���%�%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%}�%D���%u�%D���%m�%D���%e�%D���%]�%D���%U�%D���%M�%D���%E�%D���%=�%D���%5�%D���%-�%D���%%�%D���%�%D���%�%D���%
�%D���%�%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%}�%D���%u�%D���%m�%D���%e�%D���%]�%D���%U�%D���%M�%D���%E�%D���%=�%D���%5�%D���%-�%D���%%�%D���%�%D���%�%D���%
�%D���%�%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%}�%D���%u�%D���%m�%D���%e�%D���%]�%D���%U�%D���%M�%D���%E�%D���%=�%D���%5�%D���%-�%D���%%�%D���%�%D���%�%D���%
�%D���%�%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%��%D���%}�%D���%u�%D���%m�%D���%e�%D���%]�%D��AWE1�1�1�AVA���AUI�����ATL�%��UM�t$S1�H���H�4$1�H��$�dH�%(H��$�1��1���f�H�t$p�)D$p�Y�H������H��$�H���t$H���L��$��/�H����u���H��$�H9�$�rI��M9�t%A�$�@H���I��H��$����M9�u���6A�ą�u���%���%1�H�=��G�H�=@�1�H���%�2�H�=�CH�D$(�!���H�R�%H����H�D$X1�1�H�D$H��$0H�D$H��$�H�D$ f�L�D$H�4$D��H�
-�%H�V��D$X����������!�|�T$X�J��L$X����B��D$X��u=����H�=��%H��tH�=��%���?���x�����J��L$X���IE���(�
v�%����H�=��%�H�5%�%H����
�>��
H�T$ ��$�������
��$�%�=@��
H�=��%����H�"�%H������H�
�xH�[���H�=�e�ڨf.�H�=��%����;��%�H�5��%1��H�� ;F�������H�>�Qu�����C���H�d�%H������H�
cH�Ճ��H�=Ae�T�@H�=�v1�肥����D�B��D$X���)�J��L$X����H�5��%H���B
�>�9
H�T$������"
��$H%�=��
H�=��%H�5�k� �I��H���5L�5��%L���u�H��$`L��H�t����H���%H����
�H����������!ʁ ��t����€�D�H�HHD����L��H���
H��$`H�xI���K���H����
H��$`L��A�D�k������fDE���0H�=�%�=���%����
H�=��%H�������0<	��������"��A���$���%��y�
D�+����8uD���n���x��T���H�
8aH�ց��1�H�=@c�S��B��D$X�������cH�=�%�#
�i�%���#
H�=��%H��ta�?t\�-���H��H���X�H�=��%������!�E-H�}����Ɖ�%��!���%�������fD�J��L$X�����B��D$X����L�-K�%M���

A�}���:L���*�H�D$0H����
H�D$0L)�H�xH�D$8��I��H����
H�T$8L��H�����H�D$8H�|$0A�H�����I��H����H�=�%L���w�H����H�=��%L��L���ܫ���H�=hs1������D$X����臆H�T$dH�t$`H�|$\�c���L
H��$�H�t$lH�|$h������|$\H��]L�%�^H�-�f�~|�|$hI���rI����C��LD��o0��HD��d0ATA�hL��AVH�gI��HD�H�5(h�1����^_L����L����1����J��L$X���U�=i�%�JH�=��%H�����?�w1�识�=�%�t����O���u
覤���`��t��O���D;=0�%�AE���g1�H�=�^L�-�^负L�$$A�G�E1�M�t�L���I�$H��L��1�I���M9�u�H��I��H�=o^1��r�L������6�%��H�|$(�r�����L�t$(L��蝏L��赩��t^�K�%��~?H�8�%��L�>lL�L��H��L��H�r��€�����H��L9�u���H�t�%H���8���^H�=;�%u�@���8��H�=�%1����A������x։�H��$��f���8uL�Q��H��(A��L���1��(��H���Hc����x���c�8�_������x��N�TxH�5D]������5��%���k�=��%�8H�D$H�����E�H�|$�[,�=��%u
����t	�H�\$H�- H���$H��1�1�H�5]1���� H���%H�|$H��H��H��H�q��9�%�H�5�3H�=��%H�T$�5��H�=��%�D�����u}H��$�1��H��H��$�1��H�H��H��H��$�DŽ$H���1�H�޿��1�H�޿����1�H�����H�|$��H�|$1��3�^�H�=?�%�����%��~H���%H�<�H��褌9��%�H�=}�%��H�=	�%��H�=��%��H�=��%��H�=��%H���
1�1�L��$`��Å�y���;��8���'L�����H�Ņ�x���B��D$X���L�-1�%M����	A�}��	H�5>ZL���~������4�%�����a�%h�,�����H��$������������2�3����8�R��$�����x��<H�\$W��Y��8�P��$��H�������xڅ�t�/�*��8u��$��i���x���H�
7ZH�hz�x1�H�=;[�N��J������q�%����H�=�X��H��XHD��6�H�|$(H�5�gH�����#����������uM�����@�{��8u������x�H���%H����H�=��%�o�H�=�Y1���1��z�H�={�%�N�H�k�%�����B��tb�J������%�=�H�5SXL������t&H�5GXL���{����/�1�%���"�%���?�%���H�
�XH��x�q1�H�=�Y��H�
�vH��x�hH�=�Y�Ɯ�a��8����$�����x������%�5��%�-�=��%��H�D$H���>L�t$L��L�5y�%�d'L���|�ʼn��%���1H�
�vH�Ex��1�H�=Y�+�H�
�uH��w�
H�=�X��1�H��$`�
Ƅ,`���H���8�9��%���H��������������H�=s_1�輛�B�D$X��uiH�=��%�F	H�=l�%H���}�?�t�E�H���%H���U�H�
�oH��v�]H�=CX�V�H�=�j1��H��J�L$X�������H�=��%H���'�?�H�=��%����H���%H�����H�
�UH�Wv�iH�=�W�֚H�=i1��ȚH�=9k1�躚H�=3i1�謚H�=�i1�螚�B�D$X��ui�=��%�7���KH�=G�%H���-���0<	������Q���%�&�H�=wi1��8�H�=Aj1��*��r�t$X����H�=��%H�����?����H�|$(H�pI���|�I�uH���tH�|$(L������H�=Fs1�这H�
8UH��u�r1�H�=�V螙H�
gjH�u��H�=lV��H�5H�%H�=j1��j�H�53�%H�=|j1��U��J�L$X����E�����K�%�9�%��H�=�h1���H�=Wi1���H�=Qj1��H�=�j1���H�
�TH��t�{1�H�=�U�˘H�
L\H�-t��H�=�U謘�B�D$X��uXE�������%�i�H�
:TH��t�v1�H�=UU�h�H�=�j1��Z�L��H�=0k1��I��J��?�@�%��H�=hk1��!�H�=rq1���H�
�RH�us�/1�H�=�T��H�
-SH�Ts��1�H�=�T�ї茙1���@������H�
�[H��r�1�H�=�T螗H�=_i1�萗L��H�=j聗H�
:jH��r�,1�H�=MT�`�H�
iqH�Ys�w1�H�=,T�?�H�
[H�rr�1�H�=T��H�=i��H�=sm1��D��g����B�D$X�����J�L$X���zL�5��%M���\A�>�R�:L����I��H���(I9��H��L)�H��k�L����H��%H����I�U�:H��H�T$H�7�I��H����H�T$HH9���H��H��H)��O�I��H���\1�H��I���upL�����%����:L�����I��H���I9��D$G�H��L��L)����I��H���r1�H����xL��7�%�~�H��L��M�F�D$G�H����)�1�L�������%�h�H�=�k1�躒�8���H�=�h�i�H�=�h1��[�H�
�PH��p�"1�H�='R�:�H�
coH�3q�}H�=R��L�%�%�_���H�5�o��M��1�����H���%�5,�%1�H�=_ �� H�=��%���
�g��8u��$������x�umH�|$��$���
H��$����$��f<���~���H�5B�%H�=�l1��d�H�
lOH��o��1�H�=0Q�C�H�
�OH�<p��1�H�=Q�"�H�=�h��H�=7h1���H�=�h1��H�=�h1���H�5��%H�=�k1��דH�
�NH�9o��1�H�=�P趓L��H�=Tk1�襓H�
kH�o��H�=sP膓L��H�=�j1��u�H�=vj1��g��B�D$X��uY�=��%yBH�=�%H��tq�?tl1��m���%������u	�Ҕ��tV�������H�=rk1����J�L$X��uJH�5��%H��t0�>t+H�=��%���H�=_k1��ȒH�=yi輒H�=uk1�讒�B�D$X�������T$X�������h����%�Y�H�="h1��k�H�=Lh1��]�H�=Nf1��O�H�=hg1��A�H�=�g1��3�H�=tg1��%�H�
�MH��m�1�H�=�N��H�=�e1��H�=M�Z��1����螓��u����t����u�输��H�=�j1�諑f.����1�I��^H��H���PTL��IH�
?IH�=���:�%�H�=�%H��%H9�tH�&�%H��t	�����H�=��%H�5��%H)�H��H��H��?H�H�tH��%H��t��fD�����=��%u+UH�=ʿ%H��tH�=��%�)���d������%]������w������SH��H���`��H��[�W�����PXH�����%�P�w�%��t
��I���H�=}�%�h���USH������I� �F�H���H�lH��1�����
wH��H���7����H9�t$H���H���v׍Qހ�:vo��x߃�H9�u���Hc��%��H���RH��L�AHI� H�=�j�H���S������r��\@���@��Hc4�H�>��I��s����i���f��ArH���H9�u��H��[]Ð�AfH����fD�AnH����fD�AtH����fD�AbH���fDH�q�u0�F0f��у���A���A��V�NH�N�|���@�r�@��:vH�q��x'�H���]���DI��s�\H���Q��C����\�H�q��f������H��H������H�
�FH�j��1�H�=FK�Y�f���SH�H�C H9�uH��u
�[�1�H�=OK�‰H�C �s,H�{�>1�[�f.�AUI��ATU��SH��H��H� ��H�@A��H���#�sL�Hc���H�C@H���GHc{LL��Hc�H��G��sLH�{@�sLD9����=���H�{@I���A��H�C@�CLH�L��H�5�E1�1�L�%�F�5�L��H���
��L�k L�����H�=�EH���H������LE�����H�5K1�H��L��1���H��I�����H�C L�����L��L���蜬�S(���tH�{@��H��[]A\A]�f.�9���)͉kLHc�H������H�C@H����Ic�H��H��L���L��D������I��������t�H�@H�����sL�Hc����H�C@H����Hc{LHc�L��H�����kL�?���L������I�����fDD������SLH�{@Ic�I��D)�H��SLHc�����c���DH����{1�����Lc�L�����H�C@H��txL��L��H���>���kL�����H�
ZIH�3g��H�=_H�r�H�
�HH�g��H�=@H�S�H�
�HH��f��H�=!H�4�H�
�HH��f��H�=H��D��SH�7H��1�H�=�C藆�CT��u0�C(H���xH�߹���1�H�5.D[����f.�H���.��fDAWAVAUATUSH��X�>textH�|$ H�t$0H�T$(H�L$8��H�T$0H�l$81�1�H+l$(H�5IL��CH���9�H��I�����H�|$ I��Hc����H�=�BH��������H�|$ H��X��L��[]A\A]A^A_�é�~/�t���I��H��H�T$E1�H�D$E1��D$�����5f�H��M�o�]L)�L��H�����I9�sH���G�I��H��L)�H�����
L�����H��H�XHD�A�?[if t�M����H�|$��L��H����������!�%����t��I������D�H�QHDʉ�@�H��M)�L)�H�AL9�}
A�?[els��H�AL9��S���A�?[end�F���fA�if�9���A� �.���I�H��L��L�D$HH�L$@�������
���H�L$@L�D$HA�|]������D$�����
L��L�D$@�I��L�D$@H�pH��L)�H�|$��H�|$I��H��I)�H)�I�I�I��L��E1����H��H��L��H)�L)�L������L��E1�����H�D$�h���H�D$(H�D$L��H�4+�2��I��H����L�|$H�<H��B�\%L���m��L9|$(�����f�H�|$�v������M������I��L��M)��H����������!�%����t������D�H�QHDʉ�@�H��L)��a����M��tL��H�D$���H�D$L)�H�x�I�����I��H����L��I�V�H��M�����C�D4�H�|$ �L�H�5�?H���=�H�=T@A�$H��HE�H�|$�$H�|$L���C��A�H��uA��� M�����g�,L���z��H�����L�pL���ҁH��t�A����AA�F�,�D$M��H�t$(H9t$�����L�|$8L+|$L�����H�D$H���L�l$(L��L�|$L��L������L)�H�I�H��x����M��A�I����������!�%����t������D�I�VLD��@�I���8���f�L�����H�|$(H9|$��H+l$H�T$01�1�H��H�58DL��>�t�H��I���Y��H�|$ I��Hc��Y��H�=>H�������������X���fD�D$�����D$���fA�e �#���H��I�L��L�D$HH�L$@�:��H�L$@L�D$H�������A�|]���L�|$�B���H�|$tXH�|$�
L�D$@���L��L�D$@H�pH)�I��I�M)�I��M��_���A�F�,����L��M�<H)�I�<I���?���I��M��L��1�M)��,���H�
�BH��_� 1�H�=;A�N�H�
CH��_�~1�H�=A�-�H�l$8���H�
�<H��_�CH�=�@��@ATUSH��dH�%(H�D$1��?tSHc�Hc�H��
I������H�$�:u#H9�H9�|H�L$dH3%(u&H��[]A\�L��H�=�B1�萃H�=�B脃���Df.���AWAVA��AUI��ATUSH��H��8H�T$dH�%(H��$(1���H�~�M�+nL���L�d$ N�Hc�������8���{,�H��L�����A�Dž�x؅���L��D���H��?	���H�{ u�����{(���PH�t$ �D��H�������S,H�{L�����{L�H�C���-H�ǽ���C0H��$(dH3%(����H��8[]A\A]A^A_�H�3H�=�A1��}�CTfD1��@A��t�SH��t�C0��u4H�3H�=�A1��}눐E1�����H�L$1�f�1�O����H�=�A1���M}�C0H�|$1�H�D$H�D$@
�H���*������H�
�@H�8]�FH�=L>�_�H�
y:H�]�E1�H�=+>�>�@f.���AWAVI��AUATU��SH��H��8H�4$dH�%(H�D$(1��=o��L��H���-H��H���%�H�5:H����H��I���/�/H�����H����L�`I��L���v����������������+���Z��
�	���X������
�F���	H�yles.cssI3D$H��H�print-stI3GH	���H�
z�H�5>:H��H��#����W����f�A�plai��A�|$n��fDM��t�!H�5@L������A�Dž���D�ͮ%H��8H��8H�5��E��HD�1�1��p�H��I���U��H��L��H�5'9I���L���'��H��E1��-H�\$(dH3%(D����	H��8[]A\A]A^A_�fDM����H���.H�5m8H��I���M�H�5�%H�T$$H��H���6qI��H��tV�D$$������%���H���|�I�~H���������H���`�I�vH�=?H��1��|H�
�7H��7H��1����k�H���3,����fDH�keyboardI9G��@H�usercss-I9G�\@H�
�7H�{8H��1��������fDH�keyboardI9Gu�A�|$.pngu�H�
:�H�5�7H��H�������(��l���A�F4L��H�5-7�D$A�F8�D$��L��H�57I���ߊL��H�5
7H�D$�ˊL��H�5�6H�D$跊M��L�\$I��t5H�|$t-�
1�L���S��H�|$�
1�A�F4�>��L�\$A�F8D�d$$E���gA�v4��~;A�V8��~39T$u9t$t'H�=�=1�L�$�xA�V8A�v4A�~,�SL�$M���L��L�$���H��H�����L�$H��I���fE�+A�U�D��6�FA�Uƃ��9A�U����,A�K�QƉσ����/�1�� fDA�LsH��D�AƉ�A��va��/v\D�A�Hc�A��vO��fwJ��A��9�P	Gƒ������9�P	G�H�VA�4E�lsA�M�D��vA�MЀ�6w	A�M���w�A�~,L�����H���%L�����1���H��H�
_<H�K5蠪I;^ �+���H�
85H�pW��1�H�=r8�{DA�secu�:���fA�|$re�,��������H�beep.wavI9G����H�
)H�5�4H��H�������w����f�H�enabled.I9G��H�favicon.I9G�����fA�|$ic�����A�|$
o�����H�
�H�5�4H��H��B������U���@H�ShellInAI9G�T���A�|$Box.�E���fA�|$js�7���H�=p�%�uH�=��%H�5�>I��H��uH�5�3H�=�3�
��%H�3VH�r3D�
O�%D�L�%I��W��H��VH�5�:LE�E��ATD�
�%HD�E��HD�1�1���~H�� L��I�����L�����H�5Y;1�D��TI��1�D��D�D$�~H��I�����H��I�ʼn$���H�=N2H�������tdD�D$L��C�(Hc�$���I��H���CMc�Ic�L��H�L������Q�H�5pUJ�<0�����CH�5;�H��Q�����L�������$L��H���٘���@H�styles.cI9G�����fA�|$ss�����L�%߬%L�����L��H�5�2H��I����]���@M����H�=��%H��t���%�P���%���hH�$I�^ �@A�FHM��tA�}uH��L�\$��&L�\$I��H�$L��L��L�\$�8�L�\$����H�=I�%t
L�$�PL�$E�f,H��L�$誗M��H�
�H���D��H���>��-I�FH���}�A�v4L�$��~A�V8�������DI�F H��t#H9�t1ҹH�51L����������A�V,I�vI�^ I�~���I�~@I�F�p�\$$���dA�H�����I�~A�V,�H���`�I�~�-�������D�����������f.�fA�|$gi����A�|$
f�����H�
nH�5�0H��H�������9��}���@�
I�	1�L�%��%�����P���~f�M��������M�$$���u�M���j���I�T$I�L$ H�5�0H��H���������A�|$.htm�!���A�|$l����H�
/�H�50H��H����������H��H�=���j������f�L���f�{���1ҹH�5`/L�������w���I�~H���j����-�k�A�~L��R���A�V,I�v�I�~����7���f��K���8������H�5%/L�������L���|e��H��1�H�
�.H��.�O�����1��i����n��H�
�5H�Q��1�H�=2�-uH�
�6H�Q��1�H�=�1�uf�f.�USH��H���5	�%���%�F��5��%��uH��[]�������5ƣ%��yXH�-ר%H��tW�%H���u��H����H��H�5/1�1��iyH��H��t\H�ߺH���1�ZH��[]�&���YH��[]�+�XH�ߺ[H�5�.]��H�
�.H�nO�AH�=1�%tH�
^6H�OO�I1�H�=�0�tH��H�=
61���sH���H�t$(H�T$0H�L$8L�D$@L�L$H��t7)D$P)L$`)T$p)�$�)�$�)�$�)�$�)�$�dH�%(H�D$1�H��H��$�H�=[�%H�D$H��H�D$ ��$�D$0H�D$�T���H�|$dH3<%(uH�����G�����AWAVA��AUI��ATI��UH��SH��dH�%(H��$�1��'aL���/�H����H��H��tx�h+h���M�Hc�H�����I��H��u�f��;���8�*�;H��L��赼����x�S‰S;S}l��L��L���Ҡ�'����8u�;�?�����x�H������1�L��虑H��$�dH3%(���SH�ĸ[]A\A]A^A_�fD��L��L��1�蹑��H��D��L���H��H�D$� �(H��@��/uf�H���+@��/t�L���{���I��A��@��t
H���h���E�|A�Hc��׻��H��H�����Mc�L��H��L��跺���;t�]D���8u1�H��1��"���Å�x�.H�����H��tLL�xL�5o�%E1�H�5+�I��I�v�A��H��t=L���7�����u�Mc�H�)�%I��N�|(�#H�|$��.H��藽��H��u�L�=�H�|$�q���H�T$1��H��H���H��
H�=��A��A��E��E��te�޿蹿����u�D$(%�=�uL�l$@I��@~7H������D�ӿ���8����������x��f.�H���Ȼ��D��L��1�H�5	
1���tH��I��跻��L��I�����H�=}(H���������H�l$@�Mc�L��H��HM�J�t-����I��H���&I��������8�eH��L���蕹��H��H���x�D��H9D$@��A�L��L��H�L$誝�耹��H�L$H���ZH�T$@�H��L��H��P�e�����L��H�5�8H���>����;/uf�H���;/t�L��H��H�������!�H�{�/肽��H��H���X����;.u�H�|$�WH���O���H�
�'��1�1�H��(L���`��2�����L���������H���HH��L��L������˽���8u��������x�1�����D��1���L��H�D$���H�T$�f�H�T$�:�S�����H�T$�ƶ����x��>������H�
IH����H�=~
�mH�
�	H�{��1�H�=]
�mH�
�	H�Z�S1�H�=<
�gmH�
�
H�9��1�H�=
�FmfD��AWI��AVAUI��ATUSH���>/H�|$�����%E1���f�H���%N�4�I�H�x蹸��L��H��许��؍h��Hc�����H��H�����I�Hc�H��H��H�p���I�L�pA�>tL���e���A�|�/tH��H�56H���˵��H��L��H��I��蹵��I�H�|$H��H�7����"�H���
���D9%Ӡ%�=���H���[]A\A]A^A_�f�H�
H�|$H�������H�
AH��	�1�H�=���kf����"�%Ð��Ðf.���SH��H���p���H��[�g������PXH�=�	H�������`���AWAVAUATU���FS�H��dH�%(H�D$x1��~�����N�Hc�H��莵��H�D$H���aH�T$H�t$@H�ى�L�D$8�g������H�T$8H���L�:M����L�rM����L�jM����L�b M����H�j(H����L��H�T$(脶��L��H�D$ �w���L��H���l���L��H�D$�_���H��H�D$�R���H�t$ H�|5H|$H|$�H�衻��H�T$(H��H�����BH��C�B�C����L��H�D$���L��H�D$��L��H�D$ ���L��H�D$(�ص��H�{0L��H�;H���F���H��I��軵��H�T$(L��I�|H�{�%���H��I��蚵��H�T$ L��I�|H�{����H��I���y���H�T$L��I�|H�{ ���H��I���X���H�T$H��I�|H�{(�²��H�|$�(���H��H�L$xdH3%(��H�Ĉ[]A\A]A^A_�L�=�"L�:�;���H�-�"H�j(�_���L�%w"L�b �B���L�-g"L�j�%���L�5W"L�r����H�
aH����1�H�=��hH�
)H�a��H�=��h�˸��H�
LH�=��1�H�=��hf.�H��H���0dH�%(H��$�1�H���oB�oJ�oZ<�obLH���oj\�orl�oz|�oR,�H��D$�o��L$�o��H�=|f�$�B\$<�D$H��Td$LH��$T�B(l$\�D$(t$l|$|�$��$�T$,�o���o���o���o���$��o���o���$��o��o��o�,�o�<�$��$��$��$��$�$�$,�$<赹��H��$�dH3%(uH�Ę�����D��AWAVAUATUSH��H�|$1�dH�%(H��$�1��<�������0�������$������ƒ�A�������A�����H�=�1��P���A�Ń���1���蛮����t�f�����8uD���.�����x�H�|$�0������=�|$��Z��������|$��C�����t�df�苵���8u
�|$�ͮ����x�H�|$E1�謮���H��I��A��1��������1���������L�l$ �|$��L��误�����tA���D�����8u
�|$�E�����x�E�����D���{������&����f�������1����T�����t�裴���8u(�������x���ܭ����y:��{����8u(��迭����x�D��賭����y��S����8uD��薭����x�H��$�dH3%(L���5H�ĸ[]A\A]A^A_�fD�����8��������D�C������������t<I��H����L�|$f� L��I�,AG,G����L�����L��I��软�����H�
9H�b��1�H�=��cH�
�H�A��1�H�=��cH�
zH� ��1�H�=��cH�
DH����1�H�=��tcH�
H����1�H�=��Sc�n���H�
bH���1�H�=r�-cH�
)H���1�H�=Q�cH�
�
H�v��1�H�=0��bH�
�H�U��1�H�=��bH�
O
H�4��1�H�=��bH�
#
H���1�H�=��b�U�f�1�SH��H��|H��HdH�%(H�D$81�f�O���G�G�H�G�HLJ�H��)���t1����H�H�|$ �������jH�D$ H�T$H�t$H�|$��|H�D$(���路�����H�T$H�t$H�|$�ۮ������1�1�1�般��1�1�1��=������%��uk�T$�t$�|$�"��������T$�t$�|$�I�����t�������8u�{ �N�����x�H�D$8dH3%(��H��H[]����H�k(H���7����­���C$���t���H������g���H�
{H���1�H�=.���`H�
�$H����1�H�=
���`H�
�$H����1�H�=��`H�
�H����1�H�=��`衰��H�
H����1�H�=���``����fD��AWAVAUATUSH���|$dH�%(H��$�1����%����H��I���˯��I��H����H�-H�cfDL��H�s�$���I��H����J� O�t'H��藫��K�|'L��H���w�������DC�D'������DA��%H�5L��L���Q���Lc�H����������! ��t����€�D�H�CHD؉��H��L)�C�<'�J���L���L���f���H��H�����D$I�} �E�����EI�E4H�E��H�}���H���ղ��I�} ��H��t	�8�N��H��Hc�L���V���L���n����@�C����8u�=8�%L��H���]���Hc؅�x�H��L9��!�5���H�D$f�H�D$`H�D$ H�D$ H�\$0H�D$@H�D$p)D$0H�D$(H�D$HH�D$PH�D$X�軭���8���=��%1�H��肧����xރ����D$A�EP����H�|$X� H�T$PH����z���z�$�RA�U,H��$�dH3%(�H�Ę[]A\A]A^A_��H������H���W������f���������������������������H�
�H���1�H�=_��]H�
�H�t�1H�=@��\H�
�H�U�01�H�=���\H�
��H�4�41�H�=���\H�
}H��31�H�=��\賬��H�
\H��
�51�H�=���r\H�
�H��
�1�H�=���Q\H�
�H��
�1�H�=u��0\��AUATUSH�����%����D�oPI��E�������5���H��H����D�h��{����8uF�p�%�H���葮����x�=u&H���n���1�I�D$PH��[]A\A]���u1�H�=���WH���7����������1�H�=?��W����������������H�
�H�{�H1�H�=m��([���AUM��ATI��UH��SH��H��H��H��(dH�%(H��$1�H�G�HLJ�H��H)�������H�1����s$���H���C ������H�=�f�C(�����t�H�=�H���������I�t$H�{0� ��K���I�t$H�{P���3���H�{T� H�5H讥��A�}L�uL�-wL�L�d$H��I��1�AU��L���˫�����L��H�{t�ŭ��H�|$1��ɣ��ZY����H�$��|H�D$���H��$dH3%(uxH��([]A\A]�f��H�=�H�����������}Z��u1L�bWH�
��H�t
�j1�H�=v�A�����fDL�!Y���:���H�
EH�<
�t1�H�=>��Xf���AVI��AUI��ATI��U����S����H��t"H��M��L��L���H�����H��[]A\A]A^�H�
I�H��	�}1�H�=��X���H��t�G ��y�������SH��H��t�G ��yH��[�������H��[��f���H�������AWAVAUATUSH��XH�|$H�=��t$�dH�%(H��$H1�辫�����0H�=�A��覣��H��H���ZH�L$�D$L�t$(L�l$0H����H�L$L�<��L��L��H����������H�|$(H�����/~�H���
1��V�����A9�t�H��臥��9�t��D$��~!H�D$;t�H�D$�H��9X�t�L9�u�����D���G������o����蓦���8�Z�����D��� �����x��G����H���x������AD��訟������H��$HdH3%(�H��X[]A\A]A^A_�������8������[�����x�����f��膡��H�L$�ŋD$H��H�L$��H�������m���D9�t�T$��~H�D$;(t�H�T$�	H��9j�t�H9�u��%蓥���8u����מ����x�멐�{����8u���D��������x��H�
�H����1�H�=���UH�
H����1�H�=���U蟥��H�
�H�y��1�H�=���^U@f.�UH��AWM��E1�AVAUI��1�ATI��SH��(�u�H�u�H�M�1�dH�%(H�E�1�� �������� H���H���I��H�����A�<$H��H���j������bL��2H����������!�%����t������D�H�rHD։��H��H��L)�H�BH��H%�H)�H���H��H9�tH��H��$�H9�u��t	H)�H�L4�H�\$L��H��H���H���ۧ��L����H�U��}�L��H���1���I�E����A�ƅ��k��I�}�� 1�E��L��<� �å��I�E��D�p,A�<$�x 1��s�����t�f.��K����8u�}�莜����x�H�M�dH3%(D����H�e�[A\A]A^A_]�D�����8"�����L��H������R���f�蛞��I�}� L�
<A��A�Ǻ� 1�����I�U�E�H�}ľD�z,�B �E�����}��ݠ��A�$D�H��1����A�ą�x"D���›�����0����e����8t��!����S����8u���G����8u�}�芛����x��@�+����8u
A�<$�m�����x�A�$����I�}A���������I�E���H�
��H�'�11�H�=y��4RA�$����A�����I�E����H�
��H����1�H�==��Q����AW�AVA��AUATUSH��dH�%(H��$�1�H��$�H�VH��1��H�H����DŽ$H��$�������t!H�
��H�b��1�H�=���gQ��H��$������I��H��$�H�$@A�$H�4$�D���O���I��=tA�<$��H�l$\D�H������Ο���D$`��xfto�T$]��H�=�1��oL�D$\��t��<~�D�L$`H�߹ 1�L�{9�� �z���H�=ۄ%H���[�f�A�<$�u���A���0�����$���~wA�$�A�<$�
�����$��H�������D$`��x����A�<$��������$���V������T��$�H�=h��K�����$����Hc��T$�����T$H��I����Hc�L��D���ڙ��I�ŋ�$���D9�tA�<$��D�H������V����D$`��x^tc�T$]��H�=��1��J�D$\��t��<~�D�L$`H�߹ 1�L�8�� ����H�=c�%H���Y뉐A�<$t���$���D9��>�����$�����	;q�%�H�$��$�Ƅ$_H����t2��ƒ�߃�A��v�PЀ�	v��-<��H�����u�H�$��$`Ƅ$�H�����t1fD�ƒ�߃�A��v�PЀ�	v��-<�mH�����u�H���%L�$H�T$hH�|$dHc�$�I�JM���H��p����ʼnD$`���YL��賙�����gH�=+�%��H�t$hH�=�%H����T�t$`H�=�1��WIH��$�1���CHDŽ$�H���H�D$`HDŽ$�H��$�H��$�H��$�H�H��$��D$dH��$�HDŽ$�HDŽ$���$���A�<$u\1�H��D���<�����x�t�D�A�<$������|$d�ܕ����x�����-�C����-���H�=:�1��eHL���}���H�=��%�S1�芗��A�<$������$�H�=3�H��1��)H�L���H��$��w�����������A�<$u%��$��H�5�������x��A�<$u��$��%�����x鋄$��D$`�D$d�b������T���H�=*�1��G�A���1�H�=���QH�1�%����H�
��H�����1�H�=���KH�
\�H�����1�H�=���KH�D$hD��$���$�Hc�$�E��H�D$H��%�ÅɉL$L�4��� ����襕��H��H����H�=����H�EH���o����H�,q%L�-x�L�d$M��I��H�݉�L���m���H��H�D$ tL�C��L��HcۉD$H��H������H�L$ H��I����H�\�L��H�5��1�1��OH��\$H��L�eM��u��[L��M��L�d$Hc�H��H��H��躜��H�D$H����H�D$1�L��H�5>�H�l�1��/OH�$1�H�58�H�EH�D$H�QH�l�1��	OH�$1�H�5*�H�EH�D$H���H�l�1���NH��$��H�EH�D$H�D�1�H��$��H��1��K����H��H�-H��$�H���H��$�Ƅ$������H�����1�H�ھ薑��1�1�1��;���1�1�1����=ex%��A�~��H��$0�$1�H�VH��H��1��H�����DŽ$�H��$0H��蔖���D$<�����<�n���A�~� 1�H��$��0H��H�|$�H��f�H���N�������H�kAH���j���H�D$(H���xH���T���H�D$ H���CH�|$ �.�G���H��t�H�D$pA�F���H�:w%HDŽ$�H��$����A�~ ��A�~$��I�v(H����I�~0�VH�L$pH��$�H�=���?�������r�����uH�|$p���ߒ������A�~ �>��H��H�|$(�q���H�|$ �g���A�~t$I�~@�;H�{(�?uH�=���@���I�F@��{%��tA9F �/�CA9F$�"A�~t%H�|$pH��tH�D$�H�P0�w������5L��$�I�~(1�DŽ$��sL�������$������1�H�L$��H��H�|��u��H��Hc�H��H������H�D$H����H�D$H�S H�5�1�H�L(�1�H�L$ �{KH�L$ H�5��1�H�H�D$H�S(H�L(�1�H�L$ �PKH�L$ H�=�H�����H�L$H�D)�H����H�D$I�V(1�H�5��H�L(�1�H�L$ �KH�L$ 1�H�5��H�H�D$I�V(H�L(�1�H�L$ ��JH�L$ H��H�H�D$H�D(�蝑���=�t%tPA�~tIH�\$1���L�CTH��(L���L�ǹ I�v(莙���Y���H������,���H�����1����H�\$pH��t
������wA�~$�����������H�
��H���m1�H�=u��0EH�
��H�
���1�H�=T��EH�� �B���H��H��tXD��H�5��1�1���I�T$H�5��1�H�E1��I�H�E���H�
��H�����H�=���DH�
��H�d���1�H�=���DH�
r�H�C���1�H�=���`DH��$�1��T1�H���g����D$H��1�fD��$��Tf��$�1��@������H�
\�H����1�H�=?��CH�
��H�����1�H�=���C�xHc�H������H��H���F�sI�~(L��H��茐�������$�H��A�N$�t$<�H��9t��H��9�u��
��$�Hc�H���'���H�������d���H�
��H����1�H�=~��9CH�=r�蝌��A�~tH�|$p1��ʏ�����H�
Y�H�����1�H�=4���B��H���R�����tkH�
�u%�%�H�=����A�~ ����肍������A�~�cA�~��H�
,�H�V��r1�H�=���sB�D$�Z����Ń���E�������L�\$�t$�$I�S��L��H��1��H�R���DŽ$xH��$�襏����t�dA�<$u'�=Nv%��1�L����7v%�����xҾ�H���A���H��
@���r�����$��ƒ���߅���������荒�������I�~8H��t2H�
7�H�N��t1�H�=���kA���诎���b���H�x ����I�F8H���LH�����I�~8H�����?/����\���I�F8H���W�I�~8H�5�
輎��H�=%��`���H�=�
�������L�d$H�-����H��L��I�������t/M�,$L��M��u��AH�
"�H�j��S1�H�=���@L���?���H�=J��3���H�H����1�����A�~����$`��H���L�"�H��$�R��PH�D$�H��L�H1����L�|$E1�I��H�
��H���1�H�5��H�=��L�<$�f���E1�I��1�H�
��H�5��L�<$H���H�=���9���Y^���H�
��H�d���H�=���?H�$L�k�H��9���1�H�=����EH�l$H�D$H����L�t$H�]H����=H�����I��H����I��I)�I�}�b���I��H��txH��L��H��蜒��C�.I�|$譎��H��t7L����q�@��w�� �
H���
��u�H�|$H��L��H����E�j���H�
��H�3��	H�=���>H�
��H���1�H�=���q>H���)���I��H���_H�=������H���`���H�
@�H����H�=n��)>H�=g�L�t$�؍��H��H����A�V$H�5�&1�1���BH�|$H��H���DH�=��蜍��H��H����I�~0臍��H����H�|$H��H���DH�=��b���H��H���AH�$H�x�I���H���H�|$H��H���DH�=��$���H��H����H�<$H�ǐ����H����H�|$H��H���?DH�=����H��H���BA�V H�5�%1�1���AH�|$H��H���DH�=m�觌��H��H����L��蓌��H�|$H��H����CI�~@�z���I��H�������H��H���`1�H�\$(E1�1��D$E1�H��L�<$L�t$@�$A�� ��A��"�E����M�wM��E�7H��tWA��$�~�A��=�cA��\�FA��'u�M�w��t�1�L��H��L���L����M��H��H��H�P�豊���A�����E���A�� u����x���H���KA�E����M����1�H��H��L�d$�L�l$0I��D�t$<A��H��1�H�Љ�L�H�Ic�H�D$ �4H�T$ L��H��L�L$H袅��L�L$H��uH�D$ �<=��I����I�$H��uÉ�H�|$L��D��D�aL�l$0D�t$<Mc�I��L���O���H�D$H����A�E�=H��贊��H�L$J�D!�J�D!�E1�E���E1�1��u���Lcd$H��J��E�l$H�D$�l���H�|$(J��H�D$H�p�Ռ��H�D$(H����D�l$A��E1�M�w����L�l$01�H��I��D��D�t$<L���L��H��H��B�D��X��Hc��v���I�$H��t@H�L$ Hc�L���DI�<$E1��a����.���H�
M�H�����H�=2���9H�
�H�o���H�=���9H�<$H�\$(L�t$@�{���HcD$H�|$H��I���@E����H�+H�D$H��H�Fl%�A���I��H�����/H���8���H��H��t!H��1�H��H���H��H��H��H�P����A�~tRH�1�H��H���H��H��H��H�h��uHc��R���H�H����Hc�H�xH��H��贇��H��-H��D(H��L���{����������H��苄��L��胄�����H�
��H�@���1�H�=���8H�
&�H����H�=���~8H�
��H����1�H�=���]8H�
�H�����H�=���>8L���������A�{M�w����I�wI���	��}tI��A���u�A�H�|$�T$0L�L$ �+EL�L$ �T$0H��I����1�H��L���H��H��D�p���A�D��I��L��L)�)…��OL�\$0L��1�H��Hc��H�<$L�L$ H��L��H)�H��H�TH�t�謉��L�L$ L�\$0H��I����H+$I�I�H��tH�M��tI�L�T$ 1�L��H��L�$Mc�L���K�<7H��H��H���Ѕ��L�$L�T$ M��tL��L��L��L�$萊��L�$L�$M����A�u*A�M���{�����M�wD	��l���M��t31�E1��]���1�L��M�wH���L��L��H��H��H�P��K����4���M��A�1�E1��#���H�
n�H����[1�H�=���T6L�$����E1������M�w���H�
8�H����+1�H�=\��6H�
��H����(1�H�=;��5H�
��H�x��!1�H�=���5H�
��H�W��1�H�=���5H�
q�H�6��H�=���5H�
;�H���1�H�=���t5H�
��H����H�=���U5H�
��H����1�H�=y��45H�
��H����H�=Z��5H�
W�H����1�H�=9���4H�
J�H�v��1�H�=���4H�
4�H����u1�H�=���4H�
��H�d��r1�H�=���4H�
v�H�C��q1�H�=���p4H�
��H�"��p1�H�=���O4H�
R�H���o1�H�=s��.41�H�L$pH��$�H�=���c|������H�|$pH�T$x�	�������jH�L$xH���PH�T$ H�5��1�1��8H��H���H�|$pH�¾	�L�-_���~������H�|$p1Ҿ��~������H�|$p���†����������L����|���H�T$ H�5��1�1�H��$�8H�D$0H����H��$PH�D$@1�H��蕁������H��$P�H��H�T$@�1��
{��H�5�e%H�|$0�ɀ�����
���H��H���c��H��1���|��H��1�H�D$H�z��H�L$H����Hcр|�
��H�5Ye%�
H�T$H�
~��H�T$H�1��H���rz��D�E��u#H���~������H�|$p����~����}��H��A�P���vA��-A��2w�H�����?L��s�H��D�E��u�H�|$0D�D$@�}��I�v@H��1�1��6H��I���}���@L���~��H�5��H�XH�������u^D�D$@H��L��L)�H��D���H�|$(H��H���H��L��H��H�,1H�t�詃��I��H���DHc�H�t$(H��H���z��I�~@�|����e%M�n@A�F ��u$��c%���7A�F ��c%���A�F$A�~ ����=Le%H��t�@A�F$A�~ �	A�~$I�F(�I�F0����H��1�Hc��L$H���x���L$H���R���I���(H���W|��H�5pc%�
�&|��H��1��x��L���/|��H�|$0�%|����;{��H�
��H����"1�H�=��:0H�
��H�����1�H�=^��0H�
��H����1�H�==��/H�=���l����H�=w��[	���H�=g��$�7y��H�|$p�4$�j|����z���;{����uH�|$p���z�����&���H�|$pH����	�z������H���*{��H�|$p�H��$��s������WH��$�������A�~ H���A�~$��I�~(��I�~0���@�kH�;A�F A�n$�~��I�F(H��tR���
I�F0��H�
2�H����M1�H�=���.H�
��H�j��I1�H�=���.H�
��H�I��lH�=���x.H�
k�H�*��i1�H�=���W.H�
;�H�	��h1�H�={��6.H�
	�H����g1�H�=Z��.H�
��H����f1�H�=9���-H�
��H����d1�H�=���-H�
��H����_1�H�=���-H�
s�H�d��H1�H�=���-H�
�����H�
��H�7��E1�H�=���d-H�
��H���A1�H�=���C-H�
��H�����H�=i��$-H�
X�H�����H�=J��-H�
��H�����1�H�=)���,H�
�H�����1�H�=���,I�~@�@�y��H�����H�hH�5��H����|�������H��H��$��0H�|$�H��f����,~��H�D$A�~H��$�H�|$�0H�p(�H�uA�~t4H�D$�fDŽ$�HDŽ$<HǀDH�xP1��H�H�|$����x��H�D$�x$���H�\$1��� H�5��L�C,L���L���Ew��H���=���e�H�
��H�z��H�=���+H�
��H�K���1�H�=���x+H�
q�H�*���1�H�=���W+H�
8�H�	���H�=}��8+H�
��H�����H�=^��+H�
��H����n1�H�==��*H�
��H����uH�=���*H�
��H����~1�H�=���*H�
��H�z��z1�H�=���*��r�����#�I�~8�[�H�
-�H�C��x1�H�=���`*H�
��H�����H�=���A*������L��1�I�wH���L��I��H��H��H�P���x����t/�M�w��H�
��H����1�H�="���)1�M�w��f���AUATUSH��dH�%(H�D$1���~�Յ� H�D$dH3%(uBH��[]A\A]�DI��A����TL���r��L��TD��1�f�,$f�\$�xr����qy�����H��(1Ҿ�dH�%(H�D$1�H�L$��v�������{���������uJH�t$H�=P]%H����v����t`H�
�H����P1�H�=���(��cx���8u
�|$�q����x�D$�G[%H�T$dH3%(ucH��(�f���D$H�|$��D$�D$�L���|$�s��H�=��1��U(H�
6�H�?��I1�H�=y��4(�Ox��Df.����=�Z%��x2H���@�w���8u�=�Z%��p����x���Z%����H����f.�D��ATA���FUS�H��PdH�%(H�D$H1���r����N�Hc�H����q��H����H�t$L�D$H��H��D��H���y����uBH�D$H��t8H�8�w��H��H��u]H�
��H�r���1�H�=\��/'�� �nq��H��H��tmH��E��L��1�� �� ��x��H���r��H��H�T$HdH3%(u*H��P[]A\�H�
)�H�����1�H�=���&��v��H�
'�H�����1�H�=���&���ATI���FUS�H��PdH�%(H�D$H1��q����N�Hc�H���p��H��t`H�t$L�D$H��H��L��H���rw����u0H�D$H��t&H��X��q��H�T$HdH3%(��u;H��P[]A\�L��H�=D�1���%H�
7�H����
1�H�=���%��u�����ATI��USH��H��dH�%(H�D$1��)u���
H��H���H����x���U��uH=���vAM��tH���u��I�$H��tMH��������H�L$dH3%(��u,H��[]A\�fDH�$�:u���M��tω��9���I�$���u��H�
��H���H�=���$Df.���ATA���EUS�H��@dH�%(H�D$81���o����N�Hc�H����n��H����H�t$L�D$H��H��D��H���nm����uBH�D$H��t8H�8�t��H��H��u]H�
"�H�B��P1�H�=\��/$�� �nn��H��H��tmH��E��L��1�� �� ��u��H���o��H��H�T$8dH3%(u*H��@[]A\�H�
)�H����J1�H�=���#��s��H�
h�H����M1�H�=���#���AWAVAUI���EATUSH��dH�%(H��$�1��{n������A��Hc��m��I��H������r��D��I��Ic�H�D$H��H�D$ H�D$H�D$0H�D$f�L�D$H�t$H��L��A�$L��� w����u<H�D$ H����H�=`�L�������tlL��H�=��1��"A�<$"u�D����H\$L��H���t��I��H���n���H�
��H�P���1�H�=z��M"D�F�nm����Hc؅�
��9�}L��H���\t��I��H����H�t$PL�D$(H��L��H�=���Ds�����8���H�|$(�,���H�=a��tH�D$(L���X�m���
f�L���X�um��H��$�dH3%(��uuH�Ę[]A\A]A^A_ÿA��A���L��H�=<�1��m!H�
[�H�O��~1�H�=y��L!H�
O�H�.���1�H�=X��+!�Fq��fDS��H�� dH�%(H�D$1�H�T$H�t$H���n������H�5F�1��t���S%��yw�<$��u@H�=g��D����‰Ɖ��Io������H�D$dH3%(��H�� [�������o����t�H�
��H����y1�H�=���b f�H�T$H�t$H�|$�n����um�D$�=�R%��t9<$t��t&H�=Z�1��# �����n�����^�����uڿ��j��H�
<�H�C��c1�H�=
����o��H�
0�H���k1�H�=���H�
@�H����}1�H�=���f���H��(dH�%(H�D$1�H�T$H�t$H�|$�4m������1��5��������1҉��j���=�Q%��x=�D$��t9������������i������H�D$dH3%(��H��(Ë|$��t8��������i����t�H�
��H�J���1�H�=�����H�=P��4���������Ɖ��vi����t�H�
k�H����1�H�=���H�=��1��sH�
�H�����1�H�=��R�mn��H�
��H�����1�H�=Y��,f�f.���H��(dH�%(H�D$1�H�T$H�t$H�|$��k������������=�P%��x@�D$��t9��������h������H�D$dH3%(��H��(�fD�|$��t0�����Wh����t�H�
x�H�����1�H�=���bf�H�=�������‰Ɖ��h����t�H�
N�H�w���1�H�=Q��$H�=��1���1m��H�
��H�C���1�H�=�����ATI��USH��H��dH�%(H�D$1��il���
H��H���H���p���U��uH=���vAM��tH���Tl��I�$H��tMH��������H�L$dH3%(��u,H��[]A\�fDH�$�:u���M��tω��y���I�$���^l��H�
��H����H�=L��f.�D����P%H�=�P%SH�Ӎp�5�P%Hc�H���&n��H�gP%H��tHc5cP%H�H��H�T����
[�H�
5�H����#H�=j��f.�SH��H��Cg��H�{(�:g��H�{0�1g��H�{8�(g��H�{@[�g��@f.���AWAVI��AUATUSH��H��H����j��H���+A�>/H��ufDI��A�>/t��:L����i��I��H����I�������M)�I��0e��I��H�CH�����/H�xL��L���^n��C�D<A�|$u�+fDA�D$�L�cA�|$tL���^f��I�A�|$�/t�I���H�=�L����������H�=��L��������+�H�=��L��������
�C�:L����h��I��H�����蝹�����}�H�=��L��������_�CH�C ����H�C(H�C0A�$:M�t$�:L���qh��I��H���V��H�=S�L��������T�CH�C8A�}A�E:I�U��H�=2�H��������c�CH�C@�7�H�CH�=��H�CH�C ����H�C(H�C0�h��H�C8H���)H�=���h��I��I��H���-H�="��ph��H�$I��H���p�:L���cg��H��t
�x�dA�$��t6L����ƒ�߃�A��v�PЀ�	v��-<�"H�����u�A���t+��0<	��L���D��0<	��H�����u�L��L��H�5��1�1���L��H�C@�c��L���c��H��H��[]A\A]A^A_�c��f��[c������H�CH�=��H�CH�C �_g��H�C(H����H�=���Fg��H�C0H���H�=
��-g��H�C8H���H�=���g��H�C@H���_���H�
�H����nH�=���(�L�h�:L����e��H���vL��I��H�D$�b��H�<$M)��b��A��Hc��h��H�L$H��I����Ic�L��H��H�$�Vj��H�$H�y�if��I��H������H�
D�H�����1�H�=I��|@�CL��H�s(M�l$��:L��C A�$:�e��I��H����H�s0L���@����C$�p����A�|$/�9�CL����e��H�C8H�������H�
��H�B���H�=����f��CH���e��H�C@H������H�
e�H�����H�=b��DL���Ha��L���@e��I��H����H�
��H�����1�H�= ��SL��H�=��1��?H��H�=5�1��.L��H�=4�1��H�
N�H�g��T1�H�=���H�
��H�F��J1�H�=����H�=T�1���H�
`�H����H�={��H�
��H����zH�=\��H�
��H����}1�H�=;��nH�
�H����kH�=��OH�
a�H����lH�=���0H�
��H�z��~H�=���H�=j�1��H�
��H�M��jH�=����@��UH���HSH���^��H��tH��H��H���f���H��H��[]�H�
}�H����1�H�=X���f.���H��t���f��Df.���SH��H��t���H��[�_��D��Ðf.���H��H�=�G%u��G%��u31�H�5����H���b H�
��H�$��*1�H�=����H�
��H���+1�H�=���ATUS��1���f��H��H��Z��H��F%HE�H��tLL�%�F%��I��H��H��t7H�H;k~�H�sH�=�F%I�$�H�{�^��H���^��I�$H��u�[]A\�f���UH���SH���y\��H��t7H��H�rF%1�H��@f��H�}H��-H�C�a��H�PF%H�CH��[]�H�
N�H���P1�H�=a���f�f.���H�=F%t
1��������SH��H�7H�WH���Ia��H�CH��tGH�����H�CH�C H�C(H�C0�C8H�C@H�CHH�CP[�H�
��H�C��rH�=���f.���AUI��ATI��UH���XSH���?[��H��t"L��L��H��H��H���6���H��H��[]A\A]�H�
��H�����1�H�=<�����H��tGSH��H��J\��H�;�B\���{,��y[�f��`���8u�{,�NY����x�[���Df.���SH��H�����H��[��[�����SH���s���H��[��[��f.���H�7H�=RD%�}f.�����f.���H�=D%t"H�����H�=
D%H���@H�=�C%�@��UH�-X�SH��(dH�%(H�D$1��D�_���8�1�H��1��.c���Å�x�H�����^���8�P�H����SY����x߃�t�3D�^���8u����W����x��AY��H��H����H��1�1�1�L���������	��������vޅ�t/��u*������~����H�����?A��W�����H�=�B%H��t
H���H��u@H��H�\$dH3%(u(H��([]�H�
�H�4���1�H�=���)�D^��H�
��H����1�H�=���H�
T�H�����1�H�=w���
H�
��H�����1�H�=V��
���H�=B%AVI��AUI��ATUH��SH�����H����H��tFH��H���]����u7�;tBH�=�A%H���I��H��t+[L��]A�EA\A]A^��E1�[L��]A\A]A^ÐH����\��H��H����L����sL��H���,H��H��H�����H�=TA%H��H��I���H��1�H�=���u[L��]A\A]A^�f�H��u+�&���H��댐1�H�=g����bH��@%����fD�;t�H�=�@%H���I��H�������;t�A�EH��H�=��1�������H�
��H�'���1�H�=���,f�f.���H��H��H�=o@%�jf.���H�=U@%���H���W��@ATI��USH��W��I�|$I�D$�}W��I�$I�D$I�D$ ����H��t'f�H�{H�+�TW��H�{�KW��H��H���@W��H��u�[]I�$A\�@f.���AWE1�AVAUATI��UH��SH���dH�%(H��$�1�H�D$ �G�D$H�D$fD�:L����Y��H��H����L)�H�@H�|�6U��H�EH����I9�u*�Jf���&����'����"�%�H��L9�t"I��A�T$���<u��&lt;H��L9�u�@�L�sH�5��L���B\���xI��Hc��T��I��H����Mc�L��H��L����]��C�D%A�E<+��E�����E�D$I�E1�H�D$H��1���]��A�ƅ���H�T$�ƿ�;Y��A�Dž���D��H�5���V��I��H����H�t$PH�~H�t$�T��H�t$H��H�E�YH��~#L��H���X��H����H�EH�t$P�0H�D$PL��H�E ��Z��H�MH�/* DEFINH9��L��J�\#�T���;���(�|S��H�EH�����1�L�c��;���H���D$u�|$��D$H������D�&ampH���@�;����D�s;�&apoH��f�H�����<-�@�ED�|$�{�����t;�&quoH��f�P�������D$D�|$�t����f�yES�����y
_�����H�y� H�L$�W��I��H������H�=�<%H�L$tLI)�H�L$I�~��[R��H�L$H���pI�V�H�qH���[��H�=N<%H��B�D0�H�������1�H�=����
H�MH�<%�H�E�D$t)H��$�dH3%(��H���[]A\A]A^A_Ã|$~�H�=g�1��hH�=��1��ZH�t$H�=��1��GH�
�H�	��WH�=���(H�
��H����V1�H�=���L��H�=5�1���W���H�
Q�H����x1�H�=l���H�
��H�����1�H�=K��H�
��H�p��Y1�H�=*��H�
�H�O��e1�H�=	��lH�
m�H�>���H�=���Mf.���UH���(SH���yP��H��tH��H��H�����H��H��[]�H�
=�H�����1�H�=�����f.���SH�H��H��u�fDH��H�H��u�H��H���r���H�[�f.���H��t���f��Df.���SH��H��t���H��[�%Q��D��AV1�H�5��AUATUSH��1��!
H��t\L�5��L�-��L�%W�H�-U��SH�;M��I��KME�H��H�5����H�SMEą�H��IE�1���	H�H��u�[H��]1�A\H�5��A]A^�	���H��H�=9%H��t
���1��f.�SH�x3%H��H��H�;�P��H�3�
[�P�����H���H�t$(H�T$0H�L$8L�D$@L�L$H��t7)D$P)L$`)T$p)�$�)�$�)�$�)�$�)�$�dH�%(H�D$1��=�6%H��$��$H�D$H�D$ �D$0H�D$"H�D$dH3%(uH����f.�H���������S�����H���H�t$(H�T$0H�L$8L�D$@L�L$H��t7)D$P)L$`)T$p)�$�)�$�)�$�)�$�)�$�dH�%(H�D$1��=�5%H��$��$H�D$H�D$ �D$0H�D$"H�D$dH3%(uH����f.�H���8�������R�����H���H�t$(H�T$0H�L$8L�D$@L�L$H��t7)D$P)L$`)T$p)�$�)�$�)�$�)�$�)�$�dH�%(H�D$1��=�4%H��$��$H�D$H�D$ �D$0H�D$"H�D$dH3%(uH����f.�H���h������R�����SH��H���H�t$HH�T$PH�L$XL�D$`L�L$h��t=)D$p)�$�)�$�)�$�)�$�)�$�)�$�)�$�dH�%(H�D$81�H��$�D$H�D$H�D$@H�D$��3%�D$0��^H��$H�L$ H�ھH�D$(�H�D$@H�D$0�D$ �D$$0�P��H�D$8dH3%(uH���[��H�t$H���K������P��@��H���H�t$(H�T$0H�L$8L�D$@L�L$H��t7)D$P)L$`)T$p)�$�)�$�)�$�)�$�)�$�dH�%(H�D$1�H��$��$H�D$H�D$ H�D$��2%�D$0��y!H�D$dH3%(uH����f�H���x������!P�����SH��H���H�t$HH�T$PH�L$XL�D$`L�L$h��t=)D$p)�$�)�$�)�$�)�$�)�$�)�$�)�$�dH�%(H�D$81�H��$�=$2%��D$H�D$H�D$@�D$0H�D$}`H��$H�L$ H�ھH�D$(�H�D$@H�D$0�D$ �D$$0�	O���H���1���M�����I��H�t$H���Z�������1��=1%���Df.���1��=_1%���Df.���1��=?1%���Df.����"1%1������@f.����1%��������0%���f���1��=�0%���Df.�����0%1������@f.����G��w�=�0%�PH�
��1�H����H�=������f.���AWAVAUI��ATUH��SH��HH�t$dH�%(H�D$81�H�����UI���Ã�PHc�H���O��I��H�����AoML�t$ L�D$H�����M���PL$ I�EH�D$0Hc�I�<H�D$�H���Ń�O����x'H�L$8dH3%(L����H��H[]A\A]A^A_Ð�PA��*E�A�����=Hl$A��� H��D��I��E�Hc�Ic�H�D$L��A��H��H�D$L��H�4(��N��I��H�����oL�D$I��H��H������AH�CI�FH�D$I�<�G��A9��g����+���f��tL��Hc��qN��I��H����H�|$�uL�D$M���AoUHc��H�����L�AI�EI�F�\G��9�����H�
��H�ֽ��1�H�=������P1��7���H�
-�H�����1�H�=����H�
��H�����1�H�=���r����K��H�
�H�_���1�H�=���L���H�
�H�>���1�H�=x��+����f.���H���H�T$0H�L$8L�D$@L�L$H��t7)D$P)L$`)T$p)�$�)�$�)�$�)�$�)�$�dH�%(H�D$1�H��$�H���$H�D$H�D$ �D$0H�D$����H�L$dH3%(uH�����J��f.����H�7H�WH�GH�G�@��ATI��UH��� S�xD��H��tH��L��H��H�����H��[]A\�H�
#�H�d��:1�H�=>����f���H�����GH�W����AUATE1�UH��SH���f�I��D9e~dJ��N�,�H��t�H�0H��te��H�MH��tH�PH�}��H�UJ�<*H�H��H�0H��u��E��H�UI��D9e�H��H��[]A\A]��D����H����D��H�U��H����D��f���SH���#���H��[�D��f.���AWAVAUATUH��SH��X�_H�4$�wH�T$���gfffdH�%(H�D$H1������)�9���H�$H�G�9H�D$�/1�@��H����)��A�Ѐ9u�1��Hc�H��HD$H�D$H�D$L�8M���M�'M���1�E1���I��D�kO�$7M����D��H�4$L��O�,7�HH����u�H�EH��tI�UL��H�}��H�EH�t$L40M��H�$I�EH�D$I�EH�\$HdH3%(H�D$�6H��X[]A\A]A^A_�D�t$<����� ��D$8 �H��H�D$0H���H�
�H����t1�H�=���N���fD�sHc�H��L���vI��H�|$H�H����H�EH�|$Mc�f�I��H�$H�8H�|$J�(H�H�zBD(�E����f.���������Hc�\$8�G��H�D$0H���@���H�}E1�L�l$ J��J��H����I��D9u��?B��H�D$0H�$�\$8H�EH�D$H�D$8H�E�9����H�D$H�D$L�8M�������D� E1������Hc�D$8�TG��H�D$0H�������H�}���O����q���DH�}�c����H�0H��H��t*A�H�PL������H�EH�<J�'I��H�0H��u��fA��H�}����H�
V�H����H�=ӷ�~����E��f���D�GE����AWAVAUATUSH��8�>��H��1���H����)��A�Ѐ9u�1�A��Hc�H��H�D$H�GH�\$H�,H�D$H���.H�MH���!H�t$I��I��E1�E1��+fDH�D$H�T$M��E��H�,N�tI�H����H�t$H��H�$��D��E�L$M�GH�$��u�J�|=��Ic�D��H��H���
DH��H�s�xH�|5�u�M�]M��t1I�VI�}L�D$(H��D�L$$�$A��I�EL�D$(D�L$$H�D$�$H�T$H�|$H��H�:H�A9�t�o
B9I�EH8H��f�A�mxFI�EH�D$����H��8[]A\A]A^A_��D��L���Q���H�D$���H�
��H�Ѷ��1�H�=ӵ�~�@f.���D�GE���USH���>��H��1���H����)��A�Ѐ9u�1�A��Hc�H��H�WH�H��tMH�;H��H��u� @H��H�;H��tH���4C����u�H�{H��H��[]�f�1�H���f.�1��1������H���C���H��tH�H���fD��AWAVAUATUSH���GH�4$H�T$����I��E1��f�I��E9e��I�EJ�,�J��H��t�H�2H��t�H�B1��H����H�x�u�E1�1��"A��D9�~�I�EH�(Ic�H��H��H�42H��H�|$I��H�TH�$�Ѕ�u�I�EM�MH�(M��tL�I�}H�PH�0A��I�EH�(�S�Hc�H��H��H�4D9�t�oB8I�EH(H��f���g���H��[]A\A]A^A_Ð���G����SH��H���=��H��[�=���ATA��UH��SH��0dH�%(H��$(1�H�\$H�T$�D$H���:�������|$f����E��L�d$ taH�s�L���@D��H�����D$L��f�����E�p@��H����H��$(dH3%(��H��0[]A\�@H���L��E1�j�t$E1�H���@��ZY��t��|$�o����EH�=f��?��H��u�H�
��H���0H�=����f��E����1��[����@��H�
ιH����8H�=�����H�
d�H����=1�H�=b���f.�AVAUI��ATUH��SH��H���H�L$8L�D$@L�L$H��t7)D$P)L$`)T$p)�$�)�$�)�$�)�$�)�$�dH�%(H�D$1�����
H�5B�H���<��H����H��$H��H��1�H�D$H�D$ �$�D$0H�D$�)�H��I���:��I�}H�ŋ��~Hc�f�|�
tt�t(Hc��@��I�EH����Hc;Lc�L���L��H��4B��HcMuL��
fA�+�9:��H�D$dH3%(u^H���[]A\A]A^�f�����H�
��H����+H�=Ϸ�*�H�
ñH�l��*H�=�����&>��H�
7�H�H��6H�=������AU1�I��ATI��UH��SH���6�H��t^�g=��H����H��D��L���8��Hc؍C�����8=��H��uC1�蜉H��H��[]A\A]�fD�=���8uۋ}L��L��� @��Hc؅�x�����[�����L�<�H�
�H�^���1�H�=��A����#�����L��H�
��H�&���1�H�=x�A���"���H������?����A��A���P<��A��vB��6���J<��H�������L���@L����P���@L�q��x���@�H������f�AWAVAUATUSH��(H�|$H�t$H����H�D$D�8E���&�:H��I����:��H����L����7��H�\$Lc�L�,$��~xH�D$Ic�L�<L��H)�L9�|afDI���L�pL��L)�M9�v#�x uL���
L��L)���4��H��u�M��1�H�$L��H���;����tL��L��H)�L9�}�H��([]A\A]A^A_�L��H��H���:��H�D$L��H)ً0A���t$A)�D�8�L���H��H�
�H����H�=����H�
�H�i��H�=����H�
��H�J��
1�H�=|�����SH���1��3���C[�f�AVAUATUSH��dH�%(H��$�1��G(9�t
H������t-�k(H��$�dH3%(��H�Ġ[]A\A]A^�����H�����H�{@L�cx��5��H�{H��5��H�{P��5��H�{X��5��H�{`��5��H�{h�5��H�{p�5���C$L��H�C@H�CHH�CPH�CXH�C`H�ChH�Cp���1�H�5G���L���?�ǃ�Hǃ�Hǃ�ǃ�ǃ�����fDH���H����O$���-D�cE�����s������E1�H�{H�=H�{P�H�{p��H�{0��H��%H�|$H�H�D$�;��H���:L�l$@H���PH��L���;��H����D���E����L�t$L�k��(1���(L���`:�����H�s0L��H�=,�H�KHAVL�KpL�CPP1����^_A���(A�������H�
<�H�ڽ�J1�H�=ı���H���1�1�H���A��A����A���lHǃ��CHǃ�A������t*����������n���H�����D�SE����H�{xH�5�����H��t{H�5��H���/��H��tgD�KE���������	����0����H���H��������W$����H���E1�1�H�ߺ��A�������H�spH��t��	H�=(������t��t������(���������������A�-L�t$fD�D$�8���H������A�����6��H�
�H�@��L1�H�=*���H�
��H����1�H�=	��d�H�
M�H����1�H�=��C�H�
̮H�Ż�1�H�=ǯ�"�H�
�H����I1�H�=����H�
|�H����1�H�=�����H�
M�H�b��1�H�=d���H�
0�H�A��
H�=E���H�
ϩH�"��	H�=&������U1�L��SH����H��M��H�3H�s8���SD�ʉKH�CH�CH�C �C(��H�C@1�H�{xH�C0H�5��H�CHH�CPH�CXH�C`H�ChH�Cp��H��ǃ�Hǃ�Hǃ�ǃ�Hǃ�Hǃ�Hǃ�ǃ�Hǃ�Hǃ�Hǃ�Hǃ�ǃ��Hǃǃ�|����,H�s0H����S8H�=�H��HD�H��1�[]���H��[]Ð��AWE��AVI��AUA��ATA��UH���SH���%.��H��t,E��M��D��D��H��H��H���6���H��H��[]A\A]A^A_�H�
��H����k1�H�=(�����H����AUATUSH��H���w���[�S$���fHǃ�H�C�H������k���t#H�s0H����S8H�=R�H��HD�1�����CE1�A��A��H��tQ�2��H�����
�1��9~H���3��A��1���~E����u��u�H�����{D���N+���{�v+����t�2���8	��H�{0�+.��H�{@�".��H�{H�.��H�{P�.��H�{X�.��H�{`�-��H�{h�-��H�{p��-��H�{x�C�H�����-��H���H��[]A\A]�-����O ��������S$�������H���H��t&H���1�1�H����y���f���H���H���X���H���E1�1�H�ߺ���=���D����ugL����H�
٬H�*���1�H�=��A�����@�k���u?L�P��H�
�H�����1�H�=ĪA���@���@L����L���Df.���SH���c���H��[�,��f.���H���H����f.���H����@��H���H����f.���H�?��[@��H�����SH���WH�wH�?�XH�C[���AWAVAUATUSH���H�4$dH�%(H��$�1�H�����Յ��
���H��H�D$8�D$4�D$���#���L�$$A��E1��^�I�D$I9���A�$M��M)�< t<	tL���:L����(��H����E�M�I��E)�M��E��E����M��Icվ
L���(��I��H����A�~�
�dM���y���L��L)�H����A�<$HTTP��H�
��H�}��S1�H�=�����f.�H�sHH�����H�=���������A����fDD�d$�D$A��1�A�D����W*��D9t$��H������H�������)�9�L��Hc��0��H���H����Hc���������L�4$Hct$Hc�Hc�H�L��1����L����)��D�SE��u	D�[ E��tPH���H�$H��t������Z�C(������
D�C E��u������n�~fDH��$�dH3%(�W
H���[]A\A]A^A_��fA�|$/1�W���A�|$.�K���A�L$�QЀ�	��	A�T$�� t	��	��	A��I�L$	��	�H���y���D�W�A��	���p���������H�
�H�j��_1�H�=�������H�<$�(�����f�����	D�l$E���SH�$D�c���H���E��������S ��������@H�4$Hc�H����H�Ņ�����������H���9���)�Hc�Hc�H��+��)���V����H���{��CH�����H��H����SH��������SH���H�;����T�6����+���8�����D�KE���	H����'��ǃ�Hǃ�����D)�H�4Hc�H���O*�����+��ǃ����H����-���Hct$H�<$Hc�H��*�����H�=g�1������s�����{(�{����C(�o����K ���\�����x�P���H�{xH�5��8�H��H�����������I�&I�&�\$(�\$ < ��H�|$@D�?A��;w
M���'H�GH�D$@D�8H��H��A��;w�M��H�As�H��H)�H����H�����H�5]�H�L$�@*��H�L$I�&�������D$1�A��;�FE���=A��,� H��f�H�L$@D�9H��E���A��;�H��A��,uׅ����D$���KH�G�H�D$@H��H���x�,t��������t$(f�f/�����������A��tfA�<$
uI��A��L��H+$Hc�H�D$�D$�D$4�#��H��H�D$8H����HcT$4H�4$��,��Hc��o#��I��H�����D$��9���H�|$TE1�H�D$LH�D$LH�������HDŽ$�H)�A���d����1��H�H�:�D�l$HL�l$@L�d$@�L��L�|$X�l$`jpP�)��A^Z�����L���"�����BL��A���#$��+l$L���W$���D$4�(������H������H�������)�9�L��Hc��U*��H���H���,Hc���������HcT$4H�t$8Hc�H��{+���D$4��H�|$8�#���+���H��������DI�������H���< �����DI�D$
H9���@�� �g���@��	�]���H�
:�H�Ь�[1�H�=��M��D���FH�T$8���H������f�)�H�4Hc�H����%�����+��ǃ����H������L��A���"��+l$�|���H��A��;�h�
Ƭf(�H�|$@������D$ ��,t'��t#H�G�
D��,tH�D$@�H��H����u�,���������H�����(����"��ǃ�Hǃ��\����XH���M�$���1����+T$`H�=�A��H�l$4���H�<$L�d$8�!��H�|$8H��H�{�D+t$`��H�|$8H��H�r���H��D��L��H�o�1���H��L��1�H�n�D�����D$L�<$�5���1��?*�D$���\���1��D$�M���H��1��D$�;���H�OH�L$@�W�� w(I���|���H��fDH�|$@�H���� ���� �
!���q�R���H�QH�T$@�q@�� w#I���5���H��H�L$@�1H��@�� ���
ڪ@��=�
���H�t$@H�z�D$�L$��(���D$I�&f.���zaf.����Eф�uOf��f/�wEf.��z�L$������
g�f/���������H��I���
����w���Df��u���H��I���2����V���@�L$���h����D$(�]����%��d$ �+���A�����H������H�
V�H�@��O1�H�=b�����d$ f��1�f/����$���H�
��H���s1�H�=)����H�

�H���U1�H�=��c��H�
ɘH�Ũ��1�H�=��B���]#��H�
�H�����1�H�=�����H��H�
�~H�{��?H�=�����H�
i�H�\��@1�H�=~�����H�
��H�;���1�H�=]����H�
!�H����H�=>����H�
!�H����R1�H�=��x���-x��l$(���H�|$8��H�
��H�����1�H�=ߛ�:��H�
i�H�����1�H�=�����H�
�H�{��eH�=�����H�
͗H�\���1�H�=~�����H�
ڝH�;���H�=_����H�
v�H���Z1�H�=>����f���H���G��u'�G(�G �H���v��u1�G(H����H�
>�H�l��
1�H�=ޚ�9��H�
0�H�K��
1�H�=��������AWAVI��AUATI��UH��S��H���L�D$@L�L$H��t7)D$P)L$`)T$p)�$�)�$�)�$�)�$�)�$�dH�%(H�D$1�A��$������H���L�-ԉ�H��L���������H��$H��1�H��H�D$H�D$ �$ �D$0H�D$�j��H��L���H���€���uL��M��E1��QDL���H�5�1�����I��L��H��t&L�=8��H��L���������L��1�M��t�M��H��L��H�5��1�1��~��H��1�I���Q��L���I������I�t$HH��tw�H�=������u`L�����H����H�����H��L�����A�D$����H�D$dH3%(�RH���[]A\A]A^A_��H��1�H�5�zL������L��H�����H���H�����H��L��������t��|���fDL��L��H�5�1�1��z��I��L���_��L���I�����tAL���H�5�1�1��H��H������L��L��H�5��1�1��*��H��I�����I��L����L���X����H��$H��1�H��H�D$H�D$ �$ �D$0H�D$�-��H��L���H���€�������L����������H�
�H����1�H�=F�����AWAVAUATI��UH��SI�\$xH��H�wHH�WPH�=̓dH�%(H�D$1����H�5ʓH�����H��t	�8�>ADŽ$�����I�T$H�H�=��H����������H�=��H����������H�=v�H����������H�=|�H����������H�=?�H��������O�H�=%�H��������1�H�=�H���������H�=��H���������1�H�
����L��H������1���A��$����8H�52yH���A��I��H��t_���tXL��<:u�fD<:���HӀ�v+�Hƀ��L</�D�H����8��{<�-H�����u�I�t$PH��H���ځI��H����H�xt2H�5A�H�����H��tH�ƹ
H�=-�������eI�>�{H�$H����I�l$PH9�v)�{�/H�C�t��H���8/uH��H�$H9�u��<?�0H���H���I�|$X�
I�|$`��I�|$h��I��I)�I�}���I�D$XH���rH��L��H���-���?H��B�(�K��H�����t=<?t9I��H���oI)�I�}���I�D$`H����L��H��H������B�(H��tH�}����I�D$hH����I�vL��A��k@H��
H�����A��$�H�$�8��������fDADŽ$�����1�H�
���L��H�ߐ���1�H�\$dH3%(��H��[]A\A]A^A_�fD1�H�
̂��L��H����K���1���1�H�
����L��H�ߏ�#���1�������H�5�1�����H��H������H��L�����A��$�������?���H�5��H�����H�������H�ƹH�=��������e���H�5�H������H��H���J������t!<�;���H���	���-���H�����u�H��H�5H����H��H��t(���t!<�����H���	�����H�����u�I��$A�T$�%�����9��1H�5��1�1�����H��I��H��H���@I�t$PM���M��M����A�}H�
�tLD�I��$RM��H��SH�=�H�
�PHD�1�1�VH�5–�]��H�� L��H���.��H�=?�1����H���(��H��L�����A��$���yADŽ$�I�FA�|$(I��$��1���A�D$(�#���DADŽ$���Q���H�����L�,���L�-�s�#���I�t$PH�޳H���H��u
H��H��H��E1�L�
��������H��H��H�����H�
��H�����1�H�=��i��H�
d�H�����1�H�=��H��H�
��H�j���H�=Ώ�)��H�
�H�K���1�H�=�����H�
+�H�*���1�H�=������H�
��H�	���1�H�=k�����H�
ƌH����1�H�=J����D��AWAVAUATU��SH��H�|$H�T$H�L$XL�D$`L�L$h��t=)D$p)�$�)�$�)�$�)�$�)�$�)�$�)�$�dH�%(H�D$81����"H�t$�H�=e�H��$0H�D$(H�D$@�H�D$0�D$ �D$$0�����/H�T$0�D$  �B�D$ (L�b =���_��D�p���.��L��M�LL��fD�8�A��H��I9�u�Mc�L�L$L�����L�L$H��I���A�/A��@�A��E9��H��I9�t9�Ic�A�@L���y؉σ�?H�A��@�������@@�>A��A�/�H�t$�H�=G�C�D/�������u^H�|$D��L����H�D$8dH3%(��H��[]A\A]A^A_�H�t$1�H�T$ ����H��I���T�������L���0���Mc�L���
��I��H���U���H�
ӊH�)��*1�H�=ی�6��H�
ɊH���41�H�=�����H�
t�H���1�H�=������H�
3�H�Ɩ�H�=z������������F�AVAUATUS�����A�A��=���H���yA��H��Hc�����I��H����D�(�D��@��A��I�4<L��ʀA�<H����u���D���t+Ic�D�F�L�M����H���qH���Q@�pI9�u�L�Ic�H�����C�T5L��H��[]A\A]A^��H�
��H����C1�H�=������H�
��H����H1�H�=b����H�
y�H�o��D1�H�=A����f�f.�AUATUSH��H�����L�����xb9�N�)ЉՉ��M�����{$���$H���H���H��A��H��A�����I��A���H�
��D��Hc�H�>���M��u�ǃ��C����H�߾�T$�3���T$H��[�Չ�]A\A]Å�x�H����[]A\A]��H�H�C�C(�P���vӃ����C(H����[]A\A]�f��������A����H��CL��H�C �+8H�������H�������{��H����[]A\A]�fDH�CL����7H����������%����H���4�������H�C1�L���V7�C(�P������������H�
��H�����1�H�=2�荿��D�K������H����������XL����6����fD�XL����6�G���fDH�߉T$�d���T$�7���H�
�H�-���1�H�=���
���H�
�lH����1�H�=�����H�
�H����1�H�=m��Ⱦ�����AWAVAUATUSH��H�$H��hH�T$H��H�>I����dH�%(H��$X1��jAI�]H�D$A�E�D$f�H�D$E1�fD�@����D�D$E���I���1�H����A�E(����r[��wVADž�E�eE�����L���A���/�Ic�����	A�U ��t,1�H�5&wL���0���I���H��u�A�M ��u�I���H�D$A�u��ƒ��uA�u(�N����K��H���W��H�|$	�f�L�����H��H���45H����H�D$�f��uA�}����I������t�t�A�]�\$�����������H��$XdH3%(�
!H��h[]A\A]A^A_ÐH��L������H�Ņ���I���t-A���9���)�Hc�H�Hc��R��A)��I���E�M E������H�������E���E�������H�D$A�u��ƒ������A�u(�N��������A����������H�������E�} E��������������8�:I��I����a���A���S���E�UE���F���H�D$f��8���@�s��ADž�IDž����D�|$E���N���1�����I����7��I���IDž�ADž����I��IDž�ADž���H�D$E1�H��fD�0�2A�m����
��H����1��gVI�������������	���������w
��H���1���V���PH�D$��~���L�|$E1�H��1�fE��2A�m���A��S���E���E����IDž�H�t$L��IDž���E�uE���9���L���_���,���1�L�d$P�UI���`�	��H���CL�d$PI���L���	���Í@�����	��H����I���x�1���U����L���E���XH���(1A����A���=�NA�}(E������]I���H����E����8���A�}(A��A�����E���ifD�G�����D�L$���fI���� A9��D�d$E1�H�l$P�iA�L$E����Mc�F�t$P����A���������nD����A�̃��A���A�ƀu���E1�A���fDD9���A������u�A��A���YA������:E���!A��E)�D9��?Ic�H�I���E��L��A�������C�<A�����A���A�Ԁ�E)��A���D9��d���I�������D$IDž�ADž������������A�}�L�������Å������0���8t�H��1��S�;��A�M��uL�����I����D$1�H���$���E�������f�D��A�ƀ�C��A��A�������ADž����E����A���M���A�t$A�<Hc�E�48A���������Hc�Hc�H�L���H�����\D�1��A���u�D)�D��A��D�N���E���9���E���A9�����I���A���E����A�����A9���D)�Ic�Hc�H����E)��A���E�E)��������DE��I���Mc�F�4"����DADž���A��A����C���I���A��Hc�Ic�I���E��Hщ�H�L��A������LA���I���A����2���A9��)����ADž�A��A9���������IDž�ADž�����D��A��������D9��+���Ic�D��H�t
�"f�D�6A���t3D9�t4H��D��D�G��y�A��M���Hc�E�4:A���u�A�E)��E��D)�E)�E���D9�������A���E���H���D��A����h���9���A���E��\���fDE��A��D�����f.�E���E�����D)�A9��*E���!G�4���#D)�E��1�����E1�D9�A�UA��A	�E���������A�}(�������E���E���mMc�D��1�D��E�������N�\P� A�� t:A��	t4A��
��H��������x-9��=E�3A��:uʃ��D���f�A���t*����fDE���M���A�Mc�G���DA���E1�A9�A�UA��E���/���D�L$�&�E1������E�D$���;E����A9���Ic�A�QD�dPA�� ��A��	��A��
�7	A��
�J	H�t$L��D�L$ ��IDž�IDž����D�L$ ��D��L��T$ ����T$ H�����*H�=ۅ��Hc�H�>��D�t$E��������!���B�D
D�L$9����D$���h	A9����A�����A�U�l$������D$�������A�����9�t*�Hc�HcD$I���Hc�H�H��[��A����D$�����I����P�H�
�zH�l��H1�H�=�z�Y���f�E�EE���X���L���k��A�U�Q���f�D��A��������A��{���A��1�D9�A�U��A	��
���A��A������E����Ic�E1�E����	H�tPL��D��D�L$�,�D�L$F�$0G�4!���I�EHE��������H����A�|$D�L$0Hc�D�T$(�T$ ����T$ D�T$(H��I�EHD�L$0�VE��1��:D9��aIc�A���|4PD�_������A��G�@�4H��A9���I�EHE��y�A���I���D�A��Hc��<7�I����T$ H���>I�}xD�L$(�`���D�L$(�T$ H����L�D�L$<�T$8L��L�T$(H�D$0�p���L�T$(D�dH�D$ A�t$L��Hc����H�L$0L�D$ H��HcT$8D�L$<H���A�pMc�B� ��trA������<�9���
�DP�z�� tA��	t<��
tfL�Hcփ�A�Hc�A9�~.��y�A����z�I���H���� u�A��Hc�A9��H�Hc��0A�UDL$1�D9���A	�����A�D$�9�tԸ
���D�L$H���I�EPH���I�}p�QH��gH�
�gL��1����T���L�����A�U�m���I�MHIc��I�}P���D�L$8D)�D�T$0Hc�D�D$(�T$ �h���I�EPH�����T$ D�L$81�A�����D�D$(D�T$0E�E9�}BE����D9���Ic�A���LP�� ����	��Hc����8I�EPE9�|�Hc��0I�EP�8/t>I�uH�H�=t��������5H�ƹH�=�u������I�}p����D�L$0)�D�T$(��D�D$ Hc��~���I�EpH����D�L$0LcD$ A�����D�T$(D�A9�}YE���9D9��B�TPA�H��
t8�֍z���߃�v�� t��	uLc�E��t���Ic�Lc�A��@�4I�EpA9�|�Mc�B�I�Ep�8HTTP�*
I�EHD�L$H�����H�=�e�5���I�EHH������H�
�tH�
���1�H�=�u�G����I�}pD�L$�����H�=�e���I�EpH�������H�
htH�����H�=�u������������,���A���I���D�A��Hc�����A���I���A�HD�Hc�����輬�����9L�����1�H�
KoH�}���H�=uA��1��G�����L�|$E1�I��fE�'��JA������e�H�D$f��W��C�������L�$���H�
�nH����1�H�=�tA�����L���������D��A�����9���Hc�Ic�L��D�L$H�I���"�D�L$A��A���A9��M	I���D)�Ic�D�L$Hc�H��=���E)��D�L$A���C�!HcЅ��hD��)����[���;H�
sH��~��1�H�=�s�%���DA���I���A�QD�H�D�$�9���I�����!��������������H�D$f���I���EI���A�m���>I����h���H�D$E�]ADž�IDž���ƒ�E���[�1�������9�~Hc��DP��
���������
9����yD�L$0Hc�D�T$(�L$ �{�I���H�����L$ D�L$01�D�T$(D�Y�E���?D9��Ic�A���|PD�G����� A��G׈0H�VI9���I���H��E��y�A���I���D�A��Hc��<�A�U����Lc�I���L������I���H����
HcT$H��H�tPL�������i���L�T�������L�H����/���I���Hc���D�L$0)�D�T$(�Hc��t$ �k�t$ D�T$(H��H��D�L$0��A�������N�1҃�������;D9���Ic�A���DP�� tG��	tB��
��Mcƒ�A��B�D9�t2E��y�A���M���D�A��H�A��� u�E��u���9�u�Ic�H��M�exI���L��D�L$ ���D�L$ H����I���1�H�=	z�Ԣ��I������H�����A�UD�L$ IDž��7���9�t��
�<���E1�D��A������m����H�Ã;�\�I���<�A���.�H�D$1�f�����H�=w1��2����-����1��BA�M������I�E1�H�ω\$ ����A�E(D�L$ �P���v���A�E(A�UA����W������O���L��D�L$ �B���A�UD�L$ �4���I�EH��H�L$ ��H�L$ H���E�E$E���uA�������	I���H���}H�_I���1�L��Љƒ��+�A�ى�A�}(�P���A�������	�L��D�L$ 贺��D�L$ �%���f.�E���A�ى�H��E��������H�A�EH��I�E D�L$ ��D�L$ H����A���L��D�L$ �����1���D�L$ ���H�A�ى�I�EA�E(�P����������n���H�
�jH�-y�_1�H�=/n芤��f.�L��訹�����E�UE���7���L��D�L$ 艹��D�L$ � ���E�U1�E���F�E�M1�E�����5�H�=�t1������L��1�H�
m]H�l�����D$���������;L��H�
�gH��x��1�H�=gmA������ڤ�����L�����H�
kgH��x�z1�H�=/mA����H�=�\�;�I�EPH�����H�
�kH�x��H�=�l�O����I�����j���A��A��A�����A���������2�D���D$L1�H�D$D��Hc�L��c9��7���H��t�� ����	����
����
���x���9����
���p����y��߈DDH����D)�y�I�����L��螷������x/�����@��1<�����A�}(tA�E(DL$�+�Hc���I��H����I�����~XH�E�A�����I�t�D$�9��yHcȃ��LP�
H��H9�t#��y�A���H�����Hc���J�H9�u��{�M�����L��������L��������I���H��L��D�L$ 萨��A�UD�L$ ���D���G�A����I���H����I�����D�L$IDž�ADž�������������H�D$D�H�=}gH����€����7�H�=fgH����€�����H�=oYH����€������H�=,gH����€������H�=gH����€������H�=�fH����€������H�=�fH����€����}H�5�fH���d���fI��A�E(�0���KI���=H�=�p��D��1�肛��I���H����A����Hc���I���H����Ic��Hc�L��H��<�A���I����A���H������I��A�UA��I���<I����H���0���HI��L��1��@��I������ADž�ADž�H�\$�f�D$��f�������0���D���.�������E���5�D��D����XH���K����A�E(I��H���4�����*��@����1�H�=p����A�E������f.���L��1�D�L$H��WH�
�W�.��A�U�T��XH���D�L$ � ���I������ADž������A�M�������L���l����������H�
�pH�r�1�H�=`g軝��H�
�fH��q�P1�H�=?g蚝��H�
SfH�r�o1�H�=g�y���H�
�oH�r��1�H�=�f�X����H�
^eH�Br��1�H�=�f�/���A��'�H�
KH��q�d1�H�=�f������A��Ic�A�����fDH�
�eH�*q��1�H�=lf�ǜ��A�����H�
�dH��q�N1�H�=<f藜��H�
�nH�q�H�=f�x���H�
eH�q��1�H�=�e�W���H�
PnH��p��1�H�=�e�6���H�
�dH��p��1�H�=�e����H�
oH�wp��1�H�=�e��@A�}(A�ى��������e������H�
ndH�Sp�1�H�=Ue谛��H�
�IH��p�!1�H�=4e菛��H�
0mH��p��1�H�=e�n���H�
nH��o�z1�H�=�d�M���H�
\dH�?p�&1�H�=�d�,���H�
#aH��o�W1�H�=�d����E��A���/�H�
�lH��o��H�=�d���H�
McH��o��1�H�=ed���H�
�mH��o�(H�=Fd衚��H�
�cH��o�?1�H�=%d耚��H�
�cH�ro�,1�H�=d�_���H�
NbH��n�B1�H�=�c�>���fDI���A�ى�H����D�L$ E1�1ɺ�I���L���D�L$ �n�H�
bH��n�h1�H�=�c�ݙ��H�
kH��n�_H�=cc辙��fD�S���0�H�
NbH�*n�n1�H�=,c臙���D�����A�}(����3�����G����H�G0����H��xH�5�b�l���f�f.���H�GH����H��H��RH�ybHD�Ð��H��H��xH�5F����H��t�8H��EHD�H���H��EH���@���G����H�GX����H�G`H��QH��HD��f���H�GhH��QH��HD��f���H�G@H��t�f�AVAUATUSH���@���H��I����L�cPH��L������h!��"Hc��V�H�C@H���H��Hc�D�s���H��H�5`aH����H��L��H����H����D9�u$H��L��H����H�C@[]A\A]A^�f��H����������!�%����t��E��L�k^�����D�H�QHDʺ��@ƾH��1�H��H�������L�cPH�K@�u���f�H��H�5�`H���^�H��L��H���P�H���P�:���H�
<jH��j��1�H�=w`�Җ��f���H�Gp����H�Gx����H���d�@��AUI��ATI��USH��H��H��tM�ͅ�tG�v΁��
���.H�{Hc���H�CH���6Hc{Hc�L��H����kL���o���H�5�\H���`���H��tKH�{t4�
1�H�����KM��t09�},�H����[]A\A]��M��u��X@�KH�SH� OH�sL��H��HD�H�{���g�H�C�CM��u��E���wH�s1�1�L��1�H���4�H����[]A\A]��1�H�
�N��1�H��N�4��H����[]A\A]�H�
XkH��q��1�H�=+l����H�
OlH��q��H�=l������S1�H��H�
<NH�k�����H�߾�A���1�[�f.���ATI��� UH��S����H��t@H��H�E1��CH�H�E H�C����H��L��H�5���H�C荳��[�]A\�H�
�kH�q��1�H�=Gk�2���f���H��t_AUI��ATI��UH��SH���(H���W��H��tCH�@H�{0L��H��H�
=���H�hH�H�@L�` H��[]A\A]�FH��0�FH�
hkH��p��H�=�j蠓����H��tgAUI��ATI��UH��SH���(H������H��tKH�(H�{0L��H��H�@H�@H�@ L�`H��[]A\A]�Ef.�H��0��EH�
�jH��o��H�=j�������H��tWAUI��ATI��UH��SH���(H���'��H��t;H�hH�{0L��H��H�H�@L�`H��[]A\A]�bEf�H��0�WEH�
@jH��n��H�=�i�x������AWAVA���AUA��1�ATA��USH��H��HH�-��$dH�%(H��$81�H�GH�ED�G�GH�G �G(�D$H��t	�8�2����C���1H�L$A���Ǿ��������1�A��HDŽ$���f��$���f��$�DŽ$�%��$�D��D	���H�|$ 1��_��A�Dž���H�|$ 3|$(��E����A������E9����E)�A�l$���F�4*E��xYH��$�H�D$��1�A��f��$�E9��C�>�{H�t$���D�f��f��$�������u�f��$����{���������g�{H�T$ H��$��D$ ������!�|$ ����$�H�=:j1�f�����3貌������H�CH�����SH�{0H�5m�����f�P1��;@1�H����H��H�5�K�S���H�{h�:H��$8dH3%(�H��H[]A\A]A^A_Ð������C����H�L$A���Ǿ�������H�uH��$���a��H�U���UH�|$:H�D$2HDŽ$�A�H�D$2H��H)��Hl�����1��H�fD�D$0H���oD$2�oJL$B�oR T$R�oZ0\$b�ob@d$r�ojP�$�H�B`H��$��Bh��$�����{H�t$0�P�������H��$H�}�H��$�0�u������H���$H�}�0�{�������{���������H�uH�=[g1�輊������H�CH���
���H�
fgH�_j�FH�=+e����fD��$�%�=������H�����H�U����H�=Ag1��ҍ������H�
�eH��i�S1�H�=�d謍��H�
�cH��i�Q1�H�=�d苍��H�
�fH��i�zH�=�d�l���H�
�cH��i�v1�H�=`d�K���H�
�fH�ui�u1�H�=?d�*���H�
fH�Ti�r1�H�=d�	�������8H���Z���3H�=eH��1��������8H���8���3H�=/eH��1��Ō���`���8H������3H�=MeH��1�裌��H�
|eH��h�D1�H�=�c肌��H�
�7H��h�^1�H�=vc�a���H�
�bH��h�`1�H�=Uc�@���H�
�bH�jh�a1�H�=4c����H�
�bH�Ih�b1�H�=c���H�
0bH�(h�(1�H�=�b�݋��H�
�cH�h�*1�H�=�b輋��f�f.���AVA��AUA��ATA��U����S����H��t"H��E��D��D���H������H��[]A\A]A^�H�
qeH��g�1�H�=\b�G������������������USH��dH�%(H��$�1�H��tt�WH�������E(1ۅ�~ @H�E H��H��H��H�x �P9](�H�} ���H�}���H�}0�<H�}h�0H�)�$H�;H��t
�?u\�W��H��$�dH3%(u|H�Ĩ[]�f.�H�=a1��҆�������8�U����}�:����x��D����H��H��� ��H�;��u��D$%�=��y������H�;�l����#����SH������H��[���f.�����f����G����AVA��AUI��ATI��UL��S�G(H�����G(H�H� H�4�H������H�C H��tc�C(H�{�pHc�H�����H�CH��tcHcS(�H��H��D�0f�HH�C H�D���H�@L�hL�`H�h []A\A]A^�H�
NcH�/e��H�=`���H�
�cH�e��H�=�_�߈��Df.����G(��~E��H�OL��1��f�H��L9�t'9tu�H��HW D�
E��u��H�z �b@�Df.���ATI��UH��SH��$H�;t1�H��~H�H�[]I�D$A\�fD1��a��H���f�f.���H�GH��t3USH��H�-��$H�UH��t%)к����D�H��[]H��f.���H��1����H��H�EH�C�Đ����D�G(H��t	L�O I9�vPE��~CA�@�H�w1�L����H��L9�t9Lu�H��HG D�E��u���1��DIc�H��I��H9�s�I���������I��M)�L��I��H��Hc�H��I��H9��r�������h���L��L�OH��H��I��A9L��K����f���AVAUA��ATA��UH��SH��H����H����H�E H9��HcU(H��H��H9������u~H+] H�EH��i�����Hc�H��H�D�pD9(ufD�`D��[]A\A]A^��{�������L�\���1�H�
�aH�<b�
H�=@]A��H�EH��@�;�������L����H�
�\H��a�
1�H�=]A���J�����������L�܃��H�
�`H��a�1�H�=�\A�������軆����uGL�����1�H�
�`H��a�H�=�\A��H�E ����L�Y�������@L�I�����L�9����h���@L�)�������@�;�����uoL� ���1�H�
�[H�a�H�=\A��H���"���������u?L���H�
�HH��`�1�H�=�[A�����@L�������L������Df.����o	w�@��AWAVAUATUSH��D�_dH�%(H��$�1�E���mH�D$8I��H��H�D$�V��H�
��$H�A�G�D$$���D$ A�GH�D$pH�D$(A�G�D$���A�G(E1�I�M���D$M��H�D$�����H�L$���ofD�D$K��M�a�H��D$��9���J�'f�x��Lc�L��L�t$@L��I��M��I����I�}��I��J�?f�x��H�L�l$H�H�I�EK�|��J�8I�u �(H�H��oA)�oOA)NH�G I�F ����I�E fAoH�fAo^XI�V H�P 9l$�p���I�}M��I�E H�DH��tH�L$H9�|H��yH�D$�L$M��AA9M(~�D$���fDM���IcEM��xH�
�$HH�L$H��xH9�~H�D$H�D$H��x)H�D$8H�L$H9��DH)�I��I��Ii��H�D$��Lcd$�fD�����8�
I���L���L����x�H�|$����H�|$L�l$Ll$8���H�
w�$H�M��x&H��S㥛� I��I��?1�H��L)�H;T$8���D$���jI�Gf�x��A�G���*A�W(����D$���D$H�D$@1�A�H�D$�������1�f�~H�HH��tKH;L$8D1�D�VH�T$H��H�p fD�T$@D�T$�PD�T$��uwMg I�|$ A�T$A�$A�W(A���Ѕ��|$��H��A9���I�G L�$�L�D�E��u�I�wL�sL����^����Nf���W������a����D$@fA9�t
I�WfB�D2A�W(눋D$ A;G�q����D$$A�GH��$�dH3%(�7H�Ę[]A\A]A^A_�E�OE���A�W(�Ѕ�t��L$���L$����������������~����A�G(��9��s���Hc�I�O H��H���L�L�c؅�t�I�)�H��Hc�H�4H��H�|��s��A�G(I� )�H�4L�H�H��H���S��A�G(��A�G(y�H�
\VH�h[��1�H�=zV�e��DH�|$���H�
�$H�����b������L�C}��H�
�UH�[�`1�H�='VA��A�W(�����H�D$������A�H�t$(H�T$@�D$@������Å�x��Ǻ1���o������E�WhE�G1�E��tI�OhA���L��藚��H�п����L��H�
����I����XH�����A�W(���<����D$A�W(���D$����IcG�����H�D$����������H�
Ʋ$H���L�~������5��DH�
UH��Y�R1�H�=U��}��H�
�YH��Y�b1�H�=�T��}��H�
TH��Y�H�=�T�}��Df.���ATA��U��SH����t	��	��tH��hD��H������H��[]A\��H�
�7H�8Y��H�=\T�G}�����H��h�C��H��h�����w����H�G0����H9wtH�����fD��USH������H���m��H�����T�H��H���T�����H�����1�H���=���@H���0�������H��H����1ҾH��H������H������H�=Z1���w��H�5ZH��������tHH��H�5����1�H�=�[��w��H��H��[]�H�
!YH��f�r1�H�=<Y�{��H�
�ZH��f��H�=Y��{��H�
AYH�rf��1�H�=�X�{���AUH��ATI��H��UH��H�=h[SH��dH�%(H�D$1���w���i�����t|A�Ņ�u5L�-��@����8�R1�L��1��&���Å�x��L�d$�������8u1�L��D������Å�x�A9��/�D$�ԃ�	���H��H�=�Z1��'x��H�D$dH3%(�-H��[]A\A]���[���8�t���������x�t�Z��+���8�#���k����x��L�-�������8���L��1��#���Å�x�������8��1����a����x�t�ufD����8����������x��q�?�w���H�5BaH�=Na�������L��H�5<a1�1��~��H��H����jH�5=aL�
aPH�6aL�aH��PH�*aH�
aUH�	aPH�aUPH�aPH�aPH�aP1�����H��P���S���H��H�=@Y1��iv��H�������5���@H�=QZ1��zu������D����E���H�
7`H�yc��1�H�=V��x��fD��������H�
`H�Ic��1�H�=�U�x�����H�
YH�#c��1�H�=�U�x��H�
�_H�c��1�H�=�U�_x��H�
�_H��b��1�H�=�U�>x��H�
XH��b��1�H�=bU�x��H�
�XH��b��1�H�=AU�w��H�
�XH�~b��1�H�= U��w��H�
�XH�]b��1�H�=�T�w��f.�AWI��AVAUI��ATI��USH��H��H��tH�H�L��1�1�H�5D_�P|��H��H���*L��H������H��I��H��������EL��H��M�4H�5_1��	|��I��H���%H��L�����H��M��tL������H�I�EL�����H���$H��L)�H�@H�L�hH��LI�I��L������I��H����I9��,I��1�1�������I����A�P�I��H9�tHI�~�w��V���v�V���wA�V�������������Q	����I��H9�u�M)�M9��L��7�VЀ�	w�V�@��+t:@��/tD@��=tT@�� �s���L��E1����H��L��[]A\A]A^A_���>�h���fD�?�X���E1����|����H9��p����I�F�� w�H���P��� v��=u�H9�w��C���E1��>���H�
s]H��_�1�H�=�R�[u��H�
G]H��_�1�H�=R�:u��H�
�VH�l_��1�H�=^R�u��H�
]H�K_�
1�H�==R�t��H�
�VH�*_��1�H�=R��t��H�
�VH�	_��1�H�=�Q�t��fD����u�fDH��1��%��H���@H���D��H��t?SH��H��*���H�{ �A&H�{t���H��u H�{[����fD[�fD���Ku����u/L�0r��H�
�7H��^��1�H�=DQA����L��s����Df.���SH���S���H��[銿��f.���1�1��S����SH������CH��H�{ �H�5����H�CH�CH�C[�#@f.���S�X衽��H��tH��H�����H��[�H�
UUH�!^��1�H�=`P�s���f.�AWAVA��AUATUSH��H�|$dH�%(H�D$x1��"������[E�����@����I��H����D�t$1�A�@fDI�m�M�<H)���3���8���|$H��L��諼��A�ƅ�x�H�E��tH�H9�uuM��@L��覼��H��H����L��H��H������L��I����I���?M��H9��v���H�
=ZH�`\��1�H�=BO�q��DIc�H9�t�D�t$L9���A���s����8�jD��貺����x�A���UH�\$hH�l$@L��H��H��H�5�Y���H�T$H1�L��H�5�YI������H�T$P1�L��H�5�YI�����H�T$X1�L��H�5�YH�D$���H�T$`1�L��H�5�YH�D$ �~���H�t$@H�D$H��tH�D$HHD$PHD$XHD$`uiL�����L��蹼��L��豼��H�|$觼��H�|$ 蝼��H�|$蓼��D��H�L$xdH3%(�8H�Ĉ[]A\A]A^A_�f.�H�|$L�������t�H�L$HH���aH�L$PH����H�L$XH����H�L$`H��tH�T$H�t$��������6���L��L�-{X��H�D$pH�D$0�@H��H��L���b���H��u}H�|$hH��u�H�|$E1��V�����A��蛿��H����轹������H�T$H�t$�t脺�����I������H�T$ H�t$���c������6������fDH�T$@H�t$01�H�D$pH�D$8�%��H�L$8H��H�D$(��H������H�L$(H�|$1Ҿ褺��H���.���H�|$(���H�|$h�5�������H�t$L���ι�������������p����u+L�
m��H�
�2H�SY�I1�H�=LA�����L�
�n����H�
%QH�Y��1�H�=�K�n��H�
4QH�Y�=H�=�K�n��蟾��H�
�(H��X�H�=�K�`n��H�
�)H��X�1�H�=�K�?n��H�
pVH��X��1�H�=cK�n��H�
_PH�`X��1�H�=BK�m��H�
VH�_X�1�H�=!K��m��f�f.�S1�H��H��1������xH�߉�[���������[�f���AWAVAUATUH��SH��H���3���H���H1�H��耵��I��H��t�8uH��1�[]A\A]A^A_�f�1�H���ֿ��I��H�����L��A������D��L��H�=�OH��1��h��L�����H�x�X���I��H������-L��D)��@�� �Hc�A�H����J���v��t8��.t3��-tٍJƀ�v�JЀ�Jw�J���w�L���^����6���f��Hc�A���u�M�oL�u 1�L��L���"I��H��tUL������L9etL��H���\���H�������H������H�
�/H��V��1�H�=YI�l��@�+�H�uI��H����1�1�L����p��L��H��H�D$������x"趵��H�|$茷��L��L��L���~�T����E��tH�|$L����H�t$L�������H�t$L��H�=�N1��h��L���H���L�e�H�
�SH�V��1�H�=�H�Qk��H�
�NH��U��H�=wH�2k��H�
�.H��U��1�H�=VH�k��H�
NH��U��1�H�=5H��j����AWAVAUATUSH��H�$H��HdH�%(H��$81�H��I��A��������GL���^���I��H����%H���U���H��H��t9H�x�%�?���H���i�{s��H���$���H�sH��H�P������_�H��H�EE����L���W�������L���׵��H��tOL���ʹ��H�EH����H�}H�R����5�X���H����H�}1�H��6�,���H�����n���H����萳��D�mH��$8dH3%(�UH��H[]A\A]A^A_�L��������Q���L�|$0�L��辷������H��$0H�t$�L��L�L$L�D$�D$蚷����unH�D$H��tdH�0H��t\L���\�H�}�����j����u/L�g��H�
�,H��S�D1�H�=FA������@L��h������|$��uL��L����H�}�m���@��H�=tLH��1���e����H�
	LH�BS�1�H�=�E�_h��H�
�"H�!S�H�=�E�@h���[���H�
�LH��R�@H�=aE�h��H�
�LH��R�>H�=BE�g��H�
�PH��R�1�H�=!E��g��H�
�LH��R�AH�=E�g��H�
fPH�R�1�H�=�D�g��L��H�=�K1��g��H�
<KH�MR�#1�H�=�D�jg��f.���AWAVAUA��ATI��USH��dH�%(H��$�1��M�1�D��H�5�OI�D$1��k��H������H���O���H��H����A�}�.I9���I��H��I���	���H��H���OL�sA�GL��H��L���$贴��H��y�H���W���H���O���D��1�1�H�5PO�\k��H��H���yI�|$D���S���/H������A�D$H��$�dH3%(�H�ĸ[]A\A]A^A_ÐH��H�D$�ӱ��Lc<$L�D$M9��+J�lH�T$L��L�$�E��ұ����u�D$(L�$%�=�tJH��肱��D��1�1�H�5�N�j��H��H���3���H�
�JH��O�i1�H�=�B�e��f��"�E"B�D���H�
<NH��O�\1�H�=�B�Me��H�
fJH�oO�Q1�H�=qB�,e��H��H�=�J�e���8���H�
rH�:O�R1�H�=<B�d��H�
HJH�O�X1�H�=B��d��H�
�MH��N�_1�H�=�A�d��D����7�����G�w�D��SH��dH�%(H��$�1�H��H���f����
H���9���1�1�H���ͱ����u!H��$�dH3%(uOH�Đ[�D�Ce����u/L�(b��H�
�IH�*N��1�H�=<AA����L��c��������f���SH��dH�%(H��$�1�H�\$�D$H���,��������
H��臮����uKH��苵���
H���^���1�H�޿�����u;H��$�dH3%(�D$ueH�Ġ[�H�t$H��軶���f��Kd����u/L�0a��H�
IH�M��1�H�=D@A����L��b�����
���H�
�KH��L��1�H�=@��b��f���AVA��AUI��ATI��UD��SH������H�;���A���H����I�|$�.���H�H���:1ɺ�!H�����D��1��D���I�ƅ�~m���H���p���L��I��H���2���Hc�L��zL���/���H���`H�;L��L���(���H�;1�����話��H��uT������[]A\A]A^�@I������b����uwL��_��H�
�%H��K��1�H�=�>A������@�b����uOL��_��1�H�
N%��1�H�iKH�=�>A�������[]A\A]A^��L�Qa����L�Aa�����Sb����uOL�8_��1�H�
/GH�K��H�=L>A��H�H��������ت�������莰������L��`���H�
�IH��J��1�H�=�=�`��H�
�FH��J��H�=�=�`�����������AUATUSH��H��H�?��H�=yI1��[���2���H�;�j���I��H���zH�;薨��H��H����I9���H�����I9���H���x���L��I���m���I9���H�=�F1��&]��H���.���I��H����L������I9���H���)���H����L������H���>L������H���L���֯��H�;辮���)���H��uH�H��[]A\A]�f��{`������L�\]��H�
#H�I�21�H�=p<A���H�=�E1��Z��H���b���I9��:H���q���H���r���H�
CHH��H�1�H�=<��^���L��^���x���H�
-EH��H�1�H�=�;�^��H�
4EH�uH�1�H�=�;�^��H�
6HH�TH�(1�H�=�;�a^��H�
�GH�3H�'1�H�=�;�@^��H�=IE1��2^��H�
�GH�H�$1�H�=V;�^��H�
�GH��G�%1�H�=5;��]��H�
;GH��G�&1�H�=;��]��H�
�FH��G�1�H�=�:�]��f.�@��SH��H���P���H��[�G����AUI��ATUSH�������H��H��1��fD��%tCL��H���]����tL�`��+u� L��H���]����u��EH��L��[]A\A]Ð�H�QЀ�	v��ߍQ���v��te��L���D�Q��H��L�`�y�@��	w��H���
�0)��l���@��ߍy�@��w���H���
�7)��F���fDL��1�H�=�G�Y��L���"���f�H���E����AVAUI��ATUH��H��S������H��t\9�mA��Lc��D��H��A9�TA9�}%��A�uH��D)�Hc��J���H��H��tH)�H��)�L��L��H��������u�H��[H��]A\A]A^�f�1�[]H��A\A]A^�f�ATI��H��UH��SHc��{���9�[H��L��]Hc�A\�Ŭ��D�D[]A\�fDH��t;UH��SHcލ{Hc�H��败��H��t%H��H��H�����H��[]�fD1�H���H�
�GH�lH�m1�H�=FF�[��f�AWAVAUI��H��ATUS��H��H��t,D��~#@�< t<;u-H����u�H��H��H��u�H��[]A\A]A^A_�f.�H��E1�f.�H��M��u<=LD��t�E<;u�M����I�t$�A��)�E)�t����I���L����t��H���w�H�����u�M��tA��~A�<$"t!L��D�����I��L��L��L���a���7���Ic�A�|�"u�I��A���ʉ�E1�)��y��������AWAVI��H��AUE1�ATU�j�SH��H���"f�D�#A��=u>M��u9H��I�݃���y�E1�M��tKI�u�H)���upE��t+��x'H��E1�H����A��&t�E��t
H����H��[]A\A]A^A_ÐH��H)���t����H��I�����L��L��L���(`���fD���H��I�����H��L��L)��r���H��I���g�����@AWI��AVAUATU1�S��H��HH�|$L�t$dH�%(H�D$81�����M�}D)�H��E��L���-���I��H����M9���M��M)�H��uŃ�xHc�H�E���u�1�H�5����L����]��I�wL��A�T$��$���H�5-EL���d��H��t H�5�DL���Qe��H��t�8H����L���^���K����H�5�DL���ܧ���f.�H��t��1҃�uzH�|$H��1�H��P�^��H���g���H�D$8dH3%(u`H��H[]A\A]A^A_��H���8���H��H���l���H�
<DH��D�1�H�=xB�KW��I����H���u����R���f���AWAVI��AUATI��U��SH��H��L�{PH��HdH�%(H�D$81����H��详��H�CL��H�H�C���H��茦��L��H�C����L���C ����H���m���L��H�C(����H���Y���L��H�C0����H���E���H�C@1�H�5���H�C8L��H�CH�\��I�VH�H�=�H�������uJH�[8H����H�����H��L�����@���H�D$8dH3%(��H��H[]A\A]A^A_�D�H�=uH��������Ʌ�u�L�l$1�H�5,����$L���a[��I�~xH�5���b���$H��I��t
H���n�����L��L�������H�5�L���b��H��t;��L��L�����L���[���A���H�
EBH��B�]H�=o@�BU��f�H�5/BL���a��H��t�H�5/BL���]b��H�$H���x�8�o��~�H�D$M���M9���H��A��L���v���I��H��t�L����L)�A�)�M�H�$��L�������uXH�<$�o���H��A)�H�IƉ�L����������H�D$��I��H���
L��H��H��H)��y���L�t$@���X���H�|$����H�=@1��nQ�����f�H�3A��L�����I��D)�M��t��A�)��7���@H��@��L��������u�H�t$L����H��H)�������O���H�=F?1�I���P��H�D$���DH�=�?1���P������H��@��L������I��H���x���D��D)��Y���L�t$M9������H�=�>1��O������W������AUA��ATI��UH���pSH���_���H��t"D��L��H��H��H������H��H��[]A\A]�H�
9?H�2@�J1�H�=�=��R�����H��tgSH��H�?�k���H�{�b���H�{�Y���H�{�P���H�{(�G���H�{0�>���H�{8�5���H�{@�,���H�{H�#���H�{P[�yX��f��Df.���SH���s���H��[���f.���H�����H�G����H�G����H�G�����G ����H�G(����H�G0����H�G8����H�G@����H�GHH��t�f�AVAUATUSH�����H��I���5���L�c(H��L���&����h!��"Hc�薛��H�CHH����L�3�Hc�H��H��L���r���H��H�5�H���`���L��H��H���R����L��D�K H�=�
I����������%�����A9�uH��L��L������H�CH[]A\A]A^�A�I����������!�%����t�¾�����D�I�PLDº���L��H�����H��L�^1��9���L�c(L�CH�H�
�<H�a=��1�H�=[;�.P��@f.���H�GP����ATA��1�UH��H�=Z�S�U��D��H��H��H������H��[]A\�f.����H�7H�WH�GH�G�G �����G$H�G(�G0�f.���ATI��UH���8S�ș��H��tH��L��H��H�����H��[]A\�H�
�<H�D>�81�H�=�<�9O��f�AWAVAUATUSH������H��A����M��u]H�GH�C�8�k D�k$�<���H�C(H��t{�C0H�SH��H�3���H�C(L�`H��[]A\A]A^A_�fDLc�I��L����H�CH��tPL��L��H���+����H�
�H�C=�_1�H�=�;�hN��H�
<H�"=�iH�=�;�IN��H�
�<H�=�aH�=�;�*N��f.���H����ATI��U1�SH����A�D$0��7I�|$([]A\骙��f.�I�|$��I\$(H�����H��A9l$0~�H��I�|$(I�$H)�H��H�H�wH��t�$t�H��t�H�
3<H�l<�P1�H�=�:�qM����Df.���SH���3���H��[�
���f.���AWAVI��H��AUATUH��SH��(H�T$���A�V0���GA�N �D$��~GI�V�E8��A��H���!DH�sL�d�|2�@8|��H��A��H9�u�E�N0Lc�I�~(N�|E��~JA�7@:w$��A�A��8H��H��H)�H���H�C8L�@8t���H��H9�u�A���L$E�N0Mc�J�4�L)�H���z����L$H��I�F(�KIcv0H��H)�A�?I�6H�\��I�V��D�l$L�D$H�3H��H�SI�WA�7A)�A�M��I��E1�1�@�p�L$�����L$H��I����I�D)��Q�I�EI�FHc�H��H�T$I�E�ݕ��H�T$H��I�E�~L�SH��L��IvL�T$����I�FI�}8I�ED����AF A�E I�F�A�E$I�F(I�E(A�F0A�E0I�I�FE�~ M�n(A�F0A�4$I�E8I�FI�E@@��tuD�l$L�T$L�D$E)�J�TA�M�H��([]A\A]A^A_����L�D$��H��1�L����I��1�f�@��tkJ�lL�D$H���i���L�D$M���}���@I�VI�6���H�D$I�EPH��([]A\A]A^A_�@H�����H�D$H�CH��([]A\A]A^A_�I�H��tI�~I�p��I�~(H�D$H�D�H�
�7H��8�x1�H�=�7�I��H�
8H��8�{H�=k7��I��H�
8H��8��H�=L7�I��Df.���AWAVI��AUI��ATUSH��H��H��tH�E1�1�S ��~Lc�H�{L��L��蛚����uEM��K0��~;H�{(A�u1��G$H��@8�u�T@H��8�C$@8�tC��MD�HD��9�u�M����H����M�&H�EH��[]A\A]A^A_�f.�@�����B9�~RHc�H��H)�H��H�4�~$te��H�D8)�Hc�H�H��H)�H�T�p�f�H��H��8�x�tH9�u�I������DM��H��I������H��1�[]A\A]A^A_�M��H����M��tM�.H�C�=���fD��AWI��AVI��AUA��ATL�%4m$UH�-4m$SL)�H���w���H��t1��L��L��D��A��H��H9�u�H��[]A\A]A^A_Ðf.������H��H���result = malloc(count + 1)0123456789ABCDEF{"session":"%s","data":"%s"}HEAD[server] Session %s done.text/user-agentbody = malloc(end - start)[else [endif Cache-Control: no-cache
!session->donetruefalsecontent-typeplainsecuresessionBad RequestwidthheightkeysrooturlInternal ErrorOKsession->http != httptext/htmlaudio/x-wavenabled.gifimage/giffavicon.icoimage/x-iconkeyboard.htmlkeyboard.pngimage/pngShellInABox.jstext/css; charset=utf-8print-styles.cssFile not foundserverSupportsSSL()%s/certificate%%s.pemcertificate%s.pem'AUTH' | :SSH:LOGINpidfile = strdup(optarg)!NOINTR(close(tmpFd))file = strdup(ptr + 1)nonenormalaggressivetmp = strndup(s, ptr - s)ShellInABox version 2.20argc >= 1[server] Version 2.20%s [server] Command line: %s(pid = fork()) >= 0!NOINTR(close(fd))POSIX!pipe(fds)!NOINTR(close(fds[1]))!NOINTR(close(fds[0]))/quit[server] Donehelpbackgroundcertcert-fdcgidebugstatic-filelinkifylocalhost-onlyno-beepnumericmessages-originpidfileportservicedisable-ssldisable-ssl-menudisable-utmp-loggingquietunixdomain-onlyuser-cssverbosedisable-peer-checkCheck failed at shellinabox/shellinaboxd.c:%d in %s(): %s[server] Clearing pending HTTP connection for session %s!session->buffered = realloc(session->buffered, session->len + len)session->buffered = malloc(len)session->buffered = malloc(session->len)HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: %ld
Cache-Control: no-cache

%stag = malloc(bracket - ptr - 3)HTTP/1.1 200 OK
Content-Type: %s
Content-Length: %ld
%s
response = realloc(response, len + (bodyEnd - body))[config] Missing numeric value![config] Range error on numeric value "%s"![server] Timeout. Closing session %s!completePendingRequest(session, buf, bytes, MAX_RESPONSE)[server] POLLHUP received on login PTY first read![server] POLLHUP received on PTY! Closing session %s!application/x-www-form-urlencoded[server] Peername changed from %s to %s[server] Window size changed to %dx%dkeyCodes = malloc(strlen(keys)/2)serverSupportsSSL = %s;
disableSSLMenu    = %s;
suppressAllAudio  = %s;
linkifyURLs       = %d;
userCSSList       = %s;
serverMessagesOrigin = %s%s%s;

HTTP/1.1 200 OK
Content-Type: text/javascript; charset=utf-8
Content-Length: %d

response = realloc(response, headerLength + contentLength)[ssl] Invalid certificate directory name "%s".tmp = stringPrintf(NULL, "%s/certificate%%s.pem", certificateDir)  -t, --disable-ssl           disable transparent SSL support
      --disable-ssl-menu      disallow changing transport mode
  -c, --cert=CERTDIR          set certificate dir (default: $PWD)
      --cert-fd=FD            set certificate file from fd
cssStyleSheet = strdup(stylesStart)[server] Failed to parse command line!!getresuid(&r_uid, &e_uid, &s_uid)!getresgid(&r_gid, &e_gid, &s_gid)Usage: shellinaboxd [OPTIONS]...
Starts an HTTP server that serves terminal emulators to AJAX enabled browsers.

List of command line options:
  -b, --background[=PIDFILE]  run in background
%s      --css=FILE              attach contents to CSS style sheet
      --cgi[=PORTMIN-PORTMAX] run as CGI
  -d, --debug                 enable debug mode
  -f, --static-file=URL:FILE  serve static file from URL path
  -g, --group=GID             switch to this group (default: %s)
  -h, --help                  print this message
      --linkify=[none|normal|aggressive] default is "normal"
      --localhost-only        only listen on 127.0.0.1
      --no-beep               suppress all audio output
  -n, --numeric               do not resolve hostnames
  -m, --messages-origin=ORIGIN allow iframe message passing from origin
      --pidfile=PIDFILE       publish pid of daemon process
  -p, --port=PORT             select a port (default: %d)
  -s, --service=SERVICE       define one or more services
%s      --disable-utmp-logging  disable logging to utmp and wtmp
  -q, --quiet                 turn off all messages
      --unixdomain-only=PATH:USER:GROUP:CHMOD listen on unix socket
  -u, --user=UID              switch to this user (default: %s)
      --user-css=STYLES       defines user-selectable CSS options
  -v, --verbose               enable logging messages
      --version               prints version information
      --disable-peer-check    disable peer check on a session

Debug, quiet, and verbose are mutually exclusive.

One or more --service arguments define services that should be made available
through the web interface:
  SERVICE := <url-path> ':' APP
  APP     := 'LOGIN' | 'SSH' [ : <host> ] | USER ':' CWD ':' CMD
  USER    := %s<username> ':' <groupname>
  CWD     := 'HOME' | <dir>
  CMD     := 'SHELL' | <cmdline>

<cmdline> supports variable expansion:
  ${columns} - number of columns
  ${gid}     - gid id
  ${group}   - group name
  ${home}    - home directory
  ${lines}   - number of rows
  ${peer}    - name of remote peer
  ${realip}  - value of HTTP header field 'X-Real-IP'
  ${uid}     - user id
  ${url}     - the URL that serves the terminal session
  ${user}    - user name

One or more --user-css arguments define optional user-selectable CSS options.
These options show up in the right-click context menu:
  STYLES  := GROUP { ';' GROUP }*
  GROUP   := OPTION { ',' OPTION }*
  OPTION  := <label> ':' [ '-' | '+' ] <css-file>

OPTIONs that make up a GROUP are mutually exclusive. But individual GROUPs are
independent of each other.

[config] CGI and background operations are mutually exclusive![config] Only one pidfile can be given![config] Ignoring certificate directory, as SSL support is unavailable.[config] Cannot set both a certificate directory and file handle![config] Only one certificate directory can be selected![config] Option --cert expects a directory name!certificateDir = strdup(optarg)[config] Only one certificate file handle can be provided![config] Option --cert-fd expects a valid file handle.[config] Invalid certificate file handle![config] Option --css expects a file name![config] Cannot read style sheet "%s"!cssStyleSheet= realloc(cssStyleSheet, strlen(cssStyleSheet) + st.st_size + 2)[config] Failed to read style sheet "%s"![config] CGI operation and --pidfile are mutually exclusive![config] Cannot specify a port for CGI operation![config] Syntax error in port range specification![config] Option --debug is mutually exclusive with --quiet and --verbose![config] Option --static-file expects an argument![config] Syntax error in static-file definition "%s"!path = malloc(ptr - optarg + 1)[config] Duplicate static-file definition for "%s"![config] Duplicate --group option.[config] Option --group expects a group name.[config] Option --linkify expects an argument.[config] Invalid argument for --linkify. Must be "none", "normal", or "aggressive".[config] Duplicated --messages-origin option.[config] Option --messages-origin expects an argument.messagesOrigin = strdup(optarg)[config] CGI operation and --pidfile are mutually exclusive[config] Must specify a filename for --pidfile option[config] Only one pidfile can be given[config] Duplicate --port option![config] Cannot specifiy a port for CGI operation[config] Option --port expects a port number.[config] Option "--service" expects an argument.[config] Duplicate service description for "%s".[config] Ignoring disable-ssl option, as SSL support is unavailable.[config] Ignoring disable-ssl-menu option, as SSL support is unavailable.[config] Option --quiet is mutually exclusive with --debug and --verbose![config] Option --unixdomain-only expects an argument![config] Syntax error in unixdomain-only path definition "%s".unixDomainPath = strndup(s, ptr - s)[config] Syntax error in unixdomain-only user definition "%s".[config] Syntax error in unixdomain-only group definition "%s".[config] Syntax error in unixdomain-only chmod definition "%s".[config] Duplicate --user option.[config] Option --user expects a user name.[config] Option --user-css expects a list of styles sheets and labels![config] Option --verbose is mutually exclusive with --debug and --quiet![config] Failed to parse command line![config] Non-root service URLs are incompatible with CGI operationcgiSessionKey = newSessionKey()server = newServer(localhostOnly, port)!NOINTR(read(fds[0], &wait, 1))server = newCGIServer(localhostOnly, portMin, portMax, AJAX_TIMEOUT)port = serverGetListeningPort(server)X-ShellInABox-Port: %d
X-ShellInABox-Pid: %d
X-ShellInABox-Session: %s
Content-type: text/html; charset=utf-8

������������������p���setUpSSLusage+hb::c:df:g:nm:p:s:tqu:vparseArgsserveStaticFilejsonEscapecompletePendingRequesthandleSessiondataHandlershellInABoxHttpHandlermain// VT100.js -- JavaScript based terminal emulator
// Copyright (C) 2008-2010 Markus Gutschke <markus@shellinabox.com>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation.
//
// This program 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
//
// In addition to these license terms, the author grants the following
// additional rights:
//
// If you modify this program, or any covered work, by linking or
// combining it with the OpenSSL project's OpenSSL library (or a
// modified version of that library), containing parts covered by the
// terms of the OpenSSL or SSLeay licenses, the author
// grants you additional permission to convey the resulting work.
// Corresponding Source for a non-source form of such a combination
// shall include the source code for the parts of OpenSSL used as well
// as that of the covered work.
//
// You may at your option choose to remove this additional permission from
// the work, or from any part of it.
//
// It is possible to build this program in a way that it loads OpenSSL
// libraries at run-time. If doing so, the following notices are required
// by the OpenSSL and SSLeay licenses:
//
// This product includes software developed by the OpenSSL Project
// for use in the OpenSSL Toolkit. (http://www.openssl.org/)
//
// This product includes cryptographic software written by Eric Young
// (eay@cryptsoft.com)
//
//
// The most up-to-date version of this program is always available from
// http://shellinabox.com
//
//
// Notes:
//
// The author believes that for the purposes of this license, you meet the
// requirements for publishing the source code, if your web server publishes
// the source in unmodified form (i.e. with licensing information, comments,
// formatting, and identifier names intact). If there are technical reasons
// that require you to make changes to the source code when serving the
// JavaScript (e.g to remove pre-processor directives from the source), these
// changes should be done in a reversible fashion.
//
// The author does not consider websites that reference this script in
// unmodified form, and web servers that serve this script in unmodified form
// to be derived works. As such, they are believed to be outside of the
// scope of this license and not subject to the rights or restrictions of the
// GNU General Public License.
//
// If in doubt, consult a legal professional familiar with the laws that
// apply in your country.

// #define ESnormal        0
// #define ESesc           1
// #define ESsquare        2
// #define ESgetpars       3
// #define ESgotpars       4
// #define ESdeviceattr    5
// #define ESfunckey       6
// #define EShash          7
// #define ESsetG0         8
// #define ESsetG1         9
// #define ESsetG2        10
// #define ESsetG3        11
// #define ESbang         12
// #define ESpercent      13
// #define ESignore       14
// #define ESnonstd       15
// #define ESpalette      16
// #define EStitle        17
// #define ESss2          18
// #define ESss3          19
// #define ESVTEtitle     20

// #define ATTR_DEFAULT   0x60F0
// #define ATTR_REVERSE   0x0100
// #define ATTR_UNDERLINE 0x0200
// #define ATTR_DIM       0x0400
// #define ATTR_BRIGHT    0x0800
// #define ATTR_BLINK     0x1000
// #define ATTR_DEF_FG    0x2000
// #define ATTR_DEF_BG    0x4000

// #define MOUSE_DOWN     0
// #define MOUSE_UP       1
// #define MOUSE_CLICK    2

function VT100(container) {
  if (typeof linkifyURLs == 'undefined' || linkifyURLs <= 0) {
    this.urlRE            = null;
  } else {
    this.urlRE            = new RegExp(
    // Known URL protocol are "http", "https", and "ftp".
    '(?:http|https|ftp)://' +

    // Optionally allow username and passwords.
    '(?:[^:@/ \u00A0]*(?::[^@/ \u00A0]*)?@)?' +

    // Hostname.
    '(?:[1-9][0-9]{0,2}(?:[.][1-9][0-9]{0,2}){3}|' +
    '[0-9a-fA-F]{0,4}(?::{1,2}[0-9a-fA-F]{1,4})+|' +
    '(?!-)[^[!"#$%&\'()*+,/:;<=>?@\\^_`{|}~\u0000- \u007F-\u00A0]+)' +

    // Port
    '(?::[1-9][0-9]*)?' +

    // Path.
    '(?:/(?:(?![/ \u00A0]|[,.)}"\u0027!]+[ \u00A0]|[,.)}"\u0027!]+$).)*)*|' +

    (linkifyURLs <= 1 ? '' :
    // Also support URLs without a protocol (assume "http").
    // Optional username and password.
    '(?:[^:@/ \u00A0]*(?::[^@/ \u00A0]*)?@)?' +

    // Hostnames must end with a well-known top-level domain or must be
    // numeric.
    '(?:[1-9][0-9]{0,2}(?:[.][1-9][0-9]{0,2}){3}|' +
    'localhost|' +
    '(?:(?!-)' +
        '[^.[!"#$%&\'()*+,/:;<=>?@\\^_`{|}~\u0000- \u007F-\u00A0]+[.]){2,}' +
    '(?:(?:com|net|org|edu|gov|aero|asia|biz|cat|coop|info|int|jobs|mil|mobi|'+
    'museum|name|pro|tel|travel|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|' +
    'au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|' +
    'ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|' +
    'dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|' +
    'gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|' +
    'ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|' +
    'lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|' +
    'mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|' +
    'pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|' +
    'sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|' +
    'tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|' +
    'yu|za|zm|zw|arpa)(?![a-zA-Z0-9])|[Xx][Nn]--[-a-zA-Z0-9]+))' +

    // Port
    '(?::[1-9][0-9]{0,4})?' +

    // Path.
    '(?:/(?:(?![/ \u00A0]|[,.)}"\u0027!]+[ \u00A0]|[,.)}"\u0027!]+$).)*)*|') +

    // In addition, support e-mail address. Optionally, recognize "mailto:"
    '(?:mailto:)' + (linkifyURLs <= 1 ? '' : '?') +

    // Username:
    '[-_.+a-zA-Z0-9]+@' +

    // Hostname.
    '(?!-)[-a-zA-Z0-9]+(?:[.](?!-)[-a-zA-Z0-9]+)?[.]' +
    '(?:(?:com|net|org|edu|gov|aero|asia|biz|cat|coop|info|int|jobs|mil|mobi|'+
    'museum|name|pro|tel|travel|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|' +
    'au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|' +
    'ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|' +
    'dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|' +
    'gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|' +
    'ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|' +
    'lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|' +
    'mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|' +
    'pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|' +
    'sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|' +
    'tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|' +
    'yu|za|zm|zw|arpa)(?![a-zA-Z0-9])|[Xx][Nn]--[-a-zA-Z0-9]+)' +

    // Optional arguments
    '(?:[?](?:(?![ \u00A0]|[,.)}"\u0027!]+[ \u00A0]|[,.)}"\u0027!]+$).)*)?');
  }
  this.getUserSettings();
  this.initializeElements(container);
  this.maxScrollbackLines = 2000;
  this.npar               = 0;
  this.par                = [ ];
  this.isQuestionMark     = false;
  this.savedX             = [ ];
  this.savedY             = [ ];
  this.savedAttr          = [ ];
  this.savedAttrFg        = [ ];
  this.savedAttrBg        = [ ];
  this.savedUseGMap       = 0;
  this.savedGMap          = [ this.Latin1Map, this.VT100GraphicsMap,
                              this.CodePage437Map, this.DirectToFontMap ];
  this.savedValid         = [ ];
  this.respondString      = '';
  this.titleString        = '';
  this.internalClipboard  = undefined;
  this.reset(true);
}

VT100.prototype.reset = function(clearHistory) {
  this.isEsc                                         = 0 /* ESnormal */;
  this.needWrap                                      = false;
  this.autoWrapMode                                  = true;
  this.dispCtrl                                      = false;
  this.toggleMeta                                    = false;
  this.insertMode                                    = false;
  this.applKeyMode                                   = false;
  this.cursorKeyMode                                 = false;
  this.crLfMode                                      = false;
  this.offsetMode                                    = false;
  this.mouseReporting                                = false;
  this.printing                                      = false;
  if (typeof this.printWin != 'undefined' &&
      this.printWin && !this.printWin.closed) {
    this.printWin.close();
  }
  this.printWin                                      = null;
  this.utfEnabled                                    = this.utfPreferred;
  this.utfCount                                      = 0;
  this.utfChar                                       = 0;
  this.color                                         = 'ansiDef bgAnsiDef';
  this.style                                         = '';
  this.attr                                          = 0x60F0 /* ATTR_DEFAULT */;
  this.attrFg                                        = false;
  this.attrBg                                        = false;
  this.useGMap                                       = 0;
  this.GMap                                          = [ this.Latin1Map,
                                                         this.VT100GraphicsMap,
                                                         this.CodePage437Map,
                                                         this.DirectToFontMap];
  this.translate                                     = this.GMap[this.useGMap];
  this.top                                           = 0;
  this.bottom                                        = this.terminalHeight;
  this.lastCharacter                                 = ' ';
  this.userTabStop                                   = [ ];

  if (clearHistory) {
    for (var i = 0; i < 2; i++) {
      while (this.console[i].firstChild) {
        this.console[i].removeChild(this.console[i].firstChild);
      }
    }
  }

  this.enableAlternateScreen(false);

  var wasCompressed                                  = false;
  var transform                                      = this.getTransformName();
  if (transform) {
    for (var i = 0; i < 2; ++i) {
      wasCompressed                  |= this.console[i].style[transform] != '';
      this.console[i].style[transform]               = '';
    }
    this.cursor.style[transform]                     = '';
    this.space.style[transform]                      = '';
    if (transform == 'filter') {
      this.console[this.currentScreen].style.width   = '';
    }
  }
  this.scale                                         = 1.0;
  if (wasCompressed) {
    this.resizer();
  }

  this.gotoXY(0, 0);
  this.showCursor();
  this.isInverted                                    = false;
  this.refreshInvertedState();
  this.clearRegion(0, 0, this.terminalWidth, this.terminalHeight,
                   this.color, this.style);
};

VT100.prototype.addListener = function(elem, event, listener) {
  try {
    if (elem.addEventListener) {
      elem.addEventListener(event, listener, false);
    } else {
      elem.attachEvent('on' + event, listener);
    }
  } catch (e) {
  }
};

VT100.prototype.getUserSettings = function() {
  // Compute hash signature to identify the entries in the userCSS menu.
  // If the menu is unchanged from last time, default values can be
  // looked up in a cookie associated with this page.
  this.signature            = 3;
  this.utfPreferred         = true;
  this.visualBell           = typeof suppressAllAudio != 'undefined' &&
                              suppressAllAudio;
  this.autoprint            = true;
  this.softKeyboard         = false;
  this.blinkingCursor       = true;
  this.disableAlt           = false;

  if (navigator.platform.indexOf("Mac") != -1) {
    this.disableAlt         = true;
  }

  // Enable soft keyboard icon on some clients by default.
  if (navigator.userAgent.match(/iPad|iPhone|iPod/i) != null ||
      navigator.userAgent.match(/PlayStation Vita|Kindle/i) != null) {
    this.softKeyboard       = true;
  }

  if (this.visualBell) {
    this.signature          = Math.floor(16807*this.signature + 1) %
                                         ((1 << 31) - 1);
  }
  if (typeof userCSSList != 'undefined') {
    for (var i = 0; i < userCSSList.length; ++i) {
      var label             = userCSSList[i][0];
      for (var j = 0; j < label.length; ++j) {
        this.signature      = Math.floor(16807*this.signature+
                                         label.charCodeAt(j)) %
                                         ((1 << 31) - 1);
      }
      if (userCSSList[i][1]) {
        this.signature      = Math.floor(16807*this.signature + 1) %
                                         ((1 << 31) - 1);
      }
    }
  }

  var key                   = 'shellInABox=' + this.signature + ':';
  var settings              = document.cookie.indexOf(key);
  if (settings >= 0) {
    settings                = document.cookie.substr(settings + key.length).
                                                   replace(/([0-1]*).*/, "$1");
    if (settings.length == 6 + (typeof userCSSList == 'undefined' ?
                                0 : userCSSList.length)) {
      this.utfPreferred     = settings.charAt(0) != '0';
      this.visualBell       = settings.charAt(1) != '0';
      this.autoprint        = settings.charAt(2) != '0';
      this.softKeyboard     = settings.charAt(3) != '0';
      this.blinkingCursor   = settings.charAt(4) != '0';
      this.disableAlt       = settings.charAt(5) != '0';
      if (typeof userCSSList != 'undefined') {
        for (var i = 0; i < userCSSList.length; ++i) {
          userCSSList[i][2] = settings.charAt(i + 6) != '0';
        }
      }
    }
  }
  this.utfEnabled           = this.utfPreferred;
};

VT100.prototype.storeUserSettings = function() {
  var settings  = 'shellInABox=' + this.signature + ':' +
                  (this.utfEnabled     ? '1' : '0') +
                  (this.visualBell     ? '1' : '0') +
                  (this.autoprint      ? '1' : '0') +
                  (this.softKeyboard   ? '1' : '0') +
                  (this.blinkingCursor ? '1' : '0') +
                  (this.disableAlt     ? '1' : '0');
  if (typeof userCSSList != 'undefined') {
    for (var i = 0; i < userCSSList.length; ++i) {
      settings += userCSSList[i][2] ? '1' : '0';
    }
  }
  var d         = new Date();
  d.setDate(d.getDate() + 3653);
  document.cookie = settings + ';expires=' + d.toGMTString();
};

VT100.prototype.initializeUserCSSStyles = function() {
  this.usercssActions                    = [];
  if (typeof userCSSList != 'undefined') {
    var menu                             = '';
    var group                            = '';
    var wasSingleSel                     = 1;
    var beginOfGroup                     = 0;
    for (var i = 0; i <= userCSSList.length; ++i) {
      if (i < userCSSList.length) {
        var label                        = userCSSList[i][0];
        var newGroup                     = userCSSList[i][1];
        var enabled                      = userCSSList[i][2];

        // Add user style sheet to document
        var style                        = document.createElement('link');
        style.setAttribute('id',           'usercss-' + i);
        style.setAttribute('href',         'usercss-' + i + '.css');
        style.setAttribute('rel',          'stylesheet');
        style.setAttribute('type',         'text/css');
        document.getElementsByTagName('head')[0].appendChild(style);

        // If stylesheet needs to be disabled we need to do that from onload
        // event, otherwise 'disabled' attribute will be ignored.
        if (!enabled) {
          if ('onload' in style) {
            style.onload                     = function(style) {
              return function () {
                style.disabled               = true;
              }
            }(style);
          } else {
            // If onload event is not supported we will try to do it the old
            // way. This also works sometimes, mosty in cases when browser
            // already has cached version of stylesheet.
            style.disabled                   = true;
          }
        }
      }

      // Add entry to menu
      if (newGroup || i == userCSSList.length) {
        if (beginOfGroup != 0 && (i - beginOfGroup > 1 || !wasSingleSel)) {
          // The last group had multiple entries that are mutually exclusive;
          // or the previous to last group did. In either case, we need to
          // append a "<hr />" before we can add the last group to the menu.
          menu                          += '<hr />';
        }
        wasSingleSel                     = i - beginOfGroup < 1;
        menu                            += group;
        group                            = '';

        for (var j = beginOfGroup; j < i; ++j) {
          this.usercssActions[this.usercssActions.length] =
            function(vt100, current, begin, count) {

              // Deselect all other entries in the group, then either select
              // (for multiple entries in group) or toggle (for on/off entry)
              // the current entry.
              return function() {
                var entry                = vt100.getChildById(vt100.menu,
                                                              'beginusercss');
                var i                    = -1;
                var j                    = -1;
                for (var c = count; c > 0; ++j) {
                  if (entry.tagName == 'LI') {
                    if (++i >= begin) {
                      --c;
                      var label          = vt100.usercss.childNodes[j];

                      // Restore label to just the text content
                      if (typeof label.textContent == 'undefined') {
                        var s            = label.innerText;
                        label.innerHTML  = '';
                        label.appendChild(document.createTextNode(s));
                      } else {
                        label.textContent= label.textContent;
                      }

                      // User style sheets are numbered sequentially
                      var sheet          = document.getElementById(
                                                               'usercss-' + i);
                      if (i == current) {
                        if (count == 1) {
                          sheet.disabled = !sheet.disabled;
                        } else {
                          sheet.disabled = false;
                        }
                        if (!sheet.disabled) {
                          label.innerHTML= '<img src="enabled.gif" />' +
                                           label.innerHTML;
                        }
                      } else {
                        sheet.disabled   = true;
                      }
                      userCSSList[i][2]  = !sheet.disabled;
                    }
                  }
                  entry                  = entry.nextSibling;
                }

                // If the font size changed, adjust cursor and line dimensions
                this.cursor.style.cssText= '';
                this.cursorWidth         = this.cursor.clientWidth;
                this.cursorHeight        = this.lineheight.clientHeight;
                for (i = 0; i < this.console.length; ++i) {
                  for (var line = this.console[i].firstChild; line;
                       line = line.nextSibling) {
                    line.style.height    = this.cursorHeight + 'px';
                  }
                }
                vt100.resizer();
              };
            }(this, j, beginOfGroup, i - beginOfGroup);
        }

        if (i == userCSSList.length) {
          break;
        }

        beginOfGroup                     = i;
      }
      // Collect all entries in a group, before attaching them to the menu.
      // This is necessary as we don't know whether this is a group of
      // mutually exclusive options (which should be separated by "<hr />" on
      // both ends), or whether this is a on/off toggle, which can be grouped
      // together with other on/off options.
      group                             +=
        '<li>' + (enabled ? '<img src="enabled.gif" />' : '') +
                 label +
        '</li>';
    }
    this.usercss.innerHTML               = menu;
  }
};

VT100.prototype.resetLastSelectedKey = function(e) {
  var key                          = this.lastSelectedKey;
  if (!key) {
    return false;
  }

  var position                     = this.mousePosition(e);

  // We don't get all the necessary events to reliably reselect a key
  // if we moved away from it and then back onto it. We approximate the
  // behavior by remembering the key until either we release the mouse
  // button (we might never get this event if the mouse has since left
  // the window), or until we move away too far.
  var box                          = this.keyboard.firstChild;
  if (position[0] <  box.offsetLeft + key.offsetWidth ||
      position[1] <  box.offsetTop + key.offsetHeight ||
      position[0] >= box.offsetLeft + box.offsetWidth - key.offsetWidth ||
      position[1] >= box.offsetTop + box.offsetHeight - key.offsetHeight ||
      position[0] <  box.offsetLeft + key.offsetLeft - key.offsetWidth ||
      position[1] <  box.offsetTop + key.offsetTop - key.offsetHeight ||
      position[0] >= box.offsetLeft + key.offsetLeft + 2*key.offsetWidth ||
      position[1] >= box.offsetTop + key.offsetTop + 2*key.offsetHeight) {
    if (this.lastSelectedKey.className) log.console('reset: deselecting');
    this.lastSelectedKey.className = '';
    this.lastSelectedKey           = undefined;
  }
  return false;
};

VT100.prototype.showShiftState = function(state) {
  var style              = document.getElementById('shift_state');
  if (state) {
    this.setTextContentRaw(style,
                           '#vt100 #keyboard .shifted {' +
                             'display: inline }' +
                           '#vt100 #keyboard .unshifted {' +
                             'display: none }');
  } else {
    this.setTextContentRaw(style, '');
  }
  var elems              = this.keyboard.getElementsByTagName('I');
  for (var i = 0; i < elems.length; ++i) {
    if (elems[i].id == '16') {
      elems[i].className = state ? 'selected' : '';
    }
  }
};

VT100.prototype.showCtrlState = function(state) {
  var ctrl         = this.getChildById(this.keyboard, '17' /* Ctrl */);
  if (ctrl) {
    ctrl.className = state ? 'selected' : '';
  }
};

VT100.prototype.showAltState = function(state) {
  var alt         = this.getChildById(this.keyboard, '18' /* Alt */);
  if (alt) {
    alt.className = state ? 'selected' : '';
  }
};

VT100.prototype.clickedKeyboard = function(e, elem, ch, key, shift, ctrl, alt){
  var fake      = [ ];
  fake.charCode = ch;
  fake.keyCode  = key;
  fake.ctrlKey  = ctrl;
  fake.shiftKey = shift;
  fake.altKey   = alt;
  fake.metaKey  = alt;
  return this.handleKey(fake);
};

VT100.prototype.addKeyBinding = function(elem, ch, key, CH, KEY) {
  if (elem == undefined) {
    return;
  }
  if (ch == '\u00A0') {
    // &nbsp; should be treated as a regular space character.
    ch                                  = ' ';
  }
  if (ch != undefined && CH == undefined) {
    // For letter keys, we automatically compute the uppercase character code
    // from the lowercase one.
    CH                                  = ch.toUpperCase();
  }
  if (KEY == undefined && key != undefined) {
    // Most keys have identically key codes for both lowercase and uppercase
    // keypresses. Normally, only function keys would have distinct key codes,
    // whereas regular keys have character codes.
    KEY                                 = key;
  } else if (KEY == undefined && CH != undefined) {
    // For regular keys, copy the character code to the key code.
    KEY                                 = CH.charCodeAt(0);
  }
  if (key == undefined && ch != undefined) {
    // For regular keys, copy the character code to the key code.
    key                                 = ch.charCodeAt(0);
  }
  // Convert characters to numeric character codes. If the character code
  // is undefined (i.e. this is a function key), set it to zero.
  ch                                    = ch ? ch.charCodeAt(0) : 0;
  CH                                    = CH ? CH.charCodeAt(0) : 0;

  // Mouse down events high light the key. We also set lastSelectedKey. This
  // is needed to that mouseout/mouseover can keep track of the key that
  // is currently being clicked.
  this.addListener(elem, 'mousedown',
    function(vt100, elem, key) { return function(e) {
      if ((e.which || e.button) == 1) {
        if (vt100.lastSelectedKey) {
          vt100.lastSelectedKey.className= '';
        }
        // Highlight the key while the mouse button is held down.
        if (key == 16 /* Shift */) {
          if (!elem.className != vt100.isShift) {
            vt100.showShiftState(!vt100.isShift);
          }
        } else if (key == 17 /* Ctrl */) {
          if (!elem.className != vt100.isCtrl) {
            vt100.showCtrlState(!vt100.isCtrl);
          }
        } else if (key == 18 /* Alt */) {
          if (!elem.className != vt100.isAlt) {
            vt100.showAltState(!vt100.isAlt);
          }
        } else {
          elem.className                  = 'selected';
        }
        vt100.lastSelectedKey             = elem;
      }
      return false; }; }(this, elem, key));
  var clicked                           =
    // Modifier keys update the state of the keyboard, but do not generate
    // any key clicks that get forwarded to the application.
    key >= 16 /* Shift */ && key <= 18 /* Alt */ ?
    function(vt100, elem) { return function(e) {
      if (elem == vt100.lastSelectedKey) {
        if (key == 16 /* Shift */) {
          // The user clicked the Shift key
          vt100.isShift                 = !vt100.isShift;
          vt100.showShiftState(vt100.isShift);
        } else if (key == 17 /* Ctrl */) {
          vt100.isCtrl                  = !vt100.isCtrl;
          vt100.showCtrlState(vt100.isCtrl);
        } else if (key == 18 /* Alt */) {
          vt100.isAlt                   = !vt100.isAlt;
          vt100.showAltState(vt100.isAlt);
        }
        vt100.lastSelectedKey           = undefined;
      }
      if (vt100.lastSelectedKey) {
        vt100.lastSelectedKey.className = '';
        vt100.lastSelectedKey           = undefined;
      }
      return false; }; }(this, elem) :
    // Regular keys generate key clicks, when the mouse button is released or
    // when a mouse click event is received.
    function(vt100, elem, ch, key, CH, KEY) { return function(e) {
      if (vt100.lastSelectedKey) {
        if (elem == vt100.lastSelectedKey) {
          // The user clicked a key.
          if (vt100.isShift) {
            vt100.clickedKeyboard(e, elem, CH, KEY,
                                  true, vt100.isCtrl, vt100.isAlt);
          } else {
            vt100.clickedKeyboard(e, elem, ch, key,
                                  false, vt100.isCtrl, vt100.isAlt);
          }
          vt100.isShift                 = false;
          vt100.showShiftState(false);
          vt100.isCtrl                  = false;
          vt100.showCtrlState(false);
          vt100.isAlt                   = false;
          vt100.showAltState(false);
        }
        vt100.lastSelectedKey.className = '';
        vt100.lastSelectedKey           = undefined;
      }
      elem.className                    = '';
      return false; }; }(this, elem, ch, key, CH, KEY);
  this.addListener(elem, 'mouseup', clicked);
  this.addListener(elem, 'click', clicked);

  // When moving the mouse away from a key, check if any keys need to be
  // deselected.
  this.addListener(elem, 'mouseout',
    function(vt100, elem, key) { return function(e) {
      if (key == 16 /* Shift */) {
        if (!elem.className == vt100.isShift) {
          vt100.showShiftState(vt100.isShift);
        }
      } else if (key == 17 /* Ctrl */) {
        if (!elem.className == vt100.isCtrl) {
          vt100.showCtrlState(vt100.isCtrl);
        }
      } else if (key == 18 /* Alt */) {
        if (!elem.className == vt100.isAlt) {
          vt100.showAltState(vt100.isAlt);
        }
      } else if (elem.className) {
        elem.className                  = '';
        vt100.lastSelectedKey           = elem;
      } else if (vt100.lastSelectedKey) {
        vt100.resetLastSelectedKey(e);
      }
      return false; }; }(this, elem, key));

  // When moving the mouse over a key, select it if the user is still holding
  // the mouse button down (i.e. elem == lastSelectedKey)
  this.addListener(elem, 'mouseover',
    function(vt100, elem, key) { return function(e) {
      if (elem == vt100.lastSelectedKey) {
        if (key == 16 /* Shift */) {
          if (!elem.className != vt100.isShift) {
            vt100.showShiftState(!vt100.isShift);
          }
        } else if (key == 17 /* Ctrl */) {
          if (!elem.className != vt100.isCtrl) {
            vt100.showCtrlState(!vt100.isCtrl);
          }
        } else if (key == 18 /* Alt */) {
          if (!elem.className != vt100.isAlt) {
            vt100.showAltState(!vt100.isAlt);
          }
        } else if (!elem.className) {
          elem.className                = 'selected';
        }
      } else {
        vt100.resetLastSelectedKey(e);
      }
      return false; }; }(this, elem, key));
};

VT100.prototype.initializeKeyBindings = function(elem) {
  if (elem) {
    if (elem.nodeName == "I" || elem.nodeName == "B") {
      if (elem.id) {
        // Function keys. The Javascript keycode is part of the "id"
        var i     = parseInt(elem.id);
        if (i) {
          // If the id does not parse as a number, it is not a keycode.
          this.addKeyBinding(elem, undefined, i);
        }
      } else {
        var child = elem.firstChild;
        if (child) {
          if (child.nodeName == "#text") {
            // If the key only has a text node as a child, then it is a letter.
            // Automatically compute the lower and upper case version of the
            // key.
            var text = this.getTextContent(child) ||
                       this.getTextContent(elem);
            this.addKeyBinding(elem, text.toLowerCase());
          } else if (child.nextSibling) {
            // If the key has two children, they are the lower and upper case
            // character code, respectively.
            this.addKeyBinding(elem, this.getTextContent(child), undefined,
                               this.getTextContent(child.nextSibling));
          }
        }
      }
    }
  }
  // Recursively parse all other child nodes.
  for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
    this.initializeKeyBindings(elem);
  }
};

VT100.prototype.initializeKeyboardButton = function() {
  // Configure mouse event handlers for button that displays/hides keyboard
  this.addListener(this.keyboardImage, 'click',
    function(vt100) { return function(e) {
      if (vt100.keyboard.style.display != '') {
        if (vt100.reconnectBtn.style.visibility != '') {
          vt100.initializeKeyboard();
          vt100.showSoftKeyboard();
        }
      } else {
        vt100.hideSoftKeyboard();
        vt100.input.focus();
      }
      return false; }; }(this));

  // Enable button that displays keyboard
  if (this.softKeyboard) {
    this.keyboardImage.style.visibility = 'visible';
  }
};

VT100.prototype.initializeKeyboard = function() {
  // Only need to initialize the keyboard the very first time. When doing so,
  // copy the keyboard layout from the iframe.
  if (this.keyboard.firstChild) {
    return;
  }
  this.keyboard.innerHTML               =
                                    this.layout.contentDocument.body.innerHTML;
  var box                               = this.keyboard.firstChild;
  this.hideSoftKeyboard();

  // Configure mouse event handlers for on-screen keyboard
  this.addListener(this.keyboard, 'click',
    function(vt100) { return function(e) {
      vt100.hideSoftKeyboard();
      vt100.input.focus();
      return false; }; }(this));
  this.addListener(this.keyboard, 'selectstart', this.cancelEvent);
  this.addListener(box, 'click', this.cancelEvent);
  this.addListener(box, 'mouseup',
    function(vt100) { return function(e) {
      if (vt100.lastSelectedKey) {
        vt100.lastSelectedKey.className = '';
        vt100.lastSelectedKey           = undefined;
      }
      return false; }; }(this));
  this.addListener(box, 'mouseout',
    function(vt100) { return function(e) {
      return vt100.resetLastSelectedKey(e); }; }(this));
  this.addListener(box, 'mouseover',
    function(vt100) { return function(e) {
      return vt100.resetLastSelectedKey(e); }; }(this));

  // Configure SHIFT key behavior
  var style                             = document.createElement('style');
  var id                                = document.createAttribute('id');
  id.nodeValue                          = 'shift_state';
  style.setAttributeNode(id);
  var type                              = document.createAttribute('type');
  type.nodeValue                        = 'text/css';
  style.setAttributeNode(type);
  document.getElementsByTagName('head')[0].appendChild(style);

  // Set up key bindings
  this.initializeKeyBindings(box);
};

VT100.prototype.initializeElements = function(container) {
  // If the necessary objects have not already been defined in the HTML
  // page, create them now.
  if (container) {
    this.container             = container;
  } else if (!(this.container  = document.getElementById('vt100'))) {
    this.container             = document.createElement('div');
    this.container.id          = 'vt100';
    document.body.appendChild(this.container);
  }

  if (!this.getChildById(this.container, 'reconnect')   ||
      !this.getChildById(this.container, 'menu')        ||
      !this.getChildById(this.container, 'keyboard')    ||
      !this.getChildById(this.container, 'kbd_button')  ||
      !this.getChildById(this.container, 'kbd_img')     ||
      !this.getChildById(this.container, 'layout')      ||
      !this.getChildById(this.container, 'scrollable')  ||
      !this.getChildById(this.container, 'console')     ||
      !this.getChildById(this.container, 'alt_console') ||
      !this.getChildById(this.container, 'ieprobe')     ||
      !this.getChildById(this.container, 'padding')     ||
      !this.getChildById(this.container, 'cursor')      ||
      !this.getChildById(this.container, 'lineheight')  ||
      !this.getChildById(this.container, 'usercss')     ||
      !this.getChildById(this.container, 'space')       ||
      !this.getChildById(this.container, 'input')       ||
      !this.getChildById(this.container, 'cliphelper')) {
    // Only enable the "embed" object, if we have a suitable plugin. Otherwise,
    // we might get a pointless warning that a suitable plugin is not yet
    // installed. If in doubt, we'd rather just stay silent.
    var embed                  = '';
    try {
      if (typeof navigator.mimeTypes["audio/x-wav"].enabledPlugin.name !=
          'undefined') {
        embed                  = typeof suppressAllAudio != 'undefined' &&
                                 suppressAllAudio ? "" :
        '<embed classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" ' +
                       'id="beep_embed" ' +
                       'src="beep.wav" ' +
                       'autostart="false" ' +
                       'volume="100" ' +
                       'enablejavascript="true" ' +
                       'type="audio/x-wav" ' +
                       'height="16" ' +
                       'width="200" ' +
                       'style="position:absolute;left:-1000px;top:-1000px" />';
      }
    } catch (e) {
    }

    this.container.innerHTML   =
                       '<div id="reconnect" style="visibility: hidden">' +
                         '<input type="button" value="Connect" ' +
                                'onsubmit="return false" />' +
                       '</div>' +
                       '<div id="cursize" style="visibility: hidden">' +
                       '</div>' +
                       '<div id="menu"></div>' +
                       '<div id="keyboard" unselectable="on">' +
                       '</div>' +
                       '<div id="scrollable">' +
                         '<table id="kbd_button">' +
                           '<tr><td width="100%">&nbsp;</td>' +
                           '<td><img id="kbd_img" src="keyboard.png" /></td>' +
                           '<td>&nbsp;&nbsp;&nbsp;&nbsp;</td></tr>' +
                         '</table>' +
                         '<pre id="lineheight">&nbsp;</pre>' +
                         '<pre id="console">' +
                           '<pre></pre>' +
                           '<div id="ieprobe"><span>&nbsp;</span></div>' +
                         '</pre>' +
                         '<pre id="alt_console" style="display: none"></pre>' +
                         '<div id="padding"></div>' +
                         '<pre id="cursor">&nbsp;</pre>' +
                       '</div>' +
                       '<div class="hidden">' +
                         '<div id="usercss"></div>' +
                         '<pre><div><span id="space"></span></div></pre>' +
                         '<input type="text" id="input" autocorrect="off" autocapitalize="off" />' +
                         '<input type="text" id="cliphelper" />' +
                         (typeof suppressAllAudio != 'undefined' &&
                          suppressAllAudio ? "" :
                         embed + '<bgsound id="beep_bgsound" loop=1 />') +
                          '<iframe id="layout" src="keyboard.html" />' +
                        '</div>';
  }

  // Find the object used for playing the "beep" sound, if any.
  if (typeof suppressAllAudio != 'undefined' && suppressAllAudio) {
    this.beeper                = undefined;
  } else {
    this.beeper                = this.getChildById(this.container,
                                                   'beep_embed');
    if (!this.beeper || !this.beeper.Play) {
      this.beeper              = this.getChildById(this.container,
                                                   'beep_bgsound');
      if (!this.beeper || typeof this.beeper.src == 'undefined') {
        this.beeper            = undefined;
      }
    }
  }

  // Initialize the variables for finding the text console and the
  // cursor.
  this.reconnectBtn            = this.getChildById(this.container,'reconnect');
  this.curSizeBox              = this.getChildById(this.container, 'cursize');
  this.menu                    = this.getChildById(this.container, 'menu');
  this.keyboard                = this.getChildById(this.container, 'keyboard');
  this.keyboardImage           = this.getChildById(this.container, 'kbd_img');
  this.layout                  = this.getChildById(this.container, 'layout');
  this.scrollable              = this.getChildById(this.container,
                                                                 'scrollable');
  this.lineheight              = this.getChildById(this.container,
                                                                 'lineheight');
  this.console                 =
                          [ this.getChildById(this.container, 'console'),
                            this.getChildById(this.container, 'alt_console') ];
  var ieProbe                  = this.getChildById(this.container, 'ieprobe');
  this.padding                 = this.getChildById(this.container, 'padding');
  this.cursor                  = this.getChildById(this.container, 'cursor');
  this.usercss                 = this.getChildById(this.container, 'usercss');
  this.space                   = this.getChildById(this.container, 'space');
  this.input                   = this.getChildById(this.container, 'input');
  this.cliphelper              = this.getChildById(this.container,
                                                                 'cliphelper');

  // Add any user selectable style sheets to the menu
  this.initializeUserCSSStyles();

  // Remember the dimensions of a standard character glyph. We would
  // expect that we could just check cursor.clientWidth/Height at any time,
  // but it turns out that browsers sometimes invalidate these values
  // (e.g. while displaying a print preview screen).
  this.cursorWidth             = this.cursor.clientWidth;
  this.cursorHeight            = this.lineheight.clientHeight;

  // IE has a slightly different boxing model, that we need to compensate for
  this.isIE                    = ieProbe.offsetTop > 1;
  ieProbe                      = undefined;
  this.console.innerHTML       = '';

  // Determine if the terminal window is positioned at the beginning of the
  // page, or if it is embedded somewhere else in the page. For full-screen
  // terminals, automatically resize whenever the browser window changes.
  var marginTop                = parseInt(this.getCurrentComputedStyle(
                                          document.body, 'marginTop'));
  var marginLeft               = parseInt(this.getCurrentComputedStyle(
                                          document.body, 'marginLeft'));
  var marginRight              = parseInt(this.getCurrentComputedStyle(
                                          document.body, 'marginRight'));
  var x                        = this.container.offsetLeft;
  var y                        = this.container.offsetTop;
  for (var parent = this.container; parent = parent.offsetParent; ) {
    x                         += parent.offsetLeft;
    y                         += parent.offsetTop;
  }
  // When zoom functionality is used, some browsers report container offsetWidth
  // wrong by one pixel. This is the reason why widthDiff can be 0 or -1 pixel,
  // and in this case variable isEmbedded is not set to true.
  var widthDiff                = ((window.innerWidth ||
                                   document.documentElement.clientWidth ||
                                   document.body.clientWidth) - marginRight)
                                 - (x + this.container.offsetWidth);
  this.isEmbedded              = marginTop != y ||
                                 marginLeft != x ||
                                 (widthDiff != 0 && widthDiff != -1);
  if (!this.isEmbedded) {
    // Some browsers generate resize events when the terminal is first
    // shown. Disable showing the size indicator until a little bit after
    // the terminal has been rendered the first time.
    this.indicateSize          = false;
    setTimeout(function(vt100) {
      return function() {
        vt100.indicateSize     = true;
      };
    }(this), 100);
    this.addListener(window, 'resize',
                     function(vt100) {
                       return function() {
                         vt100.hideContextMenu();
                         vt100.resizer();
                         vt100.showCurrentSize();
                        }
                      }(this));

    // Hide extra scrollbars attached to window
    document.body.style.margin = '0px';
    try { document.body.style.overflow ='hidden'; } catch (e) { }
    try { document.body.oncontextmenu = function() {return false;};} catch(e){}
  }

  // Set up onscreen soft keyboard
  this.initializeKeyboardButton();

  // Hide context menu
  this.hideContextMenu();

  // Add listener to reconnect button
  this.addListener(this.reconnectBtn.firstChild, 'click',
                   function(vt100) {
                     return function() {
                       var rc = vt100.reconnect();
                       vt100.input.focus();
                       return rc;
                     }
                   }(this));

  // Add input listeners
  this.addListener(this.input, 'blur',
                   function(vt100) {
                     return function() { vt100.blurCursor(); } }(this));
  this.addListener(this.input, 'focus',
                   function(vt100) {
                     return function() { vt100.focusCursor(); } }(this));
  this.addListener(this.input, 'keydown',
                   function(vt100) {
                     return function(e) {
                       if (!e) e = window.event;
                       return vt100.keyDown(e); } }(this));
  this.addListener(this.input, 'keypress',
                   function(vt100) {
                     return function(e) {
                       if (!e) e = window.event;
                       return vt100.keyPressed(e); } }(this));
  this.addListener(this.input, 'keyup',
                   function(vt100) {
                     return function(e) {
                       if (!e) e = window.event;
                       return vt100.keyUp(e); } }(this));

  // Attach listeners that move the focus to the <input> field. This way we
  // can make sure that we can receive keyboard input.
  var mouseEvent               = function(vt100, type) {
    return function(e) {
      if (!e) e = window.event;
      return vt100.mouseEvent(e, type);
    };
  };
  this.addListener(this.scrollable,'mousedown',mouseEvent(this, 0 /* MOUSE_DOWN */));
  this.addListener(this.scrollable,'mouseup',  mouseEvent(this, 1 /* MOUSE_UP */));
  this.addListener(this.scrollable,'click',    mouseEvent(this, 2 /* MOUSE_CLICK */));

  // Initialize the blank terminal window.
  this.currentScreen           = 0;
  this.cursorX                 = 0;
  this.cursorY                 = 0;
  this.numScrollbackLines      = 0;
  this.top                     = 0;
  this.bottom                  = 0x7FFFFFFF;
  this.scale                   = 1.0;
  this.resizer();
  this.focusCursor();
  this.input.focus();
};

VT100.prototype.getChildById = function(parent, id) {
  var nodeList = parent.all || parent.getElementsByTagName('*');
  if (typeof nodeList.namedItem == 'undefined') {
    for (var i = 0; i < nodeList.length; i++) {
      if (nodeList[i].id == id) {
        return nodeList[i];
      }
    }
    return null;
  } else {
    var elem = (parent.all || parent.getElementsByTagName('*')).namedItem(id);
    return elem ? elem[0] || elem : null;
  }
};

VT100.prototype.getCurrentComputedStyle = function(elem, style) {
  if (typeof elem.currentStyle != 'undefined') {
    return elem.currentStyle[style];
  } else {
    return document.defaultView.getComputedStyle(elem, null)[style];
  }
};

VT100.prototype.reconnect = function() {
  return false;
};

VT100.prototype.showReconnect = function(state) {
  if (state) {
    this.hideSoftKeyboard();
    this.reconnectBtn.style.visibility = '';
  } else {
    this.reconnectBtn.style.visibility = 'hidden';
  }
};

VT100.prototype.repairElements = function(console) {
  for (var line = console.firstChild; line; line = line.nextSibling) {
    if (!line.clientHeight) {
      var newLine = document.createElement(line.tagName);
      newLine.style.cssText       = line.style.cssText;
      newLine.className           = line.className;
      if (line.tagName == 'DIV') {
        for (var span = line.firstChild; span; span = span.nextSibling) {
          var newSpan             = document.createElement(span.tagName);
          newSpan.style.cssText   = span.style.cssText;
          newSpan.className       = span.className;
          this.setTextContent(newSpan, this.getTextContent(span));
          newLine.appendChild(newSpan);
        }
      } else {
        this.setTextContent(newLine, this.getTextContent(line));
      }
      line.parentNode.replaceChild(newLine, line);
      line                        = newLine;
    }
  }
};

VT100.prototype.resized = function(w, h) {
};

VT100.prototype.resizer = function() {
  // Hide onscreen soft keyboard
  this.hideSoftKeyboard();

  // The cursor can get corrupted if the print-preview is displayed in Firefox.
  // Recreating it, will repair it.
  var newCursor                = document.createElement('pre');
  this.setTextContent(newCursor, ' ');
  newCursor.id                 = 'cursor';
  newCursor.style.cssText      = this.cursor.style.cssText;
  this.cursor.parentNode.insertBefore(newCursor, this.cursor);
  if (!newCursor.clientHeight) {
    // Things are broken right now. This is probably because we are
    // displaying the print-preview. Just don't change any of our settings
    // until the print dialog is closed again.
    newCursor.parentNode.removeChild(newCursor);
    return;
  } else {
    // Swap the old broken cursor for the newly created one.
    this.cursor.parentNode.removeChild(this.cursor);
    this.cursor                = newCursor;
  }

  // Really horrible things happen if the contents of the terminal changes
  // while the print-preview is showing. We get HTML elements that show up
  // in the DOM, but that do not take up any space. Find these elements and
  // try to fix them.
  this.repairElements(this.console[0]);
  this.repairElements(this.console[1]);

  // Lock the cursor size to the size of a normal character. This helps with
  // characters that are taller/shorter than normal. Unfortunately, we will
  // still get confused if somebody enters a character that is wider/narrower
  // than normal. This can happen if the browser tries to substitute a
  // characters from a different font.
  if (this.cursorWidth > 0) {
    this.cursor.style.width    = this.cursorWidth  + 'px';
  }
  if (this.cursorHeight > 0) {
    this.cursor.style.height   = this.cursorHeight + 'px';
  }

  // Adjust height for one pixel padding of the #vt100 element.
  // The latter is necessary to properly display the inactive cursor.
  var console                  = this.console[this.currentScreen];
  var height                   = (this.isEmbedded ? this.container.clientHeight
                                  : (window.innerHeight ||
                                     document.documentElement.clientHeight ||
                                     document.body.clientHeight))-1;

  // Prevent ever growing console on some iOS clients.
  if (navigator.userAgent.match(/iPad|iPhone|iPod/i) != null) {
    height                    -= 1;
  }

  var partial                  = height % this.cursorHeight;
  this.scrollable.style.height = (height > 0 ? height : 0) + 'px';
  this.padding.style.height    = (partial > 0 ? partial : 0) + 'px';
  var oldTerminalHeight        = this.terminalHeight;
  this.updateWidth();
  this.updateHeight();

  // Clip the cursor to the visible screen.
  var cx                       = this.cursorX;
  var cy                       = this.cursorY + this.numScrollbackLines;

  // The alternate screen never keeps a scroll back buffer.
  this.updateNumScrollbackLines();
  while (this.currentScreen && this.numScrollbackLines > 0) {
    console.removeChild(console.firstChild);
    this.numScrollbackLines--;
  }
  cy                          -= this.numScrollbackLines;
  if (cx < 0) {
    cx                         = 0;
  } else if (cx > this.terminalWidth) {
    cx                         = this.terminalWidth - 1;
    if (cx < 0) {
      cx                       = 0;
    }
  }
  if (cy < 0) {
    cy                         = 0;
  } else if (cy > this.terminalHeight) {
    cy                         = this.terminalHeight - 1;
    if (cy < 0) {
      cy                       = 0;
    }
  }

  // Clip the scroll region to the visible screen.
  if (this.bottom > this.terminalHeight ||
      this.bottom == oldTerminalHeight) {
    this.bottom                = this.terminalHeight;
  }
  if (this.top >= this.bottom) {
    this.top                   = this.bottom-1;
    if (this.top < 0) {
      this.top                 = 0;
    }
  }

  // Truncate lines, if necessary. Explicitly reposition cursor (this is
  // particularly important after changing the screen number), and reset
  // the scroll region to the default.
  this.truncateLines(this.terminalWidth);
  this.putString(cx, cy, '', undefined);
  this.scrollable.scrollTop    = this.numScrollbackLines *
                                 this.cursorHeight + 1;

  // Update classNames for lines in the scrollback buffer
  var line                     = console.firstChild;
  for (var i = 0; i < this.numScrollbackLines; i++) {
    line.className             = 'scrollback';
    line                       = line.nextSibling;
  }
  while (line) {
    line.className             = '';
    line                       = line.nextSibling;
  }

  // Reposition the reconnect button
  this.reconnectBtn.style.left = (this.terminalWidth*this.cursorWidth/
                                  this.scale -
                                  this.reconnectBtn.clientWidth)/2 + 'px';
  this.reconnectBtn.style.top  = (this.terminalHeight*this.cursorHeight-
                                  this.reconnectBtn.clientHeight)/2 + 'px';

  // Send notification that the window size has been changed
  this.resized(this.terminalWidth, this.terminalHeight);
};

VT100.prototype.showCurrentSize = function() {
  if (!this.indicateSize) {
    return;
  }
  this.curSizeBox.innerHTML             = '' + this.terminalWidth + 'x' +
                                               this.terminalHeight;
  this.curSizeBox.style.left            =
                                      (this.terminalWidth*this.cursorWidth/
                                       this.scale -
                                       this.curSizeBox.clientWidth)/2 + 'px';
  this.curSizeBox.style.top             =
                                      (this.terminalHeight*this.cursorHeight -
                                       this.curSizeBox.clientHeight)/2 + 'px';
  this.curSizeBox.style.visibility      = '';
  if (this.curSizeTimeout) {
    clearTimeout(this.curSizeTimeout);
  }

  // Only show the terminal size for a short amount of time after resizing.
  // Then hide this information, again. Some browsers generate resize events
  // throughout the entire resize operation. This is nice, and we will show
  // the terminal size while the user is dragging the window borders.
  // Other browsers only generate a single event when the user releases the
  // mouse. In those cases, we can only show the terminal size once at the
  // end of the resize operation.
  this.curSizeTimeout                   = setTimeout(function(vt100) {
    return function() {
      vt100.curSizeTimeout              = null;
      vt100.curSizeBox.style.visibility = 'hidden';
    };
  }(this), 1000);
};

VT100.prototype.selection = function() {
  try {
    return '' + (window.getSelection && window.getSelection() ||
                 document.selection && document.selection.type == 'Text' &&
                 document.selection.createRange().text || '');
  } catch (e) {
  }
  return '';
};

VT100.prototype.cancelEvent = function(event) {
  try {
    // For non-IE browsers
    event.stopPropagation();
    event.preventDefault();
  } catch (e) {
  }
  try {
    // For IE
    event.cancelBubble = true;
    event.returnValue  = false;
    event.button       = 0;
    event.keyCode      = 0;
  } catch (e) {
  }
  return false;
};

VT100.prototype.mousePosition = function(event) {
  var offsetX      = this.container.offsetLeft;
  var offsetY      = this.container.offsetTop;
  for (var e = this.container; e = e.offsetParent; ) {
    offsetX       += e.offsetLeft;
    offsetY       += e.offsetTop;
  }
  return [ event.clientX - offsetX,
           event.clientY - offsetY ];
};

VT100.prototype.mouseEvent = function(event, type) {
  // If any text is currently selected, do not move the focus as that would
  // invalidate the selection.
  var selection    = this.selection();
  if ((type == 1 /* MOUSE_UP */ || type == 2 /* MOUSE_CLICK */) && !selection.length) {
    this.input.focus();
  }

  // Compute mouse position in characters.
  var position     = this.mousePosition(event);
  var x            = Math.floor(position[0] / this.cursorWidth);
  var y            = Math.floor((position[1] + this.scrollable.scrollTop) /
                                this.cursorHeight) - this.numScrollbackLines;
  var inside       = true;
  if (x >= this.terminalWidth) {
    x              = this.terminalWidth - 1;
    inside         = false;
  }
  if (x < 0) {
    x              = 0;
    inside         = false;
  }
  if (y >= this.terminalHeight) {
    y              = this.terminalHeight - 1;
    inside         = false;
  }
  if (y < 0) {
    y              = 0;
    inside         = false;
  }

  // Compute button number and modifier keys.
  var button       = type != 0 /* MOUSE_DOWN */ ? 3 :
                     typeof event.pageX != 'undefined' ? event.button :
                     [ undefined, 0, 2, 0, 1, 0, 1, 0  ][event.button];
  if (button != undefined) {
    if (event.shiftKey) {
      button      |= 0x04;
    }
    if (event.altKey || event.metaKey) {
      button      |= 0x08;
    }
    if (event.ctrlKey) {
      button      |= 0x10;
    }
  }

  // Report mouse events if they happen inside of the current screen and
  // with the SHIFT key unpressed. Both of these restrictions do not apply
  // for button releases, as we always want to report those.
  if (this.mouseReporting && !selection.length &&
      (type != 0 /* MOUSE_DOWN */ || !event.shiftKey)) {
    if (inside || type != 0 /* MOUSE_DOWN */) {
      if (button != undefined) {
        var report = '\u001B[M' + String.fromCharCode(button + 32) +
                                  String.fromCharCode(x      + 33) +
                                  String.fromCharCode(y      + 33);
        if (type != 2 /* MOUSE_CLICK */) {
          this.keysPressed(report);
        }

        // If we reported the event, stop propagating it (not sure, if this
        // actually works on most browsers; blocking the global "oncontextmenu"
        // even is still necessary).
        return this.cancelEvent(event);
      }
    }
  }

  // Bring up context menu.
  if (button == 2 && !event.shiftKey) {
    if (type == 0 /* MOUSE_DOWN */) {
      this.showContextMenu(position[0], position[1]);
    }
    return this.cancelEvent(event);
  }

  // Simulate middle click pasting from inside of current window. Note that
  // pasting content from other programs will not work in this way, since we
  // don't have access to native clipboard.
  if ((event.which || event.button) == 2 && selection.length) {
    if (type == 1 /* MOUSE_UP */) {
      // Use timeout to prevent double paste on Chrome/Linux.
      setTimeout(function (vt100) {
        return function() {
          vt100.keysPressed(selection);
          vt100.input.focus();
        }
      }(this), 10);
    }
    if (type == 0 /* MOUSE_DOWN */) {
      // Prevent middle click scroll on Windows systems.
      return this.cancelEvent(event);
    }
  }

  if (this.mouseReporting) {
    try {
      event.shiftKey         = false;
    } catch (e) {
    }
  }

  return true;
};

VT100.prototype.replaceChar = function(s, ch, repl) {
  for (var i = -1;;) {
    i = s.indexOf(ch, i + 1);
    if (i < 0) {
      break;
    }
    s = s.substr(0, i) + repl + s.substr(i + 1);
  }
  return s;
};

VT100.prototype.htmlEscape = function(s) {
  return this.replaceChar(this.replaceChar(this.replaceChar(this.replaceChar(
                s, '&', '&amp;'), '<', '&lt;'), '"', '&quot;'), ' ', '\u00A0');
};

VT100.prototype.getTextContent = function(elem) {
  return elem.textContent ||
         (typeof elem.textContent == 'undefined' ? elem.innerText : '');
};

VT100.prototype.setTextContentRaw = function(elem, s) {
  // Updating the content of an element is an expensive operation. It actually
  // pays off to first check whether the element is still unchanged.
  if (typeof elem.textContent == 'undefined') {
    if (elem.innerText != s) {
      try {
        elem.innerText = s;
      } catch (e) {
        // Very old versions of IE do not allow setting innerText. Instead,
        // remove all children, by setting innerHTML and then set the text
        // using DOM methods.
        elem.innerHTML = '';
        elem.appendChild(document.createTextNode(
                                          this.replaceChar(s, ' ', '\u00A0')));
      }
    }
  } else {
    if (elem.textContent != s) {
      elem.textContent = s;
    }
  }
};

VT100.prototype.setTextContent = function(elem, s) {
  // Check if we find any URLs in the text. If so, automatically convert them
  // to links.
  if (this.urlRE && this.urlRE.test(s)) {
    var inner          = '';
    for (;;) {
      var consumed = 0;
      if (RegExp.leftContext != null) {
        inner         += this.htmlEscape(RegExp.leftContext);
        consumed      += RegExp.leftContext.length;
      }
      var url          = this.htmlEscape(RegExp.lastMatch);
      var fullUrl      = url;

      // If no protocol was specified, try to guess a reasonable one.
      if (url.indexOf('http://') < 0 && url.indexOf('https://') < 0 &&
          url.indexOf('ftp://')  < 0 && url.indexOf('mailto:')  < 0) {
        var slash      = url.indexOf('/');
        var at         = url.indexOf('@');
        var question   = url.indexOf('?');
        if (at > 0 &&
            (at < question || question < 0) &&
            (slash < 0 || (question > 0 && slash > question))) {
          fullUrl      = 'mailto:' + url;
        } else {
          fullUrl      = (url.indexOf('ftp.') == 0 ? 'ftp://' : 'http://') +
                          url;
        }
      }

      inner           += '<a target="vt100Link" href="' + fullUrl +
                         '">' + url + '</a>';
      consumed        += RegExp.lastMatch.length;
      s                = s.substr(consumed);
      if (!this.urlRE.test(s)) {
        if (RegExp.rightContext != null) {
          inner       += this.htmlEscape(RegExp.rightContext);
        }
        break;
      }
    }
    elem.innerHTML     = inner;
    return;
  }

  this.setTextContentRaw(elem, s);
};

VT100.prototype.insertBlankLine = function(y, color, style) {
  // Insert a blank line a position y. This method ignores the scrollback
  // buffer. The caller has to add the length of the scrollback buffer to
  // the position, if necessary.
  // If the position is larger than the number of current lines, this
  // method just adds a new line right after the last existing one. It does
  // not add any missing lines in between. It is the caller's responsibility
  // to do so.
  if (!color) {
    color                = 'ansiDef bgAnsiDef';
  }
  if (!style) {
    style                = '';
  }
  var line;
  if (color != 'ansiDef bgAnsiDef' && !style) {
    line                 = document.createElement('pre');
    this.setTextContent(line, '\n');
  } else {
    line                 = document.createElement('div');
    var span             = document.createElement('span');
    span.style.cssText   = style;
    span.className       = color;
    this.setTextContent(span, this.spaces(this.terminalWidth));
    line.appendChild(span);
  }
  line.style.height      = this.cursorHeight + 'px';
  var console            = this.console[this.currentScreen];
  if (console.childNodes.length > y) {
    console.insertBefore(line, console.childNodes[y]);
  } else {
    console.appendChild(line);
  }
};

VT100.prototype.updateWidth = function() {
  //  if the cursorWidth is zero, something is wrong. Try to get it some other way.
  if (this.cursorWidth <= 0) {
    if (this.cursor.clientWidth <= 0) {
      // Rats, this.cursor.clientWidth is zero too. Best guess?
      this.terminalWidth = 80;
    } else {
      // update the size.
      this.cursorWidth = this.cursor.clientWidth;
      this.terminalWidth = Math.floor(this.console[this.currentScreen].offsetWidth/this.cursorWidth*this.scale);
    }
  } else {
    if ("ActiveXObject" in window)
      this.terminalWidth = Math.floor(this.console[this.currentScreen].offsetWidth/this.cursorWidth*this.scale*0.95);
    else
      this.terminalWidth = Math.floor(this.console[this.currentScreen].offsetWidth/this.cursorWidth*this.scale);
  }

  return this.terminalWidth;
};

VT100.prototype.updateHeight = function() {
  // We want to be able to display either a terminal window that fills the
  // entire browser window, or a terminal window that is contained in a
  // <div> which is embededded somewhere in the web page.
  if (this.isEmbedded) {
    // Embedded terminal. Use size of the containing <div> (id="vt100").
    this.terminalHeight = Math.floor((this.container.clientHeight-1) /
                                     this.cursorHeight);
  } else {
    // Use the full browser window.
    this.terminalHeight = Math.floor(((window.innerHeight ||
                                       document.documentElement.clientHeight ||
                                       document.body.clientHeight)-1)/
                                     this.cursorHeight);
  }
  return this.terminalHeight;
};

VT100.prototype.updateNumScrollbackLines = function() {
  var scrollback          = Math.floor(
                                this.console[this.currentScreen].offsetHeight /
                                this.cursorHeight) -
                            this.terminalHeight;
  this.numScrollbackLines = scrollback < 0 ? 0 : scrollback;
  return this.numScrollbackLines;
};

VT100.prototype.truncateLines = function(width) {
  if (width < 0) {
    width             = 0;
  }
  for (var line = this.console[this.currentScreen].firstChild; line;
       line = line.nextSibling) {
    if (line.tagName == 'DIV') {
      var x           = 0;

      // Traverse current line and truncate it once we saw "width" characters
      for (var span = line.firstChild; span;
           span = span.nextSibling) {
        var s         = this.getTextContent(span);
        var l         = s.length;
        if (x + l > width) {
          this.setTextContent(span, s.substr(0, width - x));
          while (span.nextSibling) {
            line.removeChild(line.lastChild);
          }
          break;
        }
        x            += l;
      }
      // Prune white space from the end of the current line
      var span       = line.lastChild;
      while (span &&
             span.className == 'ansiDef bgAnsiDef' &&
             !span.style.cssText.length) {
        // Scan backwards looking for first non-space character
        var s         = this.getTextContent(span);
        for (var i = s.length; i--; ) {
          if (s.charAt(i) != ' ' && s.charAt(i) != '\u00A0') {
            if (i+1 != s.length) {
              this.setTextContent(s.substr(0, i+1));
            }
            span      = null;
            break;
          }
        }
        if (span) {
          var sibling = span;
          span        = span.previousSibling;
          if (span) {
            // Remove blank <span>'s from end of line
            line.removeChild(sibling);
          } else {
            // Remove entire line (i.e. <div>), if empty
            var blank = document.createElement('pre');
            blank.style.height = this.cursorHeight + 'px';
            this.setTextContent(blank, '\n');
            line.parentNode.replaceChild(blank, line);
          }
        }
      }
    }
  }
};

VT100.prototype.putString = function(x, y, text, color, style) {
  if (!color) {
    color                           = 'ansiDef bgAnsiDef';
  }
  if (!style) {
    style                           = '';
  }
  var yIdx                          = y + this.numScrollbackLines;
  var line;
  var sibling;
  var s;
  var span;
  var xPos                          = 0;
  var console                       = this.console[this.currentScreen];
  if (!text.length && (yIdx >= console.childNodes.length ||
                       console.childNodes[yIdx].tagName != 'DIV')) {
    // Positioning cursor to a blank location
    span                            = null;
  } else {
    // Create missing blank lines at end of page
    while (console.childNodes.length <= yIdx) {
      // In order to simplify lookups, we want to make sure that each line
      // is represented by exactly one element (and possibly a whole bunch of
      // children).
      // For non-blank lines, we can create a <div> containing one or more
      // <span>s. For blank lines, this fails as browsers tend to optimize them
      // away. But fortunately, a <pre> tag containing a newline character
      // appears to work for all browsers (a &nbsp; would also work, but then
      // copying from the browser window would insert superfluous spaces into
      // the clipboard).
      this.insertBlankLine(yIdx);
    }
    line                            = console.childNodes[yIdx];

    // If necessary, promote blank '\n' line to a <div> tag
    if (line.tagName != 'DIV') {
      var div                       = document.createElement('div');
      div.style.height              = this.cursorHeight + 'px';
      div.innerHTML                 = '<span></span>';
      console.replaceChild(div, line);
      line                          = div;
    }

    // Scan through list of <span>'s until we find the one where our text
    // starts
    span                            = line.firstChild;
    var len;
    while (span.nextSibling && xPos < x) {
      len                           = this.getTextContent(span).length;
      if (xPos + len > x) {
        break;
      }
      xPos                         += len;
      span                          = span.nextSibling;
    }

    if (text.length) {
      // If current <span> is not long enough, pad with spaces or add new
      // span
      s                             = this.getTextContent(span);
      var oldColor                  = span.className;
      var oldStyle                  = span.style.cssText;
      if (xPos + s.length < x) {
        if (oldColor != 'ansiDef bgAnsiDef' || oldStyle != '') {
          span                      = document.createElement('span');
          line.appendChild(span);
          span.className            = 'ansiDef bgAnsiDef';
          span.style.cssText        = '';
          oldColor                  = 'ansiDef bgAnsiDef';
          oldStyle                  = '';
          xPos                     += s.length;
          s                         = '';
        }
        do {
          s                        += ' ';
        } while (xPos + s.length < x);
      }

      // If styles do not match, create a new <span>
      var del                       = text.length - s.length + x - xPos;
      if (oldColor != color ||
          (oldStyle != style && (oldStyle || style))) {
        if (xPos == x) {
          // Replacing text at beginning of existing <span>
          if (text.length >= s.length) {
            // New text is equal or longer than existing text
            s                       = text;
          } else {
            // Insert new <span> before the current one, then remove leading
            // part of existing <span>, adjust style of new <span>, and finally
            // set its contents
            sibling                 = document.createElement('span');
            line.insertBefore(sibling, span);
            this.setTextContent(span, s.substr(text.length));
            span                    = sibling;
            s                       = text;
          }
        } else {
          // Replacing text some way into the existing <span>
          var remainder             = s.substr(x + text.length - xPos);
          this.setTextContent(span, s.substr(0, x - xPos));
          xPos                      = x;
          sibling                   = document.createElement('span');
          if (span.nextSibling) {
            line.insertBefore(sibling, span.nextSibling);
            span                    = sibling;
            if (remainder.length) {
              sibling               = document.createElement('span');
              sibling.className     = oldColor;
              sibling.style.cssText = oldStyle;
              this.setTextContent(sibling, remainder);
              line.insertBefore(sibling, span.nextSibling);
            }
          } else {
            line.appendChild(sibling);
            span                    = sibling;
            if (remainder.length) {
              sibling               = document.createElement('span');
              sibling.className     = oldColor;
              sibling.style.cssText = oldStyle;
              this.setTextContent(sibling, remainder);
              line.appendChild(sibling);
            }
          }
          s                         = text;
        }
        span.className              = color;
        span.style.cssText          = style;
      } else {
        // Overwrite (partial) <span> with new text
        s                           = s.substr(0, x - xPos) +
          text +
          s.substr(x + text.length - xPos);
      }
      this.setTextContent(span, s);


      // Delete all subsequent <span>'s that have just been overwritten
      sibling                       = span.nextSibling;
      while (del > 0 && sibling) {
        s                           = this.getTextContent(sibling);
        len                         = s.length;
        if (len <= del) {
          line.removeChild(sibling);
          del                      -= len;
          sibling                   = span.nextSibling;
        } else {
          this.setTextContent(sibling, s.substr(del));
          break;
        }
      }

      // Merge <span> with next sibling, if styles are identical
      if (sibling && span.className == sibling.className &&
          span.style.cssText == sibling.style.cssText) {
        this.setTextContent(span,
                            this.getTextContent(span) +
                            this.getTextContent(sibling));
        line.removeChild(sibling);
      }
    }
  }

  // Position cursor
  this.cursorX                      = x + text.length;
  if (this.cursorX >= this.terminalWidth) {
    this.cursorX                    = this.terminalWidth - 1;
    if (this.cursorX < 0) {
      this.cursorX                  = 0;
    }
  }
  var pixelX                        = -1;
  var pixelY                        = -1;
  if (!this.cursor.style.visibility) {
    var idx                         = this.cursorX - xPos;
    if (span) {
      // If we are in a non-empty line, take the cursor Y position from the
      // other elements in this line. If dealing with broken, non-proportional
      // fonts, this is likely to yield better results.
      pixelY                        = span.offsetTop +
                                      span.offsetParent.offsetTop;
      s                             = this.getTextContent(span);
      var nxtIdx                    = idx - s.length;
      if (nxtIdx < 0) {
        this.setTextContent(this.cursor, s.charAt(idx));
        pixelX                      = span.offsetLeft +
                                      idx*span.offsetWidth / s.length;
      } else {
        if (nxtIdx == 0) {
          pixelX                    = span.offsetLeft + span.offsetWidth;
        }
        if (span.nextSibling) {
          s                         = this.getTextContent(span.nextSibling);
          this.setTextContent(this.cursor, s.charAt(nxtIdx));
          if (pixelX < 0) {
            pixelX                  = span.nextSibling.offsetLeft +
                                      nxtIdx*span.offsetWidth / s.length;
          }
        } else {
          this.setTextContent(this.cursor, ' ');
        }
      }
    } else {
      this.setTextContent(this.cursor, ' ');
    }
  }
  if (pixelX >= 0) {
    this.cursor.style.left          = (pixelX + (this.isIE ? 1 : 0))/
                                      this.scale + 'px';
  } else {
    this.setTextContent(this.space, this.spaces(this.cursorX));
    this.cursor.style.left          = (this.space.offsetWidth +
                                       console.offsetLeft)/this.scale + 'px';
  }
  this.cursorY                      = yIdx - this.numScrollbackLines;
  if (pixelY >= 0) {
    this.cursor.style.top           = pixelY + 'px';
  } else {
    this.cursor.style.top           = yIdx*this.cursorHeight +
                                      console.offsetTop + 'px';
  }

  if (text.length) {
    // Merge <span> with previous sibling, if styles are identical
    if ((sibling = span.previousSibling) &&
        span.className == sibling.className &&
        span.style.cssText == sibling.style.cssText) {
      this.setTextContent(span,
                          this.getTextContent(sibling) +
                          this.getTextContent(span));
      line.removeChild(sibling);
    }

    // Prune white space from the end of the current line
    span                            = line.lastChild;
    while (span &&
           span.className == 'ansiDef bgAnsiDef' &&
           !span.style.cssText.length) {
      // Scan backwards looking for first non-space character
      s                             = this.getTextContent(span);
      for (var i = s.length; i--; ) {
        if (s.charAt(i) != ' ' && s.charAt(i) != '\u00A0') {
          if (i+1 != s.length) {
            this.setTextContent(s.substr(0, i+1));
          }
          span                      = null;
          break;
        }
      }
      if (span) {
        sibling                     = span;
        span                        = span.previousSibling;
        if (span) {
          // Remove blank <span>'s from end of line
          line.removeChild(sibling);
        } else {
          // Remove entire line (i.e. <div>), if empty
          var blank                 = document.createElement('pre');
          blank.style.height        = this.cursorHeight + 'px';
          this.setTextContent(blank, '\n');
          line.parentNode.replaceChild(blank, line);
        }
      }
    }
  }
};

VT100.prototype.gotoXY = function(x, y) {
  if (x >= this.terminalWidth) {
    x           = this.terminalWidth - 1;
  }
  if (x < 0) {
    x           = 0;
  }
  var minY, maxY;
  if (this.offsetMode) {
    minY        = this.top;
    maxY        = this.bottom;
  } else {
    minY        = 0;
    maxY        = this.terminalHeight;
  }
  if (y >= maxY) {
    y           = maxY - 1;
  }
  if (y < minY) {
    y           = minY;
  }
  this.putString(x, y, '', undefined);
  this.needWrap = false;
};

VT100.prototype.gotoXaY = function(x, y) {
  this.gotoXY(x, this.offsetMode ? (this.top + y) : y);
};

VT100.prototype.refreshInvertedState = function() {
  if (this.isInverted) {
    this.scrollable.className += ' inverted';
  } else {
    this.scrollable.className = this.scrollable.className.
                                                     replace(/ *inverted/, '');
  }
};

VT100.prototype.enableAlternateScreen = function(state) {
  // Don't do anything, if we are already on the desired screen
  if ((state ? 1 : 0) == this.currentScreen) {
    // Calling the resizer is not actually necessary. But it is a good way
    // of resetting state that might have gotten corrupted.
    this.resizer();
    return;
  }

  // We save the full state of the normal screen, when we switch away from it.
  // But for the alternate screen, no saving is necessary. We always reset
  // it when we switch to it.
  if (state) {
    this.saveCursor();
  }

  // Display new screen, and initialize state (the resizer does that for us).
  this.currentScreen                                 = state ? 1 : 0;
  this.console[1-this.currentScreen].style.display   = 'none';
  this.console[this.currentScreen].style.display     = '';

  // Select appropriate character pitch.
  var transform                                      = this.getTransformName();
  if (transform) {
    if (state) {
      // Upon enabling the alternate screen, we switch to 80 column mode. But
      // upon returning to the regular screen, we restore the mode that was
      // in effect previously.
      this.console[1].style[transform]               = '';
    }
    var style                                        =
                             this.console[this.currentScreen].style[transform];
    this.cursor.style[transform]                     = style;
    this.space.style[transform]                      = style;
    this.scale                                       = style == '' ? 1.0:1.65;
    if (transform == 'filter') {
       this.console[this.currentScreen].style.width  = style == '' ? '165%':'';
    }
  }
  this.resizer();

  // If we switched to the alternate screen, reset it completely. Otherwise,
  // restore the saved state.
  if (state) {
    this.gotoXY(0, 0);
    this.clearRegion(0, 0, this.terminalWidth, this.terminalHeight);
  } else {
    this.restoreCursor();
  }
};

VT100.prototype.hideCursor = function() {
  var hidden = this.cursor.style.visibility == 'hidden';
  if (!hidden) {
    this.cursor.style.visibility = 'hidden';
    return true;
  }
  return false;
};

VT100.prototype.showCursor = function(x, y) {
  if (this.cursor.style.visibility) {
    this.cursor.style.visibility = '';
    this.putString(x == undefined ? this.cursorX : x,
                   y == undefined ? this.cursorY : y,
                   '', undefined);
    return true;
  }
  return false;
};

VT100.prototype.scrollBack = function() {
  var i                     = this.scrollable.scrollTop -
                              this.scrollable.clientHeight;
  this.scrollable.scrollTop = i < 0 ? 0 : i;
};

VT100.prototype.scrollFore = function() {
  var i                     = this.scrollable.scrollTop +
                              this.scrollable.clientHeight;
  this.scrollable.scrollTop = i > this.numScrollbackLines *
                                  this.cursorHeight + 1
                              ? this.numScrollbackLines *
                                this.cursorHeight + 1
                              : i;
};

VT100.prototype.spaces = function(i) {
  var s = '';
  while (i-- > 0) {
    s += ' ';
  }
  return s;
};

VT100.prototype.clearRegion = function(x, y, w, h, color, style) {
  w         += x;
  if (x < 0) {
    x        = 0;
  }
  if (w > this.terminalWidth) {
    w        = this.terminalWidth;
  }
  if ((w    -= x) <= 0) {
    return;
  }
  h         += y;
  if (y < 0) {
    y        = 0;
  }
  if (h > this.terminalHeight) {
    h        = this.terminalHeight;
  }
  if ((h    -= y) <= 0) {
    return;
  }

  // Special case the situation where we clear the entire screen, and we do
  // not have a scrollback buffer. In that case, we should just remove all
  // child nodes.
  if (!this.numScrollbackLines &&
      w == this.terminalWidth && h == this.terminalHeight &&
      (color == undefined || color == 'ansiDef bgAnsiDef') && !style) {
    var console = this.console[this.currentScreen];
    while (console.lastChild) {
      console.removeChild(console.lastChild);
    }
    this.putString(this.cursorX, this.cursorY, '', undefined);
  } else {
    var hidden = this.hideCursor();
    var cx     = this.cursorX;
    var cy     = this.cursorY;
    var s      = this.spaces(w);
    for (var i = y+h; i-- > y; ) {
      this.putString(x, i, s, color, style);
    }
    hidden ? this.showCursor(cx, cy) : this.putString(cx, cy, '', undefined);
  }
};

VT100.prototype.copyLineSegment = function(dX, dY, sX, sY, w) {
  var text                            = [ ];
  var className                       = [ ];
  var style                           = [ ];
  var console                         = this.console[this.currentScreen];
  if (sY >= console.childNodes.length) {
    text[0]                           = this.spaces(w);
    className[0]                      = undefined;
    style[0]                          = undefined;
  } else {
    var line = console.childNodes[sY];
    if (line.tagName != 'DIV' || !line.childNodes.length) {
      text[0]                         = this.spaces(w);
      className[0]                    = undefined;
      style[0]                        = undefined;
    } else {
      var x                           = 0;
      for (var span = line.firstChild; span && w > 0; span = span.nextSibling){
        var s                         = this.getTextContent(span);
        var len                       = s.length;
        if (x + len > sX) {
          var o                       = sX > x ? sX - x : 0;
          text[text.length]           = s.substr(o, w);
          className[className.length] = span.className;
          style[style.length]         = span.style.cssText;
          w                          -= len - o;
        }
        x                            += len;
      }
      if (w > 0) {
        text[text.length]             = this.spaces(w);
        className[className.length]   = undefined;
        style[style.length]           = undefined;
      }
    }
  }
  var hidden                          = this.hideCursor();
  var cx                              = this.cursorX;
  var cy                              = this.cursorY;
  for (var i = 0; i < text.length; i++) {
    var color;
    if (className[i]) {
      color                           = className[i];
    } else {
      color                           = 'ansiDef bgAnsiDef';
    }
    this.putString(dX, dY - this.numScrollbackLines, text[i], color, style[i]);
    dX                               += text[i].length;
  }
  hidden ? this.showCursor(cx, cy) : this.putString(cx, cy, '', undefined);
};

VT100.prototype.scrollRegion = function(x, y, w, h, incX, incY,
                                        color, style) {
  var left             = incX < 0 ? -incX : 0;
  var right            = incX > 0 ?  incX : 0;
  var up               = incY < 0 ? -incY : 0;
  var down             = incY > 0 ?  incY : 0;

  // Clip region against terminal size
  var dontScroll       = null;
  w                   += x;
  if (x < left) {
    x                  = left;
  }
  if (w > this.terminalWidth - right) {
    w                  = this.terminalWidth - right;
  }
  if ((w              -= x) <= 0) {
    dontScroll         = 1;
  }
  h                   += y;
  if (y < up) {
    y                  = up;
  }
  if (h > this.terminalHeight - down) {
    h                  = this.terminalHeight - down;
  }
  if ((h              -= y) < 0) {
    dontScroll         = 1;
  }
  if (!dontScroll) {
    if (style && style.indexOf('underline')) {
      // Different terminal emulators disagree on the attributes that
      // are used for scrolling. The consensus seems to be, never to
      // fill with underlined spaces. N.B. this is different from the
      // cases when the user blanks a region. User-initiated blanking
      // always fills with all of the current attributes.
      style            = style.replace(/text-decoration:underline;/, '');
    }

    // Compute current scroll position
    var scrollPos      = this.numScrollbackLines -
                      (this.scrollable.scrollTop-1) / this.cursorHeight;

    // Determine original cursor position. Hide cursor temporarily to avoid
    // visual artifacts.
    var hidden         = this.hideCursor();
    var cx             = this.cursorX;
    var cy             = this.cursorY;
    var console        = this.console[this.currentScreen];

    if (!incX && !x && w == this.terminalWidth) {
      // Scrolling entire lines
      if (incY < 0) {
        // Scrolling up
        if (!this.currentScreen && y == -incY &&
            h == this.terminalHeight + incY) {
          // Scrolling up with adding to the scrollback buffer. This is only
          // possible if there are at least as many lines in the console,
          // as the terminal is high
          while (console.childNodes.length < this.terminalHeight) {
            this.insertBlankLine(this.terminalHeight);
          }

          // Add new lines at bottom in order to force scrolling
          for (var i = 0; i < y; i++) {
            this.insertBlankLine(console.childNodes.length, color, style);
          }

          // Adjust the number of lines in the scrollback buffer by
          // removing excess entries.
          this.updateNumScrollbackLines();
          while (this.numScrollbackLines >
                 (this.currentScreen ? 0 : this.maxScrollbackLines)) {
            console.removeChild(console.firstChild);
            this.numScrollbackLines--;
          }

          // Mark lines in the scrollback buffer, so that they do not get
          // printed.
          for (var i = this.numScrollbackLines, j = -incY;
               i-- > 0 && j-- > 0; ) {
            console.childNodes[i].className = 'scrollback';
          }
        } else {
          // Scrolling up without adding to the scrollback buffer.
          for (var i = -incY;
               i-- > 0 &&
               console.childNodes.length >
               this.numScrollbackLines + y + incY; ) {
            console.removeChild(console.childNodes[
                                          this.numScrollbackLines + y + incY]);
          }

          // If we used to have a scrollback buffer, then we must make sure
          // that we add back blank lines at the bottom of the terminal.
          // Similarly, if we are scrolling in the middle of the screen,
          // we must add blank lines to ensure that the bottom of the screen
          // does not move up.
          if (this.numScrollbackLines > 0 ||
              console.childNodes.length > this.numScrollbackLines+y+h+incY) {
            for (var i = -incY; i-- > 0; ) {
              this.insertBlankLine(this.numScrollbackLines + y + h + incY,
                                   color, style);
            }
          }
        }
      } else {
        // Scrolling down
        for (var i = incY;
             i-- > 0 &&
             console.childNodes.length > this.numScrollbackLines + y + h; ) {
          console.removeChild(console.childNodes[this.numScrollbackLines+y+h]);
        }
        for (var i = incY; i--; ) {
          this.insertBlankLine(this.numScrollbackLines + y, color, style);
        }
      }
    } else {
      // Scrolling partial lines
      if (incY <= 0) {
        // Scrolling up or horizontally within a line
        for (var i = y + this.numScrollbackLines;
             i < y + this.numScrollbackLines + h;
             i++) {
          this.copyLineSegment(x + incX, i + incY, x, i, w);
        }
      } else {
        // Scrolling down
        for (var i = y + this.numScrollbackLines + h;
             i-- > y + this.numScrollbackLines; ) {
          this.copyLineSegment(x + incX, i + incY, x, i, w);
        }
      }

      // Clear blank regions
      if (incX > 0) {
        this.clearRegion(x, y, incX, h, color, style);
      } else if (incX < 0) {
        this.clearRegion(x + w + incX, y, -incX, h, color, style);
      }
      if (incY > 0) {
        this.clearRegion(x, y, w, incY, color, style);
      } else if (incY < 0) {
        this.clearRegion(x, y + h + incY, w, -incY, color, style);
      }
    }

    // Reset scroll position
    this.scrollable.scrollTop = (this.numScrollbackLines-scrollPos) *
                                this.cursorHeight + 1;

    // Move cursor back to its original position
    hidden ? this.showCursor(cx, cy) : this.putString(cx, cy, '', undefined);
  }
};

VT100.prototype.copy = function(selection) {
  if (selection == undefined) {
    selection                = this.selection();
  }
  this.internalClipboard     = undefined;
  if (selection.length) {
    try {
      // IE
      this.cliphelper.value  = selection;
      this.cliphelper.select();
      this.cliphelper.createTextRange().execCommand('copy');
    } catch (e) {
      this.internalClipboard = selection;
    }
    this.cliphelper.value    = '';
  }
};

VT100.prototype.copyLast = function() {
  // Opening the context menu can remove the selection. We try to prevent this
  // from happening, but that is not possible for all browsers. So, instead,
  // we compute the selection before showing the menu.
  this.copy(this.lastSelection);
};

VT100.prototype.pasteFnc = function() {
  var clipboard     = undefined;
  if (this.internalClipboard != undefined) {
    clipboard       = this.internalClipboard;
  } else {
    try {
      this.cliphelper.value = '';
      this.cliphelper.createTextRange().execCommand('paste');
      clipboard     = this.cliphelper.value;
    } catch (e) {
    }
  }
  this.cliphelper.value = '';
  if (clipboard && this.menu.style.visibility == 'hidden') {
    return function() {
      this.keysPressed('' + clipboard);
    };
  } else {
    return undefined;
  }
};

VT100.prototype.pasteBrowserFnc = function() {
  var clipboard     = prompt("Paste into this box:","");
  if (clipboard != undefined) {
       return this.keysPressed('' + clipboard);
  }
};

VT100.prototype.toggleUTF = function() {
  this.utfEnabled   = !this.utfEnabled;

  // We always persist the last value that the user selected. Not necessarily
  // the last value that a random program requested.
  this.utfPreferred = this.utfEnabled;
};

VT100.prototype.toggleBell = function() {
  this.visualBell = !this.visualBell;
};

VT100.prototype.toggleSoftKeyboard = function() {
  this.softKeyboard = !this.softKeyboard;
  this.keyboardImage.style.visibility = this.softKeyboard ? 'visible' : '';
};

VT100.prototype.toggleDisableAlt = function() {
  this.disableAlt = !this.disableAlt;
};

VT100.prototype.deselectKeys = function(elem) {
  if (elem && elem.className == 'selected') {
    elem.className = '';
  }
  for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
    this.deselectKeys(elem);
  }
};

VT100.prototype.showSoftKeyboard = function() {
  // Make sure no key is currently selected
  this.lastSelectedKey           = undefined;
  this.deselectKeys(this.keyboard);
  this.isShift                   = false;
  this.showShiftState(false);
  this.isCtrl                    = false;
  this.showCtrlState(false);
  this.isAlt                     = false;
  this.showAltState(false);

  this.keyboard.style.left       = '0px';
  this.keyboard.style.top        = '0px';
  this.keyboard.style.width      = this.container.offsetWidth  + 'px';
  this.keyboard.style.height     = this.container.offsetHeight + 'px';
  this.keyboard.style.visibility = 'hidden';
  this.keyboard.style.display    = '';

  var kbd                        = this.keyboard.firstChild;
  var scale                      = 1.0;
  var transform                  = this.getTransformName();
  if (transform) {
    kbd.style[transform]         = '';
    if (kbd.offsetWidth > 0.9 * this.container.offsetWidth) {
      scale                      = (kbd.offsetWidth/
                                    this.container.offsetWidth)/0.9;
    }
    if (kbd.offsetHeight > 0.9 * this.container.offsetHeight) {
      scale                      = Math.max((kbd.offsetHeight/
                                             this.container.offsetHeight)/0.9);
    }
    var style                    = this.getTransformStyle(transform,
                                              scale > 1.0 ? scale : undefined);
    kbd.style[transform]         = style;
  }
  if (transform == 'filter') {
    scale                        = 1.0;
  }
  kbd.style.left                 = ((this.container.offsetWidth -
                                     kbd.offsetWidth/scale)/2) + 'px';
  kbd.style.top                  = ((this.container.offsetHeight -
                                     kbd.offsetHeight/scale)/2) + 'px';

  this.keyboard.style.visibility = 'visible';
};

VT100.prototype.hideSoftKeyboard = function() {
  this.keyboard.style.display    = 'none';
};

VT100.prototype.toggleCursorBlinking = function() {
  this.blinkingCursor = !this.blinkingCursor;
};

VT100.prototype.about = function() {
  alert("VT100 Terminal Emulator " + "2.20 " +
        "\nCopyright 2008-2010 by Markus Gutschke\n" +
        "For more information check http://shellinabox.com");
};

VT100.prototype.hideContextMenu = function() {
  this.menu.style.visibility = 'hidden';
  this.menu.style.top        = '-100px';
  this.menu.style.left       = '-100px';
  this.menu.style.width      = '0px';
  this.menu.style.height     = '0px';
};

VT100.prototype.extendContextMenu = function(entries, actions) {
};

VT100.prototype.showContextMenu = function(x, y) {
  this.menu.innerHTML         =
    '<table class="popup" ' +
           'cellpadding="0" cellspacing="0">' +
      '<tr><td>' +
        '<ul id="menuentries">' +
          '<li id="beginclipboard">Copy</li>' +
          '<li id="endclipboard">Paste</li>' +
          '<li id="browserclipboard">Paste from browser</li>' +
          '<hr />' +
          '<li id="reset">Reset</li>' +
          '<hr />' +
          '<li id="beginconfig">' +
             (this.utfEnabled ? '<img src="enabled.gif" />' : '') +
             'Unicode</li>' +
          '<li>' +
             (this.visualBell ? '<img src="enabled.gif" />' : '') +
             'Visual Bell</li>'+
          '<li>' +
             (this.softKeyboard ? '<img src="enabled.gif" />' : '') +
             'Onscreen Keyboard</li>' +
          '<li>' +
             (this.disableAlt ? '<img src="enabled.gif" />' : '') +
             'Disable Alt Key</li>' +
          '<li id="endconfig">' +
             (this.blinkingCursor ? '<img src="enabled.gif" />' : '') +
             'Blinking Cursor</li>'+
          (this.usercss.firstChild ?
           '<hr id="beginusercss" />' +
           this.usercss.innerHTML +
           '<hr id="endusercss" />' :
           '<hr />') +
          '<li id="about">About...</li>' +
        '</ul>' +
      '</td></tr>' +
    '</table>';

  var popup                   = this.menu.firstChild;
  var menuentries             = this.getChildById(popup, 'menuentries');

  // Determine menu entries that should be disabled
  this.lastSelection          = this.selection();
  if (!this.lastSelection.length) {
    menuentries.firstChild.className
                              = 'disabled';
  }
  var p                       = this.pasteFnc();
  if (!p) {
    menuentries.childNodes[1].className
                              = 'disabled';
  }

  // Actions for default items
  var actions                 = [ this.copyLast, p, this.pasteBrowserFnc, this.reset,
                                  this.toggleUTF, this.toggleBell,
                                  this.toggleSoftKeyboard,
                                  this.toggleDisableAlt,
                                  this.toggleCursorBlinking ];

  // Actions for user CSS styles (if any)
  for (var i = 0; i < this.usercssActions.length; ++i) {
    actions[actions.length]   = this.usercssActions[i];
  }
  actions[actions.length]     = this.about;

  // Allow subclasses to dynamically add entries to the context menu
  this.extendContextMenu(menuentries, actions);

  // Hook up event listeners
  for (var node = menuentries.firstChild, i = 0; node;
       node = node.nextSibling) {
    if (node.tagName == 'LI') {
      if (node.className != 'disabled') {
        this.addListener(node, 'mouseover',
                         function(vt100, node) {
                           return function() {
                             node.className = 'hover';
                           }
                         }(this, node));
        this.addListener(node, 'mouseout',
                         function(vt100, node) {
                           return function() {
                             node.className = '';
                           }
                         }(this, node));
        this.addListener(node, 'mousedown',
                         function(vt100, action) {
                           return function(event) {
                             vt100.hideContextMenu();
                             action.call(vt100);
                             vt100.storeUserSettings();
                             return vt100.cancelEvent(event || window.event);
                           }
                         }(this, actions[i]));
        this.addListener(node, 'mouseup',
                         function(vt100) {
                           return function(event) {
                             return vt100.cancelEvent(event || window.event);
                           }
                         }(this));
        this.addListener(node, 'mouseclick',
                         function(vt100) {
                           return function(event) {
                             return vt100.cancelEvent(event || window.event);
                           }
                         }());
      }
      i++;
    }
  }

  // Position menu next to the mouse pointer
  this.menu.style.left        = '0px';
  this.menu.style.top         = '0px';
  this.menu.style.width       =  this.container.offsetWidth  + 'px';
  this.menu.style.height      =  this.container.offsetHeight + 'px';
  popup.style.left            = '0px';
  popup.style.top             = '0px';

  var margin                  = 2;
  if (x + popup.clientWidth >= this.container.offsetWidth - margin) {
    x              = this.container.offsetWidth-popup.clientWidth - margin - 1;
  }
  if (x < margin) {
    x                         = margin;
  }
  if (y + popup.clientHeight >= this.container.offsetHeight - margin) {
    y            = this.container.offsetHeight-popup.clientHeight - margin - 1;
  }
  if (y < margin) {
    y                         = margin;
  }
  popup.style.left            = x + 'px';
  popup.style.top             = y + 'px';

  // Block all other interactions with the terminal emulator
  this.addListener(this.menu, 'click', function(vt100) {
                                         return function() {
                                           vt100.hideContextMenu();
                                         }
                                       }(this));

  // Show the menu
  this.menu.style.visibility  = '';
};

VT100.prototype.keysPressed = function(ch) {
  for (var i = 0; i < ch.length; i++) {
    var c = ch.charCodeAt(i);
    this.vt100(c >= 7 && c <= 15 ||
               c == 24 || c == 26 || c == 27 || c >= 32
               ? String.fromCharCode(c) : '<' + c + '>');
  }
};

VT100.prototype.applyModifiers = function(ch, event) {
  if (ch) {
    if (event.ctrlKey) {
      if (ch >= 32 && ch <= 127) {
        // For historic reasons, some control characters are treated specially
        switch (ch) {
        case /* 3 */ 51: ch  =  27; break;
        case /* 4 */ 52: ch  =  28; break;
        case /* 5 */ 53: ch  =  29; break;
        case /* 6 */ 54: ch  =  30; break;
        case /* 7 */ 55: ch  =  31; break;
        case /* 8 */ 56: ch  = 127; break;
        case /* ? */ 63: ch  = 127; break;
        default:         ch &=  31; break;
        }
      }
    }
    return String.fromCharCode(ch);
  } else {
    return undefined;
  }
};

VT100.prototype.handleKey = function(event) {
  // this.vt100('H: c=' + event.charCode + ', k=' + event.keyCode +
  //            (event.shiftKey || event.ctrlKey || event.altKey ||
  //             event.metaKey ? ', ' +
  //             (event.shiftKey ? 'S' : '') + (event.ctrlKey ? 'C' : '') +
  //             (event.altKey ? 'A' : '') + (event.metaKey ? 'M' : '') : '') +
  //            '\r\n');
  var ch, key;
  if (typeof event.charCode != 'undefined') {
    // non-IE keypress events have a translated charCode value. Also, our
    // fake events generated when receiving keydown events include this data
    // on all browsers.
    ch                                = event.charCode;
    key                               = event.keyCode;
  } else {
    // When sending a keypress event, IE includes the translated character
    // code in the keyCode field.
    ch                                = event.keyCode;
    key                               = undefined;
  }

  // Apply modifier keys (ctrl and shift)
  if (ch) {
    key                               = undefined;
  }
  ch                                  = this.applyModifiers(ch, event);

  // By this point, "ch" is either defined and contains the character code, or
  // it is undefined and "key" defines the code of a function key
  if (ch != undefined) {
    this.scrollable.scrollTop         = this.numScrollbackLines *
                                        this.cursorHeight + 1;
  } else {
    if ((event.altKey || event.metaKey) && !event.shiftKey && !event.ctrlKey) {
      // Many programs have difficulties dealing with parametrized escape
      // sequences for function keys. Thus, if ALT is the only modifier
      // key, return Emacs-style keycodes for commonly used keys.
      switch (key) {
      case  33: /* Page Up      */ ch = '\u001B<';                      break;
      case  34: /* Page Down    */ ch = '\u001B>';                      break;
      case  37: /* Left         */ ch = '\u001Bb';                      break;
      case  38: /* Up           */ ch = '\u001Bp';                      break;
      case  39: /* Right        */ ch = '\u001Bf';                      break;
      case  40: /* Down         */ ch = '\u001Bn';                      break;
      case  46: /* Delete       */ ch = '\u001Bd';                      break;
      default:                                                          break;
      }
    } else if (event.shiftKey && !event.ctrlKey &&
               !event.altKey && !event.metaKey) {
      switch (key) {
      case  33: /* Page Up      */ this.scrollBack();                   return;
      case  34: /* Page Down    */ this.scrollFore();                   return;
      default:                                                          break;
      }
    }
    if (ch == undefined) {
      switch (key) {
      case   8: /* Backspace    */ ch = '\u007f';                       break;
      case   9: /* Tab          */ ch = '\u0009';                       break;
      case  10: /* Return       */ ch = '\u000A';                       break;
      case  13: /* Enter        */ ch = this.crLfMode ?
                                        '\r\n' : '\r';                  break;
      case  16: /* Shift        */                                      return;
      case  17: /* Ctrl         */                                      return;
      case  18: /* Alt          */                                      return;
      case  19: /* Break        */                                      return;
      case  20: /* Caps Lock    */                                      return;
      case  27: /* Escape       */ ch = '\u001B';                       break;
      case  33: /* Page Up      */ ch = '\u001B[5~';                    break;
      case  34: /* Page Down    */ ch = '\u001B[6~';                    break;
      case  35: /* End          */ ch = '\u001BOF';                     break;
      case  36: /* Home         */ ch = '\u001BOH';                     break;
      case  37: /* Left         */ ch = this.cursorKeyMode ?
                             '\u001BOD' : '\u001B[D';                   break;
      case  38: /* Up           */ ch = this.cursorKeyMode ?
                             '\u001BOA' : '\u001B[A';                   break;
      case  39: /* Right        */ ch = this.cursorKeyMode ?
                             '\u001BOC' : '\u001B[C';                   break;
      case  40: /* Down         */ ch = this.cursorKeyMode ?
                             '\u001BOB' : '\u001B[B';                   break;
      case  45: /* Insert       */ ch = '\u001B[2~';                    break;
      case  46: /* Delete       */ ch = '\u001B[3~';                    break;
      case  91: /* Left Window  */                                      return;
      case  92: /* Right Window */                                      return;
      case  93: /* Select       */                                      return;
      case  96: /* 0            */ ch = this.applyModifiers(48, event); break;
      case  97: /* 1            */ ch = this.applyModifiers(49, event); break;
      case  98: /* 2            */ ch = this.applyModifiers(50, event); break;
      case  99: /* 3            */ ch = this.applyModifiers(51, event); break;
      case 100: /* 4            */ ch = this.applyModifiers(52, event); break;
      case 101: /* 5            */ ch = this.applyModifiers(53, event); break;
      case 102: /* 6            */ ch = this.applyModifiers(54, event); break;
      case 103: /* 7            */ ch = this.applyModifiers(55, event); break;
      case 104: /* 8            */ ch = this.applyModifiers(56, event); break;
      case 105: /* 9            */ ch = this.applyModifiers(58, event); break;
      case 106: /* *            */ ch = this.applyModifiers(42, event); break;
      case 107: /* +            */ ch = this.applyModifiers(43, event); break;
      case 109: /* -            */ ch = this.applyModifiers(45, event); break;
      case 110: /* .            */ ch = this.applyModifiers(46, event); break;
      case 111: /* /            */ ch = this.applyModifiers(47, event); break;
      case 112: /* F1           */ ch = '\u001BOP';                     break;
      case 113: /* F2           */ ch = '\u001BOQ';                     break;
      case 114: /* F3           */ ch = '\u001BOR';                     break;
      case 115: /* F4           */ ch = '\u001BOS';                     break;
      case 116: /* F5           */ ch = '\u001B[15~';                   break;
      case 117: /* F6           */ ch = '\u001B[17~';                   break;
      case 118: /* F7           */ ch = '\u001B[18~';                   break;
      case 119: /* F8           */ ch = '\u001B[19~';                   break;
      case 120: /* F9           */ ch = '\u001B[20~';                   break;
      case 121: /* F10          */ ch = '\u001B[21~';                   break;
      case 122: /* F11          */ ch = '\u001B[23~';                   break;
      case 123: /* F12          */ ch = '\u001B[24~';                   break;
      case 144: /* Num Lock     */                                      return;
      case 145: /* Scroll Lock  */                                      return;
      case 186: /* ;            */ ch = this.applyModifiers(59, event); break;
      // Conflicts with dead keys ` on Danish keyboard
      //                          ¸ on Slovenian keyboard
      // case 187: /* =            */ ch = this.applyModifiers(61, event); break;
      case 188: /* ,            */ ch = this.applyModifiers(44, event); break;
      case 189: /* -            */ ch = this.applyModifiers(45, event); break;
      case 190: /* .            */ ch = this.applyModifiers(46, event); break;
      case 191: /* /            */ ch = this.applyModifiers(47, event); break;
      // Conflicts with dead key " on Swiss keyboards
      // case 192: /* `            */ ch = this.applyModifiers(96, event); break;
      // Conflicts with dead key " on Swiss keyboards
      // case 219: /* [            */ ch = this.applyModifiers(91, event); break;
      case 220: /* \            */ ch = this.applyModifiers(92, event); break;
      // Conflicts with dead key ^ and ` on Swiss keaboards
      //                         ^ and " on French keyboards
      // case 221: /* ]            */ ch = this.applyModifiers(93, event); break;
      case 222: /* '            */ ch = this.applyModifiers(39, event); break;
      default:                                                          return;
      }
      this.scrollable.scrollTop       = this.numScrollbackLines *
                                        this.cursorHeight + 1;
    }
  }

  // "ch" now contains the sequence of keycodes to send. But we might still
  // have to apply the effects of modifier keys.
  if (event.shiftKey || event.ctrlKey || event.altKey || event.metaKey) {
    var start, digit, part1, part2;
    if ((start = ch.substr(0, 2)) == '\u001B[') {
      for (part1 = start;
           part1.length < ch.length &&
             (digit = ch.charCodeAt(part1.length)) >= 48 && digit <= 57; ) {
        part1                         = ch.substr(0, part1.length + 1);
      }
      part2                           = ch.substr(part1.length);
      if (part1.length > 2) {
        part1                        += ';';
      }
    } else if (start == '\u001BO') {
      part1                           = start;
      part2                           = ch.substr(2);
    }
    if (part1 != undefined) {
      ch                              = part1                                 +
                                       ((event.shiftKey             ? 1 : 0)  +
                                        (event.altKey|event.metaKey ? 2 : 0)  +
                                        (event.ctrlKey              ? 4 : 0) + 1) +
                                        part2;
    } else if (ch.length == 1 && (event.altKey || event.metaKey)
               && !this.disableAlt) {
      ch                              = '\u001B' + ch;
    }
  }

  if (this.menu.style.visibility == 'hidden') {
    // this.vt100('R: c=');
    // for (var i = 0; i < ch.length; i++)
    //   this.vt100((i != 0 ? ', ' : '') + ch.charCodeAt(i));
    // this.vt100('\r\n');
    this.keysPressed(ch);
  }
};

VT100.prototype.inspect = function(o, d) {
  if (d == undefined) {
    d       = 0;
  }
  var rc    = '';
  if (typeof o == 'object' && ++d < 2) {
    rc      = '[\r\n';
    for (i in o) {
      rc   += this.spaces(d * 2) + i + ' -> ';
      try {
        rc += this.inspect(o[i], d);
      } catch (e) {
        rc += '?' + '?' + '?\r\n';
      }
    }
    rc     += ']\r\n';
  } else {
    rc     += ('' + o).replace(/\n/g, ' ').replace(/ +/g,' ') + '\r\n';
  }
  return rc;
};

VT100.prototype.checkComposedKeys = function(event) {
  // Composed keys (at least on Linux) do not generate normal events.
  // Instead, they get entered into the text field. We normally catch
  // this on the next keyup event.
  var s              = this.input.value;
  if (s.length) {
    this.input.value = '';
    if (this.menu.style.visibility == 'hidden') {
      this.keysPressed(s);
    }
  }
};

VT100.prototype.fixEvent = function(event) {
  // Some browsers report AltGR as a combination of ALT and CTRL. As AltGr
  // is used as a second-level selector, clear the modifier bits before
  // handling the event.
  if (event.ctrlKey && event.altKey) {
    var fake                = [ ];
    fake.charCode           = event.charCode;
    fake.keyCode            = event.keyCode;
    fake.ctrlKey            = false;
    fake.shiftKey           = event.shiftKey;
    fake.altKey             = false;
    fake.metaKey            = event.metaKey;
    return fake;
  }

  // Some browsers fail to translate keys, if both shift and alt/meta is
  // pressed at the same time. We try to translate those cases, but that
  // only works for US keyboard layouts.
  var u                   = undefined;
  var s                   = undefined;
  if (event.shiftKey) {
    switch (this.lastNormalKeyDownEvent.keyCode) {
    case  39: /* ' -> " */ u = 39; s =  34; break;
    case  44: /* , -> < */ u = 44; s =  60; break;
    case  45: /* - -> _ */ u = 45; s =  95; break;
    case  46: /* . -> > */ u = 46; s =  62; break;
    case  47: /* / -> ? */ u = 47; s =  63; break;

    case  48: /* 0 -> ) */ u = 48; s =  41; break;
    case  49: /* 1 -> ! */ u = 49; s =  33; break;
    case  50: /* 2 -> @ */ u = 50; s =  64; break;
    case  51: /* 3 -> # */ u = 51; s =  35; break;
    case  52: /* 4 -> $ */ u = 52; s =  36; break;
    case  53: /* 5 -> % */ u = 53; s =  37; break;
    case  54: /* 6 -> ^ */ u = 54; s =  94; break;
    case  55: /* 7 -> & */ u = 55; s =  38; break;
    case  56: /* 8 -> * */ u = 56; s =  42; break;
    case  57: /* 9 -> ( */ u = 57; s =  40; break;
    case  59: /* ; -> : */ u = 59; s =  58; break;
    case  61: /* = -> + */ u = 61; s =  43; break;
    case  91: /* [ -> { */ u = 91; s = 123; break;
    case  92: /* \ -> | */ u = 92; s = 124; break;
    case  93: /* ] -> } */ u = 93; s = 125; break;
    case  96: /* ` -> ~ */ u = 96; s = 126; break;

    case 109: /* - -> _ */ u = 45; s =  95; break;
    case 111: /* / -> ? */ u = 47; s =  63; break;

    case 186: /* ; -> : */ u = 59; s =  58; break;
    case 187: /* = -> + */ u = 61; s =  43; break;
    case 188: /* , -> < */ u = 44; s =  60; break;
    case 189: /* - -> _ */ u = 45; s =  95; break;
    case 190: /* . -> > */ u = 46; s =  62; break;
    case 191: /* / -> ? */ u = 47; s =  63; break;
    case 192: /* ` -> ~ */ u = 96; s = 126; break;
    case 219: /* [ -> { */ u = 91; s = 123; break;
    case 220: /* \ -> | */ u = 92; s = 124; break;
    case 221: /* ] -> } */ u = 93; s = 125; break;
    case 222: /* ' -> " */ u = 39; s =  34; break;
    default:                                break;
    }
  } else {
    var c = this.lastNormalKeyDownEvent.keyCode;
    if (c >= 65 && c <= 90) {
      u = c;
      s = u | 32;
    }
  }
  if (s && (event.charCode == u || event.charCode == 0)) {
    var fake              = [ ];
    fake.charCode         = s;
    fake.keyCode          = event.keyCode;
    fake.ctrlKey          = event.ctrlKey;
    fake.shiftKey         = event.shiftKey;
    fake.altKey           = event.altKey;
    fake.metaKey          = event.metaKey;
    return fake;
  }
  return event;
};

VT100.prototype.keyDown = function(event) {
  // this.vt100('D: c=' + event.charCode + ', k=' + event.keyCode +
  //            (event.shiftKey || event.ctrlKey || event.altKey ||
  //             event.metaKey ? ', ' +
  //             (event.shiftKey ? 'S' : '') + (event.ctrlKey ? 'C' : '') +
  //             (event.altKey ? 'A' : '') + (event.metaKey ? 'M' : '') : '') +
  //            '\r\n');
  this.checkComposedKeys(event);
  this.lastKeyPressedEvent      = undefined;
  this.lastKeyDownEvent         = undefined;
  this.lastNormalKeyDownEvent   = event;

  // Swiss keyboard conflicts:
  // [ 59
  // ] 192
  // ' 219 (dead key)
  // { 220
  // ~ 221 (dead key)
  // } 223
  // French keyoard conflicts:
  // ~ 50 (dead key)
  // } 107
  var asciiKey                  =
    event.keyCode ==  32                         ||
    event.keyCode >=  48 && event.keyCode <=  57 ||
    event.keyCode >=  65 && event.keyCode <=  90;
  var alphNumKey                =
    asciiKey                                     ||
    event.keyCode >=  58 && event.keyCode <=  64 ||
    event.keyCode >=  96 && event.keyCode <= 105 ||
    event.keyCode == 107 ||
    event.keyCode >= 160 && event.keyCode <= 192 ||
    event.keyCode >= 219 && event.keyCode <= 223 ||
    event.keyCode == 226;
  var normalKey                 =
    alphNumKey                                   ||
    event.keyCode == 106                         ||
    event.keyCode >= 109 && event.keyCode <= 111 ||
    event.keyCode == 229                         ||
    event.keyCode == 252;
  try {
    if (navigator.appName == 'Konqueror') {
      normalKey                |= event.keyCode < 128;
    }
  } catch (e) {
  }

  if (this.disableAlt && normalKey) {
    return true;
  }

  // We normally prefer to look at keypress events, as they perform the
  // translation from keyCode to charCode. This is important, as the
  // translation is locale-dependent.
  // But for some keys, we must intercept them during the keydown event,
  // as they would otherwise get interpreted by the browser.
  // Even, when doing all of this, there are some keys that we can never
  // intercept. This applies to some of the menu navigation keys in IE.
  // In fact, we see them, but we cannot stop IE from seeing them, too.
  if ((event.charCode || event.keyCode) &&
      ((alphNumKey && (event.ctrlKey || event.altKey || event.metaKey) &&
        !event.shiftKey &&
        // Some browsers signal AltGR as both CTRL and ALT. Do not try to
        // interpret this sequence ourselves, as some keyboard layouts use
        // it for second-level layouts.
        !(event.ctrlKey && event.altKey)) ||
       this.catchModifiersEarly && normalKey && !alphNumKey &&
       (event.ctrlKey || event.altKey || event.metaKey) ||
       !normalKey)) {
    this.lastKeyDownEvent       = event;
    var fake                    = [ ];
    fake.ctrlKey                = event.ctrlKey;
    fake.shiftKey               = event.shiftKey;
    fake.altKey                 = event.altKey;
    fake.metaKey                = event.metaKey;
    if (asciiKey) {
      fake.charCode             = event.keyCode;
      fake.keyCode              = 0;
    } else {
      fake.charCode             = 0;
      fake.keyCode              = event.keyCode;
    }
    fake                        = this.fixEvent(fake);

    this.handleKey(fake);
    this.lastNormalKeyDownEvent = undefined;

    try {
      // For non-IE browsers
      event.stopPropagation();
      event.preventDefault();
    } catch (e) {
    }
    try {
      // For IE
      event.cancelBubble = true;
      event.returnValue  = false;
      event.keyCode      = 0;
    } catch (e) {
    }

    return false;
  }
  return true;
};

VT100.prototype.keyPressed = function(event) {
  // this.vt100('P: c=' + event.charCode + ', k=' + event.keyCode +
  //            (event.shiftKey || event.ctrlKey || event.altKey ||
  //             event.metaKey ? ', ' +
  //             (event.shiftKey ? 'S' : '') + (event.ctrlKey ? 'C' : '') +
  //             (event.altKey ? 'A' : '') + (event.metaKey ? 'M' : '') : '') +
  //            '\r\n');
  if (this.lastKeyDownEvent) {
    // If we already processed the key on keydown, do not process it
    // again here. Ideally, the browser should not even have generated a
    // keypress event in this case. But that does not appear to always work.
    this.lastKeyDownEvent     = undefined;
  } else {
    this.handleKey(event.altKey || event.metaKey
                   ? this.fixEvent(event) : event);
  }

  try {
    // For non-IE browsers
    event.preventDefault();
  } catch (e) {
  }

  try {
    // For IE
    event.cancelBubble = true;
    event.returnValue  = false;
    event.keyCode      = 0;
  } catch (e) {
  }

  this.lastNormalKeyDownEvent = undefined;
  this.lastKeyPressedEvent    = event;
  return false;
};

VT100.prototype.keyUp = function(event) {
  // this.vt100('U: c=' + event.charCode + ', k=' + event.keyCode +
  //            (event.shiftKey || event.ctrlKey || event.altKey ||
  //             event.metaKey ? ', ' +
  //             (event.shiftKey ? 'S' : '') + (event.ctrlKey ? 'C' : '') +
  //             (event.altKey ? 'A' : '') + (event.metaKey ? 'M' : '') : '') +
  //            '\r\n');
  if (this.lastKeyPressedEvent) {
    // The compose key on Linux occasionally confuses the browser and keeps
    // inserting bogus characters into the input field, even if just a regular
    // key has been pressed. Detect this case and drop the bogus characters.
    (event.target ||
     event.srcElement).value      = '';
  } else {
    // This is usually were we notice that a key has been composed and
    // thus failed to generate normal events.
    this.checkComposedKeys(event);

    // Some browsers don't report keypress events if ctrl or alt is pressed
    // for non-alphanumerical keys. Patch things up for now, but in the
    // future we will catch these keys earlier (in the keydown handler).
    if (this.lastNormalKeyDownEvent) {
      // this.vt100('ENABLING EARLY CATCHING OF MODIFIER KEYS\r\n');
      this.catchModifiersEarly    = true;
      var asciiKey                =
        event.keyCode ==  32                         ||
        // Conflicts with dead key ~ (code 50) on French keyboards
        //event.keyCode >=  48 && event.keyCode <=  57 ||
        event.keyCode >=  48 && event.keyCode <=  49 ||
        event.keyCode >=  51 && event.keyCode <=  57 ||
        event.keyCode >=  65 && event.keyCode <=  90;
      var alphNumKey              =
        asciiKey                                     ||
        event.keyCode ==  50                         ||
        event.keyCode >=  96 && event.keyCode <= 105;
      // Not used ???
      var normalKey               =
        alphNumKey                                   ||
        event.keyCode ==  59 || event.keyCode ==  61 ||
        event.keyCode == 106 || event.keyCode == 107 ||
        event.keyCode >= 109 && event.keyCode <= 111 ||
        event.keyCode >= 186 && event.keyCode <= 192 ||
        event.keyCode >= 219 && event.keyCode <= 223 ||
        event.keyCode == 252;
      var fake                    = [ ];
      fake.ctrlKey                = event.ctrlKey;
      fake.shiftKey               = event.shiftKey;
      fake.altKey                 = event.altKey;
      fake.metaKey                = event.metaKey;
      if (asciiKey) {
        fake.charCode             = event.keyCode;
        fake.keyCode              = 0;
      } else {
        fake.charCode             = 0;
        fake.keyCode              = event.keyCode;
      }
      if (event.ctrlKey || event.altKey || event.metaKey) {
        fake                      = this.fixEvent(fake);
      }
      this.lastNormalKeyDownEvent = undefined;
      this.handleKey(fake);
    }
  }

  try {
    // For IE
    event.cancelBubble            = true;
    event.returnValue             = false;
    event.keyCode                 = 0;
  } catch (e) {
  }

  this.lastKeyDownEvent           = undefined;
  this.lastKeyPressedEvent        = undefined;
  return false;
};

VT100.prototype.animateCursor = function(inactive) {
  if (!this.cursorInterval) {
    this.cursorInterval       = setInterval(
      function(vt100) {
        return function() {
          vt100.animateCursor();

          // Use this opportunity to check whether the user entered a composed
          // key, or whether somebody pasted text into the textfield.
          vt100.checkComposedKeys();
        }
      }(this), 500);
  }
  if (inactive != undefined || this.cursor.className != 'inactive') {
    if (inactive) {
      this.cursor.className   = 'inactive';
    } else {
      if (this.blinkingCursor) {
        this.cursor.className = this.cursor.className == 'bright'
                                ? 'dim' : 'bright';
      } else {
        this.cursor.className = 'bright';
      }
    }
  }
};

VT100.prototype.blurCursor = function() {
  this.animateCursor(true);
};

VT100.prototype.focusCursor = function() {
  this.animateCursor(false);
};

VT100.prototype.flashScreen = function() {
  this.isInverted       = !this.isInverted;
  this.refreshInvertedState();
  this.isInverted       = !this.isInverted;
  setTimeout(function(vt100) {
               return function() {
                 vt100.refreshInvertedState();
               };
             }(this), 100);
};

VT100.prototype.beep = function() {
  if (this.visualBell) {
    this.flashScreen();
  } else {
    try {
      this.beeper.Play();
    } catch (e) {
      try {
        this.beeper.src = 'beep.wav';
      } catch (e) {
      }
    }
  }
};

VT100.prototype.bs = function() {
  if (this.cursorX > 0) {
    this.gotoXY(this.cursorX - 1, this.cursorY);
    this.needWrap = false;
  }
};

VT100.prototype.ht = function(count) {
  if (count == undefined) {
    count        = 1;
  }
  var cx         = this.cursorX;
  while (count-- > 0) {
    while (cx++ < this.terminalWidth) {
      var tabState = this.userTabStop[cx];
      if (tabState == false) {
        // Explicitly cleared tab stop
        continue;
      } else if (tabState) {
        // Explicitly set tab stop
        break;
      } else {
        // Default tab stop at each eighth column
        if (cx % 8 == 0) {
          break;
        }
      }
    }
  }
  if (cx > this.terminalWidth - 1) {
    cx           = this.terminalWidth - 1;
  }
  if (cx != this.cursorX) {
    this.gotoXY(cx, this.cursorY);
  }
};

VT100.prototype.rt = function(count) {
  if (count == undefined) {
    count          = 1 ;
  }
  var cx           = this.cursorX;
  while (count-- > 0) {
    while (cx-- > 0) {
      var tabState = this.userTabStop[cx];
      if (tabState == false) {
        // Explicitly cleared tab stop
        continue;
      } else if (tabState) {
        // Explicitly set tab stop
        break;
      } else {
        // Default tab stop at each eighth column
        if (cx % 8 == 0) {
          break;
        }
      }
    }
  }
  if (cx < 0) {
    cx             = 0;
  }
  if (cx != this.cursorX) {
    this.gotoXY(cx, this.cursorY);
  }
};

VT100.prototype.cr = function() {
  this.gotoXY(0, this.cursorY);
  this.needWrap = false;
};

VT100.prototype.lf = function(count) {
  if (count == undefined) {
    count    = 1;
  } else {
    if (count > this.terminalHeight) {
      count  = this.terminalHeight;
    }
    if (count < 1) {
      count  = 1;
    }
  }
  while (count-- > 0) {
    if (this.cursorY == this.bottom - 1) {
      this.scrollRegion(0, this.top + 1,
                        this.terminalWidth, this.bottom - this.top - 1,
                        0, -1, this.color, this.style);
    } else if (this.cursorY < this.terminalHeight - 1) {
      this.gotoXY(this.cursorX, this.cursorY + 1);
    }
  }
};

VT100.prototype.ri = function(count) {
  if (count == undefined) {
    count   = 1;
  } else {
    if (count > this.terminalHeight) {
      count = this.terminalHeight;
    }
    if (count < 1) {
      count = 1;
    }
  }
  while (count-- > 0) {
    if (this.cursorY == this.top) {
      this.scrollRegion(0, this.top,
                        this.terminalWidth, this.bottom - this.top - 1,
                        0, 1, this.color, this.style);
    } else if (this.cursorY > 0) {
      this.gotoXY(this.cursorX, this.cursorY - 1);
    }
  }
  this.needWrap = false;
};

VT100.prototype.respondID = function() {
  this.respondString += '\u001B[?6c';
};

VT100.prototype.respondSecondaryDA = function() {
  this.respondString += '\u001B[>0;0;0c';
};


VT100.prototype.updateStyle = function() {
  var fg          = '';
  var bg          = '';
  this.style      = '';

  if (this.attr & 0x0200 /* ATTR_UNDERLINE */) {
    this.style   += 'text-decoration: underline;';
  }
  if (this.attr & 0x1000 /* ATTR_BLINK */) {
    this.style   += 'text-decoration: blink;';
  }

  // Forground color
  if (this.attrFg) {
    // 256 color mode
    fg            = this.attrFg
  } else if (this.attr & 0x2000 /* ATTR_DEF_FG */) {
    fg            = 'Def';
  } else {
    fg            = this.attr & 0xF;
    if (this.attr & 0x0800 /* ATTR_BRIGHT */) {
      fg         |= 8;
      this.style += 'font-weight: bold;';
    }
  }

  // Background color
  if (this.attrBg) {
    // 256 color mode
    bg            = this.attrBg
  } else if (this.attr & 0x4000 /* ATTR_DEF_BG */) {
    bg            = 'Def';
  } else {
    bg            = (this.attr >> 4) & 0xF;
  }

  // Reverse colors
  if (this.attr & 0x0100 /* ATTR_REVERSE */) {
    var tmpFg     = fg;
    var tmpBg     = bg;
    fg            = (tmpBg == 'Def') ? 'DefR' : tmpBg;
    bg            = (tmpFg == 'Def') ? 'DefR' : tmpFg;
  }

  this.color      = 'ansi' + fg + ' bgAnsi' + bg;
};

VT100.prototype.setAttrColors = function(attr) {
  if (attr != this.attr) {
    this.attr = attr;
    this.updateStyle();
  }
};

VT100.prototype.saveCursor = function() {
  this.savedX[this.currentScreen]      = this.cursorX;
  this.savedY[this.currentScreen]      = this.cursorY;
  this.savedAttr[this.currentScreen]   = this.attr;
  this.savedAttrFg[this.currentScreen] = this.attrFg;
  this.savedAttrBg[this.currentScreen] = this.attrBg;
  this.savedUseGMap                    = this.useGMap;
  for (var i = 0; i < 4; i++) {
    this.savedGMap[i]                  = this.GMap[i];
  }
  this.savedValid[this.currentScreen]  = true;
};

VT100.prototype.restoreCursor = function() {
  if (!this.savedValid[this.currentScreen]) {
    return;
  }
  this.attr      = this.savedAttr[this.currentScreen];
  this.attrFg    = this.savedAttrFg[this.currentScreen];
  this.attrBg    = this.savedAttrBg[this.currentScreen];
  this.updateStyle();
  this.useGMap   = this.savedUseGMap;
  for (var i = 0; i < 4; i++) {
    this.GMap[i] = this.savedGMap[i];
  }
  this.translate = this.GMap[this.useGMap];
  this.needWrap  = false;
  this.gotoXY(this.savedX[this.currentScreen],
              this.savedY[this.currentScreen]);
};

VT100.prototype.getTransformName = function() {
  var styles = [ 'transform', 'WebkitTransform', 'MozTransform', 'filter' ];
  for (var i = 0; i < styles.length; ++i) {
    if (typeof this.console[0].style[styles[i]] != 'undefined') {
      return styles[i];
    }
  }
  return undefined;
};

VT100.prototype.getTransformStyle = function(transform, scale) {
  return scale && scale != 1.0
    ? transform == 'filter'
      ? 'progid:DXImageTransform.Microsoft.Matrix(' +
                                 'M11=' + (1.0/scale) + ',M12=0,M21=0,M22=1,' +
                                 "sizingMethod='auto expand')"
      : 'translateX(-50%) ' +
        'scaleX(' + (1.0/scale) + ') ' +
        'translateX(50%)'
    : '';
};

VT100.prototype.set80_132Mode = function(state) {
  var transform                  = this.getTransformName();
  if (transform) {
    if ((this.console[this.currentScreen].style[transform] != '') == state) {
      return;
    }
    var style                    = state ?
                                   this.getTransformStyle(transform, 1.65):'';
    this.console[this.currentScreen].style[transform] = style;
    this.cursor.style[transform] = style;
    this.space.style[transform]  = style;
    this.scale                   = state ? 1.65 : 1.0;
    if (transform == 'filter') {
      this.console[this.currentScreen].style.width = state ? '165%' : '';
    }
    this.resizer();
  }
};

VT100.prototype.setMode = function(state) {
  for (var i = 0; i <= this.npar; i++) {
    if (this.isQuestionMark) {
      switch (this.par[i]) {
      case  1: this.cursorKeyMode      = state;                      break;
      case  3: this.set80_132Mode(state);                            break;
      case  5: this.isInverted = state; this.refreshInvertedState(); break;
      case  6: this.offsetMode         = state;                      break;
      case  7: this.autoWrapMode       = state;                      break;
      case 1000:
      case  9: this.mouseReporting     = state;                      break;
      case 25: this.cursorNeedsShowing = state;
               if (state) { this.showCursor(); }
               else       { this.hideCursor(); }                     break;
      case 1047:
      case 1049:
      case 47: this.enableAlternateScreen(state);                    break;
      default:                                                       break;
      }
    } else {
      switch (this.par[i]) {
      case  3: this.dispCtrl           = state;                      break;
      case  4: this.insertMode         = state;                      break;
      case  20:this.crLfMode           = state;                      break;
      default:                                                       break;
      }
    }
  }
};

VT100.prototype.statusReport = function() {
  // Ready and operational.
  this.respondString += '\u001B[0n';
};

VT100.prototype.cursorReport = function() {
  this.respondString += '\u001B[' +
                        (this.cursorY + (this.offsetMode ? this.top + 1 : 1)) +
                        ';' +
                        (this.cursorX + 1) +
                        'R';
};

VT100.prototype.setCursorAttr = function(setAttr, xorAttr) {
  // Changing of cursor color is not implemented.
};

VT100.prototype.openPrinterWindow = function() {
  var rc            = true;
  try {
    if (!this.printWin || this.printWin.closed) {
      this.printWin = window.open('', 'print-output',
        'width=800,height=600,directories=no,location=no,menubar=yes,' +
        'status=no,toolbar=no,titlebar=yes,scrollbars=yes,resizable=yes');
      this.printWin.document.body.innerHTML =
        '<link rel="stylesheet" href="' +
          document.location.protocol + '//' + document.location.host +
          document.location.pathname.replace(/[^/]*$/, '') +
          'print-styles.css" type="text/css">\n' +
        '<div id="options"><input id="autoprint" type="checkbox"' +
          (this.autoprint ? ' checked' : '') + '>' +
          'Automatically, print page(s) when job is ready' +
        '</input></div>\n' +
        '<div id="spacer"><input type="checkbox">&nbsp;</input></div>' +
        '<pre id="print"></pre>\n';
      var autoprint = this.printWin.document.getElementById('autoprint');
      this.addListener(autoprint, 'click',
                       (function(vt100, autoprint) {
                         return function() {
                           vt100.autoprint = autoprint.checked;
                           vt100.storeUserSettings();
                           return false;
                         };
                       })(this, autoprint));
      this.printWin.document.title = 'ShellInABox Printer Output';
    }
  } catch (e) {
    // Maybe, a popup blocker prevented us from working. Better catch the
    // exception, so that we won't break the entire terminal session. The
    // user probably needs to disable the blocker first before retrying the
    // operation.
    rc              = false;
  }
  rc               &= this.printWin && !this.printWin.closed &&
                      (this.printWin.innerWidth ||
                       this.printWin.document.documentElement.clientWidth ||
                       this.printWin.document.body.clientWidth) > 1;

  if (!rc && this.printing == 100) {
    // Different popup blockers work differently. We try to detect a couple
    // of common methods. And then we retry again a brief amount later, as
    // false positives are otherwise possible. If we are sure that there is
    // a popup blocker in effect, we alert the user to it. This is helpful
    // as some popup blockers have minimal or no UI, and the user might not
    // notice that they are missing the popup. In any case, we only show at
    // most one message per print job.
    this.printing   = true;
    setTimeout((function(win) {
                  return function() {
                    if (!win || win.closed ||
                        (win.innerWidth ||
                         win.document.documentElement.clientWidth ||
                         win.document.body.clientWidth) <= 1) {
                      alert('Attempted to print, but a popup blocker ' +
                            'prevented the printer window from opening');
                    }
                  };
                })(this.printWin), 2000);
  }
  return rc;
};

VT100.prototype.sendToPrinter = function(s) {
  this.openPrinterWindow();
  try {
    var doc   = this.printWin.document;
    var print = doc.getElementById('print');
    if (print.lastChild && print.lastChild.nodeName == '#text') {
      print.lastChild.textContent += this.replaceChar(s, ' ', '\u00A0');
    } else {
      print.appendChild(doc.createTextNode(this.replaceChar(s, ' ','\u00A0')));
    }
  } catch (e) {
    // There probably was a more aggressive popup blocker that prevented us
    // from accessing the printer windows.
  }
};

VT100.prototype.sendControlToPrinter = function(ch) {
  // We get called whenever doControl() is active. But for the printer, we
  // only implement a basic line printer that doesn't understand most of
  // the escape sequences of the VT100 terminal. In fact, the only escape
  // sequence that we really need to recognize is '^[[5i' for turning the
  // printer off.
  try {
    switch (ch) {
    case  9:
      // HT
      this.openPrinterWindow();
      var doc                 = this.printWin.document;
      var print               = doc.getElementById('print');
      var chars               = print.lastChild &&
                                print.lastChild.nodeName == '#text' ?
                                print.lastChild.textContent.length : 0;
      this.sendToPrinter(this.spaces(8 - (chars % 8)));
      break;
    case 10:
      // CR
      break;
    case 12:
      // FF
      this.openPrinterWindow();
      var pageBreak           = this.printWin.document.createElement('div');
      pageBreak.className     = 'pagebreak';
      pageBreak.innerHTML     = '<hr />';
      this.printWin.document.getElementById('print').appendChild(pageBreak);
      break;
    case 13:
      // LF
      this.openPrinterWindow();
      var lineBreak           = this.printWin.document.createElement('br');
      this.printWin.document.getElementById('print').appendChild(lineBreak);
      break;
    case 27:
      // ESC
      this.isEsc              = 1 /* ESesc */;
      break;
    default:
      switch (this.isEsc) {
      case 1 /* ESesc */:
        this.isEsc            = 0 /* ESnormal */;
        switch (ch) {
        case 0x5B /*[*/:
          this.isEsc          = 2 /* ESsquare */;
          break;
        default:
          break;
        }
        break;
      case 2 /* ESsquare */:
        this.npar             = 0;
        this.par              = [ 0, 0, 0, 0, 0, 0, 0, 0,
                                  0, 0, 0, 0, 0, 0, 0, 0 ];
        this.isEsc            = 3 /* ESgetpars */;
        this.isQuestionMark   = ch == 0x3F /*?*/;
        if (this.isQuestionMark) {
          break;
        }
        // Fall through
      case 3 /* ESgetpars */:
        if (ch == 0x3B /*;*/) {
          this.npar++;
          break;
        } else if (ch >= 0x30 /*0*/ && ch <= 0x39 /*9*/) {
          var par             = this.par[this.npar];
          if (par == undefined) {
            par               = 0;
          }
          this.par[this.npar] = 10*par + (ch & 0xF);
          break;
        } else {
          this.isEsc          = 4 /* ESgotpars */;
        }
        // Fall through
      case 4 /* ESgotpars */:
        this.isEsc            = 0 /* ESnormal */;
        if (this.isQuestionMark) {
          break;
        }
        switch (ch) {
        case 0x69 /*i*/:
          this.csii(this.par[0]);
          break;
        default:
          break;
        }
        break;
      default:
        this.isEsc            = 0 /* ESnormal */;
        break;
      }
      break;
    }
  } catch (e) {
    // There probably was a more aggressive popup blocker that prevented us
    // from accessing the printer windows.
  }
};

VT100.prototype.csiAt = function(number) {
  // Insert spaces
  if (number == 0) {
    number      = 1;
  }
  if (number > this.terminalWidth - this.cursorX) {
    number      = this.terminalWidth - this.cursorX;
  }
  this.scrollRegion(this.cursorX, this.cursorY,
                    this.terminalWidth - this.cursorX - number, 1,
                    number, 0, this.color, this.style);
  this.needWrap = false;
};

VT100.prototype.csii = function(number) {
  // Printer control
  switch (number) {
  case 0: // Print Screen
    window.print();
    break;
  case 4: // Stop printing
    try {
      if (this.printing && this.printWin && !this.printWin.closed) {
        var print = this.printWin.document.getElementById('print');
        while (print.lastChild &&
               print.lastChild.tagName == 'DIV' &&
               print.lastChild.className == 'pagebreak') {
          // Remove trailing blank pages
          print.removeChild(print.lastChild);
        }
        if (this.autoprint) {
          this.printWin.print();
        }
      }
    } catch (e) {
    }
    this.printing = false;
    break;
  case 5: // Start printing
    if (!this.printing && this.printWin && !this.printWin.closed) {
      this.printWin.document.getElementById('print').innerHTML = '';
    }
    this.printing = 100;
    break;
  default:
    break;
  }
};

VT100.prototype.csiJ = function(number) {
  switch (number) {
  case 0: // Erase from cursor to end of display
    this.clearRegion(this.cursorX, this.cursorY,
                     this.terminalWidth - this.cursorX, 1,
                     this.color, this.style);
    if (this.cursorY < this.terminalHeight-2) {
      this.clearRegion(0, this.cursorY+1,
                       this.terminalWidth, this.terminalHeight-this.cursorY-1,
                       this.color, this.style);
    }
    break;
  case 1: // Erase from start to cursor
    if (this.cursorY > 0) {
      this.clearRegion(0, 0,
                       this.terminalWidth, this.cursorY,
                       this.color, this.style);
    }
    this.clearRegion(0, this.cursorY, this.cursorX + 1, 1,
                     this.color, this.style);
    break;
  case 2: // Erase whole display
    this.clearRegion(0, 0, this.terminalWidth, this.terminalHeight,
                     this.color, this.style);
    break;
  default:
    return;
  }
  this.needWrap = false;
};

VT100.prototype.csiK = function(number) {
  switch (number) {
  case 0: // Erase from cursor to end of line
    this.clearRegion(this.cursorX, this.cursorY,
                     this.terminalWidth - this.cursorX, 1,
                     this.color, this.style);
    break;
  case 1: // Erase from start of line to cursor
    this.clearRegion(0, this.cursorY, this.cursorX + 1, 1,
                     this.color, this.style);
    break;
  case 2: // Erase whole line
    this.clearRegion(0, this.cursorY, this.terminalWidth, 1,
                     this.color, this.style);
    break;
  default:
    return;
  }
  this.needWrap = false;
};

VT100.prototype.csiL = function(number) {
  // Open line by inserting blank line(s)
  if (this.cursorY >= this.bottom) {
    return;
  }
  if (number == 0) {
    number = 1;
  }
  if (number > this.bottom - this.cursorY) {
    number = this.bottom - this.cursorY;
  }
  this.scrollRegion(0, this.cursorY,
                    this.terminalWidth, this.bottom - this.cursorY - number,
                    0, number, this.color, this.style);
  this.needWrap = false;
};

VT100.prototype.csiM = function(number) {
  // Delete line(s), scrolling up the bottom of the screen.
  if (this.cursorY >= this.bottom) {
    return;
  }
  if (number == 0) {
    number = 1;
  }
  if (number > this.bottom - this.cursorY) {
    number = this.bottom - this.cursorY;
  }
  this.scrollRegion(0, this.cursorY + number,
                    this.terminalWidth, this.bottom - this.cursorY - number,
                    0, -number, this.color, this.style);
  this.needWrap = false;
};

VT100.prototype.csim = function() {
  for (var i = 0; i <= this.npar; i++) {
    switch (this.par[i]) {
    case 0:
      this.attr         = 0x60F0 /* ATTR_DEFAULT */;
      this.attrFg       = false;
      this.attrBg       = false;
      break;
    case 1:  this.attr  = (this.attr & ~0x0400 /* ATTR_DIM */)|0x0800 /* ATTR_BRIGHT */;         break;
    case 2:  this.attr  = (this.attr & ~0x0800 /* ATTR_BRIGHT */)|0x0400 /* ATTR_DIM */;         break;
    case 4:  this.attr |= 0x0200 /* ATTR_UNDERLINE */;                              break;
    case 5:  this.attr |= 0x1000 /* ATTR_BLINK */;                                  break;
    case 7:  this.attr |= 0x0100 /* ATTR_REVERSE */;                                break;
    case 10:
      this.translate    = this.GMap[this.useGMap];
      this.dispCtrl     = false;
      this.toggleMeta   = false;
      break;
    case 11:
      this.translate    = this.CodePage437Map;
      this.dispCtrl     = true;
      this.toggleMeta   = false;
      break;
    case 12:
      this.translate    = this.CodePage437Map;
      this.dispCtrl     = true;
      this.toggleMeta   = true;
      break;
    case 21:
    case 22: this.attr &= ~(0x0800 /* ATTR_BRIGHT */|0x0400 /* ATTR_DIM */);                     break;
    case 24: this.attr &= ~ 0x0200 /* ATTR_UNDERLINE */;                            break;
    case 25: this.attr &= ~ 0x1000 /* ATTR_BLINK */;                                break;
    case 27: this.attr &= ~ 0x0100 /* ATTR_REVERSE */;                              break;
    case 38:
      if (this.npar >= (i+2) && this.par[i+1] == 5) {
        // Foreground color for extended color mode (256 colors). Escape code is formatted
        // as: ESC 38; 5; 0-255. Last parameter is color code in range [0-255]. This is
        // not VT100 standard.
        this.attrFg     = (this.par[i+2] >= 0 && this.par[i+2] <= 255) ? this.par[i+2] : false;
        i              += 2;
      } else {
        // Default VT100 behaviour.
        this.attr       = (this.attr & ~(0x0400 /* ATTR_DIM */|0x0800 /* ATTR_BRIGHT */|0x0F))|0x0200 /* ATTR_UNDERLINE */ | 0x2000 /* ATTR_DEF_FG */;
      }
      break;
    case 39:
      this.attr         = (this.attr & ~(0x0400 /* ATTR_DIM */|0x0800 /* ATTR_BRIGHT */|0x0200 /* ATTR_UNDERLINE */|0x0F)) | 0x2000 /* ATTR_DEF_FG */;
      this.attrFg       = false;
      break;
    case 48:
      if (this.npar >= (i+2) && this.par[i+1] == 5) {
        // Background color for extended color mode (256 colors). Escape code is formatted
        // as: ESC 48; 5; 0-255. Last parameter is color code in range [0-255]. This is
        // not VT100 standard.
        this.attrBg     = (this.par[i+2] >= 0 && this.par[i+2] <= 255) ? this.par[i+2] : false;
        i              += 2;
      }
      break;
    case 49:
      this.attr        |= (0xF0|0x4000 /* ATTR_DEF_BG */);
      this.attrBg       = false;
      break;
    default:
      if (this.par[i] >= 30 && this.par[i] <= 37) {
          var fg        = this.par[i] - 30;
          this.attr     = ((this.attr & ~0x0F) | fg) & ~(0x2000 /* ATTR_DEF_FG */);
          this.attrFg   = false;
      } else if (this.par[i] >= 40 && this.par[i] <= 47) {
          var bg        = this.par[i] - 40;
          this.attr     = ((this.attr & ~0xF0) | (bg << 4)) & ~(0x4000 /* ATTR_DEF_BG */);
          this.attrBg   = false;
      }
      break;
    }
  }
  this.updateStyle();
};

VT100.prototype.csiP = function(number) {
  // Delete character(s) following cursor
  if (number == 0) {
    number = 1;
  }
  if (number > this.terminalWidth - this.cursorX) {
    number = this.terminalWidth - this.cursorX;
  }
  this.scrollRegion(this.cursorX + number, this.cursorY,
                    this.terminalWidth - this.cursorX - number, 1,
                    -number, 0, this.color, this.style);
  this.needWrap = false;
};

VT100.prototype.csiX = function(number) {
  // Clear characters following cursor
  if (number == 0) {
    number++;
  }
  if (number > this.terminalWidth - this.cursorX) {
    number = this.terminalWidth - this.cursorX;
  }
  this.clearRegion(this.cursorX, this.cursorY, number, 1,
                   this.color, this.style);
  this.needWrap = false;
};

VT100.prototype.settermCommand = function() {
  // Setterm commands are not implemented
};

VT100.prototype.doControl = function(ch) {
  if (this.printing) {
    this.sendControlToPrinter(ch);
    return '';
  }
  var lineBuf                = '';
  switch (ch) {
  case 0x00: /* ignored */                                              break;
  case 0x08: this.bs();                                                 break;
  case 0x09: this.ht();                                                 break;
  case 0x0A:
  case 0x0B:
  case 0x0C:
  case 0x84: this.lf(); if (!this.crLfMode)                             break;
  case 0x0D: this.cr();                                                 break;
  case 0x85: this.cr(); this.lf();                                      break;
  case 0x0E: this.useGMap     = 1;
             this.translate   = this.GMap[1];
             this.dispCtrl    = true;                                   break;
  case 0x0F: this.useGMap     = 0;
             this.translate   = this.GMap[0];
             this.dispCtrl    = false;                                  break;
  case 0x18:
  case 0x1A: this.isEsc       = 0 /* ESnormal */;                               break;
  case 0x1B: this.isEsc       = 1 /* ESesc */;                                  break;
  case 0x7F: /* ignored */                                              break;
  case 0x88: this.userTabStop[this.cursorX] = true;                     break;
  case 0x8D: this.ri();                                                 break;
  case 0x8E: this.isEsc       = 18 /* ESss2 */;                                  break;
  case 0x8F: this.isEsc       = 19 /* ESss3 */;                                  break;
  case 0x9A: this.respondID();                                          break;
  case 0x9B: this.isEsc       = 2 /* ESsquare */;                               break;
  case 0x07: if (this.isEsc != 17 /* EStitle */) {
               this.beep();                                             break;
             }
             /* fall thru */
  default:   switch (this.isEsc) {
    case 1 /* ESesc */:
      this.isEsc              = 0 /* ESnormal */;
      switch (ch) {
/*%*/ case 0x25: this.isEsc   = 13 /* ESpercent */;                              break;
/*(*/ case 0x28: this.isEsc   = 8 /* ESsetG0 */;                                break;
/*-*/ case 0x2D:
/*)*/ case 0x29: this.isEsc   = 9 /* ESsetG1 */;                                break;
/*.*/ case 0x2E:
/***/ case 0x2A: this.isEsc   = 10 /* ESsetG2 */;                                break;
/*/*/ case 0x2F:
/*+*/ case 0x2B: this.isEsc   = 11 /* ESsetG3 */;                                break;
/*#*/ case 0x23: this.isEsc   = 7 /* EShash */;                                 break;
/*7*/ case 0x37: this.saveCursor();                                     break;
/*8*/ case 0x38: this.restoreCursor();                                  break;
/*>*/ case 0x3E: this.applKeyMode = false;                              break;
/*=*/ case 0x3D: this.applKeyMode = true;                               break;
/*D*/ case 0x44: this.lf();                                             break;
/*E*/ case 0x45: this.cr(); this.lf();                                  break;
/*M*/ case 0x4D: this.ri();                                             break;
/*N*/ case 0x4E: this.isEsc   = 18 /* ESss2 */;                                  break;
/*O*/ case 0x4F: this.isEsc   = 19 /* ESss3 */;                                  break;
/*H*/ case 0x48: this.userTabStop[this.cursorX] = true;                 break;
/*Z*/ case 0x5A: this.respondID();                                      break;
/*[*/ case 0x5B: this.isEsc   = 2 /* ESsquare */;                               break;
/*]*/ case 0x5D: this.isEsc   = 15 /* ESnonstd */;                               break;
/*c*/ case 0x63: this.reset();                                          break;
/*g*/ case 0x67: this.flashScreen();                                    break;
      default:                                                          break;
      }
      break;
    case 15 /* ESnonstd */:
      switch (ch) {
/*0*/ case 0x30:
/*1*/ case 0x31:
/*2*/ case 0x32: this.isEsc   = 17 /* EStitle */; this.titleString = '';         break;
/*6*/ case 0x36: this.isEsc   = 20 /* ESVTEtitle */;                             break;
/*7*/ case 0x37: this.isEsc   = 20 /* ESVTEtitle */;                             break;
/*P*/ case 0x50: this.npar    = 0; this.par = [ 0, 0, 0, 0, 0, 0, 0 ];
                 this.isEsc   = 16 /* ESpalette */;                              break;
/*R*/ case 0x52: // Palette support is not implemented
                 this.isEsc   = 0 /* ESnormal */;                               break;
      default:   this.isEsc   = 0 /* ESnormal */;                               break;
      }
      break;
    case 16 /* ESpalette */:
      if ((ch >= 0x30 /*0*/ && ch <= 0x39 /*9*/) ||
          (ch >= 0x41 /*A*/ && ch <= 0x46 /*F*/) ||
          (ch >= 0x61 /*a*/ && ch <= 0x66 /*f*/)) {
        this.par[this.npar++] = ch > 0x39  /*9*/ ? (ch & 0xDF) - 55
                                                : (ch & 0xF);
        if (this.npar == 7) {
          // Palette support is not implemented
          this.isEsc          = 0 /* ESnormal */;
        }
      } else {
        this.isEsc            = 0 /* ESnormal */;
      }
      break;
    case 2 /* ESsquare */:
      this.npar               = 0;
      this.par                = [ 0, 0, 0, 0, 0, 0, 0, 0,
                                  0, 0, 0, 0, 0, 0, 0, 0 ];
      this.isEsc              = 3 /* ESgetpars */;
/*[*/ if (ch == 0x5B) { // Function key
        this.isEsc            = 6 /* ESfunckey */;
        break;
      } else {
/*?*/   this.isQuestionMark   = ch == 0x3F;
        if (this.isQuestionMark) {
          break;
        }
      }
      // Fall through
    case 5 /* ESdeviceattr */:
    case 3 /* ESgetpars */:
/*;*/ if (ch == 0x3B) {
        this.npar++;
        break;
      } else if (ch >= 0x30 /*0*/ && ch <= 0x39 /*9*/) {
        var par               = this.par[this.npar];
        if (par == undefined) {
          par                 = 0;
        }
        this.par[this.npar]   = 10*par + (ch & 0xF);
        break;
      } else if (this.isEsc == 5 /* ESdeviceattr */) {
        switch (ch) {
/*c*/   case 0x63: if (this.par[0] == 0) this.respondSecondaryDA();     break;
/*m*/   case 0x6D: /* (re)set key modifier resource values */           break;
/*n*/   case 0x6E: /* disable key modifier resource values */           break;
/*p*/   case 0x70: /* set pointer mode resource value */                break;
        default:                                                        break;
        }
        this.isEsc            = 0 /* ESnormal */;
        break;
      } else {
        this.isEsc            = 4 /* ESgotpars */;
      }
      // Fall through
    case 4 /* ESgotpars */:
      this.isEsc              = 0 /* ESnormal */;
      if (this.isQuestionMark) {
        switch (ch) {
/*h*/   case 0x68: this.setMode(true);                                  break;
/*l*/   case 0x6C: this.setMode(false);                                 break;
/*c*/   case 0x63: this.setCursorAttr(this.par[2], this.par[1]);        break;
        default:                                                        break;
        }
        this.isQuestionMark   = false;
        break;
      }
      switch (ch) {
/*!*/ case 0x21: this.isEsc   = 12 /* ESbang */;                                 break;
/*>*/ case 0x3E: if (!this.npar) this.isEsc  = 5 /* ESdeviceattr */;            break;
/*G*/ case 0x47:
/*`*/ case 0x60: this.gotoXY(this.par[0] - 1, this.cursorY);            break;
/*A*/ case 0x41: this.gotoXY(this.cursorX,
                             this.cursorY - (this.par[0] ? this.par[0] : 1));
                                                                        break;
/*B*/ case 0x42:
/*e*/ case 0x65: this.gotoXY(this.cursorX,
                             this.cursorY + (this.par[0] ? this.par[0] : 1));
                                                                        break;
/*C*/ case 0x43:
/*a*/ case 0x61: this.gotoXY(this.cursorX + (this.par[0] ? this.par[0] : 1),
                             this.cursorY);                             break;
/*D*/ case 0x44: this.gotoXY(this.cursorX - (this.par[0] ? this.par[0] : 1),
                             this.cursorY);                             break;
/*E*/ case 0x45: this.gotoXY(0, this.cursorY + (this.par[0] ? this.par[0] :1));
                                                                        break;
/*F*/ case 0x46: this.gotoXY(0, this.cursorY - (this.par[0] ? this.par[0] :1));
                                                                        break;
/*d*/ case 0x64: this.gotoXaY(this.cursorX, this.par[0] - 1);           break;
/*H*/ case 0x48:
/*f*/ case 0x66: this.gotoXaY(this.par[1] - 1, this.par[0] - 1);        break;
/*I*/ case 0x49: this.ht(this.par[0] ? this.par[0] : 1);                break;
/*at*/case 0x40: this.csiAt(this.par[0]);                               break;
/*i*/ case 0x69: this.csii(this.par[0]);                                break;
/*J*/ case 0x4A: this.csiJ(this.par[0]);                                break;
/*K*/ case 0x4B: this.csiK(this.par[0]);                                break;
/*L*/ case 0x4C: this.csiL(this.par[0]);                                break;
/*M*/ case 0x4D: this.csiM(this.par[0]);                                break;
/*m*/ case 0x6D: this.csim();                                           break;
/*P*/ case 0x50: this.csiP(this.par[0]);                                break;
/*X*/ case 0x58: this.csiX(this.par[0]);                                break;
/*S*/ case 0x53: this.lf(this.par[0] ? this.par[0] : 1);                break;
/*T*/ case 0x54: this.ri(this.par[0] ? this.par[0] : 1);                break;
/*c*/ case 0x63: if (!this.par[0]) this.respondID();                    break;
/*g*/ case 0x67: if (this.par[0] == 0) {
                   this.userTabStop[this.cursorX] = false;
                 } else if (this.par[0] == 2 || this.par[0] == 3) {
                   this.userTabStop               = [ ];
                   for (var i = 0; i < this.terminalWidth; i++) {
                     this.userTabStop[i]          = false;
                   }
                 }
                 break;
/*h*/ case 0x68: this.setMode(true);                                    break;
/*l*/ case 0x6C: this.setMode(false);                                   break;
/*n*/ case 0x6E: switch (this.par[0]) {
                 case 5: this.statusReport();                           break;
                 case 6: this.cursorReport();                           break;
                 default:                                               break;
                 }
                 break;
/*q*/ case 0x71: // LED control not implemented
                                                                        break;
/*r*/ case 0x72: var t        = this.par[0] ? this.par[0] : 1;
                 var b        = this.par[1] ? this.par[1]
                                            : this.terminalHeight;
                 if (t < b && b <= this.terminalHeight) {
                   this.top   = t - 1;
                   this.bottom= b;
                   this.gotoXaY(0, 0);
                 }
                 break;
/*b*/ case 0x62: var c        = this.par[0] ? this.par[0] : 1;
                 if (c > this.terminalWidth * this.terminalHeight) {
                   c          = this.terminalWidth * this.terminalHeight;
                 }
                 while (c-- > 0) {
                   lineBuf   += this.lastCharacter;
                 }
                 break;
/*s*/ case 0x73: this.saveCursor();                                     break;
/*u*/ case 0x75: this.restoreCursor();                                  break;
/*Z*/ case 0x5A: this.rt(this.par[0] ? this.par[0] : 1);                break;
/*]*/ case 0x5D: this.settermCommand();                                 break;
      default:                                                          break;
      }
      break;
    case 12 /* ESbang */:
      if (ch == 'p') {
        this.reset();
      }
      this.isEsc              = 0 /* ESnormal */;
      break;
    case 13 /* ESpercent */:
      this.isEsc              = 0 /* ESnormal */;
      switch (ch) {
/*at*/case 0x40: this.utfEnabled = false;                               break;
/*G*/ case 0x47:
/*8*/ case 0x38: this.utfEnabled = true;                                break;
      default:                                                          break;
      }
      break;
    case 6 /* ESfunckey */:
      this.isEsc              = 0 /* ESnormal */;                               break;
    case 7 /* EShash */:
      this.isEsc              = 0 /* ESnormal */;
/*8*/ if (ch == 0x38) {
        // Screen alignment test not implemented
      }
      break;
    case 8 /* ESsetG0 */:
    case 9 /* ESsetG1 */:
    case 10 /* ESsetG2 */:
    case 11 /* ESsetG3 */:
      var g                   = this.isEsc - 8 /* ESsetG0 */;
      this.isEsc              = 0 /* ESnormal */;
      switch (ch) {
/*0*/ case 0x30: this.GMap[g] = this.VT100GraphicsMap;                  break;
/*A*/ case 0x42:
/*B*/ case 0x42: this.GMap[g] = this.Latin1Map;                         break;
/*U*/ case 0x55: this.GMap[g] = this.CodePage437Map;                    break;
/*K*/ case 0x4B: this.GMap[g] = this.DirectToFontMap;                   break;
      default:                                                          break;
      }
      if (this.useGMap == g) {
        this.translate        = this.GMap[g];
      }
      break;
    case 17 /* EStitle */:
      if (ch == 0x07) {
        if (this.titleString && this.titleString.charAt(0) == ';') {
          this.titleString    = this.titleString.substr(1);
          if (this.titleString != '') {
            this.titleString += ' - ';
          }
          this.titleString += 'Shell In A Box'
        }
        try {
          window.document.title = this.titleString;
        } catch (e) {
        }
        this.isEsc            = 0 /* ESnormal */;
      } else {
        this.titleString     += String.fromCharCode(ch);
      }
      break;
    case 18 /* ESss2 */:
    case 19 /* ESss3 */:
      if (ch < 256) {
          ch                  = this.GMap[this.isEsc - 18 /* ESss2 */ + 2]
                                         [this.toggleMeta ? (ch | 0x80) : ch];
        if ((ch & 0xFF00) == 0xF000) {
          ch                  = ch & 0xFF;
        } else if (ch == 0xFEFF || (ch >= 0x200A && ch <= 0x200F)) {
          this.isEsc         = 0 /* ESnormal */;                                break;
        }
      }
      this.lastCharacter      = String.fromCharCode(ch);
      lineBuf                += this.lastCharacter;
      this.isEsc              = 0 /* ESnormal */;                               break;
    case 20 /* ESVTEtitle */:
      // Ignores VTE escape sequences for current directory (OSC6) and current
      // file (OSC7).
      if (ch == 0x07 || ch == 0x5C) {
        this.isEsc            = 0 /* ESnormal */;
      }
      break;
    default:
      this.isEsc              = 0 /* ESnormal */;                               break;
    }
    break;
  }
  return lineBuf;
};

VT100.prototype.renderString = function(s, showCursor) {
  if (this.printing) {
    this.sendToPrinter(s);
    if (showCursor) {
      this.showCursor();
    }
    return;
  }

  // We try to minimize the number of DOM operations by coalescing individual
  // characters into strings. This is a significant performance improvement.
  var incX = s.length;
  if (incX > this.terminalWidth - this.cursorX) {
    incX   = this.terminalWidth - this.cursorX;
    if (incX <= 0) {
      return;
    }
    s      = s.substr(0, incX - 1) + s.charAt(s.length - 1);
  }
  if (showCursor) {
    // Minimize the number of calls to putString(), by avoiding a direct
    // call to this.showCursor()
    this.cursor.style.visibility = '';
  }
  this.putString(this.cursorX, this.cursorY, s, this.color, this.style);
};

VT100.prototype.vt100 = function(s) {
  this.cursorNeedsShowing = this.hideCursor();
  this.respondString      = '';
  var lineBuf             = '';
  for (var i = 0; i < s.length; i++) {
    var ch = s.charCodeAt(i);
    if (this.utfEnabled) {
      // Decode UTF8 encoded character
      if (ch > 0x7F) {
        if (this.utfCount > 0 && (ch & 0xC0) == 0x80) {
          this.utfChar    = (this.utfChar << 6) | (ch & 0x3F);
          if (--this.utfCount <= 0) {
            if (this.utfChar > 0xFFFF || this.utfChar < 0) {
              ch = 0xFFFD;
            } else {
              ch          = this.utfChar;
            }
          } else {
            continue;
          }
        } else {
          if ((ch & 0xE0) == 0xC0) {
            this.utfCount = 1;
            this.utfChar  = ch & 0x1F;
          } else if ((ch & 0xF0) == 0xE0) {
            this.utfCount = 2;
            this.utfChar  = ch & 0x0F;
          } else if ((ch & 0xF8) == 0xF0) {
            this.utfCount = 3;
            this.utfChar  = ch & 0x07;
          } else if ((ch & 0xFC) == 0xF8) {
            this.utfCount = 4;
            this.utfChar  = ch & 0x03;
          } else if ((ch & 0xFE) == 0xFC) {
            this.utfCount = 5;
            this.utfChar  = ch & 0x01;
          } else {
            this.utfCount = 0;
          }
          continue;
        }
      } else {
        this.utfCount     = 0;
      }
    }
    var isNormalCharacter =
      (ch >= 32 && ch <= 127 || ch >= 160 ||
       this.utfEnabled && ch >= 128 ||
       !(this.dispCtrl ? this.ctrlAlways : this.ctrlAction)[ch & 0x1F]) &&
      (ch != 0x7F || this.dispCtrl);

    if (isNormalCharacter && this.isEsc == 0 /* ESnormal */) {
      if (ch < 256) {
        ch                = this.translate[this.toggleMeta ? (ch | 0x80) : ch];
      }
      if ((ch & 0xFF00) == 0xF000) {
        ch                = ch & 0xFF;
      } else if (ch == 0xFEFF || (ch >= 0x200A && ch <= 0x200F)) {
        continue;
      }
      if (!this.printing) {
        if (this.needWrap || this.insertMode) {
          if (lineBuf) {
            this.renderString(lineBuf);
            lineBuf       = '';
          }
        }
        if (this.needWrap) {
          this.cr(); this.lf();
        }
        if (this.insertMode) {
          this.scrollRegion(this.cursorX, this.cursorY,
                            this.terminalWidth - this.cursorX - 1, 1,
                            1, 0, this.color, this.style);
        }
      }
      this.lastCharacter  = String.fromCharCode(ch);
      lineBuf            += this.lastCharacter;
      if (!this.printing &&
          this.cursorX + lineBuf.length >= this.terminalWidth) {
        this.needWrap     = this.autoWrapMode;
      }
    } else {
      if (lineBuf) {
        this.renderString(lineBuf);
        lineBuf           = '';
      }
      var expand          = this.doControl(ch);
      if (expand.length) {
        var r             = this.respondString;
        this.respondString= r + this.vt100(expand);
      }
    }
  }
  if (lineBuf) {
    this.renderString(lineBuf, this.cursorNeedsShowing);
  } else if (this.cursorNeedsShowing) {
    this.showCursor();
  }
  return this.respondString;
};

VT100.prototype.Latin1Map = [
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF
];

VT100.prototype.VT100GraphicsMap = [
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
0x0028, 0x0029, 0x002A, 0x2192, 0x2190, 0x2191, 0x2193, 0x002F,
0x2588, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x00A0,
0x25C6, 0x2592, 0x2409, 0x240C, 0x240D, 0x240A, 0x00B0, 0x00B1,
0x2591, 0x240B, 0x2518, 0x2510, 0x250C, 0x2514, 0x253C, 0xF800,
0xF801, 0x2500, 0xF803, 0xF804, 0x251C, 0x2524, 0x2534, 0x252C,
0x2502, 0x2264, 0x2265, 0x03C0, 0x2260, 0x00A3, 0x00B7, 0x007F,
0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF
];

VT100.prototype.CodePage437Map = [
0x0000, 0x263A, 0x263B, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022,
0x25D8, 0x25CB, 0x25D9, 0x2642, 0x2640, 0x266A, 0x266B, 0x263C,
0x25B6, 0x25C0, 0x2195, 0x203C, 0x00B6, 0x00A7, 0x25AC, 0x21A8,
0x2191, 0x2193, 0x2192, 0x2190, 0x221F, 0x2194, 0x25B2, 0x25BC,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x2302,
0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7,
0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5,
0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9,
0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192,
0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA,
0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB,
0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556,
0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,
0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F,
0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,
0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B,
0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,
0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4,
0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229,
0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248,
0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0
];

VT100.prototype.DirectToFontMap = [
0xF000, 0xF001, 0xF002, 0xF003, 0xF004, 0xF005, 0xF006, 0xF007,
0xF008, 0xF009, 0xF00A, 0xF00B, 0xF00C, 0xF00D, 0xF00E, 0xF00F,
0xF010, 0xF011, 0xF012, 0xF013, 0xF014, 0xF015, 0xF016, 0xF017,
0xF018, 0xF019, 0xF01A, 0xF01B, 0xF01C, 0xF01D, 0xF01E, 0xF01F,
0xF020, 0xF021, 0xF022, 0xF023, 0xF024, 0xF025, 0xF026, 0xF027,
0xF028, 0xF029, 0xF02A, 0xF02B, 0xF02C, 0xF02D, 0xF02E, 0xF02F,
0xF030, 0xF031, 0xF032, 0xF033, 0xF034, 0xF035, 0xF036, 0xF037,
0xF038, 0xF039, 0xF03A, 0xF03B, 0xF03C, 0xF03D, 0xF03E, 0xF03F,
0xF040, 0xF041, 0xF042, 0xF043, 0xF044, 0xF045, 0xF046, 0xF047,
0xF048, 0xF049, 0xF04A, 0xF04B, 0xF04C, 0xF04D, 0xF04E, 0xF04F,
0xF050, 0xF051, 0xF052, 0xF053, 0xF054, 0xF055, 0xF056, 0xF057,
0xF058, 0xF059, 0xF05A, 0xF05B, 0xF05C, 0xF05D, 0xF05E, 0xF05F,
0xF060, 0xF061, 0xF062, 0xF063, 0xF064, 0xF065, 0xF066, 0xF067,
0xF068, 0xF069, 0xF06A, 0xF06B, 0xF06C, 0xF06D, 0xF06E, 0xF06F,
0xF070, 0xF071, 0xF072, 0xF073, 0xF074, 0xF075, 0xF076, 0xF077,
0xF078, 0xF079, 0xF07A, 0xF07B, 0xF07C, 0xF07D, 0xF07E, 0xF07F,
0xF080, 0xF081, 0xF082, 0xF083, 0xF084, 0xF085, 0xF086, 0xF087,
0xF088, 0xF089, 0xF08A, 0xF08B, 0xF08C, 0xF08D, 0xF08E, 0xF08F,
0xF090, 0xF091, 0xF092, 0xF093, 0xF094, 0xF095, 0xF096, 0xF097,
0xF098, 0xF099, 0xF09A, 0xF09B, 0xF09C, 0xF09D, 0xF09E, 0xF09F,
0xF0A0, 0xF0A1, 0xF0A2, 0xF0A3, 0xF0A4, 0xF0A5, 0xF0A6, 0xF0A7,
0xF0A8, 0xF0A9, 0xF0AA, 0xF0AB, 0xF0AC, 0xF0AD, 0xF0AE, 0xF0AF,
0xF0B0, 0xF0B1, 0xF0B2, 0xF0B3, 0xF0B4, 0xF0B5, 0xF0B6, 0xF0B7,
0xF0B8, 0xF0B9, 0xF0BA, 0xF0BB, 0xF0BC, 0xF0BD, 0xF0BE, 0xF0BF,
0xF0C0, 0xF0C1, 0xF0C2, 0xF0C3, 0xF0C4, 0xF0C5, 0xF0C6, 0xF0C7,
0xF0C8, 0xF0C9, 0xF0CA, 0xF0CB, 0xF0CC, 0xF0CD, 0xF0CE, 0xF0CF,
0xF0D0, 0xF0D1, 0xF0D2, 0xF0D3, 0xF0D4, 0xF0D5, 0xF0D6, 0xF0D7,
0xF0D8, 0xF0D9, 0xF0DA, 0xF0DB, 0xF0DC, 0xF0DD, 0xF0DE, 0xF0DF,
0xF0E0, 0xF0E1, 0xF0E2, 0xF0E3, 0xF0E4, 0xF0E5, 0xF0E6, 0xF0E7,
0xF0E8, 0xF0E9, 0xF0EA, 0xF0EB, 0xF0EC, 0xF0ED, 0xF0EE, 0xF0EF,
0xF0F0, 0xF0F1, 0xF0F2, 0xF0F3, 0xF0F4, 0xF0F5, 0xF0F6, 0xF0F7,
0xF0F8, 0xF0F9, 0xF0FA, 0xF0FB, 0xF0FC, 0xF0FD, 0xF0FE, 0xF0FF
];

VT100.prototype.ctrlAction = [
  true,  false, false, false, false, false, false, true,
  true,  true,  true,  true,  true,  true,  true,  true,
  false, false, false, false, false, false, false, false,
  true,  false, true,  true,  false, false, false, false
];

VT100.prototype.ctrlAlways = [
  true,  false, false, false, false, false, false, false,
  true,  false, true,  false, true,  true,  true,  true,
  false, false, false, false, false, false, false, false,
  false, false, false, true,  false, false, false, false
];

/* vim: set filetype=javascript : */
#vt100 a {
  text-decoration:      none;
  color:                inherit;
}

#vt100 a:hover {
  text-decoration:      underline;
}

#vt100 #reconnect {
  position:             absolute;
  z-index:              2;
}

#vt100 #reconnect input {
  padding:              1ex;
  font-weight:          bold;
  font-size:            x-large;
}

#vt100 #cursize {
  background:           #EEEEEE;
  border:               1px solid black;
  font-family:          sans-serif;
  font-size:            large;
  font-weight:          bold;
  padding:              1ex;
  position:             absolute;
  z-index:              2;
}

#vt100 pre {
  margin:               0px;
}

#vt100 pre pre {
  overflow:             hidden;
}

#vt100 #scrollable {
  overflow-x:           hidden;
  overflow-y:           scroll;
  position:             relative;
  padding:              1px;
}

#vt100 #console, #vt100 #alt_console, #vt100 #cursor, #vt100 #lineheight, #vt100 .hidden pre {
  font-family:          "DejaVu Sans Mono", "Everson Mono", FreeMono, "Andale Mono", Consolas, monospace;
}

#vt100 #lineheight {
  position:             absolute;
  visibility:           hidden;
}

#vt100 #cursor {
  position:             absolute;
  left:                 0px;
  top:                  0px;
  overflow:             hidden;
  z-index:              1;
}

#vt100 #cursor.bright {
  background-color:     black;
  color:                white;
}

#vt100 #cursor.dim {
  background-color:     white;
  opacity:              0.2;
  -moz-opacity:         0.2;
  filter:               alpha(opacity=20);
}

#vt100 #cursor.inactive {
  border:               1px solid;
  margin:               -1px;
}

#vt100 #padding {
  visibility:           hidden;
  width:                1px;
  height:               0px;
  overflow:             hidden;
}

#vt100 .hidden {
  position:             absolute;
  top:                  -10000px;
  left:                 -10000px;
  width:                0px;
  height:               0px;
}

#vt100 #menu {
  overflow:             visible;
  position:             absolute;
  z-index:              3;
}

#vt100 #menu .popup {
  background-color:     #EEEEEE;
  border:               1px solid black;
  font-family:          sans-serif;
  position:             absolute;
}

#vt100 #menu .popup ul {
  list-style-type:      none;
  padding:              0px;
  margin:               0px;
  min-width:            10em;
}

#vt100 #menu .popup li {
  padding:              3px 0.5ex 3px 0.5ex;
}

#vt100 #menu .popup li.hover {
  background-color:     #444444;
  color:                white;
}

#vt100 #menu .popup li.disabled {
  color:                #AAAAAA;
}

#vt100 #menu .popup hr {
  margin:               0.5ex 0px 0.5ex 0px;
}

#vt100 #menu img {
  margin-right:         0.5ex;
  width:                1ex;
  height:               1ex;
}

#vt100 #scrollable.inverted {
  color:                #ffffff;
  background-color:     #000000;
}

#vt100 #kbd_button {
  float:                left;
  position:             fixed;
  z-index:              0;
  visibility:           hidden;
}

#vt100 #keyboard {
  z-index:              3;
  position:             absolute;
}

#vt100 #keyboard .box {
  font-family:          sans-serif;
  background-color:     #cccccc;
  padding:              .8em;
  float:                left;
  position:             absolute;
  border-radius:        10px;
  -moz-border-radius:   10px;
  box-shadow:           4px 4px 6px #222222;
  -webkit-box-shadow:   4px 4px 6px #222222;
  /* Don't set the -moz-box-shadow. It doesn't properly scale when CSS
   * transforms are in effect. Once Firefox supports box-shadow, it should
   * automatically do the right thing. Until then, leave shadows disabled
   * for Firefox.
   */
  opacity:              0.85;
  -moz-opacity:         0.85;
  filter:               alpha(opacity=85);
}

#vt100 #keyboard .box * {
  vertical-align:       top;
  display:              inline-block;
}

#vt100 #keyboard b, #vt100 #keyboard i, #vt100 #keyboard s, #vt100 #keyboard u {
  font-style:           normal;
  font-weight:          bold;
  border-radius:        5px;
  -moz-border-radius:   5px;
  background-color:     #555555;
  color:                #eeeeee;
  box-shadow:           2px 2px 3px #222222;
  -webkit-box-shadow:   2px 2px 3px #222222;
  padding:              4px;
  margin:               2px;
  height:               2ex;
  display:              inline-block;
  text-align:           center;
  text-decoration:      none;
}

#vt100 #keyboard b, #vt100 #keyboard s {
  width:                2ex;
}

#vt100 #keyboard u, #vt100 #keyboard s {
  visibility:           hidden;
}

#vt100 #keyboard .shifted {
  display:              none;
}

#vt100 #keyboard .selected {
  color:                #888888;
  background-color:     #eeeeee;
  box-shadow:           0px 0px 3px #222222;
  -webkit-box-shadow:   0px 0px 3px #222222;
  position:             relative;
  top:                  1px;
  left:                 1px;
}

@media print {
  #vt100 .scrollback {
    display:            none;
  }

  #vt100 #reconnect, #vt100 #cursor, #vt100 #menu, #vt100 #kbd_button, #vt100 #keyboard {
    visibility:         hidden;
  }

  #vt100 #scrollable {
    overflow:           hidden;
  }

  #vt100 #console, #vt100 #alt_console {
    overflow:           hidden;
    width:              1000000ex;
  }
}

[if DEFINES_COLORS]
/* IE cannot properly handle "inherit" properties. So, the monochrome.css/
 * color.css style sheets cannot work, if we define colors in styles.css.
 */
[else DEFINES_COLORS]
/* SYSTEM colors */
#vt100 .ansiDef   { color:            #000000; }
#vt100 .ansiDefR  { color:            #ffffff; }

#vt100 #scrollable.inverted .ansiDef
                  { color:            #ffffff; }
#vt100 #scrollable.inverted .ansiDefR
                  { color:            #000000; }

#vt100 .ansi0     { color:            #000000; }
#vt100 .ansi1     { color:            #cd0000; }
#vt100 .ansi2     { color:            #00cd00; }
#vt100 .ansi3     { color:            #cdcd00; }
#vt100 .ansi4     { color:            #0000ee; }
#vt100 .ansi5     { color:            #cd00cd; }
#vt100 .ansi6     { color:            #00cdcd; }
#vt100 .ansi7     { color:            #e5e5e5; }
#vt100 .ansi8     { color:            #7f7f7f; }
#vt100 .ansi9     { color:            #ff0000; }
#vt100 .ansi10    { color:            #00ff00; }
#vt100 .ansi11    { color:            #e8e8e0; }
#vt100 .ansi12    { color:            #5c5cff; }
#vt100 .ansi13    { color:            #ff00ff; }
#vt100 .ansi14    { color:            #00ffff; }
#vt100 .ansi15    { color:            #ffffff; }

/* XTERM colors - 256 color mode */
#vt100 .ansi16    { color:            #000000; }
#vt100 .ansi17    { color:            #00005f; }
#vt100 .ansi18    { color:            #000087; }
#vt100 .ansi19    { color:            #0000af; }
#vt100 .ansi20    { color:            #0000d7; }
#vt100 .ansi21    { color:            #0000ff; }
#vt100 .ansi22    { color:            #005f00; }
#vt100 .ansi23    { color:            #005f5f; }
#vt100 .ansi24    { color:            #005f87; }
#vt100 .ansi25    { color:            #005faf; }
#vt100 .ansi26    { color:            #005fd7; }
#vt100 .ansi27    { color:            #005fff; }
#vt100 .ansi28    { color:            #008700; }
#vt100 .ansi29    { color:            #00875f; }
#vt100 .ansi30    { color:            #008787; }
#vt100 .ansi31    { color:            #0087af; }
#vt100 .ansi32    { color:            #0087d7; }
#vt100 .ansi33    { color:            #0087ff; }
#vt100 .ansi34    { color:            #00af00; }
#vt100 .ansi35    { color:            #00af5f; }
#vt100 .ansi36    { color:            #00af87; }
#vt100 .ansi37    { color:            #00afaf; }
#vt100 .ansi38    { color:            #00afd7; }
#vt100 .ansi39    { color:            #00afff; }
#vt100 .ansi40    { color:            #00d700; }
#vt100 .ansi41    { color:            #00d75f; }
#vt100 .ansi42    { color:            #00d787; }
#vt100 .ansi43    { color:            #00d7af; }
#vt100 .ansi44    { color:            #00d7d7; }
#vt100 .ansi45    { color:            #00d7ff; }
#vt100 .ansi46    { color:            #00ff00; }
#vt100 .ansi47    { color:            #00ff5f; }
#vt100 .ansi48    { color:            #00ff87; }
#vt100 .ansi49    { color:            #00ffaf; }
#vt100 .ansi50    { color:            #00ffd7; }
#vt100 .ansi51    { color:            #00ffff; }
#vt100 .ansi52    { color:            #5f0000; }
#vt100 .ansi53    { color:            #5f005f; }
#vt100 .ansi54    { color:            #5f0087; }
#vt100 .ansi55    { color:            #5f00af; }
#vt100 .ansi56    { color:            #5f00d7; }
#vt100 .ansi57    { color:            #5f00ff; }
#vt100 .ansi58    { color:            #5f5f00; }
#vt100 .ansi59    { color:            #5f5f5f; }
#vt100 .ansi60    { color:            #5f5f87; }
#vt100 .ansi61    { color:            #5f5faf; }
#vt100 .ansi62    { color:            #5f5fd7; }
#vt100 .ansi63    { color:            #5f5fff; }
#vt100 .ansi64    { color:            #5f8700; }
#vt100 .ansi65    { color:            #5f875f; }
#vt100 .ansi66    { color:            #5f8787; }
#vt100 .ansi67    { color:            #5f87af; }
#vt100 .ansi68    { color:            #5f87d7; }
#vt100 .ansi69    { color:            #5f87ff; }
#vt100 .ansi70    { color:            #5faf00; }
#vt100 .ansi71    { color:            #5faf5f; }
#vt100 .ansi72    { color:            #5faf87; }
#vt100 .ansi73    { color:            #5fafaf; }
#vt100 .ansi74    { color:            #5fafd7; }
#vt100 .ansi75    { color:            #5fafff; }
#vt100 .ansi76    { color:            #5fd700; }
#vt100 .ansi77    { color:            #5fd75f; }
#vt100 .ansi78    { color:            #5fd787; }
#vt100 .ansi79    { color:            #5fd7af; }
#vt100 .ansi80    { color:            #5fd7d7; }
#vt100 .ansi81    { color:            #5fd7ff; }
#vt100 .ansi82    { color:            #5fff00; }
#vt100 .ansi83    { color:            #5fff5f; }
#vt100 .ansi84    { color:            #5fff87; }
#vt100 .ansi85    { color:            #5fffaf; }
#vt100 .ansi86    { color:            #5fffd7; }
#vt100 .ansi87    { color:            #5fffff; }
#vt100 .ansi88    { color:            #870000; }
#vt100 .ansi89    { color:            #87005f; }
#vt100 .ansi90    { color:            #870087; }
#vt100 .ansi91    { color:            #8700af; }
#vt100 .ansi92    { color:            #8700d7; }
#vt100 .ansi93    { color:            #8700ff; }
#vt100 .ansi94    { color:            #875f00; }
#vt100 .ansi95    { color:            #875f5f; }
#vt100 .ansi96    { color:            #875f87; }
#vt100 .ansi97    { color:            #875faf; }
#vt100 .ansi98    { color:            #875fd7; }
#vt100 .ansi99    { color:            #875fff; }
#vt100 .ansi100   { color:            #878700; }
#vt100 .ansi101   { color:            #87875f; }
#vt100 .ansi102   { color:            #878787; }
#vt100 .ansi103   { color:            #8787af; }
#vt100 .ansi104   { color:            #8787d7; }
#vt100 .ansi105   { color:            #8787ff; }
#vt100 .ansi106   { color:            #87af00; }
#vt100 .ansi107   { color:            #87af5f; }
#vt100 .ansi108   { color:            #87af87; }
#vt100 .ansi109   { color:            #87afaf; }
#vt100 .ansi110   { color:            #87afd7; }
#vt100 .ansi111   { color:            #87afff; }
#vt100 .ansi112   { color:            #87d700; }
#vt100 .ansi113   { color:            #87d75f; }
#vt100 .ansi114   { color:            #87d787; }
#vt100 .ansi115   { color:            #87d7af; }
#vt100 .ansi116   { color:            #87d7d7; }
#vt100 .ansi117   { color:            #87d7ff; }
#vt100 .ansi118   { color:            #87ff00; }
#vt100 .ansi119   { color:            #87ff5f; }
#vt100 .ansi120   { color:            #87ff87; }
#vt100 .ansi121   { color:            #87ffaf; }
#vt100 .ansi122   { color:            #87ffd7; }
#vt100 .ansi123   { color:            #87ffff; }
#vt100 .ansi124   { color:            #af0000; }
#vt100 .ansi125   { color:            #af005f; }
#vt100 .ansi126   { color:            #af0087; }
#vt100 .ansi127   { color:            #af00af; }
#vt100 .ansi128   { color:            #af00d7; }
#vt100 .ansi129   { color:            #af00ff; }
#vt100 .ansi130   { color:            #af5f00; }
#vt100 .ansi131   { color:            #af5f5f; }
#vt100 .ansi132   { color:            #af5f87; }
#vt100 .ansi133   { color:            #af5faf; }
#vt100 .ansi134   { color:            #af5fd7; }
#vt100 .ansi135   { color:            #af5fff; }
#vt100 .ansi136   { color:            #af8700; }
#vt100 .ansi137   { color:            #af875f; }
#vt100 .ansi138   { color:            #af8787; }
#vt100 .ansi139   { color:            #af87af; }
#vt100 .ansi140   { color:            #af87d7; }
#vt100 .ansi141   { color:            #af87ff; }
#vt100 .ansi142   { color:            #afaf00; }
#vt100 .ansi143   { color:            #afaf5f; }
#vt100 .ansi144   { color:            #afaf87; }
#vt100 .ansi145   { color:            #afafaf; }
#vt100 .ansi146   { color:            #afafd7; }
#vt100 .ansi147   { color:            #afafff; }
#vt100 .ansi148   { color:            #afd700; }
#vt100 .ansi149   { color:            #afd75f; }
#vt100 .ansi150   { color:            #afd787; }
#vt100 .ansi151   { color:            #afd7af; }
#vt100 .ansi152   { color:            #afd7d7; }
#vt100 .ansi153   { color:            #afd7ff; }
#vt100 .ansi154   { color:            #afff00; }
#vt100 .ansi155   { color:            #afff5f; }
#vt100 .ansi156   { color:            #afff87; }
#vt100 .ansi157   { color:            #afffaf; }
#vt100 .ansi158   { color:            #afffd7; }
#vt100 .ansi159   { color:            #afffff; }
#vt100 .ansi160   { color:            #d70000; }
#vt100 .ansi161   { color:            #d7005f; }
#vt100 .ansi162   { color:            #d70087; }
#vt100 .ansi163   { color:            #d700af; }
#vt100 .ansi164   { color:            #d700d7; }
#vt100 .ansi165   { color:            #d700ff; }
#vt100 .ansi166   { color:            #d75f00; }
#vt100 .ansi167   { color:            #d75f5f; }
#vt100 .ansi168   { color:            #d75f87; }
#vt100 .ansi169   { color:            #d75faf; }
#vt100 .ansi170   { color:            #d75fd7; }
#vt100 .ansi171   { color:            #d75fff; }
#vt100 .ansi172   { color:            #d78700; }
#vt100 .ansi173   { color:            #d7875f; }
#vt100 .ansi174   { color:            #d78787; }
#vt100 .ansi175   { color:            #d787af; }
#vt100 .ansi176   { color:            #d787d7; }
#vt100 .ansi177   { color:            #d787ff; }
#vt100 .ansi178   { color:            #d7af00; }
#vt100 .ansi179   { color:            #d7af5f; }
#vt100 .ansi180   { color:            #d7af87; }
#vt100 .ansi181   { color:            #d7afaf; }
#vt100 .ansi182   { color:            #d7afd7; }
#vt100 .ansi183   { color:            #d7afff; }
#vt100 .ansi184   { color:            #d7d700; }
#vt100 .ansi185   { color:            #d7d75f; }
#vt100 .ansi186   { color:            #d7d787; }
#vt100 .ansi187   { color:            #d7d7af; }
#vt100 .ansi188   { color:            #d7d7d7; }
#vt100 .ansi189   { color:            #d7d7ff; }
#vt100 .ansi190   { color:            #d7ff00; }
#vt100 .ansi191   { color:            #d7ff5f; }
#vt100 .ansi192   { color:            #d7ff87; }
#vt100 .ansi193   { color:            #d7ffaf; }
#vt100 .ansi194   { color:            #d7ffd7; }
#vt100 .ansi195   { color:            #d7ffff; }
#vt100 .ansi196   { color:            #ff0000; }
#vt100 .ansi197   { color:            #ff005f; }
#vt100 .ansi198   { color:            #ff0087; }
#vt100 .ansi199   { color:            #ff00af; }
#vt100 .ansi200   { color:            #ff00d7; }
#vt100 .ansi201   { color:            #ff00ff; }
#vt100 .ansi202   { color:            #ff5f00; }
#vt100 .ansi203   { color:            #ff5f5f; }
#vt100 .ansi204   { color:            #ff5f87; }
#vt100 .ansi205   { color:            #ff5faf; }
#vt100 .ansi206   { color:            #ff5fd7; }
#vt100 .ansi207   { color:            #ff5fff; }
#vt100 .ansi208   { color:            #ff8700; }
#vt100 .ansi209   { color:            #ff875f; }
#vt100 .ansi210   { color:            #ff8787; }
#vt100 .ansi211   { color:            #ff87af; }
#vt100 .ansi212   { color:            #ff87d7; }
#vt100 .ansi213   { color:            #ff87ff; }
#vt100 .ansi214   { color:            #ffaf00; }
#vt100 .ansi215   { color:            #ffaf5f; }
#vt100 .ansi216   { color:            #ffaf87; }
#vt100 .ansi217   { color:            #ffafaf; }
#vt100 .ansi218   { color:            #ffafd7; }
#vt100 .ansi219   { color:            #ffafff; }
#vt100 .ansi220   { color:            #ffd700; }
#vt100 .ansi221   { color:            #ffd75f; }
#vt100 .ansi222   { color:            #ffd787; }
#vt100 .ansi223   { color:            #ffd7af; }
#vt100 .ansi224   { color:            #ffd7d7; }
#vt100 .ansi225   { color:            #ffd7ff; }
#vt100 .ansi226   { color:            #ffff00; }
#vt100 .ansi227   { color:            #ffff5f; }
#vt100 .ansi228   { color:            #ffff87; }
#vt100 .ansi229   { color:            #ffffaf; }
#vt100 .ansi230   { color:            #ffffd7; }
#vt100 .ansi231   { color:            #ffffff; }
#vt100 .ansi232   { color:            #080808; }
#vt100 .ansi233   { color:            #121212; }
#vt100 .ansi234   { color:            #1c1c1c; }
#vt100 .ansi235   { color:            #262626; }
#vt100 .ansi236   { color:            #303030; }
#vt100 .ansi237   { color:            #3a3a3a; }
#vt100 .ansi238   { color:            #444444; }
#vt100 .ansi239   { color:            #4e4e4e; }
#vt100 .ansi240   { color:            #585858; }
#vt100 .ansi241   { color:            #626262; }
#vt100 .ansi242   { color:            #6c6c6c; }
#vt100 .ansi243   { color:            #767676; }
#vt100 .ansi244   { color:            #808080; }
#vt100 .ansi245   { color:            #8a8a8a; }
#vt100 .ansi246   { color:            #949494; }
#vt100 .ansi247   { color:            #9e9e9e; }
#vt100 .ansi248   { color:            #a8a8a8; }
#vt100 .ansi249   { color:            #b2b2b2; }
#vt100 .ansi250   { color:            #bcbcbc; }
#vt100 .ansi251   { color:            #c6c6c6; }
#vt100 .ansi252   { color:            #d0d0d0; }
#vt100 .ansi253   { color:            #dadada; }
#vt100 .ansi254   { color:            #e4e4e4; }
#vt100 .ansi255   { color:            #eeeeee; }

/* SYSTEM colors */
#vt100 .bgAnsiDef { background-color: #ffffff; }
#vt100 .bgAnsiDefR
                  { background-color: #000000; }

#vt100 #scrollable.inverted .bgAnsiDef
                  { background-color: #000000; }
#vt100 #scrollable.inverted .bgAnsiDefR
                  { background-color: #ffffff; }

#vt100 .bgAnsi0   { background-color: #000000; }
#vt100 .bgAnsi1   { background-color: #cd0000; }
#vt100 .bgAnsi2   { background-color: #00cd00; }
#vt100 .bgAnsi3   { background-color: #cdcd00; }
#vt100 .bgAnsi4   { background-color: #0000ee; }
#vt100 .bgAnsi5   { background-color: #cd00cd; }
#vt100 .bgAnsi6   { background-color: #00cdcd; }
#vt100 .bgAnsi7   { background-color: #e5e5e5; }
#vt100 .bgAnsi8   { background-color: #7f7f7f; }
#vt100 .bgAnsi9   { background-color: #ff0000; }
#vt100 .bgAnsi10  { background-color: #00ff00; }
#vt100 .bgAnsi11  { background-color: #e8e800; }
#vt100 .bgAnsi12  { background-color: #5c5cff; }
#vt100 .bgAnsi13  { background-color: #ff00ff; }
#vt100 .bgAnsi14  { background-color: #00ffff; }
#vt100 .bgAnsi15  { background-color: #ffffff; }

/* XTERM colors - 256 color mode */
#vt100 .bgAnsi16  { background-color: #000000; }
#vt100 .bgAnsi17  { background-color: #00005f; }
#vt100 .bgAnsi18  { background-color: #000087; }
#vt100 .bgAnsi19  { background-color: #0000af; }
#vt100 .bgAnsi20  { background-color: #0000d7; }
#vt100 .bgAnsi21  { background-color: #0000ff; }
#vt100 .bgAnsi22  { background-color: #005f00; }
#vt100 .bgAnsi23  { background-color: #005f5f; }
#vt100 .bgAnsi24  { background-color: #005f87; }
#vt100 .bgAnsi25  { background-color: #005faf; }
#vt100 .bgAnsi26  { background-color: #005fd7; }
#vt100 .bgAnsi27  { background-color: #005fff; }
#vt100 .bgAnsi28  { background-color: #008700; }
#vt100 .bgAnsi29  { background-color: #00875f; }
#vt100 .bgAnsi30  { background-color: #008787; }
#vt100 .bgAnsi31  { background-color: #0087af; }
#vt100 .bgAnsi32  { background-color: #0087d7; }
#vt100 .bgAnsi33  { background-color: #0087ff; }
#vt100 .bgAnsi34  { background-color: #00af00; }
#vt100 .bgAnsi35  { background-color: #00af5f; }
#vt100 .bgAnsi36  { background-color: #00af87; }
#vt100 .bgAnsi37  { background-color: #00afaf; }
#vt100 .bgAnsi38  { background-color: #00afd7; }
#vt100 .bgAnsi39  { background-color: #00afff; }
#vt100 .bgAnsi40  { background-color: #00d700; }
#vt100 .bgAnsi41  { background-color: #00d75f; }
#vt100 .bgAnsi42  { background-color: #00d787; }
#vt100 .bgAnsi43  { background-color: #00d7af; }
#vt100 .bgAnsi44  { background-color: #00d7d7; }
#vt100 .bgAnsi45  { background-color: #00d7ff; }
#vt100 .bgAnsi46  { background-color: #00ff00; }
#vt100 .bgAnsi47  { background-color: #00ff5f; }
#vt100 .bgAnsi48  { background-color: #00ff87; }
#vt100 .bgAnsi49  { background-color: #00ffaf; }
#vt100 .bgAnsi50  { background-color: #00ffd7; }
#vt100 .bgAnsi51  { background-color: #00ffff; }
#vt100 .bgAnsi52  { background-color: #5f0000; }
#vt100 .bgAnsi53  { background-color: #5f005f; }
#vt100 .bgAnsi54  { background-color: #5f0087; }
#vt100 .bgAnsi55  { background-color: #5f00af; }
#vt100 .bgAnsi56  { background-color: #5f00d7; }
#vt100 .bgAnsi57  { background-color: #5f00ff; }
#vt100 .bgAnsi58  { background-color: #5f5f00; }
#vt100 .bgAnsi59  { background-color: #5f5f5f; }
#vt100 .bgAnsi60  { background-color: #5f5f87; }
#vt100 .bgAnsi61  { background-color: #5f5faf; }
#vt100 .bgAnsi62  { background-color: #5f5fd7; }
#vt100 .bgAnsi63  { background-color: #5f5fff; }
#vt100 .bgAnsi64  { background-color: #5f8700; }
#vt100 .bgAnsi65  { background-color: #5f875f; }
#vt100 .bgAnsi66  { background-color: #5f8787; }
#vt100 .bgAnsi67  { background-color: #5f87af; }
#vt100 .bgAnsi68  { background-color: #5f87d7; }
#vt100 .bgAnsi69  { background-color: #5f87ff; }
#vt100 .bgAnsi70  { background-color: #5faf00; }
#vt100 .bgAnsi71  { background-color: #5faf5f; }
#vt100 .bgAnsi72  { background-color: #5faf87; }
#vt100 .bgAnsi73  { background-color: #5fafaf; }
#vt100 .bgAnsi74  { background-color: #5fafd7; }
#vt100 .bgAnsi75  { background-color: #5fafff; }
#vt100 .bgAnsi76  { background-color: #5fd700; }
#vt100 .bgAnsi77  { background-color: #5fd75f; }
#vt100 .bgAnsi78  { background-color: #5fd787; }
#vt100 .bgAnsi79  { background-color: #5fd7af; }
#vt100 .bgAnsi80  { background-color: #5fd7d7; }
#vt100 .bgAnsi81  { background-color: #5fd7ff; }
#vt100 .bgAnsi82  { background-color: #5fff00; }
#vt100 .bgAnsi83  { background-color: #5fff5f; }
#vt100 .bgAnsi84  { background-color: #5fff87; }
#vt100 .bgAnsi85  { background-color: #5fffaf; }
#vt100 .bgAnsi86  { background-color: #5fffd7; }
#vt100 .bgAnsi87  { background-color: #5fffff; }
#vt100 .bgAnsi88  { background-color: #870000; }
#vt100 .bgAnsi89  { background-color: #87005f; }
#vt100 .bgAnsi90  { background-color: #870087; }
#vt100 .bgAnsi91  { background-color: #8700af; }
#vt100 .bgAnsi92  { background-color: #8700d7; }
#vt100 .bgAnsi93  { background-color: #8700ff; }
#vt100 .bgAnsi94  { background-color: #875f00; }
#vt100 .bgAnsi95  { background-color: #875f5f; }
#vt100 .bgAnsi96  { background-color: #875f87; }
#vt100 .bgAnsi97  { background-color: #875faf; }
#vt100 .bgAnsi98  { background-color: #875fd7; }
#vt100 .bgAnsi99  { background-color: #875fff; }
#vt100 .bgAnsi100 { background-color: #878700; }
#vt100 .bgAnsi101 { background-color: #87875f; }
#vt100 .bgAnsi102 { background-color: #878787; }
#vt100 .bgAnsi103 { background-color: #8787af; }
#vt100 .bgAnsi104 { background-color: #8787d7; }
#vt100 .bgAnsi105 { background-color: #8787ff; }
#vt100 .bgAnsi106 { background-color: #87af00; }
#vt100 .bgAnsi107 { background-color: #87af5f; }
#vt100 .bgAnsi108 { background-color: #87af87; }
#vt100 .bgAnsi109 { background-color: #87afaf; }
#vt100 .bgAnsi110 { background-color: #87afd7; }
#vt100 .bgAnsi111 { background-color: #87afff; }
#vt100 .bgAnsi112 { background-color: #87d700; }
#vt100 .bgAnsi113 { background-color: #87d75f; }
#vt100 .bgAnsi114 { background-color: #87d787; }
#vt100 .bgAnsi115 { background-color: #87d7af; }
#vt100 .bgAnsi116 { background-color: #87d7d7; }
#vt100 .bgAnsi117 { background-color: #87d7ff; }
#vt100 .bgAnsi118 { background-color: #87ff00; }
#vt100 .bgAnsi119 { background-color: #87ff5f; }
#vt100 .bgAnsi120 { background-color: #87ff87; }
#vt100 .bgAnsi121 { background-color: #87ffaf; }
#vt100 .bgAnsi122 { background-color: #87ffd7; }
#vt100 .bgAnsi123 { background-color: #87ffff; }
#vt100 .bgAnsi124 { background-color: #af0000; }
#vt100 .bgAnsi125 { background-color: #af005f; }
#vt100 .bgAnsi126 { background-color: #af0087; }
#vt100 .bgAnsi127 { background-color: #af00af; }
#vt100 .bgAnsi128 { background-color: #af00d7; }
#vt100 .bgAnsi129 { background-color: #af00ff; }
#vt100 .bgAnsi130 { background-color: #af5f00; }
#vt100 .bgAnsi131 { background-color: #af5f5f; }
#vt100 .bgAnsi132 { background-color: #af5f87; }
#vt100 .bgAnsi133 { background-color: #af5faf; }
#vt100 .bgAnsi134 { background-color: #af5fd7; }
#vt100 .bgAnsi135 { background-color: #af5fff; }
#vt100 .bgAnsi136 { background-color: #af8700; }
#vt100 .bgAnsi137 { background-color: #af875f; }
#vt100 .bgAnsi138 { background-color: #af8787; }
#vt100 .bgAnsi139 { background-color: #af87af; }
#vt100 .bgAnsi140 { background-color: #af87d7; }
#vt100 .bgAnsi141 { background-color: #af87ff; }
#vt100 .bgAnsi142 { background-color: #afaf00; }
#vt100 .bgAnsi143 { background-color: #afaf5f; }
#vt100 .bgAnsi144 { background-color: #afaf87; }
#vt100 .bgAnsi145 { background-color: #afafaf; }
#vt100 .bgAnsi146 { background-color: #afafd7; }
#vt100 .bgAnsi147 { background-color: #afafff; }
#vt100 .bgAnsi148 { background-color: #afd700; }
#vt100 .bgAnsi149 { background-color: #afd75f; }
#vt100 .bgAnsi150 { background-color: #afd787; }
#vt100 .bgAnsi151 { background-color: #afd7af; }
#vt100 .bgAnsi152 { background-color: #afd7d7; }
#vt100 .bgAnsi153 { background-color: #afd7ff; }
#vt100 .bgAnsi154 { background-color: #afff00; }
#vt100 .bgAnsi155 { background-color: #afff5f; }
#vt100 .bgAnsi156 { background-color: #afff87; }
#vt100 .bgAnsi157 { background-color: #afffaf; }
#vt100 .bgAnsi158 { background-color: #afffd7; }
#vt100 .bgAnsi159 { background-color: #afffff; }
#vt100 .bgAnsi160 { background-color: #d70000; }
#vt100 .bgAnsi161 { background-color: #d7005f; }
#vt100 .bgAnsi162 { background-color: #d70087; }
#vt100 .bgAnsi163 { background-color: #d700af; }
#vt100 .bgAnsi164 { background-color: #d700d7; }
#vt100 .bgAnsi165 { background-color: #d700ff; }
#vt100 .bgAnsi166 { background-color: #d75f00; }
#vt100 .bgAnsi167 { background-color: #d75f5f; }
#vt100 .bgAnsi168 { background-color: #d75f87; }
#vt100 .bgAnsi169 { background-color: #d75faf; }
#vt100 .bgAnsi170 { background-color: #d75fd7; }
#vt100 .bgAnsi171 { background-color: #d75fff; }
#vt100 .bgAnsi172 { background-color: #d78700; }
#vt100 .bgAnsi173 { background-color: #d7875f; }
#vt100 .bgAnsi174 { background-color: #d78787; }
#vt100 .bgAnsi175 { background-color: #d787af; }
#vt100 .bgAnsi176 { background-color: #d787d7; }
#vt100 .bgAnsi177 { background-color: #d787ff; }
#vt100 .bgAnsi178 { background-color: #d7af00; }
#vt100 .bgAnsi179 { background-color: #d7af5f; }
#vt100 .bgAnsi180 { background-color: #d7af87; }
#vt100 .bgAnsi181 { background-color: #d7afaf; }
#vt100 .bgAnsi182 { background-color: #d7afd7; }
#vt100 .bgAnsi183 { background-color: #d7afff; }
#vt100 .bgAnsi184 { background-color: #d7d700; }
#vt100 .bgAnsi185 { background-color: #d7d75f; }
#vt100 .bgAnsi186 { background-color: #d7d787; }
#vt100 .bgAnsi187 { background-color: #d7d7af; }
#vt100 .bgAnsi188 { background-color: #d7d7d7; }
#vt100 .bgAnsi189 { background-color: #d7d7ff; }
#vt100 .bgAnsi190 { background-color: #d7ff00; }
#vt100 .bgAnsi191 { background-color: #d7ff5f; }
#vt100 .bgAnsi192 { background-color: #d7ff87; }
#vt100 .bgAnsi193 { background-color: #d7ffaf; }
#vt100 .bgAnsi194 { background-color: #d7ffd7; }
#vt100 .bgAnsi195 { background-color: #d7ffff; }
#vt100 .bgAnsi196 { background-color: #ff0000; }
#vt100 .bgAnsi197 { background-color: #ff005f; }
#vt100 .bgAnsi198 { background-color: #ff0087; }
#vt100 .bgAnsi199 { background-color: #ff00af; }
#vt100 .bgAnsi200 { background-color: #ff00d7; }
#vt100 .bgAnsi201 { background-color: #ff00ff; }
#vt100 .bgAnsi202 { background-color: #ff5f00; }
#vt100 .bgAnsi203 { background-color: #ff5f5f; }
#vt100 .bgAnsi204 { background-color: #ff5f87; }
#vt100 .bgAnsi205 { background-color: #ff5faf; }
#vt100 .bgAnsi206 { background-color: #ff5fd7; }
#vt100 .bgAnsi207 { background-color: #ff5fff; }
#vt100 .bgAnsi208 { background-color: #ff8700; }
#vt100 .bgAnsi209 { background-color: #ff875f; }
#vt100 .bgAnsi210 { background-color: #ff8787; }
#vt100 .bgAnsi211 { background-color: #ff87af; }
#vt100 .bgAnsi212 { background-color: #ff87d7; }
#vt100 .bgAnsi213 { background-color: #ff87ff; }
#vt100 .bgAnsi214 { background-color: #ffaf00; }
#vt100 .bgAnsi215 { background-color: #ffaf5f; }
#vt100 .bgAnsi216 { background-color: #ffaf87; }
#vt100 .bgAnsi217 { background-color: #ffafaf; }
#vt100 .bgAnsi218 { background-color: #ffafd7; }
#vt100 .bgAnsi219 { background-color: #ffafff; }
#vt100 .bgAnsi220 { background-color: #ffd700; }
#vt100 .bgAnsi221 { background-color: #ffd75f; }
#vt100 .bgAnsi222 { background-color: #ffd787; }
#vt100 .bgAnsi223 { background-color: #ffd7af; }
#vt100 .bgAnsi224 { background-color: #ffd7d7; }
#vt100 .bgAnsi225 { background-color: #ffd7ff; }
#vt100 .bgAnsi226 { background-color: #ffff00; }
#vt100 .bgAnsi227 { background-color: #ffff5f; }
#vt100 .bgAnsi228 { background-color: #ffff87; }
#vt100 .bgAnsi229 { background-color: #ffffaf; }
#vt100 .bgAnsi230 { background-color: #ffffd7; }
#vt100 .bgAnsi231 { background-color: #ffffff; }
#vt100 .bgAnsi232 { background-color: #080808; }
#vt100 .bgAnsi233 { background-color: #121212; }
#vt100 .bgAnsi234 { background-color: #1c1c1c; }
#vt100 .bgAnsi235 { background-color: #262626; }
#vt100 .bgAnsi236 { background-color: #303030; }
#vt100 .bgAnsi237 { background-color: #3a3a3a; }
#vt100 .bgAnsi238 { background-color: #444444; }
#vt100 .bgAnsi239 { background-color: #4e4e4e; }
#vt100 .bgAnsi240 { background-color: #585858; }
#vt100 .bgAnsi241 { background-color: #626262; }
#vt100 .bgAnsi242 { background-color: #6c6c6c; }
#vt100 .bgAnsi243 { background-color: #767676; }
#vt100 .bgAnsi244 { background-color: #808080; }
#vt100 .bgAnsi245 { background-color: #8a8a8a; }
#vt100 .bgAnsi246 { background-color: #949494; }
#vt100 .bgAnsi247 { background-color: #9e9e9e; }
#vt100 .bgAnsi248 { background-color: #a8a8a8; }
#vt100 .bgAnsi249 { background-color: #b2b2b2; }
#vt100 .bgAnsi250 { background-color: #bcbcbc; }
#vt100 .bgAnsi251 { background-color: #c6c6c6; }
#vt100 .bgAnsi252 { background-color: #d0d0d0; }
#vt100 .bgAnsi253 { background-color: #dadada; }
#vt100 .bgAnsi254 { background-color: #e4e4e4; }
#vt100 .bgAnsi255 { background-color: #eeeeee; }
[endif DEFINES_COLORS]
// ShellInABox.js -- Use XMLHttpRequest to provide an AJAX terminal emulator.
// Copyright (C) 2008-2010 Markus Gutschke <markus@shellinabox.com>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation.
//
// This program 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
//
// In addition to these license terms, the author grants the following
// additional rights:
//
// If you modify this program, or any covered work, by linking or
// combining it with the OpenSSL project's OpenSSL library (or a
// modified version of that library), containing parts covered by the
// terms of the OpenSSL or SSLeay licenses, the author
// grants you additional permission to convey the resulting work.
// Corresponding Source for a non-source form of such a combination
// shall include the source code for the parts of OpenSSL used as well
// as that of the covered work.
//
// You may at your option choose to remove this additional permission from
// the work, or from any part of it.
//
// It is possible to build this program in a way that it loads OpenSSL
// libraries at run-time. If doing so, the following notices are required
// by the OpenSSL and SSLeay licenses:
//
// This product includes software developed by the OpenSSL Project
// for use in the OpenSSL Toolkit. (http://www.openssl.org/)
//
// This product includes cryptographic software written by Eric Young
// (eay@cryptsoft.com)
//
//
// The most up-to-date version of this program is always available from
// http://shellinabox.com
//
//
// Notes:
//
// The author believes that for the purposes of this license, you meet the
// requirements for publishing the source code, if your web server publishes
// the source in unmodified form (i.e. with licensing information, comments,
// formatting, and identifier names intact). If there are technical reasons
// that require you to make changes to the source code when serving the
// JavaScript (e.g to remove pre-processor directives from the source), these
// changes should be done in a reversible fashion.
//
// The author does not consider websites that reference this script in
// unmodified form, and web servers that serve this script in unmodified form
// to be derived works. As such, they are believed to be outside of the
// scope of this license and not subject to the rights or restrictions of the
// GNU General Public License.
//
// If in doubt, consult a legal professional familiar with the laws that
// apply in your country.

// #define XHR_UNITIALIZED 0
// #define XHR_OPEN        1
// #define XHR_SENT        2
// #define XHR_RECEIVING   3
// #define XHR_LOADED      4

// IE does not define XMLHttpRequest by default, so we provide a suitable
// wrapper.
if (typeof XMLHttpRequest == 'undefined') {
  XMLHttpRequest = function() {
    try { return new ActiveXObject('Msxml2.XMLHTTP.6.0');} catch (e) { }
    try { return new ActiveXObject('Msxml2.XMLHTTP.3.0');} catch (e) { }
    try { return new ActiveXObject('Msxml2.XMLHTTP');    } catch (e) { }
    try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch (e) { }
    throw new Error('');
  };
}

function extend(subClass, baseClass) {
  function inheritance() { }
  inheritance.prototype          = baseClass.prototype;
  subClass.prototype             = new inheritance();
  subClass.prototype.constructor = subClass;
  subClass.prototype.superClass  = baseClass.prototype;
};

function ShellInABox(url, container) {
  if (url == undefined) {
    this.rooturl    = document.location.href;
    this.url        = document.location.href.replace(/[?#].*/, '');
  } else {
    this.rooturl    = url;
    this.url        = url;
  }
  if (document.location.hash != '') {
    var hash        = decodeURIComponent(document.location.hash).
                      replace(/^#/, '');
    this.nextUrl    = hash.replace(/,.*/, '');
    this.session    = hash.replace(/[^,]*,/, '');
  } else {
    this.nextUrl    = this.url;
    this.session    = null;
  }
  this.pendingKeys  = '';
  this.keysInFlight = false;
  this.connected    = false;
  this.replayOnOutput  = false;
  this.replayOnSession = false;
  this.superClass.constructor.call(this, container);


  // We have to initiate the first XMLHttpRequest from a timer. Otherwise,
  // Chrome never realizes that the page has loaded.
  setTimeout(function(shellInABox) {
               return function() {
                 shellInABox.messageInit();
                 shellInABox.sendRequest();
               };
             }(this), 1);
};
extend(ShellInABox, VT100);

ShellInABox.prototype.sessionClosed = function() {
  try {
    this.connected    = false;
    if (this.session) {
      this.session    = undefined;
      if (this.cursorX > 0) {
        this.vt100('\r\n');
      }
      this.vt100('Session closed.');
    }
    this.showReconnect(true);
    if (this.replayOnSession) {
      this.messageReplay('session', 'closed');
    }
  } catch (e) {
  }
};

ShellInABox.prototype.reconnect = function() {
  this.showReconnect(false);
  if (!this.session) {
    if (document.location.hash != '') {
      // A shellinaboxd daemon launched from a CGI only allows a single
      // session. In order to reconnect, we must reload the frame definition
      // and obtain a new port number. As this is a different origin, we
      // need to get enclosing page to help us.
      parent.location        = this.nextUrl;
    } else {
      if (this.url != this.nextUrl) {
        document.location.replace(this.nextUrl);
      } else {
        this.pendingKeys     = '';
        this.keysInFlight    = false;
        this.reset(true);
        this.sendRequest();
      }
    }
  }
  return false;
};

ShellInABox.prototype.sendRequest = function(request) {
  if (request == undefined) {
    request                  = new XMLHttpRequest();
  }
  request.open('POST', this.url + '?', true);
  request.timeout = 30000; // Don't leave POST pending forever: force 30s timeout to prevent HTTP Proxy thread hijack
  request.setRequestHeader('Cache-Control', 'no-cache');
  request.setRequestHeader('Content-Type',
                           'application/x-www-form-urlencoded; charset=utf-8');
  var content                = 'width=' + this.terminalWidth +
                               '&height=' + this.terminalHeight +
                               (this.session ? '&session=' +
                                encodeURIComponent(this.session) : '&rooturl='+
                                encodeURIComponent(this.rooturl));

  request.onreadystatechange = function(shellInABox) {
    return function() {
             try {
               return shellInABox.onReadyStateChange(request);
             } catch (e) {
               shellInABox.sessionClosed();
             }
           }
    }(this);
  request.send(content);
};

ShellInABox.prototype.onReadyStateChange = function(request) {
  if (request.readyState == 4 /* XHR_LOADED */) {
    if (request.status == 200) {
      this.connected = true;
      var response   = eval('(' + request.responseText + ')');
      if (response.data) {
        if (this.replayOnOutput) {
          this.messageReplay('output', response.data);
        }
        this.vt100(response.data);
      }

      if (!response.session ||
          this.session && this.session != response.session) {
        this.sessionClosed();
      } else {
        if (this.replayOnSession && !this.session && response.session) {
          this.messageReplay('session', 'alive');
        }
        this.session = response.session;
        this.sendRequest(request);
      }
    } else if (request.status == 0) {
      // Time Out or other connection problems: retry after 1s to prevent release CPU before retry
      setTimeout(function(shellInABox) {
        return function() { 
          shellInABox.sendRequest();
        };
      }(this), 1000);
    } else {
      this.sessionClosed();
    }
  }
};

ShellInABox.prototype.sendKeys = function(keys) {
  if (!this.connected) {
    return;
  }
  if (this.keysInFlight || this.session == undefined) {
    this.pendingKeys          += keys;
  } else {
    this.keysInFlight          = true;
    keys                       = this.pendingKeys + keys;
    this.pendingKeys           = '';
    var request                = new XMLHttpRequest();
    request.open('POST', this.url + '?', true);
    request.setRequestHeader('Cache-Control', 'no-cache');
    request.setRequestHeader('Content-Type',
                           'application/x-www-form-urlencoded; charset=utf-8');
    var content                = 'width=' + this.terminalWidth +
                                 '&height=' + this.terminalHeight +
                                 '&session=' +encodeURIComponent(this.session)+
                                 '&keys=' + encodeURIComponent(keys);
    request.onreadystatechange = function(shellInABox) {
      return function() {
               try {
                 return shellInABox.keyPressReadyStateChange(request);
               } catch (e) {
               }
             }
      }(this);
    request.send(content);
  }
};

ShellInABox.prototype.keyPressReadyStateChange = function(request) {
  if (request.readyState == 4 /* XHR_LOADED */) {
    this.keysInFlight = false;
    if (this.pendingKeys) {
      this.sendKeys('');
    }
  }
};

ShellInABox.prototype.keysPressed = function(ch) {
  var hex = '0123456789ABCDEF';
  var s   = '';
  for (var i = 0; i < ch.length; i++) {
    var c = ch.charCodeAt(i);
    if (c < 128) {
      s += hex.charAt(c >> 4) + hex.charAt(c & 0xF);
    } else if (c < 0x800) {
      s += hex.charAt(0xC +  (c >> 10)       ) +
           hex.charAt(       (c >>  6) & 0xF ) +
           hex.charAt(0x8 + ((c >>  4) & 0x3)) +
           hex.charAt(        c        & 0xF );
    } else if (c < 0x10000) {
      s += 'E'                                 +
           hex.charAt(       (c >> 12)       ) +
           hex.charAt(0x8 + ((c >> 10) & 0x3)) +
           hex.charAt(       (c >>  6) & 0xF ) +
           hex.charAt(0x8 + ((c >>  4) & 0x3)) +
           hex.charAt(        c        & 0xF );
    } else if (c < 0x110000) {
      s += 'F'                                 +
           hex.charAt(       (c >> 18)       ) +
           hex.charAt(0x8 + ((c >> 16) & 0x3)) +
           hex.charAt(       (c >> 12) & 0xF ) +
           hex.charAt(0x8 + ((c >> 10) & 0x3)) +
           hex.charAt(       (c >>  6) & 0xF ) +
           hex.charAt(0x8 + ((c >>  4) & 0x3)) +
           hex.charAt(        c        & 0xF );
    }
  }
  this.sendKeys(s);
};

ShellInABox.prototype.resized = function(w, h) {
  // Do not send a resize request until we are fully initialized.
  if (this.session) {
    // sendKeys() always transmits the current terminal size. So, flush all
    // pending keys.
    this.sendKeys('');
  }
};

ShellInABox.prototype.toggleSSL = function() {
  if (document.location.hash != '') {
    if (this.nextUrl.match(/\?plain$/)) {
      this.nextUrl    = this.nextUrl.replace(/\?plain$/, '');
    } else {
      this.nextUrl    = this.nextUrl.replace(/[?#].*/, '') + '?plain';
    }
    if (!this.session) {
      parent.location = this.nextUrl;
    }
  } else {
    this.nextUrl      = this.nextUrl.match(/^https:/)
           ? this.nextUrl.replace(/^https:/, 'http:').replace(/\/*$/, '/plain')
           : this.nextUrl.replace(/^http/, 'https').replace(/\/*plain$/, '');
  }
  if (this.nextUrl.match(/^[:]*:\/\/[^/]*$/)) {
    this.nextUrl     += '/';
  }
  if (this.session && this.nextUrl != this.url) {
    alert('This change will take effect the next time you login.');
  }
};

ShellInABox.prototype.extendContextMenu = function(entries, actions) {
  // Modify the entries and actions in place, adding any locally defined
  // menu entries.
  var oldActions            = [ ];
  for (var i = 0; i < actions.length; i++) {
    oldActions[i]           = actions[i];
  }
  for (var node = entries.firstChild, i = 0, j = 0; node;
       node = node.nextSibling) {
    if (node.tagName == 'LI') {
      actions[i++]          = oldActions[j++];
      if (node.id == "endconfig") {
        node.id             = '';
        if (typeof serverSupportsSSL != 'undefined' && serverSupportsSSL &&
            !(typeof disableSSLMenu != 'undefined' && disableSSLMenu)) {
          // If the server supports both SSL and plain text connections,
          // provide a menu entry to switch between the two.
          var newNode       = document.createElement('li');
          var isSecure;
          if (document.location.hash != '') {
            isSecure        = !this.nextUrl.match(/\?plain$/);
          } else {
            isSecure        =  this.nextUrl.match(/^https:/);
          }
          newNode.innerHTML = (isSecure ? '&#10004; ' : '') + 'Secure';
          if (node.nextSibling) {
            entries.insertBefore(newNode, node.nextSibling);
          } else {
            entries.appendChild(newNode);
          }
          actions[i++]      = this.toggleSSL;
          node              = newNode;
        }
        node.id             = 'endconfig';
      }
    }
  }

};

ShellInABox.prototype.messageInit = function() {

  // Test if server option for iframe message passing was set.
  if (!serverMessagesOrigin) {
    return;
  }

  // Test for browser support of this feature. JSON class functionality is
  // also needed because some older IE browsers, support only string passing
  // and we don't want to use unsafe eval() function in this case.
  if (!window.postMessage || !window.JSON ||
      !window.JSON.parse  || !window.JSON.stringify) {
    return;
  }

  // Install event listener.
  if (window.addEventListener) {
    window.addEventListener('message', function(shellInABox) {
      return function(message) {
        shellInABox.messageReceive(message);
      }
    }(this), false);
  } else {
    // For IE8
    if (window.attachEvent) {
      window.attachEvent('onmessage', function(shellInABox) {
        return function(message) {
          shellInABox.messageReceive(message);
        }
      }(this));
    }
  }

  // After message mechanisms are in place "ready" message is sent to parent
  // window.
  parent.postMessage(JSON.stringify({type : 'ready', data : ''}), '*');
};

ShellInABox.prototype.messageReceive = function (message) {

  // Check for message origin if needed.
  if (serverMessagesOrigin !== "*") {
    if (serverMessagesOrigin !== message.origin) {
      return;
    }
  }

  // Remember replay information.
  if (!this.replaySource || !this.replayOrigin) {
    this.replaySource   = message.source;
    this.replayOrigin   = message.origin;
  }

  // Handle received message.
  var decoded           = JSON.parse(message.data);
  switch (decoded.type) {
  case 'input'  :
    // Input received data to terminal.
    this.keysPressed(decoded.data);
    break;
  case 'output' :
    // Enable, disable or toggle passing terminal output to parent window.
    switch (decoded.data) {
    case 'enable'  : this.replayOnOutput = true;                 break;
    case 'disable' : this.replayOnOutput = false;                break;
    case 'toggle'  : this.replayOnOutput = !this.replayOnOutput; break;
    }
    break;
  case 'session':
    // Replay with session status.
    this.messageReplay('session', this.session ? 'alive' : 'closed');
    break;
  case 'onsessionchange':
    // Enable, disable or toggle passing session status to parent window.
    switch (decoded.data) {
    case 'enable'  : this.replayOnSession = true;                  break;
    case 'disable' : this.replayOnSession = false;                 break;
    case 'toggle'  : this.replayOnSession = !this.replayOnSession; break;
    }
    break;
  case 'reconnect':
    this.reconnect();
    break;
  }
};

ShellInABox.prototype.messageReplay = function(type, data) {
  if (this.replaySource && this.replayOrigin) {
    var encoded = JSON.stringify({ type : type, data : data });
    this.replaySource.postMessage(encoded, this.replayOrigin);
  }
};

ShellInABox.prototype.about = function() {
  alert("Shell In A Box " + "2.20 " +
        "\n\n" +
        "Copyright 2008-2015 by Markus Gutschke. For more information visit\n" +
        "http://shellinabox.com or http://github.com/shellinabox/." +
        (typeof serverSupportsSSL != 'undefined' && serverSupportsSSL ?
         "\n\n" +
         "This product includes software developed by the OpenSSL Project for\n" +
         "use in the OpenSSL Toolkit. (http://www.openssl.org/)" +
         "\n\n" +
         "This product includes cryptographic software written by Eric Young\n" +
         "(eay@cryptsoft.com)" :
         ""));
};

/* vim: set filetype=javascript : */
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xml:lang="en" lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <!--
    ShellInABox - Make command line applications available as AJAX web applications
    Copyright (C) 2008-2010 Markus Gutschke markus@shellinabox.com

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License version 2 as
    published by the Free Software Foundation.

    This program 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 General Public License for more details.

    You should have received a copy of the GNU General Public License along
    with this program; if not, write to the Free Software Foundation, Inc.,
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

    In addition to these license terms, the author grants the following
    additional rights:

    If you modify this program, or any covered work, by linking or
    combining it with the OpenSSL project's OpenSSL library (or a
    modified version of that library), containing parts covered by the
    terms of the OpenSSL or SSLeay licenses, the author
    grants you additional permission to convey the resulting work.
    Corresponding Source for a non-source form of such a combination
    shall include the source code for the parts of OpenSSL used as well
    as that of the covered work.

    You may at your option choose to remove this additional permission from
    the work, or from any part of it.

    It is possible to build this program in a way that it loads OpenSSL
    libraries at run-time. If doing so, the following notices are required
    by the OpenSSL and SSLeay licenses:

    This product includes software developed by the OpenSSL Project
    for use in the OpenSSL Toolkit. (http://www.openssl.org/)

    This product includes cryptographic software written by Eric Young
    (eay@cryptsoft.com)

    The most up-to-date version of this program is always available from
    http://shellinabox.com
    -->
    <title>Shell In A Box</title>
    <script type="text/javascript"><!--
      // Check that our URL is well-formed. Redirect to HTTPS if necessary
      (function() {
        var hasSSL = %s;
        var path   = document.location.pathname;
        var proto  = (hasSSL || (document.location.protocol == 'https:'))
                     ? 'https:' : 'http:';
        if (path.match(/plain/)) {
          proto   = 'http:';
        }
        path      = path.replace(/\/+/, '/').replace(/\/$/, '');
        if (!path.match(/(?:\/|\/plain)$/)) {
          path   += '/';
        }
        var url   = proto + '//' + document.location.host + path;
        if (document.location.search != '' &&
            document.location.search != '?') {
          url    += document.location.search;
        }
        if (document.location.hash != '' &&
            document.location.hash != '#') {
          url    += document.location.hash;
        }
        if (url != document.location.href) {
          document.location.replace(url);
        }
      })();
    --></script>
    <link rel="stylesheet" href="styles.css" type="text/css">
    <style type="text/css">
      body {
        margin: 0px;
      }
    </style>
    <script type="text/javascript"><!--
      (function() {
        // We would like to hide overflowing lines as this can lead to
        // visually jarring results if the browser substitutes oversized
        // Unicode characters from different fonts. Unfortunately, a bug
        // in Firefox prevents it from allowing multi-line text
        // selections whenever we change the "overflow" style. So, only
        // do so for non-Netscape browsers.
        if (typeof navigator.appName == 'undefined' ||
            navigator.appName != 'Netscape') {
          document.write('<style type="text/css">' +
                         '#vt100 #console div, #vt100 #alt_console div {' +
                         '  overflow: hidden;' +
                         '}' +
                         '</style>');
        }
      })();

      // User warning on window close
      window.onbeforeunload = function(e) {
        if (typeof window.shellinabox.session != "undefined") {
          return "Are you sure you want to leave this page?";
        }
        // Don't use explicit return
      }

    --></script>
    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
    <script type="text/javascript" src="ShellInABox.js"></script>
  </head>
  <!-- Load ShellInABox from a timer as Konqueror sometimes fails to
       correctly deal with the enclosing frameset (if any), if we do not
       do this
   -->
  <body onload="setTimeout('window.shellinabox = new ShellInABox()', 100)"
        scroll="no"><noscript>JavaScript
    must be enabled for ShellInABox</noscript></body>
</html>
/* Set styles used when opening the printer window */
#print {
  margin: 0.5ex 0px 0px 0px;
}

#options, #spacer {
  font-family:      sans;
  font-size:        smaller;
  position:         fixed;
  top:              0px;
  left:             0px;
  right:            0px;
  background-color: #EEEEEE;
  border-style:     solid;
  border-top:       0px solid black;
  border-left:      0px solid black;
  border-right:     0px solid black;
  border-bottom:    1px solid black;
}

#spacer {
  position:   static;
  visibility: hidden;
}

@media print {
  body {
    margin: 0px;
  }

  #print {
    margin: 0px;
  }

  #print .pagebreak {
    page-break-before: always;
  }

  #print .pagebreak hr, #options {
    display: none;
  }
}
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body><pre class="box"><div
  ><i id="27">Esc</i><i id="112">F1</i><i id="113">F2</i><i id="114">F3</i
  ><i id="115">F4</i><i id="116">F5</i><i id="117">F6</i><i id="118">F7</i
  ><i id="119">F8</i><i id="120">F9</i><i id="121">F10</i><i id="122">F11</i
  ><i id="123">F12</i><br
  /><b><span class="unshifted">`</span><span class="shifted">~</span></b
    ><b><span class="unshifted">1</span><span class="shifted">!</span></b
    ><b><span class="unshifted">2</span><span class="shifted">@</span></b
    ><b><span class="unshifted">3</span><span class="shifted">#</span></b
    ><b><span class="unshifted">4</span><span class="shifted">&#36;</span></b
    ><b><span class="unshifted">5</span><span class="shifted">&#37;</span></b
    ><b><span class="unshifted">6</span><span class="shifted">^</span></b
    ><b><span class="unshifted">7</span><span class="shifted">&amp;</span></b
    ><b><span class="unshifted">8</span><span class="shifted">*</span></b
    ><b><span class="unshifted">9</span><span class="shifted">(</span></b
    ><b><span class="unshifted">0</span><span class="shifted">)</span></b
    ><b><span class="unshifted">-</span><span class="shifted">_</span></b
    ><b><span class="unshifted">=</span><span class="shifted">+</span></b
    ><i id="8">&nbsp;&larr;&nbsp;</i
    ><br
  /><i id="9">Tab</i
    ><b>Q</b><b>W</b><b>E</b><b>R</b><b>T</b><b>Y</b><b>U</b><b>I</b><b>O</b
    ><b>P</b
    ><b><span class="unshifted">[</span><span class="shifted">{</span></b
    ><b><span class="unshifted">]</span><span class="shifted">}</span></b
    ><b><span class="unshifted">&#92;</span><span class="shifted">|</span></b
    ><br
  /><u>Tab&nbsp;&nbsp;</u
    ><b>A</b><b>S</b><b>D</b><b>F</b><b>G</b><b>H</b><b>J</b><b>K</b><b>L</b
    ><b><span class="unshifted">;</span><span class="shifted">:</span></b
    ><b><span class="unshifted">&#39;</span><span class="shifted">"</span></b
    ><i id="13">Enter</i
    ><br
  /><u>&nbsp;&nbsp;</u
    ><i id="16">Shift</i
    ><b>Z</b><b>X</b><b>C</b><b>V</b><b>B</b><b>N</b><b>M</b
    ><b><span class="unshifted">,</span><span class="shifted">&lt;</span></b
    ><b><span class="unshifted">.</span><span class="shifted">&gt;</span></b
    ><b><span class="unshifted">/</span><span class="shifted">?</span></b
    ><i id="16">Shift</i
    ><br
  /><u>XXX</u
    ><i id="17">Ctrl</i
    ><i id="18">Alt</i
    ><i style="width: 25ex">&nbsp</i
  ></div
  >&nbsp;&nbsp;&nbsp;<div
    ><i id="45">Ins</i><i id="46">Del</i><i id="36">Home</i><i id="35">End</i
    ><br
    /><u>&nbsp;</u><br
    /><u>&nbsp;</u><br
    /><u>Ins</u><s>&nbsp;</s><b id="38">&uarr;</b><s>&nbsp;</s><u>&nbsp;</u
      ><b id="33">&uArr;</b><br
    /><u>Ins</u><b id="37">&larr;</b><b id="40">&darr;</b
      ><b id="39">&rarr;</b><u>&nbsp;</u><b id="34">&dArr;</b
  ></div
></pre></body></html>
�PNG


IHDR()��gAMA���a	pHYs���o�dtEXtSoftwarepaint.net 4.0.5e�2e�IDATHKŖ�N#A������E��9#0��DA!�� �M��
5�ٶ-VZ�����]S]�w�_�	�����HB��?�"///c������u!)((HQ�y�?�Gqq����)FFF��<���FettTm�p8e��l1�Iۢ
��ᥑ9���x\JKK��r+,,�����ޖ�����|||��֖�	033#ooo���/���288(j;<<l|yy�����D�^������1��������쵴�$


����g�ijj�����	��766Jkk�<<<�o}}��𿾾V򵵵:������sYYY���j����������͍�6f/*dq��X���x������ s`c��n��������*�����T[MM�)A#��Y	r8ₓ�� ������L,Z\\�9��%Z[[�������CQ���MiooW[OO�ffoo/�c}2��6��yyy9��2� �E,�c��lh
cl�sm���j{��Y�c#����ҵ����dN8>>�sNACtrr2��L�RVk���

J��ö���62�
P%���
4	��D.A+**Th	GN����%�B��y���S5i���۫~Hᛶ�43����s�
��ml��h�'���qbknn���i�єdA˜�ĵ&!F�$��mmm��ҢeBcd)�� 5==�ᾣYXK������%�0b5�!n
��h9$��-�u,d�;��'zrm�tm�eN,��,vݸ��vyy������+dwwW�hy"\�ܓ\�.\���#���bs.s��ǝh��&
 ��A�Q2���8)�e�S�\sss�����C�̭@\R.r�:�:1C�3�n�l�'�
�f)9͇
�SSSJ�͜;F�X	�iSVV�A:��t1�v7�����9
FlH#!˔����J�>���=`��~
�%c~vvز���;#���O���c����x-�)�U�IEND�B`�  �( @	



  !  "  #!!$"&#%"$##%$$'%%(&&('')(()-(+)*-+,.--/..1//200311322433644755866977988:99;::=;@>:;><<?==@>>@?C?A?A@@BAGEABECCFDDGEEHFKIDFIGGIHLHJHKIJLJJLPKNLRPLMPNROQORPPSQRUSTVUUXVVYWX[Y^[]Z\[[^\a_Z\_]^a__b``caadbbecceddfeehfgihgjhmkfjmkknllommpnnqoqsrrussvttwu{wyvywwzxy{zz}{�~y{~|}�~~�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.;ROOOOVRhkww|�������������&?D?76=RYhs|�����������������161.-?Pamw|w����������������.."&>R^cgijnmz������ƽ�����$!6JYTVOOOOV`^w�����������0BODE;5113:?KXhw���������&6DD3,"(&5DTbs���������5;6*&1<Vhw��������&61&&&+1DRm}�������&1'
--7761&&-8L_w��������&*&6DTa_^SB5&0DRk��������!* &8Ul����z^H516Vm|������&'"6Xw�������`D16Pa�������$&4Vw������ťwP69Oh|�����
&&+?^�������ҽ�U59Ok������'"-Rr���ײ��׳~ODDWm������&&$(6^|���ƗhO��aD;I`w������
&+&&=_�����aFVRR=CVw�������
+/&->a|���ƔoRFEEGVm���������&&11D_���ʭ�k^TZet����������$155E[w����ǡ�|}�|����������/59?Vo�����²����������������)D>DRhw���������������������&6DKVbq���������ƿ����������1CPVZ^w��������Ƽ����������"=OX_iww�������������������/DS^^ks|�����������������1O^hkz�������������Ƚ���&)!7M]mww|����������������&0&&&4J\kz�������������������1D651DDV^mw�����������������
%8FHFCFKU[elsy������������GIF89a	�			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!�
�,	,�	���D��h�0�*t�A
Tha@;<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xml:lang="en" lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <!--
    ShellInABox - Make command line applications available as AJAX web applications
    Copyright (C) 2008-2009 Markus Gutschke markus@shellinabox.com

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License version 2 as
    published by the Free Software Foundation.

    This program 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 General Public License for more details.

    You should have received a copy of the GNU General Public License along
    with this program; if not, write to the Free Software Foundation, Inc.,
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

    In addition to these license terms, the author grants the following
    additional rights:

    If you modify this program, or any covered work, by linking or
    combining it with the OpenSSL project's OpenSSL library (or a
    modified version of that library), containing parts covered by the
    terms of the OpenSSL or SSLeay licenses, the author
    grants you additional permission to convey the resulting work.
    Corresponding Source for a non-source form of such a combination
    shall include the source code for the parts of OpenSSL used as well
    as that of the covered work.

    You may at your option choose to remove this additional permission from
    the work, or from any part of it.

    It is possible to build this program in a way that it loads OpenSSL
    libraries at run-time. If doing so, the following notices are required
    by the OpenSSL and SSLeay licenses:

    This product includes software developed by the OpenSSL Project
    for use in the OpenSSL Toolkit. (http://www.openssl.org/)

    This product includes cryptographic software written by Eric Young
    (eay@cryptsoft.com)

    The most up-to-date version of this program is always available from
    http://shellinabox.com
    -->
    <title>Shell In A Box</title>
    <script type="text/javascript"><!--
    (function() {
      var url   = document.location.protocol + '//' +
                  document.location.hostname + ':%d/';
      var head  = document.getElementsByTagName('head')[0];
      var link  = document.createElement('link');
      link.rel  = 'shortcut icon';
      link.type = 'image/x-icon';
      link.href = url + 'favicon.ico';
      head.appendChild(link);
      var query = document.location.search.split('&');
      for (var i = 0; i < query.length; i++) {
        if (query[i] == 'plain') {
          url  += '/plain';
          break;
        }
      }
      document.write('<frameset cols="*">\n' +
                       '<frame src="' + url + '#' +
                          encodeURIComponent(document.location.href) +
                          ',%s' + '">\n' +
                     '</frameset>');
    })();
    --></script>
  </head>
</html>
RIFFDWAVEfmt @@data �Ž�­:E;E<��úˆ5E>=Uȹź�IA;F3~ʻ�æ5H8H5����}5E><\̷ȷ�T?=E4�ʺ��<E:E:�����t4E=?Qƹƹ�M@<F4yʻ�ª8F:D=��ùˁ5D>=Yʷȷ�X==E4�ʻ�ã4I7H6��º�y4E=?Nĺź�R>>D5�˺��9F:F;��ù̆5D>=VǺŻ�JA<F4~ʻ�§5H7H5��º�}5D><]̶ȷ�T>=E5�˺��<E:E:��»�t4E=?Qƹƹ�M@<F4zʻ�©8F:D=��ùˁ5D>=Xʷȷ�Y=>E4�ʻ�â4I7H6��º�x4E=?Nĺź�R>=D5�˺��9F:F;��ùˆ5D>=VǹŻ�JA<F4~ʻ�§5H8H5��º�}5E><]˶ȷ�T>=E4�˺��<E:E:��»�t4E=?Qƹƺ�M@<F4yʻ�©8F:E>��ùˁ5D>=Xʷȷ�X==E4�˻�â4I8H6��º�y4E=?Nĺź�Q>>D5�˺��9F9E;��ù̅5D>=VǹŻ�JA<F4~ʻ�§5H7H5��º�}5D><]̷ȷ�T>=E4�˺��<E:E:��»�t5E=?Qƹƺ�M@<F4yʻ�ª8F:D>��ùˁ5D>=Xʷȷ�X=>E4�ʻ�â4H7H6��º�y4E<?Nĺź�Q>=D5�˺��9F:F;��ùˆ5D>=VǹŻ�JA<F3~ʻ�§5H7H5��º�}5D><]˷ȷ�T>=E4�˺��;E:F:��º�t5E=?Qƹź�M@<F4yʻ�ª8F:E=��Ĺ́5D>=YʷǷ�Y=>D5�˺�ã3I7H6��ú�x5D=?NûĻ�S<@@=application/octet-streamfn = malloc(s_size + 1)/dev/nullbuf = malloc(dataLen)path = malloc(s_size + 1)text/html; charset=utf-8txttext/plain; charset=utf-8jpgimage/jpegmp3audio/mpegauaudio/basicmidaudio/midiCheck failed at shellinabox/externalfile.c:%d in %s(): %sHTTP/1.1 200 OK
Content-Type: %s
Content-Length: %d

response = realloc(response, respLen + dataLen + 1)state = malloc(sizeof(struct ExternalFileState))text/javascript; charset=utf-8externalFileHttpHandlerregisterExternalFiles
Login timed out after 60 seconds.Check failed at shellinabox/launcher.c:%d in %s(): %s!getpwuid_r(uid, &pwbuf, buf, len, &pw) && pwpasswd = calloc(sizeof(struct passwd) + strlen(pw->pw_name) + strlen(pw->pw_passwd) + strlen(pw->pw_gecos) + strlen(pw->pw_dir) + strlen(pw->pw_shell) + 5, 1)oldStdin > 2 && oldStdout > 2 && oldStderr > 2!setresgid(r_gid, e_gid, s_gid)!setresuid(r_uid, e_uid, s_uid)cmsg->cmsg_level == SOL_SOCKET[server] Child pid for termination not valid![server] Child %d termination request failed!!strncmp(ptyPath, "/dev/pts", 8) || !strncmp(ptyPath, "/dev/pty", 8) || !strncmp(ptyPath, "/dev/tty", 8)utmp = malloc(sizeof(struct Utmp))!fcntl(*pty, F_SETFL, O_NONBLOCK | O_RDWR)!sigaction(SIGCHLD, &sa, NULL)[server] Failed to read launch request![server] Child %d exited with exit code %d.[server] Terminating child %d! [HUP][server] Terminating child %d failed! [%s]url = calloc(request.urlLength + 1, 1)environment = malloc(2*sizeof(char *))environment[0] = strdup("TERM=xterm")environment = realloc(environment, (numEnvVars + 1)*sizeof(char *))!sigaction(SIGALRM, &sa, NULL)prompt = stringPrintf(NULL, "%s login: ", hostname)cmdline = realloc(cmdline, strlen(cmdline) + strlen(fqdn) - strlen("localhost") + 1)pam_start("shellinabox", NULL, &conv, &pam) == PAM_SUCCESSpam_get_item(pam, PAM_USER_PROMPT, (void *)&origPrompt) == PAM_SUCCESSprompt = stringPrintf(NULL, "%s %s", hostname, origPrompt ? origPrompt : "login: ")pam_set_item(pam, PAM_USER_PROMPT, prompt) == PAM_SUCCESSpam_set_item(pam, PAM_USER, NULL) == PAM_SUCCESS
Maximum number of tries exceeded (3)pam_set_item(pam, PAM_USER_PROMPT, "login: ") == PAM_SUCCESSpam_get_item(pam, PAM_USER, (void *)&name) == PAM_SUCCESSservice->user = strdup(pw->pw_name)pam_start("shellinabox", service->user, &conv, &pam) == PAM_SUCCESSpam_set_item(pam, PAM_TTY, (const void **)utmp->utmpx.ut_line) == PAM_SUCCESSgroups = malloc((ngroups + 1) * sizeof(gid_t))getgrouplist(service->user, pw->pw_gid, groups, &ngroups) >= 0*environment = realloc(*environment, (numEnvVars + 6)*sizeof(char *))PATH=/usr/local/bin:/usr/bin:/bin:/usr/games(*environment)[numEnvVars++] = strdup( "PATH=/usr/local/bin:/usr/bin:/bin:/usr/games")[server] Unable to open PAM session!
!setresgid(service->gid, service->gid, service->gid)!setresuid(service->uid, service->uid, service->uid)service->cwd = strdup(pw->pw_dir)service->cwd = realloc((char *)service->cwd, 2)No directory, logging in with HOME=/environment[i] = strdup("HOME=/")vars = newHashMap(destroyVariableHashEntry, NULL)value = strdup(service->group)cmdline = strdup(service->cmdline)cmdline = realloc(cmdline, (end - cmdline) + strlen(end) + incr + 1)environment = realloc(environment, (numEnvVars + 2)*sizeof(char *))argv = realloc(argv, (argc + 1)*sizeof(char *))argv[0] = realloc(argv[0], len + 2)!socketpair(AF_UNIX, SOCK_STREAM, 0, pair)!getresuid(&restricted, &tmp, &tmp)[server] Launcher fork() failed!buf = malloc(len)/var/log/wtmpnullFd > 2dup2(nullFd, 0) == 0dup2(fds[1], 1) == 1dup2(fds[1], 2) == 2dup2(0, 1) == 1dup2(0, 2) == 2dup2(oldStderr, 2) == 2dup2(oldStdout, 1) == 1dup2(oldStdin, 0) == 0!gettimeofday(&tv, NULL)u = strdup(url)u = realloc(u, strlen(u) + 4)\"'`${};() 
	request = calloc(len, 1)bytes == sizeof(pid)session->pid = pidcmsgcmsg->cmsg_type == SCM_RIGHTS%s%s%s, %s/dev/pts/dev/pty/dev/ttySHELLINABOX/proc/self/fd!closedir(dir)!close(nullFd)path = malloc(length)TZ/bin/sh[server] Failed to read URL!request.service >= 0request.service < numServicesTERM=xtermCOLUMNS=%dLINES=%d%s=%sSHELLINABOX_URL=%sSHELLINABOX_PEERNAME=%sSHELLINABOX_REALIP=%slocalhost!uname(&uts)fqdn = strdup(hostname)hostname = strdup(hostname)%s login: line = calloc(1, lineLength)nobodynogroupshellinabox%s %s
Login incorrectservice->uid < 0service->gid < 0!service->user!service->groupservice->uid >= 0service->gid >= 0!service->cmdline
Access denied!ngroups >= 0HOME=%sSHELL=%sLOGNAME=%sUSER=%s!sigaction(SIGHUP, &sa, NULL)!service->useLogin!service->cwd!chdir("/")HOME=HOME=/-h-p/usr/bin/loginkey = strdup(*e)value = strdup("")key = malloc(ptr - *e + 1)value = strdup(ptr + 1)gidkey = strdup("gid")key = strdup("group")peerkey = strdup("peer")value = strdup(peerName)realipkey = strdup("realip")value = strdup(realIP)uidkey = strdup("uid")key = strdup("url")argv = malloc(sizeof(char *))*e = realloc(*e, s_size + 1)argccmd = strdup(argv[0])[server] Child %d launchedforkpty() failed
HZexecServicegetPWEntread_stringinternalLoginchildProcessforkPtylauncherDaemonforkLaunchercloseAllFdsdestroyUtmpnewUtmpinitUtmpterminateChild0123456789ABCDEFlaunchChildx_pututxlineuser = malloc(32)user = strdup(pw->pw_name)*name = strdup(arg)group = malloc(32)group = strdup(gr->gr_name)buf = malloc(gr_len)buf = realloc(buf, pw_len)temp = realloc (buf, gr_len)!getresgid(&rg, &eg, &sg)!getresuid(&ru, &eu, &su)!setresgid(rg, rg, rg)!setresgid(ng, ng, ng)!getresuid(&r, &e, &g)!setresuid(r, r, -1)!setresuid(n, n, -1)!getresuid(&r, &e, &s)!setresuid(r, r, r)!setresuid(n, n, n)Check failed at shellinabox/privileges.c:%d in %s(): %s[server] Cannot look up user id "%s"![server] Substituting "nobody"'s primary group for "nogroup"[server] Cannot look up group "%s"! [buffer limit reached][server] Cannot look up group "%s"[server] Only privileged users can change their group membership![server] Only privileged users can change their user id!!setresuid(runAsUser, runAsUser, -1)parseGroupArggetGroupIdgetGroupNameparseUserArggetUserIdgetUserNamedropPrivilegesremoveGroupPrivilegeslowerPrivilegesservices = realloc(services, ++numServices * sizeof(struct Service *))Check failed at shellinabox/service.c:%d in %s(): %s[config] Syntax error in service description "%s"!service->path = malloc(ptr - arg + 2)[config] Must be "root" to invoke LOGIN service!service->user = strdup("root")service->group = strdup("root")service->cmdline = strdup( "/bin/login -p -h ${peer}")[config] Invalid hostname "%s" in service definition![config] Invalid port "%s" in service definition!ssh -a -e none -i /dev/null -x -oChallengeResponseAuthentication=no -oCheckHostIP=no -oClearAllForwardings=yes -oCompression=no -oControlMaster=no -oGSSAPIAuthentication=no -oHostbasedAuthentication=no -oIdentitiesOnly=yes -oKbdInteractiveAuthentication=yes -oPasswordAuthentication=yes -oPreferredAuthentications=keyboard-interactive,password -oPubkeyAuthentication=no -oStrictHostKeyChecking=no -oTunnel=no -oUserKnownHostsFile=/dev/null -oVerifyHostKeyDNS=no -oProxyCommand=none  -oLogLevel=FATAL -p%s %%s@%s[config] Working directories must have absolute paths!service->cmdline = strdup(arg)service = malloc(sizeof(struct Service))desc = strdup(arg)rootservice->cwd = strdup("/")/bin/login -p -h ${peer}SSH:host = strdup("localhost")22sshPort = strdup("22")host = strdup(ptr)host = malloc(size)sshPort = strdup(tmp + 1)AUTHHOMEservice->cwd = strdup(arg)SHELL!services!numServicesenumerateServicesHelperenumerateServicesnewServiceinitServiceg = malloc(sizeof(struct Graveyard))Check failed at shellinabox/session.c:%d in %s(): %ssession->peerName = strdup(peerName)session = malloc(sizeof(struct Session))NOINTR(read(fd, buf, sizeof(buf))) == sizeof(buf)sessionKey = malloc((8*sizeof(buf) + 5)/6 + 1)!sessions || !getFromHashMap(sessions, sessionKey)(fd = NOINTR(open("/dev/urandom", O_RDONLY))) >= 0ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-/[server] Failed to find session: %ssessionKey = cgiSessionKey ? strdup(cgiSessionKey) : newSessionKey()[server] Creating a new session: %s/dev/urandomfindSessionnewSessionKeynewSessioninitSessionaddToGraveyard[config] Incomplete user CSS definition: "%s"!userCSS->label = malloc(6*(colon - arg) + 1)Check failed at shellinabox/usercss.c:%d in %s(): %sfilename = malloc(filenameLen + 1)[config] Only one default active style allowed per group![config] Must indicate with '+' or '-' whether the style option is active by default![config] Cannot access style sheet "%s"!*style = malloc(st.st_size + 1)fread(*style, st.st_size, 1, fp) == 1userCSS->next = malloc(sizeof(struct UserCSS))userCSS = malloc(sizeof(struct UserCSS)),;fp = fdopen(fd, "r")/* DEFINES_def = malloc(e - *style - 2), [ [ '%s', %s, %s ]%s ]newUserCSSreadStylesheetinitUserCSS[server] Aborting...len < (1 << 20)level >= MSG_QUIET && level <= MSG_DEBUGCheck failed at logging/logging.c:%d in %s(): %sbuf = realloc(buf, offset + len)buf = realloc(buf, offset + p + 1)vsnprintf(buf + offset, p + 1, fmt, aq) == pvStringPrintflogSetLogLevelhashmap = malloc(sizeof(struct HashMap))Check failed at libhttp/hashmap.c:%d in %s(): %snewMap.entries = calloc(sizeof(void *), newMap.mapSize)hashmap->entries[idx] = realloc(hashmap->entries[idx], (i+2)*sizeof(*hashmap->entries[idx]))--hashmap->numEntries >= 0deleteFromHashMapaddToHashMapnewHashMapret = strdup("localhost")ret = strdup(host)*headerLength >= 0strstr(fmt, "\r\n")!ERR_peek_error()headerstrchr(id, ':')rc != HTTP_SUSPENDrc != HTTP_PARTIAL_REPLYconnectioncloseHTTP/1.1ltime = localtime(&t)[%d/%b/%Y:%H:%M:%S %z]!http->private???len >= 0eol[-1] == '\r'eol - line > 11HTTP/1.!memcmp(line, "HTTP/1.", 7)ptr > line + 10ch == ' ' || ch == '\t'i > 1l == 2 || !isHeadaccept-encodinggzipmemchr(line, ':', eol - line)header = malloc(headerLength)compressed = malloc(len)len >= bodyOffset + 21.2.11content-length:content-encoding:Content-Length: %d
Content-Encoding: gzip
!http->msgOffset!http->isSuspendedhttp->state == HEADERSConnection: close
%d %sresponseWebSocket-Protocol: wssws[http] Handling "%s" "%s"content-lengthOPTIONSGETPOSTPUTDELETETRACECONNECTMethod Not AllowedMethod Not ImplementedupgradeWebSocketUpgradewebsocket-protocol:%ddiff!http->matchedPath!http->pathInfo!http->queryFile Not Foundtype >= 0 && type <= 0x7F%d%plen >= 0 && len < 0x60000000utf8 = malloc(utf8Len)j < utf8Lentype >= 0x80 && type <= 0xFFlen > 0 && len < 0x7FFFFFF0data = malloc(len + 6)!http->doneHeader too big!rc!http->expectinghttp->method = strdup("")http->path = strdup("")http->version = strdup("")!http->method!http->path*!http->versionHTTP/oldValuecolon < lineLengthhttp->key = malloc(colon + 1)offset >= 0http->websocketHandleroffset + len < bytesoffset + pushBack == bytespartial = malloc(pushBack)-offset < http->partialLength!http->partialx-real-iphttpshttps://http://Check failed at libhttp/httpconnection.c:%d in %s(): %sinet_ntop(peerAddr.sa_family, &((struct sockaddr_in *)&peerAddr)->sin_addr, host, sizeof(host))*header = realloc(*header, *headerLength + tmpLength + 2)strftime(timeBuf, sizeof(timeBuf), "[%d/%b/%Y:%H:%M:%S %z]", ltime)[http] %s - - %s "%s %s %s" %d %s[http] Accepted connection from %s:%dhttp = malloc(sizeof(struct HttpConnection))[http] Closing connection to %s:%d!close(http->fd) || errno != EBADFline[7] >= '0' && line[7] <= '9' && (line[8] == ' ' || line[8] == '\t')[http] Compressed response from %d to %dhttp->msg = realloc(http->msg, http->msgLength - http->msgOffset + max(http->msgOffset, headerLength))http->msg = realloc(http->msg, http->msgLength - http->msgOffset + max(http->msgOffset, len - bodyOffset))http->state == PAYLOAD || http->state == DISCARD_PAYLOAD[http] Closing previously suspended connection!<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xml:lang="en" lang="en">
<head>
<title>%s</title>
</head>
<body>
%s
</body>
</html>
HTTP/1.1 %d %s
%sContent-Type: text/html; charset=utf-8
Content-Length: %ld

HTTP/1.1 200 OK
Content-Length: 0
Allow: GET, POST, OPTIONS

HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: %s
WebSocket-Location: %s://%s%s%s
%s%s%s
[http] Switching to WebSocketshttp->matchedPath = malloc(diff - http->path + 1)http->pathInfo = malloc(endOfInfo - diff + 1)http->query = strdup(query + 1)[ssl] Connection shutdown due to client initiated renegotiation![http] Connection closed due to exceeded header size![ssl] Switching to SSL (replaying %d+%d bytes)...http->partial = realloc(http->partial, http->partialLength + len)[http] Non-SSL connections not allowed!!!http->partial == !!http->partialLengthhttp->method = malloc(firstSpace + 1)http->path = malloc(lastSpace - firstSpace)http->version = malloc(lineLength - lastSpace + 1)*oldValue = realloc(*oldValue, oldLength + lineLength + 1)value = malloc(lineLength - colon)[http] Dropping duplicate header "%s"-offset <= http->partialLengthhttp->partial = realloc(http->partial, pushBack)*(char **)&http->url = malloc(s_size + 1)l��l��hl���l���k��������h�����������httpGetURLhttpSendWebSocketBinaryMsghttpSendWebSocketTextMsghttpSendReplyhttpConsumePayloadhttpHandleCommandhttpHandleWebSockethttpParsePayloadhttpParseHeadershttpParseCommandhttpPromoteToSSLhttpReadhttpHandleConnectionhttpTransferPartialReplyhttpWriteaddHeaderremoveHeaderhttpTransferhttpShutdownhttpFinishCommandhttpSetStatedestroyHttpConnectiongetPeerNamenewHttpConnection�?���len > 0Good Byeserver->serverFd >= 0portMin > 0portMax < 65536portMax >= portMinsocklen == sizeof(serverAddr)[server] Shutting down server!connection->deletedclientFd >= 0--server->numConnections >= 0eventCount >= 0Check failed at libhttp/server.c:%d in %s(): %spayload->bytes = realloc(payload->bytes, payload->len + len)payload = malloc(sizeof(struct PayLoad))h = malloc(sizeof(struct HttpHandler))!setsockopt(server->serverFd, SOL_SOCKET, SO_REUSEADDR, &true, sizeof(true))[server] Failed to bind to unix socket! [%d: %s][server] Unable to change ownership on unix socket! [%d: %s][server] Unable to change permission on unix socket! [%d: %s]!listen(server->serverFd, SOMAXCONN)[server] Listening on unix domain socket %s...server->pollFds = malloc(sizeof(struct pollfd))[server] Failed to find any available port!!getsockname(server->serverFd, (struct sockaddr *)&serverAddr, &socklen)[server] Listening on port %d...server = malloc(sizeof(struct Server))server->connections = realloc(server->connections, ++server->numConnections* sizeof(struct ServerConnection))server->pollFds = realloc(server->pollFds, (server->numConnections + 1) * sizeof(struct pollfd))connection >= server->connectionsconnection < server->connections + server->numConnectionsfd == server->pollFds[idx + 1].fd!fcntl(clientFd, F_SETFL, O_RDWR | O_NONBLOCK)serverSetupSSLserverLoopserverConnectionSetEventsserverAddConnectioninitServernewCGIServerserverRegisterWebSocketHandlerserverRegisterStreamingHttpHandlerserverCollectFullPayloadserverCollectHandlerserverRegisterHttpHandlercontext = SSL_CTX_new(SSLv23_server_method())Check failed at libhttp/ssl.c:%d in %s(): %secKey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1)[ssl] Support for PFS enabled...ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:HIGH:MEDIUM:!RC4:!aNULL:!MD5SSL_CTX_set_cipher_list(context, "ECDHE-RSA-AES256-GCM-SHA384:" "ECDHE-RSA-AES128-GCM-SHA256:" "ECDHE-RSA-AES256-SHA384:" "ECDHE-RSA-AES128-SHA256:" "ECDHE-RSA-AES256-SHA:" "ECDHE-RSA-AES128-SHA:" "ECDHE-RSA-DES-CBC3-SHA:" "HIGH:MEDIUM:!RC4:!aNULL:!MD5")[ssl] Server context successfully initialized...[ssl] Auto-generating missing certificate "%s" for "%s"...[ssl] Failed to generate self-signed certificate "%s"!NOINTR(dup2(fd, STDERR_FILENO)) == STDERR_FILENONOINTR(dup2(fd, STDIN_FILENO)) == STDIN_FILENOsetenv("PATH", "/usr/bin:/usr/sbin", 1) == 0subject = stringPrintf(NULL, "/CN=%s/", serverName)NOINTR(waitpid(pid, &status, 0)) == pid[ssl] Certificate successfully generated.(marker = stringPrintf(NULL, "-----BEGIN %s-----",record))!=NULL(marker = stringPrintf(marker, "-----END %s-----",record))!=NULL(ret = malloc(maxSize)) != NULLssl = malloc(sizeof(struct SSLSupport))(buf = malloc(bufSize)) != NULL(newBuf = malloc(bufSize + inc)) != NULLx509 = d2i_X509(NULL, &c, certSize)[ssl] Received SNI callback for virtual host "%s" from "%s:%d"...serverName = malloc(strlen(name)+2)[ssl] Could not find matching certificate "%s" for "%s"SSL_set_SSL_CTX(sslHndl, context)defaultCertificate = strdup(filename)!gethostname(hostname, sizeof(hostname))[ssl] Error getting host information: "%s".[ssl] Cannot read valid certificate from "%s"! Check file permissions and file format.ssl->sniCertificatePattern = strdup(filename)SSL_CTX_set_tlsext_servername_callback(ssl->sslContext, sslSNICallback)SSL_CTX_set_tlsext_servername_arg(ssl->sslContext, ssl)proc = stringPrintf(NULL, "/proc/self/fd/%d", fd)buf = stringPrintf(NULL, "fd %d", fd)[ssl] Cannot read valid certificate from %s. Check file format.!sigprocmask(SIG_BLOCK, &set, NULL)!sigprocmask(SIG_UNBLOCK, &set, NULL)*sslHndl = SSL_new(ssl->sslContext)BIO_set_buffer_read_data(readBIO, (char *)buf, len)writeBIO = SSL_get_wbio(*sslHndl)readBIO = SSL_get_rbio(*sslHndl)[ssl] Removing stacked write BIO![ssl] Removing stacked socket BIO![ssl] Unexpected corruption of OpenSSL data structuresfd != -1NOINTR(close(fd)) == 0/usr/bin:/usr/sbinPATH/CN=%s/-days-nodes-x509reqopenssl-subj-out-keyoutrsa:2048-newkey7300-----BEGIN %s----------END %s-----count >= 0count <= 6out - ret <= maxSizefd >= 0len < bufSize - 1len < bufSizeCERTIFICATERSA PRIVATE KEYDSA PRIVATE KEYEC PRIVATE KEYssl->sniCertificatePattern!strchr(ptr+1, '%')ptr[1] == 's'/proc/self/fd/%dfd %dbuf = realloc(buf, len)i >= 0 && i < len!sigpending(&set)!*sslHndl[ssl] Freeing SSL handle.BIO_pop(readBIO) == writeBIO!sslGetNextBIO(readBIO)sockBIO = BIO_pop(readBIO)sockBIO == BIO_pop(writeBIO)!sslGetNextBIO(writeBIO)!sslGetNextBIO(sockBIO)sslFreeHndlsslPromoteToSSLsslUnblockSigPipesslBlockSigPipesslFdToFilenamesslPEMtoASN1sslSecureReadASCIIFileToMemsslSetCertificateFromFdsslGenerateCertificatesslMakeContextsslSNICallbacksslSetCertificatedestroySSLnewSSL[http] Malformed URL encoded data "%s"!Check failed at libhttp/url.c:%d in %s(): %s[http] Ignoring prologue before "multipart/form-data"![http] Ignoring epilogue past end of "multipart/form-data"![http] Missing final "boundary" for "multipart/form-data"![http] Missing "boundary" information for "multipart/form-data"!url = malloc(sizeof(struct URL))*(char **)&url->url = malloc(s_size + 1)s = malloc(len + 1)content-disposition:namename = strdup(name)url->querymultipart/form-databoundary--

--urlGetURLurlParseParturlMakeStringinitURLnewURLtrie = malloc(sizeof(struct Trie))Check failed at libhttp/trie.c:%d in %s(): %strie->children = malloc(sizeof(struct Trie))child = malloc(2*sizeof(struct Trie))child->key = malloc(trie->idx - i - 1)trie->children = realloc( trie->children, ++trie->numChildren*sizeof(struct Trie))trie->key = malloc(len)!trie->children[i].valueaddLeafToTrieaddToTriedestroyTrienewTrie;4��L��hY���`e�� 
`��PP����p����������������,�hP������������	Џ��T	����	���
��h
�����
 ���0���@���(`���D����`������������� ����L����`��������8
����t
�����
��
���
�������<0��������0����,P�`0�������p�<��X�t��p��������� ���0����\����p���������@���������@���`���,�L`�������������� ���0��p��$@��P���������� ������ �
��p ���`�����������@��$p��8���Tp
��p@������0������ ��@��`��,���@���T���h���|�������@��������� ���4 ��`�������������|@���`���������(���DP!��� #����$��0&��XP&��t�+���-���-��P0���00���P0���`0����0����0���0��$�0��@p?����?���`C��`K��l0N���pO���@R��p�w����w����w����w���w��x��(Px��H`x��\px��p�x����x���0z���@z���Pz�� `z�� |��t P|��� �|��� `}��!~��P!�~���!P����!����$"Ѕ��8"���d" ����"0����"@����"0����"�����"��(#@���\#���p#�����#�����#`���$����@$Г��T$��h$�|$����$ ����$P����$P���4%P����%�����% ����%@����%P����%����&�(&0���x&`����&����&����8'P����'`����'p����' ����'@����'p���H(����\(`����(�����(�����(@���<)����t)��) ����) ���L*й���*н���*@���(+����D+��`+�t+����+����+ ����+0����+@����+P����+`���,p���,��T,�h,0����,p����,����,���$-���\-���x-P���-���`.0���.zRx�x��/D$4 E��pFJw�?:*3$"\hQ��`t�x��E�O��x��8EAD(��x���A�A�D �
AAB��z��FE�W
De8��z���B�E�A �C(�G0-
(A ABBK4�}��ZE�|
OHP�}���B�B�B �B(�A0�A8�D��
8F0A(B BBBH0�(����B�A�A �D0R
 AABAL�����2F�B�E �E(�A0�A8�J�
8A0A(B BBBA\ t���$F�B�E �B(�A0�C8�Gp�
8A0A(B BBBG�xY�F�P�_pL�D���
A�A�G _
AAAe
DAEA
DAEA
IHE�����G��
AD�8[���F�I�J �I(�H0�F8�I�E�M�b�A�H4p����F�B�E �E(�D0�D8�G��
8A0A(B BBBGH����WF�E�B �E(�A0�A8�DP�
8F0A(B BBBJ������������E�O��� EAKL,����B�B�B �B(�A0�H8�L�
8A0A(B BBBA|Ȝ���G�~
AL�8���hF�B�B �B(�A0�A8�G�Z
8A0A(B BBBG(�X��� A�L�K`&
AAHL���
L,H��� F�B�B �B(�A0�A8�G��
8A0A(B BBBH8|���F�B�A �A(�D0�
(A ABBIH���'F�E�D �D(�Q���G�z�A�w
(A ABBJ8��iF�E�E �D(�H0�d
(A BBBA@���T���.E�S
HIt ���	L�����F�B�B �B(�A0�A8�G�y
8A0A(B BBBH,�����]A�C
B�J��G�H��
FD̰��(B�G�E �B(�A0�A8�G�
��
K�
x�
A�
8P���F�B�A �A(�D@n
(A ABBF����!H0�
C����ARm0�0��HF�I�A �Ip�
 AABA0�L���F�I�A �Ipt
 AABA0,����F�D�A �G0s
 AABG0`���HF�I�A �I`�
 AABAL����ZF�B�B �J(�A0�A8�G��
8A0A(B BBBA �����A�F0�
AH	,�dH0�
A$	��0H0y
G0@	���F�D�A �G0s
 AABGt	@�sR�A
A�	��2A�lH�	��lF�B�E �B(�A0�A8�JPQ
8D0A(B BBBG(�	��UE�I�D \
DAA(
�<
(�E�QX
,�l
(�pHa
E(�
x�wB�A�A �oAB(�
��tE�I�D ~
AAA�
 ��
,��E�a
A8��iF�E�D �I(�D0b
(D ABBA T��QJ�\
JWI�x�E�O��E�L��� ���<RU(�D��E�H�D@2
AAA`���N�E�E �A(�D0�I
(D JBBHD
(D BBBB\
(D BBBJ�$��0��(�(�$�rB�D�A �_AJL�x�F�E�B �B(�D0�D8�G��
8A0A(B BBBA(<
H���UE�I�D \
DAAh
|���3E�m�
�����
����E�Q8�
�����F�K�B �A(�A0�l(D DIB�
���#0���)A�c D����K��
K<�����K��
KX�����K��
K t`���E�J��
AH�\����K��
J����E�J������ ����,���8��� D���4@���H<���\H���pT���5TH������F�B�B �E(�A0�D8�D��
8A0A(B BBBB�����K��
A�x���(����WF�D�I �_
ABAL,�����^�B�D �D(�D0v(D� A�B�B�M0����N����|8��E�LL�<��wF�B�B �B(�A0�D8�D�+
8A0A(B BBBF\�l���S�B�B �B(�A0�A8�Dp�8A0A(B BBBB������Hp������0H���R�A�D qDAC��P ��|���HQH����/F�B�B �B(�A0�A8�DP8A0A(B BBB�t���p��E�O@t���B�D�D �G��
 AABED�M�P�A�DT����B�B�E �A(�D0�J�6
0A(A BBBJ8�H	���B�G�D �D(�D0S
(D ABBGH��
��yB�B�B �B(�A0�A8�D`�
8A0A(B BBBA$���A�UT@���/B�B�B �A(�A0�G�E
0A(A BBBD��I�H�A�4����E�F�I X
CAHDAAH����}F�E�E �E(�D0�I8�D@h
8D0A(B BBBAP(���O�B�A �A(�G0Z
(A� A�B�B�F@����H0����pd��E�L�h���t���p���|���x���t��E�W\x���F�B�B �B(�A0�A8�G��
8A0A(B BBBH��A�G�A�l�"��xHi
EL�,#��oF�B�E �B(�D0�D8�I��
8A0A(B BBBH\�L&���B�B�B �B(�D0�D8�IP�
8A0A(B BBBG�XG`OhIpPPL8�-���F�B�B �B(�A0�C8�G��
8A0A(B BBBA<�l0��4I�B�B �A(�A0��
(A BBBEp�l1���B�B�A �A(�G@�
(A EBBAH
(C ABBHm
(C ABBCY
(C ABBGP<�3��X%F�B�B �B(�A0�A8�G� I�!�
8A0A(B BBBB��X����X��	��X����X��	��X����X��<Hg
AKY��(�X��	<�X��PY��<dY��~R�B�B �A(�A0��
(A BBBJ�PZ��	�LZ��	�HZ��\�DZ���F�E�D �A(�G0�
(C ABBHp
(C ABBH`
(C ABBA@�[��3E�m,\�[��~F�I�D �A
FBAD�\���K�E�D �D(�L0v(A� A�B�B�Q0����D�P\���K�E�D �D(�L0w(A� A�B�B�X0����D�\���K�E�D �D(�L0o(A� A�B�B�P0����Ld�\���F�B�J �G(�D0�A8�J�|
8A0A(B BBBB8�`c��iF�E�E �D(�H0�d
(A BBBA��c��(�c��-E�A�G��
AAK0�d��E�LL�d��`�d��<t�d���F�E�E �D(�D0��
(A BBBA�@e��Q(��e��DF�D�D �[
AGG0��e��_N�A�D ^AAM��H ��(�e���<<�f��aF�B�E �D(�D0�p
(A BBBD|�h��L��h���F�B�B �B(�A0�A8�G�
8A0A(B BBBA(�Do��YF�D�C �e
ABExo��
 to��
4po��Hlo��	\ho��(pto��)A�A�D �
DAA`�xp���B�E�G �K(�D@�
(A ABBIHOPRXO`HhHpAxH�H�H�K@Ht���B�E�B �E(�D0�A8�G@�
8D0A(B BBBHL�v��+TV$d�v���J�k
�KAG�H��Xw��E�L�\w��
�Xw��BE�x��w��EE�^
AL��w��4B�B�E �B(�A0�A8�G�G
8A0A(B BBBKD�|��'A�Y
FFHd�|���F�B�B �B(�A0�D8�GPi
8C0A(B BBBCP�$���F�B�B �B(�A0�A8�G� L�#A
8A0A(B BBBDL `����F�B�B �E(�D0�A8�G�
8A0A(B BBBBT ����	h ���� | �����E�G�U
AF � D���E�G��
ADL� @���)F�E�E �D(�D0��
(A BBBEy
(A BBBH! ���	8(!����F�B�A �A(�G0
(A ABBCd!����E�O8�!Ċ��B�E�A �A(�D0X
(D ABBBH�!�����B�B�E �A(�G0�k
(D BBBJC(A EBB4"����:B�G�D �M
GEJFAB0@"���gF�D�M `AAG��F ��Ht"@���)B�B�B �H(�A0�A8�F@u
8A0A(B BBBKT�"$����J�B�H �E(�A0�D8�G@o
8A0A(B BBBB[������L#̍���B�E�B �B(�A0�C8�F�8
8A0A(B BBBILh#,����F�B�E �B(�D0�C8�N�
8A0A(B BBBF8�#ܒ��iF�E�D �I(�D0b
(D ABBA�#���qJ�X�$t���E�L,$x���@$t���	T$p���	h$l���	|$h����$d���	�$`���	�$\���	�$X���	<�$T���bR�B�B �A(�A0��
(A BBBD %����	,4%����5F�F�K �ZABd%����6(x%����WF�D�I �_
ABAH�%�B�B�B �B(�A0�A8�D@a
8A0A(B BBBG4�%�����O�D�C �X
�A�B�Op���(&<���E�L|D&@����F�B�H �B(�A0�D8�D`G
8A0A(B BBBLY
8A0A(B BBBEU
8A0A(B BBBAd�&P���jF�B�E �E(�A0�A8�G@�
8A0A(B BBBK�
8C0A(B BBBAD,'X���eF�E�E �E(�H0�H8�G@n8A0A(B BBBt'����@pp &&��X�q�u�%���ƽ(�������ͺѺ������������������c���q����h<
8�&&&&���o��X
.	x)&��)x#`	���o���ox"���o�o� ���o8('&�<�<�<�<�<�<== =0=@=P=`=p=�=�=�=�=�=�=�=�=>> >0>@>P>`>p>�>�>�>�>�>�>�>�>?? ?0?@?P?`?p?�?�?�?�?�?�?�?�?@@ @0@@@P@`@p@�@�@�@�@�@�@�@�@AA A0A@APA`ApA�A�A�A�A�A�A�A�ABB B0B@BPB`BpB�B�B�B�B�B�B�B�BCC C0C@CPC`CpC�C�C�C�C�C�C�C�CDD D0D@DPD`DpD�D�D�D�D�D�D�D�DEE E0E@EPE`EpE�E�E�E�E�E�E�E�EFF F0F@FPF`FpF�F�F�F�F�F�F�F�FGG G0G@GPG`GpG�G�G�G�G�G�G�G�GHH H0H@HPH`HpH�H�H�H�H�H�H�H�H������h��b
�c�ƽ��d!�f�g-�5�D�L�nT�md�l�pq�sy�t������q����u��ʽv��ҽ������������
GA$3h878UoUo
GA$3c878`U`U
GA$3s878`U`U
GA$3e878`U`UGA$3a1`o�oGA$3a1�o�o
GA$3p878�o�oGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFY�GA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFY�GA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFY�GA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFY�GA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFY�GA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3a1�o�oGA$3a1h<~<GA$3a18�@�GA$3a1�oIp
GA$3p878PpٍGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA$3h878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3c878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3s878`UUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3e878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA*`UUoGA!stack_realignGA*GA+stack_clashGA*cf_protectionGA+omit_frame_pointerGA*
GA*GOW*EGA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA$3p878��GA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA$3h878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3c878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3s878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3e878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3p878 �!�GA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA$3h878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3c878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3s878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3e878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3p8780���GA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA$3h878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3c878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3s878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3e878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3p878��@�GA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA$3h878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3c878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3s878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3e878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3p878@��GA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA$3h878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3c878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3s878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3e878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3p878�c�GA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA$3h878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3c878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3s878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3e878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3p878p��GA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA$3h878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3c878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3s878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3e878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3p878��GA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA$3h878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3c878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3s878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3e878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3p878�IjGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA$3h878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3c878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3s878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3e878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3p878Pj��GA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA$3h878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3c878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3s878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3e878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3p878�R�GA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA$3h878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3c878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3s878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3e878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3p878`�%�GA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA$3h878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3c878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3s878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3e878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3p8780���GA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA$3h878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3c878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3s878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3e878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3p878��5�GA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA$3h878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3c878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3s878UoUoGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA$3e878`U`UGA$gcc 8.3.1 20190507
GA*GOW*EGA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3a15�5�GA$3a15�5�GA$3a1~<�<GA$3a1@�E�shellinaboxd-2.20-5.el8.x86_64.debug.�U��7zXZ�ִF!t/��2
�]?�E�h=��ڊ�2N��\��8��)�b���>�pK�l�vA�<Q{%�*,����m�UI#j��A�(�uD��s�(�TP#
)����ܿ������8��%�K�”������<7|t��ݔdz��'$��6MsiV~R�T�����%��ނ�S���
�DŦM�S�%��b�aI��D:^\D4���k#7�-:'
�����d�ޑ'a�J���Ӣ�L~P�?�1uZ��\.��kn	��|R�u���cA�n������.�K�3`�l�|�/�0Zu)DĽ�mP�xG��SO8�_�(�vM$�<c�
rx���Ԫ����l�/�IM��=�+v�`��Y��>�Z)��l ��%�Ja�"��
��4V̕�5e�����t,1�'+=�-Źݮa�О�l�Z��,})�"M2� �(W��F5g�d���/�O�|�"�{��8���!��Y�ލ����Vm��?�d$�ǥT
H:���8y���C�Q�k�:�LS���e�� �L$<�pj��C%���r',-l��P����B:��쿃�Eʶ�6��(��B	�A:D�]_!�g��i��`�5	����8b��y������źe0ѳ<� d��I�
x��Ԕ��d���
m=�k�,$�������4*R�RXv��N_�E��QDz`�|y��'��6���Ԃ�Z���������+z�R�a������_�:�c�3(rVVJ@��P9�����w"TV�n�)Q��TY��K��eX!۸��\�5�k�4�r�m� p��z��*�Q��T׏���u�1Ą�$�x7aP�k	@���@!f%|`h�x)�_���SI0nnypI�KL�mPr�%�_�;K��iPS�F�QW?ƩH9%;��g��	#JL�tLS:0��u��
��+��z��z8�e�\NbM��٦.���/�}a{!:L���́�5��(bX�kU�W�W�oS�K�8����c�2�:ת����H�E�K�R�����2�}2���#y���KiZ��a�Д����J����9��[�]�宼��驁��$}����(������9�]�?g{�cr��y���Uq6?�
���-��� ���0j̝%��,s}j��U-
��.��w@��m%=;Ǚ��"�S�JGҮH�������ۀ�D�b�g��9��A��P��V��JTz���
�������	ᔟ�$��a�?&9	�K�"�	'���l�ji��Q0�O�]��ҹ4&�O�3����
p��ezG{�<���Ys���.�$)����4-β74�uX�����{����%,�\����U�Q�=z�cM���T{/Ռla
`N�~3�i�ؾ=�t�&��I6iڲ���v,�4���&T��:4
h���O_��c�Q}N��^�v�KXR�ŋ�T�v���ߊ?��`:�Ԍ\&�%ɢ;~��e��:1��.,�;"`��Z��I�uo]���nF��P��bt�yy��
�-�s~1
Jߐ�uUh�ne��Lj`���Qe��11\�_�8���o%��=�|�C��T�]�ϣ�p��m�zK>DN:���l��7��s[�<�o��12	 N��y�I���~z��4s۝ܗw��Ƒ�N��PԦ^�Q\A�-ỡ��X2,���0���-��7%$�E�<�h�?�k"��&P5#�^�}%LL���X ���
�v�E����|��K���$���*��BR���^����l|L�cwo�'��&(X"�t�|�*TM�I�6k�&�Cjm�]��G����s��ژ_:�!����E�3���r�+gD��]5����ƢZl�R�U�®a�	��v�Ul�_��{�fb�w5q��3���v����0�yS�������eN��r�ݥIϰ����"�L;��
�Ռ�ah�z�fb��`/�PwDL�I�P�Q��0%!��;/EݜW�6���uȂ�/[���U�Z�fΖ�n��q���ә�?
�οo���
��S|l�%b�H�_?�`c�.��<���e���� ��ME�U�a��Dj��D�
�t���ŷ����Z�3���*`0�=�<ۢ&wl�y�&���x�a��6��\�Ams[K�t��
�����|�-�#>�X*����F�ȓK�C�-�:i�ҹƨ]h��dyڴ}ݍ�d
�NBU�Z
\�eYXQG�ʌ	�Đ	�[����TX�Y�EscV���������Ke��d��^E�b�p��%((:�Q1_��p���Y^�p�'���������j��v�(�����V�E"�ձ{�tꢨ߭<��ߠ(�bl�!3���t'����V����6��Z�U��_��!{gĦ.�c�`��䂭<f��tf��#��|4�rG�0(80�<���>K�LA�Tz�vq���r�9M��j(ҰL�R�݇���Dg��t��(8~���[�g�1�
��Ju�?��*<�71
7�Y]������
w+,n���\~y��X��bүU�P���ІA��Q��)C��|Z�Sk<�V���1��]�Rw��}��&<�/w�DB�*e�'ɞ��6p*Yϊ�EY)+���wu��A�C�����ܡ¨��x�jz�W�)a�p�i�ɋ-��E��^0�(����>�����ٞ��z��e�*P`��Ͽd������I��P�8&�kz�!l��5��#��Z���)���;:��F�J����RMQ4nhcflm4��0r��X.�U�v�V&t�ֿYS/`��u���Ȫ�K#ڦ���Ph��l-p�V��sޡ����*L���v���g�S[�eN��D,�(-��/�ţ�:�@� ���M���s��I/���ƷI��p
M_5p�)���D줮�GA�ci��z�H���G����]k�T�ԟ@��\�盞�e0�s�!^�৴�Dz�b����B?�v�f�/`lFp�P5�
�=��	f��
XN�-ޡv�V	�����lz��4(P1L��Ҧ�7�l߀�݇AnI��,���6�Ҋh�&�ի�c����ec��oC�a�X��
k���"U��Zwpe������L���J;����G*4�.A]�`�Q�����|!_�T3���>�7}�������z��C`�2<<E����Z߈��גG��T���@w�)2��4��=nBX-ɻ�'(��N�N!r�z\���4wx芶��~��<ntHQ�x]A�W��,���F{��m��wuFݽ`e=��v?{:w7MV�Y�M�%V��hk��B�E	m��]�6��#hHJ^)Ÿ���.;��<���`�0���*�3���p�r�$��d�S���g�YZ.shstrtab.interp.note.gnu.property.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.gnu.build.attributes.gnu_debuglink.gnu_debugdatapp�� &�� 4��$G���o��\QXX@Y��.	a���o� � �n���ox"x"}x#x#`�B�)�)��h<h<��<�<p�II`�`U`U�c�8�8�
�`�`��6 ���4�8�8��'�&&&�&&&� && & �('&('P�x)&x)��0&0� �3&�3� 
�5f�3d� �,/@��
�>