� J�gy!� ���dZddlZddlZddlZddlmZddlmZmZddl m Z m Z m Z m Z dZGd�de ��Zd �Zd �Zd e eefd efd �Zde eee e eee ffde eefde eefd e eeffd�ZdZd�Zded efd�Zd�Zd efd�Zd efd�Zd e edffd�Zd e efd�Zd e efd�Z d efd�Z!d efd�Z"d efd�Z#dS)a Various utilities that could not be gathered logically in a specific module. The contents of this module are internal to fpdf2, and not part of the public API. They may change at any time without prior warning or any deprecation period, in non-backward-compatible ways. �N)�Number)�get_traced_memory� is_tracing)�Iterable� NamedTuple�Tuple�Union�c�x�eZdZUdZeed<dZeed<dZeed<dZeed<e de e e e effd���ZdS) �Paddingr�top�right�bottom�left�paddingc���t|ttf��rt||||��St |��dkr*t|d|d|d|d��St |��dkr*t|d|d|d|d��St |��dkr t|�St dt |�������)zbReturn a 4-tuple of padding values from a single value or a 2, 3 or 4-tuple according to CSS rules�r���zBpadding shall be a number or a sequence of 2, 3 or 4 numbers, got )� isinstance�int�floatr �len� ValueError�str)�clsrs �Y/home/asafur/pinokio/api/open-webui.git/app/env/lib/python3.11/site-packages/fpdf/util.py�newz Padding.news��� �g��U�|� ,� ,� ?��7�G�W�g�>�>� >� �w�<�<�1� � ��7�1�:�w�q�z�7�1�:�w�q�z�J�J� J� �w�<�<�1� � ��7�1�:�w�q�z�7�1�:�w�q�z�J�J� J� �w�<�<�1� � ��G�$� $�� _�QT�U\�Q]�Q]� _� _� � � �N)�__name__� __module__� __qualname__r r�__annotations__rrr� classmethodr rr�tuple�listr�r rr r s���������C��O�O�O��E�6�����F�F�����D�&�����  �%��U�E�4� 7�8�  �  �  ��[�  �  �  r r c�$�t|��}t|��t|��ksJd|�d|�����|�|���|���d��}t|��|ksJ�|S)Nz placeholder=z value=r)r�replace�encode)�buffer� placeholder�value� buffer_sizes r� buffer_substr0+s����f�+�+�K� �{� � �s�5�z�z� )� )� )�+U�+�+U�+U�e�+U�+U� )� )� )� �^�^�K�.�.�0�0�%�,�,�.�.�!� D� D�F� �v�;�;�+� %� %� %� %� �Mr c�t�t|t��rR|�dd���dd���dd���dd��S|�d d ���d d ���d d���dd��S)z*Add a backslash character before , ( and )�\z\\�)z\)�(z\(� z\r�\s\\�)s\)�(s\(� s\r)rrr*)�ss r� escape_parensr;3s����!�S��� � �I�I�d�F� #� #� �W�S�%� � � �W�S�%� � � �W�T�5� !� !�  � � � �%��!�!� ���v� � � ���v� � � ���� � � r �unit�returnc��t|t��rt|��S|dkrdS|dkrdS|dkrdS|dkrdStd |�����) z� Get how many pts are in a unit. (k) Args: unit (str, float, int): Any of "pt", "mm", "cm", "in", or a number. Returns: float: The number of points in that unit (assuming 72dpi) Raises: ValueError �ptr�mmg��j�Z�@�cmg��b�X<@�ingR@zIncorrect unit: )rrrr)r<s r�get_scale_factorrCDsq���$������T�{�{�� �t�|�|��q� �t�|�|��y� �t�|�|��y� �t�|�|��t� �.��.�.� /� /�/r � to_convert�old_unit�new_unitc���t|��t|��z �t|t��rt�fd�|D����S|�z S)a, Convert a number or sequence of numbers from one unit to another. If either unit is a number it will be treated as the number of points per unit. So 72 would mean 1 inch. Args: to_convert (float, int, Iterable): The number / list of numbers, or points, to convert old_unit (str, float, int): A unit accepted by fpdf.FPDF or a number new_unit (str, float, int): A unit accepted by fpdf.FPDF or a number Returns: (float, tuple): to_convert converted from old_unit to new_unit or a tuple of the same c3�:�K�|]}t|d���V��dS)rN)� convert_unit)�.0�i�unit_conversion_factors �r� <genexpr>zconvert_unit.<locals>.<genexpr>ps0�����T�T�A�\�!�Q�(>�?�?�T�T�T�T�T�Tr )rCrrr&)rDrErFrLs @rrIrI]sc���".�h�7�7�:J�8�:T�:T�T���*�h�'�'�U��T�T�T�T��T�T�T�T�T�T� �.� .�.r ) )�Mi�)�CMi�)�Di�)�CDi�)�C�d)�XC�Z)�L�2)�XL�()�X� )�IX� )�V�)�IVr)�Irc�P�d}tD]\}}||kr||z }||z}||k��|S)z#Convert an integer to Roman numeral�)�ROMAN_NUMERAL_MAP)�n�result�numeral�integers r� int2romanri�sJ�� �F�-�������7�l�l� �g� �F� ��L�A��7�l�l�� �Mr rec��|dkr5tt|dz dz ����t|dz��zSt|td��z��S)zXConvert an integer to a letter value (A to Z for the first 26, then AA to ZZ, and so on)��r�A)�int_to_lettersr�chr�ord)res rrnrn�sR���2�v�v��c�1�r�6�Q�,�/�/�0�0�>�!�b�&�3I�3I�I�I� �q�3�s�8�8�|� � �r c�>�tt|����dS�N)�print� get_mem_usage)�prefixs r�print_mem_usagerv�s�� �-�� � � � � � � r c��tj��}t��}t��}d}t ��rdt ��z}|d�d|�d|�d|��S)NrczMalloc stats: z<40� z | Pillow: z | Process RSS: )�gc�collect�get_process_rss�get_pillow_allocated_memoryr�get_tracemalloc_traced_memory)ru�_collected_count�rss�pillow� malloc_statss rrtrt�sp���z�|�|�� � � �C�)� *� *�F��L��|�|�J�'�*G�*I�*I�I� �� Q� Q� Q�<� Q� Q�F� Q� Q�C� Q� Q�Qr c�2�t��}|r|d�d�SdS)N�.1f� MiB� <unavailable>)�get_process_rss_as_mib)� rss_as_mibs rr{r{�s,��'�)�)�J��'��&�&�&�&�&� �?r c�T�tj��} td|�d�d���5}t|������d��tjd��zdz dz cddd��S#1swxYwYdS#t$rYdSwxYw) zInspired by psutil source code�/proc/z/statm�utf8��encodingr� SC_PAGE_SIZE�N)�os�getpid�openr�readline�split�sysconf�FileNotFoundError)�pid�statms rr�r��s�� �)�+�+�C� � �&�3�&�&�&�� 8� 8� 8� �E��E�N�N�$�$�*�*�,�,�Q�/�0�0��*�^�,�,�-����� � � � � � � � � � � � � ���� � � � � � �� �����t�t����s5�B�AB �? B� B�B�B�B� B'�&B'c���d\}}tj��} td|�d�d���5}t|��}ddd��n #1swxYwYn#t$r||fcYSwxYw|D]�}|���}|d|d}}|�d��\} } t | d ��t | d ��} } | | z } |d kr | d z d z d �d �}�v|dkr | d z d z d �d �}��||fS)N)r�r�r�z/mapsr�r�r������-r z[heap]r�r�r�z[stack])r�r�r�r'r�r�r) �heap_size_in_mib�stack_size_in_mibr�� maps_file� maps_lines�line�words� addr_range�path� addr_start�addr_end�sizes r� get_process_heap_and_stack_sizesr��s���*J�'��'� �)�+�+�C�3� �%�3�%�%�%�� 7� 7� 7� )�9��i���J� )� )� )� )� )� )� )� )� )� )� )���� )� )� )� )��� �3�3�3��!2�2�2�2�2�3����� @� @��� � � � �� ��8�U�2�Y�D� �)�/�/��4�4�� �H�"�:�r�2�2�C��"�4E�4E�H� ��*�$�� �8� � �"&��+��"4�>�>�>�>� � � �Y� � �#'�$�;��#5� ?� ?� ?� ?� �� �.� .�.s3�A�A � A� A�A�A�A�A(�'A(c�4� ddlm}d\}}|��������D]�}|�d��r<t |���d�dd����}�S|�d��r;t |���d�dd����}��|d z d z d �d |d z d z d �d �S#t$rtj d ��YdSwxYw)za Get PyMalloc stats from sys._debugmallocstats() From experiments, not very reliable r)�get_debugmallocstats)r�r��Totalr��,rcz# bytes in allocated blocksr�r�z / r�z>pymemtrace could not be imported - Run: pip install pymemtracer�) �pymemtrace.debug_malloc_statsr��decode� splitlines� startswithrr�r*� ImportError�warnings�warn)r�� allocated�totalr�s r�&get_pymalloc_allocated_over_total_sizer��s:�� �F�F�F�F�F�F�!�� �5�(�(�*�*�1�1�3�3�>�>�@�@� C� C�D����w�'�'� C��D�J�J�L�L��,�4�4�S�"�=�=�>�>������!>�?�?� C��� � � � �R� 0� 8� 8��b� A� A�B�B� ���d�"�T�)�O�O�O�%�$�,��2E�O�O�O�O�O�� ����� �V�W�W�W�������s�C2C5�5D�Dc��� ddlm}m�t�fd�|��D����}|dz dz d�d�S#t$rt jd��YdSwxYw) z#From experiments, not very reliabler)� get_objects� getsizeofc3�.�K�|]}�|��V��dSrrr()rJ�objr�s �rrMz1get_gc_managed_objs_total_size.<locals>.<genexpr>�s+�����F�F��i�i��n�n�F�F�F�F�F�Fr r�r�r�z8pympler could not be imported - Run: pip install pymplerr�)� pympler.muppyr�r��sumr�r�r�)r��objs_total_sizer�s @r�get_gc_managed_objs_total_sizer��s�����8�8�8�8�8�8�8�8��F�F�F�F� � � � �F�F�F�F�F��!�D�(�4�/�9�9�9�9�9�� ����� �P�Q�Q�Q�������s�6:�A�Ac�P�t��\}}|dz dz d�d|dz dz d�d�S)zRequires python -X tracemallocr�r�z (peak=z) MiB)r)�current�peaks rr}r}�s@��%�'�'�M�G�T���n�t�#� M� M� M��t� �d�0B� M� M� M� M�Mr c�~�ddlm}|j���}|d|dz }|tzd�d�S)Nr)�Image�allocated_blocks� freed_blocksr�r�)�PILr��core� get_stats�PIL_MEM_BLOCK_SIZE_IN_MIB)r��stats� blocks_in_uses rr|r|�sT�������� �J� � � "� "�E��,�-��n�0E�E�M��7�7� A� A� A� A�Ar )$�__doc__ryr�r��numbersr� tracemallocrr�typingrrrr r�r r0r;rrrCrr&rIrdrirnrvrtr{r�r�r�r�r}r|r(r r�<module>r�s����� � � � � � � � �����������5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5��� � � � � �j� � � �.������"0�5��f��-�0�%�0�0�0�0�2/��e�S�(�5���X�1E�+F�"G�G�H�/��C��K� �/��C��K� �/� �5�%�<�� /�/�/�/�.��"����c��c�����!�!�!� R�S� R� R� R� R������� ��f�d�l� 3� � � � �/�%��*�/�/�/�/�*��c� �����* �� � � � �N�s�N�N�N�N� B�S�B�B�B�B�B�Br
Memory