summarylogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.SRCINFO8
-rw-r--r--1-3-placebo-update-for-new-tone-mapping-desaturation-algo.patch118
-rw-r--r--2-3-placebo-update-for-new-peak-detection-algo.patch114
-rw-r--r--PKGBUILD19
4 files changed, 254 insertions, 5 deletions
diff --git a/.SRCINFO b/.SRCINFO
index d41a2641ea73..bee4eec137e3 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -65,6 +65,7 @@ pkgbase = vlc-nightly
makedepends = sidplay2-libs
makedepends = sndio
makedepends = vulkan-headers
+ depends = qt5-quickcontrols2
depends = a52dec
depends = libdvbpsi
depends = libxpm
@@ -86,6 +87,7 @@ pkgbase = vlc-nightly
depends = libsecret
depends = libarchive
depends = qt5-base
+ depends = libgcrypt
depends = qt5-x11extras
depends = qt5-svg
depends = freetype2
@@ -171,10 +173,16 @@ pkgbase = vlc-nightly
source = http://nightlies.videolan.org/build/source/vlc-4.0.0-20190511-0231-dev.tar.xz
source = update-vlc-plugin-cache.hook
source = 0001-lua-Fix-build-using-lua-5.3.patch
+ source = 1-3-placebo-update-for-new-tone-mapping-desaturation-algo.patch
+ source = 2-3-placebo-update-for-new-peak-detection-algo.patch
+ source = 3-3-opengl-update-libplacebo-call-for-changed-API.patch
source = find-deps.py
sha256sums = 622e53bcf12de170ccb3b26b5d198236aa39a7c88c08aa9edb13af9d6d04ec10
sha256sums = c6f60c50375ae688755557dbfc5bd4a90a8998f8cf4d356c10d872a1a0b44f3a
sha256sums = 3e6bddbaed443e40036c494a0754aedd2f94fe41bfa3754855e16f7452a03cdf
+ sha256sums = 52d2818dde06fe5fd873b4a89f31884650c480528f7b61c0cbc05576fdbb3e53
+ sha256sums = af46e70a85a82f2428b1c6ab09d27ee8c18a4b8adc1a4d71bde66e89be877f04
+ sha256sums = cd7d11aa6aff73745170451ef769ccd62cdb8f3eaf803de7c7ab6bd388ab1d7b
sha256sums = 90b0e34d5772d2307ba07a1c2aa715db7488389003cfe6d3570b2a9c63061db7
pkgname = vlc-nightly
diff --git a/1-3-placebo-update-for-new-tone-mapping-desaturation-algo.patch b/1-3-placebo-update-for-new-tone-mapping-desaturation-algo.patch
new file mode 100644
index 000000000000..537ce050ae6e
--- /dev/null
+++ b/1-3-placebo-update-for-new-tone-mapping-desaturation-algo.patch
@@ -0,0 +1,118 @@
+diff --git a/modules/video_output/opengl/fragment_shaders.c b/modules/video_output/opengl/fragment_shaders.c
+index f58b4467b6..79bba13912 100644
+--- a/modules/video_output/opengl/fragment_shaders.c
++++ b/modules/video_output/opengl/fragment_shaders.c
+@@ -558,7 +558,13 @@ opengl_fragment_shader_init_impl(opengl_tex_converter_t *tc, GLenum tex_target,
+ color_params.intent = var_InheritInteger(tc->gl, "rendering-intent");
+ color_params.tone_mapping_algo = var_InheritInteger(tc->gl, "tone-mapping");
+ color_params.tone_mapping_param = var_InheritFloat(tc->gl, "tone-mapping-param");
++# if PL_API_VER >= 10
++ color_params.desaturation_strength = var_InheritFloat(tc->gl, "desat-strength");
++ color_params.desaturation_exponent = var_InheritFloat(tc->gl, "desat-exponent");
++ color_params.desaturation_base = var_InheritFloat(tc->gl, "desat-base");
++# else
+ color_params.tone_mapping_desaturate = var_InheritFloat(tc->gl, "tone-mapping-desat");
++# endif
+ color_params.gamut_warning = var_InheritBool(tc->gl, "tone-mapping-warn");
+
+ struct pl_color_space dst_space = pl_color_space_unknown;
+diff --git a/modules/video_output/opengl/vout_helper.h b/modules/video_output/opengl/vout_helper.h
+index a13f66c1cc..b078eb85a3 100644
+--- a/modules/video_output/opengl/vout_helper.h
++++ b/modules/video_output/opengl/vout_helper.h
+@@ -34,6 +34,21 @@
+ #ifdef HAVE_LIBPLACEBO
+ #include "../placebo_utils.h"
+
++
++#if PL_API_VER >= 10
++#define add_desat_params() \
++ add_float("desat-strength", pl_color_map_default_params.desaturation_strength, \
++ DESAT_STRENGTH_TEXT, DESAT_STRENGTH_LONGTEXT, false) \
++ add_float("desat-exponent", pl_color_map_default_params.desaturation_exponent, \
++ DESAT_EXPONENT_TEXT, DESAT_EXPONENT_LONGTEXT, false) \
++ add_float("desat-base", pl_color_map_default_params.desaturation_base, \
++ DESAT_BASE_TEXT, DESAT_BASE_LONGTEXT, false)
++#else
++#define add_desat_params() \
++ add_float("tone-mapping-desat", pl_color_map_default_params.tone_mapping_desaturate, \
++ TONEMAP_DESAT_TEXT, TONEMAP_DESAT_LONGTEXT, false)
++#endif
++
+ #define add_glopts_placebo() \
+ set_section(N_("Colorspace conversion"), NULL) \
+ add_integer("rendering-intent", pl_color_map_default_params.intent, \
+@@ -47,10 +62,9 @@
+ add_integer("tone-mapping", PL_TONE_MAPPING_HABLE, \
+ TONEMAPPING_TEXT, TONEMAPPING_LONGTEXT, false) \
+ change_integer_list(tone_values, tone_text) \
++ add_desat_params() \
+ add_float("tone-mapping-param", pl_color_map_default_params.tone_mapping_param, \
+ TONEMAP_PARAM_TEXT, TONEMAP_PARAM_LONGTEXT, true) \
+- add_float("tone-mapping-desat", pl_color_map_default_params.tone_mapping_desaturate, \
+- TONEMAP_DESAT_TEXT, TONEMAP_DESAT_LONGTEXT, false) \
+ add_bool("tone-mapping-warn", false, GAMUT_WARN_TEXT, GAMUT_WARN_LONGTEXT, false) \
+ set_section(N_("Dithering"), NULL) \
+ add_integer("dither-algo", -1, DITHER_TEXT, DITHER_LONGTEXT, false) \
+diff --git a/modules/video_output/placebo_utils.h b/modules/video_output/placebo_utils.h
+index 4ecf60e7e9..96a43cdf4b 100644
+--- a/modules/video_output/placebo_utils.h
++++ b/modules/video_output/placebo_utils.h
+@@ -165,6 +165,18 @@ static const char * const tone_text[] = {
+ #define TONEMAP_DESAT_TEXT "Tone-mapping desaturation coefficient"
+ #define TONEMAP_DESAT_LONGTEXT "How strongly to desaturate bright spectral colors towards white. 0.0 disables this behavior."
+
++#define DESAT_STRENGTH_TEXT "Desaturation strength"
++#define DESAT_STRENGTH_LONGTEXT "How strongly to desaturate bright spectral colors towards white. 0.0 disables this behavior, 1.0 enables full desaturation (hollywood-style)"
++
++#define DESAT_EXPONENT_TEXT "Desaturation exponent"
++#define DESAT_EXPONENT_LONGTEXT "Controls the steepness of the desaturation curve. If you set this to 0.0, the curve will be flat, i.e. desaturation always enabled (hollywood-style)."
++
++#define DESAT_BASE_TEXT "Desaturation base"
++#define DESAT_BASE_LONGTEXT "Controls the starting offset of the desaturation curve. Brightness values below this base will always be colorimetrically tone mapped (never desaturated)."
++
++#define MAX_BOOST_TEXT "Maximum brightness boost"
++#define MAX_BOOST_LONGTEXT "Maximum allowed brightness boost to compensate for dark scenes. A value of 1.0 means no brightness boost is allowed."
++
+ #define GAMUT_WARN_TEXT "Highlight clipped pixels"
+ #define GAMUT_WARN_LONGTEXT "Debugging tool to indicate which pixels were clipped as part of the tone mapping process."
+
+diff --git a/modules/video_output/vulkan/display.c b/modules/video_output/vulkan/display.c
+index 6250fba3c2..48fa4eafb2 100644
+--- a/modules/video_output/vulkan/display.c
++++ b/modules/video_output/vulkan/display.c
+@@ -603,8 +603,19 @@ vlc_module_begin () set_shortname ("Vulkan")
+ change_integer_list(tone_values, tone_text)
+ add_float("tone-mapping-param", pl_color_map_default_params.tone_mapping_param,
+ TONEMAP_PARAM_TEXT, TONEMAP_PARAM_LONGTEXT, true)
++#if PL_API_VER >= 10
++ add_float("desat-strength", pl_color_map_default_params.desaturation_strength,
++ DESAT_STRENGTH_TEXT, DESAT_STRENGTH_LONGTEXT, false)
++ add_float("desat-exponent", pl_color_map_default_params.desaturation_exponent,
++ DESAT_EXPONENT_TEXT, DESAT_EXPONENT_LONGTEXT, false)
++ add_float("desat-base", pl_color_map_default_params.desaturation_base,
++ DESAT_BASE_TEXT, DESAT_BASE_LONGTEXT, false)
++ add_float("max-boost", pl_color_map_default_params.max_boost,
++ MAX_BOOST_TEXT, MAX_BOOST_LONGTEXT, false)
++#else
+ add_float("tone-mapping-desat", pl_color_map_default_params.tone_mapping_desaturate,
+ TONEMAP_DESAT_TEXT, TONEMAP_DESAT_LONGTEXT, false)
++#endif
+ add_bool("gamut-warning", false, GAMUT_WARN_TEXT, GAMUT_WARN_LONGTEXT, true)
+ add_integer_with_range("peak-frames", pl_color_map_default_params.peak_detect_frames,
+ 0, 255, PEAK_FRAMES_TEXT, PEAK_FRAMES_LONGTEXT, false)
+@@ -691,7 +702,14 @@ static void UpdateParams(vout_display_t *vd)
+ sys->color_map.intent = var_InheritInteger(vd, "intent");
+ sys->color_map.tone_mapping_algo = var_InheritInteger(vd, "tone-mapping");
+ sys->color_map.tone_mapping_param = var_InheritFloat(vd, "tone-mapping-param");
++#if PL_API_VER >= 10
++ sys->color_map.desaturation_strength = var_InheritFloat(vd, "desat-strength");
++ sys->color_map.desaturation_exponent = var_InheritFloat(vd, "desat-exponent");
++ sys->color_map.desaturation_base = var_InheritFloat(vd, "desat-base");
++ sys->color_map.max_boost = var_InheritFloat(vd, "max-boost");
++#else
+ sys->color_map.tone_mapping_desaturate = var_InheritFloat(vd, "tone-mapping-desat");
++#endif
+ sys->color_map.gamut_warning = var_InheritBool(vd, "gamut-warning");
+ sys->color_map.peak_detect_frames = var_InheritInteger(vd, "peak-frames");
+ sys->color_map.scene_threshold = var_InheritFloat(vd, "scene-threshold");
diff --git a/2-3-placebo-update-for-new-peak-detection-algo.patch b/2-3-placebo-update-for-new-peak-detection-algo.patch
new file mode 100644
index 000000000000..5d0a3def4d7b
--- /dev/null
+++ b/2-3-placebo-update-for-new-peak-detection-algo.patch
@@ -0,0 +1,114 @@
+diff --git a/modules/video_output/placebo_utils.h b/modules/video_output/placebo_utils.h
+index 96a43cdf4b..733d6e5faf 100644
+--- a/modules/video_output/placebo_utils.h
++++ b/modules/video_output/placebo_utils.h
+@@ -183,12 +183,21 @@ static const char * const tone_text[] = {
+ #define PEAK_FRAMES_TEXT "HDR peak detection buffer size"
+ #define PEAK_FRAMES_LONGTEXT "How many input frames to consider when determining the brightness of HDR signals. Higher values result in a slower/smoother response to brightness level changes. Setting this to 0 disables peak detection entirely."
+
++#define PEAK_PERIOD_TEXT "HDR peak detection period"
++#define PEAK_PERIOD_LONGTEXT "This option enables peak detection with the specified smoothing period. A value of 0.0 disables peak detection. Higher values result in a larger smoothing period which means the detected values will be stable over a longer number of frames, at the cost of responding more slowly to changes in scene brightness"
++
+ #define TARGET_AVG_TEXT "Target peak brightness average"
+ #define TARGET_AVG_LONGTEXT "If the source frame has an average brightness exceeding this number, the frame will be automatically darkened to compensate. This feature only works when peak detection is enabled."
+
+ #define SCENE_THRESHOLD_TEXT "HDR peak scene change threshold"
+ #define SCENE_THRESHOLD_LONGTEXT "When using HDR peak detection, this sets a threshold for sudden brightness changes that should be considered as scene changes. This will result in the detected peak being immediately updated to the new value, rather than gradually being adjusted. Setting this to 0 disables this feature."
+
++#define SCENE_THRESHOLD_LOW_TEXT "Scene change lower threshold"
++#define SCENE_THRESHOLD_LOW_LONGTEXT "When using HDR peak detection, this sets the lower boundary of a brightness change indicating a scene change. Brightness changes between frames that exceed this threshold will begin to be mixed into the detected peak more strongly, bypassing the peak smoothing. Setting this to a negative number disables this logic."
++
++#define SCENE_THRESHOLD_HIGH_TEXT "Scene change upper threshold"
++#define SCENE_THRESHOLD_HIGH_LONGTEXT "This sets the upper boundary of a brightness change indicating a scene change. Brightness changes that exceed this value will instantly replace the detected peak, bypassing all smoothing. Setting this to a negative number disables this logic."
++
+ #define DITHER_TEXT "Dithering algorithm"
+ #define DITHER_LONGTEXT "The algorithm to use when dithering to a lower bit depth."
+
+@@ -484,4 +493,7 @@ static const struct pl_filter_function *const filter_fun[] = {
+ #define FORCE_GENERAL_TEXT "Force the use of general-purpose scalers"
+ #define FORCE_GENERAL_LONGTEXT "Normally, certain special scalers will be replaced by faster versions instead of going through the general scaler architecture. Enabling this option disables these optimizations."
+
++#define DELAYED_PEAK_TEXT "Allow delaying peak detection by up to one frame"
++#define DELAYED_PEAK_LONGTEXT "In some cases, peak detection may be more convenient to compute if the results are delayed by a frame. When this option is disabled, libplacebo will use an indirect buffer simply to force peak detection results to be up-to-date. Enabling it allows skipping this indirection in order to improve performance at the cost of some potentially noticeable brightness flickering immediately after a scene change."
++
+ #endif // VLC_PLACEBO_UTILS_H
+diff --git a/modules/video_output/vulkan/display.c b/modules/video_output/vulkan/display.c
+index 48fa4eafb2..d2ef6cdfee 100644
+--- a/modules/video_output/vulkan/display.c
++++ b/modules/video_output/vulkan/display.c
+@@ -71,6 +71,9 @@ struct vout_display_sys_t
+ struct pl_dither_params dither;
+ struct pl_render_params params;
+ struct pl_color_space target;
++#if PL_API_VER >= 13
++ struct pl_peak_detect_params peak_detect;
++#endif
+ enum pl_chroma_location yuv_chroma_loc;
+ int dither_depth;
+ };
+@@ -617,12 +620,25 @@ vlc_module_begin () set_shortname ("Vulkan")
+ TONEMAP_DESAT_TEXT, TONEMAP_DESAT_LONGTEXT, false)
+ #endif
+ add_bool("gamut-warning", false, GAMUT_WARN_TEXT, GAMUT_WARN_LONGTEXT, true)
++
++#if PL_API_VER < 12
+ add_integer_with_range("peak-frames", pl_color_map_default_params.peak_detect_frames,
+ 0, 255, PEAK_FRAMES_TEXT, PEAK_FRAMES_LONGTEXT, false)
+- add_float_with_range("target-avg", 0.25,
+- 0.0, 1.0, TARGET_AVG_TEXT, TARGET_AVG_LONGTEXT, false)
+ add_float_with_range("scene-threshold", pl_color_map_default_params.scene_threshold,
+ 0., 10., SCENE_THRESHOLD_TEXT, SCENE_THRESHOLD_LONGTEXT, false)
++#endif
++
++#if PL_API_VER >= 13
++ add_float_with_range("peak-period", pl_peak_detect_default_params.smoothing_period,
++ 0., 1000., PEAK_PERIOD_TEXT, PEAK_PERIOD_LONGTEXT, false)
++ add_float("scene-threshold-low", pl_peak_detect_default_params.scene_threshold_low,
++ SCENE_THRESHOLD_LOW_TEXT, SCENE_THRESHOLD_LOW_LONGTEXT, false)
++ add_float("scene-threshold-high", pl_peak_detect_default_params.scene_threshold_high,
++ SCENE_THRESHOLD_HIGH_TEXT, SCENE_THRESHOLD_HIGH_LONGTEXT, false)
++#endif
++
++ add_float_with_range("target-avg", 0.25,
++ 0.0, 1.0, TARGET_AVG_TEXT, TARGET_AVG_LONGTEXT, false)
+
+ set_section("Dithering", NULL)
+ add_integer("dither", -1,
+@@ -673,6 +689,9 @@ vlc_module_begin () set_shortname ("Vulkan")
+ add_bool("overlay-direct", false, OVERLAY_DIRECT_TEXT, OVERLAY_DIRECT_LONGTEXT, false)
+ add_bool("disable-linear", false, DISABLE_LINEAR_TEXT, DISABLE_LINEAR_LONGTEXT, false)
+ add_bool("force-general", false, FORCE_GENERAL_TEXT, FORCE_GENERAL_LONGTEXT, false)
++#if PL_API_VER >= 13
++ add_bool("delayed-peak", false, DELAYED_PEAK_TEXT, DELAYED_PEAK_LONGTEXT, false)
++#endif
+
+ vlc_module_end ()
+
+@@ -711,8 +730,10 @@ static void UpdateParams(vout_display_t *vd)
+ sys->color_map.tone_mapping_desaturate = var_InheritFloat(vd, "tone-mapping-desat");
+ #endif
+ sys->color_map.gamut_warning = var_InheritBool(vd, "gamut-warning");
++#if PL_API_VER < 12
+ sys->color_map.peak_detect_frames = var_InheritInteger(vd, "peak-frames");
+ sys->color_map.scene_threshold = var_InheritFloat(vd, "scene-threshold");
++#endif
+
+ sys->dither = pl_dither_default_params;
+ int method = var_InheritInteger(vd, "dither");
+@@ -734,6 +755,16 @@ static void UpdateParams(vout_display_t *vd)
+ sys->params.disable_linear_scaling = var_InheritBool(vd, "disable-linear");
+ sys->params.disable_builtin_scalers = var_InheritBool(vd, "force-general");
+
++#if PL_API_VER >= 13
++ sys->peak_detect.smoothing_period = var_InheritFloat(vd, "peak-period");
++ sys->peak_detect.scene_threshold_low = var_InheritFloat(vd, "scene-threshold-low");
++ sys->peak_detect.scene_threshold_high = var_InheritFloat(vd, "scene-threshold-high");
++ if (sys->peak_detect.smoothing_period > 0.0) {
++ sys->params.peak_detect_params = &sys->peak_detect;
++ sys->params.allow_delayed_peak_detect = var_InheritBool(vd, "delayed-peak");
++ }
++#endif
++
+ int preset = var_InheritInteger(vd, "upscaler-preset");
+ sys->params.upscaler = scale_config[preset];
+ if (preset == SCALE_CUSTOM) {
diff --git a/PKGBUILD b/PKGBUILD
index 6801b123ece3..74460c1dfabc 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -16,16 +16,16 @@ pkgdesc='Multi-platform MPEG, VCD/DVD, and DivX player - nightly snapshot'
url='https://nightlies.videolan.org/'
arch=('x86_64')
license=('LGPL2.1' 'GPL2')
-depends=('a52dec' 'libdvbpsi' 'libxpm' 'libdca' 'libproxy' 'lua' 'libidn'
+depends=('qt5-quickcontrols2' 'a52dec' 'libdvbpsi' 'libxpm' 'libdca' 'libproxy' 'lua' 'libidn'
'libmatroska' 'taglib' 'libmpcdec' 'ffmpeg' 'faad2' 'libupnp' 'libmad'
'libmpeg2' 'xcb-util-keysyms' 'libtar' 'libxinerama' 'libsecret'
- 'libarchive' 'qt5-base' 'qt5-x11extras' 'qt5-svg' 'freetype2'
+ 'libarchive' 'qt5-base' 'libgcrypt' 'qt5-x11extras' 'qt5-svg' 'freetype2'
'fribidi' 'harfbuzz' 'fontconfig' 'libxml2' 'gnutls' 'libplacebo-git'
'wayland-protocols' 'aribb24')
makedepends=('gst-plugins-base-libs' 'live-media' 'libnotify' 'libbluray'
'flac' 'libdc1394' 'libavc1394' 'libcaca' 'gtk3'
'librsvg' 'libgme' 'xosd' 'twolame' 'aalib' 'avahi' 'libsystemd'
- 'libmtp' 'libmicrodns' 'libdvdcss' 'smbclient'
+ 'libmtp' 'libmicrodns' 'libdvdcss' 'smbclient'
'vcdimager' 'libssh2' 'mesa' 'protobuf' 'libnfs' 'mpg123'
'libdvdread' 'libdvdnav' 'libogg' 'libshout' 'libmodplug' 'libvpx'
'libvorbis' 'speex' 'opus' 'libtheora' 'libpng' 'libjpeg-turbo'
@@ -110,6 +110,9 @@ options=('!emptydirs')
source=("http://nightlies.videolan.org/build/source/vlc-${_pkgver}-${_nightly_}-${_suffix_}.tar.xz"
'update-vlc-plugin-cache.hook'
'0001-lua-Fix-build-using-lua-5.3.patch'
+ '1-3-placebo-update-for-new-tone-mapping-desaturation-algo.patch'
+ '2-3-placebo-update-for-new-peak-detection-algo.patch'
+ '3-3-opengl-update-libplacebo-call-for-changed-API.patch'
'find-deps.py')
pkgver() {
@@ -122,13 +125,16 @@ prepare() {
./bootstrap
patch -Np1 -i "${srcdir}/0001-lua-Fix-build-using-lua-5.3.patch"
+ patch -Np1 -i "${srcdir}/3-3-opengl-update-libplacebo-call-for-changed-API.patch"
+ patch -Np1 -i "${srcdir}/1-3-placebo-update-for-new-tone-mapping-desaturation-algo.patch"
+ patch -Np1 -i "${srcdir}/2-3-placebo-update-for-new-peak-detection-algo.patch"
sed -i -e 's:truetype/ttf-dejavu:TTF:g' modules/visualization/projectm.cpp
sed -i -e 's:truetype/freefont:TTF:g' modules/text_renderer/freetype/freetype.c
sed 's|whoami|echo builduser|g' -i configure
sed 's|hostname -f|echo arch|g' -i configure
# libplacebo 12 API
- sed 's|pl_shader_alloc(tc->pl_ctx, NULL, 0, 0);|pl_shader_alloc(tc->pl_ctx, NULL);|' -i modules/video_output/opengl/vout_helper.c
+# sed 's|pl_shader_alloc(tc->pl_ctx, NULL, 0, 0);|pl_shader_alloc(tc->pl_ctx, NULL);|' -i modules/video_output/opengl/vout_helper.c
}
build() {
@@ -224,7 +230,7 @@ build() {
--enable-upnp \
--enable-microdns \
--enable-libxml2 \
- --disable-libgcrypt \
+ --enable-libgcrypt \
--enable-gnutls \
--enable-taglib \
--enable-secret \
@@ -268,4 +274,7 @@ package() {
sha256sums=('622e53bcf12de170ccb3b26b5d198236aa39a7c88c08aa9edb13af9d6d04ec10'
'c6f60c50375ae688755557dbfc5bd4a90a8998f8cf4d356c10d872a1a0b44f3a'
'3e6bddbaed443e40036c494a0754aedd2f94fe41bfa3754855e16f7452a03cdf'
+ '52d2818dde06fe5fd873b4a89f31884650c480528f7b61c0cbc05576fdbb3e53'
+ 'af46e70a85a82f2428b1c6ab09d27ee8c18a4b8adc1a4d71bde66e89be877f04'
+ 'cd7d11aa6aff73745170451ef769ccd62cdb8f3eaf803de7c7ab6bd388ab1d7b'
'90b0e34d5772d2307ba07a1c2aa715db7488389003cfe6d3570b2a9c63061db7')