summaryrefslogtreecommitdiffstats
path: root/multimedia
diff options
context:
space:
mode:
Diffstat (limited to 'multimedia')
-rw-r--r--multimedia/MuseScore/MuseScore.SlackBuild5
-rw-r--r--multimedia/MuseScore/MuseScore.info6
-rw-r--r--multimedia/MuseScore/README8
-rw-r--r--multimedia/MuseScore/slack-desc4
-rw-r--r--multimedia/aom/README7
-rw-r--r--multimedia/aom/aom.SlackBuild126
-rw-r--r--multimedia/aom/aom.info10
-rw-r--r--multimedia/aom/slack-desc19
-rw-r--r--multimedia/avidemux/0004-support-nv-codec-headers-12.2.patch292
-rw-r--r--multimedia/avidemux/avidemux.SlackBuild9
-rw-r--r--multimedia/avidemux/avidemux.info6
-rw-r--r--multimedia/ccextractor/ccextractor.SlackBuild4
-rw-r--r--multimedia/cinelerra/cinelerra.SlackBuild4
-rw-r--r--multimedia/cinelerra/cinelerra.info6
-rw-r--r--multimedia/droidcam/droidcam.SlackBuild7
-rw-r--r--multimedia/droidcam/droidcam.info6
-rw-r--r--multimedia/gpac/README3
-rw-r--r--multimedia/gpac/ffmpeg-6.patch51
-rw-r--r--multimedia/gpac/gpac.SlackBuild40
-rw-r--r--multimedia/gpac/gpac.info6
-rw-r--r--multimedia/gst-plugins-bad-nonfree/gst-plugins-bad-nonfree.SlackBuild19
-rw-r--r--multimedia/gst-plugins-bad-nonfree/gst-plugins-bad-nonfree.info6
-rw-r--r--multimedia/gst-plugins-ugly/gst-plugins-ugly.SlackBuild7
-rw-r--r--multimedia/gst-plugins-ugly/gst-plugins-ugly.info6
-rw-r--r--multimedia/inputstream.adaptive/inputstream.adaptive.SlackBuild2
-rw-r--r--multimedia/inputstream.adaptive/inputstream.adaptive.info6
-rw-r--r--multimedia/intel-gmmlib/intel-gmmlib.SlackBuild2
-rw-r--r--multimedia/intel-gmmlib/intel-gmmlib.info6
-rw-r--r--multimedia/intel-media-driver/intel-media-driver.SlackBuild4
-rw-r--r--multimedia/intel-media-driver/intel-media-driver.info6
-rw-r--r--multimedia/intel-media-sdk/intel-media-sdk.SlackBuild5
-rw-r--r--multimedia/intel-media-sdk/intel-media-sdk.info6
-rw-r--r--multimedia/kodi/kodi-21.0-gcc14.patch11
-rw-r--r--multimedia/kodi/kodi.SlackBuild22
-rw-r--r--multimedia/kodi/kodi.info8
-rw-r--r--multimedia/obs-studio/0011-Fix-FTBFS-on-32bit-archs.patch43
-rw-r--r--multimedia/obs-studio/obs-studio.SlackBuild11
-rw-r--r--multimedia/obs-studio/patches/1_7ed9b1f.patch43
-rw-r--r--multimedia/obs-studio/patches/2_92fc9f6.patch43
-rw-r--r--multimedia/obs-studio/patches/3_ed1e079.patch39
-rw-r--r--multimedia/obs-studio/patches/4_6d0381f.patch157
-rw-r--r--multimedia/opera-ffmpeg-codecs/opera-ffmpeg-codecs.SlackBuild2
-rw-r--r--multimedia/opera-ffmpeg-codecs/opera-ffmpeg-codecs.info6
-rw-r--r--multimedia/sfnt2woff/sfnt2woff.SlackBuild16
-rw-r--r--multimedia/sfnt2woff/sfnt2woff.info6
-rw-r--r--multimedia/shine/fix-bugs.patch12394
-rw-r--r--multimedia/shine/shine.SlackBuild14
-rw-r--r--multimedia/shine/shine.info6
-rw-r--r--multimedia/transcode/transcode-1.1.7-ffmpeg-0.10.patch15
-rw-r--r--multimedia/transcode/transcode-1.1.7-ffmpeg-0.11.patch303
-rw-r--r--multimedia/transcode/transcode-1.1.7-ffmpeg.patch51
-rw-r--r--multimedia/transcode/transcode-1.1.7-ffmpeg2.patch557
-rw-r--r--multimedia/transcode/transcode-1.1.7-ffmpeg24.patch18
-rw-r--r--multimedia/transcode/transcode-1.1.7-ffmpeg29.patch352
-rw-r--r--multimedia/transcode/transcode-1.1.7-ffmpeg4.patch508
-rw-r--r--multimedia/transcode/transcode-1.1.7-libav-10.patch36
-rw-r--r--multimedia/transcode/transcode-1.1.7-libav-9.patch31
-rw-r--r--multimedia/transcode/transcode-1.1.7-preset-force.patch28
-rw-r--r--multimedia/transcode/transcode-1.1.7-preset-free.patch34
-rw-r--r--multimedia/transcode/transcode.SlackBuild19
-rw-r--r--multimedia/tvheadend/tvheadend.SlackBuild1
-rw-r--r--multimedia/uavs3d/changelog21
-rw-r--r--multimedia/uavs3d/fix-build-issue.patch7618
-rw-r--r--multimedia/uavs3d/fix-libdir.patch (renamed from multimedia/uavs3d/fix-libdir-in-cmakelists.patch)6
-rw-r--r--multimedia/uavs3d/uavs3d.SlackBuild23
-rw-r--r--multimedia/uavs3d/uavs3d.info6
-rw-r--r--multimedia/vgmplay/slack-desc2
-rw-r--r--multimedia/vgmplay/vgmplay.SlackBuild9
-rw-r--r--multimedia/vgmplay/vgmplay.info6
-rw-r--r--multimedia/videomass/videomass.SlackBuild2
-rw-r--r--multimedia/videomass/videomass.info6
-rw-r--r--multimedia/vlc/4645.patch177
-rw-r--r--multimedia/vlc/4665.patch375
-rw-r--r--multimedia/vlc/vlc.SlackBuild4
-rw-r--r--multimedia/vokoscreenNG/vokoscreenNG.SlackBuild2
-rw-r--r--multimedia/vvenc/README15
-rw-r--r--multimedia/vvenc/vvenc.SlackBuild5
-rw-r--r--multimedia/vvenc/vvenc.info10
-rw-r--r--multimedia/w_scan_cpp/w_scan_cpp.SlackBuild4
-rw-r--r--multimedia/w_scan_cpp/w_scan_cpp.info4
-rw-r--r--multimedia/winff/changelog5
-rw-r--r--multimedia/winff/patches/unit1-pas.patch60
-rw-r--r--multimedia/winff/patches/unit3-pas.patch61
-rw-r--r--multimedia/winff/patches/winff-lpi.patch22
-rw-r--r--multimedia/winff/winff.SlackBuild2
-rw-r--r--multimedia/winff/winff.info6
-rw-r--r--multimedia/xavs2/xavs2.SlackBuild37
-rw-r--r--multimedia/xavs2/xavs2.info8
88 files changed, 1517 insertions, 22447 deletions
diff --git a/multimedia/MuseScore/MuseScore.SlackBuild b/multimedia/MuseScore/MuseScore.SlackBuild
index 7ab0fb1ebc..ad73860f95 100644
--- a/multimedia/MuseScore/MuseScore.SlackBuild
+++ b/multimedia/MuseScore/MuseScore.SlackBuild
@@ -27,7 +27,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=MuseScore
-VERSION=${VERSION:-4.2.1}
+VERSION=${VERSION:-4.3.0}
BUILD=${BUILD:-2}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -88,7 +88,8 @@ cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_MODULE_LINKER_FLAGS_RELEASE="-pthread" \
-DQMAKE=/usr/lib"${LIBDIRSUFFIX}"/qt5/bin/qmake \
- -DQT_QMAKE_EXECUTABLE=/usr/lib"${LIBDIRSUFFIX}"/qt5/bin/qmake
+ -DQT_QMAKE_EXECUTABLE=/usr/lib"${LIBDIRSUFFIX}"/qt5/bin/qmake \
+ -DMUSESCORE_BUILD_MODE=release
make install \
DESTDIR=$PKG \
diff --git a/multimedia/MuseScore/MuseScore.info b/multimedia/MuseScore/MuseScore.info
index 1afc8b2503..2a529cf8b8 100644
--- a/multimedia/MuseScore/MuseScore.info
+++ b/multimedia/MuseScore/MuseScore.info
@@ -1,8 +1,8 @@
PRGNAM="MuseScore"
-VERSION="4.2.1"
+VERSION="4.3.0"
HOMEPAGE="https://github.com/musescore/MuseScore"
-DOWNLOAD="https://github.com/musescore/MuseScore/archive/v4.2.1/MuseScore-4.2.1.tar.gz"
-MD5SUM="be651dd658905545bfd3601c23d8831b"
+DOWNLOAD="https://github.com/musescore/MuseScore/archive/v4.3.0/MuseScore-4.3.0.tar.gz"
+MD5SUM="2a068415e88839673a2455232a94be6d"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
diff --git a/multimedia/MuseScore/README b/multimedia/MuseScore/README
index c8249719ba..e539fd95d0 100644
--- a/multimedia/MuseScore/README
+++ b/multimedia/MuseScore/README
@@ -1,5 +1,9 @@
MuseScore is a free cross platform WYSIWYG music notation
-program, licenced under GNU GPL. Features:
+program, licenced under GNU GPL.
+MuseScore has been rebranded to "MuseScore Studio" to avoid
+confusion with the site musescore.com that holds the music scores.
+
+MuseScore features:
- WYSIWYG design, notes are entered on a "virtual notepaper"
- TrueType font(s) for printing & display allows for high quality
@@ -13,4 +17,4 @@ program, licenced under GNU GPL. Features:
- Integrated sequencer and software synthesizer to play the score
- Print or create pdf files
-This package partially installs to /opt/MuseScore
+In Slackware this package partially installs to /opt/MuseScore
diff --git a/multimedia/MuseScore/slack-desc b/multimedia/MuseScore/slack-desc
index 26d3afcfd3..653468c529 100644
--- a/multimedia/MuseScore/slack-desc
+++ b/multimedia/MuseScore/slack-desc
@@ -8,8 +8,8 @@
|-----handy-ruler------------------------------------------------------|
MuseScore: MuseScore (WYSIWYG Music Score Typesetter)
MuseScore:
-MuseScore: MuseScore is a free cross platform WYSIWYG music notation program,
-MuseScore: licensed under GNU GPL.
+MuseScore: MuseScore aka "MuseScore Studio" is a free cross platform WYSIWYG
+MuseScore: music notation program licensed under GNU GPL.
MuseScore:
MuseScore: Homepage: http://www.musescore.org/
MuseScore:
diff --git a/multimedia/aom/README b/multimedia/aom/README
deleted file mode 100644
index dbddf20cbb..0000000000
--- a/multimedia/aom/README
+++ /dev/null
@@ -1,7 +0,0 @@
-AOMedia Video 1 (AV1) is an Open Source video codec designed for
-video transmission over the Internet. AV1 is planned to surpass
-VP9 and also to eventually be a competitor with HEVC/H.265.
-
-This script builds the encoder aomenc, the decoder aomdec as well
-as shared libraries which can be utilised by suitable versions of
-both FFmpeg and vlc.
diff --git a/multimedia/aom/aom.SlackBuild b/multimedia/aom/aom.SlackBuild
deleted file mode 100644
index 1045d3e0a3..0000000000
--- a/multimedia/aom/aom.SlackBuild
+++ /dev/null
@@ -1,126 +0,0 @@
-#!/bin/bash
-# ----------------------------------------------------------------------
-# Slackware build script for aom
-#
-# Copyright (c) 2018-2023 Andrew Strong, Blue Mountains, Australia.
-#
-# Permission to use, copy, modify, and distribute this software for
-# any purpose with or without fee is hereby granted, provided that
-# the above copyright notice and this permission notice appear in all
-# copies.
-#
-# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
-# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-# IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
-# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
-# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-# ----------------------------------------------------------------------
-
-
-cd $(dirname $0) ; CWD=$(pwd)
-
-PRGNAM=aom
-# The 'official' archive for the aom 3.6.0 release has the git commit in
-# the filename, so adjustments are required for a sane Slackware build:
-VERSION=${VERSION:-3.6.0}
-GITCOMMIT=${GITCOMMIT:-3c65175b1972da4a1992c1dae2365b48d13f9a8d}
-BUILD=${BUILD:-1}
-TAG=${TAG:-_SBo}
-PKGTYPE=${PKGTYPE:-tgz}
-
-if [ -z "$ARCH" ]; then
- case "$( uname -m )" in
- i?86) ARCH=i586 ;;
- arm*) ARCH=arm ;;
- *) ARCH=$( uname -m ) ;;
- esac
-fi
-
-if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
- echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
- exit 0
-fi
-
-TMP=${TMP:-/tmp/SBo}
-PKG=$TMP/package-$PRGNAM
-OUTPUT=${OUTPUT:-/tmp}
-
-if [ "$ARCH" = "i586" ]; then
- SLKCFLAGS="-O2 -march=i586 -mtune=i686"
- LIBDIRSUFFIX=""
-elif [ "$ARCH" = "i686" ]; then
- SLKCFLAGS="-O2 -march=i686 -mtune=i686"
- LIBDIRSUFFIX=""
-elif [ "$ARCH" = "x86_64" ]; then
- SLKCFLAGS="-O2 -fPIC"
- LIBDIRSUFFIX="64"
-else
- SLKCFLAGS="-O2"
- LIBDIRSUFFIX=""
-fi
-
-set -e
-
-rm -rf $PKG
-mkdir -p $TMP $PKG $OUTPUT
-cd $TMP
-rm -rf $PRGNAM-$VERSION
-mkdir -p $PRGNAM-$VERSION
-tar xvf $CWD/$PRGNAM-$GITCOMMIT.tar.gz -C $TMP/$PRGNAM-$VERSION
-cd $PRGNAM-$VERSION
-chown -R root:root .
-find -L . \
- \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
- -o -perm 511 \) -exec chmod 755 {} \; -o \
- \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
- -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
-
-cd build
-
- # I don't build either the HTML or the Latex docs as IMHO at this stage
- # of aom development they are still not terribly useful for non-developers.
- # To enable these docs change '-DENABLE_DOCS=0' below to '1' to build
- # the docs and then uncomment the 'extra docs' section below to install them...
-
- cmake \
- -G "Unix Makefiles" \
- -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
- -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
- -DCMAKE_INSTALL_PREFIX=/usr \
- -DCMAKE_INSTALL_LIBDIR=lib${LIBDIRSUFFIX} \
- -DCMAKE_INSTALL_INCLUDEDIR=include \
- -DCMAKE_BUILD_TYPE=Release \
- -DENABLE_NASM=1 \
- -DENABLE_DOCS=0 \
- -DBUILD_SHARED_LIBS=1 \
- -DENABLE_TESTS=0 \
- ../
- make -j1
- make install DESTDIR=$PKG
-cd ..
-
-find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
- | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
-
-mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
-cp -a AUTHORS CHANGELOG LICENSE PATENTS README.md Sample.cfg $PKG/usr/doc/$PRGNAM-$VERSION
-
-# These are the 'extra docs', more details above...
-# mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION/{html,latex}
-# cp -a build/docs/html/* $PKG/usr/doc/$PRGNAM-$VERSION/html
-# cp -a build/docs/latex/* $PKG/usr/doc/$PRGNAM-$VERSION/latex
-
-cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
-
-mkdir -p $PKG/install
-cat $CWD/slack-desc > $PKG/install/slack-desc
-
-cd $PKG
-/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/aom/aom.info b/multimedia/aom/aom.info
deleted file mode 100644
index 815f782382..0000000000
--- a/multimedia/aom/aom.info
+++ /dev/null
@@ -1,10 +0,0 @@
-PRGNAM="aom"
-VERSION="3.6.0"
-HOMEPAGE="https://aomedia.googlesource.com/aom"
-DOWNLOAD="http://www.andrews-corner.org/downloads/aom-3c65175b1972da4a1992c1dae2365b48d13f9a8d.tar.gz"
-MD5SUM="4c73a44a710688e8c496b3740ecee84b"
-DOWNLOAD_x86_64=""
-MD5SUM_x86_64=""
-REQUIRES=""
-MAINTAINER="Andrew Strong"
-EMAIL="andrew.david.strong@gmail.com"
diff --git a/multimedia/aom/slack-desc b/multimedia/aom/slack-desc
deleted file mode 100644
index 981c25fff9..0000000000
--- a/multimedia/aom/slack-desc
+++ /dev/null
@@ -1,19 +0,0 @@
-# HOW TO EDIT THIS FILE:
-# The "handy ruler" below makes it easier to edit a package description.
-# Line up the first '|' above the ':' following the base package name, and
-# the '|' on the right side marks the last column you can put a character in.
-# You must make exactly 11 lines for the formatting to be correct. It's also
-# customary to leave one space after the ':' except on otherwise blank lines.
-
- |-----handy-ruler------------------------------------------------------|
-aom: aom (Open Source Video Codec)
-aom:
-aom: AOMedia Video 1 (AV1) is designed to be the successor to VP9 and
-aom: also to eventually be a direct competitor for HEVC/H.265.
-aom: This Slackbuild builds the 'reference' encoder aomenc as well as
-aom: the 'reference' decoder aomdec.
-aom:
-aom: Homepage: https://aomedia.googlesource.com/aom
-aom:
-aom:
-aom:
diff --git a/multimedia/avidemux/0004-support-nv-codec-headers-12.2.patch b/multimedia/avidemux/0004-support-nv-codec-headers-12.2.patch
new file mode 100644
index 0000000000..1f9afebba1
--- /dev/null
+++ b/multimedia/avidemux/0004-support-nv-codec-headers-12.2.patch
@@ -0,0 +1,292 @@
+diff -Naur ffmpeg-6.0.1.orig/libavcodec/nvenc.c ffmpeg-6.0.1/libavcodec/nvenc.c
+--- ffmpeg-6.0.1.orig/libavcodec/nvenc.c 2024-04-20 14:36:35.902732000 +0200
++++ ffmpeg-6.0.1/libavcodec/nvenc.c 2024-04-20 14:40:15.660732000 +0200
+@@ -233,8 +233,20 @@
+
+ static void nvenc_print_driver_requirement(AVCodecContext *avctx, int level)
+ {
+-#if NVENCAPI_CHECK_VERSION(12, 1)
++#if NVENCAPI_CHECK_VERSION(12, 3)
+ const char *minver = "(unknown)";
++#elif NVENCAPI_CHECK_VERSION(12, 2)
++# if defined(_WIN32) || defined(__CYGWIN__)
++ const char *minver = "551.76";
++# else
++ const char *minver = "550.54.14";
++# endif
++#elif NVENCAPI_CHECK_VERSION(12, 1)
++# if defined(_WIN32) || defined(__CYGWIN__)
++ const char *minver = "531.61";
++# else
++ const char *minver = "530.41.03";
++# endif
+ #elif NVENCAPI_CHECK_VERSION(12, 0)
+ # if defined(_WIN32) || defined(__CYGWIN__)
+ const char *minver = "522.25";
+@@ -585,6 +597,33 @@
+ return AVERROR(ENOSYS);
+ }
+
++#ifdef NVENC_HAVE_TEMPORAL_FILTER
++ ret = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_TEMPORAL_FILTER);
++ if(ctx->tf_level > 0 && ret <= 0) {
++ av_log(avctx, AV_LOG_WARNING, "Temporal filtering not supported by the device\n");
++ return AVERROR(ENOSYS);
++ }
++#endif
++
++#ifdef NVENC_HAVE_LOOKAHEAD_LEVEL
++ ret = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_LOOKAHEAD_LEVEL);
++ if(ctx->rc_lookahead > 0 && ctx->lookahead_level > 0 &&
++ ctx->lookahead_level != NV_ENC_LOOKAHEAD_LEVEL_AUTOSELECT &&
++ ctx->lookahead_level > ret)
++ {
++ av_log(avctx, AV_LOG_WARNING, "Lookahead level not supported. Maximum level: %d\n", ret);
++ return AVERROR(ENOSYS);
++ }
++#endif
++
++#ifdef NVENC_HAVE_UNIDIR_B
++ ret = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_UNIDIRECTIONAL_B);
++ if(ctx->unidir_b && ret <= 0) {
++ av_log(avctx, AV_LOG_WARNING, "Unidirectional B-Frames not supported by the device\n");
++ return AVERROR(ENOSYS);
++ }
++#endif
++
+ ctx->support_dyn_bitrate = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_DYN_BITRATE_CHANGE);
+
+ return 0;
+@@ -978,7 +1017,7 @@
+ return 0;
+ }
+
+-static av_cold void nvenc_setup_rate_control(AVCodecContext *avctx)
++static av_cold int nvenc_setup_rate_control(AVCodecContext *avctx)
+ {
+ NvencContext *ctx = avctx->priv_data;
+
+@@ -1107,6 +1146,24 @@
+ if (ctx->encode_config.rcParams.lookaheadDepth < ctx->rc_lookahead)
+ av_log(avctx, AV_LOG_WARNING, "Clipping lookahead depth to %d (from %d) due to lack of surfaces/delay",
+ ctx->encode_config.rcParams.lookaheadDepth, ctx->rc_lookahead);
++
++#ifdef NVENC_HAVE_LOOKAHEAD_LEVEL
++ if (ctx->lookahead_level >= 0) {
++ switch (ctx->lookahead_level) {
++ case NV_ENC_LOOKAHEAD_LEVEL_0:
++ case NV_ENC_LOOKAHEAD_LEVEL_1:
++ case NV_ENC_LOOKAHEAD_LEVEL_2:
++ case NV_ENC_LOOKAHEAD_LEVEL_3:
++ case NV_ENC_LOOKAHEAD_LEVEL_AUTOSELECT:
++ break;
++ default:
++ av_log(avctx, AV_LOG_ERROR, "Invalid lookahead level.\n");
++ return AVERROR(EINVAL);
++ }
++
++ ctx->encode_config.rcParams.lookaheadLevel = ctx->lookahead_level;
++ }
++#endif
+ }
+ }
+
+@@ -1134,6 +1191,8 @@
+ ctx->encode_config.rcParams.vbvBufferSize = avctx->rc_buffer_size = 0;
+ ctx->encode_config.rcParams.maxBitRate = avctx->rc_max_rate;
+ }
++
++ return 0;
+ }
+
+ static av_cold int nvenc_setup_h264_config(AVCodecContext *avctx)
+@@ -1244,6 +1303,11 @@
+
+ h264->level = ctx->level;
+
++#ifdef NVENC_HAVE_NEW_BIT_DEPTH_API
++ h264->inputBitDepth = h264->outputBitDepth =
++ IS_10BIT(ctx->data_pix_fmt) ? NV_ENC_BIT_DEPTH_10 : NV_ENC_BIT_DEPTH_8;
++#endif
++
+ if (ctx->coder >= 0)
+ h264->entropyCodingMode = ctx->coder;
+
+@@ -1357,7 +1421,12 @@
+
+ hevc->chromaFormatIDC = IS_YUV444(ctx->data_pix_fmt) ? 3 : 1;
+
++#ifdef NVENC_HAVE_NEW_BIT_DEPTH_API
++ hevc->inputBitDepth = hevc->outputBitDepth =
++ IS_10BIT(ctx->data_pix_fmt) ? NV_ENC_BIT_DEPTH_10 : NV_ENC_BIT_DEPTH_8;
++#else
+ hevc->pixelBitDepthMinus8 = IS_10BIT(ctx->data_pix_fmt) ? 2 : 0;
++#endif
+
+ hevc->level = ctx->level;
+
+@@ -1373,6 +1442,25 @@
+ hevc->numRefL1 = avctx->refs;
+ #endif
+
++#ifdef NVENC_HAVE_TEMPORAL_FILTER
++ if (ctx->tf_level >= 0) {
++ hevc->tfLevel = ctx->tf_level;
++
++ switch (ctx->tf_level)
++ {
++ case NV_ENC_TEMPORAL_FILTER_LEVEL_0:
++ case NV_ENC_TEMPORAL_FILTER_LEVEL_4:
++ break;
++ default:
++ av_log(avctx, AV_LOG_ERROR, "Invalid temporal filtering level.\n");
++ return AVERROR(EINVAL);
++ }
++
++ if (ctx->encode_config.frameIntervalP < 5)
++ av_log(avctx, AV_LOG_WARNING, "Temporal filtering needs at least 4 B-Frames (-bf 4).\n");
++ }
++#endif
++
+ return 0;
+ }
+
+@@ -1443,8 +1531,13 @@
+
+ av1->chromaFormatIDC = IS_YUV444(ctx->data_pix_fmt) ? 3 : 1;
+
++#ifdef NVENC_HAVE_NEW_BIT_DEPTH_API
++ av1->inputBitDepth = IS_10BIT(ctx->data_pix_fmt) ? NV_ENC_BIT_DEPTH_10 : NV_ENC_BIT_DEPTH_8;
++ av1->outputBitDepth = (IS_10BIT(ctx->data_pix_fmt) || ctx->highbitdepth) ? NV_ENC_BIT_DEPTH_10 : NV_ENC_BIT_DEPTH_8;
++#else
+ av1->inputPixelBitDepthMinus8 = IS_10BIT(ctx->data_pix_fmt) ? 2 : 0;
+ av1->pixelBitDepthMinus8 = (IS_10BIT(ctx->data_pix_fmt) || ctx->highbitdepth) ? 2 : 0;
++#endif
+
+ if (ctx->b_ref_mode >= 0)
+ av1->useBFramesAsRef = ctx->b_ref_mode;
+@@ -1567,6 +1660,10 @@
+ ctx->init_encode_params.frameRateDen = avctx->time_base.num * avctx->ticks_per_frame;
+ }
+
++#ifdef NVENC_HAVE_UNIDIR_B
++ ctx->init_encode_params.enableUniDirectionalB = ctx->unidir_b;
++#endif
++
+ ctx->init_encode_params.enableEncodeAsync = 0;
+ ctx->init_encode_params.enablePTD = 1;
+
+@@ -1617,7 +1714,9 @@
+
+ nvenc_recalc_surfaces(avctx);
+
+- nvenc_setup_rate_control(avctx);
++ res = nvenc_setup_rate_control(avctx);
++ if (res < 0)
++ return res;
+
+ if (avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
+ ctx->encode_config.frameFieldMode = NV_ENC_PARAMS_FRAME_FIELD_MODE_FIELD;
+@@ -1673,16 +1772,16 @@
+ {
+ switch (pix_fmt) {
+ case AV_PIX_FMT_YUV420P:
+- // MEANX return NV_ENC_BUFFER_FORMAT_YV12_PL;
++ return NV_ENC_BUFFER_FORMAT_YV12;
+ case AV_PIX_FMT_NV12:
+- return NV_ENC_BUFFER_FORMAT_NV12_PL;
++ return NV_ENC_BUFFER_FORMAT_NV12;
+ case AV_PIX_FMT_P010:
+ case AV_PIX_FMT_P016:
+ return NV_ENC_BUFFER_FORMAT_YUV420_10BIT;
+ #if 0 /* MEANX */
+ case AV_PIX_FMT_GBRP:
+ case AV_PIX_FMT_YUV444P:
+- return NV_ENC_BUFFER_FORMAT_YUV444_PL;
++ return NV_ENC_BUFFER_FORMAT_YUV444;
+ case AV_PIX_FMT_GBRP16:
+ case AV_PIX_FMT_YUV444P16:
+ return NV_ENC_BUFFER_FORMAT_YUV444_10BIT;
+@@ -2309,12 +2408,6 @@
+ frame_data->duration = frame->duration;
+ frame_data->frame_opaque = frame->opaque;
+
+-#if FF_API_REORDERED_OPAQUE
+-FF_DISABLE_DEPRECATION_WARNINGS
+- frame_data->reordered_opaque = frame->reordered_opaque;
+-FF_ENABLE_DEPRECATION_WARNINGS
+-#endif
+-
+ ctx->frame_data_array_pos = (ctx->frame_data_array_pos + 1) % ctx->frame_data_array_nb;
+ pic_params->inputDuration = idx;
+
+@@ -2331,12 +2424,6 @@
+
+ pkt->duration = frame_data->duration;
+
+-#if FF_API_REORDERED_OPAQUE
+-FF_DISABLE_DEPRECATION_WARNINGS
+- avctx->reordered_opaque = frame_data->reordered_opaque;
+-FF_ENABLE_DEPRECATION_WARNINGS
+-#endif
+-
+ if (avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE) {
+ pkt->opaque = frame_data->frame_opaque;
+ pkt->opaque_ref = frame_data->frame_opaque_ref;
+@@ -2724,6 +2811,7 @@
+ pic_params.encodePicFlags = 0;
+ }
+
++ pic_params.frameIdx = ctx->frame_idx_counter++;
+ pic_params.inputTimeStamp = frame->pts;
+
+ if (ctx->extra_sei) {
+diff -Naur ffmpeg-6.0.1.orig/libavcodec/nvenc.h ffmpeg-6.0.1/libavcodec/nvenc.h
+--- ffmpeg-6.0.1.orig/libavcodec/nvenc.h 2023-11-10 01:30:25.000000000 +0100
++++ ffmpeg-6.0.1/libavcodec/nvenc.h 2024-04-20 14:42:22.556732000 +0200
+@@ -83,6 +83,15 @@
+ #define NVENC_NO_DEPRECATED_RC
+ #endif
+
++// SDK 12.2 compile time feature checks
++#if NVENCAPI_CHECK_VERSION(12, 2)
++#define NVENC_HAVE_NEW_BIT_DEPTH_API
++#define NVENC_HAVE_TEMPORAL_FILTER
++#define NVENC_HAVE_LOOKAHEAD_LEVEL
++#define NVENC_HAVE_UHQ_TUNING
++#define NVENC_HAVE_UNIDIR_B
++#endif
++
+ typedef struct NvencSurface
+ {
+ NV_ENC_INPUT_PTR input_surface;
+@@ -100,10 +109,6 @@
+ {
+ int64_t duration;
+
+-#if FF_API_REORDERED_OPAQUE
+- int64_t reordered_opaque;
+-#endif
+-
+ void *frame_opaque;
+ AVBufferRef *frame_opaque_ref;
+ } NvencFrameData;
+@@ -215,6 +220,8 @@
+
+ void *nvencoder;
+
++ uint32_t frame_idx_counter;
++
+ int preset;
+ int profile;
+ int level;
+@@ -262,6 +269,9 @@
+ int udu_sei;
+ int timing_info;
+ int highbitdepth;
++ int tf_level;
++ int lookahead_level;
++ int unidir_b;
+ } NvencContext;
+
+ int ff_nvenc_encode_init(AVCodecContext *avctx);
diff --git a/multimedia/avidemux/avidemux.SlackBuild b/multimedia/avidemux/avidemux.SlackBuild
index 37202fb9d3..15cce7f22f 100644
--- a/multimedia/avidemux/avidemux.SlackBuild
+++ b/multimedia/avidemux/avidemux.SlackBuild
@@ -5,7 +5,7 @@
# Derived from a SlackBuild by Eric Hameleers.
# Copyright 2009, 2010, 2011, 2013 Eric Hameleers, Eindhoven, NL
# Copyright 2015 John Vogel Corning, NY USA
-# Copyright 2017-2022 Matteo Bernardini, Pisa, IT
+# Copyright 2017-2024 Matteo Bernardini, Pisa, IT
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -31,7 +31,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=avidemux
-VERSION=${VERSION:-2.8.1}
+VERSION=${VERSION:-20240417_ac7587b}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -75,7 +75,7 @@ rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
rm -rf ${PRGNAM}_${VERSION}
-tar xvf $CWD/${PRGNAM}_${VERSION}.tar.gz
+tar xvf $CWD/${PRGNAM}_${VERSION}.tar.?z
cd ${PRGNAM}_${VERSION}
chown -R root:root .
find -L . \
@@ -90,6 +90,9 @@ find -L . \
sed -i 's|../avidemux/qt4|../avidemux/qt4 -DLRELEASE_EXECUTABLE=/usr/bin/lrelease-qt5|' bootStrap.bash || exit 1
sed -i 's|0.19|1.0|' avidemux_plugins/ADM_videoFilters6/ass/CMakeLists.txt || exit 1
+mkdir -p avidemux_core/ffmpeg_package/patches/upstream
+cp $CWD/0004-support-nv-codec-headers-12.2.patch avidemux_core/ffmpeg_package/patches/upstream
+
bash bootStrap.bash --with-core --with-cli --with-plugins
make -C buildCli DESTDIR="$PKG" install
diff --git a/multimedia/avidemux/avidemux.info b/multimedia/avidemux/avidemux.info
index 948c45dcc6..d6a3da1e89 100644
--- a/multimedia/avidemux/avidemux.info
+++ b/multimedia/avidemux/avidemux.info
@@ -1,8 +1,8 @@
PRGNAM="avidemux"
-VERSION="2.8.1"
+VERSION="20240417_ac7587b"
HOMEPAGE="http://avidemux.org"
-DOWNLOAD="http://downloads.sf.net/avidemux/avidemux_2.8.1.tar.gz"
-MD5SUM="fee41934cba460ec0fde2a453d5a6307"
+DOWNLOAD="https://ponce.cc/slackware/sources/repo/avidemux_20240417_ac7587b.tar.xz"
+MD5SUM="21dfb34ecacb4fca7d50cd2c54b3a181"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="faac faad2 libdca x264 xvidcore"
diff --git a/multimedia/ccextractor/ccextractor.SlackBuild b/multimedia/ccextractor/ccextractor.SlackBuild
index 8e072caee8..7ac1170764 100644
--- a/multimedia/ccextractor/ccextractor.SlackBuild
+++ b/multimedia/ccextractor/ccextractor.SlackBuild
@@ -98,8 +98,8 @@ cd build
-DMAN_INSTALL_DIR=/usr/man \
-DWITHOUT_RUST=ON \
-DWITH_OCR=ON \
- -DWITH_HARDSUBX=ON \
- -DWITH_FFMPEG=ON \
+ -DWITH_HARDSUBX=OFF \
+ -DWITH_FFMPEG=OFF \
-DCMAKE_BUILD_TYPE=Release ..
make
make install/strip DESTDIR=$PKG
diff --git a/multimedia/cinelerra/cinelerra.SlackBuild b/multimedia/cinelerra/cinelerra.SlackBuild
index 1d88525bc0..424392f9a9 100644
--- a/multimedia/cinelerra/cinelerra.SlackBuild
+++ b/multimedia/cinelerra/cinelerra.SlackBuild
@@ -28,7 +28,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=cinelerra
-VERSION=${VERSION:-20210331_eabda9c}
+VERSION=${VERSION:-20231006_bfc2f6c}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -88,6 +88,8 @@ find -L . \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+sed -i "s|ffplay|ffplay --disable-htmlpages|" thirdparty/Makefile
+
./autogen.sh
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
diff --git a/multimedia/cinelerra/cinelerra.info b/multimedia/cinelerra/cinelerra.info
index 296f02857f..74df7b48e8 100644
--- a/multimedia/cinelerra/cinelerra.info
+++ b/multimedia/cinelerra/cinelerra.info
@@ -1,8 +1,8 @@
PRGNAM="cinelerra"
-VERSION="20210331_eabda9c"
+VERSION="20231006_bfc2f6c"
HOMEPAGE="https://cinelerra-gg.org"
-DOWNLOAD="http://ponce.cc/slackware/sources/repo/cinelerra-gg-20210331_eabda9c.tar.xz"
-MD5SUM="fd7a1f289192a8f1f77d0a494f8f204b"
+DOWNLOAD="https://ponce.cc/slackware/sources/repo/cinelerra-gg-20231006_bfc2f6c.tar.xz"
+MD5SUM="1d496163396c4f5dc427cbbd7748fb90"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="faac faad2 libavc1394 libdv libiec61883 mjpegtools x264"
diff --git a/multimedia/droidcam/droidcam.SlackBuild b/multimedia/droidcam/droidcam.SlackBuild
index d2d8ffdfc5..1297ce75f7 100644
--- a/multimedia/droidcam/droidcam.SlackBuild
+++ b/multimedia/droidcam/droidcam.SlackBuild
@@ -26,7 +26,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=droidcam
-VERSION=${VERSION:-1.8.2}
+VERSION=${VERSION:-2.1.3}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -39,9 +39,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -106,7 +103,7 @@ sed -i "5,6s/local\///" $PKG/usr/share/applications/Droidcam.desktop
sed -i "7s/.*/Icon=\/usr\/share\/icons\/droidcam.png/" $PKG/usr/share/applications/Droidcam.desktop
#Documentation
-cp -a $CWD/README* $PKG/usr/doc/$PRGNAM-$VERSION/
+cp $CWD/README* $PKG/usr/doc/$PRGNAM-$VERSION/
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
mkdir -p $PKG/install
diff --git a/multimedia/droidcam/droidcam.info b/multimedia/droidcam/droidcam.info
index 3849af8446..c249de346e 100644
--- a/multimedia/droidcam/droidcam.info
+++ b/multimedia/droidcam/droidcam.info
@@ -1,8 +1,8 @@
PRGNAM="droidcam"
-VERSION="1.8.2"
+VERSION="2.1.3"
HOMEPAGE="https://www.dev47apps.com/"
-DOWNLOAD="https://files.dev47apps.net/linux/droidcam_1.8.2.zip"
-MD5SUM="af019ca66198c501e2ffa813d1c81471"
+DOWNLOAD="https://files.dev47apps.net/linux/droidcam_2.1.3.zip"
+MD5SUM="9e4034e81ba9be6c9a37d6f38c4d4f62"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="android-tools dkms"
diff --git a/multimedia/gpac/README b/multimedia/gpac/README
index 1e7c8f82a2..a2020a9bcb 100644
--- a/multimedia/gpac/README
+++ b/multimedia/gpac/README
@@ -1,6 +1,3 @@
GPAC is mainly used to package multimedia content for local or
streaming playback. GPAC includes MP4Box utility which lets packaging
of various audio and video codecs into mp4 container.
-
-Optional dependencies include the following: wxPython, js, faad2,
-ffmpeg, xvidcore, jack, xulrunner and xmlrpc-c.
diff --git a/multimedia/gpac/ffmpeg-6.patch b/multimedia/gpac/ffmpeg-6.patch
new file mode 100644
index 0000000000..0e7c18299d
--- /dev/null
+++ b/multimedia/gpac/ffmpeg-6.patch
@@ -0,0 +1,51 @@
+From ba14e34dd7a3c4cef5a56962898e9f863dd4b4f3 Mon Sep 17 00:00:00 2001
+From: jeanlf <jeanlf@gpac.io>
+Date: Mon, 13 Mar 2023 09:43:52 +0100
+Subject: [PATCH] fixed compil with ffmpeg 6 - cf #2406
+
+---
+ src/filters/ff_mx.c | 20 ++++++++++++++++----
+ 1 file changed, 16 insertions(+), 4 deletions(-)
+
+diff --git a/src/filters/ff_mx.c b/src/filters/ff_mx.c
+index 34e5f59e7c..5cf1d98941 100644
+--- a/src/filters/ff_mx.c
++++ b/src/filters/ff_mx.c
+@@ -503,7 +503,11 @@ static GF_Err ffmx_close_seg(GF_Filter *filter, GF_FFMuxCtx *ctx, Bool send_evt_
+ evt.seg_size.is_init = 0;
+ }
+ evt.seg_size.media_range_start = ctx->offset_at_seg_start;
++#if LIBAVFORMAT_VERSION_MAJOR < 60
+ evt.seg_size.media_range_end = ctx->muxer->pb ? (ctx->muxer->pb->written-1) : 0;
++#else
++ evt.seg_size.media_range_end = ctx->muxer->pb ? (ctx->muxer->pb->bytes_written-1) : 0;
++#endif
+ ctx->offset_at_seg_start = evt.seg_size.media_range_end;
+
+ gf_filter_pid_send_event(pid, &evt);
+@@ -1013,13 +1017,21 @@ static GF_Err ffmx_configure_pid(GF_Filter *filter, GF_FilterPid *pid, Bool is_r
+ ff_codec_id = ffmpeg_codecid_from_gpac(codec_id, &ff_codec_tag);
+ }
+
++
++ res = 1;
++#if LIBAVFORMAT_VERSION_MAJOR < 60
+ if (ctx->muxer->oformat && ctx->muxer->oformat->query_codec) {
+ res = ctx->muxer->oformat->query_codec(ff_codec_id, 1);
+- if (!res) {
+- GF_LOG(GF_LOG_ERROR, GF_LOG_CONTAINER, ("[FFMux] Codec %s not supported in container %s\n", gf_codecid_name(codec_id), ctx->muxer->oformat->name));
+- return GF_NOT_SUPPORTED;
+- }
+ }
++#else
++ res = avformat_query_codec(ctx->muxer->oformat, ff_codec_id, FF_COMPLIANCE_NORMAL);
++#endif
++
++ if (!res) {
++ GF_LOG(GF_LOG_ERROR, GF_LOG_CONTAINER, ("[FFMux] Codec %s not supported in container %s\n", gf_codecid_name(codec_id), ctx->muxer->oformat->name));
++ return GF_NOT_SUPPORTED;
++ }
++
+ const AVCodec *c = avcodec_find_decoder(ff_codec_id);
+ if (!c) return GF_NOT_SUPPORTED;
+
diff --git a/multimedia/gpac/gpac.SlackBuild b/multimedia/gpac/gpac.SlackBuild
index 3d47f2be9d..e981e25b6a 100644
--- a/multimedia/gpac/gpac.SlackBuild
+++ b/multimedia/gpac/gpac.SlackBuild
@@ -28,7 +28,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM="gpac"
-VERSION=${VERSION:-1.0.1}
+VERSION=${VERSION:-2.2.1}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -69,57 +69,33 @@ else
LIBDIRSUFFIX=""
fi
-### wxwidgets support
-if [ "${WX_SUPPORT:-no}" = "no" ]; then
- wx_option="--disable-wx"
-else
- wx_option="--enable-wx"
-fi
-
-if [ "${AMR:-no}" = "no" ]; then
- amr_option="--disable-amr"
-else
- amr_option="--enable-amr"
-fi
-
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
rm -fR $PRGNAM-$VERSION
tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
cd $PRGNAM-$VERSION
-chown -R root.root .
+chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
-o -perm 511 \) -exec chmod 755 {} \; -o \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
-# configure doesn't have --libdir option.
-sed -i "s/^libdir=\".*\"$/libdir=\"lib$LIBDIRSUFFIX\"/" configure
+patch -p1 < $CWD/ffmpeg-6.patch
./configure \
--prefix=/usr \
+ --libdir=lib$LIBDIRSUFFIX \
--mandir=/usr/man \
--disable-opt \
--enable-pic \
- --enable-pulseaudio \
--cpu=${ARCH} \
- --extra-cflags="$SLKCFLAGS" \
- $wx_option \
- $amr_option
-
-make -j1
-make install DESTDIR=$PKG
-make install-lib DESTDIR=$PKG
-
-### remove $PKG/usr/share/gpac directory
-### only contains gpac.mp4 file which
-### doesn't seem to play with mplayer
-#rm -fr $PKG/usr/share
+ --extra-cflags="$SLKCFLAGS"
-find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
- | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+make
+make install DESTDIR=$PKG STRIP=true
+make install-lib DESTDIR=$PKG STRIP=true
find $PKG/usr/man -type f -exec gzip -9 {} \;
for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
diff --git a/multimedia/gpac/gpac.info b/multimedia/gpac/gpac.info
index 9b1adc7085..537f6fd8da 100644
--- a/multimedia/gpac/gpac.info
+++ b/multimedia/gpac/gpac.info
@@ -1,8 +1,8 @@
PRGNAM="gpac"
-VERSION="1.0.1"
+VERSION="2.2.1"
HOMEPAGE="http://gpac.wp.mines-telecom.fr"
-DOWNLOAD="https://github.com/gpac/gpac/archive/v1.0.1/gpac-1.0.1.tar.gz"
-MD5SUM="52f6711e43a8d271ebec0c2ea2afab4a"
+DOWNLOAD="https://github.com/gpac/gpac/archive/v2.2.1/gpac-2.2.1.tar.gz"
+MD5SUM="a1a4a6c7f1525431b211b5ba47253ed0"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
diff --git a/multimedia/gst-plugins-bad-nonfree/gst-plugins-bad-nonfree.SlackBuild b/multimedia/gst-plugins-bad-nonfree/gst-plugins-bad-nonfree.SlackBuild
index 5fdcb0305a..3bfe805da8 100644
--- a/multimedia/gst-plugins-bad-nonfree/gst-plugins-bad-nonfree.SlackBuild
+++ b/multimedia/gst-plugins-bad-nonfree/gst-plugins-bad-nonfree.SlackBuild
@@ -2,7 +2,7 @@
# Slackware build script for gst-plugins-bad-nonfree
-# Copyright 2013-2021 Robby Workman, Tuscaloosa, Alabama, USA
+# Copyright 2013-2024 Robby Workman, Tuscaloosa, Alabama, USA
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -32,7 +32,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=gst-plugins-bad-nonfree
-VERSION=${VERSION:-1.18.5}
+VERSION=${VERSION:-1.24.0}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -206,7 +206,20 @@ cd build
-Dvulkan=disabled \
-Dwayland=disabled \
-Dwebrtc=disabled \
- -Dwebp=disabled
+ -Dwebp=disabled \
+ -Daes=disabled \
+ -Danalyticsoverlay=disabled \
+ -Dassrender=disabled \
+ -Dcodec2json=disabled \
+ -Dcodecalpha=disabled \
+ -Dcodectimestamper=disabled \
+ -Dinsertbin=disabled \
+ -Dmse=disabled \
+ -Dqroverlay=disabled \
+ -Dqsv=disabled \
+ -Dunixfd=disabled \
+ -Duvcgadget=disabled \
+ -Dzxing=disabled
"${NINJA:=ninja}"
DESTDIR=$PKG $NINJA install
cd ..
diff --git a/multimedia/gst-plugins-bad-nonfree/gst-plugins-bad-nonfree.info b/multimedia/gst-plugins-bad-nonfree/gst-plugins-bad-nonfree.info
index 43340d39f2..bfc39e9e8d 100644
--- a/multimedia/gst-plugins-bad-nonfree/gst-plugins-bad-nonfree.info
+++ b/multimedia/gst-plugins-bad-nonfree/gst-plugins-bad-nonfree.info
@@ -1,8 +1,8 @@
PRGNAM="gst-plugins-bad-nonfree"
-VERSION="1.18.5"
+VERSION="1.24.0"
HOMEPAGE="https://gstreamer.freedesktop.org/"
-DOWNLOAD="https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.18.5.tar.xz"
-MD5SUM="4ab1c19c3cf1ba79c20c65f6be78e7fd"
+DOWNLOAD="https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.24.0.tar.xz"
+MD5SUM="22982dd1f7baffa6435551cbe156b888"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
diff --git a/multimedia/gst-plugins-ugly/gst-plugins-ugly.SlackBuild b/multimedia/gst-plugins-ugly/gst-plugins-ugly.SlackBuild
index d5d9e11406..0a2a72d73c 100644
--- a/multimedia/gst-plugins-ugly/gst-plugins-ugly.SlackBuild
+++ b/multimedia/gst-plugins-ugly/gst-plugins-ugly.SlackBuild
@@ -2,7 +2,7 @@
# Slackware build script for gst-plugins-ugly
-# Copyright 2013-2021 Robby Workman, Tuscaloosa, Alabama, USA
+# Copyright 2013-2024 Robby Workman, Tuscaloosa, Alabama, USA
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -25,7 +25,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=gst-plugins-ugly
-VERSION=${VERSION:-1.18.5}
+VERSION=${VERSION:-1.24.2}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -90,8 +90,7 @@ cd build
--localstatedir=/var \
--mandir=/usr/man \
--prefix=/usr \
- --sysconfdir=/etc \
- -Dexamples=disabled
+ --sysconfdir=/etc
"${NINJA:=ninja}"
DESTDIR=$PKG $NINJA install
cd ..
diff --git a/multimedia/gst-plugins-ugly/gst-plugins-ugly.info b/multimedia/gst-plugins-ugly/gst-plugins-ugly.info
index 5a55a8aa0f..50e4d7359e 100644
--- a/multimedia/gst-plugins-ugly/gst-plugins-ugly.info
+++ b/multimedia/gst-plugins-ugly/gst-plugins-ugly.info
@@ -1,8 +1,8 @@
PRGNAM="gst-plugins-ugly"
-VERSION="1.18.5"
+VERSION="1.24.2"
HOMEPAGE="https://gstreamer.freedesktop.org/"
-DOWNLOAD="https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.18.5.tar.xz"
-MD5SUM="049f90b7a3a72e241ad47564b5cd7a7a"
+DOWNLOAD="https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.24.2.tar.xz"
+MD5SUM="405e4820eabd142d3cede21360742b7f"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
diff --git a/multimedia/inputstream.adaptive/inputstream.adaptive.SlackBuild b/multimedia/inputstream.adaptive/inputstream.adaptive.SlackBuild
index 9309853146..853d43119d 100644
--- a/multimedia/inputstream.adaptive/inputstream.adaptive.SlackBuild
+++ b/multimedia/inputstream.adaptive/inputstream.adaptive.SlackBuild
@@ -26,7 +26,7 @@ cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=inputstream.adaptive
CODNAM=Omega
-VERSION=${VERSION:-21.4.4}
+VERSION=${VERSION:-21.4.8}
BENTO4VER=${BENTO4VER:-1.6.0-641}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
diff --git a/multimedia/inputstream.adaptive/inputstream.adaptive.info b/multimedia/inputstream.adaptive/inputstream.adaptive.info
index 534cfa6cc5..21e3ca41f1 100644
--- a/multimedia/inputstream.adaptive/inputstream.adaptive.info
+++ b/multimedia/inputstream.adaptive/inputstream.adaptive.info
@@ -1,9 +1,9 @@
PRGNAM="inputstream.adaptive"
-VERSION="21.4.4"
+VERSION="21.4.8"
HOMEPAGE="https://github.com/xbmc/inputstream.adaptive/"
-DOWNLOAD="https://github.com/xbmc/inputstream.adaptive/archive/21.4.4-Omega/inputstream.adaptive-21.4.4-Omega.tar.gz \
+DOWNLOAD="https://github.com/xbmc/inputstream.adaptive/archive/21.4.8-Omega/inputstream.adaptive-21.4.8-Omega.tar.gz \
https://github.com/xbmc/Bento4/archive/refs/tags/1.6.0-641-Omega/Bento4-1.6.0-641-Omega.tar.gz"
-MD5SUM="ac05307397df43eb6cc77c8379275056 \
+MD5SUM="dd8bc7f5e3f9c9c551a0d3ecb3d2ec42 \
77b1246f0d738ee4f2006c27eb48d3c8"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
diff --git a/multimedia/intel-gmmlib/intel-gmmlib.SlackBuild b/multimedia/intel-gmmlib/intel-gmmlib.SlackBuild
index 0d62385bcf..901a074701 100644
--- a/multimedia/intel-gmmlib/intel-gmmlib.SlackBuild
+++ b/multimedia/intel-gmmlib/intel-gmmlib.SlackBuild
@@ -25,7 +25,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=intel-gmmlib
-VERSION=${VERSION:-21.3.1}
+VERSION=${VERSION:-22.3.9}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
diff --git a/multimedia/intel-gmmlib/intel-gmmlib.info b/multimedia/intel-gmmlib/intel-gmmlib.info
index 56c6e5218b..0c605461d6 100644
--- a/multimedia/intel-gmmlib/intel-gmmlib.info
+++ b/multimedia/intel-gmmlib/intel-gmmlib.info
@@ -1,8 +1,8 @@
PRGNAM="intel-gmmlib"
-VERSION="21.3.1"
+VERSION="22.3.9"
HOMEPAGE="https://github.com/intel/gmmlib/"
-DOWNLOAD="https://github.com/intel/gmmlib/archive/intel-gmmlib-21.3.1/gmmlib-intel-gmmlib-21.3.1.tar.gz"
-MD5SUM="e6755c5d0f44e336f298cee9c7c3fdae"
+DOWNLOAD="https://github.com/intel/gmmlib/archive/intel-gmmlib-22.3.9/gmmlib-intel-gmmlib-22.3.9.tar.gz"
+MD5SUM="b9891f96c736f07a4431a7e97843cdc2"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
diff --git a/multimedia/intel-media-driver/intel-media-driver.SlackBuild b/multimedia/intel-media-driver/intel-media-driver.SlackBuild
index dfb1b3b30b..a17fb38d63 100644
--- a/multimedia/intel-media-driver/intel-media-driver.SlackBuild
+++ b/multimedia/intel-media-driver/intel-media-driver.SlackBuild
@@ -25,7 +25,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=intel-media-driver
-VERSION=${VERSION:-21.3.5}
+VERSION=${VERSION:-23.3.0}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -95,7 +95,7 @@ find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | gr
| cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
-cp -a CODEOWNERS LICENSE.md README.md $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a LICENSE.md README.md $PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
mkdir -p $PKG/install
diff --git a/multimedia/intel-media-driver/intel-media-driver.info b/multimedia/intel-media-driver/intel-media-driver.info
index 9516ea42a4..d6d9a57752 100644
--- a/multimedia/intel-media-driver/intel-media-driver.info
+++ b/multimedia/intel-media-driver/intel-media-driver.info
@@ -1,10 +1,10 @@
PRGNAM="intel-media-driver"
-VERSION="21.3.5"
+VERSION="23.3.0"
HOMEPAGE="https://github.com/intel/media-driver/"
DOWNLOAD="UNSUPPORTED"
MD5SUM=""
-DOWNLOAD_x86_64="https://github.com/intel/media-driver/archive/intel-media-21.3.5/media-driver-intel-media-21.3.5.tar.gz"
-MD5SUM_x86_64="3ace8aec373b3990acb1e3270e4a9e0b"
+DOWNLOAD_x86_64="https://github.com/intel/media-driver/archive/intel-media-23.3.0/media-driver-intel-media-23.3.0.tar.gz"
+MD5SUM_x86_64="3b5eda7543298f7fecbce14af5fa1385"
REQUIRES="intel-gmmlib"
MAINTAINER="Mario Preksavec"
EMAIL="mario at slackware dot hr"
diff --git a/multimedia/intel-media-sdk/intel-media-sdk.SlackBuild b/multimedia/intel-media-sdk/intel-media-sdk.SlackBuild
index 2c3f1e67bf..6adf652d14 100644
--- a/multimedia/intel-media-sdk/intel-media-sdk.SlackBuild
+++ b/multimedia/intel-media-sdk/intel-media-sdk.SlackBuild
@@ -25,7 +25,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=intel-media-sdk
-VERSION=${VERSION:-21.3.5}
+VERSION=${VERSION:-23.2.2}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -78,6 +78,9 @@ find -L . \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+# Fix for gcc >= 13.x
+sed -i '/mfxloader/i #include <cstdint>' api/mfx_dispatch/linux/mfxparser.cpp
+
mkdir -p build
cd build
cmake \
diff --git a/multimedia/intel-media-sdk/intel-media-sdk.info b/multimedia/intel-media-sdk/intel-media-sdk.info
index 8ac23ebd28..8c2d7f82ad 100644
--- a/multimedia/intel-media-sdk/intel-media-sdk.info
+++ b/multimedia/intel-media-sdk/intel-media-sdk.info
@@ -1,8 +1,8 @@
PRGNAM="intel-media-sdk"
-VERSION="21.3.5"
+VERSION="23.2.2"
HOMEPAGE="https://github.com/Intel-Media-SDK/MediaSDK/"
-DOWNLOAD="https://github.com/Intel-Media-SDK/MediaSDK/archive/intel-mediasdk-21.3.5/MediaSDK-intel-mediasdk-21.3.5.tar.gz"
-MD5SUM="7a71beb6def13ab71348785a8880dd0a"
+DOWNLOAD="https://github.com/Intel-Media-SDK/MediaSDK/archive/intel-mediasdk-23.2.2/MediaSDK-intel-mediasdk-23.2.2.tar.gz"
+MD5SUM="7f348210213fd4a67466b3a20e4b93d7"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
diff --git a/multimedia/kodi/kodi-21.0-gcc14.patch b/multimedia/kodi/kodi-21.0-gcc14.patch
new file mode 100644
index 0000000000..09ffa2f7ae
--- /dev/null
+++ b/multimedia/kodi/kodi-21.0-gcc14.patch
@@ -0,0 +1,11 @@
+diff -Naur xbmc-21.0-Omega.orig/xbmc/platform/posix/filesystem/SMBWSDiscoveryListener.cpp xbmc-21.0-Omega/xbmc/platform/posix/filesystem/SMBWSDiscoveryListener.cpp
+--- xbmc-21.0-Omega.orig/xbmc/platform/posix/filesystem/SMBWSDiscoveryListener.cpp 2024-04-06 04:29:22.000000000 +0200
++++ xbmc-21.0-Omega/xbmc/platform/posix/filesystem/SMBWSDiscoveryListener.cpp 2024-05-16 19:52:18.646667000 +0200
+@@ -17,6 +17,7 @@
+
+ #include "platform/posix/filesystem/SMBWSDiscovery.h"
+
++#include <algorithm>
+ #include <array>
+ #include <chrono>
+ #include <mutex>
diff --git a/multimedia/kodi/kodi.SlackBuild b/multimedia/kodi/kodi.SlackBuild
index 138bd4d8c6..46ed64a7d9 100644
--- a/multimedia/kodi/kodi.SlackBuild
+++ b/multimedia/kodi/kodi.SlackBuild
@@ -29,18 +29,15 @@ PRGNAM=kodi
SRCNAM=xbmc
CODNAM=Omega
VERSION=${VERSION:-21.0}
-BUILD=${BUILD:-1}
+BUILD=${BUILD:-2}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
# Versions used below
crossguidVER=${crossguiVER:-ca1bf4b810e2d188d04cb6286f957008ee1b7681}
-fmtVER=${fmtVER:-9.1.0}
libdvdcssVER=${libdvdcssVER:-1.4.3-Next-Nexus-Alpha2-2}
libdvdnavVER=${libdvdnavVER:-6.1.1-Next-Nexus-Alpha2-2}
libdvdreadVER=${libdvdreadVER:-6.1.3-Next-Nexus-Alpha2-2}
-rapidjsonVER=${rapidjsonVER:-1.1.0}
-spdlogVER=${spdlogVER:-1.10.0}
groovyVER=${groovyVER:-4.0.16}
comLangVER=${comLangVER:-3.14.0}
comTextVER=${comTextVER:-1.11.0}
@@ -88,6 +85,8 @@ find -L . \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+patch -p1 < $CWD/kodi-21.0-gcc14.patch
+
# Autodetection of "optional" dependencies sucks. It does not work and
# compilation will fail on each of these if not explicitly disabled.
# Figured I'd implement my own autodetection instead of requiring
@@ -133,22 +132,18 @@ cp -a $CWD/apache-groovy-binary-$groovyVER.zip \
# Reasons for internal programs
# (so I can remember in the future why we're using them)
-# Internal crossguid & rapidjson is recommended by upstream
+# Internal crossguid is recommended by upstream
+# Internal libdvd{css,nav,read} are required by kodi due to patches
# Internal ffmpeg since 15.0's is too old
-# Internal fmt & spdlog to prevent issues if spdlog was built without
-# optional fmt dependency
cmake \
- -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
- -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS -DNDEBUG" \
+ -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS -DNDEBUG" \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_INSTALL_DOCDIR=/usr/doc/$PRGNAM-$VERSION \
-DAPP_RENDER_SYSTEM=gl \
-DCORE_PLATFORM_NAME="$PLATFORM" \
-DENABLE_INTERNAL_CROSSGUID=ON \
- -DENABLE_INTERNAL_RapidJSON=ON \
- -DENABLE_INTERNAL_FMT=ON \
- -DENABLE_INTERNAL_SPDLOG=ON \
-DENABLE_INTERNAL_FFMPEG=$FFMPEG \
-DENABLE_AIRTUNES=$AIRPLAY \
-DENABLE_AVAHI=$AVAHI \
@@ -160,12 +155,9 @@ cp -a $CWD/apache-groovy-binary-$groovyVER.zip \
-DENABLE_NFS=$NFS \
-DENABLE_UDFREAD=$UDFREAD \
-DCROSSGUID_URL=$CWD/crossguid-$crossguidVER.tar.gz \
- -DFMT_URL=$CWD/fmt-$fmtVER.tar.gz \
-Dlibdvdcss_URL=$CWD/libdvdcss-$libdvdcssVER.tar.gz \
-Dlibdvdnav_URL=$CWD/libdvdnav-$libdvdnavVER.tar.gz \
-Dlibdvdread_URL=$CWD/libdvdread-$libdvdreadVER.tar.gz \
- -DRAPIDJSON_URL=$CWD/rapidjson-$rapidjsonVER.tar.gz \
- -DSPDLOG_URL=$CWD/spdlog-$spdlogVER.tar.gz \
$FFMPEGURL \
-DCMAKE_BUILD_TYPE=Release ../$SRCNAM-$VERSION-$CODNAM
make
diff --git a/multimedia/kodi/kodi.info b/multimedia/kodi/kodi.info
index 8ea284404e..3c712c4197 100644
--- a/multimedia/kodi/kodi.info
+++ b/multimedia/kodi/kodi.info
@@ -6,9 +6,6 @@ DOWNLOAD="https://github.com/xbmc/xbmc/archive/21.0-Omega/xbmc-21.0-Omega.tar.gz
https://github.com/xbmc/libdvdcss/archive/refs/tags/1.4.3-Next-Nexus-Alpha2-2/libdvdcss-1.4.3-Next-Nexus-Alpha2-2.tar.gz \
https://github.com/xbmc/libdvdnav/archive/refs/tags/6.1.1-Next-Nexus-Alpha2-2/libdvdnav-6.1.1-Next-Nexus-Alpha2-2.tar.gz \
https://github.com/xbmc/libdvdread/archive/refs/tags/6.1.3-Next-Nexus-Alpha2-2/libdvdread-6.1.3-Next-Nexus-Alpha2-2.tar.gz \
- https://github.com/fmtlib/fmt/archive/refs/tags/9.1.0/fmt-9.1.0.tar.gz \
- https://github.com/gabime/spdlog/archive/refs/tags/v1.10.0/spdlog-1.10.0.tar.gz \
- https://github.com/miloyip/rapidjson/archive/v1.1.0/rapidjson-1.1.0.tar.gz \
http://mirrors.kodi.tv/build-deps/sources/apache-groovy-binary-4.0.16.zip \
http://mirrors.kodi.tv/build-deps/sources/commons-lang3-3.14.0-bin.tar.gz \
http://mirrors.kodi.tv/build-deps/sources/commons-text-1.11.0-bin.tar.gz \
@@ -18,15 +15,12 @@ MD5SUM="74501a89f0ea23d2908a9b983ab3d6f8 \
42dc3770ae928103e8033a18b007e79d \
2349cde54d950af21fa4936371ad3349 \
0d24c950abfef9dc02e231dda56912ac \
- 21fac48cae8f3b4a5783ae06b443973a \
- effea813cd81cfb5588806c5754e14f1 \
- badd12c511e081fec6c89c43a7027bce \
bd9eb761a11372dd659da8c2cf1ae692 \
88c83b3fa007ae35d4f82a2466cad423 \
ae1f7607159b192e12f9c8eaaaf3d927 \
ab9c27629c2a43689c63ff55fd7cbf67"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
-REQUIRES="zulu-openjdk11 libass flatbuffers tinyxml gtest fmt fstrcmp spdlog tinyxml2 libdisplay-info"
+REQUIRES="zulu-openjdk11 libass flatbuffers tinyxml gtest fstrcmp spdlog tinyxml2 libdisplay-info rapidjson"
MAINTAINER="Jeremy Hansen"
EMAIL="jebrhansen+SBo@gmail.com"
diff --git a/multimedia/obs-studio/0011-Fix-FTBFS-on-32bit-archs.patch b/multimedia/obs-studio/0011-Fix-FTBFS-on-32bit-archs.patch
new file mode 100644
index 0000000000..051aee2c67
--- /dev/null
+++ b/multimedia/obs-studio/0011-Fix-FTBFS-on-32bit-archs.patch
@@ -0,0 +1,43 @@
+From: =?utf-8?q?=22IOhannes_m_zm=C3=B6lnig_=28Debian/GNU=29=22?=
+ <umlaeute@debian.org>
+Date: Tue, 27 Jun 2023 14:06:19 +0200
+Subject: Fix FTBFS on 32bit archs
+
+---
+ libobs-opengl/gl-egl-common.c | 4 +++-
+ libobs/obs.c | 2 +-
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+--- obs-studio.orig/libobs-opengl/gl-egl-common.c
++++ obs-studio/libobs-opengl/gl-egl-common.c
+@@ -368,16 +368,18 @@
+ uint64_t **modifiers,
+ size_t *n_modifiers)
+ {
++ EGLuint64KHR n_modifiers_egl = *n_modifiers;
+ if (!glad_eglQueryDmaBufModifiersEXT) {
+ blog(LOG_ERROR, "Unable to load eglQueryDmaBufModifiersEXT");
+ return false;
+ }
+ if (!query_dmabuf_modifiers(egl_display, drm_format, modifiers,
+- n_modifiers)) {
++ &n_modifiers_egl)) {
+ *n_modifiers = 0;
+ *modifiers = NULL;
+ return false;
+ }
++ *n_modifiers = n_modifiers_egl;
+ return true;
+ }
+
+--- obs-studio.orig/libobs/obs.c
++++ obs-studio/libobs/obs.c
+@@ -885,7 +885,7 @@
+ obs->video.mixes.array[i] = NULL;
+ }
+ if (num_views > 0)
+- blog(LOG_WARNING, "Number of remaining views: %ld", num_views);
++ blog(LOG_WARNING, "Number of remaining views: %ld", (long int)num_views);
+ pthread_mutex_unlock(&obs->video.mixes_mutex);
+
+ pthread_mutex_destroy(&obs->video.mixes_mutex);
diff --git a/multimedia/obs-studio/obs-studio.SlackBuild b/multimedia/obs-studio/obs-studio.SlackBuild
index bcbab1aea3..e098e0cc7b 100644
--- a/multimedia/obs-studio/obs-studio.SlackBuild
+++ b/multimedia/obs-studio/obs-studio.SlackBuild
@@ -3,7 +3,7 @@
# Slackware build script for Open Broadcaster Software
#
# Copyright 2015 Gethyn ThomasQuail <gethyn@bloodbathsoftworks.com>
-# Copyright 2016-2023 Christoph Willing, Brisbane Australia
+# Copyright 2016-2024 Christoph Willing, Sydney Australia
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -77,6 +77,7 @@ tar xvf $CWD/$CEF_ROOT.tar.bz2
cd $CEF_ROOT
strip -v Release/*.so
if [ "$ARCH" = "i686" -o "$ARCH" = "i586" ]; then
+ echo "Making 32bit libcef_dll_wrapper ..."
cmake \
-DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
-DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
@@ -88,6 +89,10 @@ cd $CEF_ROOT
cd $PRGNAM-$COMMIT
sed -i -e '/OBS_VERSION_CANONICAL/ s=^=#=' CMakeLists.txt
+if [ "$ARCH" = "i686" -o "$ARCH" = "i586" ]; then
+ echo "Patching 32bit fix"
+ patch -p1 < $CWD/0011-Fix-FTBFS-on-32bit-archs.patch
+fi
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
@@ -95,6 +100,10 @@ find -L . \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+for i in $CWD/patches/* ; do patch -p1 < $i ; done
+sed -i '/include "browser-app.hpp"/i #include <algorithm>' plugins/obs-browser/browser-app.cpp
+sed -e 's|-Werror-implicit-function-declaration||g' -i cmake/Modules/CompilerConfig.cmake
+sed -e '/-Werror/d' -i cmake/Modules/CompilerConfig.cmake
mkdir -p build
cd build
diff --git a/multimedia/obs-studio/patches/1_7ed9b1f.patch b/multimedia/obs-studio/patches/1_7ed9b1f.patch
new file mode 100644
index 0000000000..438004ea39
--- /dev/null
+++ b/multimedia/obs-studio/patches/1_7ed9b1f.patch
@@ -0,0 +1,43 @@
+From 7ed9b1f3a6b5e73a39daf906c8e8c19e93fce4b4 Mon Sep 17 00:00:00 2001
+From: Stephen Seo <seo.disparate@gmail.com>
+Date: Wed, 29 Nov 2023 22:06:09 +0900
+Subject: [PATCH] deps/media-playback: Use new (nb_)coded_side_data FFmpeg 6.1
+ API
+
+Fixes for using FFmpeg 6.1 due to deprecations. Uses `#if` macros to
+allow builds for using older versions of FFmpeg.
+
+The change in deps/media-playback/media-playback/decode.c is due to
+FFmpeg moving "side_data" into AVCodecParameters which is mentioned in
+commit [1] in FFmpeg's repository.
+
+In summary of the "side_data" change, AVStream.side_data is deprecated
+and replaced with AVStream.codecpar->coded_side_data, and
+AVStream.nb_side_data is replaced with
+AVStream.codecpar->nb_coded_side_data.
+
+[1]: avcodec/codec_par: add side data to AVCodecParameters
+https://github.com/FFmpeg/FFmpeg/commit/21d7cc6fa9a26e94965fa71b25655d07568450fe
+---
+ deps/media-playback/media-playback/decode.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/deps/media-playback/media-playback/decode.c b/deps/media-playback/media-playback/decode.c
+index 55b91c140ace4..40853f171bde7 100644
+--- a/deps/media-playback/media-playback/decode.c
++++ b/deps/media-playback/media-playback/decode.c
+@@ -114,8 +114,14 @@ static uint16_t get_max_luminance(const AVStream *stream)
+ {
+ uint32_t max_luminance = 0;
+
++#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(60, 31, 102)
+ for (int i = 0; i < stream->nb_side_data; i++) {
+ const AVPacketSideData *const sd = &stream->side_data[i];
++#else
++ for (int i = 0; i < stream->codecpar->nb_coded_side_data; i++) {
++ const AVPacketSideData *const sd =
++ &stream->codecpar->coded_side_data[i];
++#endif
+ switch (sd->type) {
+ case AV_PKT_DATA_MASTERING_DISPLAY_METADATA: {
+ const AVMasteringDisplayMetadata *mastering =
diff --git a/multimedia/obs-studio/patches/2_92fc9f6.patch b/multimedia/obs-studio/patches/2_92fc9f6.patch
new file mode 100644
index 0000000000..db0221d0a9
--- /dev/null
+++ b/multimedia/obs-studio/patches/2_92fc9f6.patch
@@ -0,0 +1,43 @@
+From 92fc9f69ccff2cb12bb8ef877e9238f5d46588a8 Mon Sep 17 00:00:00 2001
+From: Stephen Seo <seo.disparate@gmail.com>
+Date: Wed, 29 Nov 2023 22:08:42 +0900
+Subject: [PATCH] deps/media-playback: In check for key-frame, use new FFmpeg
+ 6.1 API
+
+Fixes for using FFmpeg 6.1 due to deprecations. Uses `#if` macros to
+allow builds for using older versions of FFmpeg.
+
+AVFrame.key_frame was replaced with a flag in AVFrame.flags. The commit
+adding the flag is [1] in FFmpeg's repository, and the deprecation is in
+commit [2].
+
+In summary of the "key_frame" change, AVFrame.key_frame is deprecated,
+and AVFrame.flags indicates with a bit flag if it is a key frame (with
+the enum/defined AV_FRAME_FLAG_KEY).
+
+[1]: avutil/frame: add a keyframe flag to AVFrame
+https://github.com/FFmpeg/FFmpeg/commit/cc11191fda0471017b03c1434d6d8cb79f6914e5
+
+[2]: avutil/frame: deprecate key_frame
+https://github.com/FFmpeg/FFmpeg/commit/3e06f6f04020bef32fa42bc9d7f96e76a46453aa
+---
+ deps/media-playback/media-playback/media.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/deps/media-playback/media-playback/media.c b/deps/media-playback/media-playback/media.c
+index 566eb9e35c9ef..07b040dd8235c 100644
+--- a/deps/media-playback/media-playback/media.c
++++ b/deps/media-playback/media-playback/media.c
+@@ -504,7 +504,12 @@ void mp_media_next_video(mp_media_t *m, bool preload)
+ }
+
+ if (!m->is_local_file && !d->got_first_keyframe) {
++
++#if LIBAVUTIL_VERSION_INT < AV_VERSION_INT(58, 29, 100)
+ if (!f->key_frame)
++#else
++ if (!(f->flags & AV_FRAME_FLAG_KEY))
++#endif
+ return;
+
+ d->got_first_keyframe = true;
diff --git a/multimedia/obs-studio/patches/3_ed1e079.patch b/multimedia/obs-studio/patches/3_ed1e079.patch
new file mode 100644
index 0000000000..d1e435ca9d
--- /dev/null
+++ b/multimedia/obs-studio/patches/3_ed1e079.patch
@@ -0,0 +1,39 @@
+From ed1e0795acde8349ab18b631c545f56e5a3acb9d Mon Sep 17 00:00:00 2001
+From: Stephen Seo <seo.disparate@gmail.com>
+Date: Wed, 29 Nov 2023 20:07:10 +0900
+Subject: [PATCH] libobs: Fence off unnecessary code due to FFmpeg v6.1 changes
+
+Fixes for using FFmpeg 6.1 due to deprecations. Uses `#if` macros to
+allow builds for using older versions of FFmpeg.
+
+This commit prevents obs from using the "fenced" code if using FFmpeg
+6.1, since in FFmpeg commit [1] the "side_data" is added to
+`AVCodecParameters`, and therefore the existing/following
+`avcodec_parameters_copy(...)` will account for the metadata.
+
+[1]: avcodec/codec_par: add side data to AVCodecParameters
+https://github.com/FFmpeg/FFmpeg/commit/21d7cc6fa9a26e94965fa71b25655d07568450fe
+---
+ libobs/media-io/media-remux.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/libobs/media-io/media-remux.c b/libobs/media-io/media-remux.c
+index 7d5eead200012..827d4e59b18ed 100644
+--- a/libobs/media-io/media-remux.c
++++ b/libobs/media-io/media-remux.c
+@@ -91,6 +91,7 @@ static inline bool init_output(media_remux_job_t job, const char *out_filename)
+ return false;
+ }
+
++#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(60, 31, 102)
+ #if FF_API_BUFFER_SIZE_T
+ int content_size;
+ #else
+@@ -125,6 +126,7 @@ static inline bool init_output(media_remux_job_t job, const char *out_filename)
+ mastering_size);
+ }
+ }
++#endif
+
+ ret = avcodec_parameters_copy(out_stream->codecpar,
+ in_stream->codecpar);
diff --git a/multimedia/obs-studio/patches/4_6d0381f.patch b/multimedia/obs-studio/patches/4_6d0381f.patch
new file mode 100644
index 0000000000..a386f53a3b
--- /dev/null
+++ b/multimedia/obs-studio/patches/4_6d0381f.patch
@@ -0,0 +1,157 @@
+From 6d0381f98ce0a5624901b0042d624ea972a10c2b Mon Sep 17 00:00:00 2001
+From: Stephen Seo <seo.disparate@gmail.com>
+Date: Wed, 29 Nov 2023 20:09:08 +0900
+Subject: [PATCH] obs-ffmpeg: Use new side-data FFmpeg 6.1 API
+
+Fixes for using FFmpeg 6.1 due to deprecations. Uses `#if` macros to
+allow builds for using older versions of FFmpeg.
+
+This commit replaces usage of `av_stream_add_side_data(...)` with
+`av_packet_side_data_add(...)`, as the former was deprecated in favor of
+the latter.
+
+The FFmpeg commit that deprecated `av_stream_add_side_data(...)` is [1].
+
+The FFmpeg commit that introduced `av_packet_side_data_add(...)` is [2].
+
+Note that the deprecation commit is after the new API function. The
+commit in between [3] appears to be changes that migrates to the usage
+of the new API function.
+
+[1]: avformat/avformat: use the side data from AVStream.codecpar
+https://github.com/FFmpeg/FFmpeg/commit/5432d2aacad5fa7420fe2d9369ed061d521e92d6
+
+[2]: avcodec/packet: add generic side data helpers
+https://github.com/FFmpeg/FFmpeg/commit/74279227dd28d01b447edb8e617a545982171c2c
+
+[3]: avcodec/codec_par: add side data to AVCodecParameters
+https://github.com/FFmpeg/FFmpeg/commit/21d7cc6fa9a26e94965fa71b25655d07568450fe
+---
+ plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c | 16 ++++++++++++++++
+ plugins/obs-ffmpeg/obs-ffmpeg-mpegts.c | 16 ++++++++++++++++
+ plugins/obs-ffmpeg/obs-ffmpeg-output.c | 16 ++++++++++++++++
+ 3 files changed, 48 insertions(+)
+
+diff --git a/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c b/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c
+index 740b60e5bf46e..8fb84aa7c4e0b 100644
+--- a/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c
++++ b/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c
+@@ -498,9 +498,17 @@ static void create_video_stream(struct ffmpeg_mux *ffm)
+ av_content_light_metadata_alloc(&content_size);
+ content->MaxCLL = max_luminance;
+ content->MaxFALL = max_luminance;
++#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(60, 31, 102)
+ av_stream_add_side_data(ffm->video_stream,
+ AV_PKT_DATA_CONTENT_LIGHT_LEVEL,
+ (uint8_t *)content, content_size);
++#else
++ av_packet_side_data_add(
++ &ffm->video_stream->codecpar->coded_side_data,
++ &ffm->video_stream->codecpar->nb_coded_side_data,
++ AV_PKT_DATA_CONTENT_LIGHT_LEVEL, (uint8_t *)content,
++ content_size, 0);
++#endif
+
+ AVMasteringDisplayMetadata *const mastering =
+ av_mastering_display_metadata_alloc();
+@@ -516,10 +524,18 @@ static void create_video_stream(struct ffmpeg_mux *ffm)
+ mastering->max_luminance = av_make_q(max_luminance, 1);
+ mastering->has_primaries = 1;
+ mastering->has_luminance = 1;
++#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(60, 31, 102)
+ av_stream_add_side_data(ffm->video_stream,
+ AV_PKT_DATA_MASTERING_DISPLAY_METADATA,
+ (uint8_t *)mastering,
+ sizeof(*mastering));
++#else
++ av_packet_side_data_add(
++ &ffm->video_stream->codecpar->coded_side_data,
++ &ffm->video_stream->codecpar->nb_coded_side_data,
++ AV_PKT_DATA_MASTERING_DISPLAY_METADATA,
++ (uint8_t *)mastering, sizeof(*mastering), 0);
++#endif
+ }
+
+ if (ffm->output->oformat->flags & AVFMT_GLOBALHEADER)
+diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-mpegts.c b/plugins/obs-ffmpeg/obs-ffmpeg-mpegts.c
+index f33ee77365274..a56dd91bcc38e 100644
+--- a/plugins/obs-ffmpeg/obs-ffmpeg-mpegts.c
++++ b/plugins/obs-ffmpeg/obs-ffmpeg-mpegts.c
+@@ -168,9 +168,17 @@ static bool create_video_stream(struct ffmpeg_output *stream,
+ av_content_light_metadata_alloc(&content_size);
+ content->MaxCLL = hdr_nominal_peak_level;
+ content->MaxFALL = hdr_nominal_peak_level;
++#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(60, 31, 102)
+ av_stream_add_side_data(data->video,
+ AV_PKT_DATA_CONTENT_LIGHT_LEVEL,
+ (uint8_t *)content, content_size);
++#else
++ av_packet_side_data_add(
++ &data->video->codecpar->coded_side_data,
++ &data->video->codecpar->nb_coded_side_data,
++ AV_PKT_DATA_CONTENT_LIGHT_LEVEL, (uint8_t *)content,
++ content_size, 0);
++#endif
+
+ AVMasteringDisplayMetadata *const mastering =
+ av_mastering_display_metadata_alloc();
+@@ -186,10 +194,18 @@ static bool create_video_stream(struct ffmpeg_output *stream,
+ mastering->max_luminance = av_make_q(hdr_nominal_peak_level, 1);
+ mastering->has_primaries = 1;
+ mastering->has_luminance = 1;
++#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(60, 31, 102)
+ av_stream_add_side_data(data->video,
+ AV_PKT_DATA_MASTERING_DISPLAY_METADATA,
+ (uint8_t *)mastering,
+ sizeof(*mastering));
++#else
++ av_packet_side_data_add(
++ &data->video->codecpar->coded_side_data,
++ &data->video->codecpar->nb_coded_side_data,
++ AV_PKT_DATA_MASTERING_DISPLAY_METADATA,
++ (uint8_t *)mastering, sizeof(*mastering), 0);
++#endif
+ }
+ context = avcodec_alloc_context3(NULL);
+ context->codec_type = codec->type;
+diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-output.c b/plugins/obs-ffmpeg/obs-ffmpeg-output.c
+index ec02b59cda9d8..c7786153392e5 100644
+--- a/plugins/obs-ffmpeg/obs-ffmpeg-output.c
++++ b/plugins/obs-ffmpeg/obs-ffmpeg-output.c
+@@ -213,9 +213,17 @@ static bool create_video_stream(struct ffmpeg_data *data)
+ av_content_light_metadata_alloc(&content_size);
+ content->MaxCLL = hdr_nominal_peak_level;
+ content->MaxFALL = hdr_nominal_peak_level;
++#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(60, 31, 102)
+ av_stream_add_side_data(data->video,
+ AV_PKT_DATA_CONTENT_LIGHT_LEVEL,
+ (uint8_t *)content, content_size);
++#else
++ av_packet_side_data_add(
++ &data->video->codecpar->coded_side_data,
++ &data->video->codecpar->nb_coded_side_data,
++ AV_PKT_DATA_CONTENT_LIGHT_LEVEL, (uint8_t *)content,
++ content_size, 0);
++#endif
+
+ AVMasteringDisplayMetadata *const mastering =
+ av_mastering_display_metadata_alloc();
+@@ -231,10 +239,18 @@ static bool create_video_stream(struct ffmpeg_data *data)
+ mastering->max_luminance = av_make_q(hdr_nominal_peak_level, 1);
+ mastering->has_primaries = 1;
+ mastering->has_luminance = 1;
++#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(60, 31, 102)
+ av_stream_add_side_data(data->video,
+ AV_PKT_DATA_MASTERING_DISPLAY_METADATA,
+ (uint8_t *)mastering,
+ sizeof(*mastering));
++#else
++ av_packet_side_data_add(
++ &data->video->codecpar->coded_side_data,
++ &data->video->codecpar->nb_coded_side_data,
++ AV_PKT_DATA_MASTERING_DISPLAY_METADATA,
++ (uint8_t *)mastering, sizeof(*mastering), 0);
++#endif
+ }
+
+ closest_format = data->config.format;
diff --git a/multimedia/opera-ffmpeg-codecs/opera-ffmpeg-codecs.SlackBuild b/multimedia/opera-ffmpeg-codecs/opera-ffmpeg-codecs.SlackBuild
index 602f041145..5287e97433 100644
--- a/multimedia/opera-ffmpeg-codecs/opera-ffmpeg-codecs.SlackBuild
+++ b/multimedia/opera-ffmpeg-codecs/opera-ffmpeg-codecs.SlackBuild
@@ -26,7 +26,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM="opera-ffmpeg-codecs"
-VERSION=${VERSION:-0.86.0}
+VERSION=${VERSION:-0.87.0}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
diff --git a/multimedia/opera-ffmpeg-codecs/opera-ffmpeg-codecs.info b/multimedia/opera-ffmpeg-codecs/opera-ffmpeg-codecs.info
index 97163893e5..a88d0c6938 100644
--- a/multimedia/opera-ffmpeg-codecs/opera-ffmpeg-codecs.info
+++ b/multimedia/opera-ffmpeg-codecs/opera-ffmpeg-codecs.info
@@ -1,10 +1,10 @@
PRGNAM="opera-ffmpeg-codecs"
-VERSION="0.86.0"
+VERSION="0.87.0"
HOMEPAGE="https://github.com/iteufel/nwjs-ffmpeg-prebuilt"
DOWNLOAD="UNSUPPORTED"
MD5SUM=""
-DOWNLOAD_x86_64="https://github.com/nwjs-ffmpeg-prebuilt/nwjs-ffmpeg-prebuilt/releases/download/0.86.0/0.86.0-linux-x64.zip"
-MD5SUM_x86_64="caa6cc0b6858a0fdf54caebdcf458d5c"
+DOWNLOAD_x86_64="https://github.com/nwjs-ffmpeg-prebuilt/nwjs-ffmpeg-prebuilt/releases/download/0.87.0/0.87.0-linux-x64.zip"
+MD5SUM_x86_64="0c5e09b0b5c92db45381191f96e656fe"
REQUIRES="opera"
MAINTAINER="Dimitris Zlatanidis"
EMAIL="dslackw@gmail.com"
diff --git a/multimedia/sfnt2woff/sfnt2woff.SlackBuild b/multimedia/sfnt2woff/sfnt2woff.SlackBuild
index a20ab3a34d..b357def98c 100644
--- a/multimedia/sfnt2woff/sfnt2woff.SlackBuild
+++ b/multimedia/sfnt2woff/sfnt2woff.SlackBuild
@@ -26,6 +26,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=sfnt2woff
+SRCNAM=woff-tools
VERSION=${VERSION:-2009.10.03}
SRCVER=20091003
BUILD=${BUILD:-1}
@@ -40,9 +41,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -67,9 +65,9 @@ set -e
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
-rm -rf $PRGNAM-$SRCVER
-tar xvf $CWD/$PRGNAM-$SRCVER.tar.gz
-cd $PRGNAM-$SRCVER
+rm -rf $SRCNAM-$SRCVER
+tar xvf $CWD/$SRCNAM-$SRCVER.tar.gz
+cd $SRCNAM-$SRCVER
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
@@ -80,13 +78,13 @@ find -L . \
# Ain't really much to the build process
CC="cc $SLCKFLAGS" make
-find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
- | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
-
# There's no "make install", but we can do that ourselves.
mkdir -p $PKG/usr/bin
cp -a sfnt2woff woff2sfnt $PKG/usr/bin
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
diff --git a/multimedia/sfnt2woff/sfnt2woff.info b/multimedia/sfnt2woff/sfnt2woff.info
index f687f5ca67..1c9e706aeb 100644
--- a/multimedia/sfnt2woff/sfnt2woff.info
+++ b/multimedia/sfnt2woff/sfnt2woff.info
@@ -1,8 +1,8 @@
PRGNAM="sfnt2woff"
VERSION="2009.10.03"
-HOMEPAGE="https://github.com/wget/sfnt2woff"
-DOWNLOAD="https://github.com/wget/sfnt2woff/archive/20091003/sfnt2woff-20091003.tar.gz"
-MD5SUM="38f57b8a1925314ca918280c7536701e"
+HOMEPAGE="https://github.com/wget/woff-tools"
+DOWNLOAD="https://github.com/wget/woff-tools/archive/20091003/woff-tools-20091003.tar.gz"
+MD5SUM="eca28571c45eb412099bb57a0b83ce5e"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
diff --git a/multimedia/shine/fix-bugs.patch b/multimedia/shine/fix-bugs.patch
deleted file mode 100644
index 8e97a12bce..0000000000
--- a/multimedia/shine/fix-bugs.patch
+++ /dev/null
@@ -1,12394 +0,0 @@
-diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
-new file mode 100644
-index 0000000..500a5f6
---- /dev/null
-+++ b/.github/workflows/ci.yml
-@@ -0,0 +1,73 @@
-+name: Build and install
-+
-+on:
-+ push:
-+ branches: [ "main" ]
-+ pull_request:
-+
-+concurrency:
-+ group: ${{ github.workflow }}-${{ github.ref }}
-+ cancel-in-progress: true
-+
-+jobs:
-+ build:
-+ runs-on: ${{ matrix.os }}
-+ strategy:
-+ fail-fast: false
-+ matrix:
-+ os: [macos-latest, ubuntu-latest]
-+ steps:
-+ - uses: actions/checkout@v3
-+ - name: Install required packages on macos
-+ if: matrix.os == 'macos-latest'
-+ run: brew install autoconf automake pkg-config
-+ - name: Install required packages on ubuntu
-+ if: matrix.os == 'ubuntu-latest'
-+ run: sudo apt-get -y install automake autoconf pkg-config
-+ - name: bootstrap
-+ run: ./bootstrap
-+ - name: configure
-+ run: ./configure
-+ - name: make
-+ run: make
-+ - name: make install on macos
-+ if: matrix.os == 'macos-latest'
-+ run: make install
-+ - name: make install on ubuntu
-+ if: matrix.os == 'ubuntu-latest'
-+ run: sudo make install
-+ - name: Test pkg-config setup
-+ run: pkg-config --libs shine
-+
-+ android_build:
-+ runs-on: ubuntu-latest
-+ steps:
-+ - uses: actions/checkout@v3
-+ - uses: nttld/setup-ndk@v1
-+ with:
-+ ndk-version: r25b
-+ local-cache: true
-+ - name: Install autoconf/automake
-+ run: sudo apt-get -y install automake autoconf
-+ - name: bootstrap
-+ run: ./bootstrap
-+ - name: configure
-+ run: ./configure
-+ - name: make android
-+ run: make android
-+
-+ js_build:
-+ runs-on: ubuntu-latest
-+ steps:
-+ - uses: actions/checkout@v3
-+ - uses: mymindstorm/setup-emsdk@v11
-+ - name: JS build
-+ run: |
-+ cd js
-+ make
-+ - uses: actions/setup-node@v3
-+ - name: Run node test
-+ run: |
-+ cd js/test/node
-+ npm install
-+ npm run test
-diff --git a/.gitignore b/.gitignore
-index aa76abe..ffdd74d 100644
---- a/.gitignore
-+++ b/.gitignore
-@@ -2,9 +2,9 @@
- obj
- libs
- compile
--android/lib
--android/include
--android/bin
-+android/
-+js/src/post-node.js
-+!android/*.mk
- shine
- shine.pc
- m4
-@@ -82,6 +82,6 @@ src/lib/reservoir.o
- src/lib/tables.lo
- src/lib/tables.o
- shine-*.tar.gz
--*.bc
-+*.o
- *.mp3
- node_modules
-diff --git a/ChangeLog b/ChangeLog
-index 122dae5..0713282 100644
---- a/ChangeLog
-+++ b/ChangeLog
-@@ -1,3 +1,8 @@
-+x.y.z ()
-+=====
-+* Be more specific when enabling MIPS assembly routines.
-+* Fix wave header reading on big endian machines (#34)
-+
- 3.1.1 (2017-07-28)
- =====
- * Remove invalid MPEG 2.5 bitrates.
-diff --git a/Makefile.am b/Makefile.am
-index bebf32d..538256c 100644
---- a/Makefile.am
-+++ b/Makefile.am
-@@ -26,14 +26,14 @@ pkgconfigdir = $(libdir)/pkgconfig
- pkgconfig_DATA = shine.pc
-
- android:
-- [ -d android/bin ] || mkdir android/bin
- [ -d android/include ] || mkdir android/include
-- [ -d android/lib ] || mkdir android/lib
-- NDK_PROJECT_PATH=$(shell pwd) ndk-build APP_BUILD_SCRIPT=$(shell pwd)/android/Library.mk
-- cp libs/armeabi/libshine.so android/lib
-+ [ -d android/lib ] || mkdir android/lib
-+ [ -d android/bin ] || mkdir android/bin
- cp src/lib/layer3.h android/include
-+ NDK_PROJECT_PATH=$(shell pwd) ndk-build APP_BUILD_SCRIPT=$(shell pwd)/android/Library.mk
-+ mv libs/* android/lib
- NDK_PROJECT_PATH=$(shell pwd) ndk-build APP_BUILD_SCRIPT=$(shell pwd)/android/Binary.mk
-- cp libs/armeabi/shineenc android/bin
-+ mv libs/* android/bin
-
- clean-local:
- -rm -rf obj libs android/lib android/bin android/include
-diff --git a/README.md b/README.md
-index 1d30cbd..e9b781a 100644
---- a/README.md
-+++ b/README.md
-@@ -2,15 +2,15 @@ Shine: fast fixed-point mp3 encoding
- ====================================
-
- [shine](https://github.com/savonet/shine) is a blazing fast mp3 encoding library implemented in
--fixed-point arithmetic. The library can thus be used to performe super fast mp3 encoding on architectures
--without a FPU, such as `armel`, etc.. It is also, however, also super fast on architectures with a FPU!
-+fixed-point arithmetic. The library can thus be used to perform super fast mp3 encoding on architectures
-+without a FPU, such as `armel`, etc.. It is also super fast on architectures with a FPU!
-
- How to use?
- -----------
-
- The encoding API should be quite straight forward:
-
--```
-+```c
- #include <shine/layer3.h>
-
- (...)
-@@ -42,46 +42,47 @@ shine_close(s);
- How fast is it?
- ---------------
-
--On a [Raspberry Pi](http://www.raspberrypi.org/) (`ARM`, `FPU`):
-+On a macbook pro (`arm64`/M1 pro, `FPU`, December 30, 2022):
-
--Lame, `3m06s`, `1.8x` realtime:
--```
--pi@raspberrypi ~ $ lame bla.wav bla.mp3
--LAME 3.99.5 32bits (http://lame.sf.net)
-+Lame, `88.7x` realtime:
-+```bash
-+LAME 3.100 64bits (http://lame.sf.net)
- Using polyphase lowpass filter, transition band: 16538 Hz - 17071 Hz
--Encoding bla.wav to bla.mp3
-+Encoding /tmp/decoded.wav to /tmp/lame.mp3
- Encoding as 44.1 kHz j-stereo MPEG-1 Layer III (11x) 128 kbps qval=3
- Frame | CPU time/estim | REAL time/estim | play/CPU | ETA
-- 12987/12987 (100%)| 3:06/ 3:06| 3:06/ 3:06| 1.8216x| 0:00
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-+ 12203/12203 (100%)| 0:03/ 0:03| 0:04/ 0:04| 88.773x| 0:00
-+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- kbps LR MS % long switch short %
-- 128.0 0.1 99.9 89.1 6.1 4.9
-+ 128.0 32.6 67.4 96.4 1.9 1.7
- Writing LAME Tag...done
--ReplayGain: -10.5dB
-+ReplayGain: -9.3dB
-+lame -b 128 /tmp/decoded.wav /tmp/lame.mp3 3.55s user 0.05s system 99% cpu 3.609 total
- ```
-
--Shine, `1m35s`, `3.6x` realtime:
-+Shine, `318.0x` realtime:
- ```
--pi@raspberrypi ~ $ shineenc bla.wav bla.mp3
- shineenc (Liquidsoap version)
--WAVE PCM Data, stereo 44100Hz 16bit, duration: 00:05:39
-+WAVE PCM Data, stereo 44100Hz 16bit, duration: 00:05:18
- MPEG-I layer III, stereo Psychoacoustic Model: Shine
- Bitrate: 128 kbps De-emphasis: none Original
--Encoding "bla.wav" to "bla.mp3"
--Finished in 00:01:35 (3.6x realtime)
-+Encoding "/tmp/bla.wav" to "/tmp/shine.mp3"
-+Finished in 00:00:01 (318.0x realtime)
- ```
-
--Now, on a mac airbook (`x86_64`, `FPU`):
-+### ⚠ The following are outdated tests ⚠
-
--Lame, `15s`, `22x` realtime:
--```
--toots@zulu tmp % lame bla.wav bla.mp3
--LAME 3.99.5 64bits (http://lame.sf.net)
-+On a [Raspberry Pi](http://www.raspberrypi.org/) (`ARM`, `FPU`):
-+
-+Lame, `1.8x` realtime:
-+```bash
-+pi@raspberrypi ~ $ lame bla.wav bla.mp3
-+LAME 3.99.5 32bits (http://lame.sf.net)
- Using polyphase lowpass filter, transition band: 16538 Hz - 17071 Hz
- Encoding bla.wav to bla.mp3
- Encoding as 44.1 kHz j-stereo MPEG-1 Layer III (11x) 128 kbps qval=3
- Frame | CPU time/estim | REAL time/estim | play/CPU | ETA
-- 12987/12987 (100%)| 0:15/ 0:15| 0:17/ 0:17| 22.087x| 0:00
-+ 12987/12987 (100%)| 3:06/ 3:06| 3:06/ 3:06| 1.8216x| 0:00
- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- kbps LR MS % long switch short %
- 128.0 0.1 99.9 89.1 6.1 4.9
-@@ -89,20 +90,21 @@ Writing LAME Tag...done
- ReplayGain: -10.5dB
- ```
-
--Shine, `9s`, `37.7x` realtime:
--```
-+Shine, `3.6x` realtime:
-+```bash
-+pi@raspberrypi ~ $ shineenc bla.wav bla.mp3
- shineenc (Liquidsoap version)
- WAVE PCM Data, stereo 44100Hz 16bit, duration: 00:05:39
- MPEG-I layer III, stereo Psychoacoustic Model: Shine
- Bitrate: 128 kbps De-emphasis: none Original
--Encoding "/tmp/bla.wav" to "/tmp/bla.mp3"
--Finished in 00:00:09 (37.7x realtime)
-+Encoding "bla.wav" to "bla.mp3"
-+Finished in 00:01:35 (3.6x realtime)
- ```
-
- On a Google Nexus 5 (`ARM`, `FPU`):
-
- Shine, `14s`, `24.2x` realtime:
--```
-+```bash
- u0_a65@hammerhead:/mnt/sdcard $ shineenc bla.wav bla.mp3
- shineenc (Liquidsoap version)
- WAVE PCM Data, stereo 44100Hz 16bit, duration: 00:05:39
-@@ -128,7 +130,7 @@ A bit of history
- This code was dug out from the dusty crates of those times before internet
- and github. It apparently was created by Gabriel Bouvigne sometime around
- the end of the 20th century. The encoder was converted circa 2001 by Pete
--Everett to fixed-point arithmetic for the RISC OS. Latest we know, Patrick
-+Everett to fixed-point arithmetic for the RISC OS. Last we know, Patrick
- Roberts had worked on the code to make it multi-platform and more library
- oriented. That was around 2006.
-
-diff --git a/configure.ac b/configure.ac
-index 87a5f68..6d6cb23 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -1,6 +1,7 @@
--AC_INIT([shine],[3.1.0],[savonet-users@lists.sourceforge.net])
-+AC_INIT([shine],[3.1.1],[toots@rastageeks.org])
- AM_INIT_AUTOMAKE([subdir-objects])
- LT_INIT
- AC_CONFIG_MACRO_DIR([m4])
- AC_C_BIGENDIAN([CFLAGS="$CFLAGS -DSHINE_BIG_ENDIAN"])
-+AC_CHECK_HEADER([byteswap.h],[CFLAGS="$CFLAGS -DSHINE_HAVE_BSWAP_H"])
- AC_OUTPUT([Makefile shine.pc])
-diff --git a/js/.npmignore b/js/.npmignore
-new file mode 100644
-index 0000000..f1b84a5
---- /dev/null
-+++ b/js/.npmignore
-@@ -0,0 +1,4 @@
-+test/
-+src/
-+Makefile
-+.*
-diff --git a/js/.prettierignore b/js/.prettierignore
-new file mode 100644
-index 0000000..1b64941
---- /dev/null
-+++ b/js/.prettierignore
-@@ -0,0 +1,5 @@
-+.next/
-+dist/
-+stubs/
-+public/audio
-+__ENV.js
-diff --git a/js/.prettierrc b/js/.prettierrc
-new file mode 100644
-index 0000000..a995c49
---- /dev/null
-+++ b/js/.prettierrc
-@@ -0,0 +1,12 @@
-+{
-+ "singleQuote": false,
-+ "quoteProps": "as-needed",
-+ "arrowParens": "avoid",
-+ "tabWidth": 2,
-+ "trailingComma": "es5",
-+ "semi": true,
-+ "jsxSingleQuote": true,
-+ "bracketSameLine": false,
-+ "printWidth": 120,
-+ "parser": "typescript"
-+}
-diff --git a/js/Makefile b/js/Makefile
-index 465ffde..3781b6e 100644
---- a/js/Makefile
-+++ b/js/Makefile
-@@ -1,24 +1,37 @@
- # Emscriptem compilation
-
- EMCC:=emcc
--EXPORTED_FUNCTIONS:='["_shine_check_config", "_shine_js_init",\
-+EXPORTED_FUNCTIONS:='["_malloc", "_free", "_shine_check_config", "_shine_js_init",\
-+ "_shine_js_int16_len", "_shine_js_ptr_len", \
- "_shine_samples_per_pass", "_shine_encode_buffer",\
-- "_shine_flush", "_shine_close"]'
-+ "_shine_flush", "_shine_close"]'
- CFLAGS:=-O3
--LINKFLAGS:=-s EXPORTED_FUNCTIONS=$(EXPORTED_FUNCTIONS) --memory-init-file 0 $(CFLAGS)
-+LINKFLAGS:=-s EXPORTED_FUNCTIONS=$(EXPORTED_FUNCTIONS) -s SINGLE_FILE=1 -s EXPORTED_RUNTIME_METHODS=setValue,getValue --memory-init-file 0 $(CFLAGS)
-+WEB_LINKFLAGS:=$(LINKFLAGS) -s ENVIRONMENT='web' -s EXPORT_NAME='createModule' -s USE_ES6_IMPORT_META=0
-
- C_FILES:=$(wildcard ../src/lib/*.c) src/wrapper.c
- HEADER_FILES:=$(wildcard ../src/lib/*.h)
- SOURCES:=$(C_FILES) $(HEADER_FILES)
--OBJECTS:=$(C_FILES:%.c=%.bc)
-+OBJECTS:=$(C_FILES:%.c=%.o)
-
--all: dist/libshine.js
-+all: dist/libshine_node.js dist/libshine_browser.js
-
--dist/libshine.js: $(SOURCES) $(OBJECTS) src/pre.js src/post.js
-- $(EMCC) $(LINKFLAGS) --pre-js src/pre.js --post-js src/post.js $(OBJECTS) -o $@
-+src/post-node.js: src/libshine_class.js src/libshine_node_wrapper.js
-+ rm -f src/post-node.js
-+ cat src/libshine_class.js src/libshine_node_wrapper.js > src/post-node.js
-
--%.bc: %.c
-+dist/libshine_node.js: $(SOURCES) $(OBJECTS) src/post-node.js
-+ $(EMCC) $(LINKFLAGS) --post-js src/post-node.js $(OBJECTS) -o dist/libshine_node.js
-+
-+dist/libshine_browser_stubs.js: $(SOURCES) $(OBJECTS)
-+ $(EMCC) $(WEB_LINKFLAGS) $(OBJECTS) -o dist/libshine_browser_stubs.mjs
-+ mv dist/libshine_browser_stubs.mjs dist/libshine_browser_stubs.js
-+
-+dist/libshine_browser.js: src/libshine_class.js src/libshine_browser_wrapper.js dist/libshine_browser_stubs.js
-+ cat src/libshine_class.js src/libshine_browser_wrapper.js > dist/libshine_browser.js
-+
-+%.o: %.c
- $(EMCC) $(CFLAGS) -I../src/lib -c $< -o $@
-
- clean:
-- rm -f *.bc ../src/lib/*.bc
-+ rm -rf *.o ../src/lib/*.o dist/libshine*js
-diff --git a/js/README.md b/js/README.md
-index 49ca3f6..d521d4b 100644
---- a/js/README.md
-+++ b/js/README.md
-@@ -1,112 +1,156 @@
- Shine encoder library for Javascript
- ====================================
-
--This directory contains a build of shine for Javascript using
--[kripken/emscripten](https://github.com/kripken/emscripten) and
--located in `dist/libshine.js`
-+This package contains a build of the [shine](https://github.com/toots/shine) fixed-point
-+mp3 encoder compiled for Javascript and wasm using [emscripten-core/emscripten](https://github.com/emscripten-core/emscripten).
-+
-+Install
-+-------
-+
-+Using `npm`:
-+
-+```shell
-+npm install @toots/shine.js
-+```
-+
-+Using `yarn`:
-+
-+```shell
-+yarn add @toots/shine.js
-+```
-+
-+Using `pnpm`:
-+
-+```shell
-+pnpm install @toots/shine.js
-+```
-+
-+In a HTML page:
-+
-+When using `webpack`, the package should point to the correct
-+`libshine_browser.js` file automatically.
-+
-+When using directly as a script, you can load the `libshine_node.js`
-+file as:
-+
-+```html
-+<script src="libshine_node.js"></script>
-+```
-+
-+See: [test/browser](https://github.com/toots/shine/tree/main/js/test/browser) for an example.
-
- How to use?
- -----------
-
- The encoding API should be quite straight forward:
-
--```
--shine = new Shine({
-- samplerate: 44100,
-- bitrate: 128,
-- channels: 2,
-- mode: Shine.STEREO
--});
-+```js
-+import { Shine, StereoModel } from "@toots/shine.js";
-+
-+const exec = async () => {
-+ await Shine.initialized;
-+
-+ shine = new Shine({
-+ samplerate: 44100,
-+ bitrate: 128,
-+ channels: 2,
-+ stereoModel: StereoModel.STEREO
-+ });
-
--// All the magic happens here
--while (..) {
-- // data here is an array of channels.
-- // Channels must have the same number of samples
-- // and both be either Int16Array or Float32Array.
-- encoded = shine.encode(data);
-+ // All the magic happens here
-+ while (..) {
-+ // data here is an array of channels.
-+ // Channels must have the same number of samples
-+ // and both be either Int16Array or Float32Array.
-+ encoded = shine.encode(data);
-+ ...
-+ }
-+
-+ // Close and get remaining data.
-+ flushed = shine.close();
-+
- ...
- }
-
--// Close and get remaining data.
--flushed = shine.close();
--...
-+exec();
- ```
-
- How fast is it?
- ---------------
-
--You can run the test suite located in `test/`. As of now (26/07/2014), only firefox
--and seems to show performances decent enough for real-time encoding while Google Chrome
--can encode between 1X and 2X.
-+You can run the test suite located in `test/`. Encoding rate above `1X` means that
-+the browser should be suitable for real-time encoding.
-+
-+Results, as of December 30, 2022:
-
--Chrome:
-+Chrome (`108.0.5359.124`):
- ```
- Executing encoding test
- Got WAV file.
- Encoding..
- Done encoding.
- File duration: 5.57 seconds
--Encoding time: 5.18 seconds
--Encoding rate: 1.08X
-+Encoding time: 0.08 seconds
-+Encoding rate: 67.96X
-
- Executing rounds test
- Encoding 50 buffers of 4096 samples
- Done encoding
- Total duration: 4.64
--Encoding time: 2.73
--Encoding rate: 1.70X
-+Encoding time: 0.03
-+Encoding rate: 160.00X
- ```
-
--Firefox:
-+Firefox (`108.0.1`):
- ```
- Executing encoding test
- Got WAV file.
- Encoding..
- Done encoding.
- File duration: 5.57 seconds
--Encoding time: 1.48 seconds
--Encoding rate: 3.76X
-+Encoding time: 0.06 seconds
-+Encoding rate: 99.52X
-
- Executing rounds test
- Encoding 50 buffers of 4096 samples
- Done encoding
- Total duration: 4.64
--Encoding time: 0.98
--Encoding rate: 4.72X
-+Encoding time: 0.03
-+Encoding rate: 178.46X
- ```
-
--Safari:
-+Safari (`16.2`):
- ```
- Executing encoding test
- Got WAV file.
- Encoding..
- Done encoding.
- File duration: 5.57 seconds
--Encoding time: 11.77 seconds
--Encoding rate: 0.47X
-+Encoding time: 0.12 seconds
-+Encoding rate: 46.44X
-
- Executing rounds test
- Encoding 50 buffers of 4096 samples
- Done encoding
- Total duration: 4.64
--Encoding time: 6.93
--Encoding rate: 0.67X
-+Encoding time: 0.02
-+Encoding rate: 210.91X
- ```
-
--NodeJS, v0.10.24:
-+NodeJS (`v19.3.0`):
- ```
- Executing encoding test
- Got WAV file.
- Encoding..
- Done encoding.
- File duration: 5.57 seconds
--Encoding time: 22.57 seconds
--Encoding rate: 0.25X
-+Encoding time: 0.06 seconds
-+Encoding rate: 94.45X
-
- Executing rounds test
- Encoding 50 buffers of 4096 samples
- Done encoding
- Total duration: 4.64
--Encoding time: 11.46
--Encoding rate: 0.40X
-+Encoding time: 0.03
-+Encoding rate: 178.46X
- ```
-diff --git a/js/dist/libshine.js b/js/dist/libshine.js
-deleted file mode 100644
-index c44f119..0000000
---- a/js/dist/libshine.js
-+++ /dev/null
-@@ -1,16 +0,0 @@
--var Shine=(function(){var context={};return(function(){var Module;if(!Module)Module=(typeof Module!=="undefined"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module["ENVIRONMENT"]){if(Module["ENVIRONMENT"]==="WEB"){ENVIRONMENT_IS_WEB=true}else if(Module["ENVIRONMENT"]==="WORKER"){ENVIRONMENT_IS_WORKER=true}else if(Module["ENVIRONMENT"]==="NODE"){ENVIRONMENT_IS_NODE=true}else if(Module["ENVIRONMENT"]==="SHELL"){ENVIRONMENT_IS_SHELL=true}else{throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.")}}else{ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=console.log;if(!Module["printErr"])Module["printErr"]=console.warn;var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filename);return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module["load"]=function load(f){globalEval(read(f))};if(!Module["thisProgram"]){if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}else{Module["thisProgram"]="unknown-program"}}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=read}else{Module["read"]=function shell_read(){throw"no read() available"}}Module["readBinary"]=function readBinary(f){if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}var data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function shell_print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module["load"]=importScripts}if(typeof Module["setWindowTitle"]==="undefined"){Module["setWindowTitle"]=(function(title){document.title=title})}}else{throw"Unknown runtime environment. Where are we?"}function globalEval(x){eval.call(null,x)}if(!Module["load"]&&Module["read"]){Module["load"]=function load(f){globalEval(Module["read"](f))}}if(!Module["print"]){Module["print"]=(function(){})}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}if(!Module["quit"]){Module["quit"]=(function(status,toThrow){throw toThrow})}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return Runtime.QUANTUM_SIZE}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type==="double"||type==="i64"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type=="i64"||type=="double"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS."}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return Runtime.dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}),getCompilerSetting:(function(name){throw"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module["Runtime"]=Runtime;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];if(!func){try{func=eval("_"+ident)}catch(e){}}assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)");return func}var cwrap,ccall;((function(){var JSfuncs={"stackSave":(function(){Runtime.stackSave()}),"stackRestore":(function(){Runtime.stackRestore()}),"arrayToC":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType==="string")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return ret};var sourceRegex=/^function\s*[a-zA-Z$_0-9]*\s*\(([^)]*)\)\s*{\s*([^*]*?)[\s;]*(?:return\s*(.*?)[;\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource){JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type==="number"}));var numericRet=returnType!=="string";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return"$"+i}));var funcstr="(function("+argNames.join(",")+") {";var nargs=argTypes.length;if(!numericArgs){ensureJSsource();funcstr+="var stack = "+JSsource["stackSave"].body+";";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type==="number")continue;var convertCode=JSsource[type+"ToC"];funcstr+="var "+convertCode.arguments+" = "+arg+";";funcstr+=convertCode.body+";";funcstr+=arg+"=("+convertCode.returnValue+");"}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+="var ret = "+cfuncname+"("+argNames.join(",")+");";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+="ret = "+strgfy+"(ret);"}if(!numericArgs){ensureJSsource();funcstr+=JSsource["stackRestore"].body.replace("()","(stack)")+";"}funcstr+="return ret})";return eval(funcstr)}}))();Module["ccall"]=ccall;Module["cwrap"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}Module["setValue"]=setValue;function getValue(ptr,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];default:abort("invalid type for setValue: "+type)}return null}Module["getValue"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module["ALLOC_NORMAL"]=ALLOC_NORMAL;Module["ALLOC_STACK"]=ALLOC_STACK;Module["ALLOC_STATIC"]=ALLOC_STATIC;Module["ALLOC_DYNAMIC"]=ALLOC_DYNAMIC;Module["ALLOC_NONE"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc==="function"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr==="function"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type=="i64")type="i32";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module["allocate"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module["getMemory"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module["UTF8ToString"](ptr)}Module["Pointer_stringify"]=Pointer_stringify;function AsciiToString(ptr){var str="";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module["AsciiToString"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module["stringToAscii"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module["UTF8ArrayToString"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module["UTF8ToString"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module["stringToUTF8Array"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module["stringToUTF8"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module["lengthBytesUTF8"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function demangle(func){var __cxa_demangle_func=Module["___cxa_demangle"]||Module["__cxa_demangle"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,"i32")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling");return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return demangleAll(js)}Module["stackTrace"]=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+TOTAL_MEMORY+"! (TOTAL_STACK="+TOTAL_STACK+")");if(Module["buffer"]){buffer=Module["buffer"]}else{{buffer=new ArrayBuffer(TOTAL_MEMORY)}}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw"Runtime error: expected the system to be little-endian!";Module["HEAP"]=HEAP;Module["buffer"]=buffer;Module["HEAP8"]=HEAP8;Module["HEAP16"]=HEAP16;Module["HEAP32"]=HEAP32;Module["HEAPU8"]=HEAPU8;Module["HEAPU16"]=HEAPU16;Module["HEAPU32"]=HEAPU32;Module["HEAPF32"]=HEAPF32;Module["HEAPF64"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module["addOnPreRun"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module["addOnInit"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module["addOnPreMain"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module["addOnExit"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module["addOnPostRun"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["intArrayFromString"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}Module["intArrayToString"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module["writeStringToMemory"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module["writeArrayToMemory"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module["writeAsciiToMemory"]=writeAsciiToMemory;if(!Math["imul"]||Math["imul"](4294967295,5)!==-5)Math["imul"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math["imul"];if(!Math["clz32"])Math["clz32"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math["clz32"];if(!Math["trunc"])Math["trunc"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math["trunc"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}Module["addRunDependency"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["removeRunDependency"]=removeRunDependency;Module["preloadedImages"]={};Module["preloadedAudios"]={};var ASM_CONSTS=[];STATIC_BASE=Runtime.GLOBAL_BASE;STATICTOP=STATIC_BASE+10560;__ATINIT__.push();allocate([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,104,18,0,0,108,29,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,112,18,0,0,112,29,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,130,18,0,0,121,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,148,18,0,0,130,29,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,180,18,0,0,146,29,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,212,18,0,0,162,29,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,28,19,0,0,198,29,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,100,19,0,0,234,29,0,0,8,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,172,19,0,0,14,30,0,0,8,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,44,20,0,0,78,30,0,0,8,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,172,20,0,0,142,30,0,0,16,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,44,21,0,0,206,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,44,23,0,0,206,31,0,0,16,0,0,0,16,0,0,0,1,0,0,0,1,0,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,2,0,0,0,3,0,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,3,0,0,0,7,0,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,4,0,0,0,15,0,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,6,0,0,0,63,0,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,8,0,0,0,255,0,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,10,0,0,0,255,3,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,13,0,0,0,255,31,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,4,0,0,0,15,0,0,0,44,27,0,0,206,33,0,0,16,0,0,0,16,0,0,0,5,0,0,0,31,0,0,0,44,27,0,0,206,33,0,0,16,0,0,0,16,0,0,0,6,0,0,0,63,0,0,0,44,27,0,0,206,33,0,0,16,0,0,0,16,0,0,0,7,0,0,0,127,0,0,0,44,27,0,0,206,33,0,0,16,0,0,0,16,0,0,0,8,0,0,0,255,0,0,0,44,27,0,0,206,33,0,0,16,0,0,0,16,0,0,0,9,0,0,0,255,1,0,0,44,27,0,0,206,33,0,0,16,0,0,0,16,0,0,0,11,0,0,0,255,7,0,0,44,27,0,0,206,33,0,0,16,0,0,0,16,0,0,0,13,0,0,0,255,31,0,0,44,27,0,0,206,33,0,0,1,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,44,29,0,0,206,34,0,0,1,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,76,29,0,0,222,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,4,0,0,0,3,0,0,0,4,0,0,0,3,0,0,0,4,0,0,0,4,0,0,0,5,0,0,0,4,0,0,0,5,0,0,0,4,0,0,0,6,0,0,0,5,0,0,0,6,0,0,0,5,0,0,0,6,0,0,0,5,0,0,0,7,0,0,0,6,0,0,0,7,0,0,0,6,0,0,0,7,0,0,0,0,0,0,0,6,0,0,0,11,0,0,0,16,0,0,0,21,0,0,0,1,0,0,0,255,255,255,255,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,3,0,0,0,68,172,0,0,128,187,0,0,0,125,0,0,34,86,0,0,192,93,0,0,128,62,0,0,17,43,0,0,224,46,0,0,64,31,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,8,0,0,0,255,255,255,255,8,0,0,0,32,0,0,0,16,0,0,0,255,255,255,255,16,0,0,0,40,0,0,0,24,0,0,0,255,255,255,255,24,0,0,0,48,0,0,0,32,0,0,0,255,255,255,255,32,0,0,0,56,0,0,0,40,0,0,0,255,255,255,255,40,0,0,0,64,0,0,0,48,0,0,0,255,255,255,255,48,0,0,0,80,0,0,0,56,0,0,0,255,255,255,255,56,0,0,0,96,0,0,0,64,0,0,0,255,255,255,255,64,0,0,0,112,0,0,0,255,255,255,255,255,255,255,255,80,0,0,0,128,0,0,0,255,255,255,255,255,255,255,255,96,0,0,0,160,0,0,0,255,255,255,255,255,255,255,255,112,0,0,0,192,0,0,0,255,255,255,255,255,255,255,255,128,0,0,0,224,0,0,0,255,255,255,255,255,255,255,255,144,0,0,0,0,1,0,0,255,255,255,255,255,255,255,255,160,0,0,0,64,1,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,4,0,0,0,8,0,0,0,12,0,0,0,16,0,0,0,20,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,44,0,0,0,52,0,0,0,62,0,0,0,74,0,0,0,90,0,0,0,110,0,0,0,134,0,0,0,162,0,0,0,196,0,0,0,238,0,0,0,32,1,0,0,86,1,0,0,162,1,0,0,64,2,0,0,0,0,0,0,4,0,0,0,8,0,0,0,12,0,0,0,16,0,0,0,20,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,42,0,0,0,50,0,0,0,60,0,0,0,72,0,0,0,88,0,0,0,106,0,0,0,128,0,0,0,156,0,0,0,190,0,0,0,230,0,0,0,20,1,0,0,74,1,0,0,128,1,0,0,64,2,0,0,0,0,0,0,4,0,0,0,8,0,0,0,12,0,0,0,16,0,0,0,20,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,44,0,0,0,54,0,0,0,66,0,0,0,82,0,0,0,102,0,0,0,126,0,0,0,156,0,0,0,194,0,0,0,240,0,0,0,40,1,0,0,108,1,0,0,192,1,0,0,38,2,0,0,64,2,0,0,0,0,0,0,6,0,0,0,12,0,0,0,18,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,44,0,0,0,54,0,0,0,66,0,0,0,80,0,0,0,96,0,0,0,116,0,0,0,140,0,0,0,168,0,0,0,200,0,0,0,238,0,0,0,28,1,0,0,80,1,0,0,140,1,0,0,208,1,0,0,10,2,0,0,64,2,0,0,0,0,0,0,6,0,0,0,12,0,0,0,18,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,44,0,0,0,54,0,0,0,66,0,0,0,80,0,0,0,96,0,0,0,114,0,0,0,136,0,0,0,162,0,0,0,194,0,0,0,232,0,0,0,22,1,0,0,74,1,0,0,138,1,0,0,208,1,0,0,28,2,0,0,64,2,0,0,0,0,0,0,6,0,0,0,12,0,0,0,18,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,44,0,0,0,45,0,0,0,66,0,0,0,80,0,0,0,96,0,0,0,116,0,0,0,140,0,0,0,168,0,0,0,200,0,0,0,238,0,0,0,248,0,0,0,80,1,0,0,140,1,0,0,208,1,0,0,10,2,0,0,64,2,0,0,0,0,0,0,6,0,0,0,12,0,0,0,18,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,44,0,0,0,54,0,0,0,66,0,0,0,80,0,0,0,96,0,0,0,116,0,0,0,140,0,0,0,168,0,0,0,200,0,0,0,238,0,0,0,28,1,0,0,80,1,0,0,140,1,0,0,208,1,0,0,10,2,0,0,64,2,0,0,0,0,0,0,6,0,0,0,12,0,0,0,18,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,44,0,0,0,54,0,0,0,66,0,0,0,80,0,0,0,96,0,0,0,116,0,0,0,140,0,0,0,168,0,0,0,200,0,0,0,238,0,0,0,28,1,0,0,80,1,0,0,140,1,0,0,208,1,0,0,10,2,0,0,64,2,0,0,0,0,0,0,12,0,0,0,24,0,0,0,36,0,0,0,48,0,0,0,60,0,0,0,72,0,0,0,88,0,0,0,108,0,0,0,132,0,0,0,160,0,0,0,192,0,0,0,232,0,0,0,24,1,0,0,80,1,0,0,144,1,0,0,220,1,0,0,54,2,0,0,56,2,0,0,58,2,0,0,60,2,0,0,62,2,0,0,64,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,157,247,255,255,157,247,255,255,157,247,255,255,157,247,255,255,157,247,255,255,157,247,255,255,58,239,255,255,58,239,255,255,58,239,255,255,58,239,255,255,214,230,255,255,214,230,255,255,214,230,255,255,115,222,255,255,115,222,255,255,15,214,255,255,15,214,255,255,172,205,255,255,72,197,255,255,229,188,255,255,229,188,255,255,129,180,255,255,30,172,255,255,186,163,255,255,87,155,255,255,144,138,255,255,44,130,255,255,101,113,255,255,2,105,255,255,59,88,255,255,215,79,255,255,16,63,255,255,73,46,255,255,31,21,255,255,88,4,255,255,145,243,254,255,103,218,254,255,60,193,254,255,18,168,254,255,75,151,254,255,32,126,254,255,146,92,254,255,104,67,254,255,61,42,254,255,175,8,254,255,133,239,253,255,91,214,253,255,205,180,253,255,162,155,253,255,20,122,253,255,134,88,253,255,92,63,253,255,49,38,253,255,163,4,253,255,221,243,252,255,178,218,252,255,136,193,252,255,163,87,3,0,106,104,3,0,49,121,3,0,148,129,3,0,248,137,3,0,91,146,3,0,91,146,3,0,248,137,3,0,148,129,3,0,205,112,3,0,6,96,3,0,120,62,3,0,234,28,3,0,249,242,2,0,164,192,2,0,79,142,2,0,51,75,2,0,180,255,1,0,209,171,1,0,139,79,1,0,126,226,0,0,112,117,0,0,157,247,255,255,101,113,255,255,202,226,254,255,104,67,254,255,162,155,253,255,121,235,252,255,236,50,252,255,153,105,251,255,226,151,250,255,199,189,249,255,230,210,248,255,4,232,247,255,92,236,246,255,80,232,245,255,68,228,244,255,212,215,243,255,1,195,242,255,203,165,241,255,49,128,240,255,250,98,239,255,96,61,238,255,198,23,237,255,45,242,235,255,147,204,234,255,92,175,233,255,137,154,232,255,182,133,231,255,71,121,230,255,59,117,229,255,246,129,228,255,120,159,227,255,93,197,226,255,109,4,226,255,68,84,225,255,69,189,224,255,113,63,224,255,199,218,223,255,171,151,223,255,186,109,223,255,86,101,223,255,129,126,223,255,157,193,223,255,86,209,31,0,187,66,31,0,203,129,30,0,233,150,29,0,179,121,28,0,39,42,27,0,171,176,25,0,118,252,23,0,235,21,22,0,13,253,19,0,117,169,17,0,236,43,15,0,72,107,12,0,235,111,9,0,156,74,6,0,50,226,2,0,215,79,255,255,195,130,251,255,247,122,247,255,57,73,243,255,38,229,238,255,190,78,234,255,101,142,229,255,27,164,224,255,66,152,219,255,120,98,214,255,132,19,209,255,2,163,203,255,85,25,198,255,69,135,192,255,10,220,186,255,207,48,181,255,49,125,175,255,147,201,169,255,188,38,164,255,72,140,158,255,255,10,153,255,224,162,147,255,179,100,142,255,19,72,137,255,44,102,132,255,254,190,127,255,135,82,123,255,144,49,119,255,124,100,115,255,174,243,111,255,39,223,108,255,16,64,106,255,163,5,104,255,11,73,102,255,170,18,101,255,129,98,100,255,86,73,100,255,42,199,100,255,97,228,101,255,93,169,103,255,130,30,106,255,52,76,109,255,115,50,113,255,5,226,117,255,135,82,123,255,93,140,129,255,78,160,136,255,245,133,144,255,73,186,102,0,9,24,93,0,17,164,82,0,56,69,71,0,226,3,59,0,13,224,45,0,86,209,31,0,133,232,16,0,210,20,1,0,6,103,240,255,187,214,222,255,85,108,204,255,213,39,185,255,1,26,165,255,118,58,144,255,151,145,122,255,200,39,100,255,109,5,77,255,232,50,53,255,58,176,28,255,142,150,3,255,227,229,233,254,156,166,207,254,130,233,180,254,90,191,153,254,37,40,126,254,169,52,98,254,18,254,69,254,251,123,41,254,243,207,12,254,92,2,240,253,255,35,211,253,63,61,182,253,226,94,153,253,19,162,124,253,209,6,96,253,172,174,67,253,163,153,39,253,67,233,11,253,141,157,240,252,171,207,213,252,1,136,187,252,86,215,161,252,212,214,136,252,223,142,112,252,218,7,89,252,239,90,66,252,130,144,44,252,247,176,23,252,120,213,3,252,105,6,241,251,44,76,223,251,38,175,206,251,29,64,191,251,117,7,177,251,145,13,164,251,214,90,152,251,165,247,141,251,0,228,132,251,174,48,125,251,173,221,118,251,255,234,113,251,7,97,110,251,197,63,108,251,200,120,148,4,59,192,147,4,249,158,145,4,1,21,142,4,83,34,137,4,82,207,130,4,0,28,123,4,91,8,114,4,42,165,103,4,111,242,91,4,139,248,78,4,227,191,64,4,218,80,49,4,212,179,32,4,151,249,14,4,136,42,252,3,9,79,232,3,126,111,211,3,17,165,189,3,38,248,166,3,33,113,143,3,44,41,119,3,170,40,94,3,255,119,68,3,85,48,42,3,115,98,15,3,189,22,244,2,93,102,216,2,84,81,188,2,47,249,159,2,237,93,131,2,30,161,102,2,193,194,73,2,1,220,44,2,164,253,15,2,13,48,243,1,5,132,214,1,238,1,186,1,87,203,157,1,219,215,129,1,166,64,102,1,126,22,75,1,100,89,48,1,29,26,22,1,114,105,252,0,198,79,227,0,24,205,202,0,147,250,178,0,56,216,155,0,105,110,133,0,138,197,111,0,255,229,90,0,43,216,70,0,171,147,51,0,69,41,33,0,250,152,15,0,46,235,254,255,123,23,239,255,170,46,224,255,243,31,210,255,30,252,196,255,200,186,184,255,239,91,173,255,247,231,162,255,73,186,102,0,11,122,111,0,178,95,119,0,163,115,126,0,121,173,132,0,251,29,138,0,141,205,142,0,204,179,146,0,126,225,149,0,163,86,152,0,159,27,154,0,214,56,155,0,170,182,155,0,127,157,155,0,86,237,154,0,245,182,153,0,93,250,151,0,240,191,149,0,217,32,147,0,82,12,144,0,132,155,140,0,112,206,136,0,121,173,132,0,2,65,128,0,212,153,123,0,237,183,118,0,77,155,113,0,32,93,108,0,1,245,102,0,184,115,97,0,68,217,91,0,109,54,86,0,207,130,80,0,49,207,74,0,246,35,69,0,187,120,63,0,171,230,57,0,254,92,52,0,124,236,46,0,136,157,41,0,190,103,36,0,229,91,31,0,155,113,26,0,66,177,21,0,218,26,17,0,199,182,12,0,9,133,8,0,61,125,4,0,41,176,0,0,206,29,253,255,100,181,249,255,21,144,246,255,184,148,243,255,20,212,240,255,139,86,238,255,243,2,236,255,21,234,233,255,138,3,232,255,85,79,230,255,217,213,228,255,77,134,227,255,23,105,226,255,53,126,225,255,69,189,224,255,86,209,31,0,99,62,32,0,127,129,32,0,170,154,32,0,70,146,32,0,85,104,32,0,57,37,32,0,143,192,31,0,187,66,31,0,188,171,30,0,147,251,29,0,163,58,29,0,136,96,28,0,10,126,27,0,197,138,26,0,185,134,25,0,74,122,24,0,119,101,23,0,164,80,22,0,109,51,21,0,211,13,20,0,58,232,18,0,160,194,17,0,6,157,16,0,207,127,15,0,53,90,14,0,255,60,13,0,44,40,12,0,188,27,11,0,176,23,10,0,164,19,9,0,252,23,8,0,26,45,7,0,57,66,6,0,30,104,5,0,103,150,4,0,20,205,3,0,135,20,3,0,94,100,2,0,152,188,1,0,54,29,1,0,155,142,0,0,99,8,0,0,144,138,255,255,130,29,255,255,117,176,254,255,47,84,254,255,76,0,254,255,205,180,253,255,177,113,253,255,92,63,253,255,7,13,253,255,22,227,252,255,136,193,252,255,250,159,252,255,51,143,252,255,108,126,252,255,8,118,252,255,165,109,252,255,165,109,252,255,8,118,252,255,108,126,252,255,207,134,252,255,150,151,252,255,163,87,3,0,120,62,3,0,78,37,3,0,35,12,3,0,93,251,2,0,207,217,2,0,164,192,2,0,122,167,2,0,236,133,2,0,94,100,2,0,51,75,2,0,165,41,2,0,123,16,2,0,81,247,1,0,195,213,1,0,152,188,1,0,110,163,1,0,224,129,1,0,181,104,1,0,238,87,1,0,196,62,1,0,153,37,1,0,111,12,1,0,168,251,0,0,225,234,0,0,183,209,0,0,240,192,0,0,41,176,0,0,197,167,0,0,254,150,0,0,155,142,0,0,212,125,0,0,112,117,0,0,169,100,0,0,70,92,0,0,226,83,0,0,127,75,0,0,27,67,0,0,27,67,0,0,184,58,0,0,84,50,0,0,241,41,0,0,241,41,0,0,141,33,0,0,141,33,0,0,42,25,0,0,42,25,0,0,42,25,0,0,198,16,0,0,198,16,0,0,198,16,0,0,198,16,0,0,99,8,0,0,99,8,0,0,99,8,0,0,99,8,0,0,99,8,0,0,99,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,52,37,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,17,0,0,1,0,1,0,1,0,0,0,1,0,2,0,1,0,3,0,1,0,1,0,3,0,2,0,0,0,3,0,2,0,1,0,1,0,1,0,1,0,3,0,2,0,0,0,1,0,2,0,6,0,5,0,3,0,1,0,4,0,4,0,7,0,5,0,7,0,1,0,6,0,1,0,1,0,0,0,7,0,3,0,5,0,1,0,6,0,2,0,3,0,2,0,5,0,4,0,4,0,1,0,3,0,3,0,2,0,0,0,1,0,2,0,10,0,19,0,16,0,10,0,3,0,3,0,7,0,10,0,5,0,3,0,11,0,4,0,13,0,17,0,8,0,4,0,12,0,11,0,18,0,15,0,11,0,2,0,7,0,6,0,9,0,14,0,3,0,1,0,6,0,4,0,5,0,3,0,2,0,0,0,3,0,4,0,6,0,18,0,12,0,5,0,5,0,1,0,2,0,16,0,9,0,3,0,7,0,3,0,5,0,14,0,7,0,3,0,19,0,17,0,15,0,13,0,10,0,4,0,13,0,5,0,8,0,11,0,5,0,1,0,12,0,4,0,4,0,1,0,1,0,0,0,7,0,5,0,9,0,14,0,15,0,7,0,6,0,4,0,5,0,5,0,6,0,7,0,7,0,6,0,8,0,8,0,8,0,5,0,15,0,6,0,9,0,10,0,5,0,1,0,11,0,7,0,9,0,6,0,4,0,1,0,14,0,4,0,6,0,2,0,6,0,0,0,1,0,2,0,10,0,23,0,35,0,30,0,12,0,17,0,3,0,3,0,8,0,12,0,18,0,21,0,12,0,7,0,11,0,9,0,15,0,21,0,32,0,40,0,19,0,6,0,14,0,13,0,22,0,34,0,46,0,23,0,18,0,7,0,20,0,19,0,33,0,47,0,27,0,22,0,9,0,3,0,31,0,22,0,41,0,26,0,21,0,20,0,5,0,3,0,14,0,13,0,10,0,11,0,16,0,6,0,5,0,1,0,9,0,8,0,7,0,8,0,4,0,4,0,2,0,0,0,3,0,4,0,10,0,24,0,34,0,33,0,21,0,15,0,5,0,3,0,4,0,10,0,32,0,17,0,11,0,10,0,11,0,7,0,13,0,18,0,30,0,31,0,20,0,5,0,25,0,11,0,19,0,59,0,27,0,18,0,12,0,5,0,35,0,33,0,31,0,58,0,30,0,16,0,7,0,5,0,28,0,26,0,32,0,19,0,17,0,15,0,8,0,14,0,14,0,12,0,9,0,13,0,14,0,9,0,4,0,1,0,11,0,4,0,6,0,6,0,6,0,3,0,2,0,0,0,9,0,6,0,16,0,33,0,41,0,39,0,38,0,26,0,7,0,5,0,6,0,9,0,23,0,16,0,26,0,11,0,17,0,7,0,11,0,14,0,21,0,30,0,10,0,7,0,17,0,10,0,15,0,12,0,18,0,28,0,14,0,5,0,32,0,13,0,22,0,19,0,18,0,16,0,9,0,5,0,40,0,17,0,31,0,29,0,17,0,13,0,4,0,2,0,27,0,12,0,11,0,15,0,10,0,7,0,4,0,1,0,27,0,12,0,8,0,12,0,6,0,3,0,1,0,0,0,1,0,5,0,14,0,21,0,34,0,51,0,46,0,71,0,42,0,52,0,68,0,52,0,67,0,44,0,43,0,19,0,3,0,4,0,12,0,19,0,31,0,26,0,44,0,33,0,31,0,24,0,32,0,24,0,31,0,35,0,22,0,14,0,15,0,13,0,23,0,36,0,59,0,49,0,77,0,65,0,29,0,40,0,30,0,40,0,27,0,33,0,42,0,16,0,22,0,20,0,37,0,61,0,56,0,79,0,73,0,64,0,43,0,76,0,56,0,37,0,26,0,31,0,25,0,14,0,35,0,16,0,60,0,57,0,97,0,75,0,114,0,91,0,54,0,73,0,55,0,41,0,48,0,53,0,23,0,24,0,58,0,27,0,50,0,96,0,76,0,70,0,93,0,84,0,77,0,58,0,79,0,29,0,74,0,49,0,41,0,17,0,47,0,45,0,78,0,74,0,115,0,94,0,90,0,79,0,69,0,83,0,71,0,50,0,59,0,38,0,36,0,15,0,72,0,34,0,56,0,95,0,92,0,85,0,91,0,90,0,86,0,73,0,77,0,65,0,51,0,44,0,43,0,42,0,43,0,20,0,30,0,44,0,55,0,78,0,72,0,87,0,78,0,61,0,46,0,54,0,37,0,30,0,20,0,16,0,53,0,25,0,41,0,37,0,44,0,59,0,54,0,81,0,66,0,76,0,57,0,54,0,37,0,18,0,39,0,11,0,35,0,33,0,31,0,57,0,42,0,82,0,72,0,80,0,47,0,58,0,55,0,21,0,22,0,26,0,38,0,22,0,53,0,25,0,23,0,38,0,70,0,60,0,51,0,36,0,55,0,26,0,34,0,23,0,27,0,14,0,9,0,7,0,34,0,32,0,28,0,39,0,49,0,75,0,30,0,52,0,48,0,40,0,52,0,28,0,18,0,17,0,9,0,5,0,45,0,21,0,34,0,64,0,56,0,50,0,49,0,45,0,31,0,19,0,12,0,15,0,10,0,7,0,6,0,3,0,48,0,23,0,20,0,39,0,36,0,35,0,53,0,21,0,16,0,23,0,13,0,10,0,6,0,1,0,4,0,2,0,16,0,15,0,17,0,27,0,25,0,20,0,29,0,11,0,17,0,12,0,16,0,8,0,1,0,1,0,0,0,1,0,7,0,12,0,18,0,53,0,47,0,76,0,124,0,108,0,89,0,123,0,108,0,119,0,107,0,81,0,122,0,63,0,13,0,5,0,16,0,27,0,46,0,36,0,61,0,51,0,42,0,70,0,52,0,83,0,65,0,41,0,59,0,36,0,19,0,17,0,15,0,24,0,41,0,34,0,59,0,48,0,40,0,64,0,50,0,78,0,62,0,80,0,56,0,33,0,29,0,28,0,25,0,43,0,39,0,63,0,55,0,93,0,76,0,59,0,93,0,72,0,54,0,75,0,50,0,29,0,52,0,22,0,42,0,40,0,67,0,57,0,95,0,79,0,72,0,57,0,89,0,69,0,49,0,66,0,46,0,27,0,77,0,37,0,35,0,66,0,58,0,52,0,91,0,74,0,62,0,48,0,79,0,63,0,90,0,62,0,40,0,38,0,125,0,32,0,60,0,56,0,50,0,92,0,78,0,65,0,55,0,87,0,71,0,51,0,73,0,51,0,70,0,30,0,109,0,53,0,49,0,94,0,88,0,75,0,66,0,122,0,91,0,73,0,56,0,42,0,64,0,44,0,21,0,25,0,90,0,43,0,41,0,77,0,73,0,63,0,56,0,92,0,77,0,66,0,47,0,67,0,48,0,53,0,36,0,20,0,71,0,34,0,67,0,60,0,58,0,49,0,88,0,76,0,67,0,106,0,71,0,54,0,38,0,39,0,23,0,15,0,109,0,53,0,51,0,47,0,90,0,82,0,58,0,57,0,48,0,72,0,57,0,41,0,23,0,27,0,62,0,9,0,86,0,42,0,40,0,37,0,70,0,64,0,52,0,43,0,70,0,55,0,42,0,25,0,29,0,18,0,11,0,11,0,118,0,68,0,30,0,55,0,50,0,46,0,74,0,65,0,49,0,39,0,24,0,16,0,22,0,13,0,14,0,7,0,91,0,44,0,39,0,38,0,34,0,63,0,52,0,45,0,31,0,52,0,28,0,19,0,14,0,8,0,9,0,3,0,123,0,60,0,58,0,53,0,47,0,43,0,32,0,22,0,37,0,24,0,17,0,12,0,15,0,10,0,2,0,1,0,71,0,37,0,34,0,30,0,28,0,20,0,17,0,26,0,21,0,16,0,10,0,6,0,8,0,6,0,2,0,0,0,1,0,5,0,14,0,44,0,74,0,63,0,110,0,93,0,172,0,149,0,138,0,242,0,225,0,195,0,120,1,17,0,3,0,4,0,12,0,20,0,35,0,62,0,53,0,47,0,83,0,75,0,68,0,119,0,201,0,107,0,207,0,9,0,15,0,13,0,23,0,38,0,67,0,58,0,103,0,90,0,161,0,72,0,127,0,117,0,110,0,209,0,206,0,16,0,45,0,21,0,39,0,69,0,64,0,114,0,99,0,87,0,158,0,140,0,252,0,212,0,199,0,131,1,109,1,26,0,75,0,36,0,68,0,65,0,115,0,101,0,179,0,164,0,155,0,8,1,246,0,226,0,139,1,126,1,106,1,9,0,66,0,30,0,59,0,56,0,102,0,185,0,173,0,9,1,142,0,253,0,232,0,144,1,132,1,122,1,189,1,16,0,111,0,54,0,52,0,100,0,184,0,178,0,160,0,133,0,1,1,244,0,228,0,217,0,129,1,110,1,203,2,10,0,98,0,48,0,91,0,88,0,165,0,157,0,148,0,5,1,248,0,151,1,141,1,116,1,124,1,121,3,116,3,8,0,85,0,84,0,81,0,159,0,156,0,143,0,4,1,249,0,171,1,145,1,136,1,127,1,215,2,201,2,196,2,7,0,154,0,76,0,73,0,141,0,131,0,0,1,245,0,170,1,150,1,138,1,128,1,223,2,103,1,198,2,96,1,11,0,139,0,129,0,67,0,125,0,247,0,233,0,229,0,219,0,137,1,231,2,225,2,208,2,117,3,114,3,183,1,4,0,243,0,120,0,118,0,115,0,227,0,223,0,140,1,234,2,230,2,224,2,209,2,200,2,194,2,223,0,180,1,6,0,202,0,224,0,222,0,218,0,216,0,133,1,130,1,125,1,108,1,120,3,187,1,195,2,184,1,181,1,192,6,4,0,235,2,211,0,210,0,208,0,114,1,123,1,222,2,211,2,202,2,199,6,115,3,109,3,108,3,131,13,97,3,2,0,121,1,113,1,102,0,187,0,214,2,210,2,102,1,199,2,197,2,98,3,198,6,103,3,130,13,102,3,178,1,0,0,12,0,10,0,7,0,11,0,10,0,17,0,11,0,9,0,13,0,12,0,10,0,7,0,5,0,3,0,1,0,3,0,15,0,13,0,46,0,80,0,146,0,6,1,248,0,178,1,170,1,157,2,141,2,137,2,109,2,5,2,8,4,88,0,14,0,12,0,21,0,38,0,71,0,130,0,122,0,216,0,209,0,198,0,71,1,89,1,63,1,41,1,23,1,42,0,47,0,22,0,41,0,74,0,68,0,128,0,120,0,221,0,207,0,194,0,182,0,84,1,59,1,39,1,29,2,18,0,81,0,39,0,75,0,70,0,134,0,125,0,116,0,220,0,204,0,190,0,178,0,69,1,55,1,37,1,15,1,16,0,147,0,72,0,69,0,135,0,127,0,118,0,112,0,210,0,200,0,188,0,96,1,67,1,50,1,29,1,28,2,14,0,7,1,66,0,129,0,126,0,119,0,114,0,214,0,202,0,192,0,180,0,85,1,61,1,45,1,25,1,6,1,12,0,249,0,123,0,121,0,117,0,113,0,215,0,206,0,195,0,185,0,91,1,74,1,52,1,35,1,16,1,8,2,10,0,179,1,115,0,111,0,109,0,211,0,203,0,196,0,187,0,97,1,76,1,57,1,42,1,27,1,19,2,125,1,17,0,171,1,212,0,208,0,205,0,201,0,193,0,186,0,177,0,169,0,64,1,47,1,30,1,12,1,2,2,121,1,16,0,79,1,199,0,197,0,191,0,189,0,181,0,174,0,77,1,65,1,49,1,33,1,19,1,9,2,123,1,115,1,11,0,156,2,184,0,183,0,179,0,175,0,88,1,75,1,58,1,48,1,34,1,21,1,18,2,127,1,117,1,110,1,10,0,140,2,90,1,171,0,168,0,164,0,62,1,53,1,43,1,31,1,20,1,7,1,1,2,119,1,112,1,106,1,6,0,136,2,66,1,60,1,56,1,51,1,46,1,36,1,28,1,13,1,5,1,0,2,120,1,114,1,108,1,103,1,4,0,108,2,44,1,40,1,38,1,32,1,26,1,17,1,10,1,3,2,124,1,118,1,113,1,109,1,105,1,101,1,2,0,9,4,24,1,22,1,18,1,11,1,8,1,3,1,126,1,122,1,116,1,111,1,107,1,104,1,102,1,100,1,0,0,43,0,20,0,19,0,17,0,15,0,13,0,11,0,9,0,7,0,6,0,4,0,7,0,5,0,3,0,1,0,3,0,1,0,5,0,4,0,5,0,6,0,5,0,4,0,4,0,7,0,3,0,6,0,0,0,7,0,2,0,3,0,1,0,15,0,14,0,13,0,12,0,11,0,10,0,9,0,8,0,7,0,6,0,5,0,4,0,3,0,2,0,1,0,0,0,1,3,2,3,1,3,6,3,3,5,5,5,6,2,2,6,3,2,5,5,5,6,1,3,6,7,3,3,6,7,6,6,7,8,7,6,7,8,3,3,5,7,3,2,4,5,4,4,5,6,6,5,6,7,1,3,6,8,8,9,3,4,6,7,7,8,6,5,7,8,8,9,7,7,8,9,9,9,7,7,8,9,9,10,8,8,9,10,10,10,2,3,6,8,8,9,3,2,4,8,8,8,6,4,6,8,8,9,8,8,8,9,9,10,8,7,8,9,10,10,9,8,9,9,11,11,3,3,5,6,8,9,3,3,4,5,6,8,4,4,5,6,7,8,6,5,6,7,7,8,7,6,7,7,8,9,8,7,8,8,9,9,1,3,6,8,9,9,9,10,3,4,6,7,8,9,8,8,6,6,7,8,9,10,9,9,7,7,8,9,10,10,9,10,8,8,9,10,10,10,10,10,9,9,10,10,11,11,10,11,8,8,9,10,10,10,11,11,9,8,9,10,10,11,11,11,2,3,5,7,8,9,8,9,3,3,4,6,8,8,7,8,5,5,6,7,8,9,8,8,7,6,7,9,8,10,8,9,8,8,8,9,9,10,9,10,8,8,9,10,10,11,10,11,8,7,7,8,9,10,10,10,8,7,8,9,10,10,10,10,4,3,5,7,8,9,9,9,3,3,4,5,7,7,8,8,5,4,5,6,7,8,7,8,6,5,6,6,7,8,8,8,7,6,7,7,8,8,8,9,8,7,8,8,8,9,8,9,8,7,7,8,8,9,9,10,9,8,8,9,9,9,9,10,1,4,6,7,8,9,9,10,9,10,11,11,12,12,13,13,3,4,6,7,8,8,9,9,9,9,10,10,11,12,12,12,6,6,7,8,9,9,10,10,9,10,10,11,11,12,13,13,7,7,8,9,9,10,10,10,10,11,11,11,11,12,13,13,8,7,9,9,10,10,11,11,10,11,11,12,12,13,13,14,9,8,9,10,10,10,11,11,11,11,12,11,13,13,14,14,9,9,10,10,11,11,11,11,11,12,12,12,13,13,14,14,10,9,10,11,11,11,12,12,12,12,13,13,13,14,16,16,9,8,9,10,10,11,11,12,12,12,12,13,13,14,15,15,10,9,10,10,11,11,11,13,12,13,13,14,14,14,16,15,10,10,10,11,11,12,12,13,12,13,14,13,14,15,16,17,11,10,10,11,12,12,12,12,13,13,13,14,15,15,15,16,11,11,11,12,12,13,12,13,14,14,15,15,15,16,16,16,12,11,12,13,13,13,14,14,14,14,14,15,16,15,16,16,13,12,12,13,13,13,15,14,14,17,15,15,15,17,16,16,12,12,13,14,14,14,15,14,15,15,16,16,19,18,19,16,3,4,5,7,7,8,9,9,9,10,10,11,11,11,12,13,4,3,5,6,7,7,8,8,8,9,9,10,10,10,11,11,5,5,5,6,7,7,8,8,8,9,9,10,10,11,11,11,6,6,6,7,7,8,8,9,9,9,10,10,10,11,11,11,7,6,7,7,8,8,9,9,9,9,10,10,10,11,11,11,8,7,7,8,8,8,9,9,9,9,10,10,11,11,11,12,9,7,8,8,8,9,9,9,9,10,10,10,11,11,12,12,9,8,8,9,9,9,9,10,10,10,10,10,11,11,11,12,9,8,8,9,9,9,9,10,10,10,10,11,11,12,12,12,9,8,9,9,9,9,10,10,10,11,11,11,11,12,12,12,10,9,9,9,10,10,10,10,10,11,11,11,11,12,13,12,10,9,9,9,10,10,10,10,11,11,11,11,12,12,12,13,11,10,9,10,10,10,11,11,11,11,11,11,12,12,13,13,11,10,10,10,10,11,11,11,11,12,12,12,12,12,13,13,12,11,11,11,11,11,11,11,12,12,12,12,13,13,12,13,12,11,11,11,11,11,11,12,12,12,12,12,13,13,13,13,1,4,6,8,9,9,10,10,11,11,11,12,12,12,13,9,3,4,6,7,8,9,9,9,10,10,10,11,12,11,12,8,6,6,7,8,9,9,10,10,11,10,11,11,11,12,12,9,8,7,8,9,9,10,10,10,11,11,12,12,12,13,13,10,9,8,9,9,10,10,11,11,11,12,12,12,13,13,13,9,9,8,9,9,10,11,11,12,11,12,12,13,13,13,14,10,10,9,9,10,11,11,11,11,12,12,12,12,13,13,14,10,10,9,10,10,11,11,11,12,12,13,13,13,13,15,15,10,10,10,10,11,11,11,12,12,13,13,13,13,14,14,14,10,11,10,10,11,11,12,12,13,13,13,13,14,13,14,13,11,11,11,10,11,12,12,12,12,13,14,14,14,15,15,14,10,12,11,11,11,12,12,13,14,14,14,14,14,14,13,14,11,12,12,12,12,12,13,13,13,13,15,14,14,14,14,16,11,14,12,12,12,13,13,14,14,14,16,15,15,15,17,15,11,13,13,11,12,14,14,13,14,14,15,16,15,17,15,14,11,9,8,8,9,9,10,10,10,11,11,11,11,11,11,11,8,4,4,6,7,8,9,9,10,10,11,11,11,11,11,12,9,4,4,5,6,7,8,8,9,9,9,10,10,10,10,10,8,6,5,6,7,7,8,8,9,9,9,9,10,10,10,11,7,7,6,7,7,8,8,8,9,9,9,9,10,10,10,10,7,8,7,7,8,8,8,8,9,9,9,10,10,10,10,11,7,9,7,8,8,8,8,9,9,9,9,10,10,10,10,10,7,9,8,8,8,8,9,9,9,9,10,10,10,10,10,11,7,10,8,8,8,9,9,9,9,10,10,10,10,10,11,11,8,10,9,9,9,9,9,9,9,9,10,10,10,10,11,11,8,10,9,9,9,9,9,9,10,10,10,10,10,11,11,11,8,11,9,9,9,9,10,10,10,10,10,10,11,11,11,11,8,11,10,9,9,9,10,10,10,10,10,10,11,11,11,11,8,11,10,10,10,10,10,10,10,10,10,11,11,11,11,11,8,11,10,10,10,10,10,10,10,11,11,11,11,11,11,11,8,12,10,10,10,10,10,10,11,11,11,11,11,11,11,11,8,8,7,7,7,7,7,7,7,7,7,7,8,8,8,8,4,1,4,4,5,4,6,5,6,4,5,5,6,5,6,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=STATICTOP;STATICTOP+=16;Module["_i64Add"]=_i64Add;function _llvm_exp2_f32(x){return Math.pow(2,x)}function _llvm_exp2_f64(){return _llvm_exp2_f32.apply(null,arguments)}Module["_memset"]=_memset;Module["_bitshift64Lshr"]=_bitshift64Lshr;function _abort(){Module["abort"]()}function ___lock(){}function ___unlock(){}var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}Module["___muldsi3"]=___muldsi3;Module["___muldi3"]=___muldi3;function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}Module["_sbrk"]=_sbrk;function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module["_memcpy"]=_memcpy;Module["_llvm_bswap_i32"]=_llvm_bswap_i32;function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffer){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?Module["print"]:Module["printErr"])(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}__ATEXIT__.push((function(){var fflush=Module["_fflush"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}));DYNAMICTOP_PTR=allocate(1,"i32",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;function invoke_ii(index,a1){try{return Module["dynCall_ii"](index,a1)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiii(index,a1,a2,a3){try{return Module["dynCall_iiii"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}Module.asmGlobalArg={"Math":Math,"Int8Array":Int8Array,"Int16Array":Int16Array,"Int32Array":Int32Array,"Uint8Array":Uint8Array,"Uint16Array":Uint16Array,"Uint32Array":Uint32Array,"Float32Array":Float32Array,"Float64Array":Float64Array,"NaN":NaN,"Infinity":Infinity};Module.asmLibraryArg={"abort":abort,"assert":assert,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"invoke_ii":invoke_ii,"invoke_iiii":invoke_iiii,"_llvm_exp2_f64":_llvm_exp2_f64,"___lock":___lock,"_llvm_exp2_f32":_llvm_exp2_f32,"_abort":_abort,"___setErrNo":___setErrNo,"___syscall6":___syscall6,"___syscall140":___syscall140,"_emscripten_memcpy_big":_emscripten_memcpy_big,"___syscall54":___syscall54,"___unlock":___unlock,"___syscall146":___syscall146,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"tempDoublePtr":tempDoublePtr,"ABORT":ABORT,"STACKTOP":STACKTOP,"STACK_MAX":STACK_MAX};// EMSCRIPTEN_START_ASM
--var asm=(function(global,env,buffer) {
--"use asm";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.DYNAMICTOP_PTR|0;var j=env.tempDoublePtr|0;var k=env.ABORT|0;var l=env.STACKTOP|0;var m=env.STACK_MAX|0;var n=0;var o=0;var p=0;var q=0;var r=global.NaN,s=global.Infinity;var t=0,u=0,v=0,w=0,x=0.0;var y=0;var z=global.Math.floor;var A=global.Math.abs;var B=global.Math.sqrt;var C=global.Math.pow;var D=global.Math.cos;var E=global.Math.sin;var F=global.Math.tan;var G=global.Math.acos;var H=global.Math.asin;var I=global.Math.atan;var J=global.Math.atan2;var K=global.Math.exp;var L=global.Math.log;var M=global.Math.ceil;var N=global.Math.imul;var O=global.Math.min;var P=global.Math.max;var Q=global.Math.clz32;var R=env.abort;var S=env.assert;var T=env.enlargeMemory;var U=env.getTotalMemory;var V=env.abortOnCannotGrowMemory;var W=env.invoke_ii;var X=env.invoke_iiii;var Y=env._llvm_exp2_f64;var Z=env.___lock;var _=env._llvm_exp2_f32;var $=env._abort;var aa=env.___setErrNo;var ba=env.___syscall6;var ca=env.___syscall140;var da=env._emscripten_memcpy_big;var ea=env.___syscall54;var fa=env.___unlock;var ga=env.___syscall146;var ha=0.0;
--// EMSCRIPTEN_START_FUNCS
--function ka(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function la(){return l|0}function ma(a){a=a|0;l=a}function na(a,b){a=a|0;b=b|0;l=a;m=b}function oa(a,b){a=a|0;b=b|0;if(!n){n=a;o=b}}function pa(a){a=a|0;y=a}function qa(){return y|0}function ra(a,b){a=a|0;b=b|0;c[a>>2]=gb(b)|0;c[a+4>>2]=b;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=32;return}function sa(a){a=a|0;a=c[a>>2]|0;if(!a)return;hb(a);return}function ta(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=a+16|0;i=c[k>>2]|0;if(i>>>0>d>>>0){d=i-d|0;c[k>>2]=d;k=a+12|0;c[k>>2]=c[k>>2]|b<<d;return}j=a+8|0;e=c[j>>2]|0;g=a+4|0;h=c[g>>2]|0;f=c[a>>2]|0;if((e+4|0)>>>0<h>>>0)g=i;else{f=jb(f,((h|0)/2|0)+h|0)|0;c[a>>2]=f;e=c[g>>2]|0;c[g>>2]=((e|0)/2|0)+e;g=c[k>>2]|0;e=c[j>>2]|0}i=d-g|0;d=a+12|0;c[f+e>>2]=ub(b>>>i|c[d>>2]|0)|0;c[j>>2]=(c[j>>2]|0)+4;j=32-i|0;c[k>>2]=j;c[d>>2]=(i|0)==0?0:b<<j;return}function ua(a){a=a|0;return (c[a+8>>2]<<3)+32-(c[a+16>>2]|0)|0}function va(a){a=a|0;var b=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;C=l;l=l+416|0;B=C;if((c[a>>2]|0)>0){j=a+16|0;g=0;b=c[j>>2]|0;do{if((b|0)>0){f=0;do{b=0;do{if((c[a+25264+(g*4608|0)+(f*2304|0)+(b<<2)>>2]|0)<0?(h=a+2224+(g*4608|0)+(f*2304|0)+(b<<2)|0,i=c[h>>2]|0,(i|0)>0):0)c[h>>2]=0-i;b=b+1|0}while((b|0)!=576);f=f+1|0;b=c[j>>2]|0}while((f|0)<(b|0))}g=g+1|0}while((g|0)<(c[a>>2]|0))}j=a+116|0;tb(B|0,j|0,408)|0;z=a+96|0;ta(z,2047,11);i=a+8|0;ta(z,c[i>>2]|0,2);ta(z,c[a+12>>2]|0,2);ta(z,(c[a+76>>2]|0)==0&1,1);ta(z,c[a+68>>2]|0,4);A=a+72|0;ta(z,(c[A>>2]|0)%3|0,2);ta(z,c[a+32>>2]|0,1);ta(z,c[a+80>>2]|0,1);ta(z,c[a+20>>2]|0,2);ta(z,c[a+84>>2]|0,2);ta(z,c[a+88>>2]|0,1);ta(z,c[a+92>>2]|0,1);ta(z,c[a+28>>2]|0,2);do if((c[i>>2]|0)==3){ta(z,0,9);b=c[B>>2]|0;if((c[a>>2]|0)==2){ta(z,b,3);break}else{ta(z,b,5);break}}else{ta(z,0,8);b=c[B>>2]|0;if((c[a>>2]|0)==2){ta(z,b,2);break}else{ta(z,b,1);break}}while(0);if((c[i>>2]|0)==3?(c[a>>2]|0)>0:0){b=0;do{ta(z,c[B+8+(b<<4)>>2]|0,1);ta(z,c[B+8+(b<<4)+4>>2]|0,1);ta(z,c[B+8+(b<<4)+8>>2]|0,1);ta(z,c[B+8+(b<<4)+12>>2]|0,1);b=b+1|0}while((b|0)<(c[a>>2]|0))}y=a+16|0;b=c[y>>2]|0;if((b|0)>0){h=0;g=c[a>>2]|0;do{if((g|0)>0){f=0;do{ta(z,c[B+40+(h*184|0)+(f*92|0)>>2]|0,12);ta(z,c[B+40+(h*184|0)+(f*92|0)+4>>2]|0,9);ta(z,c[B+40+(h*184|0)+(f*92|0)+12>>2]|0,8);b=c[B+40+(h*184|0)+(f*92|0)+16>>2]|0;if((c[i>>2]|0)==3)ta(z,b,4);else ta(z,b,9);ta(z,0,1);ta(z,c[B+40+(h*184|0)+(f*92|0)+20>>2]|0,5);ta(z,c[B+40+(h*184|0)+(f*92|0)+24>>2]|0,5);ta(z,c[B+40+(h*184|0)+(f*92|0)+28>>2]|0,5);ta(z,c[B+40+(h*184|0)+(f*92|0)+32>>2]|0,4);ta(z,c[B+40+(h*184|0)+(f*92|0)+36>>2]|0,3);if((c[i>>2]|0)==3)ta(z,c[B+40+(h*184|0)+(f*92|0)+40>>2]|0,1);ta(z,c[B+40+(h*184|0)+(f*92|0)+44>>2]|0,1);ta(z,c[B+40+(h*184|0)+(f*92|0)+48>>2]|0,1);f=f+1|0;g=c[a>>2]|0}while((f|0)<(g|0));b=c[y>>2]|0}h=h+1|0}while((h|0)<(b|0))}tb(B|0,j|0,408)|0;if((b|0)<=0){l=C;return}x=0;f=c[a>>2]|0;do{if((f|0)>0){w=(x|0)==0;v=0;do{f=c[B+40+(x*184|0)+(v*92|0)+16>>2]|0;b=c[1044+(f<<2)>>2]|0;f=c[1108+(f<<2)>>2]|0;if(!w?(c[B+8+(v<<4)>>2]|0)!=0:0)t=39;else{ta(z,c[a+1208+(x*176|0)+(v*88|0)>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+4>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+8>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+12>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+16>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+20>>2]|0,b);if(w)t=40;else t=39}if((t|0)==39)if(!(c[B+8+(v<<4)+4>>2]|0))t=40;else t=41;if((t|0)==40){ta(z,c[a+1208+(x*176|0)+(v*88|0)+24>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+28>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+32>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+36>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+40>>2]|0,b);if(w)t=42;else t=41}if((t|0)==41)if(!(c[B+8+(v<<4)+8>>2]|0))t=42;else t=43;if((t|0)==42){ta(z,c[a+1208+(x*176|0)+(v*88|0)+44>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+48>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+52>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+56>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+60>>2]|0,f);if(w)t=44;else t=43}if((t|0)==43?(t=0,(c[B+8+(v<<4)+12>>2]|0)==0):0)t=44;if((t|0)==44){t=0;ta(z,c[a+1208+(x*176|0)+(v*88|0)+64>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+68>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+72>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+76>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+80>>2]|0,f)}q=c[A>>2]|0;u=ua(z)|0;b=c[B+40+(x*184|0)+(v*92|0)+4>>2]<<1;s=c[B+40+(x*184|0)+(v*92|0)+32>>2]|0;r=c[1464+(q*92|0)+(s+1<<2)>>2]|0;s=c[1464+(q*92|0)+(s+2+(c[B+40+(x*184|0)+(v*92|0)+36>>2]|0)<<2)>>2]|0;if((b|0)>0){q=0;do{g=c[B+40+(x*184|0)+(v*92|0)+20+(((q|0)>=(r|0)&1)+((q|0)>=(s|0)&1)<<2)>>2]|0;do if(g|0){h=c[a+2224+(v*4608|0)+(x*2304|0)+(q<<2)>>2]|0;k=c[a+2224+(v*4608|0)+(x*2304|0)+((q|1)<<2)>>2]|0;i=(h|0)>0;h=i?h:0-h|0;i=(i^1)&1;o=(k|0)>0;k=o?k:0-k|0;o=(o^1)&1;f=c[8+(g*24|0)+4>>2]|0;if((g|0)<=15){p=(N(f,h)|0)+k|0;j=e[(c[8+(g*24|0)+16>>2]|0)+(p<<1)>>1]|0;n=(h|0)==0;j=n?j:j<<1|i;m=(k|0)==0;ta(z,m?j:j<<1|o,((m^1)&1)+((n^1)&1)+(d[(c[8+(g*24|0)+20>>2]|0)+p>>0]|0)|0);break}m=c[8+(g*24|0)+8>>2]|0;E=(h|0)>14;F=E?15:h;D=(k|0)>14;j=D?15:k;n=(N(F,f)|0)+j|0;p=e[(c[8+(g*24|0)+16>>2]|0)+(n<<1)>>1]|0;n=d[(c[8+(g*24|0)+20>>2]|0)+n>>0]|0;f=E?h+-15|0:0;g=(F|0)==0;f=g?f:f<<1|i;g=(E?m:0)+((g^1)&1)|0;if(!D){if(j)t=51}else{g=g+m|0;f=f<<m|k+2147483633;t=51}if((t|0)==51){t=0;g=g+1|0;f=f<<1|o}ta(z,p,n);ta(z,f,g)}while(0);q=q+2|0}while((q|0)<(b|0))}f=(c[B+40+(x*184|0)+(v*92|0)+48>>2]|0)+32|0;h=(c[B+40+(x*184|0)+(v*92|0)+8>>2]<<2)+b|0;if((b|0)<(h|0)){g=c[8+(f*24|0)+16>>2]|0;f=c[8+(f*24|0)+20>>2]|0;do{E=c[a+2224+(v*4608|0)+(x*2304|0)+(b<<2)>>2]|0;D=c[a+2224+(v*4608|0)+(x*2304|0)+((b|1)<<2)>>2]|0;t=c[a+2224+(v*4608|0)+(x*2304|0)+(b+2<<2)>>2]|0;F=c[a+2224+(v*4608|0)+(x*2304|0)+(b+3<<2)>>2]|0;p=(E|0)>0;E=p?E:0-E|0;q=(D|0)>0;D=q?D:0-D|0;r=(t|0)>0;t=r?t:0-t|0;s=(F|0)>0;F=s?F:0-F|0;o=(D<<1)+E+(t<<2)+(F<<3)|0;ta(z,e[g+(o<<1)>>1]|0,d[f+o>>0]|0);E=(E|0)==0;p=((p|E)^1)&1;D=(D|0)==0;q=D?p:p<<1|(q^1)&1;t=(t|0)==0;r=t?q:q<<1|(r^1)&1;F=(F|0)==0;ta(z,F?r:r<<1|(s^1)&1,((t^1)&1)+(D?(E^1)&1:E?1:2)+((F^1)&1)|0);b=b+4|0}while((b|0)<(h|0))}b=ua(z)|0;b=(c[B+40+(x*184|0)+(v*92|0)>>2]|0)-(c[B+40+(x*184|0)+(v*92|0)+52>>2]|0)+(u-b)|0;if(b|0){f=(b|0)%32|0;if((b+31|0)>>>0>=63){b=(b|0)/32|0;do{b=b+-1|0;ta(z,-1,32)}while((b|0)!=0)}if(f|0)ta(z,(1<<f)+-1|0,f)}v=v+1|0;f=c[a>>2]|0}while((v|0)<(f|0));b=c[y>>2]|0}x=x+1|0}while((x|0)<(b|0));l=C;return}function wa(a,b,e,f,g,i){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0,L=0,M=0,O=0,P=0;J=e+72|0;if((b|0)<0)c[J>>2]=(c[J>>2]|0)+-1;v=i+39100|0;w=i+34488|0;x=e+8|0;z=e+4|0;A=e+48|0;C=e+32|0;D=e+36|0;E=e+20|0;F=e+24|0;G=e+28|0;H=e+60|0;I=e+64|0;r=e+68|0;s=i+72|0;t=c[199]|0;u=c[205]|0;do{while(1){f=c[J>>2]|0;c[J>>2]=f+1;f=f+128|0;l=c[i+40480+(f<<2)>>2]|0;q=c[v>>2]|0;m=((l|0)<0)<<31>>31;q=rb(q|0,((q|0)<0)<<31>>31|0,l|0,m|0)|0;nb(q|0,y|0,-2147483648,0)|0;if((y|0)>165140)continue;k=i+39456+(f<<3)|0;j=c[w>>2]|0;g=0;e=0;do{f=c[j+(e<<2)>>2]|0;f=(f|0)>-1?f:0-f|0;f=rb(f|0,((f|0)<0)<<31>>31|0,l|0,m|0)|0;nb(f|0,y|0,-2147483648,0)|0;f=y;if((f|0)<1e4)f=c[i+40992+(f<<2)>>2]|0;else{K=+h[k>>3]*+(c[i+36796+(e<<2)>>2]|0)*4.656612875e-10;f=~~+B(+(+B(+K)*K))}c[a+(e<<2)>>2]=f;g=(g|0)<(f|0)?f:g;e=e+1|0}while((e|0)!=576);if((g|0)<=8192){g=576;break}}while(1){if((g|0)<=1){n=13;break}if(c[a+(g+-1<<2)>>2]|0){n=16;break}f=g+-2|0;if(!(c[a+(f<<2)>>2]|0))g=f;else{n=16;break}}do if((n|0)==13){c[x>>2]=0;n=23}else if((n|0)==16){c[x>>2]=0;if((g|0)>3){j=0;while(1){if((c[a+(g+-1<<2)>>2]|0)>=2){n=24;break}if((c[a+(g+-2<<2)>>2]|0)>=2){n=24;break}if((c[a+(g+-3<<2)>>2]|0)>=2){n=24;break}f=g+-4|0;e=j+1|0;if((c[a+(f<<2)>>2]|0)>=2){n=24;break}c[x>>2]=e;if((f|0)>3){g=f;j=e}else{n=18;break}}if((n|0)==18){n=0;q=f>>1;c[z>>2]=q;g=f;f=q}else if((n|0)==24){n=0;f=g>>>1;c[z>>2]=f;if(!j){k=0;j=0;break}else e=j}j=0;l=g;m=0;k=0;while(1){o=c[a+(l<<2)>>2]|0;L=c[a+((l|1)<<2)>>2]|0;M=c[a+(l+2<<2)>>2]|0;p=c[a+(l+3<<2)>>2]|0;q=(L<<1)+o+(M<<2)+(p<<3)|0;o=(o|0)!=0;p=((M|0)!=0&1)+((L|0)==0?o&1:o?2:1)+((p|0)!=0&1)|0;j=(d[t+q>>0]|0)+j+p|0;k=p+k+(d[u+q>>0]|0)|0;m=m+1|0;if((m|0)==(e|0))break;else l=l+4|0}}else n=23}while(0);if((n|0)==23){f=g>>1;c[z>>2]=f;k=0;j=0}M=(j|0)<(k|0);q=M?j:k;c[A>>2]=(M^1)&1;if(!f){c[C>>2]=0;c[D>>2]=0;j=c[H>>2]|0}else{j=c[s>>2]|0;e=0;while(1)if((c[1464+(j*92|0)+(e<<2)>>2]|0)<(g|0))e=e+1|0;else break;f=c[824+(e<<3)>>2]|0;while(1){k=1464+(j*92|0)+(f+1<<2)|0;l=c[k>>2]|0;if((f|0)!=0&(l|0)>(g|0))f=f+-1|0;else break}c[C>>2]=f;c[H>>2]=l;f=c[824+(e<<3)+4>>2]|0;while(1){e=c[k+(f+1<<2)>>2]|0;if((f|0)!=0&(e|0)>(g|0))f=f+-1|0;else break}c[D>>2]=f;c[I>>2]=e;c[r>>2]=g;j=l}c[E>>2]=0;c[F>>2]=0;c[G>>2]=0;if(!j)k=0;else{k=xa(a,0,j)|0;c[E>>2]=k}e=c[I>>2]|0;n=e>>>0>j>>>0;if(n){o=xa(a,j,e)|0;c[F>>2]=o}else o=0;if(g>>>0>e>>>0){p=xa(a,e,g)|0;c[G>>2]=p}else p=0;do if(k){m=c[8+(k*24|0)+4>>2]|0;l=c[8+(k*24|0)+8>>2]|0;f=(j|0)!=0;if(k>>>0>15){if(!f){f=0;break}k=c[8+(k*24|0)+20>>2]|0;f=0;g=0;do{L=c[a+(g<<2)>>2]|0;M=c[a+((g|1)<<2)>>2]|0;P=(L|0)>14;L=P?15:L;O=(M|0)>14;M=O?15:M;f=(P?l:0)+f+(O?l:0)+(d[k+((N(L,m)|0)+M)>>0]|0)+((L|0)!=0&1)+((M|0)!=0&1)|0;g=g+2|0}while(g>>>0<j>>>0)}else{if(!f){f=0;break}k=c[8+(k*24|0)+20>>2]|0;g=0;f=0;do{O=c[a+(g<<2)>>2]|0;P=c[a+((g|1)<<2)>>2]|0;f=((O|0)!=0&1)+f+((P|0)!=0&1)+(d[k+((N(O,m)|0)+P)>>0]|0)|0;g=g+2|0}while(g>>>0<j>>>0)}}else f=0;while(0);if(o){m=c[8+(o*24|0)+4>>2]|0;l=c[8+(o*24|0)+8>>2]|0;if(o>>>0>15)if(n){k=c[8+(o*24|0)+20>>2]|0;g=0;do{O=c[a+(j<<2)>>2]|0;P=c[a+(j+1<<2)>>2]|0;L=(O|0)>14;O=L?15:O;M=(P|0)>14;P=M?15:P;g=(L?l:0)+g+(M?l:0)+(d[k+((N(O,m)|0)+P)>>0]|0)+((O|0)!=0&1)+((P|0)!=0&1)|0;j=j+2|0}while(j>>>0<e>>>0)}else g=0;else if(n){k=c[8+(o*24|0)+20>>2]|0;g=0;do{O=c[a+(j<<2)>>2]|0;P=c[a+(j+1<<2)>>2]|0;g=((O|0)!=0&1)+g+((P|0)!=0&1)+(d[k+((N(O,m)|0)+P)>>0]|0)|0;j=j+2|0}while(j>>>0<e>>>0)}else g=0;f=g+f|0}if(p){l=c[r>>2]|0;m=c[8+(p*24|0)+4>>2]|0;k=c[8+(p*24|0)+8>>2]|0;g=e>>>0<l>>>0;if(p>>>0>15)if(g){j=c[8+(p*24|0)+20>>2]|0;g=0;do{O=c[a+(e<<2)>>2]|0;P=c[a+(e+1<<2)>>2]|0;L=(O|0)>14;O=L?15:O;M=(P|0)>14;P=M?15:P;g=(L?k:0)+g+(M?k:0)+(d[j+((N(O,m)|0)+P)>>0]|0)+((O|0)!=0&1)+((P|0)!=0&1)|0;e=e+2|0}while(e>>>0<l>>>0)}else g=0;else if(g){j=c[8+(p*24|0)+20>>2]|0;g=0;do{O=c[a+(e<<2)>>2]|0;P=c[a+(e+1<<2)>>2]|0;g=((O|0)!=0&1)+g+((P|0)!=0&1)+(d[j+((N(O,m)|0)+P)>>0]|0)|0;e=e+2|0}while(e>>>0<l>>>0)}else g=0;f=g+f|0}f=f+q|0}while((f|0)>(b|0));return f|0}function xa(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if(b>>>0<e>>>0){f=b;g=0}else{e=0;return e|0}do{m=c[a+(f<<2)>>2]|0;g=(g|0)<(m|0)?m:g;f=f+1|0}while((f|0)!=(e|0));if(!g){e=0;return e|0}if((g|0)>=15){f=g+-15|0;if((c[95]|0)>>>0<f>>>0)if((c[101]|0)>>>0<f>>>0)if((c[107]|0)>>>0<f>>>0)if((c[113]|0)>>>0<f>>>0)if((c[119]|0)>>>0<f>>>0)if((c[125]|0)>>>0<f>>>0)if((c[131]|0)>>>0<f>>>0)if((c[137]|0)>>>0<f>>>0)m=(c[143]|0)>>>0<f>>>0?0:23;else m=22;else m=21;else m=20;else m=19;else m=18;else m=17;else m=16;else m=15;if((c[149]|0)>>>0<f>>>0)if((c[155]|0)>>>0<f>>>0)if((c[161]|0)>>>0<f>>>0)if((c[167]|0)>>>0<f>>>0)if((c[173]|0)>>>0<f>>>0)if((c[179]|0)>>>0<f>>>0)if((c[185]|0)>>>0<f>>>0)l=(c[191]|0)>>>0<f>>>0?0:31;else l=30;else l=29;else l=28;else l=27;else l=26;else l=25;else l=24;if(m){i=c[8+(m*24|0)+4>>2]|0;h=c[8+(m*24|0)+8>>2]|0;j=c[8+(m*24|0)+20>>2]|0;if(m>>>0>15){f=0;g=b;do{n=c[a+(g<<2)>>2]|0;k=c[a+(g+1<<2)>>2]|0;p=(n|0)>14;n=p?15:n;o=(k|0)>14;k=o?15:k;f=(p?h:0)+f+(o?h:0)+(d[j+((N(n,i)|0)+k)>>0]|0)+((n|0)!=0&1)+((k|0)!=0&1)|0;g=g+2|0}while(g>>>0<e>>>0);k=f}else{g=b;f=0;do{o=c[a+(g<<2)>>2]|0;p=c[a+(g+1<<2)>>2]|0;f=((o|0)!=0&1)+f+((p|0)!=0&1)+(d[j+((N(o,i)|0)+p)>>0]|0)|0;g=g+2|0}while(g>>>0<e>>>0);k=f}}else k=0;if(!l){p=0;p=(p|0)<(k|0);p=p?l:m;return p|0}i=c[8+(l*24|0)+4>>2]|0;h=c[8+(l*24|0)+8>>2]|0;j=c[8+(l*24|0)+20>>2]|0;if(l>>>0>15){f=0;g=b;do{o=c[a+(g<<2)>>2]|0;p=c[a+(g+1<<2)>>2]|0;b=(o|0)>14;o=b?15:o;n=(p|0)>14;p=n?15:p;f=(b?h:0)+f+(n?h:0)+(d[j+((N(o,i)|0)+p)>>0]|0)+((o|0)!=0&1)+((p|0)!=0&1)|0;g=g+2|0}while(g>>>0<e>>>0);p=(f|0)<(k|0);p=p?l:m;return p|0}else{g=b;f=0;do{o=c[a+(g<<2)>>2]|0;p=c[a+(g+1<<2)>>2]|0;f=((o|0)!=0&1)+f+((p|0)!=0&1)+(d[j+((N(o,i)|0)+p)>>0]|0)|0;g=g+2|0}while(g>>>0<e>>>0);p=(f|0)<(k|0);p=p?l:m;return p|0}}else k=14;while(1){l=k+-1|0;if(!k){f=0;h=44;break}if((c[8+(l*24|0)>>2]|0)>>>0>g>>>0)break;else k=l}if((h|0)==44)return f|0;if(!l){p=0;return p|0}i=c[8+(l*24|0)+4>>2]|0;h=c[8+(l*24|0)+8>>2]|0;j=c[8+(l*24|0)+20>>2]|0;if(l>>>0>15){f=0;g=b;do{o=c[a+(g<<2)>>2]|0;p=c[a+(g+1<<2)>>2]|0;m=(o|0)>14;o=m?15:o;n=(p|0)>14;p=n?15:p;f=(m?h:0)+f+(n?h:0)+(d[j+((N(o,i)|0)+p)>>0]|0)+((o|0)!=0&1)+((p|0)!=0&1)|0;g=g+2|0}while(g>>>0<e>>>0);j=f}else{g=b;f=0;do{o=c[a+(g<<2)>>2]|0;p=c[a+(g+1<<2)>>2]|0;f=((o|0)!=0&1)+f+((p|0)!=0&1)+(d[j+((N(o,i)|0)+p)>>0]|0)|0;g=g+2|0}while(g>>>0<e>>>0);j=f}switch(k|0){case 3:{h=c[21]|0;i=c[25]|0;f=b;g=0;do{o=c[a+(f<<2)>>2]|0;p=c[a+(f+1<<2)>>2]|0;g=((o|0)!=0&1)+g+((p|0)!=0&1)+(d[i+((N(o,h)|0)+p)>>0]|0)|0;f=f+2|0}while(f>>>0<e>>>0);p=(g|0)>(j|0)?l:3;return p|0}case 6:{h=c[39]|0;i=c[43]|0;f=b;g=0;do{o=c[a+(f<<2)>>2]|0;p=c[a+(f+1<<2)>>2]|0;g=((o|0)!=0&1)+g+((p|0)!=0&1)+(d[i+((N(o,h)|0)+p)>>0]|0)|0;f=f+2|0}while(f>>>0<e>>>0);p=(g|0)>(j|0)?l:6;return p|0}case 8:{g=c[51]|0;h=c[55]|0;f=b;i=0;do{o=c[a+(f<<2)>>2]|0;p=c[a+(f+1<<2)>>2]|0;i=((o|0)!=0&1)+i+((p|0)!=0&1)+(d[h+((N(o,g)|0)+p)>>0]|0)|0;f=f+2|0}while(f>>>0<e>>>0);h=(i|0)>(j|0);k=h?l:8;h=h?j:i;i=c[57]|0;j=c[61]|0;f=b;g=0;do{o=c[a+(f<<2)>>2]|0;p=c[a+(f+1<<2)>>2]|0;g=((o|0)!=0&1)+g+((p|0)!=0&1)+(d[j+((N(o,i)|0)+p)>>0]|0)|0;f=f+2|0}while(f>>>0<e>>>0);return ((g|0)>(h|0)?k:9)|0}case 11:{g=c[69]|0;h=c[73]|0;f=b;i=0;do{o=c[a+(f<<2)>>2]|0;p=c[a+(f+1<<2)>>2]|0;i=((o|0)!=0&1)+i+((p|0)!=0&1)+(d[h+((N(o,g)|0)+p)>>0]|0)|0;f=f+2|0}while(f>>>0<e>>>0);h=(i|0)>(j|0);k=h?l:11;h=h?j:i;i=c[75]|0;j=c[79]|0;f=b;g=0;do{o=c[a+(f<<2)>>2]|0;p=c[a+(f+1<<2)>>2]|0;g=((o|0)!=0&1)+g+((p|0)!=0&1)+(d[j+((N(o,i)|0)+p)>>0]|0)|0;f=f+2|0}while(f>>>0<e>>>0);p=(g|0)>(h|0)?k:12;return p|0}case 14:{h=c[93]|0;i=c[97]|0;f=b;g=0;do{o=c[a+(f<<2)>>2]|0;p=c[a+(f+1<<2)>>2]|0;g=((o|0)!=0&1)+g+((p|0)!=0&1)+(d[i+((N(o,h)|0)+p)>>0]|0)|0;f=f+2|0}while(f>>>0<e>>>0);p=(g|0)>(j|0)?l:15;return p|0}default:{p=l;return p|0}}return 0}function ya(a,b,e,f,g,i){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,O=0,P=0,Q=0.0,R=0,S=0,T=0,U=0;K=i+39100|0;L=i+34488|0;M=i+156+(f*184|0)+(g*92|0)+8|0;O=i+156+(f*184|0)+(g*92|0)+4|0;u=i+156+(f*184|0)+(g*92|0)+48|0;v=i+156+(f*184|0)+(g*92|0)+32|0;w=i+156+(f*184|0)+(g*92|0)+36|0;x=i+156+(f*184|0)+(g*92|0)+20|0;z=i+156+(f*184|0)+(g*92|0)+24|0;A=i+156+(f*184|0)+(g*92|0)+28|0;C=i+156+(f*184|0)+(g*92|0)+60|0;D=i+156+(f*184|0)+(g*92|0)+64|0;E=i+156+(f*184|0)+(g*92|0)+68|0;F=i+72|0;G=c[199]|0;H=c[205]|0;t=120;P=-120;do{I=(t|0)/2|0;J=I+P|0;b=J+127|0;n=c[i+40480+(b<<2)>>2]|0;s=c[K>>2]|0;o=((n|0)<0)<<31>>31;s=rb(s|0,((s|0)<0)<<31>>31|0,n|0,o|0)|0;nb(s|0,y|0,-2147483648,0)|0;if((y|0)<=165140){m=i+39456+(b<<3)|0;l=c[L>>2]|0;j=0;k=0;do{b=c[l+(k<<2)>>2]|0;b=(b|0)>-1?b:0-b|0;b=rb(b|0,((b|0)<0)<<31>>31|0,n|0,o|0)|0;nb(b|0,y|0,-2147483648,0)|0;b=y;if((b|0)<1e4)b=c[i+40992+(b<<2)>>2]|0;else{Q=+h[m>>3]*+(c[i+36796+(k<<2)>>2]|0)*4.656612875e-10;b=~~+B(+(+B(+Q)*Q))}c[e+(k<<2)>>2]=b;j=(j|0)<(b|0)?b:j;k=k+1|0}while((k|0)!=576);if((j|0)<=8192){j=576;while(1){if((j|0)<=1){n=10;break}if(c[e+(j+-1<<2)>>2]|0){n=13;break}b=j+-2|0;if(!(c[e+(b<<2)>>2]|0))j=b;else{n=13;break}}do if((n|0)==10){c[M>>2]=0;n=20}else if((n|0)==13){c[M>>2]=0;if((j|0)>3){l=0;while(1){if((c[e+(j+-1<<2)>>2]|0)>=2){n=21;break}if((c[e+(j+-2<<2)>>2]|0)>=2){n=21;break}if((c[e+(j+-3<<2)>>2]|0)>=2){n=21;break}b=j+-4|0;k=l+1|0;if((c[e+(b<<2)>>2]|0)>=2){n=21;break}c[M>>2]=k;if((b|0)>3){j=b;l=k}else{n=15;break}}if((n|0)==15){s=b>>1;c[O>>2]=s;j=b;b=s}else if((n|0)==21){b=j>>>1;c[O>>2]=b;if(!l){c[u>>2]=1;b=0;n=27;break}else k=l}l=0;n=j;o=0;m=0;while(1){q=c[e+(n<<2)>>2]|0;p=c[e+((n|1)<<2)>>2]|0;R=c[e+(n+2<<2)>>2]|0;r=c[e+(n+3<<2)>>2]|0;s=(p<<1)+q+(R<<2)+(r<<3)|0;q=(q|0)!=0;r=((R|0)!=0&1)+((p|0)==0?q&1:q?2:1)+((r|0)!=0&1)|0;l=(d[G+s>>0]|0)+l+r|0;m=r+m+(d[H+s>>0]|0)|0;o=o+1|0;if((o|0)==(k|0)){k=b;n=25;break}else n=n+4|0}}else n=20}while(0);if((n|0)==20){k=j>>1;c[O>>2]=k;m=0;l=0;n=25}if((n|0)==25){n=0;R=(l|0)<(m|0);b=R?l:m;c[u>>2]=(R^1)&1;if(!k){c[v>>2]=0;c[w>>2]=0;s=b;l=c[C>>2]|0}else n=27}if((n|0)==27){m=c[F>>2]|0;l=0;while(1)if((c[1464+(m*92|0)+(l<<2)>>2]|0)<(j|0))l=l+1|0;else break;k=c[824+(l<<3)>>2]|0;while(1){n=1464+(m*92|0)+(k+1<<2)|0;o=c[n>>2]|0;if((k|0)!=0&(o|0)>(j|0))k=k+-1|0;else break}c[v>>2]=k;c[C>>2]=o;k=c[824+(l<<3)+4>>2]|0;while(1){l=c[n+(k+1<<2)>>2]|0;if((k|0)!=0&(l|0)>(j|0))k=k+-1|0;else break}c[w>>2]=k;c[D>>2]=l;c[E>>2]=j;s=b;l=o}c[x>>2]=0;c[z>>2]=0;c[A>>2]=0;if(!l)m=0;else{m=xa(e,0,l)|0;c[x>>2]=m}k=c[D>>2]|0;p=k>>>0>l>>>0;if(p){q=xa(e,l,k)|0;c[z>>2]=q}else q=0;if(j>>>0>k>>>0){r=xa(e,k,j)|0;c[A>>2]=r}else r=0;do if(m){o=c[8+(m*24|0)+4>>2]|0;n=c[8+(m*24|0)+8>>2]|0;b=(l|0)!=0;if(m>>>0>15){if(!b){b=0;break}m=c[8+(m*24|0)+20>>2]|0;b=0;j=0;do{S=c[e+(j<<2)>>2]|0;R=c[e+((j|1)<<2)>>2]|0;U=(S|0)>14;S=U?15:S;T=(R|0)>14;R=T?15:R;b=(U?n:0)+b+(T?n:0)+(d[m+((N(S,o)|0)+R)>>0]|0)+((S|0)!=0&1)+((R|0)!=0&1)|0;j=j+2|0}while(j>>>0<l>>>0)}else{if(!b){b=0;break}m=c[8+(m*24|0)+20>>2]|0;j=0;b=0;do{T=c[e+(j<<2)>>2]|0;U=c[e+((j|1)<<2)>>2]|0;b=((T|0)!=0&1)+b+((U|0)!=0&1)+(d[m+((N(T,o)|0)+U)>>0]|0)|0;j=j+2|0}while(j>>>0<l>>>0)}}else b=0;while(0);if(q){o=c[8+(q*24|0)+4>>2]|0;n=c[8+(q*24|0)+8>>2]|0;if(q>>>0>15)if(p){m=c[8+(q*24|0)+20>>2]|0;j=0;do{T=c[e+(l<<2)>>2]|0;U=c[e+(l+1<<2)>>2]|0;R=(T|0)>14;T=R?15:T;S=(U|0)>14;U=S?15:U;j=(R?n:0)+j+(S?n:0)+(d[m+((N(T,o)|0)+U)>>0]|0)+((T|0)!=0&1)+((U|0)!=0&1)|0;l=l+2|0}while(l>>>0<k>>>0)}else j=0;else if(p){m=c[8+(q*24|0)+20>>2]|0;j=0;do{T=c[e+(l<<2)>>2]|0;U=c[e+(l+1<<2)>>2]|0;j=((T|0)!=0&1)+j+((U|0)!=0&1)+(d[m+((N(T,o)|0)+U)>>0]|0)|0;l=l+2|0}while(l>>>0<k>>>0)}else j=0;b=j+b|0}if(r){n=c[E>>2]|0;o=c[8+(r*24|0)+4>>2]|0;m=c[8+(r*24|0)+8>>2]|0;j=k>>>0<n>>>0;if(r>>>0>15)if(j){l=c[8+(r*24|0)+20>>2]|0;j=0;do{T=c[e+(k<<2)>>2]|0;U=c[e+(k+1<<2)>>2]|0;R=(T|0)>14;T=R?15:T;S=(U|0)>14;U=S?15:U;j=(R?m:0)+j+(S?m:0)+(d[l+((N(T,o)|0)+U)>>0]|0)+((T|0)!=0&1)+((U|0)!=0&1)|0;k=k+2|0}while(k>>>0<n>>>0)}else j=0;else if(j){l=c[8+(r*24|0)+20>>2]|0;j=0;do{T=c[e+(k<<2)>>2]|0;U=c[e+(k+1<<2)>>2]|0;j=((T|0)!=0&1)+j+((U|0)!=0&1)+(d[l+((N(T,o)|0)+U)>>0]|0)|0;k=k+2|0}while(k>>>0<n>>>0)}else j=0;b=j+b|0}b=b+s|0}else b=1e5}else b=1e5;U=(b|0)<(a|0);P=U?P:J;t=U?I:t-I|0}while((t|0)>1);l=i+156+(f*184|0)+(g*92|0)|0;c[i+156+(f*184|0)+(g*92|0)+72>>2]=P;b=c[i+156+(f*184|0)+(g*92|0)+16>>2]|0;k=c[1044+(b<<2)>>2]|0;b=c[1108+(b<<2)>>2]|0;if(f){j=b*5|0;b=((c[i+124+(g<<4)+4>>2]|0)==0?k*5|0:0)+((c[i+124+(g<<4)>>2]|0)==0?k*6|0:0)+((c[i+124+(g<<4)+8>>2]|0)==0?j:0)|0;if(c[i+124+(g<<4)+12>>2]|0){U=b;T=i+156+(f*184|0)+(g*92|0)+52|0;c[T>>2]=U;U=a-U|0;U=wa(e,U,l,0,0,i)|0;T=c[T>>2]|0;U=T+U|0;c[l>>2]=U;return U|0}}else{j=b*5|0;b=j+(k*11|0)|0}U=b+j|0;T=i+156+(f*184|0)+(g*92|0)+52|0;c[T>>2]=U;U=a-U|0;U=wa(e,U,l,0,0,i)|0;T=c[T>>2]|0;U=T+U|0;c[l>>2]=U;return U|0}function za(a){a=a|0;var b=0,d=0,e=0,f=0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;F=l;l=l+672|0;t=F;b=c[a>>2]|0;if(!b){Pa(a);l=F;return}z=a+16|0;A=a+34488|0;B=a+39100|0;C=a+8|0;D=a+72|0;E=a+39452|0;u=a+39448|0;v=a+39104|0;w=a+39108|0;x=b*23|0;d=c[z>>2]|0;s=0;while(1){r=x+(N(s,-23)|0)|0;b=b+-1|0;if((d|0)>0){q=a+((b<<4)+124)|0;p=0;while(1){o=a+140+(r+(p*46|0)<<2)|0;c[A>>2]=a+25264+(b*4608|0)+(p*2304|0);d=576;e=0;a:while(1){c[B>>2]=e;while(1){f=d+-1|0;if(!d)break a;n=c[(c[A>>2]|0)+(f<<2)>>2]|0;e=((n|0)<0)<<31>>31;e=rb(n|0,e|0,n|0,e|0)|0;e=nb(e|0,y|0,1073741824,0)|0;e=pb(e|0,y|0,31)|0;c[a+34492+(f<<2)>>2]=e;e=c[(c[A>>2]|0)+(f<<2)>>2]|0;e=(e|0)>-1?e:0-e|0;c[a+36796+(f<<2)>>2]=e;if((e|0)>(c[B>>2]|0)){d=f;continue a}else d=f}}m=a+2224+(b*4608|0)+(p*2304|0)|0;n=a+156+(p*184|0)+(b*92|0)|0;c[a+156+(p*184|0)+(b*92|0)+56>>2]=21;ob(t+(p*336|0)+(b*168|0)|0,0,168)|0;b:do if((c[C>>2]|0)==3){k=c[D>>2]|0;c[a+39448+(p<<2)>>2]=c[B>>2];d=0;e=575;while(1){d=(c[a+34492+(e<<2)>>2]>>10)+d|0;if(!e)break;else e=e+-1|0}if(!d)d=0;else d=~~(+L(+(+(d|0)*4.768371584e-07))/.69314718);c[a+39104+(p<<2)>>2]=d;i=20;j=c[1464+(k*92|0)+84>>2]|0;while(1){f=j;j=c[1464+(k*92|0)+(i<<2)>>2]|0;if((j|0)<(f|0)){d=0;e=j;do{d=(c[a+34492+(e<<2)>>2]>>10)+d|0;e=e+1|0}while((e|0)!=(f|0));if(d)d=~~(+L(+(+(d|0)*4.768371584e-07))/.69314718);else d=0}else d=0;c[a+39112+(p*84|0)+(i<<2)>>2]=d;g=+h[t+(p*336|0)+(b*168|0)+(i<<3)>>3];if(g!=0.0)d=~~(+L(+g)/.69314718);else d=0;c[a+39280+(p*84|0)+(i<<2)>>2]=d;if(!i)break;else i=i+-1|0}if((p|0)==1){j=(c[u>>2]|0)!=0;e=c[E>>2]|0?3:2;i=(c[v>>2]|0)-(c[w>>2]|0)|0;i=(((i|0)>-1?i:0-i|0)|0)<10;d=0;f=20;while(1){k=(c[a+39112+(f<<2)>>2]|0)-(c[a+39196+(f<<2)>>2]|0)|0;d=((k|0)>-1?k:0-k|0)+d|0;if(!f)break;else f=f+-1|0}if(((j&1)+e+(i&1)+((d|0)<100&1)|0)==6){d=0;e=0}else{c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;break}do{while(1){k=a+124+(b<<4)+(d<<2)|0;c[k>>2]=0;d=d+1|0;j=e;e=c[1008+(d<<2)>>2]|0;if((j|0)<(e|0)){f=0;i=0;do{G=(c[a+39112+(j<<2)>>2]|0)-(c[a+39196+(j<<2)>>2]|0)|0;f=((G|0)>-1?G:0-G|0)+f|0;G=(c[a+39280+(j<<2)>>2]|0)-(c[a+39364+(j<<2)>>2]|0)|0;i=((G|0)>-1?G:0-G|0)+i|0;j=j+1|0}while((j|0)!=(e|0))}else{i=0;f=0}if((f|0)<10&(i|0)<10)break;c[k>>2]=0;if((d|0)>=4)break b}c[k>>2]=1}while((d|0)<4)}}while(0);d=Na(a+2192+(b<<4)+(p<<3)|0,a)|0;e=a+1208+(p*176|0)+(b*88|0)|0;f=e+88|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));ob(a+1560+(p*312|0)+(b*156|0)|0,0,156)|0;c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[n>>2]=0;c[a+156+(p*184|0)+(b*92|0)+4>>2]=0;c[a+156+(p*184|0)+(b*92|0)+8>>2]=0;e=a+156+(p*184|0)+(b*92|0)+16|0;f=e+40|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));if(c[B>>2]|0)c[n>>2]=ya(d,0,m,p,b,a)|0;Oa(n,a);c[a+156+(p*184|0)+(b*92|0)+12>>2]=(c[a+156+(p*184|0)+(b*92|0)+72>>2]|0)+210;p=p+1|0;d=c[z>>2]|0;if((p|0)>=(d|0))break}}if(!b)break;else s=s+1|0}Pa(a);l=F;return}function Aa(a){a=a|0;var b=0,d=0,e=0.0;b=128;d=127;while(1){e=+Y(+(+(128-b|0)*.25));h[a+39456+(d<<3)>>3]=e;e=e*2.0;c[a+40480+(d<<2)>>2]=e>2147483647.0?2147483647:~~(e+.5);if(!d){b=9999;break}else{b=d;d=d+-1|0}}while(1){e=+(b|0);c[a+40992+(b<<2)>>2]=~~(+B(+(e*+B(+e)))+-.0946+.5);if(!b)break;else b=b+-1|0}return}function Ba(a){a=a|0;var b=0,d=0.0,e=0;b=17;while(1){d=+(b<<1|1|0);e=35;while(1){c[a+80992+(b*144|0)+(e<<2)>>2]=~~(+E(+((+(e|0)+.5)*.087266462599717))*+D(+(d*(+((e<<1)+19|0)*.043633231299858195)))*2147483647.0);if(!e)break;else e=e+-1|0}if(!b)break;else b=b+-1|0}return}function Ca(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;s=l;l=l+144|0;p=s;d=c[a>>2]|0;if(!d){l=s;return}q=a+16|0;r=p+140|0;do{d=d+-1|0;e=c[q>>2]|0;if((e|0)>0){o=a+2184+(d<<2)|0;n=0;do{m=a+25264+(d*4608|0)+(n*2304|0)|0;k=n;n=n+1|0;e=0;do{Ea(o,a+11440+(d*6912|0)+(n*2304|0)+(e<<7)|0,d,a,b);j=e|1;Ea(o,a+11440+(d*6912|0)+(n*2304|0)+(j<<7)|0,d,a,b);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+4|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+12|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+20|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+28|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+36|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+44|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+52|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+60|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+68|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+76|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+84|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+92|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+100|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+108|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+116|0;c[i>>2]=0-(c[i>>2]|0);j=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+124|0;c[j>>2]=0-(c[j>>2]|0);e=e+2|0}while((e|0)<18);j=0;while(1){e=18;f=17;while(1){c[p+(f<<2)>>2]=c[a+11440+(d*6912|0)+(k*2304|0)+(f<<7)+(j<<2)>>2];c[p+(e+17<<2)>>2]=c[a+11440+(d*6912|0)+(n*2304|0)+(f<<7)+(j<<2)>>2];if(!f)break;else{e=f;f=f+-1|0}}g=c[r>>2]|0;h=((g|0)<0)<<31>>31;i=17;while(1){e=c[a+80992+(i*144|0)+140>>2]|0;rb(e|0,((e|0)<0)<<31>>31|0,g|0,h|0)|0;e=35;f=y;do{v=e+-1|0;t=c[p+(v<<2)>>2]|0;v=c[a+80992+(i*144|0)+(v<<2)>>2]|0;rb(v|0,((v|0)<0)<<31>>31|0,t|0,((t|0)<0)<<31>>31|0)|0;t=y+f|0;v=e+-2|0;u=c[p+(v<<2)>>2]|0;v=c[a+80992+(i*144|0)+(v<<2)>>2]|0;rb(v|0,((v|0)<0)<<31>>31|0,u|0,((u|0)<0)<<31>>31|0)|0;t=t+y|0;u=e+-3|0;v=c[p+(u<<2)>>2]|0;u=c[a+80992+(i*144|0)+(u<<2)>>2]|0;rb(u|0,((u|0)<0)<<31>>31|0,v|0,((v|0)<0)<<31>>31|0)|0;t=t+y|0;v=e+-4|0;u=c[p+(v<<2)>>2]|0;v=c[a+80992+(i*144|0)+(v<<2)>>2]|0;rb(v|0,((v|0)<0)<<31>>31|0,u|0,((u|0)<0)<<31>>31|0)|0;t=t+y|0;u=e+-5|0;v=c[p+(u<<2)>>2]|0;u=c[a+80992+(i*144|0)+(u<<2)>>2]|0;rb(u|0,((u|0)<0)<<31>>31|0,v|0,((v|0)<0)<<31>>31|0)|0;t=t+y|0;v=e+-6|0;u=c[p+(v<<2)>>2]|0;v=c[a+80992+(i*144|0)+(v<<2)>>2]|0;rb(v|0,((v|0)<0)<<31>>31|0,u|0,((u|0)<0)<<31>>31|0)|0;t=t+y|0;e=e+-7|0;u=c[p+(e<<2)>>2]|0;v=c[a+80992+(i*144|0)+(e<<2)>>2]|0;rb(v|0,((v|0)<0)<<31>>31|0,u|0,((u|0)<0)<<31>>31|0)|0;f=t+y|0}while((e|0)!=0);c[m+(j*72|0)+(i<<2)>>2]=f;if(!i)break;else i=i+-1|0}if(!j){j=1;continue}v=m+(j*72|0)|0;e=c[v>>2]|0;u=((e|0)<0)<<31>>31;w=rb(e|0,u|0,1841452035,0)|0;i=y;t=j+-1|0;h=m+(t*72|0)+68|0;g=c[h>>2]|0;f=((g|0)<0)<<31>>31;x=rb(g|0,f|0,1104871221,0)|0;i=nb(x|0,y|0,w|0,i|0)|0;i=pb(i|0,y|0,31)|0;u=rb(e|0,u|0,-1104871221,-1)|0;e=y;f=rb(g|0,f|0,1841452035,0)|0;e=nb(f|0,y|0,u|0,e|0)|0;e=pb(e|0,y|0,31)|0;c[h>>2]=e;c[v>>2]=i;v=m+(j*72|0)+4|0;i=c[v>>2]|0;h=((i|0)<0)<<31>>31;e=rb(i|0,h|0,1893526520,0)|0;u=y;f=m+(t*72|0)+64|0;g=c[f>>2]|0;w=((g|0)<0)<<31>>31;x=rb(g|0,w|0,1013036688,0)|0;u=nb(x|0,y|0,e|0,u|0)|0;u=pb(u|0,y|0,31)|0;h=rb(i|0,h|0,-1013036688,-1)|0;i=y;w=rb(g|0,w|0,1893526520,0)|0;i=nb(w|0,y|0,h|0,i|0)|0;i=pb(i|0,y|0,31)|0;c[f>>2]=i;c[v>>2]=u;v=m+(j*72|0)+8|0;u=c[v>>2]|0;f=((u|0)<0)<<31>>31;i=rb(u|0,f|0,2039311994,0)|0;h=y;w=m+(t*72|0)+60|0;g=c[w>>2]|0;e=((g|0)<0)<<31>>31;x=rb(g|0,e|0,672972958,0)|0;h=nb(x|0,y|0,i|0,h|0)|0;h=pb(h|0,y|0,31)|0;f=rb(u|0,f|0,-672972958,-1)|0;u=y;e=rb(g|0,e|0,2039311994,0)|0;u=nb(e|0,y|0,f|0,u|0)|0;u=pb(u|0,y|0,31)|0;c[w>>2]=u;c[v>>2]=h;v=m+(j*72|0)+12|0;h=c[v>>2]|0;w=((h|0)<0)<<31>>31;u=rb(h|0,w|0,2111652007,0)|0;f=y;e=m+(t*72|0)+56|0;g=c[e>>2]|0;i=((g|0)<0)<<31>>31;x=rb(g|0,i|0,390655621,0)|0;f=nb(x|0,y|0,u|0,f|0)|0;f=pb(f|0,y|0,31)|0;w=rb(h|0,w|0,-390655621,-1)|0;h=y;i=rb(g|0,i|0,2111652007,0)|0;h=nb(i|0,y|0,w|0,h|0)|0;h=pb(h|0,y|0,31)|0;c[e>>2]=h;c[v>>2]=f;v=m+(j*72|0)+16|0;f=c[v>>2]|0;e=((f|0)<0)<<31>>31;h=rb(f|0,e|0,2137858230,0)|0;w=y;i=m+(t*72|0)+52|0;g=c[i>>2]|0;u=((g|0)<0)<<31>>31;x=rb(g|0,u|0,203096531,0)|0;w=nb(x|0,y|0,h|0,w|0)|0;w=pb(w|0,y|0,31)|0;e=rb(f|0,e|0,-203096531,-1)|0;f=y;u=rb(g|0,u|0,2137858230,0)|0;f=nb(u|0,y|0,e|0,f|0)|0;f=pb(f|0,y|0,31)|0;c[i>>2]=f;c[v>>2]=w;v=m+(j*72|0)+20|0;w=c[v>>2]|0;i=((w|0)<0)<<31>>31;f=rb(w|0,i|0,2145680959,0)|0;e=y;u=m+(t*72|0)+48|0;g=c[u>>2]|0;h=((g|0)<0)<<31>>31;x=rb(g|0,h|0,87972919,0)|0;e=nb(x|0,y|0,f|0,e|0)|0;e=pb(e|0,y|0,31)|0;i=rb(w|0,i|0,-87972919,-1)|0;w=y;h=rb(g|0,h|0,2145680959,0)|0;w=nb(h|0,y|0,i|0,w|0)|0;w=pb(w|0,y|0,31)|0;c[u>>2]=w;c[v>>2]=e;v=m+(j*72|0)+24|0;e=c[v>>2]|0;u=((e|0)<0)<<31>>31;w=rb(e|0,u|0,2147267170,0)|0;i=y;h=m+(t*72|0)+44|0;g=c[h>>2]|0;f=((g|0)<0)<<31>>31;x=rb(g|0,f|0,30491193,0)|0;i=nb(x|0,y|0,w|0,i|0)|0;i=pb(i|0,y|0,31)|0;u=rb(e|0,u|0,-30491193,-1)|0;e=y;f=rb(g|0,f|0,2147267170,0)|0;e=nb(f|0,y|0,u|0,e|0)|0;e=pb(e|0,y|0,31)|0;c[h>>2]=e;c[v>>2]=i;v=m+(j*72|0)+28|0;i=c[v>>2]|0;h=((i|0)<0)<<31>>31;e=rb(i|0,h|0,2147468947,0)|0;u=y;t=m+(t*72|0)+40|0;f=c[t>>2]|0;g=((f|0)<0)<<31>>31;w=rb(f|0,g|0,7945635,0)|0;u=nb(w|0,y|0,e|0,u|0)|0;u=pb(u|0,y|0,31)|0;h=rb(i|0,h|0,-7945635,-1)|0;i=y;g=rb(f|0,g|0,2147468947,0)|0;i=nb(g|0,y|0,h|0,i|0)|0;i=pb(i|0,y|0,31)|0;c[t>>2]=i;c[v>>2]=u;j=j+1|0;if((j|0)==32)break}e=c[q>>2]|0}while((n|0)<(e|0))}tb(a+11440+(d*6912|0)|0,a+11440+(d*6912|0)+(e*2304|0)|0,2304)|0}while((d|0)!=0);l=s;return}function Da(a){a=a|0;var b=0,d=0.0,e=0,f=0,g=0,i=0,j=0;j=l;l=l+16|0;e=j;c[a+83588>>2]=0;c[a+83584>>2]=0;ob(a+91784|0,0,4096)|0;g=31;while(1){i=g<<1|1;b=64;f=63;while(1){d=+D(+(+(N(17-b|0,i)|0)*.049087385212))*1.0e9;h[e>>3]=d;if(!(d>=0.0))+bb(d+-.5,e);else+bb(d+.5,e);c[a+83592+(g<<8)+(f<<2)>>2]=~~(+h[e>>3]*2.147483647);if(!f)break;else{b=f;f=f+-1|0}}if(!g)break;else g=g+-1|0}l=j;return}function Ea(a,b,d,f,g){a=a|0;b=b|0;d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+256|0;o=p;j=c[a>>2]|0;n=f+83584+(d<<2)|0;k=g<<5;h=j;i=31;m=c[n>>2]|0;while(1){c[f+91784+(d<<11)+(i+m<<2)>>2]=(e[h>>1]|0)<<16;m=c[n>>2]|0;if(!i)break;else{h=h+(g<<1)|0;i=i+-1|0}}c[a>>2]=j+(k<<1);h=64;a=63;while(1){j=a+m|0;k=c[f+91784+(d<<11)+((j&511)<<2)>>2]|0;g=c[2292+(a<<2)>>2]|0;rb(g|0,((g|0)<0)<<31>>31|0,k|0,((k|0)<0)<<31>>31|0)|0;k=y;g=c[f+91784+(d<<11)+((j+64&511)<<2)>>2]|0;i=c[2292+(h+63<<2)>>2]|0;rb(i|0,((i|0)<0)<<31>>31|0,g|0,((g|0)<0)<<31>>31|0)|0;k=y+k|0;g=c[f+91784+(d<<11)+((j+128&511)<<2)>>2]|0;i=c[2292+(h+127<<2)>>2]|0;rb(i|0,((i|0)<0)<<31>>31|0,g|0,((g|0)<0)<<31>>31|0)|0;k=k+y|0;g=c[f+91784+(d<<11)+((j+192&511)<<2)>>2]|0;i=c[2292+(h+191<<2)>>2]|0;rb(i|0,((i|0)<0)<<31>>31|0,g|0,((g|0)<0)<<31>>31|0)|0;k=k+y|0;g=c[f+91784+(d<<11)+((j+256&511)<<2)>>2]|0;i=c[2292+(h+255<<2)>>2]|0;rb(i|0,((i|0)<0)<<31>>31|0,g|0,((g|0)<0)<<31>>31|0)|0;k=k+y|0;g=c[f+91784+(d<<11)+((j+320&511)<<2)>>2]|0;i=c[2292+(h+319<<2)>>2]|0;rb(i|0,((i|0)<0)<<31>>31|0,g|0,((g|0)<0)<<31>>31|0)|0;k=k+y|0;g=c[f+91784+(d<<11)+((j+384&511)<<2)>>2]|0;i=c[2292+(h+383<<2)>>2]|0;rb(i|0,((i|0)<0)<<31>>31|0,g|0,((g|0)<0)<<31>>31|0)|0;k=k+y|0;j=c[f+91784+(d<<11)+((j+448&511)<<2)>>2]|0;g=c[2292+(h+447<<2)>>2]|0;rb(g|0,((g|0)<0)<<31>>31|0,j|0,((j|0)<0)<<31>>31|0)|0;c[o+(a<<2)>>2]=k+y;if(!a)break;else{h=a;a=a+-1|0}}c[n>>2]=m+480&511;i=c[o+252>>2]|0;g=((i|0)<0)<<31>>31;j=31;while(1){h=c[f+83592+(j<<8)+252>>2]|0;rb(i|0,g|0,h|0,((h|0)<0)<<31>>31|0)|0;h=y;a=63;do{m=a+-1|0;n=c[f+83592+(j<<8)+(m<<2)>>2]|0;m=c[o+(m<<2)>>2]|0;rb(m|0,((m|0)<0)<<31>>31|0,n|0,((n|0)<0)<<31>>31|0)|0;n=y+h|0;m=a+-2|0;d=c[f+83592+(j<<8)+(m<<2)>>2]|0;m=c[o+(m<<2)>>2]|0;rb(m|0,((m|0)<0)<<31>>31|0,d|0,((d|0)<0)<<31>>31|0)|0;n=n+y|0;d=a+-3|0;m=c[f+83592+(j<<8)+(d<<2)>>2]|0;d=c[o+(d<<2)>>2]|0;rb(d|0,((d|0)<0)<<31>>31|0,m|0,((m|0)<0)<<31>>31|0)|0;n=n+y|0;m=a+-4|0;d=c[f+83592+(j<<8)+(m<<2)>>2]|0;m=c[o+(m<<2)>>2]|0;rb(m|0,((m|0)<0)<<31>>31|0,d|0,((d|0)<0)<<31>>31|0)|0;n=n+y|0;d=a+-5|0;m=c[f+83592+(j<<8)+(d<<2)>>2]|0;d=c[o+(d<<2)>>2]|0;rb(d|0,((d|0)<0)<<31>>31|0,m|0,((m|0)<0)<<31>>31|0)|0;n=n+y|0;m=a+-6|0;d=c[f+83592+(j<<8)+(m<<2)>>2]|0;m=c[o+(m<<2)>>2]|0;rb(m|0,((m|0)<0)<<31>>31|0,d|0,((d|0)<0)<<31>>31|0)|0;n=n+y|0;a=a+-7|0;d=c[f+83592+(j<<8)+(a<<2)>>2]|0;m=c[o+(a<<2)>>2]|0;rb(m|0,((m|0)<0)<<31>>31|0,d|0,((d|0)<0)<<31>>31|0)|0;h=n+y|0}while((a|0)!=0);c[b+(j<<2)>>2]=h;if(!j)break;else j=j+-1|0}l=p;return}function Fa(a){a=a|0;c[a+4>>2]=128;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=1;return}function Ga(a,b){a=a|0;b=b|0;if((c[1208+(b<<2)>>2]|0)==(a|0)){b=0;return b|0}if((c[1224+(b<<2)>>2]|0)==(a|0)){b=1;return b|0}if((c[1240+(b<<2)>>2]|0)==(a|0)){b=2;return b|0}if((c[1256+(b<<2)>>2]|0)==(a|0)){b=3;return b|0}if((c[1272+(b<<2)>>2]|0)==(a|0)){b=4;return b|0}if((c[1288+(b<<2)>>2]|0)==(a|0)){b=5;return b|0}if((c[1304+(b<<2)>>2]|0)==(a|0)){b=6;return b|0}if((c[1320+(b<<2)>>2]|0)==(a|0)){b=7;return b|0}if((c[1336+(b<<2)>>2]|0)==(a|0)){b=8;return b|0}if((c[1352+(b<<2)>>2]|0)==(a|0)){b=9;return b|0}if((c[1368+(b<<2)>>2]|0)==(a|0)){b=10;return b|0}if((c[1384+(b<<2)>>2]|0)==(a|0)){b=11;return b|0}if((c[1400+(b<<2)>>2]|0)==(a|0)){b=12;return b|0}if((c[1416+(b<<2)>>2]|0)==(a|0)){b=13;return b|0}if((c[1432+(b<<2)>>2]|0)==(a|0)){b=14;return b|0}else return ((c[1448+(b<<2)>>2]|0)==(a|0)?15:-1)|0;return 0}function Ha(a,b){a=a|0;b=b|0;if((c[293]|0)!=(a|0))if((c[294]|0)!=(a|0))if((c[295]|0)!=(a|0))if((c[296]|0)!=(a|0))if((c[297]|0)!=(a|0))if((c[298]|0)!=(a|0))if((c[299]|0)!=(a|0))if((c[300]|0)!=(a|0))if((c[301]|0)==(a|0))a=8;else{b=-1;return b|0}else a=7;else a=6;else a=5;else a=4;else a=3;else a=2;else a=1;else a=0;a=a>>>0<3?3:a>>>0<6?2:0;b=(Ga(b,a)|0)<0;b=b?-1:a;return b|0}function Ia(a){a=a|0;return (c[a+16>>2]|0)*576|0}function Ja(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0.0;e=a+4|0;b=c[e>>2]|0;i=a+12|0;d=c[i>>2]|0;j=c[293]|0;if((j|0)!=(b|0))if((c[294]|0)!=(b|0))if((c[295]|0)!=(b|0))if((c[296]|0)!=(b|0))if((c[297]|0)!=(b|0))if((c[298]|0)!=(b|0))if((c[299]|0)!=(b|0))if((c[300]|0)!=(b|0))if((c[301]|0)==(b|0))b=8;else{j=0;return j|0}else b=7;else b=6;else b=5;else b=4;else b=3;else b=2;else b=1;else b=0;if((Ga(d,b>>>0<3?3:b>>>0<6?2:0)|0)<0){j=0;return j|0}g=ib(1,95880)|0;if(!g){j=g;return j|0}Da(g);Ba(g);Aa(g);c[g>>2]=c[a>>2];f=c[e>>2]|0;c[g+4>>2]=f;d=g+8|0;c[g+20>>2]=c[a+8>>2];e=c[i>>2]|0;c[g+24>>2]=e;c[g+28>>2]=c[a+16>>2];c[g+88>>2]=c[a+20>>2];c[g+92>>2]=c[a+24>>2];c[g+34484>>2]=0;c[g+34480>>2]=0;c[g+12>>2]=1;c[g+76>>2]=0;c[g+80>>2]=0;c[g+84>>2]=0;c[g+40>>2]=8;if((j|0)!=(f|0))if((c[294]|0)!=(f|0))if((c[295]|0)!=(f|0))if((c[296]|0)!=(f|0))if((c[297]|0)!=(f|0))if((c[298]|0)!=(f|0))if((c[299]|0)!=(f|0))if((c[300]|0)==(f|0))b=7;else b=(c[301]|0)==(f|0)?8:-1;else b=6;else b=5;else b=4;else b=3;else b=2;else b=1;else b=0;c[g+72>>2]=b;j=(b|0)<3?3:(b|0)<6?2:0;c[d>>2]=j;c[g+68>>2]=Ga(e,j)|0;j=c[1028+(j<<2)>>2]|0;b=g+16|0;c[b>>2]=j;k=+(j|0)*576.0/+(f|0)*(+(e|0)*1.0e3*.125);j=~~k;c[g+64>>2]=j;k=k-+(j|0);h[g+48>>3]=k;h[g+56>>3]=-k;if(k==0.0)c[g+32>>2]=0;ra(g+96|0,4096);ob(g+116|0,0,408)|0;j=(c[g>>2]|0)==1;c[g+524>>2]=(c[b>>2]|0)==2?(j?168:288):j?104:168;j=g;return j|0}function Ka(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0.0;c[a+2184>>2]=c[b>>2];if((c[a>>2]|0)==2)c[a+2188>>2]=c[b+4>>2];e=+h[a+48>>3];if(e!=0.0){f=a+56|0;i=+h[f>>3];g=i<=e+-1.0;b=g&1;c[a+32>>2]=b;h[f>>3]=i+(+(g&1)-e)}else b=c[a+32>>2]|0;g=(c[a+64>>2]|0)+b<<3;c[a+36>>2]=g;c[a+528>>2]=(g-(c[a+524>>2]|0)|0)/(c[a+16>>2]|0)|0;Ca(a,1);za(a);va(a);g=a+104|0;c[d>>2]=c[g>>2];c[g>>2]=0;return c[a+96>>2]|0}function La(a,b){a=a|0;b=b|0;var d=0;d=a+104|0;c[b>>2]=c[d>>2];c[d>>2]=0;return c[a+96>>2]|0}function Ma(a){a=a|0;sa(a+96|0);hb(a);return}function Na(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b+528>>2]|0)/(c[b>>2]|0)|0;e=(d|0)<4095?d:4095;f=c[b+34484>>2]|0;if(!f){f=e;return f|0}a=~~(+h[a>>3]*3.1-+(d|0));d=c[b+34480>>2]|0;if((a|0)>100){b=(d*6|0)/10|0;a=(b|0)<(a|0)?b:a}else a=0;f=d-((f<<3|0)/10|0)|0;f=((f|0)>(a|0)?f:a)+e|0;f=(f|0)<4095?f:4095;return f|0}function Oa(a,b){a=a|0;b=b|0;var d=0;d=b+34480|0;c[d>>2]=((c[b+528>>2]|0)/(c[b>>2]|0)|0)-(c[a>>2]|0)+(c[d>>2]|0);return}function Pa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;f=c[a>>2]|0;if((f|0)==2?c[a+528>>2]&1|0:0){h=a+34480|0;c[h>>2]=(c[h>>2]|0)+1}h=a+34480|0;e=c[h>>2]|0;b=e-(c[a+34484>>2]|0)|0;b=(b|0)>0?b:0;e=e-b|0;g=(e|0)%8|0;b=g+b|0;c[h>>2]=e-g;if(!b)return;d=a+156|0;e=(c[d>>2]|0)+b|0;if(e>>>0<4095){c[d>>2]=e;return}h=a+16|0;d=c[h>>2]|0;if((d|0)>0){g=0;e=f;do{if((e|0)>0){f=0;d=e;while(1){if(!b){b=0;e=d;break}e=a+156+(g*184|0)+(f*92|0)|0;i=c[e>>2]|0;d=4095-i|0;d=(d|0)<(b|0)?d:b;c[e>>2]=d+i;b=b-d|0;f=f+1|0;d=c[a>>2]|0;if((f|0)>=(d|0)){e=d;break}}d=c[h>>2]|0}g=g+1|0}while((g|0)<(d|0))}c[a+120>>2]=b;return}function Qa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+32|0;g=f;c[g>>2]=a;c[g+4>>2]=b;b=g+8|0;Fa(b);c[b>>2]=d;c[g+12>>2]=e;e=Ja(g)|0;l=f;return e|0}function Ra(){return 8944}function Sa(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=Za(c[a+60>>2]|0)|0;a=Va(ba(6,d|0)|0)|0;l=b;return a|0}function Ta(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;n=l;l=l+48|0;k=n+16|0;g=n;f=n+32|0;i=a+28|0;e=c[i>>2]|0;c[f>>2]=e;j=a+20|0;e=(c[j>>2]|0)-e|0;c[f+4>>2]=e;c[f+8>>2]=b;c[f+12>>2]=d;e=e+d|0;h=a+60|0;c[g>>2]=c[h>>2];c[g+4>>2]=f;c[g+8>>2]=2;g=Va(ga(146,g|0)|0)|0;a:do if((e|0)!=(g|0)){b=2;while(1){if((g|0)<0)break;e=e-g|0;p=c[f+4>>2]|0;o=g>>>0>p>>>0;f=o?f+8|0:f;b=(o<<31>>31)+b|0;p=g-(o?p:0)|0;c[f>>2]=(c[f>>2]|0)+p;o=f+4|0;c[o>>2]=(c[o>>2]|0)-p;c[k>>2]=c[h>>2];c[k+4>>2]=f;c[k+8>>2]=b;g=Va(ga(146,k|0)|0)|0;if((e|0)==(g|0)){m=3;break a}}c[a+16>>2]=0;c[i>>2]=0;c[j>>2]=0;c[a>>2]=c[a>>2]|32;if((b|0)==2)d=0;else d=d-(c[f+4>>2]|0)|0}else m=3;while(0);if((m|0)==3){p=c[a+44>>2]|0;c[a+16>>2]=p+(c[a+48>>2]|0);c[i>>2]=p;c[j>>2]=p}l=n;return d|0}function Ua(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=l;l=l+32|0;g=f;e=f+20|0;c[g>>2]=c[a+60>>2];c[g+4>>2]=0;c[g+8>>2]=b;c[g+12>>2]=e;c[g+16>>2]=d;if((Va(ca(140,g|0)|0)|0)<0){c[e>>2]=-1;a=-1}else a=c[e>>2]|0;l=f;return a|0}function Va(a){a=a|0;if(a>>>0>4294963200){c[(Wa()|0)>>2]=0-a;a=-1}return a|0}function Wa(){return (Xa()|0)+64|0}function Xa(){return Ya()|0}function Ya(){return 4340}function Za(a){a=a|0;return a|0}function _a(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+32|0;f=g;c[b+36>>2]=3;if((c[b>>2]&64|0)==0?(c[f>>2]=c[b+60>>2],c[f+4>>2]=21523,c[f+8>>2]=g+16,ea(54,f|0)|0):0)a[b+75>>0]=-1;f=Ta(b,d,e)|0;l=g;return f|0}function $a(a){a=a|0;return 0}function ab(a){a=a|0;return}function bb(a,b){a=+a;b=b|0;var d=0,e=0,f=0,g=0,i=0.0;h[j>>3]=a;f=c[j>>2]|0;g=c[j+4>>2]|0;d=pb(f|0,g|0,52)|0;d=d&2047;e=d+-1023|0;if((e|0)>51){h[b>>3]=a;c[j>>2]=0;c[j+4>>2]=g&-2147483648;return +((f|0)==0&(g&1048575|0)==0|(e|0)!=1024?+h[j>>3]:a)}do if(d>>>0>=1023){d=pb(-1,1048575,e|0)|0;e=y;if((d&f|0)==0&(e&g|0)==0){h[b>>3]=a;c[j>>2]=0;c[j+4>>2]=g&-2147483648;a=+h[j>>3];break}else{d=f&~d;f=g&~e;c[j>>2]=d;c[j+4>>2]=f;i=+h[j>>3];g=b;c[g>>2]=d;c[g+4>>2]=f;a=a-i;break}}else{f=b;c[f>>2]=0;c[f+4>>2]=g&-2147483648}while(0);return +a}function cb(){Z(9008);return 9016}function db(){fa(9008);return}function eb(a){a=a|0;var b=0,d=0;do if(a){if((c[a+76>>2]|0)<=-1){b=fb(a)|0;break}d=($a(a)|0)==0;b=fb(a)|0;if(!d)ab(a)}else{if(!(c[1177]|0))b=0;else b=eb(c[1177]|0)|0;a=c[(cb()|0)>>2]|0;if(a)do{if((c[a+76>>2]|0)>-1)d=$a(a)|0;else d=0;if((c[a+20>>2]|0)>>>0>(c[a+28>>2]|0)>>>0)b=fb(a)|0|b;if(d|0)ab(a);a=c[a+56>>2]|0}while((a|0)!=0);db()}while(0);return b|0}function fb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a+20|0;h=a+28|0;if((c[b>>2]|0)>>>0>(c[h>>2]|0)>>>0?(ja[c[a+36>>2]&3](a,0,0)|0,(c[b>>2]|0)==0):0)a=-1;else{d=a+4|0;e=c[d>>2]|0;f=a+8|0;g=c[f>>2]|0;if(e>>>0<g>>>0)ja[c[a+40>>2]&3](a,e-g|0,1)|0;c[a+16>>2]=0;c[h>>2]=0;c[b>>2]=0;c[f>>2]=0;c[d>>2]=0;a=0}return a|0}function gb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;K=l;l=l+16|0;o=K;do if(a>>>0<245){p=a>>>0<11?16:a+11&-8;a=p>>>3;t=c[2255]|0;d=t>>>a;if(d&3|0){a=(d&1^1)+a|0;d=9060+(a<<1<<2)|0;e=d+8|0;f=c[e>>2]|0;g=f+8|0;h=c[g>>2]|0;do if((d|0)!=(h|0)){if(h>>>0<(c[2259]|0)>>>0)$();b=h+12|0;if((c[b>>2]|0)==(f|0)){c[b>>2]=d;c[e>>2]=h;break}else $()}else c[2255]=t&~(1<<a);while(0);J=a<<3;c[f+4>>2]=J|3;J=f+J+4|0;c[J>>2]=c[J>>2]|1;J=g;l=K;return J|0}s=c[2257]|0;if(p>>>0>s>>>0){if(d|0){i=2<<a;a=d<<a&(i|0-i);a=(a&0-a)+-1|0;i=a>>>12&16;a=a>>>i;e=a>>>5&8;a=a>>>e;g=a>>>2&4;a=a>>>g;d=a>>>1&2;a=a>>>d;b=a>>>1&1;b=(e|i|g|d|b)+(a>>>b)|0;a=9060+(b<<1<<2)|0;d=a+8|0;g=c[d>>2]|0;i=g+8|0;e=c[i>>2]|0;do if((a|0)!=(e|0)){if(e>>>0<(c[2259]|0)>>>0)$();f=e+12|0;if((c[f>>2]|0)==(g|0)){c[f>>2]=a;c[d>>2]=e;j=t;break}else $()}else{j=t&~(1<<b);c[2255]=j}while(0);h=(b<<3)-p|0;c[g+4>>2]=p|3;e=g+p|0;c[e+4>>2]=h|1;c[e+h>>2]=h;if(s|0){f=c[2260]|0;b=s>>>3;d=9060+(b<<1<<2)|0;b=1<<b;if(j&b){b=d+8|0;a=c[b>>2]|0;if(a>>>0<(c[2259]|0)>>>0)$();else{k=a;m=b}}else{c[2255]=j|b;k=d;m=d+8|0}c[m>>2]=f;c[k+12>>2]=f;c[f+8>>2]=k;c[f+12>>2]=d}c[2257]=h;c[2260]=e;J=i;l=K;return J|0}k=c[2256]|0;if(k){a=(k&0-k)+-1|0;I=a>>>12&16;a=a>>>I;H=a>>>5&8;a=a>>>H;J=a>>>2&4;a=a>>>J;d=a>>>1&2;a=a>>>d;b=a>>>1&1;b=c[9324+((H|I|J|d|b)+(a>>>b)<<2)>>2]|0;a=(c[b+4>>2]&-8)-p|0;d=c[b+16+(((c[b+16>>2]|0)==0&1)<<2)>>2]|0;if(!d){j=b;h=a}else{do{I=(c[d+4>>2]&-8)-p|0;J=I>>>0<a>>>0;a=J?I:a;b=J?d:b;d=c[d+16+(((c[d+16>>2]|0)==0&1)<<2)>>2]|0}while((d|0)!=0);j=b;h=a}f=c[2259]|0;if(j>>>0<f>>>0)$();i=j+p|0;if(j>>>0>=i>>>0)$();g=c[j+24>>2]|0;d=c[j+12>>2]|0;do if((d|0)==(j|0)){a=j+20|0;b=c[a>>2]|0;if(!b){a=j+16|0;b=c[a>>2]|0;if(!b){n=0;break}}while(1){d=b+20|0;e=c[d>>2]|0;if(e|0){b=e;a=d;continue}d=b+16|0;e=c[d>>2]|0;if(!e)break;else{b=e;a=d}}if(a>>>0<f>>>0)$();else{c[a>>2]=0;n=b;break}}else{e=c[j+8>>2]|0;if(e>>>0<f>>>0)$();b=e+12|0;if((c[b>>2]|0)!=(j|0))$();a=d+8|0;if((c[a>>2]|0)==(j|0)){c[b>>2]=d;c[a>>2]=e;n=d;break}else $()}while(0);a:do if(g|0){b=c[j+28>>2]|0;a=9324+(b<<2)|0;do if((j|0)==(c[a>>2]|0)){c[a>>2]=n;if(!n){c[2256]=k&~(1<<b);break a}}else if(g>>>0>=(c[2259]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(j|0)&1)<<2)>>2]=n;if(!n)break a;else break}else $();while(0);a=c[2259]|0;if(n>>>0<a>>>0)$();c[n+24>>2]=g;b=c[j+16>>2]|0;do if(b|0)if(b>>>0<a>>>0)$();else{c[n+16>>2]=b;c[b+24>>2]=n;break}while(0);b=c[j+20>>2]|0;if(b|0)if(b>>>0<(c[2259]|0)>>>0)$();else{c[n+20>>2]=b;c[b+24>>2]=n;break}}while(0);if(h>>>0<16){J=h+p|0;c[j+4>>2]=J|3;J=j+J+4|0;c[J>>2]=c[J>>2]|1}else{c[j+4>>2]=p|3;c[i+4>>2]=h|1;c[i+h>>2]=h;if(s|0){e=c[2260]|0;b=s>>>3;d=9060+(b<<1<<2)|0;b=1<<b;if(t&b){b=d+8|0;a=c[b>>2]|0;if(a>>>0<(c[2259]|0)>>>0)$();else{q=a;r=b}}else{c[2255]=t|b;q=d;r=d+8|0}c[r>>2]=e;c[q+12>>2]=e;c[e+8>>2]=q;c[e+12>>2]=d}c[2257]=h;c[2260]=i}J=j+8|0;l=K;return J|0}}}else if(a>>>0<=4294967231){a=a+11|0;p=a&-8;k=c[2256]|0;if(k){e=0-p|0;a=a>>>8;if(a)if(p>>>0>16777215)i=31;else{r=(a+1048320|0)>>>16&8;C=a<<r;q=(C+520192|0)>>>16&4;C=C<<q;i=(C+245760|0)>>>16&2;i=14-(q|r|i)+(C<<i>>>15)|0;i=p>>>(i+7|0)&1|i<<1}else i=0;d=c[9324+(i<<2)>>2]|0;b:do if(!d){d=0;a=0;C=81}else{a=0;h=p<<((i|0)==31?0:25-(i>>>1)|0);g=0;while(1){f=(c[d+4>>2]&-8)-p|0;if(f>>>0<e>>>0)if(!f){a=d;e=0;f=d;C=85;break b}else{a=d;e=f}f=c[d+20>>2]|0;d=c[d+16+(h>>>31<<2)>>2]|0;g=(f|0)==0|(f|0)==(d|0)?g:f;f=(d|0)==0;if(f){d=g;C=81;break}else h=h<<((f^1)&1)}}while(0);if((C|0)==81){if((d|0)==0&(a|0)==0){a=2<<i;a=k&(a|0-a);if(!a)break;r=(a&0-a)+-1|0;m=r>>>12&16;r=r>>>m;j=r>>>5&8;r=r>>>j;n=r>>>2&4;r=r>>>n;q=r>>>1&2;r=r>>>q;d=r>>>1&1;a=0;d=c[9324+((j|m|n|q|d)+(r>>>d)<<2)>>2]|0}if(!d){j=a;i=e}else{f=d;C=85}}if((C|0)==85)while(1){C=0;d=(c[f+4>>2]&-8)-p|0;r=d>>>0<e>>>0;d=r?d:e;a=r?f:a;f=c[f+16+(((c[f+16>>2]|0)==0&1)<<2)>>2]|0;if(!f){j=a;i=d;break}else{e=d;C=85}}if((j|0)!=0?i>>>0<((c[2257]|0)-p|0)>>>0:0){f=c[2259]|0;if(j>>>0<f>>>0)$();h=j+p|0;if(j>>>0>=h>>>0)$();g=c[j+24>>2]|0;d=c[j+12>>2]|0;do if((d|0)==(j|0)){a=j+20|0;b=c[a>>2]|0;if(!b){a=j+16|0;b=c[a>>2]|0;if(!b){s=0;break}}while(1){d=b+20|0;e=c[d>>2]|0;if(e|0){b=e;a=d;continue}d=b+16|0;e=c[d>>2]|0;if(!e)break;else{b=e;a=d}}if(a>>>0<f>>>0)$();else{c[a>>2]=0;s=b;break}}else{e=c[j+8>>2]|0;if(e>>>0<f>>>0)$();b=e+12|0;if((c[b>>2]|0)!=(j|0))$();a=d+8|0;if((c[a>>2]|0)==(j|0)){c[b>>2]=d;c[a>>2]=e;s=d;break}else $()}while(0);c:do if(g){b=c[j+28>>2]|0;a=9324+(b<<2)|0;do if((j|0)==(c[a>>2]|0)){c[a>>2]=s;if(!s){t=k&~(1<<b);c[2256]=t;break c}}else if(g>>>0>=(c[2259]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(j|0)&1)<<2)>>2]=s;if(!s){t=k;break c}else break}else $();while(0);a=c[2259]|0;if(s>>>0<a>>>0)$();c[s+24>>2]=g;b=c[j+16>>2]|0;do if(b|0)if(b>>>0<a>>>0)$();else{c[s+16>>2]=b;c[b+24>>2]=s;break}while(0);b=c[j+20>>2]|0;if(b)if(b>>>0<(c[2259]|0)>>>0)$();else{c[s+20>>2]=b;c[b+24>>2]=s;t=k;break}else t=k}else t=k;while(0);do if(i>>>0>=16){c[j+4>>2]=p|3;c[h+4>>2]=i|1;c[h+i>>2]=i;b=i>>>3;if(i>>>0<256){d=9060+(b<<1<<2)|0;a=c[2255]|0;b=1<<b;if(a&b){b=d+8|0;a=c[b>>2]|0;if(a>>>0<(c[2259]|0)>>>0)$();else{x=a;y=b}}else{c[2255]=a|b;x=d;y=d+8|0}c[y>>2]=h;c[x+12>>2]=h;c[h+8>>2]=x;c[h+12>>2]=d;break}b=i>>>8;if(b)if(i>>>0>16777215)b=31;else{I=(b+1048320|0)>>>16&8;J=b<<I;H=(J+520192|0)>>>16&4;J=J<<H;b=(J+245760|0)>>>16&2;b=14-(H|I|b)+(J<<b>>>15)|0;b=i>>>(b+7|0)&1|b<<1}else b=0;d=9324+(b<<2)|0;c[h+28>>2]=b;a=h+16|0;c[a+4>>2]=0;c[a>>2]=0;a=1<<b;if(!(t&a)){c[2256]=t|a;c[d>>2]=h;c[h+24>>2]=d;c[h+12>>2]=h;c[h+8>>2]=h;break}a=i<<((b|0)==31?0:25-(b>>>1)|0);e=c[d>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(i|0)){C=139;break}d=e+16+(a>>>31<<2)|0;b=c[d>>2]|0;if(!b){C=136;break}else{a=a<<1;e=b}}if((C|0)==136)if(d>>>0<(c[2259]|0)>>>0)$();else{c[d>>2]=h;c[h+24>>2]=e;c[h+12>>2]=h;c[h+8>>2]=h;break}else if((C|0)==139){b=e+8|0;a=c[b>>2]|0;J=c[2259]|0;if(a>>>0>=J>>>0&e>>>0>=J>>>0){c[a+12>>2]=h;c[b>>2]=h;c[h+8>>2]=a;c[h+12>>2]=e;c[h+24>>2]=0;break}else $()}}else{J=i+p|0;c[j+4>>2]=J|3;J=j+J+4|0;c[J>>2]=c[J>>2]|1}while(0);J=j+8|0;l=K;return J|0}}}else p=-1;while(0);d=c[2257]|0;if(d>>>0>=p>>>0){b=d-p|0;a=c[2260]|0;if(b>>>0>15){J=a+p|0;c[2260]=J;c[2257]=b;c[J+4>>2]=b|1;c[J+b>>2]=b;c[a+4>>2]=p|3}else{c[2257]=0;c[2260]=0;c[a+4>>2]=d|3;J=a+d+4|0;c[J>>2]=c[J>>2]|1}J=a+8|0;l=K;return J|0}h=c[2258]|0;if(h>>>0>p>>>0){H=h-p|0;c[2258]=H;J=c[2261]|0;I=J+p|0;c[2261]=I;c[I+4>>2]=H|1;c[J+4>>2]=p|3;J=J+8|0;l=K;return J|0}if(!(c[2373]|0)){c[2375]=4096;c[2374]=4096;c[2376]=-1;c[2377]=-1;c[2378]=0;c[2366]=0;a=o&-16^1431655768;c[o>>2]=a;c[2373]=a;a=4096}else a=c[2375]|0;i=p+48|0;j=p+47|0;g=a+j|0;f=0-a|0;k=g&f;if(k>>>0<=p>>>0){J=0;l=K;return J|0}a=c[2365]|0;if(a|0?(x=c[2363]|0,y=x+k|0,y>>>0<=x>>>0|y>>>0>a>>>0):0){J=0;l=K;return J|0}d:do if(!(c[2366]&4)){d=c[2261]|0;e:do if(d){e=9468;while(1){a=c[e>>2]|0;if(a>>>0<=d>>>0?(w=e+4|0,(a+(c[w>>2]|0)|0)>>>0>d>>>0):0)break;a=c[e+8>>2]|0;if(!a){C=163;break e}else e=a}b=g-h&f;if(b>>>0<2147483647){a=sb(b|0)|0;if((a|0)==((c[e>>2]|0)+(c[w>>2]|0)|0)){if((a|0)!=(-1|0)){h=b;g=a;C=180;break d}}else{e=a;C=171}}else b=0}else C=163;while(0);do if((C|0)==163){d=sb(0)|0;if((d|0)!=(-1|0)?(b=d,u=c[2374]|0,v=u+-1|0,b=((v&b|0)==0?0:(v+b&0-u)-b|0)+k|0,u=c[2363]|0,v=b+u|0,b>>>0>p>>>0&b>>>0<2147483647):0){y=c[2365]|0;if(y|0?v>>>0<=u>>>0|v>>>0>y>>>0:0){b=0;break}a=sb(b|0)|0;if((a|0)==(d|0)){h=b;g=d;C=180;break d}else{e=a;C=171}}else b=0}while(0);do if((C|0)==171){d=0-b|0;if(!(i>>>0>b>>>0&(b>>>0<2147483647&(e|0)!=(-1|0))))if((e|0)==(-1|0)){b=0;break}else{h=b;g=e;C=180;break d}a=c[2375]|0;a=j-b+a&0-a;if(a>>>0>=2147483647){h=b;g=e;C=180;break d}if((sb(a|0)|0)==(-1|0)){sb(d|0)|0;b=0;break}else{h=a+b|0;g=e;C=180;break d}}while(0);c[2366]=c[2366]|4;C=178}else{b=0;C=178}while(0);if(((C|0)==178?k>>>0<2147483647:0)?(B=sb(k|0)|0,y=sb(0)|0,z=y-B|0,A=z>>>0>(p+40|0)>>>0,!((B|0)==(-1|0)|A^1|B>>>0<y>>>0&((B|0)!=(-1|0)&(y|0)!=(-1|0))^1)):0){h=A?z:b;g=B;C=180}if((C|0)==180){b=(c[2363]|0)+h|0;c[2363]=b;if(b>>>0>(c[2364]|0)>>>0)c[2364]=b;k=c[2261]|0;do if(k){b=9468;while(1){a=c[b>>2]|0;d=b+4|0;e=c[d>>2]|0;if((g|0)==(a+e|0)){C=190;break}f=c[b+8>>2]|0;if(!f)break;else b=f}if(((C|0)==190?(c[b+12>>2]&8|0)==0:0)?k>>>0<g>>>0&k>>>0>=a>>>0:0){c[d>>2]=e+h;J=k+8|0;J=(J&7|0)==0?0:0-J&7;I=k+J|0;J=(c[2258]|0)+(h-J)|0;c[2261]=I;c[2258]=J;c[I+4>>2]=J|1;c[I+J+4>>2]=40;c[2262]=c[2377];break}b=c[2259]|0;if(g>>>0<b>>>0){c[2259]=g;i=g}else i=b;d=g+h|0;b=9468;while(1){if((c[b>>2]|0)==(d|0)){C=198;break}a=c[b+8>>2]|0;if(!a)break;else b=a}if((C|0)==198?(c[b+12>>2]&8|0)==0:0){c[b>>2]=g;n=b+4|0;c[n>>2]=(c[n>>2]|0)+h;n=g+8|0;n=g+((n&7|0)==0?0:0-n&7)|0;b=d+8|0;b=d+((b&7|0)==0?0:0-b&7)|0;m=n+p|0;j=b-n-p|0;c[n+4>>2]=p|3;do if((b|0)!=(k|0)){if((b|0)==(c[2260]|0)){J=(c[2257]|0)+j|0;c[2257]=J;c[2260]=m;c[m+4>>2]=J|1;c[m+J>>2]=J;break}a=c[b+4>>2]|0;if((a&3|0)==1){h=a&-8;f=a>>>3;f:do if(a>>>0>=256){g=c[b+24>>2]|0;e=c[b+12>>2]|0;do if((e|0)==(b|0)){e=b+16|0;d=e+4|0;a=c[d>>2]|0;if(!a){a=c[e>>2]|0;if(!a){H=0;break}else d=e}while(1){e=a+20|0;f=c[e>>2]|0;if(f|0){a=f;d=e;continue}e=a+16|0;f=c[e>>2]|0;if(!f)break;else{a=f;d=e}}if(d>>>0<i>>>0)$();else{c[d>>2]=0;H=a;break}}else{f=c[b+8>>2]|0;if(f>>>0<i>>>0)$();a=f+12|0;if((c[a>>2]|0)!=(b|0))$();d=e+8|0;if((c[d>>2]|0)==(b|0)){c[a>>2]=e;c[d>>2]=f;H=e;break}else $()}while(0);if(!g)break;a=c[b+28>>2]|0;d=9324+(a<<2)|0;do if((b|0)!=(c[d>>2]|0))if(g>>>0>=(c[2259]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(b|0)&1)<<2)>>2]=H;if(!H)break f;else break}else $();else{c[d>>2]=H;if(H|0)break;c[2256]=c[2256]&~(1<<a);break f}while(0);e=c[2259]|0;if(H>>>0<e>>>0)$();c[H+24>>2]=g;a=b+16|0;d=c[a>>2]|0;do if(d|0)if(d>>>0<e>>>0)$();else{c[H+16>>2]=d;c[d+24>>2]=H;break}while(0);a=c[a+4>>2]|0;if(!a)break;if(a>>>0<(c[2259]|0)>>>0)$();else{c[H+20>>2]=a;c[a+24>>2]=H;break}}else{d=c[b+8>>2]|0;e=c[b+12>>2]|0;a=9060+(f<<1<<2)|0;do if((d|0)!=(a|0)){if(d>>>0<i>>>0)$();if((c[d+12>>2]|0)==(b|0))break;$()}while(0);if((e|0)==(d|0)){c[2255]=c[2255]&~(1<<f);break}do if((e|0)==(a|0))E=e+8|0;else{if(e>>>0<i>>>0)$();a=e+8|0;if((c[a>>2]|0)==(b|0)){E=a;break}$()}while(0);c[d+12>>2]=e;c[E>>2]=d}while(0);b=b+h|0;f=h+j|0}else f=j;b=b+4|0;c[b>>2]=c[b>>2]&-2;c[m+4>>2]=f|1;c[m+f>>2]=f;b=f>>>3;if(f>>>0<256){d=9060+(b<<1<<2)|0;a=c[2255]|0;b=1<<b;do if(!(a&b)){c[2255]=a|b;I=d;J=d+8|0}else{b=d+8|0;a=c[b>>2]|0;if(a>>>0>=(c[2259]|0)>>>0){I=a;J=b;break}$()}while(0);c[J>>2]=m;c[I+12>>2]=m;c[m+8>>2]=I;c[m+12>>2]=d;break}b=f>>>8;do if(!b)b=0;else{if(f>>>0>16777215){b=31;break}I=(b+1048320|0)>>>16&8;J=b<<I;H=(J+520192|0)>>>16&4;J=J<<H;b=(J+245760|0)>>>16&2;b=14-(H|I|b)+(J<<b>>>15)|0;b=f>>>(b+7|0)&1|b<<1}while(0);e=9324+(b<<2)|0;c[m+28>>2]=b;a=m+16|0;c[a+4>>2]=0;c[a>>2]=0;a=c[2256]|0;d=1<<b;if(!(a&d)){c[2256]=a|d;c[e>>2]=m;c[m+24>>2]=e;c[m+12>>2]=m;c[m+8>>2]=m;break}a=f<<((b|0)==31?0:25-(b>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){C=265;break}d=e+16+(a>>>31<<2)|0;b=c[d>>2]|0;if(!b){C=262;break}else{a=a<<1;e=b}}if((C|0)==262)if(d>>>0<(c[2259]|0)>>>0)$();else{c[d>>2]=m;c[m+24>>2]=e;c[m+12>>2]=m;c[m+8>>2]=m;break}else if((C|0)==265){b=e+8|0;a=c[b>>2]|0;J=c[2259]|0;if(a>>>0>=J>>>0&e>>>0>=J>>>0){c[a+12>>2]=m;c[b>>2]=m;c[m+8>>2]=a;c[m+12>>2]=e;c[m+24>>2]=0;break}else $()}}else{J=(c[2258]|0)+j|0;c[2258]=J;c[2261]=m;c[m+4>>2]=J|1}while(0);J=n+8|0;l=K;return J|0}b=9468;while(1){a=c[b>>2]|0;if(a>>>0<=k>>>0?(D=a+(c[b+4>>2]|0)|0,D>>>0>k>>>0):0)break;b=c[b+8>>2]|0}f=D+-47|0;a=f+8|0;a=f+((a&7|0)==0?0:0-a&7)|0;f=k+16|0;a=a>>>0<f>>>0?k:a;b=a+8|0;d=g+8|0;d=(d&7|0)==0?0:0-d&7;J=g+d|0;d=h+-40-d|0;c[2261]=J;c[2258]=d;c[J+4>>2]=d|1;c[J+d+4>>2]=40;c[2262]=c[2377];d=a+4|0;c[d>>2]=27;c[b>>2]=c[2367];c[b+4>>2]=c[2368];c[b+8>>2]=c[2369];c[b+12>>2]=c[2370];c[2367]=g;c[2368]=h;c[2370]=0;c[2369]=b;b=a+24|0;do{J=b;b=b+4|0;c[b>>2]=7}while((J+8|0)>>>0<D>>>0);if((a|0)!=(k|0)){g=a-k|0;c[d>>2]=c[d>>2]&-2;c[k+4>>2]=g|1;c[a>>2]=g;b=g>>>3;if(g>>>0<256){d=9060+(b<<1<<2)|0;a=c[2255]|0;b=1<<b;if(a&b){b=d+8|0;a=c[b>>2]|0;if(a>>>0<(c[2259]|0)>>>0)$();else{F=a;G=b}}else{c[2255]=a|b;F=d;G=d+8|0}c[G>>2]=k;c[F+12>>2]=k;c[k+8>>2]=F;c[k+12>>2]=d;break}b=g>>>8;if(b)if(g>>>0>16777215)d=31;else{I=(b+1048320|0)>>>16&8;J=b<<I;H=(J+520192|0)>>>16&4;J=J<<H;d=(J+245760|0)>>>16&2;d=14-(H|I|d)+(J<<d>>>15)|0;d=g>>>(d+7|0)&1|d<<1}else d=0;e=9324+(d<<2)|0;c[k+28>>2]=d;c[k+20>>2]=0;c[f>>2]=0;b=c[2256]|0;a=1<<d;if(!(b&a)){c[2256]=b|a;c[e>>2]=k;c[k+24>>2]=e;c[k+12>>2]=k;c[k+8>>2]=k;break}a=g<<((d|0)==31?0:25-(d>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(g|0)){C=292;break}d=e+16+(a>>>31<<2)|0;b=c[d>>2]|0;if(!b){C=289;break}else{a=a<<1;e=b}}if((C|0)==289)if(d>>>0<(c[2259]|0)>>>0)$();else{c[d>>2]=k;c[k+24>>2]=e;c[k+12>>2]=k;c[k+8>>2]=k;break}else if((C|0)==292){b=e+8|0;a=c[b>>2]|0;J=c[2259]|0;if(a>>>0>=J>>>0&e>>>0>=J>>>0){c[a+12>>2]=k;c[b>>2]=k;c[k+8>>2]=a;c[k+12>>2]=e;c[k+24>>2]=0;break}else $()}}}else{J=c[2259]|0;if((J|0)==0|g>>>0<J>>>0)c[2259]=g;c[2367]=g;c[2368]=h;c[2370]=0;c[2264]=c[2373];c[2263]=-1;b=0;do{J=9060+(b<<1<<2)|0;c[J+12>>2]=J;c[J+8>>2]=J;b=b+1|0}while((b|0)!=32);J=g+8|0;J=(J&7|0)==0?0:0-J&7;I=g+J|0;J=h+-40-J|0;c[2261]=I;c[2258]=J;c[I+4>>2]=J|1;c[I+J+4>>2]=40;c[2262]=c[2377]}while(0);b=c[2258]|0;if(b>>>0>p>>>0){H=b-p|0;c[2258]=H;J=c[2261]|0;I=J+p|0;c[2261]=I;c[I+4>>2]=H|1;c[J+4>>2]=p|3;J=J+8|0;l=K;return J|0}}c[(Wa()|0)>>2]=12;J=0;l=K;return J|0}function hb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;if(!a)return;d=a+-8|0;h=c[2259]|0;if(d>>>0<h>>>0)$();a=c[a+-4>>2]|0;b=a&3;if((b|0)==1)$();e=a&-8;o=d+e|0;a:do if(!(a&1)){a=c[d>>2]|0;if(!b)return;k=d+(0-a)|0;j=a+e|0;if(k>>>0<h>>>0)$();if((k|0)==(c[2260]|0)){a=o+4|0;b=c[a>>2]|0;if((b&3|0)!=3){r=k;f=j;m=k;break}c[2257]=j;c[a>>2]=b&-2;c[k+4>>2]=j|1;c[k+j>>2]=j;return}e=a>>>3;if(a>>>0<256){b=c[k+8>>2]|0;d=c[k+12>>2]|0;a=9060+(e<<1<<2)|0;if((b|0)!=(a|0)){if(b>>>0<h>>>0)$();if((c[b+12>>2]|0)!=(k|0))$()}if((d|0)==(b|0)){c[2255]=c[2255]&~(1<<e);r=k;f=j;m=k;break}if((d|0)!=(a|0)){if(d>>>0<h>>>0)$();a=d+8|0;if((c[a>>2]|0)==(k|0))g=a;else $()}else g=d+8|0;c[b+12>>2]=d;c[g>>2]=b;r=k;f=j;m=k;break}g=c[k+24>>2]|0;d=c[k+12>>2]|0;do if((d|0)==(k|0)){d=k+16|0;b=d+4|0;a=c[b>>2]|0;if(!a){a=c[d>>2]|0;if(!a){i=0;break}else b=d}while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0<h>>>0)$();else{c[b>>2]=0;i=a;break}}else{e=c[k+8>>2]|0;if(e>>>0<h>>>0)$();a=e+12|0;if((c[a>>2]|0)!=(k|0))$();b=d+8|0;if((c[b>>2]|0)==(k|0)){c[a>>2]=d;c[b>>2]=e;i=d;break}else $()}while(0);if(g){a=c[k+28>>2]|0;b=9324+(a<<2)|0;do if((k|0)==(c[b>>2]|0)){c[b>>2]=i;if(!i){c[2256]=c[2256]&~(1<<a);r=k;f=j;m=k;break a}}else if(g>>>0>=(c[2259]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(k|0)&1)<<2)>>2]=i;if(!i){r=k;f=j;m=k;break a}else break}else $();while(0);d=c[2259]|0;if(i>>>0<d>>>0)$();c[i+24>>2]=g;a=k+16|0;b=c[a>>2]|0;do if(b|0)if(b>>>0<d>>>0)$();else{c[i+16>>2]=b;c[b+24>>2]=i;break}while(0);a=c[a+4>>2]|0;if(a)if(a>>>0<(c[2259]|0)>>>0)$();else{c[i+20>>2]=a;c[a+24>>2]=i;r=k;f=j;m=k;break}else{r=k;f=j;m=k}}else{r=k;f=j;m=k}}else{r=d;f=e;m=d}while(0);if(m>>>0>=o>>>0)$();a=o+4|0;b=c[a>>2]|0;if(!(b&1))$();if(!(b&2)){a=c[2260]|0;if((o|0)==(c[2261]|0)){q=(c[2258]|0)+f|0;c[2258]=q;c[2261]=r;c[r+4>>2]=q|1;if((r|0)!=(a|0))return;c[2260]=0;c[2257]=0;return}if((o|0)==(a|0)){q=(c[2257]|0)+f|0;c[2257]=q;c[2260]=m;c[r+4>>2]=q|1;c[m+q>>2]=q;return}f=(b&-8)+f|0;e=b>>>3;b:do if(b>>>0>=256){g=c[o+24>>2]|0;a=c[o+12>>2]|0;do if((a|0)==(o|0)){d=o+16|0;b=d+4|0;a=c[b>>2]|0;if(!a){a=c[d>>2]|0;if(!a){n=0;break}else b=d}while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0<(c[2259]|0)>>>0)$();else{c[b>>2]=0;n=a;break}}else{b=c[o+8>>2]|0;if(b>>>0<(c[2259]|0)>>>0)$();d=b+12|0;if((c[d>>2]|0)!=(o|0))$();e=a+8|0;if((c[e>>2]|0)==(o|0)){c[d>>2]=a;c[e>>2]=b;n=a;break}else $()}while(0);if(g|0){a=c[o+28>>2]|0;b=9324+(a<<2)|0;do if((o|0)==(c[b>>2]|0)){c[b>>2]=n;if(!n){c[2256]=c[2256]&~(1<<a);break b}}else if(g>>>0>=(c[2259]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(o|0)&1)<<2)>>2]=n;if(!n)break b;else break}else $();while(0);d=c[2259]|0;if(n>>>0<d>>>0)$();c[n+24>>2]=g;a=o+16|0;b=c[a>>2]|0;do if(b|0)if(b>>>0<d>>>0)$();else{c[n+16>>2]=b;c[b+24>>2]=n;break}while(0);a=c[a+4>>2]|0;if(a|0)if(a>>>0<(c[2259]|0)>>>0)$();else{c[n+20>>2]=a;c[a+24>>2]=n;break}}}else{b=c[o+8>>2]|0;d=c[o+12>>2]|0;a=9060+(e<<1<<2)|0;if((b|0)!=(a|0)){if(b>>>0<(c[2259]|0)>>>0)$();if((c[b+12>>2]|0)!=(o|0))$()}if((d|0)==(b|0)){c[2255]=c[2255]&~(1<<e);break}if((d|0)!=(a|0)){if(d>>>0<(c[2259]|0)>>>0)$();a=d+8|0;if((c[a>>2]|0)==(o|0))l=a;else $()}else l=d+8|0;c[b+12>>2]=d;c[l>>2]=b}while(0);c[r+4>>2]=f|1;c[m+f>>2]=f;if((r|0)==(c[2260]|0)){c[2257]=f;return}}else{c[a>>2]=b&-2;c[r+4>>2]=f|1;c[m+f>>2]=f}a=f>>>3;if(f>>>0<256){d=9060+(a<<1<<2)|0;b=c[2255]|0;a=1<<a;if(b&a){a=d+8|0;b=c[a>>2]|0;if(b>>>0<(c[2259]|0)>>>0)$();else{p=b;q=a}}else{c[2255]=b|a;p=d;q=d+8|0}c[q>>2]=r;c[p+12>>2]=r;c[r+8>>2]=p;c[r+12>>2]=d;return}a=f>>>8;if(a)if(f>>>0>16777215)a=31;else{p=(a+1048320|0)>>>16&8;q=a<<p;o=(q+520192|0)>>>16&4;q=q<<o;a=(q+245760|0)>>>16&2;a=14-(o|p|a)+(q<<a>>>15)|0;a=f>>>(a+7|0)&1|a<<1}else a=0;e=9324+(a<<2)|0;c[r+28>>2]=a;c[r+20>>2]=0;c[r+16>>2]=0;b=c[2256]|0;d=1<<a;do if(b&d){b=f<<((a|0)==31?0:25-(a>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){a=124;break}d=e+16+(b>>>31<<2)|0;a=c[d>>2]|0;if(!a){a=121;break}else{b=b<<1;e=a}}if((a|0)==121)if(d>>>0<(c[2259]|0)>>>0)$();else{c[d>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r;break}else if((a|0)==124){a=e+8|0;b=c[a>>2]|0;q=c[2259]|0;if(b>>>0>=q>>>0&e>>>0>=q>>>0){c[b+12>>2]=r;c[a>>2]=r;c[r+8>>2]=b;c[r+12>>2]=e;c[r+24>>2]=0;break}else $()}}else{c[2256]=b|d;c[e>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r}while(0);r=(c[2263]|0)+-1|0;c[2263]=r;if(!r)a=9476;else return;while(1){a=c[a>>2]|0;if(!a)break;else a=a+8|0}c[2263]=-1;return}function ib(a,b){a=a|0;b=b|0;var d=0;if(a){d=N(b,a)|0;if((b|a)>>>0>65535)d=((d>>>0)/(a>>>0)|0|0)==(b|0)?d:-1}else d=0;a=gb(d)|0;if(!a)return a|0;if(!(c[a+-4>>2]&3))return a|0;ob(a|0,0,d|0)|0;return a|0}function jb(a,b){a=a|0;b=b|0;var d=0,e=0;if(!a){b=gb(b)|0;return b|0}if(b>>>0>4294967231){c[(Wa()|0)>>2]=12;b=0;return b|0}d=kb(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(d|0){b=d+8|0;return b|0}d=gb(b)|0;if(!d){b=0;return b|0}e=c[a+-4>>2]|0;e=(e&-8)-((e&3|0)==0?8:4)|0;tb(d|0,a|0,(e>>>0<b>>>0?e:b)|0)|0;hb(a);b=d;return b|0}function kb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=a+4|0;n=c[o>>2]|0;d=n&-8;k=a+d|0;i=c[2259]|0;e=n&3;if(!((e|0)!=1&a>>>0>=i>>>0&a>>>0<k>>>0))$();f=c[k+4>>2]|0;if(!(f&1))$();if(!e){if(b>>>0<256){a=0;return a|0}if(d>>>0>=(b+4|0)>>>0?(d-b|0)>>>0<=c[2375]<<1>>>0:0)return a|0;a=0;return a|0}if(d>>>0>=b>>>0){d=d-b|0;if(d>>>0<=15)return a|0;m=a+b|0;c[o>>2]=n&1|b|2;c[m+4>>2]=d|3;o=m+d+4|0;c[o>>2]=c[o>>2]|1;lb(m,d);return a|0}if((k|0)==(c[2261]|0)){m=(c[2258]|0)+d|0;d=m-b|0;e=a+b|0;if(m>>>0<=b>>>0){a=0;return a|0}c[o>>2]=n&1|b|2;c[e+4>>2]=d|1;c[2261]=e;c[2258]=d;return a|0}if((k|0)==(c[2260]|0)){f=(c[2257]|0)+d|0;if(f>>>0<b>>>0){a=0;return a|0}d=f-b|0;e=n&1;if(d>>>0>15){n=a+b|0;m=n+d|0;c[o>>2]=e|b|2;c[n+4>>2]=d|1;c[m>>2]=d;e=m+4|0;c[e>>2]=c[e>>2]&-2;e=n}else{c[o>>2]=e|f|2;e=a+f+4|0;c[e>>2]=c[e>>2]|1;e=0;d=0}c[2257]=d;c[2260]=e;return a|0}if(f&2|0){a=0;return a|0}l=(f&-8)+d|0;if(l>>>0<b>>>0){a=0;return a|0}m=l-b|0;g=f>>>3;a:do if(f>>>0>=256){h=c[k+24>>2]|0;f=c[k+12>>2]|0;do if((f|0)==(k|0)){f=k+16|0;e=f+4|0;d=c[e>>2]|0;if(!d){d=c[f>>2]|0;if(!d){j=0;break}else e=f}while(1){f=d+20|0;g=c[f>>2]|0;if(g|0){d=g;e=f;continue}f=d+16|0;g=c[f>>2]|0;if(!g)break;else{d=g;e=f}}if(e>>>0<i>>>0)$();else{c[e>>2]=0;j=d;break}}else{g=c[k+8>>2]|0;if(g>>>0<i>>>0)$();d=g+12|0;if((c[d>>2]|0)!=(k|0))$();e=f+8|0;if((c[e>>2]|0)==(k|0)){c[d>>2]=f;c[e>>2]=g;j=f;break}else $()}while(0);if(h|0){d=c[k+28>>2]|0;e=9324+(d<<2)|0;do if((k|0)==(c[e>>2]|0)){c[e>>2]=j;if(!j){c[2256]=c[2256]&~(1<<d);break a}}else if(h>>>0>=(c[2259]|0)>>>0){c[h+16+(((c[h+16>>2]|0)!=(k|0)&1)<<2)>>2]=j;if(!j)break a;else break}else $();while(0);f=c[2259]|0;if(j>>>0<f>>>0)$();c[j+24>>2]=h;d=k+16|0;e=c[d>>2]|0;do if(e|0)if(e>>>0<f>>>0)$();else{c[j+16>>2]=e;c[e+24>>2]=j;break}while(0);d=c[d+4>>2]|0;if(d|0)if(d>>>0<(c[2259]|0)>>>0)$();else{c[j+20>>2]=d;c[d+24>>2]=j;break}}}else{e=c[k+8>>2]|0;f=c[k+12>>2]|0;d=9060+(g<<1<<2)|0;if((e|0)!=(d|0)){if(e>>>0<i>>>0)$();if((c[e+12>>2]|0)!=(k|0))$()}if((f|0)==(e|0)){c[2255]=c[2255]&~(1<<g);break}if((f|0)!=(d|0)){if(f>>>0<i>>>0)$();d=f+8|0;if((c[d>>2]|0)==(k|0))h=d;else $()}else h=f+8|0;c[e+12>>2]=f;c[h>>2]=e}while(0);d=n&1;if(m>>>0<16){c[o>>2]=l|d|2;o=a+l+4|0;c[o>>2]=c[o>>2]|1;return a|0}else{n=a+b|0;c[o>>2]=d|b|2;c[n+4>>2]=m|3;o=n+m+4|0;c[o>>2]=c[o>>2]|1;lb(n,m);return a|0}return 0}function lb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;o=a+b|0;d=c[a+4>>2]|0;a:do if(!(d&1)){g=c[a>>2]|0;if(!(d&3))return;l=a+(0-g)|0;k=g+b|0;i=c[2259]|0;if(l>>>0<i>>>0)$();if((l|0)==(c[2260]|0)){a=o+4|0;d=c[a>>2]|0;if((d&3|0)!=3){r=l;f=k;break}c[2257]=k;c[a>>2]=d&-2;c[l+4>>2]=k|1;c[l+k>>2]=k;return}e=g>>>3;if(g>>>0<256){d=c[l+8>>2]|0;b=c[l+12>>2]|0;a=9060+(e<<1<<2)|0;if((d|0)!=(a|0)){if(d>>>0<i>>>0)$();if((c[d+12>>2]|0)!=(l|0))$()}if((b|0)==(d|0)){c[2255]=c[2255]&~(1<<e);r=l;f=k;break}if((b|0)!=(a|0)){if(b>>>0<i>>>0)$();a=b+8|0;if((c[a>>2]|0)==(l|0))h=a;else $()}else h=b+8|0;c[d+12>>2]=b;c[h>>2]=d;r=l;f=k;break}g=c[l+24>>2]|0;b=c[l+12>>2]|0;do if((b|0)==(l|0)){b=l+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){j=0;break}else d=b}while(1){b=a+20|0;e=c[b>>2]|0;if(e|0){a=e;d=b;continue}b=a+16|0;e=c[b>>2]|0;if(!e)break;else{a=e;d=b}}if(d>>>0<i>>>0)$();else{c[d>>2]=0;j=a;break}}else{e=c[l+8>>2]|0;if(e>>>0<i>>>0)$();a=e+12|0;if((c[a>>2]|0)!=(l|0))$();d=b+8|0;if((c[d>>2]|0)==(l|0)){c[a>>2]=b;c[d>>2]=e;j=b;break}else $()}while(0);if(g){a=c[l+28>>2]|0;d=9324+(a<<2)|0;do if((l|0)==(c[d>>2]|0)){c[d>>2]=j;if(!j){c[2256]=c[2256]&~(1<<a);r=l;f=k;break a}}else if(g>>>0>=(c[2259]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(l|0)&1)<<2)>>2]=j;if(!j){r=l;f=k;break a}else break}else $();while(0);b=c[2259]|0;if(j>>>0<b>>>0)$();c[j+24>>2]=g;a=l+16|0;d=c[a>>2]|0;do if(d|0)if(d>>>0<b>>>0)$();else{c[j+16>>2]=d;c[d+24>>2]=j;break}while(0);a=c[a+4>>2]|0;if(a)if(a>>>0<(c[2259]|0)>>>0)$();else{c[j+20>>2]=a;c[a+24>>2]=j;r=l;f=k;break}else{r=l;f=k}}else{r=l;f=k}}else{r=a;f=b}while(0);h=c[2259]|0;if(o>>>0<h>>>0)$();a=o+4|0;d=c[a>>2]|0;if(!(d&2)){a=c[2260]|0;if((o|0)==(c[2261]|0)){q=(c[2258]|0)+f|0;c[2258]=q;c[2261]=r;c[r+4>>2]=q|1;if((r|0)!=(a|0))return;c[2260]=0;c[2257]=0;return}if((o|0)==(a|0)){q=(c[2257]|0)+f|0;c[2257]=q;c[2260]=r;c[r+4>>2]=q|1;c[r+q>>2]=q;return}f=(d&-8)+f|0;e=d>>>3;b:do if(d>>>0>=256){g=c[o+24>>2]|0;b=c[o+12>>2]|0;do if((b|0)==(o|0)){b=o+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){n=0;break}else d=b}while(1){b=a+20|0;e=c[b>>2]|0;if(e|0){a=e;d=b;continue}b=a+16|0;e=c[b>>2]|0;if(!e)break;else{a=e;d=b}}if(d>>>0<h>>>0)$();else{c[d>>2]=0;n=a;break}}else{e=c[o+8>>2]|0;if(e>>>0<h>>>0)$();a=e+12|0;if((c[a>>2]|0)!=(o|0))$();d=b+8|0;if((c[d>>2]|0)==(o|0)){c[a>>2]=b;c[d>>2]=e;n=b;break}else $()}while(0);if(g|0){a=c[o+28>>2]|0;d=9324+(a<<2)|0;do if((o|0)==(c[d>>2]|0)){c[d>>2]=n;if(!n){c[2256]=c[2256]&~(1<<a);break b}}else if(g>>>0>=(c[2259]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(o|0)&1)<<2)>>2]=n;if(!n)break b;else break}else $();while(0);b=c[2259]|0;if(n>>>0<b>>>0)$();c[n+24>>2]=g;a=o+16|0;d=c[a>>2]|0;do if(d|0)if(d>>>0<b>>>0)$();else{c[n+16>>2]=d;c[d+24>>2]=n;break}while(0);a=c[a+4>>2]|0;if(a|0)if(a>>>0<(c[2259]|0)>>>0)$();else{c[n+20>>2]=a;c[a+24>>2]=n;break}}}else{d=c[o+8>>2]|0;b=c[o+12>>2]|0;a=9060+(e<<1<<2)|0;if((d|0)!=(a|0)){if(d>>>0<h>>>0)$();if((c[d+12>>2]|0)!=(o|0))$()}if((b|0)==(d|0)){c[2255]=c[2255]&~(1<<e);break}if((b|0)!=(a|0)){if(b>>>0<h>>>0)$();a=b+8|0;if((c[a>>2]|0)==(o|0))m=a;else $()}else m=b+8|0;c[d+12>>2]=b;c[m>>2]=d}while(0);c[r+4>>2]=f|1;c[r+f>>2]=f;if((r|0)==(c[2260]|0)){c[2257]=f;return}}else{c[a>>2]=d&-2;c[r+4>>2]=f|1;c[r+f>>2]=f}a=f>>>3;if(f>>>0<256){b=9060+(a<<1<<2)|0;d=c[2255]|0;a=1<<a;if(d&a){a=b+8|0;d=c[a>>2]|0;if(d>>>0<(c[2259]|0)>>>0)$();else{p=d;q=a}}else{c[2255]=d|a;p=b;q=b+8|0}c[q>>2]=r;c[p+12>>2]=r;c[r+8>>2]=p;c[r+12>>2]=b;return}a=f>>>8;if(a)if(f>>>0>16777215)a=31;else{p=(a+1048320|0)>>>16&8;q=a<<p;o=(q+520192|0)>>>16&4;q=q<<o;a=(q+245760|0)>>>16&2;a=14-(o|p|a)+(q<<a>>>15)|0;a=f>>>(a+7|0)&1|a<<1}else a=0;e=9324+(a<<2)|0;c[r+28>>2]=a;c[r+20>>2]=0;c[r+16>>2]=0;d=c[2256]|0;b=1<<a;if(!(d&b)){c[2256]=d|b;c[e>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r;return}d=f<<((a|0)==31?0:25-(a>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){a=121;break}b=e+16+(d>>>31<<2)|0;a=c[b>>2]|0;if(!a){a=118;break}else{d=d<<1;e=a}}if((a|0)==118){if(b>>>0<(c[2259]|0)>>>0)$();c[b>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r;return}else if((a|0)==121){a=e+8|0;d=c[a>>2]|0;q=c[2259]|0;if(!(d>>>0>=q>>>0&e>>>0>=q>>>0))$();c[d+12>>2]=r;c[a>>2]=r;c[r+8>>2]=d;c[r+12>>2]=e;c[r+24>>2]=0;return}}function mb(){}function nb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return (y=b+d+(c>>>0<a>>>0|0)>>>0,c|0)|0}function ob(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}f=h&-4|0;g=f-64|0;i=d|d<<8|d<<16|d<<24;while((b|0)<=(g|0)){c[b>>2]=i;c[b+4>>2]=i;c[b+8>>2]=i;c[b+12>>2]=i;c[b+16>>2]=i;c[b+20>>2]=i;c[b+24>>2]=i;c[b+28>>2]=i;c[b+32>>2]=i;c[b+36>>2]=i;c[b+40>>2]=i;c[b+44>>2]=i;c[b+48>>2]=i;c[b+52>>2]=i;c[b+56>>2]=i;c[b+60>>2]=i;b=b+64|0}while((b|0)<(f|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(h|0)){a[b>>0]=d;b=b+1|0}return h-e|0}function pb(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){y=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}y=0;return b>>>c-32|0}function qb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=N(e,f)|0;d=a>>>16;a=(c>>>16)+(N(e,d)|0)|0;e=b>>>16;b=N(e,f)|0;return (y=(a>>>16)+(N(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function rb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=qb(e,f)|0;a=y;return (y=(N(b,f)|0)+(N(d,e)|0)+a|a&0,c|0|0)|0}function sb(a){a=a|0;var b=0,d=0;d=a+15&-16|0;b=c[i>>2]|0;a=b+d|0;if((d|0)>0&(a|0)<(b|0)|(a|0)<0){V()|0;aa(12);return -1}c[i>>2]=a;if((a|0)>(U()|0)?(T()|0)==0:0){c[i>>2]=b;aa(12);return -1}return b|0}function tb(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return da(b|0,d|0,e|0)|0;h=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return h|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}e=g&-4|0;f=e-64|0;while((b|0)<=(f|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(e|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{e=g-4|0;while((b|0)<(e|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return h|0}function ub(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function vb(a,b){a=a|0;b=b|0;return ia[a&1](b|0)|0}function wb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ja[a&3](b|0,c|0,d|0)|0}function xb(a){a=a|0;R(0);return 0}function yb(a,b,c){a=a|0;b=b|0;c=c|0;R(1);return 0}
--
--// EMSCRIPTEN_END_FUNCS
--var ia=[xb,Sa];var ja=[yb,_a,Ua,Ta];return{_llvm_bswap_i32:ub,_shine_check_config:Ha,_shine_flush:La,setThrew:oa,_bitshift64Lshr:pb,_shine_samples_per_pass:Ia,_fflush:eb,_shine_js_init:Qa,_memset:ob,_sbrk:sb,_memcpy:tb,___errno_location:Wa,_shine_encode_buffer:Ka,_shine_close:Ma,stackAlloc:ka,getTempRet0:qa,___muldi3:rb,setTempRet0:pa,_i64Add:nb,_emscripten_get_global_libc:Ra,stackSave:la,___muldsi3:qb,_free:hb,runPostSets:mb,establishStackSpace:na,stackRestore:ma,_malloc:gb,stackAlloc:ka,stackSave:la,stackRestore:ma,establishStackSpace:na,setThrew:oa,setTempRet0:pa,getTempRet0:qa,dynCall_ii:vb,dynCall_iiii:wb}})
--
--
--// EMSCRIPTEN_END_ASM
--(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var _llvm_bswap_i32=Module["_llvm_bswap_i32"]=asm["_llvm_bswap_i32"];var _shine_check_config=Module["_shine_check_config"]=asm["_shine_check_config"];var _shine_flush=Module["_shine_flush"]=asm["_shine_flush"];var setThrew=Module["setThrew"]=asm["setThrew"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _shine_samples_per_pass=Module["_shine_samples_per_pass"]=asm["_shine_samples_per_pass"];var _fflush=Module["_fflush"]=asm["_fflush"];var _shine_js_init=Module["_shine_js_init"]=asm["_shine_js_init"];var _memset=Module["_memset"]=asm["_memset"];var _sbrk=Module["_sbrk"]=asm["_sbrk"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var ___errno_location=Module["___errno_location"]=asm["___errno_location"];var _shine_encode_buffer=Module["_shine_encode_buffer"]=asm["_shine_encode_buffer"];var _shine_close=Module["_shine_close"]=asm["_shine_close"];var stackAlloc=Module["stackAlloc"]=asm["stackAlloc"];var getTempRet0=Module["getTempRet0"]=asm["getTempRet0"];var ___muldi3=Module["___muldi3"]=asm["___muldi3"];var setTempRet0=Module["setTempRet0"]=asm["setTempRet0"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _emscripten_get_global_libc=Module["_emscripten_get_global_libc"]=asm["_emscripten_get_global_libc"];var stackSave=Module["stackSave"]=asm["stackSave"];var ___muldsi3=Module["___muldsi3"]=asm["___muldsi3"];var _free=Module["_free"]=asm["_free"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var establishStackSpace=Module["establishStackSpace"]=asm["establishStackSpace"];var stackRestore=Module["stackRestore"]=asm["stackRestore"];var _malloc=Module["_malloc"]=asm["_malloc"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];Runtime.stackAlloc=Module["stackAlloc"];Runtime.stackSave=Module["stackSave"];Runtime.stackRestore=Module["stackRestore"];Runtime.establishStackSpace=Module["establishStackSpace"];Runtime.setTempRet0=Module["setTempRet0"];Runtime.getTempRet0=Module["getTempRet0"];Module["asm"]=asm;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module["thisProgram"]),"i8",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),"i8",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,"i32",ALLOC_NORMAL);try{var ret=Module["_main"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e=="SimulateInfiniteLoop"){Module["noExitRuntime"]=true;return}else{var toLog=e;if(e&&typeof e==="object"&&e.stack){toLog=[e,e.stack]}Module.printErr("exception thrown: "+toLog);Module["quit"](1,e)}}finally{calledMain=true}};function run(args){args=args||Module["arguments"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=Module.run=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["exit"](status)}Module["quit"](status,new ExitStatus(status))}Module["exit"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;var extra="\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";var output="abort("+what+") at "+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module["abort"]=Module.abort=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false}run();var isNode=typeof process==="object"&&typeof require==="function";var int16Len=Module.HEAP16.BYTES_PER_ELEMENT;var ptrLen=Module.HEAP32.BYTES_PER_ELEMENT;function Shine(args){if(_shine_check_config(args.samplerate,args.bitrate)<0)throw"Invalid configuration";var mode;if(!args.mode){if(args.channels===1){mode=Shine.MONO}else{mode=Shine.JOINT_STEREO}}else{mode=args.mode}this._handle=_shine_js_init(args.channels,args.samplerate,mode,args.bitrate);this._channels=args.channels;this._samples_per_pass=_shine_samples_per_pass(this._handle);this._buffer=_malloc(this._channels*ptrLen);this._pcm=new Array(this._channels);this._rem=new Array(this._channels);this._written=_malloc(int16Len);var _tmp,chan;for(chan=0;chan<this._channels;chan++){this._rem[chan]=new Int16Array;_tmp=_malloc(this._samples_per_pass*int16Len);setValue(this._buffer+chan*ptrLen,_tmp,"*");this._pcm[chan]=Module.HEAP16.subarray(_tmp/int16Len,_tmp/int16Len+this._samples_per_pass)}return this}Shine.STEREO=0;Shine.JOINT_STEREO=1;Shine.DUAL_CHANNEL=2;Shine.MONO=3;Shine.prototype._encodePass=(function(data){if(!this._handle)throw"Closed";var chan;for(chan=0;chan<this._channels;chan++)this._pcm[chan].set(data[chan]);var _buf=_shine_encode_buffer(this._handle,this._buffer,this._written);var written=getValue(this._written,"i16");return Module.HEAPU8.subarray(_buf,_buf+written)});function concat(ctr,a,b){if(typeof b==="undefined"){return a}var ret=new ctr(a.length+b.length);ret.set(a);ret.subarray(a.length).set(b);return ret}function clip(x){return x>1?1:x<-1?-1:x}function convertFloat32(buf){var ret=new Array(buf.length);var samples=buf[0].length;var chan,i;for(chan=0;chan<buf.length;chan++){ret[chan]=new Int16Array(samples);for(i=0;i<samples;i++){ret[chan][i]=parseInt(clip(buf[chan][i])*32767)}}return ret}Shine.prototype.encode=(function(data){if(data.length!=this._channels)throw"Invalid data";var encoded=new Uint8Array;var tmp=new Array(this._channels);if(data[0]instanceof Float32Array){data=convertFloat32(data)}var chan;for(chan=0;chan<this._channels;chan++){tmp[chan]=new Float32Array;this._rem[chan]=concat(Int16Array,this._rem[chan],data[chan])}var i,enc;for(i=0;i<this._rem[0].length;i+=this._samples_per_pass){for(chan=0;chan<this._channels;chan++){tmp[chan]=this._rem[chan].subarray(i,i+this._samples_per_pass)}if(tmp[0].length<this._samples_per_pass){break}else{enc=this._encodePass(tmp);if(enc.length>0){encoded=concat(Uint8Array,encoded,enc)}}}if(tmp[0].length<this._samples_per_pass){this._rem=tmp}else{for(chan=0;chan<this._channels;chan++){this._rem[chan]=new Int16Array}}return encoded});Shine.prototype.close=(function(){if(!this._handle){throw"Closed"}var _buf=_shine_flush(this._handle,this._written);var written=getValue(this._written,"i16");var encoded=new Uint8Array(written);encoded.set(Module.HEAPU8.subarray(_buf,_buf+written));_free(this._written);_shine_close(this._handle);this._handle=null;var chan;for(chan=0;chan<this._channels;chan++){_free(getValue(this._buffer+chan*ptrLen,"*"))}_free(this._buffer);return encoded});if(isNode){module.exports=Shine}return Shine}).call(context)})()
--
--
--
--
-diff --git a/js/dist/libshine_browser.js b/js/dist/libshine_browser.js
-new file mode 100644
-index 0000000..5e8cd74
---- /dev/null
-+++ b/js/dist/libshine_browser.js
-@@ -0,0 +1,183 @@
-+// libshine function wrappers
-+
-+var StereoMode = {
-+ '0': 'STEREO',
-+ '1': 'JOINT_STEREO',
-+ '2': 'DUAL_CHANNEL',
-+ '3': 'MONO',
-+ STEREO: 0,
-+ JOINT_STEREO: 1,
-+ DUAL_CHANNEL: 2,
-+ MONO: 3
-+};
-+
-+var ShineModule;
-+var int16Len;
-+var ptrLen;
-+
-+function shineInit() {
-+ int16Len = ShineModule._shine_js_int16_len();
-+ ptrLen = ShineModule._shine_js_ptr_len();
-+};
-+
-+function Shine(args) {
-+ if (ShineModule._shine_check_config(args.samplerate, args.bitrate) < 0)
-+ throw "Invalid configuration";
-+
-+ var stereoMode;
-+ if (!args.stereoMode) {
-+ if (args.channels === 1) {
-+ stereoMode = Shine.MONO;
-+ } else {
-+ stereoMode = Shine.JOINT_STEREO;
-+ }
-+ } else {
-+ stereoMode = args.stereoMode;
-+ }
-+
-+ this._handle = ShineModule._shine_js_init(args.channels, args.samplerate, stereoMode, args.bitrate);
-+
-+ this._channels = args.channels;
-+ this._samples_per_pass = ShineModule._shine_samples_per_pass(this._handle);
-+
-+ this._buffer = ShineModule._malloc(this._channels * ptrLen);
-+ this._pcm = new Array(this._channels);
-+ this._rem = new Array(this._channels);
-+ this._written = ShineModule._malloc(int16Len);
-+
-+ var _tmp, chan;
-+ for (chan=0; chan<this._channels; chan++) {
-+ this._rem[chan] = new Int16Array;
-+ _tmp = ShineModule._malloc(this._samples_per_pass * int16Len);
-+ ShineModule.setValue(this._buffer + chan*ptrLen, _tmp, "*")
-+ this._pcm[chan] = ShineModule.HEAP16.subarray(_tmp/int16Len, _tmp/int16Len+this._samples_per_pass)
-+ }
-+
-+ return this;
-+};
-+
-+Shine.checkConfig = function (samplerate, bitrate) {
-+ return ShineModule._shine_check_config(samplerate, bitrate) >= 0;
-+};
-+
-+Shine.prototype._encodePass = function (data) {
-+ if (!this._handle)
-+ throw "Closed";
-+
-+ var chan;
-+ for (chan=0;chan<this._channels;chan++)
-+ this._pcm[chan].set(data[chan]);
-+
-+ var _buf = ShineModule._shine_encode_buffer(this._handle, this._buffer, this._written);
-+
-+ var written = ShineModule.getValue(this._written, "i16");
-+
-+ return ShineModule.HEAPU8.subarray(_buf, _buf+written);
-+};
-+
-+function concat(ctr, a, b) {
-+ if (typeof b === "undefined") {
-+ return a;
-+ }
-+ var ret = new ctr(a.length+b.length);
-+ ret.set(a);
-+ ret.subarray(a.length).set(b);
-+ return ret;
-+}
-+
-+function clip(x) {
-+ return (x > 1 ? 1 : (x < -1 ? -1 : x));
-+}
-+
-+function convertFloat32(buf) {
-+ var ret = new Array(buf.length);
-+ var samples = buf[0].length;
-+ var chan, i;
-+
-+ for (chan=0;chan<buf.length;chan++) {
-+ ret[chan] = new Int16Array(samples);
-+ for (i=0;i<samples;i++) {
-+ ret[chan][i] = parseInt(clip(buf[chan][i]) * 32767);
-+ }
-+ }
-+ return ret;
-+}
-+
-+Shine.prototype.encode = function (data) {
-+ if (data.length != this._channels)
-+ throw "Invalid data";
-+
-+ var encoded = new Uint8Array;
-+ var tmp = new Array(this._channels);
-+
-+ if (data[0] instanceof Float32Array) {
-+ data = convertFloat32(data);
-+ }
-+
-+ var chan;
-+ for (chan=0;chan<this._channels; chan++) {
-+ tmp[chan] = new Float32Array;
-+ this._rem[chan] = concat(Int16Array, this._rem[chan], data[chan]);
-+ }
-+
-+ var i, enc;
-+ for (i=0;i<this._rem[0].length;i+=this._samples_per_pass) {
-+ for (chan=0; chan<this._channels; chan++) {
-+ tmp[chan] = this._rem[chan].subarray(i, i+this._samples_per_pass);
-+ }
-+
-+ if (tmp[0].length < this._samples_per_pass) {
-+ break;
-+ } else {
-+ enc = this._encodePass(tmp);
-+ if (enc.length > 0) {
-+ encoded = concat(Uint8Array, encoded, enc);
-+ }
-+ }
-+ }
-+
-+ if (tmp[0].length < this._samples_per_pass) {
-+ this._rem = tmp;
-+ } else {
-+ for (chan=0; chan<this._channels; chan++) {
-+ this._rem[chan] = new Int16Array;
-+ }
-+ }
-+
-+ return encoded;
-+};
-+
-+Shine.prototype.close = function () {
-+ if (!this._handle) {
-+ throw "Closed";
-+ }
-+
-+ var _buf = ShineModule._shine_flush(this._handle, this._written);
-+
-+ var written = ShineModule.getValue(this._written, "i16");
-+ var encoded = new Uint8Array(written);
-+
-+ encoded.set(ShineModule.HEAPU8.subarray(_buf, _buf + written));
-+
-+ ShineModule._free(this._written);
-+ ShineModule._shine_close(this._handle);
-+ this._handle = null;
-+
-+ var chan;
-+ for (chan=0; chan<this._channels; chan++) {
-+ ShineModule._free(ShineModule.getValue(this._buffer + chan*ptrLen, "*"));
-+ }
-+ ShineModule._free(this._buffer);
-+
-+ return encoded;
-+};
-+var createModule = require("./libshine_browser_stubs").default;
-+
-+Shine.initialized = (createModule()).then(function (Module) {
-+ ShineModule = Module;
-+ shineInit();
-+});
-+
-+module.exports.Shine = Shine;
-+
-+module.exports.StereoMode = StereoMode;
-diff --git a/js/dist/libshine_browser_stubs.js b/js/dist/libshine_browser_stubs.js
-new file mode 100644
-index 0000000..23863a3
---- /dev/null
-+++ b/js/dist/libshine_browser_stubs.js
-@@ -0,0 +1,16 @@
-+
-+var createModule = (() => {
-+ var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
-+
-+ return (
-+function(createModule) {
-+ createModule = createModule || {};
-+
-+var Module=typeof createModule!="undefined"?createModule:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}var wasmBinaryFile;wasmBinaryFile="data:application/octet-stream;base64,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/LECIAMoAtCyAmsiBiAGQR91IgZzIAZraiADKAL4sQIiBiADKALMsgJrIgggCEEfdSIIcyAIa2ogAygC9LECIAMoAsiyAiIIayIKIApBH3UiCnMgCmtqIAMoAvCxAiADKALEsgIiCmsiByAHQR91IgdzIAdraiADKALssQIgAygCwLICayIHIAdBH3UiB3MgB2tqIAMoAuixAiIHIAMoAryyAmsiCyALQR91IgtzIAtramogAygC4LECIAMoArSyAiILayIOIA5BH3UiDnMgDmtqIAMoAtyxAiADKAKwsgIiDmsiEiASQR91IhJzIBJraiADKALYsQIiEiADKAKssgJrIhMgE0EfdSITcyATa2pqaiADKALMsQIgAygCoLICIhNrIhQgFEEfdSIUcyAUa2ogAygCyLECIhQgAygCnLICayIWIBZBH3UiFnMgFmtqQeQASWpBBkcEQCAMQgA3AnwgDEIANwKEAQwBCyAMQQA2AnwgDCAAIAFqIAMoAtyxAiAOayIAIABBH3UiAHMgAGtqIBIgAygCrLICayIAIABBH3UiAHMgAGtqIAMoAsyxAiATayIAIABBH3UiAHMgAGtqIBQgAygCnLICayIAIABBH3UiAHMgAGtqQQpJIAMoAoCzAiADKALUswJrIgAgAEEfdSIAcyAAayADKAKEswIgAygC2LMCayIAIABBH3UiAHMgAGtqIAMoAvyyAiADKALQswJrIgAgAEEfdSIAcyAAa2ogAygC+LICIAMoAsyzAmsiACAAQR91IgBzIABraiADKAL0sgIgAygCyLMCayIAIABBH3UiAHMgAGtqIAMoAvCyAiADKALEswJrIgAgAEEfdSIAcyAAa2pBCklxNgJ8IAxBADYCgAEgDCADKALwsQIgCmsiACAAQR91IgBzIABrIARqIAMoAuyxAiADKALAsgJrIgAgAEEfdSIAcyAAa2ogByADKAK8sgJrIgAgAEEfdSIAcyAAa2ogAygC4LECIAtrIgAgAEEfdSIAcyAAa2pBCkkgAygClLMCIAMoAuizAmsiACAAQR91IgBzIABrIAMoApizAiADKALsswJrIgAgAEEfdSIAcyAAa2ogAygCkLMCIAMoAuSzAmsiACAAQR91IgBzIABraiADKAKMswIgAygC4LMCayIAIABBH3UiAHMgAGtqIAMoAoizAiADKALcswJrIgAgAEEfdSIAcyAAa2pBCklxNgKAASAMQQA2AoQBIAwgAygCgLICIAMoAtSyAmsiACAAQR91IgBzIABrIAMoAoSyAiAFayIAIABBH3UiAHMgAGtqIAMoAvyxAiADKALQsgJrIgAgAEEfdSIAcyAAa2ogBiADKALMsgJrIgAgAEEfdSIAcyAAa2ogAygC9LECIAhrIgAgAEEfdSIAcyAAa2pBCkkgAygCqLMCIAMoAvyzAmsiACAAQR91IgBzIABrIAMoAqyzAiADKAKAtAJrIgAgAEEfdSIAcyAAa2ogAygCpLMCIAMoAvizAmsiACAAQR91IgBzIABraiADKAKgswIgAygC9LMCayIAIABBH3UiAHMgAGtqIAMoApyzAiADKALwswJrIgAgAEEfdSIAcyAAa2pBCklxNgKEASAMQQA2AogBIAwgAygClLICIAMoAuiyAmsiACAAQR91IgBzIABrIAMoApiyAiADKALssgJrIgAgAEEfdSIAcyAAa2ogAygCkLICIAMoAuSyAmsiACAAQR91IgBzIABraiADKAKMsgIgAygC4LICayIAIABBH3UiAHMgAGtqIAMoAoiyAiADKALcsgJrIgAgAEEfdSIAcyAAa2pBCkkgAygCvLMCIAMoApC0AmsiACAAQR91IgBzIABrIAMoAsCzAiADKAKUtAJrIgAgAEEfdSIAcyAAa2ogAygCuLMCIAMoAoy0AmsiACAAQR91IgBzIABraiADKAK0swIgAygCiLQCayIAIABBH3UiAHMgAGtqIAMoArCzAiADKAKEtAJrIgAgAEEfdSIAcyAAa2pBCklxNgKIAQtB/x8gAygCkAQgAygCAG0iBCAEQf8fThshACADKAK0jQIiBQRAQQAhAUH/HyAAISMgAygCsI0CIgYgBUEDdEF2bWoiBSEiAn8gDCANQQN0akGQEWorAwBEzczMzMzMCECiIAS3oSJImUQAAAAAAADgQWMEQCBIqgwBC0GAgICAeAsiBEHlAE4EQCAGQQZsQQptIgEgBCABIARIGyEBCyAjICIgASABIAVIG2oiACAAQf8fThshAAsgGSANQbABbGogEEHYAGxqQdgAEAcgAyANQbgCbGogEEGcAWxqQZgMakGcARAHIAlCADcCCCAJQgA3AgAgEUIANwKsASARQQA2AqQBIBFCADcCnAEgEUIA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BQAHAAEABgABAAEAAAABAwYHAwMGBwYGBwgHBgcIBwADAAUAAQAGAAIAAwACAAUABAAEAAEAAwADAAIAAAADAwUHAwIEBQQEBQYGBQYHAQACAAoAEwAQAAoAAwADAAcACgAFAAMACwAEAA0AEQAIAAQADAALABIADwALAAIABwAGAAkADgADAAEABgAEAAUAAwACAEGACgskAQMGCAgJAwQGBwcIBgUHCAgJBwcICQkJBwcICQkKCAgJCgoKAEGwCgtFAwAEAAYAEgAMAAUABQABAAIAEAAJAAMABwADAAUADgAHAAMAEwARAA8ADQAKAAQADQAFAAgACwAFAAEADAAEAAQAAQABAEGACwskAgMGCAgJAwIECAgIBgQGCAgJCAgICQkKCAcICQoKCQgJCQsLAEGwCwtFBwAFAAkADgAPAAcABgAEAAUABQAGAAcABwAGAAgACAAIAAUADwAGAAkACgAFAAEACwAHAAkABgAEAAEADgAEAAYAAgAGAEGADAskAwMFBggJAwMEBQYIBAQFBgcIBgUGBwcIBwYHBwgJCAcICAkJAEGwDAugHQEAAgAKABcAIwAeAAwAEQADAAMACAAMABIAFQAMAAcACwAJAA8AFQAgACgAEwAGAA4ADQAWACIALgAXABIABwAUABMAIQAvABsAFgAJAAMAHwAWACkAGgAVABQABQADAA4ADQAKAAsAEAAGAAUAAQAJAAgABwAIAAQABAACAAAAAQMGCAkJCQoDBAYHCAkICAYGBwgJCgkJBwcICQoKCQoICAkKCgoKCgkJCgoLCwoLCAgJCgoKCwsJCAkKCgsLCwMABAAKABgAIgAhABUADwAFAAMABAAKACAAEQALAAoACwAHAA0AEgAeAB8AFAAFABkACwATADsAGwASAAwABQAjACEAHwA6AB4AEAAHAAUAHAAaACAAEwARAA8ACAAOAA4ADAAJAA0ADgAJAAQAAQALAAQABgAGAAYAAwACAAAAAgMFBwgJCAkDAwQGCAgHCAUFBgcICQgIBwYHCQgKCAkICAgJCQoJCggICQoKCwoLCAcHCAkKCgoIBwgJCgoKCgkABgAQACEAKQAnACYAGgAHAAUABgAJABcAEAAaAAsAEQAHAAsADgAVAB4ACgAHABEACgAPAAwAEgAcAA4ABQAgAA0AFgATABIAEAAJAAUAKAARAB8AHQARAA0ABAACABsADAALAA8ACgAHAAQAAQAbAAwACAAMAAYAAwABAAAABAMFBwgJCQkDAwQFBwcICAUEBQYHCAcIBgUGBgcICAgHBgcHCAgICQgHCAgICQgJCAcHCAgJCQoJCAgJCQkJCgEABQAOABUAIgAzAC4ARwAqADQARAA0AEMALAArABMAAwAEAAwAEwAfABoALAAhAB8AGAAgABgAHwAjABYADgAPAA0AFwAkADsAMQBNAEEAHQAoAB4AKAAbACEAKgAQABYAFAAlAD0AOABPAEkAQAArAEwAOAAlABoAHwAZAA4AIwAQADwAOQBhAEsAcgBbADYASQA3ACkAMAA1ABcAGAA6ABsAMgBgAEwARgBdAFQATQA6AE8AHQBKADEAKQARAC8ALQBOAEoAcwBeAFoATwBFAFMARwAyADsAJgAkAA8ASAAiADgAXwBcAFUAWwBaAFYASQBNAEEAMwAsACsAKgArABQAHgAsADcATgBIAFcATgA9AC4ANgAlAB4AFAAQADUAGQApACUALAA7ADYAUQBCAEwAOQA2ACUAEgAnAAsAIwAhAB8AOQAqAFIASABQAC8AOgA3ABUAFgAaACYAFgA1ABkAFwAmAEYAPAAzACQANwAaACIAFwAbAA4ACQAHACIAIAAcACcAMQBLAB4ANAAwACgANAAcABIAEQAJAAUALQAVACIAQAA4ADIAMQAtAB8AEwAMAA8ACgAHAAYAAwAwABcAFAAnACQAIwA1ABUAEAAXAA0ACgAGAAEABAACABAADwARABsAGQAUAB0ACwARAAwAEAAIAAEAAQAAAAEAAQQGBwgJCQoJCgsLDAwNDQMEBgcICAkJCQkKCgsMDAwGBgcICQkKCgkKCgsLDA0NBwcICQkKCgoKCwsLCwwNDQgHCQkKCgsLCgsLDAwNDQ4JCAkKCgoLCwsLDAsNDQ4OCQkKCgsLCwsLDAwMDQ0ODgoJCgsLCwwMDAwNDQ0OEBAJCAkKCgsLDAwMDA0NDg8PCgkKCgsLCw0MDQ0ODg4QDwoKCgsLDAwNDA0ODQ4PEBELCgoLDAwMDA0NDQ4PDw8QCwsLDAwNDA0ODg8PDxAQEAwLDA0NDQ4ODg4ODxAPEBANDAwNDQ0PDg4RDw8PERAQDAwNDg4ODw4PDxAQExITEAcADAASADUALwBMAHwAbABZAHsAbAB3AGsAUQB6AD8ADQAFABAAGwAuACQAPQAzACoARgA0AFMAQQApADsAJAATABEADwAYACkAIgA7ADAAKABAADIATgA+AFAAOAAhAB0AHAAZACsAJwA/ADcAXQBMADsAXQBIADYASwAyAB0ANAAWACoAKABDADkAXwBPAEgAOQBZAEUAMQBCAC4AGwBNACUAIwBCADoANABbAEoAPgAwAE8APwBaAD4AKAAmAH0AIAA8ADgAMgBcAE4AQQA3AFcARwAzAEkAMwBGAB4AbQA1ADEAXgBYAEsAQgB6AFsASQA4ACoAQAAsABUAGQBaACsAKQBNAEkAPwA4AFwATQBCAC8AQwAwADUAJAAUAEcAIgBDADwAOgAxAFgATABDAGoARwA2ACYAJwAXAA8AbQA1ADMALwBaAFIAOgA5ADAASAA5ACkAFwAbAD4ACQBWACoAKAAlAEYAQAA0ACsARgA3ACoAGQAdABIACwALAHYARAAeADcAMgAuAEoAQQAxACcAGAAQABYADQAOAAcAWwAsACcAJgAiAD8ANAAtAB8ANAAcABMADgAIAAkAAwB7ADwAOgA1AC8AKwAgABYAJQAYABEADAAPAAoAAgABAEcAJQAiAB4AHAAUABEAGgAVABAACgAGAAgABgACAAAAAwQFBwcICQkJCgoLCwsMDQQDBQYHBwgICAkJCgoKCwsFBQUGBwcICAgJCQoKCwsLBgYGBwcICAkJCQoKCgsLCwcGBwcICAkJCQkKCgoLCwsIBwcICAgJCQkJCgoLCwsMCQcICAgJCQkJCgoKCwsMDAkICAkJCQkKCgoKCgsLCwwJCAgJCQkJCgoKCgsLDAwMCQgJCQkJCgoKCwsLCwwMDAoJCQkKCgoKCgsLCwsMDQwKCQkJCgoKCgsLCwsMDAwNCwoJCgoKCwsLCwsLDAwNDQsKCgoKCwsLCwwMDAwMDQ0MCwsLCwsLCwwMDAwNDQwNDAsLCwsLCwwMDAwMDQ0NDQEABQAOACwASgA/AG4AXQCsAJUAigDyAOEAwwB4AREAAwAEAAwAFAAjAD4ANQAvAFMASwBEAHcAyQBrAM8ACQAPAA0AFwAmAEMAOgBnAFoAoQBIAH8AdQBuANEAzgAQAC0AFQAnAEUAQAByAGMAVwCeAIwA/ADUAMcAgwFtARoASwAkAEQAQQBzAGUAswCkAJsACAH2AOIAiwF+AWoBCQBCAB4AOwA4AGYAuQCtAAkBjgD9AOgAkAGEAXoBvQEQAG8ANgA0AGQAuACyAKAAhQABAfQA5ADZAIEBbgHLAgoAYgAwAFsAWAClAJ0AlAAFAfgAlwGNAXQBfAF5A3QDCABVAFQAUQCfAJwAjwAEAfkAqwGRAYgBfwHXAskCxAIHAJoATABJAI0AgwAAAfUAqgGWAYoBgAHfAmcBxgJgAQsAiwCBAEMAfQD3AOkA5QDbAIkB5wLhAtACdQNyA7cBBADzAHgAdgBzAOMA3wCMAeoC5gLgAtECyALCAt8AtAEGAMoA4ADeANoA2ACFAYIBfQFsAXgDuwHDArgBtQHABgQA6wLTANIA0AByAXsB3gLTAsoCxwZzA20DbAODDWEDAgB5AXEBZgC7ANYC0gJmAccCxQJiA8YGZwOCDWYDsgEAAAwACgAHAAsACgARAAsACQANAAwACgAHAAUAAwABAAMAAQQGCAkJCgoLCwsMDAwNCQMEBgcICQkJCgoKCwwLDAgGBgcICQkKCgsKCwsLDAwJCAcICQkKCgoLCwwMDA0NCgkICQkKCgsLCwwMDA0NDQkJCAkJCgsLDAsMDA0NDQ4KCgkJCgsLCwsMDAwMDQ0OCgoJCgoLCwsMDA0NDQ0PDwoKCgoLCwsMDA0NDQ0ODg4KCwoKCwsMDA0NDQ0ODQ4NCwsLCgsMDAwMDQ4ODg8PDgoMCwsLDAwNDg4ODg4ODQ4LDAwMDAwNDQ0NDw4ODg4QCw4MDAwNDQ4ODhAPDw8RDwsNDQsMDg4NDg4PEA8RDw4LCQgICQkKCgoLCwsLCwsLCA8ADQAuAFAAkgAGAfgAsgGqAZ0CjQKJAm0CBQIIBFgADgAMABUAJgBHAIIAegDYANEAxgBHAVkBPwEpARcBKgAvABYAKQBKAEQAgAB4AN0AzwDCALYAVAE7AScBHQISAFEAJwBLAEYAhgB9AHQA3ADMAL4AsgBFATcBJQEPARAAkwBIAEUAhwB/AHYAcADSAMgAvABgAUMBMgEdARwCDgAHAUIAgQB+AHcAcgDWAMoAwAC0AFUBPQEtARkBBgEMAPkAewB5AHUAcQDXAM4AwwC5AFsBSgE0ASMBEAEIAgoAswFzAG8AbQDTAMsAxAC7AGEBTAE5ASoBGwETAn0BEQCrAdQA0ADNAMkAwQC6ALEAqQBAAS8BHgEMAQICeQEQAE8BxwDFAL8AvQC1AK4ATQFBATEBIQETAQkCewFzAQsAnAK4ALcAswCvAFgBSwE6ATABIgEVARICfwF1AW4BCgCMAloBqwCoAKQAPgE1ASsBHwEUAQcBAQJ3AXABagEGAIgCQgE8ATgBMwEuASQBHAENAQUBAAJ4AXIBbAFnAQQAbAIsASgBJgEgARoBEQEKAQMCfAF2AXEBbQFpAWUBAgAJBBgBFgESAQsBCAEDAX4BegF0AW8BawFoAWYBZAEAACsAFAATABEADwANAAsACQAHAAYABAAHAAUAAwABAAMABAQGBwgJCQoKCwsLCwsMCQQEBQYHCAgJCQkKCgoKCggGBQYHBwgICQkJCQoKCgsHBwYHBwgICAkJCQkKCgoKBwgHBwgICAgJCQkKCgoKCwcJBwgICAgJCQkJCgoKCgoHCQgICAgJCQkJCgoKCgoLBwoICAgJCQkJCgoKCgoLCwgKCQkJCQkJCQkKCgoKCwsICgkJCQkJCQoKCgoKCwsLCAsJCQkJCgoKCgoKCwsLCwgLCgkJCQoKCgoKCgsLCwsICwoKCgoKCgoKCgsLCwsLCAsKCgoKCgoKCwsLCwsLCwgMCgoKCgoKCwsLCwsLCwsICAcHBwcHBwcHBwcICAgIBAEABQAEAAUABgAFAAQABAAHAAMABgAAAAcAAgADAAEAAQQEBQQGBQYEBQUGBQYGBg8ADgANAAwACwAKAAkACAAHAAYABQAEAAMAAgABAAAABAQEBAQEBAQEBAQEBAQEBABB6CkLBQIAAAACAEH5KQsMBAAACAQAAAMAAAADAEGQKgsNEAQAACIEAAADAAAAAwBBqCoLBjAEAABCBABByCoLBQQAAAAEAEHYKgsNUAQAAHAEAAAEAAAABABB8CoLDYAEAACgBAAABgAAAAYAQYgrCw2wBAAAAAUAAAYAAAAGAEGgKwsNMAUAAIAFAAAGAAAABgBBuCsLDbAFAAAABgAACAAAAAgAQdArCw0wBgAAsAYAAAgAAAAIAEHoKwsN8AYAAHAHAAAIAAAACABBgCwLDbAHAAAwCAAAEAAAABAAQZgsCwZwCAAAcAoAQbgsCwUQAAAAEABByCwLjQNwCwAAcA0AABAAAAAQAAAAAQAAAAEAAABwDgAAcBAAABAAAAAQAAAAAgAAAAMAAABwDgAAcBAAABAAAAAQAAAAAwAAAAcAAABwDgAAcBAAABAAAAAQAAAABAAAAA8AAABwDgAAcBAAABAAAAAQAAAABgAAAD8AAABwDgAAcBAAABAAAAAQAAAACAAAAP8AAABwDgAAcBAAABAAAAAQAAAACgAAAP8DAABwDgAAcBAAABAAAAAQAAAADQAAAP8fAABwDgAAcBAAABAAAAAQAAAABAAAAA8AAABwEQAAcBMAABAAAAAQAAAABQAAAB8AAABwEQAAcBMAABAAAAAQAAAABgAAAD8AAABwEQAAcBMAABAAAAAQAAAABwAAAH8AAABwEQAAcBMAABAAAAAQAAAACAAAAP8AAABwEQAAcBMAABAAAAAQAAAACQAAAP8BAABwEQAAcBMAABAAAAAQAAAACwAAAP8HAABwEQAAcBMAABAAAAAQAAAADQAAAP8fAABwEQAAcBMAAAEAAAAQAEHgLwsNcBQAAJAUAAABAAAAEABB+C8LBqAUAADAFABBrDALiQEBAAAAAQAAAAEAAAABAAAAAQAAAAEAAAACAAAAAgAAAAIAAAACAAAAAwAAAAIAAAADAAAAAwAAAAQAAAADAAAABAAAAAMAAAAEAAAABAAAAAUAAAAEAAAABQAAAAQAAAAGAAAABQAAAAYAAAAFAAAABgAAAAUAAAAHAAAABgAAAAcAAAAGAAAABwBBwDELDQEAAAD/////AQAAAAIAQeAxC5IBAwAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAMAAAADAAAAAwAAAAQAAAAEAAAAAAAAAAEAAAACAAAAAwAAAAAAAAABAAAAAgAAAAMAAAABAAAAAgAAAAMAAAABAAAAAgAAAAMAAAACAAAAAwAAAESsAACAuwAAAH0AACJWAADAXQAAgD4AABErAADgLgAAQB8AQYAzC7oI/////////////////////wgAAAD/////CAAAACAAAAAQAAAA/////xAAAAAoAAAAGAAAAP////8YAAAAMAAAACAAAAD/////IAAAADgAAAAoAAAA/////ygAAABAAAAAMAAAAP////8wAAAAUAAAADgAAAD/////OAAAAGAAAABAAAAA/////0AAAABwAAAA//////////9QAAAAgAAAAP//////////YAAAAKAAAAD//////////3AAAADAAAAA//////////+AAAAA4AAAAP//////////kAAAAAABAAD//////////6AAAABAAQAA/////////////////////wAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAeAAAAJAAAACwAAAA0AAAAPgAAAEoAAABaAAAAbgAAAIYAAACiAAAAxAAAAO4AAAAgAQAAVgEAAKIBAABAAgAAAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAAB4AAAAkAAAAKgAAADIAAAA8AAAASAAAAFgAAABqAAAAgAAAAJwAAAC+AAAA5gAAABQBAABKAQAAgAEAAEACAAAAAAAABAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHgAAACQAAAAsAAAANgAAAEIAAABSAAAAZgAAAH4AAACcAAAAwgAAAPAAAAAoAQAAbAEAAMABAAAmAgAAQAIAAAAAAAAGAAAADAAAABIAAAAYAAAAHgAAACQAAAAsAAAANgAAAEIAAABQAAAAYAAAAHQAAACMAAAAqAAAAMgAAADuAAAAHAEAAFABAACMAQAA0AEAAAoCAABAAgAAAAAAAAYAAAAMAAAAEgAAABgAAAAeAAAAJAAAACwAAAA2AAAAQgAAAFAAAABgAAAAcgAAAIgAAACiAAAAwgAAAOgAAAAWAQAASgEAAIoBAADQAQAAHAIAAEACAAAAAAAABgAAAAwAAAASAAAAGAAAAB4AAAAkAAAALAAAAC0AAABCAAAAUAAAAGAAAAB0AAAAjAAAAKgAAADIAAAA7gAAAPgAAABQAQAAjAEAANABAAAKAgAAQAIAAAAAAAAGAAAADAAAABIAAAAYAAAAHgAAACQAAAAsAAAANgAAAEIAAABQAAAAYAAAAHQAAACMAAAAqAAAAMgAAADuAAAAHAEAAFABAACMAQAA0AEAAAoCAABAAgAAAAAAAAYAAAAMAAAAEgAAABgAAAAeAAAAJAAAACwAAAA2AAAAQgAAAFAAAABgAAAAdAAAAIwAAACoAAAAyAAAAO4AAAAcAQAAUAEAAIwBAADQAQAACgIAAEACAAAAAAAADAAAABgAAAAkAAAAMAAAADwAAABIAAAAWAAAAGwAAACEAAAAoAAAAMAAAADoAAAAGAEAAFABAACQAQAA3AEAADYCAAA4AgAAOgIAADwCAAA+AgAAQAIAQdw7C8oPnff//533//+d9///nff//533//+d9///Ou///zrv//86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";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}var binary=tryParseAsDataURI(file);if(binary){return binary}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["c"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["o"];addOnInit(Module["asm"]["d"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);readyPromiseReject(e)}}instantiateAsync().catch(readyPromiseReject);return{}}var tempDouble;var tempI64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];case"*":return HEAPU32[ptr>>2];default:abort("invalid type for getValue: "+type)}return null}function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){if(ASSERTIONS){assert(false,"Character code "+chr+" ("+String.fromCharCode(chr)+") at offset "+i+" not in 0x00-0xFF.")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;case"*":HEAPU32[ptr>>2]=value;break;default:abort("invalid type for setValue: "+type)}}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function abortOnCannotGrowMemory(requestedSize){abort("OOM")}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;abortOnCannotGrowMemory(requestedSize)}var ASSERTIONS=false;var decodeBase64=typeof atob=="function"?atob:function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i<input.length);return output};function intArrayFromBase64(s){try{var decoded=decodeBase64(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}catch(_){throw new Error("Converting base64 string to bytes failed.")}}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}var asmLibraryArg={"b":_emscripten_memcpy_big,"a":_emscripten_resize_heap};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["d"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["e"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["f"]).apply(null,arguments)};var _shine_check_config=Module["_shine_check_config"]=function(){return(_shine_check_config=Module["_shine_check_config"]=Module["asm"]["g"]).apply(null,arguments)};var _shine_samples_per_pass=Module["_shine_samples_per_pass"]=function(){return(_shine_samples_per_pass=Module["_shine_samples_per_pass"]=Module["asm"]["h"]).apply(null,arguments)};var _shine_encode_buffer=Module["_shine_encode_buffer"]=function(){return(_shine_encode_buffer=Module["_shine_encode_buffer"]=Module["asm"]["i"]).apply(null,arguments)};var _shine_flush=Module["_shine_flush"]=function(){return(_shine_flush=Module["_shine_flush"]=Module["asm"]["j"]).apply(null,arguments)};var _shine_close=Module["_shine_close"]=function(){return(_shine_close=Module["_shine_close"]=Module["asm"]["k"]).apply(null,arguments)};var _shine_js_int16_len=Module["_shine_js_int16_len"]=function(){return(_shine_js_int16_len=Module["_shine_js_int16_len"]=Module["asm"]["l"]).apply(null,arguments)};var _shine_js_ptr_len=Module["_shine_js_ptr_len"]=function(){return(_shine_js_ptr_len=Module["_shine_js_ptr_len"]=Module["asm"]["m"]).apply(null,arguments)};var _shine_js_init=Module["_shine_js_init"]=function(){return(_shine_js_init=Module["_shine_js_init"]=Module["asm"]["n"]).apply(null,arguments)};Module["setValue"]=setValue;Module["getValue"]=getValue;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();
-+
-+
-+ return createModule.ready
-+}
-+);
-+})();
-+export default createModule;
-\ No newline at end of file
-diff --git a/js/dist/libshine_node.js b/js/dist/libshine_node.js
-new file mode 100644
-index 0000000..02d7990
---- /dev/null
-+++ b/js/dist/libshine_node.js
-@@ -0,0 +1 @@
-+var Module=typeof Module!="undefined"?Module:{};var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");if(ENVIRONMENT_IS_WORKER){scriptDirectory=nodePath.dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=(filename,binary)=>{var ret=tryParseAsDataURI(filename);if(ret){return binary?ret:ret.toString()}filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror)=>{var ret=tryParseAsDataURI(filename);if(ret){onload(ret)}filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",function(reason){throw reason});quit_=(status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="data:application/octet-stream;base64,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/LECIAMoAtCyAmsiBiAGQR91IgZzIAZraiADKAL4sQIiBiADKALMsgJrIgggCEEfdSIIcyAIa2ogAygC9LECIAMoAsiyAiIIayIKIApBH3UiCnMgCmtqIAMoAvCxAiADKALEsgIiCmsiByAHQR91IgdzIAdraiADKALssQIgAygCwLICayIHIAdBH3UiB3MgB2tqIAMoAuixAiIHIAMoAryyAmsiCyALQR91IgtzIAtramogAygC4LECIAMoArSyAiILayIOIA5BH3UiDnMgDmtqIAMoAtyxAiADKAKwsgIiDmsiEiASQR91IhJzIBJraiADKALYsQIiEiADKAKssgJrIhMgE0EfdSITcyATa2pqaiADKALMsQIgAygCoLICIhNrIhQgFEEfdSIUcyAUa2ogAygCyLECIhQgAygCnLICayIWIBZBH3UiFnMgFmtqQeQASWpBBkcEQCAMQgA3AnwgDEIANwKEAQwBCyAMQQA2AnwgDCAAIAFqIAMoAtyxAiAOayIAIABBH3UiAHMgAGtqIBIgAygCrLICayIAIABBH3UiAHMgAGtqIAMoAsyxAiATayIAIABBH3UiAHMgAGtqIBQgAygCnLICayIAIABBH3UiAHMgAGtqQQpJIAMoAoCzAiADKALUswJrIgAgAEEfdSIAcyAAayADKAKEswIgAygC2LMCayIAIABBH3UiAHMgAGtqIAMoAvyyAiADKALQswJrIgAgAEEfdSIAcyAAa2ogAygC+LICIAMoAsyzAmsiACAAQR91IgBzIABraiADKAL0sgIgAygCyLMCayIAIABBH3UiAHMgAGtqIAMoAvCyAiADKALEswJrIgAgAEEfdSIAcyAAa2pBCklxNgJ8IAxBADYCgAEgDCADKALwsQIgCmsiACAAQR91IgBzIABrIARqIAMoAuyxAiADKALAsgJrIgAgAEEfdSIAcyAAa2ogByADKAK8sgJrIgAgAEEfdSIAcyAAa2ogAygC4LECIAtrIgAgAEEfdSIAcyAAa2pBCkkgAygClLMCIAMoAuizAmsiACAAQR91IgBzIABrIAMoApizAiADKALsswJrIgAgAEEfdSIAcyAAa2ogAygCkLMCIAMoAuSzAmsiACAAQR91IgBzIABraiADKAKMswIgAygC4LMCayIAIABBH3UiAHMgAGtqIAMoAoizAiADKALcswJrIgAgAEEfdSIAcyAAa2pBCklxNgKAASAMQQA2AoQBIAwgAygCgLICIAMoAtSyAmsiACAAQR91IgBzIABrIAMoAoSyAiAFayIAIABBH3UiAHMgAGtqIAMoAvyxAiADKALQsgJrIgAgAEEfdSIAcyAAa2ogBiADKALMsgJrIgAgAEEfdSIAcyAAa2ogAygC9LECIAhrIgAgAEEfdSIAcyAAa2pBCkkgAygCqLMCIAMoAvyzAmsiACAAQR91IgBzIABrIAMoAqyzAiADKAKAtAJrIgAgAEEfdSIAcyAAa2ogAygCpLMCIAMoAvizAmsiACAAQR91IgBzIABraiADKAKgswIgAygC9LMCayIAIABBH3UiAHMgAGtqIAMoApyzAiADKALwswJrIgAgAEEfdSIAcyAAa2pBCklxNgKEASAMQQA2AogBIAwgAygClLICIAMoAuiyAmsiACAAQR91IgBzIABrIAMoApiyAiADKALssgJrIgAgAEEfdSIAcyAAa2ogAygCkLICIAMoAuSyAmsiACAAQR91IgBzIABraiADKAKMsgIgAygC4LICayIAIABBH3UiAHMgAGtqIAMoAoiyAiADKALcsgJrIgAgAEEfdSIAcyAAa2pBCkkgAygCvLMCIAMoApC0AmsiACAAQR91IgBzIABrIAMoAsCzAiADKAKUtAJrIgAgAEEfdSIAcyAAa2ogAygCuLMCIAMoAoy0AmsiACAAQR91IgBzIABraiADKAK0swIgAygCiLQCayIAIABBH3UiAHMgAGtqIAMoArCzAiADKAKEtAJrIgAgAEEfdSIAcyAAa2pBCklxNgKIAQtB/x8gAygCkAQgAygCAG0iBCAEQf8fThshACADKAK0jQIiBQRAQQAhAUH/HyAAISMgAygCsI0CIgYgBUEDdEF2bWoiBSEiAn8gDCANQQN0akGQEWorAwBEzczMzMzMCECiIAS3oSJImUQAAAAAAADgQWMEQCBIqgwBC0GAgICAeAsiBEHlAE4EQCAGQQZsQQptIgEgBCABIARIGyEBCyAjICIgASABIAVIG2oiACAAQf8fThshAAsgGSANQbABbGogEEHYAGxqQdgAEAcgAyANQbgCbGogEEGcAWxqQZgMakGcARAHIAlCADcCCCAJQgA3AgAgEUIANwKsASARQQA2AqQBIBFCADcCnAEgEUIA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BQAHAAEABgABAAEAAAABAwYHAwMGBwYGBwgHBgcIBwADAAUAAQAGAAIAAwACAAUABAAEAAEAAwADAAIAAAADAwUHAwIEBQQEBQYGBQYHAQACAAoAEwAQAAoAAwADAAcACgAFAAMACwAEAA0AEQAIAAQADAALABIADwALAAIABwAGAAkADgADAAEABgAEAAUAAwACAEGACgskAQMGCAgJAwQGBwcIBgUHCAgJBwcICQkJBwcICQkKCAgJCgoKAEGwCgtFAwAEAAYAEgAMAAUABQABAAIAEAAJAAMABwADAAUADgAHAAMAEwARAA8ADQAKAAQADQAFAAgACwAFAAEADAAEAAQAAQABAEGACwskAgMGCAgJAwIECAgIBgQGCAgJCAgICQkKCAcICQoKCQgJCQsLAEGwCwtFBwAFAAkADgAPAAcABgAEAAUABQAGAAcABwAGAAgACAAIAAUADwAGAAkACgAFAAEACwAHAAkABgAEAAEADgAEAAYAAgAGAEGADAskAwMFBggJAwMEBQYIBAQFBgcIBgUGBwcIBwYHBwgJCAcICAkJAEGwDAugHQEAAgAKABcAIwAeAAwAEQADAAMACAAMABIAFQAMAAcACwAJAA8AFQAgACgAEwAGAA4ADQAWACIALgAXABIABwAUABMAIQAvABsAFgAJAAMAHwAWACkAGgAVABQABQADAA4ADQAKAAsAEAAGAAUAAQAJAAgABwAIAAQABAACAAAAAQMGCAkJCQoDBAYHCAkICAYGBwgJCgkJBwcICQoKCQoICAkKCgoKCgkJCgoLCwoLCAgJCgoKCwsJCAkKCgsLCwMABAAKABgAIgAhABUADwAFAAMABAAKACAAEQALAAoACwAHAA0AEgAeAB8AFAAFABkACwATADsAGwASAAwABQAjACEAHwA6AB4AEAAHAAUAHAAaACAAEwARAA8ACAAOAA4ADAAJAA0ADgAJAAQAAQALAAQABgAGAAYAAwACAAAAAgMFBwgJCAkDAwQGCAgHCAUFBgcICQgIBwYHCQgKCAkICAgJCQoJCggICQoKCwoLCAcHCAkKCgoIBwgJCgoKCgkABgAQACEAKQAnACYAGgAHAAUABgAJABcAEAAaAAsAEQAHAAsADgAVAB4ACgAHABEACgAPAAwAEgAcAA4ABQAgAA0AFgATABIAEAAJAAUAKAARAB8AHQARAA0ABAACABsADAALAA8ACgAHAAQAAQAbAAwACAAMAAYAAwABAAAABAMFBwgJCQkDAwQFBwcICAUEBQYHCAcIBgUGBgcICAgHBgcHCAgICQgHCAgICQgJCAcHCAgJCQoJCAgJCQkJCgEABQAOABUAIgAzAC4ARwAqADQARAA0AEMALAArABMAAwAEAAwAEwAfABoALAAhAB8AGAAgABgAHwAjABYADgAPAA0AFwAkADsAMQBNAEEAHQAoAB4AKAAbACEAKgAQABYAFAAlAD0AOABPAEkAQAArAEwAOAAlABoAHwAZAA4AIwAQADwAOQBhAEsAcgBbADYASQA3ACkAMAA1ABcAGAA6ABsAMgBgAEwARgBdAFQATQA6AE8AHQBKADEAKQARAC8ALQBOAEoAcwBeAFoATwBFAFMARwAyADsAJgAkAA8ASAAiADgAXwBcAFUAWwBaAFYASQBNAEEAMwAsACsAKgArABQAHgAsADcATgBIAFcATgA9AC4ANgAlAB4AFAAQADUAGQApACUALAA7ADYAUQBCAEwAOQA2ACUAEgAnAAsAIwAhAB8AOQAqAFIASABQAC8AOgA3ABUAFgAaACYAFgA1ABkAFwAmAEYAPAAzACQANwAaACIAFwAbAA4ACQAHACIAIAAcACcAMQBLAB4ANAAwACgANAAcABIAEQAJAAUALQAVACIAQAA4ADIAMQAtAB8AEwAMAA8ACgAHAAYAAwAwABcAFAAnACQAIwA1ABUAEAAXAA0ACgAGAAEABAACABAADwARABsAGQAUAB0ACwARAAwAEAAIAAEAAQAAAAEAAQQGBwgJCQoJCgsLDAwNDQMEBgcICAkJCQkKCgsMDAwGBgcICQkKCgkKCgsLDA0NBwcICQkKCgoKCwsLCwwNDQgHCQkKCgsLCgsLDAwNDQ4JCAkKCgoLCwsLDAsNDQ4OCQkKCgsLCwsLDAwMDQ0ODgoJCgsLCwwMDAwNDQ0OEBAJCAkKCgsLDAwMDA0NDg8PCgkKCgsLCw0MDQ0ODg4QDwoKCgsLDAwNDA0ODQ4PEBELCgoLDAwMDA0NDQ4PDw8QCwsLDAwNDA0ODg8PDxAQEAwLDA0NDQ4ODg4ODxAPEBANDAwNDQ0PDg4RDw8PERAQDAwNDg4ODw4PDxAQExITEAcADAASADUALwBMAHwAbABZAHsAbAB3AGsAUQB6AD8ADQAFABAAGwAuACQAPQAzACoARgA0AFMAQQApADsAJAATABEADwAYACkAIgA7ADAAKABAADIATgA+AFAAOAAhAB0AHAAZACsAJwA/ADcAXQBMADsAXQBIADYASwAyAB0ANAAWACoAKABDADkAXwBPAEgAOQBZAEUAMQBCAC4AGwBNACUAIwBCADoANABbAEoAPgAwAE8APwBaAD4AKAAmAH0AIAA8ADgAMgBcAE4AQQA3AFcARwAzAEkAMwBGAB4AbQA1ADEAXgBYAEsAQgB6AFsASQA4ACoAQAAsABUAGQBaACsAKQBNAEkAPwA4AFwATQBCAC8AQwAwADUAJAAUAEcAIgBDADwAOgAxAFgATABDAGoARwA2ACYAJwAXAA8AbQA1ADMALwBaAFIAOgA5ADAASAA5ACkAFwAbAD4ACQBWACoAKAAlAEYAQAA0ACsARgA3ACoAGQAdABIACwALAHYARAAeADcAMgAuAEoAQQAxACcAGAAQABYADQAOAAcAWwAsACcAJgAiAD8ANAAtAB8ANAAcABMADgAIAAkAAwB7ADwAOgA1AC8AKwAgABYAJQAYABEADAAPAAoAAgABAEcAJQAiAB4AHAAUABEAGgAVABAACgAGAAgABgACAAAAAwQFBwcICQkJCgoLCwsMDQQDBQYHBwgICAkJCgoKCwsFBQUGBwcICAgJCQoKCwsLBgYGBwcICAkJCQoKCgsLCwcGBwcICAkJCQkKCgoLCwsIBwcICAgJCQkJCgoLCwsMCQcICAgJCQkJCgoKCwsMDAkICAkJCQkKCgoKCgsLCwwJCAgJCQkJCgoKCgsLDAwMCQgJCQkJCgoKCwsLCwwMDAoJCQkKCgoKCgsLCwsMDQwKCQkJCgoKCgsLCwsMDAwNCwoJCgoKCwsLCwsLDAwNDQsKCgoKCwsLCwwMDAwMDQ0MCwsLCwsLCwwMDAwNDQwNDAsLCwsLCwwMDAwMDQ0NDQEABQAOACwASgA/AG4AXQCsAJUAigDyAOEAwwB4AREAAwAEAAwAFAAjAD4ANQAvAFMASwBEAHcAyQBrAM8ACQAPAA0AFwAmAEMAOgBnAFoAoQBIAH8AdQBuANEAzgAQAC0AFQAnAEUAQAByAGMAVwCeAIwA/ADUAMcAgwFtARoASwAkAEQAQQBzAGUAswCkAJsACAH2AOIAiwF+AWoBCQBCAB4AOwA4AGYAuQCtAAkBjgD9AOgAkAGEAXoBvQEQAG8ANgA0AGQAuACyAKAAhQABAfQA5ADZAIEBbgHLAgoAYgAwAFsAWAClAJ0AlAAFAfgAlwGNAXQBfAF5A3QDCABVAFQAUQCfAJwAjwAEAfkAqwGRAYgBfwHXAskCxAIHAJoATABJAI0AgwAAAfUAqgGWAYoBgAHfAmcBxgJgAQsAiwCBAEMAfQD3AOkA5QDbAIkB5wLhAtACdQNyA7cBBADzAHgAdgBzAOMA3wCMAeoC5gLgAtECyALCAt8AtAEGAMoA4ADeANoA2ACFAYIBfQFsAXgDuwHDArgBtQHABgQA6wLTANIA0AByAXsB3gLTAsoCxwZzA20DbAODDWEDAgB5AXEBZgC7ANYC0gJmAccCxQJiA8YGZwOCDWYDsgEAAAwACgAHAAsACgARAAsACQANAAwACgAHAAUAAwABAAMAAQQGCAkJCgoLCwsMDAwNCQMEBgcICQkJCgoKCwwLDAgGBgcICQkKCgsKCwsLDAwJCAcICQkKCgoLCwwMDA0NCgkICQkKCgsLCwwMDA0NDQkJCAkJCgsLDAsMDA0NDQ4KCgkJCgsLCwsMDAwMDQ0OCgoJCgoLCwsMDA0NDQ0PDwoKCgoLCwsMDA0NDQ0ODg4KCwoKCwsMDA0NDQ0ODQ4NCwsLCgsMDAwMDQ4ODg8PDgoMCwsLDAwNDg4ODg4ODQ4LDAwMDAwNDQ0NDw4ODg4QCw4MDAwNDQ4ODhAPDw8RDwsNDQsMDg4NDg4PEA8RDw4LCQgICQkKCgoLCwsLCwsLCA8ADQAuAFAAkgAGAfgAsgGqAZ0CjQKJAm0CBQIIBFgADgAMABUAJgBHAIIAegDYANEAxgBHAVkBPwEpARcBKgAvABYAKQBKAEQAgAB4AN0AzwDCALYAVAE7AScBHQISAFEAJwBLAEYAhgB9AHQA3ADMAL4AsgBFATcBJQEPARAAkwBIAEUAhwB/AHYAcADSAMgAvABgAUMBMgEdARwCDgAHAUIAgQB+AHcAcgDWAMoAwAC0AFUBPQEtARkBBgEMAPkAewB5AHUAcQDXAM4AwwC5AFsBSgE0ASMBEAEIAgoAswFzAG8AbQDTAMsAxAC7AGEBTAE5ASoBGwETAn0BEQCrAdQA0ADNAMkAwQC6ALEAqQBAAS8BHgEMAQICeQEQAE8BxwDFAL8AvQC1AK4ATQFBATEBIQETAQkCewFzAQsAnAK4ALcAswCvAFgBSwE6ATABIgEVARICfwF1AW4BCgCMAloBqwCoAKQAPgE1ASsBHwEUAQcBAQJ3AXABagEGAIgCQgE8ATgBMwEuASQBHAENAQUBAAJ4AXIBbAFnAQQAbAIsASgBJgEgARoBEQEKAQMCfAF2AXEBbQFpAWUBAgAJBBgBFgESAQsBCAEDAX4BegF0AW8BawFoAWYBZAEAACsAFAATABEADwANAAsACQAHAAYABAAHAAUAAwABAAMABAQGBwgJCQoKCwsLCwsMCQQEBQYHCAgJCQkKCgoKCggGBQYHBwgICQkJCQoKCgsHBwYHBwgICAkJCQkKCgoKBwgHBwgICAgJCQkKCgoKCwcJBwgICAgJCQkJCgoKCgoHCQgICAgJCQkJCgoKCgoLBwoICAgJCQkJCgoKCgoLCwgKCQkJCQkJCQkKCgoKCwsICgkJCQkJCQoKCgoKCwsLCAsJCQkJCgoKCgoKCwsLCwgLCgkJCQoKCgoKCgsLCwsICwoKCgoKCgoKCgsLCwsLCAsKCgoKCgoKCwsLCwsLCwgMCgoKCgoKCwsLCwsLCwsICAcHBwcHBwcHBwcICAgIBAEABQAEAAUABgAFAAQABAAHAAMABgAAAAcAAgADAAEAAQQEBQQGBQYEBQUGBQYGBg8ADgANAAwACwAKAAkACAAHAAYABQAEAAMAAgABAAAABAQEBAQEBAQEBAQEBAQEBABB6CkLBQIAAAACAEH5KQsMBAAACAQAAAMAAAADAEGQKgsNEAQAACIEAAADAAAAAwBBqCoLBjAEAABCBABByCoLBQQAAAAEAEHYKgsNUAQAAHAEAAAEAAAABABB8CoLDYAEAACgBAAABgAAAAYAQYgrCw2wBAAAAAUAAAYAAAAGAEGgKwsNMAUAAIAFAAAGAAAABgBBuCsLDbAFAAAABgAACAAAAAgAQdArCw0wBgAAsAYAAAgAAAAIAEHoKwsN8AYAAHAHAAAIAAAACABBgCwLDbAHAAAwCAAAEAAAABAAQZgsCwZwCAAAcAoAQbgsCwUQAAAAEABByCwLjQNwCwAAcA0AABAAAAAQAAAAAQAAAAEAAABwDgAAcBAAABAAAAAQAAAAAgAAAAMAAABwDgAAcBAAABAAAAAQAAAAAwAAAAcAAABwDgAAcBAAABAAAAAQAAAABAAAAA8AAABwDgAAcBAAABAAAAAQAAAABgAAAD8AAABwDgAAcBAAABAAAAAQAAAACAAAAP8AAABwDgAAcBAAABAAAAAQAAAACgAAAP8DAABwDgAAcBAAABAAAAAQAAAADQAAAP8fAABwDgAAcBAAABAAAAAQAAAABAAAAA8AAABwEQAAcBMAABAAAAAQAAAABQAAAB8AAABwEQAAcBMAABAAAAAQAAAABgAAAD8AAABwEQAAcBMAABAAAAAQAAAABwAAAH8AAABwEQAAcBMAABAAAAAQAAAACAAAAP8AAABwEQAAcBMAABAAAAAQAAAACQAAAP8BAABwEQAAcBMAABAAAAAQAAAACwAAAP8HAABwEQAAcBMAABAAAAAQAAAADQAAAP8fAABwEQAAcBMAAAEAAAAQAEHgLwsNcBQAAJAUAAABAAAAEABB+C8LBqAUAADAFABBrDALiQEBAAAAAQAAAAEAAAABAAAAAQAAAAEAAAACAAAAAgAAAAIAAAACAAAAAwAAAAIAAAADAAAAAwAAAAQAAAADAAAABAAAAAMAAAAEAAAABAAAAAUAAAAEAAAABQAAAAQAAAAGAAAABQAAAAYAAAAFAAAABgAAAAUAAAAHAAAABgAAAAcAAAAGAAAABwBBwDELDQEAAAD/////AQAAAAIAQeAxC5IBAwAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAMAAAADAAAAAwAAAAQAAAAEAAAAAAAAAAEAAAACAAAAAwAAAAAAAAABAAAAAgAAAAMAAAABAAAAAgAAAAMAAAABAAAAAgAAAAMAAAACAAAAAwAAAESsAACAuwAAAH0AACJWAADAXQAAgD4AABErAADgLgAAQB8AQYAzC7oI/////////////////////wgAAAD/////CAAAACAAAAAQAAAA/////xAAAAAoAAAAGAAAAP////8YAAAAMAAAACAAAAD/////IAAAADgAAAAoAAAA/////ygAAABAAAAAMAAAAP////8wAAAAUAAAADgAAAD/////OAAAAGAAAABAAAAA/////0AAAABwAAAA//////////9QAAAAgAAAAP//////////YAAAAKAAAAD//////////3AAAADAAAAA//////////+AAAAA4AAAAP//////////kAAAAAABAAD//////////6AAAABAAQAA/////////////////////wAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAeAAAAJAAAACwAAAA0AAAAPgAAAEoAAABaAAAAbgAAAIYAAACiAAAAxAAAAO4AAAAgAQAAVgEAAKIBAABAAgAAAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAAB4AAAAkAAAAKgAAADIAAAA8AAAASAAAAFgAAABqAAAAgAAAAJwAAAC+AAAA5gAAABQBAABKAQAAgAEAAEACAAAAAAAABAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHgAAACQAAAAsAAAANgAAAEIAAABSAAAAZgAAAH4AAACcAAAAwgAAAPAAAAAoAQAAbAEAAMABAAAmAgAAQAIAAAAAAAAGAAAADAAAABIAAAAYAAAAHgAAACQAAAAsAAAANgAAAEIAAABQAAAAYAAAAHQAAACMAAAAqAAAAMgAAADuAAAAHAEAAFABAACMAQAA0AEAAAoCAABAAgAAAAAAAAYAAAAMAAAAEgAAABgAAAAeAAAAJAAAACwAAAA2AAAAQgAAAFAAAABgAAAAcgAAAIgAAACiAAAAwgAAAOgAAAAWAQAASgEAAIoBAADQAQAAHAIAAEACAAAAAAAABgAAAAwAAAASAAAAGAAAAB4AAAAkAAAALAAAAC0AAABCAAAAUAAAAGAAAAB0AAAAjAAAAKgAAADIAAAA7gAAAPgAAABQAQAAjAEAANABAAAKAgAAQAIAAAAAAAAGAAAADAAAABIAAAAYAAAAHgAAACQAAAAsAAAANgAAAEIAAABQAAAAYAAAAHQAAACMAAAAqAAAAMgAAADuAAAAHAEAAFABAACMAQAA0AEAAAoCAABAAgAAAAAAAAYAAAAMAAAAEgAAABgAAAAeAAAAJAAAACwAAAA2AAAAQgAAAFAAAABgAAAAdAAAAIwAAACoAAAAyAAAAO4AAAAcAQAAUAEAAIwBAADQAQAACgIAAEACAAAAAAAADAAAABgAAAAkAAAAMAAAADwAAABIAAAAWAAAAGwAAACEAAAAoAAAAMAAAADoAAAAGAEAAFABAACQAQAA3AEAADYCAAA4AgAAOgIAADwCAAA+AgAAQAIAQdw7C8oPnff//533//+d9///nff//533//+d9///Ou///zrv//86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";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}var binary=tryParseAsDataURI(file);if(binary){return binary}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["c"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["o"];addOnInit(Module["asm"]["d"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];case"*":return HEAPU32[ptr>>2];default:abort("invalid type for getValue: "+type)}return null}function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){if(ASSERTIONS){assert(false,"Character code "+chr+" ("+String.fromCharCode(chr)+") at offset "+i+" not in 0x00-0xFF.")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;case"*":HEAPU32[ptr>>2]=value;break;default:abort("invalid type for setValue: "+type)}}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function abortOnCannotGrowMemory(requestedSize){abort("OOM")}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;abortOnCannotGrowMemory(requestedSize)}var ASSERTIONS=false;var decodeBase64=typeof atob=="function"?atob:function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i<input.length);return output};function intArrayFromBase64(s){if(typeof ENVIRONMENT_IS_NODE=="boolean"&&ENVIRONMENT_IS_NODE){var buf=Buffer.from(s,"base64");return new Uint8Array(buf["buffer"],buf["byteOffset"],buf["byteLength"])}try{var decoded=decodeBase64(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}catch(_){throw new Error("Converting base64 string to bytes failed.")}}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}var asmLibraryArg={"b":_emscripten_memcpy_big,"a":_emscripten_resize_heap};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["d"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["e"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["f"]).apply(null,arguments)};var _shine_check_config=Module["_shine_check_config"]=function(){return(_shine_check_config=Module["_shine_check_config"]=Module["asm"]["g"]).apply(null,arguments)};var _shine_samples_per_pass=Module["_shine_samples_per_pass"]=function(){return(_shine_samples_per_pass=Module["_shine_samples_per_pass"]=Module["asm"]["h"]).apply(null,arguments)};var _shine_encode_buffer=Module["_shine_encode_buffer"]=function(){return(_shine_encode_buffer=Module["_shine_encode_buffer"]=Module["asm"]["i"]).apply(null,arguments)};var _shine_flush=Module["_shine_flush"]=function(){return(_shine_flush=Module["_shine_flush"]=Module["asm"]["j"]).apply(null,arguments)};var _shine_close=Module["_shine_close"]=function(){return(_shine_close=Module["_shine_close"]=Module["asm"]["k"]).apply(null,arguments)};var _shine_js_int16_len=Module["_shine_js_int16_len"]=function(){return(_shine_js_int16_len=Module["_shine_js_int16_len"]=Module["asm"]["l"]).apply(null,arguments)};var _shine_js_ptr_len=Module["_shine_js_ptr_len"]=function(){return(_shine_js_ptr_len=Module["_shine_js_ptr_len"]=Module["asm"]["m"]).apply(null,arguments)};var _shine_js_init=Module["_shine_js_init"]=function(){return(_shine_js_init=Module["_shine_js_init"]=Module["asm"]["n"]).apply(null,arguments)};Module["setValue"]=setValue;Module["getValue"]=getValue;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();var ShineModule;var int16Len;var ptrLen;function shineInit(){int16Len=ShineModule._shine_js_int16_len();ptrLen=ShineModule._shine_js_ptr_len()}function Shine(args){if(ShineModule._shine_check_config(args.samplerate,args.bitrate)<0)throw"Invalid configuration";var stereoMode;if(!args.stereoMode){if(args.channels===1){stereoMode=Shine.MONO}else{stereoMode=Shine.JOINT_STEREO}}else{stereoMode=args.stereoMode}this._handle=ShineModule._shine_js_init(args.channels,args.samplerate,stereoMode,args.bitrate);this._channels=args.channels;this._samples_per_pass=ShineModule._shine_samples_per_pass(this._handle);this._buffer=ShineModule._malloc(this._channels*ptrLen);this._pcm=new Array(this._channels);this._rem=new Array(this._channels);this._written=ShineModule._malloc(int16Len);var _tmp,chan;for(chan=0;chan<this._channels;chan++){this._rem[chan]=new Int16Array;_tmp=ShineModule._malloc(this._samples_per_pass*int16Len);ShineModule.setValue(this._buffer+chan*ptrLen,_tmp,"*");this._pcm[chan]=ShineModule.HEAP16.subarray(_tmp/int16Len,_tmp/int16Len+this._samples_per_pass)}return this}Shine.checkConfig=function(samplerate,bitrate){return ShineModule._shine_check_config(samplerate,bitrate)>=0};Shine.prototype._encodePass=function(data){if(!this._handle)throw"Closed";var chan;for(chan=0;chan<this._channels;chan++)this._pcm[chan].set(data[chan]);var _buf=ShineModule._shine_encode_buffer(this._handle,this._buffer,this._written);var written=ShineModule.getValue(this._written,"i16");return ShineModule.HEAPU8.subarray(_buf,_buf+written)};function concat(ctr,a,b){if(typeof b==="undefined"){return a}var ret=new ctr(a.length+b.length);ret.set(a);ret.subarray(a.length).set(b);return ret}function clip(x){return x>1?1:x<-1?-1:x}function convertFloat32(buf){var ret=new Array(buf.length);var samples=buf[0].length;var chan,i;for(chan=0;chan<buf.length;chan++){ret[chan]=new Int16Array(samples);for(i=0;i<samples;i++){ret[chan][i]=parseInt(clip(buf[chan][i])*32767)}}return ret}Shine.prototype.encode=function(data){if(data.length!=this._channels)throw"Invalid data";var encoded=new Uint8Array;var tmp=new Array(this._channels);if(data[0]instanceof Float32Array){data=convertFloat32(data)}var chan;for(chan=0;chan<this._channels;chan++){tmp[chan]=new Float32Array;this._rem[chan]=concat(Int16Array,this._rem[chan],data[chan])}var i,enc;for(i=0;i<this._rem[0].length;i+=this._samples_per_pass){for(chan=0;chan<this._channels;chan++){tmp[chan]=this._rem[chan].subarray(i,i+this._samples_per_pass)}if(tmp[0].length<this._samples_per_pass){break}else{enc=this._encodePass(tmp);if(enc.length>0){encoded=concat(Uint8Array,encoded,enc)}}}if(tmp[0].length<this._samples_per_pass){this._rem=tmp}else{for(chan=0;chan<this._channels;chan++){this._rem[chan]=new Int16Array}}return encoded};Shine.prototype.close=function(){if(!this._handle){throw"Closed"}var _buf=ShineModule._shine_flush(this._handle,this._written);var written=ShineModule.getValue(this._written,"i16");var encoded=new Uint8Array(written);encoded.set(ShineModule.HEAPU8.subarray(_buf,_buf+written));ShineModule._free(this._written);ShineModule._shine_close(this._handle);this._handle=null;var chan;for(chan=0;chan<this._channels;chan++){ShineModule._free(ShineModule.getValue(this._buffer+chan*ptrLen,"*"))}ShineModule._free(this._buffer);return encoded};Shine.initialized=new Promise(function(resolve){Module["onRuntimeInitialized"]=function(){ShineModule=Module;shineInit();resolve()}});Module["Shine"]=Shine;Module["StereoMode"]={0:"STEREO",1:"JOINT_STEREO",2:"DUAL_CHANNEL",3:"MONO",STEREO:0,JOINT_STEREO:1,DUAL_CHANNEL:2,MONO:3};
-diff --git a/js/libshine.d.ts b/js/libshine.d.ts
-new file mode 100644
-index 0000000..8f00edc
---- /dev/null
-+++ b/js/libshine.d.ts
-@@ -0,0 +1,19 @@
-+export type Data = Int16Array | Float32Array;
-+export declare enum StereoMode {
-+ STEREO = 0,
-+ JOINT_STEREO = 1,
-+ DUAL_CHANNEL = 2,
-+ MONO = 3
-+}
-+export class Shine {
-+ static initialized: Promise<void>;
-+ static checkConfig(samplerate: number, bitrate: number): boolean;
-+ constructor(args: {
-+ samplerate: number;
-+ bitrate: number;
-+ channels: number;
-+ stereoMode?: StereoMode;
-+ });
-+ encode(data: Data[]): Uint8Array;
-+ close(): Uint8Array;
-+}
-diff --git a/js/package-lock.json b/js/package-lock.json
-new file mode 100644
-index 0000000..38b374d
---- /dev/null
-+++ b/js/package-lock.json
-@@ -0,0 +1,18 @@
-+{
-+ "name": "@toots/shine.js",
-+ "version": "1.0.1",
-+ "lockfileVersion": 3,
-+ "requires": true,
-+ "packages": {
-+ "": {
-+ "name": "@toots/shine.js",
-+ "version": "1.0.1",
-+ "license": "LGPL-2.0-only"
-+ },
-+ "stubs": {
-+ "version": "1.0.0",
-+ "extraneous": true,
-+ "license": "ISC"
-+ }
-+ }
-+}
-diff --git a/js/package.json b/js/package.json
-new file mode 100644
-index 0000000..0c83619
---- /dev/null
-+++ b/js/package.json
-@@ -0,0 +1,24 @@
-+{
-+ "name": "@toots/shine.js",
-+ "version": "1.0.3",
-+ "description": "Shine fixed-point mp3 encoder",
-+ "main": "dist/libshine_node.js",
-+ "browser": "dist/libshine_browser.js",
-+ "types": "libshine.d.ts",
-+ "repository": {
-+ "type": "git",
-+ "url": "git+https://github.com/toots/shine.git"
-+ },
-+ "keywords": [
-+ "mp3",
-+ "encoder",
-+ "wasm",
-+ "fixed-point"
-+ ],
-+ "author": "Romain Beauxis <toots@rastageeks.org>",
-+ "license": "LGPL-2.0-only",
-+ "bugs": {
-+ "url": "https://github.com/toots/shine/issues"
-+ },
-+ "homepage": "https://github.com/toots/shine#readme"
-+}
-diff --git a/js/src/libshine_browser_wrapper.js b/js/src/libshine_browser_wrapper.js
-new file mode 100644
-index 0000000..f0ef04e
---- /dev/null
-+++ b/js/src/libshine_browser_wrapper.js
-@@ -0,0 +1,10 @@
-+var createModule = require("./libshine_browser_stubs").default;
-+
-+Shine.initialized = (createModule()).then(function (Module) {
-+ ShineModule = Module;
-+ shineInit();
-+});
-+
-+module.exports.Shine = Shine;
-+
-+module.exports.StereoMode = StereoMode;
-diff --git a/js/src/post.js b/js/src/libshine_class.js
-similarity index 57%
-rename from js/src/post.js
-rename to js/src/libshine_class.js
-index f6a07e6..5d88d9e 100644
---- a/js/src/post.js
-+++ b/js/src/libshine_class.js
-@@ -1,50 +1,64 @@
- // libshine function wrappers
-
--var isNode = typeof process === "object" && typeof require === "function";
-+var StereoMode = {
-+ '0': 'STEREO',
-+ '1': 'JOINT_STEREO',
-+ '2': 'DUAL_CHANNEL',
-+ '3': 'MONO',
-+ STEREO: 0,
-+ JOINT_STEREO: 1,
-+ DUAL_CHANNEL: 2,
-+ MONO: 3
-+};
-+
-+var ShineModule;
-+var int16Len;
-+var ptrLen;
-
--var int16Len = Module.HEAP16.BYTES_PER_ELEMENT;
--var ptrLen = Module.HEAP32.BYTES_PER_ELEMENT;
-+function shineInit() {
-+ int16Len = ShineModule._shine_js_int16_len();
-+ ptrLen = ShineModule._shine_js_ptr_len();
-+};
-
- function Shine(args) {
-- if (_shine_check_config(args.samplerate, args.bitrate) < 0)
-+ if (ShineModule._shine_check_config(args.samplerate, args.bitrate) < 0)
- throw "Invalid configuration";
-
-- var mode;
-- if (!args.mode) {
-+ var stereoMode;
-+ if (!args.stereoMode) {
- if (args.channels === 1) {
-- mode = Shine.MONO;
-+ stereoMode = Shine.MONO;
- } else {
-- mode = Shine.JOINT_STEREO;
-+ stereoMode = Shine.JOINT_STEREO;
- }
- } else {
-- mode = args.mode;
-+ stereoMode = args.stereoMode;
- }
-
-- this._handle = _shine_js_init(args.channels, args.samplerate, mode, args.bitrate);
-+ this._handle = ShineModule._shine_js_init(args.channels, args.samplerate, stereoMode, args.bitrate);
-
- this._channels = args.channels;
-- this._samples_per_pass = _shine_samples_per_pass(this._handle);
-+ this._samples_per_pass = ShineModule._shine_samples_per_pass(this._handle);
-
-- this._buffer = _malloc(this._channels * ptrLen);
-+ this._buffer = ShineModule._malloc(this._channels * ptrLen);
- this._pcm = new Array(this._channels);
- this._rem = new Array(this._channels);
-- this._written = _malloc(int16Len);
-+ this._written = ShineModule._malloc(int16Len);
-
- var _tmp, chan;
- for (chan=0; chan<this._channels; chan++) {
- this._rem[chan] = new Int16Array;
-- _tmp = _malloc(this._samples_per_pass * int16Len);
-- setValue(this._buffer + chan*ptrLen, _tmp, "*")
-- this._pcm[chan] = Module.HEAP16.subarray(_tmp/int16Len, _tmp/int16Len+this._samples_per_pass)
-+ _tmp = ShineModule._malloc(this._samples_per_pass * int16Len);
-+ ShineModule.setValue(this._buffer + chan*ptrLen, _tmp, "*")
-+ this._pcm[chan] = ShineModule.HEAP16.subarray(_tmp/int16Len, _tmp/int16Len+this._samples_per_pass)
- }
-
- return this;
- };
-
--Shine.STEREO = 0;
--Shine.JOINT_STEREO = 1;
--Shine.DUAL_CHANNEL = 2;
--Shine.MONO = 3;
-+Shine.checkConfig = function (samplerate, bitrate) {
-+ return ShineModule._shine_check_config(samplerate, bitrate) >= 0;
-+};
-
- Shine.prototype._encodePass = function (data) {
- if (!this._handle)
-@@ -54,11 +68,11 @@ Shine.prototype._encodePass = function (data) {
- for (chan=0;chan<this._channels;chan++)
- this._pcm[chan].set(data[chan]);
-
-- var _buf = _shine_encode_buffer(this._handle, this._buffer, this._written);
-+ var _buf = ShineModule._shine_encode_buffer(this._handle, this._buffer, this._written);
-
-- var written = getValue(this._written, "i16");
-+ var written = ShineModule.getValue(this._written, "i16");
-
-- return Module.HEAPU8.subarray(_buf, _buf+written);
-+ return ShineModule.HEAPU8.subarray(_buf, _buf+written);
- };
-
- function concat(ctr, a, b) {
-@@ -138,30 +152,22 @@ Shine.prototype.close = function () {
- throw "Closed";
- }
-
-- var _buf = _shine_flush(this._handle, this._written);
-+ var _buf = ShineModule._shine_flush(this._handle, this._written);
-
-- var written = getValue(this._written, "i16");
-+ var written = ShineModule.getValue(this._written, "i16");
- var encoded = new Uint8Array(written);
-
-- encoded.set(Module.HEAPU8.subarray(_buf, _buf + written));
-+ encoded.set(ShineModule.HEAPU8.subarray(_buf, _buf + written));
-
-- _free(this._written);
-- _shine_close(this._handle);
-+ ShineModule._free(this._written);
-+ ShineModule._shine_close(this._handle);
- this._handle = null;
-
- var chan;
- for (chan=0; chan<this._channels; chan++) {
-- _free(getValue(this._buffer + chan*ptrLen, "*"));
-+ ShineModule._free(ShineModule.getValue(this._buffer + chan*ptrLen, "*"));
- }
-- _free(this._buffer);
-+ ShineModule._free(this._buffer);
-
- return encoded;
- };
--
--if (isNode) {
-- module.exports = Shine;
--}
--
--return Shine;
--
--}).call(context)})();
-diff --git a/js/src/libshine_node_wrapper.js b/js/src/libshine_node_wrapper.js
-new file mode 100644
-index 0000000..aaaf28c
---- /dev/null
-+++ b/js/src/libshine_node_wrapper.js
-@@ -0,0 +1,10 @@
-+Shine.initialized = new Promise(function (resolve) {
-+ Module['onRuntimeInitialized'] = function () {
-+ ShineModule = Module;
-+ shineInit();
-+ resolve();
-+ }
-+})
-+
-+Module["Shine"] = Shine;
-+Module["StereoMode"] = StereoMode;
-diff --git a/js/src/pre.js b/js/src/pre.js
-deleted file mode 100644
-index 8078b87..0000000
---- a/js/src/pre.js
-+++ /dev/null
-@@ -1,9 +0,0 @@
--// libshine.js - port of libshine to JavaScript using emscripten
--// by Romain Beauxis <toots@rastageeks.org> from code by
--// Andreas Krennmair <ak@synflood.at>
--
--
--var Shine = (function() {
-- var Module;
-- var context = {};
-- return (function() {
-diff --git a/js/src/wrapper.c b/js/src/wrapper.c
-index 506570d..375b35c 100644
---- a/js/src/wrapper.c
-+++ b/js/src/wrapper.c
-@@ -1,7 +1,16 @@
-+#include "layer3.h"
-+#include "types.h"
- #include <stdlib.h>
- #include <string.h>
--#include "types.h"
--#include "layer3.h"
-+#include <stdint.h>
-+
-+size_t shine_js_int16_len() {
-+ return sizeof(int16_t);
-+}
-+
-+size_t shine_js_ptr_len() {
-+ return sizeof(void*);
-+}
-
- shine_t shine_js_init(int channels, int samplerate, int mode, int bitr) {
- shine_config_t config;
-@@ -13,4 +22,4 @@ shine_t shine_js_init(int channels, int samplerate, int mode, int bitr) {
- config.mpeg.bitr = bitr;
-
- return shine_initialise(&config);
--}
-+}
-diff --git a/js/test/browser/Makefile b/js/test/browser/Makefile
-index b3eedc8..befc1ce 100644
---- a/js/test/browser/Makefile
-+++ b/js/test/browser/Makefile
-@@ -1,2 +1,2 @@
- all:
-- python -m SimpleHTTPServer
-+ python -m http.server
-diff --git a/js/test/browser/encode.js b/js/test/browser/encode.js
-index 65e009d..af17116 100644
---- a/js/test/browser/encode.js
-+++ b/js/test/browser/encode.js
-@@ -4,24 +4,22 @@ function runEncodeTest(log, callback) {
- var samplerate = 44100;
- var channels = 2;
- var bitrate = 128;
-- var mode = Shine.STEREO;
-
- var shine = new Shine({
- samplerate: samplerate,
- channels: channels,
- bitrate: bitrate,
-- mode: mode
- });
-
-- var started = new Date;
-+ var started = new Date();
- var duration = 0.0;
- var encoded = [];
-
- var xhr = new XMLHttpRequest();
- xhr.open("GET", "encode.wav", true);
- xhr.responseType = "arraybuffer";
-- xhr.onload = function() {
-- var samples = xhr.response.byteLength / (2*channels);
-+ xhr.onload = function () {
-+ var samples = xhr.response.byteLength / (2 * channels);
- var data = new Int16Array(xhr.response);
- var buf = convertInterleavedBuffer(data, channels, samples);
- duration += parseFloat(samples) / samplerate;
-@@ -33,12 +31,12 @@ function runEncodeTest(log, callback) {
- xhr.addEventListener("load", function () {
- encoded.push(shine.close());
-
-- var ended = new Date
-- var encodingTime = (ended.getTime() - started.getTime())/1000
-+ var ended = new Date();
-+ var encodingTime = (ended.getTime() - started.getTime()) / 1000;
- log("Done encoding.");
- log("File duration: " + duration.toFixed(2) + " seconds");
- log("Encoding time: " + encodingTime.toFixed(2) + " seconds");
-- log("Encoding rate: " + (duration/encodingTime).toFixed(2) + "X");
-+ log("Encoding rate: " + (duration / encodingTime).toFixed(2) + "X");
- callback(new Blob(encoded));
- });
-
-@@ -48,10 +46,10 @@ function runEncodeTest(log, callback) {
- function convertInterleavedBuffer(buf, channels, samples) {
- var chan, i;
- ret = new Array(channels);
-- for (chan=0; chan<channels; chan++) {
-+ for (chan = 0; chan < channels; chan++) {
- ret[chan] = new Int16Array(samples);
-- for (i=0; i<samples; i++) {
-- ret[chan][i] = buf[i*channels + chan];
-+ for (i = 0; i < samples; i++) {
-+ ret[chan][i] = buf[i * channels + chan];
- }
- }
- return ret;
-diff --git a/js/test/browser/index.html b/js/test/browser/index.html
-index b3a4ee3..6496e46 100644
---- a/js/test/browser/index.html
-+++ b/js/test/browser/index.html
-@@ -1,4 +1,4 @@
--<script src="libshine.js"></script>
-+<script src="libshine_node.js"></script>
- <script src="encode.js"></script>
- <script src="rounds.js"></script>
- <script>
-@@ -7,20 +7,21 @@
- el.innerHTML = el.innerHTML + "<br>" + msg;
- };
-
-- var load = function() {
-- runEncodeTest(log, function (blob) {
-- if (typeof window.URL !== "undefined") {
-- var link = document.getElementById("download-link");
-- link.href = URL.createObjectURL(blob);
-- link.download = "encoded.mp3";
-- }
-+ function onLoad() {
-+ Shine.initialized.then(function () {
-+ runEncodeTest(log, function (blob) {
-+ if (typeof window.URL !== "undefined") {
-+ var link = document.getElementById("download-link");
-+ link.href = URL.createObjectURL(blob);
-+ link.download = "encoded.mp3";
-+ }
-
-- log("");
-- runRoundsTest(Shine, log);
-+ log("");
-+ runRoundsTest(Shine, log);
-+ });
- });
- };
--
-- window.addEventListener("load", load, false);
-+ window.addEventListener("load", onLoad, false);
- </script>
- <a href="#" id="download-link">Download encoded file</a>
- <div id="output"></div>
-diff --git a/js/test/browser/libshine.js b/js/test/browser/libshine.js
-deleted file mode 120000
-index fb57470..0000000
---- a/js/test/browser/libshine.js
-+++ /dev/null
-@@ -1 +0,0 @@
--../../dist/libshine.js
-\ No newline at end of file
-diff --git a/js/test/browser/libshine_node.js b/js/test/browser/libshine_node.js
-new file mode 120000
-index 0000000..07f07a4
---- /dev/null
-+++ b/js/test/browser/libshine_node.js
-@@ -0,0 +1 @@
-+../../dist/libshine_node.js
-\ No newline at end of file
-diff --git a/js/test/lib/rounds.js b/js/test/lib/rounds.js
-index f76410a..1b388b5 100644
---- a/js/test/lib/rounds.js
-+++ b/js/test/lib/rounds.js
-@@ -1,39 +1,35 @@
- var channels = 2; // test.wav is stereo
- var samplerate = 44100; // ditto
-
--var runRoundsTest = function(Shine, log) {
-+var runRoundsTest = function (Shine, log) {
- log("Executing rounds test");
-
- var nPasses = 50;
- var frameSize = 4096;
- var data = new Array(channels);
- var chan;
-- for (chan=0; chan<channels; chan++)
-- data[chan] = new Int16Array(frameSize);
-+ for (chan = 0; chan < channels; chan++) data[chan] = new Int16Array(frameSize);
-
- log("Encoding " + nPasses + " buffers of " + frameSize + " samples");
-- var started = new Date;
-+ var started = new Date();
-
- var shine = new Shine({
- samplerate: samplerate,
- bitrate: 128,
- channels: channels,
-- model: Shine.STEREO
- });
-
- var i;
-- for (i=0; i < nPasses; i++)
-- shine.encode(data);
-+ for (i = 0; i < nPasses; i++) shine.encode(data);
- shine.close();
-
-- var ended = new Date;
-- var duration = (parseFloat(nPasses*frameSize) / parseFloat(samplerate)).toFixed(2);
-- var encodingTime = (ended.getTime() - started.getTime())/1000;
-+ var ended = new Date();
-+ var duration = (parseFloat(nPasses * frameSize) / parseFloat(samplerate)).toFixed(2);
-+ var encodingTime = (ended.getTime() - started.getTime()) / 1000;
- log("Done encoding");
- log("Total duration: " + duration);
- log("Encoding time: " + encodingTime.toFixed(2));
-- log("Encoding rate: " + (duration/encodingTime).toFixed(2) + "X");
-+ log("Encoding rate: " + (duration / encodingTime).toFixed(2) + "X");
- };
-
--if (typeof process === "object" && typeof require === "function")
-- module.exports = runRoundsTest;
-+if (typeof process === "object" && typeof require === "function") module.exports = runRoundsTest;
-diff --git a/js/test/nextjs/.eslintrc.json b/js/test/nextjs/.eslintrc.json
-new file mode 100644
-index 0000000..bffb357
---- /dev/null
-+++ b/js/test/nextjs/.eslintrc.json
-@@ -0,0 +1,3 @@
-+{
-+ "extends": "next/core-web-vitals"
-+}
-diff --git a/js/test/nextjs/.gitignore b/js/test/nextjs/.gitignore
-new file mode 100644
-index 0000000..c87c9b3
---- /dev/null
-+++ b/js/test/nextjs/.gitignore
-@@ -0,0 +1,36 @@
-+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
-+
-+# dependencies
-+/node_modules
-+/.pnp
-+.pnp.js
-+
-+# testing
-+/coverage
-+
-+# next.js
-+/.next/
-+/out/
-+
-+# production
-+/build
-+
-+# misc
-+.DS_Store
-+*.pem
-+
-+# debug
-+npm-debug.log*
-+yarn-debug.log*
-+yarn-error.log*
-+.pnpm-debug.log*
-+
-+# local env files
-+.env*.local
-+
-+# vercel
-+.vercel
-+
-+# typescript
-+*.tsbuildinfo
-+next-env.d.ts
-diff --git a/js/test/nextjs/.prettierignore b/js/test/nextjs/.prettierignore
-new file mode 100644
-index 0000000..799a1ca
---- /dev/null
-+++ b/js/test/nextjs/.prettierignore
-@@ -0,0 +1,4 @@
-+.next/
-+out/
-+public/audio
-+__ENV.js
-diff --git a/js/test/nextjs/.prettierrc b/js/test/nextjs/.prettierrc
-new file mode 100644
-index 0000000..a36a92f
---- /dev/null
-+++ b/js/test/nextjs/.prettierrc
-@@ -0,0 +1,12 @@
-+{
-+ "singleQuote": false,
-+ "quoteProps": "as-needed",
-+ "arrowParens": "avoid",
-+ "tabWidth": 2,
-+ "trailingComma": "es5",
-+ "semi": false,
-+ "jsxSingleQuote": true,
-+ "bracketSameLine": false,
-+ "printWidth": 120,
-+ "parser": "typescript"
-+}
-diff --git a/js/test/nextjs/README.md b/js/test/nextjs/README.md
-new file mode 100644
-index 0000000..fb9bcc9
---- /dev/null
-+++ b/js/test/nextjs/README.md
-@@ -0,0 +1,36 @@
-+This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
-+
-+## Getting Started
-+
-+First, run the development server:
-+
-+```bash
-+npm run dev
-+# or
-+yarn dev
-+```
-+
-+Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
-+
-+You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file.
-+
-+[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`.
-+
-+The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.
-+
-+This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
-+
-+## Learn More
-+
-+To learn more about Next.js, take a look at the following resources:
-+
-+- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
-+- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
-+
-+You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
-+
-+## Deploy on Vercel
-+
-+The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
-+
-+Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
-diff --git a/js/test/nextjs/lib/encode.ts b/js/test/nextjs/lib/encode.ts
-new file mode 100644
-index 0000000..6e1ef2d
---- /dev/null
-+++ b/js/test/nextjs/lib/encode.ts
-@@ -0,0 +1,59 @@
-+import { Shine } from "@toots/shine.js"
-+
-+const convertInterleavedBuffer = (buf: Int16Array, channels: number, samples: number) => {
-+ const ret = new Array(channels)
-+ for (let chan = 0; chan < channels; chan++) {
-+ ret[chan] = new Int16Array(samples)
-+ for (let i = 0; i < samples; i++) {
-+ ret[chan][i] = buf[i * channels + chan]
-+ }
-+ }
-+ return ret
-+}
-+
-+export const runEncodeTest = (log: (_: string) => void, callback: (_: Blob) => void) => {
-+ log("Executing encoding test")
-+
-+ const samplerate = 44100
-+ const channels = 2
-+ const bitrate = 128
-+ //const stereoMode = StereoMode.STEREO
-+
-+ const shine = new Shine({
-+ samplerate: samplerate,
-+ channels: channels,
-+ bitrate: bitrate,
-+ // stereoMode: stereoMode,
-+ })
-+
-+ const started = new Date()
-+ let duration = 0.0
-+ const encoded: Uint8Array[] = []
-+
-+ const xhr = new XMLHttpRequest()
-+ xhr.open("GET", "encode.wav", true)
-+ xhr.responseType = "arraybuffer"
-+ xhr.onload = () => {
-+ const samples = xhr.response.byteLength / (2 * channels)
-+ const data = new Int16Array(xhr.response)
-+ const buf = convertInterleavedBuffer(data, channels, samples)
-+ duration += samples / samplerate
-+ encoded.push(shine.encode(buf))
-+ }
-+
-+ log("Got WAV file.")
-+ log("Encoding..")
-+ xhr.addEventListener("load", () => {
-+ encoded.push(shine.close())
-+
-+ const ended = new Date()
-+ const encodingTime = (ended.getTime() - started.getTime()) / 1000
-+ log("Done encoding.")
-+ log("File duration: " + duration.toFixed(2) + " seconds")
-+ log("Encoding time: " + encodingTime.toFixed(2) + " seconds")
-+ log("Encoding rate: " + (duration / encodingTime).toFixed(2) + "X")
-+ callback(new Blob(encoded))
-+ })
-+
-+ xhr.send()
-+}
-diff --git a/js/test/nextjs/lib/encode.wav b/js/test/nextjs/lib/encode.wav
-new file mode 100644
-index 0000000..c8cd595
-Binary files /dev/null and b/js/test/nextjs/lib/encode.wav differ
-diff --git a/js/test/nextjs/lib/rounds.ts b/js/test/nextjs/lib/rounds.ts
-new file mode 100644
-index 0000000..fab9b7c
---- /dev/null
-+++ b/js/test/nextjs/lib/rounds.ts
-@@ -0,0 +1,34 @@
-+import { Shine, StereoMode } from "@toots/shine.js"
-+
-+const channels = 2 // test.wav is stereo
-+const samplerate = 44100 // ditto
-+
-+export const runRoundsTest = (log: (_: string) => void) => {
-+ log("Executing rounds test")
-+
-+ const nPasses = 50
-+ const frameSize = 4096
-+ const data = new Array(channels)
-+ for (let chan = 0; chan < channels; chan++) data[chan] = new Int16Array(frameSize)
-+
-+ log("Encoding " + nPasses + " buffers of " + frameSize + " samples")
-+ const started = new Date()
-+
-+ const shine = new Shine({
-+ samplerate: samplerate,
-+ bitrate: 128,
-+ channels: channels,
-+ stereoMode: StereoMode.STEREO,
-+ })
-+
-+ for (let i = 0; i < nPasses; i++) shine.encode(data)
-+ shine.close()
-+
-+ const ended = new Date()
-+ const duration = (nPasses * frameSize) / samplerate
-+ const encodingTime = (ended.getTime() - started.getTime()) / 1000
-+ log("Done encoding")
-+ log("Total duration: " + duration.toFixed(2))
-+ log("Encoding time: " + encodingTime.toFixed(2))
-+ log("Encoding rate: " + (duration / encodingTime).toFixed(2) + "X")
-+}
-diff --git a/js/test/nextjs/next.config.js b/js/test/nextjs/next.config.js
-new file mode 100644
-index 0000000..a843cbe
---- /dev/null
-+++ b/js/test/nextjs/next.config.js
-@@ -0,0 +1,6 @@
-+/** @type {import('next').NextConfig} */
-+const nextConfig = {
-+ reactStrictMode: true,
-+}
-+
-+module.exports = nextConfig
-diff --git a/js/test/nextjs/package-lock.json b/js/test/nextjs/package-lock.json
-new file mode 100644
-index 0000000..02208b0
---- /dev/null
-+++ b/js/test/nextjs/package-lock.json
-@@ -0,0 +1,3084 @@
-+{
-+ "name": "shine-nextjs-test-app",
-+ "version": "0.1.0",
-+ "lockfileVersion": 3,
-+ "requires": true,
-+ "packages": {
-+ "": {
-+ "name": "shine-nextjs-test-app",
-+ "version": "0.1.0",
-+ "dependencies": {
-+ "@next/font": "13.1.1",
-+ "@toots/shine.js": "file:../..",
-+ "@types/node": "18.11.18",
-+ "@types/react": "18.0.26",
-+ "@types/react-dom": "18.0.10",
-+ "eslint": "8.31.0",
-+ "eslint-config-next": "13.1.1",
-+ "next": "13.1.1",
-+ "react": "18.2.0",
-+ "react-dom": "18.2.0",
-+ "typescript": "4.9.4"
-+ },
-+ "devDependencies": {
-+ "prettier": "^2.8.1"
-+ }
-+ },
-+ "node_modules/@babel/runtime": {
-+ "version": "7.20.7",
-+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz",
-+ "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==",
-+ "dependencies": {
-+ "regenerator-runtime": "^0.13.11"
-+ },
-+ "engines": {
-+ "node": ">=6.9.0"
-+ }
-+ },
-+ "node_modules/@babel/runtime-corejs3": {
-+ "version": "7.20.7",
-+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.7.tgz",
-+ "integrity": "sha512-jr9lCZ4RbRQmCR28Q8U8Fu49zvFqLxTY9AMOUz+iyMohMoAgpEcVxY+wJNay99oXOpOcCTODkk70NDN2aaJEeg==",
-+ "dependencies": {
-+ "core-js-pure": "^3.25.1",
-+ "regenerator-runtime": "^0.13.11"
-+ },
-+ "engines": {
-+ "node": ">=6.9.0"
-+ }
-+ },
-+ "node_modules/@eslint/eslintrc": {
-+ "version": "1.4.1",
-+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz",
-+ "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==",
-+ "dependencies": {
-+ "ajv": "^6.12.4",
-+ "debug": "^4.3.2",
-+ "espree": "^9.4.0",
-+ "globals": "^13.19.0",
-+ "ignore": "^5.2.0",
-+ "import-fresh": "^3.2.1",
-+ "js-yaml": "^4.1.0",
-+ "minimatch": "^3.1.2",
-+ "strip-json-comments": "^3.1.1"
-+ },
-+ "engines": {
-+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-+ },
-+ "funding": {
-+ "url": "https://opencollective.com/eslint"
-+ }
-+ },
-+ "node_modules/@humanwhocodes/config-array": {
-+ "version": "0.11.8",
-+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
-+ "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
-+ "dependencies": {
-+ "@humanwhocodes/object-schema": "^1.2.1",
-+ "debug": "^4.1.1",
-+ "minimatch": "^3.0.5"
-+ },
-+ "engines": {
-+ "node": ">=10.10.0"
-+ }
-+ },
-+ "node_modules/@humanwhocodes/module-importer": {
-+ "version": "1.0.1",
-+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
-+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
-+ "engines": {
-+ "node": ">=12.22"
-+ },
-+ "funding": {
-+ "type": "github",
-+ "url": "https://github.com/sponsors/nzakas"
-+ }
-+ },
-+ "node_modules/@humanwhocodes/object-schema": {
-+ "version": "1.2.1",
-+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
-+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA=="
-+ },
-+ "node_modules/@next/env": {
-+ "version": "13.1.1",
-+ "resolved": "https://registry.npmjs.org/@next/env/-/env-13.1.1.tgz",
-+ "integrity": "sha512-vFMyXtPjSAiOXOywMojxfKIqE3VWN5RCAx+tT3AS3pcKjMLFTCJFUWsKv8hC+87Z1F4W3r68qTwDFZIFmd5Xkw=="
-+ },
-+ "node_modules/@next/eslint-plugin-next": {
-+ "version": "13.1.1",
-+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.1.1.tgz",
-+ "integrity": "sha512-SBrOFS8PC3nQ5aeZmawJkjKkWjwK9RoxvBSv/86nZp0ubdoVQoko8r8htALd9ufp16NhacCdqhu9bzZLDWtALQ==",
-+ "dependencies": {
-+ "glob": "7.1.7"
-+ }
-+ },
-+ "node_modules/@next/font": {
-+ "version": "13.1.1",
-+ "resolved": "https://registry.npmjs.org/@next/font/-/font-13.1.1.tgz",
-+ "integrity": "sha512-amygRorS05hYK1/XQRZo5qBl7l2fpHnezeKU/cNveWU5QJg+sg8gMGkUXHtvesNKpiKIJshBRH1TzvO+2sKpvQ=="
-+ },
-+ "node_modules/@next/swc-android-arm-eabi": {
-+ "version": "13.1.1",
-+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.1.1.tgz",
-+ "integrity": "sha512-qnFCx1kT3JTWhWve4VkeWuZiyjG0b5T6J2iWuin74lORCupdrNukxkq9Pm+Z7PsatxuwVJMhjUoYz7H4cWzx2A==",
-+ "cpu": [
-+ "arm"
-+ ],
-+ "optional": true,
-+ "os": [
-+ "android"
-+ ],
-+ "engines": {
-+ "node": ">= 10"
-+ }
-+ },
-+ "node_modules/@next/swc-android-arm64": {
-+ "version": "13.1.1",
-+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.1.1.tgz",
-+ "integrity": "sha512-eCiZhTzjySubNqUnNkQCjU3Fh+ep3C6b5DCM5FKzsTH/3Gr/4Y7EiaPZKILbvnXmhWtKPIdcY6Zjx51t4VeTfA==",
-+ "cpu": [
-+ "arm64"
-+ ],
-+ "optional": true,
-+ "os": [
-+ "android"
-+ ],
-+ "engines": {
-+ "node": ">= 10"
-+ }
-+ },
-+ "node_modules/@next/swc-darwin-arm64": {
-+ "version": "13.1.1",
-+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.1.1.tgz",
-+ "integrity": "sha512-9zRJSSIwER5tu9ADDkPw5rIZ+Np44HTXpYMr0rkM656IvssowPxmhK0rTreC1gpUCYwFsRbxarUJnJsTWiutPg==",
-+ "cpu": [
-+ "arm64"
-+ ],
-+ "optional": true,
-+ "os": [
-+ "darwin"
-+ ],
-+ "engines": {
-+ "node": ">= 10"
-+ }
-+ },
-+ "node_modules/@next/swc-darwin-x64": {
-+ "version": "13.1.1",
-+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.1.1.tgz",
-+ "integrity": "sha512-qWr9qEn5nrnlhB0rtjSdR00RRZEtxg4EGvicIipqZWEyayPxhUu6NwKiG8wZiYZCLfJ5KWr66PGSNeDMGlNaiA==",
-+ "cpu": [
-+ "x64"
-+ ],
-+ "optional": true,
-+ "os": [
-+ "darwin"
-+ ],
-+ "engines": {
-+ "node": ">= 10"
-+ }
-+ },
-+ "node_modules/@next/swc-freebsd-x64": {
-+ "version": "13.1.1",
-+ "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.1.1.tgz",
-+ "integrity": "sha512-UwP4w/NcQ7V/VJEj3tGVszgb4pyUCt3lzJfUhjDMUmQbzG9LDvgiZgAGMYH6L21MoyAATJQPDGiAMWAPKsmumA==",
-+ "cpu": [
-+ "x64"
-+ ],
-+ "optional": true,
-+ "os": [
-+ "freebsd"
-+ ],
-+ "engines": {
-+ "node": ">= 10"
-+ }
-+ },
-+ "node_modules/@next/swc-linux-arm-gnueabihf": {
-+ "version": "13.1.1",
-+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.1.1.tgz",
-+ "integrity": "sha512-CnsxmKHco9sosBs1XcvCXP845Db+Wx1G0qouV5+Gr+HT/ZlDYEWKoHVDgnJXLVEQzq4FmHddBNGbXvgqM1Gfkg==",
-+ "cpu": [
-+ "arm"
-+ ],
-+ "optional": true,
-+ "os": [
-+ "linux"
-+ ],
-+ "engines": {
-+ "node": ">= 10"
-+ }
-+ },
-+ "node_modules/@next/swc-linux-arm64-gnu": {
-+ "version": "13.1.1",
-+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.1.1.tgz",
-+ "integrity": "sha512-JfDq1eri5Dif+VDpTkONRd083780nsMCOKoFG87wA0sa4xL8LGcXIBAkUGIC1uVy9SMsr2scA9CySLD/i+Oqiw==",
-+ "cpu": [
-+ "arm64"
-+ ],
-+ "optional": true,
-+ "os": [
-+ "linux"
-+ ],
-+ "engines": {
-+ "node": ">= 10"
-+ }
-+ },
-+ "node_modules/@next/swc-linux-arm64-musl": {
-+ "version": "13.1.1",
-+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.1.1.tgz",
-+ "integrity": "sha512-GA67ZbDq2AW0CY07zzGt07M5b5Yaq5qUpFIoW3UFfjOPgb0Sqf3DAW7GtFMK1sF4ROHsRDMGQ9rnT0VM2dVfKA==",
-+ "cpu": [
-+ "arm64"
-+ ],
-+ "optional": true,
-+ "os": [
-+ "linux"
-+ ],
-+ "engines": {
-+ "node": ">= 10"
-+ }
-+ },
-+ "node_modules/@next/swc-linux-x64-gnu": {
-+ "version": "13.1.1",
-+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.1.1.tgz",
-+ "integrity": "sha512-nnjuBrbzvqaOJaV+XgT8/+lmXrSCOt1YYZn/irbDb2fR2QprL6Q7WJNgwsZNxiLSfLdv+2RJGGegBx9sLBEzGA==",
-+ "cpu": [
-+ "x64"
-+ ],
-+ "optional": true,
-+ "os": [
-+ "linux"
-+ ],
-+ "engines": {
-+ "node": ">= 10"
-+ }
-+ },
-+ "node_modules/@next/swc-linux-x64-musl": {
-+ "version": "13.1.1",
-+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.1.1.tgz",
-+ "integrity": "sha512-CM9xnAQNIZ8zf/igbIT/i3xWbQZYaF397H+JroF5VMOCUleElaMdQLL5riJml8wUfPoN3dtfn2s4peSr3azz/g==",
-+ "cpu": [
-+ "x64"
-+ ],
-+ "optional": true,
-+ "os": [
-+ "linux"
-+ ],
-+ "engines": {
-+ "node": ">= 10"
-+ }
-+ },
-+ "node_modules/@next/swc-win32-arm64-msvc": {
-+ "version": "13.1.1",
-+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.1.1.tgz",
-+ "integrity": "sha512-pzUHOGrbgfGgPlOMx9xk3QdPJoRPU+om84hqVoe6u+E0RdwOG0Ho/2UxCgDqmvpUrMab1Deltlt6RqcXFpnigQ==",
-+ "cpu": [
-+ "arm64"
-+ ],
-+ "optional": true,
-+ "os": [
-+ "win32"
-+ ],
-+ "engines": {
-+ "node": ">= 10"
-+ }
-+ },
-+ "node_modules/@next/swc-win32-ia32-msvc": {
-+ "version": "13.1.1",
-+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.1.1.tgz",
-+ "integrity": "sha512-WeX8kVS46aobM9a7Xr/kEPcrTyiwJqQv/tbw6nhJ4fH9xNZ+cEcyPoQkwPo570dCOLz3Zo9S2q0E6lJ/EAUOBg==",
-+ "cpu": [
-+ "ia32"
-+ ],
-+ "optional": true,
-+ "os": [
-+ "win32"
-+ ],
-+ "engines": {
-+ "node": ">= 10"
-+ }
-+ },
-+ "node_modules/@next/swc-win32-x64-msvc": {
-+ "version": "13.1.1",
-+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.1.1.tgz",
-+ "integrity": "sha512-mVF0/3/5QAc5EGVnb8ll31nNvf3BWpPY4pBb84tk+BfQglWLqc5AC9q1Ht/YMWiEgs8ALNKEQ3GQnbY0bJF2Gg==",
-+ "cpu": [
-+ "x64"
-+ ],
-+ "optional": true,
-+ "os": [
-+ "win32"
-+ ],
-+ "engines": {
-+ "node": ">= 10"
-+ }
-+ },
-+ "node_modules/@nodelib/fs.scandir": {
-+ "version": "2.1.5",
-+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
-+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
-+ "dependencies": {
-+ "@nodelib/fs.stat": "2.0.5",
-+ "run-parallel": "^1.1.9"
-+ },
-+ "engines": {
-+ "node": ">= 8"
-+ }
-+ },
-+ "node_modules/@nodelib/fs.stat": {
-+ "version": "2.0.5",
-+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
-+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
-+ "engines": {
-+ "node": ">= 8"
-+ }
-+ },
-+ "node_modules/@nodelib/fs.walk": {
-+ "version": "1.2.8",
-+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
-+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
-+ "dependencies": {
-+ "@nodelib/fs.scandir": "2.1.5",
-+ "fastq": "^1.6.0"
-+ },
-+ "engines": {
-+ "node": ">= 8"
-+ }
-+ },
-+ "node_modules/@pkgr/utils": {
-+ "version": "2.3.1",
-+ "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz",
-+ "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==",
-+ "dependencies": {
-+ "cross-spawn": "^7.0.3",
-+ "is-glob": "^4.0.3",
-+ "open": "^8.4.0",
-+ "picocolors": "^1.0.0",
-+ "tiny-glob": "^0.2.9",
-+ "tslib": "^2.4.0"
-+ },
-+ "engines": {
-+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
-+ },
-+ "funding": {
-+ "url": "https://opencollective.com/unts"
-+ }
-+ },
-+ "node_modules/@rushstack/eslint-patch": {
-+ "version": "1.2.0",
-+ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz",
-+ "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg=="
-+ },
-+ "node_modules/@swc/helpers": {
-+ "version": "0.4.14",
-+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz",
-+ "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==",
-+ "dependencies": {
-+ "tslib": "^2.4.0"
-+ }
-+ },
-+ "node_modules/@toots/shine.js": {
-+ "version": "1.0.1",
-+ "resolved": "file:../..",
-+ "license": "LGPL-2.0-only"
-+ },
-+ "node_modules/@types/json5": {
-+ "version": "0.0.29",
-+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
-+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="
-+ },
-+ "node_modules/@types/node": {
-+ "version": "18.11.18",
-+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
-+ "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA=="
-+ },
-+ "node_modules/@types/prop-types": {
-+ "version": "15.7.5",
-+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
-+ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w=="
-+ },
-+ "node_modules/@types/react": {
-+ "version": "18.0.26",
-+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz",
-+ "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==",
-+ "dependencies": {
-+ "@types/prop-types": "*",
-+ "@types/scheduler": "*",
-+ "csstype": "^3.0.2"
-+ }
-+ },
-+ "node_modules/@types/react-dom": {
-+ "version": "18.0.10",
-+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.10.tgz",
-+ "integrity": "sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==",
-+ "dependencies": {
-+ "@types/react": "*"
-+ }
-+ },
-+ "node_modules/@types/scheduler": {
-+ "version": "0.16.2",
-+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
-+ "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
-+ },
-+ "node_modules/@typescript-eslint/parser": {
-+ "version": "5.47.1",
-+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.47.1.tgz",
-+ "integrity": "sha512-9Vb+KIv29r6GPu4EboWOnQM7T+UjpjXvjCPhNORlgm40a9Ia9bvaPJswvtae1gip2QEeVeGh6YquqAzEgoRAlw==",
-+ "dependencies": {
-+ "@typescript-eslint/scope-manager": "5.47.1",
-+ "@typescript-eslint/types": "5.47.1",
-+ "@typescript-eslint/typescript-estree": "5.47.1",
-+ "debug": "^4.3.4"
-+ },
-+ "engines": {
-+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-+ },
-+ "funding": {
-+ "type": "opencollective",
-+ "url": "https://opencollective.com/typescript-eslint"
-+ },
-+ "peerDependencies": {
-+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
-+ },
-+ "peerDependenciesMeta": {
-+ "typescript": {
-+ "optional": true
-+ }
-+ }
-+ },
-+ "node_modules/@typescript-eslint/scope-manager": {
-+ "version": "5.47.1",
-+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.47.1.tgz",
-+ "integrity": "sha512-9hsFDsgUwrdOoW1D97Ewog7DYSHaq4WKuNs0LHF9RiCmqB0Z+XRR4Pf7u7u9z/8CciHuJ6yxNws1XznI3ddjEw==",
-+ "dependencies": {
-+ "@typescript-eslint/types": "5.47.1",
-+ "@typescript-eslint/visitor-keys": "5.47.1"
-+ },
-+ "engines": {
-+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-+ },
-+ "funding": {
-+ "type": "opencollective",
-+ "url": "https://opencollective.com/typescript-eslint"
-+ }
-+ },
-+ "node_modules/@typescript-eslint/types": {
-+ "version": "5.47.1",
-+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.1.tgz",
-+ "integrity": "sha512-CmALY9YWXEpwuu6377ybJBZdtSAnzXLSQcxLSqSQSbC7VfpMu/HLVdrnVJj7ycI138EHqocW02LPJErE35cE9A==",
-+ "engines": {
-+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-+ },
-+ "funding": {
-+ "type": "opencollective",
-+ "url": "https://opencollective.com/typescript-eslint"
-+ }
-+ },
-+ "node_modules/@typescript-eslint/typescript-estree": {
-+ "version": "5.47.1",
-+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.1.tgz",
-+ "integrity": "sha512-4+ZhFSuISAvRi2xUszEj0xXbNTHceV9GbH9S8oAD2a/F9SW57aJNQVOCxG8GPfSWH/X4eOPdMEU2jYVuWKEpWA==",
-+ "dependencies": {
-+ "@typescript-eslint/types": "5.47.1",
-+ "@typescript-eslint/visitor-keys": "5.47.1",
-+ "debug": "^4.3.4",
-+ "globby": "^11.1.0",
-+ "is-glob": "^4.0.3",
-+ "semver": "^7.3.7",
-+ "tsutils": "^3.21.0"
-+ },
-+ "engines": {
-+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-+ },
-+ "funding": {
-+ "type": "opencollective",
-+ "url": "https://opencollective.com/typescript-eslint"
-+ },
-+ "peerDependenciesMeta": {
-+ "typescript": {
-+ "optional": true
-+ }
-+ }
-+ },
-+ "node_modules/@typescript-eslint/visitor-keys": {
-+ "version": "5.47.1",
-+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.1.tgz",
-+ "integrity": "sha512-rF3pmut2JCCjh6BLRhNKdYjULMb1brvoaiWDlHfLNVgmnZ0sBVJrs3SyaKE1XoDDnJuAx/hDQryHYmPUuNq0ig==",
-+ "dependencies": {
-+ "@typescript-eslint/types": "5.47.1",
-+ "eslint-visitor-keys": "^3.3.0"
-+ },
-+ "engines": {
-+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-+ },
-+ "funding": {
-+ "type": "opencollective",
-+ "url": "https://opencollective.com/typescript-eslint"
-+ }
-+ },
-+ "node_modules/acorn": {
-+ "version": "8.8.1",
-+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
-+ "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
-+ "bin": {
-+ "acorn": "bin/acorn"
-+ },
-+ "engines": {
-+ "node": ">=0.4.0"
-+ }
-+ },
-+ "node_modules/acorn-jsx": {
-+ "version": "5.3.2",
-+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
-+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
-+ "peerDependencies": {
-+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
-+ }
-+ },
-+ "node_modules/ajv": {
-+ "version": "6.12.6",
-+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-+ "dependencies": {
-+ "fast-deep-equal": "^3.1.1",
-+ "fast-json-stable-stringify": "^2.0.0",
-+ "json-schema-traverse": "^0.4.1",
-+ "uri-js": "^4.2.2"
-+ },
-+ "funding": {
-+ "type": "github",
-+ "url": "https://github.com/sponsors/epoberezkin"
-+ }
-+ },
-+ "node_modules/ansi-regex": {
-+ "version": "5.0.1",
-+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-+ "engines": {
-+ "node": ">=8"
-+ }
-+ },
-+ "node_modules/ansi-styles": {
-+ "version": "4.3.0",
-+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-+ "dependencies": {
-+ "color-convert": "^2.0.1"
-+ },
-+ "engines": {
-+ "node": ">=8"
-+ },
-+ "funding": {
-+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-+ }
-+ },
-+ "node_modules/argparse": {
-+ "version": "2.0.1",
-+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
-+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
-+ },
-+ "node_modules/aria-query": {
-+ "version": "4.2.2",
-+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
-+ "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
-+ "dependencies": {
-+ "@babel/runtime": "^7.10.2",
-+ "@babel/runtime-corejs3": "^7.10.2"
-+ },
-+ "engines": {
-+ "node": ">=6.0"
-+ }
-+ },
-+ "node_modules/array-includes": {
-+ "version": "3.1.6",
-+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz",
-+ "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==",
-+ "dependencies": {
-+ "call-bind": "^1.0.2",
-+ "define-properties": "^1.1.4",
-+ "es-abstract": "^1.20.4",
-+ "get-intrinsic": "^1.1.3",
-+ "is-string": "^1.0.7"
-+ },
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/array-union": {
-+ "version": "2.1.0",
-+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
-+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
-+ "engines": {
-+ "node": ">=8"
-+ }
-+ },
-+ "node_modules/array.prototype.flat": {
-+ "version": "1.3.1",
-+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz",
-+ "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==",
-+ "dependencies": {
-+ "call-bind": "^1.0.2",
-+ "define-properties": "^1.1.4",
-+ "es-abstract": "^1.20.4",
-+ "es-shim-unscopables": "^1.0.0"
-+ },
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/array.prototype.flatmap": {
-+ "version": "1.3.1",
-+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz",
-+ "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==",
-+ "dependencies": {
-+ "call-bind": "^1.0.2",
-+ "define-properties": "^1.1.4",
-+ "es-abstract": "^1.20.4",
-+ "es-shim-unscopables": "^1.0.0"
-+ },
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/array.prototype.tosorted": {
-+ "version": "1.1.1",
-+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz",
-+ "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==",
-+ "dependencies": {
-+ "call-bind": "^1.0.2",
-+ "define-properties": "^1.1.4",
-+ "es-abstract": "^1.20.4",
-+ "es-shim-unscopables": "^1.0.0",
-+ "get-intrinsic": "^1.1.3"
-+ }
-+ },
-+ "node_modules/ast-types-flow": {
-+ "version": "0.0.7",
-+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
-+ "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag=="
-+ },
-+ "node_modules/axe-core": {
-+ "version": "4.6.1",
-+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.1.tgz",
-+ "integrity": "sha512-lCZN5XRuOnpG4bpMq8v0khrWtUOn+i8lZSb6wHZH56ZfbIEv6XwJV84AAueh9/zi7qPVJ/E4yz6fmsiyOmXR4w==",
-+ "engines": {
-+ "node": ">=4"
-+ }
-+ },
-+ "node_modules/axobject-query": {
-+ "version": "2.2.0",
-+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
-+ "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA=="
-+ },
-+ "node_modules/balanced-match": {
-+ "version": "1.0.2",
-+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
-+ },
-+ "node_modules/brace-expansion": {
-+ "version": "1.1.11",
-+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-+ "dependencies": {
-+ "balanced-match": "^1.0.0",
-+ "concat-map": "0.0.1"
-+ }
-+ },
-+ "node_modules/braces": {
-+ "version": "3.0.2",
-+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-+ "dependencies": {
-+ "fill-range": "^7.0.1"
-+ },
-+ "engines": {
-+ "node": ">=8"
-+ }
-+ },
-+ "node_modules/call-bind": {
-+ "version": "1.0.2",
-+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
-+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
-+ "dependencies": {
-+ "function-bind": "^1.1.1",
-+ "get-intrinsic": "^1.0.2"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/callsites": {
-+ "version": "3.1.0",
-+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
-+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
-+ "engines": {
-+ "node": ">=6"
-+ }
-+ },
-+ "node_modules/caniuse-lite": {
-+ "version": "1.0.30001441",
-+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz",
-+ "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==",
-+ "funding": [
-+ {
-+ "type": "opencollective",
-+ "url": "https://opencollective.com/browserslist"
-+ },
-+ {
-+ "type": "tidelift",
-+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
-+ }
-+ ]
-+ },
-+ "node_modules/chalk": {
-+ "version": "4.1.2",
-+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-+ "dependencies": {
-+ "ansi-styles": "^4.1.0",
-+ "supports-color": "^7.1.0"
-+ },
-+ "engines": {
-+ "node": ">=10"
-+ },
-+ "funding": {
-+ "url": "https://github.com/chalk/chalk?sponsor=1"
-+ }
-+ },
-+ "node_modules/client-only": {
-+ "version": "0.0.1",
-+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
-+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
-+ },
-+ "node_modules/color-convert": {
-+ "version": "2.0.1",
-+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-+ "dependencies": {
-+ "color-name": "~1.1.4"
-+ },
-+ "engines": {
-+ "node": ">=7.0.0"
-+ }
-+ },
-+ "node_modules/color-name": {
-+ "version": "1.1.4",
-+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
-+ },
-+ "node_modules/concat-map": {
-+ "version": "0.0.1",
-+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
-+ },
-+ "node_modules/core-js-pure": {
-+ "version": "3.27.1",
-+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.27.1.tgz",
-+ "integrity": "sha512-BS2NHgwwUppfeoqOXqi08mUqS5FiZpuRuJJpKsaME7kJz0xxuk0xkhDdfMIlP/zLa80krBqss1LtD7f889heAw==",
-+ "hasInstallScript": true,
-+ "funding": {
-+ "type": "opencollective",
-+ "url": "https://opencollective.com/core-js"
-+ }
-+ },
-+ "node_modules/cross-spawn": {
-+ "version": "7.0.3",
-+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
-+ "dependencies": {
-+ "path-key": "^3.1.0",
-+ "shebang-command": "^2.0.0",
-+ "which": "^2.0.1"
-+ },
-+ "engines": {
-+ "node": ">= 8"
-+ }
-+ },
-+ "node_modules/csstype": {
-+ "version": "3.1.1",
-+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz",
-+ "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw=="
-+ },
-+ "node_modules/damerau-levenshtein": {
-+ "version": "1.0.8",
-+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
-+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="
-+ },
-+ "node_modules/debug": {
-+ "version": "4.3.4",
-+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-+ "dependencies": {
-+ "ms": "2.1.2"
-+ },
-+ "engines": {
-+ "node": ">=6.0"
-+ },
-+ "peerDependenciesMeta": {
-+ "supports-color": {
-+ "optional": true
-+ }
-+ }
-+ },
-+ "node_modules/deep-is": {
-+ "version": "0.1.4",
-+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
-+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
-+ },
-+ "node_modules/define-lazy-prop": {
-+ "version": "2.0.0",
-+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
-+ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
-+ "engines": {
-+ "node": ">=8"
-+ }
-+ },
-+ "node_modules/define-properties": {
-+ "version": "1.1.4",
-+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
-+ "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
-+ "dependencies": {
-+ "has-property-descriptors": "^1.0.0",
-+ "object-keys": "^1.1.1"
-+ },
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/dir-glob": {
-+ "version": "3.0.1",
-+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
-+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
-+ "dependencies": {
-+ "path-type": "^4.0.0"
-+ },
-+ "engines": {
-+ "node": ">=8"
-+ }
-+ },
-+ "node_modules/doctrine": {
-+ "version": "3.0.0",
-+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
-+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
-+ "dependencies": {
-+ "esutils": "^2.0.2"
-+ },
-+ "engines": {
-+ "node": ">=6.0.0"
-+ }
-+ },
-+ "node_modules/emoji-regex": {
-+ "version": "9.2.2",
-+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
-+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
-+ },
-+ "node_modules/enhanced-resolve": {
-+ "version": "5.12.0",
-+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz",
-+ "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==",
-+ "dependencies": {
-+ "graceful-fs": "^4.2.4",
-+ "tapable": "^2.2.0"
-+ },
-+ "engines": {
-+ "node": ">=10.13.0"
-+ }
-+ },
-+ "node_modules/es-abstract": {
-+ "version": "1.20.5",
-+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz",
-+ "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==",
-+ "dependencies": {
-+ "call-bind": "^1.0.2",
-+ "es-to-primitive": "^1.2.1",
-+ "function-bind": "^1.1.1",
-+ "function.prototype.name": "^1.1.5",
-+ "get-intrinsic": "^1.1.3",
-+ "get-symbol-description": "^1.0.0",
-+ "gopd": "^1.0.1",
-+ "has": "^1.0.3",
-+ "has-property-descriptors": "^1.0.0",
-+ "has-symbols": "^1.0.3",
-+ "internal-slot": "^1.0.3",
-+ "is-callable": "^1.2.7",
-+ "is-negative-zero": "^2.0.2",
-+ "is-regex": "^1.1.4",
-+ "is-shared-array-buffer": "^1.0.2",
-+ "is-string": "^1.0.7",
-+ "is-weakref": "^1.0.2",
-+ "object-inspect": "^1.12.2",
-+ "object-keys": "^1.1.1",
-+ "object.assign": "^4.1.4",
-+ "regexp.prototype.flags": "^1.4.3",
-+ "safe-regex-test": "^1.0.0",
-+ "string.prototype.trimend": "^1.0.6",
-+ "string.prototype.trimstart": "^1.0.6",
-+ "unbox-primitive": "^1.0.2"
-+ },
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/es-shim-unscopables": {
-+ "version": "1.0.0",
-+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
-+ "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
-+ "dependencies": {
-+ "has": "^1.0.3"
-+ }
-+ },
-+ "node_modules/es-to-primitive": {
-+ "version": "1.2.1",
-+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
-+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
-+ "dependencies": {
-+ "is-callable": "^1.1.4",
-+ "is-date-object": "^1.0.1",
-+ "is-symbol": "^1.0.2"
-+ },
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/escape-string-regexp": {
-+ "version": "4.0.0",
-+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
-+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
-+ "engines": {
-+ "node": ">=10"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/sindresorhus"
-+ }
-+ },
-+ "node_modules/eslint": {
-+ "version": "8.31.0",
-+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.31.0.tgz",
-+ "integrity": "sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==",
-+ "dependencies": {
-+ "@eslint/eslintrc": "^1.4.1",
-+ "@humanwhocodes/config-array": "^0.11.8",
-+ "@humanwhocodes/module-importer": "^1.0.1",
-+ "@nodelib/fs.walk": "^1.2.8",
-+ "ajv": "^6.10.0",
-+ "chalk": "^4.0.0",
-+ "cross-spawn": "^7.0.2",
-+ "debug": "^4.3.2",
-+ "doctrine": "^3.0.0",
-+ "escape-string-regexp": "^4.0.0",
-+ "eslint-scope": "^7.1.1",
-+ "eslint-utils": "^3.0.0",
-+ "eslint-visitor-keys": "^3.3.0",
-+ "espree": "^9.4.0",
-+ "esquery": "^1.4.0",
-+ "esutils": "^2.0.2",
-+ "fast-deep-equal": "^3.1.3",
-+ "file-entry-cache": "^6.0.1",
-+ "find-up": "^5.0.0",
-+ "glob-parent": "^6.0.2",
-+ "globals": "^13.19.0",
-+ "grapheme-splitter": "^1.0.4",
-+ "ignore": "^5.2.0",
-+ "import-fresh": "^3.0.0",
-+ "imurmurhash": "^0.1.4",
-+ "is-glob": "^4.0.0",
-+ "is-path-inside": "^3.0.3",
-+ "js-sdsl": "^4.1.4",
-+ "js-yaml": "^4.1.0",
-+ "json-stable-stringify-without-jsonify": "^1.0.1",
-+ "levn": "^0.4.1",
-+ "lodash.merge": "^4.6.2",
-+ "minimatch": "^3.1.2",
-+ "natural-compare": "^1.4.0",
-+ "optionator": "^0.9.1",
-+ "regexpp": "^3.2.0",
-+ "strip-ansi": "^6.0.1",
-+ "strip-json-comments": "^3.1.0",
-+ "text-table": "^0.2.0"
-+ },
-+ "bin": {
-+ "eslint": "bin/eslint.js"
-+ },
-+ "engines": {
-+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-+ },
-+ "funding": {
-+ "url": "https://opencollective.com/eslint"
-+ }
-+ },
-+ "node_modules/eslint-config-next": {
-+ "version": "13.1.1",
-+ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.1.1.tgz",
-+ "integrity": "sha512-/5S2XGWlGaiqrRhzpn51ux5JUSLwx8PVK2keLi5xk7QmhfYB8PqE6R6SlVw6hgnf/VexvUXSrlNJ/su00NhtHQ==",
-+ "dependencies": {
-+ "@next/eslint-plugin-next": "13.1.1",
-+ "@rushstack/eslint-patch": "^1.1.3",
-+ "@typescript-eslint/parser": "^5.42.0",
-+ "eslint-import-resolver-node": "^0.3.6",
-+ "eslint-import-resolver-typescript": "^3.5.2",
-+ "eslint-plugin-import": "^2.26.0",
-+ "eslint-plugin-jsx-a11y": "^6.5.1",
-+ "eslint-plugin-react": "^7.31.7",
-+ "eslint-plugin-react-hooks": "^4.5.0"
-+ },
-+ "peerDependencies": {
-+ "eslint": "^7.23.0 || ^8.0.0",
-+ "typescript": ">=3.3.1"
-+ },
-+ "peerDependenciesMeta": {
-+ "typescript": {
-+ "optional": true
-+ }
-+ }
-+ },
-+ "node_modules/eslint-import-resolver-node": {
-+ "version": "0.3.6",
-+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
-+ "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==",
-+ "dependencies": {
-+ "debug": "^3.2.7",
-+ "resolve": "^1.20.0"
-+ }
-+ },
-+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
-+ "version": "3.2.7",
-+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-+ "dependencies": {
-+ "ms": "^2.1.1"
-+ }
-+ },
-+ "node_modules/eslint-import-resolver-typescript": {
-+ "version": "3.5.2",
-+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.2.tgz",
-+ "integrity": "sha512-zX4ebnnyXiykjhcBvKIf5TNvt8K7yX6bllTRZ14MiurKPjDpCAZujlszTdB8pcNXhZcOf+god4s9SjQa5GnytQ==",
-+ "dependencies": {
-+ "debug": "^4.3.4",
-+ "enhanced-resolve": "^5.10.0",
-+ "get-tsconfig": "^4.2.0",
-+ "globby": "^13.1.2",
-+ "is-core-module": "^2.10.0",
-+ "is-glob": "^4.0.3",
-+ "synckit": "^0.8.4"
-+ },
-+ "engines": {
-+ "node": "^14.18.0 || >=16.0.0"
-+ },
-+ "funding": {
-+ "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts"
-+ },
-+ "peerDependencies": {
-+ "eslint": "*",
-+ "eslint-plugin-import": "*"
-+ }
-+ },
-+ "node_modules/eslint-import-resolver-typescript/node_modules/globby": {
-+ "version": "13.1.3",
-+ "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz",
-+ "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==",
-+ "dependencies": {
-+ "dir-glob": "^3.0.1",
-+ "fast-glob": "^3.2.11",
-+ "ignore": "^5.2.0",
-+ "merge2": "^1.4.1",
-+ "slash": "^4.0.0"
-+ },
-+ "engines": {
-+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/sindresorhus"
-+ }
-+ },
-+ "node_modules/eslint-import-resolver-typescript/node_modules/slash": {
-+ "version": "4.0.0",
-+ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
-+ "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
-+ "engines": {
-+ "node": ">=12"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/sindresorhus"
-+ }
-+ },
-+ "node_modules/eslint-module-utils": {
-+ "version": "2.7.4",
-+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz",
-+ "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==",
-+ "dependencies": {
-+ "debug": "^3.2.7"
-+ },
-+ "engines": {
-+ "node": ">=4"
-+ },
-+ "peerDependenciesMeta": {
-+ "eslint": {
-+ "optional": true
-+ }
-+ }
-+ },
-+ "node_modules/eslint-module-utils/node_modules/debug": {
-+ "version": "3.2.7",
-+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-+ "dependencies": {
-+ "ms": "^2.1.1"
-+ }
-+ },
-+ "node_modules/eslint-plugin-import": {
-+ "version": "2.26.0",
-+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz",
-+ "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==",
-+ "dependencies": {
-+ "array-includes": "^3.1.4",
-+ "array.prototype.flat": "^1.2.5",
-+ "debug": "^2.6.9",
-+ "doctrine": "^2.1.0",
-+ "eslint-import-resolver-node": "^0.3.6",
-+ "eslint-module-utils": "^2.7.3",
-+ "has": "^1.0.3",
-+ "is-core-module": "^2.8.1",
-+ "is-glob": "^4.0.3",
-+ "minimatch": "^3.1.2",
-+ "object.values": "^1.1.5",
-+ "resolve": "^1.22.0",
-+ "tsconfig-paths": "^3.14.1"
-+ },
-+ "engines": {
-+ "node": ">=4"
-+ },
-+ "peerDependencies": {
-+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
-+ }
-+ },
-+ "node_modules/eslint-plugin-import/node_modules/debug": {
-+ "version": "2.6.9",
-+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-+ "dependencies": {
-+ "ms": "2.0.0"
-+ }
-+ },
-+ "node_modules/eslint-plugin-import/node_modules/doctrine": {
-+ "version": "2.1.0",
-+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
-+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
-+ "dependencies": {
-+ "esutils": "^2.0.2"
-+ },
-+ "engines": {
-+ "node": ">=0.10.0"
-+ }
-+ },
-+ "node_modules/eslint-plugin-import/node_modules/ms": {
-+ "version": "2.0.0",
-+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
-+ },
-+ "node_modules/eslint-plugin-jsx-a11y": {
-+ "version": "6.6.1",
-+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz",
-+ "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==",
-+ "dependencies": {
-+ "@babel/runtime": "^7.18.9",
-+ "aria-query": "^4.2.2",
-+ "array-includes": "^3.1.5",
-+ "ast-types-flow": "^0.0.7",
-+ "axe-core": "^4.4.3",
-+ "axobject-query": "^2.2.0",
-+ "damerau-levenshtein": "^1.0.8",
-+ "emoji-regex": "^9.2.2",
-+ "has": "^1.0.3",
-+ "jsx-ast-utils": "^3.3.2",
-+ "language-tags": "^1.0.5",
-+ "minimatch": "^3.1.2",
-+ "semver": "^6.3.0"
-+ },
-+ "engines": {
-+ "node": ">=4.0"
-+ },
-+ "peerDependencies": {
-+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
-+ }
-+ },
-+ "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": {
-+ "version": "6.3.0",
-+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-+ "bin": {
-+ "semver": "bin/semver.js"
-+ }
-+ },
-+ "node_modules/eslint-plugin-react": {
-+ "version": "7.31.11",
-+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz",
-+ "integrity": "sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw==",
-+ "dependencies": {
-+ "array-includes": "^3.1.6",
-+ "array.prototype.flatmap": "^1.3.1",
-+ "array.prototype.tosorted": "^1.1.1",
-+ "doctrine": "^2.1.0",
-+ "estraverse": "^5.3.0",
-+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
-+ "minimatch": "^3.1.2",
-+ "object.entries": "^1.1.6",
-+ "object.fromentries": "^2.0.6",
-+ "object.hasown": "^1.1.2",
-+ "object.values": "^1.1.6",
-+ "prop-types": "^15.8.1",
-+ "resolve": "^2.0.0-next.3",
-+ "semver": "^6.3.0",
-+ "string.prototype.matchall": "^4.0.8"
-+ },
-+ "engines": {
-+ "node": ">=4"
-+ },
-+ "peerDependencies": {
-+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
-+ }
-+ },
-+ "node_modules/eslint-plugin-react-hooks": {
-+ "version": "4.6.0",
-+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
-+ "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
-+ "engines": {
-+ "node": ">=10"
-+ },
-+ "peerDependencies": {
-+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
-+ }
-+ },
-+ "node_modules/eslint-plugin-react/node_modules/doctrine": {
-+ "version": "2.1.0",
-+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
-+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
-+ "dependencies": {
-+ "esutils": "^2.0.2"
-+ },
-+ "engines": {
-+ "node": ">=0.10.0"
-+ }
-+ },
-+ "node_modules/eslint-plugin-react/node_modules/resolve": {
-+ "version": "2.0.0-next.4",
-+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
-+ "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==",
-+ "dependencies": {
-+ "is-core-module": "^2.9.0",
-+ "path-parse": "^1.0.7",
-+ "supports-preserve-symlinks-flag": "^1.0.0"
-+ },
-+ "bin": {
-+ "resolve": "bin/resolve"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/eslint-plugin-react/node_modules/semver": {
-+ "version": "6.3.0",
-+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-+ "bin": {
-+ "semver": "bin/semver.js"
-+ }
-+ },
-+ "node_modules/eslint-scope": {
-+ "version": "7.1.1",
-+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
-+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
-+ "dependencies": {
-+ "esrecurse": "^4.3.0",
-+ "estraverse": "^5.2.0"
-+ },
-+ "engines": {
-+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-+ }
-+ },
-+ "node_modules/eslint-utils": {
-+ "version": "3.0.0",
-+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
-+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
-+ "dependencies": {
-+ "eslint-visitor-keys": "^2.0.0"
-+ },
-+ "engines": {
-+ "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/mysticatea"
-+ },
-+ "peerDependencies": {
-+ "eslint": ">=5"
-+ }
-+ },
-+ "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
-+ "version": "2.1.0",
-+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
-+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
-+ "engines": {
-+ "node": ">=10"
-+ }
-+ },
-+ "node_modules/eslint-visitor-keys": {
-+ "version": "3.3.0",
-+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
-+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
-+ "engines": {
-+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-+ }
-+ },
-+ "node_modules/espree": {
-+ "version": "9.4.1",
-+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz",
-+ "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==",
-+ "dependencies": {
-+ "acorn": "^8.8.0",
-+ "acorn-jsx": "^5.3.2",
-+ "eslint-visitor-keys": "^3.3.0"
-+ },
-+ "engines": {
-+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-+ },
-+ "funding": {
-+ "url": "https://opencollective.com/eslint"
-+ }
-+ },
-+ "node_modules/esquery": {
-+ "version": "1.4.0",
-+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
-+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
-+ "dependencies": {
-+ "estraverse": "^5.1.0"
-+ },
-+ "engines": {
-+ "node": ">=0.10"
-+ }
-+ },
-+ "node_modules/esrecurse": {
-+ "version": "4.3.0",
-+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
-+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
-+ "dependencies": {
-+ "estraverse": "^5.2.0"
-+ },
-+ "engines": {
-+ "node": ">=4.0"
-+ }
-+ },
-+ "node_modules/estraverse": {
-+ "version": "5.3.0",
-+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
-+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
-+ "engines": {
-+ "node": ">=4.0"
-+ }
-+ },
-+ "node_modules/esutils": {
-+ "version": "2.0.3",
-+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
-+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
-+ "engines": {
-+ "node": ">=0.10.0"
-+ }
-+ },
-+ "node_modules/fast-deep-equal": {
-+ "version": "3.1.3",
-+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
-+ },
-+ "node_modules/fast-glob": {
-+ "version": "3.2.12",
-+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
-+ "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
-+ "dependencies": {
-+ "@nodelib/fs.stat": "^2.0.2",
-+ "@nodelib/fs.walk": "^1.2.3",
-+ "glob-parent": "^5.1.2",
-+ "merge2": "^1.3.0",
-+ "micromatch": "^4.0.4"
-+ },
-+ "engines": {
-+ "node": ">=8.6.0"
-+ }
-+ },
-+ "node_modules/fast-glob/node_modules/glob-parent": {
-+ "version": "5.1.2",
-+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
-+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
-+ "dependencies": {
-+ "is-glob": "^4.0.1"
-+ },
-+ "engines": {
-+ "node": ">= 6"
-+ }
-+ },
-+ "node_modules/fast-json-stable-stringify": {
-+ "version": "2.1.0",
-+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
-+ },
-+ "node_modules/fast-levenshtein": {
-+ "version": "2.0.6",
-+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="
-+ },
-+ "node_modules/fastq": {
-+ "version": "1.14.0",
-+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz",
-+ "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==",
-+ "dependencies": {
-+ "reusify": "^1.0.4"
-+ }
-+ },
-+ "node_modules/file-entry-cache": {
-+ "version": "6.0.1",
-+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
-+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
-+ "dependencies": {
-+ "flat-cache": "^3.0.4"
-+ },
-+ "engines": {
-+ "node": "^10.12.0 || >=12.0.0"
-+ }
-+ },
-+ "node_modules/fill-range": {
-+ "version": "7.0.1",
-+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-+ "dependencies": {
-+ "to-regex-range": "^5.0.1"
-+ },
-+ "engines": {
-+ "node": ">=8"
-+ }
-+ },
-+ "node_modules/find-up": {
-+ "version": "5.0.0",
-+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
-+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
-+ "dependencies": {
-+ "locate-path": "^6.0.0",
-+ "path-exists": "^4.0.0"
-+ },
-+ "engines": {
-+ "node": ">=10"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/sindresorhus"
-+ }
-+ },
-+ "node_modules/flat-cache": {
-+ "version": "3.0.4",
-+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
-+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
-+ "dependencies": {
-+ "flatted": "^3.1.0",
-+ "rimraf": "^3.0.2"
-+ },
-+ "engines": {
-+ "node": "^10.12.0 || >=12.0.0"
-+ }
-+ },
-+ "node_modules/flatted": {
-+ "version": "3.2.7",
-+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
-+ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ=="
-+ },
-+ "node_modules/fs.realpath": {
-+ "version": "1.0.0",
-+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
-+ },
-+ "node_modules/function-bind": {
-+ "version": "1.1.1",
-+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
-+ },
-+ "node_modules/function.prototype.name": {
-+ "version": "1.1.5",
-+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
-+ "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
-+ "dependencies": {
-+ "call-bind": "^1.0.2",
-+ "define-properties": "^1.1.3",
-+ "es-abstract": "^1.19.0",
-+ "functions-have-names": "^1.2.2"
-+ },
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/functions-have-names": {
-+ "version": "1.2.3",
-+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
-+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/get-intrinsic": {
-+ "version": "1.1.3",
-+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
-+ "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
-+ "dependencies": {
-+ "function-bind": "^1.1.1",
-+ "has": "^1.0.3",
-+ "has-symbols": "^1.0.3"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/get-symbol-description": {
-+ "version": "1.0.0",
-+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
-+ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
-+ "dependencies": {
-+ "call-bind": "^1.0.2",
-+ "get-intrinsic": "^1.1.1"
-+ },
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/get-tsconfig": {
-+ "version": "4.2.0",
-+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.2.0.tgz",
-+ "integrity": "sha512-X8u8fREiYOE6S8hLbq99PeykTDoLVnxvF4DjWKJmz9xy2nNRdUcV8ZN9tniJFeKyTU3qnC9lL8n4Chd6LmVKHg==",
-+ "funding": {
-+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
-+ }
-+ },
-+ "node_modules/glob": {
-+ "version": "7.1.7",
-+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
-+ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
-+ "dependencies": {
-+ "fs.realpath": "^1.0.0",
-+ "inflight": "^1.0.4",
-+ "inherits": "2",
-+ "minimatch": "^3.0.4",
-+ "once": "^1.3.0",
-+ "path-is-absolute": "^1.0.0"
-+ },
-+ "engines": {
-+ "node": "*"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/isaacs"
-+ }
-+ },
-+ "node_modules/glob-parent": {
-+ "version": "6.0.2",
-+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
-+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
-+ "dependencies": {
-+ "is-glob": "^4.0.3"
-+ },
-+ "engines": {
-+ "node": ">=10.13.0"
-+ }
-+ },
-+ "node_modules/globals": {
-+ "version": "13.19.0",
-+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
-+ "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
-+ "dependencies": {
-+ "type-fest": "^0.20.2"
-+ },
-+ "engines": {
-+ "node": ">=8"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/sindresorhus"
-+ }
-+ },
-+ "node_modules/globalyzer": {
-+ "version": "0.1.0",
-+ "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz",
-+ "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q=="
-+ },
-+ "node_modules/globby": {
-+ "version": "11.1.0",
-+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
-+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
-+ "dependencies": {
-+ "array-union": "^2.1.0",
-+ "dir-glob": "^3.0.1",
-+ "fast-glob": "^3.2.9",
-+ "ignore": "^5.2.0",
-+ "merge2": "^1.4.1",
-+ "slash": "^3.0.0"
-+ },
-+ "engines": {
-+ "node": ">=10"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/sindresorhus"
-+ }
-+ },
-+ "node_modules/globrex": {
-+ "version": "0.1.2",
-+ "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
-+ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg=="
-+ },
-+ "node_modules/gopd": {
-+ "version": "1.0.1",
-+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
-+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
-+ "dependencies": {
-+ "get-intrinsic": "^1.1.3"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/graceful-fs": {
-+ "version": "4.2.10",
-+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
-+ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
-+ },
-+ "node_modules/grapheme-splitter": {
-+ "version": "1.0.4",
-+ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
-+ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ=="
-+ },
-+ "node_modules/has": {
-+ "version": "1.0.3",
-+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-+ "dependencies": {
-+ "function-bind": "^1.1.1"
-+ },
-+ "engines": {
-+ "node": ">= 0.4.0"
-+ }
-+ },
-+ "node_modules/has-bigints": {
-+ "version": "1.0.2",
-+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
-+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/has-flag": {
-+ "version": "4.0.0",
-+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-+ "engines": {
-+ "node": ">=8"
-+ }
-+ },
-+ "node_modules/has-property-descriptors": {
-+ "version": "1.0.0",
-+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
-+ "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
-+ "dependencies": {
-+ "get-intrinsic": "^1.1.1"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/has-symbols": {
-+ "version": "1.0.3",
-+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
-+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/has-tostringtag": {
-+ "version": "1.0.0",
-+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
-+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
-+ "dependencies": {
-+ "has-symbols": "^1.0.2"
-+ },
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/ignore": {
-+ "version": "5.2.4",
-+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
-+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
-+ "engines": {
-+ "node": ">= 4"
-+ }
-+ },
-+ "node_modules/import-fresh": {
-+ "version": "3.3.0",
-+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
-+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
-+ "dependencies": {
-+ "parent-module": "^1.0.0",
-+ "resolve-from": "^4.0.0"
-+ },
-+ "engines": {
-+ "node": ">=6"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/sindresorhus"
-+ }
-+ },
-+ "node_modules/imurmurhash": {
-+ "version": "0.1.4",
-+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
-+ "engines": {
-+ "node": ">=0.8.19"
-+ }
-+ },
-+ "node_modules/inflight": {
-+ "version": "1.0.6",
-+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
-+ "dependencies": {
-+ "once": "^1.3.0",
-+ "wrappy": "1"
-+ }
-+ },
-+ "node_modules/inherits": {
-+ "version": "2.0.4",
-+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
-+ },
-+ "node_modules/internal-slot": {
-+ "version": "1.0.4",
-+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz",
-+ "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==",
-+ "dependencies": {
-+ "get-intrinsic": "^1.1.3",
-+ "has": "^1.0.3",
-+ "side-channel": "^1.0.4"
-+ },
-+ "engines": {
-+ "node": ">= 0.4"
-+ }
-+ },
-+ "node_modules/is-bigint": {
-+ "version": "1.0.4",
-+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
-+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
-+ "dependencies": {
-+ "has-bigints": "^1.0.1"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/is-boolean-object": {
-+ "version": "1.1.2",
-+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
-+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
-+ "dependencies": {
-+ "call-bind": "^1.0.2",
-+ "has-tostringtag": "^1.0.0"
-+ },
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/is-callable": {
-+ "version": "1.2.7",
-+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
-+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/is-core-module": {
-+ "version": "2.11.0",
-+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
-+ "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
-+ "dependencies": {
-+ "has": "^1.0.3"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/is-date-object": {
-+ "version": "1.0.5",
-+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
-+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
-+ "dependencies": {
-+ "has-tostringtag": "^1.0.0"
-+ },
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/is-docker": {
-+ "version": "2.2.1",
-+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
-+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
-+ "bin": {
-+ "is-docker": "cli.js"
-+ },
-+ "engines": {
-+ "node": ">=8"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/sindresorhus"
-+ }
-+ },
-+ "node_modules/is-extglob": {
-+ "version": "2.1.1",
-+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
-+ "engines": {
-+ "node": ">=0.10.0"
-+ }
-+ },
-+ "node_modules/is-glob": {
-+ "version": "4.0.3",
-+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
-+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
-+ "dependencies": {
-+ "is-extglob": "^2.1.1"
-+ },
-+ "engines": {
-+ "node": ">=0.10.0"
-+ }
-+ },
-+ "node_modules/is-negative-zero": {
-+ "version": "2.0.2",
-+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
-+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/is-number": {
-+ "version": "7.0.0",
-+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-+ "engines": {
-+ "node": ">=0.12.0"
-+ }
-+ },
-+ "node_modules/is-number-object": {
-+ "version": "1.0.7",
-+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
-+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
-+ "dependencies": {
-+ "has-tostringtag": "^1.0.0"
-+ },
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/is-path-inside": {
-+ "version": "3.0.3",
-+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
-+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
-+ "engines": {
-+ "node": ">=8"
-+ }
-+ },
-+ "node_modules/is-regex": {
-+ "version": "1.1.4",
-+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
-+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
-+ "dependencies": {
-+ "call-bind": "^1.0.2",
-+ "has-tostringtag": "^1.0.0"
-+ },
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/is-shared-array-buffer": {
-+ "version": "1.0.2",
-+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
-+ "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
-+ "dependencies": {
-+ "call-bind": "^1.0.2"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/is-string": {
-+ "version": "1.0.7",
-+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
-+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
-+ "dependencies": {
-+ "has-tostringtag": "^1.0.0"
-+ },
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/is-symbol": {
-+ "version": "1.0.4",
-+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
-+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
-+ "dependencies": {
-+ "has-symbols": "^1.0.2"
-+ },
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/is-weakref": {
-+ "version": "1.0.2",
-+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
-+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
-+ "dependencies": {
-+ "call-bind": "^1.0.2"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/is-wsl": {
-+ "version": "2.2.0",
-+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
-+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
-+ "dependencies": {
-+ "is-docker": "^2.0.0"
-+ },
-+ "engines": {
-+ "node": ">=8"
-+ }
-+ },
-+ "node_modules/isexe": {
-+ "version": "2.0.0",
-+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
-+ },
-+ "node_modules/js-sdsl": {
-+ "version": "4.2.0",
-+ "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz",
-+ "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==",
-+ "funding": {
-+ "type": "opencollective",
-+ "url": "https://opencollective.com/js-sdsl"
-+ }
-+ },
-+ "node_modules/js-tokens": {
-+ "version": "4.0.0",
-+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
-+ },
-+ "node_modules/js-yaml": {
-+ "version": "4.1.0",
-+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
-+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
-+ "dependencies": {
-+ "argparse": "^2.0.1"
-+ },
-+ "bin": {
-+ "js-yaml": "bin/js-yaml.js"
-+ }
-+ },
-+ "node_modules/json-schema-traverse": {
-+ "version": "0.4.1",
-+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
-+ },
-+ "node_modules/json-stable-stringify-without-jsonify": {
-+ "version": "1.0.1",
-+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
-+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="
-+ },
-+ "node_modules/json5": {
-+ "version": "1.0.2",
-+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
-+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
-+ "dependencies": {
-+ "minimist": "^1.2.0"
-+ },
-+ "bin": {
-+ "json5": "lib/cli.js"
-+ }
-+ },
-+ "node_modules/jsx-ast-utils": {
-+ "version": "3.3.3",
-+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz",
-+ "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==",
-+ "dependencies": {
-+ "array-includes": "^3.1.5",
-+ "object.assign": "^4.1.3"
-+ },
-+ "engines": {
-+ "node": ">=4.0"
-+ }
-+ },
-+ "node_modules/language-subtag-registry": {
-+ "version": "0.3.22",
-+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz",
-+ "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w=="
-+ },
-+ "node_modules/language-tags": {
-+ "version": "1.0.7",
-+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.7.tgz",
-+ "integrity": "sha512-bSytju1/657hFjgUzPAPqszxH62ouE8nQFoFaVlIQfne4wO/wXC9A4+m8jYve7YBBvi59eq0SUpcshvG8h5Usw==",
-+ "dependencies": {
-+ "language-subtag-registry": "^0.3.20"
-+ }
-+ },
-+ "node_modules/levn": {
-+ "version": "0.4.1",
-+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
-+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
-+ "dependencies": {
-+ "prelude-ls": "^1.2.1",
-+ "type-check": "~0.4.0"
-+ },
-+ "engines": {
-+ "node": ">= 0.8.0"
-+ }
-+ },
-+ "node_modules/locate-path": {
-+ "version": "6.0.0",
-+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
-+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
-+ "dependencies": {
-+ "p-locate": "^5.0.0"
-+ },
-+ "engines": {
-+ "node": ">=10"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/sindresorhus"
-+ }
-+ },
-+ "node_modules/lodash.merge": {
-+ "version": "4.6.2",
-+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
-+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
-+ },
-+ "node_modules/loose-envify": {
-+ "version": "1.4.0",
-+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
-+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
-+ "dependencies": {
-+ "js-tokens": "^3.0.0 || ^4.0.0"
-+ },
-+ "bin": {
-+ "loose-envify": "cli.js"
-+ }
-+ },
-+ "node_modules/lru-cache": {
-+ "version": "6.0.0",
-+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-+ "dependencies": {
-+ "yallist": "^4.0.0"
-+ },
-+ "engines": {
-+ "node": ">=10"
-+ }
-+ },
-+ "node_modules/merge2": {
-+ "version": "1.4.1",
-+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
-+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
-+ "engines": {
-+ "node": ">= 8"
-+ }
-+ },
-+ "node_modules/micromatch": {
-+ "version": "4.0.5",
-+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
-+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
-+ "dependencies": {
-+ "braces": "^3.0.2",
-+ "picomatch": "^2.3.1"
-+ },
-+ "engines": {
-+ "node": ">=8.6"
-+ }
-+ },
-+ "node_modules/minimatch": {
-+ "version": "3.1.2",
-+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-+ "dependencies": {
-+ "brace-expansion": "^1.1.7"
-+ },
-+ "engines": {
-+ "node": "*"
-+ }
-+ },
-+ "node_modules/minimist": {
-+ "version": "1.2.7",
-+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
-+ "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/ms": {
-+ "version": "2.1.2",
-+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-+ },
-+ "node_modules/nanoid": {
-+ "version": "3.3.4",
-+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
-+ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
-+ "bin": {
-+ "nanoid": "bin/nanoid.cjs"
-+ },
-+ "engines": {
-+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
-+ }
-+ },
-+ "node_modules/natural-compare": {
-+ "version": "1.4.0",
-+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
-+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="
-+ },
-+ "node_modules/next": {
-+ "version": "13.1.1",
-+ "resolved": "https://registry.npmjs.org/next/-/next-13.1.1.tgz",
-+ "integrity": "sha512-R5eBAaIa3X7LJeYvv1bMdGnAVF4fVToEjim7MkflceFPuANY3YyvFxXee/A+acrSYwYPvOvf7f6v/BM/48ea5w==",
-+ "dependencies": {
-+ "@next/env": "13.1.1",
-+ "@swc/helpers": "0.4.14",
-+ "caniuse-lite": "^1.0.30001406",
-+ "postcss": "8.4.14",
-+ "styled-jsx": "5.1.1"
-+ },
-+ "bin": {
-+ "next": "dist/bin/next"
-+ },
-+ "engines": {
-+ "node": ">=14.6.0"
-+ },
-+ "optionalDependencies": {
-+ "@next/swc-android-arm-eabi": "13.1.1",
-+ "@next/swc-android-arm64": "13.1.1",
-+ "@next/swc-darwin-arm64": "13.1.1",
-+ "@next/swc-darwin-x64": "13.1.1",
-+ "@next/swc-freebsd-x64": "13.1.1",
-+ "@next/swc-linux-arm-gnueabihf": "13.1.1",
-+ "@next/swc-linux-arm64-gnu": "13.1.1",
-+ "@next/swc-linux-arm64-musl": "13.1.1",
-+ "@next/swc-linux-x64-gnu": "13.1.1",
-+ "@next/swc-linux-x64-musl": "13.1.1",
-+ "@next/swc-win32-arm64-msvc": "13.1.1",
-+ "@next/swc-win32-ia32-msvc": "13.1.1",
-+ "@next/swc-win32-x64-msvc": "13.1.1"
-+ },
-+ "peerDependencies": {
-+ "fibers": ">= 3.1.0",
-+ "node-sass": "^6.0.0 || ^7.0.0",
-+ "react": "^18.2.0",
-+ "react-dom": "^18.2.0",
-+ "sass": "^1.3.0"
-+ },
-+ "peerDependenciesMeta": {
-+ "fibers": {
-+ "optional": true
-+ },
-+ "node-sass": {
-+ "optional": true
-+ },
-+ "sass": {
-+ "optional": true
-+ }
-+ }
-+ },
-+ "node_modules/object-assign": {
-+ "version": "4.1.1",
-+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
-+ "engines": {
-+ "node": ">=0.10.0"
-+ }
-+ },
-+ "node_modules/object-inspect": {
-+ "version": "1.12.2",
-+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
-+ "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/object-keys": {
-+ "version": "1.1.1",
-+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-+ "engines": {
-+ "node": ">= 0.4"
-+ }
-+ },
-+ "node_modules/object.assign": {
-+ "version": "4.1.4",
-+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
-+ "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
-+ "dependencies": {
-+ "call-bind": "^1.0.2",
-+ "define-properties": "^1.1.4",
-+ "has-symbols": "^1.0.3",
-+ "object-keys": "^1.1.1"
-+ },
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/object.entries": {
-+ "version": "1.1.6",
-+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz",
-+ "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==",
-+ "dependencies": {
-+ "call-bind": "^1.0.2",
-+ "define-properties": "^1.1.4",
-+ "es-abstract": "^1.20.4"
-+ },
-+ "engines": {
-+ "node": ">= 0.4"
-+ }
-+ },
-+ "node_modules/object.fromentries": {
-+ "version": "2.0.6",
-+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz",
-+ "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==",
-+ "dependencies": {
-+ "call-bind": "^1.0.2",
-+ "define-properties": "^1.1.4",
-+ "es-abstract": "^1.20.4"
-+ },
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/object.hasown": {
-+ "version": "1.1.2",
-+ "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz",
-+ "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==",
-+ "dependencies": {
-+ "define-properties": "^1.1.4",
-+ "es-abstract": "^1.20.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/object.values": {
-+ "version": "1.1.6",
-+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz",
-+ "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==",
-+ "dependencies": {
-+ "call-bind": "^1.0.2",
-+ "define-properties": "^1.1.4",
-+ "es-abstract": "^1.20.4"
-+ },
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/once": {
-+ "version": "1.4.0",
-+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
-+ "dependencies": {
-+ "wrappy": "1"
-+ }
-+ },
-+ "node_modules/open": {
-+ "version": "8.4.0",
-+ "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
-+ "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
-+ "dependencies": {
-+ "define-lazy-prop": "^2.0.0",
-+ "is-docker": "^2.1.1",
-+ "is-wsl": "^2.2.0"
-+ },
-+ "engines": {
-+ "node": ">=12"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/sindresorhus"
-+ }
-+ },
-+ "node_modules/optionator": {
-+ "version": "0.9.1",
-+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
-+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
-+ "dependencies": {
-+ "deep-is": "^0.1.3",
-+ "fast-levenshtein": "^2.0.6",
-+ "levn": "^0.4.1",
-+ "prelude-ls": "^1.2.1",
-+ "type-check": "^0.4.0",
-+ "word-wrap": "^1.2.3"
-+ },
-+ "engines": {
-+ "node": ">= 0.8.0"
-+ }
-+ },
-+ "node_modules/p-limit": {
-+ "version": "3.1.0",
-+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
-+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
-+ "dependencies": {
-+ "yocto-queue": "^0.1.0"
-+ },
-+ "engines": {
-+ "node": ">=10"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/sindresorhus"
-+ }
-+ },
-+ "node_modules/p-locate": {
-+ "version": "5.0.0",
-+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
-+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
-+ "dependencies": {
-+ "p-limit": "^3.0.2"
-+ },
-+ "engines": {
-+ "node": ">=10"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/sindresorhus"
-+ }
-+ },
-+ "node_modules/parent-module": {
-+ "version": "1.0.1",
-+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
-+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
-+ "dependencies": {
-+ "callsites": "^3.0.0"
-+ },
-+ "engines": {
-+ "node": ">=6"
-+ }
-+ },
-+ "node_modules/path-exists": {
-+ "version": "4.0.0",
-+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-+ "engines": {
-+ "node": ">=8"
-+ }
-+ },
-+ "node_modules/path-is-absolute": {
-+ "version": "1.0.1",
-+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
-+ "engines": {
-+ "node": ">=0.10.0"
-+ }
-+ },
-+ "node_modules/path-key": {
-+ "version": "3.1.1",
-+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-+ "engines": {
-+ "node": ">=8"
-+ }
-+ },
-+ "node_modules/path-parse": {
-+ "version": "1.0.7",
-+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
-+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
-+ },
-+ "node_modules/path-type": {
-+ "version": "4.0.0",
-+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-+ "engines": {
-+ "node": ">=8"
-+ }
-+ },
-+ "node_modules/picocolors": {
-+ "version": "1.0.0",
-+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
-+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
-+ },
-+ "node_modules/picomatch": {
-+ "version": "2.3.1",
-+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-+ "engines": {
-+ "node": ">=8.6"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/jonschlinkert"
-+ }
-+ },
-+ "node_modules/postcss": {
-+ "version": "8.4.14",
-+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
-+ "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
-+ "funding": [
-+ {
-+ "type": "opencollective",
-+ "url": "https://opencollective.com/postcss/"
-+ },
-+ {
-+ "type": "tidelift",
-+ "url": "https://tidelift.com/funding/github/npm/postcss"
-+ }
-+ ],
-+ "dependencies": {
-+ "nanoid": "^3.3.4",
-+ "picocolors": "^1.0.0",
-+ "source-map-js": "^1.0.2"
-+ },
-+ "engines": {
-+ "node": "^10 || ^12 || >=14"
-+ }
-+ },
-+ "node_modules/prelude-ls": {
-+ "version": "1.2.1",
-+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
-+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
-+ "engines": {
-+ "node": ">= 0.8.0"
-+ }
-+ },
-+ "node_modules/prettier": {
-+ "version": "2.8.1",
-+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz",
-+ "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==",
-+ "dev": true,
-+ "bin": {
-+ "prettier": "bin-prettier.js"
-+ },
-+ "engines": {
-+ "node": ">=10.13.0"
-+ },
-+ "funding": {
-+ "url": "https://github.com/prettier/prettier?sponsor=1"
-+ }
-+ },
-+ "node_modules/prop-types": {
-+ "version": "15.8.1",
-+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
-+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
-+ "dependencies": {
-+ "loose-envify": "^1.4.0",
-+ "object-assign": "^4.1.1",
-+ "react-is": "^16.13.1"
-+ }
-+ },
-+ "node_modules/punycode": {
-+ "version": "2.1.1",
-+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
-+ "engines": {
-+ "node": ">=6"
-+ }
-+ },
-+ "node_modules/queue-microtask": {
-+ "version": "1.2.3",
-+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
-+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
-+ "funding": [
-+ {
-+ "type": "github",
-+ "url": "https://github.com/sponsors/feross"
-+ },
-+ {
-+ "type": "patreon",
-+ "url": "https://www.patreon.com/feross"
-+ },
-+ {
-+ "type": "consulting",
-+ "url": "https://feross.org/support"
-+ }
-+ ]
-+ },
-+ "node_modules/react": {
-+ "version": "18.2.0",
-+ "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
-+ "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
-+ "dependencies": {
-+ "loose-envify": "^1.1.0"
-+ },
-+ "engines": {
-+ "node": ">=0.10.0"
-+ }
-+ },
-+ "node_modules/react-dom": {
-+ "version": "18.2.0",
-+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
-+ "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
-+ "dependencies": {
-+ "loose-envify": "^1.1.0",
-+ "scheduler": "^0.23.0"
-+ },
-+ "peerDependencies": {
-+ "react": "^18.2.0"
-+ }
-+ },
-+ "node_modules/react-is": {
-+ "version": "16.13.1",
-+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
-+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
-+ },
-+ "node_modules/regenerator-runtime": {
-+ "version": "0.13.11",
-+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
-+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
-+ },
-+ "node_modules/regexp.prototype.flags": {
-+ "version": "1.4.3",
-+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
-+ "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
-+ "dependencies": {
-+ "call-bind": "^1.0.2",
-+ "define-properties": "^1.1.3",
-+ "functions-have-names": "^1.2.2"
-+ },
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/regexpp": {
-+ "version": "3.2.0",
-+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
-+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
-+ "engines": {
-+ "node": ">=8"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/mysticatea"
-+ }
-+ },
-+ "node_modules/resolve": {
-+ "version": "1.22.1",
-+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
-+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
-+ "dependencies": {
-+ "is-core-module": "^2.9.0",
-+ "path-parse": "^1.0.7",
-+ "supports-preserve-symlinks-flag": "^1.0.0"
-+ },
-+ "bin": {
-+ "resolve": "bin/resolve"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/resolve-from": {
-+ "version": "4.0.0",
-+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
-+ "engines": {
-+ "node": ">=4"
-+ }
-+ },
-+ "node_modules/reusify": {
-+ "version": "1.0.4",
-+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
-+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
-+ "engines": {
-+ "iojs": ">=1.0.0",
-+ "node": ">=0.10.0"
-+ }
-+ },
-+ "node_modules/rimraf": {
-+ "version": "3.0.2",
-+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-+ "dependencies": {
-+ "glob": "^7.1.3"
-+ },
-+ "bin": {
-+ "rimraf": "bin.js"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/isaacs"
-+ }
-+ },
-+ "node_modules/run-parallel": {
-+ "version": "1.2.0",
-+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
-+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
-+ "funding": [
-+ {
-+ "type": "github",
-+ "url": "https://github.com/sponsors/feross"
-+ },
-+ {
-+ "type": "patreon",
-+ "url": "https://www.patreon.com/feross"
-+ },
-+ {
-+ "type": "consulting",
-+ "url": "https://feross.org/support"
-+ }
-+ ],
-+ "dependencies": {
-+ "queue-microtask": "^1.2.2"
-+ }
-+ },
-+ "node_modules/safe-regex-test": {
-+ "version": "1.0.0",
-+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
-+ "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
-+ "dependencies": {
-+ "call-bind": "^1.0.2",
-+ "get-intrinsic": "^1.1.3",
-+ "is-regex": "^1.1.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/scheduler": {
-+ "version": "0.23.0",
-+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
-+ "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
-+ "dependencies": {
-+ "loose-envify": "^1.1.0"
-+ }
-+ },
-+ "node_modules/semver": {
-+ "version": "7.3.8",
-+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
-+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
-+ "dependencies": {
-+ "lru-cache": "^6.0.0"
-+ },
-+ "bin": {
-+ "semver": "bin/semver.js"
-+ },
-+ "engines": {
-+ "node": ">=10"
-+ }
-+ },
-+ "node_modules/shebang-command": {
-+ "version": "2.0.0",
-+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-+ "dependencies": {
-+ "shebang-regex": "^3.0.0"
-+ },
-+ "engines": {
-+ "node": ">=8"
-+ }
-+ },
-+ "node_modules/shebang-regex": {
-+ "version": "3.0.0",
-+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-+ "engines": {
-+ "node": ">=8"
-+ }
-+ },
-+ "node_modules/side-channel": {
-+ "version": "1.0.4",
-+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
-+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
-+ "dependencies": {
-+ "call-bind": "^1.0.0",
-+ "get-intrinsic": "^1.0.2",
-+ "object-inspect": "^1.9.0"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/slash": {
-+ "version": "3.0.0",
-+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-+ "engines": {
-+ "node": ">=8"
-+ }
-+ },
-+ "node_modules/source-map-js": {
-+ "version": "1.0.2",
-+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
-+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
-+ "engines": {
-+ "node": ">=0.10.0"
-+ }
-+ },
-+ "node_modules/string.prototype.matchall": {
-+ "version": "4.0.8",
-+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz",
-+ "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==",
-+ "dependencies": {
-+ "call-bind": "^1.0.2",
-+ "define-properties": "^1.1.4",
-+ "es-abstract": "^1.20.4",
-+ "get-intrinsic": "^1.1.3",
-+ "has-symbols": "^1.0.3",
-+ "internal-slot": "^1.0.3",
-+ "regexp.prototype.flags": "^1.4.3",
-+ "side-channel": "^1.0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/string.prototype.trimend": {
-+ "version": "1.0.6",
-+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz",
-+ "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==",
-+ "dependencies": {
-+ "call-bind": "^1.0.2",
-+ "define-properties": "^1.1.4",
-+ "es-abstract": "^1.20.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/string.prototype.trimstart": {
-+ "version": "1.0.6",
-+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz",
-+ "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==",
-+ "dependencies": {
-+ "call-bind": "^1.0.2",
-+ "define-properties": "^1.1.4",
-+ "es-abstract": "^1.20.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/strip-ansi": {
-+ "version": "6.0.1",
-+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-+ "dependencies": {
-+ "ansi-regex": "^5.0.1"
-+ },
-+ "engines": {
-+ "node": ">=8"
-+ }
-+ },
-+ "node_modules/strip-bom": {
-+ "version": "3.0.0",
-+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
-+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
-+ "engines": {
-+ "node": ">=4"
-+ }
-+ },
-+ "node_modules/strip-json-comments": {
-+ "version": "3.1.1",
-+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
-+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
-+ "engines": {
-+ "node": ">=8"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/sindresorhus"
-+ }
-+ },
-+ "node_modules/styled-jsx": {
-+ "version": "5.1.1",
-+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz",
-+ "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==",
-+ "dependencies": {
-+ "client-only": "0.0.1"
-+ },
-+ "engines": {
-+ "node": ">= 12.0.0"
-+ },
-+ "peerDependencies": {
-+ "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0"
-+ },
-+ "peerDependenciesMeta": {
-+ "@babel/core": {
-+ "optional": true
-+ },
-+ "babel-plugin-macros": {
-+ "optional": true
-+ }
-+ }
-+ },
-+ "node_modules/supports-color": {
-+ "version": "7.2.0",
-+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-+ "dependencies": {
-+ "has-flag": "^4.0.0"
-+ },
-+ "engines": {
-+ "node": ">=8"
-+ }
-+ },
-+ "node_modules/supports-preserve-symlinks-flag": {
-+ "version": "1.0.0",
-+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
-+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
-+ "engines": {
-+ "node": ">= 0.4"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/synckit": {
-+ "version": "0.8.4",
-+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.4.tgz",
-+ "integrity": "sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==",
-+ "dependencies": {
-+ "@pkgr/utils": "^2.3.1",
-+ "tslib": "^2.4.0"
-+ },
-+ "engines": {
-+ "node": "^14.18.0 || >=16.0.0"
-+ },
-+ "funding": {
-+ "url": "https://opencollective.com/unts"
-+ }
-+ },
-+ "node_modules/tapable": {
-+ "version": "2.2.1",
-+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
-+ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
-+ "engines": {
-+ "node": ">=6"
-+ }
-+ },
-+ "node_modules/text-table": {
-+ "version": "0.2.0",
-+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="
-+ },
-+ "node_modules/tiny-glob": {
-+ "version": "0.2.9",
-+ "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz",
-+ "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==",
-+ "dependencies": {
-+ "globalyzer": "0.1.0",
-+ "globrex": "^0.1.2"
-+ }
-+ },
-+ "node_modules/to-regex-range": {
-+ "version": "5.0.1",
-+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-+ "dependencies": {
-+ "is-number": "^7.0.0"
-+ },
-+ "engines": {
-+ "node": ">=8.0"
-+ }
-+ },
-+ "node_modules/tsconfig-paths": {
-+ "version": "3.14.1",
-+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz",
-+ "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==",
-+ "dependencies": {
-+ "@types/json5": "^0.0.29",
-+ "json5": "^1.0.1",
-+ "minimist": "^1.2.6",
-+ "strip-bom": "^3.0.0"
-+ }
-+ },
-+ "node_modules/tslib": {
-+ "version": "2.4.1",
-+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
-+ "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
-+ },
-+ "node_modules/tsutils": {
-+ "version": "3.21.0",
-+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
-+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
-+ "dependencies": {
-+ "tslib": "^1.8.1"
-+ },
-+ "engines": {
-+ "node": ">= 6"
-+ },
-+ "peerDependencies": {
-+ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
-+ }
-+ },
-+ "node_modules/tsutils/node_modules/tslib": {
-+ "version": "1.14.1",
-+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
-+ },
-+ "node_modules/type-check": {
-+ "version": "0.4.0",
-+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
-+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
-+ "dependencies": {
-+ "prelude-ls": "^1.2.1"
-+ },
-+ "engines": {
-+ "node": ">= 0.8.0"
-+ }
-+ },
-+ "node_modules/type-fest": {
-+ "version": "0.20.2",
-+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
-+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
-+ "engines": {
-+ "node": ">=10"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/sindresorhus"
-+ }
-+ },
-+ "node_modules/typescript": {
-+ "version": "4.9.4",
-+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz",
-+ "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==",
-+ "bin": {
-+ "tsc": "bin/tsc",
-+ "tsserver": "bin/tsserver"
-+ },
-+ "engines": {
-+ "node": ">=4.2.0"
-+ }
-+ },
-+ "node_modules/unbox-primitive": {
-+ "version": "1.0.2",
-+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
-+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
-+ "dependencies": {
-+ "call-bind": "^1.0.2",
-+ "has-bigints": "^1.0.2",
-+ "has-symbols": "^1.0.3",
-+ "which-boxed-primitive": "^1.0.2"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/uri-js": {
-+ "version": "4.4.1",
-+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
-+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
-+ "dependencies": {
-+ "punycode": "^2.1.0"
-+ }
-+ },
-+ "node_modules/which": {
-+ "version": "2.0.2",
-+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-+ "dependencies": {
-+ "isexe": "^2.0.0"
-+ },
-+ "bin": {
-+ "node-which": "bin/node-which"
-+ },
-+ "engines": {
-+ "node": ">= 8"
-+ }
-+ },
-+ "node_modules/which-boxed-primitive": {
-+ "version": "1.0.2",
-+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
-+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
-+ "dependencies": {
-+ "is-bigint": "^1.0.1",
-+ "is-boolean-object": "^1.1.0",
-+ "is-number-object": "^1.0.4",
-+ "is-string": "^1.0.5",
-+ "is-symbol": "^1.0.3"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/ljharb"
-+ }
-+ },
-+ "node_modules/word-wrap": {
-+ "version": "1.2.3",
-+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
-+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
-+ "engines": {
-+ "node": ">=0.10.0"
-+ }
-+ },
-+ "node_modules/wrappy": {
-+ "version": "1.0.2",
-+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
-+ },
-+ "node_modules/yallist": {
-+ "version": "4.0.0",
-+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
-+ },
-+ "node_modules/yocto-queue": {
-+ "version": "0.1.0",
-+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
-+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
-+ "engines": {
-+ "node": ">=10"
-+ },
-+ "funding": {
-+ "url": "https://github.com/sponsors/sindresorhus"
-+ }
-+ }
-+ }
-+}
-diff --git a/js/test/nextjs/package.json b/js/test/nextjs/package.json
-new file mode 100644
-index 0000000..f57e111
---- /dev/null
-+++ b/js/test/nextjs/package.json
-@@ -0,0 +1,28 @@
-+{
-+ "name": "shine-nextjs-test-app",
-+ "version": "0.1.0",
-+ "private": true,
-+ "scripts": {
-+ "dev": "next dev",
-+ "lint": "next lint --fix",
-+ "build": "next build && next export && touch out/.nojekyll",
-+ "format": "prettier '**/*.{ts,tsx,js,jsx}' --write",
-+ "typecheck": "tsc --noEmit"
-+ },
-+ "dependencies": {
-+ "@next/font": "13.1.1",
-+ "@toots/shine.js": "file:../..",
-+ "@types/node": "18.11.18",
-+ "@types/react": "18.0.26",
-+ "@types/react-dom": "18.0.10",
-+ "eslint": "8.31.0",
-+ "eslint-config-next": "13.1.1",
-+ "next": "13.1.1",
-+ "react": "18.2.0",
-+ "react-dom": "18.2.0",
-+ "typescript": "4.9.4"
-+ },
-+ "devDependencies": {
-+ "prettier": "^2.8.1"
-+ }
-+}
-diff --git a/js/test/nextjs/pages/index.tsx b/js/test/nextjs/pages/index.tsx
-new file mode 100644
-index 0000000..4bf771a
---- /dev/null
-+++ b/js/test/nextjs/pages/index.tsx
-@@ -0,0 +1,50 @@
-+import { Fragment, useEffect, useState, useCallback } from "react"
-+import { runEncodeTest } from "@shine/lib/encode"
-+import { runRoundsTest } from "@shine/lib/rounds"
-+
-+const logEntries: string[] = []
-+let encoderStarted = false
-+
-+export default function Home() {
-+ const [logs, setLogs] = useState(logEntries)
-+ const [encodedBlobUrl, setEncodedBlobUrl] = useState<string | undefined>()
-+
-+ const log = useCallback(
-+ (entry: string) => {
-+ logEntries.push(entry)
-+ setLogs(logEntries)
-+ },
-+ [setLogs]
-+ )
-+
-+ useEffect(() => {
-+ if (encoderStarted) return
-+
-+ runEncodeTest(log, blob => {
-+ if (!encodedBlobUrl) setEncodedBlobUrl(URL.createObjectURL(blob))
-+
-+ log("")
-+ runRoundsTest(log)
-+ })
-+
-+ encoderStarted = true
-+ }, [log, encodedBlobUrl, setEncodedBlobUrl])
-+
-+ return (
-+ <>
-+ {encodedBlobUrl && (
-+ <a href={encodedBlobUrl} download='encoded.mp3'>
-+ Download encoded file
-+ </a>
-+ )}
-+ <div>
-+ {logs.map(entry => (
-+ <Fragment key={entry}>
-+ {entry}
-+ <br />
-+ </Fragment>
-+ ))}
-+ </div>
-+ </>
-+ )
-+}
-diff --git a/js/test/nextjs/pnpm-lock.yaml b/js/test/nextjs/pnpm-lock.yaml
-new file mode 100644
-index 0000000..562cc68
---- /dev/null
-+++ b/js/test/nextjs/pnpm-lock.yaml
-@@ -0,0 +1,2032 @@
-+lockfileVersion: 5.4
-+
-+specifiers:
-+ '@next/font': 13.1.1
-+ '@toots/shine.js': file:../..
-+ '@types/node': 18.11.18
-+ '@types/react': 18.0.26
-+ '@types/react-dom': 18.0.10
-+ eslint: 8.31.0
-+ eslint-config-next: 13.1.1
-+ next: 13.1.1
-+ prettier: ^2.8.1
-+ react: 18.2.0
-+ react-dom: 18.2.0
-+ typescript: 4.9.4
-+
-+dependencies:
-+ '@next/font': 13.1.1
-+ '@toots/shine.js': file:../..
-+ '@types/node': 18.11.18
-+ '@types/react': 18.0.26
-+ '@types/react-dom': 18.0.10
-+ eslint: 8.31.0
-+ eslint-config-next: 13.1.1_iukboom6ndih5an6iafl45j2fe
-+ next: 13.1.1_biqbaboplfbrettd7655fr4n2y
-+ react: 18.2.0
-+ react-dom: 18.2.0_react@18.2.0
-+ typescript: 4.9.4
-+
-+devDependencies:
-+ prettier: 2.8.1
-+
-+packages:
-+
-+ /@babel/runtime-corejs3/7.20.7:
-+ resolution: {integrity: sha512-jr9lCZ4RbRQmCR28Q8U8Fu49zvFqLxTY9AMOUz+iyMohMoAgpEcVxY+wJNay99oXOpOcCTODkk70NDN2aaJEeg==}
-+ engines: {node: '>=6.9.0'}
-+ dependencies:
-+ core-js-pure: 3.27.1
-+ regenerator-runtime: 0.13.11
-+ dev: false
-+
-+ /@babel/runtime/7.20.7:
-+ resolution: {integrity: sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==}
-+ engines: {node: '>=6.9.0'}
-+ dependencies:
-+ regenerator-runtime: 0.13.11
-+ dev: false
-+
-+ /@eslint/eslintrc/1.4.1:
-+ resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==}
-+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-+ dependencies:
-+ ajv: 6.12.6
-+ debug: 4.3.4
-+ espree: 9.4.1
-+ globals: 13.19.0
-+ ignore: 5.2.4
-+ import-fresh: 3.3.0
-+ js-yaml: 4.1.0
-+ minimatch: 3.1.2
-+ strip-json-comments: 3.1.1
-+ transitivePeerDependencies:
-+ - supports-color
-+ dev: false
-+
-+ /@humanwhocodes/config-array/0.11.8:
-+ resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==}
-+ engines: {node: '>=10.10.0'}
-+ dependencies:
-+ '@humanwhocodes/object-schema': 1.2.1
-+ debug: 4.3.4
-+ minimatch: 3.1.2
-+ transitivePeerDependencies:
-+ - supports-color
-+ dev: false
-+
-+ /@humanwhocodes/module-importer/1.0.1:
-+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
-+ engines: {node: '>=12.22'}
-+ dev: false
-+
-+ /@humanwhocodes/object-schema/1.2.1:
-+ resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
-+ dev: false
-+
-+ /@next/env/13.1.1:
-+ resolution: {integrity: sha512-vFMyXtPjSAiOXOywMojxfKIqE3VWN5RCAx+tT3AS3pcKjMLFTCJFUWsKv8hC+87Z1F4W3r68qTwDFZIFmd5Xkw==}
-+ dev: false
-+
-+ /@next/eslint-plugin-next/13.1.1:
-+ resolution: {integrity: sha512-SBrOFS8PC3nQ5aeZmawJkjKkWjwK9RoxvBSv/86nZp0ubdoVQoko8r8htALd9ufp16NhacCdqhu9bzZLDWtALQ==}
-+ dependencies:
-+ glob: 7.1.7
-+ dev: false
-+
-+ /@next/font/13.1.1:
-+ resolution: {integrity: sha512-amygRorS05hYK1/XQRZo5qBl7l2fpHnezeKU/cNveWU5QJg+sg8gMGkUXHtvesNKpiKIJshBRH1TzvO+2sKpvQ==}
-+ dev: false
-+
-+ /@next/swc-android-arm-eabi/13.1.1:
-+ resolution: {integrity: sha512-qnFCx1kT3JTWhWve4VkeWuZiyjG0b5T6J2iWuin74lORCupdrNukxkq9Pm+Z7PsatxuwVJMhjUoYz7H4cWzx2A==}
-+ engines: {node: '>= 10'}
-+ cpu: [arm]
-+ os: [android]
-+ requiresBuild: true
-+ dev: false
-+ optional: true
-+
-+ /@next/swc-android-arm64/13.1.1:
-+ resolution: {integrity: sha512-eCiZhTzjySubNqUnNkQCjU3Fh+ep3C6b5DCM5FKzsTH/3Gr/4Y7EiaPZKILbvnXmhWtKPIdcY6Zjx51t4VeTfA==}
-+ engines: {node: '>= 10'}
-+ cpu: [arm64]
-+ os: [android]
-+ requiresBuild: true
-+ dev: false
-+ optional: true
-+
-+ /@next/swc-darwin-arm64/13.1.1:
-+ resolution: {integrity: sha512-9zRJSSIwER5tu9ADDkPw5rIZ+Np44HTXpYMr0rkM656IvssowPxmhK0rTreC1gpUCYwFsRbxarUJnJsTWiutPg==}
-+ engines: {node: '>= 10'}
-+ cpu: [arm64]
-+ os: [darwin]
-+ requiresBuild: true
-+ dev: false
-+ optional: true
-+
-+ /@next/swc-darwin-x64/13.1.1:
-+ resolution: {integrity: sha512-qWr9qEn5nrnlhB0rtjSdR00RRZEtxg4EGvicIipqZWEyayPxhUu6NwKiG8wZiYZCLfJ5KWr66PGSNeDMGlNaiA==}
-+ engines: {node: '>= 10'}
-+ cpu: [x64]
-+ os: [darwin]
-+ requiresBuild: true
-+ dev: false
-+ optional: true
-+
-+ /@next/swc-freebsd-x64/13.1.1:
-+ resolution: {integrity: sha512-UwP4w/NcQ7V/VJEj3tGVszgb4pyUCt3lzJfUhjDMUmQbzG9LDvgiZgAGMYH6L21MoyAATJQPDGiAMWAPKsmumA==}
-+ engines: {node: '>= 10'}
-+ cpu: [x64]
-+ os: [freebsd]
-+ requiresBuild: true
-+ dev: false
-+ optional: true
-+
-+ /@next/swc-linux-arm-gnueabihf/13.1.1:
-+ resolution: {integrity: sha512-CnsxmKHco9sosBs1XcvCXP845Db+Wx1G0qouV5+Gr+HT/ZlDYEWKoHVDgnJXLVEQzq4FmHddBNGbXvgqM1Gfkg==}
-+ engines: {node: '>= 10'}
-+ cpu: [arm]
-+ os: [linux]
-+ requiresBuild: true
-+ dev: false
-+ optional: true
-+
-+ /@next/swc-linux-arm64-gnu/13.1.1:
-+ resolution: {integrity: sha512-JfDq1eri5Dif+VDpTkONRd083780nsMCOKoFG87wA0sa4xL8LGcXIBAkUGIC1uVy9SMsr2scA9CySLD/i+Oqiw==}
-+ engines: {node: '>= 10'}
-+ cpu: [arm64]
-+ os: [linux]
-+ requiresBuild: true
-+ dev: false
-+ optional: true
-+
-+ /@next/swc-linux-arm64-musl/13.1.1:
-+ resolution: {integrity: sha512-GA67ZbDq2AW0CY07zzGt07M5b5Yaq5qUpFIoW3UFfjOPgb0Sqf3DAW7GtFMK1sF4ROHsRDMGQ9rnT0VM2dVfKA==}
-+ engines: {node: '>= 10'}
-+ cpu: [arm64]
-+ os: [linux]
-+ requiresBuild: true
-+ dev: false
-+ optional: true
-+
-+ /@next/swc-linux-x64-gnu/13.1.1:
-+ resolution: {integrity: sha512-nnjuBrbzvqaOJaV+XgT8/+lmXrSCOt1YYZn/irbDb2fR2QprL6Q7WJNgwsZNxiLSfLdv+2RJGGegBx9sLBEzGA==}
-+ engines: {node: '>= 10'}
-+ cpu: [x64]
-+ os: [linux]
-+ requiresBuild: true
-+ dev: false
-+ optional: true
-+
-+ /@next/swc-linux-x64-musl/13.1.1:
-+ resolution: {integrity: sha512-CM9xnAQNIZ8zf/igbIT/i3xWbQZYaF397H+JroF5VMOCUleElaMdQLL5riJml8wUfPoN3dtfn2s4peSr3azz/g==}
-+ engines: {node: '>= 10'}
-+ cpu: [x64]
-+ os: [linux]
-+ requiresBuild: true
-+ dev: false
-+ optional: true
-+
-+ /@next/swc-win32-arm64-msvc/13.1.1:
-+ resolution: {integrity: sha512-pzUHOGrbgfGgPlOMx9xk3QdPJoRPU+om84hqVoe6u+E0RdwOG0Ho/2UxCgDqmvpUrMab1Deltlt6RqcXFpnigQ==}
-+ engines: {node: '>= 10'}
-+ cpu: [arm64]
-+ os: [win32]
-+ requiresBuild: true
-+ dev: false
-+ optional: true
-+
-+ /@next/swc-win32-ia32-msvc/13.1.1:
-+ resolution: {integrity: sha512-WeX8kVS46aobM9a7Xr/kEPcrTyiwJqQv/tbw6nhJ4fH9xNZ+cEcyPoQkwPo570dCOLz3Zo9S2q0E6lJ/EAUOBg==}
-+ engines: {node: '>= 10'}
-+ cpu: [ia32]
-+ os: [win32]
-+ requiresBuild: true
-+ dev: false
-+ optional: true
-+
-+ /@next/swc-win32-x64-msvc/13.1.1:
-+ resolution: {integrity: sha512-mVF0/3/5QAc5EGVnb8ll31nNvf3BWpPY4pBb84tk+BfQglWLqc5AC9q1Ht/YMWiEgs8ALNKEQ3GQnbY0bJF2Gg==}
-+ engines: {node: '>= 10'}
-+ cpu: [x64]
-+ os: [win32]
-+ requiresBuild: true
-+ dev: false
-+ optional: true
-+
-+ /@nodelib/fs.scandir/2.1.5:
-+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
-+ engines: {node: '>= 8'}
-+ dependencies:
-+ '@nodelib/fs.stat': 2.0.5
-+ run-parallel: 1.2.0
-+ dev: false
-+
-+ /@nodelib/fs.stat/2.0.5:
-+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
-+ engines: {node: '>= 8'}
-+ dev: false
-+
-+ /@nodelib/fs.walk/1.2.8:
-+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
-+ engines: {node: '>= 8'}
-+ dependencies:
-+ '@nodelib/fs.scandir': 2.1.5
-+ fastq: 1.14.0
-+ dev: false
-+
-+ /@pkgr/utils/2.3.1:
-+ resolution: {integrity: sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==}
-+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
-+ dependencies:
-+ cross-spawn: 7.0.3
-+ is-glob: 4.0.3
-+ open: 8.4.0
-+ picocolors: 1.0.0
-+ tiny-glob: 0.2.9
-+ tslib: 2.4.1
-+ dev: false
-+
-+ /@rushstack/eslint-patch/1.2.0:
-+ resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==}
-+ dev: false
-+
-+ /@swc/helpers/0.4.14:
-+ resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==}
-+ dependencies:
-+ tslib: 2.4.1
-+ dev: false
-+
-+ /@types/json5/0.0.29:
-+ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
-+ dev: false
-+
-+ /@types/node/18.11.18:
-+ resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==}
-+ dev: false
-+
-+ /@types/prop-types/15.7.5:
-+ resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
-+ dev: false
-+
-+ /@types/react-dom/18.0.10:
-+ resolution: {integrity: sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==}
-+ dependencies:
-+ '@types/react': 18.0.26
-+ dev: false
-+
-+ /@types/react/18.0.26:
-+ resolution: {integrity: sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==}
-+ dependencies:
-+ '@types/prop-types': 15.7.5
-+ '@types/scheduler': 0.16.2
-+ csstype: 3.1.1
-+ dev: false
-+
-+ /@types/scheduler/0.16.2:
-+ resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==}
-+ dev: false
-+
-+ /@typescript-eslint/parser/5.47.1_iukboom6ndih5an6iafl45j2fe:
-+ resolution: {integrity: sha512-9Vb+KIv29r6GPu4EboWOnQM7T+UjpjXvjCPhNORlgm40a9Ia9bvaPJswvtae1gip2QEeVeGh6YquqAzEgoRAlw==}
-+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-+ peerDependencies:
-+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
-+ typescript: '*'
-+ peerDependenciesMeta:
-+ typescript:
-+ optional: true
-+ dependencies:
-+ '@typescript-eslint/scope-manager': 5.47.1
-+ '@typescript-eslint/types': 5.47.1
-+ '@typescript-eslint/typescript-estree': 5.47.1_typescript@4.9.4
-+ debug: 4.3.4
-+ eslint: 8.31.0
-+ typescript: 4.9.4
-+ transitivePeerDependencies:
-+ - supports-color
-+ dev: false
-+
-+ /@typescript-eslint/scope-manager/5.47.1:
-+ resolution: {integrity: sha512-9hsFDsgUwrdOoW1D97Ewog7DYSHaq4WKuNs0LHF9RiCmqB0Z+XRR4Pf7u7u9z/8CciHuJ6yxNws1XznI3ddjEw==}
-+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-+ dependencies:
-+ '@typescript-eslint/types': 5.47.1
-+ '@typescript-eslint/visitor-keys': 5.47.1
-+ dev: false
-+
-+ /@typescript-eslint/types/5.47.1:
-+ resolution: {integrity: sha512-CmALY9YWXEpwuu6377ybJBZdtSAnzXLSQcxLSqSQSbC7VfpMu/HLVdrnVJj7ycI138EHqocW02LPJErE35cE9A==}
-+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-+ dev: false
-+
-+ /@typescript-eslint/typescript-estree/5.47.1_typescript@4.9.4:
-+ resolution: {integrity: sha512-4+ZhFSuISAvRi2xUszEj0xXbNTHceV9GbH9S8oAD2a/F9SW57aJNQVOCxG8GPfSWH/X4eOPdMEU2jYVuWKEpWA==}
-+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-+ peerDependencies:
-+ typescript: '*'
-+ peerDependenciesMeta:
-+ typescript:
-+ optional: true
-+ dependencies:
-+ '@typescript-eslint/types': 5.47.1
-+ '@typescript-eslint/visitor-keys': 5.47.1
-+ debug: 4.3.4
-+ globby: 11.1.0
-+ is-glob: 4.0.3
-+ semver: 7.3.8
-+ tsutils: 3.21.0_typescript@4.9.4
-+ typescript: 4.9.4
-+ transitivePeerDependencies:
-+ - supports-color
-+ dev: false
-+
-+ /@typescript-eslint/visitor-keys/5.47.1:
-+ resolution: {integrity: sha512-rF3pmut2JCCjh6BLRhNKdYjULMb1brvoaiWDlHfLNVgmnZ0sBVJrs3SyaKE1XoDDnJuAx/hDQryHYmPUuNq0ig==}
-+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-+ dependencies:
-+ '@typescript-eslint/types': 5.47.1
-+ eslint-visitor-keys: 3.3.0
-+ dev: false
-+
-+ /acorn-jsx/5.3.2_acorn@8.8.1:
-+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
-+ peerDependencies:
-+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
-+ dependencies:
-+ acorn: 8.8.1
-+ dev: false
-+
-+ /acorn/8.8.1:
-+ resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==}
-+ engines: {node: '>=0.4.0'}
-+ hasBin: true
-+ dev: false
-+
-+ /ajv/6.12.6:
-+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
-+ dependencies:
-+ fast-deep-equal: 3.1.3
-+ fast-json-stable-stringify: 2.1.0
-+ json-schema-traverse: 0.4.1
-+ uri-js: 4.4.1
-+ dev: false
-+
-+ /ansi-regex/5.0.1:
-+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
-+ engines: {node: '>=8'}
-+ dev: false
-+
-+ /ansi-styles/4.3.0:
-+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
-+ engines: {node: '>=8'}
-+ dependencies:
-+ color-convert: 2.0.1
-+ dev: false
-+
-+ /argparse/2.0.1:
-+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
-+ dev: false
-+
-+ /aria-query/4.2.2:
-+ resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==}
-+ engines: {node: '>=6.0'}
-+ dependencies:
-+ '@babel/runtime': 7.20.7
-+ '@babel/runtime-corejs3': 7.20.7
-+ dev: false
-+
-+ /array-includes/3.1.6:
-+ resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==}
-+ engines: {node: '>= 0.4'}
-+ dependencies:
-+ call-bind: 1.0.2
-+ define-properties: 1.1.4
-+ es-abstract: 1.20.5
-+ get-intrinsic: 1.1.3
-+ is-string: 1.0.7
-+ dev: false
-+
-+ /array-union/2.1.0:
-+ resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
-+ engines: {node: '>=8'}
-+ dev: false
-+
-+ /array.prototype.flat/1.3.1:
-+ resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==}
-+ engines: {node: '>= 0.4'}
-+ dependencies:
-+ call-bind: 1.0.2
-+ define-properties: 1.1.4
-+ es-abstract: 1.20.5
-+ es-shim-unscopables: 1.0.0
-+ dev: false
-+
-+ /array.prototype.flatmap/1.3.1:
-+ resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==}
-+ engines: {node: '>= 0.4'}
-+ dependencies:
-+ call-bind: 1.0.2
-+ define-properties: 1.1.4
-+ es-abstract: 1.20.5
-+ es-shim-unscopables: 1.0.0
-+ dev: false
-+
-+ /array.prototype.tosorted/1.1.1:
-+ resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==}
-+ dependencies:
-+ call-bind: 1.0.2
-+ define-properties: 1.1.4
-+ es-abstract: 1.20.5
-+ es-shim-unscopables: 1.0.0
-+ get-intrinsic: 1.1.3
-+ dev: false
-+
-+ /ast-types-flow/0.0.7:
-+ resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==}
-+ dev: false
-+
-+ /axe-core/4.6.1:
-+ resolution: {integrity: sha512-lCZN5XRuOnpG4bpMq8v0khrWtUOn+i8lZSb6wHZH56ZfbIEv6XwJV84AAueh9/zi7qPVJ/E4yz6fmsiyOmXR4w==}
-+ engines: {node: '>=4'}
-+ dev: false
-+
-+ /axobject-query/2.2.0:
-+ resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==}
-+ dev: false
-+
-+ /balanced-match/1.0.2:
-+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
-+ dev: false
-+
-+ /brace-expansion/1.1.11:
-+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
-+ dependencies:
-+ balanced-match: 1.0.2
-+ concat-map: 0.0.1
-+ dev: false
-+
-+ /braces/3.0.2:
-+ resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
-+ engines: {node: '>=8'}
-+ dependencies:
-+ fill-range: 7.0.1
-+ dev: false
-+
-+ /call-bind/1.0.2:
-+ resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
-+ dependencies:
-+ function-bind: 1.1.1
-+ get-intrinsic: 1.1.3
-+ dev: false
-+
-+ /callsites/3.1.0:
-+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
-+ engines: {node: '>=6'}
-+ dev: false
-+
-+ /caniuse-lite/1.0.30001441:
-+ resolution: {integrity: sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==}
-+ dev: false
-+
-+ /chalk/4.1.2:
-+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
-+ engines: {node: '>=10'}
-+ dependencies:
-+ ansi-styles: 4.3.0
-+ supports-color: 7.2.0
-+ dev: false
-+
-+ /client-only/0.0.1:
-+ resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
-+ dev: false
-+
-+ /color-convert/2.0.1:
-+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
-+ engines: {node: '>=7.0.0'}
-+ dependencies:
-+ color-name: 1.1.4
-+ dev: false
-+
-+ /color-name/1.1.4:
-+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
-+ dev: false
-+
-+ /concat-map/0.0.1:
-+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
-+ dev: false
-+
-+ /core-js-pure/3.27.1:
-+ resolution: {integrity: sha512-BS2NHgwwUppfeoqOXqi08mUqS5FiZpuRuJJpKsaME7kJz0xxuk0xkhDdfMIlP/zLa80krBqss1LtD7f889heAw==}
-+ requiresBuild: true
-+ dev: false
-+
-+ /cross-spawn/7.0.3:
-+ resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
-+ engines: {node: '>= 8'}
-+ dependencies:
-+ path-key: 3.1.1
-+ shebang-command: 2.0.0
-+ which: 2.0.2
-+ dev: false
-+
-+ /csstype/3.1.1:
-+ resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==}
-+ dev: false
-+
-+ /damerau-levenshtein/1.0.8:
-+ resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
-+ dev: false
-+
-+ /debug/2.6.9:
-+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
-+ peerDependencies:
-+ supports-color: '*'
-+ peerDependenciesMeta:
-+ supports-color:
-+ optional: true
-+ dependencies:
-+ ms: 2.0.0
-+ dev: false
-+
-+ /debug/3.2.7:
-+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
-+ peerDependencies:
-+ supports-color: '*'
-+ peerDependenciesMeta:
-+ supports-color:
-+ optional: true
-+ dependencies:
-+ ms: 2.1.3
-+ dev: false
-+
-+ /debug/4.3.4:
-+ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
-+ engines: {node: '>=6.0'}
-+ peerDependencies:
-+ supports-color: '*'
-+ peerDependenciesMeta:
-+ supports-color:
-+ optional: true
-+ dependencies:
-+ ms: 2.1.2
-+ dev: false
-+
-+ /deep-is/0.1.4:
-+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
-+ dev: false
-+
-+ /define-lazy-prop/2.0.0:
-+ resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
-+ engines: {node: '>=8'}
-+ dev: false
-+
-+ /define-properties/1.1.4:
-+ resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==}
-+ engines: {node: '>= 0.4'}
-+ dependencies:
-+ has-property-descriptors: 1.0.0
-+ object-keys: 1.1.1
-+ dev: false
-+
-+ /dir-glob/3.0.1:
-+ resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
-+ engines: {node: '>=8'}
-+ dependencies:
-+ path-type: 4.0.0
-+ dev: false
-+
-+ /doctrine/2.1.0:
-+ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
-+ engines: {node: '>=0.10.0'}
-+ dependencies:
-+ esutils: 2.0.3
-+ dev: false
-+
-+ /doctrine/3.0.0:
-+ resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
-+ engines: {node: '>=6.0.0'}
-+ dependencies:
-+ esutils: 2.0.3
-+ dev: false
-+
-+ /emoji-regex/9.2.2:
-+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
-+ dev: false
-+
-+ /enhanced-resolve/5.12.0:
-+ resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==}
-+ engines: {node: '>=10.13.0'}
-+ dependencies:
-+ graceful-fs: 4.2.10
-+ tapable: 2.2.1
-+ dev: false
-+
-+ /es-abstract/1.20.5:
-+ resolution: {integrity: sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==}
-+ engines: {node: '>= 0.4'}
-+ dependencies:
-+ call-bind: 1.0.2
-+ es-to-primitive: 1.2.1
-+ function-bind: 1.1.1
-+ function.prototype.name: 1.1.5
-+ get-intrinsic: 1.1.3
-+ get-symbol-description: 1.0.0
-+ gopd: 1.0.1
-+ has: 1.0.3
-+ has-property-descriptors: 1.0.0
-+ has-symbols: 1.0.3
-+ internal-slot: 1.0.4
-+ is-callable: 1.2.7
-+ is-negative-zero: 2.0.2
-+ is-regex: 1.1.4
-+ is-shared-array-buffer: 1.0.2
-+ is-string: 1.0.7
-+ is-weakref: 1.0.2
-+ object-inspect: 1.12.2
-+ object-keys: 1.1.1
-+ object.assign: 4.1.4
-+ regexp.prototype.flags: 1.4.3
-+ safe-regex-test: 1.0.0
-+ string.prototype.trimend: 1.0.6
-+ string.prototype.trimstart: 1.0.6
-+ unbox-primitive: 1.0.2
-+ dev: false
-+
-+ /es-shim-unscopables/1.0.0:
-+ resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==}
-+ dependencies:
-+ has: 1.0.3
-+ dev: false
-+
-+ /es-to-primitive/1.2.1:
-+ resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
-+ engines: {node: '>= 0.4'}
-+ dependencies:
-+ is-callable: 1.2.7
-+ is-date-object: 1.0.5
-+ is-symbol: 1.0.4
-+ dev: false
-+
-+ /escape-string-regexp/4.0.0:
-+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
-+ engines: {node: '>=10'}
-+ dev: false
-+
-+ /eslint-config-next/13.1.1_iukboom6ndih5an6iafl45j2fe:
-+ resolution: {integrity: sha512-/5S2XGWlGaiqrRhzpn51ux5JUSLwx8PVK2keLi5xk7QmhfYB8PqE6R6SlVw6hgnf/VexvUXSrlNJ/su00NhtHQ==}
-+ peerDependencies:
-+ eslint: ^7.23.0 || ^8.0.0
-+ typescript: '>=3.3.1'
-+ peerDependenciesMeta:
-+ typescript:
-+ optional: true
-+ dependencies:
-+ '@next/eslint-plugin-next': 13.1.1
-+ '@rushstack/eslint-patch': 1.2.0
-+ '@typescript-eslint/parser': 5.47.1_iukboom6ndih5an6iafl45j2fe
-+ eslint: 8.31.0
-+ eslint-import-resolver-node: 0.3.6
-+ eslint-import-resolver-typescript: 3.5.2_ol7jqilc3wemtdbq3nzhywgxq4
-+ eslint-plugin-import: 2.26.0_bpx4furzt4ibermwbsj75osuwi
-+ eslint-plugin-jsx-a11y: 6.6.1_eslint@8.31.0
-+ eslint-plugin-react: 7.31.11_eslint@8.31.0
-+ eslint-plugin-react-hooks: 4.6.0_eslint@8.31.0
-+ typescript: 4.9.4
-+ transitivePeerDependencies:
-+ - eslint-import-resolver-webpack
-+ - supports-color
-+ dev: false
-+
-+ /eslint-import-resolver-node/0.3.6:
-+ resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==}
-+ dependencies:
-+ debug: 3.2.7
-+ resolve: 1.22.1
-+ transitivePeerDependencies:
-+ - supports-color
-+ dev: false
-+
-+ /eslint-import-resolver-typescript/3.5.2_ol7jqilc3wemtdbq3nzhywgxq4:
-+ resolution: {integrity: sha512-zX4ebnnyXiykjhcBvKIf5TNvt8K7yX6bllTRZ14MiurKPjDpCAZujlszTdB8pcNXhZcOf+god4s9SjQa5GnytQ==}
-+ engines: {node: ^14.18.0 || >=16.0.0}
-+ peerDependencies:
-+ eslint: '*'
-+ eslint-plugin-import: '*'
-+ dependencies:
-+ debug: 4.3.4
-+ enhanced-resolve: 5.12.0
-+ eslint: 8.31.0
-+ eslint-plugin-import: 2.26.0_bpx4furzt4ibermwbsj75osuwi
-+ get-tsconfig: 4.2.0
-+ globby: 13.1.3
-+ is-core-module: 2.11.0
-+ is-glob: 4.0.3
-+ synckit: 0.8.4
-+ transitivePeerDependencies:
-+ - supports-color
-+ dev: false
-+
-+ /eslint-module-utils/2.7.4_of6uaipqaoaobv57tu2gvxhnhu:
-+ resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==}
-+ engines: {node: '>=4'}
-+ peerDependencies:
-+ '@typescript-eslint/parser': '*'
-+ eslint: '*'
-+ eslint-import-resolver-node: '*'
-+ eslint-import-resolver-typescript: '*'
-+ eslint-import-resolver-webpack: '*'
-+ peerDependenciesMeta:
-+ '@typescript-eslint/parser':
-+ optional: true
-+ eslint:
-+ optional: true
-+ eslint-import-resolver-node:
-+ optional: true
-+ eslint-import-resolver-typescript:
-+ optional: true
-+ eslint-import-resolver-webpack:
-+ optional: true
-+ dependencies:
-+ '@typescript-eslint/parser': 5.47.1_iukboom6ndih5an6iafl45j2fe
-+ debug: 3.2.7
-+ eslint: 8.31.0
-+ eslint-import-resolver-node: 0.3.6
-+ eslint-import-resolver-typescript: 3.5.2_ol7jqilc3wemtdbq3nzhywgxq4
-+ transitivePeerDependencies:
-+ - supports-color
-+ dev: false
-+
-+ /eslint-plugin-import/2.26.0_bpx4furzt4ibermwbsj75osuwi:
-+ resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==}
-+ engines: {node: '>=4'}
-+ peerDependencies:
-+ '@typescript-eslint/parser': '*'
-+ eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
-+ peerDependenciesMeta:
-+ '@typescript-eslint/parser':
-+ optional: true
-+ dependencies:
-+ '@typescript-eslint/parser': 5.47.1_iukboom6ndih5an6iafl45j2fe
-+ array-includes: 3.1.6
-+ array.prototype.flat: 1.3.1
-+ debug: 2.6.9
-+ doctrine: 2.1.0
-+ eslint: 8.31.0
-+ eslint-import-resolver-node: 0.3.6
-+ eslint-module-utils: 2.7.4_of6uaipqaoaobv57tu2gvxhnhu
-+ has: 1.0.3
-+ is-core-module: 2.11.0
-+ is-glob: 4.0.3
-+ minimatch: 3.1.2
-+ object.values: 1.1.6
-+ resolve: 1.22.1
-+ tsconfig-paths: 3.14.1
-+ transitivePeerDependencies:
-+ - eslint-import-resolver-typescript
-+ - eslint-import-resolver-webpack
-+ - supports-color
-+ dev: false
-+
-+ /eslint-plugin-jsx-a11y/6.6.1_eslint@8.31.0:
-+ resolution: {integrity: sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==}
-+ engines: {node: '>=4.0'}
-+ peerDependencies:
-+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
-+ dependencies:
-+ '@babel/runtime': 7.20.7
-+ aria-query: 4.2.2
-+ array-includes: 3.1.6
-+ ast-types-flow: 0.0.7
-+ axe-core: 4.6.1
-+ axobject-query: 2.2.0
-+ damerau-levenshtein: 1.0.8
-+ emoji-regex: 9.2.2
-+ eslint: 8.31.0
-+ has: 1.0.3
-+ jsx-ast-utils: 3.3.3
-+ language-tags: 1.0.7
-+ minimatch: 3.1.2
-+ semver: 6.3.0
-+ dev: false
-+
-+ /eslint-plugin-react-hooks/4.6.0_eslint@8.31.0:
-+ resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==}
-+ engines: {node: '>=10'}
-+ peerDependencies:
-+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
-+ dependencies:
-+ eslint: 8.31.0
-+ dev: false
-+
-+ /eslint-plugin-react/7.31.11_eslint@8.31.0:
-+ resolution: {integrity: sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw==}
-+ engines: {node: '>=4'}
-+ peerDependencies:
-+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
-+ dependencies:
-+ array-includes: 3.1.6
-+ array.prototype.flatmap: 1.3.1
-+ array.prototype.tosorted: 1.1.1
-+ doctrine: 2.1.0
-+ eslint: 8.31.0
-+ estraverse: 5.3.0
-+ jsx-ast-utils: 3.3.3
-+ minimatch: 3.1.2
-+ object.entries: 1.1.6
-+ object.fromentries: 2.0.6
-+ object.hasown: 1.1.2
-+ object.values: 1.1.6
-+ prop-types: 15.8.1
-+ resolve: 2.0.0-next.4
-+ semver: 6.3.0
-+ string.prototype.matchall: 4.0.8
-+ dev: false
-+
-+ /eslint-scope/7.1.1:
-+ resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==}
-+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-+ dependencies:
-+ esrecurse: 4.3.0
-+ estraverse: 5.3.0
-+ dev: false
-+
-+ /eslint-utils/3.0.0_eslint@8.31.0:
-+ resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
-+ engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
-+ peerDependencies:
-+ eslint: '>=5'
-+ dependencies:
-+ eslint: 8.31.0
-+ eslint-visitor-keys: 2.1.0
-+ dev: false
-+
-+ /eslint-visitor-keys/2.1.0:
-+ resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==}
-+ engines: {node: '>=10'}
-+ dev: false
-+
-+ /eslint-visitor-keys/3.3.0:
-+ resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==}
-+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-+ dev: false
-+
-+ /eslint/8.31.0:
-+ resolution: {integrity: sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==}
-+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-+ hasBin: true
-+ dependencies:
-+ '@eslint/eslintrc': 1.4.1
-+ '@humanwhocodes/config-array': 0.11.8
-+ '@humanwhocodes/module-importer': 1.0.1
-+ '@nodelib/fs.walk': 1.2.8
-+ ajv: 6.12.6
-+ chalk: 4.1.2
-+ cross-spawn: 7.0.3
-+ debug: 4.3.4
-+ doctrine: 3.0.0
-+ escape-string-regexp: 4.0.0
-+ eslint-scope: 7.1.1
-+ eslint-utils: 3.0.0_eslint@8.31.0
-+ eslint-visitor-keys: 3.3.0
-+ espree: 9.4.1
-+ esquery: 1.4.0
-+ esutils: 2.0.3
-+ fast-deep-equal: 3.1.3
-+ file-entry-cache: 6.0.1
-+ find-up: 5.0.0
-+ glob-parent: 6.0.2
-+ globals: 13.19.0
-+ grapheme-splitter: 1.0.4
-+ ignore: 5.2.4
-+ import-fresh: 3.3.0
-+ imurmurhash: 0.1.4
-+ is-glob: 4.0.3
-+ is-path-inside: 3.0.3
-+ js-sdsl: 4.2.0
-+ js-yaml: 4.1.0
-+ json-stable-stringify-without-jsonify: 1.0.1
-+ levn: 0.4.1
-+ lodash.merge: 4.6.2
-+ minimatch: 3.1.2
-+ natural-compare: 1.4.0
-+ optionator: 0.9.1
-+ regexpp: 3.2.0
-+ strip-ansi: 6.0.1
-+ strip-json-comments: 3.1.1
-+ text-table: 0.2.0
-+ transitivePeerDependencies:
-+ - supports-color
-+ dev: false
-+
-+ /espree/9.4.1:
-+ resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==}
-+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-+ dependencies:
-+ acorn: 8.8.1
-+ acorn-jsx: 5.3.2_acorn@8.8.1
-+ eslint-visitor-keys: 3.3.0
-+ dev: false
-+
-+ /esquery/1.4.0:
-+ resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==}
-+ engines: {node: '>=0.10'}
-+ dependencies:
-+ estraverse: 5.3.0
-+ dev: false
-+
-+ /esrecurse/4.3.0:
-+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
-+ engines: {node: '>=4.0'}
-+ dependencies:
-+ estraverse: 5.3.0
-+ dev: false
-+
-+ /estraverse/5.3.0:
-+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
-+ engines: {node: '>=4.0'}
-+ dev: false
-+
-+ /esutils/2.0.3:
-+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
-+ engines: {node: '>=0.10.0'}
-+ dev: false
-+
-+ /fast-deep-equal/3.1.3:
-+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
-+ dev: false
-+
-+ /fast-glob/3.2.12:
-+ resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==}
-+ engines: {node: '>=8.6.0'}
-+ dependencies:
-+ '@nodelib/fs.stat': 2.0.5
-+ '@nodelib/fs.walk': 1.2.8
-+ glob-parent: 5.1.2
-+ merge2: 1.4.1
-+ micromatch: 4.0.5
-+ dev: false
-+
-+ /fast-json-stable-stringify/2.1.0:
-+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
-+ dev: false
-+
-+ /fast-levenshtein/2.0.6:
-+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
-+ dev: false
-+
-+ /fastq/1.14.0:
-+ resolution: {integrity: sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==}
-+ dependencies:
-+ reusify: 1.0.4
-+ dev: false
-+
-+ /file-entry-cache/6.0.1:
-+ resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
-+ engines: {node: ^10.12.0 || >=12.0.0}
-+ dependencies:
-+ flat-cache: 3.0.4
-+ dev: false
-+
-+ /fill-range/7.0.1:
-+ resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
-+ engines: {node: '>=8'}
-+ dependencies:
-+ to-regex-range: 5.0.1
-+ dev: false
-+
-+ /find-up/5.0.0:
-+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
-+ engines: {node: '>=10'}
-+ dependencies:
-+ locate-path: 6.0.0
-+ path-exists: 4.0.0
-+ dev: false
-+
-+ /flat-cache/3.0.4:
-+ resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==}
-+ engines: {node: ^10.12.0 || >=12.0.0}
-+ dependencies:
-+ flatted: 3.2.7
-+ rimraf: 3.0.2
-+ dev: false
-+
-+ /flatted/3.2.7:
-+ resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==}
-+ dev: false
-+
-+ /fs.realpath/1.0.0:
-+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
-+ dev: false
-+
-+ /function-bind/1.1.1:
-+ resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
-+ dev: false
-+
-+ /function.prototype.name/1.1.5:
-+ resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
-+ engines: {node: '>= 0.4'}
-+ dependencies:
-+ call-bind: 1.0.2
-+ define-properties: 1.1.4
-+ es-abstract: 1.20.5
-+ functions-have-names: 1.2.3
-+ dev: false
-+
-+ /functions-have-names/1.2.3:
-+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
-+ dev: false
-+
-+ /get-intrinsic/1.1.3:
-+ resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==}
-+ dependencies:
-+ function-bind: 1.1.1
-+ has: 1.0.3
-+ has-symbols: 1.0.3
-+ dev: false
-+
-+ /get-symbol-description/1.0.0:
-+ resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
-+ engines: {node: '>= 0.4'}
-+ dependencies:
-+ call-bind: 1.0.2
-+ get-intrinsic: 1.1.3
-+ dev: false
-+
-+ /get-tsconfig/4.2.0:
-+ resolution: {integrity: sha512-X8u8fREiYOE6S8hLbq99PeykTDoLVnxvF4DjWKJmz9xy2nNRdUcV8ZN9tniJFeKyTU3qnC9lL8n4Chd6LmVKHg==}
-+ dev: false
-+
-+ /glob-parent/5.1.2:
-+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
-+ engines: {node: '>= 6'}
-+ dependencies:
-+ is-glob: 4.0.3
-+ dev: false
-+
-+ /glob-parent/6.0.2:
-+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
-+ engines: {node: '>=10.13.0'}
-+ dependencies:
-+ is-glob: 4.0.3
-+ dev: false
-+
-+ /glob/7.1.7:
-+ resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==}
-+ dependencies:
-+ fs.realpath: 1.0.0
-+ inflight: 1.0.6
-+ inherits: 2.0.4
-+ minimatch: 3.1.2
-+ once: 1.4.0
-+ path-is-absolute: 1.0.1
-+ dev: false
-+
-+ /glob/7.2.3:
-+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
-+ dependencies:
-+ fs.realpath: 1.0.0
-+ inflight: 1.0.6
-+ inherits: 2.0.4
-+ minimatch: 3.1.2
-+ once: 1.4.0
-+ path-is-absolute: 1.0.1
-+ dev: false
-+
-+ /globals/13.19.0:
-+ resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==}
-+ engines: {node: '>=8'}
-+ dependencies:
-+ type-fest: 0.20.2
-+ dev: false
-+
-+ /globalyzer/0.1.0:
-+ resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==}
-+ dev: false
-+
-+ /globby/11.1.0:
-+ resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
-+ engines: {node: '>=10'}
-+ dependencies:
-+ array-union: 2.1.0
-+ dir-glob: 3.0.1
-+ fast-glob: 3.2.12
-+ ignore: 5.2.4
-+ merge2: 1.4.1
-+ slash: 3.0.0
-+ dev: false
-+
-+ /globby/13.1.3:
-+ resolution: {integrity: sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==}
-+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-+ dependencies:
-+ dir-glob: 3.0.1
-+ fast-glob: 3.2.12
-+ ignore: 5.2.4
-+ merge2: 1.4.1
-+ slash: 4.0.0
-+ dev: false
-+
-+ /globrex/0.1.2:
-+ resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
-+ dev: false
-+
-+ /gopd/1.0.1:
-+ resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
-+ dependencies:
-+ get-intrinsic: 1.1.3
-+ dev: false
-+
-+ /graceful-fs/4.2.10:
-+ resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
-+ dev: false
-+
-+ /grapheme-splitter/1.0.4:
-+ resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
-+ dev: false
-+
-+ /has-bigints/1.0.2:
-+ resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
-+ dev: false
-+
-+ /has-flag/4.0.0:
-+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
-+ engines: {node: '>=8'}
-+ dev: false
-+
-+ /has-property-descriptors/1.0.0:
-+ resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
-+ dependencies:
-+ get-intrinsic: 1.1.3
-+ dev: false
-+
-+ /has-symbols/1.0.3:
-+ resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
-+ engines: {node: '>= 0.4'}
-+ dev: false
-+
-+ /has-tostringtag/1.0.0:
-+ resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
-+ engines: {node: '>= 0.4'}
-+ dependencies:
-+ has-symbols: 1.0.3
-+ dev: false
-+
-+ /has/1.0.3:
-+ resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
-+ engines: {node: '>= 0.4.0'}
-+ dependencies:
-+ function-bind: 1.1.1
-+ dev: false
-+
-+ /ignore/5.2.4:
-+ resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
-+ engines: {node: '>= 4'}
-+ dev: false
-+
-+ /import-fresh/3.3.0:
-+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
-+ engines: {node: '>=6'}
-+ dependencies:
-+ parent-module: 1.0.1
-+ resolve-from: 4.0.0
-+ dev: false
-+
-+ /imurmurhash/0.1.4:
-+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
-+ engines: {node: '>=0.8.19'}
-+ dev: false
-+
-+ /inflight/1.0.6:
-+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
-+ dependencies:
-+ once: 1.4.0
-+ wrappy: 1.0.2
-+ dev: false
-+
-+ /inherits/2.0.4:
-+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
-+ dev: false
-+
-+ /internal-slot/1.0.4:
-+ resolution: {integrity: sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==}
-+ engines: {node: '>= 0.4'}
-+ dependencies:
-+ get-intrinsic: 1.1.3
-+ has: 1.0.3
-+ side-channel: 1.0.4
-+ dev: false
-+
-+ /is-bigint/1.0.4:
-+ resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
-+ dependencies:
-+ has-bigints: 1.0.2
-+ dev: false
-+
-+ /is-boolean-object/1.1.2:
-+ resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
-+ engines: {node: '>= 0.4'}
-+ dependencies:
-+ call-bind: 1.0.2
-+ has-tostringtag: 1.0.0
-+ dev: false
-+
-+ /is-callable/1.2.7:
-+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
-+ engines: {node: '>= 0.4'}
-+ dev: false
-+
-+ /is-core-module/2.11.0:
-+ resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==}
-+ dependencies:
-+ has: 1.0.3
-+ dev: false
-+
-+ /is-date-object/1.0.5:
-+ resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
-+ engines: {node: '>= 0.4'}
-+ dependencies:
-+ has-tostringtag: 1.0.0
-+ dev: false
-+
-+ /is-docker/2.2.1:
-+ resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
-+ engines: {node: '>=8'}
-+ hasBin: true
-+ dev: false
-+
-+ /is-extglob/2.1.1:
-+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
-+ engines: {node: '>=0.10.0'}
-+ dev: false
-+
-+ /is-glob/4.0.3:
-+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
-+ engines: {node: '>=0.10.0'}
-+ dependencies:
-+ is-extglob: 2.1.1
-+ dev: false
-+
-+ /is-negative-zero/2.0.2:
-+ resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
-+ engines: {node: '>= 0.4'}
-+ dev: false
-+
-+ /is-number-object/1.0.7:
-+ resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
-+ engines: {node: '>= 0.4'}
-+ dependencies:
-+ has-tostringtag: 1.0.0
-+ dev: false
-+
-+ /is-number/7.0.0:
-+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
-+ engines: {node: '>=0.12.0'}
-+ dev: false
-+
-+ /is-path-inside/3.0.3:
-+ resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
-+ engines: {node: '>=8'}
-+ dev: false
-+
-+ /is-regex/1.1.4:
-+ resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
-+ engines: {node: '>= 0.4'}
-+ dependencies:
-+ call-bind: 1.0.2
-+ has-tostringtag: 1.0.0
-+ dev: false
-+
-+ /is-shared-array-buffer/1.0.2:
-+ resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
-+ dependencies:
-+ call-bind: 1.0.2
-+ dev: false
-+
-+ /is-string/1.0.7:
-+ resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
-+ engines: {node: '>= 0.4'}
-+ dependencies:
-+ has-tostringtag: 1.0.0
-+ dev: false
-+
-+ /is-symbol/1.0.4:
-+ resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
-+ engines: {node: '>= 0.4'}
-+ dependencies:
-+ has-symbols: 1.0.3
-+ dev: false
-+
-+ /is-weakref/1.0.2:
-+ resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
-+ dependencies:
-+ call-bind: 1.0.2
-+ dev: false
-+
-+ /is-wsl/2.2.0:
-+ resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
-+ engines: {node: '>=8'}
-+ dependencies:
-+ is-docker: 2.2.1
-+ dev: false
-+
-+ /isexe/2.0.0:
-+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
-+ dev: false
-+
-+ /js-sdsl/4.2.0:
-+ resolution: {integrity: sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==}
-+ dev: false
-+
-+ /js-tokens/4.0.0:
-+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
-+ dev: false
-+
-+ /js-yaml/4.1.0:
-+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
-+ hasBin: true
-+ dependencies:
-+ argparse: 2.0.1
-+ dev: false
-+
-+ /json-schema-traverse/0.4.1:
-+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
-+ dev: false
-+
-+ /json-stable-stringify-without-jsonify/1.0.1:
-+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
-+ dev: false
-+
-+ /json5/1.0.2:
-+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
-+ hasBin: true
-+ dependencies:
-+ minimist: 1.2.7
-+ dev: false
-+
-+ /jsx-ast-utils/3.3.3:
-+ resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==}
-+ engines: {node: '>=4.0'}
-+ dependencies:
-+ array-includes: 3.1.6
-+ object.assign: 4.1.4
-+ dev: false
-+
-+ /language-subtag-registry/0.3.22:
-+ resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==}
-+ dev: false
-+
-+ /language-tags/1.0.7:
-+ resolution: {integrity: sha512-bSytju1/657hFjgUzPAPqszxH62ouE8nQFoFaVlIQfne4wO/wXC9A4+m8jYve7YBBvi59eq0SUpcshvG8h5Usw==}
-+ dependencies:
-+ language-subtag-registry: 0.3.22
-+ dev: false
-+
-+ /levn/0.4.1:
-+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
-+ engines: {node: '>= 0.8.0'}
-+ dependencies:
-+ prelude-ls: 1.2.1
-+ type-check: 0.4.0
-+ dev: false
-+
-+ /locate-path/6.0.0:
-+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
-+ engines: {node: '>=10'}
-+ dependencies:
-+ p-locate: 5.0.0
-+ dev: false
-+
-+ /lodash.merge/4.6.2:
-+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
-+ dev: false
-+
-+ /loose-envify/1.4.0:
-+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
-+ hasBin: true
-+ dependencies:
-+ js-tokens: 4.0.0
-+ dev: false
-+
-+ /lru-cache/6.0.0:
-+ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
-+ engines: {node: '>=10'}
-+ dependencies:
-+ yallist: 4.0.0
-+ dev: false
-+
-+ /merge2/1.4.1:
-+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
-+ engines: {node: '>= 8'}
-+ dev: false
-+
-+ /micromatch/4.0.5:
-+ resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
-+ engines: {node: '>=8.6'}
-+ dependencies:
-+ braces: 3.0.2
-+ picomatch: 2.3.1
-+ dev: false
-+
-+ /minimatch/3.1.2:
-+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
-+ dependencies:
-+ brace-expansion: 1.1.11
-+ dev: false
-+
-+ /minimist/1.2.7:
-+ resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==}
-+ dev: false
-+
-+ /ms/2.0.0:
-+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
-+ dev: false
-+
-+ /ms/2.1.2:
-+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
-+ dev: false
-+
-+ /ms/2.1.3:
-+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
-+ dev: false
-+
-+ /nanoid/3.3.4:
-+ resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
-+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
-+ hasBin: true
-+ dev: false
-+
-+ /natural-compare/1.4.0:
-+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
-+ dev: false
-+
-+ /next/13.1.1_biqbaboplfbrettd7655fr4n2y:
-+ resolution: {integrity: sha512-R5eBAaIa3X7LJeYvv1bMdGnAVF4fVToEjim7MkflceFPuANY3YyvFxXee/A+acrSYwYPvOvf7f6v/BM/48ea5w==}
-+ engines: {node: '>=14.6.0'}
-+ hasBin: true
-+ peerDependencies:
-+ fibers: '>= 3.1.0'
-+ node-sass: ^6.0.0 || ^7.0.0
-+ react: ^18.2.0
-+ react-dom: ^18.2.0
-+ sass: ^1.3.0
-+ peerDependenciesMeta:
-+ fibers:
-+ optional: true
-+ node-sass:
-+ optional: true
-+ sass:
-+ optional: true
-+ dependencies:
-+ '@next/env': 13.1.1
-+ '@swc/helpers': 0.4.14
-+ caniuse-lite: 1.0.30001441
-+ postcss: 8.4.14
-+ react: 18.2.0
-+ react-dom: 18.2.0_react@18.2.0
-+ styled-jsx: 5.1.1_react@18.2.0
-+ optionalDependencies:
-+ '@next/swc-android-arm-eabi': 13.1.1
-+ '@next/swc-android-arm64': 13.1.1
-+ '@next/swc-darwin-arm64': 13.1.1
-+ '@next/swc-darwin-x64': 13.1.1
-+ '@next/swc-freebsd-x64': 13.1.1
-+ '@next/swc-linux-arm-gnueabihf': 13.1.1
-+ '@next/swc-linux-arm64-gnu': 13.1.1
-+ '@next/swc-linux-arm64-musl': 13.1.1
-+ '@next/swc-linux-x64-gnu': 13.1.1
-+ '@next/swc-linux-x64-musl': 13.1.1
-+ '@next/swc-win32-arm64-msvc': 13.1.1
-+ '@next/swc-win32-ia32-msvc': 13.1.1
-+ '@next/swc-win32-x64-msvc': 13.1.1
-+ transitivePeerDependencies:
-+ - '@babel/core'
-+ - babel-plugin-macros
-+ dev: false
-+
-+ /object-assign/4.1.1:
-+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
-+ engines: {node: '>=0.10.0'}
-+ dev: false
-+
-+ /object-inspect/1.12.2:
-+ resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==}
-+ dev: false
-+
-+ /object-keys/1.1.1:
-+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
-+ engines: {node: '>= 0.4'}
-+ dev: false
-+
-+ /object.assign/4.1.4:
-+ resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
-+ engines: {node: '>= 0.4'}
-+ dependencies:
-+ call-bind: 1.0.2
-+ define-properties: 1.1.4
-+ has-symbols: 1.0.3
-+ object-keys: 1.1.1
-+ dev: false
-+
-+ /object.entries/1.1.6:
-+ resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==}
-+ engines: {node: '>= 0.4'}
-+ dependencies:
-+ call-bind: 1.0.2
-+ define-properties: 1.1.4
-+ es-abstract: 1.20.5
-+ dev: false
-+
-+ /object.fromentries/2.0.6:
-+ resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==}
-+ engines: {node: '>= 0.4'}
-+ dependencies:
-+ call-bind: 1.0.2
-+ define-properties: 1.1.4
-+ es-abstract: 1.20.5
-+ dev: false
-+
-+ /object.hasown/1.1.2:
-+ resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==}
-+ dependencies:
-+ define-properties: 1.1.4
-+ es-abstract: 1.20.5
-+ dev: false
-+
-+ /object.values/1.1.6:
-+ resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==}
-+ engines: {node: '>= 0.4'}
-+ dependencies:
-+ call-bind: 1.0.2
-+ define-properties: 1.1.4
-+ es-abstract: 1.20.5
-+ dev: false
-+
-+ /once/1.4.0:
-+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
-+ dependencies:
-+ wrappy: 1.0.2
-+ dev: false
-+
-+ /open/8.4.0:
-+ resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==}
-+ engines: {node: '>=12'}
-+ dependencies:
-+ define-lazy-prop: 2.0.0
-+ is-docker: 2.2.1
-+ is-wsl: 2.2.0
-+ dev: false
-+
-+ /optionator/0.9.1:
-+ resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==}
-+ engines: {node: '>= 0.8.0'}
-+ dependencies:
-+ deep-is: 0.1.4
-+ fast-levenshtein: 2.0.6
-+ levn: 0.4.1
-+ prelude-ls: 1.2.1
-+ type-check: 0.4.0
-+ word-wrap: 1.2.3
-+ dev: false
-+
-+ /p-limit/3.1.0:
-+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
-+ engines: {node: '>=10'}
-+ dependencies:
-+ yocto-queue: 0.1.0
-+ dev: false
-+
-+ /p-locate/5.0.0:
-+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
-+ engines: {node: '>=10'}
-+ dependencies:
-+ p-limit: 3.1.0
-+ dev: false
-+
-+ /parent-module/1.0.1:
-+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
-+ engines: {node: '>=6'}
-+ dependencies:
-+ callsites: 3.1.0
-+ dev: false
-+
-+ /path-exists/4.0.0:
-+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
-+ engines: {node: '>=8'}
-+ dev: false
-+
-+ /path-is-absolute/1.0.1:
-+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
-+ engines: {node: '>=0.10.0'}
-+ dev: false
-+
-+ /path-key/3.1.1:
-+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
-+ engines: {node: '>=8'}
-+ dev: false
-+
-+ /path-parse/1.0.7:
-+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
-+ dev: false
-+
-+ /path-type/4.0.0:
-+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
-+ engines: {node: '>=8'}
-+ dev: false
-+
-+ /picocolors/1.0.0:
-+ resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
-+ dev: false
-+
-+ /picomatch/2.3.1:
-+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
-+ engines: {node: '>=8.6'}
-+ dev: false
-+
-+ /postcss/8.4.14:
-+ resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==}
-+ engines: {node: ^10 || ^12 || >=14}
-+ dependencies:
-+ nanoid: 3.3.4
-+ picocolors: 1.0.0
-+ source-map-js: 1.0.2
-+ dev: false
-+
-+ /prelude-ls/1.2.1:
-+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
-+ engines: {node: '>= 0.8.0'}
-+ dev: false
-+
-+ /prettier/2.8.1:
-+ resolution: {integrity: sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==}
-+ engines: {node: '>=10.13.0'}
-+ hasBin: true
-+ dev: true
-+
-+ /prop-types/15.8.1:
-+ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
-+ dependencies:
-+ loose-envify: 1.4.0
-+ object-assign: 4.1.1
-+ react-is: 16.13.1
-+ dev: false
-+
-+ /punycode/2.1.1:
-+ resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==}
-+ engines: {node: '>=6'}
-+ dev: false
-+
-+ /queue-microtask/1.2.3:
-+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
-+ dev: false
-+
-+ /react-dom/18.2.0_react@18.2.0:
-+ resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
-+ peerDependencies:
-+ react: ^18.2.0
-+ dependencies:
-+ loose-envify: 1.4.0
-+ react: 18.2.0
-+ scheduler: 0.23.0
-+ dev: false
-+
-+ /react-is/16.13.1:
-+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
-+ dev: false
-+
-+ /react/18.2.0:
-+ resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
-+ engines: {node: '>=0.10.0'}
-+ dependencies:
-+ loose-envify: 1.4.0
-+ dev: false
-+
-+ /regenerator-runtime/0.13.11:
-+ resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
-+ dev: false
-+
-+ /regexp.prototype.flags/1.4.3:
-+ resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==}
-+ engines: {node: '>= 0.4'}
-+ dependencies:
-+ call-bind: 1.0.2
-+ define-properties: 1.1.4
-+ functions-have-names: 1.2.3
-+ dev: false
-+
-+ /regexpp/3.2.0:
-+ resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==}
-+ engines: {node: '>=8'}
-+ dev: false
-+
-+ /resolve-from/4.0.0:
-+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
-+ engines: {node: '>=4'}
-+ dev: false
-+
-+ /resolve/1.22.1:
-+ resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
-+ hasBin: true
-+ dependencies:
-+ is-core-module: 2.11.0
-+ path-parse: 1.0.7
-+ supports-preserve-symlinks-flag: 1.0.0
-+ dev: false
-+
-+ /resolve/2.0.0-next.4:
-+ resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==}
-+ hasBin: true
-+ dependencies:
-+ is-core-module: 2.11.0
-+ path-parse: 1.0.7
-+ supports-preserve-symlinks-flag: 1.0.0
-+ dev: false
-+
-+ /reusify/1.0.4:
-+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
-+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
-+ dev: false
-+
-+ /rimraf/3.0.2:
-+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
-+ hasBin: true
-+ dependencies:
-+ glob: 7.2.3
-+ dev: false
-+
-+ /run-parallel/1.2.0:
-+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
-+ dependencies:
-+ queue-microtask: 1.2.3
-+ dev: false
-+
-+ /safe-regex-test/1.0.0:
-+ resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
-+ dependencies:
-+ call-bind: 1.0.2
-+ get-intrinsic: 1.1.3
-+ is-regex: 1.1.4
-+ dev: false
-+
-+ /scheduler/0.23.0:
-+ resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
-+ dependencies:
-+ loose-envify: 1.4.0
-+ dev: false
-+
-+ /semver/6.3.0:
-+ resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
-+ hasBin: true
-+ dev: false
-+
-+ /semver/7.3.8:
-+ resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==}
-+ engines: {node: '>=10'}
-+ hasBin: true
-+ dependencies:
-+ lru-cache: 6.0.0
-+ dev: false
-+
-+ /shebang-command/2.0.0:
-+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
-+ engines: {node: '>=8'}
-+ dependencies:
-+ shebang-regex: 3.0.0
-+ dev: false
-+
-+ /shebang-regex/3.0.0:
-+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
-+ engines: {node: '>=8'}
-+ dev: false
-+
-+ /side-channel/1.0.4:
-+ resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
-+ dependencies:
-+ call-bind: 1.0.2
-+ get-intrinsic: 1.1.3
-+ object-inspect: 1.12.2
-+ dev: false
-+
-+ /slash/3.0.0:
-+ resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
-+ engines: {node: '>=8'}
-+ dev: false
-+
-+ /slash/4.0.0:
-+ resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==}
-+ engines: {node: '>=12'}
-+ dev: false
-+
-+ /source-map-js/1.0.2:
-+ resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
-+ engines: {node: '>=0.10.0'}
-+ dev: false
-+
-+ /string.prototype.matchall/4.0.8:
-+ resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==}
-+ dependencies:
-+ call-bind: 1.0.2
-+ define-properties: 1.1.4
-+ es-abstract: 1.20.5
-+ get-intrinsic: 1.1.3
-+ has-symbols: 1.0.3
-+ internal-slot: 1.0.4
-+ regexp.prototype.flags: 1.4.3
-+ side-channel: 1.0.4
-+ dev: false
-+
-+ /string.prototype.trimend/1.0.6:
-+ resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==}
-+ dependencies:
-+ call-bind: 1.0.2
-+ define-properties: 1.1.4
-+ es-abstract: 1.20.5
-+ dev: false
-+
-+ /string.prototype.trimstart/1.0.6:
-+ resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==}
-+ dependencies:
-+ call-bind: 1.0.2
-+ define-properties: 1.1.4
-+ es-abstract: 1.20.5
-+ dev: false
-+
-+ /strip-ansi/6.0.1:
-+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
-+ engines: {node: '>=8'}
-+ dependencies:
-+ ansi-regex: 5.0.1
-+ dev: false
-+
-+ /strip-bom/3.0.0:
-+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
-+ engines: {node: '>=4'}
-+ dev: false
-+
-+ /strip-json-comments/3.1.1:
-+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
-+ engines: {node: '>=8'}
-+ dev: false
-+
-+ /styled-jsx/5.1.1_react@18.2.0:
-+ resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==}
-+ engines: {node: '>= 12.0.0'}
-+ peerDependencies:
-+ '@babel/core': '*'
-+ babel-plugin-macros: '*'
-+ react: '>= 16.8.0 || 17.x.x || ^18.0.0-0'
-+ peerDependenciesMeta:
-+ '@babel/core':
-+ optional: true
-+ babel-plugin-macros:
-+ optional: true
-+ dependencies:
-+ client-only: 0.0.1
-+ react: 18.2.0
-+ dev: false
-+
-+ /supports-color/7.2.0:
-+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
-+ engines: {node: '>=8'}
-+ dependencies:
-+ has-flag: 4.0.0
-+ dev: false
-+
-+ /supports-preserve-symlinks-flag/1.0.0:
-+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
-+ engines: {node: '>= 0.4'}
-+ dev: false
-+
-+ /synckit/0.8.4:
-+ resolution: {integrity: sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==}
-+ engines: {node: ^14.18.0 || >=16.0.0}
-+ dependencies:
-+ '@pkgr/utils': 2.3.1
-+ tslib: 2.4.1
-+ dev: false
-+
-+ /tapable/2.2.1:
-+ resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
-+ engines: {node: '>=6'}
-+ dev: false
-+
-+ /text-table/0.2.0:
-+ resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
-+ dev: false
-+
-+ /tiny-glob/0.2.9:
-+ resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==}
-+ dependencies:
-+ globalyzer: 0.1.0
-+ globrex: 0.1.2
-+ dev: false
-+
-+ /to-regex-range/5.0.1:
-+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
-+ engines: {node: '>=8.0'}
-+ dependencies:
-+ is-number: 7.0.0
-+ dev: false
-+
-+ /tsconfig-paths/3.14.1:
-+ resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==}
-+ dependencies:
-+ '@types/json5': 0.0.29
-+ json5: 1.0.2
-+ minimist: 1.2.7
-+ strip-bom: 3.0.0
-+ dev: false
-+
-+ /tslib/1.14.1:
-+ resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
-+ dev: false
-+
-+ /tslib/2.4.1:
-+ resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==}
-+ dev: false
-+
-+ /tsutils/3.21.0_typescript@4.9.4:
-+ resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
-+ engines: {node: '>= 6'}
-+ peerDependencies:
-+ typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
-+ dependencies:
-+ tslib: 1.14.1
-+ typescript: 4.9.4
-+ dev: false
-+
-+ /type-check/0.4.0:
-+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
-+ engines: {node: '>= 0.8.0'}
-+ dependencies:
-+ prelude-ls: 1.2.1
-+ dev: false
-+
-+ /type-fest/0.20.2:
-+ resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
-+ engines: {node: '>=10'}
-+ dev: false
-+
-+ /typescript/4.9.4:
-+ resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==}
-+ engines: {node: '>=4.2.0'}
-+ hasBin: true
-+ dev: false
-+
-+ /unbox-primitive/1.0.2:
-+ resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
-+ dependencies:
-+ call-bind: 1.0.2
-+ has-bigints: 1.0.2
-+ has-symbols: 1.0.3
-+ which-boxed-primitive: 1.0.2
-+ dev: false
-+
-+ /uri-js/4.4.1:
-+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
-+ dependencies:
-+ punycode: 2.1.1
-+ dev: false
-+
-+ /which-boxed-primitive/1.0.2:
-+ resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
-+ dependencies:
-+ is-bigint: 1.0.4
-+ is-boolean-object: 1.1.2
-+ is-number-object: 1.0.7
-+ is-string: 1.0.7
-+ is-symbol: 1.0.4
-+ dev: false
-+
-+ /which/2.0.2:
-+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
-+ engines: {node: '>= 8'}
-+ hasBin: true
-+ dependencies:
-+ isexe: 2.0.0
-+ dev: false
-+
-+ /word-wrap/1.2.3:
-+ resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==}
-+ engines: {node: '>=0.10.0'}
-+ dev: false
-+
-+ /wrappy/1.0.2:
-+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
-+ dev: false
-+
-+ /yallist/4.0.0:
-+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
-+ dev: false
-+
-+ /yocto-queue/0.1.0:
-+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
-+ engines: {node: '>=10'}
-+ dev: false
-+
-+ file:../..:
-+ resolution: {directory: ../.., type: directory}
-+ name: '@toots/shine.js'
-+ version: 1.0.1
-+ dev: false
-diff --git a/js/test/nextjs/public/encode.wav b/js/test/nextjs/public/encode.wav
-new file mode 120000
-index 0000000..0f5f127
---- /dev/null
-+++ b/js/test/nextjs/public/encode.wav
-@@ -0,0 +1 @@
-+../lib/encode.wav
-\ No newline at end of file
-diff --git a/js/test/nextjs/tsconfig.json b/js/test/nextjs/tsconfig.json
-new file mode 100644
-index 0000000..66151f2
---- /dev/null
-+++ b/js/test/nextjs/tsconfig.json
-@@ -0,0 +1,23 @@
-+{
-+ "compilerOptions": {
-+ "target": "es5",
-+ "lib": ["dom", "dom.iterable", "esnext"],
-+ "allowJs": true,
-+ "skipLibCheck": true,
-+ "strict": true,
-+ "forceConsistentCasingInFileNames": true,
-+ "noEmit": true,
-+ "esModuleInterop": true,
-+ "module": "esnext",
-+ "moduleResolution": "node",
-+ "resolveJsonModule": true,
-+ "isolatedModules": true,
-+ "jsx": "preserve",
-+ "incremental": true,
-+ "paths": {
-+ "@shine/*": ["./*"]
-+ }
-+ },
-+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
-+ "exclude": ["node_modules"]
-+}
-diff --git a/js/test/node/encode.coffee b/js/test/node/encode.coffee
-deleted file mode 100644
-index 3e1ba72..0000000
---- a/js/test/node/encode.coffee
-+++ /dev/null
-@@ -1,58 +0,0 @@
--Shine = require "../../dist/libshine.js"
--{Reader} = require "wav"
--fs = require "fs"
--
--console.log ""
--console.log "Executing encoding test"
--
--bitrate = 128
--str = fs.createReadStream "../lib/encode.wav"
--fd = fs.openSync "./encode.mp3", "w"
--reader = new Reader
--
--str.pipe reader
--
--write = (encoded) ->
-- return unless encoded.length > 0
-- buf = new Buffer encoded
-- fs.writeSync fd, buf, 0, buf.length
--
--reader.on "format", (format) ->
-- console.log "Got WAV file."
--
-- shine = new Shine
-- bitrate: bitrate
-- samplerate: format.sampleRate
-- channels: format.channels
--
-- console.log "Encoding.."
-- started = new Date
-- duration = 0.0
-- samplerate = parseFloat format.sampleRate
--
-- reader.on "data", (buf) ->
-- samples = buf.length/(2*format.channels)
--
-- duration += parseFloat(samples) / samplerate
--
-- write shine.encode(convertInterleavedBuffer(buf, format.channels, samples))
--
-- reader.on "end", ->
-- write shine.close()
--
-- ended = new Date
-- encodingTime = (ended.getTime() - started.getTime())/1000
-- console.log "Done encoding."
-- console.log "File duration: #{duration.toFixed(2)} seconds"
-- console.log "Encoding time: #{encodingTime.toFixed(2)} seconds"
-- console.log "Encoding rate: #{(duration/encodingTime).toFixed(2)}X"
-- process.exit 0
--
--convertInterleavedBuffer = (buf, channels, samples) ->
-- ret = new Array channels
-- for chan in [0..channels-1]
-- ret[chan] = new Int16Array samples
-- for i in [0..samples-1]
-- ret[chan][i] = buf.readInt16LE 2*(i*channels + chan)
--
-- ret
-diff --git a/js/test/node/encode.ts b/js/test/node/encode.ts
-new file mode 100644
-index 0000000..cc971e1
---- /dev/null
-+++ b/js/test/node/encode.ts
-@@ -0,0 +1,73 @@
-+import { Shine } from "@toots/shine.js";
-+import { Reader } from "wav";
-+import fs from "fs";
-+
-+const convertInterleavedBuffer = (buf, channels, samples) => {
-+ const ret = new Array(channels);
-+ for (let chan = 0; chan < channels; chan++) {
-+ ret[chan] = new Int16Array(samples);
-+ for (let i = 0; i < samples; i++) {
-+ ret[chan][i] = buf.readInt16LE(2 * (i * channels + chan));
-+ }
-+ }
-+
-+ return ret;
-+};
-+
-+const exec = async () => {
-+ await Shine.initialized;
-+
-+ console.log("");
-+ console.log("Executing encoding test");
-+
-+ const bitrate = 128;
-+ const str = fs.createReadStream("../lib/encode.wav");
-+ const fd = fs.openSync("./encode.mp3", "w");
-+ const reader = new Reader();
-+
-+ str.pipe(reader);
-+
-+ const write = encoded => {
-+ if (encoded.length <= 0) return;
-+
-+ const buf = Buffer.from(encoded);
-+ fs.writeSync(fd, buf, 0, buf.length);
-+ };
-+
-+ reader.on("format", format => {
-+ console.log("Got WAV file.");
-+
-+ const shine = new Shine({
-+ bitrate: bitrate,
-+ samplerate: format.sampleRate,
-+ channels: format.channels,
-+ });
-+
-+ console.log("Encoding..");
-+ const started = new Date();
-+ let duration = 0.0;
-+ const samplerate = format.sampleRate;
-+
-+ reader.on("data", buf => {
-+ const samples = buf.length / (2 * format.channels);
-+
-+ duration += samples / samplerate;
-+
-+ write(shine.encode(convertInterleavedBuffer(buf, format.channels, samples)));
-+ });
-+
-+ reader.on("end", () => {
-+ write(shine.close());
-+
-+ const ended = new Date();
-+ const encodingTime = (ended.getTime() - started.getTime()) / 1000;
-+ console.log("Done encoding.");
-+ console.log(`File duration: ${duration.toFixed(2)} seconds`);
-+ console.log(`Encoding time: ${encodingTime.toFixed(2)} seconds`);
-+ console.log(`Encoding rate: ${(duration / encodingTime).toFixed(2)}X`);
-+ process.exit(0);
-+ });
-+ });
-+};
-+
-+exec();
-diff --git a/js/test/node/package-lock.json b/js/test/node/package-lock.json
-index 0096742..752a7c7 100644
---- a/js/test/node/package-lock.json
-+++ b/js/test/node/package-lock.json
-@@ -1,49 +1,493 @@
- {
- "name": "shine-js-test",
- "version": "0.0.1",
-- "lockfileVersion": 1,
-+ "lockfileVersion": 2,
- "requires": true,
-+ "packages": {
-+ "": {
-+ "name": "shine-js-test",
-+ "version": "0.0.1",
-+ "dependencies": {
-+ "@toots/shine.js": "file:../..",
-+ "@types/node": "^18.11.18",
-+ "ts-node": "^10.9.1",
-+ "typescript": "^4.9.4",
-+ "wav": "^1.0.2"
-+ }
-+ },
-+ "../..": {
-+ "name": "@toots/shine.js",
-+ "version": "1.0.1",
-+ "license": "LGPL-2.0-only"
-+ },
-+ "node_modules/@cspotcode/source-map-support": {
-+ "version": "0.8.1",
-+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
-+ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
-+ "dependencies": {
-+ "@jridgewell/trace-mapping": "0.3.9"
-+ },
-+ "engines": {
-+ "node": ">=12"
-+ }
-+ },
-+ "node_modules/@jridgewell/resolve-uri": {
-+ "version": "3.1.0",
-+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
-+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
-+ "engines": {
-+ "node": ">=6.0.0"
-+ }
-+ },
-+ "node_modules/@jridgewell/sourcemap-codec": {
-+ "version": "1.4.14",
-+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
-+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
-+ },
-+ "node_modules/@jridgewell/trace-mapping": {
-+ "version": "0.3.9",
-+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
-+ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
-+ "dependencies": {
-+ "@jridgewell/resolve-uri": "^3.0.3",
-+ "@jridgewell/sourcemap-codec": "^1.4.10"
-+ }
-+ },
-+ "node_modules/@toots/shine.js": {
-+ "resolved": "../..",
-+ "link": true
-+ },
-+ "node_modules/@tsconfig/node10": {
-+ "version": "1.0.9",
-+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
-+ "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA=="
-+ },
-+ "node_modules/@tsconfig/node12": {
-+ "version": "1.0.11",
-+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
-+ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="
-+ },
-+ "node_modules/@tsconfig/node14": {
-+ "version": "1.0.3",
-+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
-+ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow=="
-+ },
-+ "node_modules/@tsconfig/node16": {
-+ "version": "1.0.3",
-+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz",
-+ "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ=="
-+ },
-+ "node_modules/@types/node": {
-+ "version": "18.11.18",
-+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
-+ "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA=="
-+ },
-+ "node_modules/acorn": {
-+ "version": "8.8.1",
-+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
-+ "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
-+ "bin": {
-+ "acorn": "bin/acorn"
-+ },
-+ "engines": {
-+ "node": ">=0.4.0"
-+ }
-+ },
-+ "node_modules/acorn-walk": {
-+ "version": "8.2.0",
-+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
-+ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
-+ "engines": {
-+ "node": ">=0.4.0"
-+ }
-+ },
-+ "node_modules/arg": {
-+ "version": "4.1.3",
-+ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
-+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="
-+ },
-+ "node_modules/buffer-alloc": {
-+ "version": "1.2.0",
-+ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
-+ "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
-+ "dependencies": {
-+ "buffer-alloc-unsafe": "^1.1.0",
-+ "buffer-fill": "^1.0.0"
-+ }
-+ },
-+ "node_modules/buffer-alloc-unsafe": {
-+ "version": "1.1.0",
-+ "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
-+ "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
-+ },
-+ "node_modules/buffer-fill": {
-+ "version": "1.0.0",
-+ "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
-+ "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
-+ },
-+ "node_modules/buffer-from": {
-+ "version": "1.1.1",
-+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
-+ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
-+ },
-+ "node_modules/core-util-is": {
-+ "version": "1.0.2",
-+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
-+ },
-+ "node_modules/create-require": {
-+ "version": "1.1.1",
-+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
-+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="
-+ },
-+ "node_modules/debug": {
-+ "version": "2.6.9",
-+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-+ "dependencies": {
-+ "ms": "2.0.0"
-+ }
-+ },
-+ "node_modules/diff": {
-+ "version": "4.0.2",
-+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
-+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
-+ "engines": {
-+ "node": ">=0.3.1"
-+ }
-+ },
-+ "node_modules/inherits": {
-+ "version": "2.0.3",
-+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
-+ },
-+ "node_modules/isarray": {
-+ "version": "0.0.1",
-+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
-+ },
-+ "node_modules/make-error": {
-+ "version": "1.3.6",
-+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
-+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="
-+ },
-+ "node_modules/ms": {
-+ "version": "2.0.0",
-+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
-+ },
-+ "node_modules/readable-stream": {
-+ "version": "1.1.14",
-+ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
-+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
-+ "dependencies": {
-+ "core-util-is": "~1.0.0",
-+ "inherits": "~2.0.1",
-+ "isarray": "0.0.1",
-+ "string_decoder": "~0.10.x"
-+ }
-+ },
-+ "node_modules/stream-parser": {
-+ "version": "0.3.1",
-+ "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz",
-+ "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=",
-+ "dependencies": {
-+ "debug": "2"
-+ }
-+ },
-+ "node_modules/string_decoder": {
-+ "version": "0.10.31",
-+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
-+ },
-+ "node_modules/ts-node": {
-+ "version": "10.9.1",
-+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz",
-+ "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
-+ "dependencies": {
-+ "@cspotcode/source-map-support": "^0.8.0",
-+ "@tsconfig/node10": "^1.0.7",
-+ "@tsconfig/node12": "^1.0.7",
-+ "@tsconfig/node14": "^1.0.0",
-+ "@tsconfig/node16": "^1.0.2",
-+ "acorn": "^8.4.1",
-+ "acorn-walk": "^8.1.1",
-+ "arg": "^4.1.0",
-+ "create-require": "^1.1.0",
-+ "diff": "^4.0.1",
-+ "make-error": "^1.1.1",
-+ "v8-compile-cache-lib": "^3.0.1",
-+ "yn": "3.1.1"
-+ },
-+ "bin": {
-+ "ts-node": "dist/bin.js",
-+ "ts-node-cwd": "dist/bin-cwd.js",
-+ "ts-node-esm": "dist/bin-esm.js",
-+ "ts-node-script": "dist/bin-script.js",
-+ "ts-node-transpile-only": "dist/bin-transpile.js",
-+ "ts-script": "dist/bin-script-deprecated.js"
-+ },
-+ "peerDependencies": {
-+ "@swc/core": ">=1.2.50",
-+ "@swc/wasm": ">=1.2.50",
-+ "@types/node": "*",
-+ "typescript": ">=2.7"
-+ },
-+ "peerDependenciesMeta": {
-+ "@swc/core": {
-+ "optional": true
-+ },
-+ "@swc/wasm": {
-+ "optional": true
-+ }
-+ }
-+ },
-+ "node_modules/typescript": {
-+ "version": "4.9.4",
-+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz",
-+ "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==",
-+ "bin": {
-+ "tsc": "bin/tsc",
-+ "tsserver": "bin/tsserver"
-+ },
-+ "engines": {
-+ "node": ">=4.2.0"
-+ }
-+ },
-+ "node_modules/v8-compile-cache-lib": {
-+ "version": "3.0.1",
-+ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
-+ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="
-+ },
-+ "node_modules/wav": {
-+ "version": "1.0.2",
-+ "resolved": "https://registry.npmjs.org/wav/-/wav-1.0.2.tgz",
-+ "integrity": "sha512-viHtz3cDd/Tcr/HbNqzQCofKdF6kWUymH9LGDdskfWFoIy/HJ+RTihgjEcHfnsy1PO4e9B+y4HwgTwMrByquhg==",
-+ "dependencies": {
-+ "buffer-alloc": "^1.1.0",
-+ "buffer-from": "^1.0.0",
-+ "debug": "^2.2.0",
-+ "readable-stream": "^1.1.14",
-+ "stream-parser": "^0.3.1"
-+ }
-+ },
-+ "node_modules/yn": {
-+ "version": "3.1.1",
-+ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
-+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
-+ "engines": {
-+ "node": ">=6"
-+ }
-+ }
-+ },
- "dependencies": {
-- "coffee-script": {
-- "version": "1.6.3",
-- "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.6.3.tgz",
-- "integrity": "sha1-Y1XTLPGwTN/2tITl5xF4Ky8MOb4="
-+ "@cspotcode/source-map-support": {
-+ "version": "0.8.1",
-+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
-+ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
-+ "requires": {
-+ "@jridgewell/trace-mapping": "0.3.9"
-+ }
-+ },
-+ "@jridgewell/resolve-uri": {
-+ "version": "3.1.0",
-+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
-+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="
-+ },
-+ "@jridgewell/sourcemap-codec": {
-+ "version": "1.4.14",
-+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
-+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
-+ },
-+ "@jridgewell/trace-mapping": {
-+ "version": "0.3.9",
-+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
-+ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
-+ "requires": {
-+ "@jridgewell/resolve-uri": "^3.0.3",
-+ "@jridgewell/sourcemap-codec": "^1.4.10"
-+ }
-+ },
-+ "@toots/shine.js": {
-+ "version": "file:../.."
-+ },
-+ "@tsconfig/node10": {
-+ "version": "1.0.9",
-+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
-+ "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA=="
-+ },
-+ "@tsconfig/node12": {
-+ "version": "1.0.11",
-+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
-+ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="
-+ },
-+ "@tsconfig/node14": {
-+ "version": "1.0.3",
-+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
-+ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow=="
-+ },
-+ "@tsconfig/node16": {
-+ "version": "1.0.3",
-+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz",
-+ "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ=="
-+ },
-+ "@types/node": {
-+ "version": "18.11.18",
-+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
-+ "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA=="
-+ },
-+ "acorn": {
-+ "version": "8.8.1",
-+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
-+ "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA=="
-+ },
-+ "acorn-walk": {
-+ "version": "8.2.0",
-+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
-+ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA=="
-+ },
-+ "arg": {
-+ "version": "4.1.3",
-+ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
-+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="
-+ },
-+ "buffer-alloc": {
-+ "version": "1.2.0",
-+ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
-+ "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
-+ "requires": {
-+ "buffer-alloc-unsafe": "^1.1.0",
-+ "buffer-fill": "^1.0.0"
-+ }
-+ },
-+ "buffer-alloc-unsafe": {
-+ "version": "1.1.0",
-+ "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
-+ "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
-+ },
-+ "buffer-fill": {
-+ "version": "1.0.0",
-+ "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
-+ "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
-+ },
-+ "buffer-from": {
-+ "version": "1.1.1",
-+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
-+ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
-+ },
-+ "core-util-is": {
-+ "version": "1.0.2",
-+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
-+ },
-+ "create-require": {
-+ "version": "1.1.1",
-+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
-+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="
- },
- "debug": {
-- "version": "2.6.8",
-- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
-- "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
-+ "version": "2.6.9",
-+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
-+ "diff": {
-+ "version": "4.0.2",
-+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
-+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="
-+ },
-+ "inherits": {
-+ "version": "2.0.3",
-+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
-+ },
-+ "isarray": {
-+ "version": "0.0.1",
-+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
-+ },
-+ "make-error": {
-+ "version": "1.3.6",
-+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
-+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="
-+ },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "readable-stream": {
-- "version": "0.0.4",
-- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-0.0.4.tgz",
-- "integrity": "sha1-8y124/uGM0SlSNeZIwBxc2ZbO40="
-+ "version": "1.1.14",
-+ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
-+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
-+ "requires": {
-+ "core-util-is": "~1.0.0",
-+ "inherits": "~2.0.1",
-+ "isarray": "0.0.1",
-+ "string_decoder": "~0.10.x"
-+ }
- },
- "stream-parser": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz",
- "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=",
- "requires": {
-- "debug": "2.6.8"
-+ "debug": "2"
- }
- },
-+ "string_decoder": {
-+ "version": "0.10.31",
-+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
-+ },
-+ "ts-node": {
-+ "version": "10.9.1",
-+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz",
-+ "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
-+ "requires": {
-+ "@cspotcode/source-map-support": "^0.8.0",
-+ "@tsconfig/node10": "^1.0.7",
-+ "@tsconfig/node12": "^1.0.7",
-+ "@tsconfig/node14": "^1.0.0",
-+ "@tsconfig/node16": "^1.0.2",
-+ "acorn": "^8.4.1",
-+ "acorn-walk": "^8.1.1",
-+ "arg": "^4.1.0",
-+ "create-require": "^1.1.0",
-+ "diff": "^4.0.1",
-+ "make-error": "^1.1.1",
-+ "v8-compile-cache-lib": "^3.0.1",
-+ "yn": "3.1.1"
-+ }
-+ },
-+ "typescript": {
-+ "version": "4.9.4",
-+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz",
-+ "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg=="
-+ },
-+ "v8-compile-cache-lib": {
-+ "version": "3.0.1",
-+ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
-+ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="
-+ },
- "wav": {
-- "version": "0.1.0",
-- "resolved": "https://registry.npmjs.org/wav/-/wav-0.1.0.tgz",
-- "integrity": "sha1-5wTSp2nqIz858tZ5Xout1l9YsAk=",
-+ "version": "1.0.2",
-+ "resolved": "https://registry.npmjs.org/wav/-/wav-1.0.2.tgz",
-+ "integrity": "sha512-viHtz3cDd/Tcr/HbNqzQCofKdF6kWUymH9LGDdskfWFoIy/HJ+RTihgjEcHfnsy1PO4e9B+y4HwgTwMrByquhg==",
- "requires": {
-- "debug": "2.6.8",
-- "readable-stream": "0.0.4",
-- "stream-parser": "0.3.1"
-+ "buffer-alloc": "^1.1.0",
-+ "buffer-from": "^1.0.0",
-+ "debug": "^2.2.0",
-+ "readable-stream": "^1.1.14",
-+ "stream-parser": "^0.3.1"
- }
-+ },
-+ "yn": {
-+ "version": "3.1.1",
-+ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
-+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="
- }
- }
- }
-diff --git a/js/test/node/package.json b/js/test/node/package.json
-index 5160dab..650299c 100644
---- a/js/test/node/package.json
-+++ b/js/test/node/package.json
-@@ -2,26 +2,16 @@
- "name": "shine-js-test",
- "description": "Test encoder for libshine.js",
- "version": "0.0.1",
-- "homepage": "https://github.com/savonet/shine",
- "author": "Romain Beauxis <toots@rastageeks.org",
-- "repository": {
-- "type": "git",
-- "url": "git://github.com/savonet/shine"
-- },
-- "bugs": {
-- "mail": "toots@rastageeks.org",
-- "url": "http://github.com/savonet/shine/issues"
-- },
-- "main": "test.coffee",
- "scripts": {
-- "test": "coffee ./encode.coffee && coffee ./rounds.coffee"
-- },
-- "engine": {
-- "node": ">= 0.10.7",
-- "npm": "1"
-+ "test": "ts-node ./encode.ts && ts-node ./rounds.ts"
- },
- "dependencies": {
-- "coffee-script": "1.6.3",
-- "wav": "0.1.0"
-+ "@toots/shine.js": "file:../..",
-+ "@types/node": "^18.11.18",
-+ "@types/wav": "^1.0.1",
-+ "ts-node": "^10.9.1",
-+ "typescript": "^4.9.4",
-+ "wav": "^1.0.2"
- }
- }
-diff --git a/js/test/node/pnpm-lock.yaml b/js/test/node/pnpm-lock.yaml
-new file mode 100644
-index 0000000..58a8b69
---- /dev/null
-+++ b/js/test/node/pnpm-lock.yaml
-@@ -0,0 +1,227 @@
-+lockfileVersion: 5.4
-+
-+specifiers:
-+ '@toots/shine.js': file:../..
-+ '@types/node': ^18.11.18
-+ '@types/wav': ^1.0.1
-+ ts-node: ^10.9.1
-+ typescript: ^4.9.4
-+ wav: ^1.0.2
-+
-+dependencies:
-+ '@toots/shine.js': file:../..
-+ '@types/node': 18.11.18
-+ '@types/wav': 1.0.1
-+ ts-node: 10.9.1_awa2wsr5thmg3i7jqycphctjfq
-+ typescript: 4.9.4
-+ wav: 1.0.2
-+
-+packages:
-+
-+ /@cspotcode/source-map-support/0.8.1:
-+ resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
-+ engines: {node: '>=12'}
-+ dependencies:
-+ '@jridgewell/trace-mapping': 0.3.9
-+ dev: false
-+
-+ /@jridgewell/resolve-uri/3.1.0:
-+ resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
-+ engines: {node: '>=6.0.0'}
-+ dev: false
-+
-+ /@jridgewell/sourcemap-codec/1.4.14:
-+ resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
-+ dev: false
-+
-+ /@jridgewell/trace-mapping/0.3.9:
-+ resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
-+ dependencies:
-+ '@jridgewell/resolve-uri': 3.1.0
-+ '@jridgewell/sourcemap-codec': 1.4.14
-+ dev: false
-+
-+ /@tsconfig/node10/1.0.9:
-+ resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==}
-+ dev: false
-+
-+ /@tsconfig/node12/1.0.11:
-+ resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
-+ dev: false
-+
-+ /@tsconfig/node14/1.0.3:
-+ resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
-+ dev: false
-+
-+ /@tsconfig/node16/1.0.3:
-+ resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==}
-+ dev: false
-+
-+ /@types/node/18.11.18:
-+ resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==}
-+ dev: false
-+
-+ /@types/wav/1.0.1:
-+ resolution: {integrity: sha512-AKJeM5mqO1pdR2/HaTUQzSCm12No36KUM1larivXUmsLx+4JmMuC2Tv0kCdZzTx66h7IH2Xr92DGc9NQsXxa9Q==}
-+ dependencies:
-+ '@types/node': 18.11.18
-+ dev: false
-+
-+ /acorn-walk/8.2.0:
-+ resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==}
-+ engines: {node: '>=0.4.0'}
-+ dev: false
-+
-+ /acorn/8.8.1:
-+ resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==}
-+ engines: {node: '>=0.4.0'}
-+ hasBin: true
-+ dev: false
-+
-+ /arg/4.1.3:
-+ resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
-+ dev: false
-+
-+ /buffer-alloc-unsafe/1.1.0:
-+ resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==}
-+ dev: false
-+
-+ /buffer-alloc/1.2.0:
-+ resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==}
-+ dependencies:
-+ buffer-alloc-unsafe: 1.1.0
-+ buffer-fill: 1.0.0
-+ dev: false
-+
-+ /buffer-fill/1.0.0:
-+ resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==}
-+ dev: false
-+
-+ /buffer-from/1.1.2:
-+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
-+ dev: false
-+
-+ /core-util-is/1.0.3:
-+ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
-+ dev: false
-+
-+ /create-require/1.1.1:
-+ resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
-+ dev: false
-+
-+ /debug/2.6.9:
-+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
-+ peerDependencies:
-+ supports-color: '*'
-+ peerDependenciesMeta:
-+ supports-color:
-+ optional: true
-+ dependencies:
-+ ms: 2.0.0
-+ dev: false
-+
-+ /diff/4.0.2:
-+ resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
-+ engines: {node: '>=0.3.1'}
-+ dev: false
-+
-+ /inherits/2.0.4:
-+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
-+ dev: false
-+
-+ /isarray/0.0.1:
-+ resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==}
-+ dev: false
-+
-+ /make-error/1.3.6:
-+ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
-+ dev: false
-+
-+ /ms/2.0.0:
-+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
-+ dev: false
-+
-+ /readable-stream/1.1.14:
-+ resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==}
-+ dependencies:
-+ core-util-is: 1.0.3
-+ inherits: 2.0.4
-+ isarray: 0.0.1
-+ string_decoder: 0.10.31
-+ dev: false
-+
-+ /stream-parser/0.3.1:
-+ resolution: {integrity: sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==}
-+ dependencies:
-+ debug: 2.6.9
-+ transitivePeerDependencies:
-+ - supports-color
-+ dev: false
-+
-+ /string_decoder/0.10.31:
-+ resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==}
-+ dev: false
-+
-+ /ts-node/10.9.1_awa2wsr5thmg3i7jqycphctjfq:
-+ resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
-+ hasBin: true
-+ peerDependencies:
-+ '@swc/core': '>=1.2.50'
-+ '@swc/wasm': '>=1.2.50'
-+ '@types/node': '*'
-+ typescript: '>=2.7'
-+ peerDependenciesMeta:
-+ '@swc/core':
-+ optional: true
-+ '@swc/wasm':
-+ optional: true
-+ dependencies:
-+ '@cspotcode/source-map-support': 0.8.1
-+ '@tsconfig/node10': 1.0.9
-+ '@tsconfig/node12': 1.0.11
-+ '@tsconfig/node14': 1.0.3
-+ '@tsconfig/node16': 1.0.3
-+ '@types/node': 18.11.18
-+ acorn: 8.8.1
-+ acorn-walk: 8.2.0
-+ arg: 4.1.3
-+ create-require: 1.1.1
-+ diff: 4.0.2
-+ make-error: 1.3.6
-+ typescript: 4.9.4
-+ v8-compile-cache-lib: 3.0.1
-+ yn: 3.1.1
-+ dev: false
-+
-+ /typescript/4.9.4:
-+ resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==}
-+ engines: {node: '>=4.2.0'}
-+ hasBin: true
-+ dev: false
-+
-+ /v8-compile-cache-lib/3.0.1:
-+ resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
-+ dev: false
-+
-+ /wav/1.0.2:
-+ resolution: {integrity: sha512-viHtz3cDd/Tcr/HbNqzQCofKdF6kWUymH9LGDdskfWFoIy/HJ+RTihgjEcHfnsy1PO4e9B+y4HwgTwMrByquhg==}
-+ dependencies:
-+ buffer-alloc: 1.2.0
-+ buffer-from: 1.1.2
-+ debug: 2.6.9
-+ readable-stream: 1.1.14
-+ stream-parser: 0.3.1
-+ transitivePeerDependencies:
-+ - supports-color
-+ dev: false
-+
-+ /yn/3.1.1:
-+ resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
-+ engines: {node: '>=6'}
-+ dev: false
-+
-+ file:../..:
-+ resolution: {directory: ../.., type: directory}
-+ name: '@toots/shine.js'
-+ version: 1.0.3
-+ dev: false
-diff --git a/js/test/node/rounds.coffee b/js/test/node/rounds.coffee
-deleted file mode 100644
-index 7be6690..0000000
---- a/js/test/node/rounds.coffee
-+++ /dev/null
-@@ -1,6 +0,0 @@
--Shine = require "../../dist/libshine.js"
--runRoundsTest = require "../lib/rounds.js"
--
--console.log ""
--runRoundsTest Shine, (s) ->
-- console.log s
-diff --git a/js/test/node/rounds.ts b/js/test/node/rounds.ts
-new file mode 100644
-index 0000000..6f3e664
---- /dev/null
-+++ b/js/test/node/rounds.ts
-@@ -0,0 +1,11 @@
-+import { Shine } from "@toots/shine.js";
-+import runRoundsTest from "../lib/rounds";
-+
-+const exec = async () => {
-+ await Shine.initialized;
-+
-+ console.log("");
-+ runRoundsTest(Shine, s => console.log(s));
-+};
-+
-+exec();
-diff --git a/js/test/node/tsconfig.json b/js/test/node/tsconfig.json
-new file mode 100644
-index 0000000..d1045e4
---- /dev/null
-+++ b/js/test/node/tsconfig.json
-@@ -0,0 +1,8 @@
-+{
-+ "include": ["**/*.ts"],
-+ "compilerOptions": {
-+ "allowJs": true,
-+ "skipLibCheck": true,
-+ "esModuleInterop": true
-+ }
-+}
-diff --git a/src/bin/main.c b/src/bin/main.c
-index ab16fea..b7b70a4 100644
---- a/src/bin/main.c
-+++ b/src/bin/main.c
-@@ -35,32 +35,25 @@ int _verbose = 0;
- int stereo = STEREO;
- int force_mono = 0;
-
--int verbose()
--{
-- return _verbose;
--}
-+int verbose() { return _verbose; }
-
- /* Write out the MP3 file */
--int write_mp3(long bytes, void *buffer, void *config)
--{
-- return fwrite(buffer, sizeof(unsigned char), bytes, outfile) / sizeof(unsigned char);
-+int write_mp3(long bytes, void *buffer, void *config) {
-+ return fwrite(buffer, sizeof(unsigned char), bytes, outfile) /
-+ sizeof(unsigned char);
- }
-
- /* Output error message and exit */
--void error(char *s)
--{
-+void error(char *s) {
- fprintf(stderr, "Error: %s\n", s);
- exit(1);
- }
-
--static void print_name()
--{
-- printf("shineenc (Liquidsoap version)\n");
--}
-+static void print_name() { printf("shineenc (Liquidsoap version)\n"); }
-
--static void print_usage()
--{
-+static void print_usage() {
- printf("Usage: shineenc [options] <infile> <outfile>\n\n");
-+ printf("Use \"-\" for standard input or output.\n\n");
- printf("Options:\n");
- printf(" -h this help message\n");
- printf(" -b <bitrate> set the bitrate [8-320], default 128kbit\n");
-@@ -73,88 +66,88 @@ static void print_usage()
- }
-
- /* Use these default settings, can be overridden */
--static void set_defaults(shine_config_t *config)
--{
-+static void set_defaults(shine_config_t *config) {
- shine_set_config_mpeg_defaults(&config->mpeg);
- }
-
- /* Parse command line arguments */
--static int parse_command(int argc, char** argv, shine_config_t *config)
--{
-+static int parse_command(int argc, char **argv, shine_config_t *config) {
- int i = 0;
-
-- if(argc < 3) return 0;
-+ if (argc < 3)
-+ return 0;
-
- while (argv[++i][0] == '-' && argv[i][1] != '\000' && argv[i][1] != ' ')
- switch (argv[i][1]) {
-- case 'b':
-- config->mpeg.bitr = atoi(argv[++i]);
-- break;
--
-- case 'm':
-- force_mono = 1;
-- break;
--
-- case 'j':
-- stereo = JOINT_STEREO;
-- break;
--
-- case 'd':
-- stereo = DUAL_CHANNEL;
-- break;
--
-- case 'c':
-- config->mpeg.copyright = 1;
-- break;
--
-- case 'q':
-- quiet = 1;
-- _verbose = 0;
-- break;
--
-- case 'v':
-- _verbose = 1;
-- quiet = 0;
-- break;
--
-- case 'h':
-- default :
-- return 0;
-+ case 'b':
-+ config->mpeg.bitr = atoi(argv[++i]);
-+ break;
-+
-+ case 'm':
-+ force_mono = 1;
-+ break;
-+
-+ case 'j':
-+ stereo = JOINT_STEREO;
-+ break;
-+
-+ case 'd':
-+ stereo = DUAL_CHANNEL;
-+ break;
-+
-+ case 'c':
-+ config->mpeg.copyright = 1;
-+ break;
-+
-+ case 'q':
-+ quiet = 1;
-+ _verbose = 0;
-+ break;
-+
-+ case 'v':
-+ _verbose = 1;
-+ quiet = 0;
-+ break;
-+
-+ case 'h':
-+ default:
-+ return 0;
- }
-
-- if (argc - i != 2) return 0;
-+ if (argc - i != 2)
-+ return 0;
- infname = argv[i++];
- outfname = argv[i];
- return 1;
- }
-
- /* Print some info about what we're going to encode */
--static void check_config(shine_config_t *config)
--{
-- static char *version_names[4] = { "2.5", "reserved", "II", "I" };
-- static char *mode_names[4] = { "stereo", "joint-stereo", "dual-channel", "mono" };
-- static char *demp_names[4] = { "none", "50/15us", "", "CITT" };
-+static void check_config(shine_config_t *config) {
-+ static char *version_names[4] = {"2.5", "reserved", "II", "I"};
-+ static char *mode_names[4] = {"stereo", "joint-stereo", "dual-channel",
-+ "mono"};
-+ static char *demp_names[4] = {"none", "50/15us", "", "CITT"};
-
- printf("MPEG-%s layer III, %s Psychoacoustic Model: Shine\n",
-- version_names[shine_check_config(config->wave.samplerate, config->mpeg.bitr)],
-- mode_names[config->mpeg.mode]);
-+ version_names[shine_check_config(config->wave.samplerate,
-+ config->mpeg.bitr)],
-+ mode_names[config->mpeg.mode]);
- printf("Bitrate: %d kbps ", config->mpeg.bitr);
-- printf("De-emphasis: %s %s %s\n",
-- demp_names[config->mpeg.emph],
-- ((config->mpeg.original) ? "Original" : ""),
-- ((config->mpeg.copyright) ? "(C)" : ""));
-+ printf("De-emphasis: %s %s %s\n", demp_names[config->mpeg.emph],
-+ ((config->mpeg.original) ? "Original" : ""),
-+ ((config->mpeg.copyright) ? "(C)" : ""));
- printf("Encoding \"%s\" to \"%s\"\n", infname, outfname);
- }
-
--int main(int argc, char **argv)
--{
-- wave_t wave;
-- time_t start_time, end_time;
-- int16_t buffer[2*SHINE_MAX_SAMPLES];
-+int main(int argc, char **argv) {
-+ wave_t wave;
-+ time_t start_time, end_time;
-+ int16_t buffer[2 * SHINE_MAX_SAMPLES];
- shine_config_t config;
-- shine_t s;
-- int written;
-- unsigned char *data;
-+ shine_t s;
-+ int written;
-+ unsigned char *data;
-+ int samples_per_pass;
-
- time(&start_time);
-
-@@ -168,7 +161,8 @@ int main(int argc, char **argv)
-
- quiet = quiet || !strcmp(outfname, "-");
-
-- if (!quiet) print_name();
-+ if (!quiet)
-+ print_name();
-
- /* Open the input file and fill the config shine_wave_t header */
- if (!wave_open(infname, &wave, &config, quiet))
-@@ -205,17 +199,17 @@ int main(int argc, char **argv)
- // assert(s != NULL);
-
- /* Print some info about the file about to be created (optional) */
-- if (!quiet) check_config(&config);
-+ if (!quiet)
-+ check_config(&config);
-
-- int samples_per_pass = shine_samples_per_pass(s);
-+ samples_per_pass = shine_samples_per_pass(s);
-
- /* All the magic happens here */
- while (wave_get(buffer, &wave, samples_per_pass)) {
- data = shine_encode_buffer_interleaved(s, buffer, &written);
-- if ( write_mp3(written, data, &config) != written )
-- {
-- fprintf(stderr, "shineenc: write error\n");
-- return 1;
-+ if (write_mp3(written, data, &config) != written) {
-+ fprintf(stderr, "shineenc: write error\n");
-+ return 1;
- }
- }
-
-@@ -235,7 +229,9 @@ int main(int argc, char **argv)
- time(&end_time);
- end_time -= start_time;
- if (!quiet)
-- printf("Finished in %02ld:%02ld:%02ld (%01.1fx realtime)\n", end_time / 3600, (end_time / 60) % 60, end_time % 60, (float)wave.duration / (float)end_time);
-+ printf("Finished in %02ld:%02ld:%02ld (%01.1fx realtime)\n",
-+ end_time / 3600, (end_time / 60) % 60, end_time % 60,
-+ (float)wave.duration / (float)end_time);
-
- return 0;
- }
-diff --git a/src/bin/main.h b/src/bin/main.h
-index 52fbbb2..7ab9691 100644
---- a/src/bin/main.h
-+++ b/src/bin/main.h
-@@ -2,6 +2,6 @@
- #define MAIN_H
-
- void error(char *s);
--int verbose();
-+int verbose();
-
- #endif
-diff --git a/src/bin/wave.c b/src/bin/wave.c
-index 5d19004..3c7ab81 100644
---- a/src/bin/wave.c
-+++ b/src/bin/wave.c
-@@ -9,17 +9,32 @@
- #include "layer3.h"
-
- /* Local header */
--#include <stdint.h>
--#include <string.h>
- #include "main.h"
- #include "wave.h"
-+#include <stdint.h>
-+#include <string.h>
-
- /* RISC OS specifics */
--#define WAVE 0xfb1 /* Wave filetype */
--#define DATA 0xffd /* Data filetype */
-+#define WAVE 0xfb1 /* Wave filetype */
-+#define DATA 0xffd /* Data filetype */
-
- #define MODE_MONO 3
-
-+#ifdef SHINE_BIG_ENDIAN
-+#if defined(SHINE_HAVE_BSWAP_H)
-+#include <byteswap.h>
-+#elif defined(__GNUC__) && \
-+ (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
-+#define bswap_16(x) __builtin_bswap16(x)
-+#define bswap_32(x) __builtin_bswap32(x)
-+#else
-+#define bswap_16(x) ((((x) >> 8) & 0xff) | (((x)&0xff) << 8))
-+#define bswap_32(x) \
-+ ((((x)&0xFF) << 24) | (((x) >> 24) & 0xFF) | (((x)&0x0000FF00) << 8) | \
-+ (((x)&0x00FF0000) >> 8))
-+#endif
-+#endif
-+
- typedef struct {
- char id[4];
- uint32_t length;
-@@ -32,14 +47,28 @@ typedef struct {
-
- typedef struct {
- riff_chunk_header_t header;
-- uint16_t format; /* MS PCM = 1 */
-- uint16_t channels; /* channels, mono = 1, stereo = 2 */
-- uint32_t sample_rate; /* samples per second = 44100 */
-- uint32_t byte_rate; /* bytes per second = samp_rate * byte_samp = 176400 */
-- uint16_t frame_size; /* block align (bytes per sample) = channels * bits_per_sample / 8 = 4 */
-- uint16_t depth; /* bits per sample = 16 for MS PCM (format specific) */
-+ uint16_t format; /* MS PCM = 1 */
-+ uint16_t channels; /* channels, mono = 1, stereo = 2 */
-+ uint32_t sample_rate; /* samples per second = 44100 */
-+ uint32_t byte_rate; /* bytes per second = samp_rate * byte_samp = 176400 */
-+ uint16_t frame_size; /* block align (bytes per sample) = channels *
-+ bits_per_sample / 8 = 4 */
-+ uint16_t depth; /* bits per sample = 16 for MS PCM (format specific) */
- } fmt_chunk_t;
-
-+#ifdef SHINE_BIG_ENDIAN
-+#define native_fmt_chunk(fmt) \
-+ { \
-+ fmt.header.length = bswap_32(fmt.header.length); \
-+ fmt.format = bswap_16(fmt.format); \
-+ fmt.channels = bswap_16(fmt.channels); \
-+ fmt.sample_rate = bswap_32(fmt.sample_rate); \
-+ fmt.byte_rate = bswap_32(fmt.byte_rate); \
-+ fmt.frame_size = bswap_16(fmt.frame_size); \
-+ fmt.depth = bswap_16(fmt.depth); \
-+ }
-+#endif
-+
- void wave_seek(FILE *file, int has_seek, uint32_t bytes) {
- uint32_t i;
- if (has_seek == 1)
-@@ -50,15 +79,15 @@ void wave_seek(FILE *file, int has_seek, uint32_t bytes) {
- }
- }
-
--unsigned char wave_get_chunk_header(FILE *file, int has_seek, const char id[4], riff_chunk_header_t *header)
--{
-+unsigned char wave_get_chunk_header(FILE *file, int has_seek, const char id[4],
-+ riff_chunk_header_t *header) {
- unsigned char found = 0;
- uint32_t chunk_length;
-
- if (verbose())
- fprintf(stderr, "Looking for chunk '%s'\n", id);
-
-- while(!found) {
-+ while (!found) {
- if (fread(header, sizeof(riff_chunk_header_t), 1, file) != 1) {
- if (feof(file))
- return 0;
-@@ -69,24 +98,20 @@ unsigned char wave_get_chunk_header(FILE *file, int has_seek, const char id[4],
- /* chunks must be word-aligned, chunk data doesn't need to */
- chunk_length = header->length + header->length % 2;
- if (verbose()) {
-- fprintf(stderr, "Found chunk '%.4s', length: %u\n", header->id, header->length);
-+ fprintf(stderr, "Found chunk '%.4s', length: %u\n", header->id,
-+ header->length);
- }
-
- if (strncmp(header->id, id, 4) == 0)
- return 1;
--
-+
- wave_seek(file, has_seek, chunk_length);
- }
-
- return 1;
- }
-
--
--void wave_close(wave_t *wave)
--{
-- fclose(wave->file);
--}
--
-+void wave_close(wave_t *wave) { fclose(wave->file); }
-
- /*
- * wave_open:
-@@ -94,16 +119,17 @@ void wave_close(wave_t *wave)
- * Opens and verifies the header of the Input Wave file. The file pointer is
- * left pointing to the start of the samples.
- */
--unsigned char wave_open(const char *fname, wave_t *wave, shine_config_t *config, int quiet)
--{
-- static char *channel_mappings[] = { NULL, "mono", "stereo" };
-+unsigned char wave_open(const char *fname, wave_t *wave, shine_config_t *config,
-+ int quiet) {
-+ static char *channel_mappings[] = {NULL, "mono", "stereo"};
- wave_chunk_t wave_chunk;
- fmt_chunk_t fmt_chunk;
- riff_chunk_header_t data_chunk;
- uint32_t fmt_data, fmt_length;
-
- if (!strcmp(fname, "-")) {
-- /* TODO: support raw PCM stream with commandline parameters specifying format */
-+ /* TODO: support raw PCM stream with commandline parameters specifying
-+ * format */
- wave->file = stdin;
- wave->has_seek = 0;
- } else {
-@@ -124,14 +150,19 @@ unsigned char wave_open(const char *fname, wave_t *wave, shine_config_t *config,
- error("Not a WAVE audio file");
-
- /* Check the fmt chunk */
-- if (!wave_get_chunk_header(wave->file, wave->has_seek, "fmt ", (riff_chunk_header_t *)&fmt_chunk))
-+ if (!wave_get_chunk_header(wave->file, wave->has_seek, "fmt ",
-+ (riff_chunk_header_t *)&fmt_chunk))
- error("WAVE fmt chunk not found");
-
- fmt_data = sizeof(fmt_chunk_t) - sizeof(riff_chunk_header_t);
-
-- if(fread(&fmt_chunk.format, fmt_data, 1, wave->file) != 1)
-+ if (fread(&fmt_chunk.format, fmt_data, 1, wave->file) != 1)
- error("Read error");
-
-+#ifdef SHINE_BIG_ENDIAN
-+ native_fmt_chunk(fmt_chunk);
-+#endif
-+
- if (verbose())
- fprintf(stderr, "WAVE format: %u\n", fmt_chunk.format);
-
-@@ -153,34 +184,31 @@ unsigned char wave_open(const char *fname, wave_t *wave, shine_config_t *config,
- if (!wave_get_chunk_header(wave->file, wave->has_seek, "data", &data_chunk))
- error("WAVE data chunk not found");
-
-- config->wave.channels = fmt_chunk.channels;
-+ config->wave.channels = fmt_chunk.channels;
- config->wave.samplerate = fmt_chunk.sample_rate;
-
- wave->channels = fmt_chunk.channels;
-- wave->length = data_chunk.length;
-+ wave->length = data_chunk.length;
- wave->duration = data_chunk.length / fmt_chunk.byte_rate;
-
- if (!quiet)
- printf("%s, %s %ldHz %ldbit, duration: %02ld:%02ld:%02ld\n",
-- "WAVE PCM Data", channel_mappings[fmt_chunk.channels], (long)fmt_chunk.sample_rate, (long)fmt_chunk.depth,
-- (long)wave->duration / 3600, (long)(wave->duration / 60) % 60, (long)wave->duration % 60);
-+ "WAVE PCM Data", channel_mappings[fmt_chunk.channels],
-+ (long)fmt_chunk.sample_rate, (long)fmt_chunk.depth,
-+ (long)wave->duration / 3600, (long)(wave->duration / 60) % 60,
-+ (long)wave->duration % 60);
- return 1;
- }
-
- #ifdef SHINE_BIG_ENDIAN
--#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
--#define bswap_16(x) __builtin_bswap16(x)
--#else
--#define bswap_16(x) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
--#endif
--
--void swap_buffer(int16_t *sample_buffer, int length)
--{
-+void swap_buffer(int16_t *sample_buffer, int length) {
- int16_t *end = sample_buffer + length;
-
- if (length >= 2 * sizeof(long) / sizeof(int16_t)) {
-- const unsigned long mask = (~0UL / 0xffff) * 0xff; /* 0x00ff00ff or 0x00ff00ff00ff00ff */
-- unsigned long *long_ptr = (unsigned long *)((unsigned long)sample_buffer & -sizeof(long));
-+ const unsigned long mask =
-+ (~0UL / 0xffff) * 0xff; /* 0x00ff00ff or 0x00ff00ff00ff00ff */
-+ unsigned long *long_ptr =
-+ (unsigned long *)((unsigned long)sample_buffer & -sizeof(long));
-
- /* make sample_buffer aligned on word boundary */
- if ((int16_t *)long_ptr != sample_buffer) {
-@@ -212,18 +240,19 @@ void swap_buffer(int16_t *sample_buffer, int length)
- */
-
- /* TODO: respect data chunk length */
--int read_samples(int16_t *sample_buffer, int frame_size, FILE *file)
--{
-- int samples_read=0;
-+int read_samples(int16_t *sample_buffer, int frame_size, FILE *file) {
-+ int samples_read = 0;
-
-- samples_read = fread(sample_buffer,sizeof(int16_t),frame_size, file);
-+ samples_read = fread(sample_buffer, sizeof(int16_t), frame_size, file);
-
- #ifdef SHINE_BIG_ENDIAN
- swap_buffer(sample_buffer, samples_read);
- #endif
-
-- if(samples_read<frame_size && samples_read>0) { /* Pad sample with zero's */
-- memset(sample_buffer + samples_read, 0, (frame_size - samples_read) * sizeof(int16_t));
-+ if (samples_read < frame_size &&
-+ samples_read > 0) { /* Pad sample with zero's */
-+ memset(sample_buffer + samples_read, 0,
-+ (frame_size - samples_read) * sizeof(int16_t));
- samples_read = frame_size;
- }
-
-@@ -236,8 +265,6 @@ int read_samples(int16_t *sample_buffer, int frame_size, FILE *file)
- * Expects an interleaved 16bit pcm stream from read_samples, which it
- * reads into the given buffer.
- */
--int wave_get(int16_t *buffer, wave_t *wave, int samp_per_pass)
--{
-- return read_samples(buffer,samp_per_pass*wave->channels, wave->file);
-+int wave_get(int16_t *buffer, wave_t *wave, int samp_per_pass) {
-+ return read_samples(buffer, samp_per_pass * wave->channels, wave->file);
- }
--
-diff --git a/src/bin/wave.h b/src/bin/wave.h
-index 5a290a0..b77f0b5 100644
---- a/src/bin/wave.h
-+++ b/src/bin/wave.h
-@@ -4,15 +4,16 @@
- #include <stdio.h>
-
- typedef struct {
-- FILE *file;
-- int has_seek;
-- int channels;
-- long length;
-- long duration;
-+ FILE *file;
-+ int has_seek;
-+ int channels;
-+ long length;
-+ long duration;
- } wave_t;
-
--unsigned char wave_open(const char *fname, wave_t *wave, shine_config_t *config, int quiet);
--int wave_get(int16_t *buffer, wave_t *wave, int samp_per_frame);
-+unsigned char wave_open(const char *fname, wave_t *wave, shine_config_t *config,
-+ int quiet);
-+int wave_get(int16_t *buffer, wave_t *wave, int samp_per_frame);
- void wave_close(wave_t *wave);
-
- #endif
-diff --git a/src/lib/bitstream.c b/src/lib/bitstream.c
-index 29afcb1..9408f2c 100644
---- a/src/lib/bitstream.c
-+++ b/src/lib/bitstream.c
-@@ -7,17 +7,16 @@
- * Removed unused functions. Feb 2001 P.Everett
- */
-
--#include "types.h"
- #include "bitstream.h"
-+#include "types.h"
-
--#if !defined(__APPLE__)
-+#if !defined(__APPLE__) && !defined(__FreeBSD__)
- #include <malloc.h>
- #endif
-
- /* open the device to write the bit stream into it */
--void shine_open_bit_stream(bitstream_t *bs, int size)
--{
-- bs->data = (unsigned char *)malloc(size*sizeof(unsigned char));
-+void shine_open_bit_stream(bitstream_t *bs, int size) {
-+ bs->data = (unsigned char *)malloc(size * sizeof(unsigned char));
- bs->data_size = size;
- bs->data_position = 0;
- bs->cache = 0;
-@@ -25,8 +24,7 @@ void shine_open_bit_stream(bitstream_t *bs, int size)
- }
-
- /*close the device containing the bit stream */
--void shine_close_bit_stream(bitstream_t *bs)
--{
-+void shine_close_bit_stream(bitstream_t *bs) {
- if (bs->data)
- free(bs->data);
- }
-@@ -39,42 +37,40 @@ void shine_close_bit_stream(bitstream_t *bs)
- * val = value to write into the buffer
- * N = number of bits of val
- */
--void shine_putbits(bitstream_t *bs, unsigned int val, unsigned int N)
--{
-+void shine_putbits(bitstream_t *bs, unsigned int val, unsigned int N) {
- #ifdef DEBUG
-- if (N > 32)
-- printf("Cannot write more than 32 bits at a time.\n");
-- if (N < 32 && (val >> N) != 0)
-- printf("Upper bits (higher than %d) are not all zeros.\n", N);
-+ if (N > 32)
-+ printf("Cannot write more than 32 bits at a time.\n");
-+ if (N < 32 && (val >> N) != 0)
-+ printf("Upper bits (higher than %d) are not all zeros.\n", N);
- #endif
-
-- if (bs->cache_bits > N) {
-- bs->cache_bits -= N;
-- bs->cache |= val << bs->cache_bits;
-- } else {
-- if (bs->data_position + sizeof(unsigned int) >= bs->data_size) {
-- bs->data = (unsigned char *)realloc(bs->data, bs->data_size + (bs->data_size / 2));
-- bs->data_size += (bs->data_size / 2);
-- }
-+ if (bs->cache_bits > N) {
-+ bs->cache_bits -= N;
-+ bs->cache |= val << bs->cache_bits;
-+ } else {
-+ if (bs->data_position + sizeof(unsigned int) >= bs->data_size) {
-+ bs->data = (unsigned char *)realloc(bs->data,
-+ bs->data_size + (bs->data_size / 2));
-+ bs->data_size += (bs->data_size / 2);
-+ }
-
-- N -= bs->cache_bits;
-- bs->cache |= val >> N;
-+ N -= bs->cache_bits;
-+ bs->cache |= val >> N;
- #ifdef SHINE_BIG_ENDIAN
-- *(unsigned int*)(bs->data + bs->data_position) = bs->cache;
-+ *(unsigned int *)(bs->data + bs->data_position) = bs->cache;
- #else
-- *(unsigned int*)(bs->data + bs->data_position) = SWAB32(bs->cache);
-+ *(unsigned int *)(bs->data + bs->data_position) = SWAB32(bs->cache);
- #endif
-- bs->data_position += sizeof(unsigned int);
-- bs->cache_bits = 32 - N;
-- if (N != 0)
-- bs->cache = val << bs->cache_bits;
-- else
-- bs->cache = 0;
-- }
-+ bs->data_position += sizeof(unsigned int);
-+ bs->cache_bits = 32 - N;
-+ if (N != 0)
-+ bs->cache = val << bs->cache_bits;
-+ else
-+ bs->cache = 0;
-+ }
- }
-
--int shine_get_bits_count(bitstream_t *bs)
--{
-- return bs->data_position * 8 + 32 - bs->cache_bits;
-+int shine_get_bits_count(bitstream_t *bs) {
-+ return bs->data_position * 8 + 32 - bs->cache_bits;
- }
--
-diff --git a/src/lib/bitstream.h b/src/lib/bitstream.h
-index d910ef9..4f7efb6 100644
---- a/src/lib/bitstream.h
-+++ b/src/lib/bitstream.h
-@@ -1,28 +1,29 @@
- #ifndef BITSTREAM_H
- #define BITSTREAM_H
-
--typedef struct bit_stream_struc {
-- unsigned char *data; /* Processed data */
-- int data_size; /* Total data size */
-- int data_position; /* Data position */
-- unsigned int cache; /* bit stream cache */
-- int cache_bits; /* free bits in cache */
-+typedef struct bit_stream_struc {
-+ unsigned char *data; /* Processed data */
-+ int data_size; /* Total data size */
-+ int data_position; /* Data position */
-+ unsigned int cache; /* bit stream cache */
-+ int cache_bits; /* free bits in cache */
- } bitstream_t;
-
- /* "bit_stream.h" Definitions */
-
--#define MINIMUM 4 /* Minimum size of the buffer in bytes */
--#define MAX_LENGTH 32 /* Maximum length of word written or
-- read from bit stream */
-+#define MINIMUM 4 /* Minimum size of the buffer in bytes */
-+#define MAX_LENGTH \
-+ 32 /* Maximum length of word written or \
-+ read from bit stream */
-
--#define BUFFER_SIZE 4096
-+#define BUFFER_SIZE 4096
-
--#define MIN(A, B) ((A) < (B) ? (A) : (B))
--#define MAX(A, B) ((A) > (B) ? (A) : (B))
-+#define MIN(A, B) ((A) < (B) ? (A) : (B))
-+#define MAX(A, B) ((A) > (B) ? (A) : (B))
-
--void shine_open_bit_stream(bitstream_t *bs,const int size);
-+void shine_open_bit_stream(bitstream_t *bs, const int size);
- void shine_close_bit_stream(bitstream_t *bs);
--void shine_putbits(bitstream_t *bs,unsigned int val, unsigned int N);
--int shine_get_bits_count(bitstream_t *bs);
-+void shine_putbits(bitstream_t *bs, unsigned int val, unsigned int N);
-+int shine_get_bits_count(bitstream_t *bs);
-
- #endif
-diff --git a/src/lib/huffman.c b/src/lib/huffman.c
-index d4bd6aa..854ae41 100644
---- a/src/lib/huffman.c
-+++ b/src/lib/huffman.c
-@@ -1,120 +1,248 @@
- /* huffman.c */
-
--#include "types.h"
- #include "huffman.h"
- #include "bitstream.h"
- #include "l3bitstream.h"
-+#include "types.h"
-
--const HUFFBITS dmask = 1 << (((sizeof(HUFFBITS))<<3)-1);
--const unsigned int hs = sizeof(HUFFBITS)<<3;
-+const HUFFBITS dmask = 1 << (((sizeof(HUFFBITS)) << 3) - 1);
-+const unsigned int hs = sizeof(HUFFBITS) << 3;
-
--static const HUFFBITS t1HB[] = {1, 1, 1, 0};
--static const HUFFBITS t2HB[] = {1, 2, 1, 3, 1, 1, 3, 2, 0};
--static const HUFFBITS t3HB[] = {3, 2, 1, 1, 1, 1, 3, 2, 0};
--static const HUFFBITS t5HB[] = {1, 2, 6, 5, 3, 1, 4, 4, 7, 5, 7, 1, 6, 1, 1, 0};
--static const HUFFBITS t6HB[] = {7, 3, 5, 1, 6, 2, 3, 2, 5, 4, 4, 1, 3, 3, 2, 0};
--static const HUFFBITS t7HB[] = {1, 2, 10, 19, 16, 10, 3, 3, 7, 10, 5, 3, 11, 4, 13, 17, 8, 4, 12, 11, 18, 15, 11, 2, 7, 6, 9, 14, 3, 1, 6, 4, 5, 3, 2, 0};
--static const HUFFBITS t8HB[] = {3, 4, 6, 18, 12, 5, 5, 1, 2, 16, 9, 3, 7, 3, 5, 14, 7, 3, 19, 17, 15, 13, 10, 4, 13, 5, 8, 11, 5, 1, 12, 4, 4, 1, 1, 0};
--static const HUFFBITS t9HB[] = {7, 5, 9, 14, 15, 7, 6, 4, 5, 5, 6, 7, 7, 6, 8, 8, 8, 5, 15, 6, 9, 10, 5, 1, 11, 7, 9, 6, 4, 1, 14, 4, 6, 2, 6, 0};
--static const HUFFBITS t10HB[] = {1, 2, 10, 23, 35, 30, 12, 17, 3, 3, 8, 12, 18, 21, 12, 7, 11, 9, 15, 21, 32, 40, 19, 6, 14, 13, 22, 34, 46, 23, 18, 7, 20, 19, 33, 47, 27, 22, 9, 3, 31, 22, 41, 26, 21, 20, 5, 3, 14, 13, 10, 11, 16, 6, 5, 1, 9, 8, 7, 8, 4 , 4, 2, 0};
--static const HUFFBITS t11HB[] = {3, 4, 10, 24, 34, 33, 21, 15, 5, 3, 4, 10, 32, 17, 11, 10, 11, 7, 13, 18, 30, 31, 20, 5, 25, 11, 19, 59, 27, 18, 12, 5, 35, 33, 31, 58, 30, 16, 7, 5, 28, 26, 32, 19, 17, 15, 8, 14, 14, 12, 9, 13, 14, 9, 4, 1, 11, 4, 6, 6, 6, 3, 2, 0};
--static const HUFFBITS t12HB[] = {9, 6, 16, 33, 41, 39, 38, 26, 7, 5, 6, 9, 23, 16, 26, 11, 17, 7, 11, 14, 21, 30, 10, 7, 17, 10, 15, 12, 18, 28, 14, 5, 32, 13, 22, 19, 18, 16, 9, 5, 40, 17, 31, 29, 17, 13, 4, 2, 27, 12, 11, 15, 10, 7, 4, 1, 27, 12, 8, 12 , 6, 3, 1, 0};
--static const HUFFBITS t13HB[] = {1, 5, 14, 21, 34, 51, 46, 71, 42, 52, 68, 52, 67, 44, 43, 19, 3, 4, 12, 19, 31, 26, 44, 33, 31, 24, 32, 24, 31, 35, 22, 14, 15, 13, 23, 36, 59, 49, 77, 65, 29, 40, 30, 40, 27, 33, 42, 16, 22,
-- 20, 37, 61, 56, 79, 73, 64, 43, 76, 56, 37, 26, 31, 25, 14, 35, 16, 60, 57, 97, 75, 114, 91, 54, 73, 55, 41, 48, 53, 23, 24, 58, 27, 50, 96, 76, 70, 93, 84, 77, 58, 79, 29, 74, 49, 41, 17, 47,
-- 45, 78, 74, 115, 94, 90, 79, 69, 83, 71, 50, 59, 38, 36, 15, 72, 34, 56, 95, 92, 85, 91, 90, 86, 73, 77, 65, 51, 44, 43, 42, 43, 20, 30, 44, 55, 78, 72, 87, 78, 61, 46, 54, 37, 30, 20, 16, 53,
-- 25, 41, 37, 44, 59, 54, 81, 66, 76, 57, 54, 37, 18, 39, 11, 35, 33, 31, 57, 42, 82, 72, 80, 47, 58, 55, 21, 22, 26, 38, 22, 53, 25, 23, 38, 70, 60, 51, 36, 55, 26, 34, 23, 27, 14, 9, 7, 34, 32,
-- 28, 39, 49, 75, 30, 52, 48, 40, 52, 28, 18, 17, 9, 5, 45, 21, 34, 64, 56, 50, 49, 45, 31, 19, 12, 15, 10, 7, 6, 3, 48, 23, 20, 39, 36, 35, 53, 21, 16, 23, 13, 10, 6, 1, 4, 2, 16, 15, 17, 27, 25,
-- 20, 29, 11, 17, 12, 16, 8, 1, 1, 0, 1};
--static const HUFFBITS t15HB[] = {7, 12, 18, 53, 47, 76, 124, 108, 89, 123, 108, 119, 107, 81, 122, 63, 13, 5, 16, 27, 46, 36, 61, 51, 42, 70, 52, 83, 65, 41, 59, 36, 19, 17, 15, 24, 41, 34, 59, 48, 40, 64, 50, 78, 62, 80, 56,
-- 33, 29, 28, 25, 43, 39, 63, 55, 93, 76, 59, 93, 72, 54, 75, 50, 29, 52, 22, 42, 40, 67, 57, 95, 79, 72, 57, 89, 69, 49, 66, 46, 27, 77, 37, 35, 66, 58, 52, 91, 74, 62, 48, 79, 63, 90, 62, 40, 38,
-- 125, 32, 60, 56, 50, 92, 78, 65, 55, 87, 71, 51, 73, 51, 70, 30, 109, 53, 49, 94, 88, 75, 66, 122, 91, 73, 56, 42, 64, 44, 21, 25, 90, 43, 41, 77, 73, 63, 56, 92, 77, 66, 47, 67, 48, 53, 36, 20,
-- 71, 34, 67, 60, 58, 49, 88, 76, 67, 106, 71, 54, 38, 39, 23, 15, 109, 53, 51, 47, 90, 82, 58, 57, 48, 72, 57, 41, 23, 27, 62, 9, 86, 42, 40, 37, 70, 64, 52, 43, 70, 55, 42, 25, 29, 18, 11, 11,
-- 118, 68, 30, 55, 50, 46, 74, 65, 49, 39, 24, 16, 22, 13, 14, 7, 91, 44, 39, 38, 34, 63, 52, 45, 31, 52, 28, 19, 14, 8, 9, 3, 123, 60, 58, 53, 47, 43, 32, 22, 37, 24, 17, 12, 15, 10, 2, 1, 71,
-- 37, 34, 30, 28, 20, 17, 26, 21, 16, 10, 6, 8, 6, 2, 0};
--static const HUFFBITS t16HB[] = {1, 5, 14, 44, 74, 63, 110, 93, 172, 149, 138, 242, 225, 195, 376, 17, 3, 4, 12, 20, 35, 62, 53, 47, 83, 75, 68, 119, 201, 107, 207, 9, 15, 13, 23, 38, 67, 58, 103, 90, 161, 72, 127, 117,
-- 110, 209, 206, 16, 45, 21, 39, 69, 64, 114, 99, 87, 158, 140, 252, 212, 199, 387, 365, 26, 75, 36, 68, 65, 115, 101, 179, 164, 155, 264, 246, 226, 395, 382, 362, 9, 66, 30, 59, 56, 102,
-- 185, 173, 265, 142, 253, 232, 400, 388, 378, 445, 16, 111, 54, 52, 100, 184, 178, 160, 133, 257, 244, 228, 217, 385, 366, 715, 10, 98, 48, 91, 88, 165, 157, 148, 261, 248, 407, 397, 372,
-- 380, 889, 884, 8, 85, 84, 81, 159, 156, 143, 260, 249, 427, 401, 392, 383, 727, 713, 708, 7, 154, 76, 73, 141, 131, 256, 245, 426, 406, 394, 384, 735, 359, 710, 352, 11, 139, 129, 67, 125,
-- 247, 233, 229, 219, 393, 743, 737, 720, 885, 882, 439, 4, 243, 120, 118, 115, 227, 223, 396, 746, 742, 736, 721, 712, 706, 223, 436, 6, 202, 224, 222, 218, 216, 389, 386, 381, 364, 888,
-- 443, 707, 440, 437, 1728, 4, 747, 211, 210, 208, 370, 379, 734, 723, 714, 1735, 883, 877, 876, 3459, 865, 2, 377, 369, 102, 187, 726, 722, 358, 711, 709, 866, 1734, 871, 3458, 870, 434,
-- 0, 12, 10, 7, 11, 10, 17, 11, 9, 13, 12, 10, 7, 5, 3, 1, 3};
--static const HUFFBITS t24HB[] = {15, 13, 46, 80, 146, 262, 248, 434, 426, 669, 653, 649, 621, 517, 1032, 88, 14, 12, 21, 38, 71, 130, 122, 216, 209, 198, 327, 345, 319, 297, 279, 42, 47, 22, 41, 74, 68, 128, 120, 221,
-- 207, 194, 182, 340, 315, 295, 541, 18, 81, 39, 75, 70, 134, 125, 116, 220, 204, 190, 178, 325, 311, 293, 271, 16, 147, 72, 69, 135, 127, 118, 112, 210, 200, 188, 352, 323, 306, 285,
-- 540, 14, 263, 66, 129, 126, 119, 114, 214, 202, 192, 180, 341, 317, 301, 281, 262, 12, 249, 123, 121, 117, 113, 215, 206, 195, 185, 347, 330, 308, 291, 272, 520, 10, 435, 115, 111,
-- 109, 211, 203, 196, 187, 353, 332, 313, 298, 283, 531, 381, 17, 427, 212, 208, 205, 201, 193, 186, 177, 169, 320, 303, 286, 268, 514, 377, 16, 335, 199, 197, 191, 189, 181, 174, 333,
-- 321, 305, 289, 275, 521, 379, 371, 11, 668, 184, 183, 179, 175, 344, 331, 314, 304, 290, 277, 530, 383, 373, 366, 10, 652, 346, 171, 168, 164, 318, 309, 299, 287, 276, 263, 513, 375,
-- 368, 362, 6, 648, 322, 316, 312, 307, 302, 292, 284, 269, 261, 512, 376, 370, 364, 359, 4, 620, 300, 296, 294, 288, 282, 273, 266, 515, 380, 374, 369, 365, 361, 357, 2, 1033, 280, 278,
-- 274, 267, 264, 259, 382, 378, 372, 367, 363, 360, 358, 356, 0, 43, 20, 19, 17, 15, 13, 11, 9, 7, 6, 4, 7, 5, 3, 1, 3};
--static const HUFFBITS t32HB[] = {1, 5, 4, 5, 6, 5, 4, 4, 7, 3, 6, 0, 7, 2, 3, 1};
--static const HUFFBITS t33HB[] = {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
-+static const HUFFBITS t1HB[] = {1, 1, 1, 0};
-+static const HUFFBITS t2HB[] = {1, 2, 1, 3, 1, 1, 3, 2, 0};
-+static const HUFFBITS t3HB[] = {3, 2, 1, 1, 1, 1, 3, 2, 0};
-+static const HUFFBITS t5HB[] = {1, 2, 6, 5, 3, 1, 4, 4, 7, 5, 7, 1, 6, 1, 1, 0};
-+static const HUFFBITS t6HB[] = {7, 3, 5, 1, 6, 2, 3, 2, 5, 4, 4, 1, 3, 3, 2, 0};
-+static const HUFFBITS t7HB[] = {1, 2, 10, 19, 16, 10, 3, 3, 7, 10, 5, 3,
-+ 11, 4, 13, 17, 8, 4, 12, 11, 18, 15, 11, 2,
-+ 7, 6, 9, 14, 3, 1, 6, 4, 5, 3, 2, 0};
-+static const HUFFBITS t8HB[] = {3, 4, 6, 18, 12, 5, 5, 1, 2, 16, 9, 3,
-+ 7, 3, 5, 14, 7, 3, 19, 17, 15, 13, 10, 4,
-+ 13, 5, 8, 11, 5, 1, 12, 4, 4, 1, 1, 0};
-+static const HUFFBITS t9HB[] = {7, 5, 9, 14, 15, 7, 6, 4, 5, 5, 6, 7,
-+ 7, 6, 8, 8, 8, 5, 15, 6, 9, 10, 5, 1,
-+ 11, 7, 9, 6, 4, 1, 14, 4, 6, 2, 6, 0};
-+static const HUFFBITS t10HB[] = {
-+ 1, 2, 10, 23, 35, 30, 12, 17, 3, 3, 8, 12, 18, 21, 12, 7,
-+ 11, 9, 15, 21, 32, 40, 19, 6, 14, 13, 22, 34, 46, 23, 18, 7,
-+ 20, 19, 33, 47, 27, 22, 9, 3, 31, 22, 41, 26, 21, 20, 5, 3,
-+ 14, 13, 10, 11, 16, 6, 5, 1, 9, 8, 7, 8, 4, 4, 2, 0};
-+static const HUFFBITS t11HB[] = {
-+ 3, 4, 10, 24, 34, 33, 21, 15, 5, 3, 4, 10, 32, 17, 11, 10,
-+ 11, 7, 13, 18, 30, 31, 20, 5, 25, 11, 19, 59, 27, 18, 12, 5,
-+ 35, 33, 31, 58, 30, 16, 7, 5, 28, 26, 32, 19, 17, 15, 8, 14,
-+ 14, 12, 9, 13, 14, 9, 4, 1, 11, 4, 6, 6, 6, 3, 2, 0};
-+static const HUFFBITS t12HB[] = {
-+ 9, 6, 16, 33, 41, 39, 38, 26, 7, 5, 6, 9, 23, 16, 26, 11,
-+ 17, 7, 11, 14, 21, 30, 10, 7, 17, 10, 15, 12, 18, 28, 14, 5,
-+ 32, 13, 22, 19, 18, 16, 9, 5, 40, 17, 31, 29, 17, 13, 4, 2,
-+ 27, 12, 11, 15, 10, 7, 4, 1, 27, 12, 8, 12, 6, 3, 1, 0};
-+static const HUFFBITS t13HB[] = {
-+ 1, 5, 14, 21, 34, 51, 46, 71, 42, 52, 68, 52, 67, 44, 43, 19, 3, 4,
-+ 12, 19, 31, 26, 44, 33, 31, 24, 32, 24, 31, 35, 22, 14, 15, 13, 23, 36,
-+ 59, 49, 77, 65, 29, 40, 30, 40, 27, 33, 42, 16, 22, 20, 37, 61, 56, 79,
-+ 73, 64, 43, 76, 56, 37, 26, 31, 25, 14, 35, 16, 60, 57, 97, 75, 114, 91,
-+ 54, 73, 55, 41, 48, 53, 23, 24, 58, 27, 50, 96, 76, 70, 93, 84, 77, 58,
-+ 79, 29, 74, 49, 41, 17, 47, 45, 78, 74, 115, 94, 90, 79, 69, 83, 71, 50,
-+ 59, 38, 36, 15, 72, 34, 56, 95, 92, 85, 91, 90, 86, 73, 77, 65, 51, 44,
-+ 43, 42, 43, 20, 30, 44, 55, 78, 72, 87, 78, 61, 46, 54, 37, 30, 20, 16,
-+ 53, 25, 41, 37, 44, 59, 54, 81, 66, 76, 57, 54, 37, 18, 39, 11, 35, 33,
-+ 31, 57, 42, 82, 72, 80, 47, 58, 55, 21, 22, 26, 38, 22, 53, 25, 23, 38,
-+ 70, 60, 51, 36, 55, 26, 34, 23, 27, 14, 9, 7, 34, 32, 28, 39, 49, 75,
-+ 30, 52, 48, 40, 52, 28, 18, 17, 9, 5, 45, 21, 34, 64, 56, 50, 49, 45,
-+ 31, 19, 12, 15, 10, 7, 6, 3, 48, 23, 20, 39, 36, 35, 53, 21, 16, 23,
-+ 13, 10, 6, 1, 4, 2, 16, 15, 17, 27, 25, 20, 29, 11, 17, 12, 16, 8,
-+ 1, 1, 0, 1};
-+static const HUFFBITS t15HB[] = {
-+ 7, 12, 18, 53, 47, 76, 124, 108, 89, 123, 108, 119, 107, 81, 122, 63,
-+ 13, 5, 16, 27, 46, 36, 61, 51, 42, 70, 52, 83, 65, 41, 59, 36,
-+ 19, 17, 15, 24, 41, 34, 59, 48, 40, 64, 50, 78, 62, 80, 56, 33,
-+ 29, 28, 25, 43, 39, 63, 55, 93, 76, 59, 93, 72, 54, 75, 50, 29,
-+ 52, 22, 42, 40, 67, 57, 95, 79, 72, 57, 89, 69, 49, 66, 46, 27,
-+ 77, 37, 35, 66, 58, 52, 91, 74, 62, 48, 79, 63, 90, 62, 40, 38,
-+ 125, 32, 60, 56, 50, 92, 78, 65, 55, 87, 71, 51, 73, 51, 70, 30,
-+ 109, 53, 49, 94, 88, 75, 66, 122, 91, 73, 56, 42, 64, 44, 21, 25,
-+ 90, 43, 41, 77, 73, 63, 56, 92, 77, 66, 47, 67, 48, 53, 36, 20,
-+ 71, 34, 67, 60, 58, 49, 88, 76, 67, 106, 71, 54, 38, 39, 23, 15,
-+ 109, 53, 51, 47, 90, 82, 58, 57, 48, 72, 57, 41, 23, 27, 62, 9,
-+ 86, 42, 40, 37, 70, 64, 52, 43, 70, 55, 42, 25, 29, 18, 11, 11,
-+ 118, 68, 30, 55, 50, 46, 74, 65, 49, 39, 24, 16, 22, 13, 14, 7,
-+ 91, 44, 39, 38, 34, 63, 52, 45, 31, 52, 28, 19, 14, 8, 9, 3,
-+ 123, 60, 58, 53, 47, 43, 32, 22, 37, 24, 17, 12, 15, 10, 2, 1,
-+ 71, 37, 34, 30, 28, 20, 17, 26, 21, 16, 10, 6, 8, 6, 2, 0};
-+static const HUFFBITS t16HB[] = {
-+ 1, 5, 14, 44, 74, 63, 110, 93, 172, 149, 138, 242, 225, 195,
-+ 376, 17, 3, 4, 12, 20, 35, 62, 53, 47, 83, 75, 68, 119,
-+ 201, 107, 207, 9, 15, 13, 23, 38, 67, 58, 103, 90, 161, 72,
-+ 127, 117, 110, 209, 206, 16, 45, 21, 39, 69, 64, 114, 99, 87,
-+ 158, 140, 252, 212, 199, 387, 365, 26, 75, 36, 68, 65, 115, 101,
-+ 179, 164, 155, 264, 246, 226, 395, 382, 362, 9, 66, 30, 59, 56,
-+ 102, 185, 173, 265, 142, 253, 232, 400, 388, 378, 445, 16, 111, 54,
-+ 52, 100, 184, 178, 160, 133, 257, 244, 228, 217, 385, 366, 715, 10,
-+ 98, 48, 91, 88, 165, 157, 148, 261, 248, 407, 397, 372, 380, 889,
-+ 884, 8, 85, 84, 81, 159, 156, 143, 260, 249, 427, 401, 392, 383,
-+ 727, 713, 708, 7, 154, 76, 73, 141, 131, 256, 245, 426, 406, 394,
-+ 384, 735, 359, 710, 352, 11, 139, 129, 67, 125, 247, 233, 229, 219,
-+ 393, 743, 737, 720, 885, 882, 439, 4, 243, 120, 118, 115, 227, 223,
-+ 396, 746, 742, 736, 721, 712, 706, 223, 436, 6, 202, 224, 222, 218,
-+ 216, 389, 386, 381, 364, 888, 443, 707, 440, 437, 1728, 4, 747, 211,
-+ 210, 208, 370, 379, 734, 723, 714, 1735, 883, 877, 876, 3459, 865, 2,
-+ 377, 369, 102, 187, 726, 722, 358, 711, 709, 866, 1734, 871, 3458, 870,
-+ 434, 0, 12, 10, 7, 11, 10, 17, 11, 9, 13, 12, 10, 7,
-+ 5, 3, 1, 3};
-+static const HUFFBITS t24HB[] = {
-+ 15, 13, 46, 80, 146, 262, 248, 434, 426, 669, 653, 649, 621, 517, 1032,
-+ 88, 14, 12, 21, 38, 71, 130, 122, 216, 209, 198, 327, 345, 319, 297,
-+ 279, 42, 47, 22, 41, 74, 68, 128, 120, 221, 207, 194, 182, 340, 315,
-+ 295, 541, 18, 81, 39, 75, 70, 134, 125, 116, 220, 204, 190, 178, 325,
-+ 311, 293, 271, 16, 147, 72, 69, 135, 127, 118, 112, 210, 200, 188, 352,
-+ 323, 306, 285, 540, 14, 263, 66, 129, 126, 119, 114, 214, 202, 192, 180,
-+ 341, 317, 301, 281, 262, 12, 249, 123, 121, 117, 113, 215, 206, 195, 185,
-+ 347, 330, 308, 291, 272, 520, 10, 435, 115, 111, 109, 211, 203, 196, 187,
-+ 353, 332, 313, 298, 283, 531, 381, 17, 427, 212, 208, 205, 201, 193, 186,
-+ 177, 169, 320, 303, 286, 268, 514, 377, 16, 335, 199, 197, 191, 189, 181,
-+ 174, 333, 321, 305, 289, 275, 521, 379, 371, 11, 668, 184, 183, 179, 175,
-+ 344, 331, 314, 304, 290, 277, 530, 383, 373, 366, 10, 652, 346, 171, 168,
-+ 164, 318, 309, 299, 287, 276, 263, 513, 375, 368, 362, 6, 648, 322, 316,
-+ 312, 307, 302, 292, 284, 269, 261, 512, 376, 370, 364, 359, 4, 620, 300,
-+ 296, 294, 288, 282, 273, 266, 515, 380, 374, 369, 365, 361, 357, 2, 1033,
-+ 280, 278, 274, 267, 264, 259, 382, 378, 372, 367, 363, 360, 358, 356, 0,
-+ 43, 20, 19, 17, 15, 13, 11, 9, 7, 6, 4, 7, 5, 3, 1,
-+ 3};
-+static const HUFFBITS t32HB[] = {1, 5, 4, 5, 6, 5, 4, 4,
-+ 7, 3, 6, 0, 7, 2, 3, 1};
-+static const HUFFBITS t33HB[] = {15, 14, 13, 12, 11, 10, 9, 8,
-+ 7, 6, 5, 4, 3, 2, 1, 0};
-
--static const unsigned char t1l[] = {1, 3, 2, 3};
--static const unsigned char t2l[] = {1, 3, 6, 3, 3, 5, 5, 5, 6};
--static const unsigned char t3l[] = {2, 2, 6, 3, 2, 5, 5, 5, 6};
--static const unsigned char t5l[] = {1, 3, 6, 7, 3, 3, 6, 7, 6, 6, 7, 8, 7, 6, 7, 8};
--static const unsigned char t6l[] = {3, 3, 5, 7, 3, 2, 4, 5, 4, 4, 5, 6, 6, 5, 6, 7};
--static const unsigned char t7l[] = {1, 3, 6, 8, 8, 9, 3, 4, 6, 7, 7, 8, 6, 5, 7, 8, 8, 9, 7, 7, 8, 9, 9, 9, 7, 7, 8, 9, 9, 10, 8, 8, 9, 10, 10, 10};
--static const unsigned char t8l[] = {2, 3, 6, 8, 8, 9, 3, 2, 4, 8, 8, 8, 6, 4, 6, 8, 8, 9, 8, 8, 8, 9, 9, 10, 8, 7, 8, 9, 10, 10, 9, 8, 9, 9, 11, 11};
--static const unsigned char t9l[] = {3, 3, 5, 6, 8, 9, 3, 3, 4, 5, 6, 8, 4, 4, 5, 6, 7, 8, 6, 5, 6, 7, 7, 8, 7, 6, 7, 7, 8, 9, 8, 7, 8, 8, 9, 9};
--static const unsigned char t10l[] = {1, 3, 6, 8, 9, 9, 9, 10, 3, 4, 6, 7, 8, 9, 8, 8, 6, 6, 7, 8, 9, 10, 9, 9, 7, 7, 8, 9, 10, 10, 9, 10, 8, 8, 9, 10, 10, 10, 10, 10, 9, 9, 10, 10, 11, 11, 10, 11, 8, 8, 9, 10, 10, 10, 11, 11, 9, 8, 9, 10, 10, 11, 11, 11};
--static const unsigned char t11l[] = {2, 3, 5, 7, 8, 9, 8, 9, 3, 3, 4, 6, 8, 8, 7, 8, 5, 5, 6, 7, 8, 9, 8, 8, 7, 6, 7, 9, 8, 10, 8, 9, 8, 8, 8, 9, 9, 10, 9, 10, 8, 8, 9, 10, 10, 11, 10, 11, 8, 7, 7, 8, 9, 10, 10, 10, 8, 7, 8, 9, 10, 10, 10, 10};
--static const unsigned char t12l[] = {4, 3, 5, 7, 8, 9, 9, 9, 3, 3, 4, 5, 7, 7, 8, 8, 5, 4, 5, 6, 7, 8, 7, 8, 6, 5, 6, 6, 7, 8, 8, 8, 7, 6, 7, 7, 8, 8, 8, 9, 8, 7, 8, 8, 8, 9, 8, 9, 8, 7, 7, 8, 8, 9, 9, 10, 9, 8, 8, 9, 9, 9, 9, 10};
--static const unsigned char t13l[] = {1, 4, 6, 7, 8, 9, 9, 10, 9, 10, 11, 11, 12, 12, 13, 13, 3, 4, 6, 7, 8, 8, 9, 9, 9, 9, 10, 10, 11, 12, 12, 12, 6, 6, 7, 8, 9, 9, 10, 10, 9, 10, 10, 11, 11, 12, 13, 13, 7, 7, 8, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 13, 13,
--8, 7, 9, 9, 10, 10, 11, 11, 10, 11, 11, 12, 12, 13, 13, 14, 9, 8, 9, 10, 10, 10, 11, 11, 11, 11, 12, 11, 13, 13, 14, 14, 9, 9, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 13, 13, 14, 14, 10, 9, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 16, 16, 9, 8, 9, 10,
--10, 11, 11, 12, 12, 12, 12, 13, 13, 14, 15, 15, 10, 9, 10, 10, 11, 11, 11, 13, 12, 13, 13, 14, 14, 14, 16, 15, 10, 10, 10, 11, 11, 12, 12, 13, 12, 13, 14, 13, 14, 15, 16, 17, 11, 10, 10, 11, 12, 12, 12, 12, 13, 13, 13, 14, 15, 15, 15, 16, 11, 11, 11, 12, 12,
--13, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16, 12, 11, 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 16, 15, 16, 16, 13, 12, 12, 13, 13, 13, 15, 14, 14, 17, 15, 15, 15, 17, 16, 16, 12, 12, 13, 14, 14, 14, 15, 14, 15, 15, 16, 16, 19, 18, 19, 16};
--static const unsigned char t15l[] = {3, 4, 5, 7, 7, 8, 9, 9, 9, 10, 10, 11, 11, 11, 12, 13, 4, 3, 5, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 5, 5, 5, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 11, 6, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 7, 6, 7,
-- 7, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 11, 8, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 11, 11, 11, 12, 9, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 9, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 12, 9, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11,
-- 12, 12, 12, 9, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 10, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 13, 12, 10, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 11, 10, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 13, 13,
--11, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 12, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 12, 13, 12, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13};
--static const unsigned char t16l[] = {1, 4, 6, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 9, 3, 4, 6, 7, 8, 9, 9, 9, 10, 10, 10, 11, 12, 11, 12, 8, 6, 6, 7, 8, 9, 9, 10, 10, 11, 10, 11, 11, 11, 12, 12, 9, 8, 7, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13,
-- 10, 9, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 9, 9, 8, 9, 9, 10, 11, 11, 12, 11, 12, 12, 13, 13, 13, 14, 10, 10, 9, 9, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 14, 10, 10, 9, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 15, 15, 10, 10, 10,
-- 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 14, 10, 11, 10, 10, 11, 11, 12, 12, 13, 13, 13, 13, 14, 13, 14, 13, 11, 11, 11, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14, 15, 15, 14, 10, 12, 11, 11, 11, 12, 12, 13, 14, 14, 14, 14, 14, 14, 13, 14, 11, 12, 12,
-- 12, 12, 12, 13, 13, 13, 13, 15, 14, 14, 14, 14, 16, 11, 14, 12, 12, 12, 13, 13, 14, 14, 14, 16, 15, 15, 15, 17, 15, 11, 13, 13, 11, 12, 14, 14, 13, 14, 14, 15, 16, 15, 17, 15, 14, 11, 9, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 8};
--static const unsigned char t24l[] = {4, 4, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 12, 9, 4, 4, 5, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10, 8, 6, 5, 6, 7, 7, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 7, 7, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 7, 8, 7, 7, 8,
-- 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 7, 9, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 7, 9, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 7, 10, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 8, 10, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11,
--8, 10, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 8, 11, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 8, 11, 10, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 8, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 8, 11, 10, 10,
-- 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 8, 12, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 4};
--static const unsigned char t32l[] = {1, 4, 4, 5, 4, 6, 5, 6, 4, 5, 5, 6, 5, 6, 6, 6};
--static const unsigned char t33l[] = {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4};
-+static const unsigned char t1l[] = {1, 3, 2, 3};
-+static const unsigned char t2l[] = {1, 3, 6, 3, 3, 5, 5, 5, 6};
-+static const unsigned char t3l[] = {2, 2, 6, 3, 2, 5, 5, 5, 6};
-+static const unsigned char t5l[] = {1, 3, 6, 7, 3, 3, 6, 7,
-+ 6, 6, 7, 8, 7, 6, 7, 8};
-+static const unsigned char t6l[] = {3, 3, 5, 7, 3, 2, 4, 5,
-+ 4, 4, 5, 6, 6, 5, 6, 7};
-+static const unsigned char t7l[] = {1, 3, 6, 8, 8, 9, 3, 4, 6, 7, 7, 8,
-+ 6, 5, 7, 8, 8, 9, 7, 7, 8, 9, 9, 9,
-+ 7, 7, 8, 9, 9, 10, 8, 8, 9, 10, 10, 10};
-+static const unsigned char t8l[] = {2, 3, 6, 8, 8, 9, 3, 2, 4, 8, 8, 8,
-+ 6, 4, 6, 8, 8, 9, 8, 8, 8, 9, 9, 10,
-+ 8, 7, 8, 9, 10, 10, 9, 8, 9, 9, 11, 11};
-+static const unsigned char t9l[] = {3, 3, 5, 6, 8, 9, 3, 3, 4, 5, 6, 8,
-+ 4, 4, 5, 6, 7, 8, 6, 5, 6, 7, 7, 8,
-+ 7, 6, 7, 7, 8, 9, 8, 7, 8, 8, 9, 9};
-+static const unsigned char t10l[] = {
-+ 1, 3, 6, 8, 9, 9, 9, 10, 3, 4, 6, 7, 8, 9, 8, 8,
-+ 6, 6, 7, 8, 9, 10, 9, 9, 7, 7, 8, 9, 10, 10, 9, 10,
-+ 8, 8, 9, 10, 10, 10, 10, 10, 9, 9, 10, 10, 11, 11, 10, 11,
-+ 8, 8, 9, 10, 10, 10, 11, 11, 9, 8, 9, 10, 10, 11, 11, 11};
-+static const unsigned char t11l[] = {
-+ 2, 3, 5, 7, 8, 9, 8, 9, 3, 3, 4, 6, 8, 8, 7, 8,
-+ 5, 5, 6, 7, 8, 9, 8, 8, 7, 6, 7, 9, 8, 10, 8, 9,
-+ 8, 8, 8, 9, 9, 10, 9, 10, 8, 8, 9, 10, 10, 11, 10, 11,
-+ 8, 7, 7, 8, 9, 10, 10, 10, 8, 7, 8, 9, 10, 10, 10, 10};
-+static const unsigned char t12l[] = {
-+ 4, 3, 5, 7, 8, 9, 9, 9, 3, 3, 4, 5, 7, 7, 8, 8, 5, 4, 5, 6, 7, 8,
-+ 7, 8, 6, 5, 6, 6, 7, 8, 8, 8, 7, 6, 7, 7, 8, 8, 8, 9, 8, 7, 8, 8,
-+ 8, 9, 8, 9, 8, 7, 7, 8, 8, 9, 9, 10, 9, 8, 8, 9, 9, 9, 9, 10};
-+static const unsigned char t13l[] = {
-+ 1, 4, 6, 7, 8, 9, 9, 10, 9, 10, 11, 11, 12, 12, 13, 13, 3, 4, 6,
-+ 7, 8, 8, 9, 9, 9, 9, 10, 10, 11, 12, 12, 12, 6, 6, 7, 8, 9, 9,
-+ 10, 10, 9, 10, 10, 11, 11, 12, 13, 13, 7, 7, 8, 9, 9, 10, 10, 10, 10,
-+ 11, 11, 11, 11, 12, 13, 13, 8, 7, 9, 9, 10, 10, 11, 11, 10, 11, 11, 12,
-+ 12, 13, 13, 14, 9, 8, 9, 10, 10, 10, 11, 11, 11, 11, 12, 11, 13, 13, 14,
-+ 14, 9, 9, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 13, 13, 14, 14, 10, 9,
-+ 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 16, 16, 9, 8, 9, 10, 10,
-+ 11, 11, 12, 12, 12, 12, 13, 13, 14, 15, 15, 10, 9, 10, 10, 11, 11, 11, 13,
-+ 12, 13, 13, 14, 14, 14, 16, 15, 10, 10, 10, 11, 11, 12, 12, 13, 12, 13, 14,
-+ 13, 14, 15, 16, 17, 11, 10, 10, 11, 12, 12, 12, 12, 13, 13, 13, 14, 15, 15,
-+ 15, 16, 11, 11, 11, 12, 12, 13, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16, 12,
-+ 11, 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 16, 15, 16, 16, 13, 12, 12, 13,
-+ 13, 13, 15, 14, 14, 17, 15, 15, 15, 17, 16, 16, 12, 12, 13, 14, 14, 14, 15,
-+ 14, 15, 15, 16, 16, 19, 18, 19, 16};
-+static const unsigned char t15l[] = {
-+ 3, 4, 5, 7, 7, 8, 9, 9, 9, 10, 10, 11, 11, 11, 12, 13, 4, 3, 5,
-+ 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 5, 5, 5, 6, 7, 7,
-+ 8, 8, 8, 9, 9, 10, 10, 11, 11, 11, 6, 6, 6, 7, 7, 8, 8, 9, 9,
-+ 9, 10, 10, 10, 11, 11, 11, 7, 6, 7, 7, 8, 8, 9, 9, 9, 9, 10, 10,
-+ 10, 11, 11, 11, 8, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 11, 11, 11,
-+ 12, 9, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 9, 8,
-+ 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 12, 9, 8, 8, 9, 9,
-+ 9, 9, 10, 10, 10, 10, 11, 11, 12, 12, 12, 9, 8, 9, 9, 9, 9, 10, 10,
-+ 10, 11, 11, 11, 11, 12, 12, 12, 10, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11,
-+ 11, 11, 12, 13, 12, 10, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12,
-+ 12, 13, 11, 10, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 13, 13, 11,
-+ 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 12, 11, 11, 11,
-+ 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 12, 13, 12, 11, 11, 11, 11, 11, 11,
-+ 12, 12, 12, 12, 12, 13, 13, 13, 13};
-+static const unsigned char t16l[] = {
-+ 1, 4, 6, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 9, 3, 4, 6,
-+ 7, 8, 9, 9, 9, 10, 10, 10, 11, 12, 11, 12, 8, 6, 6, 7, 8, 9, 9,
-+ 10, 10, 11, 10, 11, 11, 11, 12, 12, 9, 8, 7, 8, 9, 9, 10, 10, 10, 11,
-+ 11, 12, 12, 12, 13, 13, 10, 9, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12,
-+ 13, 13, 13, 9, 9, 8, 9, 9, 10, 11, 11, 12, 11, 12, 12, 13, 13, 13, 14,
-+ 10, 10, 9, 9, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 14, 10, 10, 9,
-+ 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 15, 15, 10, 10, 10, 10, 11, 11,
-+ 11, 12, 12, 13, 13, 13, 13, 14, 14, 14, 10, 11, 10, 10, 11, 11, 12, 12, 13,
-+ 13, 13, 13, 14, 13, 14, 13, 11, 11, 11, 10, 11, 12, 12, 12, 12, 13, 14, 14,
-+ 14, 15, 15, 14, 10, 12, 11, 11, 11, 12, 12, 13, 14, 14, 14, 14, 14, 14, 13,
-+ 14, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 15, 14, 14, 14, 14, 16, 11, 14,
-+ 12, 12, 12, 13, 13, 14, 14, 14, 16, 15, 15, 15, 17, 15, 11, 13, 13, 11, 12,
-+ 14, 14, 13, 14, 14, 15, 16, 15, 17, 15, 14, 11, 9, 8, 8, 9, 9, 10, 10,
-+ 10, 11, 11, 11, 11, 11, 11, 11, 8};
-+static const unsigned char t24l[] = {
-+ 4, 4, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 12, 9, 4, 4, 5,
-+ 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10, 8, 6, 5, 6, 7, 7, 8,
-+ 8, 9, 9, 9, 9, 10, 10, 10, 11, 7, 7, 6, 7, 7, 8, 8, 8, 9, 9,
-+ 9, 9, 10, 10, 10, 10, 7, 8, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10,
-+ 10, 10, 11, 7, 9, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10,
-+ 7, 9, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 7, 10, 8,
-+ 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 8, 10, 9, 9, 9, 9,
-+ 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 8, 10, 9, 9, 9, 9, 9, 9, 10,
-+ 10, 10, 10, 10, 11, 11, 11, 8, 11, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10,
-+ 11, 11, 11, 11, 8, 11, 10, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11,
-+ 11, 8, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 8, 11,
-+ 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 8, 12, 10, 10, 10,
-+ 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 8, 8, 7, 7, 7, 7, 7, 7,
-+ 7, 7, 7, 7, 8, 8, 8, 8, 4};
-+static const unsigned char t32l[] = {1, 4, 4, 5, 4, 6, 5, 6,
-+ 4, 5, 5, 6, 5, 6, 6, 6};
-+static const unsigned char t33l[] = {4, 4, 4, 4, 4, 4, 4, 4,
-+ 4, 4, 4, 4, 4, 4, 4, 4};
-
- #define NOREF -1
--const struct huffcodetab shine_huffman_table[HTN] =
--{
--{ 0, 0, 0, 0,NULL,NULL},
--{ 2, 2, 0, 0,t1HB, t1l},
--{ 3, 3, 0, 0,t2HB, t2l},
--{ 3, 3, 0, 0,t3HB, t3l},
--{ 0, 0, 0, 0,NULL,NULL},/* Apparently not used*/
--{ 4, 4, 0, 0,t5HB, t5l},
--{ 4, 4, 0, 0,t6HB, t6l},
--{ 6, 6, 0, 0,t7HB, t7l},
--{ 6, 6, 0, 0,t8HB, t8l},
--{ 6, 6, 0, 0,t9HB, t9l},
--{ 8, 8, 0, 0,t10HB, t10l},
--{ 8, 8, 0, 0,t11HB, t11l},
--{ 8, 8, 0, 0,t12HB, t12l},
--{16,16, 0, 0,t13HB, t13l},
--{ 0, 0, 0, 0,NULL,NULL},/* Apparently not used*/
--{16,16, 0, 0,t15HB, t15l},
--{16,16, 1, 1,t16HB, t16l},
--{16,16, 2, 3,t16HB, t16l},
--{16,16, 3, 7,t16HB, t16l},
--{16,16, 4, 15,t16HB, t16l},
--{16,16, 6, 63,t16HB, t16l},
--{16,16, 8, 255,t16HB, t16l},
--{16,16,10,1023,t16HB, t16l},
--{16,16,13,8191,t16HB, t16l},
--{16,16, 4, 15,t24HB, t24l},
--{16,16, 5, 31,t24HB, t24l},
--{16,16, 6, 63,t24HB, t24l},
--{16,16, 7, 127,t24HB, t24l},
--{16,16, 8, 255,t24HB, t24l},
--{16,16, 9, 511,t24HB, t24l},
--{16,16,11,2047,t24HB, t24l},
--{16,16,13,8191,t24HB, t24l},
--{ 1,16, 0, 0,t32HB, t32l},
--{ 1,16, 0, 0,t33HB, t33l},
-+const struct huffcodetab shine_huffman_table[HTN] = {
-+ {0, 0, 0, 0, NULL, NULL},
-+ {2, 2, 0, 0, t1HB, t1l},
-+ {3, 3, 0, 0, t2HB, t2l},
-+ {3, 3, 0, 0, t3HB, t3l},
-+ {0, 0, 0, 0, NULL, NULL}, /* Apparently not used*/
-+ {4, 4, 0, 0, t5HB, t5l},
-+ {4, 4, 0, 0, t6HB, t6l},
-+ {6, 6, 0, 0, t7HB, t7l},
-+ {6, 6, 0, 0, t8HB, t8l},
-+ {6, 6, 0, 0, t9HB, t9l},
-+ {8, 8, 0, 0, t10HB, t10l},
-+ {8, 8, 0, 0, t11HB, t11l},
-+ {8, 8, 0, 0, t12HB, t12l},
-+ {16, 16, 0, 0, t13HB, t13l},
-+ {0, 0, 0, 0, NULL, NULL}, /* Apparently not used*/
-+ {16, 16, 0, 0, t15HB, t15l},
-+ {16, 16, 1, 1, t16HB, t16l},
-+ {16, 16, 2, 3, t16HB, t16l},
-+ {16, 16, 3, 7, t16HB, t16l},
-+ {16, 16, 4, 15, t16HB, t16l},
-+ {16, 16, 6, 63, t16HB, t16l},
-+ {16, 16, 8, 255, t16HB, t16l},
-+ {16, 16, 10, 1023, t16HB, t16l},
-+ {16, 16, 13, 8191, t16HB, t16l},
-+ {16, 16, 4, 15, t24HB, t24l},
-+ {16, 16, 5, 31, t24HB, t24l},
-+ {16, 16, 6, 63, t24HB, t24l},
-+ {16, 16, 7, 127, t24HB, t24l},
-+ {16, 16, 8, 255, t24HB, t24l},
-+ {16, 16, 9, 511, t24HB, t24l},
-+ {16, 16, 11, 2047, t24HB, t24l},
-+ {16, 16, 13, 8191, t24HB, t24l},
-+ {1, 16, 0, 0, t32HB, t32l},
-+ {1, 16, 0, 0, t33HB, t33l},
- };
--
--
-diff --git a/src/lib/huffman.h b/src/lib/huffman.h
-index d2d5b51..6a341c7 100644
---- a/src/lib/huffman.h
-+++ b/src/lib/huffman.h
-@@ -1,6 +1,8 @@
-+#include <stdint.h>
-+
- #define HUFFBITS uint16_t
--#define HTN 34
--#define MXOFF 250
-+#define HTN 34
-+#define MXOFF 250
-
- struct huffcodetab {
- unsigned int xlen; /*max. x-index+ */
-@@ -11,9 +13,8 @@ struct huffcodetab {
- const unsigned char *hlen; /*pointer to array[xlen][ylen] */
- };
-
--extern const struct huffcodetab shine_huffman_table[HTN];/* global memory block */
-- /* array of all huffcodtable headers */
-- /* 0..31 Huffman code table 0..31 */
-- /* 32,33 count1-tables */
--
--
-+extern const struct huffcodetab
-+ shine_huffman_table[HTN]; /* global memory block */
-+ /* array of all huffcodtable headers */
-+ /* 0..31 Huffman code table 0..31 */
-+ /* 32,33 count1-tables */
-diff --git a/src/lib/l3bitstream.c b/src/lib/l3bitstream.c
-index ba788e6..1b2849e 100644
---- a/src/lib/l3bitstream.c
-+++ b/src/lib/l3bitstream.c
-@@ -1,20 +1,22 @@
- /* l3bitstrea.c */
-
--#include "types.h"
--#include "l3mdct.h"
-+#include "l3bitstream.h" /* the public interface */
-+#include "bitstream.h"
-+#include "huffman.h"
- #include "l3loop.h"
-+#include "l3mdct.h"
- #include "layer3.h"
--#include "huffman.h"
--#include "bitstream.h"
- #include "tables.h"
--#include "l3bitstream.h" /* the public interface */
-+#include "types.h"
-
- static void shine_HuffmanCode(bitstream_t *bs, int table_select, int x, int y);
--static void shine_huffman_coder_count1(bitstream_t *bs, const struct huffcodetab *h, int v, int w, int x, int y);
-+static void shine_huffman_coder_count1(bitstream_t *bs,
-+ const struct huffcodetab *h, int v,
-+ int w, int x, int y);
-
--static void encodeSideInfo( shine_global_config *config );
--static void encodeMainData( shine_global_config *config );
--static void Huffmancodebits( shine_global_config *config, int *ix, gr_info *gi);
-+static void encodeSideInfo(shine_global_config *config);
-+static void encodeMainData(shine_global_config *config);
-+static void Huffmancodebits(shine_global_config *config, int *ix, gr_info *gi);
-
- /*
- shine_format_bitstream()
-@@ -27,130 +29,121 @@ static void Huffmancodebits( shine_global_config *config, int *ix, gr_info *gi);
- in the IS).
- */
-
--void
--shine_format_bitstream(shine_global_config *config)
--{
-+void shine_format_bitstream(shine_global_config *config) {
- int gr, ch, i;
-
-- for ( ch = 0; ch < config->wave.channels; ch++ )
-- for ( gr = 0; gr < config->mpeg.granules_per_frame; gr++ )
-- {
-- int *pi = &config->l3_enc[ch][gr][0];
-- int32_t *pr = &config->mdct_freq[ch][gr][0];
-- for ( i = 0; i < GRANULE_SIZE; i++ )
-- {
-- if ( (pr[i] < 0) && (pi[i] > 0) )
-- pi[i] *= -1;
-- }
-+ for (ch = 0; ch < config->wave.channels; ch++)
-+ for (gr = 0; gr < config->mpeg.granules_per_frame; gr++) {
-+ int *pi = &config->l3_enc[ch][gr][0];
-+ int32_t *pr = &config->mdct_freq[ch][gr][0];
-+ for (i = 0; i < GRANULE_SIZE; i++) {
-+ if ((pr[i] < 0) && (pi[i] > 0))
-+ pi[i] *= -1;
- }
-+ }
-
-- encodeSideInfo( config );
-- encodeMainData( config );
-+ encodeSideInfo(config);
-+ encodeMainData(config);
- }
-
--static void encodeMainData(shine_global_config *config)
--{
-+static void encodeMainData(shine_global_config *config) {
- int gr, ch, sfb;
-- shine_side_info_t si = config->side_info;
--
-- for ( gr = 0; gr < config->mpeg.granules_per_frame; gr++ )
-- {
-- for ( ch = 0; ch < config->wave.channels; ch++ )
-- {
-- gr_info *gi = &(si.gr[gr].ch[ch].tt);
-- unsigned slen1 = shine_slen1_tab[ gi->scalefac_compress ];
-- unsigned slen2 = shine_slen2_tab[ gi->scalefac_compress ];
-- int *ix = &config->l3_enc[ch][gr][0];
--
-- if ( gr == 0 || si.scfsi[ch][0] == 0 )
-- for ( sfb = 0; sfb < 6; sfb++ )
-- shine_putbits( &config->bs, config->scalefactor.l[gr][ch][sfb], slen1 );
-- if ( gr == 0 || si.scfsi[ch][1] == 0 )
-- for ( sfb = 6; sfb < 11; sfb++ )
-- shine_putbits( &config->bs, config->scalefactor.l[gr][ch][sfb], slen1 );
-- if ( gr == 0 || si.scfsi[ch][2] == 0 )
-- for ( sfb = 11; sfb < 16; sfb++ )
-- shine_putbits( &config->bs, config->scalefactor.l[gr][ch][sfb], slen2 );
-- if ( gr == 0 || si.scfsi[ch][3] == 0 )
-- for ( sfb = 16; sfb < 21; sfb++ )
-- shine_putbits( &config->bs, config->scalefactor.l[gr][ch][sfb], slen2 );
--
-- Huffmancodebits( config, ix, gi );
-- }
-+ shine_side_info_t si = config->side_info;
-+
-+ for (gr = 0; gr < config->mpeg.granules_per_frame; gr++) {
-+ for (ch = 0; ch < config->wave.channels; ch++) {
-+ gr_info *gi = &(si.gr[gr].ch[ch].tt);
-+ unsigned slen1 = shine_slen1_tab[gi->scalefac_compress];
-+ unsigned slen2 = shine_slen2_tab[gi->scalefac_compress];
-+ int *ix = &config->l3_enc[ch][gr][0];
-+
-+ if (gr == 0 || si.scfsi[ch][0] == 0)
-+ for (sfb = 0; sfb < 6; sfb++)
-+ shine_putbits(&config->bs, config->scalefactor.l[gr][ch][sfb], slen1);
-+ if (gr == 0 || si.scfsi[ch][1] == 0)
-+ for (sfb = 6; sfb < 11; sfb++)
-+ shine_putbits(&config->bs, config->scalefactor.l[gr][ch][sfb], slen1);
-+ if (gr == 0 || si.scfsi[ch][2] == 0)
-+ for (sfb = 11; sfb < 16; sfb++)
-+ shine_putbits(&config->bs, config->scalefactor.l[gr][ch][sfb], slen2);
-+ if (gr == 0 || si.scfsi[ch][3] == 0)
-+ for (sfb = 16; sfb < 21; sfb++)
-+ shine_putbits(&config->bs, config->scalefactor.l[gr][ch][sfb], slen2);
-+
-+ Huffmancodebits(config, ix, gi);
- }
-+ }
- }
-
--static void encodeSideInfo( shine_global_config *config )
--{
-+static void encodeSideInfo(shine_global_config *config) {
- int gr, ch, scfsi_band, region;
-- shine_side_info_t si = config->side_info;
--
-- shine_putbits( &config->bs, 0x7ff, 11 );
-- shine_putbits( &config->bs, config->mpeg.version, 2 );
-- shine_putbits( &config->bs, config->mpeg.layer, 2 );
-- shine_putbits( &config->bs, !config->mpeg.crc, 1 );
-- shine_putbits( &config->bs, config->mpeg.bitrate_index, 4 );
-- shine_putbits( &config->bs, config->mpeg.samplerate_index % 3, 2 );
-- shine_putbits( &config->bs, config->mpeg.padding, 1 );
-- shine_putbits( &config->bs, config->mpeg.ext, 1 );
-- shine_putbits( &config->bs, config->mpeg.mode, 2 );
-- shine_putbits( &config->bs, config->mpeg.mode_ext, 2 );
-- shine_putbits( &config->bs, config->mpeg.copyright, 1 );
-- shine_putbits( &config->bs, config->mpeg.original, 1 );
-- shine_putbits( &config->bs, config->mpeg.emph, 2 );
--
-- if ( config->mpeg.version == MPEG_I ) {
-- shine_putbits( &config->bs, 0, 9 );
-- if ( config->wave.channels == 2 )
-- shine_putbits( &config->bs, si.private_bits, 3 );
-+ shine_side_info_t si = config->side_info;
-+
-+ shine_putbits(&config->bs, 0x7ff, 11);
-+ shine_putbits(&config->bs, config->mpeg.version, 2);
-+ shine_putbits(&config->bs, config->mpeg.layer, 2);
-+ shine_putbits(&config->bs, !config->mpeg.crc, 1);
-+ shine_putbits(&config->bs, config->mpeg.bitrate_index, 4);
-+ shine_putbits(&config->bs, config->mpeg.samplerate_index % 3, 2);
-+ shine_putbits(&config->bs, config->mpeg.padding, 1);
-+ shine_putbits(&config->bs, config->mpeg.ext, 1);
-+ shine_putbits(&config->bs, config->mpeg.mode, 2);
-+ shine_putbits(&config->bs, config->mpeg.mode_ext, 2);
-+ shine_putbits(&config->bs, config->mpeg.copyright, 1);
-+ shine_putbits(&config->bs, config->mpeg.original, 1);
-+ shine_putbits(&config->bs, config->mpeg.emph, 2);
-+
-+ if (config->mpeg.version == MPEG_I) {
-+ shine_putbits(&config->bs, 0, 9);
-+ if (config->wave.channels == 2)
-+ shine_putbits(&config->bs, si.private_bits, 3);
- else
-- shine_putbits( &config->bs, si.private_bits, 5 );
-+ shine_putbits(&config->bs, si.private_bits, 5);
- } else {
-- shine_putbits( &config->bs, 0, 8 );
-- if ( config->wave.channels == 2 )
-- shine_putbits( &config->bs, si.private_bits, 2 );
-+ shine_putbits(&config->bs, 0, 8);
-+ if (config->wave.channels == 2)
-+ shine_putbits(&config->bs, si.private_bits, 2);
- else
-- shine_putbits( &config->bs, si.private_bits, 1 );
-+ shine_putbits(&config->bs, si.private_bits, 1);
- }
-
-- if ( config->mpeg.version == MPEG_I )
-- for ( ch = 0; ch < config->wave.channels; ch++ ) {
-- for ( scfsi_band = 0; scfsi_band < 4; scfsi_band++ )
-- shine_putbits( &config->bs, si.scfsi[ch][scfsi_band], 1 );
-+ if (config->mpeg.version == MPEG_I)
-+ for (ch = 0; ch < config->wave.channels; ch++) {
-+ for (scfsi_band = 0; scfsi_band < 4; scfsi_band++)
-+ shine_putbits(&config->bs, si.scfsi[ch][scfsi_band], 1);
- }
-
-- for ( gr = 0; gr < config->mpeg.granules_per_frame; gr++ )
-- for ( ch = 0; ch < config->wave.channels ; ch++ )
-- {
-- gr_info *gi = &(si.gr[gr].ch[ch].tt);
--
-- shine_putbits( &config->bs, gi->part2_3_length, 12 );
-- shine_putbits( &config->bs, gi->big_values, 9 );
-- shine_putbits( &config->bs, gi->global_gain, 8 );
-- if ( config->mpeg.version == MPEG_I )
-- shine_putbits( &config->bs, gi->scalefac_compress, 4 );
-- else
-- shine_putbits( &config->bs, gi->scalefac_compress, 9 );
-- shine_putbits( &config->bs, 0, 1 );
--
-- for ( region = 0; region < 3; region++ )
-- shine_putbits( &config->bs, gi->table_select[region], 5 );
--
-- shine_putbits( &config->bs, gi->region0_count, 4 );
-- shine_putbits( &config->bs, gi->region1_count, 3 );
--
-- if ( config->mpeg.version == MPEG_I )
-- shine_putbits( &config->bs, gi->preflag, 1 );
-- shine_putbits( &config->bs, gi->scalefac_scale, 1 );
-- shine_putbits( &config->bs, gi->count1table_select, 1 );
-- }
-+ for (gr = 0; gr < config->mpeg.granules_per_frame; gr++)
-+ for (ch = 0; ch < config->wave.channels; ch++) {
-+ gr_info *gi = &(si.gr[gr].ch[ch].tt);
-+
-+ shine_putbits(&config->bs, gi->part2_3_length, 12);
-+ shine_putbits(&config->bs, gi->big_values, 9);
-+ shine_putbits(&config->bs, gi->global_gain, 8);
-+ if (config->mpeg.version == MPEG_I)
-+ shine_putbits(&config->bs, gi->scalefac_compress, 4);
-+ else
-+ shine_putbits(&config->bs, gi->scalefac_compress, 9);
-+ shine_putbits(&config->bs, 0, 1);
-+
-+ for (region = 0; region < 3; region++)
-+ shine_putbits(&config->bs, gi->table_select[region], 5);
-+
-+ shine_putbits(&config->bs, gi->region0_count, 4);
-+ shine_putbits(&config->bs, gi->region1_count, 3);
-+
-+ if (config->mpeg.version == MPEG_I)
-+ shine_putbits(&config->bs, gi->preflag, 1);
-+ shine_putbits(&config->bs, gi->scalefac_scale, 1);
-+ shine_putbits(&config->bs, gi->count1table_select, 1);
-+ }
- }
-
- /* Note the discussion of huffmancodebits() on pages 28 and 29 of the IS, as
- well as the definitions of the side information on pages 26 and 27. */
--static void Huffmancodebits( shine_global_config *config, int *ix, gr_info *gi )
--{
-- const int *scalefac = &shine_scale_fact_band_index[config->mpeg.samplerate_index][0];
-+static void Huffmancodebits(shine_global_config *config, int *ix, gr_info *gi) {
-+ const int *scalefac =
-+ &shine_scale_fact_band_index[config->mpeg.samplerate_index][0];
- unsigned scalefac_index;
- int region1Start, region2Start;
- int i, bigvalues, count1End;
-@@ -164,168 +157,153 @@ static void Huffmancodebits( shine_global_config *config, int *ix, gr_info *gi )
- bigvalues = gi->big_values << 1;
-
- scalefac_index = gi->region0_count + 1;
-- region1Start = scalefac[ scalefac_index ];
-+ region1Start = scalefac[scalefac_index];
- scalefac_index += gi->region1_count + 1;
-- region2Start = scalefac[ scalefac_index ];
--
-- for ( i = 0; i < bigvalues; i += 2 )
-- {
-- /* get table pointer */
-- int idx = (i >= region1Start) + (i >= region2Start);
-- unsigned tableindex = gi->table_select[idx];
-- /* get huffman code */
-- if ( tableindex )
-- {
-- x = ix[i];
-- y = ix[i + 1];
-- shine_HuffmanCode( &config->bs, tableindex, x, y );
-- }
-+ region2Start = scalefac[scalefac_index];
-+
-+ for (i = 0; i < bigvalues; i += 2) {
-+ /* get table pointer */
-+ int idx = (i >= region1Start) + (i >= region2Start);
-+ unsigned tableindex = gi->table_select[idx];
-+ /* get huffman code */
-+ if (tableindex) {
-+ x = ix[i];
-+ y = ix[i + 1];
-+ shine_HuffmanCode(&config->bs, tableindex, x, y);
- }
-+ }
-
- /* 2: Write count1 area */
- h = &shine_huffman_table[gi->count1table_select + 32];
-- count1End = bigvalues + (gi->count1 <<2);
-- for ( i = bigvalues; i < count1End; i += 4 )
-- {
-- v = ix[i];
-- w = ix[i+1];
-- x = ix[i+2];
-- y = ix[i+3];
-- shine_huffman_coder_count1( &config->bs, h, v, w, x, y );
-- }
-+ count1End = bigvalues + (gi->count1 << 2);
-+ for (i = bigvalues; i < count1End; i += 4) {
-+ v = ix[i];
-+ w = ix[i + 1];
-+ x = ix[i + 2];
-+ y = ix[i + 3];
-+ shine_huffman_coder_count1(&config->bs, h, v, w, x, y);
-+ }
-
- bits = shine_get_bits_count(&config->bs) - bits;
- bits = gi->part2_3_length - gi->part2_length - bits;
-- if (bits)
-- {
-- int stuffingWords = bits / 32;
-- int remainingBits = bits % 32;
--
-- /* Due to the nature of the Huffman code tables, we will pad with ones */
-- while ( stuffingWords-- )
-- shine_putbits( &config->bs, ~0, 32 );
-- if ( remainingBits )
-- shine_putbits( &config->bs, (1UL << remainingBits) - 1, remainingBits );
-- }
-+ if (bits) {
-+ int stuffingWords = bits / 32;
-+ int remainingBits = bits % 32;
-+
-+ /* Due to the nature of the Huffman code tables, we will pad with ones */
-+ while (stuffingWords--)
-+ shine_putbits(&config->bs, ~0, 32);
-+ if (remainingBits)
-+ shine_putbits(&config->bs, (1UL << remainingBits) - 1, remainingBits);
-+ }
- }
-
--static inline int shine_abs_and_sign( int *x )
--{
-- if ( *x > 0 ) return 0;
-+static inline int shine_abs_and_sign(int *x) {
-+ if (*x > 0)
-+ return 0;
- *x *= -1;
- return 1;
- }
-
--static void shine_huffman_coder_count1( bitstream_t *bs, const struct huffcodetab *h, int v, int w, int x, int y )
--{
-+static void shine_huffman_coder_count1(bitstream_t *bs,
-+ const struct huffcodetab *h, int v,
-+ int w, int x, int y) {
- unsigned int signv, signw, signx, signy;
- unsigned int code = 0;
- int p, cbits = 0;
-
-- signv = shine_abs_and_sign( &v );
-- signw = shine_abs_and_sign( &w );
-- signx = shine_abs_and_sign( &x );
-- signy = shine_abs_and_sign( &y );
-+ signv = shine_abs_and_sign(&v);
-+ signw = shine_abs_and_sign(&w);
-+ signx = shine_abs_and_sign(&x);
-+ signy = shine_abs_and_sign(&y);
-
- p = v + (w << 1) + (x << 2) + (y << 3);
-- shine_putbits( bs, h->table[p], h->hlen[p] );
-+ shine_putbits(bs, h->table[p], h->hlen[p]);
-
-- if ( v ) {
-+ if (v) {
- code = signv;
- cbits = 1;
- }
-- if ( w ) {
-+ if (w) {
- code = (code << 1) | signw;
- cbits++;
- }
-- if ( x ) {
-+ if (x) {
- code = (code << 1) | signx;
- cbits++;
- }
-- if ( y ) {
-+ if (y) {
- code = (code << 1) | signy;
- cbits++;
- }
-- shine_putbits( bs, code, cbits );
-+ shine_putbits(bs, code, cbits);
- }
-
- /* Implements the pseudocode of page 98 of the IS */
--static void shine_HuffmanCode(bitstream_t *bs, int table_select, int x, int y)
--{
-+static void shine_HuffmanCode(bitstream_t *bs, int table_select, int x, int y) {
- int cbits = 0, xbits = 0;
- unsigned int code = 0, ext = 0;
- unsigned signx, signy, ylen, idx;
- const struct huffcodetab *h;
-
-- signx = shine_abs_and_sign( &x );
-- signy = shine_abs_and_sign( &y );
-+ signx = shine_abs_and_sign(&x);
-+ signy = shine_abs_and_sign(&y);
-
- h = &(shine_huffman_table[table_select]);
- ylen = h->ylen;
-
-- if ( table_select > 15 )
-- { /* ESC-table is used */
-- unsigned linbitsx = 0, linbitsy = 0, linbits = h->linbits;
--
-- if ( x > 14 )
-- {
-- linbitsx = x - 15;
-- x = 15;
-- }
-- if ( y > 14 )
-- {
-- linbitsy = y - 15;
-- y = 15;
-- }
--
-- idx = (x * ylen) + y;
-- code = h->table[idx];
-- cbits = h->hlen [idx];
-- if ( x > 14 )
-- {
-- ext |= linbitsx;
-- xbits += linbits;
-- }
-- if ( x != 0 )
-- {
-- ext <<= 1;
-- ext |= signx;
-- xbits += 1;
-- }
-- if ( y > 14 )
-- {
-- ext <<= linbits;
-- ext |= linbitsy;
-- xbits += linbits;
-- }
-- if ( y != 0 )
-- {
-- ext <<= 1;
-- ext |= signy;
-- xbits += 1;
-- }
--
-- shine_putbits( bs, code, cbits);
-- shine_putbits( bs, ext, xbits);
-+ if (table_select > 15) { /* ESC-table is used */
-+ unsigned linbitsx = 0, linbitsy = 0, linbits = h->linbits;
-+
-+ if (x > 14) {
-+ linbitsx = x - 15;
-+ x = 15;
-+ }
-+ if (y > 14) {
-+ linbitsy = y - 15;
-+ y = 15;
-+ }
-+
-+ idx = (x * ylen) + y;
-+ code = h->table[idx];
-+ cbits = h->hlen[idx];
-+ if (x > 14) {
-+ ext |= linbitsx;
-+ xbits += linbits;
- }
-- else
-- { /* No ESC-words */
-- idx = (x * ylen) + y;
-- code = h->table[idx];
-- cbits = h->hlen[idx];
-- if ( x != 0 )
-- {
-- code <<= 1;
-- code |= signx;
-- cbits += 1;
-- }
-- if ( y != 0 )
-- {
-- code <<= 1;
-- code |= signy;
-- cbits += 1;
-- }
--
-- shine_putbits( bs, code, cbits);
-+ if (x != 0) {
-+ ext <<= 1;
-+ ext |= signx;
-+ xbits += 1;
- }
-+ if (y > 14) {
-+ ext <<= linbits;
-+ ext |= linbitsy;
-+ xbits += linbits;
-+ }
-+ if (y != 0) {
-+ ext <<= 1;
-+ ext |= signy;
-+ xbits += 1;
-+ }
-+
-+ shine_putbits(bs, code, cbits);
-+ shine_putbits(bs, ext, xbits);
-+ } else { /* No ESC-words */
-+ idx = (x * ylen) + y;
-+ code = h->table[idx];
-+ cbits = h->hlen[idx];
-+ if (x != 0) {
-+ code <<= 1;
-+ code |= signx;
-+ cbits += 1;
-+ }
-+ if (y != 0) {
-+ code <<= 1;
-+ code |= signy;
-+ cbits += 1;
-+ }
-+
-+ shine_putbits(bs, code, cbits);
-+ }
- }
-diff --git a/src/lib/l3bitstream.h b/src/lib/l3bitstream.h
-index 6e165f5..fa61899 100644
---- a/src/lib/l3bitstream.h
-+++ b/src/lib/l3bitstream.h
-@@ -1,6 +1,8 @@
- #ifndef shine_BITSTREAM_H
- #define shine_BITSTREAM_H
-
-+#include "types.h"
-+
- void shine_format_bitstream(shine_global_config *config);
-
- #endif
-diff --git a/src/lib/l3loop.c b/src/lib/l3loop.c
-index 609c2b2..d3799fb 100644
---- a/src/lib/l3loop.c
-+++ b/src/lib/l3loop.c
-@@ -1,34 +1,40 @@
- /* l3loop.c */
-
--#include "types.h"
--#include "tables.h"
- #include "l3loop.h"
--#include "layer3.h"
--#include "huffman.h"
- #include "bitstream.h"
-+#include "huffman.h"
- #include "l3bitstream.h"
-+#include "layer3.h"
- #include "reservoir.h"
-+#include "tables.h"
-+#include "types.h"
-
--#define e 2.71828182845
--#define CBLIMIT 21
-+#define e 2.71828182845
-+#define CBLIMIT 21
- #define SFB_LMAX 22
- #define en_tot_krit 10
- #define en_dif_krit 100
- #define en_scfsi_band_krit 10
- #define xm_scfsi_band_krit 10
-
--static void calc_scfsi(shine_psy_xmin_t *l3_xmin, int ch, int gr, shine_global_config *config);
-+static void calc_scfsi(shine_psy_xmin_t *l3_xmin, int ch, int gr,
-+ shine_global_config *config);
- static int part2_length(int gr, int ch, shine_global_config *config);
--static int bin_search_StepSize(int desired_rate, int ix[GRANULE_SIZE], gr_info * cod_info, shine_global_config *config);
--static int count_bit(int ix[GRANULE_SIZE], unsigned int start, unsigned int end, unsigned int table );
-+static int bin_search_StepSize(int desired_rate, int ix[GRANULE_SIZE],
-+ gr_info *cod_info, shine_global_config *config);
-+static int count_bit(int ix[GRANULE_SIZE], unsigned int start, unsigned int end,
-+ unsigned int table);
- static int bigv_bitcount(int ix[GRANULE_SIZE], gr_info *gi);
--static int new_choose_table( int ix[GRANULE_SIZE], unsigned int begin, unsigned int end );
--static void bigv_tab_select( int ix[GRANULE_SIZE], gr_info *cod_info );
--static void subdivide(gr_info *cod_info, shine_global_config *config );
--static int count1_bitcount( int ix[ GRANULE_SIZE ], gr_info *cod_info );
--static void calc_runlen( int ix[GRANULE_SIZE], gr_info *cod_info );
--static void calc_xmin(shine_psy_ratio_t *ratio, gr_info *cod_info, shine_psy_xmin_t *l3_xmin, int gr, int ch );
--static int quantize(int ix[GRANULE_SIZE], int stepsize, shine_global_config *config);
-+static int new_choose_table(int ix[GRANULE_SIZE], unsigned int begin,
-+ unsigned int end);
-+static void bigv_tab_select(int ix[GRANULE_SIZE], gr_info *cod_info);
-+static void subdivide(gr_info *cod_info, shine_global_config *config);
-+static int count1_bitcount(int ix[GRANULE_SIZE], gr_info *cod_info);
-+static void calc_runlen(int ix[GRANULE_SIZE], gr_info *cod_info);
-+static void calc_xmin(shine_psy_ratio_t *ratio, gr_info *cod_info,
-+ shine_psy_xmin_t *l3_xmin, int gr, int ch);
-+static int quantize(int ix[GRANULE_SIZE], int stepsize,
-+ shine_global_config *config);
-
- /*
- * shine_inner_loop:
-@@ -36,25 +42,22 @@ static int quantize(int ix[GRANULE_SIZE], int stepsize, shine_global_config *con
- * The code selects the best quantizerStepSize for a particular set
- * of scalefacs.
- */
--int shine_inner_loop(int ix[GRANULE_SIZE],
-- int max_bits, gr_info *cod_info, int gr, int ch,
-- shine_global_config *config )
--{
-+int shine_inner_loop(int ix[GRANULE_SIZE], int max_bits, gr_info *cod_info,
-+ int gr, int ch, shine_global_config *config) {
- int bits, c1bits, bvbits;
-
-- if(max_bits<0)
-+ if (max_bits < 0)
- cod_info->quantizerStepSize--;
-- do
-- {
-- while(quantize(ix,++cod_info->quantizerStepSize,config) > 8192); /* within table range? */
--
-- calc_runlen(ix,cod_info); /* rzero,count1,big_values*/
-- bits = c1bits = count1_bitcount(ix,cod_info); /* count1_table selection*/
-- subdivide(cod_info, config); /* bigvalues sfb division */
-- bigv_tab_select(ix,cod_info); /* codebook selection*/
-- bits += bvbits = bigv_bitcount( ix, cod_info ); /* bit count */
-- }
-- while(bits>max_bits);
-+ do {
-+ while (quantize(ix, ++cod_info->quantizerStepSize, config) > 8192)
-+ ; /* within table range? */
-+
-+ calc_runlen(ix, cod_info); /* rzero,count1,big_values*/
-+ bits = c1bits = count1_bitcount(ix, cod_info); /* count1_table selection*/
-+ subdivide(cod_info, config); /* bigvalues sfb division */
-+ bigv_tab_select(ix, cod_info); /* codebook selection*/
-+ bits += bvbits = bigv_bitcount(ix, cod_info); /* bit count */
-+ } while (bits > max_bits);
- return bits;
- }
-
-@@ -66,21 +69,22 @@ int shine_inner_loop(int ix[GRANULE_SIZE],
- * global gain. This module calls the inner iteration loop.
- */
-
--int shine_outer_loop( int max_bits,
-- shine_psy_xmin_t *l3_xmin, /* the allowed distortion of the scalefactor */
-- int ix[GRANULE_SIZE], /* vector of quantized values ix(0..575) */
-- int gr, int ch, shine_global_config *config)
--{
-+int shine_outer_loop(
-+ int max_bits,
-+ shine_psy_xmin_t *l3_xmin, /* the allowed distortion of the scalefactor */
-+ int ix[GRANULE_SIZE], /* vector of quantized values ix(0..575) */
-+ int gr, int ch, shine_global_config *config) {
- int bits, huff_bits;
-- shine_side_info_t *side_info = &config->side_info;
-+ shine_side_info_t *side_info = &config->side_info;
- gr_info *cod_info = &side_info->gr[gr].ch[ch].tt;
-
-- cod_info->quantizerStepSize = bin_search_StepSize(max_bits,ix,cod_info, config);
-+ cod_info->quantizerStepSize =
-+ bin_search_StepSize(max_bits, ix, cod_info, config);
-
-- cod_info->part2_length = part2_length(gr,ch,config);
-+ cod_info->part2_length = part2_length(gr, ch, config);
- huff_bits = max_bits - cod_info->part2_length;
-
-- bits = shine_inner_loop(ix, huff_bits, cod_info, gr, ch, config );
-+ bits = shine_inner_loop(ix, huff_bits, cod_info, gr, ch, config);
- cod_info->part2_3_length = cod_info->part2_length + bits;
-
- return cod_info->part2_3_length;
-@@ -90,18 +94,15 @@ int shine_outer_loop( int max_bits,
- * shine_iteration_loop:
- * ------------------
- */
--void shine_iteration_loop(shine_global_config *config)
--{
-+void shine_iteration_loop(shine_global_config *config) {
- shine_psy_xmin_t l3_xmin;
- gr_info *cod_info;
- int max_bits;
- int ch, gr, i;
- int *ix;
-
-- for(ch=config->wave.channels; ch--; )
-- {
-- for(gr=0; gr<config->mpeg.granules_per_frame; gr++)
-- {
-+ for (ch = config->wave.channels; ch--;) {
-+ for (gr = 0; gr < config->mpeg.granules_per_frame; gr++) {
- /* setup pointers */
- ix = config->l3_enc[ch][gr];
- config->l3loop.xr = config->mdct_freq[ch][gr];
-@@ -109,56 +110,58 @@ void shine_iteration_loop(shine_global_config *config)
- /* Precalculate the square, abs, and maximum,
- * for use later on.
- */
-- for (i=GRANULE_SIZE, config->l3loop.xrmax=0; i--;)
-- {
-- config->l3loop.xrsq[i] = mulsr(config->l3loop.xr[i],config->l3loop.xr[i]);
-+ for (i = GRANULE_SIZE, config->l3loop.xrmax = 0; i--;) {
-+ config->l3loop.xrsq[i] =
-+ mulsr(config->l3loop.xr[i], config->l3loop.xr[i]);
- config->l3loop.xrabs[i] = labs(config->l3loop.xr[i]);
-- if(config->l3loop.xrabs[i]>config->l3loop.xrmax)
-- config->l3loop.xrmax=config->l3loop.xrabs[i];
-+ if (config->l3loop.xrabs[i] > config->l3loop.xrmax)
-+ config->l3loop.xrmax = config->l3loop.xrabs[i];
- }
-
-- cod_info = (gr_info *) &(config->side_info.gr[gr].ch[ch]);
-+ cod_info = (gr_info *)&(config->side_info.gr[gr].ch[ch]);
- cod_info->sfb_lmax = SFB_LMAX - 1; /* gr_deco */
-
-- calc_xmin(&config->ratio, cod_info, &l3_xmin, gr, ch );
-+ calc_xmin(&config->ratio, cod_info, &l3_xmin, gr, ch);
-
-- if ( config->mpeg.version == MPEG_I )
-- calc_scfsi(&l3_xmin,ch,gr,config);
-+ if (config->mpeg.version == MPEG_I)
-+ calc_scfsi(&l3_xmin, ch, gr, config);
-
- /* calculation of number of available bit( per granule ) */
-- max_bits = shine_max_reservoir_bits(&config->pe[ch][gr],config);
-+ max_bits = shine_max_reservoir_bits(&config->pe[ch][gr], config);
-
- /* reset of iteration variables */
-- memset(config->scalefactor.l[gr][ch],0,sizeof(config->scalefactor.l[gr][ch]));
-- memset(config->scalefactor.s[gr][ch],0,sizeof(config->scalefactor.s[gr][ch]));
-+ memset(config->scalefactor.l[gr][ch], 0,
-+ sizeof(config->scalefactor.l[gr][ch]));
-+ memset(config->scalefactor.s[gr][ch], 0,
-+ sizeof(config->scalefactor.s[gr][ch]));
-
-- for ( i=4; i--; )
-+ for (i = 4; i--;)
- cod_info->slen[i] = 0;
-
-- cod_info->part2_3_length = 0;
-- cod_info->big_values = 0;
-- cod_info->count1 = 0;
-+ cod_info->part2_3_length = 0;
-+ cod_info->big_values = 0;
-+ cod_info->count1 = 0;
- cod_info->scalefac_compress = 0;
-- cod_info->table_select[0] = 0;
-- cod_info->table_select[1] = 0;
-- cod_info->table_select[2] = 0;
-- cod_info->region0_count = 0;
-- cod_info->region1_count = 0;
-- cod_info->part2_length = 0;
-- cod_info->preflag = 0;
-- cod_info->scalefac_scale = 0;
-- cod_info->count1table_select= 0;
-+ cod_info->table_select[0] = 0;
-+ cod_info->table_select[1] = 0;
-+ cod_info->table_select[2] = 0;
-+ cod_info->region0_count = 0;
-+ cod_info->region1_count = 0;
-+ cod_info->part2_length = 0;
-+ cod_info->preflag = 0;
-+ cod_info->scalefac_scale = 0;
-+ cod_info->count1table_select = 0;
-
- /* all spectral values zero ? */
-- if(config->l3loop.xrmax)
-- cod_info->part2_3_length = shine_outer_loop(max_bits,&l3_xmin,ix,
-- gr,ch,config);
-+ if (config->l3loop.xrmax)
-+ cod_info->part2_3_length =
-+ shine_outer_loop(max_bits, &l3_xmin, ix, gr, ch, config);
-
-- shine_ResvAdjust(cod_info, config );
-- cod_info->global_gain = cod_info->quantizerStepSize+210;
-+ shine_ResvAdjust(cod_info, config);
-+ cod_info->global_gain = cod_info->quantizerStepSize + 210;
-
- } /* for gr */
-- } /* for ch */
-+ } /* for ch */
-
- shine_ResvFrameEnd(config);
- }
-@@ -168,21 +171,20 @@ void shine_iteration_loop(shine_global_config *config)
- * -----------
- * calculation of the scalefactor select information ( scfsi ).
- */
--void calc_scfsi( shine_psy_xmin_t *l3_xmin, int ch, int gr,
-- shine_global_config *config )
--{
-+void calc_scfsi(shine_psy_xmin_t *l3_xmin, int ch, int gr,
-+ shine_global_config *config) {
- shine_side_info_t *l3_side = &config->side_info;
- /* This is the scfsi_band table from 2.4.2.7 of the IS */
-- static const int scfsi_band_long[5] = { 0, 6, 11, 16, 21 };
-+ static const int scfsi_band_long[5] = {0, 6, 11, 16, 21};
-
- int scfsi_band;
-- unsigned scfsi_set;
-
- int sfb, start, end, i;
- int condition = 0;
- int temp;
-
-- const int *scalefac_band_long = &shine_scale_fact_band_index[config->mpeg.samplerate_index][0];
-+ const int *scalefac_band_long =
-+ &shine_scale_fact_band_index[config->mpeg.samplerate_index][0];
-
- /* note. it goes quite a bit faster if you uncomment the next bit and exit
- early from scfsi, but you then loose the advantage of common scale factors.
-@@ -194,82 +196,75 @@ void calc_scfsi( shine_psy_xmin_t *l3_xmin, int ch, int gr,
- */
-
- config->l3loop.xrmaxl[gr] = config->l3loop.xrmax;
-- scfsi_set = 0;
-
- /* the total energy of the granule */
-- for ( temp = 0, i =GRANULE_SIZE; i--; )
-- temp += config->l3loop.xrsq[i]>>10; /* a bit of scaling to avoid overflow, (not very good) */
-- if ( temp )
-- config->l3loop.en_tot[gr] = log((double)temp * 4.768371584e-7) / LN2; /* 1024 / 0x7fffffff */
-+ for (temp = 0, i = GRANULE_SIZE; i--;)
-+ temp += config->l3loop.xrsq[i] >>
-+ 10; /* a bit of scaling to avoid overflow, (not very good) */
-+ if (temp)
-+ config->l3loop.en_tot[gr] =
-+ log((double)temp * 4.768371584e-7) / LN2; /* 1024 / 0x7fffffff */
- else
- config->l3loop.en_tot[gr] = 0;
-
- /* the energy of each scalefactor band, en */
- /* the allowed distortion of each scalefactor band, xm */
-
-- for(sfb=21; sfb--; )
-- {
-- start = scalefac_band_long[ sfb ];
-- end = scalefac_band_long[ sfb+1 ];
-+ for (sfb = 21; sfb--;) {
-+ start = scalefac_band_long[sfb];
-+ end = scalefac_band_long[sfb + 1];
-
-- for ( temp = 0, i = start; i < end; i++ )
-- temp += config->l3loop.xrsq[i]>>10;
-- if ( temp )
-- config->l3loop.en[gr][sfb] = log((double)temp * 4.768371584e-7) / LN2; /* 1024 / 0x7fffffff */
-+ for (temp = 0, i = start; i < end; i++)
-+ temp += config->l3loop.xrsq[i] >> 10;
-+ if (temp)
-+ config->l3loop.en[gr][sfb] =
-+ log((double)temp * 4.768371584e-7) / LN2; /* 1024 / 0x7fffffff */
- else
- config->l3loop.en[gr][sfb] = 0;
-
-- if ( l3_xmin->l[gr][ch][sfb])
-- config->l3loop.xm[gr][sfb] = log( l3_xmin->l[gr][ch][sfb] ) / LN2;
-+ if (l3_xmin->l[gr][ch][sfb])
-+ config->l3loop.xm[gr][sfb] = log(l3_xmin->l[gr][ch][sfb]) / LN2;
- else
- config->l3loop.xm[gr][sfb] = 0;
- }
-
-- if(gr==1)
-- {
-+ if (gr == 1) {
- int gr2, tp;
-
-- for(gr2=2; gr2--; )
-- {
-+ for (gr2 = 2; gr2--;) {
- /* The spectral values are not all zero */
-- if(config->l3loop.xrmaxl[gr2])
-+ if (config->l3loop.xrmaxl[gr2])
- condition++;
-
- condition++;
- }
-- if(abs(config->l3loop.en_tot[0]-config->l3loop.en_tot[1]) < en_tot_krit)
-+ if (abs(config->l3loop.en_tot[0] - config->l3loop.en_tot[1]) < en_tot_krit)
- condition++;
-- for(tp=0,sfb=21; sfb--; )
-- tp += abs(config->l3loop.en[0][sfb]-config->l3loop.en[1][sfb]);
-+ for (tp = 0, sfb = 21; sfb--;)
-+ tp += abs(config->l3loop.en[0][sfb] - config->l3loop.en[1][sfb]);
- if (tp < en_dif_krit)
- condition++;
-
-- if(condition==6)
-- {
-- for(scfsi_band=0;scfsi_band<4;scfsi_band++)
-- {
-+ if (condition == 6) {
-+ for (scfsi_band = 0; scfsi_band < 4; scfsi_band++) {
- int sum0 = 0, sum1 = 0;
- l3_side->scfsi[ch][scfsi_band] = 0;
- start = scfsi_band_long[scfsi_band];
-- end = scfsi_band_long[scfsi_band+1];
-- for ( sfb = start; sfb < end; sfb++ )
-- {
-- sum0 += abs( config->l3loop.en[0][sfb] - config->l3loop.en[1][sfb] );
-- sum1 += abs( config->l3loop.xm[0][sfb] - config->l3loop.xm[1][sfb] );
-+ end = scfsi_band_long[scfsi_band + 1];
-+ for (sfb = start; sfb < end; sfb++) {
-+ sum0 += abs(config->l3loop.en[0][sfb] - config->l3loop.en[1][sfb]);
-+ sum1 += abs(config->l3loop.xm[0][sfb] - config->l3loop.xm[1][sfb]);
- }
-
-- if(sum0<en_scfsi_band_krit && sum1<xm_scfsi_band_krit)
-- {
-+ if (sum0 < en_scfsi_band_krit && sum1 < xm_scfsi_band_krit) {
- l3_side->scfsi[ch][scfsi_band] = 1;
-- scfsi_set |= (1 << scfsi_band);
-- }
-- else
-+ } else
- l3_side->scfsi[ch][scfsi_band] = 0;
- } /* for scfsi_band */
-- } /* if condition == 6 */
-+ } /* if condition == 6 */
- else
-- for(scfsi_band=0;scfsi_band<4;scfsi_band++)
-- l3_side->scfsi[ch][scfsi_band] = 0;
-+ for (scfsi_band = 0; scfsi_band < 4; scfsi_band++)
-+ l3_side->scfsi[ch][scfsi_band] = 0;
- } /* if gr == 1 */
- }
-
-@@ -279,27 +274,26 @@ void calc_scfsi( shine_psy_xmin_t *l3_xmin, int ch, int gr,
- * calculates the number of bits needed to encode the scalefacs in the
- * main data block.
- */
--int part2_length(int gr, int ch, shine_global_config *config)
--{
-+int part2_length(int gr, int ch, shine_global_config *config) {
- int slen1, slen2, bits;
- gr_info *gi = &config->side_info.gr[gr].ch[ch].tt;
-
- bits = 0;
-
- {
-- slen1 = shine_slen1_tab[ gi->scalefac_compress ];
-- slen2 = shine_slen2_tab[ gi->scalefac_compress ];
-+ slen1 = shine_slen1_tab[gi->scalefac_compress];
-+ slen2 = shine_slen2_tab[gi->scalefac_compress];
-
-- if ( !gr || !(config->side_info.scfsi[ch][0]) )
-+ if (!gr || !(config->side_info.scfsi[ch][0]))
- bits += (6 * slen1);
-
-- if ( !gr || !(config->side_info.scfsi[ch][1]) )
-+ if (!gr || !(config->side_info.scfsi[ch][1]))
- bits += (5 * slen1);
-
-- if ( !gr || !(config->side_info.scfsi[ch][2]) )
-+ if (!gr || !(config->side_info.scfsi[ch][2]))
- bits += (5 * slen2);
-
-- if ( !gr || !(config->side_info.scfsi[ch][3]) )
-+ if (!gr || !(config->side_info.scfsi[ch][3]))
- bits += (5 * slen2);
- }
- return bits;
-@@ -312,26 +306,22 @@ int part2_length(int gr, int ch, shine_global_config *config)
- * as determined by the psychoacoustic model.
- * xmin(sb) = ratio(sb) * en(sb) / bw(sb)
- */
--void calc_xmin(shine_psy_ratio_t *ratio,
-- gr_info *cod_info,
-- shine_psy_xmin_t *l3_xmin,
-- int gr, int ch )
--{
-+void calc_xmin(shine_psy_ratio_t *ratio, gr_info *cod_info,
-+ shine_psy_xmin_t *l3_xmin, int gr, int ch) {
- int sfb;
-
-- for ( sfb = cod_info->sfb_lmax; sfb--; )
-- {
--/* note. xmin will always be zero with no psychoacoustic model
-+ for (sfb = cod_info->sfb_lmax; sfb--;) {
-+ /* note. xmin will always be zero with no psychoacoustic model
-
-- start = scalefac_band_long[ sfb ];
-- end = scalefac_band_long[ sfb+1 ];
-- bw = end - start;
-+ start = scalefac_band_long[ sfb ];
-+ end = scalefac_band_long[ sfb+1 ];
-+ bw = end - start;
-
-- for ( en = 0, l = start; l < end; l++ )
-- en += config->l3loop.xrsq[l];
-+ for ( en = 0, l = start; l < end; l++ )
-+ en += config->l3loop.xrsq[l];
-
-- l3_xmin->l[gr][ch][sfb] = ratio->l[gr][ch][sfb] * en / bw;
--*/
-+ l3_xmin->l[gr][ch][sfb] = ratio->l[gr][ch][sfb] * en / bw;
-+ */
- l3_xmin->l[gr][ch][sfb] = 0;
- }
- }
-@@ -341,8 +331,7 @@ void calc_xmin(shine_psy_ratio_t *ratio,
- * -------------------
- * Calculates the look up tables used by the iteration loop.
- */
--void shine_loop_initialise(shine_global_config *config)
--{
-+void shine_loop_initialise(shine_global_config *config) {
- int i;
-
- /* quantize: stepsize conversion, fourth root of 2 table.
-@@ -350,24 +339,26 @@ void shine_loop_initialise(shine_global_config *config)
- * in the spec because it is quicker to do x*y than x/y.
- * The 0.5 is for rounding.
- */
-- for(i=128; i--;)
-- {
-- config->l3loop.steptab[i] = pow(2.0,(double)(127-i)/4);
-- if((config->l3loop.steptab[i]*2)>0x7fffffff) /* MAXINT = 2**31 = 2**(124/4) */
-- config->l3loop.steptabi[i]=0x7fffffff;
-+ for (i = 128; i--;) {
-+ config->l3loop.steptab[i] = pow(2.0, (double)(127 - i) / 4);
-+ if ((config->l3loop.steptab[i] * 2) >
-+ 0x7fffffff) /* MAXINT = 2**31 = 2**(124/4) */
-+ config->l3loop.steptabi[i] = 0x7fffffff;
- else
- /* The table is multiplied by 2 to give an extra bit of accuracy.
- * In quantize, the long multiply does not shift it's result left one
- * bit to compensate.
- */
-- config->l3loop.steptabi[i] = (int32_t)((config->l3loop.steptab[i]*2) + 0.5);
-+ config->l3loop.steptabi[i] =
-+ (int32_t)((config->l3loop.steptab[i] * 2) + 0.5);
- }
-
- /* quantize: vector conversion, three quarter power table.
- * The 0.5 is for rounding, the .0946 comes from the spec.
- */
-- for(i=10000; i--;)
-- config->l3loop.int2idx[i] = (int)(sqrt(sqrt((double)i)*(double)i) - 0.0946 + 0.5);
-+ for (i = 10000; i--;)
-+ config->l3loop.int2idx[i] =
-+ (int)(sqrt(sqrt((double)i) * (double)i) - 0.0946 + 0.5);
- }
-
- /*
-@@ -376,39 +367,37 @@ void shine_loop_initialise(shine_global_config *config)
- * Function: Quantization of the vector xr ( -> ix).
- * Returns maximum value of ix.
- */
--int quantize(int ix[GRANULE_SIZE], int stepsize, shine_global_config *config )
--{
-+int quantize(int ix[GRANULE_SIZE], int stepsize, shine_global_config *config) {
- int i, max, ln;
- int32_t scalei;
- double scale, dbl;
-
-- scalei = config->l3loop.steptabi[stepsize+127]; /* 2**(-stepsize/4) */
-+ scalei = config->l3loop.steptabi[stepsize + 127]; /* 2**(-stepsize/4) */
-
- /* a quick check to see if ixmax will be less than 8192 */
- /* this speeds up the early calls to bin_search_StepSize */
-- if((mulr(config->l3loop.xrmax,scalei)) > 165140) /* 8192**(4/3) */
-+ if ((mulr(config->l3loop.xrmax, scalei)) > 165140) /* 8192**(4/3) */
- max = 16384; /* no point in continuing, stepsize not big enough */
- else
-- for(i=0, max=0;i<GRANULE_SIZE;i++)
-- {
-+ for (i = 0, max = 0; i < GRANULE_SIZE; i++) {
- /* This calculation is very sensitive. The multiply must round it's
- * result or bad things happen to the quality.
- */
-- ln = mulr(labs(config->l3loop.xr[i]),scalei);
-+ ln = mulr(labs(config->l3loop.xr[i]), scalei);
-
-- if(ln<10000) /* ln < 10000 catches most values */
-+ if (ln < 10000) /* ln < 10000 catches most values */
- ix[i] = config->l3loop.int2idx[ln]; /* quick look up method */
-- else
-- {
-+ else {
- /* outside table range so have to do it using floats */
-- scale = config->l3loop.steptab[stepsize+127]; /* 2**(-stepsize/4) */
-- dbl = ((double)config->l3loop.xrabs[i]) * scale * 4.656612875e-10; /* 0x7fffffff */
-- ix[i] = (int)sqrt(sqrt(dbl)*dbl); /* dbl**(3/4) */
-+ scale = config->l3loop.steptab[stepsize + 127]; /* 2**(-stepsize/4) */
-+ dbl = ((double)config->l3loop.xrabs[i]) * scale *
-+ 4.656612875e-10; /* 0x7fffffff */
-+ ix[i] = (int)sqrt(sqrt(dbl) * dbl); /* dbl**(3/4) */
- }
-
- /* calculate ixmax while we're here */
- /* note. ix cannot be negative */
-- if(max < ix[i])
-+ if (max < ix[i])
- max = ix[i];
- }
-
-@@ -420,13 +409,13 @@ int quantize(int ix[GRANULE_SIZE], int stepsize, shine_global_config *config )
- * -------
- * Function: Calculate the maximum of ix from 0 to 575
- */
--static inline int ix_max( int ix[GRANULE_SIZE], unsigned int begin, unsigned int end )
--{
-+static inline int ix_max(int ix[GRANULE_SIZE], unsigned int begin,
-+ unsigned int end) {
- register int i;
- register int max = 0;
-
-- for(i=begin;i<end;i++)
-- if(max < ix[i])
-+ for (i = begin; i < end; i++)
-+ if (max < ix[i])
- max = ix[i];
- return max;
- }
-@@ -437,28 +426,24 @@ static inline int ix_max( int ix[GRANULE_SIZE], unsigned int begin, unsigned int
- * Function: Calculation of rzero, count1, big_values
- * (Partitions ix into big values, quadruples and zeros).
- */
--void calc_runlen( int ix[GRANULE_SIZE], gr_info *cod_info )
--{
-+void calc_runlen(int ix[GRANULE_SIZE], gr_info *cod_info) {
- int i;
- int rzero = 0;
-
-- for ( i = GRANULE_SIZE; i > 1; i -= 2 )
-- if ( !ix[i-1] && !ix[i-2] )
-+ for (i = GRANULE_SIZE; i > 1; i -= 2)
-+ if (!ix[i - 1] && !ix[i - 2])
- rzero++;
- else
- break;
-
-- cod_info->count1 = 0 ;
-- for ( ; i > 3; i -= 4 )
-- if ( ix[i-1] <= 1
-- && ix[i-2] <= 1
-- && ix[i-3] <= 1
-- && ix[i-4] <= 1 )
-+ cod_info->count1 = 0;
-+ for (; i > 3; i -= 4)
-+ if (ix[i - 1] <= 1 && ix[i - 2] <= 1 && ix[i - 3] <= 1 && ix[i - 4] <= 1)
- cod_info->count1++;
- else
- break;
-
-- cod_info->big_values = i>>1;
-+ cod_info->big_values = i >> 1;
- }
-
- /*
-@@ -466,27 +451,29 @@ void calc_runlen( int ix[GRANULE_SIZE], gr_info *cod_info )
- * ----------------
- * Determines the number of bits to encode the quadruples.
- */
--int count1_bitcount(int ix[GRANULE_SIZE], gr_info *cod_info)
--{
-+int count1_bitcount(int ix[GRANULE_SIZE], gr_info *cod_info) {
- int p, i, k;
- int v, w, x, y, signbits;
-- int sum0 = 0,
-- sum1 = 0;
-+ int sum0 = 0, sum1 = 0;
-
-- for(i=cod_info->big_values<<1, k=0; k<cod_info->count1; i+=4, k++)
-- {
-+ for (i = cod_info->big_values << 1, k = 0; k < cod_info->count1;
-+ i += 4, k++) {
- v = ix[i];
-- w = ix[i+1];
-- x = ix[i+2];
-- y = ix[i+3];
-+ w = ix[i + 1];
-+ x = ix[i + 2];
-+ y = ix[i + 3];
-
-- p = v + (w<<1) + (x<<2) + (y<<3);
-+ p = v + (w << 1) + (x << 2) + (y << 3);
-
- signbits = 0;
-- if(v!=0) signbits++;
-- if(w!=0) signbits++;
-- if(x!=0) signbits++;
-- if(y!=0) signbits++;
-+ if (v != 0)
-+ signbits++;
-+ if (w != 0)
-+ signbits++;
-+ if (x != 0)
-+ signbits++;
-+ if (y != 0)
-+ signbits++;
-
- sum0 += signbits;
- sum1 += signbits;
-@@ -495,13 +482,10 @@ int count1_bitcount(int ix[GRANULE_SIZE], gr_info *cod_info)
- sum1 += shine_huffman_table[33].hlen[p];
- }
-
-- if(sum0<sum1)
-- {
-+ if (sum0 < sum1) {
- cod_info->count1table_select = 0;
- return sum0;
-- }
-- else
-- {
-+ } else {
- cod_info->count1table_select = 1;
- return sum1;
- }
-@@ -510,59 +494,56 @@ int count1_bitcount(int ix[GRANULE_SIZE], gr_info *cod_info)
- /*
- * subdivide:
- * ----------
-- * presumable subdivides the bigvalue region which will use separate Huffman tables.
-+ * presumable subdivides the bigvalue region which will use separate Huffman
-+ * tables.
- */
--void subdivide(gr_info *cod_info, shine_global_config *config)
--{
-- static const struct
-- {
-+void subdivide(gr_info *cod_info, shine_global_config *config) {
-+ static const struct {
- unsigned region0_count;
- unsigned region1_count;
-- } subdv_table[ 23 ] =
-- {
-- {0, 0}, /* 0 bands */
-- {0, 0}, /* 1 bands */
-- {0, 0}, /* 2 bands */
-- {0, 0}, /* 3 bands */
-- {0, 0}, /* 4 bands */
-- {0, 1}, /* 5 bands */
-- {1, 1}, /* 6 bands */
-- {1, 1}, /* 7 bands */
-- {1, 2}, /* 8 bands */
-- {2, 2}, /* 9 bands */
-- {2, 3}, /* 10 bands */
-- {2, 3}, /* 11 bands */
-- {3, 4}, /* 12 bands */
-- {3, 4}, /* 13 bands */
-- {3, 4}, /* 14 bands */
-- {4, 5}, /* 15 bands */
-- {4, 5}, /* 16 bands */
-- {4, 6}, /* 17 bands */
-- {5, 6}, /* 18 bands */
-- {5, 6}, /* 19 bands */
-- {5, 7}, /* 20 bands */
-- {6, 7}, /* 21 bands */
-- {6, 7}, /* 22 bands */
-+ } subdv_table[23] = {
-+ {0, 0}, /* 0 bands */
-+ {0, 0}, /* 1 bands */
-+ {0, 0}, /* 2 bands */
-+ {0, 0}, /* 3 bands */
-+ {0, 0}, /* 4 bands */
-+ {0, 1}, /* 5 bands */
-+ {1, 1}, /* 6 bands */
-+ {1, 1}, /* 7 bands */
-+ {1, 2}, /* 8 bands */
-+ {2, 2}, /* 9 bands */
-+ {2, 3}, /* 10 bands */
-+ {2, 3}, /* 11 bands */
-+ {3, 4}, /* 12 bands */
-+ {3, 4}, /* 13 bands */
-+ {3, 4}, /* 14 bands */
-+ {4, 5}, /* 15 bands */
-+ {4, 5}, /* 16 bands */
-+ {4, 6}, /* 17 bands */
-+ {5, 6}, /* 18 bands */
-+ {5, 6}, /* 19 bands */
-+ {5, 7}, /* 20 bands */
-+ {6, 7}, /* 21 bands */
-+ {6, 7}, /* 22 bands */
- };
-
-- if (!cod_info->big_values)
-- { /* no big_values region */
-+ if (!cod_info->big_values) { /* no big_values region */
- cod_info->region0_count = 0;
- cod_info->region1_count = 0;
-- }
-- else
-- {
-- const int *scalefac_band_long = &shine_scale_fact_band_index[config->mpeg.samplerate_index][0];
-+ } else {
-+ const int *scalefac_band_long =
-+ &shine_scale_fact_band_index[config->mpeg.samplerate_index][0];
- int bigvalues_region, scfb_anz, thiscount;
-
- bigvalues_region = 2 * cod_info->big_values;
-
- /* Calculate scfb_anz */
- scfb_anz = 0;
-- while ( scalefac_band_long[scfb_anz] < bigvalues_region )
-+ while (scalefac_band_long[scfb_anz] < bigvalues_region)
- scfb_anz++;
-
-- for (thiscount = subdv_table[scfb_anz].region0_count; thiscount; thiscount--) {
-+ for (thiscount = subdv_table[scfb_anz].region0_count; thiscount;
-+ thiscount--) {
- if (scalefac_band_long[thiscount + 1] <= bigvalues_region)
- break;
- }
-@@ -571,7 +552,8 @@ void subdivide(gr_info *cod_info, shine_global_config *config)
-
- scalefac_band_long += cod_info->region0_count + 1;
-
-- for (thiscount = subdv_table[scfb_anz].region1_count; thiscount; thiscount--) {
-+ for (thiscount = subdv_table[scfb_anz].region1_count; thiscount;
-+ thiscount--) {
- if (scalefac_band_long[thiscount + 1] <= bigvalues_region)
- break;
- }
-@@ -587,21 +569,22 @@ void subdivide(gr_info *cod_info, shine_global_config *config)
- * ----------------
- * Function: Select huffman code tables for bigvalues regions
- */
--void bigv_tab_select( int ix[GRANULE_SIZE], gr_info *cod_info )
--{
-+void bigv_tab_select(int ix[GRANULE_SIZE], gr_info *cod_info) {
- cod_info->table_select[0] = 0;
- cod_info->table_select[1] = 0;
- cod_info->table_select[2] = 0;
-
- {
-- if ( cod_info->address1 > 0 )
-- cod_info->table_select[0] = new_choose_table( ix, 0, cod_info->address1 );
-+ if (cod_info->address1 > 0)
-+ cod_info->table_select[0] = new_choose_table(ix, 0, cod_info->address1);
-
-- if ( cod_info->address2 > cod_info->address1 )
-- cod_info->table_select[1] = new_choose_table( ix, cod_info->address1, cod_info->address2 );
-+ if (cod_info->address2 > cod_info->address1)
-+ cod_info->table_select[1] =
-+ new_choose_table(ix, cod_info->address1, cod_info->address2);
-
-- if ( cod_info->big_values<<1 > cod_info->address2 )
-- cod_info->table_select[2] = new_choose_table( ix, cod_info->address2, cod_info->big_values<<1 );
-+ if (cod_info->big_values << 1 > cod_info->address2)
-+ cod_info->table_select[2] =
-+ new_choose_table(ix, cod_info->address2, cod_info->big_values << 1);
- }
- }
-
-@@ -614,98 +597,89 @@ void bigv_tab_select( int ix[GRANULE_SIZE], gr_info *cod_info )
- * of the Huffman tables as defined in the IS (Table B.7), and will not work
- * with any arbitrary tables.
- */
--int new_choose_table( int ix[GRANULE_SIZE], unsigned int begin, unsigned int end )
--{
-+int new_choose_table(int ix[GRANULE_SIZE], unsigned int begin,
-+ unsigned int end) {
- int i, max;
- int choice[2];
- int sum[2];
-
-- max = ix_max(ix,begin,end);
-- if(!max)
-+ max = ix_max(ix, begin, end);
-+ if (!max)
- return 0;
-
- choice[0] = 0;
- choice[1] = 0;
-
-- if(max<15)
-- {
-+ if (max < 15) {
- /* try tables with no linbits */
-- for ( i =14; i--; )
-- if ( shine_huffman_table[i].xlen > max )
-- {
-+ for (i = 14; i--;)
-+ if (shine_huffman_table[i].xlen > max) {
- choice[0] = i;
- break;
- }
-
-- sum[0] = count_bit( ix, begin, end, choice[0] );
-+ sum[0] = count_bit(ix, begin, end, choice[0]);
-
-- switch (choice[0])
-- {
-- case 2:
-- sum[1] = count_bit( ix, begin, end, 3 );
-- if ( sum[1] <= sum[0] )
-- choice[0] = 3;
-- break;
-+ switch (choice[0]) {
-+ case 2:
-+ sum[1] = count_bit(ix, begin, end, 3);
-+ if (sum[1] <= sum[0])
-+ choice[0] = 3;
-+ break;
-
-- case 5:
-- sum[1] = count_bit( ix, begin, end, 6 );
-- if ( sum[1] <= sum[0] )
-- choice[0] = 6;
-- break;
-+ case 5:
-+ sum[1] = count_bit(ix, begin, end, 6);
-+ if (sum[1] <= sum[0])
-+ choice[0] = 6;
-+ break;
-
-- case 7:
-- sum[1] = count_bit( ix, begin, end, 8 );
-- if ( sum[1] <= sum[0] )
-- {
-- choice[0] = 8;
-- sum[0] = sum[1];
-- }
-- sum[1] = count_bit( ix, begin, end, 9 );
-- if ( sum[1] <= sum[0] )
-- choice[0] = 9;
-- break;
-+ case 7:
-+ sum[1] = count_bit(ix, begin, end, 8);
-+ if (sum[1] <= sum[0]) {
-+ choice[0] = 8;
-+ sum[0] = sum[1];
-+ }
-+ sum[1] = count_bit(ix, begin, end, 9);
-+ if (sum[1] <= sum[0])
-+ choice[0] = 9;
-+ break;
-
-- case 10:
-- sum[1] = count_bit( ix, begin, end, 11 );
-- if ( sum[1] <= sum[0] )
-- {
-- choice[0] = 11;
-- sum[0] = sum[1];
-- }
-- sum[1] = count_bit( ix, begin, end, 12 );
-- if ( sum[1] <= sum[0] )
-- choice[0] = 12;
-- break;
-+ case 10:
-+ sum[1] = count_bit(ix, begin, end, 11);
-+ if (sum[1] <= sum[0]) {
-+ choice[0] = 11;
-+ sum[0] = sum[1];
-+ }
-+ sum[1] = count_bit(ix, begin, end, 12);
-+ if (sum[1] <= sum[0])
-+ choice[0] = 12;
-+ break;
-
-- case 13:
-- sum[1] = count_bit( ix, begin, end, 15 );
-- if ( sum[1] <= sum[0] )
-- choice[0] = 15;
-- break;
-+ case 13:
-+ sum[1] = count_bit(ix, begin, end, 15);
-+ if (sum[1] <= sum[0])
-+ choice[0] = 15;
-+ break;
- }
-- }
-- else
-- {
-+ } else {
- /* try tables with linbits */
- max -= 15;
-
-- for(i=15;i<24;i++)
-- if(shine_huffman_table[i].linmax>=max)
-- {
-+ for (i = 15; i < 24; i++)
-+ if (shine_huffman_table[i].linmax >= max) {
- choice[0] = i;
- break;
- }
-
-- for(i=24;i<32;i++)
-- if(shine_huffman_table[i].linmax>=max)
-- {
-+ for (i = 24; i < 32; i++)
-+ if (shine_huffman_table[i].linmax >= max) {
- choice[1] = i;
- break;
- }
-
-- sum[0] = count_bit(ix,begin,end,choice[0]);
-- sum[1] = count_bit(ix,begin,end,choice[1]);
-- if (sum[1]<sum[0])
-+ sum[0] = count_bit(ix, begin, end, choice[0]);
-+ sum[1] = count_bit(ix, begin, end, choice[1]);
-+ if (sum[1] < sum[0])
- choice[0] = choice[1];
- }
- return choice[0];
-@@ -716,17 +690,16 @@ int new_choose_table( int ix[GRANULE_SIZE], unsigned int begin, unsigned int end
- * --------------
- * Function: Count the number of bits necessary to code the bigvalues region.
- */
--int bigv_bitcount(int ix[GRANULE_SIZE], gr_info *gi)
--{
-+int bigv_bitcount(int ix[GRANULE_SIZE], gr_info *gi) {
- int bits = 0;
- unsigned int table;
-
-- if( (table=gi->table_select[0])) /* region0 */
-- bits += count_bit(ix, 0, gi->address1, table );
-- if( (table=gi->table_select[1])) /* region1 */
-- bits += count_bit(ix, gi->address1, gi->address2, table );
-- if( (table=gi->table_select[2])) /* region2 */
-- bits += count_bit(ix, gi->address2, gi->address3, table );
-+ if ((table = gi->table_select[0])) /* region0 */
-+ bits += count_bit(ix, 0, gi->address1, table);
-+ if ((table = gi->table_select[1])) /* region1 */
-+ bits += count_bit(ix, gi->address1, gi->address2, table);
-+ if ((table = gi->table_select[2])) /* region2 */
-+ bits += count_bit(ix, gi->address2, gi->address3, table);
- return bits;
- }
-
-@@ -735,61 +708,51 @@ int bigv_bitcount(int ix[GRANULE_SIZE], gr_info *gi)
- * ----------
- * Function: Count the number of bits necessary to code the subregion.
- */
--int count_bit(int ix[GRANULE_SIZE],
-- unsigned int start,
-- unsigned int end,
-- unsigned int table )
--{
-- unsigned linbits, ylen;
-- register int i, sum;
-- register int x,y;
-+int count_bit(int ix[GRANULE_SIZE], unsigned int start, unsigned int end,
-+ unsigned int table) {
-+ unsigned linbits, ylen;
-+ register int i, sum;
-+ register int x, y;
- const struct huffcodetab *h;
-
-- if(!table)
-+ if (!table)
- return 0;
-
-- h = &(shine_huffman_table[table]);
-+ h = &(shine_huffman_table[table]);
- sum = 0;
-
-- ylen = h->ylen;
-+ ylen = h->ylen;
- linbits = h->linbits;
-
-- if(table>15)
-- { /* ESC-table is used */
-- for(i=start;i<end;i+=2)
-- {
-+ if (table > 15) { /* ESC-table is used */
-+ for (i = start; i < end; i += 2) {
- x = ix[i];
-- y = ix[i+1];
-- if(x>14)
-- {
-+ y = ix[i + 1];
-+ if (x > 14) {
- x = 15;
- sum += linbits;
- }
-- if(y>14)
-- {
-+ if (y > 14) {
- y = 15;
- sum += linbits;
- }
-
-- sum += h->hlen[(x*ylen)+y];
-- if(x)
-+ sum += h->hlen[(x * ylen) + y];
-+ if (x)
- sum++;
-- if(y)
-+ if (y)
- sum++;
- }
-- }
-- else
-- { /* No ESC-words */
-- for(i=start;i<end;i+=2)
-- {
-+ } else { /* No ESC-words */
-+ for (i = start; i < end; i += 2) {
- x = ix[i];
-- y = ix[i+1];
-+ y = ix[i + 1];
-
-- sum += h->hlen[(x*ylen)+y];
-+ sum += h->hlen[(x * ylen) + y];
-
-- if(x!=0)
-+ if (x != 0)
- sum++;
-- if(y!=0)
-+ if (y != 0)
- sum++;
- }
- }
-@@ -809,20 +772,18 @@ int count_bit(int ix[GRANULE_SIZE],
- * returns a good starting quantizerStepSize.
- */
- int bin_search_StepSize(int desired_rate, int ix[GRANULE_SIZE],
-- gr_info * cod_info, shine_global_config *config)
--{
-+ gr_info *cod_info, shine_global_config *config) {
- int bit, next, count;
-
-- next = -120;
-+ next = -120;
- count = 120;
-
- do {
- int half = count / 2;
-
- if (quantize(ix, next + half, config) > 8192)
-- bit = 100000; /* fail */
-- else
-- {
-+ bit = 100000; /* fail */
-+ else {
- calc_runlen(ix, cod_info); /* rzero,count1,big_values */
- bit = count1_bitcount(ix, cod_info); /* count1_table selection */
- subdivide(cod_info, config); /* bigvalues sfb division */
-@@ -832,8 +793,7 @@ int bin_search_StepSize(int desired_rate, int ix[GRANULE_SIZE],
-
- if (bit < desired_rate)
- count = half;
-- else
-- {
-+ else {
- next += half;
- count -= half;
- }
-diff --git a/src/lib/l3loop.h b/src/lib/l3loop.h
-index 0e71a91..94ecea3 100644
---- a/src/lib/l3loop.h
-+++ b/src/lib/l3loop.h
-@@ -1,9 +1,10 @@
- #ifndef L3LOOP_H
- #define L3LOOP_H
-
-+#include "types.h"
-+
- void shine_loop_initialise(shine_global_config *config);
-
- void shine_iteration_loop(shine_global_config *config);
-
- #endif
--
-diff --git a/src/lib/l3mdct.c b/src/lib/l3mdct.c
-index 7553a54..a76b702 100644
---- a/src/lib/l3mdct.c
-+++ b/src/lib/l3mdct.c
-@@ -1,88 +1,87 @@
- /* L3mdct */
-
--#include "types.h"
- #include "l3mdct.h"
- #include "l3subband.h"
-+#include "types.h"
-
- /* This is table B.9: coefficients for aliasing reduction */
--#define MDCT_CA(coef) (int32_t)(coef / sqrt(1.0 + (coef * coef)) * 0x7fffffff)
--#define MDCT_CS(coef) (int32_t)(1.0 / sqrt(1.0 + (coef * coef)) * 0x7fffffff)
-+#define MDCT_CA(coef) (int32_t)(coef / sqrt(1.0 + (coef * coef)) * 0x7fffffff)
-+#define MDCT_CS(coef) (int32_t)(1.0 / sqrt(1.0 + (coef * coef)) * 0x7fffffff)
-
--#define MDCT_CA0 MDCT_CA(-0.6)
--#define MDCT_CA1 MDCT_CA(-0.535)
--#define MDCT_CA2 MDCT_CA(-0.33)
--#define MDCT_CA3 MDCT_CA(-0.185)
--#define MDCT_CA4 MDCT_CA(-0.095)
--#define MDCT_CA5 MDCT_CA(-0.041)
--#define MDCT_CA6 MDCT_CA(-0.0142)
--#define MDCT_CA7 MDCT_CA(-0.0037)
-+#define MDCT_CA0 MDCT_CA(-0.6)
-+#define MDCT_CA1 MDCT_CA(-0.535)
-+#define MDCT_CA2 MDCT_CA(-0.33)
-+#define MDCT_CA3 MDCT_CA(-0.185)
-+#define MDCT_CA4 MDCT_CA(-0.095)
-+#define MDCT_CA5 MDCT_CA(-0.041)
-+#define MDCT_CA6 MDCT_CA(-0.0142)
-+#define MDCT_CA7 MDCT_CA(-0.0037)
-
--#define MDCT_CS0 MDCT_CS(-0.6)
--#define MDCT_CS1 MDCT_CS(-0.535)
--#define MDCT_CS2 MDCT_CS(-0.33)
--#define MDCT_CS3 MDCT_CS(-0.185)
--#define MDCT_CS4 MDCT_CS(-0.095)
--#define MDCT_CS5 MDCT_CS(-0.041)
--#define MDCT_CS6 MDCT_CS(-0.0142)
--#define MDCT_CS7 MDCT_CS(-0.0037)
-+#define MDCT_CS0 MDCT_CS(-0.6)
-+#define MDCT_CS1 MDCT_CS(-0.535)
-+#define MDCT_CS2 MDCT_CS(-0.33)
-+#define MDCT_CS3 MDCT_CS(-0.185)
-+#define MDCT_CS4 MDCT_CS(-0.095)
-+#define MDCT_CS5 MDCT_CS(-0.041)
-+#define MDCT_CS6 MDCT_CS(-0.0142)
-+#define MDCT_CS7 MDCT_CS(-0.0037)
-
- /*
- * shine_mdct_initialise:
- * -------------------
- */
--void shine_mdct_initialise(shine_global_config *config)
--{
-- int m,k;
-+void shine_mdct_initialise(shine_global_config *config) {
-+ int m, k;
-
- /* prepare the mdct coefficients */
-- for(m=18; m--; )
-- for(k=36; k--; )
-+ for (m = 18; m--;)
-+ for (k = 36; k--;)
- /* combine window and mdct coefficients into a single table */
- /* scale and convert to fixed point before storing */
-- config->mdct.cos_l[m][k] = (int32_t)(sin(PI36*(k+0.5))
-- * cos((PI/72)*(2*k+19)*(2*m+1)) * 0x7fffffff);
-+ config->mdct.cos_l[m][k] =
-+ (int32_t)(sin(PI36 * (k + 0.5)) *
-+ cos((PI / 72) * (2 * k + 19) * (2 * m + 1)) * 0x7fffffff);
- }
-
- /*
- * shine_mdct_sub:
- * ------------
- */
--void shine_mdct_sub(shine_global_config *config, int stride)
--{
-+void shine_mdct_sub(shine_global_config *config, int stride) {
- /* note. we wish to access the array 'config->mdct_freq[2][2][576]' as
- * [2][2][32][18]. (32*18=576),
- */
-- int32_t (*mdct_enc)[18];
-+ int32_t(*mdct_enc)[18];
-
-- int ch,gr,band,j,k;
-+ int ch, gr, band, j, k;
- int32_t mdct_in[36];
-
-- for(ch=config->wave.channels; ch--; )
-- {
-- for(gr=0; gr<config->mpeg.granules_per_frame; gr++)
-- {
-+ for (ch = config->wave.channels; ch--;) {
-+ for (gr = 0; gr < config->mpeg.granules_per_frame; gr++) {
- /* set up pointer to the part of config->mdct_freq we're using */
-- mdct_enc = (int32_t (*)[18]) config->mdct_freq[ch][gr];
-+ mdct_enc = (int32_t(*)[18])config->mdct_freq[ch][gr];
-
- /* polyphase filtering */
-- for(k=0; k<18; k+=2)
-- {
-- shine_window_filter_subband(&config->buffer[ch], &config->l3_sb_sample[ch][gr+1][k ][0], ch, config, stride);
-- shine_window_filter_subband(&config->buffer[ch], &config->l3_sb_sample[ch][gr+1][k+1][0], ch, config, stride);
-+ for (k = 0; k < 18; k += 2) {
-+ shine_window_filter_subband(&config->buffer[ch],
-+ &config->l3_sb_sample[ch][gr + 1][k][0], ch,
-+ config, stride);
-+ shine_window_filter_subband(&config->buffer[ch],
-+ &config->l3_sb_sample[ch][gr + 1][k + 1][0],
-+ ch, config, stride);
- /* Compensate for inversion in the analysis filter
- * (every odd index of band AND k)
- */
-- for(band=1; band<32; band+=2)
-- config->l3_sb_sample[ch][gr+1][k+1][band] *= -1;
-+ for (band = 1; band < 32; band += 2)
-+ config->l3_sb_sample[ch][gr + 1][k + 1][band] *= -1;
- }
-
-- /* Perform imdct of 18 previous subband samples + 18 current subband samples */
-- for(band=0; band<32; band++)
-- {
-- for(k=18; k--; )
-- {
-- mdct_in[k ] = config->l3_sb_sample[ch][gr ][k][band];
-- mdct_in[k+18] = config->l3_sb_sample[ch][gr+1][k][band];
-+ /* Perform imdct of 18 previous subband samples + 18 current subband
-+ * samples */
-+ for (band = 0; band < 32; band++) {
-+ for (k = 18; k--;) {
-+ mdct_in[k] = config->l3_sb_sample[ch][gr][k][band];
-+ mdct_in[k + 18] = config->l3_sb_sample[ch][gr + 1][k][band];
- }
-
- /* Calculation of the MDCT
-@@ -90,41 +89,61 @@ void shine_mdct_sub(shine_global_config *config, int stride)
- * 36 coefficients in the time domain and 18 in the frequency
- * domain.
- */
-- for(k=18; k--; )
-- {
-+ for (k = 18; k--;) {
- int32_t vm;
-+#ifdef __BORLANDC__
-+ uint32_t vm_lo;
-+#else
- uint32_t vm_lo __attribute__((unused));
-+#endif
-
- mul0(vm, vm_lo, mdct_in[35], config->mdct.cos_l[k][35]);
-- for(j=35; j; j-=7) {
-- muladd(vm, vm_lo, mdct_in[j-1], config->mdct.cos_l[k][j-1]);
-- muladd(vm, vm_lo, mdct_in[j-2], config->mdct.cos_l[k][j-2]);
-- muladd(vm, vm_lo, mdct_in[j-3], config->mdct.cos_l[k][j-3]);
-- muladd(vm, vm_lo, mdct_in[j-4], config->mdct.cos_l[k][j-4]);
-- muladd(vm, vm_lo, mdct_in[j-5], config->mdct.cos_l[k][j-5]);
-- muladd(vm, vm_lo, mdct_in[j-6], config->mdct.cos_l[k][j-6]);
-- muladd(vm, vm_lo, mdct_in[j-7], config->mdct.cos_l[k][j-7]);
-+ for (j = 35; j; j -= 7) {
-+ muladd(vm, vm_lo, mdct_in[j - 1], config->mdct.cos_l[k][j - 1]);
-+ muladd(vm, vm_lo, mdct_in[j - 2], config->mdct.cos_l[k][j - 2]);
-+ muladd(vm, vm_lo, mdct_in[j - 3], config->mdct.cos_l[k][j - 3]);
-+ muladd(vm, vm_lo, mdct_in[j - 4], config->mdct.cos_l[k][j - 4]);
-+ muladd(vm, vm_lo, mdct_in[j - 5], config->mdct.cos_l[k][j - 5]);
-+ muladd(vm, vm_lo, mdct_in[j - 6], config->mdct.cos_l[k][j - 6]);
-+ muladd(vm, vm_lo, mdct_in[j - 7], config->mdct.cos_l[k][j - 7]);
- }
- mulz(vm, vm_lo);
- mdct_enc[band][k] = vm;
- }
-
- /* Perform aliasing reduction butterfly */
-- if (band != 0)
-- {
-- cmuls(mdct_enc[band][0], mdct_enc[band-1][17-0], mdct_enc[band][0], mdct_enc[band-1][17-0], MDCT_CS0, MDCT_CA0);
-- cmuls(mdct_enc[band][1], mdct_enc[band-1][17-1], mdct_enc[band][1], mdct_enc[band-1][17-1], MDCT_CS1, MDCT_CA1);
-- cmuls(mdct_enc[band][2], mdct_enc[band-1][17-2], mdct_enc[band][2], mdct_enc[band-1][17-2], MDCT_CS2, MDCT_CA2);
-- cmuls(mdct_enc[band][3], mdct_enc[band-1][17-3], mdct_enc[band][3], mdct_enc[band-1][17-3], MDCT_CS3, MDCT_CA3);
-- cmuls(mdct_enc[band][4], mdct_enc[band-1][17-4], mdct_enc[band][4], mdct_enc[band-1][17-4], MDCT_CS4, MDCT_CA4);
-- cmuls(mdct_enc[band][5], mdct_enc[band-1][17-5], mdct_enc[band][5], mdct_enc[band-1][17-5], MDCT_CS5, MDCT_CA5);
-- cmuls(mdct_enc[band][6], mdct_enc[band-1][17-6], mdct_enc[band][6], mdct_enc[band-1][17-6], MDCT_CS6, MDCT_CA6);
-- cmuls(mdct_enc[band][7], mdct_enc[band-1][17-7], mdct_enc[band][7], mdct_enc[band-1][17-7], MDCT_CS7, MDCT_CA7);
-+ if (band != 0) {
-+ cmuls(mdct_enc[band][0], mdct_enc[band - 1][17 - 0],
-+ mdct_enc[band][0], mdct_enc[band - 1][17 - 0], MDCT_CS0,
-+ MDCT_CA0);
-+ cmuls(mdct_enc[band][1], mdct_enc[band - 1][17 - 1],
-+ mdct_enc[band][1], mdct_enc[band - 1][17 - 1], MDCT_CS1,
-+ MDCT_CA1);
-+ cmuls(mdct_enc[band][2], mdct_enc[band - 1][17 - 2],
-+ mdct_enc[band][2], mdct_enc[band - 1][17 - 2], MDCT_CS2,
-+ MDCT_CA2);
-+ cmuls(mdct_enc[band][3], mdct_enc[band - 1][17 - 3],
-+ mdct_enc[band][3], mdct_enc[band - 1][17 - 3], MDCT_CS3,
-+ MDCT_CA3);
-+ cmuls(mdct_enc[band][4], mdct_enc[band - 1][17 - 4],
-+ mdct_enc[band][4], mdct_enc[band - 1][17 - 4], MDCT_CS4,
-+ MDCT_CA4);
-+ cmuls(mdct_enc[band][5], mdct_enc[band - 1][17 - 5],
-+ mdct_enc[band][5], mdct_enc[band - 1][17 - 5], MDCT_CS5,
-+ MDCT_CA5);
-+ cmuls(mdct_enc[band][6], mdct_enc[band - 1][17 - 6],
-+ mdct_enc[band][6], mdct_enc[band - 1][17 - 6], MDCT_CS6,
-+ MDCT_CA6);
-+ cmuls(mdct_enc[band][7], mdct_enc[band - 1][17 - 7],
-+ mdct_enc[band][7], mdct_enc[band - 1][17 - 7], MDCT_CS7,
-+ MDCT_CA7);
- }
- }
- }
-
- /* Save latest granule's subband samples to be used in the next mdct call */
-- memcpy(config->l3_sb_sample[ch][0], config->l3_sb_sample[ch][config->mpeg.granules_per_frame], sizeof(config->l3_sb_sample[0][0]));
-+ memcpy(config->l3_sb_sample[ch][0],
-+ config->l3_sb_sample[ch][config->mpeg.granules_per_frame],
-+ sizeof(config->l3_sb_sample[0][0]));
- }
- }
-diff --git a/src/lib/l3mdct.h b/src/lib/l3mdct.h
-index 1288259..3018eb9 100644
---- a/src/lib/l3mdct.h
-+++ b/src/lib/l3mdct.h
-@@ -1,7 +1,9 @@
- #ifndef shine_MDCT_H
- #define shine_MDCT_H
-
--void shine_mdct_initialise();
-+#include "types.h"
-+
-+void shine_mdct_initialise(shine_global_config *config);
- void shine_mdct_sub(shine_global_config *config, int stride);
-
- #endif
-diff --git a/src/lib/l3subband.c b/src/lib/l3subband.c
-index 58abf5f..78f428e 100644
---- a/src/lib/l3subband.c
-+++ b/src/lib/l3subband.c
-@@ -1,8 +1,8 @@
- /* L3SubBand */
-
--#include "types.h"
--#include "tables.h"
- #include "l3subband.h"
-+#include "tables.h"
-+#include "types.h"
-
- /*
- * shine_subband_initialise:
-@@ -11,23 +11,21 @@
- * 9th decimal place accuracy of the filterbank tables in the ISO
- * document. The coefficients are stored in #filter#
- */
--void shine_subband_initialise(shine_global_config *config)
--{
-- int i,j;
-+void shine_subband_initialise(shine_global_config *config) {
-+ int i, j;
- double filter;
-
-- for(i=MAX_CHANNELS; i-- ; ) {
-+ for (i = MAX_CHANNELS; i--;) {
- config->subband.off[i] = 0;
- memset(config->subband.x[i], 0, sizeof(config->subband.x[i]));
- }
-
-- for (i=SBLIMIT; i--; )
-- for (j=64; j--; )
-- {
-- if ((filter = 1e9*cos((double)((2*i+1)*(16-j)*PI64))) >= 0)
-- modf(filter+0.5, &filter);
-+ for (i = SBLIMIT; i--;)
-+ for (j = 64; j--;) {
-+ if ((filter = 1e9 * cos((double)((2 * i + 1) * (16 - j) * PI64))) >= 0)
-+ modf(filter + 0.5, &filter);
- else
-- modf(filter-0.5, &filter);
-+ modf(filter - 0.5, &filter);
- /* scale and convert to fixed point before storing */
- config->subband.fl[i][j] = (int32_t)(filter * (0x7fffffff * 1e-9));
- }
-@@ -39,58 +37,90 @@ void shine_subband_initialise(shine_global_config *config)
- * Overlapping window on PCM samples
- * 32 16-bit pcm samples are scaled to fractional 2's complement and
- * concatenated to the end of the window buffer #x#. The updated window
-- * buffer #x# is then windowed by the analysis window #shine_enwindow# to produce
-- * the windowed sample #z#
-- * Calculates the analysis filter bank coefficients
-- * The windowed samples #z# is filtered by the digital filter matrix #filter#
-- * to produce the subband samples #s#. This done by first selectively
-- * picking out values from the windowed samples, and then multiplying
-- * them by the filter matrix, producing 32 subband samples.
-+ * buffer #x# is then windowed by the analysis window #shine_enwindow# to
-+ * produce the windowed sample #z# Calculates the analysis filter bank
-+ * coefficients The windowed samples #z# is filtered by the digital filter
-+ * matrix #filter# to produce the subband samples #s#. This done by first
-+ * selectively picking out values from the windowed samples, and then
-+ * multiplying them by the filter matrix, producing 32 subband samples.
- */
--void shine_window_filter_subband(int16_t **buffer, int32_t s[SBLIMIT], int ch, shine_global_config *config, int stride)
--{
-+void shine_window_filter_subband(int16_t **buffer, int32_t s[SBLIMIT], int ch,
-+ shine_global_config *config, int stride) {
- int32_t y[64];
-- int i,j;
-+ int i, j;
- int16_t *ptr = *buffer;
-
- /* replace 32 oldest samples with 32 new samples */
-- for (i=32;i--;) {
-- config->subband.x[ch][i+config->subband.off[ch]] = ((int32_t)*ptr) << 16;
-+ for (i = 32; i--;) {
-+ config->subband.x[ch][i + config->subband.off[ch]] = ((int32_t)*ptr) << 16;
- ptr += stride;
- }
- *buffer = ptr;
-
-- for (i=64; i--; ) {
-+ for (i = 64; i--;) {
- int32_t s_value;
-+#ifdef __BORLANDC__
-+ uint32_t s_value_lo;
-+#else
- uint32_t s_value_lo __attribute__((unused));
-+#endif
-
-- mul0 (s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (0<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (0<<6)]);
-- muladd(s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (1<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (1<<6)]);
-- muladd(s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (2<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (2<<6)]);
-- muladd(s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (3<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (3<<6)]);
-- muladd(s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (4<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (4<<6)]);
-- muladd(s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (5<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (5<<6)]);
-- muladd(s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (6<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (6<<6)]);
-- muladd(s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (7<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (7<<6)]);
-- mulz (s_value, s_value_lo);
-+ mul0(s_value, s_value_lo,
-+ config->subband
-+ .x[ch][(config->subband.off[ch] + i + (0 << 6)) & (HAN_SIZE - 1)],
-+ shine_enwindow[i + (0 << 6)]);
-+ muladd(s_value, s_value_lo,
-+ config->subband.x[ch][(config->subband.off[ch] + i + (1 << 6)) &
-+ (HAN_SIZE - 1)],
-+ shine_enwindow[i + (1 << 6)]);
-+ muladd(s_value, s_value_lo,
-+ config->subband.x[ch][(config->subband.off[ch] + i + (2 << 6)) &
-+ (HAN_SIZE - 1)],
-+ shine_enwindow[i + (2 << 6)]);
-+ muladd(s_value, s_value_lo,
-+ config->subband.x[ch][(config->subband.off[ch] + i + (3 << 6)) &
-+ (HAN_SIZE - 1)],
-+ shine_enwindow[i + (3 << 6)]);
-+ muladd(s_value, s_value_lo,
-+ config->subband.x[ch][(config->subband.off[ch] + i + (4 << 6)) &
-+ (HAN_SIZE - 1)],
-+ shine_enwindow[i + (4 << 6)]);
-+ muladd(s_value, s_value_lo,
-+ config->subband.x[ch][(config->subband.off[ch] + i + (5 << 6)) &
-+ (HAN_SIZE - 1)],
-+ shine_enwindow[i + (5 << 6)]);
-+ muladd(s_value, s_value_lo,
-+ config->subband.x[ch][(config->subband.off[ch] + i + (6 << 6)) &
-+ (HAN_SIZE - 1)],
-+ shine_enwindow[i + (6 << 6)]);
-+ muladd(s_value, s_value_lo,
-+ config->subband.x[ch][(config->subband.off[ch] + i + (7 << 6)) &
-+ (HAN_SIZE - 1)],
-+ shine_enwindow[i + (7 << 6)]);
-+ mulz(s_value, s_value_lo);
- y[i] = s_value;
- }
-
-- config->subband.off[ch] = (config->subband.off[ch] + 480) & (HAN_SIZE-1); /* offset is modulo (HAN_SIZE)*/
-+ config->subband.off[ch] = (config->subband.off[ch] + 480) &
-+ (HAN_SIZE - 1); /* offset is modulo (HAN_SIZE)*/
-
-- for (i=SBLIMIT; i--; ) {
-+ for (i = SBLIMIT; i--;) {
- int32_t s_value;
-+#ifdef __BORLANDC__
-+ uint32_t s_value_lo;
-+#else
- uint32_t s_value_lo __attribute__((unused));
-+#endif
-
- mul0(s_value, s_value_lo, config->subband.fl[i][63], y[63]);
-- for (j=63; j; j-=7) {
-- muladd(s_value, s_value_lo, config->subband.fl[i][j-1], y[j-1]);
-- muladd(s_value, s_value_lo, config->subband.fl[i][j-2], y[j-2]);
-- muladd(s_value, s_value_lo, config->subband.fl[i][j-3], y[j-3]);
-- muladd(s_value, s_value_lo, config->subband.fl[i][j-4], y[j-4]);
-- muladd(s_value, s_value_lo, config->subband.fl[i][j-5], y[j-5]);
-- muladd(s_value, s_value_lo, config->subband.fl[i][j-6], y[j-6]);
-- muladd(s_value, s_value_lo, config->subband.fl[i][j-7], y[j-7]);
-+ for (j = 63; j; j -= 7) {
-+ muladd(s_value, s_value_lo, config->subband.fl[i][j - 1], y[j - 1]);
-+ muladd(s_value, s_value_lo, config->subband.fl[i][j - 2], y[j - 2]);
-+ muladd(s_value, s_value_lo, config->subband.fl[i][j - 3], y[j - 3]);
-+ muladd(s_value, s_value_lo, config->subband.fl[i][j - 4], y[j - 4]);
-+ muladd(s_value, s_value_lo, config->subband.fl[i][j - 5], y[j - 5]);
-+ muladd(s_value, s_value_lo, config->subband.fl[i][j - 6], y[j - 6]);
-+ muladd(s_value, s_value_lo, config->subband.fl[i][j - 7], y[j - 7]);
- }
- mulz(s_value, s_value_lo);
- s[i] = s_value;
-diff --git a/src/lib/l3subband.h b/src/lib/l3subband.h
-index 9bfe861..5cfbef5 100644
---- a/src/lib/l3subband.h
-+++ b/src/lib/l3subband.h
-@@ -1,9 +1,11 @@
- #ifndef L3SUBBAND_H
- #define L3SUBBAND_H
-
-+#include "types.h"
- #include <stdint.h>
-
--void shine_subband_initialise( shine_global_config *config );
--void shine_window_filter_subband(int16_t **buffer, int32_t s[SBLIMIT], int k, shine_global_config *config, int stride);
-+void shine_subband_initialise(shine_global_config *config);
-+void shine_window_filter_subband(int16_t **buffer, int32_t s[SBLIMIT], int k,
-+ shine_global_config *config, int stride);
-
- #endif
-diff --git a/src/lib/layer3.c b/src/lib/layer3.c
-index 0b574ad..f3d1ecd 100644
---- a/src/lib/layer3.c
-+++ b/src/lib/layer3.c
-@@ -1,28 +1,27 @@
- /* layer3.c */
-
--#include "types.h"
--#include "tables.h"
- #include "layer3.h"
--#include "l3subband.h"
--#include "l3mdct.h"
--#include "l3loop.h"
- #include "bitstream.h"
- #include "l3bitstream.h"
-+#include "l3loop.h"
-+#include "l3mdct.h"
-+#include "l3subband.h"
-+#include "tables.h"
-+#include "types.h"
-
- static int granules_per_frame[4] = {
- 1, /* MPEG 2.5 */
-- -1, /* Reserved */
-+ -1, /* Reserved */
- 1, /* MPEG II */
-- 2 /* MPEG I */
-+ 2 /* MPEG I */
- };
-
- /* Set default values for important vars */
--void shine_set_config_mpeg_defaults(shine_mpeg_t *mpeg)
--{
-+void shine_set_config_mpeg_defaults(shine_mpeg_t *mpeg) {
- mpeg->bitr = 128;
- mpeg->emph = NONE;
- mpeg->copyright = 0;
-- mpeg->original = 1;
-+ mpeg->original = 1;
- }
-
- int shine_mpeg_version(int samplerate_index) {
-@@ -38,56 +37,56 @@ int shine_mpeg_version(int samplerate_index) {
- return MPEG_25;
- }
-
--int shine_find_samplerate_index(int freq)
--{
-+int shine_find_samplerate_index(int freq) {
- int i;
-
-- for(i=0;i<9;i++)
-- if(freq==samplerates[i]) return i;
-+ for (i = 0; i < 9; i++)
-+ if (freq == samplerates[i])
-+ return i;
-
- return -1; /* error - not a valid samplerate for encoder */
- }
-
--int shine_find_bitrate_index(int bitr, int mpeg_version)
--{
-+int shine_find_bitrate_index(int bitr, int mpeg_version) {
- int i;
-
-- for(i=0;i<16;i++)
-- if(bitr==bitrates[i][mpeg_version]) return i;
-+ for (i = 0; i < 16; i++)
-+ if (bitr == bitrates[i][mpeg_version])
-+ return i;
-
- return -1; /* error - not a valid samplerate for encoder */
- }
-
--int shine_check_config(int freq, int bitr)
--{
-+int shine_check_config(int freq, int bitr) {
- int samplerate_index, bitrate_index, mpeg_version;
-
- samplerate_index = shine_find_samplerate_index(freq);
-- if (samplerate_index < 0) return -1;
-+ if (samplerate_index < 0)
-+ return -1;
-
- mpeg_version = shine_mpeg_version(samplerate_index);
-
- bitrate_index = shine_find_bitrate_index(bitr, mpeg_version);
-- if (bitrate_index < 0) return -1;
-+ if (bitrate_index < 0)
-+ return -1;
-
- return mpeg_version;
- }
-
--int shine_samples_per_pass(shine_t s)
--{
-+int shine_samples_per_pass(shine_t s) {
- return s->mpeg.granules_per_frame * GRANULE_SIZE;
- }
-
- /* Compute default encoding values. */
--shine_global_config *shine_initialise(shine_config_t *pub_config)
--{
-+shine_global_config *shine_initialise(shine_config_t *pub_config) {
- double avg_slots_per_frame;
- shine_global_config *config;
-
-- if (shine_check_config(pub_config->wave.samplerate, pub_config->mpeg.bitr) < 0)
-+ if (shine_check_config(pub_config->wave.samplerate, pub_config->mpeg.bitr) <
-+ 0)
- return NULL;
-
-- config = calloc(1,sizeof(shine_global_config));
-+ config = calloc(1, sizeof(shine_global_config));
- if (config == NULL)
- return config;
-
-@@ -96,65 +95,71 @@ shine_global_config *shine_initialise(shine_config_t *pub_config)
- shine_loop_initialise(config);
-
- /* Copy public config. */
-- config->wave.channels = pub_config->wave.channels;
-- config->wave.samplerate = pub_config->wave.samplerate;
-- config->mpeg.mode = pub_config->mpeg.mode;
-- config->mpeg.bitr = pub_config->mpeg.bitr;
-- config->mpeg.emph = pub_config->mpeg.emph;
-- config->mpeg.copyright = pub_config->mpeg.copyright;
-- config->mpeg.original = pub_config->mpeg.original;
-+ config->wave.channels = pub_config->wave.channels;
-+ config->wave.samplerate = pub_config->wave.samplerate;
-+ config->mpeg.mode = pub_config->mpeg.mode;
-+ config->mpeg.bitr = pub_config->mpeg.bitr;
-+ config->mpeg.emph = pub_config->mpeg.emph;
-+ config->mpeg.copyright = pub_config->mpeg.copyright;
-+ config->mpeg.original = pub_config->mpeg.original;
-
- /* Set default values. */
-- config->ResvMax = 0;
-- config->ResvSize = 0;
-- config->mpeg.layer = LAYER_III;
-- config->mpeg.crc = 0;
-- config->mpeg.ext = 0;
-- config->mpeg.mode_ext = 0;
-- config->mpeg.bits_per_slot = 8;
--
-- config->mpeg.samplerate_index = shine_find_samplerate_index(config->wave.samplerate);
-- config->mpeg.version = shine_mpeg_version(config->mpeg.samplerate_index);
-- config->mpeg.bitrate_index = shine_find_bitrate_index(config->mpeg.bitr, config->mpeg.version);
-+ config->ResvMax = 0;
-+ config->ResvSize = 0;
-+ config->mpeg.layer = LAYER_III;
-+ config->mpeg.crc = 0;
-+ config->mpeg.ext = 0;
-+ config->mpeg.mode_ext = 0;
-+ config->mpeg.bits_per_slot = 8;
-+
-+ config->mpeg.samplerate_index =
-+ shine_find_samplerate_index(config->wave.samplerate);
-+ config->mpeg.version = shine_mpeg_version(config->mpeg.samplerate_index);
-+ config->mpeg.bitrate_index =
-+ shine_find_bitrate_index(config->mpeg.bitr, config->mpeg.version);
- config->mpeg.granules_per_frame = granules_per_frame[config->mpeg.version];
-
- /* Figure average number of 'slots' per frame. */
-- avg_slots_per_frame = ((double)config->mpeg.granules_per_frame * GRANULE_SIZE /
-- ((double)config->wave.samplerate)) *
-- (1000*(double)config->mpeg.bitr /
-- (double)config->mpeg.bits_per_slot);
-+ avg_slots_per_frame =
-+ ((double)config->mpeg.granules_per_frame * GRANULE_SIZE /
-+ ((double)config->wave.samplerate)) *
-+ (1000 * (double)config->mpeg.bitr / (double)config->mpeg.bits_per_slot);
-
-- config->mpeg.whole_slots_per_frame = (int)avg_slots_per_frame;
-+ config->mpeg.whole_slots_per_frame = (int)avg_slots_per_frame;
-
-- config->mpeg.frac_slots_per_frame = avg_slots_per_frame - (double)config->mpeg.whole_slots_per_frame;
-- config->mpeg.slot_lag = -config->mpeg.frac_slots_per_frame;
-+ config->mpeg.frac_slots_per_frame =
-+ avg_slots_per_frame - (double)config->mpeg.whole_slots_per_frame;
-+ config->mpeg.slot_lag = -config->mpeg.frac_slots_per_frame;
-
-- if(config->mpeg.frac_slots_per_frame==0)
-+ if (config->mpeg.frac_slots_per_frame == 0)
- config->mpeg.padding = 0;
-
- shine_open_bit_stream(&config->bs, BUFFER_SIZE);
-
-- memset((char *)&config->side_info,0,sizeof(shine_side_info_t));
-+ memset((char *)&config->side_info, 0, sizeof(shine_side_info_t));
-
- /* determine the mean bitrate for main data */
- if (config->mpeg.granules_per_frame == 2) /* MPEG 1 */
-- config->sideinfo_len = 8 * ((config->wave.channels==1) ? 4 + 17 : 4 + 32);
-- else /* MPEG 2 */
-- config->sideinfo_len = 8 * ((config->wave.channels==1) ? 4 + 9 : 4 + 17);
-+ config->sideinfo_len = 8 * ((config->wave.channels == 1) ? 4 + 17 : 4 + 32);
-+ else /* MPEG 2 */
-+ config->sideinfo_len = 8 * ((config->wave.channels == 1) ? 4 + 9 : 4 + 17);
-
- return config;
- }
-
--static unsigned char *shine_encode_buffer_internal(shine_global_config *config, int *written, int stride)
--{
-- if(config->mpeg.frac_slots_per_frame)
-- {
-- config->mpeg.padding = (config->mpeg.slot_lag <= (config->mpeg.frac_slots_per_frame - 1.0));
-- config->mpeg.slot_lag += (config->mpeg.padding - config->mpeg.frac_slots_per_frame);
-+static unsigned char *shine_encode_buffer_internal(shine_global_config *config,
-+ int *written, int stride) {
-+ if (config->mpeg.frac_slots_per_frame) {
-+ config->mpeg.padding =
-+ (config->mpeg.slot_lag <= (config->mpeg.frac_slots_per_frame - 1.0));
-+ config->mpeg.slot_lag +=
-+ (config->mpeg.padding - config->mpeg.frac_slots_per_frame);
- }
-
-- config->mpeg.bits_per_frame = 8*(config->mpeg.whole_slots_per_frame + config->mpeg.padding);
-- config->mean_bits = (config->mpeg.bits_per_frame - config->sideinfo_len)/config->mpeg.granules_per_frame;
-+ config->mpeg.bits_per_frame =
-+ 8 * (config->mpeg.whole_slots_per_frame + config->mpeg.padding);
-+ config->mean_bits = (config->mpeg.bits_per_frame - config->sideinfo_len) /
-+ config->mpeg.granules_per_frame;
-
- /* apply mdct to the polyphase output */
- shine_mdct_sub(config, stride);
-@@ -172,8 +177,8 @@ static unsigned char *shine_encode_buffer_internal(shine_global_config *config,
- return config->bs.data;
- }
-
--unsigned char *shine_encode_buffer(shine_global_config *config, int16_t **data, int *written)
--{
-+unsigned char *shine_encode_buffer(shine_global_config *config, int16_t **data,
-+ int *written) {
- config->buffer[0] = data[0];
- if (config->wave.channels == 2)
- config->buffer[1] = data[1];
-@@ -181,8 +186,8 @@ unsigned char *shine_encode_buffer(shine_global_config *config, int16_t **data,
- return shine_encode_buffer_internal(config, written, 1);
- }
-
--unsigned char *shine_encode_buffer_interleaved(shine_global_config *config, int16_t *data, int *written)
--{
-+unsigned char *shine_encode_buffer_interleaved(shine_global_config *config,
-+ int16_t *data, int *written) {
- config->buffer[0] = data;
- if (config->wave.channels == 2)
- config->buffer[1] = data + 1;
-@@ -197,7 +202,6 @@ unsigned char *shine_flush(shine_global_config *config, int *written) {
- return config->bs.data;
- }
-
--
- void shine_close(shine_global_config *config) {
- shine_close_bit_stream(&config->bs);
- free(config);
-diff --git a/src/lib/layer3.h b/src/lib/layer3.h
-index 7fb11e0..d72b6a4 100644
---- a/src/lib/layer3.h
-+++ b/src/lib/layer3.h
-@@ -5,48 +5,31 @@
-
- /* This is the struct used to tell the encoder about the input PCM */
-
--enum channels {
-- PCM_MONO = 1,
-- PCM_STEREO = 2
--};
-+enum channels { PCM_MONO = 1, PCM_STEREO = 2 };
-
--enum mpeg_versions {
-- MPEG_I = 3,
-- MPEG_II = 2,
-- MPEG_25 = 0
--};
-+enum mpeg_versions { MPEG_I = 3, MPEG_II = 2, MPEG_25 = 0 };
-
- /* Only Layer III currently implemented. */
--enum mpeg_layers {
-- LAYER_III = 1
--};
-+enum mpeg_layers { LAYER_III = 1 };
-
- typedef struct {
-- enum channels channels;
-- int samplerate;
-+ enum channels channels;
-+ int samplerate;
- } shine_wave_t;
-
--/* This is the struct the encoder uses to tell the encoder about the output MP3 */
-+/* This is the struct the encoder uses to tell the encoder about the output MP3
-+ */
-
--enum modes {
-- STEREO = 0,
-- JOINT_STEREO = 1,
-- DUAL_CHANNEL = 2,
-- MONO = 3
--};
-+enum modes { STEREO = 0, JOINT_STEREO = 1, DUAL_CHANNEL = 2, MONO = 3 };
-
--enum emph {
-- NONE = 0,
-- MU50_15 = 1,
-- CITT = 3
--};
-+enum emph { NONE = 0, MU50_15 = 1, CITT = 3 };
-
- typedef struct {
-- enum modes mode; /* Stereo mode */
-- int bitr; /* Must conform to known bitrate */
-- enum emph emph; /* De-emphasis */
-- int copyright;
-- int original;
-+ enum modes mode; /* Stereo mode */
-+ int bitr; /* Must conform to known bitrate */
-+ enum emph emph; /* De-emphasis */
-+ int copyright;
-+ int original;
- } shine_mpeg_t;
-
- typedef struct {
-@@ -60,7 +43,7 @@ typedef struct {
- * const int samplerates[9] = {
- * 44100, 48000, 32000, // MPEG-I
- * 22050, 24000, 16000, // MPEG-II
-- * 11025, 12000, 8000 // MPEG-2.5
-+ * 11025, 12000, 8000 // MPEG-2.5
- * };
- *
- * const int bitrates[16][4] = {
-@@ -92,37 +75,37 @@ typedef struct shine_global_flags *shine_t;
- /* Fill in a `mpeg_t` structure with default values. */
- void shine_set_config_mpeg_defaults(shine_mpeg_t *mpeg);
-
--/* Check if a given bitrate is supported by the encoder (see `bitrates` above for a list
-- * of acceptable values. */
-+/* Check if a given bitrate is supported by the encoder (see `bitrates` above
-+ * for a list of acceptable values. */
- int shine_find_bitrate_index(int bitr, int mpeg_version);
-
--/* Check if a given samplerate is supported by the encoder (see `samplerates` above for a list
-- * of acceptable values. */
-+/* Check if a given samplerate is supported by the encoder (see `samplerates`
-+ * above for a list of acceptable values. */
- int shine_find_samplerate_index(int freq);
-
- /* Returns the MPEG version used for the given samplerate index. See above
-- * `mpeg_versions` for a list of possible values. */
-+ * `mpeg_versions` for a list of possible values. */
- int shine_mpeg_version(int samplerate_index);
-
--/* Check if a given bitrate and samplerate is supported by the encoder (see `samplerates`
-- * and `bitrates` above for a list of acceptable values).
-+/* Check if a given bitrate and samplerate is supported by the encoder (see
-+ * `samplerates` and `bitrates` above for a list of acceptable values).
- *
- * Returns -1 on error, mpeg_version on success. */
- int shine_check_config(int freq, int bitr);
-
- /* Pass a pointer to a `config_t` structure and returns an initialized
-- * encoder.
-+ * encoder.
- *
- * Configuration data is copied over to the encoder. It is not possible
- * to change its values after initializing the encoder at the moment.
- *
-- * Checking for valid configuration values is left for the application to
-- * implement. You can use the `shine_find_bitrate_index` and
-- * `shine_find_samplerate_index` functions or the `bitrates` and
-- * `samplerates` arrays above to check those parameters. Mone and stereo
-+ * Checking for valid configuration values is left for the application to
-+ * implement. You can use the `shine_find_bitrate_index` and
-+ * `shine_find_samplerate_index` functions or the `bitrates` and
-+ * `samplerates` arrays above to check those parameters. Mone and stereo
- * mode for wave and mpeg should also be consistent with each other.
- *
-- * This function returns NULL if it was not able to allocate memory data for
-+ * This function returns NULL if it was not able to allocate memory data for
- * the encoder. */
- shine_t shine_initialise(shine_config_t *config);
-
-@@ -132,26 +115,28 @@ shine_t shine_initialise(shine_config_t *config);
- /* Returns audio samples expected in each frame. */
- int shine_samples_per_pass(shine_t s);
-
--/* Encode audio data. Source data must have `shine_samples_per_pass(s)` audio samples per
-- * channels. Mono encoder only expect one channel.
-+/* Encode audio data. Source data must have `shine_samples_per_pass(s)` audio
-+ * samples per channels. Mono encoder only expect one channel.
- *
-- * Returns a pointer to freshly encoded data while `written` contains the size of
-- * available data. This pointer's memory is handled by the library and is only valid
-- * until the next call to `shine_encode_buffer` or `shine_close` and may be NULL if no data
-- * was written. */
-+ * Returns a pointer to freshly encoded data while `written` contains the size
-+ * of available data. This pointer's memory is handled by the library and is
-+ * only valid until the next call to `shine_encode_buffer` or `shine_close` and
-+ * may be NULL if no data was written. */
- unsigned char *shine_encode_buffer(shine_t s, int16_t **data, int *written);
-
--/* Encode interleaved audio data. Source data must have `shine_samples_per_pass(s)` audio samples per
-- * channels. Mono encoder only expect one channel.
-+/* Encode interleaved audio data. Source data must have
-+ * `shine_samples_per_pass(s)` audio samples per channels. Mono encoder only
-+ * expect one channel.
- *
-- * Returns a pointer to freshly encoded data while `written` contains the size of
-- * available data. This pointer's memory is handled by the library and is only valid
-- * until the next call to `shine_encode_buffer` or `shine_close` and may be NULL if no data
-- * was written. */
--unsigned char *shine_encode_buffer_interleaved(shine_t s, int16_t *data, int *written);
--
--/* Flush all data currently in the encoding buffer. Should be used before closing
-- * the encoder, to make all encoded data has been written. */
-+ * Returns a pointer to freshly encoded data while `written` contains the size
-+ * of available data. This pointer's memory is handled by the library and is
-+ * only valid until the next call to `shine_encode_buffer` or `shine_close` and
-+ * may be NULL if no data was written. */
-+unsigned char *shine_encode_buffer_interleaved(shine_t s, int16_t *data,
-+ int *written);
-+
-+/* Flush all data currently in the encoding buffer. Should be used before
-+ * closing the encoder, to make all encoded data has been written. */
- unsigned char *shine_flush(shine_t s, int *written);
-
- /* Close an encoder, freeing all associated memory. Encoder handler is not
-diff --git a/src/lib/mult_mips_gcc.h b/src/lib/mult_mips_gcc.h
-index 092ed84..d49d215 100644
---- a/src/lib/mult_mips_gcc.h
-+++ b/src/lib/mult_mips_gcc.h
-@@ -1,51 +1,50 @@
- #include <stdint.h>
-
--#define mul(a,b) \
--({ \
-- register int32_t res; \
-- __asm__ __volatile__("mult %0, %1" : : "r" (a), "r" (b)); \
-- __asm__ __volatile__("mfhi %0" : "=r" (res)); \
-- res; \
--})
-+#define mul(a, b) \
-+ ({ \
-+ register int32_t res; \
-+ __asm__ __volatile__("mult %0, %1" : : "r"(a), "r"(b)); \
-+ __asm__ __volatile__("mfhi %0" : "=r"(res)); \
-+ res; \
-+ })
-
--#define mul0(hi,lo,a,b) \
-- __asm__ __volatile__("mult %0, %1" : : "r" (a), "r" (b))
-+#define mul0(hi, lo, a, b) \
-+ __asm__ __volatile__("mult %0, %1" : : "r"(a), "r"(b))
-
--#define muladd(hi,lo,a,b) \
-- __asm__ __volatile__("madd %0, %1" : : "r" (a), "r" (b))
-+#define muladd(hi, lo, a, b) \
-+ __asm__ __volatile__("madd %0, %1" : : "r"(a), "r"(b))
-
--#define mulsub(hi,lo,a,b) \
-- __asm__ __volatile__("msub %0, %1" : : "r" (a), "r" (b))
-+#define mulsub(hi, lo, a, b) \
-+ __asm__ __volatile__("msub %0, %1" : : "r"(a), "r"(b))
-
--#define mulz(hi,lo) \
--do { \
-- register int32_t t; \
-- __asm__ __volatile__("mfhi %0" : "=r" (t)); \
-- (hi) = t; \
--} while (0)
-+#define mulz(hi, lo) \
-+ do { \
-+ register int32_t t; \
-+ __asm__ __volatile__("mfhi %0" : "=r"(t)); \
-+ (hi) = t; \
-+ } while (0)
-
--#define cmuls(dre, dim, are, aim, bre, bim) \
--do { \
-- register int32_t t1, t2, tre; \
-- __asm__ __volatile__("mult %0, %1" : : "r" (are), "r" (bre)); \
-- __asm__ __volatile__("msub %0, %1" : : "r" (aim), "r" (bim)); \
-- __asm__ __volatile__("mfhi %0; mflo %1" : "=r" (t1), "=r" (t2)); \
-- tre = (t1 << 1) | ((uint32_t)t2 >> 31); \
-- __asm__ __volatile__("mult %0, %1" : : "r" (are), "r" (bim)); \
-- __asm__ __volatile__("madd %0, %1" : : "r" (bre), "r" (aim)); \
-- dre = tre; \
-- __asm__ __volatile__("mfhi %0; mflo %1" : "=r" (t1), "=r" (t2)); \
-- dim = (t1 << 1) | ((uint32_t)t2 >> 31); \
--} while (0)
-+#define cmuls(dre, dim, are, aim, bre, bim) \
-+ do { \
-+ register int32_t t1, t2, tre; \
-+ __asm__ __volatile__("mult %0, %1" : : "r"(are), "r"(bre)); \
-+ __asm__ __volatile__("msub %0, %1" : : "r"(aim), "r"(bim)); \
-+ __asm__ __volatile__("mfhi %0; mflo %1" : "=r"(t1), "=r"(t2)); \
-+ tre = (t1 << 1) | ((uint32_t)t2 >> 31); \
-+ __asm__ __volatile__("mult %0, %1" : : "r"(are), "r"(bim)); \
-+ __asm__ __volatile__("madd %0, %1" : : "r"(bre), "r"(aim)); \
-+ dre = tre; \
-+ __asm__ __volatile__("mfhi %0; mflo %1" : "=r"(t1), "=r"(t2)); \
-+ dim = (t1 << 1) | ((uint32_t)t2 >> 31); \
-+ } while (0)
-
- #if __mips_isa_rev >= 2
--static inline uint32_t SWAB32(uint32_t x)
--{
-- __asm__(
-- " wsbh %0, %1 \n"
-- " rotr %0, %0, 16 \n"
-- : "=r" (x) : "r" (x));
-- return x;
-+static inline uint32_t SWAB32(uint32_t x) {
-+ __asm__(" wsbh %0, %1 \n"
-+ " rotr %0, %0, 16 \n"
-+ : "=r"(x)
-+ : "r"(x));
-+ return x;
- }
- #define SWAB32 SWAB32
- #endif
-diff --git a/src/lib/mult_noarch_gcc.h b/src/lib/mult_noarch_gcc.h
-index 516e66c..2ee207e 100644
---- a/src/lib/mult_noarch_gcc.h
-+++ b/src/lib/mult_noarch_gcc.h
-@@ -1,34 +1,40 @@
- #include <stdint.h>
-
- #ifndef mul
--#define mul(a,b) (int32_t) ( ( ((int64_t) a) * ((int64_t) b) ) >>32 )
-+#define mul(a, b) (int32_t)((((int64_t)a) * ((int64_t)b)) >> 32)
- #endif
-
- #ifndef muls
--#define muls(a,b) (int32_t) ( ( ((int64_t) a) * ((int64_t) b) ) >>31 )
-+#define muls(a, b) (int32_t)((((int64_t)a) * ((int64_t)b)) >> 31)
- #endif
-
- #ifndef mulr
--#define mulr(a,b) (int32_t) ( ( ( ((int64_t) a) * ((int64_t) b)) + 0x80000000LL ) >>32 )
-+#define mulr(a, b) \
-+ (int32_t)(((((int64_t)a) * ((int64_t)b)) + 0x80000000LL) >> 32)
- #endif
-
- #ifndef mulsr
--#define mulsr(a,b) (int32_t) ( ( ( ((int64_t) a) * ((int64_t) b)) + 0x40000000LL ) >>31 )
-+#define mulsr(a, b) \
-+ (int32_t)(((((int64_t)a) * ((int64_t)b)) + 0x40000000LL) >> 31)
- #endif
-
- #ifndef mul0
--#define mul0(hi,lo,a,b) ((hi) = mul((a), (b)))
--#define muladd(hi,lo,a,b) ((hi) += mul((a), (b)))
--#define mulsub(hi,lo,a,b) ((hi) -= mul((a), (b)))
--#define mulz(hi,lo)
-+#define mul0(hi, lo, a, b) ((hi) = mul((a), (b)))
-+#define muladd(hi, lo, a, b) ((hi) += mul((a), (b)))
-+#define mulsub(hi, lo, a, b) ((hi) -= mul((a), (b)))
-+#define mulz(hi, lo)
- #endif
-
- #ifndef cmuls
--#define cmuls(dre, dim, are, aim, bre, bim) \
--do { \
-- int32_t tre; \
-- (tre) = (int32_t) (((int64_t) (are) * (int64_t) (bre) - (int64_t) (aim) * (int64_t) (bim)) >> 31); \
-- (dim) = (int32_t) (((int64_t) (are) * (int64_t) (bim) + (int64_t) (aim) * (int64_t) (bre)) >> 31); \
-- (dre) = tre; \
--} while (0)
-+#define cmuls(dre, dim, are, aim, bre, bim) \
-+ do { \
-+ int32_t tre; \
-+ (tre) = (int32_t)(((int64_t)(are) * (int64_t)(bre) - \
-+ (int64_t)(aim) * (int64_t)(bim)) >> \
-+ 31); \
-+ (dim) = (int32_t)(((int64_t)(are) * (int64_t)(bim) + \
-+ (int64_t)(aim) * (int64_t)(bre)) >> \
-+ 31); \
-+ (dre) = tre; \
-+ } while (0)
- #endif
-diff --git a/src/lib/mult_sarm_gcc.h b/src/lib/mult_sarm_gcc.h
-index d229eff..0cf8e08 100644
---- a/src/lib/mult_sarm_gcc.h
-+++ b/src/lib/mult_sarm_gcc.h
-@@ -2,108 +2,102 @@
-
- /* Fractional multiply */
- #if __ARM_ARCH >= 6
--#define mul(x,y) \
--({ \
-- register int32_t result; \
-- asm ("smmul %0, %2, %1" : "=r" (result) : "r" (x), "r" (y)); \
-- result ;\
--})
-+#define mul(x, y) \
-+ ({ \
-+ register int32_t result; \
-+ asm("smmul %0, %2, %1" : "=r"(result) : "r"(x), "r"(y)); \
-+ result; \
-+ })
- #else
--#define mul(x,y) \
--({ \
-- register int32_t result; \
-- asm ("smull r3, %0, %2, %1" : "=r" (result) : "r" (x), "r" (y) : "r3"); \
-- result ; \
--})
-+#define mul(x, y) \
-+ ({ \
-+ register int32_t result; \
-+ asm("smull r3, %0, %2, %1" : "=r"(result) : "r"(x), "r"(y) : "r3"); \
-+ result; \
-+ })
- #endif
-
- /* Fractional multiply with single bit left shift. */
--#define muls(x,y) \
--({ \
-- register int32_t result; \
-- asm ( \
-- "smull r3, %0, %2, %1\n\t" \
-- "movs r3, r3, lsl #1\n\t" \
-- "adc %0, %0, %0" \
-- : "=r" (result) : "r" (x), "r" (y) : "r3", "cc" \
-- ); \
-- result; \
--})
--
-+#define muls(x, y) \
-+ ({ \
-+ register int32_t result; \
-+ asm("smull r3, %0, %2, %1\n\t" \
-+ "movs r3, r3, lsl #1\n\t" \
-+ "adc %0, %0, %0" \
-+ : "=r"(result) \
-+ : "r"(x), "r"(y) \
-+ : "r3", "cc"); \
-+ result; \
-+ })
-
- #if __ARM_ARCH >= 6
--#define mulr(x,y) \
--({ \
-- register int32_t result; \
-- asm ( \
-- "smmulr %0, %2, %1" : "=r" (result) : "r" (x), "r" (y) \
-- ); \
-- result; \
--})
-+#define mulr(x, y) \
-+ ({ \
-+ register int32_t result; \
-+ asm("smmulr %0, %2, %1" : "=r"(result) : "r"(x), "r"(y)); \
-+ result; \
-+ })
- #else
--#define mulr(x,y) \
--({ \
-- register int32_t result; \
-- asm ( \
-- "smull r3, %0, %2, %1\n\t" \
-- "adds r3, r3, #0x80000000\n\t" \
-- "adc %0, %0, #0" \
-- : "=r" (result) : "r" (x), "r" (y) : "r3", "cc" \
-- ); \
-- result; \
--})
-+#define mulr(x, y) \
-+ ({ \
-+ register int32_t result; \
-+ asm("smull r3, %0, %2, %1\n\t" \
-+ "adds r3, r3, #0x80000000\n\t" \
-+ "adc %0, %0, #0" \
-+ : "=r"(result) \
-+ : "r"(x), "r"(y) \
-+ : "r3", "cc"); \
-+ result; \
-+ })
- #endif
-
--#define mulsr(x,y) \
--({ \
-- register int32_t result; \
-- asm ( \
-- "smull r3, %0, %1, %2\n\t" \
-- "movs r3, r3, lsl #1\n\t" \
-- "adc %0, %0, %0\n\t" \
-- "adds r3, r3, #0x80000000\n\t" \
-- "adc %0, %0, #0" \
-- : "=r" (result) : "r" (x), "r" (y) : "r3", "cc" \
-- ); \
-- result; \
--})
-+#define mulsr(x, y) \
-+ ({ \
-+ register int32_t result; \
-+ asm("smull r3, %0, %1, %2\n\t" \
-+ "movs r3, r3, lsl #1\n\t" \
-+ "adc %0, %0, %0\n\t" \
-+ "adds r3, r3, #0x80000000\n\t" \
-+ "adc %0, %0, #0" \
-+ : "=r"(result) \
-+ : "r"(x), "r"(y) \
-+ : "r3", "cc"); \
-+ result; \
-+ })
-
--#define mul0(hi,lo,a,b) \
-- asm ("smull %0, %1, %2, %3" : "=r" (lo), "=r" (hi) : "r" (a), "r" (b))
-+#define mul0(hi, lo, a, b) \
-+ asm("smull %0, %1, %2, %3" : "=r"(lo), "=r"(hi) : "r"(a), "r"(b))
-
--#define muladd(hi,lo,a,b) \
-- asm ("smlal %0, %1, %2, %3" : "+r" (lo), "+r" (hi) : "r" (a), "r" (b))
-+#define muladd(hi, lo, a, b) \
-+ asm("smlal %0, %1, %2, %3" : "+r"(lo), "+r"(hi) : "r"(a), "r"(b))
-
--#define mulsub(hi,lo,a,b) \
-- asm ("smlal %0, %1, %2, %3" : "+r" (lo), "+r" (hi) : "r" (a), "r" (-(b)))
-+#define mulsub(hi, lo, a, b) \
-+ asm("smlal %0, %1, %2, %3" : "+r"(lo), "+r"(hi) : "r"(a), "r"(-(b)))
-
--#define mulz(hi,lo)
-+#define mulz(hi, lo)
-
--#define cmuls(dre, dim, are, aim, bre, bim) \
--do { \
-- register int32_t tre, tim; \
-- asm ( \
-- "smull r3, %0, %2, %4\n\t" \
-- "smlal r3, %0, %3, %5\n\t" \
-- "movs r3, r3, lsl #1\n\t" \
-- "adc %0, %0, %0\n\t" \
-- "smull r3, %1, %2, %6\n\t" \
-- "smlal r3, %1, %4, %3\n\t" \
-- "movs r3, r3, lsl #1\n\t" \
-- "adc %1, %1, %1\n\t" \
-- : "=&r" (tre), "=&r" (tim) \
-- : "r" (are), "r" (aim), "r" (bre), "r" (-(bim)), "r" (bim) \
-- : "r3", "cc" \
-- ); \
-- dre = tre; \
-- dim = tim; \
--} while (0)
-+#define cmuls(dre, dim, are, aim, bre, bim) \
-+ do { \
-+ register int32_t tre, tim; \
-+ asm("smull r3, %0, %2, %4\n\t" \
-+ "smlal r3, %0, %3, %5\n\t" \
-+ "movs r3, r3, lsl #1\n\t" \
-+ "adc %0, %0, %0\n\t" \
-+ "smull r3, %1, %2, %6\n\t" \
-+ "smlal r3, %1, %4, %3\n\t" \
-+ "movs r3, r3, lsl #1\n\t" \
-+ "adc %1, %1, %1\n\t" \
-+ : "=&r"(tre), "=&r"(tim) \
-+ : "r"(are), "r"(aim), "r"(bre), "r"(-(bim)), "r"(bim) \
-+ : "r3", "cc"); \
-+ dre = tre; \
-+ dim = tim; \
-+ } while (0)
-
- #if __ARM_ARCH >= 6
--static inline uint32_t SWAB32(uint32_t x)
--{
-- asm ("rev %0, %1" : "=r" (x) : "r" (x));
-- return x;
-+static inline uint32_t SWAB32(uint32_t x) {
-+ asm("rev %0, %1" : "=r"(x) : "r"(x));
-+ return x;
- }
- #define SWAB32 SWAB32
- #endif
-diff --git a/src/lib/reservoir.c b/src/lib/reservoir.c
-index ca84f3d..cea0a9b 100644
---- a/src/lib/reservoir.c
-+++ b/src/lib/reservoir.c
-@@ -2,13 +2,13 @@
- * Layer3 bit reservoir: Described in C.1.5.4.2.2 of the IS
- */
-
--#include "types.h"
--#include "layer3.h"
--#include "l3loop.h"
--#include "huffman.h"
-+#include "reservoir.h"
- #include "bitstream.h"
-+#include "huffman.h"
- #include "l3bitstream.h"
--#include "reservoir.h"
-+#include "l3loop.h"
-+#include "layer3.h"
-+#include "types.h"
-
- /*
- * shine_max_reservoir_bits:
-@@ -17,36 +17,34 @@
- * allowance for the current granule based on reservoir size
- * and perceptual entropy.
- */
--int shine_max_reservoir_bits (double *pe, shine_global_config *config )
--{
-+int shine_max_reservoir_bits(double *pe, shine_global_config *config) {
- int more_bits, max_bits, add_bits, over_bits;
- int mean_bits = config->mean_bits;
-
- mean_bits /= config->wave.channels;
- max_bits = mean_bits;
-
-- if(max_bits>4095)
-+ if (max_bits > 4095)
- max_bits = 4095;
-- if(!config->ResvMax)
-+ if (!config->ResvMax)
- return max_bits;
-
- more_bits = *pe * 3.1 - mean_bits;
- add_bits = 0;
-- if(more_bits>100)
-- {
-+ if (more_bits > 100) {
- int frac = (config->ResvSize * 6) / 10;
-
-- if(frac<more_bits)
-+ if (frac < more_bits)
- add_bits = frac;
- else
- add_bits = more_bits;
- }
-- over_bits = config->ResvSize - ((config->ResvMax <<3) / 10) - add_bits;
-- if (over_bits>0)
-+ over_bits = config->ResvSize - ((config->ResvMax << 3) / 10) - add_bits;
-+ if (over_bits > 0)
- add_bits += over_bits;
-
- max_bits += add_bits;
-- if(max_bits>4095)
-+ if (max_bits > 4095)
- max_bits = 4095;
- return max_bits;
- }
-@@ -57,9 +55,9 @@ int shine_max_reservoir_bits (double *pe, shine_global_config *config )
- * Called after a granule's bit allocation. Readjusts the size of
- * the reservoir to reflect the granule's usage.
- */
--void shine_ResvAdjust(gr_info *gi, shine_global_config *config )
--{
-- config->ResvSize += (config->mean_bits / config->wave.channels) - gi->part2_3_length;
-+void shine_ResvAdjust(gr_info *gi, shine_global_config *config) {
-+ config->ResvSize +=
-+ (config->mean_bits / config->wave.channels) - gi->part2_3_length;
- }
-
- /*
-@@ -71,8 +69,7 @@ void shine_ResvAdjust(gr_info *gi, shine_global_config *config )
- * part2_3_length. The bitstream formatter will detect this and write the
- * appropriate stuffing bits to the bitstream.
- */
--void shine_ResvFrameEnd(shine_global_config *config )
--{
-+void shine_ResvFrameEnd(shine_global_config *config) {
- gr_info *gi;
- int gr, ch, ancillary_pad, stuffingBits;
- int over_bits;
-@@ -81,42 +78,38 @@ void shine_ResvFrameEnd(shine_global_config *config )
- ancillary_pad = 0;
-
- /* just in case mean_bits is odd, this is necessary... */
-- if((config->wave.channels==2) && (config->mean_bits & 1))
-+ if ((config->wave.channels == 2) && (config->mean_bits & 1))
- config->ResvSize += 1;
-
- over_bits = config->ResvSize - config->ResvMax;
-- if(over_bits<0)
-+ if (over_bits < 0)
- over_bits = 0;
-
- config->ResvSize -= over_bits;
- stuffingBits = over_bits + ancillary_pad;
-
- /* we must be byte aligned */
-- if((over_bits = config->ResvSize % 8))
-- {
-+ if ((over_bits = config->ResvSize % 8)) {
- stuffingBits += over_bits;
- config->ResvSize -= over_bits;
- }
-
-- if(stuffingBits)
-- {
-+ if (stuffingBits) {
- /*
- * plan a: put all into the first granule
- * This was preferred by someone designing a
- * real-time decoder...
- */
-- gi = (gr_info *) &(l3_side->gr[0].ch[0]);
-+ gi = (gr_info *)&(l3_side->gr[0].ch[0]);
-
-- if ( gi->part2_3_length + stuffingBits < 4095 )
-+ if (gi->part2_3_length + stuffingBits < 4095)
- gi->part2_3_length += stuffingBits;
-- else
-- {
-+ else {
- /* plan b: distribute throughout the granules */
-- for (gr = 0; gr < config->mpeg.granules_per_frame; gr++ )
-- for (ch = 0; ch < config->wave.channels; ch++ )
-- {
-+ for (gr = 0; gr < config->mpeg.granules_per_frame; gr++)
-+ for (ch = 0; ch < config->wave.channels; ch++) {
- int extraBits, bitsThisGr;
-- gr_info *gi = (gr_info *) &(l3_side->gr[gr].ch[ch]);
-+ gr_info *gi = (gr_info *)&(l3_side->gr[gr].ch[ch]);
- if (!stuffingBits)
- break;
- extraBits = 4095 - gi->part2_3_length;
-@@ -133,5 +126,3 @@ void shine_ResvFrameEnd(shine_global_config *config )
- }
- }
- }
--
--
-diff --git a/src/lib/reservoir.h b/src/lib/reservoir.h
-index 2f1ffa5..2245778 100644
---- a/src/lib/reservoir.h
-+++ b/src/lib/reservoir.h
-@@ -1,9 +1,11 @@
- #ifndef RESERVOIR_H
- #define RESERVOIR_H
-
-+#include "types.h"
-+
- void shine_ResvFrameBegin(int frameLength, shine_global_config *config);
--int shine_max_reservoir_bits (double *pe, shine_global_config *config);
--void shine_ResvAdjust (gr_info *gi, shine_global_config *config );
--void shine_ResvFrameEnd (shine_global_config *config );
-+int shine_max_reservoir_bits(double *pe, shine_global_config *config);
-+void shine_ResvAdjust(gr_info *gi, shine_global_config *config);
-+void shine_ResvFrameEnd(shine_global_config *config);
-
- #endif
-diff --git a/src/lib/tables.c b/src/lib/tables.c
-index ff7e374..3c63b4f 100644
---- a/src/lib/tables.c
-+++ b/src/lib/tables.c
-@@ -7,120 +7,171 @@
-
- #include "tables.h"
-
--const int shine_slen1_tab[16] = { 0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 };
--const int shine_slen2_tab[16] = { 0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3 };
-+const int shine_slen1_tab[16] = {0, 0, 0, 0, 3, 1, 1, 1,
-+ 2, 2, 2, 3, 3, 3, 4, 4};
-+const int shine_slen2_tab[16] = {0, 1, 2, 3, 0, 1, 2, 3,
-+ 1, 2, 3, 1, 2, 3, 2, 3};
-
- /* Valid samplerates and bitrates. */
- const int samplerates[9] = {
-- 44100, 48000, 32000, /* MPEG-I */
-- 22050, 24000, 16000, /* MPEG-II */
-- 11025, 12000, 8000 /* MPEG-2.5 */
-+ 44100, 48000, 32000, /* MPEG-I */
-+ 22050, 24000, 16000, /* MPEG-II */
-+ 11025, 12000, 8000 /* MPEG-2.5 */
- };
-
- const int bitrates[16][4] = {
-- /* MPEG version:
-- * 2.5, reserved, II, I */
-- { -1, -1, -1, -1},
-- { 8, -1, 8, 32},
-- { 16, -1, 16, 40},
-- { 24, -1, 24, 48},
-- { 32, -1, 32, 56},
-- { 40, -1, 40, 64},
-- { 48, -1, 48, 80},
-- { 56, -1, 56, 96},
-- { 64, -1, 64, 112},
-- { -1, -1, 80, 128},
-- { -1, -1, 96, 160},
-- { -1, -1, 112, 192},
-- { -1, -1, 128, 224},
-- { -1, -1, 144, 256},
-- { -1, -1, 160, 320},
-- { -1, -1, -1, -1}
--};
-+ /* MPEG version:
-+ * 2.5, reserved, II, I */
-+ {-1, -1, -1, -1}, {8, -1, 8, 32}, {16, -1, 16, 40},
-+ {24, -1, 24, 48}, {32, -1, 32, 56}, {40, -1, 40, 64},
-+ {48, -1, 48, 80}, {56, -1, 56, 96}, {64, -1, 64, 112},
-+ {-1, -1, 80, 128}, {-1, -1, 96, 160}, {-1, -1, 112, 192},
-+ {-1, -1, 128, 224}, {-1, -1, 144, 256}, {-1, -1, 160, 320},
-+ {-1, -1, -1, -1}};
-
--const int shine_scale_fact_band_index[9][23] =
--{
-- /* MPEG-I */
-+const int shine_scale_fact_band_index[9][23] = {
-+ /* MPEG-I */
- /* Table B.8.b: 44.1 kHz */
-- {0,4,8,12,16,20,24,30,36,44,52,62,74,90,110,134,162,196,238,288,342,418,576},
-+ {0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62,
-+ 74, 90, 110, 134, 162, 196, 238, 288, 342, 418, 576},
- /* Table B.8.c: 48 kHz */
-- {0,4,8,12,16,20,24,30,36,42,50,60,72,88,106,128,156,190,230,276,330,384,576},
-+ {0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60,
-+ 72, 88, 106, 128, 156, 190, 230, 276, 330, 384, 576},
- /* Table B.8.a: 32 kHz */
-- {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576},
-- /* MPEG-II */
-+ {0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66,
-+ 82, 102, 126, 156, 194, 240, 296, 364, 448, 550, 576},
-+ /* MPEG-II */
- /* Table B.2.b: 22.05 kHz */
-- {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
-+ {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,
-+ 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576},
- /* Table B.2.c: 24 kHz */
-- {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576},
-+ {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,
-+ 114, 136, 162, 194, 232, 278, 330, 394, 464, 540, 576},
- /* Table B.2.a: 16 kHz */
-- {0,6,12,18,24,30,36,44,45,66,80,96,116,140,168,200,238,248,336,396,464,522,576},
-+ {0, 6, 12, 18, 24, 30, 36, 44, 45, 66, 80, 96,
-+ 116, 140, 168, 200, 238, 248, 336, 396, 464, 522, 576},
-
-- /* MPEG-2.5 */
-+ /* MPEG-2.5 */
- /* 11.025 kHz */
-- {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
-+ {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,
-+ 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576},
- /* 12 kHz */
-- {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
-+ {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,
-+ 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576},
- /* MPEG-2.5 8 kHz */
-- {0,12,24,36,48,60,72,88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576},
-+ {0, 12, 24, 36, 48, 60, 72, 88, 108, 132, 160, 192,
-+ 232, 280, 336, 400, 476, 566, 568, 570, 572, 574, 576},
- };
-
- /* note. 0.035781 is shine_enwindow maximum value */
- /* scale and convert to fixed point before storing */
--#define SHINE_EW(x) (int32_t)((double)(x) * 0x7fffffff)
--#define SHINE_EW2(a,b) SHINE_EW(a), SHINE_EW(b)
--#define SHINE_EW10(a,b,c,d,e,f,g,h,i,j) SHINE_EW2(a,b), SHINE_EW2(c,d), SHINE_EW2(e,f), SHINE_EW2(g,h), SHINE_EW2(i,j)
-+#define SHINE_EW(x) (int32_t)((double)(x)*0x7fffffff)
-+#define SHINE_EW2(a, b) SHINE_EW(a), SHINE_EW(b)
-+#define SHINE_EW10(a, b, c, d, e, f, g, h, i, j) \
-+ SHINE_EW2(a, b), SHINE_EW2(c, d), SHINE_EW2(e, f), SHINE_EW2(g, h), \
-+ SHINE_EW2(i, j)
-
- const int32_t shine_enwindow[] = {
--SHINE_EW10( 0.000000, -0.000000, -0.000000, -0.000000, -0.000000, -0.000000, -0.000000, -0.000001, -0.000001, -0.000001),
--SHINE_EW10( -0.000001, -0.000001, -0.000001, -0.000002, -0.000002, -0.000002, -0.000002, -0.000003, -0.000003, -0.000003),
--SHINE_EW10( -0.000004, -0.000004, -0.000005, -0.000005, -0.000006, -0.000007, -0.000008, -0.000008, -0.000009, -0.000010),
--SHINE_EW10( -0.000011, -0.000012, -0.000014, -0.000015, -0.000017, -0.000018, -0.000020, -0.000021, -0.000023, -0.000025),
--SHINE_EW10( -0.000028, -0.000030, -0.000032, -0.000035, -0.000038, -0.000041, -0.000043, -0.000046, -0.000050, -0.000053),
--SHINE_EW10( -0.000056, -0.000060, -0.000063, -0.000066, -0.000070, -0.000073, -0.000077, -0.000081, -0.000084, -0.000087),
--SHINE_EW10( -0.000091, -0.000093, -0.000096, -0.000099, 0.000102, 0.000104, 0.000106, 0.000107, 0.000108, 0.000109),
--SHINE_EW10( 0.000109, 0.000108, 0.000107, 0.000105, 0.000103, 0.000099, 0.000095, 0.000090, 0.000084, 0.000078),
--SHINE_EW10( 0.000070, 0.000061, 0.000051, 0.000040, 0.000027, 0.000014, -0.000001, -0.000017, -0.000034, -0.000053),
--SHINE_EW10( -0.000073, -0.000094, -0.000116, -0.000140, -0.000165, -0.000191, -0.000219, -0.000247, -0.000277, -0.000308),
--SHINE_EW10( -0.000339, -0.000371, -0.000404, -0.000438, -0.000473, -0.000507, -0.000542, -0.000577, -0.000612, -0.000647),
--SHINE_EW10( -0.000681, -0.000714, -0.000747, -0.000779, -0.000810, -0.000839, -0.000866, -0.000892, -0.000915, -0.000936),
--SHINE_EW10( -0.000954, -0.000969, -0.000981, -0.000989, -0.000994, -0.000995, -0.000992, -0.000984, 0.000971, 0.000954),
--SHINE_EW10( 0.000931, 0.000903, 0.000869, 0.000829, 0.000784, 0.000732, 0.000674, 0.000610, 0.000539, 0.000463),
--SHINE_EW10( 0.000379, 0.000288, 0.000192, 0.000088, -0.000021, -0.000137, -0.000260, -0.000388, -0.000522, -0.000662),
--SHINE_EW10( -0.000807, -0.000957, -0.001111, -0.001270, -0.001432, -0.001598, -0.001767, -0.001937, -0.002110, -0.002283),
--SHINE_EW10( -0.002457, -0.002631, -0.002803, -0.002974, -0.003142, -0.003307, -0.003467, -0.003623, -0.003772, -0.003914),
--SHINE_EW10( -0.004049, -0.004175, -0.004291, -0.004396, -0.004490, -0.004570, -0.004638, -0.004691, -0.004728, -0.004749),
--SHINE_EW10( -0.004752, -0.004737, -0.004703, -0.004649, -0.004574, -0.004477, -0.004358, -0.004215, -0.004049, -0.003859),
--SHINE_EW10( -0.003643, -0.003402, 0.003135, 0.002841, 0.002522, 0.002175, 0.001801, 0.001400, 0.000971, 0.000516),
--SHINE_EW10( 0.000033, -0.000476, -0.001012, -0.001574, -0.002162, -0.002774, -0.003411, -0.004072, -0.004756, -0.005462),
--SHINE_EW10( -0.006189, -0.006937, -0.007703, -0.008487, -0.009288, -0.010104, -0.010933, -0.011775, -0.012628, -0.013489),
--SHINE_EW10( -0.014359, -0.015234, -0.016113, -0.016994, -0.017876, -0.018757, -0.019634, -0.020507, -0.021372, -0.022229),
--SHINE_EW10( -0.023074, -0.023907, -0.024725, -0.025527, -0.026311, -0.027074, -0.027815, -0.028533, -0.029225, -0.029890),
--SHINE_EW10( -0.030527, -0.031133, -0.031707, -0.032248, -0.032755, -0.033226, -0.033660, -0.034056, -0.034413, -0.034730),
--SHINE_EW10( -0.035007, -0.035242, -0.035435, -0.035586, -0.035694, -0.035759, 0.035781, 0.035759, 0.035694, 0.035586),
--SHINE_EW10( 0.035435, 0.035242, 0.035007, 0.034730, 0.034413, 0.034056, 0.033660, 0.033226, 0.032755, 0.032248),
--SHINE_EW10( 0.031707, 0.031133, 0.030527, 0.029890, 0.029225, 0.028533, 0.027815, 0.027074, 0.026311, 0.025527),
--SHINE_EW10( 0.024725, 0.023907, 0.023074, 0.022229, 0.021372, 0.020507, 0.019634, 0.018757, 0.017876, 0.016994),
--SHINE_EW10( 0.016113, 0.015234, 0.014359, 0.013489, 0.012628, 0.011775, 0.010933, 0.010104, 0.009288, 0.008487),
--SHINE_EW10( 0.007703, 0.006937, 0.006189, 0.005462, 0.004756, 0.004072, 0.003411, 0.002774, 0.002162, 0.001574),
--SHINE_EW10( 0.001012, 0.000476, -0.000033, -0.000516, -0.000971, -0.001400, -0.001801, -0.002175, -0.002522, -0.002841),
--SHINE_EW10( 0.003135, 0.003402, 0.003643, 0.003859, 0.004049, 0.004215, 0.004358, 0.004477, 0.004574, 0.004649),
--SHINE_EW10( 0.004703, 0.004737, 0.004752, 0.004749, 0.004728, 0.004691, 0.004638, 0.004570, 0.004490, 0.004396),
--SHINE_EW10( 0.004291, 0.004175, 0.004049, 0.003914, 0.003772, 0.003623, 0.003467, 0.003307, 0.003142, 0.002974),
--SHINE_EW10( 0.002803, 0.002631, 0.002457, 0.002283, 0.002110, 0.001937, 0.001767, 0.001598, 0.001432, 0.001270),
--SHINE_EW10( 0.001111, 0.000957, 0.000807, 0.000662, 0.000522, 0.000388, 0.000260, 0.000137, 0.000021, -0.000088),
--SHINE_EW10( -0.000192, -0.000288, -0.000379, -0.000463, -0.000539, -0.000610, -0.000674, -0.000732, -0.000784, -0.000829),
--SHINE_EW10( -0.000869, -0.000903, -0.000931, -0.000954, 0.000971, 0.000984, 0.000992, 0.000995, 0.000994, 0.000989),
--SHINE_EW10( 0.000981, 0.000969, 0.000954, 0.000936, 0.000915, 0.000892, 0.000866, 0.000839, 0.000810, 0.000779),
--SHINE_EW10( 0.000747, 0.000714, 0.000681, 0.000647, 0.000612, 0.000577, 0.000542, 0.000507, 0.000473, 0.000438),
--SHINE_EW10( 0.000404, 0.000371, 0.000339, 0.000308, 0.000277, 0.000247, 0.000219, 0.000191, 0.000165, 0.000140),
--SHINE_EW10( 0.000116, 0.000094, 0.000073, 0.000053, 0.000034, 0.000017, 0.000001, -0.000014, -0.000027, -0.000040),
--SHINE_EW10( -0.000051, -0.000061, -0.000070, -0.000078, -0.000084, -0.000090, -0.000095, -0.000099, -0.000103, -0.000105),
--SHINE_EW10( -0.000107, -0.000108, -0.000109, -0.000109, -0.000108, -0.000107, -0.000106, -0.000104, 0.000102, 0.000099),
--SHINE_EW10( 0.000096, 0.000093, 0.000091, 0.000087, 0.000084, 0.000081, 0.000077, 0.000073, 0.000070, 0.000066),
--SHINE_EW10( 0.000063, 0.000060, 0.000056, 0.000053, 0.000050, 0.000046, 0.000043, 0.000041, 0.000038, 0.000035),
--SHINE_EW10( 0.000032, 0.000030, 0.000028, 0.000025, 0.000023, 0.000021, 0.000020, 0.000018, 0.000017, 0.000015),
--SHINE_EW10( 0.000014, 0.000012, 0.000011, 0.000010, 0.000009, 0.000008, 0.000008, 0.000007, 0.000006, 0.000005),
--SHINE_EW10( 0.000005, 0.000004, 0.000004, 0.000003, 0.000003, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002),
--SHINE_EW10( 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000000, 0.000000, 0.000000, 0.000000),
--SHINE_EW2 ( 0.000000, 0.000000)
--};
-+ SHINE_EW10(0.000000, -0.000000, -0.000000, -0.000000, -0.000000, -0.000000,
-+ -0.000000, -0.000001, -0.000001, -0.000001),
-+ SHINE_EW10(-0.000001, -0.000001, -0.000001, -0.000002, -0.000002, -0.000002,
-+ -0.000002, -0.000003, -0.000003, -0.000003),
-+ SHINE_EW10(-0.000004, -0.000004, -0.000005, -0.000005, -0.000006, -0.000007,
-+ -0.000008, -0.000008, -0.000009, -0.000010),
-+ SHINE_EW10(-0.000011, -0.000012, -0.000014, -0.000015, -0.000017, -0.000018,
-+ -0.000020, -0.000021, -0.000023, -0.000025),
-+ SHINE_EW10(-0.000028, -0.000030, -0.000032, -0.000035, -0.000038, -0.000041,
-+ -0.000043, -0.000046, -0.000050, -0.000053),
-+ SHINE_EW10(-0.000056, -0.000060, -0.000063, -0.000066, -0.000070, -0.000073,
-+ -0.000077, -0.000081, -0.000084, -0.000087),
-+ SHINE_EW10(-0.000091, -0.000093, -0.000096, -0.000099, 0.000102, 0.000104,
-+ 0.000106, 0.000107, 0.000108, 0.000109),
-+ SHINE_EW10(0.000109, 0.000108, 0.000107, 0.000105, 0.000103, 0.000099,
-+ 0.000095, 0.000090, 0.000084, 0.000078),
-+ SHINE_EW10(0.000070, 0.000061, 0.000051, 0.000040, 0.000027, 0.000014,
-+ -0.000001, -0.000017, -0.000034, -0.000053),
-+ SHINE_EW10(-0.000073, -0.000094, -0.000116, -0.000140, -0.000165, -0.000191,
-+ -0.000219, -0.000247, -0.000277, -0.000308),
-+ SHINE_EW10(-0.000339, -0.000371, -0.000404, -0.000438, -0.000473, -0.000507,
-+ -0.000542, -0.000577, -0.000612, -0.000647),
-+ SHINE_EW10(-0.000681, -0.000714, -0.000747, -0.000779, -0.000810, -0.000839,
-+ -0.000866, -0.000892, -0.000915, -0.000936),
-+ SHINE_EW10(-0.000954, -0.000969, -0.000981, -0.000989, -0.000994, -0.000995,
-+ -0.000992, -0.000984, 0.000971, 0.000954),
-+ SHINE_EW10(0.000931, 0.000903, 0.000869, 0.000829, 0.000784, 0.000732,
-+ 0.000674, 0.000610, 0.000539, 0.000463),
-+ SHINE_EW10(0.000379, 0.000288, 0.000192, 0.000088, -0.000021, -0.000137,
-+ -0.000260, -0.000388, -0.000522, -0.000662),
-+ SHINE_EW10(-0.000807, -0.000957, -0.001111, -0.001270, -0.001432, -0.001598,
-+ -0.001767, -0.001937, -0.002110, -0.002283),
-+ SHINE_EW10(-0.002457, -0.002631, -0.002803, -0.002974, -0.003142, -0.003307,
-+ -0.003467, -0.003623, -0.003772, -0.003914),
-+ SHINE_EW10(-0.004049, -0.004175, -0.004291, -0.004396, -0.004490, -0.004570,
-+ -0.004638, -0.004691, -0.004728, -0.004749),
-+ SHINE_EW10(-0.004752, -0.004737, -0.004703, -0.004649, -0.004574, -0.004477,
-+ -0.004358, -0.004215, -0.004049, -0.003859),
-+ SHINE_EW10(-0.003643, -0.003402, 0.003135, 0.002841, 0.002522, 0.002175,
-+ 0.001801, 0.001400, 0.000971, 0.000516),
-+ SHINE_EW10(0.000033, -0.000476, -0.001012, -0.001574, -0.002162, -0.002774,
-+ -0.003411, -0.004072, -0.004756, -0.005462),
-+ SHINE_EW10(-0.006189, -0.006937, -0.007703, -0.008487, -0.009288, -0.010104,
-+ -0.010933, -0.011775, -0.012628, -0.013489),
-+ SHINE_EW10(-0.014359, -0.015234, -0.016113, -0.016994, -0.017876, -0.018757,
-+ -0.019634, -0.020507, -0.021372, -0.022229),
-+ SHINE_EW10(-0.023074, -0.023907, -0.024725, -0.025527, -0.026311, -0.027074,
-+ -0.027815, -0.028533, -0.029225, -0.029890),
-+ SHINE_EW10(-0.030527, -0.031133, -0.031707, -0.032248, -0.032755, -0.033226,
-+ -0.033660, -0.034056, -0.034413, -0.034730),
-+ SHINE_EW10(-0.035007, -0.035242, -0.035435, -0.035586, -0.035694, -0.035759,
-+ 0.035781, 0.035759, 0.035694, 0.035586),
-+ SHINE_EW10(0.035435, 0.035242, 0.035007, 0.034730, 0.034413, 0.034056,
-+ 0.033660, 0.033226, 0.032755, 0.032248),
-+ SHINE_EW10(0.031707, 0.031133, 0.030527, 0.029890, 0.029225, 0.028533,
-+ 0.027815, 0.027074, 0.026311, 0.025527),
-+ SHINE_EW10(0.024725, 0.023907, 0.023074, 0.022229, 0.021372, 0.020507,
-+ 0.019634, 0.018757, 0.017876, 0.016994),
-+ SHINE_EW10(0.016113, 0.015234, 0.014359, 0.013489, 0.012628, 0.011775,
-+ 0.010933, 0.010104, 0.009288, 0.008487),
-+ SHINE_EW10(0.007703, 0.006937, 0.006189, 0.005462, 0.004756, 0.004072,
-+ 0.003411, 0.002774, 0.002162, 0.001574),
-+ SHINE_EW10(0.001012, 0.000476, -0.000033, -0.000516, -0.000971, -0.001400,
-+ -0.001801, -0.002175, -0.002522, -0.002841),
-+ SHINE_EW10(0.003135, 0.003402, 0.003643, 0.003859, 0.004049, 0.004215,
-+ 0.004358, 0.004477, 0.004574, 0.004649),
-+ SHINE_EW10(0.004703, 0.004737, 0.004752, 0.004749, 0.004728, 0.004691,
-+ 0.004638, 0.004570, 0.004490, 0.004396),
-+ SHINE_EW10(0.004291, 0.004175, 0.004049, 0.003914, 0.003772, 0.003623,
-+ 0.003467, 0.003307, 0.003142, 0.002974),
-+ SHINE_EW10(0.002803, 0.002631, 0.002457, 0.002283, 0.002110, 0.001937,
-+ 0.001767, 0.001598, 0.001432, 0.001270),
-+ SHINE_EW10(0.001111, 0.000957, 0.000807, 0.000662, 0.000522, 0.000388,
-+ 0.000260, 0.000137, 0.000021, -0.000088),
-+ SHINE_EW10(-0.000192, -0.000288, -0.000379, -0.000463, -0.000539, -0.000610,
-+ -0.000674, -0.000732, -0.000784, -0.000829),
-+ SHINE_EW10(-0.000869, -0.000903, -0.000931, -0.000954, 0.000971, 0.000984,
-+ 0.000992, 0.000995, 0.000994, 0.000989),
-+ SHINE_EW10(0.000981, 0.000969, 0.000954, 0.000936, 0.000915, 0.000892,
-+ 0.000866, 0.000839, 0.000810, 0.000779),
-+ SHINE_EW10(0.000747, 0.000714, 0.000681, 0.000647, 0.000612, 0.000577,
-+ 0.000542, 0.000507, 0.000473, 0.000438),
-+ SHINE_EW10(0.000404, 0.000371, 0.000339, 0.000308, 0.000277, 0.000247,
-+ 0.000219, 0.000191, 0.000165, 0.000140),
-+ SHINE_EW10(0.000116, 0.000094, 0.000073, 0.000053, 0.000034, 0.000017,
-+ 0.000001, -0.000014, -0.000027, -0.000040),
-+ SHINE_EW10(-0.000051, -0.000061, -0.000070, -0.000078, -0.000084, -0.000090,
-+ -0.000095, -0.000099, -0.000103, -0.000105),
-+ SHINE_EW10(-0.000107, -0.000108, -0.000109, -0.000109, -0.000108, -0.000107,
-+ -0.000106, -0.000104, 0.000102, 0.000099),
-+ SHINE_EW10(0.000096, 0.000093, 0.000091, 0.000087, 0.000084, 0.000081,
-+ 0.000077, 0.000073, 0.000070, 0.000066),
-+ SHINE_EW10(0.000063, 0.000060, 0.000056, 0.000053, 0.000050, 0.000046,
-+ 0.000043, 0.000041, 0.000038, 0.000035),
-+ SHINE_EW10(0.000032, 0.000030, 0.000028, 0.000025, 0.000023, 0.000021,
-+ 0.000020, 0.000018, 0.000017, 0.000015),
-+ SHINE_EW10(0.000014, 0.000012, 0.000011, 0.000010, 0.000009, 0.000008,
-+ 0.000008, 0.000007, 0.000006, 0.000005),
-+ SHINE_EW10(0.000005, 0.000004, 0.000004, 0.000003, 0.000003, 0.000003,
-+ 0.000002, 0.000002, 0.000002, 0.000002),
-+ SHINE_EW10(0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001,
-+ 0.000000, 0.000000, 0.000000, 0.000000),
-+ SHINE_EW2(0.000000, 0.000000)};
-diff --git a/src/lib/tables.h b/src/lib/tables.h
-index 5c94228..fe06502 100644
---- a/src/lib/tables.h
-+++ b/src/lib/tables.h
-@@ -9,8 +9,7 @@ extern const int shine_slen2_tab[16];
- extern const int samplerates[9];
- extern const int bitrates[16][4];
-
--extern const int shine_scale_fact_band_index[9][23];
-+extern const int shine_scale_fact_band_index[9][23];
- extern const int32_t shine_enwindow[];
-
- #endif
--
-diff --git a/src/lib/types.h b/src/lib/types.h
-index f3def1a..11a05fc 100644
---- a/src/lib/types.h
-+++ b/src/lib/types.h
-@@ -2,18 +2,18 @@
- #define PRIV_TYPES_H
-
- #include <stdio.h>
--#include <string.h>
- #include <stdlib.h>
-+#include <string.h>
-
- #include <math.h>
-
--#define GRANULE_SIZE 576
-+#define GRANULE_SIZE 576
-
- #include "bitstream.h"
-
- /* Include arch-specific instructions,
- * when defined. */
--#if defined(__mips__) && (__mips != 64)
-+#if defined(__mips__) && (__mips == 32)
- #include "mult_mips_gcc.h"
- #elif defined(__arm__) && !defined(__thumb__)
- #include "mult_sarm_gcc.h"
-@@ -24,29 +24,32 @@
- #include "mult_noarch_gcc.h"
-
- #ifndef SWAB32
--#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
--#define SWAB32(x) __builtin_bswap32(x)
-+#if defined(__GNUC__) && \
-+ (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
-+#define SWAB32(x) __builtin_bswap32(x)
- #else
--#define SWAB32(x) (((unsigned int)(x) >> 24) | (((unsigned int)(x) >> 8) & 0xff00) | (((unsigned int)(x) & 0xff00) << 8) | ((unsigned int)(x) << 24))
-+#define SWAB32(x) \
-+ (((unsigned int)(x) >> 24) | (((unsigned int)(x) >> 8) & 0xff00) | \
-+ (((unsigned int)(x)&0xff00) << 8) | ((unsigned int)(x) << 24))
- #endif
- #endif
-
- /* #define DEBUG if you want the library to dump info to stdout */
-
--#define PI 3.14159265358979
--#define PI4 0.78539816339745
--#define PI12 0.26179938779915
--#define PI36 0.087266462599717
--#define PI64 0.049087385212
--#define SQRT2 1.41421356237
--#define LN2 0.69314718
-+#define PI 3.14159265358979
-+#define PI4 0.78539816339745
-+#define PI12 0.26179938779915
-+#define PI36 0.087266462599717
-+#define PI64 0.049087385212
-+#define SQRT2 1.41421356237
-+#define LN2 0.69314718
- #define LN_TO_LOG10 0.2302585093
--#define BLKSIZE 1024
--#define HAN_SIZE 512 /* for loop unrolling, require that HAN_SIZE%8==0 */
-+#define BLKSIZE 1024
-+#define HAN_SIZE 512 /* for loop unrolling, require that HAN_SIZE%8==0 */
- #define SCALE_BLOCK 12
- #define SCALE_RANGE 64
--#define SCALE 32768
--#define SBLIMIT 32
-+#define SCALE 32768
-+#define SBLIMIT 32
-
- #ifndef MAX_CHANNELS
- #define MAX_CHANNELS 2
-@@ -57,44 +60,44 @@
- #endif
-
- typedef struct {
-- int channels;
-- int samplerate;
-+ int channels;
-+ int samplerate;
- } priv_shine_wave_t;
-
- typedef struct {
-- int version;
-- int layer;
-- int granules_per_frame;
-- int mode; /* + */ /* Stereo mode */
-- int bitr; /* + */ /* Must conform to known bitrate - see Main.c */
-- int emph; /* + */ /* De-emphasis */
-- int padding;
-- int bits_per_frame;
-- int bits_per_slot;
-- double frac_slots_per_frame;
-- double slot_lag;
-- int whole_slots_per_frame;
-- int bitrate_index; /* + */ /* See Main.c and Layer3.c */
-- int samplerate_index; /* + */ /* See Main.c and Layer3.c */
-- int crc;
-- int ext;
-- int mode_ext;
-- int copyright; /* + */
-- int original; /* + */
-+ int version;
-+ int layer;
-+ int granules_per_frame;
-+ int mode; /* + */ /* Stereo mode */
-+ int bitr; /* + */ /* Must conform to known bitrate - see Main.c */
-+ int emph; /* + */ /* De-emphasis */
-+ int padding;
-+ int bits_per_frame;
-+ int bits_per_slot;
-+ double frac_slots_per_frame;
-+ double slot_lag;
-+ int whole_slots_per_frame;
-+ int bitrate_index; /* + */ /* See Main.c and Layer3.c */
-+ int samplerate_index; /* + */ /* See Main.c and Layer3.c */
-+ int crc;
-+ int ext;
-+ int mode_ext;
-+ int copyright; /* + */
-+ int original; /* + */
- } priv_shine_mpeg_t;
-
- typedef struct {
-- int32_t *xr; /* magnitudes of the spectral values */
-- int32_t xrsq[GRANULE_SIZE]; /* xr squared */
-- int32_t xrabs[GRANULE_SIZE]; /* xr absolute */
-- int32_t xrmax; /* maximum of xrabs array */
-- int32_t en_tot[MAX_GRANULES]; /* gr */
-+ int32_t *xr; /* magnitudes of the spectral values */
-+ int32_t xrsq[GRANULE_SIZE]; /* xr squared */
-+ int32_t xrabs[GRANULE_SIZE]; /* xr absolute */
-+ int32_t xrmax; /* maximum of xrabs array */
-+ int32_t en_tot[MAX_GRANULES]; /* gr */
- int32_t en[MAX_GRANULES][21];
- int32_t xm[MAX_GRANULES][21];
- int32_t xrmaxl[MAX_GRANULES];
-- double steptab[128]; /* 2**(-x/4) for x = -127..0 */
-- int32_t steptabi[128]; /* 2**(-x/4) for x = -127..0 */
-- int int2idx[10000]; /* x**(3/4) for x = 0..9999 */
-+ double steptab[128]; /* 2**(-x/4) for x = -127..0 */
-+ int32_t steptabi[128]; /* 2**(-x/4) for x = -127..0 */
-+ int int2idx[10000]; /* x**(3/4) for x = 0..9999 */
- } l3loop_t;
-
- typedef struct {
-@@ -105,7 +108,7 @@ typedef struct {
- int off[MAX_CHANNELS];
- int32_t fl[SBLIMIT][64];
- int32_t x[MAX_CHANNELS][HAN_SIZE];
--} subband_t;
-+} subband_t;
-
- /* Side information */
- typedef struct {
-@@ -130,49 +133,48 @@ typedef struct {
- } gr_info;
-
- typedef struct {
-- unsigned private_bits;
-- int resvDrain;
-- unsigned scfsi[MAX_CHANNELS][4];
-+ unsigned private_bits;
-+ int resvDrain;
-+ unsigned scfsi[MAX_CHANNELS][4];
-+ struct {
- struct {
-- struct {
-- gr_info tt;
-- } ch[MAX_CHANNELS];
-- } gr[MAX_GRANULES];
-+ gr_info tt;
-+ } ch[MAX_CHANNELS];
-+ } gr[MAX_GRANULES];
- } shine_side_info_t;
-
- typedef struct {
-- double l[MAX_GRANULES][MAX_CHANNELS][21];
-+ double l[MAX_GRANULES][MAX_CHANNELS][21];
- } shine_psy_ratio_t;
-
- typedef struct {
-- double l[MAX_GRANULES][MAX_CHANNELS][21];
-+ double l[MAX_GRANULES][MAX_CHANNELS][21];
- } shine_psy_xmin_t;
-
- typedef struct {
-- int32_t l[MAX_GRANULES][MAX_CHANNELS][22]; /* [cb] */
-- int32_t s[MAX_GRANULES][MAX_CHANNELS][13][3]; /* [window][cb] */
-+ int32_t l[MAX_GRANULES][MAX_CHANNELS][22]; /* [cb] */
-+ int32_t s[MAX_GRANULES][MAX_CHANNELS][13][3]; /* [window][cb] */
- } shine_scalefac_t;
-
--
--typedef struct shine_global_flags {
-- priv_shine_wave_t wave;
-- priv_shine_mpeg_t mpeg;
-- bitstream_t bs;
-+typedef struct shine_global_flags {
-+ priv_shine_wave_t wave;
-+ priv_shine_mpeg_t mpeg;
-+ bitstream_t bs;
- shine_side_info_t side_info;
-- int sideinfo_len;
-- int mean_bits;
-+ int sideinfo_len;
-+ int mean_bits;
- shine_psy_ratio_t ratio;
-- shine_scalefac_t scalefactor;
-- int16_t *buffer[MAX_CHANNELS];
-- double pe[MAX_CHANNELS][MAX_GRANULES];
-- int l3_enc[MAX_CHANNELS][MAX_GRANULES][GRANULE_SIZE];
-- int32_t l3_sb_sample[MAX_CHANNELS][MAX_GRANULES+1][18][SBLIMIT];
-- int32_t mdct_freq[MAX_CHANNELS][MAX_GRANULES][GRANULE_SIZE];
-- int ResvSize;
-- int ResvMax;
-- l3loop_t l3loop;
-- mdct_t mdct;
-- subband_t subband;
-+ shine_scalefac_t scalefactor;
-+ int16_t *buffer[MAX_CHANNELS];
-+ double pe[MAX_CHANNELS][MAX_GRANULES];
-+ int l3_enc[MAX_CHANNELS][MAX_GRANULES][GRANULE_SIZE];
-+ int32_t l3_sb_sample[MAX_CHANNELS][MAX_GRANULES + 1][18][SBLIMIT];
-+ int32_t mdct_freq[MAX_CHANNELS][MAX_GRANULES][GRANULE_SIZE];
-+ int ResvSize;
-+ int ResvMax;
-+ l3loop_t l3loop;
-+ mdct_t mdct;
-+ subband_t subband;
- } shine_global_config;
-
- #endif
diff --git a/multimedia/shine/shine.SlackBuild b/multimedia/shine/shine.SlackBuild
index 81d701d8f3..14cac1b0cb 100644
--- a/multimedia/shine/shine.SlackBuild
+++ b/multimedia/shine/shine.SlackBuild
@@ -25,10 +25,12 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=shine
-VERSION=${VERSION:-3.1.1}
+VERSION=${VERSION:-ab5e352_20230101}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
+COMMIT=${COMMIT:-ab5e3526b64af1a2eaa43aa6f441a7312e013519}
+COMMITDATE=${COMMITDATE:-20230101}
if [ -z "$ARCH" ]; then
case "$( uname -m )" in
@@ -67,9 +69,9 @@ trap 'echo "$0 FAILED at line $LINENO!" | tee -a $OUTPUT/error-${PRGNAM}.log' ER
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
-rm -rf $PRGNAM-$VERSION
-tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
-cd $PRGNAM-$VERSION
+rm -rf $PRGNAM-$COMMIT
+tar xvf $CWD/$PRGNAM-$COMMIT.tar.gz
+cd $PRGNAM-$COMMIT
chown -R root:root .
find -L . \
@@ -78,8 +80,6 @@ find -L . \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
-patch -p1 --verbose --unified < $CWD/fix-bugs.patch
-
./bootstrap
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
@@ -90,6 +90,8 @@ CXXFLAGS="$SLKCFLAGS" \
--localstatedir=/var \
--mandir=/usr/man \
--docdir=/usr/doc/$PRGNAM-$VERSION \
+ --enable-shared \
+ --disable-static \
--build=$ARCH-slackware-linux
make
diff --git a/multimedia/shine/shine.info b/multimedia/shine/shine.info
index 401505a283..32ae886033 100644
--- a/multimedia/shine/shine.info
+++ b/multimedia/shine/shine.info
@@ -1,8 +1,8 @@
PRGNAM="shine"
-VERSION="3.1.1"
+VERSION="ab5e352_20230101"
HOMEPAGE="https://github.com/toots/shine"
-DOWNLOAD="https://github.com/toots/shine/archive/3.1.1/shine-3.1.1.tar.gz"
-MD5SUM="ff41cb139c25470f2d9c9acc9f97cc8d"
+DOWNLOAD="https://github.com/toots/shine/archive/ab5e352/shine-ab5e3526b64af1a2eaa43aa6f441a7312e013519.tar.gz"
+MD5SUM="1f8ac33d4819acf526b5de4a9a5c1bec"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
diff --git a/multimedia/transcode/transcode-1.1.7-ffmpeg-0.10.patch b/multimedia/transcode/transcode-1.1.7-ffmpeg-0.10.patch
deleted file mode 100644
index ea737c8b09..0000000000
--- a/multimedia/transcode/transcode-1.1.7-ffmpeg-0.10.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-http://bugs.gentoo.org/401287
-
---- filter/filter_pp.c
-+++ filter/filter_pp.c
-@@ -38,8 +38,8 @@
-
- /* FIXME: these use the filter ID as an index--the ID can grow
- * arbitrarily large, so this needs to be fixed */
--static pp_mode_t *mode[100];
--static pp_context_t *context[100];
-+static pp_mode *mode[100];
-+static pp_context *context[100];
- static int width[100], height[100];
- static int pre[100];
-
diff --git a/multimedia/transcode/transcode-1.1.7-ffmpeg-0.11.patch b/multimedia/transcode/transcode-1.1.7-ffmpeg-0.11.patch
deleted file mode 100644
index 871d073fea..0000000000
--- a/multimedia/transcode/transcode-1.1.7-ffmpeg-0.11.patch
+++ /dev/null
@@ -1,303 +0,0 @@
-Fix build with ffmpeg 0.11.
-https://bugs.gentoo.org/show_bug.cgi?id=419551
-Author: Brennan Shacklett
-
-diff -urN transcode-1.1.7-orig/encode/encode_lavc.c transcode-1.1.7/encode/encode_lavc.c
---- transcode-1.1.7-orig/encode/encode_lavc.c 2011-11-19 08:50:27.000000000 -0800
-+++ transcode-1.1.7/encode/encode_lavc.c 2012-07-03 10:47:03.528009149 -0700
-@@ -114,6 +114,7 @@
-
- AVFrame ff_venc_frame;
- AVCodecContext ff_vcontext;
-+ AVDictionary ** ff_opts;
-
- AVCodec *ff_vcodec;
-
-@@ -1036,14 +1037,10 @@
- SET_FLAG(pd, mv0);
- SET_FLAG(pd, cbp);
- SET_FLAG(pd, qpel);
-- SET_FLAG(pd, alt);
-- SET_FLAG(pd, vdpart);
- SET_FLAG(pd, naq);
- SET_FLAG(pd, ilme);
- SET_FLAG(pd, ildct);
- SET_FLAG(pd, aic);
-- SET_FLAG(pd, aiv);
-- SET_FLAG(pd, umv);
- SET_FLAG(pd, psnr);
- SET_FLAG(pd, trell);
- SET_FLAG(pd, gray);
-@@ -1064,6 +1061,18 @@
- pd->ff_vcontext.flags |= CODEC_FLAG_INTERLACED_DCT;
- pd->ff_vcontext.flags |= CODEC_FLAG_INTERLACED_ME;
- }
-+ if (pd->confdata.flags.alt) {
-+ av_dict_set(pd->ff_opts, "alternate_scan", "1", 0);
-+ }
-+ if (pd->confdata.flags.vdpart) {
-+ av_dict_set(pd->ff_opts, "data_partitioning", "1", 0);
-+ }
-+ if (pd->confdata.flags.umv) {
-+ av_dict_set(pd->ff_opts, "umv", "1", 0);
-+ }
-+ if (pd->confdata.flags.aiv) {
-+ av_dict_set(pd->ff_opts, "aiv", "1", 0);
-+ }
- }
-
- #undef SET_FLAG
-@@ -1184,18 +1193,18 @@
- { "mv0", PAUX(flags.mv0), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_MV0 },
- { "cbp", PAUX(flags.cbp), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_CBP_RD },
- { "qpel", PAUX(flags.qpel), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_QPEL },
-- { "alt", PAUX(flags.alt), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_ALT_SCAN },
-+ { "alt", PAUX(flags.alt), TCCONF_TYPE_FLAG, 0, 0, 1 },
- { "ilme", PAUX(flags.ilme), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_INTERLACED_ME },
- { "ildct", PAUX(flags.ildct), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_INTERLACED_DCT },
- { "naq", PAUX(flags.naq), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_NORMALIZE_AQP },
-- { "vdpart", PAUX(flags.vdpart), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_PART },
-+ { "vdpart", PAUX(flags.vdpart), TCCONF_TYPE_FLAG, 0, 0, 1 },
- #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
- { "aic", PAUX(flags.aic), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_H263P_AIC },
- #else
- { "aic", PAUX(flags.aic), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_AC_PRED },
- #endif
-- { "aiv", PAUX(flags.aiv), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_H263P_AIV },
-- { "umv", PAUX(flags.umv), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_H263P_UMV },
-+ { "aiv", PAUX(flags.aiv), TCCONF_TYPE_FLAG, 0, 0, 1 },
-+ { "umv", PAUX(flags.umv), TCCONF_TYPE_FLAG, 0, 0, 1 },
- { "psnr", PAUX(flags.psnr), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_PSNR },
- #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
- { "trell", PAUX(flags.trell), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_TRELLIS_QUANT },
-@@ -1387,7 +1396,7 @@
- pd->confdata.thread_count,
- (pd->confdata.thread_count > 1) ?"s" :"");
- }
-- avcodec_thread_init(&pd->ff_vcontext, pd->confdata.thread_count);
-+ pd->ff_vcontext.thread_count = pd->confdata.thread_count;
-
- pd->ff_vcodec = avcodec_find_encoder(FF_VCODEC_ID(pd));
- if (pd->ff_vcodec == NULL) {
-@@ -1397,11 +1406,11 @@
- }
-
- TC_LOCK_LIBAVCODEC;
-- ret = avcodec_open(&pd->ff_vcontext, pd->ff_vcodec);
-+ ret = avcodec_open2(&pd->ff_vcontext, pd->ff_vcodec, pd->ff_opts);
- TC_UNLOCK_LIBAVCODEC;
-
- if (ret < 0) {
-- tc_log_error(MOD_NAME, "avcodec_open() failed");
-+ tc_log_error(MOD_NAME, "avcodec_open2() failed");
- goto failed;
- }
- /* finally, pass up the extradata, if any */
-diff -urN transcode-1.1.7-orig/export/export_ffmpeg.c transcode-1.1.7/export/export_ffmpeg.c
---- transcode-1.1.7-orig/export/export_ffmpeg.c 2011-11-19 08:50:27.000000000 -0800
-+++ transcode-1.1.7/export/export_ffmpeg.c 2012-07-03 13:15:23.918019415 -0700
-@@ -122,6 +122,7 @@
- static AVFrame *lavc_convert_frame = NULL;
-
- static AVCodec *lavc_venc_codec = NULL;
-+static AVDictionary **lavc_venc_opts = NULL;
- static AVFrame *lavc_venc_frame = NULL;
- static AVCodecContext *lavc_venc_context;
- static avi_t *avifile = NULL;
-@@ -180,7 +181,7 @@
-
-
- /* START: COPIED FROM ffmpeg-0.5_p22846(ffmpeg.c, cmdutils.c) */
--#include <libavcodec/opt.h>
-+#include <libavutil/opt.h>
- #include <libavutil/avstring.h>
- #include <libswscale/swscale.h>
-
-@@ -470,7 +471,6 @@
- }
-
- TC_LOCK_LIBAVCODEC;
-- avcodec_init();
- avcodec_register_all();
- TC_UNLOCK_LIBAVCODEC;
-
-@@ -634,7 +634,7 @@
- lavc_param_rc_max_rate = 2516;
- lavc_param_rc_buffer_size = 224 * 8;
- lavc_param_rc_buffer_aggressivity = 99;
-- lavc_param_scan_offset = CODEC_FLAG_SVCD_SCAN_OFFSET;
-+ lavc_param_scan_offset = 1;
-
- break;
-
-@@ -674,7 +674,7 @@
-
- lavc_param_rc_buffer_size = 224 * 8;
- lavc_param_rc_buffer_aggressivity = 99;
-- lavc_param_scan_offset = CODEC_FLAG_SVCD_SCAN_OFFSET;
-+ lavc_param_scan_offset = 1;
-
- break;
-
-@@ -887,7 +887,7 @@
- lavc_venc_context->thread_count);
- }
-
-- avcodec_thread_init(lavc_venc_context, lavc_param_threads);
-+ lavc_venc_context->thread_count = lavc_param_threads;
-
- if (lavc_param_intra_matrix) {
- char *tmp;
-@@ -1065,15 +1065,10 @@
- lavc_venc_context->flags |= lavc_param_closedgop;
- lavc_venc_context->flags |= lavc_param_trunc;
- lavc_venc_context->flags |= lavc_param_aic;
-- lavc_venc_context->flags |= lavc_param_umv;
- lavc_venc_context->flags |= lavc_param_v4mv;
-- lavc_venc_context->flags |= lavc_param_data_partitioning;
- lavc_venc_context->flags |= lavc_param_cbp;
- lavc_venc_context->flags |= lavc_param_mv0;
- lavc_venc_context->flags |= lavc_param_qp_rd;
-- lavc_venc_context->flags |= lavc_param_scan_offset;
-- lavc_venc_context->flags |= lavc_param_ss;
-- lavc_venc_context->flags |= lavc_param_alt;
- lavc_venc_context->flags |= lavc_param_ilme;
- #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
- lavc_venc_context->flags |= lavc_param_trell;
-@@ -1203,7 +1198,6 @@
-
- lavc_venc_context->me_method = ME_ZERO + lavc_param_vme;
-
--
- /* FIXME: transcode itself contains "broken ffmpeg default settings", thus we need to override them! */
- if (lavc_param_video_preset) {
- avcodec_opts[AVMEDIA_TYPE_VIDEO] = lavc_venc_context;
-@@ -1241,20 +1235,39 @@
- }
- }
-
-+ if (lavc_param_scan_offset) {
-+ av_dict_set(lavc_venc_opts, "scan_offset", "1", 0);
-+ }
-+
-+ if (lavc_param_ss) {
-+ av_dict_set(lavc_venc_opts, "structured_slices", "1", 0);
-+ }
-+
-+ if (lavc_param_alt) {
-+ av_dict_set(lavc_venc_opts, "alternate_scan", "1", 0);
-+ }
-+
-+ if (lavc_param_umv) {
-+ av_dict_set(lavc_venc_opts, "umv", "1", 0);
-+ }
-+
-+ if (lavc_param_data_partitioning) {
-+ av_dict_set(lavc_venc_opts, "vdpart", "1", 0);
-+ }
-
- //-- open codec --
- //----------------
- TC_LOCK_LIBAVCODEC;
-- ret = avcodec_open(lavc_venc_context, lavc_venc_codec);
-+ ret = avcodec_open2(lavc_venc_context, lavc_venc_codec, lavc_venc_opts);
- TC_UNLOCK_LIBAVCODEC;
- if (ret < 0) {
- tc_log_warn(MOD_NAME, "could not open FFMPEG codec");
- return TC_EXPORT_ERROR;
- }
-
-- if (lavc_venc_context->codec->encode == NULL) {
-+ if (av_codec_is_encoder(lavc_venc_context->codec) == 0) {
- tc_log_warn(MOD_NAME, "could not open FFMPEG codec "
-- "(lavc_venc_context->codec->encode == NULL)");
-+ "(av_codec_is_encoder(lavc_venc_context->codec) == 0)");
- return TC_EXPORT_ERROR;
- }
-
-diff -urN transcode-1.1.7-orig/export/ffmpeg_cfg.c transcode-1.1.7/export/ffmpeg_cfg.c
---- transcode-1.1.7-orig/export/ffmpeg_cfg.c 2011-11-19 08:50:27.000000000 -0800
-+++ transcode-1.1.7/export/ffmpeg_cfg.c 2012-07-03 10:09:25.011003254 -0700
-@@ -160,9 +160,9 @@
- {"vcelim", &lavc_param_chroma_elim_threshold, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -99, 99},
- {"vpsize", &lavc_param_packet_size, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 100000000},
- {"vstrict", &lavc_param_strict, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -99, 99},
-- {"vdpart", &lavc_param_data_partitioning, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_PART},
-+ {"vdpart", &lavc_param_data_partitioning, TCCONF_TYPE_FLAG, 0, 0, 1},
- // {"keyint", &lavc_param_keyint, TCCONF_TYPE_INT, 0, 0, 0},
-- {"gray", &lavc_param_gray, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_PART},
-+ {"gray", &lavc_param_gray, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_GRAY},
- {"mpeg_quant", &lavc_param_mpeg_quant, TCCONF_TYPE_FLAG, 0, 0, 1},
- {"vi_qfactor", &lavc_param_vi_qfactor, TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, -31.0, 31.0},
- {"vi_qoffset", &lavc_param_vi_qoffset, TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, 0.0, 31.0},
-@@ -211,7 +211,7 @@
- #else
- {"aic", &lavc_param_aic, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_AC_PRED},
- #endif
-- {"umv", &lavc_param_umv, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_H263P_UMV},
-+ {"umv", &lavc_param_umv, TCCONF_TYPE_FLAG, 0, 0, 1},
- {"ibias", &lavc_param_ibias, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -512, 512},
- {"pbias", &lavc_param_pbias, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -512, 512},
- {"coder", &lavc_param_coder, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 10},
-@@ -223,9 +223,9 @@
- {"nr", &lavc_param_noise_reduction, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 1000000},
- {"qprd", &lavc_param_qp_rd, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_QP_RD},
- {"threads", &lavc_param_threads, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 1, 16},
-- {"ss", &lavc_param_ss, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_H263P_SLICE_STRUCT},
-- {"svcd_sof", &lavc_param_scan_offset, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_SVCD_SCAN_OFFSET},
-- {"alt", &lavc_param_alt, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_ALT_SCAN},
-+ {"ss", &lavc_param_ss, TCCONF_TYPE_FLAG, 0, 0, 1},
-+ {"svcd_sof", &lavc_param_scan_offset, TCCONF_TYPE_FLAG, 0, 0, 1},
-+ {"alt", &lavc_param_alt, TCCONF_TYPE_FLAG, 0, 0, 1},
- {"ilme", &lavc_param_ilme, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_INTERLACED_ME},
- {"inter_threshold", &lavc_param_inter_threshold, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -1000000, 1000000},
- {"sc_threshold", &lavc_param_sc_threshold, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -1000000, 1000000},
-diff -urN transcode-1.1.7-orig/import/decode_lavc.c transcode-1.1.7/import/decode_lavc.c
---- transcode-1.1.7-orig/import/decode_lavc.c 2011-11-19 08:50:27.000000000 -0800
-+++ transcode-1.1.7/import/decode_lavc.c 2012-07-03 10:21:46.085005182 -0700
-@@ -181,7 +181,7 @@
- #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
- lavc_dec_context->error_resilience = 2;
- #else
-- lavc_dec_context->error_recognition = 2;
-+ lavc_dec_context->err_recognition = 2;
- #endif
- lavc_dec_context->error_concealment = 3;
- lavc_dec_context->workaround_bugs = FF_BUG_AUTODETECT;
-diff -urN transcode-1.1.7-orig/import/import_ffmpeg.c transcode-1.1.7/import/import_ffmpeg.c
---- transcode-1.1.7-orig/import/import_ffmpeg.c 2011-11-19 08:50:27.000000000 -0800
-+++ transcode-1.1.7/import/import_ffmpeg.c 2012-07-03 10:19:36.936004841 -0700
-@@ -314,7 +314,7 @@
- #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
- lavc_dec_context->error_resilience = 2;
- #else
-- lavc_dec_context->error_recognition = 2;
-+ lavc_dec_context->err_recognition = 2;
- #endif
- lavc_dec_context->error_concealment = 3;
- lavc_dec_context->workaround_bugs = FF_BUG_AUTODETECT;
-diff -urN transcode-1.1.7-orig/import/probe_ffmpeg.c transcode-1.1.7/import/probe_ffmpeg.c
---- transcode-1.1.7-orig/import/probe_ffmpeg.c 2011-11-19 08:50:27.000000000 -0800
-+++ transcode-1.1.7/import/probe_ffmpeg.c 2012-07-03 10:41:42.782008306 -0700
-@@ -99,8 +99,8 @@
-
- TC_INIT_LIBAVCODEC;
-
-- ret = av_open_input_file(&lavf_dmx_context, ipipe->name,
-- NULL, 0, NULL);
-+ ret = avformat_open_input(&lavf_dmx_context, ipipe->name,
-+ NULL, NULL);
- if (ret != 0) {
- tc_log_error(__FILE__, "unable to open '%s'"
- " (libavformat failure)",
-diff -urN transcode-1.1.7-orig/libtc/tcavcodec.h transcode-1.1.7/libtc/tcavcodec.h
---- transcode-1.1.7-orig/libtc/tcavcodec.h 2011-11-19 08:50:27.000000000 -0800
-+++ transcode-1.1.7/libtc/tcavcodec.h 2012-07-03 10:34:43.648007213 -0700
-@@ -53,7 +53,6 @@
-
- #define TC_INIT_LIBAVCODEC do { \
- TC_LOCK_LIBAVCODEC; \
-- avcodec_init(); \
- avcodec_register_all(); \
- TC_UNLOCK_LIBAVCODEC; \
- } while (0)
diff --git a/multimedia/transcode/transcode-1.1.7-ffmpeg.patch b/multimedia/transcode/transcode-1.1.7-ffmpeg.patch
deleted file mode 100644
index be7a6cbaeb..0000000000
--- a/multimedia/transcode/transcode-1.1.7-ffmpeg.patch
+++ /dev/null
@@ -1,51 +0,0 @@
---- encode/encode_lavc.c
-+++ encode/encode_lavc.c
-@@ -955,8 +955,6 @@
- /*
- * context *transcode* (not libavcodec) defaults
- */
-- pd->ff_vcontext.mb_qmin = 2;
-- pd->ff_vcontext.mb_qmax = 31;
- pd->ff_vcontext.max_qdiff = 3;
- pd->ff_vcontext.max_b_frames = 0;
- pd->ff_vcontext.me_range = 0;
-@@ -1116,8 +1114,6 @@
- // handled by transcode core
- // { "vqmax", PCTX(qmax), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 1, 60 },
- // handled by transcode core
-- { "mbqmin", PCTX(mb_qmin), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 1, 60 },
-- { "mbqmax", PCTX(mb_qmax), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 1, 60 },
- { "lmin", PAUX(lmin), TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, 0.01, 255.0 },
- { "lmax", PAUX(lmax), TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, 0.01, 255.0 },
- { "vqdiff", PCTX(max_qdiff), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 1, 31 },
---- export/ffmpeg_cfg.c
-+++ export/ffmpeg_cfg.c
-@@ -34,8 +34,6 @@
- //int lavc_param_vqscale = 0;
- //int lavc_param_vqmin = 2;
- //int lavc_param_vqmax = 31;
--int lavc_param_mb_qmin = 2;
--int lavc_param_mb_qmax = 31;
- int lavc_param_lmin = 2;
- int lavc_param_lmax = 31;
- int lavc_param_vqdiff = 3;
-@@ -143,8 +141,6 @@
- // {"vqscale", &lavc_param_vqscale, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 1, 31},
- // {"vqmin", &lavc_param_vqmin, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 1, 31},
- // {"vqmax", &lavc_param_vqmax, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 1, 31},
-- {"mbqmin", &lavc_param_mb_qmin, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 1, 31},
-- {"mbqmax", &lavc_param_mb_qmax, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 1, 31},
- {"lmin", &lavc_param_lmin, TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, 0.01, 255.0},
- {"lmax", &lavc_param_lmax, TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, 0.01, 255.0},
- {"vqdiff", &lavc_param_vqdiff, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 1, 31},
---- export/ffmpeg_cfg.h
-+++ export/ffmpeg_cfg.h
-@@ -13,8 +13,6 @@
- //extern int lavc_param_vqscale;
- //extern int lavc_param_vqmin;
- //extern int lavc_param_vqmax;
--extern int lavc_param_mb_qmin;
--extern int lavc_param_mb_qmax;
- extern int lavc_param_lmin;
- extern int lavc_param_lmax;
- extern int lavc_param_vqdiff;
diff --git a/multimedia/transcode/transcode-1.1.7-ffmpeg2.patch b/multimedia/transcode/transcode-1.1.7-ffmpeg2.patch
deleted file mode 100644
index 9a770a6a0d..0000000000
--- a/multimedia/transcode/transcode-1.1.7-ffmpeg2.patch
+++ /dev/null
@@ -1,557 +0,0 @@
-Fix build with ffmpeg-2.0.
-Fix segfaults introduced by wrong usage of the av_dict API.
-Fix forgotten parts in the libav9 patch.
-
-Index: transcode-1.1.7/encode/encode_lavc.c
-===================================================================
---- transcode-1.1.7.orig/encode/encode_lavc.c
-+++ transcode-1.1.7/encode/encode_lavc.c
-@@ -74,6 +74,9 @@ struct tclavcconfigdata_ {
- int lmin;
- int lmax;
- int me_method;
-+ int luma_elim_threshold;
-+ int chroma_elim_threshold;
-+ int quantizer_noise_shaping;
-
- /* same as above for flags */
- struct {
-@@ -114,7 +117,7 @@ struct tclavcprivatedata_ {
-
- AVFrame ff_venc_frame;
- AVCodecContext ff_vcontext;
-- AVDictionary ** ff_opts;
-+ AVDictionary * ff_opts;
-
- AVCodec *ff_vcodec;
-
-@@ -165,6 +168,7 @@ static const TCCodecID tc_lavc_codecs_ou
- TC_CODEC_ERROR
- };
-
-+#if LIBAVCODEC_VERSION_MAJOR < 55
- static const enum CodecID tc_lavc_internal_codecs[] = {
- CODEC_ID_MPEG1VIDEO, CODEC_ID_MPEG2VIDEO, CODEC_ID_MPEG4,
- CODEC_ID_H263I, CODEC_ID_H263P,
-@@ -177,6 +181,20 @@ static const enum CodecID tc_lavc_intern
- CODEC_ID_MSMPEG4V2, CODEC_ID_MSMPEG4V3,
- CODEC_ID_NONE
- };
-+#else
-+static const enum AVCodecID tc_lavc_internal_codecs[] = {
-+ AV_CODEC_ID_MPEG1VIDEO, AV_CODEC_ID_MPEG2VIDEO, AV_CODEC_ID_MPEG4,
-+ AV_CODEC_ID_H263I, AV_CODEC_ID_H263P,
-+ AV_CODEC_ID_H264,
-+ AV_CODEC_ID_WMV1, AV_CODEC_ID_WMV2,
-+ AV_CODEC_ID_RV10,
-+ AV_CODEC_ID_HUFFYUV, AV_CODEC_ID_FFV1,
-+ AV_CODEC_ID_DVVIDEO,
-+ AV_CODEC_ID_MJPEG, AV_CODEC_ID_LJPEG,
-+ AV_CODEC_ID_MSMPEG4V2, AV_CODEC_ID_MSMPEG4V3,
-+ AV_CODEC_ID_NONE
-+};
-+#endif
-
- static const TCFormatID tc_lavc_formats[] = { TC_FORMAT_ERROR };
-
-@@ -938,7 +956,11 @@ static int tc_lavc_settings_from_vob(TCL
- static void tc_lavc_config_defaults(TCLavcPrivateData *pd)
- {
- /* first of all reinitialize lavc data */
-+#if LIBAVCODEC_VERSION_MAJOR < 55
- avcodec_get_context_defaults(&pd->ff_vcontext);
-+#else
-+ avcodec_get_context_defaults3(&pd->ff_vcontext, NULL);
-+#endif
-
- pd->confdata.thread_count = 1;
-
-@@ -976,8 +998,8 @@ static void tc_lavc_config_defaults(TCLa
- pd->ff_vcontext.mpeg_quant = 0;
- pd->ff_vcontext.rc_initial_cplx = 0.0;
- pd->ff_vcontext.rc_qsquish = 1.0;
-- pd->ff_vcontext.luma_elim_threshold = 0;
-- pd->ff_vcontext.chroma_elim_threshold = 0;
-+ pd->confdata.luma_elim_threshold = 0;
-+ pd->confdata.chroma_elim_threshold = 0;
- pd->ff_vcontext.strict_std_compliance = 0;
- pd->ff_vcontext.dct_algo = FF_DCT_AUTO;
- pd->ff_vcontext.idct_algo = FF_IDCT_AUTO;
-@@ -1001,7 +1023,7 @@ static void tc_lavc_config_defaults(TCLa
- pd->ff_vcontext.intra_quant_bias = FF_DEFAULT_QUANT_BIAS;
- pd->ff_vcontext.inter_quant_bias = FF_DEFAULT_QUANT_BIAS;
- pd->ff_vcontext.noise_reduction = 0;
-- pd->ff_vcontext.quantizer_noise_shaping = 0;
-+ pd->confdata.quantizer_noise_shaping = 0;
- pd->ff_vcontext.flags = 0;
- }
-
-@@ -1033,7 +1055,6 @@ static void tc_lavc_dispatch_settings(TC
-
- pd->ff_vcontext.flags = 0;
- SET_FLAG(pd, mv0);
-- SET_FLAG(pd, cbp);
- SET_FLAG(pd, qpel);
- SET_FLAG(pd, naq);
- SET_FLAG(pd, ilme);
-@@ -1060,17 +1081,29 @@ static void tc_lavc_dispatch_settings(TC
- pd->ff_vcontext.flags |= CODEC_FLAG_INTERLACED_ME;
- }
- if (pd->confdata.flags.alt) {
-- av_dict_set(pd->ff_opts, "alternate_scan", "1", 0);
-+ av_dict_set(&(pd->ff_opts), "alternate_scan", "1", 0);
- }
- if (pd->confdata.flags.vdpart) {
-- av_dict_set(pd->ff_opts, "data_partitioning", "1", 0);
-+ av_dict_set(&(pd->ff_opts), "data_partitioning", "1", 0);
- }
- if (pd->confdata.flags.umv) {
-- av_dict_set(pd->ff_opts, "umv", "1", 0);
-+ av_dict_set(&(pd->ff_opts), "umv", "1", 0);
- }
- if (pd->confdata.flags.aiv) {
-- av_dict_set(pd->ff_opts, "aiv", "1", 0);
-+ av_dict_set(&(pd->ff_opts), "aiv", "1", 0);
- }
-+ if (pd->confdata.flags.cbp) {
-+ av_dict_set(&(pd->ff_opts), "mpv_flags", "+cbp_rd", 0);
-+ }
-+
-+ char buf[1024];
-+#define set_dict_opt(val, opt) \
-+ snprintf(buf, sizeof(buf), "%i", pd->confdata.val);\
-+ av_dict_set(&(pd->ff_opts), opt, buf, 0)
-+
-+ set_dict_opt(luma_elim_threshold, "luma_elim_threshold");
-+ set_dict_opt(chroma_elim_threshold, "chroma_elim_threshold");
-+ set_dict_opt(quantizer_noise_shaping, "quantizer_noise_shaping");
- }
-
- #undef SET_FLAG
-@@ -1155,8 +1188,8 @@ static int tc_lavc_read_config(TCLavcPri
- { "vrc_init_cplx", PCTX(rc_initial_cplx), TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, 0.0, 9999999.0 },
- // { "vrc_init_occupancy", }, // not yet supported
- { "vqsquish", PCTX(rc_qsquish), TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, 0.0, 99.0 },
-- { "vlelim", PCTX(luma_elim_threshold), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -99, 99 },
-- { "vcelim", PCTX(chroma_elim_threshold), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -99, 99 },
-+ { "vlelim", PAUX(luma_elim_threshold), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -99, 99 },
-+ { "vcelim", PAUX(chroma_elim_threshold), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -99, 99 },
- { "vstrict", PCTX(strict_std_compliance), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -99, 99 },
- { "vpsize", PCTX(rtp_payload_size), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 100000000 },
- { "dct", PCTX(dct_algo), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 10 },
-@@ -1182,12 +1215,12 @@ static int tc_lavc_read_config(TCLavcPri
- { "ibias", PCTX(intra_quant_bias), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -512, 512 },
- { "pbias", PCTX(inter_quant_bias), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -512, 512 },
- { "nr", PCTX(noise_reduction), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 1000000},
-- { "qns", PCTX(quantizer_noise_shaping), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 3 },
-+ { "qns", PAUX(quantizer_noise_shaping), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 3 },
- { "inter_matrix_file", inter_matrix_file, TCCONF_TYPE_STRING, 0, 0, 0 },
- { "intra_matrix_file", intra_matrix_file, TCCONF_TYPE_STRING, 0, 0, 0 },
-
- { "mv0", PAUX(flags.mv0), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_MV0 },
-- { "cbp", PAUX(flags.cbp), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_CBP_RD },
-+ { "cbp", PAUX(flags.cbp), TCCONF_TYPE_FLAG, 0, 0, 1 },
- { "qpel", PAUX(flags.qpel), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_QPEL },
- { "alt", PAUX(flags.alt), TCCONF_TYPE_FLAG, 0, 0, 1 },
- { "ilme", PAUX(flags.ilme), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_INTERLACED_ME },
-@@ -1350,6 +1383,8 @@ static int tc_lavc_configure(TCModuleIns
-
- pd = self->userdata;
-
-+ pd->ff_opts = NULL;
-+
- pd->flush_flag = vob->encoder_flush;
-
- /* FIXME: move into core? */
-@@ -1402,7 +1437,7 @@ static int tc_lavc_configure(TCModuleIns
- }
-
- TC_LOCK_LIBAVCODEC;
-- ret = avcodec_open2(&pd->ff_vcontext, pd->ff_vcodec, pd->ff_opts);
-+ ret = avcodec_open2(&pd->ff_vcontext, pd->ff_vcodec, &(pd->ff_opts));
- TC_UNLOCK_LIBAVCODEC;
-
- if (ret < 0) {
-Index: transcode-1.1.7/export/export_ffmpeg.c
-===================================================================
---- transcode-1.1.7.orig/export/export_ffmpeg.c
-+++ transcode-1.1.7/export/export_ffmpeg.c
-@@ -122,7 +122,7 @@ static uint8_t *img_buffer =
- static AVFrame *lavc_convert_frame = NULL;
-
- static AVCodec *lavc_venc_codec = NULL;
--static AVDictionary **lavc_venc_opts = NULL;
-+static AVDictionary *lavc_venc_opts = NULL;
- static AVFrame *lavc_venc_frame = NULL;
- static AVCodecContext *lavc_venc_context;
- static avi_t *avifile = NULL;
-@@ -486,7 +486,7 @@ MOD_init
- codec->name, codec->fourCC, codec->comments);
- }
-
-- lavc_venc_context = avcodec_alloc_context();
-+ lavc_venc_context = avcodec_alloc_context3(lavc_venc_codec);
- lavc_venc_frame = avcodec_alloc_frame();
-
- lavc_convert_frame= avcodec_alloc_frame();
-@@ -838,8 +838,13 @@ MOD_init
- lavc_venc_context->rc_strategy = lavc_param_vrc_strategy;
- lavc_venc_context->b_frame_strategy = lavc_param_vb_strategy;
- lavc_venc_context->b_quant_offset = lavc_param_vb_qoffset;
-- lavc_venc_context->luma_elim_threshold= lavc_param_luma_elim_threshold;
-- lavc_venc_context->chroma_elim_threshold= lavc_param_chroma_elim_threshold;
-+
-+ char buf[1024];
-+#define set_dict_opt(val, opt) \
-+ snprintf(buf, sizeof(buf), "%i", val); \
-+ av_dict_set(&lavc_venc_opts, opt, buf, 0)
-+ set_dict_opt(lavc_param_luma_elim_threshold, "luma_elim_threshold");
-+ set_dict_opt(lavc_param_chroma_elim_threshold, "chroma_elim_threshold");
- lavc_venc_context->rtp_payload_size = lavc_param_packet_size;
- #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
- if (lavc_param_packet_size)
-@@ -870,7 +875,7 @@ MOD_init
- lavc_venc_context->context_model = lavc_param_context;
- lavc_venc_context->scenechange_threshold= lavc_param_sc_threshold;
- lavc_venc_context->noise_reduction = lavc_param_noise_reduction;
-- lavc_venc_context->inter_threshold = lavc_param_inter_threshold;
-+ set_dict_opt(lavc_param_inter_threshold, "inter_threshold");
- lavc_venc_context->intra_dc_precision = lavc_param_intra_dc_precision;
- lavc_venc_context->skip_top = lavc_param_skip_top;
- lavc_venc_context->skip_bottom = lavc_param_skip_bottom;
-@@ -1066,9 +1071,11 @@ MOD_init
- lavc_venc_context->flags |= lavc_param_trunc;
- lavc_venc_context->flags |= lavc_param_aic;
- lavc_venc_context->flags |= lavc_param_v4mv;
-- lavc_venc_context->flags |= lavc_param_cbp;
-+ if(lavc_param_cbp)
-+ av_dict_set(&lavc_venc_opts, "mpv_flags", "+cbp_rd", 0);
- lavc_venc_context->flags |= lavc_param_mv0;
-- lavc_venc_context->flags |= lavc_param_qp_rd;
-+ if(lavc_param_qp_rd)
-+ av_dict_set(&lavc_venc_opts, "mpv_flags", "+qp_rd", 0);
- lavc_venc_context->flags |= lavc_param_ilme;
- #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
- lavc_venc_context->flags |= lavc_param_trell;
-@@ -1238,29 +1245,29 @@ MOD_init
- }
-
- if (lavc_param_scan_offset) {
-- av_dict_set(lavc_venc_opts, "scan_offset", "1", 0);
-+ av_dict_set(&lavc_venc_opts, "scan_offset", "1", 0);
- }
-
- if (lavc_param_ss) {
-- av_dict_set(lavc_venc_opts, "structured_slices", "1", 0);
-+ av_dict_set(&lavc_venc_opts, "structured_slices", "1", 0);
- }
-
- if (lavc_param_alt) {
-- av_dict_set(lavc_venc_opts, "alternate_scan", "1", 0);
-+ av_dict_set(&lavc_venc_opts, "alternate_scan", "1", 0);
- }
-
- if (lavc_param_umv) {
-- av_dict_set(lavc_venc_opts, "umv", "1", 0);
-+ av_dict_set(&lavc_venc_opts, "umv", "1", 0);
- }
-
- if (lavc_param_data_partitioning) {
-- av_dict_set(lavc_venc_opts, "vdpart", "1", 0);
-+ av_dict_set(&lavc_venc_opts, "vdpart", "1", 0);
- }
-
- //-- open codec --
- //----------------
- TC_LOCK_LIBAVCODEC;
-- ret = avcodec_open2(lavc_venc_context, lavc_venc_codec, lavc_venc_opts);
-+ ret = avcodec_open2(lavc_venc_context, lavc_venc_codec, &lavc_venc_opts);
- TC_UNLOCK_LIBAVCODEC;
- if (ret < 0) {
- tc_log_warn(MOD_NAME, "could not open FFMPEG codec");
-Index: transcode-1.1.7/export/ffmpeg_cfg.c
-===================================================================
---- transcode-1.1.7.orig/export/ffmpeg_cfg.c
-+++ transcode-1.1.7/export/ffmpeg_cfg.c
-@@ -214,10 +214,10 @@ TCConfigEntry lavcopts_conf[]={
- {"context", &lavc_param_context, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 10},
- {"intra_matrix", &lavc_param_intra_matrix, TCCONF_TYPE_STRING, 0, 0, 0},
- {"inter_matrix", &lavc_param_inter_matrix, TCCONF_TYPE_STRING, 0, 0, 0},
-- {"cbp", &lavc_param_cbp, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_CBP_RD},
-+ {"cbp", &lavc_param_cbp, TCCONF_TYPE_FLAG, 0, 0, 1},
- {"mv0", &lavc_param_mv0, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_MV0},
- {"nr", &lavc_param_noise_reduction, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 1000000},
-- {"qprd", &lavc_param_qp_rd, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_QP_RD},
-+ {"qprd", &lavc_param_qp_rd, TCCONF_TYPE_FLAG, 0, 0, 1},
- {"threads", &lavc_param_threads, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 1, 16},
- {"ss", &lavc_param_ss, TCCONF_TYPE_FLAG, 0, 0, 1},
- {"svcd_sof", &lavc_param_scan_offset, TCCONF_TYPE_FLAG, 0, 0, 1},
-Index: transcode-1.1.7/export/aud_aux.c
-===================================================================
---- transcode-1.1.7.orig/export/aud_aux.c
-+++ transcode-1.1.7/export/aud_aux.c
-@@ -326,10 +326,18 @@ static int tc_audio_init_ffmpeg(vob_t *vob, int o_codec)
-
- switch (o_codec) {
- case 0x50:
-+#if LIBAVCODEC_VERSION_MAJOR < 55
- codeid = CODEC_ID_MP2;
-+#else
-+ codeid = AV_CODEC_ID_MP2;
-+#endif
- break;
- case 0x2000:
-+#if LIBAVCODEC_VERSION_MAJOR < 55
- codeid = CODEC_ID_AC3;
-+#else
-+ codeid = AV_CODEC_ID_AC3;
-+#endif
- break;
- default:
- tc_warn("cannot init ffmpeg with %x", o_codec);
-@@ -346,7 +346,7 @@ static int tc_audio_init_ffmpeg(vob_t *v
-
- //-- set parameters (bitrate, channels and sample-rate) --
- //--------------------------------------------------------
-- avcodec_get_context_defaults(&mpa_ctx);
-+ avcodec_get_context_defaults3(&mpa_ctx, mpa_codec);
- #if LIBAVCODEC_VERSION_MAJOR < 53
- mpa_ctx.codec_type = CODEC_TYPE_AUDIO;
- #else
-@@ -359,7 +359,7 @@ static int tc_audio_init_ffmpeg(vob_t *v
- //-- open codec --
- //----------------
- TC_LOCK_LIBAVCODEC;
-- ret = avcodec_open(&mpa_ctx, mpa_codec);
-+ ret = avcodec_open2(&mpa_ctx, mpa_codec, NULL);
- TC_UNLOCK_LIBAVCODEC;
- if (ret < 0) {
- tc_warn("tc_audio_init_ffmpeg: could not open %s codec !",
-@@ -371,7 +371,12 @@ static int tc_audio_init_ffmpeg(vob_t *vob, int o_codec)
- TC_UNLOCK_LIBAVCODEC;
- if (ret < 0) {
- tc_warn("tc_audio_init_ffmpeg: could not open %s codec !",
-- (codeid == CODEC_ID_MP2) ?"mpa" :"ac3");
-+#if LIBAVCODEC_VERSION_MAJOR < 55
-+ (codeid == CODEC_ID_MP2)
-+#else
-+ (codeid == AV_CODEC_ID_MP2)
-+#endif
-+ ?"mpa" :"ac3");
- return(TC_EXPORT_ERROR);
- }
-
-Index: transcode-1.1.7/import/import_ffmpeg.c
-===================================================================
---- transcode-1.1.7.orig/import/import_ffmpeg.c
-+++ transcode-1.1.7/import/import_ffmpeg.c
-@@ -58,6 +58,7 @@ struct ffmpeg_codec {
- };
-
- // fourCC to ID mapping taken from MPlayer's codecs.conf
-+#if LIBAVCODEC_VERSION_MAJOR < 55
- static struct ffmpeg_codec ffmpeg_codecs[] = {
- {CODEC_ID_MSMPEG4V1, TC_CODEC_ERROR, "mp41",
- {"MP41", "DIV1", ""}},
-@@ -106,6 +107,56 @@ static struct ffmpeg_codec ffmpeg_codecs[] = {
- {CODEC_ID_RAWVIDEO, TC_CODEC_YUV422P, "raw",
- {"Y42B", ""}},
- {0, TC_CODEC_UNKNOWN, NULL, {""}}};
-+#else
-+static struct ffmpeg_codec ffmpeg_codecs[] = {
-+ {AV_CODEC_ID_MSMPEG4V1, TC_CODEC_ERROR, "mp41",
-+ {"MP41", "DIV1", ""}},
-+ {AV_CODEC_ID_MSMPEG4V2, TC_CODEC_MP42, "mp42",
-+ {"MP42", "DIV2", ""}},
-+ {AV_CODEC_ID_MSMPEG4V3, TC_CODEC_DIVX3, "msmpeg4",
-+ {"DIV3", "DIV5", "AP41", "MPG3", "MP43", ""}},
-+ {AV_CODEC_ID_MPEG4, TC_CODEC_DIVX4, "mpeg4",
-+ {"DIVX", "XVID", "MP4S", "M4S2", "MP4V", "UMP4", "DX50", ""}},
-+ {AV_CODEC_ID_MJPEG, TC_CODEC_MJPEG, "mjpeg",
-+ {"MJPG", "AVRN", "AVDJ", "JPEG", "MJPA", "JFIF", ""}},
-+ {AV_CODEC_ID_MPEG1VIDEO, TC_CODEC_MPG1, "mpeg1video",
-+ {"MPG1", ""}},
-+ {AV_CODEC_ID_DVVIDEO, TC_CODEC_DV, "dvvideo",
-+ {"DVSD", ""}},
-+ {AV_CODEC_ID_WMV1, TC_CODEC_WMV1, "wmv1",
-+ {"WMV1", ""}},
-+ {AV_CODEC_ID_WMV2, TC_CODEC_WMV2, "wmv2",
-+ {"WMV2", ""}},
-+ {AV_CODEC_ID_HUFFYUV, TC_CODEC_HUFFYUV, "hfyu",
-+ {"HFYU", ""}},
-+ {AV_CODEC_ID_H263I, TC_CODEC_H263I, "h263i",
-+ {"I263", ""}},
-+ {AV_CODEC_ID_H263P, TC_CODEC_H263P, "h263p",
-+ {"H263", "U263", "VIV1", ""}},
-+ {AV_CODEC_ID_H264, TC_CODEC_H264, "h264",
-+ {"H264", "h264", "X264", "x264", "avc1", ""}},
-+ {AV_CODEC_ID_RV10, TC_CODEC_RV10, "rv10",
-+ {"RV10", "RV13", ""}},
-+ {AV_CODEC_ID_SVQ1, TC_CODEC_SVQ1, "svq1",
-+ {"SVQ1", ""}},
-+ {AV_CODEC_ID_SVQ3, TC_CODEC_SVQ3, "svq3",
-+ {"SVQ3", ""}},
-+ {AV_CODEC_ID_MPEG2VIDEO, TC_CODEC_MPEG2, "mpeg2video",
-+ {"MPG2", ""}},
-+ {AV_CODEC_ID_MPEG2VIDEO, TC_CODEC_MPEG, "mpeg2video",
-+ {"MPG2", ""}},
-+ {AV_CODEC_ID_ASV1, TC_CODEC_ASV1, "asv1",
-+ {"ASV1", ""}},
-+ {AV_CODEC_ID_ASV2, TC_CODEC_ASV2, "asv2",
-+ {"ASV2", ""}},
-+ {AV_CODEC_ID_FFV1, TC_CODEC_FFV1, "ffv1",
-+ {"FFV1", ""}},
-+ {AV_CODEC_ID_RAWVIDEO, TC_CODEC_YUV420P, "raw",
-+ {"I420", "IYUV", ""}},
-+ {AV_CODEC_ID_RAWVIDEO, TC_CODEC_YUV422P, "raw",
-+ {"Y42B", ""}},
-+ {0, TC_CODEC_UNKNOWN, NULL, {""}}};
-+#endif
-
- #define BUFFER_SIZE SIZE_RGB_FRAME
-
-@@ -302,7 +302,7 @@ do_avi:
-
- // Set these to the expected values so that ffmpeg's decoder can
- // properly detect interlaced input.
-- lavc_dec_context = avcodec_alloc_context();
-+ lavc_dec_context = avcodec_alloc_context3(lavc_dec_codec);
- if (lavc_dec_context == NULL) {
- tc_log_error(MOD_NAME, "Could not allocate enough memory.");
- return TC_IMPORT_ERROR;
-@@ -324,6 +375,7 @@ do_avi:
- // XXX: some codecs need extra data
- switch (codec->id)
- {
-+#if LIBAVCODEC_VERSION_MAJOR < 55
- case CODEC_ID_MJPEG: extra_data_size = 28; break;
- case CODEC_ID_LJPEG: extra_data_size = 28; break;
- case CODEC_ID_HUFFYUV: extra_data_size = 1000; break;
-@@ -331,6 +383,15 @@ do_avi:
- case CODEC_ID_ASV2: extra_data_size = 8; break;
- case CODEC_ID_WMV1: extra_data_size = 4; break;
- case CODEC_ID_WMV2: extra_data_size = 4; break;
-+#else
-+ case AV_CODEC_ID_MJPEG: extra_data_size = 28; break;
-+ case AV_CODEC_ID_LJPEG: extra_data_size = 28; break;
-+ case AV_CODEC_ID_HUFFYUV: extra_data_size = 1000; break;
-+ case AV_CODEC_ID_ASV1: extra_data_size = 8; break;
-+ case AV_CODEC_ID_ASV2: extra_data_size = 8; break;
-+ case AV_CODEC_ID_WMV1: extra_data_size = 4; break;
-+ case AV_CODEC_ID_WMV2: extra_data_size = 4; break;
-+#endif
- default: extra_data_size = 0; break;
- }
-
-@@ -344,7 +344,7 @@ do_avi:
- }
-
- TC_LOCK_LIBAVCODEC;
-- ret = avcodec_open(lavc_dec_context, lavc_dec_codec);
-+ ret = avcodec_open2(lavc_dec_context, lavc_dec_codec, NULL);
- TC_UNLOCK_LIBAVCODEC;
- if (ret < 0) {
- tc_log_warn(MOD_NAME, "Could not initialize the '%s' codec.",
-@@ -360,7 +421,11 @@ do_avi:
- frame_size = x_dim*y_dim + 2*UV_PLANE_SIZE(IMG_YUV_DEFAULT,x_dim,y_dim);
-
- // we adapt the color space
-+#if LIBAVCODEC_VERSION_MAJOR < 55
- if(codec->id == CODEC_ID_MJPEG) {
-+#else
-+ if(codec->id == AV_CODEC_ID_MJPEG) {
-+#endif
- enable_levels_filter();
- }
- break;
-@@ -434,7 +499,11 @@ do_dv:
- }
-
- // we adapt the color space
-+#if LIBAVCODEC_VERSION_MAJOR < 55
- if(codec->id == CODEC_ID_MJPEG) {
-+#else
-+ if(codec->id == AV_CODEC_ID_MJPEG) {
-+#endif
- enable_levels_filter();
- }
-
-@@ -504,13 +573,25 @@ MOD_decode {
- int bkey = 0;
-
- // check for keyframes
-+#if LIBAVCODEC_VERSION_MAJOR < 55
- if (codec->id == CODEC_ID_MSMPEG4V3) {
-+#else
-+ if (codec->id == AV_CODEC_ID_MSMPEG4V3) {
-+#endif
- if (divx3_is_key(buffer)) bkey = 1;
- }
-+#if LIBAVCODEC_VERSION_MAJOR < 55
- else if (codec->id == CODEC_ID_MPEG4) {
-+#else
-+ else if (codec->id == AV_CODEC_ID_MPEG4) {
-+#endif
- if (mpeg4_is_key(buffer, bytes_read)) bkey = 1;
- }
-+#if LIBAVCODEC_VERSION_MAJOR < 55
- else if (codec->id == CODEC_ID_MJPEG) {
-+#else
-+ else if (codec->id == AV_CODEC_ID_MJPEG) {
-+#endif
- bkey = 1;
- }
-
---- a/import/decode_lavc.c
-+++ b/import/decode_lavc.c
-@@ -57,6 +57,7 @@ struct ffmpeg_codec {
- };
-
- // fourCC to ID mapping taken from MPlayer's codecs.conf
-+#if LIBAVCODEC_VERSION_MAJOR < 55
- static struct ffmpeg_codec ffmpeg_codecs[] = {
- {CODEC_ID_MSMPEG4V1, TC_CODEC_ERROR, "mp41",
- {"MP41", "DIV1", ""}},
-@@ -91,6 +92,42 @@ static struct ffmpeg_codec ffmpeg_codecs[] = {
- {CODEC_ID_MPEG2VIDEO, TC_CODEC_MPEG2, "mpeg2video",
- {"MPG2", ""}},
- {0, TC_CODEC_UNKNOWN, NULL, {""}}};
-+#else
-+static struct ffmpeg_codec ffmpeg_codecs[] = {
-+ {AV_CODEC_ID_MSMPEG4V1, TC_CODEC_ERROR, "mp41",
-+ {"MP41", "DIV1", ""}},
-+ {AV_CODEC_ID_MSMPEG4V2, TC_CODEC_MP42, "mp42",
-+ {"MP42", "DIV2", ""}},
-+ {AV_CODEC_ID_MSMPEG4V3, TC_CODEC_DIVX3, "msmpeg4",
-+ {"DIV3", "DIV5", "AP41", "MPG3", "MP43", ""}},
-+ {AV_CODEC_ID_MPEG4, TC_CODEC_DIVX4, "mpeg4",
-+ {"DIVX", "XVID", "MP4S", "M4S2", "MP4V", "UMP4", "DX50", ""}},
-+ {AV_CODEC_ID_MJPEG, TC_CODEC_MJPEG, "mjpeg",
-+ {"MJPG", "AVRN", "AVDJ", "JPEG", "MJPA", "JFIF", ""}},
-+ {AV_CODEC_ID_MPEG1VIDEO, TC_CODEC_MPEG1VIDEO, "mpeg1video",
-+ {"MPG1", ""}},
-+ {AV_CODEC_ID_DVVIDEO, TC_CODEC_DV, "dvvideo",
-+ {"DVSD", ""}},
-+ {AV_CODEC_ID_WMV1, TC_CODEC_WMV1, "wmv1",
-+ {"WMV1", ""}},
-+ {AV_CODEC_ID_WMV2, TC_CODEC_WMV2, "wmv2",
-+ {"WMV2", ""}},
-+ {AV_CODEC_ID_HUFFYUV, TC_CODEC_HUFFYUV, "hfyu",
-+ {"HFYU", ""}},
-+ {AV_CODEC_ID_H263I, TC_CODEC_H263I, "h263i",
-+ {"I263", ""}},
-+ {AV_CODEC_ID_H263P, TC_CODEC_H263P, "h263p",
-+ {"H263", "U263", "VIV1", ""}},
-+ {AV_CODEC_ID_RV10, TC_CODEC_RV10, "rv10",
-+ {"RV10", "RV13", ""}},
-+ {AV_CODEC_ID_SVQ1, TC_CODEC_SVQ1, "svq1",
-+ {"SVQ1", ""}},
-+ {AV_CODEC_ID_SVQ3, TC_CODEC_SVQ3, "svq3",
-+ {"SVQ3", ""}},
-+ {AV_CODEC_ID_MPEG2VIDEO, TC_CODEC_MPEG2, "mpeg2video",
-+ {"MPG2", ""}},
-+ {0, TC_CODEC_UNKNOWN, NULL, {""}}};
-+#endif
-
-
- static struct ffmpeg_codec *find_ffmpeg_codec_id(unsigned int transcode_id)
diff --git a/multimedia/transcode/transcode-1.1.7-ffmpeg24.patch b/multimedia/transcode/transcode-1.1.7-ffmpeg24.patch
deleted file mode 100644
index 57a91774ab..0000000000
--- a/multimedia/transcode/transcode-1.1.7-ffmpeg24.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-https://bugs.gentoo.org/show_bug.cgi?id=520190
-
-Index: transcode-1.1.7/import/probe_ffmpeg.c
-===================================================================
---- transcode-1.1.7.orig/import/probe_ffmpeg.c
-+++ transcode-1.1.7/import/probe_ffmpeg.c
-@@ -120,7 +120,11 @@ void probe_ffmpeg(info_t *ipipe)
-
- translate_info(lavf_dmx_context, ipipe->probe_info);
-
-+#if LIBAVFORMAT_VERSION_INT > AV_VERSION_INT(53,25,0)
-+ avformat_close_input(&lavf_dmx_context);
-+#else
- av_close_input_file(lavf_dmx_context);
-+#endif
- return;
- }
-
diff --git a/multimedia/transcode/transcode-1.1.7-ffmpeg29.patch b/multimedia/transcode/transcode-1.1.7-ffmpeg29.patch
deleted file mode 100644
index 7901fc3cc3..0000000000
--- a/multimedia/transcode/transcode-1.1.7-ffmpeg29.patch
+++ /dev/null
@@ -1,352 +0,0 @@
-Index: transcode-1.1.7/encode/encode_lavc.c
-===================================================================
---- transcode-1.1.7.orig/encode/encode_lavc.c
-+++ transcode-1.1.7/encode/encode_lavc.c
-@@ -233,7 +233,7 @@ static void pre_encode_video_yuv420p(TCL
- vframe_list_t *vframe)
- {
- avpicture_fill((AVPicture *)&pd->ff_venc_frame, vframe->video_buf,
-- PIX_FMT_YUV420P,
-+ AV_PIX_FMT_YUV420P,
- pd->ff_vcontext.width, pd->ff_vcontext.height);
- }
-
-@@ -247,7 +247,7 @@ static void pre_encode_video_yuv420p_huf
- IMG_YUV_DEFAULT,
- pd->ff_vcontext.width, pd->ff_vcontext.height);
- avpicture_fill((AVPicture *)&pd->ff_venc_frame, pd->vframe_buf->video_buf,
-- PIX_FMT_YUV422P,
-+ AV_PIX_FMT_YUV422P,
- pd->ff_vcontext.width, pd->ff_vcontext.height);
- ac_imgconvert(src, IMG_YUV_DEFAULT,
- pd->ff_venc_frame.data, IMG_YUV422P,
-@@ -263,7 +263,7 @@ static void pre_encode_video_yuv422p(TCL
- IMG_YUV422P,
- pd->ff_vcontext.width, pd->ff_vcontext.height);
- avpicture_fill((AVPicture *)&pd->ff_venc_frame, pd->vframe_buf->video_buf,
-- PIX_FMT_YUV420P,
-+ AV_PIX_FMT_YUV420P,
- pd->ff_vcontext.width, pd->ff_vcontext.height);
- ac_imgconvert(src, IMG_YUV422P,
- pd->ff_venc_frame.data, IMG_YUV420P,
-@@ -275,7 +275,7 @@ static void pre_encode_video_yuv422p_huf
- vframe_list_t *vframe)
- {
- avpicture_fill((AVPicture *)&pd->ff_venc_frame, vframe->video_buf,
-- PIX_FMT_YUV422P,
-+ AV_PIX_FMT_YUV422P,
- pd->ff_vcontext.width, pd->ff_vcontext.height);
-
- }
-@@ -285,7 +285,7 @@ static void pre_encode_video_rgb24(TCLav
- vframe_list_t *vframe)
- {
- avpicture_fill((AVPicture *)&pd->ff_venc_frame, pd->vframe_buf->video_buf,
-- PIX_FMT_YUV420P,
-+ AV_PIX_FMT_YUV420P,
- pd->ff_vcontext.width, pd->ff_vcontext.height);
- ac_imgconvert(&vframe->video_buf, IMG_RGB_DEFAULT,
- pd->ff_venc_frame.data, IMG_YUV420P,
-@@ -610,21 +610,21 @@ static int tc_lavc_set_pix_fmt(TCLavcPri
- case CODEC_YUV:
- if (TC_VCODEC_ID(pd) == TC_CODEC_HUFFYUV) {
- pd->tc_pix_fmt = TC_CODEC_YUV422P;
-- pd->ff_vcontext.pix_fmt = PIX_FMT_YUV422P;
-+ pd->ff_vcontext.pix_fmt = AV_PIX_FMT_YUV422P;
- pd->pre_encode_video = pre_encode_video_yuv420p_huffyuv;
- } else {
- pd->tc_pix_fmt = TC_CODEC_YUV420P;
- pd->ff_vcontext.pix_fmt = (TC_VCODEC_ID(pd) == TC_CODEC_MJPEG)
-- ? PIX_FMT_YUVJ420P
-- : PIX_FMT_YUV420P;
-+ ? AV_PIX_FMT_YUVJ420P
-+ : AV_PIX_FMT_YUV420P;
- pd->pre_encode_video = pre_encode_video_yuv420p;
- }
- break;
- case CODEC_YUV422:
- pd->tc_pix_fmt = TC_CODEC_YUV422P;
- pd->ff_vcontext.pix_fmt = (TC_VCODEC_ID(pd) == TC_CODEC_MJPEG)
-- ? PIX_FMT_YUVJ422P
-- : PIX_FMT_YUV422P;
-+ ? AV_PIX_FMT_YUVJ422P
-+ : AV_PIX_FMT_YUV422P;
- if (TC_VCODEC_ID(pd) == TC_CODEC_HUFFYUV) {
- pd->pre_encode_video = pre_encode_video_yuv422p_huffyuv;
- } else {
-@@ -634,10 +634,10 @@ static int tc_lavc_set_pix_fmt(TCLavcPri
- case CODEC_RGB:
- pd->tc_pix_fmt = TC_CODEC_RGB;
- pd->ff_vcontext.pix_fmt = (TC_VCODEC_ID(pd) == TC_CODEC_HUFFYUV)
-- ? PIX_FMT_YUV422P
-+ ? AV_PIX_FMT_YUV422P
- : (TC_VCODEC_ID(pd) == TC_CODEC_MJPEG)
-- ? PIX_FMT_YUVJ420P
-- : PIX_FMT_YUV420P;
-+ ? AV_PIX_FMT_YUVJ420P
-+ : AV_PIX_FMT_YUV420P;
- pd->pre_encode_video = pre_encode_video_rgb24;
- break;
- default:
-@@ -1390,7 +1390,7 @@ static int tc_lavc_configure(TCModuleIns
- /* FIXME: move into core? */
- TC_INIT_LIBAVCODEC;
-
-- avcodec_get_frame_defaults(&pd->ff_venc_frame);
-+ av_frame_unref(&pd->ff_venc_frame);
- /*
- * auxiliary config data needs to be blanked too
- * before any other operation
-@@ -1523,6 +1523,8 @@ static int tc_lavc_encode_video(TCModule
- vframe_list_t *outframe)
- {
- TCLavcPrivateData *pd = NULL;
-+ AVPacket pkt;
-+ int ret, got_packet = 0;
-
- TC_MODULE_SELF_CHECK(self, "encode_video");
-
-@@ -1537,12 +1539,15 @@ static int tc_lavc_encode_video(TCModule
-
- pd->pre_encode_video(pd, inframe);
-
-+ av_init_packet(&pkt);
-+ pkt.data = outframe->video_buf;
-+ pkt.size = inframe->video_size;
-+
- TC_LOCK_LIBAVCODEC;
-- outframe->video_len = avcodec_encode_video(&pd->ff_vcontext,
-- outframe->video_buf,
-- inframe->video_size,
-- &pd->ff_venc_frame);
-+ ret = avcodec_encode_video2(&pd->ff_vcontext, &pkt,
-+ &pd->ff_venc_frame, &got_packet);
- TC_UNLOCK_LIBAVCODEC;
-+ outframe->video_len = ret ? ret : pkt.size;
-
- if (outframe->video_len < 0) {
- tc_log_warn(MOD_NAME, "encoder error: size (%i)",
-Index: transcode-1.1.7/export/export_ffmpeg.c
-===================================================================
---- transcode-1.1.7.orig/export/export_ffmpeg.c
-+++ transcode-1.1.7/export/export_ffmpeg.c
-@@ -250,9 +250,9 @@ int opt_default(const char *opt, const c
- for(type=0; type<AVMEDIA_TYPE_NB && ret>= 0; type++){
- /* GLUE: +if */
- if (type == AVMEDIA_TYPE_VIDEO) {
-- const AVOption *o2 = av_find_opt(avcodec_opts[0], opt, NULL, opt_types[type], opt_types[type]);
-- if(o2)
-- ret = av_set_string3(avcodec_opts[type], opt, arg, 1, &o);
-+ o = av_opt_find(avcodec_opts[0], opt, NULL, opt_types[type], opt_types[type]);
-+ if(o)
-+ ret = av_opt_set(avcodec_opts[type], opt, arg, 0);
- /* GLUE: +if */
- }
- }
-@@ -267,7 +267,10 @@ int opt_default(const char *opt, const c
- if(opt[0] == 'a')
- ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_AUDIO], opt+1, arg, 1, &o);
- else */ if(opt[0] == 'v')
-- ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_VIDEO], opt+1, arg, 1, &o);
-+ {
-+ o = av_opt_find(avcodec_opts[AVMEDIA_TYPE_VIDEO], opt+1, NULL, 0, 0);
-+ ret = av_opt_set(avcodec_opts[AVMEDIA_TYPE_VIDEO], opt+1, arg, 0);
-+ }
- /* GLUE: disabling
- else if(opt[0] == 's')
- ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], opt+1, arg, 1, &o);
-@@ -487,10 +490,10 @@ MOD_init
- }
-
- lavc_venc_context = avcodec_alloc_context3(lavc_venc_codec);
-- lavc_venc_frame = avcodec_alloc_frame();
-+ lavc_venc_frame = av_frame_alloc();
-
-- lavc_convert_frame= avcodec_alloc_frame();
-- size = avpicture_get_size(PIX_FMT_RGB24, vob->ex_v_width, vob->ex_v_height);
-+ lavc_convert_frame= av_frame_alloc();
-+ size = avpicture_get_size(AV_PIX_FMT_RGB24, vob->ex_v_width, vob->ex_v_height);
- enc_buffer = tc_malloc(size);
-
- if (lavc_venc_context == NULL || !enc_buffer || !lavc_convert_frame) {
-@@ -1114,7 +1117,7 @@ MOD_init
- lavc_venc_context->prediction_method = lavc_param_prediction_method;
-
- if(is_huffyuv)
-- lavc_venc_context->pix_fmt = PIX_FMT_YUV422P;
-+ lavc_venc_context->pix_fmt = AV_PIX_FMT_YUV422P;
- else
- {
- switch(pix_fmt)
-@@ -1123,18 +1126,18 @@ MOD_init
- case CODEC_RGB:
- {
- if(is_mjpeg)
-- lavc_venc_context->pix_fmt = PIX_FMT_YUVJ420P;
-+ lavc_venc_context->pix_fmt = AV_PIX_FMT_YUVJ420P;
- else
-- lavc_venc_context->pix_fmt = PIX_FMT_YUV420P;
-+ lavc_venc_context->pix_fmt = AV_PIX_FMT_YUV420P;
- break;
- }
-
- case CODEC_YUV422:
- {
- if(is_mjpeg)
-- lavc_venc_context->pix_fmt = PIX_FMT_YUVJ422P;
-+ lavc_venc_context->pix_fmt = AV_PIX_FMT_YUVJ422P;
- else
-- lavc_venc_context->pix_fmt = PIX_FMT_YUV422P;
-+ lavc_venc_context->pix_fmt = AV_PIX_FMT_YUV422P;
- break;
- }
-
-@@ -1596,6 +1599,8 @@ MOD_encode
-
- int out_size;
- const char pict_type_char[5]= {'?', 'I', 'P', 'B', 'S'};
-+ AVPacket pkt;
-+ int ret, got_packet = 0;
-
- if (param->flag == TC_VIDEO) {
-
-@@ -1620,7 +1625,7 @@ MOD_encode
- YUV_INIT_PLANES(src, param->buffer, IMG_YUV_DEFAULT,
- lavc_venc_context->width, lavc_venc_context->height);
- avpicture_fill((AVPicture *)lavc_venc_frame, img_buffer,
-- PIX_FMT_YUV422P, lavc_venc_context->width,
-+ AV_PIX_FMT_YUV422P, lavc_venc_context->width,
- lavc_venc_context->height);
- /* FIXME: can't use tcv_convert (see decode_lavc.c) */
- ac_imgconvert(src, IMG_YUV_DEFAULT,
-@@ -1650,7 +1655,7 @@ MOD_encode
- lavc_venc_context->width,
- lavc_venc_context->height);
- avpicture_fill((AVPicture *)lavc_venc_frame, img_buffer,
-- PIX_FMT_YUV420P, lavc_venc_context->width,
-+ AV_PIX_FMT_YUV420P, lavc_venc_context->width,
- lavc_venc_context->height);
- ac_imgconvert(src, IMG_YUV422P,
- lavc_venc_frame->data, IMG_YUV420P,
-@@ -1661,7 +1666,7 @@ MOD_encode
-
- case CODEC_RGB:
- avpicture_fill((AVPicture *)lavc_venc_frame, img_buffer,
-- PIX_FMT_YUV420P, lavc_venc_context->width,
-+ AV_PIX_FMT_YUV420P, lavc_venc_context->width,
- lavc_venc_context->height);
- ac_imgconvert(&param->buffer, IMG_RGB_DEFAULT,
- lavc_venc_frame->data, IMG_YUV420P,
-@@ -1674,13 +1679,17 @@ MOD_encode
- return TC_EXPORT_ERROR;
- }
-
-+ av_init_packet(&pkt);
-+ pkt.data = enc_buffer;
-+ pkt.size = size;
-
- TC_LOCK_LIBAVCODEC;
-- out_size = avcodec_encode_video(lavc_venc_context,
-- enc_buffer, size,
-- lavc_venc_frame);
-+ ret = avcodec_encode_video2(lavc_venc_context, &pkt,
-+ lavc_venc_frame, &got_packet);
- TC_UNLOCK_LIBAVCODEC;
-
-+ out_size = ret ? ret : pkt.size;
-+
- if (out_size < 0) {
- tc_log_warn(MOD_NAME, "encoder error: size (%d)", out_size);
- return TC_EXPORT_ERROR;
-Index: transcode-1.1.7/import/decode_lavc.c
-===================================================================
---- transcode-1.1.7.orig/import/decode_lavc.c
-+++ transcode-1.1.7/import/decode_lavc.c
-@@ -327,8 +327,8 @@ void decode_lavc(decode_t *decode)
-
- // Convert avcodec image to the requested YUV or RGB format
- switch (lavc_dec_context->pix_fmt) {
-- case PIX_FMT_YUVJ420P:
-- case PIX_FMT_YUV420P:
-+ case AV_PIX_FMT_YUVJ420P:
-+ case AV_PIX_FMT_YUV420P:
- // Remove "dead space" at right edge of planes, if any
- if (picture.linesize[0] != lavc_dec_context->width) {
- int y;
-@@ -352,7 +352,7 @@ void decode_lavc(decode_t *decode)
- pix_fmt==TC_CODEC_YUV420P ? IMG_YUV420P : IMG_RGB_DEFAULT,
- lavc_dec_context->width, lavc_dec_context->height);
- break;
-- case PIX_FMT_YUV411P:
-+ case AV_PIX_FMT_YUV411P:
- if (picture.linesize[0] != lavc_dec_context->width) {
- int y;
- for (y = 0; y < lavc_dec_context->height; y++) {
-@@ -371,8 +371,8 @@ void decode_lavc(decode_t *decode)
- pix_fmt==TC_CODEC_YUV420P ? IMG_YUV420P : IMG_RGB_DEFAULT,
- lavc_dec_context->width, lavc_dec_context->height);
- break;
-- case PIX_FMT_YUVJ422P:
-- case PIX_FMT_YUV422P:
-+ case AV_PIX_FMT_YUVJ422P:
-+ case AV_PIX_FMT_YUV422P:
- if (picture.linesize[0] != lavc_dec_context->width) {
- int y;
- for (y = 0; y < lavc_dec_context->height; y++) {
-@@ -391,8 +391,8 @@ void decode_lavc(decode_t *decode)
- pix_fmt==TC_CODEC_YUV420P ? IMG_YUV420P : IMG_RGB_DEFAULT,
- lavc_dec_context->width, lavc_dec_context->height);
- break;
-- case PIX_FMT_YUVJ444P:
-- case PIX_FMT_YUV444P:
-+ case AV_PIX_FMT_YUVJ444P:
-+ case AV_PIX_FMT_YUV444P:
- if (picture.linesize[0] != lavc_dec_context->width) {
- int y;
- for (y = 0; y < lavc_dec_context->height; y++) {
-Index: transcode-1.1.7/import/import_ffmpeg.c
-===================================================================
---- transcode-1.1.7.orig/import/import_ffmpeg.c
-+++ transcode-1.1.7/import/import_ffmpeg.c
-@@ -661,8 +661,8 @@ retry:
-
- // Convert avcodec image to our internal YUV or RGB format
- switch (lavc_dec_context->pix_fmt) {
-- case PIX_FMT_YUVJ420P:
-- case PIX_FMT_YUV420P:
-+ case AV_PIX_FMT_YUVJ420P:
-+ case AV_PIX_FMT_YUV420P:
- src_fmt = IMG_YUV420P;
- YUV_INIT_PLANES(src_planes, frame, src_fmt,
- lavc_dec_context->width, lavc_dec_context->height);
-@@ -693,7 +693,7 @@ retry:
- }
- break;
-
-- case PIX_FMT_YUV411P:
-+ case AV_PIX_FMT_YUV411P:
- src_fmt = IMG_YUV411P;
- YUV_INIT_PLANES(src_planes, frame, src_fmt,
- lavc_dec_context->width, lavc_dec_context->height);
-@@ -721,8 +721,8 @@ retry:
- }
- break;
-
-- case PIX_FMT_YUVJ422P:
-- case PIX_FMT_YUV422P:
-+ case AV_PIX_FMT_YUVJ422P:
-+ case AV_PIX_FMT_YUV422P:
- src_fmt = IMG_YUV422P;
- YUV_INIT_PLANES(src_planes, frame, src_fmt,
- lavc_dec_context->width, lavc_dec_context->height);
-@@ -750,8 +750,8 @@ retry:
- }
- break;
-
-- case PIX_FMT_YUVJ444P:
-- case PIX_FMT_YUV444P:
-+ case AV_PIX_FMT_YUVJ444P:
-+ case AV_PIX_FMT_YUV444P:
- src_fmt = IMG_YUV444P;
- YUV_INIT_PLANES(src_planes, frame, src_fmt,
- lavc_dec_context->width, lavc_dec_context->height);
diff --git a/multimedia/transcode/transcode-1.1.7-ffmpeg4.patch b/multimedia/transcode/transcode-1.1.7-ffmpeg4.patch
deleted file mode 100644
index 9ad765e1c3..0000000000
--- a/multimedia/transcode/transcode-1.1.7-ffmpeg4.patch
+++ /dev/null
@@ -1,508 +0,0 @@
-Index: transcode-1.1.7/encode/encode_lavc.c
-===================================================================
---- transcode-1.1.7.orig/encode/encode_lavc.c
-+++ transcode-1.1.7/encode/encode_lavc.c
-@@ -77,6 +77,13 @@ struct tclavcconfigdata_ {
- int luma_elim_threshold;
- int chroma_elim_threshold;
- int quantizer_noise_shaping;
-+ int inter_quant_bias;
-+ int intra_quant_bias;
-+ int scenechange_factor;
-+ int rc_strategy;
-+ float rc_initial_cplx;
-+ float rc_qsquish;
-+ float border_masking;
-
- /* same as above for flags */
- struct {
-@@ -684,7 +691,7 @@ static int tc_lavc_init_multipass(TCLavc
- switch (vob->divxmultipass) {
- case 1:
- CAN_DO_MULTIPASS(multipass_flag);
-- pd->ff_vcontext.flags |= CODEC_FLAG_PASS1;
-+ pd->ff_vcontext.flags |= AV_CODEC_FLAG_PASS1;
- pd->stats_file = fopen(vob->divxlogfile, "w");
- if (pd->stats_file == NULL) {
- tc_log_error(MOD_NAME, "could not create 2pass log file"
-@@ -694,7 +701,7 @@ static int tc_lavc_init_multipass(TCLavc
- break;
- case 2:
- CAN_DO_MULTIPASS(multipass_flag);
-- pd->ff_vcontext.flags |= CODEC_FLAG_PASS2;
-+ pd->ff_vcontext.flags |= AV_CODEC_FLAG_PASS2;
- pd->stats_file = fopen(vob->divxlogfile, "r");
- if (pd->stats_file == NULL){
- tc_log_error(MOD_NAME, "could not open 2pass log file \"%s\""
-@@ -723,7 +730,7 @@ static int tc_lavc_init_multipass(TCLavc
- break;
- case 3:
- /* fixed qscale :p */
-- pd->ff_vcontext.flags |= CODEC_FLAG_QSCALE;
-+ pd->ff_vcontext.flags |= AV_CODEC_FLAG_QSCALE;
- pd->ff_venc_frame.quality = vob->divxbitrate;
- break;
- }
-@@ -970,7 +977,7 @@ static void tc_lavc_config_defaults(TCLa
- pd->confdata.rc_buffer_size = 0;
- pd->confdata.lmin = 2;
- pd->confdata.lmax = 31;
-- pd->confdata.me_method = ME_EPZS;
-+ pd->confdata.me_method = 0;
-
- memset(&pd->confdata.flags, 0, sizeof(pd->confdata.flags));
- pd->confdata.turbo_setup = 0;
-@@ -983,12 +990,12 @@ static void tc_lavc_config_defaults(TCLa
- pd->ff_vcontext.me_range = 0;
- pd->ff_vcontext.mb_decision = 0;
- pd->ff_vcontext.scenechange_threshold = 0;
-- pd->ff_vcontext.scenechange_factor = 1;
-+ pd->confdata.scenechange_factor = 1;
- pd->ff_vcontext.b_frame_strategy = 0;
- pd->ff_vcontext.b_sensitivity = 40;
- pd->ff_vcontext.brd_scale = 0;
- pd->ff_vcontext.bidir_refine = 0;
-- pd->ff_vcontext.rc_strategy = 2;
-+ pd->confdata.rc_strategy = 2;
- pd->ff_vcontext.b_quant_factor = 1.25;
- pd->ff_vcontext.i_quant_factor = 0.8;
- pd->ff_vcontext.b_quant_offset = 1.25;
-@@ -996,8 +1003,8 @@ static void tc_lavc_config_defaults(TCLa
- pd->ff_vcontext.qblur = 0.5;
- pd->ff_vcontext.qcompress = 0.5;
- pd->ff_vcontext.mpeg_quant = 0;
-- pd->ff_vcontext.rc_initial_cplx = 0.0;
-- pd->ff_vcontext.rc_qsquish = 1.0;
-+ pd->confdata.rc_initial_cplx = 0.0;
-+ pd->confdata.rc_qsquish = 1.0;
- pd->confdata.luma_elim_threshold = 0;
- pd->confdata.chroma_elim_threshold = 0;
- pd->ff_vcontext.strict_std_compliance = 0;
-@@ -1008,7 +1015,7 @@ static void tc_lavc_config_defaults(TCLa
- pd->ff_vcontext.temporal_cplx_masking = 0.0;
- pd->ff_vcontext.spatial_cplx_masking = 0.0;
- pd->ff_vcontext.p_masking = 0.0;
-- pd->ff_vcontext.border_masking = 0.0;
-+ pd->confdata.border_masking = 0.0;
- pd->ff_vcontext.me_pre_cmp = 0;
- pd->ff_vcontext.me_cmp = 0;
- pd->ff_vcontext.me_sub_cmp = 0;
-@@ -1020,8 +1027,6 @@ static void tc_lavc_config_defaults(TCLa
- pd->ff_vcontext.pre_me = 1;
- pd->ff_vcontext.me_subpel_quality = 8;
- pd->ff_vcontext.refs = 1;
-- pd->ff_vcontext.intra_quant_bias = FF_DEFAULT_QUANT_BIAS;
-- pd->ff_vcontext.inter_quant_bias = FF_DEFAULT_QUANT_BIAS;
- pd->ff_vcontext.noise_reduction = 0;
- pd->confdata.quantizer_noise_shaping = 0;
- pd->ff_vcontext.flags = 0;
-@@ -1044,19 +1049,19 @@ static void tc_lavc_config_defaults(TCLa
- */
- static void tc_lavc_dispatch_settings(TCLavcPrivateData *pd)
- {
-+ char buf[1024];
- /* some translation... */
- pd->ff_vcontext.bit_rate_tolerance = pd->confdata.vrate_tolerance * 1000;
- pd->ff_vcontext.rc_min_rate = pd->confdata.rc_min_rate * 1000;
- pd->ff_vcontext.rc_max_rate = pd->confdata.rc_max_rate * 1000;
- pd->ff_vcontext.rc_buffer_size = pd->confdata.rc_buffer_size * 1024;
-- pd->ff_vcontext.lmin = (int)(FF_QP2LAMBDA * pd->confdata.lmin + 0.5);
-- pd->ff_vcontext.lmax = (int)(FF_QP2LAMBDA * pd->confdata.lmax + 0.5);
-- pd->ff_vcontext.me_method = ME_ZERO + pd->confdata.me_method;
-+ snprintf(buf, sizeof(buf), "%i", (int)(FF_QP2LAMBDA * pd->confdata.lmin + 0.5));
-+ av_dict_set(&(pd->ff_opts), "lmin", buf, 0);
-+ snprintf(buf, sizeof(buf), "%i", (int)(FF_QP2LAMBDA * pd->confdata.lmax + 0.5));
-+ av_dict_set(&(pd->ff_opts), "lmax", buf, 0);
-
- pd->ff_vcontext.flags = 0;
-- SET_FLAG(pd, mv0);
- SET_FLAG(pd, qpel);
-- SET_FLAG(pd, naq);
- SET_FLAG(pd, ilme);
- SET_FLAG(pd, ildct);
- SET_FLAG(pd, aic);
-@@ -1077,8 +1082,8 @@ static void tc_lavc_dispatch_settings(TC
- }
- if (pd->interlacing.active) {
- /* enforce interlacing */
-- pd->ff_vcontext.flags |= CODEC_FLAG_INTERLACED_DCT;
-- pd->ff_vcontext.flags |= CODEC_FLAG_INTERLACED_ME;
-+ pd->ff_vcontext.flags |= AV_CODEC_FLAG_INTERLACED_DCT;
-+ pd->ff_vcontext.flags |= AV_CODEC_FLAG_INTERLACED_ME;
- }
- if (pd->confdata.flags.alt) {
- av_dict_set(&(pd->ff_opts), "alternate_scan", "1", 0);
-@@ -1095,15 +1100,31 @@ static void tc_lavc_dispatch_settings(TC
- if (pd->confdata.flags.cbp) {
- av_dict_set(&(pd->ff_opts), "mpv_flags", "+cbp_rd", 0);
- }
-+ if (pd->confdata.flags.mv0) {
-+ av_dict_set(&(pd->ff_opts), "mpv_flags", "+mv0", 0);
-+ }
-+ if (pd->confdata.flags.naq) {
-+ av_dict_set(&(pd->ff_opts), "mpv_flags", "+naq", 0);
-+ }
-
-- char buf[1024];
- #define set_dict_opt(val, opt) \
- snprintf(buf, sizeof(buf), "%i", pd->confdata.val);\
- av_dict_set(&(pd->ff_opts), opt, buf, 0)
-+#define set_dict_float_opt(val, opt) \
-+ snprintf(buf, sizeof(buf), "%f", pd->confdata.val);\
-+ av_dict_set(&(pd->ff_opts), opt, buf, 0)
-
- set_dict_opt(luma_elim_threshold, "luma_elim_threshold");
- set_dict_opt(chroma_elim_threshold, "chroma_elim_threshold");
- set_dict_opt(quantizer_noise_shaping, "quantizer_noise_shaping");
-+ set_dict_opt(inter_quant_bias, "pbias");
-+ set_dict_opt(intra_quant_bias, "ibias");
-+ set_dict_opt(me_method, "me_method");
-+ set_dict_opt(scenechange_factor, "sc_factor");
-+ set_dict_opt(rc_strategy, "rc_strategy");
-+ set_dict_float_opt(rc_initial_cplx, "rc_init_cplx");
-+ set_dict_float_opt(rc_qsquish, "qsquish");
-+ set_dict_float_opt(border_masking, "border_mask");
- }
-
- #undef SET_FLAG
-@@ -1159,12 +1180,12 @@ static int tc_lavc_read_config(TCLavcPri
- { "lmin", PAUX(lmin), TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, 0.01, 255.0 },
- { "lmax", PAUX(lmax), TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, 0.01, 255.0 },
- { "vqdiff", PCTX(max_qdiff), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 1, 31 },
-- { "vmax_b_frames", PCTX(max_b_frames), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, FF_MAX_B_FRAMES },
-+ { "vmax_b_frames", PCTX(max_b_frames), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, INT_MAX },
- { "vme", PAUX(me_method), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 16, },
- { "me_range", PCTX(me_range), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 16000 },
- { "mbd", PCTX(mb_decision), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 3 },
- { "sc_threshold", PCTX(scenechange_threshold), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -1000000, 1000000 },
-- { "sc_factor", PCTX(scenechange_factor), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 1, 16 },
-+ { "sc_factor", PAUX(scenechange_factor), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 1, 16 },
- { "vb_strategy", PCTX(b_frame_strategy), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 10 },
- { "b_sensitivity", PCTX(b_sensitivity), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 1, 100 },
- { "brd_scale", PCTX(brd_scale), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 10 },
-@@ -1175,7 +1196,7 @@ static int tc_lavc_read_config(TCLavcPri
- { "vrc_maxrate", PAUX(rc_max_rate), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 24000000 },
- { "vrc_minrate", PAUX(rc_min_rate), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 24000000 },
- { "vrc_buf_size", PAUX(rc_buffer_size), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 4, 24000000 },
-- { "vrc_strategy", PCTX(rc_strategy), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 2 },
-+ { "vrc_strategy", PAUX(rc_strategy), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 2 },
- { "vb_qfactor", PCTX(b_quant_factor), TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, -31.0, 31.0 },
- { "vi_qfactor", PCTX(i_quant_factor), TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, -31.0, 31.0 },
- { "vb_qoffset", PCTX(b_quant_offset), TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, 0.0, 31.0 },
-@@ -1185,9 +1206,9 @@ static int tc_lavc_read_config(TCLavcPri
- { "mpeg_quant", PCTX(mpeg_quant), TCCONF_TYPE_FLAG, 0, 0, 1 },
- // { "vrc_eq", }, // not yet supported
- { "vrc_override", rc_override_buf, TCCONF_TYPE_STRING, 0, 0, 0 },
-- { "vrc_init_cplx", PCTX(rc_initial_cplx), TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, 0.0, 9999999.0 },
-+ { "vrc_init_cplx", PAUX(rc_initial_cplx), TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, 0.0, 9999999.0 },
- // { "vrc_init_occupancy", }, // not yet supported
-- { "vqsquish", PCTX(rc_qsquish), TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, 0.0, 99.0 },
-+ { "vqsquish", PAUX(rc_qsquish), TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, 0.0, 99.0 },
- { "vlelim", PAUX(luma_elim_threshold), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -99, 99 },
- { "vcelim", PAUX(chroma_elim_threshold), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -99, 99 },
- { "vstrict", PCTX(strict_std_compliance), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -99, 99 },
-@@ -1199,7 +1220,7 @@ static int tc_lavc_read_config(TCLavcPri
- { "tcplx_mask", PCTX(temporal_cplx_masking), TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, 0.0, 1.0 },
- { "scplx_mask", PCTX(spatial_cplx_masking), TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, 0.0, 1.0 },
- { "p_mask", PCTX(p_masking), TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, 0.0, 1.0 },
-- { "border_mask", PCTX(border_masking), TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, 0.0, 1.0 },
-+ { "border_mask", PAUX(border_masking), TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, 0.0, 1.0 },
- { "pred", PCTX(prediction_method), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 4 },
- { "precmp", PCTX(me_pre_cmp), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 2000 },
- { "cmp", PCTX(me_cmp), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 2000 },
-@@ -1212,37 +1233,37 @@ static int tc_lavc_read_config(TCLavcPri
- { "pre_me", PCTX(pre_me), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 2000},
- { "subq", PCTX(me_subpel_quality), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 8 },
- { "refs", PCTX(refs), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 1, 8 },
-- { "ibias", PCTX(intra_quant_bias), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -512, 512 },
-- { "pbias", PCTX(inter_quant_bias), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -512, 512 },
-+ { "ibias", PAUX(intra_quant_bias), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -512, 512 },
-+ { "pbias", PAUX(inter_quant_bias), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -512, 512 },
- { "nr", PCTX(noise_reduction), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 1000000},
- { "qns", PAUX(quantizer_noise_shaping), TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 3 },
- { "inter_matrix_file", inter_matrix_file, TCCONF_TYPE_STRING, 0, 0, 0 },
- { "intra_matrix_file", intra_matrix_file, TCCONF_TYPE_STRING, 0, 0, 0 },
-
-- { "mv0", PAUX(flags.mv0), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_MV0 },
-+ { "mv0", PAUX(flags.mv0), TCCONF_TYPE_FLAG, 0, 0, 1 },
- { "cbp", PAUX(flags.cbp), TCCONF_TYPE_FLAG, 0, 0, 1 },
-- { "qpel", PAUX(flags.qpel), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_QPEL },
-+ { "qpel", PAUX(flags.qpel), TCCONF_TYPE_FLAG, 0, 0, AV_CODEC_FLAG_QPEL },
- { "alt", PAUX(flags.alt), TCCONF_TYPE_FLAG, 0, 0, 1 },
-- { "ilme", PAUX(flags.ilme), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_INTERLACED_ME },
-- { "ildct", PAUX(flags.ildct), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_INTERLACED_DCT },
-- { "naq", PAUX(flags.naq), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_NORMALIZE_AQP },
-+ { "ilme", PAUX(flags.ilme), TCCONF_TYPE_FLAG, 0, 0, AV_CODEC_FLAG_INTERLACED_ME },
-+ { "ildct", PAUX(flags.ildct), TCCONF_TYPE_FLAG, 0, 0, AV_CODEC_FLAG_INTERLACED_DCT },
-+ { "naq", PAUX(flags.naq), TCCONF_TYPE_FLAG, 0, 0, 1 },
- { "vdpart", PAUX(flags.vdpart), TCCONF_TYPE_FLAG, 0, 0, 1 },
- #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
- { "aic", PAUX(flags.aic), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_H263P_AIC },
- #else
-- { "aic", PAUX(flags.aic), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_AC_PRED },
-+ { "aic", PAUX(flags.aic), TCCONF_TYPE_FLAG, 0, 0, AV_CODEC_FLAG_AC_PRED },
- #endif
- { "aiv", PAUX(flags.aiv), TCCONF_TYPE_FLAG, 0, 0, 1 },
- { "umv", PAUX(flags.umv), TCCONF_TYPE_FLAG, 0, 0, 1 },
-- { "psnr", PAUX(flags.psnr), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_PSNR },
-+ { "psnr", PAUX(flags.psnr), TCCONF_TYPE_FLAG, 0, 0, AV_CODEC_FLAG_PSNR },
- #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
- { "trell", PAUX(flags.trell), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_TRELLIS_QUANT },
- #else
- { "trell", PCTX(trellis), TCCONF_TYPE_FLAG, 0, 0, 1 },
- #endif
-- { "gray", PAUX(flags.gray), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_GRAY },
-- { "v4mv", PAUX(flags.v4mv), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_4MV },
-- { "closedgop", PAUX(flags.closedgop), TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_CLOSED_GOP },
-+ { "gray", PAUX(flags.gray), TCCONF_TYPE_FLAG, 0, 0, AV_CODEC_FLAG_GRAY },
-+ { "v4mv", PAUX(flags.v4mv), TCCONF_TYPE_FLAG, 0, 0, AV_CODEC_FLAG_4MV },
-+ { "closedgop", PAUX(flags.closedgop), TCCONF_TYPE_FLAG, 0, 0, AV_CODEC_FLAG_CLOSED_GOP },
-
- // { "turbo", PAUX(turbo_setup), TCCONF_TYPE_FLAG, 0, 0, 1 }, // not yet supported
- /* End of the config file */
-Index: transcode-1.1.7/export/export_ffmpeg.c
-===================================================================
---- transcode-1.1.7.orig/export/export_ffmpeg.c
-+++ transcode-1.1.7/export/export_ffmpeg.c
-@@ -831,14 +831,11 @@ MOD_init
-
- lavc_venc_context->bit_rate = vob->divxbitrate * 1000;
- lavc_venc_context->bit_rate_tolerance = lavc_param_vrate_tolerance * 1000;
-- lavc_venc_context->lmin= (int)(FF_QP2LAMBDA * lavc_param_lmin + 0.5);
-- lavc_venc_context->lmax= (int)(FF_QP2LAMBDA * lavc_param_lmax + 0.5);
- lavc_venc_context->max_qdiff = lavc_param_vqdiff;
- lavc_venc_context->qcompress = lavc_param_vqcompress;
- lavc_venc_context->qblur = lavc_param_vqblur;
- lavc_venc_context->max_b_frames = lavc_param_vmax_b_frames;
- lavc_venc_context->b_quant_factor = lavc_param_vb_qfactor;
-- lavc_venc_context->rc_strategy = lavc_param_vrc_strategy;
- lavc_venc_context->b_frame_strategy = lavc_param_vb_strategy;
- lavc_venc_context->b_quant_offset = lavc_param_vb_qoffset;
-
-@@ -846,8 +843,23 @@ MOD_init
- #define set_dict_opt(val, opt) \
- snprintf(buf, sizeof(buf), "%i", val); \
- av_dict_set(&lavc_venc_opts, opt, buf, 0)
-+#define set_dict_float_opt(val, opt) \
-+ snprintf(buf, sizeof(buf), "%f", val); \
-+ av_dict_set(&lavc_venc_opts, opt, buf, 0)
- set_dict_opt(lavc_param_luma_elim_threshold, "luma_elim_threshold");
- set_dict_opt(lavc_param_chroma_elim_threshold, "chroma_elim_threshold");
-+ set_dict_opt((int)(FF_QP2LAMBDA * lavc_param_lmin + 0.5), "lmin");
-+ set_dict_opt((int)(FF_QP2LAMBDA * lavc_param_lmax + 0.5), "lmax");
-+ set_dict_opt(lavc_param_vrc_strategy, "rc_strategy");
-+ set_dict_float_opt(lavc_param_rc_qsquish, "qsquish");
-+ set_dict_float_opt(lavc_param_rc_qmod_amp, "rc_qmod_amp");
-+ set_dict_opt(lavc_param_rc_qmod_freq, "rc_qmod_freq");
-+ set_dict_opt(lavc_param_rc_eq, "rc_eq");
-+ set_dict_opt(lavc_param_vme, "me_method");
-+ set_dict_opt(lavc_param_ibias, "ibias");
-+ set_dict_opt(lavc_param_pbias, "pbias");
-+ set_dict_float_opt(lavc_param_rc_buffer_aggressivity, "rc_buf_aggressivity");
-+ set_dict_float_opt(lavc_param_rc_initial_cplx, "rc_init_cplx");
- lavc_venc_context->rtp_payload_size = lavc_param_packet_size;
- #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
- if (lavc_param_packet_size)
-@@ -856,15 +868,9 @@ MOD_init
- lavc_venc_context->strict_std_compliance= lavc_param_strict;
- lavc_venc_context->i_quant_factor = lavc_param_vi_qfactor;
- lavc_venc_context->i_quant_offset = lavc_param_vi_qoffset;
-- lavc_venc_context->rc_qsquish = lavc_param_rc_qsquish;
-- lavc_venc_context->rc_qmod_amp = lavc_param_rc_qmod_amp;
-- lavc_venc_context->rc_qmod_freq = lavc_param_rc_qmod_freq;
-- lavc_venc_context->rc_eq = lavc_param_rc_eq;
- lavc_venc_context->rc_max_rate = lavc_param_rc_max_rate * 1000;
- lavc_venc_context->rc_min_rate = lavc_param_rc_min_rate * 1000;
- lavc_venc_context->rc_buffer_size = lavc_param_rc_buffer_size * 1024;
-- lavc_venc_context->rc_buffer_aggressivity= lavc_param_rc_buffer_aggressivity;
-- lavc_venc_context->rc_initial_cplx = lavc_param_rc_initial_cplx;
- lavc_venc_context->debug = lavc_param_debug;
- lavc_venc_context->last_predictor_count= lavc_param_last_pred;
- lavc_venc_context->pre_me = lavc_param_pre_me;
-@@ -872,8 +878,6 @@ MOD_init
- lavc_venc_context->pre_dia_size = lavc_param_pre_dia_size;
- lavc_venc_context->me_subpel_quality = lavc_param_me_subpel_quality;
- lavc_venc_context->me_range = lavc_param_me_range;
-- lavc_venc_context->intra_quant_bias = lavc_param_ibias;
-- lavc_venc_context->inter_quant_bias = lavc_param_pbias;
- lavc_venc_context->coder_type = lavc_param_coder;
- lavc_venc_context->context_model = lavc_param_context;
- lavc_venc_context->scenechange_threshold= lavc_param_sc_threshold;
-@@ -1079,6 +1083,8 @@ MOD_init
- lavc_venc_context->flags |= lavc_param_mv0;
- if(lavc_param_qp_rd)
- av_dict_set(&lavc_venc_opts, "mpv_flags", "+qp_rd", 0);
-+ if (lavc_param_normalize_aqp)
-+ av_dict_set(&lavc_venc_opts, "mpv_flags", "+naq", 0);
- lavc_venc_context->flags |= lavc_param_ilme;
- #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
- lavc_venc_context->flags |= lavc_param_trell;
-@@ -1087,9 +1093,7 @@ MOD_init
- #endif
-
- if (lavc_param_gray)
-- lavc_venc_context->flags |= CODEC_FLAG_GRAY;
-- if (lavc_param_normalize_aqp)
-- lavc_venc_context->flags |= CODEC_FLAG_NORMALIZE_AQP;
-+ lavc_venc_context->flags |= AV_CODEC_FLAG_GRAY;
-
- switch(vob->encode_fields) {
- case TC_ENCODE_FIELDS_TOP_FIRST:
-@@ -1107,9 +1111,9 @@ MOD_init
- }
-
- lavc_venc_context->flags |= interlacing_active ?
-- CODEC_FLAG_INTERLACED_DCT : 0;
-+ AV_CODEC_FLAG_INTERLACED_DCT : 0;
- lavc_venc_context->flags |= interlacing_active ?
-- CODEC_FLAG_INTERLACED_ME : 0;
-+ AV_CODEC_FLAG_INTERLACED_ME : 0;
-
- lavc_venc_context->flags |= lavc_param_psnr;
- do_psnr = lavc_param_psnr;
-@@ -1156,7 +1160,7 @@ MOD_init
- "encoding.");
- return TC_EXPORT_ERROR;
- }
-- lavc_venc_context->flags |= CODEC_FLAG_PASS1;
-+ lavc_venc_context->flags |= AV_CODEC_FLAG_PASS1;
- stats_file = fopen(vob->divxlogfile, "w");
- if (stats_file == NULL){
- tc_log_warn(MOD_NAME, "Could not create 2pass log file \"%s\".",
-@@ -1170,7 +1174,7 @@ MOD_init
- "encoding.");
- return TC_EXPORT_ERROR;
- }
-- lavc_venc_context->flags |= CODEC_FLAG_PASS2;
-+ lavc_venc_context->flags |= AV_CODEC_FLAG_PASS2;
- stats_file= fopen(vob->divxlogfile, "r");
- if (stats_file==NULL){
- tc_log_warn(MOD_NAME, "Could not open 2pass log file \"%s\" for "
-@@ -1201,12 +1205,11 @@ MOD_init
- break;
- case 3:
- /* fixed qscale :p */
-- lavc_venc_context->flags |= CODEC_FLAG_QSCALE;
-+ lavc_venc_context->flags |= AV_CODEC_FLAG_QSCALE;
- lavc_venc_frame->quality = vob->divxbitrate;
- break;
- }
-
-- lavc_venc_context->me_method = ME_ZERO + lavc_param_vme;
-
- /* FIXME: transcode itself contains "broken ffmpeg default settings", thus we need to override them! */
- if (lavc_param_video_preset && strcmp(lavc_param_video_preset, "none")) {
-Index: transcode-1.1.7/export/ffmpeg_cfg.c
-===================================================================
---- transcode-1.1.7.orig/export/ffmpeg_cfg.c
-+++ transcode-1.1.7/export/ffmpeg_cfg.c
-@@ -93,8 +93,8 @@ int lavc_param_last_pred= 0;
- int lavc_param_pre_me= 1;
- int lavc_param_me_subpel_quality= 8;
- int lavc_param_me_range=0;
--int lavc_param_ibias=FF_DEFAULT_QUANT_BIAS;
--int lavc_param_pbias=FF_DEFAULT_QUANT_BIAS;
-+int lavc_param_ibias=0;
-+int lavc_param_pbias=0;
- int lavc_param_coder=0;
- int lavc_param_context=0;
- char *lavc_param_intra_matrix = NULL;
-@@ -136,7 +136,7 @@ TCConfigEntry lavcopts_conf[]={
- {"vratetol", &lavc_param_vrate_tolerance, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 4, 24000000},
- {"vhq", &lavc_param_mb_decision, TCCONF_TYPE_FLAG, 0, 0, 1},
- {"mbd", &lavc_param_mb_decision, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 9},
-- {"v4mv", &lavc_param_v4mv, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_4MV},
-+ {"v4mv", &lavc_param_v4mv, TCCONF_TYPE_FLAG, 0, 0, AV_CODEC_FLAG_4MV},
- {"vme", &lavc_param_vme, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 5},
- // {"vqscale", &lavc_param_vqscale, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 1, 31},
- // {"vqmin", &lavc_param_vqmin, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 1, 31},
-@@ -147,7 +147,7 @@ TCConfigEntry lavcopts_conf[]={
- {"vqcomp", &lavc_param_vqcompress, TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, 0.0, 1.0},
- {"vqblur", &lavc_param_vqblur, TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, 0.0, 1.0},
- {"vb_qfactor", &lavc_param_vb_qfactor, TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, -31.0, 31.0},
-- {"vmax_b_frames", &lavc_param_vmax_b_frames, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, FF_MAX_B_FRAMES},
-+ {"vmax_b_frames", &lavc_param_vmax_b_frames, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, INT_MAX},
- // {"vpass", &lavc_param_vpass, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 2},
- {"vrc_strategy", &lavc_param_vrc_strategy, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 2},
- {"vb_strategy", &lavc_param_vb_strategy, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 10},
-@@ -158,7 +158,7 @@ TCConfigEntry lavcopts_conf[]={
- {"vstrict", &lavc_param_strict, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -99, 99},
- {"vdpart", &lavc_param_data_partitioning, TCCONF_TYPE_FLAG, 0, 0, 1},
- // {"keyint", &lavc_param_keyint, TCCONF_TYPE_INT, 0, 0, 0},
-- {"gray", &lavc_param_gray, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_GRAY},
-+ {"gray", &lavc_param_gray, TCCONF_TYPE_FLAG, 0, 0, AV_CODEC_FLAG_GRAY},
- {"mpeg_quant", &lavc_param_mpeg_quant, TCCONF_TYPE_FLAG, 0, 0, 1},
- {"vi_qfactor", &lavc_param_vi_qfactor, TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, -31.0, 31.0},
- {"vi_qoffset", &lavc_param_vi_qoffset, TCCONF_TYPE_FLOAT, TCCONF_FLAG_RANGE, 0.0, 31.0},
-@@ -184,7 +184,7 @@ TCConfigEntry lavcopts_conf[]={
- {"pred", &lavc_param_prediction_method, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 20},
- {"format", &lavc_param_format, TCCONF_TYPE_STRING, 0, 0, 0},
- {"debug", &lavc_param_debug, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 100000000},
-- {"psnr", &lavc_param_psnr, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_PSNR},
-+ {"psnr", &lavc_param_psnr, TCCONF_TYPE_FLAG, 0, 0, AV_CODEC_FLAG_PSNR},
- {"precmp", &lavc_param_me_pre_cmp, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 2000},
- {"cmp", &lavc_param_me_cmp, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 2000},
- {"subcmp", &lavc_param_me_sub_cmp, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 2000},
-@@ -192,9 +192,9 @@ TCConfigEntry lavcopts_conf[]={
- {"ildctcmp", &lavc_param_ildct_cmp, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 2000},
- {"predia", &lavc_param_pre_dia_size, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -2000, 2000},
- {"dia", &lavc_param_dia_size, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -2000, 2000},
-- {"qpel", &lavc_param_qpel, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_QPEL},
-+ {"qpel", &lavc_param_qpel, TCCONF_TYPE_FLAG, 0, 0, AV_CODEC_FLAG_QPEL},
- #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
-- {"trell", &lavc_param_trell, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_TRELLIS_QUANT},
-+ {"trell", &lavc_param_trell, TCCONF_TYPE_FLAG, 0, 0, AV_CODEC_FLAG_TRELLIS_QUANT},
- #else
- {"trell", &lavc_param_trell, TCCONF_TYPE_FLAG, 0, 0, 1},
- #endif
-@@ -203,9 +203,9 @@ TCConfigEntry lavcopts_conf[]={
- {"subq", &lavc_param_me_subpel_quality, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 8},
- {"me_range", &lavc_param_me_range, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 16000},
- #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
-- {"aic", &lavc_param_aic, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_H263P_AIC},
-+ {"aic", &lavc_param_aic, TCCONF_TYPE_FLAG, 0, 0, AV_CODEC_FLAG_H263P_AIC},
- #else
-- {"aic", &lavc_param_aic, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_AC_PRED},
-+ {"aic", &lavc_param_aic, TCCONF_TYPE_FLAG, 0, 0, AV_CODEC_FLAG_AC_PRED},
- #endif
- {"umv", &lavc_param_umv, TCCONF_TYPE_FLAG, 0, 0, 1},
- {"ibias", &lavc_param_ibias, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -512, 512},
-@@ -215,20 +215,20 @@ TCConfigEntry lavcopts_conf[]={
- {"intra_matrix", &lavc_param_intra_matrix, TCCONF_TYPE_STRING, 0, 0, 0},
- {"inter_matrix", &lavc_param_inter_matrix, TCCONF_TYPE_STRING, 0, 0, 0},
- {"cbp", &lavc_param_cbp, TCCONF_TYPE_FLAG, 0, 0, 1},
-- {"mv0", &lavc_param_mv0, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_MV0},
-+ {"mv0", &lavc_param_mv0, TCCONF_TYPE_FLAG, 0, 0, 1},
- {"nr", &lavc_param_noise_reduction, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 1000000},
- {"qprd", &lavc_param_qp_rd, TCCONF_TYPE_FLAG, 0, 0, 1},
- {"threads", &lavc_param_threads, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 1, 16},
- {"ss", &lavc_param_ss, TCCONF_TYPE_FLAG, 0, 0, 1},
- {"svcd_sof", &lavc_param_scan_offset, TCCONF_TYPE_FLAG, 0, 0, 1},
- {"alt", &lavc_param_alt, TCCONF_TYPE_FLAG, 0, 0, 1},
-- {"ilme", &lavc_param_ilme, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_INTERLACED_ME},
-+ {"ilme", &lavc_param_ilme, TCCONF_TYPE_FLAG, 0, 0, AV_CODEC_FLAG_INTERLACED_ME},
- {"inter_threshold", &lavc_param_inter_threshold, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -1000000, 1000000},
- {"sc_threshold", &lavc_param_sc_threshold, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -1000000, 1000000},
- {"top", &lavc_param_top, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, -1, 1},
-- {"gmc", &lavc_param_gmc, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_GMC},
-- {"trunc", &lavc_param_trunc, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_TRUNCATED},
-- {"closedgop", &lavc_param_closedgop, TCCONF_TYPE_FLAG, 0, 0, CODEC_FLAG_CLOSED_GOP},
-+ {"gmc", &lavc_param_gmc, TCCONF_TYPE_FLAG, 0, 0, 1},
-+ {"trunc", &lavc_param_trunc, TCCONF_TYPE_FLAG, 0, 0, AV_CODEC_FLAG_TRUNCATED},
-+ {"closedgop", &lavc_param_closedgop, TCCONF_TYPE_FLAG, 0, 0, AV_CODEC_FLAG_CLOSED_GOP},
- {"intra_dc_precision", &lavc_param_intra_dc_precision, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 16},
- {"skip_top", &lavc_param_skip_top, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 1000},
- {"skip_bottom", &lavc_param_skip_bottom, TCCONF_TYPE_INT, TCCONF_FLAG_RANGE, 0, 1000},
-Index: transcode-1.1.7/import/import_ffmpeg.c
-===================================================================
---- transcode-1.1.7.orig/import/import_ffmpeg.c
-+++ transcode-1.1.7/import/import_ffmpeg.c
-@@ -361,7 +361,7 @@ do_avi:
- lavc_dec_context->width = x_dim;
- lavc_dec_context->height = y_dim;
-
-- if (vob->decolor) lavc_dec_context->flags |= CODEC_FLAG_GRAY;
-+ if (vob->decolor) lavc_dec_context->flags |= AV_CODEC_FLAG_GRAY;
- #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
- lavc_dec_context->error_resilience = 2;
- #else
diff --git a/multimedia/transcode/transcode-1.1.7-libav-10.patch b/multimedia/transcode/transcode-1.1.7-libav-10.patch
deleted file mode 100644
index 1f4a24039d..0000000000
--- a/multimedia/transcode/transcode-1.1.7-libav-10.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-fix building w/libav-10
-
-https://wiki.libav.org/Migration/10
-
---- a/filter/filter_resample.c
-+++ b/filter/filter_resample.c
-@@ -37,6 +37,7 @@
- #include "libtc/optstr.h"
- #include "libtc/tcavcodec.h"
- #include "libtc/tcmodule-plugin.h"
-+#include <libavresample/avresample.h>
-
-
- typedef struct {
-@@ -45,7 +46,7 @@ typedef struct {
-
- int bytes_per_sample;
-
-- ReSampleContext *resample_ctx;
-+ AVAudioResampleContext *resample_ctx;
- } ResamplePrivateData;
-
- static const char resample_help[] = ""
---- a/import/probe_ffmpeg.c
-+++ b/import/probe_ffmpeg.c
-@@ -51,8 +51,8 @@ static void translate_info(const AVFormatContext *ctx, ProbeInfo *info)
- info->bitrate = st->codec->bit_rate / 1000;
- info->width = st->codec->width;
- info->height = st->codec->height;
-- if (st->r_frame_rate.num > 0 && st->r_frame_rate.den > 0) {
-- info->fps = av_q2d(st->r_frame_rate);
-+ if (st->avg_frame_rate.num > 0 && st->avg_frame_rate.den > 0) {
-+ info->fps = av_q2d(st->avg_frame_rate);
- } else {
- /* watch out here */
- info->fps = 1.0/av_q2d(st->codec->time_base);
diff --git a/multimedia/transcode/transcode-1.1.7-libav-9.patch b/multimedia/transcode/transcode-1.1.7-libav-9.patch
deleted file mode 100644
index 3989d3d83a..0000000000
--- a/multimedia/transcode/transcode-1.1.7-libav-9.patch
+++ /dev/null
@@ -1,31 +0,0 @@
---- import/probe_ffmpeg.c.original 2013-04-22 20:04:51.058081388 +0200
-+++ import/probe_ffmpeg.c 2013-04-22 20:05:25.744081897 +0200
-@@ -109,7 +109,7 @@ void probe_ffmpeg(info_t *ipipe)
- return;
- }
-
-- ret = av_find_stream_info(lavf_dmx_context);
-+ ret = avformat_find_stream_info(lavf_dmx_context, NULL);
- if (ret < 0) {
- tc_log_error(__FILE__, "unable to fetch informations from '%s'"
- " (libavformat failure)",
---- import/decode_lavc.c.original 2013-04-22 20:06:17.260082652 +0200
-+++ import/decode_lavc.c 2013-04-22 20:07:47.564083975 +0200
-@@ -170,7 +170,7 @@ void decode_lavc(decode_t *decode)
-
- // Set these to the expected values so that ffmpeg's decoder can
- // properly detect interlaced input.
-- lavc_dec_context = avcodec_alloc_context();
-+ lavc_dec_context = avcodec_alloc_context3(NULL);
- if (lavc_dec_context == NULL) {
- tc_log_error(__FILE__, "Could not allocate enough memory.");
- goto decoder_error;
-@@ -186,7 +186,7 @@ void decode_lavc(decode_t *decode)
- lavc_dec_context->error_concealment = 3;
- lavc_dec_context->workaround_bugs = FF_BUG_AUTODETECT;
-
-- if (avcodec_open(lavc_dec_context, lavc_dec_codec) < 0) {
-+ if (avcodec_open2(lavc_dec_context, lavc_dec_codec, NULL) < 0) {
- tc_log_error(__FILE__, "Could not initialize the '%s' codec.",
- codec->name);
- goto decoder_error;
diff --git a/multimedia/transcode/transcode-1.1.7-preset-force.patch b/multimedia/transcode/transcode-1.1.7-preset-force.patch
deleted file mode 100644
index 0d1da8b4f6..0000000000
--- a/multimedia/transcode/transcode-1.1.7-preset-force.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-Do not force using a preset. Do not try to open non-existant preset by default.
-
-Index: transcode-1.1.7/export/export_ffmpeg.c
-===================================================================
---- transcode-1.1.7.orig/export/export_ffmpeg.c
-+++ transcode-1.1.7/export/export_ffmpeg.c
-@@ -1206,7 +1206,7 @@ MOD_init
- lavc_venc_context->me_method = ME_ZERO + lavc_param_vme;
-
- /* FIXME: transcode itself contains "broken ffmpeg default settings", thus we need to override them! */
-- if (lavc_param_video_preset) {
-+ if (lavc_param_video_preset && strcmp(lavc_param_video_preset, "none")) {
- avcodec_opts[AVMEDIA_TYPE_VIDEO] = lavc_venc_context;
- video_codec_name = av_strdup(ffmpeg_codec_name(codec->name));
-
-Index: transcode-1.1.7/export/ffmpeg_cfg.c
-===================================================================
---- transcode-1.1.7.orig/export/ffmpeg_cfg.c
-+++ transcode-1.1.7/export/ffmpeg_cfg.c
-@@ -124,7 +124,7 @@ int lavc_param_gmc = 0;
- //int lavc_param_atag = 0;
- //int lavc_param_abitrate = 224;
-
--char *lavc_param_video_preset = "medium";
-+char *lavc_param_video_preset = "none";
- char *lavc_param_ffmpeg_datadir = "/usr/share/ffmpeg";
-
- TCConfigEntry lavcopts_conf[]={
diff --git a/multimedia/transcode/transcode-1.1.7-preset-free.patch b/multimedia/transcode/transcode-1.1.7-preset-free.patch
deleted file mode 100644
index 00494b94ba..0000000000
--- a/multimedia/transcode/transcode-1.1.7-preset-free.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-Fix invalid free when preset file not found
-https://bugs.gentoo.org/show_bug.cgi?id=322945
-Author: Brennan Shacklett
-
-diff -urN transcode-1.1.7-orig/export/export_ffmpeg.c transcode-1.1.7/export/export_ffmpeg.c
---- transcode-1.1.7-orig/export/export_ffmpeg.c 2011-11-19 08:50:27.000000000 -0800
-+++ transcode-1.1.7/export/export_ffmpeg.c 2012-07-03 20:07:05.669083945 -0700
-@@ -321,7 +321,7 @@
- }
-
- if(!f){
-- fprintf(stderr, "File for preset '%s' not found\n", arg);
-+ tc_log_error(MOD_NAME, "File for preset '%s' not found", arg);
- av_exit(1);
- }
-
-@@ -1207,7 +1207,7 @@
- /* FIXME: transcode itself contains "broken ffmpeg default settings", thus we need to override them! */
- if (lavc_param_video_preset) {
- avcodec_opts[AVMEDIA_TYPE_VIDEO] = lavc_venc_context;
-- video_codec_name = ffmpeg_codec_name(codec->name);
-+ video_codec_name = av_strdup(ffmpeg_codec_name(codec->name));
-
- const char *preset_start = lavc_param_video_preset;
- while (preset_start) {
-@@ -1225,6 +1225,8 @@
- if (opt_preset("vpre", preset_name) != 0) {
- tc_log_warn(MOD_NAME, "Parsing ffmpeg preset '%s' failed", preset_name);
- }
-+ av_free(video_codec_name);
-+ video_codec_name = NULL;
- if (verbose) {
- int i;
- tc_log_info(MOD_NAME, "After parsing preset '%s', %i options are overridden:", preset_name, opt_name_count);
diff --git a/multimedia/transcode/transcode.SlackBuild b/multimedia/transcode/transcode.SlackBuild
index d9a7341eb2..7c4eff3279 100644
--- a/multimedia/transcode/transcode.SlackBuild
+++ b/multimedia/transcode/transcode.SlackBuild
@@ -79,19 +79,8 @@ find -L . \
\( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \
-exec chmod 644 {} \;
-# Fix building with newer ffmpeg
-patch -p0 -i $CWD/transcode-1.1.7-ffmpeg.patch
-patch -p0 -i $CWD/transcode-1.1.7-ffmpeg-0.10.patch
-patch -p1 -i $CWD/transcode-1.1.7-ffmpeg-0.11.patch
-patch -p1 -i $CWD/transcode-1.1.7-preset-free.patch
-patch -p0 -i $CWD/transcode-1.1.7-libav-9.patch
-patch -p1 -i $CWD/transcode-1.1.7-libav-10.patch
-patch -p1 -i $CWD/transcode-1.1.7-preset-force.patch
-patch -p1 -i $CWD/transcode-1.1.7-ffmpeg2.patch
-patch -p1 -i $CWD/transcode-1.1.7-ffmpeg24.patch
-patch -p1 -i $CWD/transcode-1.1.7-ffmpeg29.patch
-patch -p1 -i $CWD/transcode-1.1.7-ffmpeg4.patch
# Fix building with imagemagick 7.x
+# 2024: this is actually not true anymore and imagemagick support had to be disabled, sorry folks
patch -p1 -i $CWD/transcode-1.1.7-imagemagick7.patch
patch -p1 -i $CWD/transcode-1.1.7-gcc10.patch
patch -p1 -i $CWD/transcode-1.1.7-glibc-2.32.patch
@@ -100,7 +89,8 @@ autoreconf -vif
export MAGICKCORE_QUANTUM_DEPTH=32
-CFLAGS="$SLKCFLAGS" \
+# unfortunately ffmpeg >= 5.x breaks compatibility and no patches are available...
+CFLAGS="$SLKCFLAGS -fpermissive" \
CXXFLAGS="$SLKCFLAGS" \
./configure \
--prefix=/usr \
@@ -109,6 +99,8 @@ CXXFLAGS="$SLKCFLAGS" \
--localstatedir=/var \
--docdir=/usr/doc/$PRGNAM-$VERSION \
--mandir=/usr/man \
+ --disable-ffmpeg \
+ --enable-alsa \
--enable-alsa \
--enable-v4l \
--enable-libv4lconvert \
@@ -131,7 +123,6 @@ CXXFLAGS="$SLKCFLAGS" \
--enable-nuv \
--enable-lzo \
--enable-libpostproc \
- --enable-imagemagick \
--build=$ARCH-slackware-linux
make
diff --git a/multimedia/tvheadend/tvheadend.SlackBuild b/multimedia/tvheadend/tvheadend.SlackBuild
index fd60f65751..23df71bf9d 100644
--- a/multimedia/tvheadend/tvheadend.SlackBuild
+++ b/multimedia/tvheadend/tvheadend.SlackBuild
@@ -108,6 +108,7 @@ CXXFLAGS="$SLKCFLAGS" \
--disable-libtheora_static \
--disable-libvorbis_static \
--disable-libfdkaac_static \
+ --disable-libav \
--python=python3 \
--disable-pcloud_cache \
--nowerror \
diff --git a/multimedia/uavs3d/changelog b/multimedia/uavs3d/changelog
deleted file mode 100644
index 478e92d365..0000000000
--- a/multimedia/uavs3d/changelog
+++ /dev/null
@@ -1,21 +0,0 @@
-Changelog for uavs3d SlackBuild Script
---------------------------------------------------------------------
-
-27/08/2022:
-
-Added to SBo
-
-05/02/2023:
-
-Updated to Github commit 0133ee4
-Patched the cmakelist file to build in i586 and i686 platforms.
-Also patched the file to set the correct lib dir in 64 bit
-platforms.
-
-21/02/2024:
-
-Switched to a versioned one and
-patched it to latest git commit.
-From now on this will build only on x86 and x86_64.
-upstream hasn't made a release yet but they have
-upgraded the version to 1.2.0 internally.
diff --git a/multimedia/uavs3d/fix-build-issue.patch b/multimedia/uavs3d/fix-build-issue.patch
deleted file mode 100644
index 8aa66107a7..0000000000
--- a/multimedia/uavs3d/fix-build-issue.patch
+++ /dev/null
@@ -1,7618 +0,0 @@
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 5118377..46458c7 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -1,15 +1,20 @@
--cmake_minimum_required(VERSION 2.8)
-+cmake_minimum_required(VERSION 3.1)
-
- project(uavs3d)
-
-+option(COMPILE_10BIT "Enable 10bit streams decoding support." OFF)
-+
-+set(CMAKE_C_STANDARD 99)
-+set(CMAKE_POSITION_INDEPENDENT_CODE ON)
-+
- aux_source_directory(./test DIR_SRC_TEST)
--set_source_files_properties(${DIR_SRC_TEST} PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -std=c99 -O3")
-
- add_subdirectory(./source)
-
- add_executable(uavs3dec ${DIR_SRC_TEST})
-
--target_link_libraries(uavs3dec m)
-+if (NOT MSVC)
-+ target_link_libraries(uavs3dec m)
-+endif()
- target_link_libraries(uavs3dec uavs3d)
- #target_link_libraries(uavs3dec dl)
--
-diff --git a/COPYING b/COPYING
-index 409d303..ce30f0f 100644
---- a/COPYING
-+++ b/COPYING
-@@ -1,4 +1,4 @@
--Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School", "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
-+Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School", "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
-
- All rights reserved.
-
-@@ -9,10 +9,7 @@ modification, are permitted provided that the following conditions are met:
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
--3. All advertising materials mentioning features or use of this software
-- must display the following acknowledgement:
-- This product includes the software uAVS3d developed by Peking University Shenzhen Graduate School, Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation.
--4. Neither the name of the organizations (Peking University Shenzhen Graduate School, Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation)
-+3. Neither the name of the organizations (Peking University Shenzhen Graduate School, Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation)
- nor the names of its contributors may be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-diff --git a/README.md b/README.md
-index e46ada8..9ce6a2a 100644
---- a/README.md
-+++ b/README.md
-@@ -5,15 +5,16 @@
- 2) supports to compile for Android/IOS/Windows/Linux/MacOS systems.
- 3) optimized for ARMv7/ARMv8/SSE4/AVX2 chips.
- 4) 10bit decoding on all supported platforms.
--
-+ 5) The uavs3 codec has supported x86 and arm platforms, and has been tested and verified on the Kunpeng processor.
-+ 6) The ARM platform recommends the Kunpeng processor.
- # license
- Copyright reserved by “Peking University Shenzhen Graduate School”, “Peng Cheng Laboratory”, and “Guangdong Bohua UHD Innovation Corporation” <br><br>
-- This program is a free software. You can redistribute it and/or modify it under the terms of the BSD 4-clause license. <br>
-+ This program is a free software. You can redistribute it and/or modify it under the terms of the BSD 3-clause license. <br>
- For more details, please view the file "COPYING" in the project.
-
- # compile
- The default configuration only support 8bit decoding. <br>
-- To support 10bit streams decoding, edit source/decore/com_def.h : #define BIT_DEPTH 10
-+ To support 10bit streams decoding: cmake -DCOMPILE_10BIT=1
-
- ## windows
- Prerequisites:
-@@ -22,17 +23,20 @@ Prerequisites:
- build:
- 1. ./version.bat (to generate version.h)
- 2. solution file: build/x86_windows/uavs3d.sln
-+
-+ To support 10bit streams decoding, edit source/decore/com_def.h : #define COMPILE_10BIT 1
-
- ## linux/mac
- Prerequisites:
- 1. gawk (http://www.gnu.org/software/gawk/)
-- 2. CMake (https://cmake.org) version 2.8 or higher
-+ 2. CMake (https://cmake.org) version 3.1 or higher
-
- Build:
- 1. mkdir build/linux
-- 2. cd build/linux && cmake ../..
-+ 2. cd build/linux && cmake -DCOMPILE_10BIT=0 ../..
- 3. make && make install
-
-+ To support 10bit streams decoding: cmake -DCOMPILE_10BIT=1
- to build shared library, set BUILD_SHARED_LIBS=1 please.
-
- ## ios
-@@ -40,8 +44,11 @@ Prerequisites:
- XCode
-
- Build:
--1. ./version.sh (generate the version.h)
--2. xcode solution file: build/ios/uavs3d.xcodeproj
-+ 1. ./version.sh (generate the version.h)
-+ 2. xcode solution file: build/ios/uavs3d.xcodeproj
-+
-+ To support 10bit streams decoding:
-+ Find Xcode -> PROJECT -> Build Settings -> Preprocessor Macros, add COMPILE_10BIT=1
-
- ## android
- Prerequisites:
-@@ -51,8 +58,10 @@ Build ndk library or executable file:
- 1. ./version.sh (generate the version.h)
- 2. cd build/android/ndk/jni
- 3. $NDK_PATH/ndk-build
-+
-+ To support 10bit streams decoding: edit build/android/ndk/jni/uavs3d_main.mk:
-
--The executable application for arm64-v8a is generated by default. <br>To generate static or shared library for other platforms, modify correlative options in Android.mk and Application.mk.
-+ LOCAL_CFLAGS += -DCOMPILE_10BIT=1
-
- # Run tests
- ## window/linux/mac/android
-diff --git a/build/android/ndk/jni/Android.mk b/build/android/ndk/jni/Android.mk
-index fe79947..88d57f4 100644
---- a/build/android/ndk/jni/Android.mk
-+++ b/build/android/ndk/jni/Android.mk
-@@ -5,53 +5,26 @@ SRC_PATH := ../../../../source
- INCLUDE_PATH := ../../../../source/decore
-
- ### Name of the local module
--include $(CLEAR_VARS)
--LOCAL_MODULE := uavs3d
-+include $(LOCAL_PATH)/uavs3d_clear_vars.mk
-+LOCAL_MODULE := uavs3d-static
-+LOCAL_MODULE_FILENAME := libuavs3d
-+include $(LOCAL_PATH)/uavs3d_main.mk
-+include $(BUILD_STATIC_LIBRARY)
-+
-+include $(LOCAL_PATH)/uavs3d_clear_vars.mk
-+LOCAL_MODULE := uavs3d-shared
-+LOCAL_MODULE_FILENAME := libuavs3d
- LOCAL_LDLIBS:=-L$(SYSROOT)/usr/lib -lm -llog
--
--### for posix pthread
--#LOCAL_SHARED_LIBRARIES := libcutil
--
--### include search path when compiling all sources (C,C++,Assembly)
--LOCAL_C_INCLUDES +=$(INCLUDE_PATH) \
-- $(LOCAL_PATH)/../app
--
--### c source code
--uavs3d_srcs_c += $(SRC_PATH)/decore/alf.c
--uavs3d_srcs_c += $(SRC_PATH)/decore/deblock.c
--uavs3d_srcs_c += $(SRC_PATH)/decore/inter_pred.c
--uavs3d_srcs_c += $(SRC_PATH)/decore/intra_pred.c
--uavs3d_srcs_c += $(SRC_PATH)/decore/inv_trans.c
--uavs3d_srcs_c += $(SRC_PATH)/decore/pic_manager.c
--uavs3d_srcs_c += $(SRC_PATH)/decore/recon.c
--uavs3d_srcs_c += $(SRC_PATH)/decore/sao.c
--uavs3d_srcs_c += $(SRC_PATH)/decore/com_table.c
--uavs3d_srcs_c += $(SRC_PATH)/decore/threadpool.c
--uavs3d_srcs_c += $(SRC_PATH)/decore/win32thread.c
--uavs3d_srcs_c += $(SRC_PATH)/decore/com_util.c
--uavs3d_srcs_c += $(SRC_PATH)/decoder/uavs3d.c
--uavs3d_srcs_c += $(SRC_PATH)/decoder/bitstream.c
--uavs3d_srcs_c += $(SRC_PATH)/decoder/parser.c
--uavs3d_srcs_c += $(SRC_PATH)/decoder/dec_util.c
--
--LOCAL_CFLAGS += -O3 -fPIC -std=gnu99
- LOCAL_LDFLAGS += -fPIC
-+include $(LOCAL_PATH)/uavs3d_main.mk
-+include $(BUILD_SHARED_LIBRARY)
-+
-
--#if build_executable
-+include $(LOCAL_PATH)/uavs3d_clear_vars.mk
-+LOCAL_MODULE := uavs3d
-+LOCAL_LDLIBS:=-L$(SYSROOT)/usr/lib -lm -llog
- LOCAL_CFLAGS += -pie -fPIE
- LOCAL_LDFLAGS += -pie -fPIE
--uavs3d_srcs_test+= $(SRC_PATH)/../test/utest.c
--#endif
--
--#if build armv7a
--#LOCAL_CFLAGS += -mfpu=neon
--#include $(LOCAL_PATH)/uavs3d_armv7a.mk
--#elif build arm64
--include $(LOCAL_PATH)/uavs3d_arm64.mk
--#endif
--
--LOCAL_SRC_FILES := $(uavs3d_srcs_c) $(uavs3d_srcs_arm) $(uavs3d_srcs_test)
--
--#include $(BUILD_SHARED_LIBRARY)
--#include $(BUILD_STATIC_LIBRARY)
-+uavs3d_srcs_test+= $(SRC_PATH)/../test/utest.c
-+include $(LOCAL_PATH)/uavs3d_main.mk
- include $(BUILD_EXECUTABLE)
-diff --git a/build/android/ndk/jni/Application.mk b/build/android/ndk/jni/Application.mk
-index 292946e..29e7e02 100644
---- a/build/android/ndk/jni/Application.mk
-+++ b/build/android/ndk/jni/Application.mk
-@@ -1,8 +1,9 @@
- # APP_ABI := armeabi-v7a
-- APP_ABI := arm64-v8a
-+# APP_ABI := arm64-v8a
- # APP_ABI := armeabi
- # APP_ABI := x86
- # APP_ABI := x86_64
-+APP_ABI := all
- APP_OPTIM := release
- # TARGET_BUILD_TYPE=release
-
-diff --git a/build/android/ndk/jni/uavs3d_avx2.mk b/build/android/ndk/jni/uavs3d_avx2.mk
-new file mode 100644
-index 0000000..d80401a
---- /dev/null
-+++ b/build/android/ndk/jni/uavs3d_avx2.mk
-@@ -0,0 +1,11 @@
-+
-+AVX_SRC_PATH:=../../../../source/decore/avx2
-+
-+uavs3d_srcs_avx += $(AVX_SRC_PATH)/alf_avx2.c
-+uavs3d_srcs_avx += $(AVX_SRC_PATH)/avx2.c
-+uavs3d_srcs_avx += $(AVX_SRC_PATH)/inter_pred_avx2.c
-+uavs3d_srcs_avx += $(AVX_SRC_PATH)/intra_pred_avx2.c
-+uavs3d_srcs_avx += $(AVX_SRC_PATH)/itrans_avx2.c
-+uavs3d_srcs_avx += $(AVX_SRC_PATH)/pixel_avx2.c
-+uavs3d_srcs_avx += $(AVX_SRC_PATH)/sao_avx2.c
-+
-diff --git a/build/android/ndk/jni/uavs3d_clear_vars.mk b/build/android/ndk/jni/uavs3d_clear_vars.mk
-new file mode 100644
-index 0000000..0c47cfc
---- /dev/null
-+++ b/build/android/ndk/jni/uavs3d_clear_vars.mk
-@@ -0,0 +1,6 @@
-+include $(CLEAR_VARS)
-+uavs3d_srcs_c :=
-+uavs3d_srcs_test :=
-+uavs3d_srcs_arm :=
-+uavs3d_srcs_sse :=
-+uavs3d_srcs_avx :=
-diff --git a/build/android/ndk/jni/uavs3d_main.mk b/build/android/ndk/jni/uavs3d_main.mk
-new file mode 100644
-index 0000000..6506e89
---- /dev/null
-+++ b/build/android/ndk/jni/uavs3d_main.mk
-@@ -0,0 +1,61 @@
-+
-+### for posix pthread
-+#LOCAL_SHARED_LIBRARIES := libcutil
-+
-+### include search path when compiling all sources (C,C++,Assembly)
-+LOCAL_C_INCLUDES +=$(INCLUDE_PATH) \
-+ $(LOCAL_PATH)/../app
-+
-+### c source code
-+uavs3d_srcs_c += $(SRC_PATH)/decore/alf.c
-+uavs3d_srcs_c += $(SRC_PATH)/decore/deblock.c
-+uavs3d_srcs_c += $(SRC_PATH)/decore/inter_pred.c
-+uavs3d_srcs_c += $(SRC_PATH)/decore/intra_pred.c
-+uavs3d_srcs_c += $(SRC_PATH)/decore/inv_trans.c
-+uavs3d_srcs_c += $(SRC_PATH)/decore/pic_manager.c
-+uavs3d_srcs_c += $(SRC_PATH)/decore/recon.c
-+uavs3d_srcs_c += $(SRC_PATH)/decore/sao.c
-+uavs3d_srcs_c += $(SRC_PATH)/decore/com_table.c
-+uavs3d_srcs_c += $(SRC_PATH)/decore/threadpool.c
-+uavs3d_srcs_c += $(SRC_PATH)/decore/win32thread.c
-+uavs3d_srcs_c += $(SRC_PATH)/decore/com_util.c
-+uavs3d_srcs_c += $(SRC_PATH)/decoder/uavs3d.c
-+uavs3d_srcs_c += $(SRC_PATH)/decoder/bitstream.c
-+uavs3d_srcs_c += $(SRC_PATH)/decoder/parser.c
-+uavs3d_srcs_c += $(SRC_PATH)/decoder/dec_util.c
-+
-+
-+LOCAL_CFLAGS += -O3 -fPIC -std=gnu99 -I../../../source/decore
-+
-+### To support 10bit streams decoding: edit it to -DCOMPILE_10BIT=1
-+LOCAL_CFLAGS += -DCOMPILE_10BIT=0
-+
-+ifeq ($(TARGET_ARCH),arm)
-+ ifeq ($(TARGET_ARCH_ABI), armeabi-v7a)
-+ # build armv7a
-+ LOCAL_CFLAGS += -mfpu=neon -D_armv7a
-+ include $(LOCAL_PATH)/uavs3d_armv7a.mk
-+ endif
-+endif
-+
-+ifeq ($(TARGET_ARCH),arm64)
-+ # build arm64
-+ LOCAL_CFLAGS += -D_arm64
-+ include $(LOCAL_PATH)/uavs3d_arm64.mk
-+endif
-+
-+ifeq ($(TARGET_ARCH),x86)
-+ # build x86
-+ LOCAL_CFLAGS += -msse4.2 -mavx2
-+ include $(LOCAL_PATH)/uavs3d_sse2.mk
-+ include $(LOCAL_PATH)/uavs3d_avx2.mk
-+endif
-+
-+ifeq ($(TARGET_ARCH),x86_64)
-+ # build x86_64
-+ LOCAL_CFLAGS += -msse4.2 -mavx2
-+ include $(LOCAL_PATH)/uavs3d_sse2.mk
-+ include $(LOCAL_PATH)/uavs3d_avx2.mk
-+endif
-+
-+LOCAL_SRC_FILES := $(uavs3d_srcs_c) $(uavs3d_srcs_arm) $(uavs3d_srcs_sse) $(uavs3d_srcs_avx) $(uavs3d_srcs_test)
-diff --git a/build/android/ndk/jni/uavs3d_sse2.mk b/build/android/ndk/jni/uavs3d_sse2.mk
-new file mode 100644
-index 0000000..1f8847a
---- /dev/null
-+++ b/build/android/ndk/jni/uavs3d_sse2.mk
-@@ -0,0 +1,11 @@
-+
-+SSE_SRC_PATH:=../../../../source/decore/sse
-+
-+uavs3d_srcs_sse += $(SSE_SRC_PATH)/alf_sse.c
-+uavs3d_srcs_sse += $(SSE_SRC_PATH)/deblock_sse.c
-+uavs3d_srcs_sse += $(SSE_SRC_PATH)/inter_pred_sse.c
-+uavs3d_srcs_sse += $(SSE_SRC_PATH)/intra_pred_sse.c
-+uavs3d_srcs_sse += $(SSE_SRC_PATH)/itrans_sse.c
-+uavs3d_srcs_sse += $(SSE_SRC_PATH)/pixel_sse.c
-+uavs3d_srcs_sse += $(SSE_SRC_PATH)/sao_sse.c
-+uavs3d_srcs_sse += $(SSE_SRC_PATH)/sse.c
-diff --git a/build/x86_windows/common.vcxproj b/build/vs2017/common.vcxproj
-similarity index 61%
-rename from build/x86_windows/common.vcxproj
-rename to build/vs2017/common.vcxproj
-index c8cd533..95de5c4 100644
---- a/build/x86_windows/common.vcxproj
-+++ b/build/vs2017/common.vcxproj
-@@ -1,157 +1,249 @@
--<?xml version="1.0" encoding="utf-8"?>
--<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-- <ItemGroup Label="ProjectConfigurations">
-- <ProjectConfiguration Include="Debug|x64">
-- <Configuration>Debug</Configuration>
-- <Platform>x64</Platform>
-- </ProjectConfiguration>
-- <ProjectConfiguration Include="Release|x64">
-- <Configuration>Release</Configuration>
-- <Platform>x64</Platform>
-- </ProjectConfiguration>
-- </ItemGroup>
-- <ItemGroup>
-- <ClCompile Include="..\..\source\decore\alf.c" />
-- <ClCompile Include="..\..\source\decore\avx2\alf_avx2.c" />
-- <ClCompile Include="..\..\source\decore\avx2\avx2.c" />
-- <ClCompile Include="..\..\source\decore\avx2\inter_pred_avx2.c" />
-- <ClCompile Include="..\..\source\decore\avx2\intra_pred_avx2.c" />
-- <ClCompile Include="..\..\source\decore\avx2\itrans_avx2.c" />
-- <ClCompile Include="..\..\source\decore\avx2\pixel_avx2.c" />
-- <ClCompile Include="..\..\source\decore\avx2\sao_avx2.c" />
-- <ClCompile Include="..\..\source\decore\com_table.c" />
-- <ClCompile Include="..\..\source\decore\com_util.c" />
-- <ClCompile Include="..\..\source\decore\deblock.c" />
-- <ClCompile Include="..\..\source\decore\inter_pred.c" />
-- <ClCompile Include="..\..\source\decore\intra_pred.c" />
-- <ClCompile Include="..\..\source\decore\inv_trans.c" />
-- <ClCompile Include="..\..\source\decore\pic_manager.c" />
-- <ClCompile Include="..\..\source\decore\recon.c" />
-- <ClCompile Include="..\..\source\decore\sao.c" />
-- <ClCompile Include="..\..\source\decore\sse\alf_sse.c" />
-- <ClCompile Include="..\..\source\decore\sse\deblock_sse.c" />
-- <ClCompile Include="..\..\source\decore\sse\inter_pred_sse.c" />
-- <ClCompile Include="..\..\source\decore\sse\intra_pred_sse.c" />
-- <ClCompile Include="..\..\source\decore\sse\itrans_sse.c" />
-- <ClCompile Include="..\..\source\decore\sse\pixel_sse.c" />
-- <ClCompile Include="..\..\source\decore\sse\sao_sse.c" />
-- <ClCompile Include="..\..\source\decore\sse\sse.c" />
-- <ClCompile Include="..\..\source\decore\threadpool.c" />
-- <ClCompile Include="..\..\source\decore\win32thread.c" />
-- </ItemGroup>
-- <ItemGroup>
-- <ClInclude Include="..\..\source\decore\avx2\avx2.h" />
-- <ClInclude Include="..\..\source\decore\com_def.h" />
-- <ClInclude Include="..\..\source\decore\com_sys.h" />
-- <ClInclude Include="..\..\source\decore\com_table.h" />
-- <ClInclude Include="..\..\source\decore\com_type.h" />
-- <ClInclude Include="..\..\source\decore\com_util.h" />
-- <ClInclude Include="..\..\source\decore\modules.h" />
-- <ClInclude Include="..\..\source\decore\sse\sse.h" />
-- <ClInclude Include="..\..\source\decore\threadpool.h" />
-- <ClInclude Include="..\..\source\decore\win32thread.h" />
-- </ItemGroup>
-- <PropertyGroup Label="Globals">
-- <ProjectGuid>{3F9C7116-C287-40D7-865C-D8C89CF4FF31}</ProjectGuid>
-- <Keyword>Win32Proj</Keyword>
-- <RootNamespace>com_lib_vs17</RootNamespace>
-- <ProjectName>common</ProjectName>
-- <WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
-- </PropertyGroup>
-- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-- <ConfigurationType>StaticLibrary</ConfigurationType>
-- <UseDebugLibraries>true</UseDebugLibraries>
-- <CharacterSet>MultiByte</CharacterSet>
-- <PlatformToolset>v141</PlatformToolset>
-- </PropertyGroup>
-- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-- <ConfigurationType>StaticLibrary</ConfigurationType>
-- <UseDebugLibraries>false</UseDebugLibraries>
-- <WholeProgramOptimization>true</WholeProgramOptimization>
-- <CharacterSet>MultiByte</CharacterSet>
-- <PlatformToolset>v141</PlatformToolset>
-- </PropertyGroup>
-- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-- <ImportGroup Label="ExtensionSettings">
-- </ImportGroup>
-- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
-- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-- </ImportGroup>
-- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
-- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-- </ImportGroup>
-- <PropertyGroup Label="UserMacros" />
-- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-- <OutDir>..\..\lib\</OutDir>
-- </PropertyGroup>
-- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-- <TargetName>$(ProjectName)</TargetName>
-- <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
-- </PropertyGroup>
-- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-- <OutDir>..\..\lib\</OutDir>
-- <TargetName>$(ProjectName)</TargetName>
-- <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
-- </PropertyGroup>
-- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-- <ClCompile>
-- <PrecompiledHeader>NotUsing</PrecompiledHeader>
-- <WarningLevel>Level3</WarningLevel>
-- <Optimization>Disabled</Optimization>
-- <PreprocessorDefinitions>WIN64;X86F;_DEBUG;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>
-- <AdditionalIncludeDirectories>..\..\source\decore</AdditionalIncludeDirectories>
-- <PrecompiledHeaderFile>
-- </PrecompiledHeaderFile>
-- <PrecompiledHeaderOutputFile>
-- </PrecompiledHeaderOutputFile>
-- <CompileAs>CompileAsC</CompileAs>
-- <ErrorReporting>Prompt</ErrorReporting>
-- <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
-- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-- <TreatWarningAsError>true</TreatWarningAsError>
-- <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
-- </ClCompile>
-- <Link>
-- <SubSystem>Windows</SubSystem>
-- <GenerateDebugInformation>true</GenerateDebugInformation>
-- </Link>
-- <Lib>
-- <OutputFile>..\..\lib\$(ProjectName).lib</OutputFile>
-- </Lib>
-- </ItemDefinitionGroup>
-- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-- <ClCompile>
-- <WarningLevel>Level3</WarningLevel>
-- <PrecompiledHeader>NotUsing</PrecompiledHeader>
-- <Optimization>MaxSpeed</Optimization>
-- <FunctionLevelLinking>true</FunctionLevelLinking>
-- <IntrinsicFunctions>true</IntrinsicFunctions>
-- <PreprocessorDefinitions>WIN64;X86F;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions);</PreprocessorDefinitions>
-- <AdditionalIncludeDirectories>..\..\source\decore</AdditionalIncludeDirectories>
-- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-- <PrecompiledHeaderFile>
-- </PrecompiledHeaderFile>
-- <PrecompiledHeaderOutputFile>
-- </PrecompiledHeaderOutputFile>
-- <CompileAs>CompileAsC</CompileAs>
-- <ErrorReporting>Prompt</ErrorReporting>
-- <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
-- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-- <TreatWarningAsError>true</TreatWarningAsError>
-- <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
-- </ClCompile>
-- <Link>
-- <SubSystem>Windows</SubSystem>
-- <GenerateDebugInformation>true</GenerateDebugInformation>
-- <EnableCOMDATFolding>true</EnableCOMDATFolding>
-- <OptimizeReferences>true</OptimizeReferences>
-- </Link>
-- <Lib>
-- <OutputFile>..\..\lib\$(ProjectName).lib</OutputFile>
-- </Lib>
-- </ItemDefinitionGroup>
-- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-- <ImportGroup Label="ExtensionTargets">
-- </ImportGroup>
-+<?xml version="1.0" encoding="utf-8"?>
-+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-+ <ItemGroup Label="ProjectConfigurations">
-+ <ProjectConfiguration Include="Debug|Win32">
-+ <Configuration>Debug</Configuration>
-+ <Platform>Win32</Platform>
-+ </ProjectConfiguration>
-+ <ProjectConfiguration Include="Debug|x64">
-+ <Configuration>Debug</Configuration>
-+ <Platform>x64</Platform>
-+ </ProjectConfiguration>
-+ <ProjectConfiguration Include="Release|Win32">
-+ <Configuration>Release</Configuration>
-+ <Platform>Win32</Platform>
-+ </ProjectConfiguration>
-+ <ProjectConfiguration Include="Release|x64">
-+ <Configuration>Release</Configuration>
-+ <Platform>x64</Platform>
-+ </ProjectConfiguration>
-+ </ItemGroup>
-+ <ItemGroup>
-+ <ClCompile Include="..\..\source\decore\alf.c" />
-+ <ClCompile Include="..\..\source\decore\avx2\alf_avx2.c" />
-+ <ClCompile Include="..\..\source\decore\avx2\avx2.c" />
-+ <ClCompile Include="..\..\source\decore\avx2\inter_pred_avx2.c" />
-+ <ClCompile Include="..\..\source\decore\avx2\intra_pred_avx2.c" />
-+ <ClCompile Include="..\..\source\decore\avx2\itrans_avx2.c" />
-+ <ClCompile Include="..\..\source\decore\avx2\pixel_avx2.c" />
-+ <ClCompile Include="..\..\source\decore\avx2\sao_avx2.c" />
-+ <ClCompile Include="..\..\source\decore\com_table.c" />
-+ <ClCompile Include="..\..\source\decore\com_util.c" />
-+ <ClCompile Include="..\..\source\decore\deblock.c" />
-+ <ClCompile Include="..\..\source\decore\inter_pred.c" />
-+ <ClCompile Include="..\..\source\decore\intra_pred.c" />
-+ <ClCompile Include="..\..\source\decore\inv_trans.c" />
-+ <ClCompile Include="..\..\source\decore\pic_manager.c" />
-+ <ClCompile Include="..\..\source\decore\recon.c" />
-+ <ClCompile Include="..\..\source\decore\sao.c" />
-+ <ClCompile Include="..\..\source\decore\sse\alf_sse.c" />
-+ <ClCompile Include="..\..\source\decore\sse\deblock_sse.c" />
-+ <ClCompile Include="..\..\source\decore\sse\inter_pred_sse.c" />
-+ <ClCompile Include="..\..\source\decore\sse\intra_pred_sse.c" />
-+ <ClCompile Include="..\..\source\decore\sse\itrans_sse.c" />
-+ <ClCompile Include="..\..\source\decore\sse\pixel_sse.c" />
-+ <ClCompile Include="..\..\source\decore\sse\sao_sse.c" />
-+ <ClCompile Include="..\..\source\decore\sse\sse.c" />
-+ <ClCompile Include="..\..\source\decore\threadpool.c" />
-+ <ClCompile Include="..\..\source\decore\win32thread.c" />
-+ </ItemGroup>
-+ <ItemGroup>
-+ <ClInclude Include="..\..\source\decore\avx2\avx2.h" />
-+ <ClInclude Include="..\..\source\decore\com_def.h" />
-+ <ClInclude Include="..\..\source\decore\com_sys.h" />
-+ <ClInclude Include="..\..\source\decore\com_table.h" />
-+ <ClInclude Include="..\..\source\decore\com_type.h" />
-+ <ClInclude Include="..\..\source\decore\com_util.h" />
-+ <ClInclude Include="..\..\source\decore\modules.h" />
-+ <ClInclude Include="..\..\source\decore\sse\sse.h" />
-+ <ClInclude Include="..\..\source\decore\threadpool.h" />
-+ <ClInclude Include="..\..\source\decore\win32thread.h" />
-+ </ItemGroup>
-+ <PropertyGroup Label="Globals">
-+ <ProjectGuid>{3F9C7116-C287-40D7-865C-D8C89CF4FF31}</ProjectGuid>
-+ <Keyword>Win32Proj</Keyword>
-+ <RootNamespace>com_lib_vs17</RootNamespace>
-+ <ProjectName>common</ProjectName>
-+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
-+ </PropertyGroup>
-+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-+ <ConfigurationType>StaticLibrary</ConfigurationType>
-+ <UseDebugLibraries>true</UseDebugLibraries>
-+ <CharacterSet>MultiByte</CharacterSet>
-+ <PlatformToolset>v141</PlatformToolset>
-+ </PropertyGroup>
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-+ <ConfigurationType>StaticLibrary</ConfigurationType>
-+ <UseDebugLibraries>true</UseDebugLibraries>
-+ <CharacterSet>MultiByte</CharacterSet>
-+ <PlatformToolset>v141</PlatformToolset>
-+ </PropertyGroup>
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-+ <ConfigurationType>StaticLibrary</ConfigurationType>
-+ <UseDebugLibraries>false</UseDebugLibraries>
-+ <WholeProgramOptimization>true</WholeProgramOptimization>
-+ <CharacterSet>MultiByte</CharacterSet>
-+ <PlatformToolset>v141</PlatformToolset>
-+ </PropertyGroup>
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-+ <ConfigurationType>StaticLibrary</ConfigurationType>
-+ <UseDebugLibraries>false</UseDebugLibraries>
-+ <WholeProgramOptimization>true</WholeProgramOptimization>
-+ <CharacterSet>MultiByte</CharacterSet>
-+ <PlatformToolset>v141</PlatformToolset>
-+ </PropertyGroup>
-+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-+ <ImportGroup Label="ExtensionSettings">
-+ </ImportGroup>
-+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
-+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-+ </ImportGroup>
-+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
-+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-+ </ImportGroup>
-+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
-+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-+ </ImportGroup>
-+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
-+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-+ </ImportGroup>
-+ <PropertyGroup Label="UserMacros" />
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-+ <OutDir>..\..\lib\</OutDir>
-+ </PropertyGroup>
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-+ <TargetName>$(ProjectName)</TargetName>
-+ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
-+ </PropertyGroup>
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-+ <TargetName>$(ProjectName)</TargetName>
-+ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
-+ </PropertyGroup>
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-+ <OutDir>..\..\lib\</OutDir>
-+ <TargetName>$(ProjectName)</TargetName>
-+ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
-+ </PropertyGroup>
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-+ <TargetName>$(ProjectName)</TargetName>
-+ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
-+ </PropertyGroup>
-+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-+ <ClCompile>
-+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
-+ <WarningLevel>Level3</WarningLevel>
-+ <Optimization>Disabled</Optimization>
-+ <PreprocessorDefinitions>WIN64;X86F;_DEBUG;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>
-+ <AdditionalIncludeDirectories>..\..\source\decore</AdditionalIncludeDirectories>
-+ <PrecompiledHeaderFile>
-+ </PrecompiledHeaderFile>
-+ <PrecompiledHeaderOutputFile>
-+ </PrecompiledHeaderOutputFile>
-+ <CompileAs>CompileAsC</CompileAs>
-+ <ErrorReporting>Prompt</ErrorReporting>
-+ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
-+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-+ <TreatWarningAsError>true</TreatWarningAsError>
-+ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
-+ </ClCompile>
-+ <Link>
-+ <SubSystem>Windows</SubSystem>
-+ <GenerateDebugInformation>true</GenerateDebugInformation>
-+ </Link>
-+ <Lib>
-+ <OutputFile>..\..\lib\$(ProjectName).lib</OutputFile>
-+ </Lib>
-+ </ItemDefinitionGroup>
-+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-+ <ClCompile>
-+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
-+ <WarningLevel>Level3</WarningLevel>
-+ <Optimization>Disabled</Optimization>
-+ <PreprocessorDefinitions>WIN64;X86F;_DEBUG;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>
-+ <AdditionalIncludeDirectories>..\..\source\decore</AdditionalIncludeDirectories>
-+ <PrecompiledHeaderFile>
-+ </PrecompiledHeaderFile>
-+ <PrecompiledHeaderOutputFile>
-+ </PrecompiledHeaderOutputFile>
-+ <CompileAs>CompileAsC</CompileAs>
-+ <ErrorReporting>Prompt</ErrorReporting>
-+ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
-+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-+ <TreatWarningAsError>true</TreatWarningAsError>
-+ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
-+ </ClCompile>
-+ <Link>
-+ <SubSystem>Windows</SubSystem>
-+ <GenerateDebugInformation>true</GenerateDebugInformation>
-+ </Link>
-+ <Lib>
-+ <OutputFile>..\..\lib\$(ProjectName).lib</OutputFile>
-+ </Lib>
-+ </ItemDefinitionGroup>
-+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-+ <ClCompile>
-+ <WarningLevel>Level3</WarningLevel>
-+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
-+ <Optimization>MaxSpeed</Optimization>
-+ <FunctionLevelLinking>true</FunctionLevelLinking>
-+ <IntrinsicFunctions>true</IntrinsicFunctions>
-+ <PreprocessorDefinitions>WIN64;X86F;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions);</PreprocessorDefinitions>
-+ <AdditionalIncludeDirectories>..\..\source\decore</AdditionalIncludeDirectories>
-+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-+ <PrecompiledHeaderFile>
-+ </PrecompiledHeaderFile>
-+ <PrecompiledHeaderOutputFile>
-+ </PrecompiledHeaderOutputFile>
-+ <CompileAs>CompileAsC</CompileAs>
-+ <ErrorReporting>Prompt</ErrorReporting>
-+ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
-+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-+ <TreatWarningAsError>true</TreatWarningAsError>
-+ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
-+ </ClCompile>
-+ <Link>
-+ <SubSystem>Windows</SubSystem>
-+ <GenerateDebugInformation>true</GenerateDebugInformation>
-+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
-+ <OptimizeReferences>true</OptimizeReferences>
-+ </Link>
-+ <Lib>
-+ <OutputFile>..\..\lib\$(ProjectName).lib</OutputFile>
-+ </Lib>
-+ </ItemDefinitionGroup>
-+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-+ <ClCompile>
-+ <WarningLevel>Level3</WarningLevel>
-+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
-+ <Optimization>MaxSpeed</Optimization>
-+ <FunctionLevelLinking>true</FunctionLevelLinking>
-+ <IntrinsicFunctions>true</IntrinsicFunctions>
-+ <PreprocessorDefinitions>WIN64;X86F;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions);</PreprocessorDefinitions>
-+ <AdditionalIncludeDirectories>..\..\source\decore</AdditionalIncludeDirectories>
-+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-+ <PrecompiledHeaderFile>
-+ </PrecompiledHeaderFile>
-+ <PrecompiledHeaderOutputFile>
-+ </PrecompiledHeaderOutputFile>
-+ <CompileAs>CompileAsC</CompileAs>
-+ <ErrorReporting>Prompt</ErrorReporting>
-+ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
-+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-+ <TreatWarningAsError>true</TreatWarningAsError>
-+ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
-+ </ClCompile>
-+ <Link>
-+ <SubSystem>Windows</SubSystem>
-+ <GenerateDebugInformation>true</GenerateDebugInformation>
-+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
-+ <OptimizeReferences>true</OptimizeReferences>
-+ </Link>
-+ <Lib>
-+ <OutputFile>..\..\lib\$(ProjectName).lib</OutputFile>
-+ </Lib>
-+ </ItemDefinitionGroup>
-+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-+ <ImportGroup Label="ExtensionTargets">
-+ </ImportGroup>
- </Project>
-\ No newline at end of file
-diff --git a/build/x86_windows/common.vcxproj.filters b/build/vs2017/common.vcxproj.filters
-similarity index 100%
-rename from build/x86_windows/common.vcxproj.filters
-rename to build/vs2017/common.vcxproj.filters
-diff --git a/build/x86_windows/libuavs3d.vcxproj b/build/vs2017/libuavs3d.vcxproj
-similarity index 55%
-rename from build/x86_windows/libuavs3d.vcxproj
-rename to build/vs2017/libuavs3d.vcxproj
-index d92a51f..bb42a6c 100644
---- a/build/x86_windows/libuavs3d.vcxproj
-+++ b/build/vs2017/libuavs3d.vcxproj
-@@ -1,115 +1,193 @@
--<?xml version="1.0" encoding="utf-8"?>
--<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-- <ItemGroup Label="ProjectConfigurations">
-- <ProjectConfiguration Include="Debug|x64">
-- <Configuration>Debug</Configuration>
-- <Platform>x64</Platform>
-- </ProjectConfiguration>
-- <ProjectConfiguration Include="Release|x64">
-- <Configuration>Release</Configuration>
-- <Platform>x64</Platform>
-- </ProjectConfiguration>
-- </ItemGroup>
-- <ItemGroup>
-- <ClCompile Include="..\..\source\decoder\bitstream.c" />
-- <ClCompile Include="..\..\source\decoder\dec_util.c" />
-- <ClCompile Include="..\..\source\decoder\parser.c" />
-- <ClCompile Include="..\..\source\decoder\uavs3d.c" />
-- </ItemGroup>
-- <ItemGroup>
-- <ClInclude Include="..\..\contributor.h" />
-- <ClInclude Include="..\..\source\decoder\bitstream.h" />
-- <ClInclude Include="..\..\source\decoder\dec_type.h" />
-- <ClInclude Include="..\..\source\decoder\dec_util.h" />
-- <ClInclude Include="..\..\source\decoder\parser.h" />
-- <ClInclude Include="..\..\source\decoder\uavs3d.h" />
-- </ItemGroup>
-- <PropertyGroup Label="Globals">
-- <ProjectGuid>{40B445E8-306A-4C77-9B19-FC76C2379F79}</ProjectGuid>
-- <RootNamespace>dec_lib</RootNamespace>
-- <WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
-- <ProjectName>libuavs3d</ProjectName>
-- </PropertyGroup>
-- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-- <ConfigurationType>DynamicLibrary</ConfigurationType>
-- <UseDebugLibraries>true</UseDebugLibraries>
-- <PlatformToolset>v141</PlatformToolset>
-- <CharacterSet>MultiByte</CharacterSet>
-- </PropertyGroup>
-- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-- <ConfigurationType>DynamicLibrary</ConfigurationType>
-- <UseDebugLibraries>false</UseDebugLibraries>
-- <PlatformToolset>v141</PlatformToolset>
-- <WholeProgramOptimization>true</WholeProgramOptimization>
-- <CharacterSet>MultiByte</CharacterSet>
-- </PropertyGroup>
-- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-- <ImportGroup Label="ExtensionSettings">
-- </ImportGroup>
-- <ImportGroup Label="Shared">
-- </ImportGroup>
-- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-- </ImportGroup>
-- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-- </ImportGroup>
-- <PropertyGroup Label="UserMacros" />
-- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-- <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
-- <OutDir>..\..\bin</OutDir>
-- <LibraryPath>..\..\lib;$(LibraryPath)</LibraryPath>
-- </PropertyGroup>
-- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-- <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
-- <OutDir>..\..\bin</OutDir>
-- <LibraryPath>..\..\lib;$(LibraryPath)</LibraryPath>
-- </PropertyGroup>
-- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-- <ClCompile>
-- <WarningLevel>Level3</WarningLevel>
-- <Optimization>Disabled</Optimization>
-- <SDLCheck>true</SDLCheck>
-- <AdditionalIncludeDirectories>..\..\source\decore;..\..\source\decoder</AdditionalIncludeDirectories>
-- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-- <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
-- <PreprocessorDefinitions>WIN64;;%(PreprocessorDefinitions);UAVS3D_EXPORTS;_DEBUG</PreprocessorDefinitions>
-- <TreatWarningAsError>true</TreatWarningAsError>
-- <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
-- </ClCompile>
-- <Link>
-- <GenerateDebugInformation>true</GenerateDebugInformation>
-- <AdditionalDependencies>common.lib;%(AdditionalDependencies)</AdditionalDependencies>
-- <ShowProgress>NotSet</ShowProgress>
-- <Version>1.0</Version>
-- </Link>
-- </ItemDefinitionGroup>
-- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-- <ClCompile>
-- <WarningLevel>Level3</WarningLevel>
-- <Optimization>MaxSpeed</Optimization>
-- <FunctionLevelLinking>true</FunctionLevelLinking>
-- <IntrinsicFunctions>true</IntrinsicFunctions>
-- <SDLCheck>true</SDLCheck>
-- <AdditionalIncludeDirectories>..\..\source\decore;..\..\source\decoder</AdditionalIncludeDirectories>
-- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-- <CompileAs>CompileAsC</CompileAs>
-- <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
-- <PreprocessorDefinitions>WIN64;;%(PreprocessorDefinitions);UAVS3D_EXPORTS;</PreprocessorDefinitions>
-- <TreatWarningAsError>true</TreatWarningAsError>
-- <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
-- </ClCompile>
-- <Link>
-- <GenerateDebugInformation>true</GenerateDebugInformation>
-- <EnableCOMDATFolding>true</EnableCOMDATFolding>
-- <OptimizeReferences>true</OptimizeReferences>
-- <AdditionalDependencies>common.lib;%(AdditionalDependencies)</AdditionalDependencies>
-- <ShowProgress>NotSet</ShowProgress>
-- <Version>1.0</Version>
-- </Link>
-- </ItemDefinitionGroup>
-- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-- <ImportGroup Label="ExtensionTargets">
-- </ImportGroup>
-+<?xml version="1.0" encoding="utf-8"?>
-+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-+ <ItemGroup Label="ProjectConfigurations">
-+ <ProjectConfiguration Include="Debug|Win32">
-+ <Configuration>Debug</Configuration>
-+ <Platform>Win32</Platform>
-+ </ProjectConfiguration>
-+ <ProjectConfiguration Include="Debug|x64">
-+ <Configuration>Debug</Configuration>
-+ <Platform>x64</Platform>
-+ </ProjectConfiguration>
-+ <ProjectConfiguration Include="Release|Win32">
-+ <Configuration>Release</Configuration>
-+ <Platform>Win32</Platform>
-+ </ProjectConfiguration>
-+ <ProjectConfiguration Include="Release|x64">
-+ <Configuration>Release</Configuration>
-+ <Platform>x64</Platform>
-+ </ProjectConfiguration>
-+ </ItemGroup>
-+ <ItemGroup>
-+ <ClCompile Include="..\..\source\decoder\bitstream.c" />
-+ <ClCompile Include="..\..\source\decoder\dec_util.c" />
-+ <ClCompile Include="..\..\source\decoder\parser.c" />
-+ <ClCompile Include="..\..\source\decoder\uavs3d.c" />
-+ </ItemGroup>
-+ <ItemGroup>
-+ <ClInclude Include="..\..\contributor.h" />
-+ <ClInclude Include="..\..\source\decoder\bitstream.h" />
-+ <ClInclude Include="..\..\source\decoder\dec_type.h" />
-+ <ClInclude Include="..\..\source\decoder\dec_util.h" />
-+ <ClInclude Include="..\..\source\decoder\parser.h" />
-+ <ClInclude Include="..\..\source\decoder\uavs3d.h" />
-+ </ItemGroup>
-+ <PropertyGroup Label="Globals">
-+ <ProjectGuid>{40B445E8-306A-4C77-9B19-FC76C2379F79}</ProjectGuid>
-+ <RootNamespace>dec_lib</RootNamespace>
-+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
-+ <ProjectName>libuavs3d</ProjectName>
-+ </PropertyGroup>
-+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-+ <ConfigurationType>DynamicLibrary</ConfigurationType>
-+ <UseDebugLibraries>true</UseDebugLibraries>
-+ <PlatformToolset>v141</PlatformToolset>
-+ <CharacterSet>MultiByte</CharacterSet>
-+ </PropertyGroup>
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-+ <ConfigurationType>DynamicLibrary</ConfigurationType>
-+ <UseDebugLibraries>true</UseDebugLibraries>
-+ <PlatformToolset>v141</PlatformToolset>
-+ <CharacterSet>MultiByte</CharacterSet>
-+ </PropertyGroup>
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-+ <ConfigurationType>DynamicLibrary</ConfigurationType>
-+ <UseDebugLibraries>false</UseDebugLibraries>
-+ <PlatformToolset>v141</PlatformToolset>
-+ <WholeProgramOptimization>true</WholeProgramOptimization>
-+ <CharacterSet>MultiByte</CharacterSet>
-+ </PropertyGroup>
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-+ <ConfigurationType>DynamicLibrary</ConfigurationType>
-+ <UseDebugLibraries>false</UseDebugLibraries>
-+ <PlatformToolset>v141</PlatformToolset>
-+ <WholeProgramOptimization>true</WholeProgramOptimization>
-+ <CharacterSet>MultiByte</CharacterSet>
-+ </PropertyGroup>
-+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-+ <ImportGroup Label="ExtensionSettings">
-+ </ImportGroup>
-+ <ImportGroup Label="Shared">
-+ </ImportGroup>
-+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-+ </ImportGroup>
-+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
-+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-+ </ImportGroup>
-+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-+ </ImportGroup>
-+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
-+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-+ </ImportGroup>
-+ <PropertyGroup Label="UserMacros" />
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-+ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
-+ <OutDir>..\..\bin</OutDir>
-+ <LibraryPath>..\..\lib;$(LibraryPath)</LibraryPath>
-+ </PropertyGroup>
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-+ <LibraryPath>..\..\lib;$(LibraryPath)</LibraryPath>
-+ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
-+ </PropertyGroup>
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-+ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
-+ <OutDir>..\..\bin</OutDir>
-+ <LibraryPath>..\..\lib;$(LibraryPath)</LibraryPath>
-+ </PropertyGroup>
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-+ <LibraryPath>..\..\lib;$(LibraryPath)</LibraryPath>
-+ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
-+ </PropertyGroup>
-+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-+ <ClCompile>
-+ <WarningLevel>Level3</WarningLevel>
-+ <Optimization>Disabled</Optimization>
-+ <SDLCheck>true</SDLCheck>
-+ <AdditionalIncludeDirectories>..\..\source\decore;..\..\source\decoder</AdditionalIncludeDirectories>
-+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-+ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
-+ <PreprocessorDefinitions>WIN64;;%(PreprocessorDefinitions);UAVS3D_EXPORTS;_DEBUG</PreprocessorDefinitions>
-+ <TreatWarningAsError>true</TreatWarningAsError>
-+ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
-+ </ClCompile>
-+ <Link>
-+ <GenerateDebugInformation>true</GenerateDebugInformation>
-+ <AdditionalDependencies>common.lib;%(AdditionalDependencies)</AdditionalDependencies>
-+ <ShowProgress>NotSet</ShowProgress>
-+ <Version>1.0</Version>
-+ </Link>
-+ </ItemDefinitionGroup>
-+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-+ <ClCompile>
-+ <WarningLevel>Level3</WarningLevel>
-+ <Optimization>Disabled</Optimization>
-+ <SDLCheck>true</SDLCheck>
-+ <AdditionalIncludeDirectories>..\..\source\decore;..\..\source\decoder</AdditionalIncludeDirectories>
-+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-+ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
-+ <PreprocessorDefinitions>WIN64;;%(PreprocessorDefinitions);UAVS3D_EXPORTS;_DEBUG</PreprocessorDefinitions>
-+ <TreatWarningAsError>true</TreatWarningAsError>
-+ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
-+ </ClCompile>
-+ <Link>
-+ <GenerateDebugInformation>true</GenerateDebugInformation>
-+ <AdditionalDependencies>common.lib;%(AdditionalDependencies)</AdditionalDependencies>
-+ <ShowProgress>NotSet</ShowProgress>
-+ <Version>1.0</Version>
-+ </Link>
-+ </ItemDefinitionGroup>
-+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-+ <ClCompile>
-+ <WarningLevel>Level3</WarningLevel>
-+ <Optimization>MaxSpeed</Optimization>
-+ <FunctionLevelLinking>true</FunctionLevelLinking>
-+ <IntrinsicFunctions>true</IntrinsicFunctions>
-+ <SDLCheck>true</SDLCheck>
-+ <AdditionalIncludeDirectories>..\..\source\decore;..\..\source\decoder</AdditionalIncludeDirectories>
-+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-+ <CompileAs>CompileAsC</CompileAs>
-+ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
-+ <PreprocessorDefinitions>WIN64;;%(PreprocessorDefinitions);UAVS3D_EXPORTS;</PreprocessorDefinitions>
-+ <TreatWarningAsError>true</TreatWarningAsError>
-+ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
-+ </ClCompile>
-+ <Link>
-+ <GenerateDebugInformation>true</GenerateDebugInformation>
-+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
-+ <OptimizeReferences>true</OptimizeReferences>
-+ <AdditionalDependencies>common.lib;%(AdditionalDependencies)</AdditionalDependencies>
-+ <ShowProgress>NotSet</ShowProgress>
-+ <Version>1.0</Version>
-+ </Link>
-+ </ItemDefinitionGroup>
-+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-+ <ClCompile>
-+ <WarningLevel>Level3</WarningLevel>
-+ <Optimization>MaxSpeed</Optimization>
-+ <FunctionLevelLinking>true</FunctionLevelLinking>
-+ <IntrinsicFunctions>true</IntrinsicFunctions>
-+ <SDLCheck>true</SDLCheck>
-+ <AdditionalIncludeDirectories>..\..\source\decore;..\..\source\decoder</AdditionalIncludeDirectories>
-+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-+ <CompileAs>CompileAsC</CompileAs>
-+ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
-+ <PreprocessorDefinitions>WIN64;;%(PreprocessorDefinitions);UAVS3D_EXPORTS;</PreprocessorDefinitions>
-+ <TreatWarningAsError>true</TreatWarningAsError>
-+ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
-+ </ClCompile>
-+ <Link>
-+ <GenerateDebugInformation>true</GenerateDebugInformation>
-+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
-+ <OptimizeReferences>true</OptimizeReferences>
-+ <AdditionalDependencies>common.lib;%(AdditionalDependencies)</AdditionalDependencies>
-+ <ShowProgress>NotSet</ShowProgress>
-+ <Version>1.0</Version>
-+ </Link>
-+ </ItemDefinitionGroup>
-+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-+ <ImportGroup Label="ExtensionTargets">
-+ </ImportGroup>
- </Project>
-\ No newline at end of file
-diff --git a/build/x86_windows/uavs3d.sln b/build/vs2017/uavs3d.sln
-similarity index 68%
-rename from build/x86_windows/uavs3d.sln
-rename to build/vs2017/uavs3d.sln
-index e6d34c4..d098d33 100644
---- a/build/x86_windows/uavs3d.sln
-+++ b/build/vs2017/uavs3d.sln
-@@ -1,47 +1,61 @@
--
--Microsoft Visual Studio Solution File, Format Version 12.00
--# Visual Studio 15
--VisualStudioVersion = 15.0.27130.2026
--MinimumVisualStudioVersion = 10.0.40219.1
--Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common", "common.vcxproj", "{3F9C7116-C287-40D7-865C-D8C89CF4FF31}"
--EndProject
--Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uavs3d", "uavs3d.vcxproj", "{798F7D68-C94D-41AF-86A4-98F7726D172C}"
-- ProjectSection(ProjectDependencies) = postProject
-- {3F9C7116-C287-40D7-865C-D8C89CF4FF31} = {3F9C7116-C287-40D7-865C-D8C89CF4FF31}
-- {40B445E8-306A-4C77-9B19-FC76C2379F79} = {40B445E8-306A-4C77-9B19-FC76C2379F79}
-- EndProjectSection
--EndProject
--Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libuavs3d", "libuavs3d.vcxproj", "{40B445E8-306A-4C77-9B19-FC76C2379F79}"
-- ProjectSection(ProjectDependencies) = postProject
-- {3F9C7116-C287-40D7-865C-D8C89CF4FF31} = {3F9C7116-C287-40D7-865C-D8C89CF4FF31}
-- EndProjectSection
--EndProject
--Global
-- GlobalSection(SolutionConfigurationPlatforms) = preSolution
-- Debug|x64 = Debug|x64
-- Release|x64 = Release|x64
-- EndGlobalSection
-- GlobalSection(ProjectConfigurationPlatforms) = postSolution
-- {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Debug|x64.ActiveCfg = Debug|x64
-- {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Debug|x64.Build.0 = Debug|x64
-- {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Release|x64.ActiveCfg = Release|x64
-- {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Release|x64.Build.0 = Release|x64
-- {798F7D68-C94D-41AF-86A4-98F7726D172C}.Debug|x64.ActiveCfg = Debug|x64
-- {798F7D68-C94D-41AF-86A4-98F7726D172C}.Debug|x64.Build.0 = Debug|x64
-- {798F7D68-C94D-41AF-86A4-98F7726D172C}.Release|x64.ActiveCfg = Release|x64
-- {798F7D68-C94D-41AF-86A4-98F7726D172C}.Release|x64.Build.0 = Release|x64
-- {40B445E8-306A-4C77-9B19-FC76C2379F79}.Debug|x64.ActiveCfg = Debug|x64
-- {40B445E8-306A-4C77-9B19-FC76C2379F79}.Debug|x64.Build.0 = Debug|x64
-- {40B445E8-306A-4C77-9B19-FC76C2379F79}.Release|x64.ActiveCfg = Release|x64
-- {40B445E8-306A-4C77-9B19-FC76C2379F79}.Release|x64.Build.0 = Release|x64
-- EndGlobalSection
-- GlobalSection(SolutionProperties) = preSolution
-- HideSolutionNode = FALSE
-- EndGlobalSection
-- GlobalSection(ExtensibilityGlobals) = postSolution
-- SolutionGuid = {ED69324B-A55F-49DC-91D3-5F1D34DF875C}
-- EndGlobalSection
-- GlobalSection(Performance) = preSolution
-- HasPerformanceSessions = true
-- EndGlobalSection
--EndGlobal
-+
-+Microsoft Visual Studio Solution File, Format Version 12.00
-+# Visual Studio 15
-+VisualStudioVersion = 15.0.26228.4
-+MinimumVisualStudioVersion = 10.0.40219.1
-+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common", "common.vcxproj", "{3F9C7116-C287-40D7-865C-D8C89CF4FF31}"
-+EndProject
-+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uavs3d", "uavs3d.vcxproj", "{798F7D68-C94D-41AF-86A4-98F7726D172C}"
-+ ProjectSection(ProjectDependencies) = postProject
-+ {3F9C7116-C287-40D7-865C-D8C89CF4FF31} = {3F9C7116-C287-40D7-865C-D8C89CF4FF31}
-+ {40B445E8-306A-4C77-9B19-FC76C2379F79} = {40B445E8-306A-4C77-9B19-FC76C2379F79}
-+ EndProjectSection
-+EndProject
-+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libuavs3d", "libuavs3d.vcxproj", "{40B445E8-306A-4C77-9B19-FC76C2379F79}"
-+ ProjectSection(ProjectDependencies) = postProject
-+ {3F9C7116-C287-40D7-865C-D8C89CF4FF31} = {3F9C7116-C287-40D7-865C-D8C89CF4FF31}
-+ EndProjectSection
-+EndProject
-+Global
-+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
-+ Debug|x64 = Debug|x64
-+ Debug|x86 = Debug|x86
-+ Release|x64 = Release|x64
-+ Release|x86 = Release|x86
-+ EndGlobalSection
-+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
-+ {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Debug|x64.ActiveCfg = Debug|x64
-+ {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Debug|x64.Build.0 = Debug|x64
-+ {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Debug|x86.ActiveCfg = Debug|Win32
-+ {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Debug|x86.Build.0 = Debug|Win32
-+ {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Release|x64.ActiveCfg = Release|x64
-+ {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Release|x64.Build.0 = Release|x64
-+ {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Release|x86.ActiveCfg = Release|Win32
-+ {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Release|x86.Build.0 = Release|Win32
-+ {798F7D68-C94D-41AF-86A4-98F7726D172C}.Debug|x64.ActiveCfg = Debug|x64
-+ {798F7D68-C94D-41AF-86A4-98F7726D172C}.Debug|x64.Build.0 = Debug|x64
-+ {798F7D68-C94D-41AF-86A4-98F7726D172C}.Debug|x86.ActiveCfg = Debug|Win32
-+ {798F7D68-C94D-41AF-86A4-98F7726D172C}.Debug|x86.Build.0 = Debug|Win32
-+ {798F7D68-C94D-41AF-86A4-98F7726D172C}.Release|x64.ActiveCfg = Release|x64
-+ {798F7D68-C94D-41AF-86A4-98F7726D172C}.Release|x64.Build.0 = Release|x64
-+ {798F7D68-C94D-41AF-86A4-98F7726D172C}.Release|x86.ActiveCfg = Release|Win32
-+ {798F7D68-C94D-41AF-86A4-98F7726D172C}.Release|x86.Build.0 = Release|Win32
-+ {40B445E8-306A-4C77-9B19-FC76C2379F79}.Debug|x64.ActiveCfg = Debug|x64
-+ {40B445E8-306A-4C77-9B19-FC76C2379F79}.Debug|x64.Build.0 = Debug|x64
-+ {40B445E8-306A-4C77-9B19-FC76C2379F79}.Debug|x86.ActiveCfg = Debug|Win32
-+ {40B445E8-306A-4C77-9B19-FC76C2379F79}.Debug|x86.Build.0 = Debug|Win32
-+ {40B445E8-306A-4C77-9B19-FC76C2379F79}.Release|x64.ActiveCfg = Release|x64
-+ {40B445E8-306A-4C77-9B19-FC76C2379F79}.Release|x64.Build.0 = Release|x64
-+ {40B445E8-306A-4C77-9B19-FC76C2379F79}.Release|x86.ActiveCfg = Release|Win32
-+ {40B445E8-306A-4C77-9B19-FC76C2379F79}.Release|x86.Build.0 = Release|Win32
-+ EndGlobalSection
-+ GlobalSection(SolutionProperties) = preSolution
-+ HideSolutionNode = FALSE
-+ EndGlobalSection
-+ GlobalSection(ExtensibilityGlobals) = postSolution
-+ SolutionGuid = {ED69324B-A55F-49DC-91D3-5F1D34DF875C}
-+ EndGlobalSection
-+ GlobalSection(Performance) = preSolution
-+ HasPerformanceSessions = true
-+ EndGlobalSection
-+EndGlobal
-diff --git a/build/x86_windows/uavs3d.vcxproj b/build/vs2017/uavs3d.vcxproj
-similarity index 55%
-rename from build/x86_windows/uavs3d.vcxproj
-rename to build/vs2017/uavs3d.vcxproj
-index 9557243..25603ec 100644
---- a/build/x86_windows/uavs3d.vcxproj
-+++ b/build/vs2017/uavs3d.vcxproj
-@@ -1,118 +1,200 @@
--<?xml version="1.0" encoding="utf-8"?>
--<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-- <ItemGroup Label="ProjectConfigurations">
-- <ProjectConfiguration Include="Debug|x64">
-- <Configuration>Debug</Configuration>
-- <Platform>x64</Platform>
-- </ProjectConfiguration>
-- <ProjectConfiguration Include="Release|x64">
-- <Configuration>Release</Configuration>
-- <Platform>x64</Platform>
-- </ProjectConfiguration>
-- </ItemGroup>
-- <PropertyGroup Label="Globals">
-- <ProjectGuid>{798F7D68-C94D-41AF-86A4-98F7726D172C}</ProjectGuid>
-- <Keyword>Win32Proj</Keyword>
-- <RootNamespace>dec_test_vs17</RootNamespace>
-- <ProjectName>uavs3d</ProjectName>
-- <WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
-- </PropertyGroup>
-- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-- <ConfigurationType>Application</ConfigurationType>
-- <UseDebugLibraries>true</UseDebugLibraries>
-- <CharacterSet>MultiByte</CharacterSet>
-- <PlatformToolset>v141</PlatformToolset>
-- </PropertyGroup>
-- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-- <ConfigurationType>Application</ConfigurationType>
-- <UseDebugLibraries>false</UseDebugLibraries>
-- <WholeProgramOptimization>true</WholeProgramOptimization>
-- <CharacterSet>MultiByte</CharacterSet>
-- <PlatformToolset>v141</PlatformToolset>
-- </PropertyGroup>
-- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-- <ImportGroup Label="ExtensionSettings">
-- </ImportGroup>
-- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
-- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-- </ImportGroup>
-- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
-- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-- </ImportGroup>
-- <PropertyGroup Label="UserMacros" />
-- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-- <LinkIncremental>false</LinkIncremental>
-- <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
-- <OutDir>$(SolutionDir)\..\..\bin</OutDir>
-- </PropertyGroup>
-- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-- <LinkIncremental>false</LinkIncremental>
-- <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
-- <OutDir>$(SolutionDir)\..\..\bin</OutDir>
-- </PropertyGroup>
-- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-- <ClCompile>
-- <PrecompiledHeader>
-- </PrecompiledHeader>
-- <WarningLevel>Level3</WarningLevel>
-- <Optimization>Disabled</Optimization>
-- <PreprocessorDefinitions>WIN64;_CONSOLE;%(PreprocessorDefinitions);_DEBUG</PreprocessorDefinitions>
-- <AdditionalIncludeDirectories>..\..\inc;..\..\src</AdditionalIncludeDirectories>
-- <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
-- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-- <TreatWarningAsError>true</TreatWarningAsError>
-- <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
-- </ClCompile>
-- <Link>
-- <SubSystem>Console</SubSystem>
-- <GenerateDebugInformation>true</GenerateDebugInformation>
-- <AdditionalDependencies>
-- </AdditionalDependencies>
-- <AdditionalLibraryDirectories>..\..\lib</AdditionalLibraryDirectories>
-- </Link>
-- </ItemDefinitionGroup>
-- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-- <ClCompile>
-- <WarningLevel>Level3</WarningLevel>
-- <PrecompiledHeader>
-- </PrecompiledHeader>
-- <Optimization>MaxSpeed</Optimization>
-- <FunctionLevelLinking>true</FunctionLevelLinking>
-- <IntrinsicFunctions>true</IntrinsicFunctions>
-- <PreprocessorDefinitions>WIN64;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-- <AdditionalIncludeDirectories>..\..\inc;..\..\src</AdditionalIncludeDirectories>
-- <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
-- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-- <TreatWarningAsError>true</TreatWarningAsError>
-- <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
-- </ClCompile>
-- <Link>
-- <SubSystem>Console</SubSystem>
-- <GenerateDebugInformation>true</GenerateDebugInformation>
-- <EnableCOMDATFolding>true</EnableCOMDATFolding>
-- <OptimizeReferences>true</OptimizeReferences>
-- <AdditionalDependencies>
-- </AdditionalDependencies>
-- <AdditionalLibraryDirectories>..\..\lib</AdditionalLibraryDirectories>
-- </Link>
-- </ItemDefinitionGroup>
-- <ItemGroup>
-- <ClInclude Include="..\..\test\utest.h" />
-- </ItemGroup>
-- <ItemGroup>
-- <ClCompile Include="..\..\test\utest.c" />
-- </ItemGroup>
-- <ItemGroup>
-- <ProjectReference Include="common.vcxproj">
-- <Project>{3f9c7116-c287-40d7-865c-d8c89cf4ff31}</Project>
-- </ProjectReference>
-- <ProjectReference Include="libuavs3d.vcxproj">
-- <Project>{40b445e8-306a-4c77-9b19-fc76c2379f79}</Project>
-- </ProjectReference>
-- </ItemGroup>
-- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-- <ImportGroup Label="ExtensionTargets">
-- </ImportGroup>
-+<?xml version="1.0" encoding="utf-8"?>
-+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-+ <ItemGroup Label="ProjectConfigurations">
-+ <ProjectConfiguration Include="Debug|Win32">
-+ <Configuration>Debug</Configuration>
-+ <Platform>Win32</Platform>
-+ </ProjectConfiguration>
-+ <ProjectConfiguration Include="Debug|x64">
-+ <Configuration>Debug</Configuration>
-+ <Platform>x64</Platform>
-+ </ProjectConfiguration>
-+ <ProjectConfiguration Include="Release|Win32">
-+ <Configuration>Release</Configuration>
-+ <Platform>Win32</Platform>
-+ </ProjectConfiguration>
-+ <ProjectConfiguration Include="Release|x64">
-+ <Configuration>Release</Configuration>
-+ <Platform>x64</Platform>
-+ </ProjectConfiguration>
-+ </ItemGroup>
-+ <PropertyGroup Label="Globals">
-+ <ProjectGuid>{798F7D68-C94D-41AF-86A4-98F7726D172C}</ProjectGuid>
-+ <Keyword>Win32Proj</Keyword>
-+ <RootNamespace>dec_test_vs17</RootNamespace>
-+ <ProjectName>uavs3d</ProjectName>
-+ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
-+ </PropertyGroup>
-+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-+ <ConfigurationType>Application</ConfigurationType>
-+ <UseDebugLibraries>true</UseDebugLibraries>
-+ <CharacterSet>MultiByte</CharacterSet>
-+ <PlatformToolset>v141</PlatformToolset>
-+ </PropertyGroup>
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-+ <ConfigurationType>Application</ConfigurationType>
-+ <UseDebugLibraries>true</UseDebugLibraries>
-+ <CharacterSet>MultiByte</CharacterSet>
-+ <PlatformToolset>v141</PlatformToolset>
-+ </PropertyGroup>
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-+ <ConfigurationType>Application</ConfigurationType>
-+ <UseDebugLibraries>false</UseDebugLibraries>
-+ <WholeProgramOptimization>true</WholeProgramOptimization>
-+ <CharacterSet>MultiByte</CharacterSet>
-+ <PlatformToolset>v141</PlatformToolset>
-+ </PropertyGroup>
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-+ <ConfigurationType>Application</ConfigurationType>
-+ <UseDebugLibraries>false</UseDebugLibraries>
-+ <WholeProgramOptimization>true</WholeProgramOptimization>
-+ <CharacterSet>MultiByte</CharacterSet>
-+ <PlatformToolset>v141</PlatformToolset>
-+ </PropertyGroup>
-+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-+ <ImportGroup Label="ExtensionSettings">
-+ </ImportGroup>
-+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
-+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-+ </ImportGroup>
-+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
-+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-+ </ImportGroup>
-+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
-+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-+ </ImportGroup>
-+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
-+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-+ </ImportGroup>
-+ <PropertyGroup Label="UserMacros" />
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-+ <LinkIncremental>false</LinkIncremental>
-+ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
-+ <OutDir>$(SolutionDir)\..\..\bin</OutDir>
-+ </PropertyGroup>
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-+ <LinkIncremental>false</LinkIncremental>
-+ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
-+ </PropertyGroup>
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-+ <LinkIncremental>false</LinkIncremental>
-+ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
-+ <OutDir>$(SolutionDir)\..\..\bin</OutDir>
-+ </PropertyGroup>
-+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-+ <LinkIncremental>false</LinkIncremental>
-+ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
-+ </PropertyGroup>
-+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-+ <ClCompile>
-+ <PrecompiledHeader>
-+ </PrecompiledHeader>
-+ <WarningLevel>Level3</WarningLevel>
-+ <Optimization>Disabled</Optimization>
-+ <PreprocessorDefinitions>WIN64;_CONSOLE;%(PreprocessorDefinitions);_DEBUG</PreprocessorDefinitions>
-+ <AdditionalIncludeDirectories>..\..\inc;..\..\src</AdditionalIncludeDirectories>
-+ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
-+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-+ <TreatWarningAsError>true</TreatWarningAsError>
-+ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
-+ </ClCompile>
-+ <Link>
-+ <SubSystem>Console</SubSystem>
-+ <GenerateDebugInformation>true</GenerateDebugInformation>
-+ <AdditionalDependencies>
-+ </AdditionalDependencies>
-+ <AdditionalLibraryDirectories>..\..\lib</AdditionalLibraryDirectories>
-+ </Link>
-+ </ItemDefinitionGroup>
-+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-+ <ClCompile>
-+ <PrecompiledHeader>
-+ </PrecompiledHeader>
-+ <WarningLevel>Level3</WarningLevel>
-+ <Optimization>Disabled</Optimization>
-+ <PreprocessorDefinitions>WIN64;_CONSOLE;%(PreprocessorDefinitions);_DEBUG</PreprocessorDefinitions>
-+ <AdditionalIncludeDirectories>..\..\inc;..\..\src</AdditionalIncludeDirectories>
-+ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
-+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-+ <TreatWarningAsError>true</TreatWarningAsError>
-+ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
-+ </ClCompile>
-+ <Link>
-+ <SubSystem>Console</SubSystem>
-+ <GenerateDebugInformation>true</GenerateDebugInformation>
-+ <AdditionalDependencies>
-+ </AdditionalDependencies>
-+ <AdditionalLibraryDirectories>..\..\lib</AdditionalLibraryDirectories>
-+ </Link>
-+ </ItemDefinitionGroup>
-+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-+ <ClCompile>
-+ <WarningLevel>Level3</WarningLevel>
-+ <PrecompiledHeader>
-+ </PrecompiledHeader>
-+ <Optimization>MaxSpeed</Optimization>
-+ <FunctionLevelLinking>true</FunctionLevelLinking>
-+ <IntrinsicFunctions>true</IntrinsicFunctions>
-+ <PreprocessorDefinitions>WIN64;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-+ <AdditionalIncludeDirectories>..\..\inc;..\..\src</AdditionalIncludeDirectories>
-+ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
-+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-+ <TreatWarningAsError>true</TreatWarningAsError>
-+ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
-+ </ClCompile>
-+ <Link>
-+ <SubSystem>Console</SubSystem>
-+ <GenerateDebugInformation>true</GenerateDebugInformation>
-+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
-+ <OptimizeReferences>true</OptimizeReferences>
-+ <AdditionalDependencies>
-+ </AdditionalDependencies>
-+ <AdditionalLibraryDirectories>..\..\lib</AdditionalLibraryDirectories>
-+ </Link>
-+ </ItemDefinitionGroup>
-+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-+ <ClCompile>
-+ <WarningLevel>Level3</WarningLevel>
-+ <PrecompiledHeader>
-+ </PrecompiledHeader>
-+ <Optimization>MaxSpeed</Optimization>
-+ <FunctionLevelLinking>true</FunctionLevelLinking>
-+ <IntrinsicFunctions>true</IntrinsicFunctions>
-+ <PreprocessorDefinitions>WIN64;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-+ <AdditionalIncludeDirectories>..\..\inc;..\..\src</AdditionalIncludeDirectories>
-+ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
-+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-+ <TreatWarningAsError>true</TreatWarningAsError>
-+ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
-+ </ClCompile>
-+ <Link>
-+ <SubSystem>Console</SubSystem>
-+ <GenerateDebugInformation>true</GenerateDebugInformation>
-+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
-+ <OptimizeReferences>true</OptimizeReferences>
-+ <AdditionalDependencies>
-+ </AdditionalDependencies>
-+ <AdditionalLibraryDirectories>..\..\lib</AdditionalLibraryDirectories>
-+ </Link>
-+ </ItemDefinitionGroup>
-+ <ItemGroup>
-+ <ClInclude Include="..\..\test\utest.h" />
-+ </ItemGroup>
-+ <ItemGroup>
-+ <ClCompile Include="..\..\test\utest.c" />
-+ </ItemGroup>
-+ <ItemGroup>
-+ <ProjectReference Include="common.vcxproj">
-+ <Project>{3f9c7116-c287-40d7-865c-d8c89cf4ff31}</Project>
-+ </ProjectReference>
-+ <ProjectReference Include="libuavs3d.vcxproj">
-+ <Project>{40b445e8-306a-4c77-9b19-fc76c2379f79}</Project>
-+ </ProjectReference>
-+ </ItemGroup>
-+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-+ <ImportGroup Label="ExtensionTargets">
-+ </ImportGroup>
- </Project>
-\ No newline at end of file
-diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
-index 4530a63..b52363e 100644
---- a/source/CMakeLists.txt
-+++ b/source/CMakeLists.txt
-@@ -1,19 +1,93 @@
-
- set(LIBNAME uavs3d)
-
-+# check cpu
-+if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "AMD64" OR
-+ "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64")
-+ if(${CMAKE_SIZEOF_VOID_P} EQUAL 4)
-+ set(UAVS3D_TARGET_CPU "x86")
-+ elseif(${CMAKE_SIZEOF_VOID_P} EQUAL 8)
-+ set(UAVS3D_TARGET_CPU "x86_64")
-+ else()
-+ message(FATAL_ERROR
-+ " Unexpected pointer size ${CMAKE_SIZEOF_VOID_P} for ${CMAKE_SYSTEM_PROCESSOR}\n")
-+ endif()
-+elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i386" OR
-+ "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86")
-+ set(UAVS3D_TARGET_CPU "x86")
-+elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64" OR
-+ "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "arm64")
-+ set(UAVS3D_TARGET_CPU "arm64")
-+elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "^arm")
-+ set(UAVS3D_TARGET_CPU "armv7")
-+elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "loongarch64")
-+ set(UAVS3D_TARGET_CPU "loongarch64")
-+else()
-+ message(WARNING "unsupported architecture: ${CMAKE_SYSTEM_PROCESSOR}\n")
-+ set(UAVS3D_TARGET_CPU "generic")
-+endif()
-+
- # add source
- aux_source_directory(./decoder DIR_UAVS3D_SRC)
- aux_source_directory(./decore DIR_UAVS3D_CORE)
--aux_source_directory(./decore/sse DIR_X86_SRC)
--aux_source_directory(./decore/avx2 DIR_X86_256_SRC)
-
- list(APPEND DIR_UAVS3D_SRC ${DIR_UAVS3D_CORE})
-
- include_directories("decore")
-+set(UAVS3D_ASM_FILES "")
-+
-+if("${UAVS3D_TARGET_CPU}" MATCHES "x86" OR
-+ "${UAVS3D_TARGET_CPU}" MATCHES "x86_64")
-+ aux_source_directory(./decore/sse DIR_X86_SRC)
-+ aux_source_directory(./decore/avx2 DIR_X86_256_SRC)
-+ set_source_files_properties(${DIR_X86_SRC} PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -msse4.2")
-+ set_source_files_properties(${DIR_X86_256_SRC} PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -mavx2")
-+
-+ list(APPEND UAVS3D_ASM_FILES ${DIR_X86_SRC})
-+ list(APPEND UAVS3D_ASM_FILES ${DIR_X86_256_SRC})
-+elseif("${UAVS3D_TARGET_CPU}" MATCHES "armv7")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/armv7.c")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/alf_armv7.S")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/deblock_armv7.S")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/def_armv7.S")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/inter_pred_armv7.S")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/intra_pred_armv7.S")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/dct2_armv7.S")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/itrans_dct8_dst7_armv7.S")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/pixel_armv7.S")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/sao_armv7.c")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/sao_kernel_armv7.S")
-+
-+ add_definitions(-D _armv7a)
-+ enable_language(ASM)
-+elseif("${UAVS3D_TARGET_CPU}" MATCHES "arm64")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/arm64.c")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/alf_arm64.S")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/deblock_arm64.S")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/def_arm64.S")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/inter_pred_arm64.S")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/intra_pred_arm64.S")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/intra_pred_chroma_arm64.S")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/itrans_arm64.c")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/itrans_dct2_arm64.S")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/itrans_dct8_dst7_arm64.S")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/pixel_arm64.S")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/sao_arm64.c")
-+ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/sao_kernel_arm64.S")
-
--set_source_files_properties(${DIR_UAVS3D_SRC} PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -fPIC -std=c99 -O3")
--set_source_files_properties(${DIR_X86_SRC} PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -fPIC -std=c99 -O3 -msse4.2")
--set_source_files_properties(${DIR_X86_256_SRC} PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -fPIC -std=c99 -O3 -mavx2")
-+ add_definitions(-D _arm64)
-+ enable_language(ASM)
-+elseif("${UAVS3D_TARGET_CPU}" MATCHES "loongarch64")
-+ # loongarch64
-+endif()
-+
-+if(COMPILE_10BIT)
-+ add_definitions(-DCOMPILE_10BIT=1)
-+ message("-- compile 10bit")
-+else()
-+ add_definitions(-DCOMPILE_10BIT=0)
-+ message("-- compile 8bit")
-+endif()
-
- # get version
- set (CONFIG_DIR ${CMAKE_CURRENT_SOURCE_DIR}/..)
-@@ -30,6 +104,7 @@ endfunction()
- extract_version_string("${CONFIG_DIR}/version.h" uavs3d_version)
- MESSAGE(STATUS "uavs3d version \t\t: ${uavs3d_version}")
-
-+MESSAGE(STATUS "Target CPU\t\t\t: ${UAVS3D_TARGET_CPU}")
- # pkg-config
- find_package(Threads REQUIRED)
- set(prefix "${CMAKE_INSTALL_PREFIX}")
-@@ -65,9 +140,11 @@ MESSAGE(STATUS "BUILD_SHARED_LIBS \t\t: true")
- else()
- MESSAGE(STATUS "BUILD_SHARED_LIBS \t\t: false")
- endif()
--add_library(${LIBNAME} ${DIR_UAVS3D_SRC} ${DIR_X86_256_SRC} ${DIR_X86_SRC})
-+add_library(${LIBNAME} ${DIR_UAVS3D_SRC} ${UAVS3D_ASM_FILES})
-
--target_link_libraries(${LIBNAME} m)
-+if (NOT MSVC)
-+ target_link_libraries(${LIBNAME} m)
-+endif()
- if(CMAKE_USE_PTHREADS_INIT)
- target_link_libraries(${LIBNAME} pthread)
- endif()
-@@ -76,4 +153,3 @@ endif()
- install(TARGETS uavs3d LIBRARY DESTINATION ${CMAKE_INSTALL_LIB_DIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIB_DIR})
- install(FILES decoder/uavs3d.h DESTINATION ${CMAKE_INSTALL_INCLUDE_DIR})
- install(FILES ${CONFIG_DIR}/${LIBNAME}.pc DESTINATION ${CMAKE_INSTALL_PKGCONFIG_DIR})
--
-diff --git a/source/decoder/bitstream.c b/source/decoder/bitstream.c
-index 9c433ad..1c3aaac 100644
---- a/source/decoder/bitstream.c
-+++ b/source/decoder/bitstream.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decoder/bitstream.h b/source/decoder/bitstream.h
-index 60052b4..f1b1043 100644
---- a/source/decoder/bitstream.h
-+++ b/source/decoder/bitstream.h
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decoder/dec_type.h b/source/decoder/dec_type.h
-index 1761605..cfb0442 100644
---- a/source/decoder/dec_type.h
-+++ b/source/decoder/dec_type.h
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decoder/dec_util.c b/source/decoder/dec_util.c
-index e9374d9..e30e323 100644
---- a/source/decoder/dec_util.c
-+++ b/source/decoder/dec_util.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -250,7 +245,7 @@ static void uavs3d_always_inline com_mv_rounding_affine(s32 hor, s32 ver, s32 *
- }
- }
-
--static void uavs3d_always_inline check_umve_motion_availability(int scup, int cu_width, int cu_height, int i_scu, int neighbor[NUM_SPATIAL_MV], int valid[NUM_SPATIAL_MV], com_scu_t * map_scu, s16(*map_mv)[REFP_NUM][MV_D], s8(*map_refi)[REFP_NUM])
-+static void uavs3d_always_inline check_umve_motion_availability(int scup, int cu_width, int cu_height, int i_scu, int neighbor[5], int valid[5], com_scu_t * map_scu, s16(*map_mv)[REFP_NUM][MV_D], s8(*map_refi)[REFP_NUM])
- {
- int cu_width_in_scu = cu_width >> MIN_CU_LOG2;
- int cu_height_in_scu = cu_height >> MIN_CU_LOG2;
-@@ -985,7 +980,6 @@ static int get_affine_merge_candidate(com_core_t *core, s8 mrg_list_refi[REFP_NU
- int scup = core->cu_scup;
- com_map_t *map = &core->map;
- com_seqh_t *seqhdr = core->seqhdr;
-- com_ref_pic_t(*refp)[REFP_NUM] = core->refp;
- int i_scu = seqhdr->i_scu;
- int lidx, i, k;
- int cu_width = core->cu_width;
-@@ -1112,6 +1106,7 @@ static int get_affine_merge_candidate(com_core_t *core, s8 mrg_list_refi[REFP_NU
- int neb_addr_rb = scup + i_scu * (cu_height_in_scu - 1) + (cu_width_in_scu - 1);
- int scu_y;
- int scup_co = get_colocal_scup(neb_addr_rb, i_scu, seqhdr->pic_width_in_scu, seqhdr->pic_height_in_scu, &scu_y);
-+ com_ref_pic_t(*refp)[REFP_NUM] = core->refp;
-
- if (core->pichdr->slice_type == SLICE_B) {
- uavs3d_check_ref_avaliable(refp[0][REFP_1].pic, scu_y << MIN_CU_LOG2);
-diff --git a/source/decoder/dec_util.h b/source/decoder/dec_util.h
-index 77c00a6..9d46217 100644
---- a/source/decoder/dec_util.h
-+++ b/source/decoder/dec_util.h
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decoder/parser.c b/source/decoder/parser.c
-index 45bb26a..9405daa 100644
---- a/source/decoder/parser.c
-+++ b/source/decoder/parser.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -88,6 +83,9 @@ int dec_parse_sqh(com_bs_t * bs, com_seqh_t * seqhdr)
- dec_bs_read1(bs, 1); //marker_bit
- seqhdr->vertical_size = dec_bs_read(bs, 14, 0, COM_UINT32_MAX);
-
-+ seqhdr->display_horizontal_size = seqhdr->horizontal_size;
-+ seqhdr->display_vertical_size = seqhdr->vertical_size;
-+
- seqhdr->chroma_format = (u8)dec_bs_read(bs, 2, 1, 1);
- seqhdr->sample_precision = (u8)dec_bs_read(bs, 3, 1, 2);
-
-@@ -262,19 +260,21 @@ static int user_data(com_pic_header_t *pichdr, com_bs_t * bs)
- return RET_OK;
- }
-
--static int sequence_display_extension(com_bs_t * bs)
-+static int sequence_display_extension(com_bs_t * bs, com_seqh_t *seqhdr)
- {
- dec_bs_read(bs, 3, 0, COM_UINT32_MAX); // video_format u(3)
- dec_bs_read1(bs, -1); // sample_range u(1)
-- int colour_description = dec_bs_read1(bs, -1); // colour_description u(1)
-- if (colour_description) {
-- dec_bs_read(bs, 8, 0, COM_UINT32_MAX); // colour_primaries u(8)
-- dec_bs_read(bs, 8, 0, COM_UINT32_MAX); // transfer_characteristics u(8)
-- dec_bs_read(bs, 8, 0, COM_UINT32_MAX); // matrix_coefficients u(8)
-+
-+ seqhdr->colour_description = dec_bs_read1(bs, -1); // colour_description u(1)
-+
-+ if (seqhdr->colour_description) {
-+ seqhdr->colour_primaries = dec_bs_read(bs, 8, 0, COM_UINT32_MAX); // colour_primaries u(8)
-+ seqhdr->transfer_characteristics = dec_bs_read(bs, 8, 0, COM_UINT32_MAX); // transfer_characteristics u(8)
-+ seqhdr->matrix_coefficients = dec_bs_read(bs, 8, 0, COM_UINT32_MAX); // matrix_coefficients u(8)
- }
-- dec_bs_read(bs, 14, 0, COM_UINT32_MAX); // display_horizontal_size u(14)
-+ seqhdr->display_horizontal_size = dec_bs_read(bs, 14, 0, COM_UINT32_MAX); // display_horizontal_size u(14)
- dec_bs_read1(bs, 1); //marker_bit
-- dec_bs_read(bs, 14, 0, COM_UINT32_MAX); // display_vertical_size u(14)
-+ seqhdr->display_vertical_size = dec_bs_read(bs, 14, 0, COM_UINT32_MAX); // display_vertical_size u(14)
- char td_mode_flag = dec_bs_read1(bs, -1); // td_mode_flag u(1)
-
- if (td_mode_flag == 1) {
-@@ -460,7 +460,7 @@ static int extension_data(com_bs_t * bs, com_seqh_t *seqhdr, com_pic_header_t *p
- if (i == 0) {
- int ret = dec_bs_read(bs, 4, 0, COM_UINT32_MAX);
- if (ret == 2) {
-- sequence_display_extension(bs);
-+ sequence_display_extension(bs, seqhdr);
- } else if (ret == 3) {
- temporal_scalability_extension(bs);
- } else if (ret == 4) {
-@@ -1647,7 +1647,7 @@ static uavs3d_always_inline u32 lbac_read_unary_sym_ep(com_lbac_t * lbac)
- low = lbac_refill2(lbac, low);
- }
- val += bin;
-- } while (bin);
-+ } while (bin && lbac->cur < lbac->end);
-
- lbac->range = range;
- lbac->low = low;
-@@ -2834,8 +2834,7 @@ int dec_parse_lcu_delta_qp(com_lbac_t * lbac, int last_dqp)
- bin = lbac_dec_bin(lbac, ctx->lcu_qp_delta + act_ctx);
- act_ctx = min(3, act_ctx + 1);
- act_sym += !bin;
-- }
-- while (!bin);
-+ } while (!bin && lbac->cur < lbac->end);
- }
-
- dquant = (act_sym + 1) >> 1;
-diff --git a/source/decoder/parser.h b/source/decoder/parser.h
-index 20cd103..93fbb1a 100644
---- a/source/decoder/parser.h
-+++ b/source/decoder/parser.h
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decoder/uavs3d.c b/source/decoder/uavs3d.c
-index 9ac7dc2..7b0491d 100644
---- a/source/decoder/uavs3d.c
-+++ b/source/decoder/uavs3d.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -1060,7 +1055,7 @@ int __cdecl uavs3d_flush(void *h, uavs3d_io_frm_t* frm_out)
-
- void* __cdecl uavs3d_create(uavs3d_cfg_t * dec_cfg, uavs3d_lib_output_callback_t callback, int * err)
- {
-- uavs3d_dec_t *ctx = NULL;
-+ uavs3d_dec_t *ctx;
-
- printf("libuavs3d(%2d): %s_%s, %s\n", BIT_DEPTH, VERSION_STR, VERSION_TYPE, VERSION_SHA1);
-
-diff --git a/source/decoder/uavs3d.h b/source/decoder/uavs3d.h
-index f5ea2b0..1931917 100644
---- a/source/decoder/uavs3d.h
-+++ b/source/decoder/uavs3d.h
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -137,6 +132,9 @@ typedef struct uavs3d_com_seqh_t {
- unsigned int bbv_buffer_size; /* 18 bits */
- int horizontal_size; /* 14 bits */
- int vertical_size; /* 14 bits */
-+ int display_horizontal_size; /* 14 bits */
-+ int display_vertical_size; /* 14 bits */
-+
- unsigned char log2_max_cu_width_height; /* 3 bits */
- unsigned char min_cu_size;
- unsigned char max_part_ratio_log2;
-@@ -211,6 +209,13 @@ typedef struct uavs3d_com_seqh_t {
-
- /* alf map */
- unsigned char *alf_idx_map;
-+
-+ /* hdr info */
-+ unsigned char colour_description;
-+ unsigned char colour_primaries;
-+ unsigned char transfer_characteristics;
-+ unsigned char matrix_coefficients;
-+
- } com_seqh_t;
-
- #define FRAME_MAX_PLANES 3
-diff --git a/source/decore/alf.c b/source/decore/alf.c
-index 89a2411..111d99f 100644
---- a/source/decore/alf.c
-+++ b/source/decore/alf.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/arm64/alf_arm64.S b/source/decore/arm64/alf_arm64.S
-index 49a620f..9998073 100644
---- a/source/decore/arm64/alf_arm64.S
-+++ b/source/decore/arm64/alf_arm64.S
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/arm64/arm64.c b/source/decore/arm64/arm64.c
-index 0850349..74c2f81 100644
---- a/source/decore/arm64/arm64.c
-+++ b/source/decore/arm64/arm64.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -102,7 +97,7 @@ static void uavs3d_padding_rows_chroma_arm64(pel *src, int i_src, int width, int
-
- void uavs3d_funs_init_arm64()
- {
--#if (BIT_DEPTH == 8)
-+#if !COMPILE_10BIT
- uavs3d_funs_handle.sao[ Y_C] = uavs3d_sao_on_lcu_arm64;
- uavs3d_funs_handle.sao[UV_C] = uavs3d_sao_on_lcu_chroma_arm64;
- uavs3d_funs_handle.alf[ Y_C] = uavs3d_alf_one_lcu_arm64;
-@@ -311,7 +306,7 @@ void uavs3d_funs_init_arm64()
- uavs3d_funs_handle.itrans_dst7[1] = uavs3d_itrans_dct8_pb8_arm64;
- uavs3d_funs_handle.itrans_dst7[2] = uavs3d_itrans_dct8_pb16_arm64;
-
-- uavs3d_funs_handle.conv_fmt_16bit = uavs3d_conv_fmt_16bit_arm64;
-+ //uavs3d_funs_handle.conv_fmt_16bit = uavs3d_conv_fmt_16bit_arm64;
- uavs3d_funs_handle.padding_rows_luma = uavs3d_padding_rows_luma_arm64;
- uavs3d_funs_handle.padding_rows_chroma = uavs3d_padding_rows_chroma_arm64;
-
-diff --git a/source/decore/arm64/arm64.h b/source/decore/arm64/arm64.h
-index 6ba0566..b2410ef 100644
---- a/source/decore/arm64/arm64.h
-+++ b/source/decore/arm64/arm64.h
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/arm64/deblock_arm64.S b/source/decore/arm64/deblock_arm64.S
-index ff47274..b152147 100644
---- a/source/decore/arm64/deblock_arm64.S
-+++ b/source/decore/arm64/deblock_arm64.S
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -1540,12 +1535,12 @@ deblock_ver_filtered:
- bif v17.16b, v1.16b, v25.16b
- bif v18.16b, v6.16b, v25.16b
-
-- mov v1.2d, v17.2d
-- mov v2.2d, v28.2d
-- mov v3.2d, v30.2d
-- mov v4.2d, v31.2d
-- mov v5.2d, v29.2d
-- mov v6.2d, v18.2d
-+ mov v1.16b, v17.16b
-+ mov v2.16b, v28.16b
-+ mov v3.16b, v30.16b
-+ mov v4.16b, v31.16b
-+ mov v5.16b, v29.16b
-+ mov v6.16b, v18.16b
-
- st4 {v0.H, v1.H, v2.H, v3.H}[0], [x2], #8
- st4 {v4.H, v5.H, v6.H, v7.H}[0], [x2], x5
-diff --git a/source/decore/arm64/def_arm64.S b/source/decore/arm64/def_arm64.S
-index c6a219d..82e267d 100644
---- a/source/decore/arm64/def_arm64.S
-+++ b/source/decore/arm64/def_arm64.S
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -35,25 +30,23 @@
- * For more information, contact us at rgwang@pkusz.edu.cn.
- **************************************************************************************/
-
--#if defined(__ANDROID__)
--.macro function name
-- .text
-- .align 4
-- .global \name
-- .type \name, %function
-- \name:
--.endm
--
- #if defined(__aarch64__) && !defined(__arm64__)
- #define __arm64__ 1
- #endif
--#elif defined(__APPLE__)
-+
-+#if defined(__APPLE__)
- .macro function name
- .text
- .align 4
- .global _\name
- _\name:
- .endm
-+#else
-+.macro function name
-+ .text
-+ .align 4
-+ .global \name
-+ .type \name, %function
-+ \name:
-+.endm
- #endif
--
--#define COMPILE_10BIT 0
-diff --git a/source/decore/arm64/inter_pred_arm64.S b/source/decore/arm64/inter_pred_arm64.S
-index e86addd..375f041 100644
---- a/source/decore/arm64/inter_pred_arm64.S
-+++ b/source/decore/arm64/inter_pred_arm64.S
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -1809,9 +1804,9 @@ if_hor_ver_chroma_w8_loop_y:
- smlal v30.4s, v22.4h, v7.h[3]
- smlal2 v31.4s, v22.8h, v7.h[3]
-
-- mov v16.2d, v20.2d
-- mov v17.2d, v21.2d
-- mov v18.2d, v22.2d
-+ mov v16.16b, v20.16b
-+ mov v17.16b, v21.16b
-+ mov v18.16b, v22.16b
-
- rshrn v24.4h, v24.4s, #12
- rshrn2 v24.8h, v25.4s, #12
-@@ -2553,10 +2548,10 @@ if_hor_ver_luma_w4_loop_y:
- smlal v29.4s, v21.4h, v8.h[7]
- smlal2 v30.4s, v21.8h, v8.h[7]
-
-- mov v16.2d, v18.2d
-- mov v17.2d, v19.2d
-- mov v18.2d, v20.2d
-- mov v19.2d, v21.2d
-+ mov v16.16b, v18.16b
-+ mov v17.16b, v19.16b
-+ mov v18.16b, v20.16b
-+ mov v19.16b, v21.16b
-
- rshrn v27.4h, v27.4s, #12
- rshrn v28.4h, v28.4s, #12
-@@ -5268,7 +5263,7 @@ function uavs3d_if_hor_ver_luma_w8_arm64
- ldr w8, [sp] // w8 = max_val
-
- sub sp, sp, #80
-- sub x9, sp, #16
-+ add x9, sp, #64
- st1 {v12.2d, v13.2d, v14.2d, v15.2d}, [sp]
- st1 {v11.2d}, [x9]
-
-diff --git a/source/decore/arm64/intra_pred_arm64.S b/source/decore/arm64/intra_pred_arm64.S
-index e2c4629..5689bd4 100644
---- a/source/decore/arm64/intra_pred_arm64.S
-+++ b/source/decore/arm64/intra_pred_arm64.S
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -2996,12 +2991,12 @@ intra_pred_bi_ipf_end:
- // const s8 *flt_coef_hor, const s8 *flt_coef_ver, int w, int h, int bit_depth)
- //src->x0, dst->x1, i_dst->x2, flt_range_hor->x3, flt_range_ver->x4, flt_coef_hor->x5, flt_coef_ver->x6, w->x7
- function uavs3d_intra_pred_ipf_arm64
--#if defined(__ANDROID__)
-- ldr w8, [sp] // w8 = h
-- ldr w9, [sp, #8] // w9 = bit_depth
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldr w8, [sp]
- ldr w9, [sp, #4]
-+#else
-+ ldr w8, [sp] // w8 = h
-+ ldr w9, [sp, #8] // w9 = bit_depth
- #endif
- add x0, x0, #1 // p_top = src + 1
-
-diff --git a/source/decore/arm64/intra_pred_chroma_arm64.S b/source/decore/arm64/intra_pred_chroma_arm64.S
-index 2c142f3..b12d02a 100644
---- a/source/decore/arm64/intra_pred_chroma_arm64.S
-+++ b/source/decore/arm64/intra_pred_chroma_arm64.S
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -555,7 +550,7 @@ intra_pred_dc_uv_fillblock_w8:
- b intra_pred_dc_uv_end
-
- intra_pred_dc_uv_fillblock_w16:
-- mov v1.8h, v0.8h
-+ mov v1.16b, v0.16b
- intra_pred_dc_uv_fillblock_w16_y:
- st1 {v0.8h, v1.8h}, [x1], x2 // store dst[x]
- st1 {v0.8h, v1.8h}, [x1], x2
-@@ -570,9 +565,9 @@ intra_pred_dc_uv_fillblock_w32x:
- cmp w3, #64
- beq intra_pred_dc_uv_fillblock_w64
-
-- mov v1.8h, v0.8h
-- mov v2.8h, v0.8h
-- mov v3.8h, v0.8h
-+ mov v1.16b, v0.16b
-+ mov v2.16b, v0.16b
-+ mov v3.16b, v0.16b
- intra_pred_dc_uv_fillblock_w32_y:
- st1 {v0.8h, v1.8h, v2.8h, v3.8h}, [x1], x2 // store dst[x]
- st1 {v0.8h, v1.8h, v2.8h, v3.8h}, [x1], x2
-@@ -585,9 +580,9 @@ intra_pred_dc_uv_fillblock_w32_y:
- intra_pred_dc_uv_fillblock_w64:
-
- sub x2, x2, #64
-- mov v1.8h, v0.8h
-- mov v2.8h, v0.8h
-- mov v3.8h, v0.8h
-+ mov v1.16b, v0.16b
-+ mov v2.16b, v0.16b
-+ mov v3.16b, v0.16b
- intra_pred_dc_uv_fillblock_w64_y:
- st1 {v0.8h, v1.8h, v2.8h, v3.8h}, [x1], #64
- st1 {v0.8h, v1.8h, v2.8h, v3.8h}, [x1], x2
-diff --git a/source/decore/arm64/itrans_arm64.c b/source/decore/arm64/itrans_arm64.c
-index d26ec5f..9b2362e 100644
---- a/source/decore/arm64/itrans_arm64.c
-+++ b/source/decore/arm64/itrans_arm64.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/arm64/itrans_arm64.h b/source/decore/arm64/itrans_arm64.h
-index c4977d0..15d9a4b 100644
---- a/source/decore/arm64/itrans_arm64.h
-+++ b/source/decore/arm64/itrans_arm64.h
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/arm64/itrans_dct2_arm64.S b/source/decore/arm64/itrans_dct2_arm64.S
-index 00b99e1..0f37c7e 100644
---- a/source/decore/arm64/itrans_dct2_arm64.S
-+++ b/source/decore/arm64/itrans_dct2_arm64.S
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -758,9 +753,9 @@ dct2_h16_1st_loopx:
- dct2_h16_2nd_transform:
-
- sub sp, sp, #48
-- sub x7, sp, #16
-- st1 {v10.8h, v11.8h}, [sp]
-- st1 {v12.8h}, [x7]
-+ add x7, sp, #16
-+ st1 {v10.8h, v11.8h}, [x7]
-+ st1 {v12.8h}, [sp]
-
- mov w8, #1
- lsl w8, w8, w5
-@@ -1059,8 +1054,8 @@ dct2_h16_2nd_loopx:
- cmp x8, x3
- blt dct2_h16_2nd_loopx
-
-- ld1 {v10.8h, v11.8h}, [sp], #32
- ld1 {v12.8h}, [sp], #16
-+ ld1 {v10.8h, v11.8h}, [sp], #32
- ld1 {v8.8h, v9.8h}, [sp], #32
-
- dct2_h16_end:
-diff --git a/source/decore/arm64/itrans_dct8_dst7_arm64.S b/source/decore/arm64/itrans_dct8_dst7_arm64.S
-index 340865c..5ba39e5 100644
---- a/source/decore/arm64/itrans_dct8_dst7_arm64.S
-+++ b/source/decore/arm64/itrans_dct8_dst7_arm64.S
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/arm64/pixel_arm64.S b/source/decore/arm64/pixel_arm64.S
-index bc79826..81fa81c 100644
---- a/source/decore/arm64/pixel_arm64.S
-+++ b/source/decore/arm64/pixel_arm64.S
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -285,8 +280,8 @@ padding_rows_lr_y:
-
- ld1r {v0.8h}, [x0]
- ld1r {v2.8h}, [x5] // right reference pointer
-- mov v1.8h, v0.8h
-- mov v3.8h, v2.8h
-+ mov v1.16b, v0.16b
-+ mov v3.16b, v2.16b
-
- sub x5, x0, x4
- add x6, x0, x2
-@@ -332,8 +327,8 @@ padding_rows_chroma_lr_y:
- ld1r {v0.4s}, [x0] // src[0] src[1]
- ld1r {v2.4s}, [x5] // right reference pointer
-
-- mov v1.4s, v0.4s
-- mov v3.4s, v2.4s
-+ mov v1.16b, v0.16b
-+ mov v3.16b, v2.16b
-
- sub x5, x0, x4
- add x6, x0, x2
-diff --git a/source/decore/arm64/sao_arm64.c b/source/decore/arm64/sao_arm64.c
-index dc1a5b0..37cf9e0 100644
---- a/source/decore/arm64/sao_arm64.c
-+++ b/source/decore/arm64/sao_arm64.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/arm64/sao_kernel_arm64.S b/source/decore/arm64/sao_kernel_arm64.S
-index 1546b17..b0d0bb8 100644
---- a/source/decore/arm64/sao_kernel_arm64.S
-+++ b/source/decore/arm64/sao_kernel_arm64.S
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -451,10 +446,10 @@ loop_x_eo_90_chroma_end:
- ************************************************************************************************************************************/
- function uavs3d_sao_eo_135_arm64
- // get start_x_r0 and end_x_r0
--#if defined(__ANDROID__)
-- ldp x8, x9, [sp]
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w8, w9, [sp]
-+#else
-+ ldp x8, x9, [sp]
- #endif
- sxtw x8, w8 // start_x_r0
- sxtw x9, w9 // end_x_r0
-@@ -537,10 +532,10 @@ test_loop_x_eo_135_end_r0:
-
- // ------- middle rows -------
- // get param
--#if defined(__ANDROID__)
-- ldp x7, x8, [sp, #16]
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w7, w8, [sp, #8]
-+#else
-+ ldp x7, x8, [sp, #16]
- #endif
- sxtw x7, w7 // start_x_r
- sxtw x8, w8 // end_x_r
-@@ -613,10 +608,10 @@ test_loop_x_eo_135_end_r:
- bgt test_loop_y_eo_135_r
-
- // ------- last row -------
--#if defined(__ANDROID__)
-- ldp x6, x7, [sp, #32]
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w6, w7, [sp, #16]
-+#else
-+ ldp x6, x7, [sp, #32]
- #endif
- sxtw x6, w6 // start_x_rn
- sxtw x7, w7 // end_x_rn
-@@ -691,10 +686,10 @@ test_loop_x_eo_135_end_rn:
- ************************************************************************************************************************************/
- function uavs3d_sao_eo_135_chroma_arm64
-
--#if defined(__ANDROID__)
-- ldp x8, x9, [sp]
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w8, w9, [sp]
-+#else
-+ ldp x8, x9, [sp]
- #endif
- sxtw x8, w8 // start_x_r0
- sxtw x9, w9 // end_x_r0
-@@ -793,10 +788,10 @@ loop_x_eo_135_chroma_end_r0:
- add x1, x1, x3 //-- dst+=dst_stride
-
- //--------------------------------middle rows--------------------------------
--#if defined(__ANDROID__)
-- ldp x7 , x8, [sp, #16] //-- x7=start_x_r; x8=end_x_r
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w7 , w8, [sp, #8] //-- x7=start_x_r; x8=end_x_r
-+#else
-+ ldp x7 , x8, [sp, #16] //-- x7=start_x_r; x8=end_x_r
- #endif
- sxtw x7 , w7
- sxtw x8 , w8
-@@ -886,10 +881,10 @@ loop_x_eo_135_chroma_end_r:
- bgt loop_y_eo_135_chroma_r
-
- //---------------------------------last row--------------------------------
--#if defined(__ANDROID__)
-- ldp x6, x7, [sp, #32] //-- x6=start_x_rn; x7=end_x_rn
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w6, w7, [sp, #16] //-- x6=start_x_rn; x7=end_x_rn
-+#else
-+ ldp x6, x7, [sp, #32] //-- x6=start_x_rn; x7=end_x_rn
- #endif
- sxtw x7, w7
- sxtw x6, w6
-@@ -979,10 +974,10 @@ loop_x_eo_135_chroma_end_rn:
- * end_x_r0->x8, start_x_r->x9, end_x_r->x10, start_x_rn->x11, end_x_rn->x12
- ************************************************************************************************************************************/
- function uavs3d_sao_eo_45_arm64
--#if defined(__ANDROID__)
-- ldp x8, x9, [sp]
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w8, w9, [sp]
-+#else
-+ ldp x8, x9, [sp]
- #endif
- sxtw x8, w8 // start_x_r0
- sxtw x9, w9 // end_x_r0
-@@ -1064,10 +1059,10 @@ test_loop_x_eo_45_end_r0:
-
- // ------- middle rows -------
- // get param
--#if defined(__ANDROID__)
-- ldp x7, x8, [sp, #16] // x7 start_x_r; x8 end_x_r
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w7, w8, [sp, #8] // x7 start_x_r; x8 end_x_r
-+#else
-+ ldp x7, x8, [sp, #16] // x7 start_x_r; x8 end_x_r
- #endif
- sxtw x7, w7
- sxtw x8, w8
-@@ -1141,10 +1136,10 @@ test_loop_x_eo_45_end_r:
- bgt test_loop_y_eo_45_r
-
- // ------- last row -------
--#if defined(__ANDROID__)
-- ldp x6, x7, [sp, #32] // $x6 start_x_rn; $x7 end_x_rn
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w6, w7, [sp, #16] // $x6 start_x_rn; $x7 end_x_rn
-+#else
-+ ldp x6, x7, [sp, #32] // $x6 start_x_rn; $x7 end_x_rn
- #endif
- sxtw x6, w6
- sxtw x7, w7
-@@ -1217,10 +1212,10 @@ ret
- * end_x_r0->x8, start_x_r->x9, end_x_r->x10, start_x_rn->x11, end_x_rn->x12
- ************************************************************************************************************************************/
- function uavs3d_sao_eo_45_chroma_arm64
--#if defined(__ANDROID__)
-- ldp x8, x9, [sp]
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w8, w9, [sp]
-+#else
-+ ldp x8, x9, [sp]
- #endif
- sxtw x8, w8 // start_x_r0
- sxtw x9, w9 // end_x_r0
-@@ -1315,10 +1310,10 @@ loop_x_eo_45_chroma_end_r0:
- add x1, x1, x3 //-- dst+=dst_stride
-
- //--------------------------------middle rows--------------------------------
--#if defined(__ANDROID__)
-- ldp x7 , x8, [sp, #16] //-- x7=start_x_r; x8=end_x_r
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w7 , w8, [sp, #8] //-- x7=start_x_r; x8=end_x_r
-+#else
-+ ldp x7 , x8, [sp, #16] //-- x7=start_x_r; x8=end_x_r
- #endif
- sxtw x7 , w7
- sxtw x8 , w8
-@@ -1405,10 +1400,10 @@ loop_x_eo_45_chroma_end_r:
- bgt loop_y_eo_45_chroma_r
-
- //---------------------------------last row--------------------------------
--#if defined(__ANDROID__)
-- ldp x6 , x7, [sp, #32] //-- x6=start_x_rn; x7=end_x_rn
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w6 , w7, [sp, #16] //-- x6=start_x_rn; x7=end_x_rn
-+#else
-+ ldp x6 , x7, [sp, #32] //-- x6=start_x_rn; x7=end_x_rn
- #endif
- sxtw x7 , w7
- sxtw x6 , w6
-@@ -2221,10 +2216,10 @@ loop_x_eo_90_chroma_end:
- * src->x0, dst->x1, src_stride->x2, dst_stride->x3, offset->x4, mask->x5, mb_height->x6, bit_depth->x7
- ************************************************************************************************************************************/
- function uavs3d_sao_eo_135_arm64
--#if defined(__ANDROID__)
-- ldp x8, x9, [sp] // start_x_r0 and end_x_r0
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w8, w9, [sp]
-+#else
-+ ldp x8, x9, [sp] // start_x_r0 and end_x_r0
- #endif
-
- sxtw x8, w8 // start_x_r0
-@@ -2336,10 +2331,10 @@ test_loop_x_eo_135_end_r0:
-
- // ------- middle rows -------
- // get param
--#if defined(__ANDROID__)
-- ldp x7, x8, [sp, #16]
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w7, w8, [sp, #8]
-+#else
-+ ldp x7, x8, [sp, #16]
- #endif
- sxtw x7, w7 // x7 start_x_r
- sxtw x8, w8 // x8 end_x_r
-@@ -2431,10 +2426,10 @@ test_loop_x_eo_135_end_r:
- bgt test_loop_y_eo_135_r
-
- // ------- last row -------
--#if defined(__ANDROID__)
-- ldp x6, x7, [sp, #32]
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w6, w7, [sp, #16]
-+#else
-+ ldp x6, x7, [sp, #32]
- #endif
- sxtw x6, w6 // start_x_rn
- sxtw x7, w7 // end_x_rn
-@@ -2527,10 +2522,10 @@ test_loop_x_eo_135_end_rn:
- * src->x0, dst->x1, src_stride->x2, dst_stride->x3, offset->x4, mask->x5, mb_height->x6, bit_depth->x7
- ************************************************************************************************************************************/
- function uavs3d_sao_eo_135_chroma_arm64
--#if defined(__ANDROID__)
-- ldp x8, x9, [sp] // start_x_r0 and end_x_r0
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w8, w9, [sp]
-+#else
-+ ldp x8, x9, [sp] // start_x_r0 and end_x_r0
- #endif
-
- mov w13, #1
-@@ -2636,10 +2631,10 @@ loop_x_eo_135_chroma_end_r0:
- add x1, x1, x3 //-- dst+=dst_stride
-
- //--------------------------------middle rows--------------------------------
--#if defined(__ANDROID__)
-- ldp x7 , x8, [sp, #16] //-- x7=start_x_r; x8=end_x_r
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w7 , w8, [sp, #8] //-- x7=start_x_r; x8=end_x_r
-+#else
-+ ldp x7 , x8, [sp, #16] //-- x7=start_x_r; x8=end_x_r
- #endif
- sxtw x7 , w7
- sxtw x8 , w8
-@@ -2730,10 +2725,10 @@ loop_x_eo_135_chroma_end_r:
- bgt loop_y_eo_135_chroma_r
-
- //---------------------------------last row--------------------------------
--#if defined(__ANDROID__)
-- ldp x6, x7, [sp, #32] //-- x6=start_x_rn; x7=end_x_rn
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w6, w7, [sp, #16] //-- x6=start_x_rn; x7=end_x_rn
-+#else
-+ ldp x6, x7, [sp, #32] //-- x6=start_x_rn; x7=end_x_rn
- #endif
- sxtw x7, w7
- sxtw x6, w6
-@@ -2822,10 +2817,10 @@ loop_x_eo_135_chroma_end_rn:
- * src->x0, dst->x1, src_stride->x2, dst_stride->x3, offset->x4, mask->x5, mb_height->x6, bit_depth->x7
- ************************************************************************************************************************************/
- function uavs3d_sao_eo_45_arm64
--#if defined(__ANDROID__)
-- ldp x8, x9, [sp] // start_x_r0 and end_x_r0
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w8, w9, [sp]
-+#else
-+ ldp x8, x9, [sp] // start_x_r0 and end_x_r0
- #endif
-
- mov w12, #1
-@@ -2936,10 +2931,10 @@ test_loop_x_eo_45_end_r0:
-
- // ------- middle rows -------
- // get param
--#if defined(__ANDROID__)
-- ldp x7, x8, [sp, #16] // x7 start_x_r; x8 end_x_r
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w7, w8, [sp, #8] // x7 start_x_r; x8 end_x_r
-+#else
-+ ldp x7, x8, [sp, #16] // x7 start_x_r; x8 end_x_r
- #endif
- sxtw x7, w7
- sxtw x8, w8
-@@ -3031,10 +3026,10 @@ test_loop_x_eo_45_end_r:
- bgt test_loop_y_eo_45_r
-
- // ------- last row -------
--#if defined(__ANDROID__)
-- ldp x6, x7, [sp, #32]
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w6, w7, [sp, #16]
-+#else
-+ ldp x6, x7, [sp, #32]
- #endif
- sxtw x6, w6 // start_x_rn
- sxtw x7, w7 // end_x_rn
-@@ -3126,10 +3121,10 @@ test_loop_x_eo_45_end_rn:
- * src->x0, dst->x1, src_stride->x2, dst_stride->x3, offset->x4, mask->x5, mb_height->x6, bit_depth->x7
- ************************************************************************************************************************************/
- function uavs3d_sao_eo_45_chroma_arm64
--#if defined(__ANDROID__)
-- ldp x8, x9, [sp] // start_x_r0 and end_x_r0
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w8, w9, [sp]
-+#else
-+ ldp x8, x9, [sp] // start_x_r0 and end_x_r0
- #endif
-
- mov w12, #1
-@@ -3236,10 +3231,10 @@ loop_x_eo_45_chroma_end_r0:
- add x1, x1, x3 //-- dst+=dst_stride
-
- //--------------------------------middle rows--------------------------------
--#if defined(__ANDROID__)
-- ldp x7 , x8, [sp, #16] //-- x7=start_x_r; x8=end_x_r
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w7 , w8, [sp, #8] //-- x7=start_x_r; x8=end_x_r
-+#else
-+ ldp x7 , x8, [sp, #16] //-- x7=start_x_r; x8=end_x_r
- #endif
- sxtw x7 , w7
- sxtw x8 , w8
-@@ -3328,10 +3323,10 @@ loop_x_eo_45_chroma_end_r:
- bgt loop_y_eo_45_chroma_r
-
- //---------------------------------last row--------------------------------
--#if defined(__ANDROID__)
-- ldp x6 , x7, [sp, #32] //-- x6=start_x_rn; x7=end_x_rn
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- ldp w6 , w7, [sp, #16] //-- x6=start_x_rn; x7=end_x_rn
-+#else
-+ ldp x6 , x7, [sp, #32] //-- x6=start_x_rn; x7=end_x_rn
- #endif
- sxtw x7 , w7
- sxtw x6 , w6
-diff --git a/source/decore/arm64/sao_kernel_arm64.h b/source/decore/arm64/sao_kernel_arm64.h
-index 03373ce..b9c448e 100644
---- a/source/decore/arm64/sao_kernel_arm64.h
-+++ b/source/decore/arm64/sao_kernel_arm64.h
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/armv7/alf_armv7.S b/source/decore/armv7/alf_armv7.S
-index 5b0e3e0..c87f29b 100644
---- a/source/decore/armv7/alf_armv7.S
-+++ b/source/decore/armv7/alf_armv7.S
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/armv7/armv7.c b/source/decore/armv7/armv7.c
-index 0be03a4..6ad9086 100644
---- a/source/decore/armv7/armv7.c
-+++ b/source/decore/armv7/armv7.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -242,7 +237,7 @@ void uavs3d_itrans_dct2_h64_w64_armv7(s16 *src, s16 *dst, int bit_depth)
-
- void uavs3d_funs_init_armv7()
- {
--#if BIT_DEPTH == 8
-+#if !COMPILE_10BIT
- uavs3d_funs_handle.sao[ Y_C] = uavs3d_sao_on_lcu_armv7;
- uavs3d_funs_handle.sao[UV_C] = uavs3d_sao_on_lcu_chroma_armv7;
- uavs3d_funs_handle.alf[ Y_C] = uavs3d_alf_one_lcu_armv7;
-diff --git a/source/decore/armv7/armv7.h b/source/decore/armv7/armv7.h
-index 60efd7e..0114927 100644
---- a/source/decore/armv7/armv7.h
-+++ b/source/decore/armv7/armv7.h
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/armv7/dct2_armv7.S b/source/decore/armv7/dct2_armv7.S
-index 82c2f82..05e965f 100644
---- a/source/decore/armv7/dct2_armv7.S
-+++ b/source/decore/armv7/dct2_armv7.S
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/armv7/deblock_armv7.S b/source/decore/armv7/deblock_armv7.S
-index 202d121..dcdeabf 100644
---- a/source/decore/armv7/deblock_armv7.S
-+++ b/source/decore/armv7/deblock_armv7.S
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/armv7/def_armv7.S b/source/decore/armv7/def_armv7.S
-index fdc3d27..861f016 100644
---- a/source/decore/armv7/def_armv7.S
-+++ b/source/decore/armv7/def_armv7.S
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -35,23 +30,18 @@
- * For more information, contact us at rgwang@pkusz.edu.cn.
- **************************************************************************************/
-
--#if defined(__ANDROID__)
--.macro function name
-- .global \name
-- .hidden \name
-- .type \name, %function
--\name:
--.endm
--#elif defined(__APPLE__)
-+#if defined(__APPLE__)
- .macro function name
- .text
- .align 4
- .global _\name
- _\name:
- .endm
--
-+#else
-+.macro function name
-+ .global \name
-+ .hidden \name
-+ .type \name, %function
-+\name:
-+.endm
- #endif
--
--#define COMPILE_10BIT 0
--
--
-diff --git a/source/decore/armv7/inter_pred_armv7.S b/source/decore/armv7/inter_pred_armv7.S
-index edbcc62..fd78ae4 100644
---- a/source/decore/armv7/inter_pred_armv7.S
-+++ b/source/decore/armv7/inter_pred_armv7.S
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/armv7/intra_pred_armv7.S b/source/decore/armv7/intra_pred_armv7.S
-index cbce583..807f6a5 100644
---- a/source/decore/armv7/intra_pred_armv7.S
-+++ b/source/decore/armv7/intra_pred_armv7.S
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/armv7/itrans_dct8_dst7_armv7.S b/source/decore/armv7/itrans_dct8_dst7_armv7.S
-index 129bbc3..d8d1ab1 100755
---- a/source/decore/armv7/itrans_dct8_dst7_armv7.S
-+++ b/source/decore/armv7/itrans_dct8_dst7_armv7.S
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/armv7/pixel_armv7.S b/source/decore/armv7/pixel_armv7.S
-index 83124a4..f88f474 100644
---- a/source/decore/armv7/pixel_armv7.S
-+++ b/source/decore/armv7/pixel_armv7.S
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/armv7/sao_armv7.c b/source/decore/armv7/sao_armv7.c
-index cec6880..8b3070e 100644
---- a/source/decore/armv7/sao_armv7.c
-+++ b/source/decore/armv7/sao_armv7.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/armv7/sao_kernel_armv7.S b/source/decore/armv7/sao_kernel_armv7.S
-index 0449ecc..1652c99 100644
---- a/source/decore/armv7/sao_kernel_armv7.S
-+++ b/source/decore/armv7/sao_kernel_armv7.S
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/armv7/sao_kernel_armv7.h b/source/decore/armv7/sao_kernel_armv7.h
-index d30c690..49b020b 100644
---- a/source/decore/armv7/sao_kernel_armv7.h
-+++ b/source/decore/armv7/sao_kernel_armv7.h
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/avx2/alf_avx2.c b/source/decore/avx2/alf_avx2.c
-index 74226b6..cc2cf5f 100644
---- a/source/decore/avx2/alf_avx2.c
-+++ b/source/decore/avx2/alf_avx2.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -489,7 +484,7 @@ void uavs3d_alf_one_lcu_one_chroma_avx2(pel *dst, int i_dst, pel *src, int i_src
- __m256i T000, T001, T010, T011, T100, T101, T110, T111, T200, T201, T210, T211, T310, T311, T300, T301, T400, T401, T410, T411, T500, T501, T510, T511, T600, T601, T610, T611, T700, T701, T710, T711;
- __m256i E00, E01, E10, E11;
- __m256i C0, C1, C2, C3, C4, C5, C6, C7, C8;
-- __m256i S0, S00, S01, S1, S10, S11, S2, S20, S21, S3, S30, S31, S4, S40, S41, S5, S50, S51, S6, S7, S8, S60, S61, S70, S71, S80, S81, S82, S83, SS1, SS2, SS3, SS4;
-+ __m256i S0, S00, S01, S1, S10, S11, S2, S20, S21, S3, S30, S31, S4, S40, S41, S5, S50, S51, S6, S7, S60, S61, S70, S71, S80, S81, S82, S83, SS1, SS2, SS3, SS4;
- __m256i mAddOffset;
- __m256i mZero = _mm256_set1_epi16(0);
- __m256i mMax = _mm256_set1_epi16((short)((1 << sample_bit_depth) - 1));
-@@ -629,7 +624,7 @@ void uavs3d_alf_one_lcu_one_chroma_avx2(pel *dst, int i_dst, pel *src, int i_src
- S5 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S50, 1));
- S6 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S60, 1));
- S7 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S70, 1));
-- S8 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S80, 1));
-+ //S8 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S80, 1));
- S0 = _mm256_add_epi32(S0, S1);
- S2 = _mm256_add_epi32(S2, S3);
- S4 = _mm256_add_epi32(S4, S5);
-@@ -803,7 +798,7 @@ void uavs3d_alf_one_lcu_one_chroma_avx2(pel *dst, int i_dst, pel *src, int i_src
- S5 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S50, 1));
- S6 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S60, 1));
- S7 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S70, 1));
-- S8 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S80, 1));
-+ //S8 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S80, 1));
- S0 = _mm256_add_epi32(S0, S1);
- S2 = _mm256_add_epi32(S2, S3);
- S4 = _mm256_add_epi32(S4, S5);
-@@ -821,7 +816,7 @@ void uavs3d_alf_one_lcu_one_chroma_avx2(pel *dst, int i_dst, pel *src, int i_src
- S5 = _mm256_cvtepi16_epi32(_mm256_castsi256_si128(S51));
- S6 = _mm256_cvtepi16_epi32(_mm256_castsi256_si128(S61));
- S7 = _mm256_cvtepi16_epi32(_mm256_castsi256_si128(S71));
-- S8 = _mm256_cvtepi16_epi32(_mm256_castsi256_si128(S81));
-+ //S8 = _mm256_cvtepi16_epi32(_mm256_castsi256_si128(S81));
- S0 = _mm256_add_epi32(S0, S1);
- S2 = _mm256_add_epi32(S2, S3);
- S4 = _mm256_add_epi32(S4, S5);
-@@ -839,7 +834,7 @@ void uavs3d_alf_one_lcu_one_chroma_avx2(pel *dst, int i_dst, pel *src, int i_src
- S5 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S51, 1));
- S6 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S61, 1));
- S7 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S71, 1));
-- S8 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S81, 1));
-+ //S8 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S81, 1));
- S0 = _mm256_add_epi32(S0, S1);
- S2 = _mm256_add_epi32(S2, S3);
- S4 = _mm256_add_epi32(S4, S5);
-@@ -1055,7 +1050,6 @@ void uavs3d_alf_one_lcu_chroma_avx2(pel *dst, int i_dst, pel *src, int i_src, in
- int startPos = 0;
- int endPos = lcu_height;
- int xPosEnd = lcu_width << 1;
-- long long tmp[8];
-
- src += (startPos*i_src);
- dst += (startPos*i_dst);
-@@ -1066,22 +1060,14 @@ void uavs3d_alf_one_lcu_chroma_avx2(pel *dst, int i_dst, pel *src, int i_src, in
- T00 = _mm256_unpacklo_epi16(C8, C8);
- T01 = _mm256_unpackhi_epi16(C8, C8);
-
-- tmp[0] = _mm256_extract_epi64(T00, 0); // win32 compile error if C0 = _mm256_set1_epi64x(_mm256_extract_epi64(T00, 0));
-- tmp[1] = _mm256_extract_epi64(T00, 1);
-- tmp[2] = _mm256_extract_epi64(T00, 2);
-- tmp[3] = _mm256_extract_epi64(T00, 3);
-- tmp[4] = _mm256_extract_epi64(T01, 0);
-- tmp[5] = _mm256_extract_epi64(T01, 1);
-- tmp[6] = _mm256_extract_epi64(T01, 2);
-- tmp[7] = _mm256_extract_epi64(T01, 3);
-- C0 = _mm256_set1_epi64x(tmp[0]);
-- C1 = _mm256_set1_epi64x(tmp[1]);
-- C2 = _mm256_set1_epi64x(tmp[2]);
-- C3 = _mm256_set1_epi64x(tmp[3]);
-- C4 = _mm256_set1_epi64x(tmp[4]);
-- C5 = _mm256_set1_epi64x(tmp[5]);
-- C6 = _mm256_set1_epi64x(tmp[6]);
-- C7 = _mm256_set1_epi64x(tmp[7]);
-+ C0 = _mm256_permute4x64_epi64(T00, 0x00);
-+ C1 = _mm256_permute4x64_epi64(T00, 0x55);
-+ C2 = _mm256_permute4x64_epi64(T00, 0xaa);
-+ C3 = _mm256_permute4x64_epi64(T00, 0xff);
-+ C4 = _mm256_permute4x64_epi64(T01, 0x00);
-+ C5 = _mm256_permute4x64_epi64(T01, 0x55);
-+ C6 = _mm256_permute4x64_epi64(T01, 0xaa);
-+ C7 = _mm256_permute4x64_epi64(T01, 0xff);
- C8 = _mm256_set1_epi32((unsigned short)coef[16] + (((unsigned short)coef[17]) << 16));
- C8 = _mm256_unpacklo_epi16(C8, C8);
-
-diff --git a/source/decore/avx2/avx2.c b/source/decore/avx2/avx2.c
-index a17dac5..d4b3ebf 100644
---- a/source/decore/avx2/avx2.c
-+++ b/source/decore/avx2/avx2.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -183,11 +178,13 @@ void uavs3d_funs_init_avx2()
- uavs3d_funs_handle.ipcpy[4] = uavs3d_if_cpy_w64_avx2;
- uavs3d_funs_handle.ipcpy[5] = uavs3d_if_cpy_w128_avx2;
-
-+ uavs3d_funs_handle.ipflt[IPFILTER_H_4][1] = uavs3d_if_hor_chroma_w8_avx2;
- uavs3d_funs_handle.ipflt[IPFILTER_H_4][2] = uavs3d_if_hor_chroma_w16_avx2;
- uavs3d_funs_handle.ipflt[IPFILTER_H_4][3] = uavs3d_if_hor_chroma_w16x_avx2;
- uavs3d_funs_handle.ipflt[IPFILTER_H_4][4] = uavs3d_if_hor_chroma_w16x_avx2;
- uavs3d_funs_handle.ipflt[IPFILTER_H_4][5] = uavs3d_if_hor_chroma_w16x_avx2;
-
-+ uavs3d_funs_handle.ipflt[IPFILTER_H_8][1] = uavs3d_if_hor_luma_w8_avx2;
- uavs3d_funs_handle.ipflt[IPFILTER_H_8][2] = uavs3d_if_hor_luma_w16_avx2;
- uavs3d_funs_handle.ipflt[IPFILTER_H_8][3] = uavs3d_if_hor_luma_w16x_avx2;
- uavs3d_funs_handle.ipflt[IPFILTER_H_8][4] = uavs3d_if_hor_luma_w16x_avx2;
-@@ -198,6 +195,7 @@ void uavs3d_funs_init_avx2()
- uavs3d_funs_handle.ipflt[IPFILTER_V_4][4] = uavs3d_if_ver_chroma_w32x_avx2;
- uavs3d_funs_handle.ipflt[IPFILTER_V_4][5] = uavs3d_if_ver_chroma_w32x_avx2;
-
-+ uavs3d_funs_handle.ipflt[IPFILTER_V_8][1] = uavs3d_if_ver_luma_w8_avx2;
- uavs3d_funs_handle.ipflt[IPFILTER_V_8][2] = uavs3d_if_ver_luma_w16_avx2;
- uavs3d_funs_handle.ipflt[IPFILTER_V_8][3] = uavs3d_if_ver_luma_w16x_avx2;
- uavs3d_funs_handle.ipflt[IPFILTER_V_8][4] = uavs3d_if_ver_luma_w16x_avx2;
-@@ -209,6 +207,8 @@ void uavs3d_funs_init_avx2()
- uavs3d_funs_handle.ipflt_ext[IPFILTER_EXT_4][4] = uavs3d_if_hor_ver_chroma_w16x_avx2;
- uavs3d_funs_handle.ipflt_ext[IPFILTER_EXT_4][5] = uavs3d_if_hor_ver_chroma_w16x_avx2;
-
-+ uavs3d_funs_handle.ipflt_ext[IPFILTER_EXT_8][0] = uavs3d_if_hor_ver_luma_w4_avx2;
-+ uavs3d_funs_handle.ipflt_ext[IPFILTER_EXT_8][1] = uavs3d_if_hor_ver_luma_w8_avx2;
- uavs3d_funs_handle.ipflt_ext[IPFILTER_EXT_8][2] = uavs3d_if_hor_ver_luma_w16x_avx2;
- uavs3d_funs_handle.ipflt_ext[IPFILTER_EXT_8][3] = uavs3d_if_hor_ver_luma_w16x_avx2;
- uavs3d_funs_handle.ipflt_ext[IPFILTER_EXT_8][4] = uavs3d_if_hor_ver_luma_w16x_avx2;
-diff --git a/source/decore/avx2/avx2.h b/source/decore/avx2/avx2.h
-index 43d0ad3..a29cfe8 100644
---- a/source/decore/avx2/avx2.h
-+++ b/source/decore/avx2/avx2.h
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/avx2/inter_pred_avx2.c b/source/decore/avx2/inter_pred_avx2.c
-index c7287d3..cbaa2fc 100644
---- a/source/decore/avx2/inter_pred_avx2.c
-+++ b/source/decore/avx2/inter_pred_avx2.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
--* Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+* Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
--* 3. All advertising materials mentioning features or use of this software
--* must display the following acknowledgement:
--* This product includes the software uAVS3d developed by
--* Peking University Shenzhen Graduate School, Peng Cheng Laboratory
--* and Guangdong Bohua UHD Innovation Corporation.
--* 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+* 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -33,7 +28,7 @@
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * For more information, contact us at rgwang@pkusz.edu.cn.
--**************************************************************************************/
-+**************************************************************************************/
-
- #include "avx2.h"
-
-@@ -134,9 +129,11 @@ void uavs3d_if_hor_chroma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst
-
- __m256i mCoefy1_hor = _mm256_set1_epi16(*(s16*)coeff);
- __m256i mCoefy2_hor = _mm256_set1_epi16(*(s16*)(coeff + 2));
-- __m256i mSwitch = _mm256_setr_epi8(0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 7, 6, 8, 7, 9, 0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 7, 6, 8, 7, 9);
-+ __m256i mSwitch0 = _mm256_setr_epi8(0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 7, 6, 8, 7, 9, 0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 7, 6, 8, 7, 9);
-+ __m256i mSwitch1 = _mm256_setr_epi8(0+4, 2+4, 1+4, 3+4, 2+4, 4+4, 3+4, 5+4, 4+4, 6+4, 5+4, 7+4, 6+4, 8+4, 7+4, 9+4,
-+ 0+4, 2+4, 1+4, 3+4, 2+4, 4+4, 3+4, 5+4, 4+4, 6+4, 5+4, 7+4, 6+4, 8+4, 7+4, 9+4);
- __m256i mAddOffset = _mm256_set1_epi16(offset);
-- __m256i T0, T1, S0, S1, R0, R1, sum;
-+ __m256i T0, T1, S0, R0, R1, sum;
- __m128i s0, s1;
-
- src -= 2;
-@@ -144,27 +141,27 @@ void uavs3d_if_hor_chroma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst
- while (height > 0) {
- s0 = _mm_loadu_si128((__m128i*)(src));
- s1 = _mm_loadu_si128((__m128i*)(src + i_src));
-+ src += i_src << 1;
-+ uavs3d_prefetch(src, _MM_HINT_NTA);
-+ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
-
- S0 = _mm256_set_m128i(s1, s0);
-- S1 = _mm256_srli_si256(S0, 4);
-
-- R0 = _mm256_shuffle_epi8(S0, mSwitch); // 4 rows s0 and s1
-- R1 = _mm256_shuffle_epi8(S1, mSwitch);
-+ R0 = _mm256_shuffle_epi8(S0, mSwitch0); // 4 rows s0 and s1
-+ R1 = _mm256_shuffle_epi8(S0, mSwitch1);
-
- T0 = _mm256_maddubs_epi16(R0, mCoefy1_hor); // 4x4: s0*c0 + s1*c1
- T1 = _mm256_maddubs_epi16(R1, mCoefy2_hor);
- sum = _mm256_add_epi16(T0, T1);
-
-- sum = _mm256_add_epi16(sum, mAddOffset);
-+ sum = _mm256_add_epi16(sum, mAddOffset);
- sum = _mm256_srai_epi16(sum, shift);
-
- s0 = _mm_packus_epi16(_mm256_castsi256_si128(sum), _mm256_extracti128_si256(sum, 1));
-- s1 = _mm_srli_si128(s0, 8);
- _mm_storel_epi64((__m128i*)(dst), s0);
-- _mm_storel_epi64((__m128i*)(dst + i_dst), s1);
-+ _mm_storeh_pi((__m64*)(dst + i_dst), _mm_castsi128_ps(s0));
-
- height -= 2;
-- src += i_src << 1;
- dst += i_dst << 1;
- }
- }
-@@ -184,9 +181,11 @@ void uavs3d_if_hor_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int i_ds
- src -= 2;
-
- while (height) {
-- uavs3d_prefetch(src + i_src*2, _MM_HINT_NTA);
- S0 = _mm256_loadu_si256((__m256i*)(src));
- S1 = _mm256_loadu_si256((__m256i*)(src + i_src));
-+ src += i_src << 1;
-+ uavs3d_prefetch(src, _MM_HINT_NTA);
-+ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
- S2 = _mm256_permute4x64_epi64(S0, 0x94);
- S3 = _mm256_permute4x64_epi64(S1, 0x94);
- R0 = _mm256_shuffle_epi8(S2, mSwitch1);
-@@ -200,6 +199,8 @@ void uavs3d_if_hor_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int i_ds
- sum0 = _mm256_add_epi16(T0, T1);
- sum1 = _mm256_add_epi16(T2, T3);
-
-+ height -= 2;
-+
- sum0 = _mm256_add_epi16(sum0, mAddOffset);
- sum1 = _mm256_add_epi16(sum1, mAddOffset);
- sum0 = _mm256_srai_epi16(sum0, shift);
-@@ -207,8 +208,6 @@ void uavs3d_if_hor_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int i_ds
- _mm_storeu_si128((__m128i*)(dst), _mm_packus_epi16(_mm256_castsi256_si128(sum0), _mm256_extracti128_si256(sum0, 1)));
- _mm_storeu_si128((__m128i*)(dst + i_dst), _mm_packus_epi16(_mm256_castsi256_si128(sum1), _mm256_extracti128_si256(sum1, 1)));
-
-- height -= 2;
-- src += i_src << 1;
- dst += i_dst << 1;
- }
- }
-@@ -228,10 +227,10 @@ void uavs3d_if_hor_chroma_w32_avx2(const pel *src, int i_src, pel *dst, int i_ds
- src -= 2;
-
- while (height--) {
-- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
--
- S0 = _mm256_loadu_si256((__m256i*)(src));
- S1 = _mm256_loadu_si256((__m256i*)(src + 16));
-+ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
-+
- S2 = _mm256_permute4x64_epi64(S0, 0x94);
- S3 = _mm256_permute4x64_epi64(S1, 0x94);
- R0 = _mm256_shuffle_epi8(S2, mSwitch1);
-@@ -308,59 +307,52 @@ void uavs3d_if_hor_luma_w4_avx2(const pel *src, int i_src, pel *dst, int i_dst,
- const int offset = 32;
- const int shift = 6;
- __m256i mAddOffset = _mm256_set1_epi16(offset);
-- __m256i mSwitch1 = _mm256_setr_epi8(0, 1, 1, 2, 2, 3, 3, 4, 8, 9, 9, 10, 10, 11, 11, 12, 0, 1, 1, 2, 2, 3, 3, 4, 8, 9, 9, 10, 10, 11, 11, 12);
-- __m256i mSwitch2 = _mm256_setr_epi8(2, 3, 3, 4, 4, 5, 5, 6, 10, 11, 11, 12, 12, 13, 13, 14, 2, 3, 3, 4, 4, 5, 5, 6, 10, 11, 11, 12, 12, 13, 13, 14);
-- __m256i T0, T1, T2, T3, S0, S1, S2, S3, sum;
-+ __m256i mSwitch1 = _mm256_setr_epi8(0, 1, 2, 3, 1, 2, 3, 4, 2, 3, 4, 5, 3, 4, 5, 6, 0, 1, 2, 3, 1, 2, 3, 4, 2, 3, 4, 5, 3, 4, 5, 6);
-+ __m256i mSwitch2 = _mm256_setr_epi8(4, 5, 6, 7, 5, 6, 7, 8, 6, 7, 8, 9, 7, 8, 9, 10, 4, 5, 6, 7, 5, 6, 7, 8, 6, 7, 8, 9, 7, 8, 9, 10);
-+ __m256i T0, T1, T2, T3, S0, S1, sum;
- __m256i r0, r1, r2, r3;
- __m128i s0, s1, s2, s3;
-- __m256i mCoefy1_hor = _mm256_set1_epi16(*(s16*)coeff);
-- __m256i mCoefy2_hor = _mm256_set1_epi16(*(s16*)(coeff + 2));
-- __m256i mCoefy3_hor = _mm256_set1_epi16(*(s16*)(coeff + 4));
-- __m256i mCoefy4_hor = _mm256_set1_epi16(*(s16*)(coeff + 6));
-+ __m256i mCoefy1_hor = _mm256_set1_epi32(*(s32*)coeff);
-+ __m256i mCoefy2_hor = _mm256_set1_epi32(*(s32*)(coeff + 4));
- src -= 3;
-
- while (height > 0) {
-- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
- s0 = _mm_loadu_si128((__m128i*)(src));
- s1 = _mm_loadu_si128((__m128i*)(src + i_src));
- s2 = _mm_loadu_si128((__m128i*)(src + i_src * 2));
- s3 = _mm_loadu_si128((__m128i*)(src + i_src * 3));
-+ src += i_src << 2;
-+ uavs3d_prefetch(src, _MM_HINT_NTA);
-+ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
-
- S0 = _mm256_set_m128i(s2, s0);
- S1 = _mm256_set_m128i(s3, s1);
-
-- S2 = _mm256_srli_si256(S0, 4);
-- S3 = _mm256_srli_si256(S1, 4);
--
-- T0 = _mm256_unpacklo_epi64(S0, S1);
-- T1 = _mm256_unpacklo_epi64(S2, S3);
--
-- r0 = _mm256_shuffle_epi8(T0, mSwitch1);
-- r1 = _mm256_shuffle_epi8(T0, mSwitch2);
-- r2 = _mm256_shuffle_epi8(T1, mSwitch1);
-- r3 = _mm256_shuffle_epi8(T1, mSwitch2);
-+ r0 = _mm256_shuffle_epi8(S0, mSwitch1);
-+ r1 = _mm256_shuffle_epi8(S0, mSwitch2);
-+ r2 = _mm256_shuffle_epi8(S1, mSwitch1);
-+ r3 = _mm256_shuffle_epi8(S1, mSwitch2);
-
- T0 = _mm256_maddubs_epi16(r0, mCoefy1_hor);
- T1 = _mm256_maddubs_epi16(r1, mCoefy2_hor);
-- T2 = _mm256_maddubs_epi16(r2, mCoefy3_hor);
-- T3 = _mm256_maddubs_epi16(r3, mCoefy4_hor);
-+ T2 = _mm256_maddubs_epi16(r2, mCoefy1_hor);
-+ T3 = _mm256_maddubs_epi16(r3, mCoefy2_hor);
-
- T0 = _mm256_add_epi16(T0, T1);
- T1 = _mm256_add_epi16(T2, T3);
-- sum = _mm256_add_epi16(T0, T1);
-+ sum = _mm256_hadd_epi16(T0, T1);
-
- sum = _mm256_add_epi16(sum, mAddOffset);
- sum = _mm256_srai_epi16(sum, shift);
-
- s0 = _mm_packus_epi16(_mm256_castsi256_si128(sum), _mm256_extracti128_si256(sum, 1));
-
-+ height -= 4;
- M32(dst) = _mm_extract_epi32(s0, 0);
- M32(dst + i_dst) = _mm_extract_epi32(s0, 1);
- M32(dst + i_dst * 2) = _mm_extract_epi32(s0, 2);
- M32(dst + i_dst * 3) = _mm_extract_epi32(s0, 3);
-
-- height -= 4;
-- src += i_src << 2;
- dst += i_dst << 2;
- }
- }
-@@ -385,9 +377,11 @@ void uavs3d_if_hor_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst,
- src -= 3;
-
- while (height) {
-- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
- s0 = _mm_loadu_si128((__m128i*)(src));
- s1 = _mm_loadu_si128((__m128i*)(src + i_src));
-+ src += i_src << 1;
-+ uavs3d_prefetch(src, _MM_HINT_NTA);
-+ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
- S = _mm256_set_m128i(s1, s0);
-
- r0 = _mm256_shuffle_epi8(S, mSwitch1);
-@@ -407,13 +401,11 @@ void uavs3d_if_hor_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst,
- sum = _mm256_add_epi16(sum, mAddOffset);
- sum = _mm256_srai_epi16(sum, shift);
-
-+ height -= 2;
- s0 = _mm_packus_epi16(_mm256_castsi256_si128(sum), _mm256_extracti128_si256(sum, 1));
-- s1 = _mm_srli_si128(s0, 8);
- _mm_storel_epi64((__m128i*)(dst), s0);
-- _mm_storel_epi64((__m128i*)(dst + i_dst), s1);
-+ _mm_storeh_pi((__m64*)(dst + i_dst), _mm_castsi128_ps(s0));
-
-- height -= 2;
-- src += i_src << 1;
- dst += i_dst << 1;
- }
- }
-@@ -437,11 +429,13 @@ void uavs3d_if_hor_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst,
- src -= 3;
-
- while (height) {
-- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
- S0 = _mm256_loadu_si256((__m256i*)(src));
- S1 = _mm256_loadu_si256((__m256i*)(src + i_src));
- S2 = _mm256_permute4x64_epi64(S0, 0x94);
- S3 = _mm256_permute4x64_epi64(S1, 0x94);
-+ src += i_src << 1;
-+ uavs3d_prefetch(src, _MM_HINT_NTA);
-+ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
-
- r0 = _mm256_shuffle_epi8(S2, mSwitch1);
- r1 = _mm256_shuffle_epi8(S2, mSwitch2);
-@@ -475,11 +469,10 @@ void uavs3d_if_hor_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst,
- sum0 = _mm256_srai_epi16(sum0, shift);
- sum1 = _mm256_srai_epi16(sum1, shift);
-
-+ height -= 2;
- _mm_storeu_si128((__m128i*)(dst), _mm_packus_epi16(_mm256_castsi256_si128(sum0), _mm256_extracti128_si256(sum0, 1)));
- _mm_storeu_si128((__m128i*)(dst + i_dst), _mm_packus_epi16(_mm256_castsi256_si128(sum1), _mm256_extracti128_si256(sum1, 1)));
-
-- height -= 2;
-- src += i_src << 1;
- dst += i_dst << 1;
- }
- }
-@@ -503,13 +496,14 @@ void uavs3d_if_hor_luma_w32_avx2(const pel *src, int i_src, pel *dst, int i_dst,
- src -= 3;
-
- while (height--) {
-- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
--
- S0 = _mm256_loadu_si256((__m256i*)(src));
- S1 = _mm256_loadu_si256((__m256i*)(src + 16));
- S2 = _mm256_permute4x64_epi64(S0, 0x94);
- S3 = _mm256_permute4x64_epi64(S1, 0x94);
-
-+ src += i_src;
-+ uavs3d_prefetch(src, _MM_HINT_NTA);
-+
- r0 = _mm256_shuffle_epi8(S2, mSwitch1);
- r1 = _mm256_shuffle_epi8(S2, mSwitch2);
- r2 = _mm256_shuffle_epi8(S2, mSwitch3);
-@@ -545,7 +539,6 @@ void uavs3d_if_hor_luma_w32_avx2(const pel *src, int i_src, pel *dst, int i_dst,
- _mm_storeu_si128((__m128i*)(dst), _mm_packus_epi16(_mm256_castsi256_si128(sum0), _mm256_extracti128_si256(sum0, 1)));
- _mm_storeu_si128((__m128i*)(dst + 16), _mm_packus_epi16(_mm256_castsi256_si128(sum1), _mm256_extracti128_si256(sum1, 1)));
-
-- src += i_src;
- dst += i_dst;
- }
- }
-@@ -635,15 +628,17 @@ void uavs3d_if_ver_chroma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst
- src -= i_src;
-
- while (height) {
-- uavs3d_prefetch(src + 5 * i_src, _MM_HINT_NTA);
-- uavs3d_prefetch(src + 6 * i_src, _MM_HINT_NTA);
-- height -= 2;
- s0 = _mm_loadl_epi64((__m128i*)(src));
- s1 = _mm_loadl_epi64((__m128i*)(src + i_src));
- s2 = _mm_loadl_epi64((__m128i*)(src + i_src2));
- s3 = _mm_loadl_epi64((__m128i*)(src + i_src3));
- s4 = _mm_loadl_epi64((__m128i*)(src + i_src4));
-
-+ src += 2 * i_src;
-+ height -= 2;
-+ uavs3d_prefetch(src + i_src3, _MM_HINT_NTA);
-+ uavs3d_prefetch(src + i_src4, _MM_HINT_NTA);
-+
- S0 = _mm256_set_m128i(s1, s0);
- S1 = _mm256_set_m128i(s2, s1);
- S2 = _mm256_set_m128i(s3, s2);
-@@ -660,12 +655,10 @@ void uavs3d_if_ver_chroma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst
- mVal = _mm256_add_epi16(mVal, mAddOffset);
- mVal = _mm256_srai_epi16(mVal, shift);
- s0 = _mm_packus_epi16(_mm256_castsi256_si128(mVal), _mm256_extracti128_si256(mVal, 1));
-- s1 = _mm_srli_si128(s0, 8);
-
- _mm_storel_epi64((__m128i*)(dst), s0);
-- _mm_storel_epi64((__m128i*)(dst + i_dst), s1);
-+ _mm_storeh_pi((__m64*)(dst + i_dst), _mm_castsi128_ps(s0));
-
-- src += 2 * i_src;
- dst += 2 * i_dst;
- }
- }
-@@ -687,15 +680,17 @@ void uavs3d_if_ver_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int i_ds
- src -= i_src;
-
- while (height) {
-- uavs3d_prefetch(src + 5 * i_src, _MM_HINT_NTA);
-- uavs3d_prefetch(src + 6 * i_src, _MM_HINT_NTA);
-- height -= 2;
- s0 = _mm_loadu_si128((__m128i*)(src));
- s1 = _mm_loadu_si128((__m128i*)(src + i_src));
- s2 = _mm_loadu_si128((__m128i*)(src + i_src2));
- s3 = _mm_loadu_si128((__m128i*)(src + i_src3));
- s4 = _mm_loadu_si128((__m128i*)(src + i_src4));
-
-+ src += 2 * i_src;
-+ uavs3d_prefetch(src + i_src3, _MM_HINT_NTA);
-+ uavs3d_prefetch(src + i_src4, _MM_HINT_NTA);
-+ height -= 2;
-+
- S0 = _mm256_set_m128i(s1, s0);
- S1 = _mm256_set_m128i(s2, s1);
- S2 = _mm256_set_m128i(s3, s2);
-@@ -723,7 +718,6 @@ void uavs3d_if_ver_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int i_ds
- _mm_storeu_si128((__m128i*)dst, _mm256_castsi256_si128(mVal0));
- _mm_storeu_si128((__m128i*)(dst + i_dst), _mm256_extracti128_si256(mVal0, 1));
-
-- src += 2 * i_src;
- dst += 2 * i_dst;
- }
- }
-@@ -744,15 +738,17 @@ void uavs3d_if_ver_chroma_w32_avx2(const pel *src, int i_src, pel *dst, int i_ds
- src -= i_src;
-
- while (height) {
-- uavs3d_prefetch(src + 5 * i_src, _MM_HINT_NTA);
-- uavs3d_prefetch(src + 6 * i_src, _MM_HINT_NTA);
-- height -= 2;
- S0 = _mm256_loadu_si256((__m256i*)(src));
- S1 = _mm256_loadu_si256((__m256i*)(src + i_src));
- S2 = _mm256_loadu_si256((__m256i*)(src + i_src2));
- S3 = _mm256_loadu_si256((__m256i*)(src + i_src3));
- S4 = _mm256_loadu_si256((__m256i*)(src + i_src4));
-
-+ src += 2 * i_src;
-+ height -= 2;
-+ uavs3d_prefetch(src + i_src3, _MM_HINT_NTA);
-+ uavs3d_prefetch(src + i_src4, _MM_HINT_NTA);
-+
- T0 = _mm256_unpacklo_epi8(S0, S1);
- T1 = _mm256_unpackhi_epi8(S0, S1);
- T2 = _mm256_unpacklo_epi8(S2, S3);
-@@ -790,7 +786,6 @@ void uavs3d_if_ver_chroma_w32_avx2(const pel *src, int i_src, pel *dst, int i_ds
- _mm256_storeu_si256((__m256i*)dst, mVal0);
- _mm256_storeu_si256((__m256i*)(dst + i_dst), mVal2);
-
-- src += 2 * i_src;
- dst += 2 * i_dst;
-
- }
-@@ -811,7 +806,6 @@ void uavs3d_if_ver_chroma_w64_avx2(const pel *src, int i_src, pel *dst, int i_ds
- src -= i_src;
-
- while (height--){
-- uavs3d_prefetch(src + 4 * i_src, _MM_HINT_NTA);
- S0 = _mm256_loadu_si256((__m256i*)(src));
- S4 = _mm256_loadu_si256((__m256i*)(src + 32));
- S1 = _mm256_loadu_si256((__m256i*)(src + i_src));
-@@ -821,6 +815,7 @@ void uavs3d_if_ver_chroma_w64_avx2(const pel *src, int i_src, pel *dst, int i_ds
- S3 = _mm256_loadu_si256((__m256i*)(src + i_src3));
- S7 = _mm256_loadu_si256((__m256i*)(src + i_src3 + 32));
-
-+ src += i_src;
- T0 = _mm256_unpacklo_epi8(S0, S1);
- T1 = _mm256_unpacklo_epi8(S2, S3);
- T2 = _mm256_unpackhi_epi8(S0, S1);
-@@ -830,6 +825,8 @@ void uavs3d_if_ver_chroma_w64_avx2(const pel *src, int i_src, pel *dst, int i_ds
- T6 = _mm256_unpackhi_epi8(S4, S5);
- T7 = _mm256_unpackhi_epi8(S6, S7);
-
-+ uavs3d_prefetch(src + i_src3, _MM_HINT_NTA);
-+
- T0 = _mm256_maddubs_epi16(T0, coeff0);
- T1 = _mm256_maddubs_epi16(T1, coeff1);
- T2 = _mm256_maddubs_epi16(T2, coeff0);
-@@ -858,7 +855,6 @@ void uavs3d_if_ver_chroma_w64_avx2(const pel *src, int i_src, pel *dst, int i_ds
- _mm256_storeu_si256((__m256i*)(dst), mVal0);
- _mm256_storeu_si256((__m256i*)(dst + 32), mVal1);
-
-- src += i_src;
- dst += i_dst;
- }
- }
-@@ -878,7 +874,6 @@ void uavs3d_if_ver_chroma_w128_avx2(const pel *src, int i_src, pel *dst, int i_d
- src -= i_src;
-
- while (height--) {
-- uavs3d_prefetch(src + 4 * i_src, _MM_HINT_NTA);
- S0 = _mm256_loadu_si256((__m256i*)(src));
- S4 = _mm256_loadu_si256((__m256i*)(src + 32));
- S1 = _mm256_loadu_si256((__m256i*)(src + i_src));
-@@ -934,6 +929,9 @@ void uavs3d_if_ver_chroma_w128_avx2(const pel *src, int i_src, pel *dst, int i_d
- S3 = _mm256_loadu_si256((__m256i*)(src + i_src3 + 64));
- S7 = _mm256_loadu_si256((__m256i*)(src + i_src3 + 96));
-
-+ src += i_src;
-+ uavs3d_prefetch(src + i_src3, _MM_HINT_NTA);
-+
- T0 = _mm256_unpacklo_epi8(S0, S1);
- T1 = _mm256_unpacklo_epi8(S2, S3);
- T2 = _mm256_unpackhi_epi8(S0, S1);
-@@ -971,7 +969,6 @@ void uavs3d_if_ver_chroma_w128_avx2(const pel *src, int i_src, pel *dst, int i_d
- _mm256_storeu_si256((__m256i*)(dst + 64), mVal0);
- _mm256_storeu_si256((__m256i*)(dst + 96), mVal1);
-
-- src += i_src;
- dst += i_dst;
- }
- }
-@@ -1078,7 +1075,6 @@ void uavs3d_if_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst,
- while (height) {
- __m128i S0, S1, S2, S3, S4, S5, S6, S7, S8;
-
-- height -= 2;
- S0 = _mm_loadl_epi64((__m128i*)(src));
- S1 = _mm_loadl_epi64((__m128i*)(src + i_src));
- S2 = _mm_loadl_epi64((__m128i*)(src + i_src2));
-@@ -1098,6 +1094,11 @@ void uavs3d_if_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst,
- R6 = _mm256_set_m128i(S7, S6);
- R7 = _mm256_set_m128i(S8, S7);
-
-+ src += 2 * i_src;
-+ height -= 2;
-+ uavs3d_prefetch(src + i_src7, _MM_HINT_NTA);
-+ uavs3d_prefetch(src + i_src8, _MM_HINT_NTA);
-+
- T0 = _mm256_unpacklo_epi8(R0, R1);
- T1 = _mm256_unpacklo_epi8(R2, R3);
- T2 = _mm256_unpacklo_epi8(R4, R5);
-@@ -1115,11 +1116,9 @@ void uavs3d_if_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst,
- mVal = _mm256_add_epi16(mVal, mAddOffset);
- mVal = _mm256_srai_epi16(mVal, shift);
- S0 = _mm_packus_epi16(_mm256_castsi256_si128(mVal), _mm256_extracti128_si256(mVal, 1));
-- S1 = _mm_srli_si128(S0, 8);
-
- _mm_storel_epi64((__m128i*)(dst), S0);
-- _mm_storel_epi64((__m128i*)(dst + i_dst), S1);
-- src += 2 * i_src;
-+ _mm_storeh_pi((__m64*)(dst + i_dst), _mm_castsi128_ps(S0));
- dst += 2 * i_dst;
- }
- }
-@@ -1147,10 +1146,6 @@ void uavs3d_if_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst,
-
- while(height) {
- __m128i S0, S1, S2, S3, S4, S5, S6, S7, S8;
-- uavs3d_prefetch(src + 9 * i_src, _MM_HINT_NTA);
-- uavs3d_prefetch(src + 10 * i_src, _MM_HINT_NTA);
--
-- height -= 2;
- S0 = _mm_loadu_si128((__m128i*)(src));
- S1 = _mm_loadu_si128((__m128i*)(src + i_src));
- S2 = _mm_loadu_si128((__m128i*)(src + i_src2));
-@@ -1170,6 +1165,12 @@ void uavs3d_if_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst,
- R6 = _mm256_set_m128i(S6, S7);
- R7 = _mm256_set_m128i(S7, S8);
-
-+ src += 2 * i_src;
-+ height -= 2;
-+
-+ uavs3d_prefetch(src + i_src7, _MM_HINT_NTA);
-+ uavs3d_prefetch(src + i_src8, _MM_HINT_NTA);
-+
- T0 = _mm256_unpacklo_epi8(R0, R1);
- T1 = _mm256_unpackhi_epi8(R0, R1);
- T2 = _mm256_unpacklo_epi8(R2, R3);
-@@ -1203,7 +1204,6 @@ void uavs3d_if_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst,
-
- _mm_storeu_si128((__m128i*)dst, _mm256_extractf128_si256(mVal1, 1));
- _mm_storeu_si128((__m128i*)(dst + i_dst), _mm256_castsi256_si128(mVal1));
-- src += 2 * i_src;
- dst += 2 * i_dst;
- }
- }
-@@ -1230,7 +1230,6 @@ void uavs3d_if_ver_luma_w32_avx2(const pel *src, int i_src, pel *dst, int i_dst,
- src -= 3 * i_src;
- while (height--) {
- __m256i S0, S1, S2, S3, S4, S5, S6, S7;
-- uavs3d_prefetch(src + 8 * i_src, _MM_HINT_NTA);
- S0 = _mm256_loadu_si256((__m256i*)(src));
- S1 = _mm256_loadu_si256((__m256i*)(src + i_src));
- S2 = _mm256_loadu_si256((__m256i*)(src + i_src2));
-@@ -1240,6 +1239,7 @@ void uavs3d_if_ver_luma_w32_avx2(const pel *src, int i_src, pel *dst, int i_dst,
- S6 = _mm256_loadu_si256((__m256i*)(src + i_src6));
- S7 = _mm256_loadu_si256((__m256i*)(src + i_src7));
-
-+ src += i_src;
- T0 = _mm256_unpacklo_epi8(S0, S1);
- T1 = _mm256_unpacklo_epi8(S2, S3);
- T2 = _mm256_unpacklo_epi8(S4, S5);
-@@ -1249,6 +1249,8 @@ void uavs3d_if_ver_luma_w32_avx2(const pel *src, int i_src, pel *dst, int i_dst,
- T6 = _mm256_unpackhi_epi8(S4, S5);
- T7 = _mm256_unpackhi_epi8(S6, S7);
-
-+ uavs3d_prefetch(src + i_src7, _MM_HINT_NTA);
-+
- T0 = _mm256_maddubs_epi16(T0, coeff0);
- T1 = _mm256_maddubs_epi16(T1, coeff1);
- T2 = _mm256_maddubs_epi16(T2, coeff2);
-@@ -1273,7 +1275,6 @@ void uavs3d_if_ver_luma_w32_avx2(const pel *src, int i_src, pel *dst, int i_dst,
-
- _mm256_storeu_si256((__m256i*)(dst), mVal1);
-
-- src += i_src;
- dst += i_dst;
- }
- }
-@@ -1295,12 +1296,11 @@ void uavs3d_if_ver_luma_w64_avx2(const pel *src, int i_src, pel *dst, int i_dst,
- __m256i coeff3 = _mm256_set1_epi16(*(s16*)(coeff + 6));
- __m256i T0, T1, T2, T3, T4, T5, T6, T7, mVal1, mVal2;
-
-- src -= 3 * i_src;
-+ src -= i_src3;
-
- while (height--) {
- const pel *p = src + 32;
- __m256i S0, S1, S2, S3, S4, S5, S6, S7;
-- uavs3d_prefetch(src + 8 * i_src, _MM_HINT_NTA);
- S0 = _mm256_loadu_si256((__m256i*)(src));
- S1 = _mm256_loadu_si256((__m256i*)(src + i_src));
- S2 = _mm256_loadu_si256((__m256i*)(src + i_src2));
-@@ -1352,6 +1352,7 @@ void uavs3d_if_ver_luma_w64_avx2(const pel *src, int i_src, pel *dst, int i_dst,
- S6 = _mm256_loadu_si256((__m256i*)(p + i_src6));
- S7 = _mm256_loadu_si256((__m256i*)(p + i_src7));
-
-+ src += i_src;
- T0 = _mm256_unpacklo_epi8(S0, S1);
- T1 = _mm256_unpacklo_epi8(S2, S3);
- T2 = _mm256_unpacklo_epi8(S4, S5);
-@@ -1361,6 +1362,8 @@ void uavs3d_if_ver_luma_w64_avx2(const pel *src, int i_src, pel *dst, int i_dst,
- T6 = _mm256_unpackhi_epi8(S4, S5);
- T7 = _mm256_unpackhi_epi8(S6, S7);
-
-+ uavs3d_prefetch(src + i_src7, _MM_HINT_NTA);
-+
- T0 = _mm256_maddubs_epi16(T0, coeff0);
- T1 = _mm256_maddubs_epi16(T1, coeff1);
- T2 = _mm256_maddubs_epi16(T2, coeff2);
-@@ -1385,7 +1388,6 @@ void uavs3d_if_ver_luma_w64_avx2(const pel *src, int i_src, pel *dst, int i_dst,
-
- _mm256_storeu_si256((__m256i*)(dst + 32), mVal1);
-
-- src += i_src;
- dst += i_dst;
- }
- }
-@@ -1412,7 +1414,6 @@ void uavs3d_if_ver_luma_w128_avx2(const pel *src, int i_src, pel *dst, int i_dst
- while (height--) {
- const pel *p = src + 32;
- __m256i S0, S1, S2, S3, S4, S5, S6, S7;
-- uavs3d_prefetch(src + 8 * i_src, _MM_HINT_NTA);
- S0 = _mm256_loadu_si256((__m256i*)(src));
- S1 = _mm256_loadu_si256((__m256i*)(src + i_src));
- S2 = _mm256_loadu_si256((__m256i*)(src + i_src2));
-@@ -1552,6 +1553,8 @@ void uavs3d_if_ver_luma_w128_avx2(const pel *src, int i_src, pel *dst, int i_dst
- S6 = _mm256_loadu_si256((__m256i*)(p + i_src6));
- S7 = _mm256_loadu_si256((__m256i*)(p + i_src7));
-
-+ src += i_src;
-+ uavs3d_prefetch(src + i_src7, _MM_HINT_NTA);
- T0 = _mm256_unpacklo_epi8(S0, S1);
- T1 = _mm256_unpacklo_epi8(S2, S3);
- T2 = _mm256_unpacklo_epi8(S4, S5);
-@@ -1585,7 +1588,6 @@ void uavs3d_if_ver_luma_w128_avx2(const pel *src, int i_src, pel *dst, int i_dst
-
- _mm256_storeu_si256((__m256i*)(dst + 96), mVal1);
-
-- src += i_src;
- dst += i_dst;
- }
- }
-@@ -1668,6 +1670,8 @@ void uavs3d_if_hor_ver_chroma_w8_avx2(const pel *src, int i_src, pel *dst, int i
- S2 = _mm256_permute2x128_si256(mVal[1], mVal[2], 0x21);
- S3 = mVal[2];
-
-+ uavs3d_prefetch(src + i_src3, _MM_HINT_NTA);
-+
- T0 = _mm256_unpacklo_epi16(S0, S1);
- T1 = _mm256_unpacklo_epi16(S2, S3);
- T2 = _mm256_unpackhi_epi16(S0, S1);
-@@ -1709,17 +1713,15 @@ void uavs3d_if_hor_ver_chroma_w8_avx2(const pel *src, int i_src, pel *dst, int i
- T0 = _mm256_srai_epi32(T0, shift);
- T2 = _mm256_srai_epi32(T2, shift);
-
-- s0 = _mm_packus_epi16(_mm256_castsi256_si128(R0), _mm256_extracti128_si256(R0, 1));
-- s1 = _mm_srli_si128(s0, 8);
-+ s2 = _mm_packus_epi16(_mm256_castsi256_si128(R0), _mm256_extracti128_si256(R0, 1));
-
- T0 = _mm256_packs_epi32(T0, T2);
-- s2 = _mm_packus_epi16(_mm256_castsi256_si128(T0), _mm256_extracti128_si256(T0, 1));
-- s3 = _mm_srli_si128(s2, 8);
-+ s3 = _mm_packus_epi16(_mm256_castsi256_si128(T0), _mm256_extracti128_si256(T0, 1));
-
-- _mm_storel_epi64((__m128i*)(dst), s0);
-- _mm_storel_epi64((__m128i*)(dst + i_dst), s1);
-- _mm_storel_epi64((__m128i*)(dst + i_dst*2), s2);
-- _mm_storel_epi64((__m128i*)(dst + i_dst*3), s3);
-+ _mm_storel_epi64((__m128i*)(dst), s2);
-+ _mm_storeh_pi((__m64*)(dst + i_dst), _mm_castsi128_ps(s2));
-+ _mm_storel_epi64((__m128i*)(dst + i_dst*2), s3);
-+ _mm_storeh_pi((__m64*)(dst + i_dst*3), _mm_castsi128_ps(s3));
-
- dst += i_dst << 2;
- height -= 4;
-@@ -1756,17 +1758,17 @@ void uavs3d_if_hor_ver_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int
- row = height + 3;
-
- while (row--) {
-- uavs3d_prefetch(src + i_src*2, _MM_HINT_NTA);
- S0 = _mm256_loadu_si256((__m256i*)(src));
-+ src += i_src;
- S1 = _mm256_permute4x64_epi64(S0, 0x94);
-+ uavs3d_prefetch(src, _MM_HINT_NTA);
- R0 = _mm256_shuffle_epi8(S1, mSwitch1);
- R1 = _mm256_shuffle_epi8(S1, mSwitch2);
- T0 = _mm256_maddubs_epi16(R0, mCoefy1_hor);
- T1 = _mm256_maddubs_epi16(R1, mCoefy2_hor);
- sum = _mm256_add_epi16(T0, T1);
-
-- _mm256_storeu_si256((__m256i*)(tmp), sum);
-- src += i_src;
-+ _mm256_store_si256((__m256i*)(tmp), sum);
- tmp += i_tmp;
- }
-
-@@ -1878,8 +1880,8 @@ void uavs3d_if_hor_ver_chroma_w32x_avx2(const pel *src, int i_src, pel *dst, int
- sum0 = _mm256_add_epi16(T0, T1);
- sum1 = _mm256_add_epi16(T2, T3);
-
-- _mm256_storeu_si256((__m256i*)(tmp + col), sum0);
-- _mm256_storeu_si256((__m256i*)(tmp + col + 16), sum1);
-+ _mm256_store_si256((__m256i*)(tmp + col), sum0);
-+ _mm256_store_si256((__m256i*)(tmp + col + 16), sum1);
- }
- src += i_src;
- tmp += i_tmp;
-@@ -2055,8 +2057,8 @@ void uavs3d_if_hor_ver_luma_w4_avx2(const pel *src, int i_src, pel *dst, int i_d
-
- s0 = _mm_loadu_si128((__m128i*)(src));
- s1 = _mm_loadu_si128((__m128i*)(src + i_src));
-- s2 = _mm_loadu_si128((__m128i*)(src + i_src * 2));
-- s3 = _mm_loadu_si128((__m128i*)(src + i_src * 3));
-+ s2 = _mm_loadu_si128((__m128i*)(src + i_src2));
-+ s3 = _mm_loadu_si128((__m128i*)(src + i_src3));
-
- S0 = _mm256_set_m128i(s2, s0);
- S1 = _mm256_set_m128i(s3, s1);
-@@ -2090,8 +2092,8 @@ void uavs3d_if_hor_ver_luma_w4_avx2(const pel *src, int i_src, pel *dst, int i_d
- // hor
- s0 = _mm_loadu_si128((__m128i*)(src));
- s1 = _mm_loadu_si128((__m128i*)(src + i_src));
-- s2 = _mm_loadu_si128((__m128i*)(src + i_src * 2));
-- s3 = _mm_loadu_si128((__m128i*)(src + i_src * 3));
-+ s2 = _mm_loadu_si128((__m128i*)(src + i_src2));
-+ s3 = _mm_loadu_si128((__m128i*)(src + i_src3));
-
- S0 = _mm256_set_m128i(s2, s0);
- S1 = _mm256_set_m128i(s3, s1);
-@@ -2173,19 +2175,7 @@ void uavs3d_if_hor_ver_luma_w4_avx2(const pel *src, int i_src, pel *dst, int i_d
-
- void uavs3d_if_hor_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coef_x, const s8 *coef_y, int max_val)
- {
-- const int i_tmp = 8;
-- const int i_tmp2 = 16;
-- const int i_tmp3 = 24;
-- const int i_tmp4 = 32;
-- const int i_tmp5 = 40;
-- const int i_tmp6 = 48;
-- const int i_tmp7 = 56;;
-- const int i_tmp8 = 64;
-- const int i_tmp9 = 72;;
-- const int i_tmp10 = 80;
- const int i_src2 = i_src << 1;
-- int row;
-- int shift = 12;
-
- __m256i T0, T1, T2, T3, T4, T5, T6, T7, T8, T9;
- __m256i r0, r1, r2, r3, r4, r5, r6, r7, r8, r9;
-@@ -2201,12 +2191,16 @@ void uavs3d_if_hor_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_d
-
- //HOR
- {
-+ int row;
- src = src - 3 * i_src - 3;
-
- // first row
- {
- __m128i mSrc0 = _mm_loadu_si128((__m128i*)(src));
- T0 = _mm256_set_m128i(mSrc0, mSrc0);
-+ src += i_src;
-+
-+ uavs3d_prefetch(src, _MM_HINT_NTA);
-
- r0 = _mm256_shuffle_epi8(T0, mSwitch1);
- r1 = _mm256_shuffle_epi8(T0, mSwitch2);
-@@ -2224,13 +2218,16 @@ void uavs3d_if_hor_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_d
-
- mVal[0] = _mm256_permute4x64_epi64(mVal[0], 0x44);
-
-- src += i_src;
- }
-
- for (row = 1; row < 4; row++) {
-- __m128i mSrc0 = _mm_loadu_si128((__m128i*)(src));
-+ __m128i mSrc0 = _mm_loadu_si128((__m128i*)(src));
- __m128i mSrc1 = _mm_loadu_si128((__m128i*)(src + i_src));
- T0 = _mm256_set_m128i(mSrc1, mSrc0);
-+ src += i_src2;
-+
-+ uavs3d_prefetch(src, _MM_HINT_NTA);
-+ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
-
- r0 = _mm256_shuffle_epi8(T0, mSwitch1);
- r1 = _mm256_shuffle_epi8(T0, mSwitch2);
-@@ -2245,8 +2242,6 @@ void uavs3d_if_hor_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_d
- T0 = _mm256_add_epi16(T0, T1);
- T1 = _mm256_add_epi16(T2, T3);
- mVal[row] = _mm256_add_epi16(T0, T1);
--
-- src += i_src2;
- }
- }
-
-@@ -2260,35 +2255,44 @@ void uavs3d_if_hor_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_d
- __m256i mCoefy2 = _mm256_cvtepi8_epi16(mCoefy22);
- __m256i mCoefy3 = _mm256_cvtepi8_epi16(mCoefy33);
- __m256i mCoefy4 = _mm256_cvtepi8_epi16(mCoefy44);
-+ const int shift = 12;
-
- while (height > 0) {
- __m128i s0, s1;
- //hor
-- s0 = _mm_loadu_si128((__m128i*)(src));
-+ s0 = _mm_loadu_si128((__m128i*)(src));
- s1 = _mm_loadu_si128((__m128i*)(src + i_src));
- T0 = _mm256_set_m128i(s1, s0);
-
-+ src += i_src2;
-+
-+ uavs3d_prefetch(src, _MM_HINT_NTA);
-+ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
-+
- r0 = _mm256_shuffle_epi8(T0, mSwitch1);
- r1 = _mm256_shuffle_epi8(T0, mSwitch2);
- r2 = _mm256_shuffle_epi8(T0, mSwitch3);
- r3 = _mm256_shuffle_epi8(T0, mSwitch4);
-
-- src += i_src2;
--
- T0 = _mm256_maddubs_epi16(r0, mCoefy1_hor);
- T1 = _mm256_maddubs_epi16(r1, mCoefy2_hor);
- T2 = _mm256_maddubs_epi16(r2, mCoefy3_hor);
- T3 = _mm256_maddubs_epi16(r3, mCoefy4_hor);
-
-- s0 = _mm_loadu_si128((__m128i*)(src));
-+ s0 = _mm_loadu_si128((__m128i*)(src));
- s1 = _mm_loadu_si128((__m128i*)(src + i_src));
-
- T0 = _mm256_add_epi16(T0, T1);
- T1 = _mm256_add_epi16(T2, T3);
- mVal[4] = _mm256_add_epi16(T0, T1);
-
-+ src += i_src2;
-+
- T0 = _mm256_set_m128i(s1, s0);
-
-+ uavs3d_prefetch(src, _MM_HINT_NTA);
-+ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
-+
- r0 = _mm256_shuffle_epi8(T0, mSwitch1);
- r1 = _mm256_shuffle_epi8(T0, mSwitch2);
- r2 = _mm256_shuffle_epi8(T0, mSwitch3);
-@@ -2303,8 +2307,6 @@ void uavs3d_if_hor_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_d
- T1 = _mm256_add_epi16(T2, T3);
- mVal[5] = _mm256_add_epi16(T0, T1);
-
-- src += i_src2;
--
- T0 = _mm256_permute2x128_si256(mVal[0], mVal[1], 0x21);
- T1 = mVal[1];
- T2 = _mm256_permute2x128_si256(mVal[1], mVal[2], 0x21);
-@@ -2352,10 +2354,9 @@ void uavs3d_if_hor_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_d
-
- T0 = _mm256_packs_epi32(T0, T4);
- s0 = _mm_packus_epi16(_mm256_castsi256_si128(T0), _mm256_extracti128_si256(T0, 1));
-- s1 = _mm_srli_si128(s0, 8);
-
- _mm_storel_epi64((__m128i*)(dst), s0);
-- _mm_storel_epi64((__m128i*)(dst + i_dst), s1);
-+ _mm_storeh_pi((__m64*)(dst + i_dst), _mm_castsi128_ps(s0));
-
- r4 = _mm256_unpacklo_epi16(T8, T9);
- r9 = _mm256_unpackhi_epi16(T8, T9);
-@@ -2382,13 +2383,12 @@ void uavs3d_if_hor_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_d
-
- T0 = _mm256_packs_epi32(T0, T4);
- s0 = _mm_packus_epi16(_mm256_castsi256_si128(T0), _mm256_extracti128_si256(T0, 1));
-- s1 = _mm_srli_si128(s0, 8);
-
-+ height -= 4;
- _mm_storel_epi64((__m128i*)(dst + i_dst * 2), s0);
-- _mm_storel_epi64((__m128i*)(dst + i_dst * 3), s1);
-+ _mm_storeh_pi((__m64*)(dst + i_dst * 3), _mm_castsi128_ps(s0));
-
- dst += i_dst << 2;
-- height -= 4;
- }
- }
- }
-@@ -2397,7 +2397,6 @@ void uavs3d_if_hor_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_
- {
- ALIGNED_32(s16 tmp_res[(128 + 7) * 16]);
- s16 *tmp = tmp_res;
-- int row;
- __m256i mVal1, mVal2, mVal;
- __m256i T0, T1, T2, T3, T4, T5, T6, T7, T8, T9;
- __m256i S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10;
-@@ -2406,6 +2405,7 @@ void uavs3d_if_hor_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_
-
- //HOR
- {
-+ int row;
- __m256i mSwitch1 = _mm256_setr_epi8(0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8);
- __m256i mSwitch2 = _mm256_setr_epi8(2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10);
- __m256i mSwitch3 = _mm256_setr_epi8(4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12);
-@@ -2421,8 +2421,9 @@ void uavs3d_if_hor_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_
- row = height + 7;
- while (row--) {
- S = _mm256_loadu_si256((__m256i*)(src));
-- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
-+ src += i_src;
- S0 = _mm256_permute4x64_epi64(S, 0x94);
-+ uavs3d_prefetch(src, _MM_HINT_NTA);
-
- r0 = _mm256_shuffle_epi8(S0, mSwitch1);
- r1 = _mm256_shuffle_epi8(S0, mSwitch2);
-@@ -2438,9 +2439,8 @@ void uavs3d_if_hor_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_
- T1 = _mm256_add_epi16(T2, T3);
- sum = _mm256_add_epi16(T0, T1);
-
-- _mm256_storeu_si256((__m256i*)(tmp), sum);
-+ _mm256_store_si256((__m256i*)(tmp), sum);
-
-- src += i_src;
- tmp += 16;
- }
- }
-@@ -2603,9 +2603,9 @@ void uavs3d_if_hor_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_
- mVal = _mm256_packs_epi32(mVal1, mVal2);
- _mm_storeu_si128((__m128i*)(dst + 3 * i_dst), _mm_packus_epi16(_mm256_castsi256_si128(mVal), _mm256_extracti128_si256(mVal, 1)));
-
-+ height -= 4;
- tmp += 4 * i_tmp;
- dst += 4 * i_dst;
-- height -= 4;
- }
- }
- }
-@@ -2614,10 +2614,10 @@ void uavs3d_if_hor_ver_luma_w32_avx2(const pel *src, int i_src, pel *dst, int i_
- {
- ALIGNED_32(s16 tmp_res[(128 + 7) * 32]);
- s16 *tmp = tmp_res;
-- int row, col;
- const int i_tmp = 32;
- //HOR
- {
-+ int row;
- __m256i mSwitch1 = _mm256_setr_epi8(0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8);
- __m256i mSwitch2 = _mm256_setr_epi8(2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10);
- __m256i mSwitch3 = _mm256_setr_epi8(4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12);
-@@ -2629,26 +2629,25 @@ void uavs3d_if_hor_ver_luma_w32_avx2(const pel *src, int i_src, pel *dst, int i_
- __m256i mCoefy4_hor = _mm256_set1_epi16(*(s16*)(coef_x + 6));
-
- __m256i T0, T1, T2, T3, T4, T5, T6, T7;
-- __m256i S0, S1, S2, S3;
-+ __m256i S0, S1;
-
- src = src - 3 * i_src - 3;
-
- row = height + 7;
- while (row--) {
-- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
- S0 = _mm256_loadu_si256((__m256i*)(src));
- S1 = _mm256_loadu_si256((__m256i*)(src + 8));
-- S2 = _mm256_insertf128_si256(S0, _mm256_castsi256_si128(S1), 0x1);
-- S3 = _mm256_insertf128_si256(S1, _mm256_extracti128_si256(S0, 1), 0x0);
--
-- T0 = _mm256_shuffle_epi8(S2, mSwitch1);
-- T1 = _mm256_shuffle_epi8(S2, mSwitch2);
-- T2 = _mm256_shuffle_epi8(S2, mSwitch3);
-- T3 = _mm256_shuffle_epi8(S2, mSwitch4);
-- T4 = _mm256_shuffle_epi8(S3, mSwitch1);
-- T5 = _mm256_shuffle_epi8(S3, mSwitch2);
-- T6 = _mm256_shuffle_epi8(S3, mSwitch3);
-- T7 = _mm256_shuffle_epi8(S3, mSwitch4);
-+ src += i_src;
-+ uavs3d_prefetch(src, _MM_HINT_NTA);
-+
-+ T0 = _mm256_shuffle_epi8(S0, mSwitch1);
-+ T1 = _mm256_shuffle_epi8(S0, mSwitch2);
-+ T2 = _mm256_shuffle_epi8(S0, mSwitch3);
-+ T3 = _mm256_shuffle_epi8(S0, mSwitch4);
-+ T4 = _mm256_shuffle_epi8(S1, mSwitch1);
-+ T5 = _mm256_shuffle_epi8(S1, mSwitch2);
-+ T6 = _mm256_shuffle_epi8(S1, mSwitch3);
-+ T7 = _mm256_shuffle_epi8(S1, mSwitch4);
-
- T0 = _mm256_maddubs_epi16(T0, mCoefy1_hor);
- T1 = _mm256_maddubs_epi16(T1, mCoefy2_hor);
-@@ -2666,10 +2665,11 @@ void uavs3d_if_hor_ver_luma_w32_avx2(const pel *src, int i_src, pel *dst, int i_
- T0 = _mm256_add_epi16(T0, T2);
- T4 = _mm256_add_epi16(T4, T6);
-
-- _mm256_storeu_si256((__m256i*)(tmp), T0);
-- _mm256_storeu_si256((__m256i*)(tmp + 16), T4);
-+ T1 = _mm256_permute2x128_si256(T0, T4, 0x20);
-+ T3 = _mm256_permute2x128_si256(T0, T4, 0x31);
-+ _mm256_store_si256((__m256i*)(tmp), T1);
-+ _mm256_store_si256((__m256i*)(tmp + 16), T3);
-
-- src += i_src;
- tmp += i_tmp;
- }
- }
-@@ -2685,8 +2685,8 @@ void uavs3d_if_hor_ver_luma_w32_avx2(const pel *src, int i_src, pel *dst, int i_
- const int i_tmp8 = 32 * 8;
- const int i_tmp9 = 32 * 9;
- const int i_tmp10 = 32 * 10;
--
-- int shift = 12;
-+ int col;
-+ const int shift = 12;
- __m256i mAddOffset = _mm256_set1_epi32(1 << 11);
- __m128i mCoefy11 = _mm_set1_epi16(*(s16*)coef_y);
- __m128i mCoefy22 = _mm_set1_epi16(*(s16*)(coef_y + 2));
-@@ -2850,7 +2850,6 @@ void uavs3d_if_hor_ver_luma_w32x_avx2(const pel *src, int i_src, pel *dst, int i
- {
- ALIGNED_32(s16 tmp_res[(128 + 7) * 128]);
- s16 *tmp = tmp_res;
-- int row, col;
- const int i_tmp = width;
- __m256i mVal1, mVal2, mVal;
- __m256i T0, T1, T2, T3, T4, T5, T6, T7, T8, T9;
-@@ -2859,6 +2858,7 @@ void uavs3d_if_hor_ver_luma_w32x_avx2(const pel *src, int i_src, pel *dst, int i
-
- //HOR
- {
-+ int row, col;
- __m256i mSwitch1 = _mm256_setr_epi8(0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8);
- __m256i mSwitch2 = _mm256_setr_epi8(2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10);
- __m256i mSwitch3 = _mm256_setr_epi8(4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12);
-@@ -2878,17 +2878,15 @@ void uavs3d_if_hor_ver_luma_w32x_avx2(const pel *src, int i_src, pel *dst, int i
- {
- S0 = _mm256_loadu_si256((__m256i*)(src + col));
- S1 = _mm256_loadu_si256((__m256i*)(src + col + 8));
-- S2 = _mm256_insertf128_si256(S0, _mm256_castsi256_si128(S1), 0x1);
-- S3 = _mm256_insertf128_si256(S1, _mm256_extracti128_si256(S0, 1), 0x0);
--
-- T0 = _mm256_shuffle_epi8(S2, mSwitch1);
-- T1 = _mm256_shuffle_epi8(S2, mSwitch2);
-- T2 = _mm256_shuffle_epi8(S2, mSwitch3);
-- T3 = _mm256_shuffle_epi8(S2, mSwitch4);
-- T4 = _mm256_shuffle_epi8(S3, mSwitch1);
-- T5 = _mm256_shuffle_epi8(S3, mSwitch2);
-- T6 = _mm256_shuffle_epi8(S3, mSwitch3);
-- T7 = _mm256_shuffle_epi8(S3, mSwitch4);
-+
-+ T0 = _mm256_shuffle_epi8(S0, mSwitch1);
-+ T1 = _mm256_shuffle_epi8(S0, mSwitch2);
-+ T2 = _mm256_shuffle_epi8(S0, mSwitch3);
-+ T3 = _mm256_shuffle_epi8(S0, mSwitch4);
-+ T4 = _mm256_shuffle_epi8(S1, mSwitch1);
-+ T5 = _mm256_shuffle_epi8(S1, mSwitch2);
-+ T6 = _mm256_shuffle_epi8(S1, mSwitch3);
-+ T7 = _mm256_shuffle_epi8(S1, mSwitch4);
-
- T0 = _mm256_maddubs_epi16(T0, mCoefy1_hor);
- T1 = _mm256_maddubs_epi16(T1, mCoefy2_hor);
-@@ -2906,8 +2904,10 @@ void uavs3d_if_hor_ver_luma_w32x_avx2(const pel *src, int i_src, pel *dst, int i
- T0 = _mm256_add_epi16(T0, T2);
- T4 = _mm256_add_epi16(T4, T6);
-
-- _mm256_storeu_si256((__m256i*)(tmp + col), T0);
-- _mm256_storeu_si256((__m256i*)(tmp + col + 16), T4);
-+ T1 = _mm256_permute2x128_si256(T0, T4, 0x20);
-+ T3 = _mm256_permute2x128_si256(T0, T4, 0x31);
-+ _mm256_store_si256((__m256i*)(tmp + col), T1);
-+ _mm256_store_si256((__m256i*)(tmp + col + 16), T3);
- }
- src += i_src;
- tmp += i_tmp;
-@@ -2927,6 +2927,7 @@ void uavs3d_if_hor_ver_luma_w32x_avx2(const pel *src, int i_src, pel *dst, int i
- const int i_tmp10 = i_tmp5 << 1;
-
- int shift = 12;
-+ int col;
- __m256i mAddOffset = _mm256_set1_epi32(1 << 11);
- __m128i mCoefy11 = _mm_set1_epi16(*(s16*)coef_y);
- __m128i mCoefy22 = _mm_set1_epi16(*(s16*)(coef_y + 2));
-@@ -3186,45 +3187,121 @@ void uavs3d_if_cpy_w128_avx2(const pel *src, int i_src, pel *dst, int i_dst, int
- }
- }
-
-+void uavs3d_if_hor_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coeff, int max_val)
-+{
-+ __m256i max_pel = _mm256_set1_epi16((pel)max_val);
-+ __m256i T0, T1, T2, T3, T4, T5;
-+ __m256i M0, M1, M2, M3, M4, M5, M6, M7;
-+ __m256i S0, S1, S2;
-+ __m256i offset = _mm256_set1_epi32(32);
-+ __m256i mShuffle0 = _mm256_setr_epi8(0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9, 0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9);
-+ __m256i mShuffle1 = _mm256_setr_epi8(4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13, 4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13);
-+ __m256i mCoef0 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[0]));
-+ __m256i mCoef1 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[1]));
-+ __m256i mCoef2 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[2]));
-+ __m256i mCoef3 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[3]));
-+ __m128i s0, s1;
-+
-+ src -= 3;
-+
-+ while (height) {
-+ T0 = _mm256_loadu_si256((__m256i*)(src));
-+ s0 = _mm_loadu_si128((__m128i*)(src + 4));
-+ T1 = _mm256_loadu_si256((__m256i*)(src + i_src));
-+ s1 = _mm_loadu_si128((__m128i*)(src + i_src + 4));
-+ height -= 2;
-+ src += i_src << 1;
-+ uavs3d_prefetch(src, _MM_HINT_NTA);
-+ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
-+
-+ S0 = _mm256_permute2x128_si256(T0, T1, 0x20);
-+ S2 = _mm256_permute2x128_si256(T0, T1, 0x31);
-+ S1 = _mm256_set_m128i(s1, s0);
-+
-+ T0 = _mm256_shuffle_epi8(S0, mShuffle0);
-+ T1 = _mm256_shuffle_epi8(S0, mShuffle1);
-+ T2 = _mm256_shuffle_epi8(S1, mShuffle0);
-+ T3 = _mm256_shuffle_epi8(S1, mShuffle1);
-+ T4 = _mm256_shuffle_epi8(S2, mShuffle0);
-+ T5 = _mm256_shuffle_epi8(S2, mShuffle1);
-+
-+ M0 = _mm256_madd_epi16(T0, mCoef0);
-+ M1 = _mm256_madd_epi16(T1, mCoef1);
-+ M2 = _mm256_madd_epi16(T2, mCoef2);
-+ M3 = _mm256_madd_epi16(T3, mCoef3);
-+ M4 = _mm256_madd_epi16(T2, mCoef0);
-+ M5 = _mm256_madd_epi16(T3, mCoef1);
-+ M6 = _mm256_madd_epi16(T4, mCoef2);
-+ M7 = _mm256_madd_epi16(T5, mCoef3);
-+
-+ M0 = _mm256_add_epi32(M0, M1);
-+ M1 = _mm256_add_epi32(M2, M3);
-+ M2 = _mm256_add_epi32(M4, M5);
-+ M3 = _mm256_add_epi32(M6, M7);
-+
-+ M0 = _mm256_add_epi32(M0, M1);
-+ M1 = _mm256_add_epi32(M2, M3);
-+
-+ M2 = _mm256_add_epi32(M0, offset);
-+ M3 = _mm256_add_epi32(M1, offset);
-+ M2 = _mm256_srai_epi32(M2, 6);
-+ M3 = _mm256_srai_epi32(M3, 6);
-+ M2 = _mm256_packus_epi32(M2, M3);
-+ M2 = _mm256_min_epu16(M2, max_pel);
-+
-+ _mm_storeu_si128((__m128i*)(dst), _mm256_castsi256_si128(M2));
-+ _mm_storeu_si128((__m128i*)(dst + i_dst), _mm256_extracti128_si256(M2, 1));
-+
-+ dst += i_dst << 1;
-+ }
-+}
-+
- void uavs3d_if_hor_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coeff, int max_val)
- {
- __m256i max_pel = _mm256_set1_epi16((pel)max_val);
-- __m256i T0, T1, T2, T3, T4, T5, T6, T7;
-+ __m256i T0, T1, T2, T3, T4, T5;
- __m256i M0, M1, M2, M3, M4, M5, M6, M7;
-+ __m256i S0, S1, S2;
- __m256i offset = _mm256_set1_epi32(32);
-- s32* coef = (s32*)coeff;
-- __m128i mCoef0 = _mm_setr_epi32(coef[0], coef[1], coef[0], coef[1]);
-- __m256i mCoef = _mm256_cvtepi8_epi16(mCoef0);
-+ __m256i mShuffle0 = _mm256_setr_epi8(0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9, 0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9);
-+ __m256i mShuffle1 = _mm256_setr_epi8(4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13, 4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13);
-+ __m256i mCoef0 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[0]));
-+ __m256i mCoef1 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[1]));
-+ __m256i mCoef2 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[2]));
-+ __m256i mCoef3 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[3]));
-
- src -= 3;
-
- while (height--) {
-- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
-- T0 = _mm256_loadu_si256((__m256i*)(src + 0));
-- T1 = _mm256_loadu_si256((__m256i*)(src + 1));
-- T2 = _mm256_loadu_si256((__m256i*)(src + 2));
-- T3 = _mm256_loadu_si256((__m256i*)(src + 3));
-- T4 = _mm256_loadu_si256((__m256i*)(src + 4));
-- T5 = _mm256_loadu_si256((__m256i*)(src + 5));
-- T6 = _mm256_loadu_si256((__m256i*)(src + 6));
-- T7 = _mm256_loadu_si256((__m256i*)(src + 7));
--
-- M0 = _mm256_madd_epi16(T0, mCoef);
-- M1 = _mm256_madd_epi16(T1, mCoef);
-- M2 = _mm256_madd_epi16(T2, mCoef);
-- M3 = _mm256_madd_epi16(T3, mCoef);
-- M4 = _mm256_madd_epi16(T4, mCoef);
-- M5 = _mm256_madd_epi16(T5, mCoef);
-- M6 = _mm256_madd_epi16(T6, mCoef);
-- M7 = _mm256_madd_epi16(T7, mCoef);
--
-- M0 = _mm256_hadd_epi32(M0, M1);
-- M1 = _mm256_hadd_epi32(M2, M3);
-- M2 = _mm256_hadd_epi32(M4, M5);
-- M3 = _mm256_hadd_epi32(M6, M7);
--
-- M0 = _mm256_hadd_epi32(M0, M1);
-- M1 = _mm256_hadd_epi32(M2, M3);
-+ S0 = _mm256_lddqu_si256((__m256i*)(src));
-+ S1 = _mm256_loadu_si256((__m256i*)(src + 4));
-+ S2 = _mm256_loadu_si256((__m256i*)(src + 8));
-+
-+ src += i_src;
-+ T0 = _mm256_shuffle_epi8(S0, mShuffle0);
-+ T1 = _mm256_shuffle_epi8(S0, mShuffle1);
-+ T2 = _mm256_shuffle_epi8(S1, mShuffle0);
-+ T3 = _mm256_shuffle_epi8(S1, mShuffle1);
-+ T4 = _mm256_shuffle_epi8(S2, mShuffle0);
-+ T5 = _mm256_shuffle_epi8(S2, mShuffle1);
-+ uavs3d_prefetch(src, _MM_HINT_NTA);
-+
-+ M0 = _mm256_madd_epi16(T0, mCoef0);
-+ M1 = _mm256_madd_epi16(T1, mCoef1);
-+ M2 = _mm256_madd_epi16(T2, mCoef2);
-+ M3 = _mm256_madd_epi16(T3, mCoef3);
-+ M4 = _mm256_madd_epi16(T2, mCoef0);
-+ M5 = _mm256_madd_epi16(T3, mCoef1);
-+ M6 = _mm256_madd_epi16(T4, mCoef2);
-+ M7 = _mm256_madd_epi16(T5, mCoef3);
-+
-+ M0 = _mm256_add_epi32(M0, M1);
-+ M1 = _mm256_add_epi32(M2, M3);
-+ M2 = _mm256_add_epi32(M4, M5);
-+ M3 = _mm256_add_epi32(M6, M7);
-+
-+ M0 = _mm256_add_epi32(M0, M1);
-+ M1 = _mm256_add_epi32(M2, M3);
-
- M2 = _mm256_add_epi32(M0, offset);
- M3 = _mm256_add_epi32(M1, offset);
-@@ -3235,7 +3312,6 @@ void uavs3d_if_hor_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst,
-
- _mm256_storeu_si256((__m256i*)(dst), M2);
-
-- src += i_src;
- dst += i_dst;
- }
- }
-@@ -3244,12 +3320,16 @@ void uavs3d_if_hor_luma_w16x_avx2(const pel *src, int i_src, pel *dst, int i_dst
- {
- int col;
- __m256i max_pel = _mm256_set1_epi16((pel)max_val);
-- __m256i T0, T1, T2, T3, T4, T5, T6, T7;
-+ __m256i T0, T1, T2, T3, T4, T5;
- __m256i M0, M1, M2, M3, M4, M5, M6, M7;
-+ __m256i S0, S1, S2;
- __m256i offset = _mm256_set1_epi32(32);
-- s32 *coef = (s32*)coeff;
-- __m128i mCoef0 = _mm_setr_epi32(coef[0], coef[1], coef[0], coef[1]);
-- __m256i mCoef = _mm256_cvtepi8_epi16(mCoef0);
-+ __m256i mShuffle0 = _mm256_setr_epi8(0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9, 0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9);
-+ __m256i mShuffle1 = _mm256_setr_epi8(4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13, 4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13);
-+ __m256i mCoef0 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[0]));
-+ __m256i mCoef1 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[1]));
-+ __m256i mCoef2 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[2]));
-+ __m256i mCoef3 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[3]));
-
- src -= 3;
-
-@@ -3258,31 +3338,33 @@ void uavs3d_if_hor_luma_w16x_avx2(const pel *src, int i_src, pel *dst, int i_dst
- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
- for (col = 0; col < width; col += 16)
- {
-- T0 = _mm256_loadu_si256((__m256i*)(p_src + 0));
-- T1 = _mm256_loadu_si256((__m256i*)(p_src + 1));
-- T2 = _mm256_loadu_si256((__m256i*)(p_src + 2));
-- T3 = _mm256_loadu_si256((__m256i*)(p_src + 3));
-- T4 = _mm256_loadu_si256((__m256i*)(p_src + 4));
-- T5 = _mm256_loadu_si256((__m256i*)(p_src + 5));
-- T6 = _mm256_loadu_si256((__m256i*)(p_src + 6));
-- T7 = _mm256_loadu_si256((__m256i*)(p_src + 7));
--
-- M0 = _mm256_madd_epi16(T0, mCoef);
-- M1 = _mm256_madd_epi16(T1, mCoef);
-- M2 = _mm256_madd_epi16(T2, mCoef);
-- M3 = _mm256_madd_epi16(T3, mCoef);
-- M4 = _mm256_madd_epi16(T4, mCoef);
-- M5 = _mm256_madd_epi16(T5, mCoef);
-- M6 = _mm256_madd_epi16(T6, mCoef);
-- M7 = _mm256_madd_epi16(T7, mCoef);
--
-- M0 = _mm256_hadd_epi32(M0, M1);
-- M1 = _mm256_hadd_epi32(M2, M3);
-- M2 = _mm256_hadd_epi32(M4, M5);
-- M3 = _mm256_hadd_epi32(M6, M7);
--
-- M0 = _mm256_hadd_epi32(M0, M1);
-- M1 = _mm256_hadd_epi32(M2, M3);
-+ S0 = _mm256_loadu_si256((__m256i*)(p_src));
-+ S1 = _mm256_loadu_si256((__m256i*)(p_src + 4));
-+ S2 = _mm256_loadu_si256((__m256i*)(p_src + 8));
-+
-+ T0 = _mm256_shuffle_epi8(S0, mShuffle0);
-+ T1 = _mm256_shuffle_epi8(S0, mShuffle1);
-+ T2 = _mm256_shuffle_epi8(S1, mShuffle0);
-+ T3 = _mm256_shuffle_epi8(S1, mShuffle1);
-+ T4 = _mm256_shuffle_epi8(S2, mShuffle0);
-+ T5 = _mm256_shuffle_epi8(S2, mShuffle1);
-+
-+ M0 = _mm256_madd_epi16(T0, mCoef0);
-+ M1 = _mm256_madd_epi16(T1, mCoef1);
-+ M2 = _mm256_madd_epi16(T2, mCoef2);
-+ M3 = _mm256_madd_epi16(T3, mCoef3);
-+ M4 = _mm256_madd_epi16(T2, mCoef0);
-+ M5 = _mm256_madd_epi16(T3, mCoef1);
-+ M6 = _mm256_madd_epi16(T4, mCoef2);
-+ M7 = _mm256_madd_epi16(T5, mCoef3);
-+
-+ M0 = _mm256_add_epi32(M0, M1);
-+ M1 = _mm256_add_epi32(M2, M3);
-+ M2 = _mm256_add_epi32(M4, M5);
-+ M3 = _mm256_add_epi32(M6, M7);
-+
-+ M0 = _mm256_add_epi32(M0, M1);
-+ M1 = _mm256_add_epi32(M2, M3);
-
- M2 = _mm256_add_epi32(M0, offset);
- M3 = _mm256_add_epi32(M1, offset);
-@@ -3299,6 +3381,47 @@ void uavs3d_if_hor_luma_w16x_avx2(const pel *src, int i_src, pel *dst, int i_dst
- }
- }
-
-+void uavs3d_if_hor_chroma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coeff, int max_val)
-+{
-+ const int offset = 32;
-+ const int shift = 6;
-+
-+ __m128i coef0 = _mm_cvtepi8_epi16(_mm_set1_epi16(((s16*)coeff)[0]));
-+ __m128i coef1 = _mm_cvtepi8_epi16(_mm_set1_epi16(((s16*)coeff)[1]));
-+ __m256i mCoef0 = _mm256_set_m128i(coef1, coef0);
-+ __m256i mCoef1 = _mm256_set_m128i(coef0, coef1);
-+ __m256i mSwitch = _mm256_setr_epi8(0, 1, 4, 5, 2, 3, 6, 7, 4, 5, 8, 9, 6, 7, 10, 11, 0, 1, 4, 5, 2, 3, 6, 7, 4, 5, 8, 9, 6, 7, 10, 11);
-+ __m256i mAddOffset = _mm256_set1_epi32((s16)offset);
-+ __m256i T0, T1, S0, S1;
-+ __m256i max_pel = _mm256_set1_epi16((pel)max_val);
-+ __m128i s0;
-+
-+ src -= 2;
-+
-+ while (height--) {
-+ uavs3d_prefetch(src + i_src * 2, _MM_HINT_NTA);
-+ S0 = _mm256_loadu_si256((__m256i*)(src));
-+ s0 = _mm_loadu_si128((__m128i*)(src + 4));
-+ src += i_src;
-+ S1 = _mm256_set_m128i(s0, s0);
-+ uavs3d_prefetch(src, _MM_HINT_NTA);
-+ T0 = _mm256_shuffle_epi8(S0, mSwitch);
-+ T1 = _mm256_shuffle_epi8(S1, mSwitch);
-+ T0 = _mm256_madd_epi16(T0, mCoef0);
-+ T1 = _mm256_madd_epi16(T1, mCoef1);
-+ T0 = _mm256_add_epi32(T0, T1);
-+
-+ T0 = _mm256_add_epi32(T0, mAddOffset);
-+ T0 = _mm256_srai_epi32(T0, shift);
-+ T0 = _mm256_min_epu16(T0, max_pel);
-+ s0 = _mm_packus_epi32(_mm256_castsi256_si128(T0), _mm256_extracti128_si256(T0, 1));
-+
-+ _mm_storeu_si128((__m128i*)(dst), s0);
-+
-+ dst += i_dst;
-+ }
-+}
-+
- void uavs3d_if_hor_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coeff, int max_val)
- {
- const int offset = 32;
-@@ -3310,7 +3433,7 @@ void uavs3d_if_hor_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int i_ds
- __m256i mCoef1 = _mm256_cvtepi8_epi16(coef1);
- __m256i mSwitch = _mm256_setr_epi8(0, 1, 4, 5, 2, 3, 6, 7, 4, 5, 8, 9, 6, 7, 10, 11, 0, 1, 4, 5, 2, 3, 6, 7, 4, 5, 8, 9, 6, 7, 10, 11);
- __m256i mAddOffset = _mm256_set1_epi32((s16)offset);
-- __m256i T0, T1, T2, T3, S0, S1, S2, S3;
-+ __m256i T0, T1, T2, T3, S0, S1, S2;
- __m256i max_pel = _mm256_set1_epi16((pel)max_val);
-
- src -= 2;
-@@ -3320,15 +3443,14 @@ void uavs3d_if_hor_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int i_ds
- S0 = _mm256_loadu_si256((__m256i*)(src));
- S1 = _mm256_loadu_si256((__m256i*)(src + 4));
- S2 = _mm256_loadu_si256((__m256i*)(src + 8));
-- S3 = _mm256_loadu_si256((__m256i*)(src + 12));
-- S0 = _mm256_permute4x64_epi64(S0, 0x94);
-- S1 = _mm256_permute4x64_epi64(S1, 0x94);
-- S2 = _mm256_permute4x64_epi64(S2, 0x94);
-- S3 = _mm256_permute4x64_epi64(S3, 0x94);
-- T0 = _mm256_madd_epi16(_mm256_shuffle_epi8(S0, mSwitch), mCoef0);
-- T1 = _mm256_madd_epi16(_mm256_shuffle_epi8(S1, mSwitch), mCoef1);
-- T2 = _mm256_madd_epi16(_mm256_shuffle_epi8(S2, mSwitch), mCoef0);
-- T3 = _mm256_madd_epi16(_mm256_shuffle_epi8(S3, mSwitch), mCoef1);
-+ T0 = _mm256_shuffle_epi8(S0, mSwitch);
-+ T1 = _mm256_shuffle_epi8(S1, mSwitch);
-+ T2 = _mm256_shuffle_epi8(S1, mSwitch);
-+ T3 = _mm256_shuffle_epi8(S2, mSwitch);
-+ T0 = _mm256_madd_epi16(T0, mCoef0);
-+ T1 = _mm256_madd_epi16(T1, mCoef1);
-+ T2 = _mm256_madd_epi16(T2, mCoef0);
-+ T3 = _mm256_madd_epi16(T3, mCoef1);
- T0 = _mm256_add_epi32(T0, T1);
- T2 = _mm256_add_epi32(T2, T3);
-
-@@ -3337,7 +3459,6 @@ void uavs3d_if_hor_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int i_ds
- T0 = _mm256_srai_epi32(T0, shift);
- T2 = _mm256_srai_epi32(T2, shift);
- T0 = _mm256_packus_epi32(T0, T2);
-- T0 = _mm256_permute4x64_epi64(T0, 0xd8);
-
- T0 = _mm256_min_epu16(T0, max_pel);
- _mm256_storeu_si256((__m256i*)(dst), T0);
-@@ -3359,7 +3480,7 @@ void uavs3d_if_hor_chroma_w16x_avx2(const pel *src, int i_src, pel *dst, int i_d
- __m256i mCoef1 = _mm256_cvtepi8_epi16(coef1);
- __m256i mSwitch = _mm256_setr_epi8(0, 1, 4, 5, 2, 3, 6, 7, 4, 5, 8, 9, 6, 7, 10, 11, 0, 1, 4, 5, 2, 3, 6, 7, 4, 5, 8, 9, 6, 7, 10, 11);
- __m256i mAddOffset = _mm256_set1_epi32((s16)offset);
-- __m256i T0, T1, T2, T3, S0, S1, S2, S3;
-+ __m256i T0, T1, T2, T3, S0, S1, S2;
- __m256i max_pel = _mm256_set1_epi16((pel)max_val);
-
- src -= 2;
-@@ -3370,15 +3491,14 @@ void uavs3d_if_hor_chroma_w16x_avx2(const pel *src, int i_src, pel *dst, int i_d
- S0 = _mm256_loadu_si256((__m256i*)(src + col));
- S1 = _mm256_loadu_si256((__m256i*)(src + col + 4));
- S2 = _mm256_loadu_si256((__m256i*)(src + col + 8));
-- S3 = _mm256_loadu_si256((__m256i*)(src + col + 12));
-- S0 = _mm256_permute4x64_epi64(S0, 0x94);
-- S1 = _mm256_permute4x64_epi64(S1, 0x94);
-- S2 = _mm256_permute4x64_epi64(S2, 0x94);
-- S3 = _mm256_permute4x64_epi64(S3, 0x94);
-- T0 = _mm256_madd_epi16(_mm256_shuffle_epi8(S0, mSwitch), mCoef0);
-- T1 = _mm256_madd_epi16(_mm256_shuffle_epi8(S1, mSwitch), mCoef1);
-- T2 = _mm256_madd_epi16(_mm256_shuffle_epi8(S2, mSwitch), mCoef0);
-- T3 = _mm256_madd_epi16(_mm256_shuffle_epi8(S3, mSwitch), mCoef1);
-+ T0 = _mm256_shuffle_epi8(S0, mSwitch);
-+ T1 = _mm256_shuffle_epi8(S1, mSwitch);
-+ T2 = _mm256_shuffle_epi8(S1, mSwitch);
-+ T3 = _mm256_shuffle_epi8(S2, mSwitch);
-+ T0 = _mm256_madd_epi16(T0, mCoef0);
-+ T1 = _mm256_madd_epi16(T1, mCoef1);
-+ T2 = _mm256_madd_epi16(T2, mCoef0);
-+ T3 = _mm256_madd_epi16(T3, mCoef1);
- T0 = _mm256_add_epi32(T0, T1);
- T2 = _mm256_add_epi32(T2, T3);
-
-@@ -3387,9 +3507,8 @@ void uavs3d_if_hor_chroma_w16x_avx2(const pel *src, int i_src, pel *dst, int i_d
- T0 = _mm256_srai_epi32(T0, shift);
- T2 = _mm256_srai_epi32(T2, shift);
- T0 = _mm256_packus_epi32(T0, T2);
-- T0 = _mm256_permute4x64_epi64(T0, 0xd8);
--
- T0 = _mm256_min_epu16(T0, max_pel);
-+
- _mm256_storeu_si256((__m256i*)(dst + col), T0);
- }
- src += i_src;
-@@ -3397,6 +3516,93 @@ void uavs3d_if_hor_chroma_w16x_avx2(const pel *src, int i_src, pel *dst, int i_d
- }
- }
-
-+void uavs3d_if_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coeff, int max_val)
-+{
-+ const int i_src2 = i_src * 2;
-+ const int i_src3 = i_src * 3;
-+ const int i_src4 = i_src * 4;
-+ const int i_src5 = i_src * 5;
-+ const int i_src6 = i_src * 6;
-+ const int i_src7 = i_src * 7;
-+ __m128i coeff0 = _mm_set1_epi16(*(s16*)coeff);
-+ __m128i coeff1 = _mm_set1_epi16(*(s16*)(coeff + 2));
-+ __m128i coeff2 = _mm_set1_epi16(*(s16*)(coeff + 4));
-+ __m128i coeff3 = _mm_set1_epi16(*(s16*)(coeff + 6));
-+ __m256i max_pel = _mm256_set1_epi16((pel)max_val);
-+ __m256i mAddOffset = _mm256_set1_epi32(32);
-+ __m128i s0, s1, s2, s3, s4, s5, s6, s7, s8;
-+ __m256i T0, T1, T2, T3, T4, T5, T6, T7;
-+ __m256i N0, N1, N2, N3, N4, N5, N6, N7;
-+ __m256i coeff00 = _mm256_cvtepi8_epi16(coeff0);
-+ __m256i coeff01 = _mm256_cvtepi8_epi16(coeff1);
-+ __m256i coeff02 = _mm256_cvtepi8_epi16(coeff2);
-+ __m256i coeff03 = _mm256_cvtepi8_epi16(coeff3);
-+
-+ src -= i_src3;
-+
-+ while (height > 0) {
-+ s0 = _mm_loadu_si128((__m128i*)(src));
-+ s1 = _mm_loadu_si128((__m128i*)(src + i_src));
-+ s2 = _mm_loadu_si128((__m128i*)(src + i_src2));
-+ s3 = _mm_loadu_si128((__m128i*)(src + i_src3));
-+ s4 = _mm_loadu_si128((__m128i*)(src + i_src4));
-+ s5 = _mm_loadu_si128((__m128i*)(src + i_src5));
-+ s6 = _mm_loadu_si128((__m128i*)(src + i_src6));
-+ s7 = _mm_loadu_si128((__m128i*)(src + i_src7));
-+ s8 = _mm_loadu_si128((__m128i*)(src + (i_src << 3)));
-+
-+ height -= 2;
-+ src += i_src2;
-+ uavs3d_prefetch(src + i_src7, _MM_HINT_NTA);
-+
-+ T0 = _mm256_set_m128i(s1, s0);
-+ T1 = _mm256_set_m128i(s2, s1);
-+ T2 = _mm256_set_m128i(s3, s2);
-+ T3 = _mm256_set_m128i(s4, s3);
-+ T4 = _mm256_set_m128i(s5, s4);
-+ T5 = _mm256_set_m128i(s6, s5);
-+ T6 = _mm256_set_m128i(s7, s6);
-+ T7 = _mm256_set_m128i(s8, s7);
-+
-+ N0 = _mm256_unpacklo_epi16(T0, T1);
-+ N1 = _mm256_unpacklo_epi16(T2, T3);
-+ N2 = _mm256_unpacklo_epi16(T4, T5);
-+ N3 = _mm256_unpacklo_epi16(T6, T7);
-+ N4 = _mm256_unpackhi_epi16(T0, T1);
-+ N5 = _mm256_unpackhi_epi16(T2, T3);
-+ N6 = _mm256_unpackhi_epi16(T4, T5);
-+ N7 = _mm256_unpackhi_epi16(T6, T7);
-+
-+ N0 = _mm256_madd_epi16(N0, coeff00);
-+ N1 = _mm256_madd_epi16(N1, coeff01);
-+ N2 = _mm256_madd_epi16(N2, coeff02);
-+ N3 = _mm256_madd_epi16(N3, coeff03);
-+ N4 = _mm256_madd_epi16(N4, coeff00);
-+ N5 = _mm256_madd_epi16(N5, coeff01);
-+ N6 = _mm256_madd_epi16(N6, coeff02);
-+ N7 = _mm256_madd_epi16(N7, coeff03);
-+
-+ N0 = _mm256_add_epi32(N0, N1);
-+ N1 = _mm256_add_epi32(N2, N3);
-+ N2 = _mm256_add_epi32(N4, N5);
-+ N3 = _mm256_add_epi32(N6, N7);
-+
-+ N0 = _mm256_add_epi32(N0, N1);
-+ N1 = _mm256_add_epi32(N2, N3);
-+
-+ N0 = _mm256_add_epi32(N0, mAddOffset);
-+ N1 = _mm256_add_epi32(N1, mAddOffset);
-+ N0 = _mm256_srai_epi32(N0, 6);
-+ N1 = _mm256_srai_epi32(N1, 6);
-+ N0 = _mm256_packus_epi32(N0, N1);
-+ N0 = _mm256_min_epu16(N0, max_pel);
-+ _mm_storeu_si128((__m128i*)(dst), _mm256_castsi256_si128(N0));
-+ _mm_storeu_si128((__m128i*)(dst + i_dst), _mm256_extracti128_si256(N0, 1));
-+
-+ dst += i_dst << 1;
-+ }
-+}
-+
- void uavs3d_if_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coeff, int max_val)
- {
- const int i_src2 = i_src * 2;
-@@ -3412,7 +3618,6 @@ void uavs3d_if_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst,
- __m256i max_pel = _mm256_set1_epi16((pel)max_val);
- __m256i mAddOffset = _mm256_set1_epi32(32);
- __m256i T0, T1, T2, T3, T4, T5, T6, T7;
-- __m256i M0, M1, M2, M3, M4, M5, M6, M7;
- __m256i N0, N1, N2, N3, N4, N5, N6, N7;
- __m256i coeff00 = _mm256_cvtepi8_epi16(coeff0);
- __m256i coeff01 = _mm256_cvtepi8_epi16(coeff1);
-@@ -3422,7 +3627,6 @@ void uavs3d_if_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst,
- src -= 3 * i_src;
-
- while (height--) {
-- uavs3d_prefetch(src + 8 * i_src, _MM_HINT_NTA);
- T0 = _mm256_loadu_si256((__m256i*)(src));
- T1 = _mm256_loadu_si256((__m256i*)(src + i_src));
- T2 = _mm256_loadu_si256((__m256i*)(src + i_src2));
-@@ -3431,24 +3635,25 @@ void uavs3d_if_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst,
- T5 = _mm256_loadu_si256((__m256i*)(src + i_src5));
- T6 = _mm256_loadu_si256((__m256i*)(src + i_src6));
- T7 = _mm256_loadu_si256((__m256i*)(src + i_src7));
-+ uavs3d_prefetch(src + 8 * i_src, _MM_HINT_NTA);
-
-- M0 = _mm256_unpacklo_epi16(T0, T1);
-- M1 = _mm256_unpacklo_epi16(T2, T3);
-- M2 = _mm256_unpacklo_epi16(T4, T5);
-- M3 = _mm256_unpacklo_epi16(T6, T7);
-- M4 = _mm256_unpackhi_epi16(T0, T1);
-- M5 = _mm256_unpackhi_epi16(T2, T3);
-- M6 = _mm256_unpackhi_epi16(T4, T5);
-- M7 = _mm256_unpackhi_epi16(T6, T7);
--
-- N0 = _mm256_madd_epi16(M0, coeff00);
-- N1 = _mm256_madd_epi16(M1, coeff01);
-- N2 = _mm256_madd_epi16(M2, coeff02);
-- N3 = _mm256_madd_epi16(M3, coeff03);
-- N4 = _mm256_madd_epi16(M4, coeff00);
-- N5 = _mm256_madd_epi16(M5, coeff01);
-- N6 = _mm256_madd_epi16(M6, coeff02);
-- N7 = _mm256_madd_epi16(M7, coeff03);
-+ N0 = _mm256_unpacklo_epi16(T0, T1);
-+ N1 = _mm256_unpacklo_epi16(T2, T3);
-+ N2 = _mm256_unpacklo_epi16(T4, T5);
-+ N3 = _mm256_unpacklo_epi16(T6, T7);
-+ N4 = _mm256_unpackhi_epi16(T0, T1);
-+ N5 = _mm256_unpackhi_epi16(T2, T3);
-+ N6 = _mm256_unpackhi_epi16(T4, T5);
-+ N7 = _mm256_unpackhi_epi16(T6, T7);
-+
-+ N0 = _mm256_madd_epi16(N0, coeff00);
-+ N1 = _mm256_madd_epi16(N1, coeff01);
-+ N2 = _mm256_madd_epi16(N2, coeff02);
-+ N3 = _mm256_madd_epi16(N3, coeff03);
-+ N4 = _mm256_madd_epi16(N4, coeff00);
-+ N5 = _mm256_madd_epi16(N5, coeff01);
-+ N6 = _mm256_madd_epi16(N6, coeff02);
-+ N7 = _mm256_madd_epi16(N7, coeff03);
-
- N0 = _mm256_add_epi32(N0, N1);
- N1 = _mm256_add_epi32(N2, N3);
-@@ -3568,20 +3773,23 @@ void uavs3d_if_ver_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int i_ds
-
- while (height) {
- __m256i S0, S1, S2, S3, S4;
-- uavs3d_prefetch(src + 5 * i_src, _MM_HINT_NTA);
-- uavs3d_prefetch(src + 6 * i_src, _MM_HINT_NTA);
-- height -= 2;
- S0 = _mm256_loadu_si256((__m256i*)(src));
- S1 = _mm256_loadu_si256((__m256i*)(src + i_src));
- S2 = _mm256_loadu_si256((__m256i*)(src + i_src2));
- S3 = _mm256_loadu_si256((__m256i*)(src + i_src3));
- S4 = _mm256_loadu_si256((__m256i*)(src + i_src4));
-
-+ height -= 2;
-+ src += i_src2;
-+
- T0 = _mm256_unpacklo_epi16(S0, S1);
- T1 = _mm256_unpackhi_epi16(S0, S1);
- T2 = _mm256_unpacklo_epi16(S2, S3);
- T3 = _mm256_unpackhi_epi16(S2, S3);
-
-+ uavs3d_prefetch(src + i_src3, _MM_HINT_NTA);
-+ uavs3d_prefetch(src + i_src4, _MM_HINT_NTA);
-+
- T0 = _mm256_madd_epi16(T0, coeff0);
- T1 = _mm256_madd_epi16(T1, coeff0);
- T2 = _mm256_madd_epi16(T2, coeff1);
-@@ -3621,7 +3829,6 @@ void uavs3d_if_ver_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int i_ds
- mVal1 = _mm256_min_epu16(mVal1, max_pel);
- _mm256_storeu_si256((__m256i*)(dst + i_dst), mVal1);
-
-- src += 2 * i_src;
- dst += 2 * i_dst;
- }
- }
-@@ -3645,9 +3852,6 @@ void uavs3d_if_ver_chroma_w32_avx2(const pel *src, int i_src, pel *dst, int i_ds
- src -= i_src;
-
- while (height) {
-- uavs3d_prefetch(src + 5 * i_src, _MM_HINT_NTA);
-- uavs3d_prefetch(src + 6 * i_src, _MM_HINT_NTA);
-- height -= 2;
- S0 = _mm256_loadu_si256((__m256i*)(src));
- S5 = _mm256_loadu_si256((__m256i*)(src + 16));
- S1 = _mm256_loadu_si256((__m256i*)(src + i_src));
-@@ -3659,6 +3863,9 @@ void uavs3d_if_ver_chroma_w32_avx2(const pel *src, int i_src, pel *dst, int i_ds
- S4 = _mm256_loadu_si256((__m256i*)(src + i_src4));
- S9 = _mm256_loadu_si256((__m256i*)(src + i_src4 + 16));
-
-+ height -= 2;
-+ src += i_src2;
-+
- T0 = _mm256_unpacklo_epi16(S0, S1);
- T1 = _mm256_unpackhi_epi16(S0, S1);
- T2 = _mm256_unpacklo_epi16(S2, S3);
-@@ -3668,6 +3875,9 @@ void uavs3d_if_ver_chroma_w32_avx2(const pel *src, int i_src, pel *dst, int i_ds
- T6 = _mm256_unpacklo_epi16(S7, S8);
- T7 = _mm256_unpackhi_epi16(S7, S8);
-
-+ uavs3d_prefetch(src + i_src3, _MM_HINT_NTA);
-+ uavs3d_prefetch(src + i_src4, _MM_HINT_NTA);
-+
- T0 = _mm256_madd_epi16(T0, coeff0);
- T1 = _mm256_madd_epi16(T1, coeff0);
- T2 = _mm256_madd_epi16(T2, coeff1);
-@@ -3738,7 +3948,6 @@ void uavs3d_if_ver_chroma_w32_avx2(const pel *src, int i_src, pel *dst, int i_ds
- _mm256_storeu_si256((__m256i*)(dst + i_dst), T0);
- _mm256_storeu_si256((__m256i*)(dst + i_dst + 16), T2);
-
-- src += 2 * i_src;
- dst += 2 * i_dst;
- }
- }
-@@ -3820,22 +4029,18 @@ void uavs3d_if_ver_chroma_w32x_avx2(const pel *src, int i_src, pel *dst, int i_d
- }
- }
-
--void uavs3d_if_hor_ver_luma_w16x_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coef_x, const s8 *coef_y, int max_val)
-+void uavs3d_if_hor_ver_luma_w4_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coef_x, const s8 *coef_y, int max_val)
- {
-- ALIGNED_32(s16 tmp_res[(128 + 7) * 128]);
-+ ALIGNED_32(s16 tmp_res[(32 + 7) * 4]);
- s16 *tmp = tmp_res;
-- int row, i;;
-+ int row;
- int add1, shift1;
- int add2, shift2;
-- __m128i mCoef0;
-- __m256i mCoef, offset;
-- __m256i T0, T1, T2, T3, T4, T5, T6, T7;
-- __m256i M0, M1, M2, M3, M4, M5, M6, M7;
-- __m256i N0, N1, N2, N3, N4, N5, N6, N7;
-- int i_tmp = width;
-- s32 * coef;
-- __m128i coeff0, coeff1, coeff2, coeff3;
-- __m256i coeff00, coeff01, coeff02, coeff03;
-+ __m256i offset;
-+ __m256i T0, T1, T2, T3;
-+ __m256i M0, M1, M2, M3;
-+ const int i_tmp = 4;
-+ __m256i mCoef0, mCoef1, mCoef2, mCoef3;
- __m256i max_pel = _mm256_set1_epi16((pel)max_val);
-
- if (max_val == 255) { // 8 bit_depth
-@@ -3851,80 +4056,311 @@ void uavs3d_if_hor_ver_luma_w16x_avx2(const pel *src, int i_src, pel *dst, int i
- add2 = 1 << (shift2 - 1);
-
- src += -3 * i_src - 3;
-- coef = (s32*)coef_x;
-- mCoef0 = _mm_setr_epi32(coef[0], coef[1], coef[0], coef[1]);
-- mCoef = _mm256_cvtepi8_epi16(mCoef0);
-- offset = _mm256_set1_epi32(add1);
-
-- row = height + 7;
-+ {
-+ __m128i s0, s1, s2, s3;
-+ __m256i S0, S1;
-+ __m256i mShuffle0 = _mm256_setr_epi8(0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9, 0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9);
-+ __m256i mShuffle1 = _mm256_setr_epi8(4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13, 4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13);
-+
-+ mCoef0 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[0]));
-+ mCoef1 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[1]));
-+ mCoef2 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[2]));
-+ mCoef3 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[3]));
-+ offset = _mm256_set1_epi32(add1);
-+
-+ row = height + 6;
-+
-+ while (row > 0) {
-+ s0 = _mm_loadu_si128((__m128i*)(src));
-+ s1 = _mm_loadu_si128((__m128i*)(src + 4));
-+ s2 = _mm_loadu_si128((__m128i*)(src + i_src));
-+ s3 = _mm_loadu_si128((__m128i*)(src + i_src + 4));
-+ row -= 2;
-+ src += i_src << 1;
-+ uavs3d_prefetch(src, _MM_HINT_NTA);
-+ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
-
-- while (row--) {
-- const pel *p = src;
-- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
-- for (i = 0; i < width; i += 16) {
-+ S0 = _mm256_set_m128i(s2, s0);
-+ S1 = _mm256_set_m128i(s3, s1);
-+
-+ T0 = _mm256_shuffle_epi8(S0, mShuffle0);
-+ T1 = _mm256_shuffle_epi8(S0, mShuffle1);
-+ T2 = _mm256_shuffle_epi8(S1, mShuffle0);
-+ T3 = _mm256_shuffle_epi8(S1, mShuffle1);
-
-- T0 = _mm256_loadu_si256((__m256i*)p++);
-- T1 = _mm256_loadu_si256((__m256i*)p++);
-- T2 = _mm256_loadu_si256((__m256i*)p++);
-- T3 = _mm256_loadu_si256((__m256i*)p++);
-- T4 = _mm256_loadu_si256((__m256i*)p++);
-- T5 = _mm256_loadu_si256((__m256i*)p++);
-- T6 = _mm256_loadu_si256((__m256i*)p++);
-- T7 = _mm256_loadu_si256((__m256i*)p++);
--
-- M0 = _mm256_madd_epi16(T0, mCoef);
-- M1 = _mm256_madd_epi16(T1, mCoef);
-- M2 = _mm256_madd_epi16(T2, mCoef);
-- M3 = _mm256_madd_epi16(T3, mCoef);
-- M4 = _mm256_madd_epi16(T4, mCoef);
-- M5 = _mm256_madd_epi16(T5, mCoef);
-- M6 = _mm256_madd_epi16(T6, mCoef);
-- M7 = _mm256_madd_epi16(T7, mCoef);
--
-- M0 = _mm256_hadd_epi32(M0, M1);
-- M1 = _mm256_hadd_epi32(M2, M3);
-- M2 = _mm256_hadd_epi32(M4, M5);
-- M3 = _mm256_hadd_epi32(M6, M7);
--
-- M0 = _mm256_hadd_epi32(M0, M1);
-- M1 = _mm256_hadd_epi32(M2, M3);
-+ M0 = _mm256_madd_epi16(T0, mCoef0);
-+ M1 = _mm256_madd_epi16(T1, mCoef1);
-+ M2 = _mm256_madd_epi16(T2, mCoef2);
-+ M3 = _mm256_madd_epi16(T3, mCoef3);
-+
-+ M0 = _mm256_add_epi32(M0, M1);
-+ M1 = _mm256_add_epi32(M2, M3);
-+
-+ M0 = _mm256_add_epi32(M0, M1);
-+
-+ M2 = _mm256_add_epi32(M0, offset);
-+ M2 = _mm256_srai_epi32(M2, shift1);
-+
-+ s0 = _mm_packs_epi32(_mm256_castsi256_si128(M2), _mm256_extracti128_si256(M2, 1));
-+ _mm_store_si128((__m128i*)(tmp), s0);
-+
-+ tmp += i_tmp * 2;
-+ }
-+ {
-+ // the last row
-+ __m128i t0, t1, t2, t3;
-+ __m128i m0, m1, m2, m3;
-+ s0 = _mm_loadu_si128((__m128i*)(src));
-+ s1 = _mm_loadu_si128((__m128i*)(src + 4));
-+ src += i_src;
-+
-+ t0 = _mm_shuffle_epi8(s0, _mm256_castsi256_si128(mShuffle0));
-+ t1 = _mm_shuffle_epi8(s0, _mm256_castsi256_si128(mShuffle1));
-+ t2 = _mm_shuffle_epi8(s1, _mm256_castsi256_si128(mShuffle0));
-+ t3 = _mm_shuffle_epi8(s1, _mm256_castsi256_si128(mShuffle1));
-+
-+ m0 = _mm_madd_epi16(t0, _mm256_castsi256_si128(mCoef0));
-+ m1 = _mm_madd_epi16(t1, _mm256_castsi256_si128(mCoef1));
-+ m2 = _mm_madd_epi16(t2, _mm256_castsi256_si128(mCoef2));
-+ m3 = _mm_madd_epi16(t3, _mm256_castsi256_si128(mCoef3));
-+
-+ m0 = _mm_add_epi32(m0, m1);
-+ m1 = _mm_add_epi32(m2, m3);
-+
-+ m0 = _mm_add_epi32(m0, m1);
-+
-+ m0 = _mm_add_epi32(m0, _mm256_castsi256_si128(offset));
-+ m0 = _mm_srai_epi32(m0, shift1);
-+ m0 = _mm_packs_epi32(m0, m0);
-+ _mm_storel_epi64((__m128i*)tmp, m0);
-+ }
-+ }
-+
-+ {
-+ __m256i T4, T5, T6, T7, M4, M5, M6, M7;
-+ __m128i d0, d1;
-+
-+ offset = _mm256_set1_epi32(add2);
-+ tmp = tmp_res;
-+
-+ mCoef0 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[0]));
-+ mCoef1 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[1]));
-+ mCoef2 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[2]));
-+ mCoef3 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[3]));
-+
-+ while (height > 0) {
-+ T0 = _mm256_load_si256((__m256i*)(tmp));
-+ T1 = _mm256_loadu_si256((__m256i*)(tmp + i_tmp));
-+ T2 = _mm256_loadu_si256((__m256i*)(tmp + 2 * i_tmp));
-+ T3 = _mm256_loadu_si256((__m256i*)(tmp + 3 * i_tmp));
-+ T4 = _mm256_load_si256((__m256i*)(tmp + 4 * i_tmp));
-+ T5 = _mm256_loadu_si256((__m256i*)(tmp + 5 * i_tmp));
-+ T6 = _mm256_loadu_si256((__m256i*)(tmp + 6 * i_tmp));
-+ T7 = _mm256_loadu_si256((__m256i*)(tmp + 7 * i_tmp));
-+ height -= 4;
-+ tmp += i_tmp * 4;
-+
-+ M0 = _mm256_unpacklo_epi16(T0, T1);
-+ M1 = _mm256_unpacklo_epi16(T2, T3);
-+ M2 = _mm256_unpacklo_epi16(T4, T5);
-+ M3 = _mm256_unpacklo_epi16(T6, T7);
-+ M4 = _mm256_unpackhi_epi16(T0, T1);
-+ M5 = _mm256_unpackhi_epi16(T2, T3);
-+ M6 = _mm256_unpackhi_epi16(T4, T5);
-+ M7 = _mm256_unpackhi_epi16(T6, T7);
-+
-+ M0 = _mm256_madd_epi16(M0, mCoef0);
-+ M1 = _mm256_madd_epi16(M1, mCoef1);
-+ M2 = _mm256_madd_epi16(M2, mCoef2);
-+ M3 = _mm256_madd_epi16(M3, mCoef3);
-+ M4 = _mm256_madd_epi16(M4, mCoef0);
-+ M5 = _mm256_madd_epi16(M5, mCoef1);
-+ M6 = _mm256_madd_epi16(M6, mCoef2);
-+ M7 = _mm256_madd_epi16(M7, mCoef3);
-+
-+ M0 = _mm256_add_epi32(M0, M1);
-+ M1 = _mm256_add_epi32(M2, M3);
-+ M2 = _mm256_add_epi32(M4, M5);
-+ M3 = _mm256_add_epi32(M6, M7);
-+
-+ M0 = _mm256_add_epi32(M0, M1);
-+ M1 = _mm256_add_epi32(M2, M3);
-+
-+ M0 = _mm256_add_epi32(M0, offset);
-+ M1 = _mm256_add_epi32(M1, offset);
-+ M0 = _mm256_srai_epi32(M0, shift2);
-+ M1 = _mm256_srai_epi32(M1, shift2);
-+ M0 = _mm256_packus_epi32(M0, M1);
-+ M0 = _mm256_min_epu16(M0, max_pel);
-+
-+ d0 = _mm256_castsi256_si128(M0);
-+ d1 = _mm256_extracti128_si256(M0, 1);
-+ _mm_storel_epi64((__m128i*)(dst), d0);
-+ _mm_storeh_pi((__m64*)(dst + i_dst), _mm_castsi128_ps(d0));
-+ _mm_storel_epi64((__m128i*)(dst + (i_dst << 1)), d1);
-+ _mm_storeh_pi((__m64*)(dst + i_dst * 3), _mm_castsi128_ps(d1));
-+
-+ dst += i_dst << 2;
-+ }
-+ }
-+}
-+
-+void uavs3d_if_hor_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coef_x, const s8 *coef_y, int max_val)
-+{
-+ ALIGNED_32(s16 tmp_res[(64 + 7) * 8]);
-+ s16 *tmp = tmp_res;
-+ int row;
-+ int add1, shift1;
-+ int add2, shift2;
-+ __m256i offset;
-+ __m256i T0, T1, T2, T3, T4, T5;
-+ __m256i M0, M1, M2, M3, M4, M5, M6, M7;
-+ const int i_tmp = 8;
-+ __m256i mCoef0, mCoef1, mCoef2, mCoef3;
-+ __m256i max_pel = _mm256_set1_epi16((pel)max_val);
-+
-+ if (max_val == 255) { // 8 bit_depth
-+ shift1 = 0;
-+ shift2 = 12;
-+ }
-+ else { // 10 bit_depth
-+ shift1 = 2;
-+ shift2 = 10;
-+ }
-+
-+ add1 = (1 << (shift1)) >> 1;
-+ add2 = 1 << (shift2 - 1);
-+
-+ src += -3 * i_src - 3;
-+
-+ {
-+ __m128i s0, s1;
-+ __m256i S0, S1, S2;
-+ __m256i mShuffle0 = _mm256_setr_epi8(0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9, 0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9);
-+ __m256i mShuffle1 = _mm256_setr_epi8(4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13, 4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13);
-+
-+ mCoef0 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[0]));
-+ mCoef1 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[1]));
-+ mCoef2 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[2]));
-+ mCoef3 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[3]));
-+ offset = _mm256_set1_epi32(add1);
-+
-+ row = height + 6;
-+
-+ while (row > 0) {
-+ T0 = _mm256_loadu_si256((__m256i*)(src));
-+ s0 = _mm_loadu_si128((__m128i*)(src + 4));
-+ T1 = _mm256_loadu_si256((__m256i*)(src + i_src));
-+ s1 = _mm_loadu_si128((__m128i*)(src + i_src + 4));
-+ row -= 2;
-+ src += i_src << 1;
-+ uavs3d_prefetch(src, _MM_HINT_NTA);
-+ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
-+
-+ S0 = _mm256_permute2x128_si256(T0, T1, 0x20);
-+ S2 = _mm256_permute2x128_si256(T0, T1, 0x31);
-+ S1 = _mm256_set_m128i(s1, s0);
-+
-+ T0 = _mm256_shuffle_epi8(S0, mShuffle0);
-+ T1 = _mm256_shuffle_epi8(S0, mShuffle1);
-+ T2 = _mm256_shuffle_epi8(S1, mShuffle0);
-+ T3 = _mm256_shuffle_epi8(S1, mShuffle1);
-+ T4 = _mm256_shuffle_epi8(S2, mShuffle0);
-+ T5 = _mm256_shuffle_epi8(S2, mShuffle1);
-+
-+ M0 = _mm256_madd_epi16(T0, mCoef0);
-+ M1 = _mm256_madd_epi16(T1, mCoef1);
-+ M2 = _mm256_madd_epi16(T2, mCoef2);
-+ M3 = _mm256_madd_epi16(T3, mCoef3);
-+ M4 = _mm256_madd_epi16(T2, mCoef0);
-+ M5 = _mm256_madd_epi16(T3, mCoef1);
-+ M6 = _mm256_madd_epi16(T4, mCoef2);
-+ M7 = _mm256_madd_epi16(T5, mCoef3);
-+
-+ M0 = _mm256_add_epi32(M0, M1);
-+ M1 = _mm256_add_epi32(M2, M3);
-+ M2 = _mm256_add_epi32(M4, M5);
-+ M3 = _mm256_add_epi32(M6, M7);
-+
-+ M0 = _mm256_add_epi32(M0, M1);
-+ M1 = _mm256_add_epi32(M2, M3);
-
- M2 = _mm256_add_epi32(M0, offset);
- M3 = _mm256_add_epi32(M1, offset);
- M2 = _mm256_srai_epi32(M2, shift1);
- M3 = _mm256_srai_epi32(M3, shift1);
- M2 = _mm256_packs_epi32(M2, M3);
-- _mm256_storeu_si256((__m256i*)(tmp + i), M2);
-
-- p += 8;
-+ _mm256_store_si256((__m256i*)(tmp), M2);
-+
-+ tmp += i_tmp * 2;
-+ }
-+ {
-+ // the last row
-+ __m128i t0, t1, t2, t3, t4, t5;
-+ __m128i m0, m1, m2, m3, m4, m5, m6, m7;
-+ __m128i s2;
-+ s0 = _mm_loadu_si128((__m128i*)(src));
-+ s1 = _mm_loadu_si128((__m128i*)(src + 4));
-+ s2 = _mm_loadu_si128((__m128i*)(src + 8));
-+ src += i_src;
-+
-+ t0 = _mm_shuffle_epi8(s0, _mm256_castsi256_si128(mShuffle0));
-+ t1 = _mm_shuffle_epi8(s0, _mm256_castsi256_si128(mShuffle1));
-+ t2 = _mm_shuffle_epi8(s1, _mm256_castsi256_si128(mShuffle0));
-+ t3 = _mm_shuffle_epi8(s1, _mm256_castsi256_si128(mShuffle1));
-+ t4 = _mm_shuffle_epi8(s2, _mm256_castsi256_si128(mShuffle0));
-+ t5 = _mm_shuffle_epi8(s2, _mm256_castsi256_si128(mShuffle1));
-+
-+ m0 = _mm_madd_epi16(t0, _mm256_castsi256_si128(mCoef0));
-+ m1 = _mm_madd_epi16(t1, _mm256_castsi256_si128(mCoef1));
-+ m2 = _mm_madd_epi16(t2, _mm256_castsi256_si128(mCoef2));
-+ m3 = _mm_madd_epi16(t3, _mm256_castsi256_si128(mCoef3));
-+ m4 = _mm_madd_epi16(t2, _mm256_castsi256_si128(mCoef0));
-+ m5 = _mm_madd_epi16(t3, _mm256_castsi256_si128(mCoef1));
-+ m6 = _mm_madd_epi16(t4, _mm256_castsi256_si128(mCoef2));
-+ m7 = _mm_madd_epi16(t5, _mm256_castsi256_si128(mCoef3));
-+
-+ m0 = _mm_add_epi32(m0, m1);
-+ m1 = _mm_add_epi32(m2, m3);
-+ m2 = _mm_add_epi32(m4, m5);
-+ m3 = _mm_add_epi32(m6, m7);
-+
-+ m0 = _mm_add_epi32(m0, m1);
-+ m1 = _mm_add_epi32(m2, m3);
-+
-+ m2 = _mm_add_epi32(m0, _mm256_castsi256_si128(offset));
-+ m3 = _mm_add_epi32(m1, _mm256_castsi256_si128(offset));
-+ m2 = _mm_srai_epi32(m2, shift1);
-+ m3 = _mm_srai_epi32(m3, shift1);
-+ m2 = _mm_packs_epi32(m2, m3);
-+ _mm_store_si128((__m128i*)tmp, m2);
- }
-- tmp += i_tmp;
-- src += i_src;
- }
-
-- offset = _mm256_set1_epi32(add2);
-- tmp = tmp_res;
-+ {
-+ __m256i N0, N1, N2, N3, N4, N5, N6, N7;
-+ __m256i T6, T7;
-+ offset = _mm256_set1_epi32(add2);
-+ tmp = tmp_res;
-
-- coeff0 = _mm_set1_epi16(*(s16*)(coef_y));
-- coeff1 = _mm_set1_epi16(*(s16*)(coef_y + 2));
-- coeff2 = _mm_set1_epi16(*(s16*)(coef_y + 4));
-- coeff3 = _mm_set1_epi16(*(s16*)(coef_y + 6));
-- coeff00 = _mm256_cvtepi8_epi16(coeff0);
-- coeff01 = _mm256_cvtepi8_epi16(coeff1);
-- coeff02 = _mm256_cvtepi8_epi16(coeff2);
-- coeff03 = _mm256_cvtepi8_epi16(coeff3);
-+ mCoef0 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[0]));
-+ mCoef1 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[1]));
-+ mCoef2 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[2]));
-+ mCoef3 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[3]));
-
-- while (height--) {
-- const pel *p = (pel*)tmp;
-- for (i = 0; i < width; i += 16) {
-- T0 = _mm256_load_si256((__m256i*)(p));
-- T1 = _mm256_load_si256((__m256i*)(p + i_tmp));
-- T2 = _mm256_load_si256((__m256i*)(p + 2 * i_tmp));
-- T3 = _mm256_load_si256((__m256i*)(p + 3 * i_tmp));
-- T4 = _mm256_load_si256((__m256i*)(p + 4 * i_tmp));
-- T5 = _mm256_load_si256((__m256i*)(p + 5 * i_tmp));
-- T6 = _mm256_load_si256((__m256i*)(p + 6 * i_tmp));
-- T7 = _mm256_load_si256((__m256i*)(p + 7 * i_tmp));
-+ while (height > 0) {
-+ T0 = _mm256_load_si256((__m256i*)(tmp));
-+ T1 = _mm256_loadu_si256((__m256i*)(tmp + i_tmp));
-+ T2 = _mm256_load_si256((__m256i*)(tmp + 2 * i_tmp));
-+ T3 = _mm256_loadu_si256((__m256i*)(tmp + 3 * i_tmp));
-+ T4 = _mm256_load_si256((__m256i*)(tmp + 4 * i_tmp));
-+ T5 = _mm256_loadu_si256((__m256i*)(tmp + 5 * i_tmp));
-+ T6 = _mm256_load_si256((__m256i*)(tmp + 6 * i_tmp));
-+ T7 = _mm256_loadu_si256((__m256i*)(tmp + 7 * i_tmp));
-+ height -= 2;
-+ tmp += i_tmp * 2;
-
- M0 = _mm256_unpacklo_epi16(T0, T1);
- M1 = _mm256_unpacklo_epi16(T2, T3);
-@@ -3935,14 +4371,14 @@ void uavs3d_if_hor_ver_luma_w16x_avx2(const pel *src, int i_src, pel *dst, int i
- M6 = _mm256_unpackhi_epi16(T4, T5);
- M7 = _mm256_unpackhi_epi16(T6, T7);
-
-- N0 = _mm256_madd_epi16(M0, coeff00);
-- N1 = _mm256_madd_epi16(M1, coeff01);
-- N2 = _mm256_madd_epi16(M2, coeff02);
-- N3 = _mm256_madd_epi16(M3, coeff03);
-- N4 = _mm256_madd_epi16(M4, coeff00);
-- N5 = _mm256_madd_epi16(M5, coeff01);
-- N6 = _mm256_madd_epi16(M6, coeff02);
-- N7 = _mm256_madd_epi16(M7, coeff03);
-+ N0 = _mm256_madd_epi16(M0, mCoef0);
-+ N1 = _mm256_madd_epi16(M1, mCoef1);
-+ N2 = _mm256_madd_epi16(M2, mCoef2);
-+ N3 = _mm256_madd_epi16(M3, mCoef3);
-+ N4 = _mm256_madd_epi16(M4, mCoef0);
-+ N5 = _mm256_madd_epi16(M5, mCoef1);
-+ N6 = _mm256_madd_epi16(M6, mCoef2);
-+ N7 = _mm256_madd_epi16(M7, mCoef3);
-
- N0 = _mm256_add_epi32(N0, N1);
- N1 = _mm256_add_epi32(N2, N3);
-@@ -3958,14 +4394,164 @@ void uavs3d_if_hor_ver_luma_w16x_avx2(const pel *src, int i_src, pel *dst, int i
- N1 = _mm256_srai_epi32(N1, shift2);
- N0 = _mm256_packus_epi32(N0, N1);
- N0 = _mm256_min_epu16(N0, max_pel);
-- _mm256_storeu_si256((__m256i*)(dst + i), N0);
-
-- p += 16;
-+ _mm_storeu_si128((__m128i*)(dst), _mm256_castsi256_si128(N0));
-+ _mm_storeu_si128((__m128i*)(dst + i_dst), _mm256_extracti128_si256(N0, 1));
-+
-+ dst += i_dst << 1;
- }
-- dst += i_dst;
-- tmp += i_tmp;
-+ }
-+}
-+
-+void uavs3d_if_hor_ver_luma_w16x_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coef_x, const s8 *coef_y, int max_val)
-+{
-+ ALIGNED_32(s16 tmp_res[(128 + 7) * 128]);
-+ s16 *tmp = tmp_res;
-+ int row, i;;
-+ int add1, shift1;
-+ int add2, shift2;
-+ __m256i offset;
-+ __m256i T0, T1, T2, T3, T4, T5;
-+ __m256i M0, M1, M2, M3, M4, M5, M6, M7;
-+ int i_tmp = width;
-+ __m256i mCoef0, mCoef1, mCoef2, mCoef3;
-+ __m256i max_pel = _mm256_set1_epi16((pel)max_val);
-+
-+ if (max_val == 255) { // 8 bit_depth
-+ shift1 = 0;
-+ shift2 = 12;
-+ }
-+ else { // 10 bit_depth
-+ shift1 = 2;
-+ shift2 = 10;
- }
-
-+ add1 = (1 << (shift1)) >> 1;
-+ add2 = 1 << (shift2 - 1);
-+
-+ src += -3 * i_src - 3;
-+
-+ {
-+ __m256i S0, S1, S2;
-+ __m256i mShuffle0 = _mm256_setr_epi8(0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9, 0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9);
-+ __m256i mShuffle1 = _mm256_setr_epi8(4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13, 4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13);
-+
-+ mCoef0 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[0]));
-+ mCoef1 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[1]));
-+ mCoef2 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[2]));
-+ mCoef3 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[3]));
-+ offset = _mm256_set1_epi32(add1);
-+
-+ row = height + 7;
-+
-+ while (row--) {
-+ const pel *p = src;
-+ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
-+ for (i = 0; i < width; i += 16) {
-+ S0 = _mm256_loadu_si256((__m256i*)(p));
-+ S1 = _mm256_loadu_si256((__m256i*)(p + 4));
-+ S2 = _mm256_loadu_si256((__m256i*)(p + 8));
-+
-+ T0 = _mm256_shuffle_epi8(S0, mShuffle0);
-+ T1 = _mm256_shuffle_epi8(S0, mShuffle1);
-+ T2 = _mm256_shuffle_epi8(S1, mShuffle0);
-+ T3 = _mm256_shuffle_epi8(S1, mShuffle1);
-+ T4 = _mm256_shuffle_epi8(S2, mShuffle0);
-+ T5 = _mm256_shuffle_epi8(S2, mShuffle1);
-+
-+ M0 = _mm256_madd_epi16(T0, mCoef0);
-+ M1 = _mm256_madd_epi16(T1, mCoef1);
-+ M2 = _mm256_madd_epi16(T2, mCoef2);
-+ M3 = _mm256_madd_epi16(T3, mCoef3);
-+ M4 = _mm256_madd_epi16(T2, mCoef0);
-+ M5 = _mm256_madd_epi16(T3, mCoef1);
-+ M6 = _mm256_madd_epi16(T4, mCoef2);
-+ M7 = _mm256_madd_epi16(T5, mCoef3);
-+
-+ M0 = _mm256_add_epi32(M0, M1);
-+ M1 = _mm256_add_epi32(M2, M3);
-+ M2 = _mm256_add_epi32(M4, M5);
-+ M3 = _mm256_add_epi32(M6, M7);
-+
-+ M0 = _mm256_add_epi32(M0, M1);
-+ M1 = _mm256_add_epi32(M2, M3);
-+
-+ p += 16;
-+ M2 = _mm256_add_epi32(M0, offset);
-+ M3 = _mm256_add_epi32(M1, offset);
-+ M2 = _mm256_srai_epi32(M2, shift1);
-+ M3 = _mm256_srai_epi32(M3, shift1);
-+ M2 = _mm256_packs_epi32(M2, M3);
-+ _mm256_storeu_si256((__m256i*)(tmp + i), M2);
-+ }
-+ tmp += i_tmp;
-+ src += i_src;
-+ }
-+ }
-+
-+ {
-+ __m256i N0, N1, N2, N3, N4, N5, N6, N7;
-+ __m256i T6, T7;
-+ offset = _mm256_set1_epi32(add2);
-+ tmp = tmp_res;
-+
-+ mCoef0 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[0]));
-+ mCoef1 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[1]));
-+ mCoef2 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[2]));
-+ mCoef3 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[3]));
-+
-+ while (height--) {
-+ const pel *p = (pel*)tmp;
-+ for (i = 0; i < width; i += 16) {
-+ T0 = _mm256_load_si256((__m256i*)(p));
-+ T1 = _mm256_load_si256((__m256i*)(p + i_tmp));
-+ T2 = _mm256_load_si256((__m256i*)(p + 2 * i_tmp));
-+ T3 = _mm256_load_si256((__m256i*)(p + 3 * i_tmp));
-+ T4 = _mm256_load_si256((__m256i*)(p + 4 * i_tmp));
-+ T5 = _mm256_load_si256((__m256i*)(p + 5 * i_tmp));
-+ T6 = _mm256_load_si256((__m256i*)(p + 6 * i_tmp));
-+ T7 = _mm256_load_si256((__m256i*)(p + 7 * i_tmp));
-+
-+ M0 = _mm256_unpacklo_epi16(T0, T1);
-+ M1 = _mm256_unpacklo_epi16(T2, T3);
-+ M2 = _mm256_unpacklo_epi16(T4, T5);
-+ M3 = _mm256_unpacklo_epi16(T6, T7);
-+ M4 = _mm256_unpackhi_epi16(T0, T1);
-+ M5 = _mm256_unpackhi_epi16(T2, T3);
-+ M6 = _mm256_unpackhi_epi16(T4, T5);
-+ M7 = _mm256_unpackhi_epi16(T6, T7);
-+
-+ N0 = _mm256_madd_epi16(M0, mCoef0);
-+ N1 = _mm256_madd_epi16(M1, mCoef1);
-+ N2 = _mm256_madd_epi16(M2, mCoef2);
-+ N3 = _mm256_madd_epi16(M3, mCoef3);
-+ N4 = _mm256_madd_epi16(M4, mCoef0);
-+ N5 = _mm256_madd_epi16(M5, mCoef1);
-+ N6 = _mm256_madd_epi16(M6, mCoef2);
-+ N7 = _mm256_madd_epi16(M7, mCoef3);
-+
-+ N0 = _mm256_add_epi32(N0, N1);
-+ N1 = _mm256_add_epi32(N2, N3);
-+ N2 = _mm256_add_epi32(N4, N5);
-+ N3 = _mm256_add_epi32(N6, N7);
-+
-+ N0 = _mm256_add_epi32(N0, N1);
-+ N1 = _mm256_add_epi32(N2, N3);
-+
-+ N0 = _mm256_add_epi32(N0, offset);
-+ N1 = _mm256_add_epi32(N1, offset);
-+ N0 = _mm256_srai_epi32(N0, shift2);
-+ N1 = _mm256_srai_epi32(N1, shift2);
-+ N0 = _mm256_packus_epi32(N0, N1);
-+ N0 = _mm256_min_epu16(N0, max_pel);
-+ _mm256_storeu_si256((__m256i*)(dst + i), N0);
-+
-+ p += 16;
-+ }
-+ dst += i_dst;
-+ tmp += i_tmp;
-+ }
-+ }
- }
-
- void uavs3d_if_hor_ver_chroma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coef_x, const s8 *coef_y, int max_val)
-@@ -3979,14 +4565,6 @@ void uavs3d_if_hor_ver_chroma_w8_avx2(const pel *src, int i_src, pel *dst, int i
- int shift1, shift2;
- int add1, add2;
-
-- __m128i coef0 = _mm_set1_epi16(*(s16*)coef_x);
-- __m128i coef1 = _mm_set1_epi16(*(s16*)(coef_x + 2));
-- __m256i mCoef0 = _mm256_cvtepi8_epi16(coef0);
-- __m256i mCoef1 = _mm256_cvtepi8_epi16(coef1);
-- __m256i mSwitch = _mm256_setr_epi8(0, 1, 4, 5, 2, 3, 6, 7, 4, 5, 8, 9, 6, 7, 10, 11, 0, 1, 4, 5, 2, 3, 6, 7, 4, 5, 8, 9, 6, 7, 10, 11);
-- __m256i T0, T1, S0, S1, sum;
-- __m256i mAddOffset;
--
- if (max_val == 255) { // 8 bit_depth
- shift1 = 0;
- shift2 = 12;
-@@ -3999,25 +4577,34 @@ void uavs3d_if_hor_ver_chroma_w8_avx2(const pel *src, int i_src, pel *dst, int i
- add1 = (1 << (shift1)) >> 1;
- add2 = 1 << (shift2 - 1);
-
-- mAddOffset = _mm256_set1_epi32(add1);
- //HOR
-+ __m128i coef0 = _mm_cvtepi8_epi16(_mm_set1_epi16(((s16*)coef_x)[0]));
-+ __m128i coef1 = _mm_cvtepi8_epi16(_mm_set1_epi16(((s16*)coef_x)[1]));
-+ __m256i mCoef0 = _mm256_set_m128i(coef1, coef0);
-+ __m256i mCoef1 = _mm256_set_m128i(coef0, coef1);
-+ __m256i mSwitch = _mm256_setr_epi8(0, 1, 4, 5, 2, 3, 6, 7, 4, 5, 8, 9, 6, 7, 10, 11, 0, 1, 4, 5, 2, 3, 6, 7, 4, 5, 8, 9, 6, 7, 10, 11);
-+ __m256i T0, T1, S0, S1, sum;
-+ __m256i mAddOffset = _mm256_set1_epi32(add1);
-+ __m128i mDst;
-+ __m128i s0;
-+
- src = src - i_src - 2;
- row = height + 3;
- while (row--) {
-- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
- S0 = _mm256_loadu_si256((__m256i*)(src));
-- S1 = _mm256_loadu_si256((__m256i*)(src + 4));
-- S0 = _mm256_permute4x64_epi64(S0, 0x94);
-- S1 = _mm256_permute4x64_epi64(S1, 0x94);
-- T0 = _mm256_madd_epi16(_mm256_shuffle_epi8(S0, mSwitch), mCoef0);
-- T1 = _mm256_madd_epi16(_mm256_shuffle_epi8(S1, mSwitch), mCoef1);
-+ s0 = _mm_loadu_si128((__m128i*)(src + 4));
-+ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
-+ S1 = _mm256_set_m128i(s0, s0);
-+ T0 = _mm256_shuffle_epi8(S0, mSwitch);
-+ T1 = _mm256_shuffle_epi8(S1, mSwitch);
-+ T0 = _mm256_madd_epi16(T0, mCoef0);
-+ T1 = _mm256_madd_epi16(T1, mCoef1);
- sum = _mm256_add_epi32(T0, T1);
-
- sum = _mm256_add_epi32(sum, mAddOffset);
- sum = _mm256_srai_epi32(sum, shift1);
-- sum = _mm256_packs_epi32(sum, sum);
-- sum = _mm256_permute4x64_epi64(sum, 0xd8);
-- _mm_storeu_si128((__m128i*)(tmp), _mm256_castsi256_si128(sum));
-+ mDst = _mm_packs_epi32(_mm256_castsi256_si128(sum), _mm256_extracti128_si256(sum, 1));
-+ _mm_store_si128((__m128i*)(tmp), mDst);
-
- src += i_src;
- tmp += i_tmp;
-@@ -4027,46 +4614,49 @@ void uavs3d_if_hor_ver_chroma_w8_avx2(const pel *src, int i_src, pel *dst, int i
- tmp = tmp_res;
-
- {
-- __m128i max_val1 = _mm_set1_epi16((pel)max_val);
-- __m128i coeff0, coeff1, mVal, mAddOffset2;
-- __m128i M0, M1, M2, M3;
-+ __m128i coeff0, coeff1;
-+ __m256i MaxVal = _mm256_set1_epi16((pel)max_val);
-+ __m256i C0, C1, mVal, mAddOffset2;
-+ __m256i M0, M1, M2, M3;
-
- coeff0 = _mm_set1_epi16(*(s16*)coef_y);
- coeff1 = _mm_set1_epi16(*(s16*)(coef_y + 2));
-- mAddOffset2 = _mm_set1_epi32(add2);
--
-- coeff0 = _mm_cvtepi8_epi16(coeff0);
-- coeff1 = _mm_cvtepi8_epi16(coeff1);
-- while (height--) {
-- __m128i T00 = _mm_load_si128((__m128i*)(tmp));
-- __m128i T10 = _mm_load_si128((__m128i*)(tmp + i_tmp));
-- __m128i T20 = _mm_load_si128((__m128i*)(tmp + i_tmp2));
-- __m128i T30 = _mm_load_si128((__m128i*)(tmp + i_tmp3));
-+ mAddOffset2 = _mm256_set1_epi32(add2);
-
-- M0 = _mm_unpacklo_epi16(T00, T10);
-- M1 = _mm_unpacklo_epi16(T20, T30);
-- M2 = _mm_unpackhi_epi16(T00, T10);
-- M3 = _mm_unpackhi_epi16(T20, T30);
--
-- M0 = _mm_madd_epi16(M0, coeff0);
-- M1 = _mm_madd_epi16(M1, coeff1);
-- M2 = _mm_madd_epi16(M2, coeff0);
-- M3 = _mm_madd_epi16(M3, coeff1);
--
-- M0 = _mm_add_epi32(M0, M1);
-- M2 = _mm_add_epi32(M2, M3);
--
-- M0 = _mm_add_epi32(M0, mAddOffset2);
-- M2 = _mm_add_epi32(M2, mAddOffset2);
-- M0 = _mm_srai_epi32(M0, shift2);
-- M2 = _mm_srai_epi32(M2, shift2);
--
-- mVal = _mm_packus_epi32(M0, M2);
-- mVal = _mm_min_epu16(mVal, max_val1);
-- _mm_storeu_si128((__m128i*)dst, mVal);
--
-- tmp += i_tmp;
-- dst += i_dst;
-+ C0 = _mm256_cvtepi8_epi16(coeff0);
-+ C1 = _mm256_cvtepi8_epi16(coeff1);
-+ while (height) {
-+ __m256i T00 = _mm256_load_si256((__m256i*)(tmp));
-+ __m256i T10 = _mm256_loadu_si256((__m256i*)(tmp + i_tmp));
-+ __m256i T20 = _mm256_load_si256((__m256i*)(tmp + i_tmp2));
-+ __m256i T30 = _mm256_loadu_si256((__m256i*)(tmp + i_tmp3));
-+
-+ M0 = _mm256_unpacklo_epi16(T00, T10);
-+ M1 = _mm256_unpacklo_epi16(T20, T30);
-+ M2 = _mm256_unpackhi_epi16(T00, T10);
-+ M3 = _mm256_unpackhi_epi16(T20, T30);
-+
-+ M0 = _mm256_madd_epi16(M0, C0);
-+ M1 = _mm256_madd_epi16(M1, C1);
-+ M2 = _mm256_madd_epi16(M2, C0);
-+ M3 = _mm256_madd_epi16(M3, C1);
-+
-+ M0 = _mm256_add_epi32(M0, M1);
-+ M2 = _mm256_add_epi32(M2, M3);
-+
-+ M0 = _mm256_add_epi32(M0, mAddOffset2);
-+ M2 = _mm256_add_epi32(M2, mAddOffset2);
-+ M0 = _mm256_srai_epi32(M0, shift2);
-+ M2 = _mm256_srai_epi32(M2, shift2);
-+
-+ mVal = _mm256_packus_epi32(M0, M2);
-+ mVal = _mm256_min_epu16(mVal, MaxVal);
-+ _mm_storeu_si128((__m128i*)dst, _mm256_castsi256_si128(mVal));
-+ _mm_storeu_si128((__m128i*)(dst + i_dst), _mm256_extracti128_si256(mVal, 1));
-+
-+ height -= 2;
-+ tmp += i_tmp2;
-+ dst += i_dst << 1;
- }
- }
- }
-@@ -4113,28 +4703,26 @@ void uavs3d_if_hor_ver_chroma_w16x_avx2(const pel *src, int i_src, pel *dst, int
- while (row--) {
- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
- for (col = 0; col < width; col += 16) {
-- S0 = _mm256_loadu_si256((__m256i*)(src + col));
-- S1 = _mm256_loadu_si256((__m256i*)(src + col + 4));
-+ S0 = _mm256_loadu_si256((__m256i*)(src + col));
-+ S1 = _mm256_loadu_si256((__m256i*)(src + col + 4));
- S2 = _mm256_loadu_si256((__m256i*)(src + col + 8));
-- S3 = _mm256_loadu_si256((__m256i*)(src + col + 12));
-- S0 = _mm256_permute4x64_epi64(S0, 0x94);
-- S1 = _mm256_permute4x64_epi64(S1, 0x94);
-- S2 = _mm256_permute4x64_epi64(S2, 0x94);
-- S3 = _mm256_permute4x64_epi64(S3, 0x94);
-- T0 = _mm256_madd_epi16(_mm256_shuffle_epi8(S0, mSwitch), mCoef0);
-- T1 = _mm256_madd_epi16(_mm256_shuffle_epi8(S1, mSwitch), mCoef1);
-- T2 = _mm256_madd_epi16(_mm256_shuffle_epi8(S2, mSwitch), mCoef0);
-- T3 = _mm256_madd_epi16(_mm256_shuffle_epi8(S3, mSwitch), mCoef1);
-- T0 = _mm256_add_epi32(T0, T1);
-- T2 = _mm256_add_epi32(T2, T3);
-+ T0 = _mm256_shuffle_epi8(S0, mSwitch);
-+ T1 = _mm256_shuffle_epi8(S1, mSwitch);
-+ T2 = _mm256_shuffle_epi8(S1, mSwitch);
-+ T3 = _mm256_shuffle_epi8(S2, mSwitch);
-+ S0 = _mm256_madd_epi16(T0, mCoef0);
-+ S1 = _mm256_madd_epi16(T1, mCoef1);
-+ S2 = _mm256_madd_epi16(T2, mCoef0);
-+ S3 = _mm256_madd_epi16(T3, mCoef1);
-+ T0 = _mm256_add_epi32(S0, S1);
-+ T2 = _mm256_add_epi32(S2, S3);
-
- T0 = _mm256_add_epi32(T0, mAddOffset);
- T2 = _mm256_add_epi32(T2, mAddOffset);
- T0 = _mm256_srai_epi32(T0, shift1);
- T2 = _mm256_srai_epi32(T2, shift1);
- T0 = _mm256_packs_epi32(T0, T2);
-- T0 = _mm256_permute4x64_epi64(T0, 0xd8);
-- _mm256_storeu_si256((__m256i*)(tmp + col), T0);
-+ _mm256_store_si256((__m256i*)(tmp + col), T0);
- }
- src += i_src;
- tmp += i_tmp;
-diff --git a/source/decore/avx2/intra_pred_avx2.c b/source/decore/avx2/intra_pred_avx2.c
-index 07e19b2..18961f6 100644
---- a/source/decore/avx2/intra_pred_avx2.c
-+++ b/source/decore/avx2/intra_pred_avx2.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -204,7 +199,7 @@ void uavs3d_ipred_hor_avx2(pel *src, pel *dst, int i_dst, int width, int height)
-
- void uavs3d_ipred_dc_avx2(pel *src, pel *dst, int i_dst, int width, int height, u16 avail_cu, int bit_depth)
- {
-- int i, x, y;
-+ int x, y;
- int dc;
- pel *p_src = src - 1;
- int left_avail = IS_AVAIL(avail_cu, AVAIL_LE);
-@@ -212,6 +207,7 @@ void uavs3d_ipred_dc_avx2(pel *src, pel *dst, int i_dst, int width, int height,
-
- if (left_avail && above_avail) {
- int length = width + height + 1;
-+ int i;
- __m128i sum = _mm_setzero_si128();
- __m128i val;
-
-@@ -2738,7 +2734,6 @@ void uavs3d_ipred_ang_xy_18_avx2(pel *src, pel *dst, int i_dst, int mode, int wi
- dst += i_dst;
- }
- break;
-- break;
- }
-
- }
-@@ -3452,10 +3447,10 @@ void uavs3d_ipred_ver_avx2(pel *src, pel *dst, int i_dst, int width, int height)
- T0 = _mm256_loadu_si256((__m256i *)(src));
- T1 = _mm256_loadu_si256((__m256i *)(src + 16));
- for (y = 0; y < height; y += 2) {
-- _mm256_store_si256((__m256i *)(dst), T0);
-- _mm256_store_si256((__m256i *)(dst + 16), T1);
-- _mm256_store_si256((__m256i *)(dst + i_dst), T0);
-- _mm256_store_si256((__m256i *)(dst + i_dst + 16), T1);
-+ _mm256_storeu_si256((__m256i *)(dst), T0);
-+ _mm256_storeu_si256((__m256i *)(dst + 16), T1);
-+ _mm256_storeu_si256((__m256i *)(dst + i_dst), T0);
-+ _mm256_storeu_si256((__m256i *)(dst + i_dst + 16), T1);
- dst += i_dst2;
- }
- break;
-@@ -3468,14 +3463,14 @@ void uavs3d_ipred_ver_avx2(pel *src, pel *dst, int i_dst, int width, int height)
- T2 = _mm256_loadu_si256((__m256i *)(src + 32));
- T3 = _mm256_loadu_si256((__m256i *)(src + 48));
- for (y = 0; y < height; y += 2) {
-- _mm256_store_si256((__m256i *)(dst), T0);
-- _mm256_store_si256((__m256i *)(dst + 16), T1);
-- _mm256_store_si256((__m256i *)(dst + 32), T2);
-- _mm256_store_si256((__m256i *)(dst + 48), T3);
-- _mm256_store_si256((__m256i *)(dst + i_dst), T0);
-- _mm256_store_si256((__m256i *)(dst + i_dst + 16), T1);
-- _mm256_store_si256((__m256i *)(dst + i_dst + 32), T2);
-- _mm256_store_si256((__m256i *)(dst + i_dst + 48), T3);
-+ _mm256_storeu_si256((__m256i *)(dst), T0);
-+ _mm256_storeu_si256((__m256i *)(dst + 16), T1);
-+ _mm256_storeu_si256((__m256i *)(dst + 32), T2);
-+ _mm256_storeu_si256((__m256i *)(dst + 48), T3);
-+ _mm256_storeu_si256((__m256i *)(dst + i_dst), T0);
-+ _mm256_storeu_si256((__m256i *)(dst + i_dst + 16), T1);
-+ _mm256_storeu_si256((__m256i *)(dst + i_dst + 32), T2);
-+ _mm256_storeu_si256((__m256i *)(dst + i_dst + 48), T3);
- dst += i_dst2;
- }
- break;
-@@ -3539,10 +3534,10 @@ void uavs3d_ipred_hor_avx2(pel *src, pel *dst, int i_dst, int width, int height)
- for (y = 0; y < height; y += 2) {
- T0 = _mm256_set1_epi16(src[-y]);
- T1 = _mm256_set1_epi16(src[-y - 1]);
-- _mm256_store_si256((__m256i *)(dst), T0);
-- _mm256_store_si256((__m256i *)(dst + 16), T0);
-- _mm256_store_si256((__m256i *)(dst + i_dst), T1);
-- _mm256_store_si256((__m256i *)(dst + i_dst + 16), T1);
-+ _mm256_storeu_si256((__m256i *)(dst), T0);
-+ _mm256_storeu_si256((__m256i *)(dst + 16), T0);
-+ _mm256_storeu_si256((__m256i *)(dst + i_dst), T1);
-+ _mm256_storeu_si256((__m256i *)(dst + i_dst + 16), T1);
- dst += i_dst2;
- }
- break;
-@@ -3553,14 +3548,14 @@ void uavs3d_ipred_hor_avx2(pel *src, pel *dst, int i_dst, int width, int height)
- for (y = 0; y < height; y += 2) {
- T0 = _mm256_set1_epi16(src[-y]);
- T1 = _mm256_set1_epi16(src[-y - 1]);
-- _mm256_store_si256((__m256i *)(dst), T0);
-- _mm256_store_si256((__m256i *)(dst + 16), T0);
-- _mm256_store_si256((__m256i *)(dst + 32), T0);
-- _mm256_store_si256((__m256i *)(dst + 48), T0);
-- _mm256_store_si256((__m256i *)(dst + i_dst), T1);
-- _mm256_store_si256((__m256i *)(dst + i_dst + 16), T1);
-- _mm256_store_si256((__m256i *)(dst + i_dst + 32), T1);
-- _mm256_store_si256((__m256i *)(dst + i_dst + 48), T1);
-+ _mm256_storeu_si256((__m256i *)(dst), T0);
-+ _mm256_storeu_si256((__m256i *)(dst + 16), T0);
-+ _mm256_storeu_si256((__m256i *)(dst + 32), T0);
-+ _mm256_storeu_si256((__m256i *)(dst + 48), T0);
-+ _mm256_storeu_si256((__m256i *)(dst + i_dst), T1);
-+ _mm256_storeu_si256((__m256i *)(dst + i_dst + 16), T1);
-+ _mm256_storeu_si256((__m256i *)(dst + i_dst + 32), T1);
-+ _mm256_storeu_si256((__m256i *)(dst + i_dst + 48), T1);
- dst += i_dst2;
- }
- break;
-diff --git a/source/decore/avx2/itrans_avx2.c b/source/decore/avx2/itrans_avx2.c
-index 9b1df21..d8766b6 100644
---- a/source/decore/avx2/itrans_avx2.c
-+++ b/source/decore/avx2/itrans_avx2.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -79,14 +74,14 @@
- #define TRANSPOSE_16x8_32BIT_16BIT(I00, I01, I02, I03, I04, I05, I06, I07, I08, I09, I10, I11, I12, I13, I14, I15, O0, O1, O2, O3, O4, O5, O6, O7)\
- TRANSPOSE_8x8_32BIT_16BIT(I00, I01, I02, I03, I04, I05, I06, I07, I04, I05, I06, I07); \
- TRANSPOSE_8x8_32BIT_16BIT(I08, I09, I10, I11, I12, I13, I14, I15, I12, I13, I14, I15); \
-- O0 = _mm256_insertf128_si256(I04, _mm256_castsi256_si128(I12), 1); \
-- O1 = _mm256_insertf128_si256(I05, _mm256_castsi256_si128(I13), 1); \
-- O2 = _mm256_insertf128_si256(I06, _mm256_castsi256_si128(I14), 1); \
-- O3 = _mm256_insertf128_si256(I07, _mm256_castsi256_si128(I15), 1); \
-- O4 = _mm256_insertf128_si256(I12, _mm256_extracti128_si256(I04, 1), 0); \
-- O5 = _mm256_insertf128_si256(I13, _mm256_extracti128_si256(I05, 1), 0); \
-- O6 = _mm256_insertf128_si256(I14, _mm256_extracti128_si256(I06, 1), 0); \
-- O7 = _mm256_insertf128_si256(I15, _mm256_extracti128_si256(I07, 1), 0)
-+ O0 = _mm256_permute2x128_si256(I04, I12, 0x20); \
-+ O1 = _mm256_permute2x128_si256(I05, I13, 0x20); \
-+ O2 = _mm256_permute2x128_si256(I06, I14, 0x20); \
-+ O3 = _mm256_permute2x128_si256(I07, I15, 0x20); \
-+ O4 = _mm256_permute2x128_si256(I04, I12, 0x31); \
-+ O5 = _mm256_permute2x128_si256(I05, I13, 0x31); \
-+ O6 = _mm256_permute2x128_si256(I06, I14, 0x31); \
-+ O7 = _mm256_permute2x128_si256(I07, I15, 0x31)
-
-
- static void uavs3d_always_inline dct2_butterfly_h4_avx2(s16* src, s16* dst, int line, int shift, int bit_depth)
-@@ -272,10 +267,10 @@ static void uavs3d_always_inline dct2_butterfly_h8_avx2(s16* src, int i_src, s16
-
- // transpose 8x8 : 8 x 8(32bit) --> 4 x 16(16bit)
- TRANSPOSE_8x8_32BIT_16BIT(d0, d1, d2, d3, d4, d5, d6, d7, d4, d5, d6, d7);
-- d0 = _mm256_insertf128_si256(d4, _mm256_castsi256_si128(d5), 1);
-- d1 = _mm256_insertf128_si256(d6, _mm256_castsi256_si128(d7), 1);
-- d2 = _mm256_insertf128_si256(d5, _mm256_extracti128_si256(d4, 1), 0);
-- d3 = _mm256_insertf128_si256(d7, _mm256_extracti128_si256(d6, 1), 0);
-+ d0 = _mm256_permute2x128_si256(d4, d5, 0x20);
-+ d2 = _mm256_permute2x128_si256(d4, d5, 0x31);
-+ d1 = _mm256_permute2x128_si256(d6, d7, 0x20);
-+ d3 = _mm256_permute2x128_si256(d6, d7, 0x31);
-
- if (bit_depth != MAX_TX_DYNAMIC_RANGE) {
- __m256i max_val = _mm256_set1_epi16((1 << bit_depth) - 1);
-diff --git a/source/decore/avx2/pixel_avx2.c b/source/decore/avx2/pixel_avx2.c
-index 8031fe7..10d48f9 100644
---- a/source/decore/avx2/pixel_avx2.c
-+++ b/source/decore/avx2/pixel_avx2.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -986,8 +981,8 @@ void uavs3d_recon_chroma_w16_avx2(s16 *resi_u, s16 *resi_v, pel *pred, int width
- r1 = _mm256_loadu_si256((const __m256i*)(resi_v));
- r2 = _mm256_unpacklo_epi16(r0, r1); // UV interlaced: uv0-uv4 uv8-uv12
- r3 = _mm256_unpackhi_epi16(r0, r1);
-- r0 = _mm256_insertf128_si256(r2, _mm256_castsi256_si128(r3), 0x1); // uv0-uv8
-- r1 = _mm256_insertf128_si256(r3, _mm256_extracti128_si256(r2, 1), 0x0);
-+ r0 = _mm256_permute2x128_si256(r2, r3, 0x20); // uv0-uv8
-+ r1 = _mm256_permute2x128_si256(r2, r3, 0x31);
- p0 = _mm256_adds_epi16(p0, r0);
- p1 = _mm256_adds_epi16(p1, r1);
-
-@@ -1035,8 +1030,8 @@ void uavs3d_recon_chroma_w16_avx2(s16 *resi_u, s16 *resi_v, pel *pred, int width
- r1 = _mm256_loadu_si256((const __m256i*)(resi_v));
- r2 = _mm256_unpacklo_epi16(zero, r1); // UV interlaced: uv0-uv4 uv8-uv12
- r3 = _mm256_unpackhi_epi16(zero, r1);
-- r0 = _mm256_insertf128_si256(r2, _mm256_castsi256_si128(r3), 0x1); // uv0-uv8
-- r1 = _mm256_insertf128_si256(r3, _mm256_extracti128_si256(r2, 1), 0x0);
-+ r0 = _mm256_permute2x128_si256(r2, r3, 0x20); // uv0-uv8
-+ r1 = _mm256_permute2x128_si256(r2, r3, 0x31);
- p0 = _mm256_adds_epi16(p0, r0);
- p1 = _mm256_adds_epi16(p1, r1);
-
-@@ -1073,8 +1068,8 @@ void uavs3d_recon_chroma_w16x_avx2(s16 *resi_u, s16 *resi_v, pel *pred, int widt
- r1 = _mm256_loadu_si256((const __m256i*)(resi_v + j));
- r2 = _mm256_unpacklo_epi16(r0, r1); // UV interlaced: uv0-uv4 uv8-uv12
- r3 = _mm256_unpackhi_epi16(r0, r1);
-- r0 = _mm256_insertf128_si256(r2, _mm256_castsi256_si128(r3), 0x1); // uv0-uv8
-- r1 = _mm256_insertf128_si256(r3, _mm256_extracti128_si256(r2, 1), 0x0);
-+ r0 = _mm256_permute2x128_si256(r2, r3, 0x20); // uv0-uv8
-+ r1 = _mm256_permute2x128_si256(r2, r3, 0x31);
- p0 = _mm256_adds_epi16(p0, r0);
- p1 = _mm256_adds_epi16(p1, r1);
-
-@@ -1126,8 +1121,8 @@ void uavs3d_recon_chroma_w16x_avx2(s16 *resi_u, s16 *resi_v, pel *pred, int widt
- r1 = _mm256_loadu_si256((const __m256i*)(resi_v + j));
- r2 = _mm256_unpacklo_epi16(zero, r1); // UV interlaced: uv0-uv4 uv8-uv12
- r3 = _mm256_unpackhi_epi16(zero, r1);
-- r0 = _mm256_insertf128_si256(r2, _mm256_castsi256_si128(r3), 0x1); // uv0-uv8
-- r1 = _mm256_insertf128_si256(r3, _mm256_extracti128_si256(r2, 1), 0x0);
-+ r0 = _mm256_permute2x128_si256(r2, r3, 0x20); // uv0-uv8
-+ r1 = _mm256_permute2x128_si256(r2, r3, 0x31);
- p0 = _mm256_adds_epi16(p0, r0);
- p1 = _mm256_adds_epi16(p1, r1);
-
-diff --git a/source/decore/avx2/sao_avx2.c b/source/decore/avx2/sao_avx2.c
-index 73c01b4..7d2d527 100644
---- a/source/decore/avx2/sao_avx2.c
-+++ b/source/decore/avx2/sao_avx2.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/com_def.h b/source/decore/com_def.h
-index a8e9446..8b7ad27 100644
---- a/source/decore/com_def.h
-+++ b/source/decore/com_def.h
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -40,14 +35,18 @@
-
- #include "com_sys.h"
-
--#define BIT_DEPTH 8
--
- #define CHECK_RAND_STRM 0
-
--#if (BIT_DEPTH == 8)
--typedef u8 pel; /* pixel type */
-+#ifndef COMPILE_10BIT
-+#define COMPILE_10BIT 0
-+#endif
-+
-+#if COMPILE_10BIT
-+typedef unsigned short pel; /* pixel type */
-+#define BIT_DEPTH 10
- #else
--typedef s16 pel; /* pixel type */
-+typedef unsigned char pel; /* pixel type */
-+#define BIT_DEPTH 8
- #endif
-
- /************************* profile & level **********************************************/
-diff --git a/source/decore/com_sys.h b/source/decore/com_sys.h
-index 0cb4359..2ea3237 100644
---- a/source/decore/com_sys.h
-+++ b/source/decore/com_sys.h
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/com_table.c b/source/decore/com_table.c
-index bbc40d9..2042e6d 100644
---- a/source/decore/com_table.c
-+++ b/source/decore/com_table.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/com_table.h b/source/decore/com_table.h
-index 2c2bb3d..c419405 100644
---- a/source/decore/com_table.h
-+++ b/source/decore/com_table.h
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/com_type.h b/source/decore/com_type.h
-index 5bb8337..0a7db50 100644
---- a/source/decore/com_type.h
-+++ b/source/decore/com_type.h
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/com_util.c b/source/decore/com_util.c
-index 7e374c9..353804b 100644
---- a/source/decore/com_util.c
-+++ b/source/decore/com_util.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/com_util.h b/source/decore/com_util.h
-index b6887bb..721a0c1 100644
---- a/source/decore/com_util.h
-+++ b/source/decore/com_util.h
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -41,10 +36,10 @@
- #include "com_type.h"
-
- /* function selection define based on platforms */
--#if (defined(__ANDROID__) && defined(__aarch64__)) || (defined(__APPLE__) && defined(__arm64__))
-+#if defined(_arm64) || (defined(__APPLE__) && defined(__arm64__))
- #define ENABLE_FUNCTION_C 1
- #define ENABLE_FUNCTION_ARM64 1
--#elif (defined(__ANDROID__) && defined(__arm__)) || (defined(__APPLE__) && defined(__ARM_NEON__))
-+#elif defined(_armv7a) || (defined(__APPLE__) && defined(__ARM_NEON__))
- #define ENABLE_FUNCTION_C 1
- #define ENABLE_FUNCTION_ARM32 1
- #elif (defined(__WIN32__) || defined(_WIN32)) || (defined(__MACOSX__) || defined(macintosh) || defined(__linux__) || defined(__unix__)) && (defined(__i386__) || defined(__x86_64__) || defined(__AMD64__))
-diff --git a/source/decore/deblock.c b/source/decore/deblock.c
-index 0996c57..f9764d6 100644
---- a/source/decore/deblock.c
-+++ b/source/decore/deblock.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -65,7 +60,7 @@ static int uavs3d_always_inline skip_filter(com_map_t *map, com_ref_pic_t refp[M
- {
- com_scu_t MbQ = map->map_scu[scup + offset];
- com_pic_t *q_pic0, *q_pic1;
-- const com_scu_t mask = {0, 0, 0, 0, 1, 0, 0};
-+ const com_scu_t mask = {0, 1, 0, 0, 1, 0, 0};
-
- if ((*(u8*)&MbQ) & (*(u8*)&mask)) {
- return 0;
-@@ -210,7 +205,7 @@ void com_deblock_set_edge(com_core_t *core)
- int scu_x = core->cu_pix_x >> MIN_CU_LOG2;
- int scu_y = core->cu_pix_y >> MIN_CU_LOG2;
- const int grad_mask = (LOOPFILTER_GRID >> 2) - 1;
-- const com_scu_t mask = { 0, 0, 0, 0, 1, 0, 0 };
-+ const com_scu_t mask = { 0, 1, 0, 0, 1, 0, 0 };
- com_scu_t scu = map->map_scu[scup];
-
- if ((*(u8*)&scu) & (*(u8*)&mask)) {
-diff --git a/source/decore/inter_pred.c b/source/decore/inter_pred.c
-index c53d399..470c84c 100644
---- a/source/decore/inter_pred.c
-+++ b/source/decore/inter_pred.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -486,10 +481,10 @@ void uavs3d_always_inline com_affine_mc_chroma(com_core_t *core, pel *dstc, int
- int max_posx = (seqhdr->pic_width + 4) >> 1;
- int max_posy = (seqhdr->pic_height + 4) >> 1;
- int i_asb_mv = cu_width >> 2;
-- s32(*asb_mv1)[MV_D] = asb_mv0 + i_asb_mv;
- int i_src = ref_pic->stride_chroma;
-
- if (sub_blk_size == 4) {
-+ s32(*asb_mv1)[MV_D] = asb_mv0 + i_asb_mv;
- for (h = 0; h < cu_height; h += 8) {
- int base_y = (y + h) << 4;
- for (w = 0; w < cu_width; w += 8, asb_mv0 += 2, asb_mv1 += 2) {
-diff --git a/source/decore/intra_pred.c b/source/decore/intra_pred.c
-index de1eef6..c767be0 100644
---- a/source/decore/intra_pred.c
-+++ b/source/decore/intra_pred.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -320,7 +315,7 @@ void ipred_plane(pel *src, pel *dst, int i_dst, int w, int h, int bit_depth)
- int ib_shift[5] = { 7, 10, 11, 15, 19 };
- int idx_w = g_tbl_log2[w] - 2;
- int idx_h = g_tbl_log2[h] - 2;
-- int im_h, is_h, im_v, is_v, temp, temp2;
-+ int im_h, is_h, im_v, is_v, temp;
- int max_pel = (1 << bit_depth) - 1;
- int val;
-
-@@ -343,7 +338,7 @@ void ipred_plane(pel *src, pel *dst, int i_dst, int w, int h, int bit_depth)
- temp = a - (h2 - 1) * c - (w2 - 1) * b + 16;
-
- for (y = 0; y < h; y++) {
-- temp2 = temp;
-+ int temp2 = temp;
- for (x = 0; x < w; x++) {
- val = temp2 >> 5;
- dst[x] = (pel)COM_CLIP3(0, max_pel, val);
-@@ -368,7 +363,7 @@ void ipred_plane_ipf(pel *src, s16 *dst, int w, int h)
- int ib_shift[5] = { 7, 10, 11, 15, 19 };
- int idx_w = g_tbl_log2[w] - 2;
- int idx_h = g_tbl_log2[h] - 2;
-- int im_h, is_h, im_v, is_v, temp, temp2;
-+ int im_h, is_h, im_v, is_v, temp;
- im_h = ib_mult[idx_w];
- is_h = ib_shift[idx_w];
- im_v = ib_mult[idx_h];
-@@ -388,7 +383,7 @@ void ipred_plane_ipf(pel *src, s16 *dst, int w, int h)
- temp = a - (h2 - 1) * c - (w2 - 1) * b + 16;
-
- for (y = 0; y < h; y++) {
-- temp2 = temp;
-+ int temp2 = temp;
- for (x = 0; x < w; x++) {
- dst[x] = (s16)(temp2 >> 5);
- temp2 += b;
-@@ -416,7 +411,7 @@ void ipred_plane_uv(pel *src, pel *dst, int i_dst, int w, int h, int bit_depth)
- int idx_w = g_tbl_log2[w] - 2;
- int idx_h = g_tbl_log2[h] - 2;
- int im_h, is_h, im_v, is_v;
-- int temp_u, temp_v, temp2_u, temp2_v;
-+ int temp_u, temp_v;
- int max_pel = (1 << bit_depth) - 1;
- int val_u, val_v;
-
-@@ -448,8 +443,8 @@ void ipred_plane_uv(pel *src, pel *dst, int i_dst, int w, int h, int bit_depth)
- temp_v = a_v - (h2 - 1) * c_v - (w2 - 1) * b_v + 16;
-
- for (y = 0; y < h; y++) {
-- temp2_u = temp_u;
-- temp2_v = temp_v;
-+ int temp2_u = temp_u;
-+ int temp2_v = temp_v;
- for (x = 0; x < width2; x += 2) {
- val_u = temp2_u >> 5;
- val_v = temp2_v >> 5;
-@@ -475,8 +470,7 @@ void ipred_bi(pel *src, pel *dst, int i_dst, int w, int h, int bit_depth)
- int ishift = COM_MIN(ishift_x, ishift_y);
- int ishift_xy = ishift_x + ishift_y + 1;
- int offset = 1 << (ishift_x + ishift_y);
-- int a, b, c, wt, wxy, tmp;
-- int predx;
-+ int a, b, c, wt, tmp;
- int ref_up[MAX_CU_SIZE], ref_le[MAX_CU_SIZE], up[MAX_CU_SIZE], le[MAX_CU_SIZE], wy[MAX_CU_SIZE];
- int wc, tbl_wc[6] = {-1, 21, 13, 7, 4, 2};
- int max_pel = (1 << bit_depth) - 1;
-@@ -510,8 +504,8 @@ void ipred_bi(pel *src, pel *dst, int i_dst, int w, int h, int bit_depth)
- tmp += wt;
- }
- for( y = 0; y < h; y++ ) {
-- predx = ref_le[y];
-- wxy = 0;
-+ int predx = ref_le[y];
-+ int wxy = 0;
- for( x = 0; x < w; x++ ) {
- predx += le[y];
- ref_up[x] += up[x];
-@@ -534,8 +528,7 @@ void ipred_bi_ipf(pel *src, s16 *dst, int w, int h)
- int ishift = COM_MIN(ishift_x, ishift_y);
- int ishift_xy = ishift_x + ishift_y + 1;
- int offset = 1 << (ishift_x + ishift_y);
-- int a, b, c, wt, wxy, tmp;
-- int predx;
-+ int a, b, c, wt, tmp;
- int ref_up[MAX_CU_SIZE], ref_le[MAX_CU_SIZE], up[MAX_CU_SIZE], le[MAX_CU_SIZE], wy[MAX_CU_SIZE];
- int wc, tbl_wc[6] = { -1, 21, 13, 7, 4, 2 };
- wc = ishift_x > ishift_y ? ishift_x - ishift_y : ishift_y - ishift_x;
-@@ -566,8 +559,8 @@ void ipred_bi_ipf(pel *src, s16 *dst, int w, int h)
- tmp += wt;
- }
- for (y = 0; y < h; y++) {
-- predx = ref_le[y];
-- wxy = 0;
-+ int predx = ref_le[y];
-+ int wxy = 0;
- for (x = 0; x < w; x++) {
- predx += le[y];
- ref_up[x] += up[x];
-@@ -589,9 +582,8 @@ void ipred_bi_uv(pel *src, pel *dst, int i_dst, int w, int h, int bit_depth)
- int ishift = COM_MIN(ishift_x, ishift_y);
- int ishift_xy = ishift_x + ishift_y + 1;
- int offset = 1 << (ishift_x + ishift_y);
-- int a_u, b_u, c_u, wt_u, wxy_u, tmp_u;
-- int a_v, b_v, c_v, wt_v, wxy_v, tmp_v;
-- int predx_u, predx_v;
-+ int a_u, b_u, c_u, wt_u, tmp_u;
-+ int a_v, b_v, c_v, wt_v, tmp_v;
- int ref_up[MAX_CU_SIZE], ref_le[MAX_CU_SIZE], up[MAX_CU_SIZE], le[MAX_CU_SIZE], wy[MAX_CU_SIZE];
- int wc, tbl_wc[6] = { -1, 21, 13, 7, 4, 2 };
- int w2 = w << 1;
-@@ -640,9 +632,10 @@ void ipred_bi_uv(pel *src, pel *dst, int i_dst, int w, int h, int bit_depth)
- }
- for (y = 0; y < h; y++) {
- int y2 = y << 1;
-- predx_u = ref_le[y2 ];
-- predx_v = ref_le[y2 + 1];
-- wxy_u = wxy_v = 0;
-+ int predx_u = ref_le[y2 ];
-+ int predx_v = ref_le[y2 + 1];
-+ int wxy_u = 0;
-+ int wxy_v = 0;
- for (x = 0; x < w2; x += 2) {
- predx_u += le[y2];
- predx_v += le[y2 + 1];
-@@ -1034,7 +1027,6 @@ static void uavs3d_always_inline ipf_core_s16(pel *src, pel *dst, int i_dst, s16
- s32 filter_idx_ver = (s32)g_tbl_log2[h] - 2; //Block Size
- s32 ver_filter_range = COM_MIN(h, 10);
- s32 hor_filter_range = COM_MIN(w, 10);
-- int max_val = (1 << bit_depth) - 1;
-
- // TODO: g_ipf_pred_param doesn't support 128
- if (filter_idx_hor > 4) {
-@@ -1300,7 +1292,6 @@ static void xPredIntraAngAdi_X_8(pel *pSrc, pel *dst, int i_dst, int uiDirMode,
- int line_size = iWidth + iHeight / 2 - 1;
- int real_size = min(line_size, iWidth * 2 + 1);
- int i;
-- int pad1, pad2;
- int aligned_line_size = ((line_size + 15) >> 4) << 4;
- pel *pfirst[2] = { first_line, first_line + aligned_line_size };
-
-@@ -1311,6 +1302,8 @@ static void xPredIntraAngAdi_X_8(pel *pSrc, pel *dst, int i_dst, int uiDirMode,
-
- // padding
- if (real_size < line_size) {
-+ int pad1, pad2;
-+
- pfirst[1][real_size - 1] = pfirst[1][real_size - 2];
-
- pad1 = pfirst[0][real_size - 1];
-@@ -1466,7 +1459,6 @@ static void xPredIntraAngAdi_Y_28(pel *pSrc, pel *dst, int i_dst, int uiDirMode,
- int real_size = min(line_size, iHeight * 4 + 1);
- int i;
- int iHeight2 = iHeight << 1;
-- int pad1, pad2;
-
- for (i = 0; i < real_size; i += 2, pSrc--) {
- first_line[i] = (pSrc[0] + (pSrc[-1] + pSrc[-2]) * 3 + pSrc[-3] + 4) >> 3;
-@@ -1475,6 +1467,7 @@ static void xPredIntraAngAdi_Y_28(pel *pSrc, pel *dst, int i_dst, int uiDirMode,
-
- // padding
- if (real_size < line_size) {
-+ int pad1, pad2;
- first_line[i - 1] = first_line[i - 3];
-
- pad1 = first_line[i - 2];
-diff --git a/source/decore/inv_trans.c b/source/decore/inv_trans.c
-index 2be533a..2d60b20 100644
---- a/source/decore/inv_trans.c
-+++ b/source/decore/inv_trans.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/modules.h b/source/decore/modules.h
-index 026d237..00d65b1 100644
---- a/source/decore/modules.h
-+++ b/source/decore/modules.h
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/pic_manager.c b/source/decore/pic_manager.c
-index 1c9be09..1a09a38 100644
---- a/source/decore/pic_manager.c
-+++ b/source/decore/pic_manager.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/recon.c b/source/decore/recon.c
-index c6466ba..951957a 100644
---- a/source/decore/recon.c
-+++ b/source/decore/recon.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/sao.c b/source/decore/sao.c
-index b39466d..9004046 100644
---- a/source/decore/sao.c
-+++ b/source/decore/sao.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/sse/alf_sse.c b/source/decore/sse/alf_sse.c
-index 2880605..24e203e 100644
---- a/source/decore/sse/alf_sse.c
-+++ b/source/decore/sse/alf_sse.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/sse/deblock_sse.c b/source/decore/sse/deblock_sse.c
-index 271c2fc..ab88636 100644
---- a/source/decore/sse/deblock_sse.c
-+++ b/source/decore/sse/deblock_sse.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/sse/inter_pred_sse.c b/source/decore/sse/inter_pred_sse.c
-index 170d079..7faf0d7 100644
---- a/source/decore/sse/inter_pred_sse.c
-+++ b/source/decore/sse/inter_pred_sse.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -55,25 +50,59 @@ void uavs3d_if_cpy_sse(const pel *src, int i_src, pel *dst, int i_dst, int width
-
- void uavs3d_if_cpy_w4_sse(const pel *src, int i_src, pel *dst, int i_dst, int width, int height)
- {
-- while (height) {
-+ if (height < 4) {
- CP32(dst, src);
- CP32(dst + i_dst, src + i_src);
-- height -= 2;
-- src += i_src << 1;
-- dst += i_dst << 1;
-+ }
-+ else {
-+ int i_src2 = i_src << 1;
-+ int i_dst2 = i_dst << 1;
-+ int i_src3 = i_src + i_src2;
-+ int i_dst3 = i_dst + i_dst2;
-+ int i_src4 = i_src << 2;
-+ int i_dst4 = i_dst << 2;
-+ while (height > 0) {
-+ CP32(dst, src);
-+ CP32(dst + i_dst, src + i_src);
-+ CP32(dst + i_dst2, src + i_src2);
-+ CP32(dst + i_dst3, src + i_src3);
-+ height -= 4;
-+ src += i_src4;
-+ dst += i_dst4;
-+ }
- }
- }
-
- void uavs3d_if_cpy_w8_sse(const pel *src, int i_src, pel *dst, int i_dst, int width, int height)
- {
-- int i_src2 = i_src << 1;
-- int i_dst2 = i_dst << 1;
-- while (height) {
-- CP64(dst, src);
-- CP64(dst + i_dst, src + i_src);
-- src += i_src2;
-- dst += i_dst2;
-- height -= 2;
-+ if (height < 4) {
-+ __m128i m0, m1;
-+ m0 = _mm_loadl_epi64((const __m128i*)src);
-+ m1 = _mm_loadl_epi64((const __m128i*)(src + i_src));
-+ _mm_storel_epi64((__m128i*)dst, m0);
-+ _mm_storel_epi64((__m128i*)(dst + i_dst), m1);
-+ } else {
-+ __m128i m0, m1, m2, m3;
-+ int i_src2 = i_src << 1;
-+ int i_dst2 = i_dst << 1;
-+ int i_src3 = i_src + i_src2;
-+ int i_dst3 = i_dst + i_dst2;
-+ int i_src4 = i_src << 2;
-+ int i_dst4 = i_dst << 2;
-+ while (height) {
-+ m0 = _mm_loadl_epi64((const __m128i*)src);
-+ m1 = _mm_loadl_epi64((const __m128i*)(src + i_src));
-+ m2 = _mm_loadl_epi64((const __m128i*)(src + i_src2));
-+ m3 = _mm_loadl_epi64((const __m128i*)(src + i_src3));
-+ height -= 4;
-+ src += i_src4;
-+
-+ _mm_storel_epi64((__m128i*)dst, m0);
-+ _mm_storel_epi64((__m128i*)(dst + i_dst), m1);
-+ _mm_storel_epi64((__m128i*)(dst + i_dst2), m2);
-+ _mm_storel_epi64((__m128i*)(dst + i_dst3), m3);
-+ dst += i_dst4;
-+ }
- }
- }
-
-@@ -371,7 +400,7 @@ void uavs3d_if_hor_luma_w8_sse(const pel *src, int i_src, pel *dst, int i_dst, i
- height -= 2;
-
- _mm_storel_epi64((__m128i*)dst, T0);
-- M64(dst + i_dst) = _mm_extract_epi64(T0, 1);
-+ _mm_storeh_pi((__m64*)(dst + i_dst), _mm_castsi128_ps(T0));
-
- src += i_src << 1;
- dst += i_dst << 1;
-@@ -512,7 +541,6 @@ void uavs3d_if_ver_chroma_w16x_sse(const pel *src, int i_src, pel *dst, int i_ds
- const int offset = 32;
- const int shift = 6;
- __m128i mAddOffset = _mm_set1_epi16(offset);
-- pel const *p;
- __m128i coeff0 = _mm_set1_epi16(*(s16*)coeff);
- __m128i coeff1 = _mm_set1_epi16(*(s16*)(coeff + 2));
- __m128i mVal1, mVal2;
-@@ -520,7 +548,7 @@ void uavs3d_if_ver_chroma_w16x_sse(const pel *src, int i_src, pel *dst, int i_ds
- src -= i_src;
-
- while (height--) {
-- p = src;
-+ pel const *p = src;
- uavs3d_prefetch(src + 4 * i_src, _MM_HINT_NTA);
- for (col = 0; col < width; col += 16) {
- __m128i T01 = _mm_loadu_si128((__m128i*)(p));
-@@ -739,7 +767,6 @@ void uavs3d_if_ver_luma_w16x_sse(const pel *src, int i_src, pel *dst, int i_dst,
- int col;
- const int offset = 32;
- const int shift = 6;
-- pel const *p;
- __m128i mAddOffset = _mm_set1_epi16(offset);
- __m128i coeff0 = _mm_set1_epi16(*(s16*)coeff);
- __m128i coeff1 = _mm_set1_epi16(*(s16*)(coeff + 2));
-@@ -750,7 +777,7 @@ void uavs3d_if_ver_luma_w16x_sse(const pel *src, int i_src, pel *dst, int i_dst,
- src -= 3 * i_src;
-
- while (height--) {
-- p = src;
-+ pel const *p = src;
- uavs3d_prefetch(src + 8 * i_src, _MM_HINT_NTA);
- for (col = 0; col < width; col += 16) {
- __m128i T01 = _mm_loadu_si128((__m128i*)(p));
-@@ -811,7 +838,6 @@ void uavs3d_if_hor_ver_chroma_w8x_sse(const pel *src, int i_src, pel *dst, int i
- {
- int row, col;
- int shift;
-- s16 const *p;
- ALIGNED_16(s16 tmp_res[(64 + 3) * 64*2]);
- s16 *tmp = tmp_res;
- const int i_tmp = width;
-@@ -856,7 +882,7 @@ void uavs3d_if_hor_ver_chroma_w8x_sse(const pel *src, int i_src, pel *dst, int i
- coeff1_ver = _mm_cvtepi8_epi16(coeff1_ver);
-
- while (height--) {
-- p = tmp;
-+ s16 const *p = tmp;
- for (col = 0; col < width; col += 8) {
- __m128i T00 = _mm_load_si128((__m128i*)(p));
- __m128i T10 = _mm_load_si128((__m128i*)(p + i_tmp));
-@@ -1411,7 +1437,6 @@ void uavs3d_if_hor_ver_luma_w8x_sse(const pel *src, int i_src, pel *dst, int i_d
- {
- int row, col;
- int shift;
-- s16 const *p;
-
- ALIGNED_16(s16 tmp_res[(128 + 7) * 128]);
- s16 *tmp = tmp_res;
-@@ -1473,7 +1498,7 @@ void uavs3d_if_hor_ver_luma_w8x_sse(const pel *src, int i_src, pel *dst, int i_d
- mCoefy4_ver = _mm_cvtepi8_epi16(mCoefy4_ver);
-
- while (height--) {
-- p = tmp;
-+ s16 const *p = tmp;
- for (col = 0; col < width; col += 8) {
- __m128i T00 = _mm_load_si128((__m128i*)(p));
- __m128i T10 = _mm_load_si128((__m128i*)(p + i_tmp));
-@@ -2315,14 +2340,13 @@ void uavs3d_if_hor_ver_luma_w8_sse(const pel *src, int i_src, pel *dst, int i_ds
- int rows;
- int add1, shift1;
- int add2, shift2;
-- __m128i T0, T1, T2, T3, T4, T5, T6, T7;
-+ __m128i T0, T1, T2, T3, T4, T5;
- __m128i M0, M1, M2, M3, M4, M5, M6, M7;
-- __m128i N0, N1, N2, N3, N4, N5, N6, N7;
-- __m128i mCoef, offset, max_pel;
-+ __m128i offset, max_pel;
- ALIGNED_16(s16 tmp_res[(64 + 7) * 8]);
- s16 *tmp = tmp_res;
- const int i_tmp = 8;
-- __m128i coeff00, coeff01, coeff02, coeff03;
-+ __m128i mCoef0, mCoef1, mCoef2, mCoef3;
-
- if (max_val == 255) { // 8 bit_depth
- shift1 = 0;
-@@ -2338,110 +2362,129 @@ void uavs3d_if_hor_ver_luma_w8_sse(const pel *src, int i_src, pel *dst, int i_ds
-
- src += -3 * i_src - 3;
-
-- mCoef = _mm_loadl_epi64((__m128i*)coef_x);
-- offset = _mm_set1_epi32(add1);
-- mCoef = _mm_cvtepi8_epi16(mCoef);
--
-- // HOR
-- rows = height + 7;
-- while (rows--) {
-- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
-- T0 = _mm_loadu_si128((__m128i*)(src + 0));
-- T1 = _mm_loadu_si128((__m128i*)(src + 1));
-- T2 = _mm_loadu_si128((__m128i*)(src + 2));
-- T3 = _mm_loadu_si128((__m128i*)(src + 3));
-- T4 = _mm_loadu_si128((__m128i*)(src + 4));
-- T5 = _mm_loadu_si128((__m128i*)(src + 5));
-- T6 = _mm_loadu_si128((__m128i*)(src + 6));
-- T7 = _mm_loadu_si128((__m128i*)(src + 7));
--
-- M0 = _mm_madd_epi16(T0, mCoef);
-- M1 = _mm_madd_epi16(T1, mCoef);
-- M2 = _mm_madd_epi16(T2, mCoef);
-- M3 = _mm_madd_epi16(T3, mCoef);
-- M4 = _mm_madd_epi16(T4, mCoef);
-- M5 = _mm_madd_epi16(T5, mCoef);
-- M6 = _mm_madd_epi16(T6, mCoef);
-- M7 = _mm_madd_epi16(T7, mCoef);
-+ {
-+ __m128i mShuffle0 = _mm_setr_epi8(0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9);
-+ __m128i mShuffle1 = _mm_setr_epi8(4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13);
-+ __m128i S0, S1, S2;
-+
-+ mCoef0 = _mm_set1_epi16(((s16*)coef_x)[0]);
-+ mCoef1 = _mm_set1_epi16(((s16*)coef_x)[1]);
-+ mCoef2 = _mm_set1_epi16(((s16*)coef_x)[2]);
-+ mCoef3 = _mm_set1_epi16(((s16*)coef_x)[3]);
-+ mCoef0 = _mm_cvtepi8_epi16(mCoef0);
-+ mCoef1 = _mm_cvtepi8_epi16(mCoef1);
-+ mCoef2 = _mm_cvtepi8_epi16(mCoef2);
-+ mCoef3 = _mm_cvtepi8_epi16(mCoef3);
-+ offset = _mm_set1_epi32(add1);
-+
-+ // HOR
-+ rows = height + 7;
-+ while (rows--) {
-+ S0 = _mm_loadu_si128((__m128i*)(src));
-+ S1 = _mm_loadu_si128((__m128i*)(src + 4));
-+ S2 = _mm_loadu_si128((__m128i*)(src + 8));
-+ src += i_src;
-+ uavs3d_prefetch(src, _MM_HINT_NTA);
-+
-+ T0 = _mm_shuffle_epi8(S0, mShuffle0);
-+ T1 = _mm_shuffle_epi8(S0, mShuffle1);
-+ T2 = _mm_shuffle_epi8(S1, mShuffle0);
-+ T3 = _mm_shuffle_epi8(S1, mShuffle1);
-+ T4 = _mm_shuffle_epi8(S2, mShuffle0);
-+ T5 = _mm_shuffle_epi8(S2, mShuffle1);
-+
-+ M0 = _mm_madd_epi16(T0, mCoef0);
-+ M1 = _mm_madd_epi16(T1, mCoef1);
-+ M2 = _mm_madd_epi16(T2, mCoef2);
-+ M3 = _mm_madd_epi16(T3, mCoef3);
-+ M4 = _mm_madd_epi16(T2, mCoef0);
-+ M5 = _mm_madd_epi16(T3, mCoef1);
-+ M6 = _mm_madd_epi16(T4, mCoef2);
-+ M7 = _mm_madd_epi16(T5, mCoef3);
-
-- M0 = _mm_hadd_epi32(M0, M1);
-- M1 = _mm_hadd_epi32(M2, M3);
-- M2 = _mm_hadd_epi32(M4, M5);
-- M3 = _mm_hadd_epi32(M6, M7);
-+ M0 = _mm_add_epi32(M0, M1);
-+ M1 = _mm_add_epi32(M2, M3);
-+ M2 = _mm_add_epi32(M4, M5);
-+ M3 = _mm_add_epi32(M6, M7);
-
-- M0 = _mm_hadd_epi32(M0, M1);
-- M1 = _mm_hadd_epi32(M2, M3);
-+ M0 = _mm_add_epi32(M0, M1);
-+ M1 = _mm_add_epi32(M2, M3);
-
-- M2 = _mm_add_epi32(M0, offset);
-- M3 = _mm_add_epi32(M1, offset);
-- M2 = _mm_srai_epi32(M2, shift1);
-- M3 = _mm_srai_epi32(M3, shift1);
-- M2 = _mm_packs_epi32(M2, M3);
-- _mm_storeu_si128((__m128i*)tmp, M2);
-+ M2 = _mm_add_epi32(M0, offset);
-+ M3 = _mm_add_epi32(M1, offset);
-+ M2 = _mm_srai_epi32(M2, shift1);
-+ M3 = _mm_srai_epi32(M3, shift1);
-+ M2 = _mm_packs_epi32(M2, M3);
-+ _mm_store_si128((__m128i*)tmp, M2);
-
-- tmp += i_tmp;
-- src += i_src;
-+ tmp += i_tmp;
-+ }
- }
-
-- offset = _mm_set1_epi32(add2);
-- max_pel = _mm_set1_epi16((pel)max_val);
-- tmp = tmp_res;
--
-- coeff00 = _mm_set1_epi16(*(s16*)coef_y);
-- coeff01 = _mm_set1_epi16(*(s16*)(coef_y + 2));
-- coeff02 = _mm_set1_epi16(*(s16*)(coef_y + 4));
-- coeff03 = _mm_set1_epi16(*(s16*)(coef_y + 6));
-- coeff00 = _mm_cvtepi8_epi16(coeff00);
-- coeff01 = _mm_cvtepi8_epi16(coeff01);
-- coeff02 = _mm_cvtepi8_epi16(coeff02);
-- coeff03 = _mm_cvtepi8_epi16(coeff03);
--
-- while (height--) {
-- T0 = _mm_load_si128((__m128i*)(tmp));
-- T1 = _mm_load_si128((__m128i*)(tmp + i_tmp));
-- T2 = _mm_load_si128((__m128i*)(tmp + 2 * i_tmp));
-- T3 = _mm_load_si128((__m128i*)(tmp + 3 * i_tmp));
-- T4 = _mm_load_si128((__m128i*)(tmp + 4 * i_tmp));
-- T5 = _mm_load_si128((__m128i*)(tmp + 5 * i_tmp));
-- T6 = _mm_load_si128((__m128i*)(tmp + 6 * i_tmp));
-- T7 = _mm_load_si128((__m128i*)(tmp + 7 * i_tmp));
-+ {
-+ __m128i N0, N1, N2, N3, N4, N5, N6, N7;
-+ __m128i T6, T7;
-+
-+ offset = _mm_set1_epi32(add2);
-+ max_pel = _mm_set1_epi16((pel)max_val);
-+ tmp = tmp_res;
-+
-+ mCoef0 = _mm_set1_epi16(((s16*)coef_y)[0]);
-+ mCoef1 = _mm_set1_epi16(((s16*)coef_y)[1]);
-+ mCoef2 = _mm_set1_epi16(((s16*)coef_y)[2]);
-+ mCoef3 = _mm_set1_epi16(((s16*)coef_y)[3]);
-+ mCoef0 = _mm_cvtepi8_epi16(mCoef0);
-+ mCoef1 = _mm_cvtepi8_epi16(mCoef1);
-+ mCoef2 = _mm_cvtepi8_epi16(mCoef2);
-+ mCoef3 = _mm_cvtepi8_epi16(mCoef3);
-+
-+ while (height--) {
-+ T0 = _mm_load_si128((__m128i*)(tmp));
-+ T1 = _mm_load_si128((__m128i*)(tmp + i_tmp));
-+ T2 = _mm_load_si128((__m128i*)(tmp + 2 * i_tmp));
-+ T3 = _mm_load_si128((__m128i*)(tmp + 3 * i_tmp));
-+ T4 = _mm_load_si128((__m128i*)(tmp + 4 * i_tmp));
-+ T5 = _mm_load_si128((__m128i*)(tmp + 5 * i_tmp));
-+ T6 = _mm_load_si128((__m128i*)(tmp + 6 * i_tmp));
-+ T7 = _mm_load_si128((__m128i*)(tmp + 7 * i_tmp));
-
-- M0 = _mm_unpacklo_epi16(T0, T1);
-- M1 = _mm_unpacklo_epi16(T2, T3);
-- M2 = _mm_unpacklo_epi16(T4, T5);
-- M3 = _mm_unpacklo_epi16(T6, T7);
-- M4 = _mm_unpackhi_epi16(T0, T1);
-- M5 = _mm_unpackhi_epi16(T2, T3);
-- M6 = _mm_unpackhi_epi16(T4, T5);
-- M7 = _mm_unpackhi_epi16(T6, T7);
-+ M0 = _mm_unpacklo_epi16(T0, T1);
-+ M1 = _mm_unpacklo_epi16(T2, T3);
-+ M2 = _mm_unpacklo_epi16(T4, T5);
-+ M3 = _mm_unpacklo_epi16(T6, T7);
-+ M4 = _mm_unpackhi_epi16(T0, T1);
-+ M5 = _mm_unpackhi_epi16(T2, T3);
-+ M6 = _mm_unpackhi_epi16(T4, T5);
-+ M7 = _mm_unpackhi_epi16(T6, T7);
-
-- N0 = _mm_madd_epi16(M0, coeff00);
-- N1 = _mm_madd_epi16(M1, coeff01);
-- N2 = _mm_madd_epi16(M2, coeff02);
-- N3 = _mm_madd_epi16(M3, coeff03);
-- N4 = _mm_madd_epi16(M4, coeff00);
-- N5 = _mm_madd_epi16(M5, coeff01);
-- N6 = _mm_madd_epi16(M6, coeff02);
-- N7 = _mm_madd_epi16(M7, coeff03);
-+ N0 = _mm_madd_epi16(M0, mCoef0);
-+ N1 = _mm_madd_epi16(M1, mCoef1);
-+ N2 = _mm_madd_epi16(M2, mCoef2);
-+ N3 = _mm_madd_epi16(M3, mCoef3);
-+ N4 = _mm_madd_epi16(M4, mCoef0);
-+ N5 = _mm_madd_epi16(M5, mCoef1);
-+ N6 = _mm_madd_epi16(M6, mCoef2);
-+ N7 = _mm_madd_epi16(M7, mCoef3);
-
-- N0 = _mm_add_epi32(N0, N1);
-- N1 = _mm_add_epi32(N2, N3);
-- N2 = _mm_add_epi32(N4, N5);
-- N3 = _mm_add_epi32(N6, N7);
-+ N0 = _mm_add_epi32(N0, N1);
-+ N1 = _mm_add_epi32(N2, N3);
-+ N2 = _mm_add_epi32(N4, N5);
-+ N3 = _mm_add_epi32(N6, N7);
-
-- N0 = _mm_add_epi32(N0, N1);
-- N1 = _mm_add_epi32(N2, N3);
-+ N0 = _mm_add_epi32(N0, N1);
-+ N1 = _mm_add_epi32(N2, N3);
-
-- N0 = _mm_add_epi32(N0, offset);
-- N1 = _mm_add_epi32(N1, offset);
-- N0 = _mm_srai_epi32(N0, shift2);
-- N1 = _mm_srai_epi32(N1, shift2);
-- N0 = _mm_packus_epi32(N0, N1);
-- N0 = _mm_min_epu16(N0, max_pel);
-- _mm_storeu_si128((__m128i*)(dst), N0);
-+ N0 = _mm_add_epi32(N0, offset);
-+ N1 = _mm_add_epi32(N1, offset);
-+ N0 = _mm_srai_epi32(N0, shift2);
-+ N1 = _mm_srai_epi32(N1, shift2);
-+ N0 = _mm_packus_epi32(N0, N1);
-+ N0 = _mm_min_epu16(N0, max_pel);
-+ _mm_storeu_si128((__m128i*)(dst), N0);
-
-- dst += i_dst;
-- tmp += i_tmp;
-+ dst += i_dst;
-+ tmp += i_tmp;
-+ }
- }
- }
-
-diff --git a/source/decore/sse/intra_pred_sse.c b/source/decore/sse/intra_pred_sse.c
-index b877834..d77b556 100644
---- a/source/decore/sse/intra_pred_sse.c
-+++ b/source/decore/sse/intra_pred_sse.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -713,13 +708,14 @@ void uavs3d_ipred_chroma_hor_sse(pel *src, pel *dst, int i_dst, int width, int h
-
- void uavs3d_ipred_dc_sse(pel *src, pel *dst, int i_dst, int width, int height, u16 avail_cu, int bit_depth)
- {
-- int i, x, y;
-+ int x, y;
- int dc;
- pel *p_src = src - 1;
- int left_avail = IS_AVAIL(avail_cu, AVAIL_LE);
- int above_avail = IS_AVAIL(avail_cu, AVAIL_UP);
-
- if (left_avail && above_avail) {
-+ int i;
- int length = width + height + 1;
- __m128i sum = _mm_setzero_si128();
- __m128i val;
-@@ -828,7 +824,7 @@ void uavs3d_ipred_dc_sse(pel *src, pel *dst, int i_dst, int width, int height, u
- void uavs3d_ipred_chroma_dc_sse(pel *src, pel *dst, int i_dst, int width, int height, u16 avail_cu, int bit_depth)
- {
- __m128i T;
-- int i, x, y;
-+ int x, y;
- int dcU, dcV;
- pel *p_src = src - 2;
- int left_avail = IS_AVAIL(avail_cu, AVAIL_LE);
-@@ -838,6 +834,7 @@ void uavs3d_ipred_chroma_dc_sse(pel *src, pel *dst, int i_dst, int width, int he
- int height2 = height << 1;
- int wh = width + height;
- int length = (wh << 1) + 2; // 2*(width + height + 1)
-+ int i;
- __m128i sum = _mm_setzero_si128();
- __m128i val;
-
-@@ -1787,7 +1784,6 @@ void uavs3d_ipred_ipf_s16_sse(pel *src, pel *dst, int i_dst, s16* pred, int flt_
- {
- pel *p_top = src + 1;
- int row;
-- int max_val = (1 << bit_depth) - 1;
- __m128i c_32 = _mm_set1_epi16(32);
- __m128i zero = _mm_setzero_si128();
- if (w == 4) {
-diff --git a/source/decore/sse/itrans_sse.c b/source/decore/sse/itrans_sse.c
-index f7a5051..217e88e 100644
---- a/source/decore/sse/itrans_sse.c
-+++ b/source/decore/sse/itrans_sse.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/sse/pixel_sse.c b/source/decore/sse/pixel_sse.c
-index 46ce33f..804b71d 100644
---- a/source/decore/sse/pixel_sse.c
-+++ b/source/decore/sse/pixel_sse.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/sse/sao_sse.c b/source/decore/sse/sao_sse.c
-index 3459b3e..5f4723b 100644
---- a/source/decore/sse/sao_sse.c
-+++ b/source/decore/sse/sao_sse.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/sse/sse.c b/source/decore/sse/sse.c
-index cb8c119..570edf5 100644
---- a/source/decore/sse/sse.c
-+++ b/source/decore/sse/sse.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/source/decore/sse/sse.h b/source/decore/sse/sse.h
-index 967808a..4e10ab7 100644
---- a/source/decore/sse/sse.h
-+++ b/source/decore/sse/sse.h
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -45,12 +40,18 @@
-
- #include "modules.h"
-
--#ifdef _WIN32
--
--#ifndef _WIN64
--#define _mm_extract_epi64(a, i) (a.m128i_i64[i])
--#endif
--
-+#if __x86_64__
-+#elif __i386__ && !defined(_mm_extract_epi64)
-+#define _mm_extract_epi64 _mm_extract_epi64
-+#include <stdint.h>
-+static inline int64_t _mm_extract_epi64(__m128i a, const int imm8) {
-+ return imm8 ? ((int64_t)_mm_extract_epi16(a, 7) << 48) |
-+ ((int64_t)_mm_extract_epi16(a, 6) << 32) |
-+ (_mm_extract_epi16(a, 5) << 16) | _mm_extract_epi16(a, 4)
-+ : ((int64_t)_mm_extract_epi16(a, 3) << 48) |
-+ ((int64_t)_mm_extract_epi16(a, 2) << 32) |
-+ (_mm_extract_epi16(a, 1) << 16) | _mm_extract_epi16(a, 0);
-+}
- #endif
-
- ALIGNED_32(extern pel uavs3d_simd_mask[15][16]);
-diff --git a/source/decore/threadpool.h b/source/decore/threadpool.h
-index 3370beb..6a74bac 100644
---- a/source/decore/threadpool.h
-+++ b/source/decore/threadpool.h
-@@ -11,9 +11,6 @@ typedef volatile long atom_t; // 32 bits, signed
- #if defined(_WIN32)
- #include "win32thread.h"
- #else
--
--#pragma comment(lib, "pthreadVC2.lib")
--
- #include <pthread.h>
- #define uavs3d_pthread_t pthread_t
- #define uavs3d_pthread_create pthread_create
-diff --git a/test/utest.c b/test/utest.c
-index 724c7d8..e4df366 100644
---- a/test/utest.c
-+++ b/test/utest.c
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-@@ -202,8 +197,8 @@ static int app_img_write(char * fname, uavs3d_io_frm_t * img, com_seqh_t *seqhdr
- return -1;
- }
- for (i = 0; i < 3; i++) {
-- int hor_size = seqhdr->horizontal_size >> (i ? 1 : 0);
-- int ver_size = seqhdr->vertical_size >> (i ? 1 : 0);
-+ int hor_size = seqhdr->display_horizontal_size >> (i ? 1 : 0);
-+ int ver_size = seqhdr->display_vertical_size >> (i ? 1 : 0);
- unsigned char * p8 = (unsigned char *)img->buffer[i];
-
- for (j = 0; j < ver_size; j++) {
-@@ -412,10 +407,13 @@ void output_callback(uavs3d_io_frm_t *frm) {
- }
-
- #if defined(__APPLE__) && (defined(__arm64__) || defined(__ARM_NEON__))
--int uavs3d_decode_sample(int argc, const char **argv)
--#else
--int main(int argc, const char **argv)
-+#include <TargetConditionals.h>
-+#if !TARGET_OS_OSX
-+#define main uavs3d_decode_sample
-+#endif
- #endif
-+
-+int main(int argc, const char **argv)
- {
- int decoding = 1;
- unsigned char * bs_buf = NULL;
-@@ -465,7 +463,7 @@ int main(int argc, const char **argv)
- dec_cfg.log_level = 1;
- dec_cfg.frm_threads = 1;
-
-- if (argc < 2) {
-+ if ((argc < 2) || !(argc % 2)) {
- log_level_0("Error config, please check arguments: \n");
- print_help();
- return -1;
-@@ -588,8 +586,8 @@ finished:
- if (frame_num) {
- width = dec_frame.width[0];
- height = dec_frame.height[0];
-- hor_size = dec_frame.seqhdr->horizontal_size;
-- ver_size = dec_frame.seqhdr->vertical_size;
-+ hor_size = dec_frame.seqhdr->display_horizontal_size;
-+ ver_size = dec_frame.seqhdr->display_vertical_size;
-
- log_level_1("=========================================================================================\n");
- log_level_1(" Resolution = %d x %d (Coding: %d x %d)\n", hor_size, ver_size, width, height);
-diff --git a/test/utest.h b/test/utest.h
-index aceb8a4..1dbd239 100644
---- a/test/utest.h
-+++ b/test/utest.h
-@@ -1,5 +1,5 @@
- /**************************************************************************************
-- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
-+ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
- * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
- *
- * All rights reserved.
-@@ -11,12 +11,7 @@
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
-- * 3. All advertising materials mentioning features or use of this software
-- * must display the following acknowledgement:
-- * This product includes the software uAVS3d developed by
-- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
-- * and Guangdong Bohua UHD Innovation Corporation.
-- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
-+ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
- * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
-diff --git a/version.sh b/version.sh
-index 65e2df7..034d454 100755
---- a/version.sh
-+++ b/version.sh
-@@ -15,12 +15,12 @@ else
- shell_dir=$1
- fi
-
--VER_R=`git rev-list origin/master | sort | wc -l | gawk '{print $1}'`
--VER_L=`git rev-list HEAD | sort | wc -l | gawk '{print $1}'`
-+VER_R=`git rev-list origin/master | sort | wc -l | awk '{print $1}'`
-+VER_L=`git rev-list HEAD | sort | wc -l | awk '{print $1}'`
- VER_SHA1=`git log -n 1 | head -n 1 | cut -d ' ' -f 2`
-
- major_version="1"
--minor_version="1"
-+minor_version="2"
- type_version="release"
-
- # generate the file version.h
diff --git a/multimedia/uavs3d/fix-libdir-in-cmakelists.patch b/multimedia/uavs3d/fix-libdir.patch
index 375a1e87e2..1a8dc3ed44 100644
--- a/multimedia/uavs3d/fix-libdir-in-cmakelists.patch
+++ b/multimedia/uavs3d/fix-libdir.patch
@@ -1,11 +1,11 @@
---- /home/ben/sbo/ff/uavs3d/source/CMakeLists.txt 2024-02-21 15:38:58.265755999 +0530
-+++ /home/ben/sbo/ff/uavs3d/source/CMakeListsn.txt 2024-02-21 16:03:45.133751729 +0530
+--- CMakeLists.txt 2023-02-23 08:04:14.000000000 +0530
++++ CMakeListsn.txt 2024-04-29 23:03:55.252641340 +0530
@@ -13,6 +13,8 @@
" Unexpected pointer size ${CMAKE_SIZEOF_VOID_P} for ${CMAKE_SYSTEM_PROCESSOR}\n")
endif()
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i386" OR
+ "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i586" OR
-+ "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i686" OR
++ "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i686" OR
"${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86")
set(UAVS3D_TARGET_CPU "x86")
elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64" OR
diff --git a/multimedia/uavs3d/uavs3d.SlackBuild b/multimedia/uavs3d/uavs3d.SlackBuild
index 141e072f29..f49506bf41 100644
--- a/multimedia/uavs3d/uavs3d.SlackBuild
+++ b/multimedia/uavs3d/uavs3d.SlackBuild
@@ -25,17 +25,19 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=uavs3d
-VERSION=${VERSION:-1.1}
+VERSION=${VERSION:-1fd0491_20230223}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
sys_arch=${sys_arch:-$(uname -m)}
+COMMIT=${COMMIT:-1fd04917cff50fac72ae23e45f82ca6fd9130bd8}
+COMMITDATE=${COMMITDATE:-20230223}
case "$sys_arch" in
i586) export ARCH=i586 ;;
i686) export ARCH=i686 ;;
x86_64) export ARCH=x86_64 ;;
- *) echo "This program will not build on $sys_arch platform" && exit 1 ;;
+ *) echo "This SlackBuild will not build on $sys_arch platform" && exit 1 ;;
esac
TMP=${TMP:-/tmp/SBo}
@@ -52,7 +54,7 @@ elif [ "$ARCH" = "x86_64" ]; then
SLKCFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fPIC"
LIBDIRSUFFIX="64"
else
- echo "This program will not build on $sys_arch platform" && exit 1
+ echo "This SlackBuild will not build on $sys_arch platform" && exit 1
fi
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
@@ -66,9 +68,9 @@ trap 'echo "$0 FAILED at line $LINENO!" | tee -a $OUTPUT/error-${PRGNAM}.log' ER
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
-rm -rf $PRGNAM-$VERSION
-tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
-cd $PRGNAM-$VERSION
+rm -rf $PRGNAM-$COMMIT
+tar xvf $CWD/$PRGNAM-$COMMIT.tar.gz
+cd $PRGNAM-$COMMIT
chown -R root:root .
find -L . \
@@ -77,14 +79,13 @@ find -L . \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
-patch -p1 --verbose --unified < $CWD/fix-build-issue.patch
cd source
-patch --verbose --unified < $CWD/fix-libdir-in-cmakelists.patch
+patch --verbose --unified < $CWD/fix-libdir.patch
cd ..
mkdir -pv build/linux
-cmake -B build/linux -S $TMP/$PRGNAM-$VERSION \
+cmake -B build/linux -S $TMP/$PRGNAM-$COMMIT \
-DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
-DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
-DCMAKE_BUILD_TYPE:STRING=Release \
@@ -95,9 +96,9 @@ cmake -B build/linux -S $TMP/$PRGNAM-$VERSION \
cmake --build build/linux
-make -C $TMP/$PRGNAM-$VERSION/build/linux DESTDIR="$PKG" install
+make -C $TMP/$PRGNAM-$COMMIT/build/linux DESTDIR="$PKG" install
-install -D -m755 $TMP/$PRGNAM-$VERSION/build/linux/uavs3dec -t "$PKG/usr/bin"
+install -D -m755 $TMP/$PRGNAM-$COMMIT/build/linux/uavs3dec -t "$PKG/usr/bin"
find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" \
| grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded --remove-section=.comment --remove-section=.note 2> /dev/null || true
diff --git a/multimedia/uavs3d/uavs3d.info b/multimedia/uavs3d/uavs3d.info
index ee0adc5d16..940e617735 100644
--- a/multimedia/uavs3d/uavs3d.info
+++ b/multimedia/uavs3d/uavs3d.info
@@ -1,8 +1,8 @@
PRGNAM="uavs3d"
-VERSION="1.1"
+VERSION="1fd0491_20230223"
HOMEPAGE="https://github.com/uavs3/uavs3d"
-DOWNLOAD="https://github.com/uavs3/uavs3d/archive/v1.1/uavs3d-1.1.tar.gz"
-MD5SUM="a22d9d4f1da4d1e2d0b19a25754505c3"
+DOWNLOAD="https://github.com/uavs3/uavs3d/archive/1fd0491/uavs3d-1fd04917cff50fac72ae23e45f82ca6fd9130bd8.tar.gz"
+MD5SUM="347425aec780f5dfee3baa768bca02aa"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
diff --git a/multimedia/vgmplay/slack-desc b/multimedia/vgmplay/slack-desc
index ca06884d2e..a98490474a 100644
--- a/multimedia/vgmplay/slack-desc
+++ b/multimedia/vgmplay/slack-desc
@@ -10,7 +10,7 @@ vgmplay: vgmplay (the official player for VGM files)
vgmplay:
vgmplay: vgmplay is a player of the VGM chiptune format.
vgmplay:
-vgmplay: Homepage: https://github.com/vgmrips/vgmplay
+vgmplay: Homepage: https://github.com/vgmrips/vgmplay-legacy
vgmplay:
vgmplay:
vgmplay:
diff --git a/multimedia/vgmplay/vgmplay.SlackBuild b/multimedia/vgmplay/vgmplay.SlackBuild
index 00df60594f..bb711c82a5 100644
--- a/multimedia/vgmplay/vgmplay.SlackBuild
+++ b/multimedia/vgmplay/vgmplay.SlackBuild
@@ -38,9 +38,6 @@ case "$( uname -m )" in
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -69,9 +66,9 @@ set -e
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
-rm -rf $PRGNAM-$VERSION
-tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
-cd $PRGNAM-$VERSION/VGMPlay
+rm -rf $PRGNAM-legacy-$VERSION
+tar xvf $CWD/$PRGNAM-legacy-$VERSION.tar.gz
+cd $PRGNAM-legacy-$VERSION/VGMPlay
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
diff --git a/multimedia/vgmplay/vgmplay.info b/multimedia/vgmplay/vgmplay.info
index 2d26e2fb13..cac830b2da 100644
--- a/multimedia/vgmplay/vgmplay.info
+++ b/multimedia/vgmplay/vgmplay.info
@@ -1,8 +1,8 @@
PRGNAM="vgmplay"
VERSION="0.40.9"
-HOMEPAGE="https://github.com/vgmrips/vgmplay"
-DOWNLOAD="https://github.com/vgmrips/vgmplay/archive/0.40.9/vgmplay-0.40.9.tar.gz"
-MD5SUM="a2217e465c5e3bdebc47dbb15a6cb436"
+HOMEPAGE="https://github.com/vgmrips/vgmplay-legacy"
+DOWNLOAD="https://github.com/vgmrips/vgmplay-legacy/archive/0.40.9/vgmplay-legacy-0.40.9.tar.gz"
+MD5SUM="89097227705321156c0b319f5e0d529d"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
diff --git a/multimedia/videomass/videomass.SlackBuild b/multimedia/videomass/videomass.SlackBuild
index c7a39d82ce..918852c087 100644
--- a/multimedia/videomass/videomass.SlackBuild
+++ b/multimedia/videomass/videomass.SlackBuild
@@ -25,7 +25,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=videomass
-VERSION=${VERSION:-5.0.11}
+VERSION=${VERSION:-5.0.13}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
diff --git a/multimedia/videomass/videomass.info b/multimedia/videomass/videomass.info
index 55d41f4021..9cb9fec1bb 100644
--- a/multimedia/videomass/videomass.info
+++ b/multimedia/videomass/videomass.info
@@ -1,8 +1,8 @@
PRGNAM="videomass"
-VERSION="5.0.11"
+VERSION="5.0.13"
HOMEPAGE="http://jeanslack.github.io/Videomass/"
-DOWNLOAD="https://github.com/jeanslack/Videomass/archive/v5.0.11/Videomass-5.0.11.tar.gz"
-MD5SUM="abc76d66e7731f031c3a6bc98406d58f"
+DOWNLOAD="https://github.com/jeanslack/Videomass/archive/v5.0.13/Videomass-5.0.13.tar.gz"
+MD5SUM="476e33dfac4bfeb5fcac895b4202dad2"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="wxPython4 python3-pubsub"
diff --git a/multimedia/vlc/4645.patch b/multimedia/vlc/4645.patch
new file mode 100644
index 0000000000..bd26976fbc
--- /dev/null
+++ b/multimedia/vlc/4645.patch
@@ -0,0 +1,177 @@
+From 1e2918115ca2f5c4ffde00dc02ad89525714f6c2 Mon Sep 17 00:00:00 2001
+From: Thomas Guillem <thomas@gllm.fr>
+Date: Tue, 5 Dec 2023 09:23:35 +0100
+Subject: [PATCH 1/5] input: fix incompatible-pointer-types assignment
+
+Fixes #28441
+---
+ src/input/input_internal.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/input/input_internal.h b/src/input/input_internal.h
+index d29731edca1b..ea02f39f5add 100644
+--- a/src/input/input_internal.h
++++ b/src/input/input_internal.h
+@@ -117,7 +117,7 @@ typedef struct input_thread_private_t
+
+ /* Title infos FIXME multi-input (not easy) ? */
+ int i_title;
+- const input_title_t **title;
++ input_title_t * const *title;
+
+ int i_title_offset;
+ int i_seekpoint_offset;
+--
+GitLab
+
+
+From adcf4e66e2ce2c382bb97957c91bfde040f4f3ca Mon Sep 17 00:00:00 2001
+From: Zhao Zhili <quinkblack@foxmail.com>
+Date: Thu, 1 Mar 2018 14:25:59 +0800
+Subject: [PATCH 2/5] yadif: fix variable type
+
+Signed-off-by: Thomas Guillem <thomas@gllm.fr>
+(cherry picked from commit 77b86f4452be4dbe0d56a9cd1b66da61b116da60)
+Signed-off-by: Thomas Guillem <thomas@gllm.fr>
+---
+ modules/video_filter/deinterlace/yadif.h | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/modules/video_filter/deinterlace/yadif.h b/modules/video_filter/deinterlace/yadif.h
+index 4bc592ba9307..af16443d0804 100644
+--- a/modules/video_filter/deinterlace/yadif.h
++++ b/modules/video_filter/deinterlace/yadif.h
+@@ -140,10 +140,10 @@ static void yadif_filter_line_c(uint8_t *dst, uint8_t *prev, uint8_t *cur, uint8
+ }
+
+ static void yadif_filter_line_c_16bit(uint8_t *dst8, uint8_t *prev8, uint8_t *cur8, uint8_t *next8, int w, int prefs, int mrefs, int parity, int mode) {
+- uint8_t *dst = (uint8_t *)dst8;
+- uint8_t *prev = (uint8_t *)prev8;
+- uint8_t *cur = (uint8_t *)cur8;
+- uint8_t *next = (uint8_t *)next8;
++ uint16_t *dst = (uint16_t *)dst8;
++ uint16_t *prev = (uint16_t *)prev8;
++ uint16_t *cur = (uint16_t *)cur8;
++ uint16_t *next = (uint16_t *)next8;
+ int x;
+ uint16_t *prev2= parity ? prev : cur ;
+ uint16_t *next2= parity ? cur : next;
+--
+GitLab
+
+
+From 45198e5328ff2b2f4eb2fb76add0789fec26270f Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= <remi@remlab.net>
+Date: Sun, 3 Mar 2019 09:59:10 +0200
+Subject: [PATCH 3/5] swscale: avoid invalid pointer conversion
+
+(cherry picked from commit ab00e6c59d42e05ab08893091783d8b5febc0058)
+Signed-off-by: Thomas Guillem <thomas@gllm.fr>
+---
+ modules/video_chroma/swscale.c | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+diff --git a/modules/video_chroma/swscale.c b/modules/video_chroma/swscale.c
+index 8993d11ec5dd..11897527355c 100644
+--- a/modules/video_chroma/swscale.c
++++ b/modules/video_chroma/swscale.c
+@@ -588,8 +588,9 @@ static void Convert( filter_t *p_filter, struct SwsContext *ctx,
+ {
+ filter_sys_t *p_sys = p_filter->p_sys;
+ uint8_t palette[AVPALETTE_SIZE];
+- uint8_t *src[4]; int src_stride[4];
+- uint8_t *dst[4]; int dst_stride[4];
++ uint8_t *src[4], *dst[4];
++ const uint8_t *csrc[4];
++ int src_stride[4], dst_stride[4];
+
+ GetPixels( src, src_stride, p_sys->desc_in, &p_filter->fmt_in.video,
+ p_src, i_plane_count, b_swap_uvi );
+@@ -606,11 +607,14 @@ static void Convert( filter_t *p_filter, struct SwsContext *ctx,
+ GetPixels( dst, dst_stride, p_sys->desc_out, &p_filter->fmt_out.video,
+ p_dst, i_plane_count, b_swap_uvo );
+
++ for (size_t i = 0; i < ARRAY_SIZE(src); i++)
++ csrc[i] = src[i];
++
+ #if LIBSWSCALE_VERSION_INT >= ((0<<16)+(5<<8)+0)
+- sws_scale( ctx, src, src_stride, 0, i_height,
++ sws_scale( ctx, csrc, src_stride, 0, i_height,
+ dst, dst_stride );
+ #else
+- sws_scale_ordered( ctx, src, src_stride, 0, i_height,
++ sws_scale_ordered( ctx, csrc, src_stride, 0, i_height,
+ dst, dst_stride );
+ #endif
+ }
+--
+GitLab
+
+
+From 4431076ad4a21fdcabd3f7ef1d61c45891689b0c Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= <remi@remlab.net>
+Date: Sun, 3 Mar 2019 17:20:04 +0200
+Subject: [PATCH 4/5] dynamicoverlay: fix variable shadowing
+
+(cherry picked from commit d42e05d6b2c061ae352c131d5aebf8c8d8aa6d35)
+Signed-off-by: Thomas Guillem <thomas@gllm.fr>
+---
+ modules/spu/dynamicoverlay/dynamicoverlay_commands.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/modules/spu/dynamicoverlay/dynamicoverlay_commands.c b/modules/spu/dynamicoverlay/dynamicoverlay_commands.c
+index a93462925e8a..a85f9aafb0b9 100644
+--- a/modules/spu/dynamicoverlay/dynamicoverlay_commands.c
++++ b/modules/spu/dynamicoverlay/dynamicoverlay_commands.c
+@@ -899,12 +899,11 @@ static const commanddesc_static_t p_commands[] =
+ void RegisterCommand( filter_t *p_filter )
+ {
+ filter_sys_t *p_sys = (filter_sys_t*) p_filter->p_sys;
+- size_t i_index = 0;
+
+ p_sys->i_commands = ARRAY_SIZE(p_commands);
+ p_sys->pp_commands = (commanddesc_t **) calloc( p_sys->i_commands, sizeof(commanddesc_t*) );
+ if( !p_sys->pp_commands ) return;
+- for( i_index = 0; i_index < p_sys->i_commands; i_index ++ )
++ for( size_t i_index = 0; i_index < p_sys->i_commands; i_index ++ )
+ {
+ p_sys->pp_commands[i_index] = (commanddesc_t *) malloc( sizeof(commanddesc_t) );
+ if( !p_sys->pp_commands[i_index] ) return;
+--
+GitLab
+
+
+From fda14fc7c013eb75291df10cc8b88336c51328ad Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= <remi@remlab.net>
+Date: Mon, 26 Feb 2018 20:43:03 +0200
+Subject: [PATCH 5/5] dynamicoverlay: fix memory corruption
+
+Font alpha is 8-bits, not 32-bits.
+
+(cherry picked from commit 6f14081af7325d334a53126c4eea52bc30fc08a0)
+Signed-off-by: Thomas Guillem <thomas@gllm.fr>
+---
+ modules/spu/dynamicoverlay/dynamicoverlay_commands.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/modules/spu/dynamicoverlay/dynamicoverlay_commands.c b/modules/spu/dynamicoverlay/dynamicoverlay_commands.c
+index a85f9aafb0b9..7a71c6f2373a 100644
+--- a/modules/spu/dynamicoverlay/dynamicoverlay_commands.c
++++ b/modules/spu/dynamicoverlay/dynamicoverlay_commands.c
+@@ -234,8 +234,12 @@ static int parser_SetTextAlpha( char *psz_command, char *psz_end,
+ skip_space( &psz_command );
+ if( isdigit( (unsigned char)*psz_command ) )
+ {
+- if( parse_digit( &psz_command, &p_params->fontstyle.i_font_alpha ) == VLC_EGENERIC )
++ int32_t value;
++
++ if( parse_digit( &psz_command, &value ) == VLC_EGENERIC )
+ return VLC_EGENERIC;
++
++ p_params->fontstyle.i_font_alpha = value;
+ }
+ return VLC_SUCCESS;
+ }
+--
+GitLab
+
diff --git a/multimedia/vlc/4665.patch b/multimedia/vlc/4665.patch
new file mode 100644
index 0000000000..47e5847d05
--- /dev/null
+++ b/multimedia/vlc/4665.patch
@@ -0,0 +1,375 @@
+From 770789f265761fc7ab2de69ca105fec4ad93d9e2 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= <remi@remlab.net>
+Date: Mon, 26 Feb 2018 20:36:29 +0200
+Subject: [PATCH 1/9] chromaprint: missing cast
+
+(cherry picked from commit 7bd5bab3e43ae187f7219db61ed85d06d2ba0547)
+Signed-off-by: Steve Lhomme <robux4@ycbcr.xyz>
+---
+ modules/stream_out/chromaprint.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/modules/stream_out/chromaprint.c b/modules/stream_out/chromaprint.c
+index 80ec31ba2590..c76cbda3c2bb 100644
+--- a/modules/stream_out/chromaprint.c
++++ b/modules/stream_out/chromaprint.c
+@@ -231,7 +231,7 @@ static int Send( sout_stream_t *p_stream, sout_stream_id_sys_t *id,
+ if ( !p_sys->b_finished && id->i_samples > 0 && p_buf->i_buffer )
+ {
+ if(! chromaprint_feed( p_sys->p_chromaprint_ctx,
+- p_buf->p_buffer,
++ (int16_t *)p_buf->p_buffer,
+ p_buf->i_buffer / BYTESPERSAMPLE ) )
+ msg_Warn( p_stream, "feed error" );
+ id->i_samples -= i_samples;
+--
+GitLab
+
+
+From 6179d6b843f2a93af6a3d51c4244766e3eba9e77 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= <remi@remlab.net>
+Date: Sun, 14 Apr 2019 09:41:38 +0300
+Subject: [PATCH 2/9] win32: wrap {g,s}etsockopt()
+
+char * can alias anything, and Winsock relies on that. Unfortunately,
+the compiler still issues warnings. This works around that.
+
+(cherry picked from commit 36715d9b79f34824e126c2bc3aee2f1c1c16af46)
+Signed-off-by: Steve Lhomme <robux4@ycbcr.xyz>
+---
+ include/vlc_network.h | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+diff --git a/include/vlc_network.h b/include/vlc_network.h
+index 010454a01c09..e39ffd0bacaa 100644
+--- a/include/vlc_network.h
++++ b/include/vlc_network.h
+@@ -183,6 +183,22 @@ VLC_API int vlc_close(int);
+
+ /** @} */
+
++#ifdef _WIN32
++static inline int vlc_getsockopt(int s, int level, int name,
++ void *val, socklen_t *len)
++{
++ return getsockopt(s, level, name, (char *)val, len);
++}
++#define getsockopt vlc_getsockopt
++
++static inline int vlc_setsockopt(int s, int level, int name,
++ const void *val, socklen_t len)
++{
++ return setsockopt(s, level, name, (const char *)val, len);
++}
++#define setsockopt vlc_setsockopt
++#endif
++
+ /* Portable network names/addresses resolution layer */
+
+ #define NI_MAXNUMERICHOST 64
+--
+GitLab
+
+
+From 3391108f9709f0d77d9297c94371cf9cd30f2cbe Mon Sep 17 00:00:00 2001
+From: Steve Lhomme <robux4@ycbcr.xyz>
+Date: Thu, 7 Dec 2023 15:43:04 +0100
+Subject: [PATCH 3/9] netsync: use char for temporary local buffer
+
+On Windows recvfrom/revc/sendto expects a char*.
+---
+ modules/control/netsync.c | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+diff --git a/modules/control/netsync.c b/modules/control/netsync.c
+index 2a6a1a6a2bf8..8c91034d7cf2 100644
+--- a/modules/control/netsync.c
++++ b/modules/control/netsync.c
+@@ -181,7 +181,7 @@ static void *Master(void *handle)
+ intf_sys_t *sys = intf->p_sys;
+ for (;;) {
+ struct pollfd ufd = { .fd = sys->fd, .events = POLLIN, };
+- uint64_t data[2];
++ char data[16];
+
+ if (poll(&ufd, 1, -1) < 0)
+ continue;
+@@ -198,8 +198,8 @@ static void *Master(void *handle)
+ if (master_system < 0)
+ continue;
+
+- data[0] = hton64(mdate());
+- data[1] = hton64(master_system);
++ SetQWBE(&data[0], mdate());
++ SetQWBE(&data[8], master_system);
+
+ /* Reply to the sender */
+ sendto(sys->fd, data, 16, 0,
+@@ -224,7 +224,7 @@ static void *Slave(void *handle)
+
+ for (;;) {
+ struct pollfd ufd = { .fd = sys->fd, .events = POLLIN, };
+- uint64_t data[2];
++ char data[16];
+
+ vlc_tick_t system = GetPcrSystem(sys->input);
+ if (system < 0)
+@@ -233,7 +233,7 @@ static void *Slave(void *handle)
+ /* Send clock request to the master */
+ const vlc_tick_t send_date = mdate();
+
+- data[0] = hton64(system);
++ SetQWBE(&data[0], system);
+ send(sys->fd, data, 8, 0);
+
+ /* Don't block */
+@@ -244,8 +244,8 @@ static void *Slave(void *handle)
+ if (recv(sys->fd, data, 16, 0) < 16)
+ goto wait;
+
+- const vlc_tick_t master_date = ntoh64(data[0]);
+- const vlc_tick_t master_system = ntoh64(data[1]);
++ const vlc_tick_t master_date = GetQWBE(&data[0]);
++ const vlc_tick_t master_system = GetQWBE(&data[8]);
+ const vlc_tick_t diff_date = receive_date -
+ ((receive_date - send_date) / 2 + master_date);
+
+--
+GitLab
+
+
+From 27e584d7b9add8dbbb82b7227228e1ec1e25a089 Mon Sep 17 00:00:00 2001
+From: Steve Lhomme <robux4@ycbcr.xyz>
+Date: Tue, 3 Jan 2023 13:23:00 +0100
+Subject: [PATCH 4/9] access/dtv: move the lfind() Windows hack in the module
+
+So that we don't have to include search.h each time vlc_fixups.h is used.
+
+The Win32 prototype of lfind() expects an unsigned* for 'nelp', not a size_t*.
+
+(cherry picked from commit 7c43bcba27b6fe256456d93a9d32e10648f08da8)
+Signed-off-by: Steve Lhomme <robux4@ycbcr.xyz>
+---
+ include/vlc_fixups.h | 3 +++
+ modules/access/dtv/access.c | 5 +++++
+ 2 files changed, 8 insertions(+)
+
+diff --git a/include/vlc_fixups.h b/include/vlc_fixups.h
+index 37f788933779..861cb4cc5063 100644
+--- a/include/vlc_fixups.h
++++ b/include/vlc_fixups.h
+@@ -501,8 +501,11 @@ void *tsearch( const void *key, void **rootp, int(*cmp)(const void *, const void
+ void *tfind( const void *key, const void **rootp, int(*cmp)(const void *, const void *) );
+ void *tdelete( const void *key, void **rootp, int(*cmp)(const void *, const void *) );
+ void twalk( const void *root, void(*action)(const void *nodep, VISIT which, int depth) );
++#ifndef _WIN32
++/* the Win32 prototype of lfind() expects an unsigned* for 'nmemb' */
+ void *lfind( const void *key, const void *base, size_t *nmemb,
+ size_t size, int(*cmp)(const void *, const void *) );
++#endif
+ #endif /* HAVE_SEARCH_H */
+ #ifndef HAVE_TDESTROY
+ void tdestroy( void *root, void (*free_node)(void *nodep) );
+diff --git a/modules/access/dtv/access.c b/modules/access/dtv/access.c
+index d9756c7b4885..c6ca5005883c 100644
+--- a/modules/access/dtv/access.c
++++ b/modules/access/dtv/access.c
+@@ -32,6 +32,11 @@
+ #ifdef HAVE_SEARCH_H
+ #include <search.h>
+ #endif
++#if defined(_WIN32)
++/* the Win32 prototype of lfind() expects an unsigned* for 'nelp' */
++# define lfind(a,b,c,d,e) \
++ lfind((a),(b), &(unsigned){ (*(c) > UINT_MAX) ? UINT_MAX : *(c) }, (d),(e))
++#endif
+
+ #include "dtv/dtv.h"
+
+--
+GitLab
+
+
+From 5a9ca37a95b6e85e6beaaefba9aa4a886a45411c Mon Sep 17 00:00:00 2001
+From: Steve Lhomme <robux4@ycbcr.xyz>
+Date: Mon, 15 Jul 2019 12:41:29 +0200
+Subject: [PATCH 5/9] vlc_common: fix swab() calls on win32 that don't use
+ const on source pointer
+
+(cherry picked from commit a9e0b1124e19225b903a2926951781e84002c410)
+Signed-off-by: Steve Lhomme <robux4@ycbcr.xyz>
+---
+ include/vlc_common.h | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/include/vlc_common.h b/include/vlc_common.h
+index 8090b277150d..089878581763 100644
+--- a/include/vlc_common.h
++++ b/include/vlc_common.h
+@@ -947,6 +947,11 @@ static inline void SetQWLE (void *p, uint64_t qw)
+ # define O_NONBLOCK 0
+ # endif
+
++/* the mingw32 swab() and win32 _swab() prototypes expect a char* instead of a
++ const void* */
++# define swab(a,b,c) swab((char*) (a), (char*) (b), (c))
++
++
+ # include <tchar.h>
+ #endif /* _WIN32 */
+
+--
+GitLab
+
+
+From b758e19479a80604e3feb470b197e4a13a203a85 Mon Sep 17 00:00:00 2001
+From: Steve Lhomme <robux4@ycbcr.xyz>
+Date: Wed, 10 Jul 2019 08:23:45 +0200
+Subject: [PATCH 6/9] avcodec: encoder: fix MPEG4 matrix passed as const
+
+lavc expects a pointer that it will free in avcodec_free_context().
+
+(cherry picked from commit d86c4c87aa78130a4fd00294e25df865d0e2b327)
+Signed-off-by: Steve Lhomme <robux4@ycbcr.xyz>
+---
+ modules/codec/avcodec/encoder.c | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/modules/codec/avcodec/encoder.c b/modules/codec/avcodec/encoder.c
+index 2b1c3604713d..4919ccf0e0e4 100644
+--- a/modules/codec/avcodec/encoder.c
++++ b/modules/codec/avcodec/encoder.c
+@@ -588,8 +588,14 @@ int InitVideoEnc( vlc_object_t *p_this )
+
+ if ( p_sys->b_mpeg4_matrix )
+ {
+- p_context->intra_matrix = mpeg4_default_intra_matrix;
+- p_context->inter_matrix = mpeg4_default_non_intra_matrix;
++ p_context->intra_matrix = av_malloc( sizeof(mpeg4_default_intra_matrix) );
++ if ( p_context->intra_matrix )
++ memcpy( p_context->intra_matrix, mpeg4_default_intra_matrix,
++ sizeof(mpeg4_default_intra_matrix));
++ p_context->inter_matrix = av_malloc( sizeof(mpeg4_default_non_intra_matrix) );
++ if ( p_context->inter_matrix )
++ memcpy( p_context->inter_matrix, mpeg4_default_non_intra_matrix,
++ sizeof(mpeg4_default_non_intra_matrix));
+ }
+
+ if ( p_sys->b_pre_me )
+--
+GitLab
+
+
+From 55be3ce60795a09d13861c5637c1fe7aebc5ce8b Mon Sep 17 00:00:00 2001
+From: Steve Lhomme <robux4@ycbcr.xyz>
+Date: Thu, 7 Dec 2023 14:18:22 +0100
+Subject: [PATCH 7/9] smb: fix potential string to wide string copy
+
+The type of net_resource depends on the UNICODE define.
+---
+ modules/access/smb.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/modules/access/smb.c b/modules/access/smb.c
+index 5fe56f0c9dfe..6add2a3e6278 100644
+--- a/modules/access/smb.c
++++ b/modules/access/smb.c
+@@ -524,7 +524,7 @@ static void Win32AddConnection( stream_t *p_access, const char *psz_server,
+ const char *psz_pwd, const char *psz_domain )
+ {
+ char psz_remote[MAX_PATH];
+- NETRESOURCE net_resource;
++ NETRESOURCEA net_resource;
+ DWORD i_result;
+ VLC_UNUSED( psz_domain );
+
+@@ -544,7 +544,7 @@ static void Win32AddConnection( stream_t *p_access, const char *psz_server,
+
+ net_resource.lpRemoteName = psz_remote;
+
+- i_result = WNetAddConnection2( &net_resource, psz_pwd, psz_user, 0 );
++ i_result = WNetAddConnection2A( &net_resource, psz_pwd, psz_user, 0 );
+
+ if( i_result != NO_ERROR )
+ {
+--
+GitLab
+
+
+From 5ae924bf212dce64a6424561d92426dbcc2cf3a0 Mon Sep 17 00:00:00 2001
+From: Steve Lhomme <robux4@ycbcr.xyz>
+Date: Wed, 6 Dec 2023 14:45:46 +0100
+Subject: [PATCH 8/9] dxva2: add missing mask initializers
+
+---
+ modules/codec/avcodec/dxva2.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c
+index 18b872fe0fe3..2e6809a05410 100644
+--- a/modules/codec/avcodec/dxva2.c
++++ b/modules/codec/avcodec/dxva2.c
+@@ -84,12 +84,12 @@ DEFINE_GUID(DXVA_Intel_H264_NoFGT_ClearVideo, 0x604F8E68, 0x4951, 0x4c54,
+
+ /* XXX Preferred format must come first */
+ static const d3d9_format_t d3d_formats[] = {
+- { "YV12", MAKEFOURCC('Y','V','1','2'), VLC_CODEC_YV12 },
+- { "NV12", MAKEFOURCC('N','V','1','2'), VLC_CODEC_NV12 },
+- //{ "IMC3", MAKEFOURCC('I','M','C','3'), VLC_CODEC_YV12 },
+- { "P010", MAKEFOURCC('P','0','1','0'), VLC_CODEC_P010 },
++ { "YV12", MAKEFOURCC('Y','V','1','2'), VLC_CODEC_YV12, 0,0,0 },
++ { "NV12", MAKEFOURCC('N','V','1','2'), VLC_CODEC_NV12, 0,0,0 },
++ //{ "IMC3", MAKEFOURCC('I','M','C','3'), VLC_CODEC_YV12, 0,0,0 },
++ { "P010", MAKEFOURCC('P','0','1','0'), VLC_CODEC_P010, 0,0,0 },
+
+- { NULL, 0, 0 }
++ { NULL, 0, 0, 0,0,0 }
+ };
+
+ static const d3d9_format_t *D3dFindFormat(D3DFORMAT format)
+--
+GitLab
+
+
+From 08c7a66780740679ba1b0abe9e30e73afc6bc271 Mon Sep 17 00:00:00 2001
+From: Steve Lhomme <robux4@ycbcr.xyz>
+Date: Wed, 6 Dec 2023 07:48:29 +0100
+Subject: [PATCH 9/9] win32/modules: use cast with GetProcAddress function
+ pointers
+
+---
+ src/text/url.c | 3 ++-
+ src/win32/plugin.c | 3 ++-
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/src/text/url.c b/src/text/url.c
+index b962eb31f849..2eb4b8d10817 100644
+--- a/src/text/url.c
++++ b/src/text/url.c
+@@ -892,7 +892,8 @@ static int IdnToAscii(DWORD flags, LPCWSTR str, int len, LPWSTR buf, int size)
+ int (WINAPI *IdnToAsciiReal)(DWORD, LPCWSTR, int, LPWSTR, int);
+ int ret = 0;
+
+- IdnToAsciiReal = GetProcAddress(h, "IdnToAscii");
++ IdnToAsciiReal = (int (WINAPI *)(DWORD, LPCWSTR, int, LPWSTR, int))
++ GetProcAddress(h, "IdnToAscii");
+ if (IdnToAsciiReal != NULL)
+ ret = IdnToAsciiReal(flags, str, len, buf, size);
+ else
+diff --git a/src/win32/plugin.c b/src/win32/plugin.c
+index 1a65521fca75..b5c336eb99ca 100644
+--- a/src/win32/plugin.c
++++ b/src/win32/plugin.c
+@@ -45,7 +45,8 @@ static BOOL WINAPI SetThreadErrorModeFallback(DWORD mode, DWORD *oldmode)
+
+ BOOL (WINAPI *SetThreadErrorModeReal)(DWORD, DWORD *);
+
+- SetThreadErrorModeReal = GetProcAddress(h, "SetThreadErrorMode");
++ SetThreadErrorModeReal = (BOOL (WINAPI *)(DWORD, DWORD *))
++ GetProcAddress(h, "SetThreadErrorMode");
+ if (SetThreadErrorModeReal != NULL)
+ return SetThreadErrorModeReal(mode, oldmode);
+
+--
+GitLab
+
diff --git a/multimedia/vlc/vlc.SlackBuild b/multimedia/vlc/vlc.SlackBuild
index 15f5b8c261..5066701648 100644
--- a/multimedia/vlc/vlc.SlackBuild
+++ b/multimedia/vlc/vlc.SlackBuild
@@ -116,6 +116,9 @@ find -L . \
\( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \
-exec chmod 644 {} \+
+patch -p1 < $CWD/4645.patch
+patch -p1 < $CWD/4665.patch
+
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
LDFLAGS="$SLKLDFLAGS" \
@@ -135,6 +138,7 @@ LDFLAGS="$SLKLDFLAGS" \
$runasroot \
$aom \
$lua
+sed -i -e '/^#define _FORTIFY_SOURCE/d' config.h
make
make DESTDIR=$PKG install
diff --git a/multimedia/vokoscreenNG/vokoscreenNG.SlackBuild b/multimedia/vokoscreenNG/vokoscreenNG.SlackBuild
index 82876bc2fa..c157ca9020 100644
--- a/multimedia/vokoscreenNG/vokoscreenNG.SlackBuild
+++ b/multimedia/vokoscreenNG/vokoscreenNG.SlackBuild
@@ -78,7 +78,7 @@ find -L . \
patch -Np1 -i $CWD/0001-Add-better-integration-for-Linux.patch
-qmake PREFIX=/usr QMAKE_CXXFLAGS="$SLKCFLAGS" src/vokoscreenNG.pro
+qmake6 PREFIX=/usr QMAKE_CXXFLAGS="$SLKCFLAGS" src/vokoscreenNG.pro
make
make INSTALL_ROOT=$PKG install
diff --git a/multimedia/vvenc/README b/multimedia/vvenc/README
index e730b8c6df..4cc2bb4e6d 100644
--- a/multimedia/vvenc/README
+++ b/multimedia/vvenc/README
@@ -5,15 +5,6 @@ by running the following:
vvencapp --help
vvencFFapp --help
-Two issues with the 32bit build currently exist:
-
- 1. VVenC does not currently build on 32bit Linux
- although a fix for this is in progress upstream;
- see Issue 242 on the VVenC github site.
- 2. When failure to build is addressed it is unlikely
- that the memory limits of 32bit processors will allow
- effective encoding.
-
-Note that playback of H.266/VVC files is also currently a
-little challenging under Linux, although 3rd party patches
-for FFmpeg exist.
+Note that playback of H.266/VVC files is currently a little
+challenging under Linux, although 3rd party patches for FFmpeg
+exist.
diff --git a/multimedia/vvenc/vvenc.SlackBuild b/multimedia/vvenc/vvenc.SlackBuild
index c2fbedcf44..c1f179f699 100644
--- a/multimedia/vvenc/vvenc.SlackBuild
+++ b/multimedia/vvenc/vvenc.SlackBuild
@@ -2,7 +2,7 @@
# ----------------------------------------------------------------------
# Slackware build script for vvenc
#
-# Copyright (c) 2023 Andrew Strong, Blue Mountains, Australia.
+# Copyright (c) 2023-2024 Andrew Strong, Blue Mountains, Australia.
#
# Permission to use, copy, modify, and distribute this software for
# any purpose with or without fee is hereby granted, provided that
@@ -26,7 +26,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=vvenc
-VERSION=${VERSION:-1.7.0}
+VERSION=${VERSION:-1.11.1}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -86,6 +86,7 @@ cd build
-DCMAKE_INSTALL_LIBDIR:PATH=lib${LIBDIRSUFFIX} \
-DCMAKE_INSTALL_INCLUDEDIR:PATH=include \
-DBUILD_SHARED_LIBS=1 \
+ -DVVENC_INSTALL_FULLFEATURE_APP=on \
-DCMAKE_BUILD_TYPE=Release ..
make
make install DESTDIR=$PKG
diff --git a/multimedia/vvenc/vvenc.info b/multimedia/vvenc/vvenc.info
index af0bda914c..6751c31e78 100644
--- a/multimedia/vvenc/vvenc.info
+++ b/multimedia/vvenc/vvenc.info
@@ -1,10 +1,10 @@
PRGNAM="vvenc"
-VERSION="1.7.0"
+VERSION="1.11.1"
HOMEPAGE="https://github.com/fraunhoferhhi/vvenc"
-DOWNLOAD="UNSUPPORTED"
-MD5SUM=""
-DOWNLOAD_x86_64="https://github.com/fraunhoferhhi/vvenc/archive/v1.7.0/vvenc-1.7.0.tar.gz"
-MD5SUM_x86_64="bd14534787f4180cd5bebb248b27285f"
+DOWNLOAD="https://github.com/fraunhoferhhi/vvenc/archive/v1.11.1/vvenc-1.11.1.tar.gz"
+MD5SUM="c3267221f7d0f74fe58d751188c2efbb"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
REQUIRES=""
MAINTAINER="Andrew Strong"
EMAIL="andrew.david.strong@gmail.com"
diff --git a/multimedia/w_scan_cpp/w_scan_cpp.SlackBuild b/multimedia/w_scan_cpp/w_scan_cpp.SlackBuild
index d12732059e..8851345c45 100644
--- a/multimedia/w_scan_cpp/w_scan_cpp.SlackBuild
+++ b/multimedia/w_scan_cpp/w_scan_cpp.SlackBuild
@@ -26,10 +26,10 @@ cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=w_scan_cpp
VERSION=${VERSION:-20231015}
-VERSION_vdr=${VERSION_vdr:-2.6.5}
+VERSION_vdr=${VERSION_vdr:-2.6.7}
VERSION_satip=${VERSION_satip:-2.4.1}
VERSION_wirbelscan=${VERSION_wirbelscan:-2023.10.15}
-BUILD=${BUILD:-1}
+BUILD=${BUILD:-2}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
NUMJOBS=${NUMJOBS:-" -j$(nproc) "}
diff --git a/multimedia/w_scan_cpp/w_scan_cpp.info b/multimedia/w_scan_cpp/w_scan_cpp.info
index fc22ea9bb1..2749833793 100644
--- a/multimedia/w_scan_cpp/w_scan_cpp.info
+++ b/multimedia/w_scan_cpp/w_scan_cpp.info
@@ -4,11 +4,11 @@ HOMEPAGE="https://www.gen2vdr.de/wirbel/w_scan_cpp/index2.html"
DOWNLOAD="https://www.gen2vdr.de/wirbel/w_scan_cpp/w_scan_cpp-20231015.tar.bz2 \
https://www.gen2vdr.de/wirbel/wirbelscan/vdr-wirbelscan-2023.10.15.tgz \
https://github.com/rofafor/vdr-plugin-satip/archive/v2.4.1/vdr-plugin-satip-2.4.1.tar.gz \
- https://github.com/vdr-projects/vdr/archive/2.6.5/vdr-2.6.5.tar.gz"
+ https://github.com/vdr-projects/vdr/archive/2.6.7/vdr-2.6.7.tar.gz"
MD5SUM="ac6bca5260c571f81648bf735c0731b8 \
8a012699c1dd1e6ef9b8dd2ddc60d6af \
cd9ff5d2b47c3e55d64dbc375f84a5a7 \
- ded2dd49fd81368d5789393ed087c382"
+ 8da42e7f522f0a5c53ec28256275688e"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="pugixml librepfunc"
diff --git a/multimedia/winff/changelog b/multimedia/winff/changelog
index a67e2f90bc..e464b2ee64 100644
--- a/multimedia/winff/changelog
+++ b/multimedia/winff/changelog
@@ -121,3 +121,8 @@ Resubmit to SBo
Modify the SlackBuild to avoid creating object code files to /usr/share/lazarus
when compiling winff and remove unused function in doinst.sh Thanks to Andrew Clemons
for pointing it out.
+
+27/04/2024:
+
+Updated to version 1.6.4
+Fixed dead links. Fix documentation to properly open the pdf.
diff --git a/multimedia/winff/patches/unit1-pas.patch b/multimedia/winff/patches/unit1-pas.patch
index 402e4634a9..cb6ddd2217 100644
--- a/multimedia/winff/patches/unit1-pas.patch
+++ b/multimedia/winff/patches/unit1-pas.patch
@@ -1,5 +1,5 @@
---- unit1.pas 2023-10-03 19:20:47.000000000 +0530
-+++ unit1n.pas 2024-01-10 22:26:54.221464261 +0530
+--- unit1.pas 2024-04-17 01:41:03.000000000 +0530
++++ unit1n.pas 2024-04-25 19:19:53.307142871 +0530
@@ -1,8 +1,8 @@
unit Unit1;
@@ -9,35 +9,39 @@
-// http://winff.org
+// https://github.com/WinFF/winff
// Licensed under the GPL v3 or any later version
- //
+
// This program is free software: you can redistribute it and/or modify
-@@ -1988,16 +1988,16 @@
- language:=leftstr(lang,2);
- {$ifdef unix}
- s :='';
-- if fileexists('/usr/share/doc/winff/WinFF.' + language + '.pdf.gz') then s:='/usr/share/doc/winff/WinFF.' + language + '.pdf.gz';
-- if fileexists('/usr/share/doc/winff/WinFF.' + language + '.pdf') then s:='/usr/share/doc/winff/WinFF.' + language + '.pdf';
-+ if fileexists('/usr/share/doc/winff/WinFF.' + language + '.pdf.gz') then s:='/usr/doc/winff-20231003_31b79e3/WinFF.' + language + '.pdf.gz';
-+ if fileexists('/usr/share/doc/winff/WinFF.' + language + '.pdf') then s:='/usr/doc/winff-20231003_31b79e3/WinFF.' + language + '.pdf';
- if fileexists('/usr/share/winff/WinFF.' + language + '.pdf') then s:='/usr/share/winff/WinFF.' + language + '.pdf';
- if fileexists('/usr/share/winff/WinFF.' + language + '.pdf.gz') then s:='/usr/share/winff/WinFF.' + language + '.pdf.gz';
- if fileexists('/usr/share/doc/packages/winff/WinFF.' + language + '.pdf.gz') then s:='/usr/share/doc/packages/winff/WinFF.' + language + '.pdf.gz';
- if fileexists('/usr/share/doc/packages/winff/WinFF.' + language + '.pdf') then s:='/usr/share/doc/packages/winff/WinFF.' + language + '.pdf';
- if s='' then
- begin
-- s := '/usr/share/doc/winff/WinFF.en.pdf.gz';
-- if fileexists('/usr/share/doc/winff/WinFF.en.pdf') then s:='/usr/share/doc/winff/WinFF.en.pdf';
-+ s := '/usr/doc/winff-20231003_31b79e3/WinFF.en.pdf.gz';
-+ if fileexists('/usr/doc/winff-20231003_31b79e3/WinFF.en.pdf') then s:='/usr/doc/winff-20231003_31b79e3/WinFF.en.pdf';
- if fileexists('/usr/share/winff/WinFF.en.pdf') then s:='/usr/share/winff/WinFF.en.pdf';
- if fileexists('/usr/share/winff/WinFF.en.pdf.gz') then s:='/usr/share/winff/WinFF.en.pdf.gz';
- if fileexists('/usr/share/doc/packages/winff/WinFF.en.pdf.gz') then s:='/usr/share/doc/packages/winff/WinFF.en.pdf.gz';
-@@ -2015,7 +2015,7 @@
+@@ -1795,20 +1795,12 @@
+ language:=leftstr(lang,2);
+ {$ifdef unix}
+ s :='';
+- if fileexists('/usr/share/doc/winff/WinFF.' + language + '.pdf.gz') then s:='/usr/share/doc/winff/WinFF.' + language + '.pdf.gz';
+- if fileexists('/usr/share/doc/winff/WinFF.' + language + '.pdf') then s:='/usr/share/doc/winff/WinFF.' + language + '.pdf';
+- if fileexists('/usr/share/winff/WinFF.' + language + '.pdf') then s:='/usr/share/winff/WinFF.' + language + '.pdf';
+- if fileexists('/usr/share/winff/WinFF.' + language + '.pdf.gz') then s:='/usr/share/winff/WinFF.' + language + '.pdf.gz';
+- if fileexists('/usr/share/doc/packages/winff/WinFF.' + language + '.pdf.gz') then s:='/usr/share/doc/packages/winff/WinFF.' + language + '.pdf.gz';
+- if fileexists('/usr/share/doc/packages/winff/WinFF.' + language + '.pdf') then s:='/usr/share/doc/packages/winff/WinFF.' + language + '.pdf';
++ if fileexists('/usr/doc/winff-1.6.4/WinFF.' + language + '.pdf.gz') then s:='/usr/doc/winff-1.6.4/WinFF.' + language + '.pdf.gz';
++ if fileexists('/usr/doc/winff-1.6.4/WinFF.' + language + '.pdf') then s:='/usr/doc/winff-1.6.4/WinFF.' + language + '.pdf';
+ if s='' then
+ begin
+- s := '/usr/share/doc/winff/WinFF.en.pdf.gz';
+- if fileexists('/usr/share/doc/winff/WinFF.en.pdf') then s:='/usr/share/doc/winff/WinFF.en.pdf';
+- if fileexists('/usr/share/winff/WinFF.en.pdf') then s:='/usr/share/winff/WinFF.en.pdf';
+- if fileexists('/usr/share/winff/WinFF.en.pdf.gz') then s:='/usr/share/winff/WinFF.en.pdf.gz';
+- if fileexists('/usr/share/doc/packages/winff/WinFF.en.pdf.gz') then s:='/usr/share/doc/packages/winff/WinFF.en.pdf.gz';
+- if fileexists('/usr/share/doc/packages/winff/WinFF.en.pdf') then s:='/usr/share/doc/packages/winff/WinFF.en.pdf';
++ s := '/usr/doc/winff-1.6.4/WinFF.en.pdf.gz';
++ if fileexists('/usr/doc/winff-1.6.4/WinFF.en.pdf') then s:='/usr/doc/winff-1.6.4/WinFF.en.pdf';
+ end;
+ {$endif}
+ {$IFDEF WINDOWS}
+@@ -1821,7 +1813,7 @@
+ //menu: Help Forums
procedure TfrmMain.mitForumsClick(Sender: TObject);
-
begin
-- launchbrowser('https://groups.google.com/g/winff');
-+ launchbrowser('https://github.com/WinFF/winff/issues');
+- launchbrowser('https://groups.google.com/g/winff');
++ launchbrowser('http://github.com/WinFF/winff/issues');
end;
procedure TfrmMain.mitRestoreDefaultsClick(Sender: TObject);
diff --git a/multimedia/winff/patches/unit3-pas.patch b/multimedia/winff/patches/unit3-pas.patch
index 1d99d96642..5f8dd7c238 100644
--- a/multimedia/winff/patches/unit3-pas.patch
+++ b/multimedia/winff/patches/unit3-pas.patch
@@ -1,7 +1,8 @@
---- unit3.pas 2024-02-19 19:19:13.000000000 +0530
-+++ unit3n.pas 2024-02-27 18:15:24.377843083 +0530
-@@ -1,8 +1,8 @@
- unit Unit3;
+--- unit3.pas 2024-04-17 01:41:03.000000000 +0530
++++ unit3n.pas 2024-04-25 17:30:56.674161644 +0530
+@@ -2,9 +2,9 @@
+
+ // About form
-// WInFF 1.0 Copyright 2006-2013 Matthew Weatherford
+// WInFF 1.0 Copyright 2006-2024 Matthew Weatherford
@@ -9,69 +10,69 @@
-// http://winff.org
+// https://github.com/WinFF/winff
// Licensed under the GPL v3 or any later version
- //
+
// This program is free software: you can redistribute it and/or modify
-@@ -62,7 +62,6 @@
- procedure lblBellardClick(Sender: TObject);
- procedure lblGeversClick(Sender: TObject);
- procedure lblStoffbergClick(Sender: TObject);
-- procedure lblGmaqClick(Sender: TObject);
- procedure lblURLZeranoClick(Sender: TObject);
- procedure lblWeatherfordClick(Sender: TObject);
- procedure lblURLWinffOrgClick(Sender: TObject);
-@@ -132,27 +131,22 @@
+@@ -60,7 +60,6 @@
+ procedure lblBellardClick(Sender: TObject);
+ procedure lblGeversClick(Sender: TObject);
+ procedure lblStoffbergClick(Sender: TObject);
+- procedure lblGmaqClick(Sender: TObject);
+ procedure lblURLZeranoClick(Sender: TObject);
+ procedure lblWeatherfordClick(Sender: TObject);
+ procedure lblURLWinffOrgClick(Sender: TObject);
+@@ -128,27 +127,22 @@
procedure TfrmAbout.lblBellardClick(Sender: TObject);
begin
-
-+ frmMain.LaunchBrowser('https://bellard.org/');
++ frmMain.LaunchBrowser('https://bellard.org/');
end;
procedure TfrmAbout.lblGeversClick(Sender: TObject);
begin
-- frmMain.LaunchBrowser('https://launchpad.net/~paul-climbing/+archive/ppa/');
-+ frmMain.LaunchBrowser('https://tracker.debian.org/pkg/winff');
+- frmMain.LaunchBrowser('https://launchpad.net/~paul-climbing/+archive/ppa/');
++ frmMain.LaunchBrowser('https://tracker.debian.org/pkg/winff');
end;
procedure TfrmAbout.lblStoffbergClick(Sender: TObject);
begin
--frmMain.LaunchBrowser('http://istoff.blogspot.com');
+- frmMain.LaunchBrowser('http://istoff.blogspot.com');
-end;
-
-procedure TfrmAbout.lblGmaqClick(Sender: TObject);
-begin
-- frmMain.LaunchBrowser('http://www.bandshed.net/');
-+frmMain.LaunchBrowser('https://istoff.blogspot.com');
+- frmMain.LaunchBrowser('http://www.bandshed.net/');
++ frmMain.LaunchBrowser('https://istoff.blogspot.com');
end;
procedure TfrmAbout.lblURLZeranoClick(Sender: TObject);
begin
-- frmMain.LaunchBrowser('http://ffmpeg.zeranoe.com');
-+ frmMain.LaunchBrowser('https://www.gyan.dev/ffmpeg/builds');
+- frmMain.LaunchBrowser('http://ffmpeg.zeranoe.com');
++ frmMain.LaunchBrowser('https://www.gyan.dev/ffmpeg/builds');
end;
procedure TfrmAbout.btnOkClick(Sender: TObject);
-@@ -162,7 +156,7 @@
+@@ -158,7 +152,7 @@
procedure TfrmAbout.lblWeatherfordClick(Sender: TObject);
begin
-- frmMain.LaunchBrowser('http://www.biggmatt.com');
-+ frmMain.LaunchBrowser('https://www.biggmatt.com/p/winff.html');
+- frmMain.LaunchBrowser('http://www.biggmatt.com');
++ frmMain.LaunchBrowser('https://github.com/WinFF/winff');
end;
procedure TfrmAbout.lblURLWinffOrgClick(Sender: TObject);
-@@ -172,12 +166,12 @@
+@@ -168,12 +162,12 @@
procedure TfrmAbout.lblURLffmpegClick(Sender: TObject);
begin
-- frmMain.LaunchBrowser('http://ffmpeg.org/');
-+ frmMain.LaunchBrowser('https://ffmpeg.org/');
+- frmMain.LaunchBrowser('http://ffmpeg.org/');
++ frmMain.LaunchBrowser('https://ffmpeg.org/');
end;
procedure TfrmAbout.lblwinbuildsClick(Sender: TObject);
begin
-- frmMain.LaunchBrowser('http://ffmpeg.zeranoe.com/builds/');
-+ frmMain.LaunchBrowser('https://www.gyan.dev/ffmpeg/builds');
+- frmMain.LaunchBrowser('http://ffmpeg.zeranoe.com/builds/');
++ frmMain.LaunchBrowser('https://www.gyan.dev/ffmpeg/builds');
end;
procedure TfrmAbout.lblWindowsBuildsClick(Sender: TObject);
diff --git a/multimedia/winff/patches/winff-lpi.patch b/multimedia/winff/patches/winff-lpi.patch
index 663bce1c32..5c606b7ec4 100644
--- a/multimedia/winff/patches/winff-lpi.patch
+++ b/multimedia/winff/patches/winff-lpi.patch
@@ -1,5 +1,5 @@
---- winff.lpi 2023-10-03 19:20:47.000000000 +0530
-+++ winffn.lpi 2024-01-10 22:47:30.406244263 +0530
+--- winff.lpi 2024-04-17 01:41:03.000000000 +0530
++++ winffn.lpi 2024-04-25 17:33:23.998161221 +0530
@@ -20,7 +20,7 @@
<MajorVersionNr Value="1"/>
<MinorVersionNr Value="6"/>
@@ -9,23 +9,11 @@
</VersionInfo>
<BuildModes Count="1">
<Item1 Name="default" Default="True"/>
-@@ -117,6 +117,11 @@
- <UseAnsiStrings Value="False"/>
- </SyntaxOptions>
- </Parsing>
-+ <CodeGeneration>
-+ <Optimizations>
-+ <OptimizationLevel Value="2"/>
-+ </Optimizations>
-+ </CodeGeneration>
- <Linking>
- <Debugging>
- <DebugInfoType Value="dsStabs"/>
-@@ -124,7 +129,7 @@
- <LinkSmart Value="True"/>
+@@ -129,7 +129,7 @@
+ </Debugging>
<Options>
<PassLinkerOptions Value="True"/>
-- <LinkerOptions Value="--as-needed"/>
+- <LinkerOptions Value="--as-needed -zrelro -znow"/>
+ <LinkerOptions Value="--as-needed -zrelro -znow -zdefs -pie"/>
<Win32>
<GraphicApplication Value="True"/>
diff --git a/multimedia/winff/winff.SlackBuild b/multimedia/winff/winff.SlackBuild
index 70d2b7209e..52eb1ccfc3 100644
--- a/multimedia/winff/winff.SlackBuild
+++ b/multimedia/winff/winff.SlackBuild
@@ -31,7 +31,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=winff
-VERSION=${VERSION:-1.6.3}
+VERSION=${VERSION:-1.6.4}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
diff --git a/multimedia/winff/winff.info b/multimedia/winff/winff.info
index 5ac2f04f02..52aaafeaf7 100644
--- a/multimedia/winff/winff.info
+++ b/multimedia/winff/winff.info
@@ -1,8 +1,8 @@
PRGNAM="winff"
-VERSION="1.6.3"
+VERSION="1.6.4"
HOMEPAGE="https://github.com/WinFF/winff"
-DOWNLOAD="https://github.com/WinFF/winff/archive/winff-1.6.3/winff-winff-1.6.3.tar.gz"
-MD5SUM="7a85f02bd23acef5b916166f83586e82"
+DOWNLOAD="https://github.com/WinFF/winff/archive/winff-1.6.4/winff-winff-1.6.4.tar.gz"
+MD5SUM="23138be15b60bf3fcb1c11c634d44d16"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="libqtpas lazarus"
diff --git a/multimedia/xavs2/xavs2.SlackBuild b/multimedia/xavs2/xavs2.SlackBuild
index 64ac967293..d140ef2ae7 100644
--- a/multimedia/xavs2/xavs2.SlackBuild
+++ b/multimedia/xavs2/xavs2.SlackBuild
@@ -2,7 +2,7 @@
# Slackware build script for xavs2
-# Copyright 2022, Vijay Marcel
+# Copyright 2022-2024, Vijay Marcel
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -29,37 +29,31 @@ VERSION=${VERSION:-1.4}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
+sys_arch=${sys_arch:-$(uname -m)}
-if [ -z "$ARCH" ]; then
- case "$( uname -m )" in
- i?86) export ARCH=i586 ;;
- arm*) export ARCH=arm ;;
- *) export ARCH=$( uname -m ) ;;
- esac
-fi
+case "$sys_arch" in
+ x86_64) export ARCH=x86_64 ;;
+ *) echo "This program will not build on $sys_arch platform" && exit 1 ;;
+esac
TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
if [ "$ARCH" = "i586" ]; then
- SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ SLKCFLAGS="-march=i586 -mtune=i686 -pipe -O2 -fPIC"
LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
- SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ SLKCFLAGS="-march=i686 -mtune=i686 -pipe -O2 -fPIC"
LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
- SLKCFLAGS="-O2 -fPIC"
+ SLKCFLAGS="-march=x86-64 -mtune=generic -pipe -O2 -fPIC"
LIBDIRSUFFIX="64"
else
SLKCFLAGS="-O2"
LIBDIRSUFFIX=""
fi
-
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -74,7 +68,6 @@ cd $TMP
rm -rf $PRGNAM-$VERSION
tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
cd $PRGNAM-$VERSION
-cd build/linux/
chown -R root:root .
find -L . \
@@ -83,6 +76,7 @@ find -L . \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+cd build/linux/
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
./configure \
@@ -90,11 +84,10 @@ CXXFLAGS="$SLKCFLAGS" \
--libdir=/usr/lib${LIBDIRSUFFIX} \
--bindir=/usr/bin \
--enable-shared \
- --bit-depth='8' \
- --chroma-format='all' \
- --enable-lto \
- --system-libxavs2 \
- --enable-strip
+ --bit-depth=8 \
+ --chroma-format=all \
+ --enable-strip \
+ --disable-asm
make
make install DESTDIR=$PKG
@@ -105,7 +98,7 @@ cd ../..
rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" \
- | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+ | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded --remove-section=.comment --remove-section=.note 2> /dev/null || true
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cp -a COPYING README.md $PKG/usr/doc/$PRGNAM-$VERSION
diff --git a/multimedia/xavs2/xavs2.info b/multimedia/xavs2/xavs2.info
index 8ac339e43d..68dda4eedc 100644
--- a/multimedia/xavs2/xavs2.info
+++ b/multimedia/xavs2/xavs2.info
@@ -1,10 +1,10 @@
PRGNAM="xavs2"
VERSION="1.4"
HOMEPAGE="https://github.com/pkuvcl/xavs2"
-DOWNLOAD="https://github.com/pkuvcl/xavs2/archive/1.4/xavs2-1.4.tar.gz"
-MD5SUM="b776941aad474fed23da1d1eb0c0b720"
-DOWNLOAD_x86_64=""
-MD5SUM_x86_64=""
+DOWNLOAD="UNSUPPORTED"
+MD5SUM=""
+DOWNLOAD_x86_64="https://github.com/pkuvcl/xavs2/archive/1.4/xavs2-1.4.tar.gz"
+MD5SUM_x86_64="b776941aad474fed23da1d1eb0c0b720"
REQUIRES=""
MAINTAINER="Vijay Marcel"
EMAIL="vijaymarcel@outlook.com"