>R�����IMnbo�'�J*t���䄾 #x>�t�l��~��o:=m
Rh�:��Q��T�y�lN��k�k���dӪ�;X�e��BhȲ���%�ސ˘�@Q��a��x�MǯQUŞ-5aՆ+Cj���Ѡ���q���x��T��j���V�]˛��}����4��h�[�c�`��`G���}蚶?���������={`��W���ΤR��a�6�c)�l���ym��v�AZ����ٜ����t�~���ē����ST�g5�V�[�W�)>1ni"�d����kx����F�Z|�r�D`��1�xC����2P]!���3c:��He��
�2��+�x��ľ}�nް��N+8G�a�&� ��lRөՔ�k0�D]x>�W`T�hU������(�̜�b���eu/P4�w�^\����ҴO��xL�2��W�A&W�3! ���V�@
3[�_��2�
G��<�Y�*���
h��Ϟ$@ƬvH`m����oU\jU��V5���pV��4�e��h�����7����A�Q}� �t����t+�����?�NH .�"�M�@�Z����~q����ǫw�0�ԉ�>^��e���d�I'-7�g�[S�J q1���R��̠{I��x=��*�$�
�S��H�tE��H�ќS�����n�!.
�K��lb�Q��x��b����ˢJ]�OT4 '�^�=V����;z��K�`�ip�P$��Z���*"��f-�x-�\�]��O�hu.Y��F�
� �ou8qbA=�0��h}@bitshuffle; see https://github.com/kiyo-masui/bitshuffle@(,�l�`TREE�����������������x&���h}@bitshuffle; see https://github.com/kiyo-masui/bitshuffle@
h5�l�`TREE������������������=�`
(�/�`�X�4nN�ٱ�2݉�_9j���
��]L�U���&��܈�j���@RvV�U���^/+��u���>>R�����IMnbo�'�J*t���䄾 #x>�t�l��~��o:=m
Rh�:��Q��T�y�lN��k�k���dӪ�;X�e��BhȲ���%�ސ˘�@Q��a��x�MǯQUŞ-5aՆ+Cj���Ѡ���q���x��T��j���V�]˛��}����4��h�[�c�`��`G���}蚶?�����
(�/�`��={`��W���ΤR��a�6�c)�l���ym��v�AZ����ٜ����t�~���ē����ST�g5�V�[�W�)>1ni"�d����kx����F�Z|�r�D`��1�xC����2P]!���3c:��He��
�2��+�x��ľ}�nް��N+8G�a�&� ��lRөՔ�k0�D]x>�W`T�hU������(�̜�b���eu/P4�w�^\����ҴO��xL�2
(�/�`W�A&W�3! ���V�@
3[�_��2�
G��<�Y�*���
h��Ϟ$@ƬvH`m����oU\jU��V5���pV��4�e��h�����7����A�Q}� �t����t+�����?�NH .�"�M�@�Z����~q����ǫw�0�ԉ�>^��e���d�I'-7�g�[S�J q1���R��̠{I��x=��*�$�
�S��H�tE��H�ќS�����n�!.
�K��li(�/� `��x��b����ˢJ]�OT4 '�^�=V����;z��K�`�ip�P$��Z���*"��f-�x-�\�]��O�hu.Y��F�
� �ou8qbA=�0�qҞc>����烕"���Μ���fR�܆��W���J(��j��U
16-g�^˗�ʮG��R�d�%���
J�Bh�W/�g?���&곊�����b7��&��s4�l��h\��q��1�l��܄�dGs��6�c�t�敂�d�@N1a����H�9�yS,�o�.j��Q�f'��w_Y�����I�����E����pf�D�i"���E��Ժj�'h����X@6�t��r�� \�MU�n9�j5�MY��7����;A�l�`���h}@bitshuffle; see https://github.com/kiyo-masui/bitshuffle@�G�l�`TREE������������������O����[Sm��ׇK'�K]�@��lS��J⻍h�E�A��t�@�v�BO&��G_s��Z���n��������ĥi���A��
���ۚ�Ģ��(��=�ٙ�**�?W1k�X4�-Σt�^.�����wz��C f�����&+�zvB�3Q[7Q�}�[j9Z�5�����p����ү.<����Ǐ��J,�ZNi��e���x�-���C�,��A7��,�\H����c��
V(�nj =���`�+�D��#�F���5�=>�n���V(l���c�FQ�9o:Y�C4�wSu��~+��f��F�H��g ��-�33���7��e�=!�no��S���[Jd�cNN�~��?��ޭ�W�S�2��9���(^�b�"(b ��U���Lɠ*վ�M��Ћ�q#�C|��MiPx�t�,�iw<�-�<�#��ƺ��C(�mv�;�%U7
�T��uI�\R��/h��loJiBս3�2�چ�CF�i$�[�K�̀��'��X`�ɼ�~��ϊ��%'�iAm]5�uS��7�?$�o#��Eֵ&�!H|\����0�m�OLUcqsƇ�pT�E|#V<^z���������0���G:���Q3�}���k`�b�Π�co�&�4M!_��Nj/����e�0��L�X�ƙ7�i�s?5*y*r���J�Q:@p�C���t)������N����JqFa*&J���BhHz��d��aq]�9R�1lU�A�)�*���SG=�S�e�����
(�/�`[Sm��ׇK'�K]�@��lS��J⻍h�E�A��t�@�v�BO&��G_s��Z���n��������ĥi���A��
���ۚ�Ģ��(��=�ٙ�**�?W1k�X4�-Σt�^.�����wz��C f�����&+�zvB�3Q[7Q�}�[j9Z�5�����p����ү.<����Ǐ��J,�ZNi��e���x�-���C�,��A7��,�\H����c��
V(�nj =���`�+�D��#�F�
(�/�`5�=>�n���V(l���c�FQ�9o:Y�C4�wSu��~+��f��F�H��g ��-�33���7��e�=!�no��S�
(�/�`[Jd�cNN�~��?��ޭ�W�S�2��9���(^�b�"(b ��U���Lɠ*վ�M��Ћ�q#�C|��MiPx�t�,�iw<�-�<�#��ƺ��C(�mv�;�%U7
�T��uI�\R��/h��loJiBս3�2�چ�CF�i$�[�K�̀��'��X`�ɼ�~��ϊ��%'�iAm]5�uS��7�?$�o#��Eֵ&�!H|\����0�m�OLUcqsƇ�pT�E|#V<^z�����(�/� �����0���G:���Q3�}���k`�b�Π�co�&�4M!_��Nj/����e�0��L�X�ƙ7�i�s?5*y*r���J�Q:@p�C���t)������N����JqFa*&J���BhHz��d��aq]�9R�1lU�A�)�*���SG=�S�e������h}@bitshuffle; see https://github.com/kiyo-masui/bitshuffle@
�X�l�`TREE������������������S���8b�l�`�w8��`��j���q����8v�'gz#ml��Jx-a��[s�����RuĶӌ���R��ղ�(4L���7Smd�.�AQ7&NV7�ha)��߰����k��$�3� �6����j�hP�(� �~�!�oN��\��ޕ1-x'�g�+�śxb�m�o���r( ��X�\���X n
�<��"��?���b/
��sI�]���P��RO;7��E��֓=�����|������Ǿs�KHR#/|��'�ܲ���n�l�Zq�=IWy�Y�Uq�}�����q�����ڭ��}HnG;�:ۺ�������@�50���1j�*_A�H_i6}�Y�*+���.];E��u���M�y~�~H�o2����8��
�q��3`c#=��ǟ�}���3&i�����n��)��z��E� �,�ϔ;�39ˢ�o/���a�X�f�1ӯ�N��.;!�4�<n����=�����'qZy�|��A_��ǥ-�lS�5<�SU"�F�D��{�tk�3n�ֻ"��5b���r3��]��!J[��g�'�k_�
(��]�!Ci��5���"��R�M)PHnI��m��m��2R`>��z*I$]z��H+���VG.Ru^���,�g�r��f4�0aylA8�2a�.�P�Ia'p
���6o_�j��9kxF�1PTI�.�
�`o! � ����0T���%�0Mٞ�`�[:(��̟ Ȍn�n/�����3�e���������R��&!��˾�oȘ�Uv͂�ᤍ)�� ?!�9��Ӿi��-��5�A~�1Jx���ӵ���jSڲ���^���$��zd��)���5��g����lR�I����B���e"�s.s'dc8���!?�W�!@������~K�������'w
%,�=���L��,�/�A96��h1��Z�:!'�*�i�;�1�j�*�N��'Ǐ����h}@bitshuffle; see https://github.com/kiyo-masui/bitshuffle@Hk�l�`TREE�����������������xs������r�ѓ����K�0"�3���ͫ�[V�����R�%����tWQ�
���]4�=�k=�� �}7k,ܩ)��Hz��=?e:��� D;S��������ůu�:[/4tf��&Af���x��B�.1��n[W�)Jm?�8�{�:$3yXS"�O6���mz���%S�%����z��ϣ}1�qd���Iò�kI�f�G��9-�46���G�R;4�?tt����W3k4ܐ�g(uߗ`���s�G���mJ��e��]�P:
�����/�ic��DP������ί�I�^m���K!���2�NHD�B�D�+n"�||@�$�/��.�Rݧ�: �iGlU��]?(�����7`A`O�ϧ�`�
"��gv�g����r�^�s0����������cAc��qK!�n.����?I- �Z!���bK�͟�Njʔ��M��'Dyx���{�õ�9\Yx�x�fu���f�����(��*�ǔ�X��Z�n��r��Q[��4��[u��,M�5��(���"�휉�֑������i���y���c�����41��s�\�{�Ltz2c��
�bv���PX|"���)��� �e[�s��{�ϛaN����T�pK�r�sw�2F7��M�EǨ9ɒK>m��U�Fl�3��^�Ѫ�r�y50�脯�H��c�8�m
�I�]&<@)�Y��k@�
YDO�fob��?�;֙w+e��5[w�o�����Y�&t̑Q�M�z9�x�U���r:�!�xK���>��8"f�a�r�]X�C���a&��&��|"�hpDc��ğ~mSlD*e��*ԭ�).>F� ���$a�dV���$��mⓔ[ �n�v�P@?�(���7o��鸮W�Ýd���Q�>>wE��Y��'�
A�2�� 9x�謘b�bv�S�g�>�Ԏ�q�����"
C��R+"����7A��ZG����a���N���`���.�YU�I�i#W雴)K�C
aƛF��>f����tS5�:��25�a^M�kJicFr{ %��/?�RL&̚/��@S#`�P1�u����x�]%©O���m�e��[>�[���$߃d#8J7 ��c�f4��F������g�m��U�Fl�3��^�Ѫ�r�y50�脯�H��c�8�m
�I�]&<@)�Y��k@�
YDO�fob��?�;֙w+e��5[w�o�����Y�&t̑Q�M�z9�x�U�(�/�`�:�!�xK���>��8"f�a�r�]X�C���a&��&��|"�hpDc��ğ~mSlD*e��*ԭ�).>F� ���$a�dV���$��mⓔ[ �n�v�P@?�(���7o��鸮W�Ýd���Q�>>wE��Y��'�
A�2�� 9x�謘b�bv�S�g�>�Ԏ�q�����"
C��R+"����7A��ZG����a���N���`���.�YU�I�i#W雴)K�C
aƛF��>f����tS5�:��25�a^M�kJicFr{ %��/?�RL&̚/��@S#`�P1�u����x�]%©O���m�e��[>�[���$߃d#8J7 ��c�f4��F������g��b�h�\� �6/�����G�{���kE]{��d�`��ޫ� ��wzsW%�W�����>�8�]�����������������}3�P�����"��ج��m߱О,ߗ
74��)�H��5�ۚ�|E�7� ��s��BG����~�:"&��K���zᤴ���k��&� ��z�F^��͈�%W�7Ns�4��Ԝ�
�3E�eG��۩��oA�q�e�BĚ���� 7�}ൃ��T����IT�v���i�_��S4#ݵ@^D�hb)��� ��fS�����
�3�X���,���$��`�A�%C�����H����Č�Eؾ�)@QTʒ���d^��*E� ��dn�����ڑO�N� ٺtx�[������b)�wx��IQ}��2�/�s3��5�X ��"Y��|�W���N�@��J�X�A~̏0g�n��y����*�'"eW{��e���Lێ~�[�#� ����w߶���W!=
�l+ztF��!D<& �K���OT�Lt�!�4@OަJ$����w��N.�D��>��.��#Q��䂟��R�C�d��4�/��2x�ט��<d�-N�JdsT��=��|A$ $�3���"�:��kA�E$�9����h�7Un���u���]�+ũ�m���G̉T�R��*|96bWT����B4)O�B�vA�-͏��o����pTl���s0mH#��}?x�J�J����:��$�7�(a���x`��y!�:u�s)rB(]�����04�)��
� �%�����w�jo�9{��b�ϲ�
i��{����M!+��w�38�xY��(����ۥ8BBc���9P=4�9Q16y���֟_a��������}��K8�*Ѭ���?K�[a��� _ܞ��/����ҏ���B'�C�N���4?�������BD�B���h��l���@yĀz�B
p�O�3(��Aǖ��\�����x�O�g0����<��iŽO�l!����o�q��IW���Z�b���o$i��O�!,_�ú_;��N�@EI�5��Lk�1ot��5���ފ�Kހȼ�7��'��#6�����zR�Dj��E?���~�R�%���w���.��TREE������������������X����rE����A|�TV���tM
F�g2}�1ãSy�K_�� �|�($(��u��
��-�n�S�iXau��\#�℅n�2�/�K�����3(�3�\�A�Ցk^B�m�U�����+&��5Y0�\
�푻��uB'���$��+��x)�M�en���m�ȁ���m��T�S�0��W[�����Bg�G�OI�:�&��(�<��1=���ӭiW��3�n��%����[�6ἑ�`Y�I��{�|ƙ�}M��}�C��0�P�MDP�Pj����\��g�}�DGO2�~Ƞ�f�,z��{��MK��,%e7�w�8�i�I �Iд�#���Kƚ�ɭc�P+B%������'Nj?E����PS�y���r��?��
IٗFD�w%H
F�
�Gi0��<��$Ȯ@%t!�Ў�$�J��V�ݸ5�s)���L%Q�W�B<���jq��CW�CW���H���F3KP�R�G/:0��m3�w���QR��.7_m��������]!T!`UV�:�}���u�$��� ��$�,f_�4�L ���0I���X���`�� ��PH�! ����2HR�������ZfT�$�`?M�/!T٧vBo�����w��;���� ��0�ݺ��y�7��L�:�`k[U$$Y�����wvRׁ�=#��_�����nx��Ua0��/u�-�_�UHI�@J�����zN��� L#f����8��D�=�:r�TYk����r9V
�R{����&��L�WJ��"xx?�m���tY�_~�_��$!��F]�Z���@�MEx��%��R�2A��4{!{���N'&�M�!���HN�ΐ(�k&��`�LV� ��)��C�t���$#�#�+2S�â��k����|��[צ]u
6@�5�$)���.S�'���~#Z?���T��0�̔��i[�l�/�9��:z�`'�q&Dϯ��b���YL���'�/̸�����1M*l)$��
�"����nӾi�=`�:����'r����XU}�Cip{���3�p^3���D3L�Pu7�R�rS
� �5�YT���{H{*nI��h���(
'�"��-b���ej��E?���~�R�%���w���.��TREE�������������������X��(�/�`�E����A|�TV���tM
F�g2}�1ãSy�K_�� �|�($(��u��
��-�n�S�iXau��\#�℅n�2�/�K�����3(�3�\�A�Ցk^B�m�U�����+&��5Y0�\
�푻��uB'���$��+��x)�M�en���m�ȁ���m��T�S�0��W[�����Bg�G�OI�:�&��(�<��1=���ӭiW��3�n��%����[�6ἑ�`Y�I��{�|ƙ�}M��}�C��0�P�MDP�Pj����\��g�}�DGO2�~Ƞ�f�,z��{��MK��,%e7�w�8�i�I �Iд�#���Kƚ�ɭc�P+B%������'Nj?E����PS�y�(�/�`���?��
IٗFD�w%H
F�
�Gi0��<��$Ȯ@%t!�Ў�$�J��V�ݸ5�s)���L%Q�W�B<���jq��CW�CW���H���F3KP�R�G/:0��m3�w���QR��.7_m��������]!T!`UV�:�}���u�$��� ��$�,f_�4�L ���0I���X���`�� ��PH�! ����2HR�������ZfT�$�`?M�/!T٧vBo�����w��;���� ��0�ݺ��y�7��L�:�`k[U$$Y�����wvRׁ�=#��_�����nx��Ua0��/u�-�_�UHI�@J�����zN��� L#f����8��D�=�:r�TYk��(�/�`�9V
�R{����&��L�WJ��"xx?�m���tY�_~�_��$!��F]�Z���@�MEx��%��R�2A��4{!{���N'&�M�!���HN�ΐ(�k&��`�LV� ��)��C�t���$#�#�+2S�â��k����|��[צ]u
6@�5�$)��(�/� �.S�'���~#Z?���T��0�̔��i[�l�/�9��:z�`'�q&Dϯ��b���YL���'�/̸�����1M*l)$��
�"����nӾi�=`�:����'r����XU}�Cip{���3�p^3���D3L�Pu7�R�rS
� �5�YT���{H{*nI��h���(
'�"��-b�Ν��ej��E?���~�R�%���w���.��{j���m�G{�@Ct����"��P��}���ٛ���Q1�K4�W.s[�b�����}$�\�ӄw��߿��h���wtd��
.�V6�3-��Y���A���A���d1m���p$�����ϸ�bE�T(�{b�Q�?������Y&7褻;*��`i��ycy�B����B���"����kBƯl*�1����4+�Ŀ�%97E�N�uv� \:�xk��ϏV�J�M/K9W���M����
��c�kf�o���Oca��8�c\���#��/�8�aF,�_����w����v��e{CQg���
��b�|��gG'4��ç&�P�F�����6���2Tb$��%Z̞�Bdw��A۾�RT���l��?�-�q� ��v� �b��e�o������=F�R`L�=�VF%������K���i�*��oVy�CwB�v���ݪQ��. �Y����A�o� �V?��̂}���6)&
;Bp�&����:�Ed��7=�V��u��ݗ]7�0),�)堤w5z��r�G���4����c�h���v���J�L�3��A��UB�� �������)�R�����y��F�c�e������G_gsE��"�hI?t�̅�exZ[\��HWn��~p��3W1||��9o�ԹK�|>��$B� ﴕS 7�Wma2���t���{��Ĩ
'��$��Ee
�L�<���uM�FY������Ķ;���&�]X�#�t�"&u��� oQx��4�c�V�Y�����g��?� �ـu^������Lsi/�Ӡ�9����I�
S�B��V�9�6[��=��$F�'��P�;3��CA.�R��|���/�Yh����ܦ����i�W�f���9/��\�A�J6KY���*橼�.U��z���@�Ç���o�=��~��h�c-F��@�@/��g(ǀQ_7ŏji��cDn��k�<_���[����w(���Mv�?�k$����g�7rWDz�c�Pi��+�l�f�xij��sw���TAo%=�3�N0��s(g��>�}ib�\1��r��nѭ�8h%�=�*�琏�R4�δHh
�x��]�!g(�!��%.%l��t�Ad�
�x����L����0f,��g6K�"�O�g�|�~S�[�4EB#R�7��oΖ恁����v��&DpiY�:�47-%��YcڲyM(��Uql��H�,�̜ܠ"p��j��Hd�B��I��Οq��WNvp�^�맓;2%"9���*���4�|���i�(����^9TREE����������������C�������r���L����Ѽ��ȲɊN�:��q)�g�*B���C2.F���͑���#��b�(=�E�|�b�[Q_8d�7x���t���XT�m����.�dmS}8#����v:���o%of�V]|�2{;��t��<�R� ��Ѥz�HSV���9��9k�h�����x;�Nb���J)����j��Xh�m��fC�7�5�
��sc����
���_�7�£w¤����2��#��6|� ʝ5Mz�#9����в�[_��l;�f2�oН�w2��Od[2�ϡJ�j��TB-�Qޠ�g���s�x�K{�mpYG'�D�I�N�h�f�/��{4}�p�d��8)�-�]�&##��93'
�s���=|Ɲ%Y�h���r���plI5�
q1������V��e�.!�����.�rp#u)��| �r�9kO�sX��v���ն��,,
���N�9{פC���V�hF�8&[v�4��
F�X�z��rRL�}�ī c�n�+�
���ټM�&��GD���0���scIUܮ`������y��i��f��/=X䞎p�� <]%��TJ���&�+{�)֘0j�o�Y�}�_�[ʒSz7jr��~oi;GSo�PK�w�R�f]�q?�{͊u���F�"8�]�N�S`{�M��]��zF��j��%
���fwU��Y�1� jn|�B�xZ���$^�i o\�,t�X����r�B*,�x ��%����
���4�l_����a�^�_>���r�۳u�p�rt��52z]`i��aی��c%�������L���qv���D��d�g:}�����w�p��CW-)�}[mդ��/�"Yu��Qda�3I�Z�%�,#��n*��3��.#I�̖z������i�B5۟B���wS����*�f�0��yh,2�QgCEFES�:��쭝�(�%-i %ǽ�9�7�� ��[�W�
��@2�@n3?w��&���F�ABy�ӱx\��Y���z��iK�|�$ G�ގ��t֬-^���_�!���UW��`���o&�C�ͻ�5ዺU�{�'X�*��M��2�߯�9�$�MbcQB�U���]P�q�_��8!�խ�2���ls���"��?�u�cm/{i������+v�_HD�A[�V-EHײ9
���tU�m9�D�N�����ٚ�QS������g����x�LpXO���6<ËVK���c�L�������$��
�C���;^�������D�V.$��7�n8J�'��u0��Gd�j��i�(����^9��h}@bitshuffle; see https://github.com/kiyo-masui/bitshuffle@
W��l�`SNODH@�XX4`�Wp؎x������QTREE����������������_�����(�/�`����L����Ѽ��ȲɊN�:��q)�g�*B���C2.F���͑���#��b�(=�E�|�b�[Q_8d�7x���t���XT�m����.�dmS}8#����v:���o%of�V]|�2{;��t��<�R� ��Ѥz�HSV���9��9k�h�����x;�Nb���J)����j��Xh�m��fC�7�5�
��sc����
���_�7�£w¤����2��#��6|� ʝ5Mz�#9����в�[_��l;�f2�oН�w2��Od[2�ϡJ�j��TB-�Qޠ�g���s�x�K{�mpYG'�D�I�N�h�f�/��{4}�p�d��8)�-�]�&##��93'
�s���=|Ɲ%Y�h�(�/�`����plI5�
q1������V��e�.!�����.�rp#u)��| �r�9kO�sX��v���ն��,,
���N�9{פC���V�hF�8&[v�4��
F�X�z��rRL�}�ī c�n�+�
���ټM�&��GD���0���scIUܮ`������y��i��f��/=X䞎p�� <]%��TJ���&�+{�)֘0j�o�Y�}�_�[ʒSz7jr��~oi;GSo�PK�w�R�f]�q?�{͊u���F�"8�]�N�S`{�M��]��zF��j��%
���fwU��Y�1� jn|�B�xZ���$^�i o\�,t�X����r�B*,�x ��%����
���4�l_����a�^�_>�(�/�`��۳u�p�rt��52z]`i��aی��c%�������L���qv���D��d�g:}�����w�p��CW-)�}[mդ��/�"Yu��Qda�3I�Z�%�,#��n*��3��.#I�̖z������i�B5۟B���wS����*�f�0��yh,2�QgCEFES�:��쭝�(�%-i %ǽ�9�7�� ��[�W�
��@2�@n3?w��&���F�ABy�ӱx\��Y���z��iK�|�$ G�ގ��t֬-^���_�!���UW��`���o&�C�ͻ�5ዺU�{�'X�*��M��2�߯�9�$�MbcQB�U���]P�q�_��8!�խ�2���ls���"��?�u�cm/{i���(�/� ���+v�_HD�A[�V-EHײ9
���tU�m9�D�N�����ٚ�QS������g����x�LpXO���6<ËVK���c�L�������$��
�C���;^�������D�V.$��7�n8J�'��u0��Gd�j��i�(����^9�����l�`���h}@bitshuffle; see https://github.com/kiyo-masui/bitshuffle@���l�`��h}@bitshuffle; see https://github.com/kiyo-masui/bitshuffle@
��l�`���hl�`���h}@bitshuffle; see https://github.com/kiyo-masui/bitshuffle@+�l�`��h}@bitshuffle; see https://github.com/kiyo-masui/bitshuffle@
[)�l�`��68�l�`����/[%��3XClU=/"㷾�#w�����t�͗�Id�*�PZm�=��ߨ�Kb��CW�y#<�/�&�zby�Bf7�W��NX]ty������,��
��X1_7���bFcy�fȀ��|j����:\Mck�ܥ��ѓY,����S��V1{3C-�T�=N_J�����:�����6�v�C�"�}����_����@�RDu�:�ٖ�^� E7qw�_F,D�p����_�{����<=��������βeϑs�5#�.�1Tݭ_%�oc�wM���ug�fB�8^����:���u��/ʭ��)���NZ�g���u�{����`�Л�
k"_xB�I�X%9���@�O� �>ĊԤ�2���w�<��,�����7˧�"�d�8�C���bw5��i���1Z�7P�b#�0�D�x)m\�
�(5@no=�*m&�|�X����'ÍJ
�q�Bũ��b+�L�i�"�8��@�V\_D���5GDT��7bi��J�C�y�A����'��X�=*�F~O���e�$^�|4�D�t��$A�K�����/�t�4�i��U]��5/g[,��8����SU��I�Z�-��C�/���x�KvK�/ϫ�W��=K�!;L���r����o_�{�7�"�И�1Ï��=aֺlx<�X/�k�?� ��xN���俆ذ�S��u�拜��9{k��j���:}
��!a�67�x@�lo�i�!�(c�����P-A���c���6�+�Fx�`���&����Z6��˼.���Fk?�>��>��"�:��Ȼ}�h���^�gC'|7{��d��cɣ5�kA�s����:����$B6}���7�cЦ��� ]��Q��3d˼??����e�J��F�� �,�W�L"Y���f�V�}YI��:0��s�+~��݁�~?kb��D6~��0� ֭4��ܛ��i�[��b^ �Q50����ya����M�Q�L�(^i�T�?��&�8T���dž����c^`��ے�4$L3�tz=�����;��B��p(P$~j��vtGNϔ�bE��!�B����5���B�DSI�fA](�WʘZ��N��j�i��]̤<�;�Ӣx��l�?�)ݕt�t�T#K=0[ņ��ױl�U_2k��؛�s�����aS�%_xnP4sO�q���27?�yt�e�l@k�ج��(�{��f�CO��
w���ʋ�F�]m��$>X����(@������9Re������ �*�Y�:��X��K>��]f)��@xC�\�Vz��[�8�ʦ��A�?�"�l����\��WP%KY�n�g5�[\e�H(:6���8�����{nLs�W��8�Q�̴���Z1~�첑VW�C�&�@wT'�p��yt���*L�< ���>/^�hߕ���qb�-��Y���&�P�J�����~�C���j��0�K3������%km^�MF�x�K�h�=�ݿ�Or��.�|�XS�����H�cK��2@���0��gQ�k弤�*'5m�ˢ�'a�Cij���펫II0��R �DW�}�"V��=��ݛ�� h3D/vp�w��C�.�4�)p:E�L�71����wI�6�!��P��2�]v���Wס����(I�y�Y��"듬s�S�?��s������l3!N���3��8�����]���Ǖ���S��`";85$�Gk����ޕ�,�B]�<��
}2awN\i�Ⴓ�gk:%�<�o���/�)��h�6�)f4��#e{/]��ƮyϹ]����9%�*�Rf�ä'<������=۱ކd�.�%�52TREE�������������������������%�6�+���t���lAd\ܻ��h�� q���
��n|�G%�s=�� z:�L;3�ݥ���
U0��H
��ɫ�f��S�u�n
U�$��
o_!1+�Yȗ�ٛ��5ww��D�R~z�C��#�Z8�}�;�,]/�� �̬,�Du�h�=��b��.V���pɪ�`�n{�����9kD,���P�C�_D>"�Ӿv�)���I6?�*�1�|,�v�O�aw���dD@���%�w*�Y6�X��96�ݒ�2����*��v��ku?���cL��@� {^Ïg�M��Bf���lQT�3����l�)��`����9�F�Y_�*/�=�A5BI�`�x*,~�N���Q3;�C�Dg��� �\̨�oA���|��-z6�c��'����b_�s�H�"����B�N@Sy���;G:<��=pL)�K��6�\>�XA48�;��M�7��X��L�fH&k�t���|A]S�4 �r��<�6��L�Ar�:U���/m0Q��J�������S[��`&�&�\Q��Ew����I\P�B��Z�b�9�#�B�\�V�J�V�Fv��6���{{�������²2Q��E�,�ZY�բ��;�0"����ݕ=>Q��
ր��Fv$c����0>����/�2���,1�l�ܸ-
�8�Პ7�I�Ő�k\}H d*�!#O<�,���1�f:�\�e{�}<��U{h��Y�X���i��8ڣ)�f�B�������`7�8��.@�a�PP�N���_V�F�����m?S4�P��]I�0�E�8��*�8S:�@^�9����z�����9��튑s��Vn��z�Ƭ�b}@���~Gbs���h�� 2D\]�sv�3#zo(E/L�LN�<�5z�Tos���gcV1'Xg��!Ce�� �G#N:'2��5�y(������JN��[O]���*߂2��fn:9%�;���A���g��/E�E��pJ�9�E
쉞~(�vR}���ɈN�Q�f[$�u�L����I
2c@�8d}@��q����cTvբ�.ޙ�8-�$�1k�����M�6���\0��8W�ɸ��Y�ww�QFvɰ��#h0�&��z!����!q���c���*�8<&k���5na�XE8)��+��&Y�E�a$o���0�1�2+נd�T�U[���i8��� �*'h84�w�=A ���j�7.-�ݥH�����oQ��n0�?zq龚�E�6Î+�i(q�<-w���ps7�,��E�����r��-4����O�8�)_���N�5Q�����0����� �s�y���%�JO�ǧ���bg��8�%�*��=�eT�[�}��^����/�t�/�fu�)!֡*���;a����gױUt��S?u�L�� HVit�����_�:�J���D����\5�C��h9ը6�Ŀ"[j� �l'l8����U�y:�i��ùp��Mf�� XN��U�z��dZQ��_?e�ä'<������=۱ކd�.�%�52TREE������������������
��
(�/�`�%�6�+���t���lAd\ܻ��h�� q���
��n|�G%�s=�� z:�L;3�ݥ���
U0��H
��ɫ�f��S�u�n
U�$��
o_!1+�Yȗ�ٛ��5ww��D�R~z�C��#�Z8�}�;�,]/�� �̬,�Du�h�=��b��.V���pɪ�`�n{�����9kD,���P�C�_D>"�Ӿv�)���I6?�*�1�|,�v�O�aw���dD@���%�w*�Y6�X��96�ݒ�2����*��v��ku?���cL��@� {^Ïg�M��Bf���lQT�3����l�)��`����9�F�Y_�*/�=�A5BI�`�x*,~�N���Q3;�C�Dg��� �\̨�oA���|��-z6�c��'����b_�s�H�"����B�N@Sy���;G:<��=pL)�K��6�\>�XA48�;��M�7��X��L�fH&k�t���|A]S�4 �r��<�6��L�Ar�:U
(�/�`/m0Q��J�������S[��`&�&�\Q��Ew����I\P�B��Z�b�9�#�B�\�V�J�V�Fv��6���{{�������²2Q��E�,�ZY�բ��;�0"����ݕ=>Q��
ր��Fv$c����0>����/�2���,1�l�ܸ-
�8�Პ7�I�Ő�k\}H d*�!#O<�,���1�f:�\�e{�}<��U{h��Y�X���i��8ڣ)�f�B�������`7�8��.@�a�PP�N���_V�F�����m?S4�P��]I�0�E�8��*�8S:�@^�9����z�����9��튑s��Vn��z�Ƭ�b}@���~Gbs���h�� 2D\]�sv�3#zo(E/L�LN�<�5z�Tos���gcV1'Xg��!Ce�� �G#N:'2��5�y(������JN��[O]���*߂2��fn:9%�;���A���g��/E�E��pJ�9�E
쉞~(�vR}���ɈN�Q�f[$�u�L����I
2c@�8d}@��q����cTvբ�.ޙ�8-�$�1k�����M�6���\0��8W�ɸ��Y�ww�QFvɰ��#h0�&��z!����!q���c���*�8<&k���5na�XE8)��+��&Y�E�a$o���0�1�2+נd�T�U[���i8��� �*'h84�w�=A ���j�7.-�ݥH�����oQ��n0�?zq龚�E�6Î+�i(q�<-w���ps7�,��E���(�/�`���-4����O�8�)_���N�5Q�����0����� �s�y���%�JO�ǧ���bg��8�%�*��=�eT�[�}��^����/�t�/�fu�)!֡*���;a����gױUt��S?u�L�� HVit�����_�:�J���D����\5�C��h9ը6�Ŀ"[j� �l'l8����U�y:�i��ùp��Mf�� XN��U�z��dZQ��_?e�ä'<������=۱ކd�.�%�52���e�,������It%P�S�fx����&<��e��8�A֮Ef1#q��-#�Sˍ�*����b
����VO�'�g�8�:s���,(�E
W�߈}#]�U��g����[k��l�:����X����X���oՙ��$5px���Ѱ'����z��GN�K*F5���П�)5�%ӉR�Ϡ$*<
���/�%��x˷$s�lZp��iI���*�-�q5�o~='v?��bg,?���
f�n$n��pIj&�Y=B��$����f{�F0�5�B�ӟL[5��D�!SD�1�,5%�3|,OZA��EH�s�n�<�"V8/��=Ѧ }�I@�������.;��z�XY}�9Mf��cP�����-��7݆�̙��;+e
�(S�A���$z�Y��#3��s��1�8Hb�Q�[)&.���6Z�����9N�ù��f��=�����]�B�Q�nϠ���� ��T���,@1���AlP��q@�(2$�0�u8�]⪪pbV�Q9��q��h�V�;}�M�-��T)�G!Λ�E#k�o�c�:��C'�J\�9��έ���k4�;�ie��l\�t݊YX��C��*����ճ�4�����z��ډ�K���oM�)��7B�@��cM�+1"����(.�T�Ⱦ��H�E��_8������._�?IJ�e�_-���j!���ԅ�_K��.���?�\�w�V-��Q�����"�4;��d\&x_T�mG�Q�����-�1���0���@�9�:��^�S���"c�3�̠9���� ��K%��
� ~]ȳI�J� 9E��oG2q_�_K�<{ekǡc�(��k_amuE�� WON#y�5�X�����S%{$������-Me�JU��d�s+7�����3Y%<��)��s����� �1&E�u��ͷ�L��|��jo���6���9�7�I:����5��
���D+�f ^1�?��?�n��b��gTv���x)}8eW��T�;�f�BZ�r04F/�<�S�F���z5u�NL!Tv�)���v�&�I1υ�3�:�)(9��.w �ȅո�Gw0U��ڍ��BV_T�88��aǟ
]A,D�e����s����� Z�ڑ:K��⧉�(�y�1�4����|�32�䡢���r�M��m�¸��,1�����+�U�2 �-e���f(�nv�*Zh�ޟ8R9����4��sr�i��|J��YC��v[0S��u)ي�c��V��3� \��n�.��O����QJ��]@�Y�j7�����%���lF����]i�O�7ވTREE�����������������[!�h���tK��w�G$��
����RGA��͞��f=s"ȤO�삣�+�*H�^��|��z?I`U�H{����ȡ���� �+s{�}�.�x�\3�`�g�D�0H����;��SP5uti�/{� D�&�Լk�դ�,�xz�YR~;��o7:뒼���8���?��r�>Q���iW>Bgs��wk�~&_e�F��?TG��u��+)�y쬃�@�?,�d/P�$Qn��f�d�1�sXɒm~�f 1q�,�7��v��z|2��#;p�ʄ��7i��Ȏ�c�
H{�md���}*�ր��2�_/��lK�a`���i\JE�0�P���Z~V%n~�1�A��3\�>a4�~z�(�ƱF��X���m! �b)a�hh�\�r����STբi�m���`�K���;�Kr�=n*�S���ƻX���I��� �/aз9b8�܂�o<�K���㜎�IE�!��9:&=>�w�R�6�Λ81������^E�MJ�����6K5f��Ɨ���З\扼�a������in���U��p]H�<&�WL - tE��9��=�gBb*���;�.gOJ,?���7|�D��*ErW+}�\ykƕ�2��
�L���]�J\^�ڤ��e1K��'�П7l(b����yt#~m�b���O~��TQ�J\P�Jɐh�r%-��i�۳�]�N�NԓO�E�ozO��a�!ƒ�W�į}p��4��L��w�q;�fx> �g>�L�O�p�.@{؟�����K�Y����̰�>�PR �8��0�¤����"��0tdQ������;��@#�n����|
��A��j���s�eRwsb���FӒ��#�����{I���`JH�@�
��%�,�%+��F�;���&_s1�� �C*e�����8Ǻ2���E��i��ʛ�n��jVi�X�{���J��&�$AWd��N�G� �q����z$O�l'��3툨�xdfT
�;cWj���!t�pn��-���Ŷن�jbS�����\�����$3�����2��/B��3E�H�L�������q����v�� ��_^��2�Q�A"f����t�.$XM}��1Ln`6�T�NI/��W���!�c������)����#�~h>��j,���-*�����af�a�
cP�ݶ��@�T��ei�fQY�,bJ�4:@5����kЃ�N��:vŏ��l2��CMI0����J����щ��Q�Q?���P�Ì�S���p�OŒ��*)0rѯ���>ɛ,YN�T_7�PүPx�������d]�@]� 㽜B����!N���ͻ�FnԳX�ʀw}�e�b�=NX� ]����!�=��DK(�X��7*y��N�`5�<}w��D�jF;�)�d�$��p�3?�����+��{�<�͙��Z���db�&*:�
�r��pO[�7~e��y�w��^pu��e���0��|����$Ȍ��%<��6$X�5?��%�:V�B�1�~��*�Ltn8� ;��!�J(#7�̈́�y�u6��N�{V�F_"I�����@i��QJ��]@�Y�j7�����%���lF����]i�O�7ވTREE������������������1�h
(�/�`��tK��w�G$��
����RGA��͞��f=s"ȤO�삣�+�*H�^��|��z?I`U�H{����ȡ���� �+s{�}�.�x�\3�`�g�D�0H����;��SP5uti�/{� D�&�Լk�դ�,�xz�YR~;��o7:뒼���8���?��r�>Q���iW>Bgs��wk�~&_e�F��?TG��u��+)�y쬃�@�?,�d/P�$Qn��f�d�1�sXɒm~�f 1q�,�7��v��z|2��#;p�ʄ��7i��Ȏ�c�
H{�md���}*�ր��2�_/��lK�a`���i\JE�0�P���Z~V%n~�1�A��3\�>a4�~z�(�ƱF��X���m! �b)a�hh�\�r����STբi�m���`�K���;�Kr�=n*�S���ƻX���I��� �/aз9b8�܂�o<�K���㜎�IE�!��9:&=>�w�R�6�Λ81������^E�MJ��
(�/�`6K5f��Ɨ���З\扼�a������in���U��p]H�<&�WL - tE��9��=�gBb*���;�.gOJ,?���7|�D��*ErW+}�\ykƕ�2��
�L���]�J\^�ڤ��e1K��'�П7l(b����yt#~m�b���O~��TQ�J\P�Jɐh�r%-��i�۳�]�N�NԓO�E�ozO��a�!ƒ�W�į}p��4��L��w�q;�fx> �g>�L�O�p�.@{؟�����K�Y����̰�>�PR �8��0�¤����"��0tdQ������;��@#�n����|
��A��j���s�eRwsb���FӒ��#�����{I���`JH�@�
��%�,�%+��F�;���&_s1�� �C*e�����8Ǻ2���E��i��ʛ�n��jVi�X�{���J��&�$AWd��N�G� �q����z$O�l'��3툨�xdfT
�;cWj���!t�pn��-
(�/�`Ŷن�jbS�����\�����$3�����2��/B��3E�H�L�������q����v�� ��_^��2�Q�A"f����t�.$XM}��1Ln`6�T�NI/��W���!�c������)����#�~h>��j,���-*�����af�a�
cP�ݶ��@�T��ei�fQY�,bJ�4:@5����kЃ�N��:vŏ��l2��CMI0����J����щ��Q�Q?���P�Ì�S���p�OŒ��*)0rѯ���>ɛ,YN�T_7�PүPx�������d]�@]� 㽜B����!N���ͻ�FnԳX�ʀw}�e�b�=NX� ]����!�=��DK(�X��7*y��N�`5�<}w��D�jF;�)�d�$��p�3?�����+��{�<�͙��Z���db�&*:�
�r��pO[�7~e��y�w��^pu��e���0��|����$Ȍ��%<��6$X�5?��%�:V�I(�/� @�~��*�Ltn8� ;��!�J(#7�̈́�y�u6��N�{V�F_"I�����@i��QJ��]@�Y�j7�����%���lF����]i�O�7ވ���� ���5u
���Pȧ�I��2RbBd�ӱ�
M����a\�F�|�E��HD�
���^=`/ֆ"��rL_�`^�B�fM�=��t�E�������Ǫ�)��K����t��c�,}�~��C�����'̨b皉���L�?vチC�EKB�[����}�����ҰzU�I��x�_��������^�����ϛz�|rO<.�PF�]^�������n@�Џ���r��/d'�tfM����@YJs:��� ��5������էU���:�SYU��!���^���Uf4w��B���5���*^xf��4[�q��c�X
�93NVy�W�̥up��EA
d��J�UVA���pS�eK]�$S�/�#jm��y�n����������}�퀿>���&����������p�ߎ%�և��ȼ�x��S���cߧ�x�3Yv���}sbKKՂ��ԥ8��V�+��L����ֹ�A!F6A�]��4)��@s��s��U�,�� ���8�)����b�H$_����0�O�`B\G_�{�����>؟����@l��������l�
a��(nUCui8l}/��O�{kUd�h�}������J�.���W�T�ُ���@�)���x�����d�����j|��0#����W����6����7��o4x�sr �'YZ��0龜�����_��OƸ�_ �����3 �bcq`��Bi\�8�*��sGQ������qꉻv�Ǥ䴺�����Bx�&�ŀ{�h,�/�4��=��I�P�O�R�M~���N��WY�QpbqC�mso-�@�X���]���a�@�<�#�ŗ�X%m�J�-5�S~twu9��m�̘�]V#���?<�W$��3
5c��D�uq��lD�"^�}��}�X��v�����YL1t;��#E_�6�7�o��jR*Np�8PU'#�������5b����� �3�!F���R��Tk|����Ֆ;&p,�kY5CH��f�l�o<�y;c,���<�������r��W��8Ϡc�/�� H��ߕ�k�O��ƫ6��caрO���լb�e�7\��"�cú���ǰ��%8��RC0��g�N�W�s!H-�m�*P~�Q��z$�4/]�~��rt�fC���7��s��Q���c��gE&�����c����i�ߖ����*�Ϛ^D����H@I#/s�G�3 ����PJ�XS��R�;K��p7��=����;\ߙ4l���<�đ������;��k{J4��p�6(���f>O<�Y <'
sJ�v+&"��G�d�� �8+=���41y=��0Y�dlL';|�l��P���y�Lp�r��w���o�g�Hy��L��"��$.�weuz.��H��*�NZ��<�ez�����9��.6�.���Bq�0c��;P�4�&�b�0��ٴ�/�-�pR4��h}@bitshuffle; see https://github.com/kiyo-masui/bitshuffle@�@�l�`TREE�����������������I������̆�I�h~0[��S����*�oxȈ�Y >猵�]Y�y�>O��pt��g��q�,_����B'ҹb{��hOB��D�}����+�i�`
*]A�(�Gz�La$���,|.fYJ�5�kU����vi����]�'��u����I+�>A�\���
�r��.��������M����}�ěq���$^
q��
�Z�f��n��GYih�c��f��z�i�7��]�7�̰ԩ�������L-�2����:H��0���%��������|��U+9��G:��?��`�e0��4XA�'��ed0 Grx���ձ��y�2�N��J:*�7��tz�VO�?��Ǧ�P<���Y�H�!�����]bi��g���K�T�1h*�S���lNi�_I��gB5_cUܤ�R����Y�{c�}��oWkU�>�
�G+ä�֤��"5ېC�pNx�
6
!3�8l�����0����p�1ڝ3|�X��[]� vk��RW�' �B�J)�\a��������Y�/ ��g�&�k��Bl��@.�R�M�g�H�#z^ô��5~�!@i��m��M)��d��p=ѽ�
A�9E�*z͔����9ߪ`8@��}����N�/�^B�,��ػ�r]���>��e#tu<����{�sAR�]swbFe([;�x���R��w�};�R�C�m!��1a�_K�h*���=��\��d� K�=���>B!���&Hv,��{�8 �xQM<� �L���R,�j���|@��ʂ�T��7p�2�ߞ�6W��Q�P��NnM0�g�NkM���_��q�4�������zw!���N6��Ы��n�����&UX��8B�!�A{�A��~�c�:�e6���<���_@���_�Ds�GA)��,5nb\��/��o��R��o2S?� 8�T���t[�[�ӝ�`!��}d2�iig��U��=q �Q���ʉ��ٸ��(��tj���?�n��9�*�H./��.=x��T��pk )K�Nk�5���~�ר[��E[�����'��TI����O<��s�t���F��|nPμQ���P���P���Ԩ������5���}�~~�I��ۋ@��p�W�t
x����]ʇ?����Z��u:��TUAb���B-Qz��qQQ�?�I�d�B!��L�t�3Ĝfw}cn�r�����F01���Kǟ����W�ߗ��[�ҭDH�T���b�
w ͋!�#ev�����/ƈ�c7�֕��%���Q��u�m�U�ρO"�>�t$�q��D���rh��4-PX�ZG�ƾLIg�0�����^�OE���vBA2"|�/;f��N�������뛿�>o2���a��\�D�q'�f�Û��>NP.�����^�iT��!���6��~\i�kt_x�e-8F�/��!�T�,�Z���Gܿ�0h��nU�{�?Y�\��2!�7|/%k�\��|�-fR��0���>0X6ivan�ԝ���99�ؓs�
5s�&Į(�`��
�̭��D%GT��B����o��A��ӂy�Dgܪe�k<-�%��{��f
MCK��Յ9yY���6M%� ��9.cn8�0Z�0��1��/{�-��zɥ���. K�_sߝ�x^@5��N?.
i�뺈�6���}�&U����&Q;t�[�4�&�b�0��ٴ�/�-�pR4��h}@bitshuffle; see https://github.com/kiyo-masui/bitshuffle@
R�l�`TREE�����������������NZ��
(�/�`�̆�I�h~0[��S����*�oxȈ�Y >猵�]Y�y�>O��pt��g��q�,_����B'ҹb{��hOB��D�}����+�i�`
*]A�(�Gz�La$���,|.fYJ�5�kU����vi����]�'��u����I+�>A�\���
�r��.��������M����}�ěq���$^
q��
�Z�f��n��GYih�c��f��z�i�7��]�7�̰ԩ�������L-�2����:H��0���%��������|��U+9��G:��?��`�e0��4XA�'��ed0 Grx���ձ��y�2�N��J:*�7��tz�VO�?��Ǧ�P<���Y�H�!�����]bi��g���K�T�1h*�S���lNi�_I��gB5_cUܤ�R����Y�{c�}��oWkU�>�
�G+ä�֤��"5ېC�pNx�
6
!3�8l�����0����p�1ڝ3|�X��[]� vk��RW�' �B�J)�\a��������Y�/ ��g�&�k��Bl��@.�R�M�g�H�#z^ô��5~�!@i��m��M)��d��p=ѽ�
A�9E�*z͔����9ߪ`8@��}����N�/�^B�,��ػ�r]���>��e#tu<����{�sAR�]swbFe([;�x���R��w�};�R�C�m!��1a�_K�h*���=��\��d� K�=���>B!���&Hv,��{�8 �xQM<� �L���R,�j���|@��ʂ�T��7p�2�ߞ�6W��Q�P��NnM0�g�NkM���_��q�4���
(�/�`�zw!���N6��Ы��n�����&UX��8B�!�A{�A��~�c�:�e6���<���_@���_�Ds�GA)��,5nb\��/��o��R��o2S?� 8�T���t[�[�ӝ�`!��}d2�iig��U��=q �Q���ʉ��ٸ��(��tj���?�n��9�*�H./��.=x��T��pk )K�Nk�5���~�ר[��E[�����'��TI����O<��s�t���F��|nPμQ���P���P���Ԩ������5���}�~~�I��ۋ@��p�W�t
x����]ʇ?����Z��u:��TUAb���B-Qz��qQQ�?�I�d�B!��L�t�3Ĝfw}cn�r�����F01���Kǟ����W�ߗ��[�ҭDH�T���b�
w ͋!�#ev�����/ƈ�c7�֕��%���Q��u�m�U�ρO"�>�t$�q��D�(�/�`�h��4-PX�ZG�ƾLIg�0�����^�OE���vBA2"|�/;f��N�������뛿�>o2���a��\�D�q'�f�Û��>NP.�����^�iT��!���6��~\i�kt_x�e-8F�/��!�T�,�Z���Gܿ�0h��nU�{�?Y�\��2!�7|/%k�\��|�-fR��0���>0X6ivan�ԝ���99�ؓs�
5s�&Į(�`��
�̭��D%GT��B����o��A��ӂy�Dgܪe�k<-�%��{��f
MCK��Յ9yY���6M%� ��9.cn8�0Z�0��1��/{�-��zɥ���. K�_sߝ�x^@5��N?.
i�뺈�6���}�&U����&Q;t�[�4�&�b�0��ٴ�/�-�pR4��
Nj�l�`���
h}@bitshuffle; see https://github.com/kiyo-masui/bitshuffle
@Nr�
l�`��
h}@bitshuffle; see https://github.com/kiyo-masui/bitshuffle
@
~��
l�`��
��Hl�`�a1_a|S1_b|S1_ca2_a|S2_b|S2_ca3_a|S3_b|S3_ca4_a|S4_b|S4_ca6_a|S6_b|S6_ca8_a|S8_b|S8_ca10_a|S10_b|S10_c�SNODPxh(a����~e���,��
h}@bitshuffle; see https://github.com/kiyo-masui/bitshuffle
@���
l�`���Fz�t��Æأ V����ͅ����U�
��U�
��zw��v�@y�C�Z?8H����c?�������ؘ���_�B*�#��,�)�a����@ַ�(�d��L.q
��n�[2F;��
�гl������L�ʒ�
qh�FǒŇ�aG�Cs�{��Dx�Y��L����)r
ԅ�s�]�����}r���y:��!�@|R�#���U�r��I�=`8��q/�ݩ�7�m4ܺ�dWZν��&�P+���m��Yb�����J�)+K� �̃��V$�`��0@�#���\`���{d�J����5��
��dF��ykE���
��L���3-���$��1�f�
��^�jG4�8�
o�cbZ����\{��G��*��\�����}�s�J+�h9(*D�a�*>8�Lh{���Z7bƒgz��u�8C����|�{d�Fz{���˗LYHk6<�����RZp����ɍ���遊M���$Х��n�y��5[3Z$a�������B�)Y����1\�`O��s��HFg}�]<�7Ĉk��57k.ژ��7��%&~��O�
��41�. �ǐ�y��nȔ��Q��U��[���>@p�8+� �� B^�Jt����b~) +����T/��R�Q4��cu�H)��Ks���N�a�N#o�iqIjx�qJ���������w���Q��O�m�������!����!:!��
u��e?��$�PC��+A�-T��/U/d�ʋ�J6�dv�eQ"Jݹ�E�Zzb/�:P���ڀ��Щ!�{CB`�����'L�!lT�VhΥ�]W���s�G���%�U̸�T���}��6��u�Kk}�o2�Y*A-[4��v�RVh8ޅ��M&kI���K6JX�N��g�1L�d�0t(��+����o'�*�H�os�c0�V����%"��O��˚��q���kĶ[_�+��d��T��JuS\��ۜe�o��#�ܕy�z�_ލJ����&��z�R��
1� S����z���w����Ɣ�*�>�W��3��9#OQG��m(/֠��m�⒞�u�zy+��]�D�E�d�՝+:g1���a����*ރ���J�����p�Qo�,;�����Ғ�s���`�O��R�v��vF�r�t<(q�*��Bכ���o}��!֗�����G�0Af��|��E��5S�p��b���[�Pp�m%���
�������h�%��N���;�a���
�?*�B
��R������D7*����EBT�O.��Ux��FZE�sy��\�jư� �?�@�#[M<�D��#�7-�+:��kQ%P��+9�������1p^�ˈ}.N<{�
�S�V;F�>AM�Y�VN߂t���V|ԭ�1��:����t=J�V4�R̺��1�ɐ�2��کK� �89�젰*��JU�W֎6s��o�g�o%���٘Q0s����rP�v�_f�����-��r�O�í����ZF��|W+��6�]#���� ?�$Ǭ���խ������moE��0�{�IkgW�Dpc��9i�/C����W.��8 UR�`�TW��0yz�:�,� ����r�
�t�"�F�����e��_��Hr�m؛˭����$�:��tփ=*��b_�z\�LHp�����O5Ғ�,�ޢ�;�3*~t\�z~$�-n�0:�t..�T�(��sk����}(������aϩ�7�a�l�y/��Ե�h����-�Ybu������s��ҩ��G��r��
d�HcÑ�86��ʍ&�G�7-~�ՇMnKeXFn�U�'W����z߾�kS�N�p��h�9MɵiL���Z����W1���S�"��>4���)����o|y(�>0VzܼuI�F���J���]M#���:6��F���D��J����ԆJ6�=qX��"Nc��TREE�����������������~z�
������sJPQ�N�Co�-yq�)n Y"���U
�cҐj���8̋En��6 �>
q���H���5X��p���=M��JW�hKESlKZε�2��|G8D�'д��,5�n����=Pc���!�$F8���ˎ�-T�څ+�dm�+~��Q}Y�e&�!z�65���x%�`FZ��g$Xf�SR #�������s�D�й�Ō((��vt�S/Jz.��2I"��M���OőA��|2������m��TKY#@�2�x�тU�j]��t�0�����xUx���/hԅd��}G>����-���k�r��e_��;��ե�X���g���
���Ocq$�[�*8��q|[�c�@4Vԟ{�s}-
Zsu��~DžT)����z�IM�?��n�_�֒��V4+�-��P5�:6�����vFgr�;K�W ��~����~�+��o $-�z�T�U��#��-C�2���<��B�����9a���m�����V��y��-Ȧ`����3� ��f/�~�i���b��?�w gu9��^���DߨN���l�Z�Ȗ����Ըf|����l�X(
6�N�fXR���l��98�Y�����36�!p���}#�L�9 Y��p/+7���������g�9Su �)q��q�Ķ,K�dW�w#��1j�2�;+˟b��Z�Q��;^����~���kz���E^~����zٓ)�m�4�iʔP�L�9X�H��p��F� 8ӯ��>5>3�q!U-#mS���ŧ
4&-ܕ4Z����S�`��Š&I�1h@A��y>z��齤����@b�Xu�4ʊF�5�9XV�������s��l�F�5YRj�#�F:xkLM�b�/꜇�Ϸ�#��N�!��Nq��>r��:J]�D�۴�R�On7�]VP�VA6����m_8�U$�#�� 鉴�4�b���3���:2�*y����#3+�,Q���kD��˛�G�gp`/Ҹံr��U��wz�h� ��>���x��w�y��4�����#�]
h��g*TC)�� A�K�K��}���M�}w��|,,~R� ����C76�7Jz�Zr�n�~�$��gE�弿mW�JWژ�7(����-��Jԏ���2'h<}�+^['�i=�A}\aC^`�Z�D�|���U:e{rl��d�^\�p���s����>@c�7f�_٫Al�If�s5�m?��Zh�[(������~����Ŕh��:�K��Zjuew�a�37A
^���4QH(Y�α _h9��B��NJK�ի�h��b.-O�����B=�-�(�qg�1�W�<��4�.L��0�$�����~Ɓ�ܹj���v5]�/\�;���iNտ�.�|�m��?=#�'{�'����`�8J7���|Ћ�.ro���+:]�ԼQrr�%�������c� �@~����a�s��{ͭ�1�,����H+��F.�
NVzܼuI�F���J���]M#���:6��F���D��J����ԆJ6�=qX��"Nc��TREE��������������������
���(�/�`�JPQ�N�Co�-yq�)n Y"���U
�cҐj���8̋En��6 �>
q���H���5X��p���=M��JW�hKESlKZε�2��|G8D�'д��,5�n����=Pc���!�$F8���ˎ�-T�څ+�dm�+~��Q}Y�e&�!z�65���x%�`FZ��g$Xf�SR #����(�/�`��D�й�Ō((��vt�S/Jz.��2I"��M���OőA��|2������m��TKY#@�2�x�тU�j]��t�0�����xUx���/hԅd��}G>����-���k�r��e_��;��ե�X���g���
���Ocq$�[�*8��q|[�c�@4Vԟ{�s}-
Zsu��~DžT)����z�IM�?��n�_�֒��V4+�-��P5�:6�����vFgr�;K�W ��~����~�+��o $-�z�T�U��#��-C�2���<��B�����9a���m�����V��y��-Ȧ`����3� ��f/�~�i���b��?�w gu9��^���DߨN���l�Z�Ȗ����Ըf|����l�X(
6�N�fXR���l��98�Y�����36�!p���}#�L�9 Y��p/+7���������g�9Su �)q��q�Ķ,K�dW�w#��1j�2�;+˟b��Z�Q��;^����~���kz���E^~����zٓ)�m�4�iʔP�L�9X�H��p��F� 8ӯ��>5>3�q!U-#mS���ŧ
4&-ܕ4Z����S�`��Š&I�1h@A��y>z��齤����@b�Xu�4ʊF�5�9XV����(�/�`���l�F�5YRj�#�F:xkLM�b�/꜇�Ϸ�#��N�!��Nq��>r��:J]�D�۴�R�On7�]VP�VA6����m_8�U$�#�� 鉴�4�b���3���:2�*y����#3+�,Q���kD��˛�G�gp`/Ҹံr��U��wz�h� ��>���x��w�y��4�����#�]
h��g*TC)�� A�K�K��}���M�}w��|,,~R� ����C76�7Jz�Zr�n�~�$��gE�弿mW�JWژ�7(����-��Jԏ���2'h<}�+^['�i=�A}\aC^`�Z�D�|���U:e{rl��d�^\�p���s����>@c�7f�_٫Al�If�s5�m?��Zh�[(������~����Ŕh��:�K��Zjuew�a�37A
^���4QH(Y�α _h9��B��NJK�ի�h��b.-O�����B=�-�(�qg�1�W�<��4�.L��0�$�����~Ɓ�ܹj���v5]�/\�;���iNտ�.�|�m��?=#�'{�'����`�8J7���|Ћ�.ro���+:]�ԼQrr�%�������c� �@~����a�s��{ͭ�1�,����H+��F.�
NVzܼuI�F���J���]M#���:6��F���D��J����ԆJ6�=qX��"Nc�����Kn�_�q���qx���q
X1�r�ڞ�ka͛9)j�T�o)ͨ�iSM��5�.ȂͰ|! ⲇij��n�2�g,[>�갿<\���Z���Ƕ�����Z�����Gle�I��5�gIB%eB4���+K�*fo���w�_L�k���q�dV�tv�dC��
���xY��/F yӺ�C�+�m�|p�Q<
4�����������{%|{�V���s�B6�X��_T4���G�o�� vd'E}�ް�5�����S�2c�W����DS�z�-�� ��1vs�ۏ�0C�#��x���a��=��ŷ�
�}�8u�1J�_��F��b�`�s���NGt�{��'��p�{ �s����x�p��I�`��Xp�
�=��wO�D$uSY'#�����������FJ�U?lu�Q���{xe��l��t�c'K���J�p����93���6tׯ.;�����yZo�S���t�.��j^٩��[|�7�C�b4�����yf���B0�v����λ�I�ˇ�w�E�T*͈L���t�tu;�ҕ�U�I�ҝ�Lq_Wx��5j�8i��������6�g*X!��(�`�s18?%�X�@T1n�Xf3�c���Hֹ�*k��h\E�r�00�
t�^h�u��Y]^l�Џ��hj|6�19l�����t{���wV�K�C�o@���OX���<���[EEf�X�=���+W�c6�N<��0����МAl�q����bi�(��?G��V�c���A�i�sU(&����3�8 18���AK��+j�"��0^ԭ�z0ez�%�rd4^<�2��1(�l�?�[�_�����}�㵪D#���0�]�<�w���������9��8���Ռ�@4�8�v�́¡�8K�m"����?{^�2b��1lWDh�UHC��
d�cL*���+~�O��wip��}��l�qb�ʌ�YM4J%���&�$�mX���C^���7W�H0����ո~�j����#�y7'b�;Υ�]
���V ��d��W����,��T�GDI���vIz��c��#��m}�KU���/� �L��������3���wwhE�����_�;�C�IR�����k�ĝ�X��ό{U�'>�rkaa�����2,`Ŋ�RZ;R��I.2
�{U�r���H^ ���7 �s�QIU<�W�M}�
�Y��~>�o�w��%�I�����d7�I�K"*@���vEH�l�ex1�Kz����^H��S�e�r�'�+�Y�g����!cT�}�{n�Z�����m�zM9Ȕ���W+���#�5�ֵ��Ȓ�6��LVZ�A��Z��N���@�i����+��\�����&���ّOݸ�v��s۵EHGE>|t"%�҅���I|T�9�~[ O���,h*g��}��~$�Xf�Ln�Ȩ�M췜u"�*D3,L�&���JL'����R��]ѫ`8�>���+t�\�0�O���?[<�������x�05F�&���L7{��'�xhuV��f������ĩ�_!�359�F�0��iڙl���B��V�{}ΰ���'��xZ�qz�1{�HbK�T��Rف���L|����X)��s�ܝ�_��ꎲD0-p?VJqm�жv�H�s��Y�F��,;4E��Q�f�D�B����{C�W������a1_a|S1_b|S1_ca2_a|S2_b|S2_ca3_a|S3_b|S3_ca4_a|S4_b|S4_ca6_a|S6_b|S6_ca8_a|S8_b|S8_ca10_a|S10_b|S10_c�SNODP�h8j����6i��� -TREE����������������r���
H�����su[���kOl��ҧ~�'l5o;E�RQ�����@`�R��P*�u����J�ߋ���wVx�����Y��׀�����碙J'z;��Fu�4��+��C���f7�s&f�����a��͐"'Y��IR-',#��}KP�xY]�&P֞}���/*��j�>��*�~����cFઁ���6�B����CN�Ȗ��O�@����~�$[� ��y�Ϳ^���Uzz����PY�Y#�d�S�@��l��z�eN^�w<@ƍ2OPv�p���$�IПǺ��
t�yW�^�ԁEN�b�[`^�of�q�
�f 5~'�g�
��8�&��gG"N�\��2d�"�
a���m�9�_�*��S�i�:�jFoo�e��|��1�Pgݛno*JQ1dE�𭛌�O�]ɦ��H �u ���̌ �y�F��l�[�L���+�V <�G�E��C��l�PUo&0�&���
��&�e:e��?Kۂ�>�l�rW$��kH}�MY�T�R�>)i�(!��V�$
c���7�p���٠{̂@�[u�fc�}z-�R�v�͕v�C|wN��s�A�����w;��kB��Cg�I��G����4-�Ep&�o��榤��F����s����]Ƨ�`8��oa,1ȃ%�4��#6VЌ�xΗ�GN��|���#dN��E+�*�����@خ��^Gˊ���bB�&~A��+7���Ҵ��?�R�K+z+ �| �n�I�y �B��ga��ǂ&���u ��&�ͱv��R�v�����ڪ��|����1�?�ov�5��)b+ʶH9�\�Ԁ�
G����Z}DC���}V!��Y�m95v��a��H=�{�|p4���gM���$�/�$8�*�]F�G�3|�Ղ��?5�ie�tv�fZ"vwzd�8��-��4�u}D�������lh�T��x��B�zZ�h�z�>���Z���(�؍"�ky�9��\�����r�/��,��v|�JUԥjL�Wr���/�N!�A0C�
�ZxK�"]�2;z�Ĵ��DH�N�I�Yg�b��E:c�Ȣ��ƚX��c[�M[׳ �e6W�ׅY���1�N������L�ѥn?$%���2 �nt8Lsmx��'
��b��}8���Ge7�q�SH���[��T6�H;gPs���V�L@'�ay[�������=�����y0��$L�a*�#R��)�<��#���À���G��!���@�Y�ЯGD6)F��������s��N2��O�u�gQQ�[l�Ů+1��H�ױT�/�
�m0w�R�@E�ӽ��䱮�G%^�/m���Sm�bl�^�8����b�v'KY�Y��<
�}~r(����h�o�XVE2��k�~�DD�R�c�h4���?�&����ji�?���Ϳ+��I��yK����A��g�����GZqOK�=8LO�����A7ңV&�{&F�������'c/���l��]C9=�>� ��F�'�
���S��sө�5��F�vR�M)��^�cG�_����
����To�2�T
�4g��|�}&��ñ�v�݆��鋴��0-�┈r$>6Ԟg��o����̎��Oeߣ�����t���G�'��
���w�S"��:i%��.ܬ�����_��g�醽�i4q��i(b�-�_N�g{��$�4��gI�����Ȣ6,�O�0�Lٚh[K�{E�*���Im)]+�§�c<#�Mj��ɣn�5������*����؟|f��.�&�a�)PZ���@1���Q%HӦnnvZ����?�
���r�9�p�blf!����n�`�˩��[�堆��I����չ(&��yL��BG��c�Ý6�0�A{�~�������'��7�:�%X�q1k�R��s4#�+���T��Ǖ!H���JƏj�(��z��~�D�:�JB�wp 7P<����{����M��)|�ݧ�ȗ=Zm��\��/�}�
e��&!��S8��&�"/���מT�X�'Cq�M� 6.o*n�'�s��Y�F��,;4E��Q�f�D�B����{C�W��������
h}@bitshuffle; see https://github.com/kiyo-masui/bitshuffle
@
��
l�`a1_a|S1_b|S1_ca2_a|S2_b|S2_ca3_a|S3_b|S3_ca4_a|S4_b|S4_ca6_a|S6_b|S6_ca8_a|S8_b|S8_ca10_a|S10_b|S10_c�SNODP�hx{����2����`6TREE�������������������
H��(�/�`�u[���kOl��ҧ~�'l5o;E�RQ�����@`�R��P*�u����J�ߋ���wVx�����Y��׀�����碙J'z;��Fu�4��+��C���f7�s&f�����a��͐"'Y��IR-',#��}KP�xY]�&P֞}���/*��j�>��*�~����cFઁ���6�B����CN�Ȗ��O�@����~�$[� ��y�Ϳ^���Uzz����PY�Y#�d�S�@��l��z�eN^�w<@ƍ2OPv�p���$�IПǺ��
t�yW�^�ԁEN�b�[`^�of�q�
�f 5~'�g�
��8�&��gG"N�\��2d�"�
a���m�9�_�*��S�i�:�jFoo�e��|��1�Pgݛno*JQ1dE�𭛌�O�]ɦ��H �u ���̌ �y�F��l�[�L���+�V <�G�E��C��l�PUo&0�&���
��&�e:e��?Kۂ�>�l�rW$��kH}�MY�T�R�>)i�(!��V�$
c���7�p���٠{̂@�[u�fc�}z-�R�v�͕v�C|wN��s�A�����w;��kB��Cg�I��G����4-�Ep&�o��榤��F�(�/�`�����]Ƨ�`8��oa,1ȃ%�4��#6VЌ�xΗ�GN��|���#dN��E+�*�����@خ��^Gˊ���bB�&~A��+7���Ҵ��?�R�K+z+ �| �n�I�y �B��ga��ǂ&���u ��&�ͱv��R�v�����ڪ��|����1�?�ov�5��)b+ʶH9�\�Ԁ�
G����Z}DC���}V!��Y�m95v��a��H=�{�|p4���gM���$�/�$8�*�]F�G�3|�Ղ��?5�ie�tv�fZ"vwzd�8��-��4�u}D�������lh�T��x��B�zZ�h�z�>���Z���(�؍"�ky�9��\�����r�/��,��v|�JUԥjL�Wr���/�N!�A0C�
�ZxK�"]�2;z�Ĵ��DH�N�I�Yg�b��E:c�Ȣ��ƚX��c[�M[׳ �e6W�ׅY���1�N������L�ѥn?$%���2 �nt8Lsmx��'
��b��}8���Ge7�q�SH���[��T6�H;gPs���V�L@'�ay[�������=�����y0��$L�a*�#R��)�<��#���À���G��!���@�Y�ЯGD6)F�����(�/�`���N2��O�u�gQQ�[l�Ů+1��H�ױT�/�
�m0w�R�@E�ӽ��䱮�G%^�/m���Sm�bl�^�8����b�v'KY�Y��<
�}~r(����h�o�XVE2��k�~�DD�R�c�h4���?�&����ji�?���Ϳ+��I��yK����A��g�����GZqOK�=8LO�����A7ңV&�{&F�������'c/���l��]C9=�>� ��F�'�
���S��sө�5��F�vR�M)��^�cG�_����
����To�2�T
�4g��|�}&��ñ�v�݆��鋴��0-�┈r$>6Ԟg��o����̎��Oeߣ�����t���G�'��
���w�S"��:i%��.ܬ�����_��g�醽�i4q��i(b�-�_N�g{��$�4��gI�����Ȣ6,�O�0�Lٚh[K�{E�*���Im)]+�§�c<#�Mj��ɣn�5������*����؟|f��.�&�a�)PZ���@1���Q%HӦnnvZ����?�
���r�9�p�blf!����n�`�˩��[�堆��I����չ(&��yL��BG��c�Ý6�0�A{�~�(�/� ������'��7�:�%X�q1k�R��s4#�+���T��Ǖ!H���JƏj�(��z��~�D�:�JB�wp 7P<����{����M��)|�ݧ�ȗ=Zm��\��/�}�
e��&!��S8��&�"/���מT�X�'Cq�M� 6.o*n�'�s��Y�F��,;4E��Q�f�D�B����{C�W��������
��j l�`���
h}@bitshuffle; see https://github.com/kiyo-masui/bitshuffle
@��
l�`��
h}@bitshuffle; see https://github.com/kiyo-masui/bitshuffle
@
���
l�`�BS<�����<
7�'��}��z��C�T�����Hj��=��*n~�&0�jkQ�����
�S�h���X��X(1J�a#�Kl�NЎII~H*� T�����F����Mu2i>#�e 2C�MV��2���⫯0%=�����,��m���%��(�'��9C�,N�ZUҨ�2��|NH�r��
�mE
�k�XB��PM{�N�hn[���!��b���r�8�>�B
�������'ОK��
[ ���E�0����G���^��|y�.�
�r~:0��D�4L3�K����t����,�Mco�)c�T�_�q�f'��Ԫ�tx��y�t2�,��YA-
�Z�[˗��z���a�U��!�x�[���mϤMA�����ܟƥ̯�,�a���X��`���Y��?�}/��8�B��=��t����u*�x��/����$�bZ�n����x����;pfe�g��]�_Փ9���U��3��hy�X��҂��@�;و�;DIh��ߦGG�h��WS~����N7Ui�Ov7j�� p��7�Oͬ�o��P�}��!�Yj�qc����=r?����\����ی=TB�K�I�X}@�s�/~"�nE�2d�C�kIۉjmY����T�ʓ,� ����n~�x�~3��9�qV[�����U.�����U�ۺv��0>���~f��
�w0�;��,e�`�J������y ��<�E,[���HB=
���R|�*���� �uv�wG5��n+m���Z#�I8j\��@@�M�*��-�C���(nc��q�d�V�����v�0w��9���� e����ۣ�glO:����L�E�L���y��aTIi�y�[1�tˮ����<�F��r��W��l�r�Ul��#:A���f?���鳞!K�l�
��p�m�6�a�����[5�a,����e���]��
T���o�ƃk�nع9??9U��S�z�� �)��>��ח>&m/�"Y̸J��C��"���%H
��[*���}<���H�g%:����\B���
�cg�$�~��E�oئw��SPʂ(��z�^�I)L#��U5 ���5�J0e2ϣ��ẍ́m���L0k��w;�k1OC�ƿw�����"���Yz��*��G2�
��E���S�9�W2y�Z�
<�-u�N�H��M'�$�$�'T� ���CJv�FM����\�
>�jk�����}���/ո-�������|@���������G���툑�v�N<"h�[|�EN���i[j���ʐJ�l*�M2 ���2tb�d�{��:���?�ed�b��8��`�np/9��\�<��Z���E�Vk�qP�#/�A�5?�O���&䅚ý#��]9����Co��w�9H�a�J�9�{�F�$� 6�ߍ�
ڏR��0���(����gr����1֣)m�Y5�"�7q�B��H��v����P�x��u@�;Ch�`�X��UA冶�SPpF^���o��e�T� ����A��ע���"Y}�j��%C�BD����y��I����\���>��8�"�އ%�c�i�=z ��� b)�M�K[xe/�~��v:{�n,��|N7�|��e�s��a��W���»���Q����b� �udS�|\N�f5A�%O�G:�Wa����t�i���Y���xo ]�K ��nR6B�I,���,��r�ėe�7��zrn�k����ꇷ�ɤ�sh�GL���a[Y��V���{���s����_*�]p����Q<,�G7K�ͨ��l7��Y}:�d<��%Bo{p�]A�S�>5��ꏶ(��d晉�}�\8@zr�`�F�x���t����~���½nޚ�X��@�dM�A6�J�n�Χ�_��X����#��LX�O���^m�%P��������|-)�~���jYL�t��y�6�ZhTREE����������������� ?��
j�����s�DA���R*u��B����h��E���� 9�7��3�t��4�=���/0�NA����+}D�0���>LxY
�c*�<�}�"����G��@�]����>�N�bMD� xq�d���I����~����D�����#��[�C��e�ƹ+R�T�����|�[$�̱7u��_�y��,��J��:�QZ��3�#�B��h�^��}����w,$�M2��d���9�i'��@'=�I� ���b�O�
����֭��
7�)A�Y�����M�`1���7���Ghp?�F��qL�iWQh�4,j���eA�1G�`�1gvf;I-{!a�'@������M6 �-��,�:���T�dC��
�������$F�~�/6'�G��p�Ty,��������ȑ٫���x�7�U��zQ�(����|ϊvP�mI!�1�XM7z��t�}krW��"�9>
P�ׄ0���؎s�9o)�9!�jlf2���d~��3���md˯�_@����}�=��"�%A���MSbύ���[�I��*�+<�W&�z)�D���,MF b��$e�n�a��Q���gI����g�&pz��[�{v�e8]kk&#J�B �v�!�W�]�sf���?`��\�����s�C�[���XUwh�|@�[W���DL���4%W�}>�)�L.oβ�S8($^��~��Z��w�-��G¶�k�#���j���J��cX�Ko��c�f�Z��XS��G^-I�Ԅ�ms��*�+x�Ow2`�������|��U�(n��0|q|�[z��ڹ���9���*i��^Ѻ]�-;���P��s�!Q��0+�e�#��V�m�d|E)���Ka./�f��1�A�@��e����'��xgp�xμ�����V@�?���i��"���T�!e�G��oi��N'\:�ZA��A�1�,l|7��L��Ý/gT�(j$�\xޥU�z��h���u��Ǎ.l͕2��YT�&���GX5*YȔ�]r��C2 U��~�:y�Ó�@� -[+O��/tf�Jo��m1F�%x�H'N�lE�S���ҕ5�7�R���H��x��%��*�~�V�>q\���6O���z8�����F�lc9^��]�]�u��
��2r�B��Œ[�9_#Z�]�jPC5����q���r$�a�c��{ȍ�X��0�v�)nZh�Sey�]�z�%Ϥ�KP�?/�ZR,�m��)�X�扗��
���֛P�Dp�^Uu�������s���^58]��;�W f����w�"\�dA�,�>L�q?�6y�O�r�k
fH �3Y�5�b2Peg;b]cE��-��Z��PKּL�{\*�+IJ��:m�~�]:S/Pws�|0q��t^��>�
=
0 �U�Qoc�v�o`r�S\��;�}8G�ѽBڜ
�v�:��8�9fΪ`*(}��G��%�f�Fe%ș$e\� ���nS��<�ޞ���ՔC[#��A�-��A�K�]X'����c|m�D�+�yKR�����6
Uv�t�U9�¿�~a,>0;��`�g���r��3��UqFB��&�"xā1���i�h��X�R��#���p0J�
�Q$�DM�۽��9HR���/Z��
?�3X�W^��O�'��g��<��i&!�ᨔ��x��@�T���t,�Xk�I5iF����v�3�xQ���$�����l��3���h��O$C�9��ٚ�{9�Ċ�-�U��ɛf���1�'-HI���zl��q"�������)�yr��V,� �����Ɨ�g��Ӯ(s�IS"���;�-�;w 7��"�c�C8�����4��k0�\!��Ϗo��.IF��@��
���6G_8]�@@�7L����_�����g�{N}8�|� h�s���αSֽ؍a���u�a�4�e��=�Ve�����Swj�\N��E����ģ�x���-��!��t�&��jg�H�����#ɷb?=^����jW=C�/-���D���}�z,L�#�r_0�*B%E����k�jz�|���� ��Y��b/>q�F4i�����p�/�h?d2�n�'�9Ԩ[�X$�]ʔ ��h�����`�g|#�6f�o��ju�����[�b����R��5���������[\}{[1m��ǯ����B_��xk3} @�R������
����?\B��x��βaЗ�
��s�=gk�xѮ��b:30
���U(:M�x�1=�$Ng�S����k�<���L&ʵ;�j���}����!�Sq�1�F��Ql�v��e�rg�)��f?wq�,Ȩ�A�rg�_�%Q����rk���¡�!g���5x$ ��{�k�=�t��y�6�ZhTREE����������������� ��
j��(�/�`��DA���R*u��B����h��E���� 9�7��3�t��4�=���/0�NA����+}D�0���>LxY
�c*�<�}�"����G��@�]����>�N�bMD� xq�d���I����~����D�����#��[�C��e�ƹ+R�T�����|�[$�̱7u��_�y��,��J��:�QZ��3�#�B��h�^��}����w,$�M2��d���9�i'��@'=�I� ���b�O�
����֭��
7�)A�Y�����M�`1���7���Ghp?�F��qL�iWQh�4,j���eA�1G�`�1gvf;I-{!a�'@������M6 �-��,�:���T�dC��
�������$F�~�/6'�G��p�Ty,��������ȑ٫���x�7�U��zQ�(����|ϊvP�mI!�1�XM7z��t�}krW��"�9>
P�ׄ0���؎s�9o)�9!�jlf2���d~��3���md˯�_@����}�=��"�%A���MSbύ���[�I��*�+<�W&�z)�D���,MF b��$e�n�a��Q���gI����g�&pz��[�{v�e8]kk&#J�B �v�!�W�]�sf���?`��\��(�/�`��C�[���XUwh�|@�[W���DL���4%W�}>�)�L.oβ�S8($^��~��Z��w�-��G¶�k�#���j���J��cX�Ko��c�f�Z��XS��G^-I�Ԅ�ms��*�+x�Ow2`�������|��U�(n��0|q|�[z��ڹ���9���*i��^Ѻ]�-;���P��s�!Q��0+�e�#��V�m�d|E)���Ka./�f��1�A�@��e����'��xgp�xμ�����V@�?���i��"���T�!e�G��oi��N'\:�ZA��A�1�,l|7��L��Ý/gT�(j$�\xޥU�z��h���u��Ǎ.l͕2��YT�&���GX5*YȔ�]r��C2 U��~�:y�Ó�@� -[+O��/tf�Jo��m1F�%x�H'N�lE�S���ҕ5�7�R���H��x��%��*�~�V�>q\���6O���z8�����F�lc9^��]�]�u��
��2r�B��Œ[�9_#Z�]�jPC5����q���r$�a�c��{ȍ�X��0�v�)nZh�Sey�]�z�%Ϥ�KP�?/�ZR,�m��)�X�扗��
���֛P�Dp�^Uu����(�/�`����^58]��;�W f����w�"\�dA�,�>L�q?�6y�O�r�k
fH �3Y�5�b2Peg;b]cE��-��Z��PKּL�{\*�+IJ��:m�~�]:S/Pws�|0q��t^��>�
=
0 �U�Qoc�v�o`r�S\��;�}8G�ѽBڜ
�v�:��8�9fΪ`*(}��G��%�f�Fe%ș$e\� ���nS��<�ޞ���ՔC[#��A�-��A�K�]X'����c|m�D�+�yKR�����6
Uv�t�U9�¿�~a,>0;��`�g���r��3��UqFB��&�"xā1���i�h��X�R��#���p0J�
�Q$�DM�۽��9HR���/Z��
?�3X�W^��O�'��g��<��i&!�ᨔ��x��@�T���t,�Xk�I5iF����v�3�xQ���$�����l��3���h��O$C�9��ٚ�{9�Ċ�-�U��ɛf���1�'-HI���zl��q"�������)�yr��V,� �����Ɨ�g��Ӯ(s�IS"���;�-�;w 7��"�c�C8�����4��k0�\!��Ϗo��.IF��@��
���6G_8]�@@�7L�(�/�`�_�����g�{N}8�|� h�s���αSֽ؍a���u�a�4�e��=�Ve�����Swj�\N��E����ģ�x���-��!��t�&��jg�H�����#ɷb?=^����jW=C�/-���D���}�z,L�#�r_0�*B%E����k�jz�|���� ��Y��b/>q�F4i�����p�/�h?d2�n�'�9Ԩ[�X$�]ʔ ��h�����`�g|#�6f�o��ju�����[�b����R��5���������[\}{[1m��ǯ����B_��xk3} @�R������
����?\B��x��βaЗ�
��s�=gk�xѮ��b:30
���U(:M�x�1=�$Ng�S����k�<���L&ʵ;�j���}����!�Sq�1�F��Ql�v��e�rg�)��f?wq�,Ȩ�A�rg�_�%Q����rk���¡�!g���5x$ ��{�k�=�t��y�6�Zhbitshuffle-0.5.1/tests/make_regression_tdata.py000066400000000000000000000035461434025530100217230ustar00rootroot00000000000000"""
Script to create data used for regression testing.
"""
import numpy as np
from numpy import random
import h5py
import bitshuffle
from bitshuffle import h5
from h5py import h5z
BLOCK_SIZE = 64 # Smallish such that datasets have many blocks but are small.
COMP_LVL = 10 # ZSTD compression level
FILTER_PIPELINE = [h5.H5FILTER]
FILTER_OPTS = [
[(BLOCK_SIZE, h5.H5_COMPRESS_LZ4)],
[(BLOCK_SIZE, h5.H5_COMPRESS_ZSTD, COMP_LVL)],
]
OUT_FILE = "tests/data/regression_%s.h5" % bitshuffle.__version__
DTYPES = ["a1", "a2", "a3", "a4", "a6", "a8", "a10"]
f = h5py.File(OUT_FILE, "w")
g_orig = f.create_group("original")
g_comp_lz4 = f.create_group("compressed")
g_comp_zstd = f.create_group("compressed_zstd")
for dtype in DTYPES:
for rep in ["a", "b", "c"]:
dset_name = "%s_%s" % (dtype, rep)
dtype = np.dtype(dtype)
n_elem = 3 * BLOCK_SIZE + random.randint(0, BLOCK_SIZE)
shape = (n_elem,)
chunks = shape
data = random.randint(0, 255, n_elem * dtype.itemsize)
data = data.astype(np.uint8).view(dtype)
g_orig.create_dataset(dset_name, data=data)
# Create LZ4 compressed data
h5.create_dataset(
g_comp_lz4,
bytes(dset_name, "utf-8"),
shape,
dtype,
chunks=chunks,
filter_pipeline=FILTER_PIPELINE,
filter_flags=(h5z.FLAG_MANDATORY,),
filter_opts=FILTER_OPTS[0],
)
g_comp_lz4[dset_name][:] = data
# Create ZSTD compressed data
h5.create_dataset(
g_comp_zstd,
bytes(dset_name, "utf-8"),
shape,
dtype,
chunks=chunks,
filter_pipeline=FILTER_PIPELINE,
filter_flags=(h5z.FLAG_MANDATORY,),
filter_opts=FILTER_OPTS[1],
)
g_comp_zstd[dset_name][:] = data
f.close()
bitshuffle-0.5.1/tests/test_ext.py000066400000000000000000000623031434025530100172240ustar00rootroot00000000000000from __future__ import absolute_import, division, print_function, unicode_literals
import unittest
import time
import numpy as np
from numpy import random
from bitshuffle import ext, __zstd__
# If we are doing timeings by what factor to increase workload.
# Remember to change `ext.REPEATC`.
TIME = 0
# TIME = 8 # 8kB blocks same as final blocking.
BLOCK = 1024
TEST_DTYPES = [
np.uint8,
np.uint16,
np.int32,
np.uint64,
np.float32,
np.float64,
np.complex128,
]
TEST_DTYPES += [b"a3", b"a5", b"a6", b"a7", b"a9", b"a11", b"a12", b"a24", b"a48"]
class TestProfile(unittest.TestCase):
def setUp(self):
n = 1024 # bytes.
if TIME:
n *= TIME
# Almost random bits, but now quite. All bits exercised (to fully test
# transpose) but still slightly compressible.
self.data = random.randint(0, 200, n).astype(np.uint8)
self.fun = ext.copy
self.check = None
self.check_data = None
self.case = "None"
def tearDown(self):
"""Performs all tests and timings."""
if TIME:
reps = 10
else:
reps = 1
delta_ts = []
try:
for ii in range(reps):
t0 = time.time()
out = self.fun(self.data)
delta_ts.append(time.time() - t0)
except RuntimeError as err:
if len(err.args) > 1 and (err.args[1] == -11) and not ext.using_SSE2():
return
if len(err.args) > 1 and (err.args[1] == -12) and not ext.using_AVX2():
return
if len(err.args) > 1 and (err.args[1] == -14) and not ext.using_AVX512():
return
else:
raise
delta_t = min(delta_ts)
size_i = self.data.size * self.data.dtype.itemsize
size_o = out.size * out.dtype.itemsize
size = max([size_i, size_o])
speed = ext.REPEAT * size / delta_t / 1024**3 # GB/s
if TIME:
print("%-20s: %5.2f s/GB, %5.2f GB/s" % (self.case, 1.0 / speed, speed))
if self.check is not None:
ans = self.check(self.data).view(np.uint8)
self.assertTrue(np.all(ans == out.view(np.uint8)))
if self.check_data is not None:
ans = self.check_data.view(np.uint8)
self.assertTrue(np.all(ans == out.view(np.uint8)))
def test_00_copy(self):
self.case = "copy"
self.fun = ext.copy
self.check = lambda x: x
def test_01a_trans_byte_elem_scal_16(self):
self.case = "byte T elem scal 16"
self.data = self.data.view(np.int16)
self.fun = ext.trans_byte_elem_scal
self.check = trans_byte_elem
def test_01b_trans_byte_elem_scal_32(self):
self.case = "byte T elem scal 32"
self.data = self.data.view(np.int32)
self.fun = ext.trans_byte_elem_scal
self.check = trans_byte_elem
def test_01c_trans_byte_elem_scal_64(self):
self.case = "byte T elem scal 64"
self.data = self.data.view(np.int64)
self.fun = ext.trans_byte_elem_scal
self.check = trans_byte_elem
def test_01d_trans_byte_elem_16(self):
self.case = "byte T elem SSE 16"
self.data = self.data.view(np.int16)
self.fun = ext.trans_byte_elem_SSE
self.check = trans_byte_elem
def test_01e_trans_byte_elem_32(self):
self.case = "byte T elem SSE 32"
self.data = self.data.view(np.float32)
self.fun = ext.trans_byte_elem_SSE
self.check = trans_byte_elem
def test_01f_trans_byte_elem_64(self):
self.case = "byte T elem SSE 64"
self.data = self.data.view(np.float64)
self.fun = ext.trans_byte_elem_SSE
self.check = trans_byte_elem
def test_01g_trans_byte_elem_128(self):
self.case = "byte T elem SSE 128"
self.data = self.data.view(np.complex128)
self.fun = ext.trans_byte_elem_SSE
self.check = trans_byte_elem
def test_01h_trans_byte_elem_96(self):
self.case = "byte T elem SSE 96"
n = self.data.size // 128 * 96
dt = np.dtype(
[(str("a"), np.int32), (str("b"), np.int32), (str("c"), np.int32)]
)
self.data = self.data[:n].view(dt)
self.fun = ext.trans_byte_elem_SSE
self.check = trans_byte_elem
def test_01i_trans_byte_elem_80(self):
self.case = "byte T elem SSE 80"
n = self.data.size // 128 * 80
dt = np.dtype(
[
(str("a"), np.int16),
(str("b"), np.int16),
(str("c"), np.int16),
(str("d"), np.int16),
(str("e"), np.int16),
]
)
self.data = self.data[:n].view(dt)
self.fun = ext.trans_byte_elem_SSE
self.check = trans_byte_elem
def test_03a_trans_bit_byte(self):
self.case = "bit T byte scal 64"
self.data = self.data.view(np.float64)
self.fun = ext.trans_bit_byte_scal
self.check = trans_bit_byte
def test_03d_trans_bit_byte_SSE(self):
self.case = "bit T byte SSE 64"
self.data = self.data.view(np.float64)
self.fun = ext.trans_bit_byte_SSE
self.check = trans_bit_byte
def test_03f_trans_bit_byte_AVX(self):
self.case = "bit T byte AVX 64"
self.data = self.data.view(np.float64)
self.fun = ext.trans_bit_byte_AVX
self.check = trans_bit_byte
def test_03g_trans_bit_byte_AVX_32(self):
self.case = "bit T byte AVX 32"
self.data = self.data.view(np.float32)
self.fun = ext.trans_bit_byte_AVX
self.check = trans_bit_byte
def test_03h_trans_bit_byte_AVX512(self):
self.case = "bit T byte AVX512 64"
self.data = self.data.view(np.float64)
self.fun = ext.trans_bit_byte_AVX512
self.check = trans_bit_byte
def test_03g_trans_bit_byte_AVX512_32(self):
self.case = "bit T byte AVX512 32"
self.data = self.data.view(np.float32)
self.fun = ext.trans_bit_byte_AVX512
self.check = trans_bit_byte
def test_04a_trans_bit_elem_AVX(self):
self.case = "bit T elem AVX 64"
self.data = self.data.view(np.float64)
self.fun = ext.trans_bit_elem_AVX
self.check = trans_bit_elem
def test_04b_trans_bit_elem_AVX_128(self):
self.case = "bit T elem AVX 128"
self.data = self.data.view(np.complex128)
self.fun = ext.trans_bit_elem_AVX
self.check = trans_bit_elem
def test_04c_trans_bit_elem_AVX_32(self):
self.case = "bit T elem AVX 32"
self.data = self.data.view(np.float32)
self.fun = ext.trans_bit_elem_AVX
self.check = trans_bit_elem
def test_04d_trans_bit_elem_AVX_16(self):
self.case = "bit T elem AVX 16"
self.data = self.data.view(np.int16)
self.fun = ext.trans_bit_elem_AVX
self.check = trans_bit_elem
def test_04e_trans_bit_elem_64(self):
self.case = "bit T elem scal 64"
self.data = self.data.view(np.float64)
self.fun = ext.trans_bit_elem_scal
self.check = trans_bit_elem
def test_04f_trans_bit_elem_SSE_32(self):
self.case = "bit T elem SSE 32"
self.data = self.data.view(np.float32)
self.fun = ext.trans_bit_elem_SSE
self.check = trans_bit_elem
def test_04g_trans_bit_elem_SSE_64(self):
self.case = "bit T elem SSE 64"
self.data = self.data.view(np.float64)
self.fun = ext.trans_bit_elem_SSE
self.check = trans_bit_elem
def test_04h_trans_bit_elem_AVX512(self):
self.case = "bit T elem AVX512 64"
self.data = self.data.view(np.float64)
self.fun = ext.trans_bit_elem_AVX512
self.check = trans_bit_elem
def test_04i_trans_bit_elem_AVX512(self):
self.case = "bit T elem AVX 128"
self.data = self.data.view(np.complex128)
self.fun = ext.trans_bit_elem_AVX512
self.check = trans_bit_elem
def test_04j_trans_bit_elem_AVX512_32(self):
self.case = "bit T elem AVX512 32"
self.data = self.data.view(np.float32)
self.fun = ext.trans_bit_elem_AVX512
self.check = trans_bit_elem
def test_04k_trans_bit_elem_AVX512_16(self):
self.case = "bit T elem AVX512 16"
self.data = self.data.view(np.int16)
self.fun = ext.trans_bit_elem_AVX512
self.check = trans_bit_elem
def test_06a_untrans_bit_elem_16(self):
self.case = "bit U elem SSE 16"
pre_trans = self.data.view(np.int16)
self.data = trans_bit_elem(pre_trans)
self.fun = ext.untrans_bit_elem_SSE
self.check_data = pre_trans
def test_06b_untrans_bit_elem_128(self):
self.case = "bit U elem SSE 128"
pre_trans = self.data.view(np.complex128)
self.data = trans_bit_elem(pre_trans)
self.fun = ext.untrans_bit_elem_SSE
self.check_data = pre_trans
def test_06c_untrans_bit_elem_32(self):
self.case = "bit U elem SSE 32"
pre_trans = self.data.view(np.float32)
self.data = trans_bit_elem(pre_trans)
self.fun = ext.untrans_bit_elem_SSE
self.check_data = pre_trans
def test_06d_untrans_bit_elem_32(self):
self.case = "bit U elem AVX 32"
pre_trans = self.data.view(np.float32)
self.data = trans_bit_elem(pre_trans)
self.fun = ext.untrans_bit_elem_AVX
self.check_data = pre_trans
def test_06e_untrans_bit_elem_64(self):
self.case = "bit U elem SSE 64"
pre_trans = self.data.view(np.float64)
self.data = trans_bit_elem(pre_trans)
self.fun = ext.untrans_bit_elem_SSE
self.check_data = pre_trans
def test_06f_untrans_bit_elem_64(self):
self.case = "bit U elem AVX 64"
pre_trans = self.data.view(np.float64)
self.data = trans_bit_elem(pre_trans)
self.fun = ext.untrans_bit_elem_AVX
self.check_data = pre_trans
def test_06g_untrans_bit_elem_64(self):
self.case = "bit U elem scal 64"
pre_trans = self.data.view(np.float64)
self.data = trans_bit_elem(pre_trans)
self.fun = ext.untrans_bit_elem_scal
self.check_data = pre_trans
def test_06h_untrans_bit_elem_32(self):
self.case = "bit U elem AVX512 32"
pre_trans = self.data.view(np.float32)
self.data = trans_bit_elem(pre_trans)
self.fun = ext.untrans_bit_elem_AVX512
self.check_data = pre_trans
def test_06i_untrans_bit_elem_64(self):
self.case = "bit U elem AVX512 64"
pre_trans = self.data.view(np.float64)
self.data = trans_bit_elem(pre_trans)
self.fun = ext.untrans_bit_elem_AVX512
self.check_data = pre_trans
def test_07a_trans_byte_bitrow_64(self):
self.case = "byte T row scal 64"
self.data = self.data.view(np.float64)
self.fun = ext.trans_byte_bitrow_scal
def test_07b_trans_byte_bitrow_SSE_64(self):
self.case = "byte T row SSE 64"
self.data = self.data.view(np.float64)
self.fun = ext.trans_byte_bitrow_SSE
self.check = ext.trans_byte_bitrow_scal
def test_07c_trans_byte_bitrow_AVX_64(self):
self.case = "byte T row AVX 64"
self.data = self.data.view(np.float64)
self.fun = ext.trans_byte_bitrow_AVX
self.check = ext.trans_byte_bitrow_scal
def test_08a_shuffle_bit_eight_scal_64(self):
self.case = "bit S eight scal 64"
self.data = self.data.view(np.float64)
self.fun = ext.shuffle_bit_eightelem_scal
def test_08b_shuffle_bit_eight_SSE_64(self):
self.case = "bit S eight SSE 64"
self.data = self.data.view(np.float64)
self.fun = ext.shuffle_bit_eightelem_SSE
self.check = ext.shuffle_bit_eightelem_scal
def test_08c_shuffle_bit_eight_AVX_32(self):
self.case = "bit S eight AVX 32"
self.data = self.data.view(np.float32)
self.fun = ext.shuffle_bit_eightelem_AVX
self.check = ext.shuffle_bit_eightelem_scal
def test_08d_shuffle_bit_eight_AVX_64(self):
self.case = "bit S eight AVX 64"
self.data = self.data.view(np.float64)
self.fun = ext.shuffle_bit_eightelem_AVX
self.check = ext.shuffle_bit_eightelem_scal
def test_08e_shuffle_bit_eight_AVX_16(self):
self.case = "bit S eight AVX 16"
self.data = self.data.view(np.int16)
self.fun = ext.shuffle_bit_eightelem_AVX
self.check = ext.shuffle_bit_eightelem_scal
def test_08f_shuffle_bit_eight_AVX_128(self):
self.case = "bit S eight AVX 128"
self.data = self.data.view(np.complex128)
self.fun = ext.shuffle_bit_eightelem_AVX
self.check = ext.shuffle_bit_eightelem_scal
def test_08g_shuffle_bit_eight_AVX512_32(self):
self.case = "bit S eight AVX 32"
self.data = self.data.view(np.float32)
self.fun = ext.shuffle_bit_eightelem_AVX512
self.check = ext.shuffle_bit_eightelem_scal
def test_08h_shuffle_bit_eight_AVX512_64(self):
self.case = "bit S eight AVX512 64"
self.data = self.data.view(np.float64)
self.fun = ext.shuffle_bit_eightelem_AVX512
self.check = ext.shuffle_bit_eightelem_scal
def test_08i_shuffle_bit_eight_AVX512_16(self):
self.case = "bit S eight AVX512 16"
self.data = self.data.view(np.int16)
self.fun = ext.shuffle_bit_eightelem_AVX512
self.check = ext.shuffle_bit_eightelem_scal
def test_08i_shuffle_bit_eight_AVX512_128(self):
self.case = "bit S eight AVX512 128"
self.data = self.data.view(np.complex128)
self.fun = ext.shuffle_bit_eightelem_AVX512
self.check = ext.shuffle_bit_eightelem_scal
def test_09a_trans_bit_elem_scal_64(self):
self.case = "bit T elem scal 64"
self.data = self.data.view(np.float64)
self.fun = ext.trans_bit_elem_scal
self.check = trans_bit_elem
def test_09b_trans_bit_elem_SSE_64(self):
self.case = "bit T elem SSE 64"
self.data = self.data.view(np.float64)
self.fun = ext.trans_bit_elem_SSE
self.check = trans_bit_elem
def test_09c_trans_bit_elem_AVX_64(self):
self.case = "bit T elem AVX 64"
self.data = self.data.view(np.float64)
self.fun = ext.trans_bit_elem_AVX
self.check = trans_bit_elem
def test_09d_untrans_bit_elem_scal_64(self):
self.case = "bit U elem scal 64"
pre_trans = self.data.view(np.float64)
self.data = trans_bit_elem(pre_trans)
self.fun = ext.untrans_bit_elem_scal
self.check_data = pre_trans
def test_09e_untrans_bit_elem_SSE_64(self):
self.case = "bit U elem SSE 64"
pre_trans = self.data.view(np.float64)
self.data = trans_bit_elem(pre_trans)
self.fun = ext.untrans_bit_elem_SSE
self.check_data = pre_trans
def test_09f_untrans_bit_elem_AVX_64(self):
self.case = "bit U elem AVX 64"
pre_trans = self.data.view(np.float64)
self.data = trans_bit_elem(pre_trans)
self.fun = ext.untrans_bit_elem_AVX
self.check_data = pre_trans
def test_09g_untrans_bit_elem_AVX_64(self):
self.case = "bit U elem AVX512 64"
pre_trans = self.data.view(np.float64)
self.data = trans_bit_elem(pre_trans)
self.fun = ext.untrans_bit_elem_AVX512
self.check_data = pre_trans
def test_10a_bitshuffle_64(self):
self.case = "bitshuffle 64"
self.data = self.data.view(np.float64)
self.fun = lambda x: ext.bitshuffle(x, BLOCK)
def test_10b_bitunshuffle_64(self):
self.case = "bitunshuffle 64"
pre_trans = self.data.view(np.float64)
self.data = ext.bitshuffle(pre_trans, BLOCK)
self.fun = lambda x: ext.bitunshuffle(x, BLOCK)
self.check_data = pre_trans
def test_10c_compress_64(self):
self.case = "compress 64"
self.data = self.data.view(np.float64)
self.fun = lambda x: ext.compress_lz4(x, BLOCK)
def test_10d_decompress_64(self):
self.case = "decompress 64"
pre_trans = self.data.view(np.float64)
self.data = ext.compress_lz4(pre_trans, BLOCK)
self.fun = lambda x: ext.decompress_lz4(
x, pre_trans.shape, pre_trans.dtype, BLOCK
)
self.check_data = pre_trans
@unittest.skipUnless(__zstd__, "ZSTD support not included")
def test_10c_compress_z64(self):
self.case = "compress zstd 64"
self.data = self.data.view(np.float64)
self.fun = lambda x: ext.compress_zstd(x, BLOCK)
@unittest.skipUnless(__zstd__, "ZSTD support not included")
def test_10d_decompress_z64(self):
self.case = "decompress zstd 64"
pre_trans = self.data.view(np.float64)
self.data = ext.compress_zstd(pre_trans, BLOCK)
self.fun = lambda x: ext.decompress_zstd(
x, pre_trans.shape, pre_trans.dtype, BLOCK
)
self.check_data = pre_trans
"""
Commented out to prevent nose from finding them.
class TestDevCases(unittest.TestCase):
def deactivated_test_trans_byte_bitrow_AVX(self):
d = np.arange(256, dtype=np.uint32)
#d = ext.trans_bit_elem(d)
t = ext.trans_byte_bitrow_AVX(d).view(np.uint8)
t1 = ext.trans_byte_bitrow_SSE(d).view(np.uint8)
t.shape = (32, 32)
t1.shape = (32, 32)
#print t[:20,:18]
self.assertTrue(np.all(t == t1))
def deactivated_test_untrans_bit_elem(self):
d = np.arange(32, dtype=np.uint16)
#d = random.randint(0, 2**7, 256).astype(np.uint16)
d1 = ext.trans_bit_elem(d)
#print d
t = ext.untrans_bit_elem_AVX(d1)
#t1 = ext.untrans_bit_byte_scal(d1)
#print np.reshape(d1.view(np.uint8), (16, 4))
#print np.reshape(t1.view(np.uint8), (2, 32))
#print np.reshape(t2.view(np.uint8), (32, 2))
#print np.reshape(t.view(np.uint8), (32, 2))
def deactivated_test_trans_bit_byte(self):
d = np.arange(16, dtype=np.uint16)
t = ext.trans_bit_byte_scal(d)
#print t
t1 = trans_bit_byte(d)
#print t1
self.assertTrue(np.all(t == t1))
def deactivated_test_trans_byte_bitrow_SSE(self):
d = np.arange(256, dtype = np.uint8)
t = ext.trans_byte_bitrow_scal(d)
#print np.reshape(t, (32, 8))
t1 = ext.trans_byte_bitrow_SSE(d)
#print np.reshape(t1, (32, 8))
self.assertTrue(np.all(t == t1))
def deactivated_test_trans_byte_elem_SSE(self):
d = np.empty(16, dtype=([('a', 'u4'), ('b', 'u4'), ('c', 'u4')]))
d['a'] = np.arange(16) * 1
d['b'] = np.arange(16) * 2
d['c'] = np.arange(16) * 3
#print d.dtype.itemsize
#print np.reshape(d.view(np.uint8), (16, 12))
t1 = ext.trans_byte_elem_SSE(d)
#print np.reshape(t1.view(np.uint8), (12, 16))
t0 = trans_byte_elem(d)
#print np.reshape(t0.view(np.uint8), (12, 16))
self.assertTrue(np.all(t0.view(np.uint8) == t1.view(np.uint8)))
def deactivated_test_bitshuffle(self):
d = np.arange(128, dtype=np.uint16)
t1 = ext.bitshuffle(d)
#print t1
t2 = ext.bitunshuffle(t1)
#print t2
self.assertTrue(np.all(t2.view(np.uint8) == d.view(np.uint8)))
"""
class TestOddLengths(unittest.TestCase):
def setUp(self):
self.reps = 10
self.nmax = 128 * 8
# self.nmax = 4 * 8 # XXX
self.fun = ext.copy
self.check = lambda x: x
def test_trans_bit_elem_SSE(self):
self.fun = ext.trans_bit_elem_SSE
self.check = trans_bit_elem
def test_untrans_bit_elem_SSE(self):
self.fun = lambda x: ext.untrans_bit_elem_SSE(ext.trans_bit_elem(x))
self.check = lambda x: x
def test_trans_bit_elem_AVX(self):
self.fun = ext.trans_bit_elem_AVX
self.check = trans_bit_elem
def test_trans_bit_elem_AVX512(self):
self.fun = ext.trans_bit_elem_AVX512
self.check = trans_bit_elem
def test_untrans_bit_elem_AVX(self):
self.fun = lambda x: ext.untrans_bit_elem_SSE(ext.trans_bit_elem(x))
self.check = lambda x: x
def test_untrans_bit_elem_AVX512(self):
self.fun = lambda x: ext.untrans_bit_elem_SSE(ext.trans_bit_elem(x))
self.check = lambda x: x
def test_trans_bit_elem_scal(self):
self.fun = ext.trans_bit_elem_scal
self.check = trans_bit_elem
def test_untrans_bit_elem_scal(self):
self.fun = lambda x: ext.untrans_bit_elem_scal(ext.trans_bit_elem(x))
self.check = lambda x: x
def test_trans_byte_elem_SSE(self):
self.fun = ext.trans_byte_elem_SSE
self.check = trans_byte_elem
def tearDown(self):
try:
for dtype in TEST_DTYPES:
itemsize = np.dtype(dtype).itemsize
nbyte_max = self.nmax * itemsize
dbuf = random.randint(0, 255, nbyte_max).astype(np.uint8)
dbuf = dbuf.view(dtype)
for ii in range(self.reps):
n = random.randint(0, self.nmax // 8, 1)[0] * 8
data = dbuf[:n]
out = self.fun(data).view(np.uint8)
ans = self.check(data).view(np.uint8)
self.assertTrue(np.all(out == ans))
except RuntimeError as err:
if len(err.args) > 1 and (err.args[1] == -11) and not ext.using_SSE2():
return
if len(err.args) > 1 and (err.args[1] == -12) and not ext.using_AVX2():
return
if len(err.args) > 1 and (err.args[1] == -14) and not ext.using_AVX512():
return
else:
raise
class TestBitShuffleCircle(unittest.TestCase):
"""Ensure that final filter is circularly consistent for any data type and
any length buffer."""
def test_circle(self):
nmax = 100000
reps = 20
for dtype in TEST_DTYPES:
itemsize = np.dtype(dtype).itemsize
nbyte_max = nmax * itemsize
dbuf = random.randint(0, 255, nbyte_max).astype(np.uint8)
dbuf = dbuf.view(dtype)
for ii in range(reps):
n = random.randint(0, nmax, 1)[0]
data = dbuf[:n]
shuff = ext.bitshuffle(data)
out = ext.bitunshuffle(shuff)
self.assertTrue(out.dtype is data.dtype)
self.assertTrue(np.all(data.view(np.uint8) == out.view(np.uint8)))
def test_circle_with_compression(self):
nmax = 100000
reps = 20
for dtype in TEST_DTYPES:
itemsize = np.dtype(dtype).itemsize
nbyte_max = nmax * itemsize
dbuf = random.randint(0, 255, nbyte_max).astype(np.uint8)
dbuf = dbuf.view(dtype)
for ii in range(reps):
n = random.randint(0, nmax, 1)[0]
data = dbuf[:n]
shuff = ext.compress_lz4(data)
out = ext.decompress_lz4(shuff, data.shape, data.dtype)
self.assertTrue(out.dtype is data.dtype)
self.assertTrue(np.all(data.view(np.uint8) == out.view(np.uint8)))
@unittest.skipUnless(__zstd__, "ZSTD support not included")
def test_circle_with_zstd_compression(self):
nmax = 100000
reps = 20
for dtype in TEST_DTYPES:
itemsize = np.dtype(dtype).itemsize
nbyte_max = nmax * itemsize
dbuf = random.randint(0, 255, nbyte_max).astype(np.uint8)
dbuf = dbuf.view(dtype)
for ii in range(reps):
n = random.randint(0, nmax, 1)[0]
data = dbuf[:n]
shuff = ext.compress_zstd(data)
out = ext.decompress_zstd(shuff, data.shape, data.dtype)
self.assertTrue(out.dtype is data.dtype)
self.assertTrue(np.all(data.view(np.uint8) == out.view(np.uint8)))
# Python implementations for checking results.
def trans_byte_elem(arr):
dtype = arr.dtype
itemsize = dtype.itemsize
in_buf = arr.flat[:].view(np.uint8)
nelem = in_buf.size // itemsize
in_buf.shape = (nelem, itemsize)
out_buf = np.empty((itemsize, nelem), dtype=np.uint8)
for ii in range(nelem):
for jj in range(itemsize):
out_buf[jj, ii] = in_buf[ii, jj]
return out_buf.flat[:].view(dtype)
def trans_bit_byte(arr):
n = arr.size
dtype = arr.dtype
itemsize = dtype.itemsize
bits = np.unpackbits(arr.view(np.uint8))
bits.shape = (n * itemsize, 8)
# We have to reverse the order of the bits both for unpacking and packing,
# since we want to call the least significant bit the first bit.
bits = bits[:, ::-1]
bits_shuff = (bits.T).copy()
bits_shuff.shape = (n * itemsize, 8)
bits_shuff = bits_shuff[:, ::-1]
arr_bt = np.packbits(bits_shuff.flat[:])
return arr_bt.view(dtype)
def trans_bit_elem(arr):
n = arr.size
dtype = arr.dtype
itemsize = dtype.itemsize
bits = np.unpackbits(arr.view(np.uint8))
bits.shape = (n * itemsize, 8)
# We have to reverse the order of the bits both for unpacking and packing,
# since we want to call the least significant bit the first bit.
bits = bits[:, ::-1].copy()
bits.shape = (n, itemsize * 8)
bits_shuff = (bits.T).copy()
bits_shuff.shape = (n * itemsize, 8)
bits_shuff = bits_shuff[:, ::-1]
arr_bt = np.packbits(bits_shuff.flat[:])
return arr_bt.view(dtype)
if __name__ == "__main__":
unittest.main()
bitshuffle-0.5.1/tests/test_h5filter.py000066400000000000000000000067201434025530100201470ustar00rootroot00000000000000from __future__ import absolute_import, division, print_function, unicode_literals
import unittest
import os
import glob
import numpy as np
import h5py
import pytest
from h5py import h5z
from bitshuffle import h5, __zstd__
os.environ["HDF5_PLUGIN_PATH"] = ""
class TestFilter(unittest.TestCase):
def test_filter(self):
shape = (32 * 1024 + 783,)
chunks = (4 * 1024 + 23,)
dtype = np.int64
data = np.arange(shape[0])
fname = "tmp_test_filters.h5"
f = h5py.File(fname, "w")
h5.create_dataset(
f,
b"range",
shape,
dtype,
chunks,
filter_pipeline=(32008, 32000),
filter_flags=(h5z.FLAG_MANDATORY, h5z.FLAG_MANDATORY),
filter_opts=None,
)
f["range"][:] = data
f.close()
f = h5py.File(fname, "r")
d = f["range"][:]
self.assertTrue(np.all(d == data))
f.close()
def test_with_block_size(self):
shape = (128 * 1024 + 783,)
chunks = (4 * 1024 + 23,)
dtype = np.int64
data = np.arange(shape[0])
fname = "tmp_test_filters.h5"
f = h5py.File(fname, "w")
h5.create_dataset(
f,
b"range",
shape,
dtype,
chunks,
filter_pipeline=(32008, 32000),
filter_flags=(h5z.FLAG_MANDATORY, h5z.FLAG_MANDATORY),
filter_opts=((680,), ()),
)
f["range"][:] = data
f.close()
# os.system('h5dump -H -p tmp_test_filters.h5')
f = h5py.File(fname, "r")
d = f["range"][:]
self.assertTrue(np.all(d == data))
f.close()
def test_with_lz4_compression(self):
shape = (128 * 1024 + 783,)
chunks = (4 * 1024 + 23,)
dtype = np.int64
data = np.arange(shape[0])
fname = "tmp_test_filters.h5"
f = h5py.File(fname, "w")
h5.create_dataset(
f,
b"range",
shape,
dtype,
chunks,
filter_pipeline=(32008,),
filter_flags=(h5z.FLAG_MANDATORY,),
filter_opts=((0, h5.H5_COMPRESS_LZ4),),
)
f["range"][:] = data
f.close()
# os.system('h5dump -H -p tmp_test_filters.h5')
f = h5py.File(fname, "r")
d = f["range"][:]
self.assertTrue(np.all(d == data))
f.close()
@pytest.mark.skipif(
__zstd__ is False,
reason="Bitshuffle has not been built with ZSTD support.",
)
def test_with_zstd_compression(self):
shape = (128 * 1024 + 783,)
chunks = (4 * 1024 + 23,)
compression_lvl = 10
dtype = np.int64
data = np.arange(shape[0])
fname = "tmp_test_filters.h5"
f = h5py.File(fname, "w")
h5.create_dataset(
f,
b"range",
shape,
dtype,
chunks,
filter_pipeline=(32008,),
filter_flags=(h5z.FLAG_MANDATORY,),
filter_opts=((0, h5.H5_COMPRESS_ZSTD, compression_lvl),),
)
f["range"][:] = data
f.close()
# os.system('h5dump -H -p tmp_test_filters.h5')
f = h5py.File(fname, "r")
d = f["range"][:]
self.assertTrue(np.all(d == data))
f.close()
def tearDown(self):
files = glob.glob("tmp_test_*")
for f in files:
os.remove(f)
if __name__ == "__main__":
unittest.main()
bitshuffle-0.5.1/tests/test_h5plugin.py000066400000000000000000000032621434025530100201560ustar00rootroot00000000000000from __future__ import absolute_import, division, print_function, unicode_literals
import unittest
import os
import glob
import numpy as np
import h5py
import pytest
from subprocess import Popen, PIPE, STDOUT
import bitshuffle
plugin_dir = os.path.join(os.path.dirname(bitshuffle.__file__), "plugin")
os.environ["HDF5_PLUGIN_PATH"] = plugin_dir
H5VERSION = h5py.h5.get_libversion()
if H5VERSION[0] < 1 or (
H5VERSION[0] == 1
and (H5VERSION[1] < 8 or (H5VERSION[1] == 8 and H5VERSION[2] < 11))
):
H51811P = False
else:
H51811P = True
class TestFilterPlugins(unittest.TestCase):
@pytest.mark.skipif(
"CIBUILDWHEEL" in os.environ,
reason="Can't build dynamic HDF5 plugin into bitshuffle wheel.",
)
def test_plugins(self):
if not H51811P:
return
shape = (32 * 1024,)
chunks = (4 * 1024,)
dtype = np.int64
data = np.arange(shape[0])
fname = "tmp_test_filters.h5"
f = h5py.File(fname, "w")
dset = f.create_dataset(
"range", shape=shape, dtype=dtype, chunks=chunks, compression=32008
)
dset[:] = data
f.close()
# Make sure the filters are working outside of h5py by calling h5dump
h5dump = Popen(["h5dump", fname], stdout=PIPE, stderr=STDOUT)
stdout, nothing = h5dump.communicate()
err = h5dump.returncode
self.assertEqual(err, 0)
f = h5py.File(fname, "r")
d = f["range"][:]
self.assertTrue(np.all(d == data))
f.close()
def tearDown(self):
files = glob.glob("tmp_test_*")
for f in files:
os.remove(f)
if __name__ == "__main__":
unittest.main()
bitshuffle-0.5.1/tests/test_regression.py000066400000000000000000000024331434025530100206020ustar00rootroot00000000000000"""
Test that data encoded with earlier versions can still be decoded correctly.
"""
from __future__ import absolute_import, division, print_function
import pathlib
import unittest
import numpy as np
import h5py
from bitshuffle import __zstd__
from packaging import version
TEST_DATA_DIR = pathlib.Path(__file__).parent / "data"
OUT_FILE_TEMPLATE = "regression_%s.h5"
VERSIONS = ["0.1.3", "0.4.0"]
class TestAll(unittest.TestCase):
def test_regression(self):
for rev in VERSIONS:
file_name = TEST_DATA_DIR / (OUT_FILE_TEMPLATE % rev)
f = h5py.File(file_name, "r")
g_orig = f["original"]
g_comp = f["compressed"]
for dset_name in g_comp.keys():
self.assertTrue(np.all(g_comp[dset_name][:] == g_orig[dset_name][:]))
# Only run ZSTD comparison on versions >= 0.4.0 and if ZSTD support
# has been built into bitshuffle
if version.parse(rev) >= version.parse("0.4.0") and __zstd__:
g_comp_zstd = f["compressed_zstd"]
for dset_name in g_comp_zstd.keys():
self.assertTrue(
np.all(g_comp_zstd[dset_name][:] == g_orig[dset_name][:])
)
if __name__ == "__main__":
unittest.main()
bitshuffle-0.5.1/zstd/000077500000000000000000000000001434025530100146315ustar00rootroot00000000000000