HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //proc/thread-self/root/snap/gnome-46-2404/current/usr/bin/X11/X11/broadwayd
ELF>@F@X@8
@@@@���+�+000=q=q����>�>8�8�8��P�P�P�@@88800hhhDDS�td88800P�td������||Q�tdR�td8�8�8���/lib64/ld-linux-x86-64.so.2 GNU���GNU�P(�{h�yc���GNU�� ����e�mmV�{�.Km�
����

���	q	k�� �l
h	�R���
Y6s)@
[�	1	r? ��8+3�[�j�
Bq ���B���E
D�	q
+�nbR
��P�
S�
��

J��	[
1�
��
�|o���^U	���
ax
Q!	���/~����
�
K
7��
������+��
��� �
"�EH�g_source_destroyg_intern_static_stringg_string_newg_malloc_ITM_deregisterTMCloneTableg_hash_table_removeg_hash_table_lookupg_list_prependg_assertion_message_exprg_hash_table_newg_string_freeg_strdup_printf__gmon_start__g_hash_table_insertg_strfreevg_string_insert_leng_string_append_printfg_slist_appendg_checksum_freeg_list_freeg_malloc0g_strdup_ITM_registerTMCloneTableg_string_append_leng_error_freeg_type_register_static_simpleg_type_class_adjust_private_offsetg_type_class_peek_parentg_object_unrefg_signal_connect_datag_object_refg_object_newg_ascii_tableg_list_appendg_string_insert_cg_option_context_add_main_entriesg_prefix_errorg_base64_encodeg_byte_array_freeg_main_loop_rung_list_removeg_memdupg_printg_slist_free_fullg_byte_array_appendg_main_loop_newg_set_errorg_log_structured_standardg_build_filenameg_error_matchesg_strndupg_strsplitg_slist_lastg_slist_delete_linkg_checksum_newg_once_init_enterg_source_set_callbackg_byte_array_sized_newg_get_user_runtime_dirg_once_init_leaveg_source_attachg_option_context_newg_option_context_parseg_string_set_sizeg_checksum_updateg_source_removeg_get_tmp_dirg_str_has_prefixg_idle_add_fullg_checksum_get_digestg_list_delete_linkg_byte_array_remove_rangeg_printerrcairo_image_surface_get_heightcairo_image_surface_get_stridecairo_image_surface_create_for_datacairo_image_surface_get_datacairo_surface_destroycairo_surface_referencecairo_image_surface_get_widthcairo_surface_set_user_datag_buffered_input_stream_fill_asyncg_filter_input_stream_set_close_base_streamg_socket_service_startg_memory_output_stream_new_resizableg_tls_certificate_new_from_filesg_socket_listener_add_addressg_unix_socket_address_new_with_typeg_tls_connection_handshakeg_data_input_stream_read_line_asyncg_data_input_stream_read_line_finishg_pollable_input_stream_create_sourceg_io_stream_get_input_streamg_buffered_input_stream_newg_data_input_stream_set_newline_typeg_unix_socket_address_newg_input_stream_skipg_output_stream_write_allg_memory_output_stream_get_datag_socket_connection_get_socketg_inet_socket_address_newg_data_input_stream_newg_buffered_input_stream_peek_bufferg_converter_output_stream_newg_pollable_input_stream_read_nonblockingg_inet_address_new_from_stringg_socket_service_newg_socket_get_fdg_buffered_input_stream_fill_finishg_tls_server_connection_newg_io_stream_get_output_streamg_socket_listener_add_inet_portg_zlib_compressor_newg_unix_socket_address_abstract_names_supportedg_output_stream_closeg_io_error_quarkg_memory_output_stream_get_data_sizesetsockoptperrorshm_open__stack_chk_failexitopen64munmapmemmovemmap64strlen__isoc23_strtol__libc_start_main__cxa_finalizesetlocaleshm_unlinkstrchrmemcmpmemcpystrcmplibgobject-2.0.so.0libglib-2.0.so.0libcairo.so.2libgio-2.0.so.0libc.so.6GLIBC_2.14GLIBC_2.38GLIBC_2.4GLIBC_2.2.5GLIBC_2.34/build/gnome-46-2404-sdk/stage/usr/lib/x86_64-linux-gnu:���D���Oii
Zui	d���p8� G@��F����%�1����{H���������������	�
����
�� �(�0�8�@�H�P�X�`�h�p�x��������� ��!��"��#��$��&�'�(�)�*�+�,��-�.�/�0�2 �3(�40�58�6@�7H�8P�9X�:`�;h�<p�=x�>��?��@��A��B��C��D��E��F��G�H�I�J�K�L�M��N�O�P�Q�R �S(�T0�U8�V@�WH�XP�YX�Z`�[h�\p�]x�^��_��`��a��b��c��d��e��f��g�h�i�j�k�l�m��n�o�p�q�r �s(�t0�u8�v@�wH�xP�yX�z`�|h�}p�~x��������������������������������H��H���H��t��H����5r��%t�@��h���f���h����f���h����f���h���f���h���f���h���f���h���f���h�r���f���h�b���f���h	�R���f���h
�B���f���h�2���f���h�"���f���h
����f���h����f���h��f���h���f���h����f���h����f���h���f���h���f���h���f���h���f���h�r���f���h�b���f���h�R���f���h�B���f���h�2���f���h�"���f���h����f���h����f���h��f���h ���f���h!����f���h"����f���h#���f���h$���f���h%���f���h&���f���h'�r���f���h(�b���f���h)�R���f���h*�B���f���h+�2���f���h,�"���f���h-����f���h.����f���h/��f���h0���f���h1����f���h2����f���h3���f���h4���f���h5���f���h6���f���h7�r���f���h8�b���f���h9�R���f���h:�B���f���h;�2���f���h<�"���f���h=����f���h>����f���h?��f���h@���f���hA����f���hB����f���hC���f���hD���f���hE���f���hF���f���hG�r���f���hH�b���f���hI�R���f���hJ�B���f���hK�2���f���hL�"���f���hM����f���hN����f���hO��f���hP���f���hQ����f���hR����f���hS���f���hT���f���hU���f���hV���f���hW�r���f���hX�b���f���hY�R���f���hZ�B���f���h[�2���f���h\�"���f���h]����f���h^����f���h_��f���h`���f���ha����f���hb����f���hc���f���hd���f���he���f���hf���f���hg�r���f���hh�b���f���hi�R���f���hj�B���f���hk�2���f���hl�"���f���hm����f���hn����f���ho��f���hp���f���hq����f���hr����f���hs���f���ht���f���hu���f���hv���f���hw�r���f���hx�b���f���hy�R���f���hz�B���f���h{�2���f���h|�"���f���h}����f���h~����f���h��f���h����f���h�����f���h�����f���h����f���h����f����%F�fD���%V�fD���%��fD���%��fD���%��fD���%��fD���%��fD���%��fD���%��fD���%��fD���%��fD���%��fD���%��fD���%��fD���%��fD���%��fD���%��fD���%��fD���%~�fD���%v�fD���%n�fD���%f�fD���%^�fD���%V�fD���%N�fD���%F�fD���%>�fD���%6�fD���%.�fD���%&�fD���%�fD���%�fD���%�fD���%�fD���%��fD���%��fD���%�fD���%�fD���%�fD���%�fD���%�fD���%�fD���%��fD���%��fD���%��fD���%��fD���%��fD���%��fD���%��fD���%��fD���%~�fD���%v�fD���%n�fD���%f�fD���%^�fD���%V�fD���%N�fD���%F�fD���%>�fD���%6�fD���%.�fD���%&�fD���%�fD���%�fD���%�fD���%�fD���%��fD���%��fD���%�fD���%�fD���%�fD���%�fD���%�fD���%�fD���%��fD���%��fD���%��fD���%��fD���%��fD���%��fD���%��fD���%��fD���%~�fD���%v�fD���%n�fD���%f�fD���%^�fD���%V�fD���%N�fD���%F�fD���%>�fD���%6�fD���%.�fD���%&�fD���%�fD���%�fD���%�fD���%�fD���%��fD���%��fD���%�fD���%�fD���%޿fD���%ֿfD���%οfD���%ƿfD���%��fD���%��fD���%��fD���%��fD���%��fD���%��fD���%��fD���%��fD���%~�fD���%v�fD���%n�fD���%f�fD���%^�fD���%V�fD���%N�fD���%F�fD���%>�fD���%6�fD���%.�fD���%&�fD���%�fD���%�fD���%�fD���%�fD���%��fD���%��fD���%�fD���%�fD���%޾fDH�=ar���H�<$�{���E1��2=��AV�$H��oAUATUSH��p�|$H�|$@H�l$H�4$H�5�pdH�%(H��$hH�o�D$H�D$H�D$ H�D$(H�D$0H�D$8fHn�1��H�H��n�D$HpH�
�nH�D$@H�D$�fHn��D$xaH��nfHn�H��n�D$Pfl�fHn�H�D$ DŽ$�L$XfHn�H�L$8fl�fHn�H��nL$hfHn�H�cnfHn�H�nnfl�fHn�H�D$(�$�fo�fHn�fl��$�fHn�H�BnfHn�H�QnƄ$�ufHn�H�D$0fl�DŽ$�fl��$��$�fHn�H�nfHn�H�nƄ$�cfl�DŽ$��$�fHn�fl�Ƅ$k�$�fHn�fl�H��$(�$DŽ$���H�=�p����H�t$@H��mH��H������H��H�t$H��H����������|$��H�$H�X�;:��H������H���g�SH����P�3�
H�{1��C���H�=�m�pA��1����I������1�L��H��1�����L��H����H��H�=vm1��,���H�ߺ������
���H��I���_�t$����H�|$(H����H���-H�޻H���q�h���H��1ɺUL���E1�L��H��H������ZY����L������E1�E1�1�H�3H�5mH�����H�����1�1���H���K���1�H��$hdH+%(�>H��p[]A\A]A^�A�ŐD�l$�.����;:tcp������QH�L$8H�T$0I��t$H�|$ ��*����H�D$H�=glH�p1����y����-�����uaH�k�
1�H�{���H�=�kH��A��������#H�=�kI��1�����#L��������L��I������i���H��j����H�D$H�=LkH�p1��%��d���H�=�kH��1�����H�D$H�=�jH�p1�������o���H�=�j1�����g����1�I��^H��H���PTE1�1�H�=��������f.�H�=��H���H9�tH�V�H��t	�����H�=q�H�5j�H)�H��H��?H��H�H�tH��H��t��fD�����=-�u+UH�=��H��tH�=����d�����]������w����UH��SH���(����H�] H��t�3H�=ϸ�-H�[H��u�H�] H���m�H�E H�=���)(H�} ���E(��uXH�=��H���x���H�}H�m����H�}���H�}H�5����H��H��[]���;����E(�S���L�(hH�
�o�=H�5�kH�=
h���L��gH�
�o�<H�5gkH�=�g����H���G(����1�H���D��AWAVAUATUH��SH��H�z1�dH�%(H��$�1��
�H���QH�}H�t$L�5�n�<�H�\$I��H��H����E�<$L9�r�H�=L��&A��A�D$����Ic�L�>��A�t$H�= ���.H�=��T&A9��CfAnD$fAn�H�}fo�f~D$fb�f�$��H��tH�fnD$D;h�=�����H�}H��H�$H���H�EL)�M�H���3���H�t$H�}H)�1�1��U���H�}1�1�I��L��������H��$�dH+%(�H�Ę[]A\A]A^A_�H��$�dH+%(��H�ĘH��[]A\A]A^A_����A�t$H�=����0����A�t$H�=��)2H�}�D$P�D$\A�D$�D$X�D$T���H�t$PH��E1�E1�1ɺ�����������H�=�e�e��M(���j���1�H��H�5����1����E(�O����uA�L$A�T$E�L$E�D$H�=I���0H�}�D$@�D$LA�D$�D$H�D$D�F�H�t$@H���^���A�D$ H��A�t$E�L$E�D$A�L$A�T$PH�=��.^_����A�L$4A�t$I�T$E�D$8H�=���1H�������A�t$H�=��H��H�$�-H�<$���t���A�T$A�t$H�={���,�Y���A�t$H�=e��+�C���A�t$H�=O��*�-���A�t$H�} �/�A�t$H�=+�H�E �j(����H�=�H�D$`H�L$tH�T$pH�t$lH�$L�D$x�\'A�D$H�}�D$`�D$h�D$d��H�4$E1�E1�1�H�Ǻ�������������H�=���(#A�D$H�}�D$$�D$,�D$(��E1�E1�1�H��H�t$$�����D������H�=P���"�.���A�L$A�T$E�L$E�D$A�t$H�=&��	2H�} �ƉD$<��H�}�D$0H�E A�D$�D$8�D$4��H�t$0H���,���A�T$A�t$H�=β�+���@fAnD$A��H�}fAn�fo�f~D$fb�f�$�<�H�����������f~����H��H��eL�
�b�PL�&j1�H�
�bH�=Bb��XZ�*�����D��AWH��AVA��AUATUSH��hdH�%(H�T$X���gv#��k���_H�
liHc�H�>��fD��A�?�J��H��H��H� 4H����H�	H�����D$H�8H�D$Hf�H�T$ H��H��L�-v�)D$H��D�`H�D$P)D$ )D$0)D$@�H�M����I�]A�����H�CH����H��1�E1����)H�JI��H����H��H�
D;as�M����f��D$H�{�l$$H�D$�D$��H�T$E1�E1�1�H��H�t$������M�mM���]���H�D$XdH+%(�:H��h[]A\A]A^A_�H�8���H�{H���\�H�CL9�u��n���fDD93����M�mM��t�I�]D93u�H�CH������1��9���f�H�=6`����C(���Y���1�H��H�5���1��f��C(�>�����KuQ�D$0� H�D$0�A����D$(�H�D$(�&����D$@�0H�D$@����E1�H�
>g�AH�5�bH�=w_�6�fD�D$8�(H�D$8��������Uf�0H��SH��HdH�%(H�D$81�)$)D$)D$ H�D$0�^�H��H��H�Ë���P�����H�CH���#�H�����H�=ԮH��H�C�H�H�{1�1�I��L������H����E�H�=���$d��H�=�����D$�!H�t$H�T$H�=v���H�D$���3H���(���H�D$8dH+%(uH��H�[]������AT�(I��UH��SH��dH�%(H�D$1��T�H��H�����L�#H�=�_H�C�&�H�C H�H�x(H��t^H�p0H��tUI��H�$L���
�H��H����H��L����H�CH��H����1�L�������!H�{�H���P�H�CH����H����1�H�CH�����H�{���H�{I��1�H�
�1����H�T$dH+%(��H��[]A\��H��L�
�`L�g�H�D$H�
x^H��`H�=�\�p1���H�|$��L��1��@H��L�
�`L��fH�D$H�
2^�pH�p`1��H�=v\�E�H�|$���X1�Z�>���f�H��L�
e`L�~fH�D$H�
�]�p������SH��H���H�{(�v�H�{0�m�H�&�H��[H�@0��ff.��H��H�=�]��H��L�
5A��jH�ƺ��PH�
��d�H���ff.�@��SH���3��CL1�1�H�C8ǃ�����H�CP�
��CH�HH�Cp��HcsHH�{pH�F�2�CHH�ֆ�BH�BH���[���fD��SH���s�H�,�����uH����H�C0[�DH��H�5����H�����H�C0[�@��SH��H�wH�?�|�H��[��AWAVAUATUSH��HdH�%(H�D$8H�G�P���4I��L�-3\L�%[^�~�I�M9��@��	���D@���J@��t2H��@��L��1�VL�
�^L��L�d�H�=Z���XZI�A�1��#�I�G�P����H�A���H�8�ˉ�������~�����J��H�PA�A�A����9���M9��PL�JM��I)�I�I9��9H��t1�f�H�����
0LH��H9�u�L��@��	����I��<�<���fD�����XH�PA�A�A�f�����h���f�@��
������@�����f�I�/D$D$D$(�B�2ȉD$�BΉ4$ȉ�H����A�O(���I�0H)�H�EPH�D$�F���5�)H�=�`Hc�H�>�����	v+H�XH�P
A�
A�
A�H����f�H�D$8dH+%(�	H��H[]A\A]A^A_�DH�EP�q����BȉD$�rΉt$D�BA�D�D$�zω|$�rΉt$ �r Ήt$$�r$D������Ή������t$(�B(ȉD$0H��8�N�H�}`H���b�H�E`���H��H+}PA�G(H��I�0����f.�H�=�[1��B�륋BȉD$뚋���D$�BȉD$�BȉD$�y����BȉD$�rΉt$�zω|$�rΉt$D�BA�D�D$ D�B A�D�D$$�R$���ʉ���T$(�����������BȉD$�BȉD$�BȉD$�BȉD$�BȉD$ �B ȉD$$�B$ȉD$(�B(ȉD$,�B,ȉD$0����BȉD$�BȉD$����BȉD$�BȉD$�BȉD$�BȉD$�BȉD$ �x�����ff.�USH��(dH�%(H��$1�H�D$H��taH��H�H�l$�%��1�L�D$H��H�Ǻ���H��Y��H�H�{H;XXtv�!��H�{1��f�H�{ ��H�����1�H��$dH+%(��H��([]�f�H�{��H���2�H�C�@��tH��������H�@X�}����K�H�|$����j���uVH�H�{H;XXtY�t��H�{1���H�{ ���H���H��H�D$H�=�VH�p1����H�|$�'��-���f�H�|$���b����H�@X����ATI��I�Љ�U1�SH��H�=0Y����H��H�����H�{I�����L��H��E1�E1�1�H����H�����H�{���H�{���H�{���H�{ ����H��[]A\�y��f�AV1�AUI��H��ATI��USH��H�=�X�N��H��H���#��H�{I�����L��H��E1�E1�1�H�����H�����H�{����L��L��E1�E1�1�H�����H�{���H�{���H�{����H�{ �����H��[]A\A]A^����AVAUATUH��SH��@H�`dH�%(H�D$81�H����I�)
L�%�[H�H�����D�SH�E`E��u	�EL���C�3�F���5w��Ic�L�>��f�H�=X1�����3�F���3wI��r_�����H����H���
��H�}`H��u�H�D$8dH+%(��H��@[]A\A]A^�H�CH����C(����C�������t�����f�D�s��b��1�H�SH����S(D�������T����D�C�SE����s��tH�SH����S0����#���HcsH�}p����H������H�SH�P�S9������������B��3���H�)
H�������5�����C����C����C(����CDž������D�CfnKfnC����C(fb�����Cfօ�������f.�H�SH���H�P�:���@��t�C9���EH�CH����C0����2�����C�����f�D9���b��������U���H�}pIc����I��H��t4H�}xH���v�L��H�ExH���'��H�}@H�ExH����A�6�9D�sD;��tkH�}Xf��D$4�$fD$D$D$$���D�MhE�����EPfAn�H�����fn��H�D$fb�f�D$��D���H�}@H��t
�2����D�s�3�F��q���f��H �����H�}pHc����I��H��t4H�}xH�����L��H�ExH���6��H�}@H�ExH����A�6�8D�sD;��tiH�}Xf��D$4�$fD$D$D$$�����Eh�����EPfAn�H�����fn��H�D$fb�f�D$��D���H�}@H�������2�������H�}@�T3H�}@�EL�(3�3H�E@�F�����fDH�}pHc����I��H��t4H�}xH�����L��H�ExH���1��H�}@H�ExH����A�6�7D�sD;��teH�}Xf��D$4�$fD$D$D$$�����}h��t�EPfAn�H�����fn��H�D$fb�f�D$��D���H�}@H��t&�1��uH�}@�[2H�}@�EL�/2H�E@�3�F����D�sD;���Q�����1�H��H�5
1�����Eh�f���D�sD;���������D�sD;���������1�H��H�5�	1�����Eh����1�H��H�5�	1�����Eh����H�}@�1H�}@�EL�x1H�E@�;����f��fD��UH��SH��H��H�.�����t�C8��u
�H��[]ÐH���X��������AW1�AVAUATUH��1�SH��XdH�%(H�D$H1��B��H�����8H�} H��t}H�wSH��H�5UM1�����H�}I��1�H�
����1����H�D$HdH+%(�}H��XH��[]A\A]A^A_�q���H��N��H���\����f.�L�'M����L�����H����A�<$GET ��A�D$I�|$< uD�GH��< t�I������<
u	��<
t
A�FI����u�L��H)����E1�A�> I�����?L���'��H��t�H�5fML���������A�<$/uA�|$��DH�5NML��������IH�5TML��������H�E 1�H�5�L�D$$H�8����L�0H�D$M���6H�$I��H�D$H�D$�-DI�FA�~ H�$tI�FH�$M�wI��M����H�5�LL���Y����tA�~:t�M�7H�5�LL���<������A�~:��I�FA�~ H�D$t�I�FH�D$�fD1�H�5(L������f�H��K��H���L�������L��A�FI��< t���3<
�+L�����
tH���PH�����u�H)�L���8��I���,���H�}���H�}����H�}����H�} �����H�����H�D$HdH+%(��H��XH�='K1�[]A\A]A^A_������H��rH�5@KH����L���e��L���]������H�E L� � ���@H��K��H���,��f.��(H�SH�5�JH�����1�� ���f�H�|$��H�<$��H�D$(��&��I��H���hH�4$H��L�t$0H���������H�����H�5�ML�����H�D$(L��L��H��H�$����L���]��H�|$(�j�L���4��I��H�|$L��IH��I��L�L$H�L$L��1�H�=QM���L��I�����L������H�}I������E1�E1�1�L��L��H�����L������H�}���H���N��A�H�L$$��������@���H�}I��H�EI����H�4$H�}I�F�����|$(I������T$(L��I�FH������H�}�,��1�H���"+H�}I�F�U��H�}�L��H�}�C��H�} ��5��H�����I�~����1�H���z��1�L��H�5����I�F H������I�~ 1�����M�>A�F8I�@H��t��-I�@�)I�oXH��t%H�}����H�}1����H�} �/��H�����I�@M�wXH��t�*I�@A�GL�*I�~A�wLI�@�*I�@�.)I�@H���I�oxH����@H�E�0����D�@�@0H��D�H�H�P�@P��+H�m^I�@AXH��u�I�oxH��u�DH�mH��tqH�E�0��t�P���tH�$�3I�@H�$�H��t͋0H�$�R-H�$H�H(H��t�0I�@�@01��3I�@�H�mH���;����v���A������H��t'�-(��uI�@�)I�@A�GL�S)I�G@A������tA���I�@�o)L���W�I�F�@��tL�����H�|$�
�����1����H�|$����H��F��H������^���M�7H�5�FL���I����tqA�~:ujI�FA�~ H�D$�����I�FH�D$���H��EH�D$H��I���>���E���E��������k/I�@���H�D$(H�$��M�7H�5aFL���������A���A�~:�6���A�~ tI�FH�D$�!������I�FH�D$����L�,FH�
�M��H�5eGH�=rC�1�����H���Gh��1�H���DUf�SH��H��dH�%(H�D$x1��GLD$$�o�D$4���$w�D$H�GPH�p)D$H�D$�Ff~�Hc��D$ ���H���PH�T$H�P�T$9���7����t6�$��B��3wH�)
H���?�������4fD�H ��t�H�{pHc����H��H��t4H�{xH���a��H��H�CxH�����H�{@H�CxH���	�u�+�l$;��tjH�{Xf��D$t�D$@fD$DD$TD$d����Sh����fn���CPfn�H�|$@�����fb�H�D$Hf�D$P������H�{@H��t*��$��u!H�{@�8&H�{@�CL�&1�H�C@fD�$��B��3���H�)
H�����������������H���"��H�D$xdH+%(u7H�Ĉ[]Ël$9��������1�H��H�5����1�����Ch�����v��fD��USH��H�_`H��t4H����H�[H��tH�H��0���H��t�H��[]�1��D��H�G@H��u�GL��H��� %��H����H��@��f.���SH��H�@H��t	�#��t[�@H�{@��$H�{@�CL�$H�C@[Ð��AWI��AVI��AUM��ATI��U��SH��H��H����H�=	�1�1����L��h H���r��L��H�C�f��L��H�C(�Z��H�C0M����L������I��H���!��H���.��L��H�����H��H�{8E1�AU��I��H�����ZY����H������H�{8E1�E1�1�H��H�5�@�P��H��H��[]A\A]A^A_�fDH�1�H�������������H��H��������@�s H�{8L��H���������~����S H�5�AL������H��1��1���|���@�K H�SH�5�AL�����H���
��H��1�����K������M��#L���H�
ZA1����H��1���������f���AUI��ATUH��SH��H�E�H����H�=5�1�1�����H���@ ����H�����H�CH����H���E��I��H����H��H�{81ɺAUE1�I��H�����ZY��tlL���,��H�{8E1�E1�1�H�y��H�54?���H��H��[]A\A]��H���H���y�����E����|�H��H������0���@H�SH�5l@L���U��L�����H��1����딐�K��H�
lC�#L���1��3��H��1��y���g���@���I��#L���H�
WC1����H��1��F���4������SH��H�X���Ch��t�CP[�H��1�H�54���1��
���Ch�CP[�D��AVI��AUI��ATM��UH��SH�@H��uFH��t����M��t	���A�M��t
���A�$H��t	����E[]A\A]A^�DH�X���Ch��tHM��t
���A�EM��t	���A�M��t
���A�$H��t�����E[]A\A]A^�D1�H��H�5T���1��-���Ch����AUATU��SH��H��HdH�%(H�D$81�9��u
LJ�9��u
ǃ�����H�{@H��t���&H�{pLc�L���Z��I��H���>H�{x9��tZH���*��H�{pL��H�Cx�z��I�|$8�p��I�|$@H��t���H�D$8dH+%(�XH��HL��[]A\A]�;��H�Ƌh����H�{pL��H�Cx���I�|$8���I�|$@H��t���L����������H�{pHc����H���~;��tgH�{Xf��D$4�$fD$D$D$$�+��Ch�����CPfn�H�����fn��H�D$fb�f�D$�������H�{@H��u&fDH�D$8dH+%(u[H��H[]A\A]�D���u�H�{@�^H�{@�CL�2H�C@��1�H��H�54���1��
���Ch�U��������SH��H�pHc����H��t'H�{@�@H��t�0�`!�[�f�1�[�ff.����UHc�SH��H��H��H�p�4��H��tO�@9��u
ǃ�9��u
ǃ�����H�{@H��t�0�!H���[]��H��1�[]����UHc�SH��H��H�p���H��tBH�{xH��H�����H��H�CxH���D��H�{@H�CxH��t�uH��[]��!f�H��[]�f���SH�����H�@H��t�#H�{@H��t	�V��t[�H�{@�H�{@�CL�{H�C@[Ð��UHc�SH��H��H�p���H��tBH�{xH��H������H��H�CxH���D��H�{@H�CxH��t�uH��[]�!f�H��[]�f���UHc���SH��H��H�p���H��t'H�{@�hH��t�0���$H�{@H��t	�}��t	H��[]�f�H�{@��H�{@�CL�H�C@�ؐ��SH�pHc������H��t�X [���1�H�@��Ð��H����AUHc�ATI��UH��SH��H�p����H��H��t~D�hH���3��A9�uD�kH������A9���H������H��A�������{�sD��H����
I�|$@H��H��tH�S(�3�C0H����$H�{(H��t�E
H�k(H��[]A\A]�fD�L��<H�
�?�sH�5�9H�=
6����L��<H�
�?�tH�5�9H�=�5�����AWHc�E��AVI��AUATA��UD��S��H��H�pD�l$@���H��tpA�D9xuE1�D9hA��I�~@D�xD�hH��t2�0AU��A��AWD���!XZ�H��[]A\A]A^A_�f���tD�`�hH��L�����H��1�[]A\A]A^A_�f���USH��HdH�%(H�D$81�9��thH��H�Xf���D$4�$fD$D$D$$����Ch��tO�CPfn�H�����fn��H�D$fb�f�D$�l�����H�D$8dH+%(u&H��H[]��1�H��H�5��1������Ch�����ff.���S������H���։�taE��uDD�KPH�{@���������D���H��t�H�{@H��t	�+��t'1�[��Ð�D;��s���[�fDE��t�롐H�{@�WH�{@�CL�+H�C@뺐��USH��H������t��ufH�{@H��t=�8H�{@��H��t0���u'H�{@�H�{@�CL��H�C@�D�kLǃ�����H����[]�f.�1�;��r�H�{@H��u���ff.���AW��AVE��AUA��ATUH��SH��H�p���H������H�p8H��H��tH���m������uE�캀1�H������E��A��Mc�I�������E1ɹ�L��1��$�b����<$I���g���H�����M���K������1�D��D��L�`F��L��L�8H�$�i���L�$H��I����H�
R��L��H�5d<H�����H�{8�g���H��菻��H�{@H�C8H��t���L�����H�C@H��L��[]A\A]A^A_���s���1�H��H��1����1�H�$H��1�贽��A������h��E1ɹ�L��1��D$�]����|$I���a���H�<$�h���H�<$迹�����f.�H�{@H��[]A\A]A^A_���L�|4H�
�:�=H�55H�=1�ӻ����AWE��AVA��AUA��ATE��UH���HSH���L$�1���HcuHfAn͋L$H�ÍFfnƉEHD��fb�D	�f�D	�ttD�s�KH�}pH��D�{D�c�I���H�}xH���M���H�}@H�ExH��t0�CH���S�K�3PD�KD�C�XZ�H��[]A\A]A^A_�H��H������H��[H�C�SH��H��H��t$H��t[H�GH�PH;Ws-H��L$�H�GH�PH�WH��D�CH��[�DH�T$�H�����芽���CH��[�H�t$��Ѻ���ff.�@U��SH��H����w�G9�tY9����O9����u*��u*fD�C�+�C�kH��[]�fD9�sT��uh��H�������ȋO9���9�r݁�����=��t^���G�G�oH��[]����uG��H������t���@��@H������sH������R���f.������`���
0H�߉��e����3H���[�������fD����t@=��t������G�s��������t =��t����+�C�s���D�����=������|����������o���ATE1�U��SH��9�t	��A���uW��s�C9���9��/�KA9������������C�+�CD�c[]A\�����A�����A)ԉ���)�%���A	ԉ���)ʁ��A	ԉ�s���)‰Ћ%�A	ċC9��[����KD9�tZ9�r:�����=�������C�CD�c[]A\�f�9�sL��u`��H������%���D������=��t]9����+�C���s�������uG��H���q�������@��@H���Z����sH���O������f.������h���
0H�߉��%����3H���������fD���<���=���1��������CA9������X���@�������fD��SH��H�?�P���H�{�G���H��[�>���ff.����G�����G����AWAVLc��HAULc�ATI��US��H���ٹ��A�V>��D�pH��B���ED���]IЍC>����I��U ���‰E(��H�H���\H��� �H���)�Hc�H�<IH���U,�E$�d����}�E@f�H�E���EDE0Hc�����H�EI�Å���O��LcuL��H��E1�@I��L��L9���D�d$�qf���E���A���҉��)�1�D�A�����%�A�ĉ��)�1�D�A��ʁ����	��Ձ��)�A	�1�B�9A�����D	�M�M9�s.A�	I��H��A��A��A���t�E���m���1ɉM�M9�r�D�d$A��L�M�M�D9��0���H��H��H��[]A\A]A^A_ÿ0�����ff.�@��AWf�AVAUATUH��SH���D�OD�wH�|$0A�Y H�t$Hc�H��dH�%(H��$�1�H��D�$)�$�)�$�D�t$裷��H�{�I��Hc$H�D$ 获��H��$�D�$I�¸ A9�AN�E���,� A��H�D$0A9�AN�L�(Lc`���L��M��L��O�1�E1�E��OЉ��	f�1�1�@i�-��H��9��A��,��@��ti�-��U��t��i��B��� u�E��~]�<$H�|$ 1�Ai�����i�-�A��i����)ȍJ A9�~���H��H9�u�A���<$L�E9���H���X���A��L�E9��H��1��]���A��D��D��f��E�����A��H��L�D����	L��@�o
H��fo�fr�f��fr�f��fr�f��fr�f��fr�f��fr�f��fo�f��J�H9�u�E���t	��Hc�H��I�4Di���D��qD9�}$I�t��Di���D�D9�}
I�Ti
����
A��A�� �C����\$����H�D$0L�(D�@L�T$`L��E1�L���D$ E��f.�H�D$@�\$D��A��D��H�Mc�H�J�H�\$8H�\$H��tD9[~�SA��Hc�HH�T$@�|$1�E1�9|$}VH�L$8E1�1��)f.�Ei�-�A��D9\�~E1�H��H�� tRi�-�A9�~�Ei�-��D4���fD1�fDi�-�A9�~�A��D;\�}E1�H��H�� u�E1�E����H��$�I��1�D�l$H�|$(I��E��H�l$XH��H�D$`D�d$M��@�,$A��E9}��H�t$H�����<��N,L�N����H�RI��D�E��~3�����0�
����H�RI��D�E��~;zu�:�|$�lH�|$@A�4$tH�|$9o�'H�|$(H�D$PD�D$H���D�D$HH�D$PE9�����D$D��D	ƒ�uH�|$0�O���<i����i����i�-�)ʋL$D��9L$��H�|$8Ei�-�i����A)�Ai$���)Ӌ$�� 9T$~D���A�$�H��I��I��H9l$ �����D�l$H�l$XE���D$A��D9\$��H�D$0H�D�@�^���fD�D$�$���Ai$���)Ӌ$�� 9T$�����@H�D$P�l$HA�4$H�|$(�����D�D$HH�D$P����A�4$H�|$(H�D$P�l$H�9�H�D$PD�D$H���f.�D���O,E1�L�_D��A��0�
��H�RI�Ӌ:��$���A����0�
��H�RI�Ӌ:��~D9Ru޹A9�IF�D�RL�T$0���:A�z D�BD�zA��DǍwI����rA�D�0�.���f.�H�D$PH�D$@H�|$(D�D$H�����D�D$HH�D$P����H�|$0�4$D�ZD�RD�O�~� D��D)�A9�L�L$0A�O�E�I�L$HD��D)�A9�L�L$O�A�yE�K�L$P��D)�A9�L�L$L�9L$HA�JA�q@��9��H�|$P ����@������H�|$0�t$H�\$pL�L$D�|$t�O��D�t$xHc�E�IL��$�H�t$HHc�A��D�d$PH��$�H�t$0L�l$PL��$�Hc�H��$�H�<�Ic�H>H�D$hH��$�D��B�4�L�L$A��Hc�D�D$|H��H��$�L��$�D��$�Hc�D��$�H�I	E1�D��I���f���L�M�A9���H�T$HL��H�������t�H�|$0�\$pH�D$hD�|$t�GDD�t$xD�D$|L��$�L�l$PH��$������L$PD)�9������@��������������E9�u	A9�������rH�|$(H�D$PD�D$H�� ��4$H�|$(��D	���fn\$fp�AEAEAE AE0AE@AEPAE`AEp�����$�L�T$`I�$���uy��t+��$�L�$���
H��$����$�L�$L��L�$褨��H�<$蛨��H�D$0�@H��$�dH+%(�BH���[]A\A]A^A_�9�r�L�$���y��$�H��$���L�$닋\$pH�D$hD�|$tD�t$xH��$�D��$�D��$�D�D$|L��$�L�l$PH��$�����|$�s����|$A�y��l����E�^A�y�D)��Dك��{D��D�����H��L�L��f��oH��fo�fr�f��fr�f��fr�f��fr�f��fo�fr�f��fr�fo�f��fr�f��@�H9�u�����D�ʃ�Hc�H��I�4Di��D��rA9�~$I�t��Di��D�A9�~
I�Di���A9��~���A���"���1�������H��$���0H���4���$�H���%�L�$���
@H��$���H������$�H����L�$����A9�����A������A��A�� ��������1��t���E1�E���k������1������A����1�����f�ATUSH��H�H��tH�GH�PH;WrB@��H������B���H�{D�c�CH�oH�u艨��H�CH�D�$([]A\�f�H�H�W@�4H�H�G�����SH��E1�E1�1ɺH�� H�?dH�%(H�D$1�H�渊f�$�3���H�;E1�E1�1�1�1�����H�D$dH+%(uH�� [��D���@��AT�USH�� dH�%(H�D$H�GH�hH��u$H�D$dH+%(��H�� ��[]A\�DL� H�E��$�H��H=��wZ���D$~�f��f�D$H�;E1�E1�1�H���r���H�;E1�E1�1�H��L���\���H�{1��1����C1҅����n���f�H����w@�l$��H���D$�
H�H�D$��L���ff.����ATI���U��S�	���L��H��莦��H�=vH��ߥ���kH�CH��[]A\���SH��H�?��H��[�w�������G�����w����AVAUATA��U��SH��H�H��tH�GH�PH;W���gH��������H�{D�s�CL�oI�u����H�CH�F�4(H�{L�oI�u���H�C����H�fF�$(H�{H��t1H�GH�HH;Os#H�7H�O�H�H�G�[]A\A]A^�D[��]H�����A\A]A^�)���f�H�H�W�gH�H�G��E���D��AUATUSH��H��D�gH�H��tH�GH�PH;WrD�uH������è��H�{D�k�CH�oH�u�
���H�CH�D�,(H��D��[]A\A]ÐH�H�W�uH�H�G�����AWA���sAVA��AUA��ATE��UD��SH��H���T$P�T$����H�{H�OH�qH�$腤��H�CH�$H�fD�<H�{L�I�w�d���H�CH�fF�48H�{L�wI�v�G���H�CH�fF�,0H�{L�oI�u�*���H�CH�fF�$(H�{L�gI�t$����H�C�T$H�����fB�, H�{H��t6H�GH�HH;Os(H�7H�O�H�H�G�H��[]A\A]A^A_�@H����H�����[]A\A]A^A_�;���ff.���ATUSH��H�H��tH�GH�PH;Wr>�DH��������H�{D�c�CH�oH�u�D���H�CH�D�$([]A\�@H�H�W�DH�H�G�����AUATU��SH��H��H�H��tH�GH�PH;Wrf�SH������u���H�{D�k�CL�gI�t$転��H�CH�F�, H�{L�gI�t$螢��H�CH�fB�, H��[]A\A]��H�H�W�SH�H�G�����AUATU��SH��H��H�H��tH�GH�PH;Wrf�HH������ť��H�{D�k�CL�gI�t$����H�CH�F�, H�{L�gI�t$���H�CH�fB�, H��[]A\A]��H�H�W�HH�H�G�����AUATU��SH��H��H�H��tH�GH�PH;Wrf�rH���������H�{D�k�CL�gI�t$�[���H�CH�F�, H�{L�gI�t$�>���H�CH�fB�, H��[]A\A]��H�H�W�rH�H�G�����AUATU��SH��H��H�H��tH�GH�PH;Wrf�RH������e���H�{D�k�CL�gI�t$諠��H�CH�F�, H�{L�gI�t$莠��H�CH�fB�, H��[]A\A]��H�H�W�RH�H�G�����AUATU��SH��H��H�H��tH�GH�PH;Wrf�dH�����赣��H�{D�k�CL�gI�t$���H�CH�F�, H�{L�gI�t$�ޟ��H�CH�fB�, H��[]A\A]��H�H�W�dH�H�G�����AUATU��SH��H��H�H��tH�GH�PH;Wrf�kH���������H�{D�k�CL�gI�t$�K���H�CH�F�, H�{L�gI�t$�.���H�CH�fB�, H��[]A\A]��H�H�W�kH�H�G�����AW��AVAUATUSH��D	ȉt$uH��[]A\A]A^A_�@D�;mH��A��A��E��E1�������H�{A��1�E�E����A	�D�|$L�I�w�z���H�CD�T$H�fF�8H�{H����H�GH�PH;Ws~H�WH��T$�H�H�G�E��ut���T���H�{H�oH�u����H�C�T$PH�f�(H�{H�oH�u���H�C�T$XH�f�(H��[]A\A]A^A_���T$H������`���E��t�H�{L�gI�t$詝��H�CH�fF�4 H�{L�gI�t$苝��H�CH�fF�, �K���f.���AVAUATA��U��SH��H�H��tH�GH�PH;Wr}�pH������Ԡ��H�{D�s�CL�oI�u����H�CH�F�4(H�{L�oI�u���H�CH�fF�$(H�{L�gI�t$���H�CH�fB�, []A\A]A^�@H�H�W�pH�H�G��y���ff.�f���AWAVAUATA��bUH��SH��H��H�T$��H����H��A����H�{A��L�oI�u�O���H�CH�fF�$(H�{L�oI�u�2���H�CH�fF�<(H�{L�oI�u����H�CH�=�H�fF�4(�-���H�t$H��H��I�����������;���H���Ӛ��H��H��I�����H��I������I�UI�uE1�E1�1�L��� ������1�1�L��螙������L���N���H�{H��L�I�w�j���H�CL��H�B�,8I���ĝ��H�[H��H���4H����H����H�{H�/H;C��H;H�.H9�s
H�/H9���H���o���H�HkH�k�(L���C���L���;���H��L��[]A\A]A^A_�%���DL�
L�R;1��H�
H��H�=��Q�������@H��H�D$諚��H�{H�t$H��H�/H;C�A���H��L��H�����H������W����H���G���H��1�H���:����5���DH��踛������H��1�����������H��H���client->windows == NULLGdkclient->disconnect_idle == 0can't write to clientUnknown request of type %d310:tcp:0ADDRESSHttpd portPORTIp address to bind to unixsocketUnix domain socket addresscertSSL certificate pathPATHkeySSL key pathgtk30option parsing failed: %s
Usage broadwayd [:DISPLAY]
127.0.0.1Listening on 127.0.0.1:%d
broadway%d.socketListening on %s
Failed to parse display %s
Can't listen: %s
incoming125412641272BroadwayServer647input error %s

Sec-WebSocket-Origin: Error reading request lines
Only GET implementedGET /client.htmltext/html/broadway.jstext/javascript/socketBad websocket requestSec-WebSocket-KeyHostSec-WebSocket-Origindigest_len == 20File not foundRequest too longUnable to listen to port %d: Invalid ip address %s: Unable to listen to %s:%d: Unable to listen to %s: Failed to map shmsurface != NULLcompression failed321../src/gdk/broadway/broadwayd.c[:DISPLAY] - broadway display daemonCannot create TLS certificate: %s../src/gdk/broadway/broadway-server.cCannot create TLS connection: %sparse_input_message - Unknown input command %c (%s)
fragmented or unknown input code 0x%2x with fin setHTTP/1.0 %d %s

<html><head><title>%d %s</title></head><body>%s</body></html>HTTP/1.0 200 OK
Content-Type: %s
Content-Length: %lu

update_event_state - Unknown input command %c
258EAFA5-E914-47DA-95CA-C5AB0DC85B11HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: %s
%s%s%sSec-WebSocket-Location: ws://%s/socket
Sec-WebSocket-Protocol: broadway

Unspecified unix domain socket addressInvalid unix domain socket address %s: window->width == cairo_image_surface_get_width (surface)window->height == cairo_image_surface_get_height (surface)../src/gdk/broadway/broadway-output.c����q��������������m���W���<���������a���֒������������������ј�������������������������get_event_sizeclient_freeclient_handle_request��������������������������������������������������������������������������������������������������������������������������������������������������������������������̠������������������������.���������������ؤ��H���H���H���H���H���H���H���H���h���H���H���H���H���H���H���H���H���H���H���H���`���H���H���H���H���H���H���H���H���H���H���ؤ��H������إ��H���`���H���H���H���h�����������H���H���H���H���H����������`���H���8���broadway_server_open_surfacebroadway_server_window_updateparse_inputgenerate_handshake_response_wsietf_v7handle_incoming_connection/* check if we are on Android and using Chrome */
var isAndroidChrome = false;
{
    var ua = navigator.userAgent.toLowerCase();
    if (ua.indexOf("android") > -1 && ua.indexOf("chrom") > -1) {
	isAndroidChrome = true;
    }
}
/* check for the passive option for Event listener */
let passiveSupported = false;
try {
  const options = {
    get passive() { // This function will be called when the browser
                    //   attempts to access the passive property.
      passiveSupported = true;
      return false;
    }
  };

  window.addEventListener("test", null, options);
  window.removeEventListener("test", null, options);
} catch(err) {
  passiveSupported = false;
}
/* Helper functions for debugging */
var logDiv = null;
function log(str) {
    if (!logDiv) {
	logDiv = document.createElement('div');
	document.body.appendChild(logDiv);
	logDiv.style["position"] = "absolute";
	logDiv.style["right"] = "0px";
    }
    logDiv.appendChild(document.createTextNode(str));
    logDiv.appendChild(document.createElement('br'));
}
/* Helper functions for touch identifier to make it unique on Android */
var globalTouchIdentifier = Math.round(Date.now() / 1000);
function touchIdentifierStart(tId)
{
    if (isAndroidChrome) {
	if (tId == 0) {
	    return ++globalTouchIdentifier;
	}
	return globalTouchIdentifier + tId;
    }
    return tId;
}
function touchIdentifier(tId)
{
    if (isAndroidChrome) {
	return globalTouchIdentifier + tId;
    }
    return tId;
}

function getStackTrace()
{
    var callstack = [];
    var isCallstackPopulated = false;
    try {
	i.dont.exist+=0;
    } catch(e) {
	if (e.stack) { // Firefox
	    var lines = e.stack.split("\n");
	    for (var i=0, len=lines.length; i<len; i++) {
		if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
		    callstack.push(lines[i]);
		}
	    }
	    // Remove call to getStackTrace()
	    callstack.shift();
	    isCallstackPopulated = true;
	} else if (window.opera && e.message) { // Opera
	    var lines = e.message.split("\n");
	    for (var i=0, len=lines.length; i<len; i++) {
		if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
		    var entry = lines[i];
		    // Append next line also since it has the file info
		    if (lines[i+1]) {
			entry += " at " + lines[i+1];
			i++;
		    }
		    callstack.push(entry);
		}
	    }
	    // Remove call to getStackTrace()
	    callstack.shift();
	    isCallstackPopulated = true;
	}
    }
    if (!isCallstackPopulated) { //IE and Safari
	var currentFunction = arguments.callee.caller;
	while (currentFunction) {
	    var fn = currentFunction.toString();
	    var fname = fn.substring(fn.indexOf("function") + 8, fn.indexOf("(")) || "anonymous";
	    callstack.push(fname);
	    currentFunction = currentFunction.caller;
	}
    }
    return callstack;
}

function logStackTrace(len) {
    var callstack = getStackTrace();
    var end = callstack.length;
    if (len > 0)
	end = Math.min(len + 1, end);
    for (var i = 1; i < end; i++)
	log(callstack[i]);
}

function resizeCanvas(canvas, w, h)
{
    /* Canvas resize clears the data, so we need to save it first */
    var tmpCanvas = canvas.ownerDocument.createElement("canvas");
    tmpCanvas.width = canvas.width;
    tmpCanvas.height = canvas.height;
    var tmpContext = tmpCanvas.getContext("2d");
    tmpContext.globalCompositeOperation = "copy";
    tmpContext.drawImage(canvas, 0, 0, tmpCanvas.width, tmpCanvas.height);

    canvas.width = w;
    canvas.height = h;

    var context = canvas.getContext("2d");

    context.globalCompositeOperation = "copy";
    context.drawImage(tmpCanvas, 0, 0, tmpCanvas.width, tmpCanvas.height);
}

var grab = new Object();
grab.window = null;
grab.ownerEvents = false;
grab.implicit = false;
var keyDownList = [];
var inputList = [];
var lastSerial = 0;
var lastX = 0;
var lastY = 0;
var lastState;
var lastTimeStamp = 0;
var realWindowWithMouse = 0;
var windowWithMouse = 0;
var surfaces = {};
var stackingOrder = [];
var outstandingCommands = new Array();
var inputSocket = null;
var debugDecoding = false;
var fakeInput = null;
var showKeyboard = false;
var showKeyboardChanged = false;
var firstTouchDownId = null;

var GDK_CROSSING_NORMAL = 0;
var GDK_CROSSING_GRAB = 1;
var GDK_CROSSING_UNGRAB = 2;

// GdkModifierType
var GDK_SHIFT_MASK = 1 << 0;
var GDK_LOCK_MASK     = 1 << 1;
var GDK_CONTROL_MASK  = 1 << 2;
var GDK_MOD1_MASK     = 1 << 3;
var GDK_MOD2_MASK     = 1 << 4;
var GDK_MOD3_MASK     = 1 << 5;
var GDK_MOD4_MASK     = 1 << 6;
var GDK_MOD5_MASK     = 1 << 7;
var GDK_BUTTON1_MASK  = 1 << 8;
var GDK_BUTTON2_MASK  = 1 << 9;
var GDK_BUTTON3_MASK  = 1 << 10;
var GDK_BUTTON4_MASK  = 1 << 11;
var GDK_BUTTON5_MASK  = 1 << 12;
var GDK_SUPER_MASK    = 1 << 26;
var GDK_HYPER_MASK    = 1 << 27;
var GDK_META_MASK     = 1 << 28;
var GDK_RELEASE_MASK  = 1 << 30;

function getButtonMask (button) {
    if (button == 1)
	return GDK_BUTTON1_MASK;
    if (button == 2)
	return GDK_BUTTON2_MASK;
    if (button == 3)
	return GDK_BUTTON3_MASK;
    if (button == 4)
	return GDK_BUTTON4_MASK;
    if (button == 5)
	return GDK_BUTTON5_MASK;
    return 0;
}

function sendConfigureNotify(surface)
{
    sendInput("w", [surface.id, surface.x, surface.y, surface.width, surface.height]);
}

var positionIndex = 0;
function cmdCreateSurface(id, x, y, width, height, isTemp)
{
    var surface = { id: id, x: x, y:y, width: width, height: height, isTemp: isTemp };
    surface.positioned = isTemp;
    surface.transientParent = 0;
    surface.visible = false;
    surface.imageData = null;

    var canvas = document.createElement("canvas");
    canvas.width = width;
    canvas.height = height;
    canvas.surface = surface;
    surface.canvas = canvas;
    var toplevelElement;

    toplevelElement = canvas;
    document.body.appendChild(canvas);

    surface.toplevelElement = toplevelElement;
    toplevelElement.style["position"] = "absolute";
    /* This positioning isn't strictly right for apps in another topwindow,
     * but that will be fixed up when showing. */
    toplevelElement.style["left"] = surface.x + "px";
    toplevelElement.style["top"] = surface.y + "px";
    toplevelElement.style["display"] = "inline";

    toplevelElement.style["visibility"] = "hidden";

    surfaces[id] = surface;
    stackingOrder.push(surface);

    sendConfigureNotify(surface);
}

function cmdShowSurface(id)
{
    var surface = surfaces[id];

    if (surface.visible)
	return;
    surface.visible = true;

    var xOffset = surface.x;
    var yOffset = surface.y;

    surface.toplevelElement.style["left"] = xOffset + "px";
    surface.toplevelElement.style["top"] = yOffset + "px";
    surface.toplevelElement.style["visibility"] = "visible";

    restackWindows();
}

function cmdHideSurface(id)
{
    if (grab.window == id)
	doUngrab();

    var surface = surfaces[id];

    if (!surface.visible)
	return;
    surface.visible = false;

    var element = surface.toplevelElement;

    element.style["visibility"] = "hidden";
}

function cmdSetTransientFor(id, parentId)
{
    var surface = surfaces[id];

    if (surface === undefined) return;
    if (surface.transientParent == parentId)
	return;

    surface.transientParent = parentId;
    if (parentId != 0 && surfaces[parentId]) {
	moveToHelper(surface, stackingOrder.indexOf(surfaces[parentId])+1);
    }

    if (surface.visible) {
	restackWindows();
    }
}

function restackWindows() {
    for (var i = 0; i < stackingOrder.length; i++) {
	var surface = stackingOrder[i];
	surface.toplevelElement.style.zIndex = i;
    }
}

function moveToHelper(surface, position) {
    var i = stackingOrder.indexOf(surface);
    stackingOrder.splice(i, 1);
    if (position != undefined)
	stackingOrder.splice(position, 0, surface);
    else
	stackingOrder.push(surface);

    for (var cid in surfaces) {
	var child = surfaces[cid];
	if (child.transientParent == surface.id) {
	    moveToHelper(child, stackingOrder.indexOf(surface) + 1);
	}
    }
}

function cmdDeleteSurface(id)
{
    if (grab.window == id)
	doUngrab();

    var surface = surfaces[id];
    var i = stackingOrder.indexOf(surface);
    if (i >= 0)
	stackingOrder.splice(i, 1);
    var canvas = surface.canvas;
    canvas.parentNode.removeChild(canvas);
    if (id == windowWithMouse) {
	windowWithMouse = 0;
    }
    if (id == realWindowWithMouse) {
	realWindowWithMouse = 0;
	firstTouchDownId = null;
    }
    delete surfaces[id];
}

function cmdMoveResizeSurface(id, has_pos, x, y, has_size, w, h)
{
    var surface = surfaces[id];
    if (has_pos) {
	surface.positioned = true;
	surface.x = x;
	surface.y = y;
    }
    if (has_size) {
	surface.width = w;
	surface.height = h;
    }

    if (has_size)
	resizeCanvas(surface.canvas, w, h);

    if (surface.visible) {
	if (has_pos) {
	    var xOffset = surface.x;
	    var yOffset = surface.y;

	    var element = surface.canvas;

	    element.style["left"] = xOffset + "px";
	    element.style["top"] = yOffset + "px";
	}
    }

    sendConfigureNotify(surface);
}

function cmdRaiseSurface(id)
{
    var surface = surfaces[id];

    if (surface === undefined) return;
    moveToHelper(surface);
    restackWindows();
}

function cmdLowerSurface(id)
{
    var surface = surfaces[id];

    if (surface === undefined) return;
    moveToHelper(surface, 0);
    restackWindows();
}

function copyRect(src, srcX, srcY, dest, destX, destY, width, height)
{
    // Clip to src
    if (srcX + width > src.width)
        width = src.width - srcX;
    if (srcY + height > src.height)
        height = src.height - srcY;

    // Clip to dest
    if (destX + width > dest.width)
        width = dest.width - destX;
    if (destY + height > dest.height)
        height = dest.height - destY;

    var srcRect = src.width * 4 * srcY + srcX * 4;
    var destRect = dest.width * 4 * destY + destX * 4;

    for (var i = 0; i < height; i++) {
        var line = src.data.subarray(srcRect, srcRect + width *4);
        dest.data.set(line, destRect);
        srcRect += src.width * 4;
        destRect += dest.width * 4;
    }
}


function markRun(dest, start, length, r, g, b)
{
    for (var i = start; i < start + length * 4; i += 4) {
        dest[i+0] = dest[i+0] / 2 | 0 + r;
        dest[i+1] = dest[i+1] / 2 | 0 + g;
        dest[i+2] = dest[i+2] / 2 | 0 + b;
    }
}

function markRect(src, srcX, srcY, dest, destX, destY, width, height, r, g, b)
{
    // Clip to src
    if (srcX + width > src.width)
        width = src.width - srcX;
    if (srcY + height > src.height)
        height = src.height - srcY;

    // Clip to dest
    if (destX + width > dest.width)
        width = dest.width - destX;
    if (destY + height > dest.height)
        height = dest.height - destY;

    var destRect = dest.width * 4 * destY + destX * 4;

    for (var i = 0; i < height; i++) {
        if (i == 0 || i == height-1)
            markRun(dest.data, destRect, width, 0, 0, 0);
        else {
            markRun(dest.data, destRect, 1, 0 ,0, 0);
            markRun(dest.data, destRect+4, width-2, r, g, b);
            markRun(dest.data, destRect+4*width-4, 1, 0, 0, 0);
        }
        destRect += dest.width * 4;
    }
}

function decodeBuffer(context, oldData, w, h, data, debug)
{
    var i, j;
    var imageData = context.createImageData(w, h);

    if (oldData != null) {
        // Copy old frame into new buffer
        copyRect(oldData, 0, 0, imageData, 0, 0, oldData.width, oldData.height);
    }

    var src = 0;
    var dest = 0;

    while (src < data.length)  {
        var b = data[src++];
        var g = data[src++];
        var r = data[src++];
        var alpha = data[src++];
        var len, start;

        if (alpha != 0) {
            // Regular data is red
            if (debug) {
                r = r / 2 | 0 + 128;
                g = g / 2 | 0;
                b = r / 2 | 0;
            }

            imageData.data[dest++] = r;
            imageData.data[dest++] = g;
            imageData.data[dest++] = b;
            imageData.data[dest++] = alpha;
        } else {
            var cmd = r & 0xf0;
            switch (cmd) {
            case 0x00: // Transparent pixel
                //log("Got transparent");
                imageData.data[dest++] = 0;
                imageData.data[dest++] = 0;
                imageData.data[dest++] = 0;
                imageData.data[dest++] = 0;
                break;

            case 0x10: // Delta 0 run
                len = (r & 0xf) << 16 | g << 8 | b;
                //log("Got delta0, len: " + len);
                dest += len * 4;
                break;

            case 0x20: // Block reference
                var blockid = (r & 0xf) << 16 | g << 8 | b;

                var block_stride = (oldData.width + 32 - 1) / 32 | 0;
                var srcY = (blockid / block_stride | 0) * 32;
                var srcX = (blockid % block_stride | 0) * 32;

                b = data[src++];
                g = data[src++];
                r = data[src++];
                alpha = data[src++];

                var destX = alpha << 8 | r;
                var destY = g << 8 | b;

                copyRect(oldData, srcX, srcY, imageData, destX, destY, 32, 32);
                if (debug) // blocks are green
                    markRect(oldData, srcX, srcY, imageData, destX, destY, 32, 32, 0x00, 128, 0x00);

                //log("Got block, id: " + blockid +  "(" + srcX +"," + srcY + ") at " + destX + "," + destY);

                break;

            case 0x30: // Color run
                len = (r & 0xf) << 16 | g << 8 | b;
                //log("Got color run, len: " + len);

                b = data[src++];
                g = data[src++];
                r = data[src++];
                alpha = data[src++];

                start = dest;

                for (i = 0; i < len; i++) {
                    imageData.data[dest++] = r;
                    imageData.data[dest++] = g;
                    imageData.data[dest++] = b;
                    imageData.data[dest++] = alpha;
                }

                if (debug) // Color runs are blue
                    markRun(imageData.data, start, len, 0x00, 0x00, 128);

                break;

            case 0x40: // Delta run
                len = (r & 0xf) << 16 | g << 8 | b;
                //log("Got delta run, len: " + len);

                b = data[src++];
                g = data[src++];
                r = data[src++];
                alpha = data[src++];

                start = dest;

                for (i = 0; i < len; i++) {
                    imageData.data[dest] = (imageData.data[dest] + r) & 0xff;
                    dest++;
                    imageData.data[dest] = (imageData.data[dest] + g) & 0xff;
                    dest++;
                    imageData.data[dest] = (imageData.data[dest] + b) & 0xff;
                    dest++;
                    imageData.data[dest] = (imageData.data[dest] + alpha) & 0xff;
                    dest++;
                }
                if (debug) // Delta runs are violet
                    markRun(imageData.data, start, len, 0xff, 0x00, 0xff);
                break;

            default:
                alert("Unknown buffer commend " + cmd);
            }
        }
    }

    return imageData;
}

function cmdPutBuffer(id, w, h, compressed)
{
    var surface = surfaces[id];
    var context = surface.canvas.getContext("2d");

    var inflate = new Zlib.RawInflate(compressed);
    var data = inflate.decompress();

    var imageData = decodeBuffer (context, surface.imageData, w, h, data, debugDecoding);
    context.imageSmoothingEnabled = false;
    context.putImageData(imageData, 0, 0);

    if (debugDecoding)
        imageData = decodeBuffer (context, surface.imageData, w, h, data, false);

    surface.imageData = imageData;
}

function cmdGrabPointer(id, ownerEvents)
{
    doGrab(id, ownerEvents, false);
    sendInput ("g", []);
}

function cmdUngrabPointer()
{
    sendInput ("u", []);
    if (grab.window)
	doUngrab();
}

var active = false;
function handleCommands(cmd)
{
    if (!active) {
        start();
        active = true;
    }

    while (cmd.pos < cmd.length) {
	var id, x, y, w, h, q;
	var command = cmd.get_char();
	lastSerial = cmd.get_32();
	switch (command) {
	case 'D':
	    alert ("disconnected");
	    inputSocket = null;
	    break;

	case 's': // create new surface
	    id = cmd.get_16();
	    x = cmd.get_16s();
	    y = cmd.get_16s();
	    w = cmd.get_16();
	    h = cmd.get_16();
	    var isTemp = cmd.get_bool();
	    cmdCreateSurface(id, x, y, w, h, isTemp);
	    break;

	case 'S': // Show a surface
	    id = cmd.get_16();
	    cmdShowSurface(id);
	    break;

	case 'H': // Hide a surface
	    id = cmd.get_16();
	    cmdHideSurface(id);
	    break;

	case 'p': // Set transient parent
	    id = cmd.get_16();
	    var parentId = cmd.get_16();
	    cmdSetTransientFor(id, parentId);
	    break;

	case 'd': // Delete surface
	    id = cmd.get_16();
	    cmdDeleteSurface(id);
	    break;

	case 'm': // Move a surface
	    id = cmd.get_16();
	    var ops = cmd.get_flags();
	    var has_pos = ops & 1;
	    if (has_pos) {
		x = cmd.get_16s();
		y = cmd.get_16s();
	    }
	    var has_size = ops & 2;
	    if (has_size) {
		w = cmd.get_16();
		h = cmd.get_16();
	    }
	    cmdMoveResizeSurface(id, has_pos, x, y, has_size, w, h);
	    break;

	case 'r': // Raise a surface
	    id = cmd.get_16();
	    cmdRaiseSurface(id);
	    break;

	case 'R': // Lower a surface
	    id = cmd.get_16();
	    cmdLowerSurface(id);
	    break;

	case 'b': // Put image buffer
	    id = cmd.get_16();
	    w = cmd.get_16();
	    h = cmd.get_16();
            var data = cmd.get_data();
            cmdPutBuffer(id, w, h, data);
            break;

	case 'g': // Grab
	    id = cmd.get_16();
	    var ownerEvents = cmd.get_bool ();

	    cmdGrabPointer(id, ownerEvents);
	    break;

	case 'u': // Ungrab
	    cmdUngrabPointer();
	    break;

        case 'k': // show keyboard
            showKeyboard = cmd.get_16() != 0;
            showKeyboardChanged = true;
            break;

	default:
	    alert("Unknown op " + command);
	}
    }
    return true;
}

function handleOutstanding()
{
    while (outstandingCommands.length > 0) {
	var cmd = outstandingCommands.shift();
	if (!handleCommands(cmd)) {
	    outstandingCommands.unshift(cmd);
	    return;
	}
    }
}

function BinCommands(message) {
    this.arraybuffer = message;
    this.u8 = new Uint8Array(message);
    this.length = this.u8.length;
    this.pos = 0;
}

BinCommands.prototype.get_char = function() {
    return String.fromCharCode(this.u8[this.pos++]);
};
BinCommands.prototype.get_bool = function() {
    return this.u8[this.pos++] != 0;
};
BinCommands.prototype.get_flags = function() {
    return this.u8[this.pos++];
}
BinCommands.prototype.get_16 = function() {
    var v =
	this.u8[this.pos] +
	(this.u8[this.pos+1] << 8);
    this.pos = this.pos + 2;
    return v;
};
BinCommands.prototype.get_16s = function() {
    var v = this.get_16 ();
    if (v > 32767)
	return v - 65536;
    else
	return v;
};
BinCommands.prototype.get_32 = function() {
    var v =
	this.u8[this.pos] +
	(this.u8[this.pos+1] << 8) +
	(this.u8[this.pos+2] << 16) +
	(this.u8[this.pos+3] << 24);
    this.pos = this.pos + 4;
    return v;
};
BinCommands.prototype.get_data = function() {
    var size = this.get_32();
    var data = new Uint8Array (this.arraybuffer, this.pos, size);
    this.pos = this.pos + size;
    return data;
};

function handleMessage(message)
{
    var cmd = new BinCommands(message);
    outstandingCommands.push(cmd);
    if (outstandingCommands.length == 1) {
	handleOutstanding();
    }
}

function getSurfaceId(ev) {
    var surface = ev.target.surface;
    if (surface != undefined)
	return surface.id;
    return 0;
}

function sendInput(cmd, args)
{
    if (inputSocket == null)
        return;

    var fullArgs = [cmd.charCodeAt(0), lastSerial, lastTimeStamp].concat(args);
    var buffer = new ArrayBuffer(fullArgs.length * 4);
    var view = new DataView(buffer);
    fullArgs.forEach(function(arg, i) {
        view.setInt32(i*4, arg, false);
    });

    inputSocket.send(buffer);
}

function getPositionsFromAbsCoord(absX, absY, relativeId) {
    var res = Object();

    res.rootX = absX;
    res.rootY = absY;
    res.winX = absX;
    res.winY = absY;
    if (relativeId != 0) {
	var surface = surfaces[relativeId];
	res.winX = res.winX - surface.x;
	res.winY = res.winY - surface.y;
    }

    return res;
}

function getPositionsFromEvent(ev, relativeId) {
    var absX, absY;
    absX = ev.pageX;
    absY = ev.pageY;
    var res = getPositionsFromAbsCoord(absX, absY, relativeId);

    lastX = res.rootX;
    lastY = res.rootY;

    return res;
}

function getEffectiveEventTarget (id) {
    if (grab.window != null) {
	if (!grab.ownerEvents)
	    return grab.window;
	if (id == 0)
	    return grab.window;
    }
    return id;
}

function updateKeyboardStatus() {
    if (fakeInput != null && showKeyboardChanged) {
        showKeyboardChanged = false;
        if (showKeyboard) {
	    if (isAndroidChrome) {
		fakeInput.blur();
		fakeInput.value = ' '.repeat(80); // TODO: Should be exchange with broadway server
		                                  // to bring real value here.
	    }
            fakeInput.focus();
	    //if (isAndroidChrome) fakeInput.click();
	}
        else
            fakeInput.blur();
    }
}

function updateForEvent(ev) {
    lastState &= ~(GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_MOD1_MASK);
    if (ev.shiftKey)
	lastState |= GDK_SHIFT_MASK;
    if (ev.ctrlKey)
	lastState |= GDK_CONTROL_MASK;
    if (ev.altKey)
	lastState |= GDK_MOD1_MASK;

    lastTimeStamp = ev.timeStamp;
}

function onMouseMove (ev) {
    updateForEvent(ev);
    var id = getSurfaceId(ev);
    id = getEffectiveEventTarget (id);
    var pos = getPositionsFromEvent(ev, id);
    sendInput ("m", [realWindowWithMouse, id, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState]);
}

function onMouseOver (ev) {
    updateForEvent(ev);

    var id = getSurfaceId(ev);
    realWindowWithMouse = id;
    id = getEffectiveEventTarget (id);
    var pos = getPositionsFromEvent(ev, id);
    windowWithMouse = id;
    if (windowWithMouse != 0) {
	sendInput ("e", [realWindowWithMouse, id, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState, GDK_CROSSING_NORMAL]);
    }
}

function onMouseOut (ev) {
    updateForEvent(ev);
    var id = getSurfaceId(ev);
    var origId = id;
    id = getEffectiveEventTarget (id);
    var pos = getPositionsFromEvent(ev, id);

    if (id != 0) {
	sendInput ("l", [realWindowWithMouse, id, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState, GDK_CROSSING_NORMAL]);
    }
    realWindowWithMouse = 0;
    windowWithMouse = 0;
}

function doGrab(id, ownerEvents, implicit) {
    var pos;

    if (windowWithMouse != id) {
	if (windowWithMouse != 0) {
	    pos = getPositionsFromAbsCoord(lastX, lastY, windowWithMouse);
	    sendInput ("l", [realWindowWithMouse, windowWithMouse, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState, GDK_CROSSING_GRAB]);
	}
	pos = getPositionsFromAbsCoord(lastX, lastY, id);
	sendInput ("e", [realWindowWithMouse, id, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState, GDK_CROSSING_GRAB]);
	windowWithMouse = id;
    }

    grab.window = id;
    grab.ownerEvents = ownerEvents;
    grab.implicit = implicit;
}

function doUngrab() {
    var pos;
    if (realWindowWithMouse != windowWithMouse) {
	if (windowWithMouse != 0) {
	    pos = getPositionsFromAbsCoord(lastX, lastY, windowWithMouse);
	    sendInput ("l", [realWindowWithMouse, windowWithMouse, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState, GDK_CROSSING_UNGRAB]);
	}
	if (realWindowWithMouse != 0) {
	    pos = getPositionsFromAbsCoord(lastX, lastY, realWindowWithMouse);
	    sendInput ("e", [realWindowWithMouse, realWindowWithMouse, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState, GDK_CROSSING_UNGRAB]);
	}
	windowWithMouse = realWindowWithMouse;
    }
    grab.window = null;
}

function onMouseDown (ev) {
    updateForEvent(ev);
    var button = ev.button + 1;
    lastState = lastState | getButtonMask (button);
    var id = getSurfaceId(ev);
    id = getEffectiveEventTarget (id);

    var pos = getPositionsFromEvent(ev, id);
    if (grab.window == null)
	doGrab (id, false, true);
    sendInput ("b", [realWindowWithMouse, id, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState, button]);
    return false;
}

function onMouseUp (ev) {
    updateForEvent(ev);
    var button = ev.button + 1;
    lastState = lastState & ~getButtonMask (button);
    var evId = getSurfaceId(ev);
    id = getEffectiveEventTarget (evId);
    var pos = getPositionsFromEvent(ev, id);

    sendInput ("B", [realWindowWithMouse, id, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState, button]);

    if (grab.window != null && grab.implicit)
	doUngrab();

    return false;
}

/* Some of the keyboard handling code is from noVNC and
 * (c) Joel Martin (github@martintribe.org), used with permission
 *  Original code at:
 * https://github.com/kanaka/noVNC/blob/master/include/input.js
 */

var unicodeTable = {
    0x0104: 0x01a1,
    0x02D8: 0x01a2,
    0x0141: 0x01a3,
    0x013D: 0x01a5,
    0x015A: 0x01a6,
    0x0160: 0x01a9,
    0x015E: 0x01aa,
    0x0164: 0x01ab,
    0x0179: 0x01ac,
    0x017D: 0x01ae,
    0x017B: 0x01af,
    0x0105: 0x01b1,
    0x02DB: 0x01b2,
    0x0142: 0x01b3,
    0x013E: 0x01b5,
    0x015B: 0x01b6,
    0x02C7: 0x01b7,
    0x0161: 0x01b9,
    0x015F: 0x01ba,
    0x0165: 0x01bb,
    0x017A: 0x01bc,
    0x02DD: 0x01bd,
    0x017E: 0x01be,
    0x017C: 0x01bf,
    0x0154: 0x01c0,
    0x0102: 0x01c3,
    0x0139: 0x01c5,
    0x0106: 0x01c6,
    0x010C: 0x01c8,
    0x0118: 0x01ca,
    0x011A: 0x01cc,
    0x010E: 0x01cf,
    0x0110: 0x01d0,
    0x0143: 0x01d1,
    0x0147: 0x01d2,
    0x0150: 0x01d5,
    0x0158: 0x01d8,
    0x016E: 0x01d9,
    0x0170: 0x01db,
    0x0162: 0x01de,
    0x0155: 0x01e0,
    0x0103: 0x01e3,
    0x013A: 0x01e5,
    0x0107: 0x01e6,
    0x010D: 0x01e8,
    0x0119: 0x01ea,
    0x011B: 0x01ec,
    0x010F: 0x01ef,
    0x0111: 0x01f0,
    0x0144: 0x01f1,
    0x0148: 0x01f2,
    0x0151: 0x01f5,
    0x0171: 0x01fb,
    0x0159: 0x01f8,
    0x016F: 0x01f9,
    0x0163: 0x01fe,
    0x02D9: 0x01ff,
    0x0126: 0x02a1,
    0x0124: 0x02a6,
    0x0130: 0x02a9,
    0x011E: 0x02ab,
    0x0134: 0x02ac,
    0x0127: 0x02b1,
    0x0125: 0x02b6,
    0x0131: 0x02b9,
    0x011F: 0x02bb,
    0x0135: 0x02bc,
    0x010A: 0x02c5,
    0x0108: 0x02c6,
    0x0120: 0x02d5,
    0x011C: 0x02d8,
    0x016C: 0x02dd,
    0x015C: 0x02de,
    0x010B: 0x02e5,
    0x0109: 0x02e6,
    0x0121: 0x02f5,
    0x011D: 0x02f8,
    0x016D: 0x02fd,
    0x015D: 0x02fe,
    0x0138: 0x03a2,
    0x0156: 0x03a3,
    0x0128: 0x03a5,
    0x013B: 0x03a6,
    0x0112: 0x03aa,
    0x0122: 0x03ab,
    0x0166: 0x03ac,
    0x0157: 0x03b3,
    0x0129: 0x03b5,
    0x013C: 0x03b6,
    0x0113: 0x03ba,
    0x0123: 0x03bb,
    0x0167: 0x03bc,
    0x014A: 0x03bd,
    0x014B: 0x03bf,
    0x0100: 0x03c0,
    0x012E: 0x03c7,
    0x0116: 0x03cc,
    0x012A: 0x03cf,
    0x0145: 0x03d1,
    0x014C: 0x03d2,
    0x0136: 0x03d3,
    0x0172: 0x03d9,
    0x0168: 0x03dd,
    0x016A: 0x03de,
    0x0101: 0x03e0,
    0x012F: 0x03e7,
    0x0117: 0x03ec,
    0x012B: 0x03ef,
    0x0146: 0x03f1,
    0x014D: 0x03f2,
    0x0137: 0x03f3,
    0x0173: 0x03f9,
    0x0169: 0x03fd,
    0x016B: 0x03fe,
    0x1E02: 0x1001e02,
    0x1E03: 0x1001e03,
    0x1E0A: 0x1001e0a,
    0x1E80: 0x1001e80,
    0x1E82: 0x1001e82,
    0x1E0B: 0x1001e0b,
    0x1EF2: 0x1001ef2,
    0x1E1E: 0x1001e1e,
    0x1E1F: 0x1001e1f,
    0x1E40: 0x1001e40,
    0x1E41: 0x1001e41,
    0x1E56: 0x1001e56,
    0x1E81: 0x1001e81,
    0x1E57: 0x1001e57,
    0x1E83: 0x1001e83,
    0x1E60: 0x1001e60,
    0x1EF3: 0x1001ef3,
    0x1E84: 0x1001e84,
    0x1E85: 0x1001e85,
    0x1E61: 0x1001e61,
    0x0174: 0x1000174,
    0x1E6A: 0x1001e6a,
    0x0176: 0x1000176,
    0x0175: 0x1000175,
    0x1E6B: 0x1001e6b,
    0x0177: 0x1000177,
    0x0152: 0x13bc,
    0x0153: 0x13bd,
    0x0178: 0x13be,
    0x203E: 0x047e,
    0x3002: 0x04a1,
    0x300C: 0x04a2,
    0x300D: 0x04a3,
    0x3001: 0x04a4,
    0x30FB: 0x04a5,
    0x30F2: 0x04a6,
    0x30A1: 0x04a7,
    0x30A3: 0x04a8,
    0x30A5: 0x04a9,
    0x30A7: 0x04aa,
    0x30A9: 0x04ab,
    0x30E3: 0x04ac,
    0x30E5: 0x04ad,
    0x30E7: 0x04ae,
    0x30C3: 0x04af,
    0x30FC: 0x04b0,
    0x30A2: 0x04b1,
    0x30A4: 0x04b2,
    0x30A6: 0x04b3,
    0x30A8: 0x04b4,
    0x30AA: 0x04b5,
    0x30AB: 0x04b6,
    0x30AD: 0x04b7,
    0x30AF: 0x04b8,
    0x30B1: 0x04b9,
    0x30B3: 0x04ba,
    0x30B5: 0x04bb,
    0x30B7: 0x04bc,
    0x30B9: 0x04bd,
    0x30BB: 0x04be,
    0x30BD: 0x04bf,
    0x30BF: 0x04c0,
    0x30C1: 0x04c1,
    0x30C4: 0x04c2,
    0x30C6: 0x04c3,
    0x30C8: 0x04c4,
    0x30CA: 0x04c5,
    0x30CB: 0x04c6,
    0x30CC: 0x04c7,
    0x30CD: 0x04c8,
    0x30CE: 0x04c9,
    0x30CF: 0x04ca,
    0x30D2: 0x04cb,
    0x30D5: 0x04cc,
    0x30D8: 0x04cd,
    0x30DB: 0x04ce,
    0x30DE: 0x04cf,
    0x30DF: 0x04d0,
    0x30E0: 0x04d1,
    0x30E1: 0x04d2,
    0x30E2: 0x04d3,
    0x30E4: 0x04d4,
    0x30E6: 0x04d5,
    0x30E8: 0x04d6,
    0x30E9: 0x04d7,
    0x30EA: 0x04d8,
    0x30EB: 0x04d9,
    0x30EC: 0x04da,
    0x30ED: 0x04db,
    0x30EF: 0x04dc,
    0x30F3: 0x04dd,
    0x309B: 0x04de,
    0x309C: 0x04df,
    0x06F0: 0x10006f0,
    0x06F1: 0x10006f1,
    0x06F2: 0x10006f2,
    0x06F3: 0x10006f3,
    0x06F4: 0x10006f4,
    0x06F5: 0x10006f5,
    0x06F6: 0x10006f6,
    0x06F7: 0x10006f7,
    0x06F8: 0x10006f8,
    0x06F9: 0x10006f9,
    0x066A: 0x100066a,
    0x0670: 0x1000670,
    0x0679: 0x1000679,
    0x067E: 0x100067e,
    0x0686: 0x1000686,
    0x0688: 0x1000688,
    0x0691: 0x1000691,
    0x060C: 0x05ac,
    0x06D4: 0x10006d4,
    0x0660: 0x1000660,
    0x0661: 0x1000661,
    0x0662: 0x1000662,
    0x0663: 0x1000663,
    0x0664: 0x1000664,
    0x0665: 0x1000665,
    0x0666: 0x1000666,
    0x0667: 0x1000667,
    0x0668: 0x1000668,
    0x0669: 0x1000669,
    0x061B: 0x05bb,
    0x061F: 0x05bf,
    0x0621: 0x05c1,
    0x0622: 0x05c2,
    0x0623: 0x05c3,
    0x0624: 0x05c4,
    0x0625: 0x05c5,
    0x0626: 0x05c6,
    0x0627: 0x05c7,
    0x0628: 0x05c8,
    0x0629: 0x05c9,
    0x062A: 0x05ca,
    0x062B: 0x05cb,
    0x062C: 0x05cc,
    0x062D: 0x05cd,
    0x062E: 0x05ce,
    0x062F: 0x05cf,
    0x0630: 0x05d0,
    0x0631: 0x05d1,
    0x0632: 0x05d2,
    0x0633: 0x05d3,
    0x0634: 0x05d4,
    0x0635: 0x05d5,
    0x0636: 0x05d6,
    0x0637: 0x05d7,
    0x0638: 0x05d8,
    0x0639: 0x05d9,
    0x063A: 0x05da,
    0x0640: 0x05e0,
    0x0641: 0x05e1,
    0x0642: 0x05e2,
    0x0643: 0x05e3,
    0x0644: 0x05e4,
    0x0645: 0x05e5,
    0x0646: 0x05e6,
    0x0647: 0x05e7,
    0x0648: 0x05e8,
    0x0649: 0x05e9,
    0x064A: 0x05ea,
    0x064B: 0x05eb,
    0x064C: 0x05ec,
    0x064D: 0x05ed,
    0x064E: 0x05ee,
    0x064F: 0x05ef,
    0x0650: 0x05f0,
    0x0651: 0x05f1,
    0x0652: 0x05f2,
    0x0653: 0x1000653,
    0x0654: 0x1000654,
    0x0655: 0x1000655,
    0x0698: 0x1000698,
    0x06A4: 0x10006a4,
    0x06A9: 0x10006a9,
    0x06AF: 0x10006af,
    0x06BA: 0x10006ba,
    0x06BE: 0x10006be,
    0x06CC: 0x10006cc,
    0x06D2: 0x10006d2,
    0x06C1: 0x10006c1,
    0x0492: 0x1000492,
    0x0493: 0x1000493,
    0x0496: 0x1000496,
    0x0497: 0x1000497,
    0x049A: 0x100049a,
    0x049B: 0x100049b,
    0x049C: 0x100049c,
    0x049D: 0x100049d,
    0x04A2: 0x10004a2,
    0x04A3: 0x10004a3,
    0x04AE: 0x10004ae,
    0x04AF: 0x10004af,
    0x04B0: 0x10004b0,
    0x04B1: 0x10004b1,
    0x04B2: 0x10004b2,
    0x04B3: 0x10004b3,
    0x04B6: 0x10004b6,
    0x04B7: 0x10004b7,
    0x04B8: 0x10004b8,
    0x04B9: 0x10004b9,
    0x04BA: 0x10004ba,
    0x04BB: 0x10004bb,
    0x04D8: 0x10004d8,
    0x04D9: 0x10004d9,
    0x04E2: 0x10004e2,
    0x04E3: 0x10004e3,
    0x04E8: 0x10004e8,
    0x04E9: 0x10004e9,
    0x04EE: 0x10004ee,
    0x04EF: 0x10004ef,
    0x0452: 0x06a1,
    0x0453: 0x06a2,
    0x0451: 0x06a3,
    0x0454: 0x06a4,
    0x0455: 0x06a5,
    0x0456: 0x06a6,
    0x0457: 0x06a7,
    0x0458: 0x06a8,
    0x0459: 0x06a9,
    0x045A: 0x06aa,
    0x045B: 0x06ab,
    0x045C: 0x06ac,
    0x0491: 0x06ad,
    0x045E: 0x06ae,
    0x045F: 0x06af,
    0x2116: 0x06b0,
    0x0402: 0x06b1,
    0x0403: 0x06b2,
    0x0401: 0x06b3,
    0x0404: 0x06b4,
    0x0405: 0x06b5,
    0x0406: 0x06b6,
    0x0407: 0x06b7,
    0x0408: 0x06b8,
    0x0409: 0x06b9,
    0x040A: 0x06ba,
    0x040B: 0x06bb,
    0x040C: 0x06bc,
    0x0490: 0x06bd,
    0x040E: 0x06be,
    0x040F: 0x06bf,
    0x044E: 0x06c0,
    0x0430: 0x06c1,
    0x0431: 0x06c2,
    0x0446: 0x06c3,
    0x0434: 0x06c4,
    0x0435: 0x06c5,
    0x0444: 0x06c6,
    0x0433: 0x06c7,
    0x0445: 0x06c8,
    0x0438: 0x06c9,
    0x0439: 0x06ca,
    0x043A: 0x06cb,
    0x043B: 0x06cc,
    0x043C: 0x06cd,
    0x043D: 0x06ce,
    0x043E: 0x06cf,
    0x043F: 0x06d0,
    0x044F: 0x06d1,
    0x0440: 0x06d2,
    0x0441: 0x06d3,
    0x0442: 0x06d4,
    0x0443: 0x06d5,
    0x0436: 0x06d6,
    0x0432: 0x06d7,
    0x044C: 0x06d8,
    0x044B: 0x06d9,
    0x0437: 0x06da,
    0x0448: 0x06db,
    0x044D: 0x06dc,
    0x0449: 0x06dd,
    0x0447: 0x06de,
    0x044A: 0x06df,
    0x042E: 0x06e0,
    0x0410: 0x06e1,
    0x0411: 0x06e2,
    0x0426: 0x06e3,
    0x0414: 0x06e4,
    0x0415: 0x06e5,
    0x0424: 0x06e6,
    0x0413: 0x06e7,
    0x0425: 0x06e8,
    0x0418: 0x06e9,
    0x0419: 0x06ea,
    0x041A: 0x06eb,
    0x041B: 0x06ec,
    0x041C: 0x06ed,
    0x041D: 0x06ee,
    0x041E: 0x06ef,
    0x041F: 0x06f0,
    0x042F: 0x06f1,
    0x0420: 0x06f2,
    0x0421: 0x06f3,
    0x0422: 0x06f4,
    0x0423: 0x06f5,
    0x0416: 0x06f6,
    0x0412: 0x06f7,
    0x042C: 0x06f8,
    0x042B: 0x06f9,
    0x0417: 0x06fa,
    0x0428: 0x06fb,
    0x042D: 0x06fc,
    0x0429: 0x06fd,
    0x0427: 0x06fe,
    0x042A: 0x06ff,
    0x0386: 0x07a1,
    0x0388: 0x07a2,
    0x0389: 0x07a3,
    0x038A: 0x07a4,
    0x03AA: 0x07a5,
    0x038C: 0x07a7,
    0x038E: 0x07a8,
    0x03AB: 0x07a9,
    0x038F: 0x07ab,
    0x0385: 0x07ae,
    0x2015: 0x07af,
    0x03AC: 0x07b1,
    0x03AD: 0x07b2,
    0x03AE: 0x07b3,
    0x03AF: 0x07b4,
    0x03CA: 0x07b5,
    0x0390: 0x07b6,
    0x03CC: 0x07b7,
    0x03CD: 0x07b8,
    0x03CB: 0x07b9,
    0x03B0: 0x07ba,
    0x03CE: 0x07bb,
    0x0391: 0x07c1,
    0x0392: 0x07c2,
    0x0393: 0x07c3,
    0x0394: 0x07c4,
    0x0395: 0x07c5,
    0x0396: 0x07c6,
    0x0397: 0x07c7,
    0x0398: 0x07c8,
    0x0399: 0x07c9,
    0x039A: 0x07ca,
    0x039B: 0x07cb,
    0x039C: 0x07cc,
    0x039D: 0x07cd,
    0x039E: 0x07ce,
    0x039F: 0x07cf,
    0x03A0: 0x07d0,
    0x03A1: 0x07d1,
    0x03A3: 0x07d2,
    0x03A4: 0x07d4,
    0x03A5: 0x07d5,
    0x03A6: 0x07d6,
    0x03A7: 0x07d7,
    0x03A8: 0x07d8,
    0x03A9: 0x07d9,
    0x03B1: 0x07e1,
    0x03B2: 0x07e2,
    0x03B3: 0x07e3,
    0x03B4: 0x07e4,
    0x03B5: 0x07e5,
    0x03B6: 0x07e6,
    0x03B7: 0x07e7,
    0x03B8: 0x07e8,
    0x03B9: 0x07e9,
    0x03BA: 0x07ea,
    0x03BB: 0x07eb,
    0x03BC: 0x07ec,
    0x03BD: 0x07ed,
    0x03BE: 0x07ee,
    0x03BF: 0x07ef,
    0x03C0: 0x07f0,
    0x03C1: 0x07f1,
    0x03C3: 0x07f2,
    0x03C2: 0x07f3,
    0x03C4: 0x07f4,
    0x03C5: 0x07f5,
    0x03C6: 0x07f6,
    0x03C7: 0x07f7,
    0x03C8: 0x07f8,
    0x03C9: 0x07f9,
    0x23B7: 0x08a1,
    0x2320: 0x08a4,
    0x2321: 0x08a5,
    0x23A1: 0x08a7,
    0x23A3: 0x08a8,
    0x23A4: 0x08a9,
    0x23A6: 0x08aa,
    0x239B: 0x08ab,
    0x239D: 0x08ac,
    0x239E: 0x08ad,
    0x23A0: 0x08ae,
    0x23A8: 0x08af,
    0x23AC: 0x08b0,
    0x2264: 0x08bc,
    0x2260: 0x08bd,
    0x2265: 0x08be,
    0x222B: 0x08bf,
    0x2234: 0x08c0,
    0x221D: 0x08c1,
    0x221E: 0x08c2,
    0x2207: 0x08c5,
    0x223C: 0x08c8,
    0x2243: 0x08c9,
    0x21D4: 0x08cd,
    0x21D2: 0x08ce,
    0x2261: 0x08cf,
    0x221A: 0x08d6,
    0x2282: 0x08da,
    0x2283: 0x08db,
    0x2229: 0x08dc,
    0x222A: 0x08dd,
    0x2227: 0x08de,
    0x2228: 0x08df,
    0x2202: 0x08ef,
    0x0192: 0x08f6,
    0x2190: 0x08fb,
    0x2191: 0x08fc,
    0x2192: 0x08fd,
    0x2193: 0x08fe,
    0x25C6: 0x09e0,
    0x2592: 0x09e1,
    0x2409: 0x09e2,
    0x240C: 0x09e3,
    0x240D: 0x09e4,
    0x240A: 0x09e5,
    0x2424: 0x09e8,
    0x240B: 0x09e9,
    0x2518: 0x09ea,
    0x2510: 0x09eb,
    0x250C: 0x09ec,
    0x2514: 0x09ed,
    0x253C: 0x09ee,
    0x23BA: 0x09ef,
    0x23BB: 0x09f0,
    0x2500: 0x09f1,
    0x23BC: 0x09f2,
    0x23BD: 0x09f3,
    0x251C: 0x09f4,
    0x2524: 0x09f5,
    0x2534: 0x09f6,
    0x252C: 0x09f7,
    0x2502: 0x09f8,
    0x2003: 0x0aa1,
    0x2002: 0x0aa2,
    0x2004: 0x0aa3,
    0x2005: 0x0aa4,
    0x2007: 0x0aa5,
    0x2008: 0x0aa6,
    0x2009: 0x0aa7,
    0x200A: 0x0aa8,
    0x2014: 0x0aa9,
    0x2013: 0x0aaa,
    0x2026: 0x0aae,
    0x2025: 0x0aaf,
    0x2153: 0x0ab0,
    0x2154: 0x0ab1,
    0x2155: 0x0ab2,
    0x2156: 0x0ab3,
    0x2157: 0x0ab4,
    0x2158: 0x0ab5,
    0x2159: 0x0ab6,
    0x215A: 0x0ab7,
    0x2105: 0x0ab8,
    0x2012: 0x0abb,
    0x215B: 0x0ac3,
    0x215C: 0x0ac4,
    0x215D: 0x0ac5,
    0x215E: 0x0ac6,
    0x2122: 0x0ac9,
    0x2018: 0x0ad0,
    0x2019: 0x0ad1,
    0x201C: 0x0ad2,
    0x201D: 0x0ad3,
    0x211E: 0x0ad4,
    0x2032: 0x0ad6,
    0x2033: 0x0ad7,
    0x271D: 0x0ad9,
    0x2663: 0x0aec,
    0x2666: 0x0aed,
    0x2665: 0x0aee,
    0x2720: 0x0af0,
    0x2020: 0x0af1,
    0x2021: 0x0af2,
    0x2713: 0x0af3,
    0x2717: 0x0af4,
    0x266F: 0x0af5,
    0x266D: 0x0af6,
    0x2642: 0x0af7,
    0x2640: 0x0af8,
    0x260E: 0x0af9,
    0x2315: 0x0afa,
    0x2117: 0x0afb,
    0x2038: 0x0afc,
    0x201A: 0x0afd,
    0x201E: 0x0afe,
    0x22A4: 0x0bc2,
    0x230A: 0x0bc4,
    0x2218: 0x0bca,
    0x2395: 0x0bcc,
    0x22A5: 0x0bce,
    0x25CB: 0x0bcf,
    0x2308: 0x0bd3,
    0x22A3: 0x0bdc,
    0x22A2: 0x0bfc,
    0x2017: 0x0cdf,
    0x05D0: 0x0ce0,
    0x05D1: 0x0ce1,
    0x05D2: 0x0ce2,
    0x05D3: 0x0ce3,
    0x05D4: 0x0ce4,
    0x05D5: 0x0ce5,
    0x05D6: 0x0ce6,
    0x05D7: 0x0ce7,
    0x05D8: 0x0ce8,
    0x05D9: 0x0ce9,
    0x05DA: 0x0cea,
    0x05DB: 0x0ceb,
    0x05DC: 0x0cec,
    0x05DD: 0x0ced,
    0x05DE: 0x0cee,
    0x05DF: 0x0cef,
    0x05E0: 0x0cf0,
    0x05E1: 0x0cf1,
    0x05E2: 0x0cf2,
    0x05E3: 0x0cf3,
    0x05E4: 0x0cf4,
    0x05E5: 0x0cf5,
    0x05E6: 0x0cf6,
    0x05E7: 0x0cf7,
    0x05E8: 0x0cf8,
    0x05E9: 0x0cf9,
    0x05EA: 0x0cfa,
    0x0E01: 0x0da1,
    0x0E02: 0x0da2,
    0x0E03: 0x0da3,
    0x0E04: 0x0da4,
    0x0E05: 0x0da5,
    0x0E06: 0x0da6,
    0x0E07: 0x0da7,
    0x0E08: 0x0da8,
    0x0E09: 0x0da9,
    0x0E0A: 0x0daa,
    0x0E0B: 0x0dab,
    0x0E0C: 0x0dac,
    0x0E0D: 0x0dad,
    0x0E0E: 0x0dae,
    0x0E0F: 0x0daf,
    0x0E10: 0x0db0,
    0x0E11: 0x0db1,
    0x0E12: 0x0db2,
    0x0E13: 0x0db3,
    0x0E14: 0x0db4,
    0x0E15: 0x0db5,
    0x0E16: 0x0db6,
    0x0E17: 0x0db7,
    0x0E18: 0x0db8,
    0x0E19: 0x0db9,
    0x0E1A: 0x0dba,
    0x0E1B: 0x0dbb,
    0x0E1C: 0x0dbc,
    0x0E1D: 0x0dbd,
    0x0E1E: 0x0dbe,
    0x0E1F: 0x0dbf,
    0x0E20: 0x0dc0,
    0x0E21: 0x0dc1,
    0x0E22: 0x0dc2,
    0x0E23: 0x0dc3,
    0x0E24: 0x0dc4,
    0x0E25: 0x0dc5,
    0x0E26: 0x0dc6,
    0x0E27: 0x0dc7,
    0x0E28: 0x0dc8,
    0x0E29: 0x0dc9,
    0x0E2A: 0x0dca,
    0x0E2B: 0x0dcb,
    0x0E2C: 0x0dcc,
    0x0E2D: 0x0dcd,
    0x0E2E: 0x0dce,
    0x0E2F: 0x0dcf,
    0x0E30: 0x0dd0,
    0x0E31: 0x0dd1,
    0x0E32: 0x0dd2,
    0x0E33: 0x0dd3,
    0x0E34: 0x0dd4,
    0x0E35: 0x0dd5,
    0x0E36: 0x0dd6,
    0x0E37: 0x0dd7,
    0x0E38: 0x0dd8,
    0x0E39: 0x0dd9,
    0x0E3A: 0x0dda,
    0x0E3F: 0x0ddf,
    0x0E40: 0x0de0,
    0x0E41: 0x0de1,
    0x0E42: 0x0de2,
    0x0E43: 0x0de3,
    0x0E44: 0x0de4,
    0x0E45: 0x0de5,
    0x0E46: 0x0de6,
    0x0E47: 0x0de7,
    0x0E48: 0x0de8,
    0x0E49: 0x0de9,
    0x0E4A: 0x0dea,
    0x0E4B: 0x0deb,
    0x0E4C: 0x0dec,
    0x0E4D: 0x0ded,
    0x0E50: 0x0df0,
    0x0E51: 0x0df1,
    0x0E52: 0x0df2,
    0x0E53: 0x0df3,
    0x0E54: 0x0df4,
    0x0E55: 0x0df5,
    0x0E56: 0x0df6,
    0x0E57: 0x0df7,
    0x0E58: 0x0df8,
    0x0E59: 0x0df9,
    0x0587: 0x1000587,
    0x0589: 0x1000589,
    0x055D: 0x100055d,
    0x058A: 0x100058a,
    0x055C: 0x100055c,
    0x055B: 0x100055b,
    0x055E: 0x100055e,
    0x0531: 0x1000531,
    0x0561: 0x1000561,
    0x0532: 0x1000532,
    0x0562: 0x1000562,
    0x0533: 0x1000533,
    0x0563: 0x1000563,
    0x0534: 0x1000534,
    0x0564: 0x1000564,
    0x0535: 0x1000535,
    0x0565: 0x1000565,
    0x0536: 0x1000536,
    0x0566: 0x1000566,
    0x0537: 0x1000537,
    0x0567: 0x1000567,
    0x0538: 0x1000538,
    0x0568: 0x1000568,
    0x0539: 0x1000539,
    0x0569: 0x1000569,
    0x053A: 0x100053a,
    0x056A: 0x100056a,
    0x053B: 0x100053b,
    0x056B: 0x100056b,
    0x053C: 0x100053c,
    0x056C: 0x100056c,
    0x053D: 0x100053d,
    0x056D: 0x100056d,
    0x053E: 0x100053e,
    0x056E: 0x100056e,
    0x053F: 0x100053f,
    0x056F: 0x100056f,
    0x0540: 0x1000540,
    0x0570: 0x1000570,
    0x0541: 0x1000541,
    0x0571: 0x1000571,
    0x0542: 0x1000542,
    0x0572: 0x1000572,
    0x0543: 0x1000543,
    0x0573: 0x1000573,
    0x0544: 0x1000544,
    0x0574: 0x1000574,
    0x0545: 0x1000545,
    0x0575: 0x1000575,
    0x0546: 0x1000546,
    0x0576: 0x1000576,
    0x0547: 0x1000547,
    0x0577: 0x1000577,
    0x0548: 0x1000548,
    0x0578: 0x1000578,
    0x0549: 0x1000549,
    0x0579: 0x1000579,
    0x054A: 0x100054a,
    0x057A: 0x100057a,
    0x054B: 0x100054b,
    0x057B: 0x100057b,
    0x054C: 0x100054c,
    0x057C: 0x100057c,
    0x054D: 0x100054d,
    0x057D: 0x100057d,
    0x054E: 0x100054e,
    0x057E: 0x100057e,
    0x054F: 0x100054f,
    0x057F: 0x100057f,
    0x0550: 0x1000550,
    0x0580: 0x1000580,
    0x0551: 0x1000551,
    0x0581: 0x1000581,
    0x0552: 0x1000552,
    0x0582: 0x1000582,
    0x0553: 0x1000553,
    0x0583: 0x1000583,
    0x0554: 0x1000554,
    0x0584: 0x1000584,
    0x0555: 0x1000555,
    0x0585: 0x1000585,
    0x0556: 0x1000556,
    0x0586: 0x1000586,
    0x055A: 0x100055a,
    0x10D0: 0x10010d0,
    0x10D1: 0x10010d1,
    0x10D2: 0x10010d2,
    0x10D3: 0x10010d3,
    0x10D4: 0x10010d4,
    0x10D5: 0x10010d5,
    0x10D6: 0x10010d6,
    0x10D7: 0x10010d7,
    0x10D8: 0x10010d8,
    0x10D9: 0x10010d9,
    0x10DA: 0x10010da,
    0x10DB: 0x10010db,
    0x10DC: 0x10010dc,
    0x10DD: 0x10010dd,
    0x10DE: 0x10010de,
    0x10DF: 0x10010df,
    0x10E0: 0x10010e0,
    0x10E1: 0x10010e1,
    0x10E2: 0x10010e2,
    0x10E3: 0x10010e3,
    0x10E4: 0x10010e4,
    0x10E5: 0x10010e5,
    0x10E6: 0x10010e6,
    0x10E7: 0x10010e7,
    0x10E8: 0x10010e8,
    0x10E9: 0x10010e9,
    0x10EA: 0x10010ea,
    0x10EB: 0x10010eb,
    0x10EC: 0x10010ec,
    0x10ED: 0x10010ed,
    0x10EE: 0x10010ee,
    0x10EF: 0x10010ef,
    0x10F0: 0x10010f0,
    0x10F1: 0x10010f1,
    0x10F2: 0x10010f2,
    0x10F3: 0x10010f3,
    0x10F4: 0x10010f4,
    0x10F5: 0x10010f5,
    0x10F6: 0x10010f6,
    0x1E8A: 0x1001e8a,
    0x012C: 0x100012c,
    0x01B5: 0x10001b5,
    0x01E6: 0x10001e6,
    0x01D2: 0x10001d1,
    0x019F: 0x100019f,
    0x1E8B: 0x1001e8b,
    0x012D: 0x100012d,
    0x01B6: 0x10001b6,
    0x01E7: 0x10001e7,
    0x01D2: 0x10001d2,
    0x0275: 0x1000275,
    0x018F: 0x100018f,
    0x0259: 0x1000259,
    0x1E36: 0x1001e36,
    0x1E37: 0x1001e37,
    0x1EA0: 0x1001ea0,
    0x1EA1: 0x1001ea1,
    0x1EA2: 0x1001ea2,
    0x1EA3: 0x1001ea3,
    0x1EA4: 0x1001ea4,
    0x1EA5: 0x1001ea5,
    0x1EA6: 0x1001ea6,
    0x1EA7: 0x1001ea7,
    0x1EA8: 0x1001ea8,
    0x1EA9: 0x1001ea9,
    0x1EAA: 0x1001eaa,
    0x1EAB: 0x1001eab,
    0x1EAC: 0x1001eac,
    0x1EAD: 0x1001ead,
    0x1EAE: 0x1001eae,
    0x1EAF: 0x1001eaf,
    0x1EB0: 0x1001eb0,
    0x1EB1: 0x1001eb1,
    0x1EB2: 0x1001eb2,
    0x1EB3: 0x1001eb3,
    0x1EB4: 0x1001eb4,
    0x1EB5: 0x1001eb5,
    0x1EB6: 0x1001eb6,
    0x1EB7: 0x1001eb7,
    0x1EB8: 0x1001eb8,
    0x1EB9: 0x1001eb9,
    0x1EBA: 0x1001eba,
    0x1EBB: 0x1001ebb,
    0x1EBC: 0x1001ebc,
    0x1EBD: 0x1001ebd,
    0x1EBE: 0x1001ebe,
    0x1EBF: 0x1001ebf,
    0x1EC0: 0x1001ec0,
    0x1EC1: 0x1001ec1,
    0x1EC2: 0x1001ec2,
    0x1EC3: 0x1001ec3,
    0x1EC4: 0x1001ec4,
    0x1EC5: 0x1001ec5,
    0x1EC6: 0x1001ec6,
    0x1EC7: 0x1001ec7,
    0x1EC8: 0x1001ec8,
    0x1EC9: 0x1001ec9,
    0x1ECA: 0x1001eca,
    0x1ECB: 0x1001ecb,
    0x1ECC: 0x1001ecc,
    0x1ECD: 0x1001ecd,
    0x1ECE: 0x1001ece,
    0x1ECF: 0x1001ecf,
    0x1ED0: 0x1001ed0,
    0x1ED1: 0x1001ed1,
    0x1ED2: 0x1001ed2,
    0x1ED3: 0x1001ed3,
    0x1ED4: 0x1001ed4,
    0x1ED5: 0x1001ed5,
    0x1ED6: 0x1001ed6,
    0x1ED7: 0x1001ed7,
    0x1ED8: 0x1001ed8,
    0x1ED9: 0x1001ed9,
    0x1EDA: 0x1001eda,
    0x1EDB: 0x1001edb,
    0x1EDC: 0x1001edc,
    0x1EDD: 0x1001edd,
    0x1EDE: 0x1001ede,
    0x1EDF: 0x1001edf,
    0x1EE0: 0x1001ee0,
    0x1EE1: 0x1001ee1,
    0x1EE2: 0x1001ee2,
    0x1EE3: 0x1001ee3,
    0x1EE4: 0x1001ee4,
    0x1EE5: 0x1001ee5,
    0x1EE6: 0x1001ee6,
    0x1EE7: 0x1001ee7,
    0x1EE8: 0x1001ee8,
    0x1EE9: 0x1001ee9,
    0x1EEA: 0x1001eea,
    0x1EEB: 0x1001eeb,
    0x1EEC: 0x1001eec,
    0x1EED: 0x1001eed,
    0x1EEE: 0x1001eee,
    0x1EEF: 0x1001eef,
    0x1EF0: 0x1001ef0,
    0x1EF1: 0x1001ef1,
    0x1EF4: 0x1001ef4,
    0x1EF5: 0x1001ef5,
    0x1EF6: 0x1001ef6,
    0x1EF7: 0x1001ef7,
    0x1EF8: 0x1001ef8,
    0x1EF9: 0x1001ef9,
    0x01A0: 0x10001a0,
    0x01A1: 0x10001a1,
    0x01AF: 0x10001af,
    0x01B0: 0x10001b0,
    0x20A0: 0x10020a0,
    0x20A1: 0x10020a1,
    0x20A2: 0x10020a2,
    0x20A3: 0x10020a3,
    0x20A4: 0x10020a4,
    0x20A5: 0x10020a5,
    0x20A6: 0x10020a6,
    0x20A7: 0x10020a7,
    0x20A8: 0x10020a8,
    0x20A9: 0x10020a9,
    0x20AA: 0x10020aa,
    0x20AB: 0x10020ab,
    0x20AC: 0x20ac,
    0x2070: 0x1002070,
    0x2074: 0x1002074,
    0x2075: 0x1002075,
    0x2076: 0x1002076,
    0x2077: 0x1002077,
    0x2078: 0x1002078,
    0x2079: 0x1002079,
    0x2080: 0x1002080,
    0x2081: 0x1002081,
    0x2082: 0x1002082,
    0x2083: 0x1002083,
    0x2084: 0x1002084,
    0x2085: 0x1002085,
    0x2086: 0x1002086,
    0x2087: 0x1002087,
    0x2088: 0x1002088,
    0x2089: 0x1002089,
    0x2202: 0x1002202,
    0x2205: 0x1002205,
    0x2208: 0x1002208,
    0x2209: 0x1002209,
    0x220B: 0x100220B,
    0x221A: 0x100221A,
    0x221B: 0x100221B,
    0x221C: 0x100221C,
    0x222C: 0x100222C,
    0x222D: 0x100222D,
    0x2235: 0x1002235,
    0x2245: 0x1002248,
    0x2247: 0x1002247,
    0x2262: 0x1002262,
    0x2263: 0x1002263,
    0x2800: 0x1002800,
    0x2801: 0x1002801,
    0x2802: 0x1002802,
    0x2803: 0x1002803,
    0x2804: 0x1002804,
    0x2805: 0x1002805,
    0x2806: 0x1002806,
    0x2807: 0x1002807,
    0x2808: 0x1002808,
    0x2809: 0x1002809,
    0x280a: 0x100280a,
    0x280b: 0x100280b,
    0x280c: 0x100280c,
    0x280d: 0x100280d,
    0x280e: 0x100280e,
    0x280f: 0x100280f,
    0x2810: 0x1002810,
    0x2811: 0x1002811,
    0x2812: 0x1002812,
    0x2813: 0x1002813,
    0x2814: 0x1002814,
    0x2815: 0x1002815,
    0x2816: 0x1002816,
    0x2817: 0x1002817,
    0x2818: 0x1002818,
    0x2819: 0x1002819,
    0x281a: 0x100281a,
    0x281b: 0x100281b,
    0x281c: 0x100281c,
    0x281d: 0x100281d,
    0x281e: 0x100281e,
    0x281f: 0x100281f,
    0x2820: 0x1002820,
    0x2821: 0x1002821,
    0x2822: 0x1002822,
    0x2823: 0x1002823,
    0x2824: 0x1002824,
    0x2825: 0x1002825,
    0x2826: 0x1002826,
    0x2827: 0x1002827,
    0x2828: 0x1002828,
    0x2829: 0x1002829,
    0x282a: 0x100282a,
    0x282b: 0x100282b,
    0x282c: 0x100282c,
    0x282d: 0x100282d,
    0x282e: 0x100282e,
    0x282f: 0x100282f,
    0x2830: 0x1002830,
    0x2831: 0x1002831,
    0x2832: 0x1002832,
    0x2833: 0x1002833,
    0x2834: 0x1002834,
    0x2835: 0x1002835,
    0x2836: 0x1002836,
    0x2837: 0x1002837,
    0x2838: 0x1002838,
    0x2839: 0x1002839,
    0x283a: 0x100283a,
    0x283b: 0x100283b,
    0x283c: 0x100283c,
    0x283d: 0x100283d,
    0x283e: 0x100283e,
    0x283f: 0x100283f,
    0x2840: 0x1002840,
    0x2841: 0x1002841,
    0x2842: 0x1002842,
    0x2843: 0x1002843,
    0x2844: 0x1002844,
    0x2845: 0x1002845,
    0x2846: 0x1002846,
    0x2847: 0x1002847,
    0x2848: 0x1002848,
    0x2849: 0x1002849,
    0x284a: 0x100284a,
    0x284b: 0x100284b,
    0x284c: 0x100284c,
    0x284d: 0x100284d,
    0x284e: 0x100284e,
    0x284f: 0x100284f,
    0x2850: 0x1002850,
    0x2851: 0x1002851,
    0x2852: 0x1002852,
    0x2853: 0x1002853,
    0x2854: 0x1002854,
    0x2855: 0x1002855,
    0x2856: 0x1002856,
    0x2857: 0x1002857,
    0x2858: 0x1002858,
    0x2859: 0x1002859,
    0x285a: 0x100285a,
    0x285b: 0x100285b,
    0x285c: 0x100285c,
    0x285d: 0x100285d,
    0x285e: 0x100285e,
    0x285f: 0x100285f,
    0x2860: 0x1002860,
    0x2861: 0x1002861,
    0x2862: 0x1002862,
    0x2863: 0x1002863,
    0x2864: 0x1002864,
    0x2865: 0x1002865,
    0x2866: 0x1002866,
    0x2867: 0x1002867,
    0x2868: 0x1002868,
    0x2869: 0x1002869,
    0x286a: 0x100286a,
    0x286b: 0x100286b,
    0x286c: 0x100286c,
    0x286d: 0x100286d,
    0x286e: 0x100286e,
    0x286f: 0x100286f,
    0x2870: 0x1002870,
    0x2871: 0x1002871,
    0x2872: 0x1002872,
    0x2873: 0x1002873,
    0x2874: 0x1002874,
    0x2875: 0x1002875,
    0x2876: 0x1002876,
    0x2877: 0x1002877,
    0x2878: 0x1002878,
    0x2879: 0x1002879,
    0x287a: 0x100287a,
    0x287b: 0x100287b,
    0x287c: 0x100287c,
    0x287d: 0x100287d,
    0x287e: 0x100287e,
    0x287f: 0x100287f,
    0x2880: 0x1002880,
    0x2881: 0x1002881,
    0x2882: 0x1002882,
    0x2883: 0x1002883,
    0x2884: 0x1002884,
    0x2885: 0x1002885,
    0x2886: 0x1002886,
    0x2887: 0x1002887,
    0x2888: 0x1002888,
    0x2889: 0x1002889,
    0x288a: 0x100288a,
    0x288b: 0x100288b,
    0x288c: 0x100288c,
    0x288d: 0x100288d,
    0x288e: 0x100288e,
    0x288f: 0x100288f,
    0x2890: 0x1002890,
    0x2891: 0x1002891,
    0x2892: 0x1002892,
    0x2893: 0x1002893,
    0x2894: 0x1002894,
    0x2895: 0x1002895,
    0x2896: 0x1002896,
    0x2897: 0x1002897,
    0x2898: 0x1002898,
    0x2899: 0x1002899,
    0x289a: 0x100289a,
    0x289b: 0x100289b,
    0x289c: 0x100289c,
    0x289d: 0x100289d,
    0x289e: 0x100289e,
    0x289f: 0x100289f,
    0x28a0: 0x10028a0,
    0x28a1: 0x10028a1,
    0x28a2: 0x10028a2,
    0x28a3: 0x10028a3,
    0x28a4: 0x10028a4,
    0x28a5: 0x10028a5,
    0x28a6: 0x10028a6,
    0x28a7: 0x10028a7,
    0x28a8: 0x10028a8,
    0x28a9: 0x10028a9,
    0x28aa: 0x10028aa,
    0x28ab: 0x10028ab,
    0x28ac: 0x10028ac,
    0x28ad: 0x10028ad,
    0x28ae: 0x10028ae,
    0x28af: 0x10028af,
    0x28b0: 0x10028b0,
    0x28b1: 0x10028b1,
    0x28b2: 0x10028b2,
    0x28b3: 0x10028b3,
    0x28b4: 0x10028b4,
    0x28b5: 0x10028b5,
    0x28b6: 0x10028b6,
    0x28b7: 0x10028b7,
    0x28b8: 0x10028b8,
    0x28b9: 0x10028b9,
    0x28ba: 0x10028ba,
    0x28bb: 0x10028bb,
    0x28bc: 0x10028bc,
    0x28bd: 0x10028bd,
    0x28be: 0x10028be,
    0x28bf: 0x10028bf,
    0x28c0: 0x10028c0,
    0x28c1: 0x10028c1,
    0x28c2: 0x10028c2,
    0x28c3: 0x10028c3,
    0x28c4: 0x10028c4,
    0x28c5: 0x10028c5,
    0x28c6: 0x10028c6,
    0x28c7: 0x10028c7,
    0x28c8: 0x10028c8,
    0x28c9: 0x10028c9,
    0x28ca: 0x10028ca,
    0x28cb: 0x10028cb,
    0x28cc: 0x10028cc,
    0x28cd: 0x10028cd,
    0x28ce: 0x10028ce,
    0x28cf: 0x10028cf,
    0x28d0: 0x10028d0,
    0x28d1: 0x10028d1,
    0x28d2: 0x10028d2,
    0x28d3: 0x10028d3,
    0x28d4: 0x10028d4,
    0x28d5: 0x10028d5,
    0x28d6: 0x10028d6,
    0x28d7: 0x10028d7,
    0x28d8: 0x10028d8,
    0x28d9: 0x10028d9,
    0x28da: 0x10028da,
    0x28db: 0x10028db,
    0x28dc: 0x10028dc,
    0x28dd: 0x10028dd,
    0x28de: 0x10028de,
    0x28df: 0x10028df,
    0x28e0: 0x10028e0,
    0x28e1: 0x10028e1,
    0x28e2: 0x10028e2,
    0x28e3: 0x10028e3,
    0x28e4: 0x10028e4,
    0x28e5: 0x10028e5,
    0x28e6: 0x10028e6,
    0x28e7: 0x10028e7,
    0x28e8: 0x10028e8,
    0x28e9: 0x10028e9,
    0x28ea: 0x10028ea,
    0x28eb: 0x10028eb,
    0x28ec: 0x10028ec,
    0x28ed: 0x10028ed,
    0x28ee: 0x10028ee,
    0x28ef: 0x10028ef,
    0x28f0: 0x10028f0,
    0x28f1: 0x10028f1,
    0x28f2: 0x10028f2,
    0x28f3: 0x10028f3,
    0x28f4: 0x10028f4,
    0x28f5: 0x10028f5,
    0x28f6: 0x10028f6,
    0x28f7: 0x10028f7,
    0x28f8: 0x10028f8,
    0x28f9: 0x10028f9,
    0x28fa: 0x10028fa,
    0x28fb: 0x10028fb,
    0x28fc: 0x10028fc,
    0x28fd: 0x10028fd,
    0x28fe: 0x10028fe,
    0x28ff: 0x10028ff
};

var ON_KEYDOWN = 1 << 0; /* Report on keydown, otherwise wait until keypress  */


var specialKeyTable = {
    // These generate a keyDown and keyPress in Firefox and Opera
    8: [0xFF08, ON_KEYDOWN], // BACKSPACE
    13: [0xFF0D, ON_KEYDOWN], // ENTER

    // This generates a keyDown and keyPress in Opera
    9: [0xFF09, ON_KEYDOWN], // TAB

    27: 0xFF1B, // ESCAPE
    46: 0xFFFF, // DELETE
    36: 0xFF50, // HOME
    35: 0xFF57, // END
    33: 0xFF55, // PAGE_UP
    34: 0xFF56, // PAGE_DOWN
    45: 0xFF63, // INSERT
    37: 0xFF51, // LEFT
    38: 0xFF52, // UP
    39: 0xFF53, // RIGHT
    40: 0xFF54, // DOWN
    16: 0xFFE1, // SHIFT
    17: 0xFFE3, // CONTROL
    18: 0xFFE9, // Left ALT (Mac Command)
    112: 0xFFBE, // F1
    113: 0xFFBF, // F2
    114: 0xFFC0, // F3
    115: 0xFFC1, // F4
    116: 0xFFC2, // F5
    117: 0xFFC3, // F6
    118: 0xFFC4, // F7
    119: 0xFFC5, // F8
    120: 0xFFC6, // F9
    121: 0xFFC7, // F10
    122: 0xFFC8, // F11
    123: 0xFFC9  // F12
};

function getEventKeySym(ev) {
    if (typeof ev.which !== "undefined" && ev.which > 0)
	return ev.which;
    return ev.keyCode;
}

// This is based on the approach from noVNC. We handle
// everything in keydown that we have all info for, and that
// are not safe to pass on to the browser (as it may do something
// with the key. The rest we pass on to keypress so we can get the
// translated keysym.
function getKeysymSpecial(ev) {
    if (ev.keyCode in specialKeyTable) {
	var r = specialKeyTable[ev.keyCode];
	var flags = 0;
	if (typeof r != 'number') {
	    flags = r[1];
	    r = r[0];
	}
	if (ev.type === 'keydown' || flags & ON_KEYDOWN)
	    return r;
    }
    // If we don't hold alt or ctrl, then we should be safe to pass
    // on to keypressed and look at the translated data
    if (!ev.ctrlKey && !ev.altKey)
	return null;

    var keysym = getEventKeySym(ev);

    /* Remap symbols */
    switch (keysym) {
    case 186 : keysym = 59; break; // ; (IE)
    case 187 : keysym = 61; break; // = (IE)
    case 188 : keysym = 44; break; // , (Mozilla, IE)
    case 109 : // - (Mozilla, Opera)
	if (true /* TODO: check if browser is firefox or opera */)
	    keysym = 45;
	break;
    case 189 : keysym = 45; break; // - (IE)
    case 190 : keysym = 46; break; // . (Mozilla, IE)
    case 191 : keysym = 47; break; // / (Mozilla, IE)
    case 192 : keysym = 96; break; // ` (Mozilla, IE)
    case 219 : keysym = 91; break; // [ (Mozilla, IE)
    case 220 : keysym = 92; break; // \ (Mozilla, IE)
    case 221 : keysym = 93; break; // ] (Mozilla, IE)
    case 222 : keysym = 39; break; // ' (Mozilla, IE)
    }

    /* Remap shifted and unshifted keys */
    if (!!ev.shiftKey) {
	switch (keysym) {
	case 48 : keysym = 41 ; break; // ) (shifted 0)
	case 49 : keysym = 33 ; break; // ! (shifted 1)
	case 50 : keysym = 64 ; break; // @ (shifted 2)
	case 51 : keysym = 35 ; break; // # (shifted 3)
	case 52 : keysym = 36 ; break; // $ (shifted 4)
	case 53 : keysym = 37 ; break; // % (shifted 5)
	case 54 : keysym = 94 ; break; // ^ (shifted 6)
	case 55 : keysym = 38 ; break; // & (shifted 7)
	case 56 : keysym = 42 ; break; // * (shifted 8)
	case 57 : keysym = 40 ; break; // ( (shifted 9)
	case 59 : keysym = 58 ; break; // : (shifted `)
	case 61 : keysym = 43 ; break; // + (shifted ;)
	case 44 : keysym = 60 ; break; // < (shifted ,)
	case 45 : keysym = 95 ; break; // _ (shifted -)
	case 46 : keysym = 62 ; break; // > (shifted .)
	case 47 : keysym = 63 ; break; // ? (shifted /)
	case 96 : keysym = 126; break; // ~ (shifted `)
	case 91 : keysym = 123; break; // { (shifted [)
	case 92 : keysym = 124; break; // | (shifted \)
	case 93 : keysym = 125; break; // } (shifted ])
	case 39 : keysym = 34 ; break; // " (shifted ')
	}
    } else if ((keysym >= 65) && (keysym <=90)) {
	/* Remap unshifted A-Z */
	keysym += 32;
    } else if (ev.keyLocation === 3) {
	// numpad keys
	switch (keysym) {
	case 96 : keysym = 48; break; // 0
	case 97 : keysym = 49; break; // 1
	case 98 : keysym = 50; break; // 2
	case 99 : keysym = 51; break; // 3
	case 100: keysym = 52; break; // 4
	case 101: keysym = 53; break; // 5
	case 102: keysym = 54; break; // 6
	case 103: keysym = 55; break; // 7
	case 104: keysym = 56; break; // 8
	case 105: keysym = 57; break; // 9
	case 109: keysym = 45; break; // -
	case 110: keysym = 46; break; // .
	case 111: keysym = 47; break; // /
	}
    }

    return keysym;
}

/* Translate DOM keyPress event to keysym value */
function getKeysym(ev) {
    var keysym, msg;

    keysym = getEventKeySym(ev);

    if ((keysym > 255) && (keysym < 0xFF00)) {
	// Map Unicode outside Latin 1 to gdk keysyms
	keysym = unicodeTable[keysym];
	if (typeof keysym === 'undefined')
	    keysym = 0;
    }

    return keysym;
}

function copyKeyEvent(ev) {
    var members = ['type', 'keyCode', 'charCode', 'which',
		   'altKey', 'ctrlKey', 'shiftKey',
		   'keyLocation', 'keyIdentifier'], i, obj = {};
    for (i = 0; i < members.length; i++) {
	if (typeof ev[members[i]] !== "undefined")
	    obj[members[i]] = ev[members[i]];
    }
    return obj;
}

function pushKeyEvent(fev) {
    keyDownList.push(fev);
}

function copyInputEvent(ev) {
    var members = ['inputType', 'data'], i, obj = {};
    for (i = 0; i < members.length; i++) {
	if (typeof ev[members[i]] !== "undefined")
	    obj[members[i]] = ev[members[i]];
    }
    return obj;
}

function pushInputEvent(fev) {
    inputList.push(fev);
}

function getKeyEvent(keyCode, pop) {
    var i, fev = null;
    for (i = keyDownList.length-1; i >= 0; i--) {
	if (keyDownList[i].keyCode === keyCode) {
	    if ((typeof pop !== "undefined") && pop)
		fev = keyDownList.splice(i, 1)[0];
	    else
		fev = keyDownList[i];
	    break;
	}
    }
    return fev;
}

function ignoreKeyEvent(ev) {
    // Blarg. Some keys have a different keyCode on keyDown vs keyUp
    if (ev.keyCode === 229) {
	// French AZERTY keyboard dead key.
	// Lame thing is that the respective keyUp is 219 so we can't
	// properly ignore the keyUp event
	return true;
    }
    return false;
}

function handleKeyDown(e) {
    var fev = null, ev = (e ? e : window.event), keysym = null, suppress = false;

    fev = copyKeyEvent(ev);

    keysym = getKeysymSpecial(ev);
    // Save keysym decoding for use in keyUp
    fev.keysym = keysym;
    if (keysym) {
	// If it is a key or key combination that might trigger
	// browser behaviors or it has no corresponding keyPress
	// event, then send it immediately
	if (!ignoreKeyEvent(ev)) {
	    sendInput("k", [keysym, lastState]);
	}
	suppress = true;
    }

    if (! ignoreKeyEvent(ev)) {
	// Add it to the list of depressed keys
	pushKeyEvent(fev);
    }

    if (suppress) {
	// Suppress bubbling/default actions
	return cancelEvent(ev);
    }

    // Allow the event to bubble and become a keyPress event which
    // will have the character code translated
    return true;
}

function handleKeyPress(e) {
    var ev = (e ? e : window.event), kdlen = keyDownList.length, keysym = null;

    if (((ev.which !== "undefined") && (ev.which === 0)) ||
	getKeysymSpecial(ev)) {
	// Firefox and Opera generate a keyPress event even if keyDown
	// is suppressed. But the keys we want to suppress will have
	// either:
	// - the which attribute set to 0
	// - getKeysymSpecial() will identify it
	return cancelEvent(ev);
    }

    keysym = getKeysym(ev);

    // Modify the which attribute in the depressed keys list so
    // that the keyUp event will be able to have the character code
    // translation available.
    if (kdlen > 0) {
	keyDownList[kdlen-1].keysym = keysym;
    } else {
	//log("keyDownList empty when keyPress triggered");
    }

    // Send the translated keysym
    if (keysym > 0) {
	sendInput ("k", [keysym, lastState]);
    }

    // Stop keypress events just in case
    return cancelEvent(ev);
}

function handleKeyUp(e) {
    var fev = null, ev = (e ? e : window.event), i, keysym;

    fev = getKeyEvent(ev.keyCode, true);

    if (fev)
	keysym = fev.keysym;
    else {
	//log("Key event (keyCode = " + ev.keyCode + ") not found on keyDownList");
	if (isAndroidChrome && (ev.keyCode == 229)) {
	    var i, fev = null, len = inputList.length, str;
	    for (i = 0; i < len; i++) {
		fev = inputList[i];
		switch(fev.inputType) {
		case "deleteContentBackward":
		    sendInput ("k", [65288, lastState]);
		    sendInput ("K", [65288, lastState]);
		    break;
		case "insertText":
		    if (fev.data !== undefined) {
			for (let sym of fev.data) {
			    sendInput ("k", [sym.codePointAt(0), lastState]);
			    sendInput ("K", [sym.codePointAt(0), lastState]);
			}
		    }
		    break;
		default:
		    break;
		}
	    }
	    inputList.splice(0, len);
	}
	keysym = 0;
    }

    if (keysym > 0) {
	sendInput ("K", [keysym, lastState]);
    }
    return cancelEvent(ev);
}

function handleInput (e)  {
    var fev = null, ev = (e ? e : window.event), keysym = null, suppress = false;

    fev = copyInputEvent(ev);
    pushInputEvent(fev);

    // Stop keypress events just in case
    return cancelEvent(ev);
}

function onKeyDown (ev) {
    updateForEvent(ev);
    return handleKeyDown(ev);
}

function onKeyPress(ev) {
    updateForEvent(ev);
    return handleKeyPress(ev);
}

function onKeyUp (ev) {
    updateForEvent(ev);
    return handleKeyUp(ev);
}

function onInput (ev) {
    updateForEvent(ev);
    return handleInput(ev);
}

function cancelEvent(ev)
{
    ev = ev ? ev : window.event;
    if (ev.stopPropagation)
	ev.stopPropagation();
    if (ev.preventDefault)
	ev.preventDefault();
    ev.cancelBubble = true;
    ev.cancel = true;
    ev.returnValue = false;
    return false;
}

function onMouseWheel(ev)
{
    updateForEvent(ev);
    ev = ev ? ev : window.event;

    var id = getSurfaceId(ev);
    var pos = getPositionsFromEvent(ev, id);

    var offset = ev.detail ? ev.detail : -ev.wheelDelta;
    var dir = 0;
    if (offset > 0)
	dir = 1;
    sendInput ("s", [realWindowWithMouse, id, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState, dir]);

    return cancelEvent(ev);
}

function onTouchStart(ev) {
    ev.preventDefault();

    updateKeyboardStatus();
    updateForEvent(ev);

    for (var i = 0; i < ev.changedTouches.length; i++) {
        var touch = ev.changedTouches.item(i);
	var touchId = touchIdentifierStart(touch.identifier);

        var origId = getSurfaceId(touch);
        var id = getEffectiveEventTarget (origId);
        var pos = getPositionsFromEvent(touch, id);
        var isEmulated = 0;

        if (firstTouchDownId == null) {
            firstTouchDownId = touchId;
            isEmulated = 1;

            if (realWindowWithMouse != origId || id != windowWithMouse) {
                if (id != 0) {
                    sendInput ("l", [realWindowWithMouse, id, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState, GDK_CROSSING_NORMAL]);
                }

                windowWithMouse = id;
                realWindowWithMouse = origId;

                sendInput ("e", [origId, id, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState, GDK_CROSSING_NORMAL]);
            }
        }

        sendInput ("t", [0, id, touchId, isEmulated, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState]);
    }
}

function onTouchMove(ev) {
    ev.preventDefault();

    updateKeyboardStatus();
    updateForEvent(ev);

    for (var i = 0; i < ev.changedTouches.length; i++) {
        var touch = ev.changedTouches.item(i);
	var touchId = touchIdentifier(touch.identifier);

        var origId = getSurfaceId(touch);
        var id = getEffectiveEventTarget (origId);
        var pos = getPositionsFromEvent(touch, id);

        var isEmulated = 0;
        if (firstTouchDownId == touchId) {
            isEmulated = 1;
        }

        sendInput ("t", [1, id, touchId, isEmulated, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState]);
    }
}

function onTouchEnd(ev) {
    ev.preventDefault();

    updateKeyboardStatus();
    updateForEvent(ev);

    for (var i = 0; i < ev.changedTouches.length; i++) {
        var touch = ev.changedTouches.item(i);
	var touchId = touchIdentifier(touch.identifier);

        var origId = getSurfaceId(touch);
        var id = getEffectiveEventTarget (origId);
        var pos = getPositionsFromEvent(touch, id);

        var isEmulated = 0;
        if (firstTouchDownId == touchId) {
            isEmulated = 1;
            firstTouchDownId = null;
        }

        sendInput ("t", [2, id, touchId, isEmulated, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState]);
    }
}

function setupDocument(document)
{
    document.oncontextmenu = function () { return false; };
    document.onmousemove = onMouseMove;
    document.onmouseover = onMouseOver;
    document.onmouseout = onMouseOut;
    document.onmousedown = onMouseDown;
    document.onmouseup = onMouseUp;
    document.onkeydown = onKeyDown;
    document.onkeypress = onKeyPress;
    document.onkeyup = onKeyUp;

    if (document.addEventListener) {
	document.addEventListener('DOMMouseScroll', onMouseWheel, passiveSupported ? { passive: false, capture: false } : false);
	document.addEventListener('mousewheel', onMouseWheel, passiveSupported ? { passive: false, capture: false } : false);
	document.addEventListener('touchstart', onTouchStart, passiveSupported ? { passive: false, capture: false } : false);
	document.addEventListener('touchmove', onTouchMove, passiveSupported ? { passive: false, capture: false } : false);
	document.addEventListener('touchend', onTouchEnd, passiveSupported ? { passive: false, capture: false } : false);
    } else if (document.attachEvent) {
      element.attachEvent("onmousewheel", onMouseWheel);
    }
}

function start()
{
    setupDocument(document);

    var w, h;
    w = window.innerWidth;
    h = window.innerHeight;
    window.onresize = function(ev) {
	var w, h;
	w = window.innerWidth;
	h = window.innerHeight;
	sendInput ("d", [w, h]);
    };
    sendInput ("d", [w, h]);
}

function connect()
{
    var url = window.location.toString();
    var query_string = url.split("?");
    if (query_string.length > 1) {
	var params = query_string[1].split("&");

        for (var i=0; i<params.length; i++) {
            var pair = params[i].split("=");
            if (pair[0] == "debug" && pair[1] == "decoding")
                debugDecoding = true;
        }
    }

    var loc = window.location.toString().replace("http:", "ws:").replace("https:", "wss:");
    loc = loc.substr(0, loc.lastIndexOf('/')) + "/socket";
    ws = new WebSocket(loc, "broadway");
    ws.binaryType = "arraybuffer";

    ws.onopen = function() {
	inputSocket = ws;
    };
    ws.onclose = function() {
	if (inputSocket != null)
	    alert ("disconnected");
	inputSocket = null;
    };
    ws.onmessage = function(event) {
	handleMessage(event.data);
    };

    var iOS = /(iPad|iPhone|iPod)/g.test( navigator.userAgent );
    if (iOS || isAndroidChrome) {
        fakeInput = document.createElement("input");
        fakeInput.type = "text";
        fakeInput.style.position = "absolute";
        fakeInput.style.left = "-1000px";
        fakeInput.style.top = "-1000px";
        document.body.appendChild(fakeInput);
	if (isAndroidChrome)
	    fakeInput.addEventListener('input', onInput, passiveSupported ? { passive: false, capture: false } : false);
    }
}
/** @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License */(function() {'use strict';var l=void 0,p=this;function q(c,d){var a=c.split("."),b=p;!(a[0]in b)&&b.execScript&&b.execScript("var "+a[0]);for(var e;a.length&&(e=a.shift());)!a.length&&d!==l?b[e]=d:b=b[e]?b[e]:b[e]={}};var r="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array;function u(c){var d=c.length,a=0,b=Number.POSITIVE_INFINITY,e,f,g,h,k,m,s,n,t;for(n=0;n<d;++n)c[n]>a&&(a=c[n]),c[n]<b&&(b=c[n]);e=1<<a;f=new (r?Uint32Array:Array)(e);g=1;h=0;for(k=2;g<=a;){for(n=0;n<d;++n)if(c[n]===g){m=0;s=h;for(t=0;t<g;++t)m=m<<1|s&1,s>>=1;for(t=m;t<e;t+=k)f[t]=g<<16|n;++h}++g;h<<=1;k<<=1}return[f,a,b]};function v(c,d){this.g=[];this.h=32768;this.c=this.f=this.d=this.k=0;this.input=r?new Uint8Array(c):c;this.l=!1;this.i=w;this.p=!1;if(d||!(d={}))d.index&&(this.d=d.index),d.bufferSize&&(this.h=d.bufferSize),d.bufferType&&(this.i=d.bufferType),d.resize&&(this.p=d.resize);switch(this.i){case x:this.a=32768;this.b=new (r?Uint8Array:Array)(32768+this.h+258);break;case w:this.a=0;this.b=new (r?Uint8Array:Array)(this.h);this.e=this.u;this.m=this.r;this.j=this.s;break;default:throw Error("invalid inflate mode");
}}var x=0,w=1;
v.prototype.t=function(){for(;!this.l;){var c=y(this,3);c&1&&(this.l=!0);c>>>=1;switch(c){case 0:var d=this.input,a=this.d,b=this.b,e=this.a,f=l,g=l,h=l,k=b.length,m=l;this.c=this.f=0;f=d[a++];if(f===l)throw Error("invalid uncompressed block header: LEN (first byte)");g=f;f=d[a++];if(f===l)throw Error("invalid uncompressed block header: LEN (second byte)");g|=f<<8;f=d[a++];if(f===l)throw Error("invalid uncompressed block header: NLEN (first byte)");h=f;f=d[a++];if(f===l)throw Error("invalid uncompressed block header: NLEN (second byte)");h|=
f<<8;if(g===~h)throw Error("invalid uncompressed block header: length verify");if(a+g>d.length)throw Error("input buffer is broken");switch(this.i){case x:for(;e+g>b.length;){m=k-e;g-=m;if(r)b.set(d.subarray(a,a+m),e),e+=m,a+=m;else for(;m--;)b[e++]=d[a++];this.a=e;b=this.e();e=this.a}break;case w:for(;e+g>b.length;)b=this.e({o:2});break;default:throw Error("invalid inflate mode");}if(r)b.set(d.subarray(a,a+g),e),e+=g,a+=g;else for(;g--;)b[e++]=d[a++];this.d=a;this.a=e;this.b=b;break;case 1:this.j(z,
A);break;case 2:B(this);break;default:throw Error("unknown BTYPE: "+c);}}return this.m()};
var C=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],D=r?new Uint16Array(C):C,E=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,258,258],F=r?new Uint16Array(E):E,G=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0],H=r?new Uint8Array(G):G,I=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],J=r?new Uint16Array(I):I,K=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,
13],L=r?new Uint8Array(K):K,M=new (r?Uint8Array:Array)(288),N,O;N=0;for(O=M.length;N<O;++N)M[N]=143>=N?8:255>=N?9:279>=N?7:8;var z=u(M),P=new (r?Uint8Array:Array)(30),Q,R;Q=0;for(R=P.length;Q<R;++Q)P[Q]=5;var A=u(P);function y(c,d){for(var a=c.f,b=c.c,e=c.input,f=c.d,g;b<d;){g=e[f++];if(g===l)throw Error("input buffer is broken");a|=g<<b;b+=8}g=a&(1<<d)-1;c.f=a>>>d;c.c=b-d;c.d=f;return g}
function S(c,d){for(var a=c.f,b=c.c,e=c.input,f=c.d,g=d[0],h=d[1],k,m,s;b<h;){k=e[f++];if(k===l)break;a|=k<<b;b+=8}m=g[a&(1<<h)-1];s=m>>>16;c.f=a>>s;c.c=b-s;c.d=f;return m&65535}
function B(c){function d(a,c,b){var d,f,e,g;for(g=0;g<a;)switch(d=S(this,c),d){case 16:for(e=3+y(this,2);e--;)b[g++]=f;break;case 17:for(e=3+y(this,3);e--;)b[g++]=0;f=0;break;case 18:for(e=11+y(this,7);e--;)b[g++]=0;f=0;break;default:f=b[g++]=d}return b}var a=y(c,5)+257,b=y(c,5)+1,e=y(c,4)+4,f=new (r?Uint8Array:Array)(D.length),g,h,k,m;for(m=0;m<e;++m)f[D[m]]=y(c,3);g=u(f);h=new (r?Uint8Array:Array)(a);k=new (r?Uint8Array:Array)(b);c.j(u(d.call(c,a,g,h)),u(d.call(c,b,g,k)))}
v.prototype.j=function(c,d){var a=this.b,b=this.a;this.n=c;for(var e=a.length-258,f,g,h,k;256!==(f=S(this,c));)if(256>f)b>=e&&(this.a=b,a=this.e(),b=this.a),a[b++]=f;else{g=f-257;k=F[g];0<H[g]&&(k+=y(this,H[g]));f=S(this,d);h=J[f];0<L[f]&&(h+=y(this,L[f]));b>=e&&(this.a=b,a=this.e(),b=this.a);for(;k--;)a[b]=a[b++-h]}for(;8<=this.c;)this.c-=8,this.d--;this.a=b};
v.prototype.s=function(c,d){var a=this.b,b=this.a;this.n=c;for(var e=a.length,f,g,h,k;256!==(f=S(this,c));)if(256>f)b>=e&&(a=this.e(),e=a.length),a[b++]=f;else{g=f-257;k=F[g];0<H[g]&&(k+=y(this,H[g]));f=S(this,d);h=J[f];0<L[f]&&(h+=y(this,L[f]));b+k>e&&(a=this.e(),e=a.length);for(;k--;)a[b]=a[b++-h]}for(;8<=this.c;)this.c-=8,this.d--;this.a=b};
v.prototype.e=function(){var c=new (r?Uint8Array:Array)(this.a-32768),d=this.a-32768,a,b,e=this.b;if(r)c.set(e.subarray(32768,c.length));else{a=0;for(b=c.length;a<b;++a)c[a]=e[a+32768]}this.g.push(c);this.k+=c.length;if(r)e.set(e.subarray(d,d+32768));else for(a=0;32768>a;++a)e[a]=e[d+a];this.a=32768;return e};
v.prototype.u=function(c){var d,a=this.input.length/this.d+1|0,b,e,f,g=this.input,h=this.b;c&&("number"===typeof c.o&&(a=c.o),"number"===typeof c.q&&(a+=c.q));2>a?(b=(g.length-this.d)/this.n[2],f=258*(b/2)|0,e=f<h.length?h.length+f:h.length<<1):e=h.length*a;r?(d=new Uint8Array(e),d.set(h)):d=h;return this.b=d};
v.prototype.m=function(){var c=0,d=this.b,a=this.g,b,e=new (r?Uint8Array:Array)(this.k+(this.a-32768)),f,g,h,k;if(0===a.length)return r?this.b.subarray(32768,this.a):this.b.slice(32768,this.a);f=0;for(g=a.length;f<g;++f){b=a[f];h=0;for(k=b.length;h<k;++h)e[c++]=b[h]}f=32768;for(g=this.a;f<g;++f)e[c++]=d[f];this.g=[];return this.buffer=e};
v.prototype.r=function(){var c,d=this.a;r?this.p?(c=new Uint8Array(d),c.set(this.b.subarray(0,d))):c=this.b.subarray(0,d):(this.b.length>d&&(this.b.length=d),c=this.b);return this.buffer=c};q("Zlib.RawInflate",v);q("Zlib.RawInflate.prototype.decompress",v.prototype.t);var T={ADAPTIVE:w,BLOCK:x},U,V,W,X;if(Object.keys)U=Object.keys(T);else for(V in U=[],W=0,T)U[W++]=V;W=0;for(X=U.length;W<X;++W)V=U[W],q("Zlib.RawInflate.BufferType."+V,T[V]);}).call(this); //@ sourceMappingURL=rawinflate.min.js.map
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>broadway 2.0</title>
<style type="text/css">
body { overflow: hidden; }
</style>
<script type="text/javascript" src="broadway.js"></script>
</head>

<body onload="connect()" onclick="if (!document.hasFocus() && window.topElement !== window.self) { window.focus(); }">
</body>
</html>
ddbroadway_output_put_buffer;xN4T����\����\���e��\$e���Tj���Dk��Tl��0tl��Hr��,�t��|v���x��Dx���x��<y��Xdy��x�y���~������ $���LԀ���D���������Đ��p���4��������������ē�����,���d�������������<	�����	��	t����	��
4���4
����h
����
4����
D����
T������x��������$����$���|��������
$���8
4���t
d����
t����
�����
t���t���T��d����d��������ĸ��$Ը��8��L���t��������84���h��������D����X�����T�������4���tzRx��g��&D$4�Q��`FJw�?9*3$"\�Y�� t�Y��P(�8h��
A�D�D �
DAF�i��HR��$i���F�B�B �B(�A0�D8�G�m
8A0A(B BBBA^
8D0A(B BBBE�Z�M�A�g�T�]�A�T\Ha��)F�N�B �A(�A0�G�-�H�Y�A�g
0A(A BBBAL��m���F�E�E �B(�A0�A8�D��
8A0A(B BBBA,`p��E�M�D`�
FAAP4Pq���F�I�D �D0

 AABHD8p@T0L8]@e8C0K
8]@B��r��4E�i� s��ADPO ]�Ps��zE�p��s��LE�e
F[�s��E�S\�s���B�B�B �B(�A0�A8�D�b�J�c�A��
8A0A(B BBBF(|x��A�A�G��
AAC(�ly���B�I�C �qAB8��y���B�D�H �D(�A0��(A BBB@Dz��jB�B�B �A(�D0�Dp�
0A(A BBBD(Tp���?E�D�G \
AABt�����?	F�D�B �B(�A0�F8�D�t
8D0A(B BBBF�
8J0A(B BBBLe�N�J�F��L���HR,T���JA�E�J�
AAA(@t���KE�A�D z
AAAl���� ����������?E�V
E^T�Ћ���F�E�E �E(�D0�C8�D@�HIPVHA@s
8D0A(B BBBGDX���F�E�A �D(�D0W8M@O8A0o
(D ABBHT����;E�W
DZLt�����F�E�E �D(�D0�C
(A BBBFK
(A BBBFL�@��� F�B�A �C(�Gp�
(D ABBH�
(A ABBF���DE�q
JC04@���yE�D�J M
FAIDCA0h����gE�D�G @
AANDAA�ȑ��OE�j
A^0�����gE�D�G @
AANDAA(�4���oE�F�G y
AACx���E�W8|���DLx���
O�E�D �D(�D0�(A ABBG����A0����h�@����F�H�E �B(�D0�D8�F@HGPIHA@I
8A0A(B BBBJZ8C0A(B BBB(	�����E�A�D`�
AAH ,	8����E�W
DQ
G(P	�����E�A�G d
CAKd|	(����F�D�E �E(�A0�D8�DP
8D0A(B BBBH�
8A0A(B BBBE�	�X��P������T
�����F�E�E �E(�D0�I8�DPqXI`NXAPF
8A0A(B BBBA(\
(����A�G A
AF^
AA4�
�����A�C�G D
AAGN
AAH8�
��
B�D�C �\
ABH�
ABJ�
����"E�X̚��,Ț��H@Ě���F�B�J �E(�D0�A8�FP�
8D0A(B BBBAL�h����F�F�B �B(�A0�D8�G��	
8A0A(B BBBA,����xB�A�A �O
ABJ h���lE�T0L
AA00�����F�F�A �D@s
 CABF(d����@F�I�C �jAB�����E�O����������L������F�B�B �D(�C0��
(A BBBFA
(D IBBN8$
@����F�B�A �A(�G0T
(D ABBB\`
����5F�J�E �E(�D0�D8�GP�
8A0A(B BBBED8K0A(B BBB,�
t���xF�A�A �P
ABE8�
��F�B�A �C(�G0o
(A ABBH8,8����F�B�A �C(�G0o
(A ABBH8h�����F�B�A �C(�G0o
(A ABBH8� ����F�B�A �C(�G0o
(A ABBH8������F�B�A �C(�G0o
(A ABBH8����F�B�A �C(�G0o
(A ABBH`X|���vF�D�B �B(�A0�A8�DPM
8A0A(B BBBE�
8A0A(B BBBI<������F�B�B �D(�C0��
(A BBBEH�(����F�B�B �B(�I0�D8�GP�
8D0A(B BBBJ G�F�
*:0
0�8�@����o� �
���x@P�	���o���o����o�o����o{P�00@0P0`0p0�0�0�0�0�0�0�0�011 101@1P1`1p1�1�1�1�1�1�1�1�122 202@2P2`2p2�2�2�2�2�2�2�2�233 303@3P3`3p3�3�3�3�3�3�3�3�344 404@4P4`4p4�4�4�4�4�4�4�4�455 505@5P5`5p5�5�5�5�5�5�5�5�566 606@6P6`6p6�6�6�6�6�6�6�6�677 707@7P7`7p7�7�7�7�7�7�7�7�788 808@8P8`8p8GCC: (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0.shstrtab.interp.note.gnu.property.note.gnu.build-id.note.ABI-tag.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.got.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.data.rel.ro.dynamic.data.bss.comment880&hh$9�� G���o��4Q��8
Y  �a���o��n���o��`}PP��B@@x�00� 0 0`��8�8 ��8�8P��@�@?`�0�0�
����+ �����|�h�h�H�8�8��@�@��H�H��P�P�@�����p	00+?