bcj filter library
Project description
In data compression, BCJ, short for Branch-Call-Jump, refers to a technique that improves the compression of machine code of executable binaries by replacing relative branch addresses with absolute ones. This allows a LZMA compressor to identify duplicate targets and archive higher compression rate.
BCJ is used in 7-zip compression utility as default filter for executable binaries.
pybcj is a python bindings with BCJ implementation by C language. The C codes are derived from p7zip, portable 7-zip implementation. pybcj support Intel/Amd x86/x86_64, Arm/Arm64, ArmThumb, Sparc, PPC, and IA64.
Development status
A development status is considered as Alpha state.
Installation
As usual, you can install pybcj using python standard pip command.
pip install pybcj
Alternatively, one can also use conda:
conda install -c conda-forge pybcj
WARNING
When use it on MSYS2/Mingw64 environment, please set environment variable SETUPTOOLS_USE_DISTUTILS=stdlib to install.
License
Copyright (C) 2020,2021 Hiroshi Miura
7-Zip Copyright (C) 1999-2010 Igor Pavlov
LZMA SDK Copyright (C) 1999-2010 Igor Pavlov
This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Hashes for pybcj-0.5.2-cp310-cp310-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b6536ba970327ade1c3c55f8307e8489ecd0bdba76c5c5e5c438ed7871e64edb |
|
MD5 | 11e997d35cfcf7aba9d5ba7ad7b67be0 |
|
BLAKE2b-256 | ead51c7f229e6d9a1eb1c75dd31c343be559127c802562c769564c1f53009ff7 |
Hashes for pybcj-0.5.2-cp310-cp310-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | fe0e7776224ed4d9788d333ed98c1cb40deb94a9e61bf8813112a344ba98f8e9 |
|
MD5 | eabda1a3ea85235fc2ab2466b1c50220 |
|
BLAKE2b-256 | a6e501a6fe065f261fdde9c88f721515cef00dd2717685c75100a037b4931b5b |
Hashes for pybcj-0.5.2-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a5e135dfd650376c93b545ac77811d052d5a5b9fd8d3f8ee35a4aecbd43f5abc |
|
MD5 | b074b7a8d844ab2b3c46cf87b0fedc23 |
|
BLAKE2b-256 | a6d0253008147b5dac3681f3972911e98a4f92656c0ef5d67007a1561039036d |
Hashes for pybcj-0.5.2-cp310-cp310-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0fe2d856fa34829a1ae8af6f6acedb3fba1eb3930c65ac30e1a89a1d78d8674a |
|
MD5 | 19205c0048a4b0378ff38c6e7b5602f0 |
|
BLAKE2b-256 | ec4e0c897d4d2ff593696f3a5a8352d1832501a9cd53508374a57ab302c228ab |
Hashes for pybcj-0.5.2-cp310-cp310-musllinux_1_1_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7a5bf9fd3e8660c02f28288d911fcec2ef247327607ec40f342b069622a2c54a |
|
MD5 | aaa88a2c52c6353642b9e01aea1b5ec6 |
|
BLAKE2b-256 | 5086c4663f79760ef29507d442d5fc6bb73cc581c15e9c703637978dd642ac26 |
Hashes for pybcj-0.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 424a7e4ea42d01023ed33be5e71da17b05f32412c712c02e9a305417963dc834 |
|
MD5 | 39150a00e2016655132c6f8020b1e506 |
|
BLAKE2b-256 | ff3b04a3843fcaa5bec2b7463476f36341557906a5d5e4a241c0fd9b79721963 |
Hashes for pybcj-0.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 92240ca2c8d644874574e3aa3a7d450949781859f34418dc2521f4bb57c842bf |
|
MD5 | f476083f27a2af149a5d92c12621d7d8 |
|
BLAKE2b-256 | 331a6fe27109aa98d4f2328f41f7ca40121f5e13a1a2d410830504f4f73dc5b5 |
Hashes for pybcj-0.5.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d188e2227f6a9342a36e257a7bc7c88dc6a00f5bcbd077aa0085d78d0f685c3a |
|
MD5 | 5871225c0ff25f1a02f2016daece7eec |
|
BLAKE2b-256 | 21588c239543ee4af34b27d160a9587a136f632892172346f50f4279a2ac8cb9 |
Hashes for pybcj-0.5.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 61d33a15ad7ed19a874d74132e22bae53cd617229f6e7b95db84e8f2bdf7b182 |
|
MD5 | 6432e76aa812da30a81956733d73bd15 |
|
BLAKE2b-256 | 79a950588f4dff57c2f4eee35590e5814171a33d53e673313609e95ad49926be |
Hashes for pybcj-0.5.2-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 67861cdb71800039ebc366d016b54476fb128e621a7b11d2cd36e541cd0c2559 |
|
MD5 | 973c45aa02b88f614310207a5e8416c8 |
|
BLAKE2b-256 | d77215af506673a08e4e89d8595acedcbc8420333803af7d0f9c081f2afcf63b |
Hashes for pybcj-0.5.2-cp39-cp39-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 43ec631b48ff92820efdf4e3a0d84d439847b0aaa48bff1f9cce09ac2b032773 |
|
MD5 | da4145c006056f7ce4b3a7e07d562c6d |
|
BLAKE2b-256 | 0a4775ab834f321d76f145e489c956b89be491d33ff9d7cda8de4e3233659323 |
Hashes for pybcj-0.5.2-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9e7f11a3cfaae42d55dbf8d7fdb748b06009245800b11b193b3c77159fe1d617 |
|
MD5 | ba6df5a4e68a1164eb54fbdef010ae2a |
|
BLAKE2b-256 | 1c8bf491dba5f7b784dda5e0bc72d7e672361708d997455d7c3b14e4e8a4abef |
Hashes for pybcj-0.5.2-cp39-cp39-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 975e16621b7212dde733325a5f6e65484952ba73d06d0d1f06d0d615a384461f |
|
MD5 | 5d809edb7f478b6f9dd77619112d1945 |
|
BLAKE2b-256 | d44615718d48cd4cb20a3c3e1f6ed20518fb7ac1c02c298555d4950786db8ea6 |
Hashes for pybcj-0.5.2-cp39-cp39-musllinux_1_1_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0ba2959b880215b9c6d85af564dd9f641bba601b3b0766b0dde2f7a6c80c87dd |
|
MD5 | 41cdcf9875fc9afcf1276dd99ab33e82 |
|
BLAKE2b-256 | 59d8f7f641fdb082a30a1795847ae397207691d19fbc54a877beec049280832f |
Hashes for pybcj-0.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 62d62bf3169931d08bc1fc01e43ce9f2ca9b4e9c992f50798d2dc2524173d0cf |
|
MD5 | 2733e9e01f92e013697ca3658b6a7997 |
|
BLAKE2b-256 | e6c5de57378ca017d0042b07ba3c3f1aa18be694afaed61dcdd27889ebeacd7d |
Hashes for pybcj-0.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e70f9d92996fc85c71bfa0f047309d61c0f0fa0f325bda2e1a77e1ff88f9525b |
|
MD5 | 0c8b8419d9495b62f98ffa500c9bd435 |
|
BLAKE2b-256 | f9e27c579d6c670a0692d06457d68fd24aa2cccdf9ed2fdae7f06e89f819c4f0 |
Hashes for pybcj-0.5.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | df3c1ec9172b922daefb883d834b1b04c0f579f421d68b7ed636b631ae245f5c |
|
MD5 | f502ca837a58691ba81e0cdc68a97d1e |
|
BLAKE2b-256 | 326af682323bc64e4851aded31e99f7b7e796a0a96bcbc71abba2f5e89974e78 |
Hashes for pybcj-0.5.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0c0ff95af452a586cc4284742fc4de320f687c71015a7e528438330e2f223af8 |
|
MD5 | 46d2c33905c5ebe40de720108fa8a55e |
|
BLAKE2b-256 | 789f2fb72a2d7f27952056bd27e7663d8532ff5ce1790811c7413ec78c676809 |
Hashes for pybcj-0.5.2-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3662886d0356aa9d249fe19aa7ef4d94c91769b14f721732bcf8509e751bddb3 |
|
MD5 | 87e5bff1eedd90c43e8092445c4b2bcd |
|
BLAKE2b-256 | 8e2a1faccea94125682143f7b893fac481ea8dbc11a6479db831e17ccbb37972 |
Hashes for pybcj-0.5.2-cp38-cp38-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b43649973504ed7b97be806b6f5a9c258800cf2258cb8102f9bae7c0cf500efc |
|
MD5 | 87b8acddf7476f145499bf3822587c8d |
|
BLAKE2b-256 | 9230cb84c3cc878dba8105577b0c35bbb17a783a778072ffa49db5dae655bd80 |
Hashes for pybcj-0.5.2-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 45390756238d42da93ee1acc5d1f340e693f4f2802538f11df46340c81362904 |
|
MD5 | 65b248eb789f0b901f8f01698548195a |
|
BLAKE2b-256 | 78865fdc830155f76d36929027313416976550ea8afd438ca5c45730eab2fd57 |
Hashes for pybcj-0.5.2-cp38-cp38-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | dad2c6a679781bdc5ea6f3726a0fa789b7e9e1fe619c3cb17cfd18d9ddfc356d |
|
MD5 | 85c031af2b17e826b7d643bcc99e0ee9 |
|
BLAKE2b-256 | 58af6dca86edef0d2cb59240756b7e57cb86490c54c8108d13a736a1da61f71a |
Hashes for pybcj-0.5.2-cp38-cp38-musllinux_1_1_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b16b897cd385c70756519fbc0f438e97565ef4828a8cbac51e73764c3777fb11 |
|
MD5 | fde506aff08fc3acd3e4ad09e0dee359 |
|
BLAKE2b-256 | 7d72a6df416395ad45ec66aaa39ecac35882bd7c74ebc0efa31952081a42e044 |
Hashes for pybcj-0.5.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7acde470fe841c8d3368e468f1693cd6085ad48b34bfa7ed4446594b49f1d405 |
|
MD5 | 7140a3c6c16083ab328ffb8d2bf8afce |
|
BLAKE2b-256 | e331e1c395a8a8d1ccce5356b40ced511130285b618ce89be9ad5ee67d4e090f |
Hashes for pybcj-0.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 22caeb5f04b30b6350a57442de68afef825271ce30d8f0b949db810c8c988840 |
|
MD5 | 2180177d1d2785d909ff50631201c547 |
|
BLAKE2b-256 | 3bf89a6e7c5d536d460aa80698df33793a18b3deaadc8747587bdbf234a9ff66 |
Hashes for pybcj-0.5.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c25f511e2a3cfcd84f34bd99044a1462b569aced46c7a27316a9ab4608dd3ae7 |
|
MD5 | 099cc3ca44f07dd7659dde924ed294db |
|
BLAKE2b-256 | 248055e8da0fe9ff9ba5b8a24d8efa453ec7d9afc0ff531d58c94065b620c101 |
Hashes for pybcj-0.5.2-cp38-cp38-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5ab403117555993041f647580e2ad07e3df13701b4cd64a106926a83096960df |
|
MD5 | 807224cb60d971859b6acd04c924668c |
|
BLAKE2b-256 | 9c84b717066e2fc11eea9ae5a28d273c59907b5076e4b4a8097d1c28712e539d |
Hashes for pybcj-0.5.2-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 910a7f9e3173cd2771b76024dc343c6bce3b8c3098c0eafd21265e7446c59651 |
|
MD5 | 12763ee242d2999924b6e7b6c1829f33 |
|
BLAKE2b-256 | c91fa6652f74a001ab59aade5b39a67108639eb3263c882509c0c627ab8c2dba |
Hashes for pybcj-0.5.2-cp37-cp37m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3ec38a47d0cc121be94c8b216b99a5c4537aa2c56a6a35aba510ef589f0007ee |
|
MD5 | 9518fd109c7effeded7ad32aee8a79f8 |
|
BLAKE2b-256 | 595b4f17f7859f49817be15ea7cbbe0d81f76431000e6824e5729578838ff814 |
Hashes for pybcj-0.5.2-cp37-cp37m-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e0e106c1d1b62552bf83408bb7c0e12381b34010caa95bff868b49cabfc24fe8 |
|
MD5 | a194b1e363326aafeea5d986fde64674 |
|
BLAKE2b-256 | 6a717b77e0834b3d6e19965e9ae3e91d6eda388384965e19296fbe2ae2a97cf2 |
Hashes for pybcj-0.5.2-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d2a9c2709c1f92629b9d27fdf34a564c4e21dcada636b2076f954e2f10ff858f |
|
MD5 | 7db86eff88d14e829ece6d74baf8b77a |
|
BLAKE2b-256 | 6fb0dca4801d493f158172e610f4dbf568b2b68ac40c15e2ff8f573276131580 |
Hashes for pybcj-0.5.2-cp37-cp37m-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | efa84e11e1b8b54e619b723ea315a23d8bdba9bcad7ae9dd4adf17d1297fa9c1 |
|
MD5 | 507ef65461d3245f333d3a0ff8089f0e |
|
BLAKE2b-256 | 7f932720a0d559132c9a20d259cfb81d906deb7fceb6dba1b7126d74a18304e5 |
Hashes for pybcj-0.5.2-cp37-cp37m-musllinux_1_1_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a7b11b54f18be3595fbba0527c4d8c0bb011e88b19e2b58f70c7ca2b0a2bd887 |
|
MD5 | 5c9f6c21387bb5026d3a874a1fd87e9b |
|
BLAKE2b-256 | c98ef37ac76408d3b51297c4db7040d03c84454d0c850ae7590ac4357fedefe2 |
Hashes for pybcj-0.5.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4b8e4de6431adbe9bdca15c25cf91eb54762cb752711eccc4e38697ef934cbdc |
|
MD5 | ab70aa21fd7b0cf56df5fba54fa8cec7 |
|
BLAKE2b-256 | a54e62c0eae6a2d69b638fac0532052d455a9300d2f9a9f75735a32c6d3bbb9a |
Hashes for pybcj-0.5.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0cba878c1f5fe5f0471c09f1a86b078d09e8417ca7ad9de3620834c681b72fa3 |
|
MD5 | d25fbe27f09a8aa8644e7fa97b7a5519 |
|
BLAKE2b-256 | ee8f5d456fcfab829d3a8401f9bd43aec05967331654fda408645e9acde46a5f |
Hashes for pybcj-0.5.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7f11060fdd17bdee85353190b409e52c05103fe5c9f8c3fce99c25dfe83e37a7 |
|
MD5 | 69df504233a22bab16e60809759f1570 |
|
BLAKE2b-256 | 8c4f037be6117012788ed1bedeecb17d500ca94ab9f6728526bfcb0d15c78613 |
Hashes for pybcj-0.5.2-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 218419aaed1b1d50e15bdb7f0b550a36e9189173f7742038f2154d5941244241 |
|
MD5 | ce1b2407e0eb83ae44b34120e3696dde |
|
BLAKE2b-256 | 154622b73a7bdfbe987c22272265b0a261b2d52607732fdb6692372c04fb6549 |
Hashes for pybcj-0.5.2-cp36-cp36m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5713fcd4e179293298e5f96d8fff64e98809da40695e49e1b701f6a1dcbaa591 |
|
MD5 | 1b9b44f4deb9dc4540157f92b50ac68d |
|
BLAKE2b-256 | 3d47c10b172113a8dedf3027506edfaf1e999008ac7375a0a34527a29879fa42 |
Hashes for pybcj-0.5.2-cp36-cp36m-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2adb0e3eee8681def2194049a0ce6329f75c26d6b4a427974b5e5a8b0488cbd5 |
|
MD5 | 4d1463f54673b82e3223d3ce53d0db9a |
|
BLAKE2b-256 | a4efad188229d915bd4b3be9f798f36937dd8e86ac3dabfa5d4516c1990094ed |
Hashes for pybcj-0.5.2-cp36-cp36m-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d13962f2299142588adb3ca1b12f55c242cd7bbb340394df328cc8f6950138e0 |
|
MD5 | 8b590d90a138dd3ef5c45345e4fb06b0 |
|
BLAKE2b-256 | 035cc4173d8fa24efe6ca25cdc9bc9ad3f97f7134e6d858c300d0459953c1e78 |
Hashes for pybcj-0.5.2-cp36-cp36m-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ac3b84d7f7ebc0c6da27d7849e9a1bd6587ca6d4daf02cd1527ec7d88abbcb5d |
|
MD5 | 241aaa190f04df8f703356854157b73e |
|
BLAKE2b-256 | c881dd5c546997c5190d596dc0ad851e2f39495fb62728c6dcba6c5e82094a13 |
Hashes for pybcj-0.5.2-cp36-cp36m-musllinux_1_1_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f5df6605465a367147982313e04119e9fc253b7fc1d9273e53f1d9b7b2d4cd51 |
|
MD5 | 3507db109ba6bef40785d9eb04cc8992 |
|
BLAKE2b-256 | b34eb082865c14bc2b83b4d6e0f16f3cc4ae204cfbce44c4abfc5b760bbb07f0 |
Hashes for pybcj-0.5.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5b179196688af94fc0773c8d14581dac3dba9436103ece63ce1de20eb341e345 |
|
MD5 | d3ba8e23401ac0d4a0ca5c6ef1c16728 |
|
BLAKE2b-256 | 3914a24dfcf5752eee5d6186da23c744e26136570bf07f8a84a440d9400f6a35 |
Hashes for pybcj-0.5.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6c8dd7df870229d56fb8414f9a1a56352305e08f5df7368d75371ca384302c19 |
|
MD5 | 1bd04e142cdb37af5e28721fd0acfb6e |
|
BLAKE2b-256 | 2b1d794f12f176f27bdcfb9765b1a1142d78429cc5072e1d0661a992a5485d86 |
Hashes for pybcj-0.5.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 60700c9d4845be341a3103a72c8218929a591d94133f336a0ecc1280c0bc6234 |
|
MD5 | 5ec167691382c59a5eec73cf0acfcac6 |
|
BLAKE2b-256 | 8ec380a05c155d78714853c943454f0649a8930e8ccca723520d153ec662204d |
Hashes for pybcj-0.5.2-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f8fb59f18ef4117b85a04d792df9078cfebd379e50b7f394f34a2d04e46133fd |
|
MD5 | d0de8349ba42ada565e7d2d08359c275 |
|
BLAKE2b-256 | 53c43836d702685346c9aceb274215d2aafd4b02d41dc47b99c0772c70bd1cdc |