� I�g')����dZddlZddlZddlZddlZddlZddlZddlZejZ Gd�de ��Z Gd�de ��Z Gd�de ��Z Gd �d e ��Zdd �ZdS)zb Fast cryptographic hash of Python objects, with a special case for fast hashing of numpy arrays. �Nc��eZdZdZd�ZdS)�_ConsistentSetza Class used to ensure the hash of Sets is preserved whatever the order of its items. c�� t|��|_dS#ttjf$r"td�|D����|_YdSwxYw)Nc3�4K�|]}t|��V��dS�N��hash)�.0�es �^/home/asafur/pinokio/api/open-webui.git/app/env/lib/python3.11/site-packages/joblib/hashing.py� <genexpr>z*_ConsistentSet.__init__.<locals>.<genexpr>%s(����$C�$C��T�!�W�W�$C�$C�$C�$C�$C�$C�)�sorted� _sequence� TypeError�decimal�InvalidOperation)�self� set_sequences r �__init__z_ConsistentSet.__init__sj�� E� $�L�1�1�D�N�N�N���7�3�4� E� E� E�$�$C�$C�l�$C�$C�$C�D�D�D�N�N�N�N� E���s��4A�AN��__name__� __module__� __qualname__�__doc__r�rr rrs2�������� E� E� E� E� Errc��eZdZdZd�ZdS)�_MyHashz7 Class used to hash objects that won't normally pickle c��||_dSr)�args)rr s r rz_MyHash.__init__+s ���� � � rNrrrr rr(s)������A�A�����rrc�(�eZdZdZd d�Zd d�Zd�Zd�Zdej fd �Z e j � ��Z e e ee��<e e ee��<e e ee ��<e e eej��<d �Zd �Zee ee����<dS)�HasherzW A subclass of pickler, to do cryptographic hashing, rather than pickling. �md5c��tj��|_d}t�||j|���t j|��|_dS)N�)�protocol)�io�BytesIO�stream�Picklerr�hashlib�new�_hash)r� hash_namer&s r rzHasher.__init__4sH���j�l�l�� �������t�{�X��>�>�>��[��+�+�� � � rTc�.� |�|��n/#tj$r}|xjd|�d|��fz c_�d}~wwxYw|j���}|j�|��|r|j���SdS)NzPicklingError while hashing z: ) �dump�pickle� PicklingErrorr r)�getvaluer-�update� hexdigest)r�obj� return_digestr �dumpss r r z Hasher.hash=s��� � �I�I�c�N�N�N�N���#� � � � �F�F�F�s�s�s�A�A�F�H� H�F�F� ����� ����� �$�$�&�&�� � ���%� � � � � *��:�'�'�)�)� )� *� *s��A�?�Ac���t|tjtij��f��r�t |d��r |jj}n|j}|j}t|��tt��urt||j��}n0|�t||��}n|jj }t|||��}t� ||��dS)N�__func__)� isinstance�types� MethodType�type�pop�hasattrr:r�__self__r1r� __class__r*�save)rr6� func_name�inst�clss r rCz Hasher.saveHs��� �c�E�,�d�2�6�l�l�;� <� <� 4��s�J�'�'� )��L�1� � ��L� ��<�D��D�z�z�T�&�\�\�)�)��i���7�7������i��.�.����l�,���i��s�3�3��� � �T�3�����rc�x�t|ttf��rdSt�||��dSr)r;�bytes�strr*�memoize)rr6s r rJzHasher.memoize[s9�� �c�E�3�<� (� (� � �F�����c�"�"�"�"�"rNc�^�t||���}|d= tj||fi|��dS#tj$rrtj||fi|��t |dd��}|dkrA|}|�|j}tj|}t||��st|||��YdSYdSYdSwxYw)N)�name�packrMr�__main__) �dictr*� save_globalr1r2�getattrr�sys�modulesr@�setattr)rr6rLrM�kwargs�module�my_name�mods r rPzHasher.save_globalfs����4�d�+�+�+�� �6�N� /� � ��c� 4� 4�V� 4� 4� 4� 4� 4���#� /� /� /� � ��c� 4� 4�V� 4� 4� 4��S�,��5�5�F���#�#����?�!�l�G��k�&�)���s�G�,�,�/��C��#�.�.�.�.�.�.�$�#�#� /�/�/� /���s�+�A7B,�+B,c �� t�|tt|������dS#t$rCt�|ttd�|D��������YdSwxYw)Nc3�>K�|]\}}t|��|fV��dSrr)r �k�vs r r z)Hasher._batch_setitems.<locals>.<genexpr>�sL����6I�6I�:>�!�Q�8<�A�w�w��l�6I�6I�6I�6I�6I�6Ir)r*�_batch_setitems�iterrr)r�itemss r r]zHasher._batch_setitems�s��� K� � #� #�D�$�v�e�}�}�*=�*=� >� >� >� >� >��� K� K� K� � #� #�D�$�v�6I�6I�BG�6I�6I�6I�0I�0I�+J�+J� K� K� K� K� K� K� K���s�59�A B�Bc�V�t�|t|����dSr)r*rCr)r� set_itemss r �save_setzHasher.save_set�s$��� � �T�>�)�4�4�5�5�5�5�5r)r#)T)rrrrrr rCrJ�structrMrPr*�dispatch�copyr>�len�objectr1r0r]rb�setrrr r"r"/s��������,�,�,�,� *� *� *� *� � � �&#�#�#�%)�v�{�/�/�/�/�*��$�$�&�&�H�%�H�T�T�#�Y�Y��(�H�T�T�&�\�\��)�H�T�T�'�]�]��"-�H�T�T�&�+� � �� K� K� K�6�6�6�%�H�T�T�#�#�%�%�[�[���rr"c� �eZdZdZdd�Zd�ZdS)� NumpyHasherz7 Special case the hasher for when numpy is loaded. r#Fc��||_t�||���ddl}||_t |d��r|j|_dSt|_dS)a Parameters ---------- hash_name: string The hash algorithm to be used coerce_mmap: boolean Make no difference between np.memmap and np.ndarray objects. �r.rN� getbuffer) � coerce_mmapr"r�numpy�npr@rm� _getbuffer� memoryview)rr.rnrps r rzNumpyHasher.__init__�s_��'������� ��2�2�2�������� �2�{� #� #� )� �l�D�O�O�O�(�D�O�O�Orc�N�t||jj��r�|jjs�|jdkr|���}n7|jjr|}n(|jj r|j }n|���}|j � |� |�|jj������|jr't||jj��r |jj}n|j}|d|j|j|jff}nut||jj��r[|j � d�d����|j � t+j|����dSt.�||��dS)z� Subclass the save method, to hash ndarray subclass, rather than pickling them. Off course, this is a total abuse of the Pickler class. r�HASHED� _HASHED_DTYPEzutf-8N)r;rp�ndarray�dtype� hasobject�shape�flatten�flags� c_contiguous� f_contiguous�Tr-r4rq�view�uint8rn�memmaprB�strides�encoder1r8r"rC)rr6�obj_c_contiguous�klasss r rCzNumpyHasher.save�s��� �c�4�7�?� +� +�9 �C�I�4G�9 ��y�B���$'�;�;�=�=� � ���'� 1�#&� � ���'� 1�#&�5� � � $'�;�;�=�=� � �J� � ���� 0� 5� 5�d�g�m� D� D�E�E� G� G� G� �� &�J�s�D�G�N�$C�$C� &������� �� �8�S�Y�� �3�;�G�H�C�C� ��T�W�]� +� +� � �J� � �o�4�4�W�=�=� >� >� >� �J� � �f�l�3�/�/� 0� 0� 0� �F�� � �D�#�����rN�r#F)rrrrrrCrrr rjrj�sA��������)�)�)�)�(?�?�?�?�?rrjr#Fc���d}||vr#td�||�����dtjvrt ||���}nt |���}|�|��S)aj Quick calculation of a hash to identify uniquely Python objects containing numpy arrays. Parameters ---------- hash_name: 'md5' or 'sha1' Hashing algorithm used. sha1 is supposedly safer, but md5 is faster. coerce_mmap: boolean Make no difference between np.memmap and np.ndarray )r#�sha1zAValid options for 'hash_name' are {}. Got hash_name={!r} instead.ro)r.rnrl)� ValueError�formatrRrSrjr"r )r6r.rn�valid_hash_names�hashers r r r �s���'���(�(�(��7� �&�!1�9�=�=�?�?� ?��#�+����y�k�J�J�J����)�,�,�,�� �;�;�s� � �rr�)rr1r+rRr<rcr'r�_Picklerr*rgrrr"rjr rrr �<module>r�s9����� � � ����� � � � � � � � � � � � � � � � ����� �/��E�E�E�E�E�V�E�E�E�$�����f����h%�h%�h%�h%�h%�W�h%�h%�h%�VW�W�W�W�W�&�W�W�W�t�����r
Memory