meta-openembedded: refresh master: 0435c9e193..4a9deabbc8

Update meta-openembedded to master HEAD.

Alistair Francis (7):
      python3-pyaudio: Initial commit
      python3-pyfann2: Initial commit
      python3-pocketsphinx: Initial commit
      python3-xxhash: Initial commit
      mycroft: Initial commit
      libfann: Initial commit
      python-cryptography: Bump from 2.4.1 to 2.6.1

Andreas Müller (10):
      xfce4-screenshooter: upgrade 1.9.4 -> 1.9.5
      networkmanager: Fix upstream regex for 1.16
      networkmanager: fix build with musl
      gvfs: fix configure options and DDEPENDS
      rrdtool: fix build by disabling docs
      libpeas: rework gobject-introspection handling
      gvfs: Fix missing executable permission flags for files in libexec
      gnome-desktop3: remove gconf from DEPENDS
      gnome-desktop3: rework gobject-introspection handling
      gnome-desktop3: Disable libseccomp for all archs

Brad Bishop (1):
      libvncserver: enable split client/server packages

Fabio Berton (1):
      python*-requests: Update 2.20.1 -> 2.21.0

Gianfranco Costamagna (2):
      cpprest: fix build failure on 32bit systems, with upstream merged patch
      libmodbus: start to prefer version 3.1.4 as default

Hongxu Jia (1):
      dracut: fix udevdir not found

Khem Raj (5):
      ncmpc: Rename artist_screen to library_screen
      networkmanager: Fix build with clang
      alsa-oss: Upgrade to 1.1.8
      redis: Fix ocasional parallel build failure
      lcdproc: Fix parallel build

Nikolay Nizov (2):
      android-tools-conf: fix typo
      android-tools-conf: Make sure /dev/pts/0 exists

Oleksandr Kravchuk (2):
      fping: update to 4.2
      nuttcp: update to 7.3.3

Peter Kjellerstedt (1):
      doxygen: Make it build with ninja 1.9.0

Qi.Chen@windriver.com (2):
      openldap: add missing CVE tag to patch
      ipsec-tools: add missing CVE tags to patches

Randy MacLeod (2):
      imagemagic: upgrade to 7.0.8-35
      wolfssl: update to 3.15.8 and use github SRC_URI

Slater, Joseph (1):
      tcpreplay: update to version 4.3.2

Vincent Prince (4):
      Rsyslog: Add mmjsonparse to PACKAGECONFIG
      zeromq: bump version 4.2.5 => 4.3.1
      cppzmq: bump version 4.2.3 => 4.3.0
      czmq: bump version 4.1.1 => 4.2.0

Yi Zhao (3):
      python-engineio: add recipe
      python-socketio: add recipe
      python-flask-socketio

Zang Ruochen (4):
      augeas: upgrade 1.10.1 -> 1.11.0
      libedit: upgrade 20181209-3.1 -> 20190324-3.1
      mcelog: upgrade 161 -> 162
      lockfile-progs: upgrade 0.1.17 -> 0.1.18

leimaohui (1):
      Fix build error for armeb.

Change-Id: Ie79748c484bcf4fd28b3bde84e2194044e1c08a8
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
diff --git a/meta-openembedded/meta-oe/recipes-benchmark/fio/fio_3.12.bb b/meta-openembedded/meta-oe/recipes-benchmark/fio/fio_3.12.bb
index 2deb42d..e85e7c7 100644
--- a/meta-openembedded/meta-oe/recipes-benchmark/fio/fio_3.12.bb
+++ b/meta-openembedded/meta-oe/recipes-benchmark/fio/fio_3.12.bb
@@ -16,6 +16,7 @@
 PACKAGECONFIG_NUMA = "numa"
 # ARM does not currently support NUMA
 PACKAGECONFIG_NUMA_arm = ""
+PACKAGECONFIG_NUMA_armeb = ""
 
 PACKAGECONFIG ??= "${PACKAGECONFIG_NUMA}"
 PACKAGECONFIG[numa] = ",--disable-numa,numactl"
diff --git a/meta-openembedded/meta-oe/recipes-connectivity/zeromq/cppzmq_git.bb b/meta-openembedded/meta-oe/recipes-connectivity/zeromq/cppzmq_git.bb
index 9aff59c..11ea3be 100644
--- a/meta-openembedded/meta-oe/recipes-connectivity/zeromq/cppzmq_git.bb
+++ b/meta-openembedded/meta-oe/recipes-connectivity/zeromq/cppzmq_git.bb
@@ -4,8 +4,8 @@
 LIC_FILES_CHKSUM = "file://LICENSE;md5=db174eaf7b55a34a7c89551197f66e94"
 DEPENDS = "zeromq"
 
-SRCREV = "6aa3ab686e916cb0e62df7fa7d12e0b13ae9fae6"
-PV = "4.2.3+git${SRCPV}"
+SRCREV = "213da0b04ae3b4d846c9abc46bab87f86bfb9cf4"
+PV = "4.3.0"
 
 SRC_URI = "git://github.com/zeromq/cppzmq.git"
 
@@ -13,6 +13,8 @@
 
 inherit cmake
 
+EXTRA_OECMAKE = "-DCPPZMQ_BUILD_TESTS=OFF"
+
 PACKAGES = "${PN}-dev"
 
 RDEPENDS_${PN}-dev = "zeromq-dev"
diff --git a/meta-openembedded/meta-oe/recipes-connectivity/zeromq/czmq_4.1.1.bb b/meta-openembedded/meta-oe/recipes-connectivity/zeromq/czmq_4.1.1.bb
deleted file mode 100644
index f2db004..0000000
--- a/meta-openembedded/meta-oe/recipes-connectivity/zeromq/czmq_4.1.1.bb
+++ /dev/null
@@ -1,30 +0,0 @@
-DESCRIPTION = "C bindings for ZeroMQ"
-HOMEPAGE = "http://www.zeromq.org"
-LICENSE = "MPL-2.0"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=9741c346eef56131163e13b9db1241b3"
-DEPENDS = "zeromq"
-
-SRC_URI = "https://github.com/zeromq/czmq/releases/download/v${PV}/czmq-${PV}.tar.gz \
-    file://0001-Problem-out-of-date-with-zproject.patch \
-"
-
-SRC_URI[md5sum] = "6d3a6fdd25c2bb29897c53670dce97bf"
-SRC_URI[sha256sum] = "f00ff419881dc2a05d0686c8467cd89b4882677fc56f31c0e2cc81c134cbb0c0"
-
-inherit cmake
-
-PACKAGES = "lib${BPN} lib${BPN}-dev lib${BPN}-staticdev ${PN} ${PN}-dbg"
-
-FILES_${PN} = "${bindir}/*"
-FILES_lib${BPN} = "${libdir}/*.so.*"
-FILES_lib${BPN}-dev = "${libdir}/*.so ${libdir}/pkgconfig ${includedir}"
-FILES_lib${BPN}-staticdev = "${libdir}/lib*.a"
-
-RDEPENDS_lib${BPN}-dev = "zeromq-dev"
-
-PACKAGECONFIG ??= "lz4 uuid"
-PACKAGECONFIG[lz4] = ",-DCMAKE_DISABLE_FIND_PACKAGE_lz4=TRUE,lz4"
-PACKAGECONFIG[uuid] = ",-DCMAKE_DISABLE_FIND_PACKAGE_uuid=TRUE,util-linux"
-
-BBCLASSEXTEND = "nativesdk"
-
diff --git a/meta-openembedded/meta-oe/recipes-connectivity/zeromq/czmq_4.2.0.bb b/meta-openembedded/meta-oe/recipes-connectivity/zeromq/czmq_4.2.0.bb
new file mode 100644
index 0000000..4ec1c04
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-connectivity/zeromq/czmq_4.2.0.bb
@@ -0,0 +1,30 @@
+DESCRIPTION = "High-level C binding for 0MQ"
+HOMEPAGE = "http://czmq.zeromq.org/"
+LICENSE = "MPL-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=9741c346eef56131163e13b9db1241b3"
+DEPENDS = "zeromq"
+
+SRC_URI = "https://github.com/zeromq/czmq/releases/download/v${PV}/czmq-${PV}.tar.gz"
+
+SRC_URI[md5sum] = "7e09997db6ac3b25e8ed104053040722"
+SRC_URI[sha256sum] = "cfab29c2b3cc8a845749758a51e1dd5f5160c1ef57e2a41ea96e4c2dcc8feceb"
+
+inherit cmake
+
+PACKAGES = "lib${BPN} lib${BPN}-dev lib${BPN}-staticdev ${PN} ${PN}-dbg"
+
+FILES_${PN} = "${bindir}/*"
+FILES_lib${BPN} = "${libdir}/*.so.*"
+FILES_lib${BPN}-dev = "${libdir}/*.so ${libdir}/pkgconfig ${includedir} ${datadir}/cmake"
+FILES_lib${BPN}-staticdev = "${libdir}/lib*.a"
+
+RDEPENDS_lib${BPN}-dev = "zeromq-dev"
+
+PACKAGECONFIG ??= "lz4 uuid curl ${@bb.utils.filter('DISTRO_FEATURES', 'systemd', d)}"
+PACKAGECONFIG[lz4] = ",-DCMAKE_DISABLE_FIND_PACKAGE_lz4=TRUE,lz4"
+PACKAGECONFIG[uuid] = ",-DCMAKE_DISABLE_FIND_PACKAGE_uuid=TRUE,util-linux"
+PACKAGECONFIG[curl] = ",-DCMAKE_DISABLE_FIND_PACKAGE_libcurl=TRUE,curl"
+PACKAGECONFIG[systemd] = ",-DCMAKE_DISABLE_FIND_PACKAGE_systemd=TRUE,systemd"
+
+BBCLASSEXTEND = "nativesdk"
+
diff --git a/meta-openembedded/meta-oe/recipes-connectivity/zeromq/files/0001-Problem-out-of-date-with-zproject.patch b/meta-openembedded/meta-oe/recipes-connectivity/zeromq/files/0001-Problem-out-of-date-with-zproject.patch
deleted file mode 100644
index 5f5702c..0000000
--- a/meta-openembedded/meta-oe/recipes-connectivity/zeromq/files/0001-Problem-out-of-date-with-zproject.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From d155ffd33630f80b23c31b3a6e01da221dd9bd13 Mon Sep 17 00:00:00 2001
-From: Luca Boccassi <luca.boccassi@gmail.com>
-Date: Fri, 30 Mar 2018 16:36:22 +0100
-Subject: [PATCH] Problem: out of date with zproject
-
-Upstream-Status: backport
-Signed-off-by: Adrian Bunk <bunk@stusta.de>
-
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index a3b81722..4f203461 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -38,7 +38,7 @@ if (NOT CMAKE_BUILD_TYPE)
-             OUTPUT_STRIP_TRAILING_WHITESPACE
-         )
-         message(STATUS "git workspace root [${git_result}]: ${git_root}")
--        if ( "${git_result}" == "0" )
-+        if ( "${git_result}" STREQUAL "0" )
-             set (CMAKE_BUILD_TYPE Debug)
-         else ()
-             set (CMAKE_BUILD_TYPE Release)
-@@ -608,7 +608,7 @@ add_custom_command(
-     TARGET  distclean
- )
- 
--include(ClangFormat)
-+include(ClangFormat OPTIONAL)
- 
- ########################################################################
- # summary
-
diff --git a/meta-openembedded/meta-oe/recipes-connectivity/zeromq/zeromq_4.2.5.bb b/meta-openembedded/meta-oe/recipes-connectivity/zeromq/zeromq_4.2.5.bb
deleted file mode 100644
index 356348b..0000000
--- a/meta-openembedded/meta-oe/recipes-connectivity/zeromq/zeromq_4.2.5.bb
+++ /dev/null
@@ -1,32 +0,0 @@
-DESCRIPTION = "ZeroMQ looks like an embeddable networking library but acts like a concurrency framework"
-HOMEPAGE = "http://www.zeromq.org"
-LICENSE = "LGPLv3+"
-LIC_FILES_CHKSUM = "file://COPYING.LESSER;md5=d5311495d952062e0e4fbba39cbf3de1"
-
-PACKAGECONFIG ??= "libsodium"
-PACKAGECONFIG[libsodium] = "--with-libsodium, --without-libsodium, libsodium"
-
-SRC_URI = "http://github.com/zeromq/libzmq/releases/download/v${PV}/zeromq-${PV}.tar.gz \
-    file://run-ptest \
-"
-SRC_URI[md5sum] = "a1c95b34384257e986842f4d006957b8"
-SRC_URI[sha256sum] = "cc9090ba35713d59bb2f7d7965f877036c49c5558ea0c290b0dcc6f2a17e489f"
-
-S = "${WORKDIR}/zeromq-${PV}"
-
-#Uncomment to choose polling system manually. valid values are kqueue, epoll, devpoll, poll or select
-#EXTRA_OECONF += "--with-poller=kqueue"
-#CFLAGS_append = " -O0"
-#CXXFLAGS_append = " -O0"
-
-inherit autotools ptest pkgconfig
-
-do_compile_ptest () {
-    echo 'buildtest-TESTS: $(check_PROGRAMS)' >> ${B}/Makefile
-    oe_runmake buildtest-TESTS
-}
-
-do_install_ptest () {
-    install -d ${D}${PTEST_PATH}/tests
-    install -m 0755 ${B}/tests/.libs/test_* ${D}${PTEST_PATH}/tests
-}
diff --git a/meta-openembedded/meta-oe/recipes-connectivity/zeromq/zeromq_4.3.1.bb b/meta-openembedded/meta-oe/recipes-connectivity/zeromq/zeromq_4.3.1.bb
new file mode 100644
index 0000000..6e13376
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-connectivity/zeromq/zeromq_4.3.1.bb
@@ -0,0 +1,26 @@
+DESCRIPTION = "ZeroMQ looks like an embeddable networking library but acts like a concurrency framework"
+HOMEPAGE = "http://www.zeromq.org"
+LICENSE = "LGPLv3+"
+LIC_FILES_CHKSUM = "file://COPYING.LESSER;md5=d5311495d952062e0e4fbba39cbf3de1"
+
+PACKAGECONFIG ??= "libsodium"
+PACKAGECONFIG[libsodium] = "-DWITH_LIBSODIUM=ON,-DWITH_LIBSODIUM=OFF, libsodium"
+
+SRC_URI = "http://github.com/zeromq/libzmq/releases/download/v${PV}/zeromq-${PV}.tar.gz \
+    file://run-ptest \
+"
+SRC_URI[md5sum] = "64cbf3577afdbfda30358bc757a6ac83"
+SRC_URI[sha256sum] = "bcbabe1e2c7d0eec4ed612e10b94b112dd5f06fcefa994a0c79a45d835cd21eb"
+
+inherit cmake ptest pkgconfig
+
+EXTRA_OECMAKE = "${@bb.utils.contains('PTEST_ENABLED', '1', '-DBUILD_TESTS=ON', '-DBUILD_TESTS=OFF', d)} \
+                 -DCMAKE_SKIP_RPATH=ON \
+"
+
+do_install_ptest () {
+    install -d ${D}${PTEST_PATH}/tests
+    install -m 0755 ${B}/bin/test_* ${D}${PTEST_PATH}/tests
+}
+
+FILES_${PN}-doc += "${datadir}/zmq/*.txt"
diff --git a/meta-openembedded/meta-oe/recipes-devtools/android-tools/android-tools-conf/android-gadget-setup b/meta-openembedded/meta-oe/recipes-devtools/android-tools/android-tools-conf/android-gadget-setup
index f7d9973..beca353 100644
--- a/meta-openembedded/meta-oe/recipes-devtools/android-tools/android-tools-conf/android-gadget-setup
+++ b/meta-openembedded/meta-oe/recipes-devtools/android-tools/android-tools-conf/android-gadget-setup
@@ -1,5 +1,8 @@
 #!/bin/sh
 
+[ ! -e /dev/pts ] && mkdir -p /dev/pts
+[ ! -e /dev/pts/0 ] && mount devpts /dev/pts -t devpts
+
 # TODO enable the lines below once we have support for getprop
 # retrieve the product info from Android
 # manufacturer=$(getprop ro.product.manufacturer Android)
@@ -17,7 +20,7 @@
 echo $model > /sys/class/android_usb/android0/iProduct
 
 echo "0" > /sys/class/android_usb/android0/enable
-echo "18d1" > /sys/class/android_usbid_usb/android0/idVendor
+echo "18d1" > /sys/class/android_usb/android0/idVendor
 echo "D002" > /sys/class/android_usb/android0/idProduct
 echo "adb" > /sys/class/android_usb/android0/functions
 echo "1" >  /sys/class/android_usb/android0/enable
diff --git a/meta-openembedded/meta-oe/recipes-devtools/doxygen/doxygen_1.8.15.bb b/meta-openembedded/meta-oe/recipes-devtools/doxygen/doxygen_1.8.15.bb
index 7846846..2435b58 100644
--- a/meta-openembedded/meta-oe/recipes-devtools/doxygen/doxygen_1.8.15.bb
+++ b/meta-openembedded/meta-oe/recipes-devtools/doxygen/doxygen_1.8.15.bb
@@ -4,8 +4,6 @@
 LICENSE = "GPL-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=b234ee4d69f5fce4486a80fdaf4a4263"
 
-inherit cmake python3native
-
 DEPENDS = "flex-native bison-native"
 
 SRC_URI = "${SOURCEFORGE_MIRROR}/${BPN}/${BP}.src.tar.gz \
@@ -13,4 +11,11 @@
 SRC_URI[md5sum] = "2c98c73eba392d334f5bbaf15e09bae3"
 SRC_URI[sha256sum] = "bd9c0ec462b6a9b5b41ede97bede5458e0d7bb40d4cfa27f6f622eb33c59245d"
 
+inherit cmake python3native
+
+# Avoid the following error:
+#   ninja: error: build.ninja:1948: multiple rules generate
+#   generated_src/configvalues.h [-w dupbuild=err]
+EXTRA_OECMAKE_BUILD += "-w dupbuild=warn"
+
 BBCLASSEXTEND = "native"
diff --git a/meta-openembedded/meta-oe/recipes-devtools/libedit/libedit_20181209-3.1.bb b/meta-openembedded/meta-oe/recipes-devtools/libedit/libedit_20190324-3.1.bb
similarity index 81%
rename from meta-openembedded/meta-oe/recipes-devtools/libedit/libedit_20181209-3.1.bb
rename to meta-openembedded/meta-oe/recipes-devtools/libedit/libedit_20190324-3.1.bb
index c0a3d21..9d333e7 100644
--- a/meta-openembedded/meta-oe/recipes-devtools/libedit/libedit_20181209-3.1.bb
+++ b/meta-openembedded/meta-oe/recipes-devtools/libedit/libedit_20190324-3.1.bb
@@ -15,8 +15,8 @@
 SRC_URI = "http://www.thrysoee.dk/editline/${BPN}-${PV}.tar.gz \
            file://stdc-predef.patch \
           "
-SRC_URI[md5sum] = "22e945a0476e388e6f78bfc8d6e1192c"
-SRC_URI[sha256sum] = "2811d70c0b000f2ca91b7cb1a37203134441743c4fcc9c37b0b687f328611064"
+SRC_URI[md5sum] = "bec755c8044ad84b752dfe49a0b371d8"
+SRC_URI[sha256sum] = "ac8f0f51c1cf65492e4d1e3ed2be360bda41e54633444666422fbf393bba1bae"
 
 S = "${WORKDIR}/${BPN}-${PV}"
 
diff --git a/meta-openembedded/meta-oe/recipes-extended/lcdproc/lcdproc/0001-Fix-parallel-build-fix-port-internal-make-dependenci.patch b/meta-openembedded/meta-oe/recipes-extended/lcdproc/lcdproc/0001-Fix-parallel-build-fix-port-internal-make-dependenci.patch
new file mode 100644
index 0000000..8505ea3
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-extended/lcdproc/lcdproc/0001-Fix-parallel-build-fix-port-internal-make-dependenci.patch
@@ -0,0 +1,33 @@
+From 67d808b8739817c122bed8ba1a8308d01cb5ad0b Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sat, 6 Apr 2019 17:28:28 -0700
+Subject: [PATCH] Fix parallel build (fix port-internal make dependencies) on
+ many cores
+
+Upstream-Status: Pending
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ server/drivers/Makefile.am | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/server/drivers/Makefile.am b/server/drivers/Makefile.am
+index 0c23a9b..6777047 100644
+--- a/server/drivers/Makefile.am
++++ b/server/drivers/Makefile.am
+@@ -47,11 +47,11 @@ CwLnx_LDADD =        libLCD.a libbignum.a
+ futaba_LDADD =       @LIBUSB_LIBS@ @LIBUSB_1_0_LIBS@ libLCD.a
+ g15_LDADD =          @LIBG15@
+ glcd_LDADD =         libLCD.a @GLCD_DRIVERS@ @FT2_LIBS@ @LIBPNG_LIBS@ @LIBSERDISP@ @LIBUSB_LIBS@ @LIBX11_LIBS@
+-glcd_DEPENDENCIES =  @GLCD_DRIVERS@ glcd-glcd-render.o
++glcd_DEPENDENCIES =  @GLCD_DRIVERS@ glcd-glcd-render.o libLCD.a
+ glcdlib_LDADD =      @LIBGLCD@
+ glk_LDADD =          libbignum.a
+ hd44780_LDADD =      libLCD.a @HD44780_DRIVERS@ @HD44780_I2C@ @LIBUSB_LIBS@ @LIBFTDI_LIBS@ @LIBUGPIO@ libbignum.a
+-hd44780_DEPENDENCIES = @HD44780_DRIVERS@ @HD44780_I2C@
++hd44780_DEPENDENCIES = @HD44780_DRIVERS@ @HD44780_I2C@ libLCD.a libbignum.a
+ i2500vfd_LDADD =     @LIBFTDI_LIBS@
+ imon_LDADD =         libLCD.a libbignum.a
+ imonlcd_LDADD =      libLCD.a
+-- 
+2.21.0
+
diff --git a/meta-openembedded/meta-oe/recipes-extended/lcdproc/lcdproc_git.bb b/meta-openembedded/meta-oe/recipes-extended/lcdproc/lcdproc_git.bb
index 1354997..7ddc55f 100644
--- a/meta-openembedded/meta-oe/recipes-extended/lcdproc/lcdproc_git.bb
+++ b/meta-openembedded/meta-oe/recipes-extended/lcdproc/lcdproc_git.bb
@@ -11,8 +11,9 @@
 
 BASEPV = "0.5.9"
 PV = "${BASEPV}+git${SRCPV}"
-SRCREV = "a4b5a7e058fdd0d914a61138748b589c0128b45b"
+SRCREV = "e08546c13a4157ed98cd4a8e9086e7acd66f93c0"
 SRC_URI = "git://github.com/lcdproc/lcdproc \
+           file://0001-Fix-parallel-build-fix-port-internal-make-dependenci.patch \
            "
 
 S = "${WORKDIR}/git"
diff --git a/meta-openembedded/meta-oe/recipes-extended/libmodbus/libmodbus_3.1.4.bb b/meta-openembedded/meta-oe/recipes-extended/libmodbus/libmodbus_3.1.4.bb
index d438a0a..cc45fa7 100644
--- a/meta-openembedded/meta-oe/recipes-extended/libmodbus/libmodbus_3.1.4.bb
+++ b/meta-openembedded/meta-oe/recipes-extended/libmodbus/libmodbus_3.1.4.bb
@@ -1,7 +1,4 @@
 require libmodbus.inc
 
-# Use the stable branch by default
-DEFAULT_PREFERENCE = "-1"
-
 SRC_URI[md5sum] = "b1a8fd3a40d2db4de51fb0cbcb201806"
 SRC_URI[sha256sum] = "c8c862b0e9a7ba699a49bc98f62bdffdfafd53a5716c0e162696b4bf108d3637"
diff --git a/meta-openembedded/meta-oe/recipes-extended/lockfile-progs/lockfile-progs_0.1.17.bb b/meta-openembedded/meta-oe/recipes-extended/lockfile-progs/lockfile-progs_0.1.18.bb
similarity index 85%
rename from meta-openembedded/meta-oe/recipes-extended/lockfile-progs/lockfile-progs_0.1.17.bb
rename to meta-openembedded/meta-oe/recipes-extended/lockfile-progs/lockfile-progs_0.1.18.bb
index 4354fff..c76e0f6 100644
--- a/meta-openembedded/meta-oe/recipes-extended/lockfile-progs/lockfile-progs_0.1.17.bb
+++ b/meta-openembedded/meta-oe/recipes-extended/lockfile-progs/lockfile-progs_0.1.18.bb
@@ -9,8 +9,8 @@
 DEPENDS = "liblockfile"
 
 SRC_URI = "http://ftp.de.debian.org/debian/pool/main/l/${BPN}/${BPN}_${PV}.tar.gz"
-SRC_URI[md5sum] = "64424a766fbc8cf6d613fcc14a096e14"
-SRC_URI[sha256sum] = "03fb05d25499532f497775b1747b61fa6beebf12d3bcc951e125349ae166c511"
+SRC_URI[md5sum] = "4eb83bdf88016db836b7cc09591fb0f3"
+SRC_URI[sha256sum] = "a42995a4b97e6188efc90fcc1a761163c4b2cff5c81b936f85c84301ddb05ce6"
 
 do_compile() {
     oe_runmake CFLAGS=' -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -fasynchronous-unwind-tables'
diff --git a/meta-openembedded/meta-oe/recipes-extended/redis/redis_4.0.12.bb b/meta-openembedded/meta-oe/recipes-extended/redis/redis_4.0.12.bb
index af99537..f09d226 100644
--- a/meta-openembedded/meta-oe/recipes-extended/redis/redis_4.0.12.bb
+++ b/meta-openembedded/meta-oe/recipes-extended/redis/redis_4.0.12.bb
@@ -31,6 +31,10 @@
 
 REDIS_ON_SYSTEMD = "${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}"
 
+do_compile_prepend() {
+    (cd deps && oe_runmake hiredis lua jemalloc linenoise)
+}
+
 do_install() {
     export PREFIX=${D}/${prefix}
     oe_runmake install
diff --git a/meta-openembedded/meta-oe/recipes-extended/rrdtool/rrdtool_1.7.0.bb b/meta-openembedded/meta-oe/recipes-extended/rrdtool/rrdtool_1.7.0.bb
index ff99574..4a6c446 100644
--- a/meta-openembedded/meta-oe/recipes-extended/rrdtool/rrdtool_1.7.0.bb
+++ b/meta-openembedded/meta-oe/recipes-extended/rrdtool/rrdtool_1.7.0.bb
@@ -50,6 +50,7 @@
     --disable-tcl \
     --disable-rpath \
     --enable-nls=${USE_NLS} \
+    --disable-docs \
 "
 
 export STAGING_LIBDIR
diff --git a/meta-openembedded/meta-oe/recipes-extended/rsyslog/rsyslog_8.1903.0.bb b/meta-openembedded/meta-oe/recipes-extended/rsyslog/rsyslog_8.1903.0.bb
index e06141e..f1a6e85 100644
--- a/meta-openembedded/meta-oe/recipes-extended/rsyslog/rsyslog_8.1903.0.bb
+++ b/meta-openembedded/meta-oe/recipes-extended/rsyslog/rsyslog_8.1903.0.bb
@@ -68,6 +68,7 @@
 PACKAGECONFIG[gnutls] = "--enable-gnutls,--disable-gnutls,gnutls,"
 PACKAGECONFIG[systemd] = "--with-systemdsystemunitdir=${systemd_unitdir}/system/,--without-systemdsystemunitdir,systemd,"
 PACKAGECONFIG[imjournal] = "--enable-imjournal,--disable-imjournal,"
+PACKAGECONFIG[mmjsonparse] = "--enable-mmjsonparse,--disable-mmjsonparse,"
 PACKAGECONFIG[mysql] = "--enable-mysql,--disable-mysql,mysql5,"
 PACKAGECONFIG[postgresql] = "--enable-pgsql,--disable-pgsql,postgresql,"
 PACKAGECONFIG[libdbi] = "--enable-libdbi,--disable-libdbi,libdbi,"
@@ -136,6 +137,10 @@
         install -d 0755 ${D}${sysconfdir}/rsyslog.d
         echo '$ModLoad imjournal' >> ${D}${sysconfdir}/rsyslog.d/imjournal.conf
     fi
+    if ${@bb.utils.contains('PACKAGECONFIG', 'mmjsonparse', 'true', 'false', d)}; then
+        install -d 0755 ${D}${sysconfdir}/rsyslog.d
+        echo '$ModLoad mmjsonparse' >> ${D}${sysconfdir}/rsyslog.d/mmjsonparse.conf
+    fi
 }
 
 FILES_${PN} += "${bindir}"
diff --git a/meta-openembedded/meta-oe/recipes-gnome/libpeas/libpeas_1.22.0.bb b/meta-openembedded/meta-oe/recipes-gnome/libpeas/libpeas_1.22.0.bb
index c1ead06..dd1b53e 100644
--- a/meta-openembedded/meta-oe/recipes-gnome/libpeas/libpeas_1.22.0.bb
+++ b/meta-openembedded/meta-oe/recipes-gnome/libpeas/libpeas_1.22.0.bb
@@ -5,7 +5,11 @@
 
 DEPENDS = "gnome-common gtk+3 intltool-native"
 
-inherit gnomebase gobject-introspection gtk-doc gtk-icon-cache
+inherit gnomebase gobject-introspection gtk-doc gtk-icon-cache distro_features_check
+
+# gobject-introspection is mandatory and cannot be configured
+REQUIRED_DISTRO_FEATURES = "gobject-introspection-data"
+UNKNOWN_CONFIGURE_WHITELIST_append = " --enable-introspection --disable-introspection"
 
 SRC_URI[archive.md5sum] = "a20dc55c3f88ad06da9491cfd7de7558"
 SRC_URI[archive.sha256sum] = "5b2fc0f53962b25bca131a5ec0139e6fef8e254481b6e777975f7a1d2702a962"
diff --git a/meta-openembedded/meta-oe/recipes-graphics/libvncserver/libvncserver_git.bb b/meta-openembedded/meta-oe/recipes-graphics/libvncserver/libvncserver_git.bb
index 88a859b..6a806ff 100644
--- a/meta-openembedded/meta-oe/recipes-graphics/libvncserver/libvncserver_git.bb
+++ b/meta-openembedded/meta-oe/recipes-graphics/libvncserver/libvncserver_git.bb
@@ -25,6 +25,9 @@
 PACKAGECONFIG[sdl] = "-DWITH_SDL=ON,-DWITH_SDL=OFF,libsdl2"
 PACKAGECONFIG[zlib] = "-DWITH_ZLIB=ON,-DWITH_ZLIB=OFF,zlib"
 
+PACKAGE_BEFORE_PN = "libvncclient"
+FILES_libvncclient = "${libdir}/libvncclient.*"
+
 inherit cmake
 
 SRC_URI = "git://github.com/LibVNC/libvncserver"
diff --git a/meta-openembedded/meta-oe/recipes-multimedia/alsa/alsa-oss/libio.patch b/meta-openembedded/meta-oe/recipes-multimedia/alsa/alsa-oss/libio.patch
index 5299945..835b266 100644
--- a/meta-openembedded/meta-oe/recipes-multimedia/alsa/alsa-oss/libio.patch
+++ b/meta-openembedded/meta-oe/recipes-multimedia/alsa/alsa-oss/libio.patch
@@ -1,18 +1,28 @@
-Index: alsa-oss-1.0.28/alsa/stdioemu.c
-===================================================================
---- alsa-oss-1.0.28.orig/alsa/stdioemu.c
-+++ alsa-oss-1.0.28/alsa/stdioemu.c
+From 54b1c2e27bf81f94c727b4923d4ed592110e2796 Mon Sep 17 00:00:00 2001
+From: Martin Jansa <Martin.Jansa@gmail.com>
+Date: Sun, 29 May 2011 21:05:15 +0200
+
+---
+ alsa/stdioemu.c | 8 +++++++-
+ configure.ac    | 6 ++++++
+ 2 files changed, 13 insertions(+), 1 deletion(-)
+
+diff --git a/alsa/stdioemu.c b/alsa/stdioemu.c
+index f7f9ab5..b673fe3 100644
+--- a/alsa/stdioemu.c
++++ b/alsa/stdioemu.c
 @@ -37,7 +37,9 @@
  #endif
  
  #include <stdio.h>
+-
 +#ifdef HAVE_LIBIO_H
- #include <libio.h>
++#include <libio.h>
 +#endif
- 
  struct fd_cookie {
  	int fd;
-@@ -99,7 +101,11 @@ static FILE *fake_fopen(const char *path
+ };
+@@ -98,7 +100,11 @@ static FILE *fake_fopen(const char *path, const char *mode, int flags)
  
  	if (open_mode && fdc->fd > 0) {
  		result = fopencookie (fdc,"w", fns);
@@ -24,10 +34,10 @@
  	}
  	return result;
  }
-Index: alsa-oss-1.0.28/configure.ac
-===================================================================
---- alsa-oss-1.0.28.orig/configure.ac
-+++ alsa-oss-1.0.28/configure.ac
+diff --git a/configure.ac b/configure.ac
+index 583b95f..60a1025 100644
+--- a/configure.ac
++++ b/configure.ac
 @@ -35,6 +35,12 @@ if test "$with_aoss" = "yes"; then
    LIBS="$OLD_LIBS"
  fi
diff --git a/meta-openembedded/meta-oe/recipes-multimedia/alsa/alsa-oss_1.1.6.bb b/meta-openembedded/meta-oe/recipes-multimedia/alsa/alsa-oss_1.1.8.bb
similarity index 90%
rename from meta-openembedded/meta-oe/recipes-multimedia/alsa/alsa-oss_1.1.6.bb
rename to meta-openembedded/meta-oe/recipes-multimedia/alsa/alsa-oss_1.1.8.bb
index 6c2176f..46ab503 100644
--- a/meta-openembedded/meta-oe/recipes-multimedia/alsa/alsa-oss_1.1.6.bb
+++ b/meta-openembedded/meta-oe/recipes-multimedia/alsa/alsa-oss_1.1.8.bb
@@ -30,8 +30,8 @@
 SRC_URI = "ftp://ftp.alsa-project.org/pub/oss-lib/alsa-oss-${PV}.tar.bz2 \
     file://libio.patch \
 "
-SRC_URI[md5sum] = "fc845cafc4444193510ab1865c7350b8"
-SRC_URI[sha256sum] = "c3d3f743e61f05ff95c5cba3b06bc9c91ff86c37495f1d19dab844e6b90845ea"
+SRC_URI[md5sum] = "9ec4bb783fdce19032aace086d65d874"
+SRC_URI[sha256sum] = "64adcef5927e848d2e024e64c4bf85b6f395964d9974ec61905ae4cb8d35d68e"
 
 inherit autotools
 
diff --git a/meta-openembedded/meta-oe/recipes-support/augeas/augeas_1.10.1.bb b/meta-openembedded/meta-oe/recipes-support/augeas/augeas_1.10.1.bb
deleted file mode 100644
index 26e191b..0000000
--- a/meta-openembedded/meta-oe/recipes-support/augeas/augeas_1.10.1.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-require augeas.inc
-
-SRC_URI[md5sum] = "6c0b2ea6eec45e8bc374b283aedf27ce"
-SRC_URI[sha256sum] = "52db256afab261d31cc147eaa1a71795a5fec59e888dfd0b65a84c7aacd6364d"
diff --git a/meta-openembedded/meta-oe/recipes-support/augeas/augeas_1.11.0.bb b/meta-openembedded/meta-oe/recipes-support/augeas/augeas_1.11.0.bb
new file mode 100644
index 0000000..cdd11be
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-support/augeas/augeas_1.11.0.bb
@@ -0,0 +1,4 @@
+require augeas.inc
+
+SRC_URI[md5sum] = "abf51f4c0cf3901d167f23687f60434a"
+SRC_URI[sha256sum] = "393ce8f4055af89cd4c20bf903eacbbd909cf427891f41b56dc2ba66243ea0b0"
diff --git a/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest/1094.patch b/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest/1094.patch
new file mode 100644
index 0000000..3daad97
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest/1094.patch
@@ -0,0 +1,307 @@
+From d672de675a16e5ab9efcf783705cbd171f38188e Mon Sep 17 00:00:00 2001
+From: "Billy O'Neal (VC LIBS)" <bion@microsoft.com>
+Date: Thu, 28 Mar 2019 15:17:12 -0700
+Subject: [PATCH] Avoid tripping over 32 bit time_t mistakes.
+
+Resolves https://github.com/Microsoft/cpprestsdk/issues/1090
+---
+ Release/src/utilities/asyncrt_utils.cpp     |  30 ++---
+ Release/tests/functional/utils/datetime.cpp | 140 ++++++++++----------
+ 2 files changed, 84 insertions(+), 86 deletions(-)
+
+diff --git a/Release/src/utilities/asyncrt_utils.cpp b/Release/src/utilities/asyncrt_utils.cpp
+index 4a692e5fa..986b64bb7 100644
+--- a/Release/src/utilities/asyncrt_utils.cpp
++++ b/Release/src/utilities/asyncrt_utils.cpp
+@@ -618,7 +618,7 @@ std::string __cdecl conversions::to_utf8string(const utf16string& value) { retur
+ 
+ utf16string __cdecl conversions::to_utf16string(const std::string& value) { return utf8_to_utf16(value); }
+ 
+-static const uint64_t ntToUnixOffsetSeconds = 11644473600U; // diff between windows and unix epochs (seconds)
++static const int64_t ntToUnixOffsetSeconds = 11644473600; // diff between windows and unix epochs (seconds)
+ 
+ datetime __cdecl datetime::utc_now()
+ {
+@@ -634,10 +634,10 @@ datetime __cdecl datetime::utc_now()
+ #else // LINUX
+     struct timeval time;
+     gettimeofday(&time, nullptr);
+-    uint64_t result = ntToUnixOffsetSeconds + time.tv_sec;
++    int64_t result = ntToUnixOffsetSeconds + time.tv_sec;
+     result *= _secondTicks;      // convert to 10e-7
+     result += time.tv_usec * 10; // convert and add microseconds, 10e-6 to 10e-7
+-    return datetime(result);
++    return datetime(static_cast<interval_type>(result));
+ #endif
+ }
+ 
+@@ -646,7 +646,7 @@ static const char monthNames[] = "Jan\0Feb\0Mar\0Apr\0May\0Jun\0Jul\0Aug\0Sep\0O
+ 
+ utility::string_t datetime::to_string(date_format format) const
+ {
+-    const uint64_t input = m_interval / _secondTicks; // convert to seconds
++    const int64_t input = static_cast<int64_t>(m_interval / _secondTicks); // convert to seconds
+     const int frac_sec = static_cast<int>(m_interval % _secondTicks);
+     const time_t time = static_cast<time_t>(input - ntToUnixOffsetSeconds);
+     struct tm t;
+@@ -797,22 +797,20 @@ static int atoi2(const CharT* str)
+     return (static_cast<unsigned char>(str[0]) - '0') * 10 + (static_cast<unsigned char>(str[1]) - '0');
+ }
+ 
+-static const time_t maxTimeT = sizeof(time_t) == 4 ? (time_t)INT_MAX : (time_t)LLONG_MAX;
+-
+-static time_t timezone_adjust(time_t result, unsigned char chSign, int adjustHours, int adjustMinutes)
++static int64_t timezone_adjust(int64_t result, unsigned char chSign, int adjustHours, int adjustMinutes)
+ {
+     if (adjustHours > 23)
+     {
+-        return (time_t)-1;
++        return -1;
+     }
+ 
+     // adjustMinutes > 59 is impossible due to digit 5 check
+     const int tzAdjust = adjustMinutes * 60 + adjustHours * 60 * 60;
+     if (chSign == '-')
+     {
+-        if (maxTimeT - result < tzAdjust)
++        if (INT64_MAX - result < tzAdjust)
+         {
+-            return (time_t)-1;
++            return -1;
+         }
+ 
+         result += tzAdjust;
+@@ -821,7 +819,7 @@ static time_t timezone_adjust(time_t result, unsigned char chSign, int adjustHou
+     {
+         if (tzAdjust > result)
+         {
+-            return (time_t)-1;
++            return -1;
+         }
+ 
+         result -= tzAdjust;
+@@ -830,10 +828,10 @@ static time_t timezone_adjust(time_t result, unsigned char chSign, int adjustHou
+     return result;
+ }
+ 
+-static time_t make_gm_time(struct tm* t)
++static int64_t make_gm_time(struct tm* t)
+ {
+ #ifdef _MSC_VER
+-    return _mkgmtime(t);
++    return static_cast<int64_t>(_mkgmtime(t));
+ #elif (defined(ANDROID) || defined(__ANDROID__))
+     // HACK: The (nonportable?) POSIX function timegm is not available in
+     //       bionic. As a workaround[1][2], we set the C library timezone to
+@@ -867,9 +865,9 @@ static time_t make_gm_time(struct tm* t)
+             unsetenv("TZ");
+         }
+     }
+-    return time;
++    return static_cast<int64_t>(time);
+ #else  // ^^^ ANDROID // Other POSIX platforms vvv
+-    return timegm(t);
++    return static_cast<int64_t>(timegm(t));
+ #endif // _MSC_VER
+ }
+ 
+@@ -916,7 +914,7 @@ zone        =  "UT"  / "GMT"                ; Universal Time
+ datetime __cdecl datetime::from_string(const utility::string_t& dateString, date_format format)
+ {
+     datetime result;
+-    time_t seconds;
++    int64_t seconds;
+     uint64_t frac_sec = 0;
+     struct tm t{};
+     auto str = dateString.c_str();
+diff --git a/Release/tests/functional/utils/datetime.cpp b/Release/tests/functional/utils/datetime.cpp
+index ae7f7a5e4..acd6fddb0 100644
+--- a/Release/tests/functional/utils/datetime.cpp
++++ b/Release/tests/functional/utils/datetime.cpp
+@@ -133,75 +133,77 @@ SUITE(datetime)
+ 
+     TEST(parsing_time_rfc1123_accepts_each_day)
+     {
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:00 GMT"), (time_t) 0);
+-        TestRfc1123IsTimeT(_XPLATSTR("Fri, 02 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 1);
+-        TestRfc1123IsTimeT(_XPLATSTR("Sat, 03 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 2);
+-        TestRfc1123IsTimeT(_XPLATSTR("Sun, 04 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 3);
+-        TestRfc1123IsTimeT(_XPLATSTR("Mon, 05 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 4);
+-        TestRfc1123IsTimeT(_XPLATSTR("Tue, 06 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 5);
+-        TestRfc1123IsTimeT(_XPLATSTR("Wed, 07 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 6);
++        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:00 GMT"), (time_t)0);
++        TestRfc1123IsTimeT(_XPLATSTR("Fri, 02 Jan 1970 00:00:00 GMT"), (time_t)86400 * 1);
++        TestRfc1123IsTimeT(_XPLATSTR("Sat, 03 Jan 1970 00:00:00 GMT"), (time_t)86400 * 2);
++        TestRfc1123IsTimeT(_XPLATSTR("Sun, 04 Jan 1970 00:00:00 GMT"), (time_t)86400 * 3);
++        TestRfc1123IsTimeT(_XPLATSTR("Mon, 05 Jan 1970 00:00:00 GMT"), (time_t)86400 * 4);
++        TestRfc1123IsTimeT(_XPLATSTR("Tue, 06 Jan 1970 00:00:00 GMT"), (time_t)86400 * 5);
++        TestRfc1123IsTimeT(_XPLATSTR("Wed, 07 Jan 1970 00:00:00 GMT"), (time_t)86400 * 6);
+     }
+ 
+     TEST(parsing_time_rfc1123_boundary_cases)
+     {
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:00 GMT"), (time_t) 0);
+-        TestRfc1123IsTimeT(_XPLATSTR("19 Jan 2038 03:14:06 GMT"), (time_t) INT_MAX - 1);
+-#ifndef _USE_32BIT_TIME_T
+-        TestRfc1123IsTimeT(_XPLATSTR("19 Jan 2038 03:13:07 -0001"), (time_t) INT_MAX);
+-        TestRfc1123IsTimeT(_XPLATSTR("19 Jan 2038 03:14:07 -0000"), (time_t) INT_MAX);
+-#endif // _USE_32BIT_TIME_T
+-        TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 +0000"), (time_t) 1547507781);
+-        TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 -0001"), (time_t) 1547507841);
+-        TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 +0001"), (time_t) 1547507721);
+-        TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 -0100"), (time_t) 1547511381);
+-        TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 +0100"), (time_t) 1547504181);
++        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:00 GMT"), (time_t)0);
++        TestRfc1123IsTimeT(_XPLATSTR("19 Jan 2038 03:14:06 GMT"), (time_t)INT_MAX - 1);
++        if (sizeof(time_t) == 8)
++        {
++            TestRfc1123IsTimeT(_XPLATSTR("19 Jan 2038 03:13:07 -0001"), (time_t)INT_MAX);
++            TestRfc1123IsTimeT(_XPLATSTR("19 Jan 2038 03:14:07 -0000"), (time_t)INT_MAX);
++        }
++        TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 +0000"), (time_t)1547507781);
++        TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 -0001"), (time_t)1547507841);
++        TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 +0001"), (time_t)1547507721);
++        TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 -0100"), (time_t)1547511381);
++        TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 +0100"), (time_t)1547504181);
+     }
+ 
+     TEST(parsing_time_rfc1123_uses_each_field)
+     {
+-        TestRfc1123IsTimeT(_XPLATSTR("02 Jan 1970 00:00:00 GMT"), (time_t) 86400);
+-        TestRfc1123IsTimeT(_XPLATSTR("12 Jan 1970 00:00:00 GMT"), (time_t) 950400);
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Feb 1970 00:00:00 GMT"), (time_t) 2678400);
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 2000 00:00:00 GMT"), (time_t) 946684800);
+-#ifndef _USE_32BIT_TIME_T
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 2100 00:00:00 GMT"), (time_t) 4102444800);
+-#endif // _USE_32BIT_TIME_T
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1990 00:00:00 GMT"), (time_t) 631152000);
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1971 00:00:00 GMT"), (time_t) 31536000);
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 10:00:00 GMT"), (time_t) 36000);
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 01:00:00 GMT"), (time_t) 3600);
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:10:00 GMT"), (time_t) 600);
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:01:00 GMT"), (time_t) 60);
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:10 GMT"), (time_t) 10);
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:01 GMT"), (time_t) 1);
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 10:00:00 GMT"), (time_t) 36000);
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 02:00:00 PST"), (time_t) 36000);
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 03:00:00 PDT"), (time_t) 36000);
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 03:00:00 MST"), (time_t) 36000);
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 04:00:00 MDT"), (time_t) 36000);
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 04:00:00 CST"), (time_t) 36000);
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 05:00:00 CDT"), (time_t) 36000);
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 05:00:00 EST"), (time_t) 36000);
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 06:00:00 EDT"), (time_t) 36000);
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 06:00:00 -0400"), (time_t) 36000);
+-        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 05:59:00 -0401"), (time_t) 36000);
++        TestRfc1123IsTimeT(_XPLATSTR("02 Jan 1970 00:00:00 GMT"), (time_t)86400);
++        TestRfc1123IsTimeT(_XPLATSTR("12 Jan 1970 00:00:00 GMT"), (time_t)950400);
++        TestRfc1123IsTimeT(_XPLATSTR("01 Feb 1970 00:00:00 GMT"), (time_t)2678400);
++        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 2000 00:00:00 GMT"), (time_t)946684800);
++        if (sizeof(time_t) == 8)
++        {
++            TestRfc1123IsTimeT(_XPLATSTR("01 Jan 2100 00:00:00 GMT"), (time_t)4102444800);
++        }
++        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1990 00:00:00 GMT"), (time_t)631152000);
++        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1971 00:00:00 GMT"), (time_t)31536000);
++        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 10:00:00 GMT"), (time_t)36000);
++        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 01:00:00 GMT"), (time_t)3600);
++        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:10:00 GMT"), (time_t)600);
++        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:01:00 GMT"), (time_t)60);
++        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:10 GMT"), (time_t)10);
++        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:01 GMT"), (time_t)1);
++        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 10:00:00 GMT"), (time_t)36000);
++        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 02:00:00 PST"), (time_t)36000);
++        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 03:00:00 PDT"), (time_t)36000);
++        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 03:00:00 MST"), (time_t)36000);
++        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 04:00:00 MDT"), (time_t)36000);
++        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 04:00:00 CST"), (time_t)36000);
++        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 05:00:00 CDT"), (time_t)36000);
++        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 05:00:00 EST"), (time_t)36000);
++        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 06:00:00 EDT"), (time_t)36000);
++        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 06:00:00 -0400"), (time_t)36000);
++        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 05:59:00 -0401"), (time_t)36000);
+     }
+ 
+     TEST(parsing_time_rfc1123_max_days)
+     {
+-        TestRfc1123IsTimeT(_XPLATSTR("31 Jan 1970 00:00:00 GMT"), (time_t) 2592000);
+-        TestRfc1123IsTimeT(_XPLATSTR("28 Feb 2019 00:00:00 GMT"), (time_t) 1551312000); // non leap year allows feb 28
+-        TestRfc1123IsTimeT(_XPLATSTR("29 Feb 2020 00:00:00 GMT"), (time_t) 1582934400); // leap year allows feb 29
+-        TestRfc1123IsTimeT(_XPLATSTR("31 Mar 1970 00:00:00 GMT"), (time_t) 7689600);
+-        TestRfc1123IsTimeT(_XPLATSTR("30 Apr 1970 00:00:00 GMT"), (time_t) 10281600);
+-        TestRfc1123IsTimeT(_XPLATSTR("31 May 1970 00:00:00 GMT"), (time_t) 12960000);
+-        TestRfc1123IsTimeT(_XPLATSTR("30 Jun 1970 00:00:00 GMT"), (time_t) 15552000);
+-        TestRfc1123IsTimeT(_XPLATSTR("31 Jul 1970 00:00:00 GMT"), (time_t) 18230400);
+-        TestRfc1123IsTimeT(_XPLATSTR("31 Aug 1970 00:00:00 GMT"), (time_t) 20908800);
+-        TestRfc1123IsTimeT(_XPLATSTR("30 Sep 1970 00:00:00 GMT"), (time_t) 23500800);
+-        TestRfc1123IsTimeT(_XPLATSTR("31 Oct 1970 00:00:00 GMT"), (time_t) 26179200);
+-        TestRfc1123IsTimeT(_XPLATSTR("30 Nov 1970 00:00:00 GMT"), (time_t) 28771200);
+-        TestRfc1123IsTimeT(_XPLATSTR("31 Dec 1970 00:00:00 GMT"), (time_t) 31449600);
++        TestRfc1123IsTimeT(_XPLATSTR("31 Jan 1970 00:00:00 GMT"), (time_t)2592000);
++        TestRfc1123IsTimeT(_XPLATSTR("28 Feb 2019 00:00:00 GMT"), (time_t)1551312000); // non leap year allows feb 28
++        TestRfc1123IsTimeT(_XPLATSTR("29 Feb 2020 00:00:00 GMT"), (time_t)1582934400); // leap year allows feb 29
++        TestRfc1123IsTimeT(_XPLATSTR("31 Mar 1970 00:00:00 GMT"), (time_t)7689600);
++        TestRfc1123IsTimeT(_XPLATSTR("30 Apr 1970 00:00:00 GMT"), (time_t)10281600);
++        TestRfc1123IsTimeT(_XPLATSTR("31 May 1970 00:00:00 GMT"), (time_t)12960000);
++        TestRfc1123IsTimeT(_XPLATSTR("30 Jun 1970 00:00:00 GMT"), (time_t)15552000);
++        TestRfc1123IsTimeT(_XPLATSTR("31 Jul 1970 00:00:00 GMT"), (time_t)18230400);
++        TestRfc1123IsTimeT(_XPLATSTR("31 Aug 1970 00:00:00 GMT"), (time_t)20908800);
++        TestRfc1123IsTimeT(_XPLATSTR("30 Sep 1970 00:00:00 GMT"), (time_t)23500800);
++        TestRfc1123IsTimeT(_XPLATSTR("31 Oct 1970 00:00:00 GMT"), (time_t)26179200);
++        TestRfc1123IsTimeT(_XPLATSTR("30 Nov 1970 00:00:00 GMT"), (time_t)28771200);
++        TestRfc1123IsTimeT(_XPLATSTR("31 Dec 1970 00:00:00 GMT"), (time_t)31449600);
+     }
+ 
+     TEST(parsing_time_rfc1123_invalid_cases)
+@@ -266,7 +268,7 @@ SUITE(datetime)
+             _XPLATSTR("Thu, 01 Jan 1970 00:00:00 G"),
+             _XPLATSTR("Thu, 01 Jan 1970 00:00:00 GM"),
+             _XPLATSTR("Fri, 01 Jan 1970 00:00:00 GMT"), // wrong day
+-            _XPLATSTR("01 Jan 4970 00:00:00 GMT"), // year too big
++            _XPLATSTR("01 Jan 4970 00:00:00 GMT"),      // year too big
+             _XPLATSTR("01 Jan 3001 00:00:00 GMT"),
+             _XPLATSTR("01 Xxx 1971 00:00:00 GMT"), // month bad
+             _XPLATSTR("00 Jan 1971 00:00:00 GMT"), // day too small
+@@ -288,8 +290,8 @@ SUITE(datetime)
+             _XPLATSTR("01 Jan 1971 00:60:00 GMT"), // minute too big
+             _XPLATSTR("01 Jan 1971 00:00:70 GMT"), // second too big
+             _XPLATSTR("01 Jan 1971 00:00:61 GMT"),
+-            _XPLATSTR("01 Jan 1969 00:00:00 GMT"), // underflow
+-            _XPLATSTR("01 Jan 1969 00:00:00 CEST"), // bad tz
++            _XPLATSTR("01 Jan 1969 00:00:00 GMT"),   // underflow
++            _XPLATSTR("01 Jan 1969 00:00:00 CEST"),  // bad tz
+             _XPLATSTR("01 Jan 1970 00:00:00 +2400"), // bad tzoffsets
+             _XPLATSTR("01 Jan 1970 00:00:00 -3000"),
+             _XPLATSTR("01 Jan 1970 00:00:00 +2160"),
+@@ -309,11 +311,12 @@ SUITE(datetime)
+         // boundary cases:
+         TestDateTimeRoundtrip(_XPLATSTR("1970-01-01T00:00:00Z"));                                         // epoch
+         TestDateTimeRoundtrip(_XPLATSTR("2038-01-19T03:14:06+00:00"), _XPLATSTR("2038-01-19T03:14:06Z")); // INT_MAX - 1
+-#ifndef _USE_32BIT_TIME_T
+-        TestDateTimeRoundtrip(_XPLATSTR("2038-01-19T03:13:07-00:01"),
+-                              _XPLATSTR("2038-01-19T03:14:07Z")); // INT_MAX after subtacting 1
+-        TestDateTimeRoundtrip(_XPLATSTR("2038-01-19T03:14:07-00:00"), _XPLATSTR("2038-01-19T03:14:07Z"));
+-#endif // _USE_32BIT_TIME_T
++        if (sizeof(time_t) == 8)
++        {
++            TestDateTimeRoundtrip(_XPLATSTR("2038-01-19T03:13:07-00:01"),
++                                  _XPLATSTR("2038-01-19T03:14:07Z")); // INT_MAX after subtacting 1
++            TestDateTimeRoundtrip(_XPLATSTR("2038-01-19T03:14:07-00:00"), _XPLATSTR("2038-01-19T03:14:07Z"));
++        }
+     }
+ 
+     TEST(parsing_time_iso8601_uses_each_timezone_digit)
+@@ -456,11 +459,8 @@ SUITE(datetime)
+             _XPLATSTR("1971-01-01T00:60:00Z"), // minute too big
+             _XPLATSTR("1971-01-01T00:00:70Z"), // second too big
+             _XPLATSTR("1971-01-01T00:00:61Z"),
+-            _XPLATSTR("1969-01-01T00:00:00Z"), // underflow
+-#ifdef _USE_32BIT_TIME_T
+-            _XPLATSTR("3000-01-01T00:00:01Z"), // overflow
+-#endif
+-            _XPLATSTR("3001-01-01T00:00:00Z"),
++            _XPLATSTR("1969-01-01T00:00:00Z"),      // underflow
++            _XPLATSTR("3001-01-01T00:00:00Z"),      // overflow
+             _XPLATSTR("1970-01-01T00:00:00+00:01"), // time zone underflow
+             // _XPLATSTR("1970-01-01T00:00:00.Z"), // accepted as invalid timezone above
+             _XPLATSTR("1970-01-01T00:00:00+24:00"), // bad tzoffsets
diff --git a/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest/revert-9b670e5b33dfdbd501d618cd7e7498148ffbd559.patch b/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest/revert-9b670e5b33dfdbd501d618cd7e7498148ffbd559.patch
deleted file mode 100644
index 9af2cbf..0000000
--- a/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest/revert-9b670e5b33dfdbd501d618cd7e7498148ffbd559.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-Description: revert upstream bugfix (see:https://github.com/Microsoft/cpprestsdk/issues/1090)
-Last-Update: 2019-03-28
-
---- cpprest-2.10.12.orig/Release/src/utilities/asyncrt_utils.cpp
-+++ cpprest-2.10.12/Release/src/utilities/asyncrt_utils.cpp
-@@ -1393,16 +1393,15 @@ utility::seconds __cdecl timespan::xml_d
-     return utility::seconds(numSecs);
- }
- 
--static const char c_allowed_chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
--static const int chars_count = static_cast<int>(sizeof(c_allowed_chars) - 1);
-+static const utility::char_t c_allowed_chars[] =
-+    _XPLATSTR("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
- 
- utility::string_t nonce_generator::generate()
- {
--    std::uniform_int_distribution<> distr(0, chars_count - 1);
-+    std::uniform_int_distribution<> distr(0, static_cast<int>(sizeof(c_allowed_chars) / sizeof(utility::char_t)) - 1);
-     utility::string_t result;
-     result.reserve(length());
--    std::generate_n(std::back_inserter(result), length(),
--		[&] { return static_cast<utility::char_t>(c_allowed_chars[distr(m_random)]); });
-+    std::generate_n(std::back_inserter(result), length(), [&]() { return c_allowed_chars[distr(m_random)]; });
-     return result;
- }
- 
diff --git a/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest/revert-f10d9f8e214516d2c19aa6ef831ee874a58c0479.patch b/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest/revert-f10d9f8e214516d2c19aa6ef831ee874a58c0479.patch
deleted file mode 100644
index 01e4631..0000000
--- a/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest/revert-f10d9f8e214516d2c19aa6ef831ee874a58c0479.patch
+++ /dev/null
@@ -1,1557 +0,0 @@
-Description: revert upstream bugfix (see:https://github.com/Microsoft/cpprestsdk/issues/1090)
-Last-Update: 2019-03-28
-
---- cpprest-2.10.12.orig/Release/include/cpprest/asyncrt_utils.h
-+++ cpprest-2.10.12/Release/include/cpprest/asyncrt_utils.h
-@@ -630,6 +630,15 @@ private:
-     static const interval_type _hourTicks = 60 * 60 * _secondTicks;
-     static const interval_type _dayTicks = 24 * 60 * 60 * _secondTicks;
- 
-+#ifdef _WIN32
-+    // void* to avoid pulling in windows.h
-+    static _ASYNCRTIMP bool __cdecl system_type_to_datetime(/*SYSTEMTIME*/ void* psysTime,
-+                                                            uint64_t seconds,
-+                                                            datetime* pdt);
-+#else
-+    static datetime timeval_to_datetime(const timeval& time);
-+#endif
-+
-     // Private constructor. Use static methods to create an instance.
-     datetime(interval_type interval) : m_interval(interval) {}
- 
-@@ -690,6 +699,7 @@ public:
-     void set_length(int length) { m_length = length; }
- 
- private:
-+    static const utility::string_t c_allowed_chars;
-     std::mt19937 m_random;
-     int m_length;
- };
---- cpprest-2.10.12.orig/Release/src/pch/stdafx.h
-+++ cpprest-2.10.12/Release/src/pch/stdafx.h
-@@ -61,6 +61,7 @@
- #undef BOOST_NO_CXX11_NULLPTR
- #endif
- #include "boost/bind/bind.hpp"
-+#include "boost/date_time/posix_time/posix_time_types.hpp"
- #include "boost/thread/condition_variable.hpp"
- #include "boost/thread/mutex.hpp"
- #include <fcntl.h>
---- cpprest-2.10.12.orig/Release/src/utilities/asyncrt_utils.cpp
-+++ cpprest-2.10.12/Release/src/utilities/asyncrt_utils.cpp
-@@ -15,9 +15,20 @@
- 
- #include <algorithm>
- #include <cpprest/asyncrt_utils.h>
--#include <stdexcept>
-+#include <sstream>
- #include <string>
--#include <time.h>
-+
-+#ifndef _WIN32
-+#if defined(__clang__)
-+#pragma clang diagnostic push
-+#pragma clang diagnostic ignored "-Wunused-local-typedef"
-+#endif
-+#include <boost/date_time/posix_time/posix_time.hpp>
-+#include <boost/date_time/posix_time/posix_time_io.hpp>
-+#if defined(__clang__)
-+#pragma clang diagnostic pop
-+#endif
-+#endif
- 
- using namespace web;
- using namespace utility;
-@@ -618,7 +629,18 @@ std::string __cdecl conversions::to_utf8
- 
- utf16string __cdecl conversions::to_utf16string(const std::string& value) { return utf8_to_utf16(value); }
- 
--static const uint64_t ntToUnixOffsetSeconds = 11644473600U; // diff between windows and unix epochs (seconds)
-+#ifndef WIN32
-+datetime datetime::timeval_to_datetime(const timeval& time)
-+{
-+    const uint64_t epoch_offset = 11644473600LL; // diff between windows and unix epochs (seconds)
-+    uint64_t result = epoch_offset + time.tv_sec;
-+    result *= _secondTicks;      // convert to 10e-7
-+    result += time.tv_usec * 10; // convert and add microseconds, 10e-6 to 10e-7
-+    return datetime(result);
-+}
-+#endif
-+
-+static bool is_digit(utility::char_t c) { return c >= _XPLATSTR('0') && c <= _XPLATSTR('9'); }
- 
- datetime __cdecl datetime::utc_now()
- {
-@@ -634,649 +656,450 @@ datetime __cdecl datetime::utc_now()
- #else // LINUX
-     struct timeval time;
-     gettimeofday(&time, nullptr);
--    uint64_t result = ntToUnixOffsetSeconds + time.tv_sec;
--    result *= _secondTicks;      // convert to 10e-7
--    result += time.tv_usec * 10; // convert and add microseconds, 10e-6 to 10e-7
--    return datetime(result);
-+    return timeval_to_datetime(time);
- #endif
- }
- 
--static const char dayNames[] = "Sun\0Mon\0Tue\0Wed\0Thu\0Fri\0Sat";
--static const char monthNames[] = "Jan\0Feb\0Mar\0Apr\0May\0Jun\0Jul\0Aug\0Sep\0Oct\0Nov\0Dec";
--
- utility::string_t datetime::to_string(date_format format) const
- {
--    const uint64_t input = m_interval / _secondTicks; // convert to seconds
--    const int frac_sec = static_cast<int>(m_interval % _secondTicks);
--    const time_t time = static_cast<time_t>(input - ntToUnixOffsetSeconds);
--    struct tm t;
--#ifdef _MSC_VER
--    if (gmtime_s(&t, &time) != 0)
--#else  // ^^^ _MSC_VER ^^^ // vvv !_MSC_VER vvv
--    if (gmtime_r(&time, &t) == 0)
--#endif // _MSC_VER
--    {
--        throw std::invalid_argument("gmtime_r/s failed on the time supplied");
--    }
--
--    char outBuffer[38]; // Thu, 01 Jan 1970 00:00:00 GMT\0
--                        // 1970-01-01T00:00:00.1234567Z\0
--    char* outCursor = outBuffer;
--    switch (format)
--    {
--        case RFC_1123:
--#ifdef _MSC_VER
--            sprintf_s(outCursor,
--                      26,
--                      "%s, %02d %s %04d %02d:%02d:%02d",
--                      dayNames + 4 * t.tm_wday,
--                      t.tm_mday,
--                      monthNames + 4 * t.tm_mon,
--                      t.tm_year + 1900,
--                      t.tm_hour,
--                      t.tm_min,
--                      t.tm_sec);
--#else  // ^^^ _MSC_VER // !_MSC_VER vvv
--            sprintf(outCursor,
--                    "%s, %02d %s %04d %02d:%02d:%02d",
--                    dayNames + 4 * t.tm_wday,
--                    t.tm_mday,
--                    monthNames + 4 * t.tm_mon,
--                    t.tm_year + 1900,
--                    t.tm_hour,
--                    t.tm_min,
--                    t.tm_sec);
--#endif // _MSC_VER
--            outCursor += 25;
--            memcpy(outCursor, " GMT", 4);
--            outCursor += 4;
--            return utility::string_t(outBuffer, outCursor);
--        case ISO_8601:
--#ifdef _MSC_VER
--            sprintf_s(outCursor,
--                      20,
--                      "%04d-%02d-%02dT%02d:%02d:%02d",
--                      t.tm_year + 1900,
--                      t.tm_mon + 1,
--                      t.tm_mday,
--                      t.tm_hour,
--                      t.tm_min,
--                      t.tm_sec);
--#else  // ^^^ _MSC_VER // !_MSC_VER vvv
--            sprintf(outCursor,
--                    "%04d-%02d-%02dT%02d:%02d:%02d",
--                    t.tm_year + 1900,
--                    t.tm_mon + 1,
--                    t.tm_mday,
--                    t.tm_hour,
--                    t.tm_min,
--                    t.tm_sec);
--#endif // _MSC_VER
--            outCursor += 19;
--            if (frac_sec != 0)
--            {
--                // Append fractional second, which is a 7-digit value with no trailing zeros
--                // This way, '1200' becomes '00012'
--#ifdef _MSC_VER
--                size_t appended = sprintf_s(outCursor, 9, ".%07d", frac_sec);
--#else  // ^^^ _MSC_VER // !_MSC_VER vvv
--                size_t appended = sprintf(outCursor, ".%07d", frac_sec);
--#endif // _MSC_VER
--                while (outCursor[appended - 1] == '0')
--                {
--                    --appended; // trim trailing zeros
--                }
--
--                outCursor += appended;
--            }
--
--            *outCursor = 'Z';
--            ++outCursor;
--            return utility::string_t(outBuffer, outCursor);
--        default: throw std::invalid_argument("Unrecognized date format.");
--    }
--}
--
--template<class CharT>
--static bool string_starts_with(const CharT* haystack, const char* needle)
--{
--    while (*needle)
--    {
--        if (*haystack != static_cast<CharT>(*needle))
--        {
--            return false;
--        }
--
--        ++haystack;
--        ++needle;
--    }
--
--    return true;
--}
--
--#define ascii_isdigit(c) ((unsigned char)((unsigned char)(c) - '0') <= 9)
--#define ascii_isdigit6(c) ((unsigned char)((unsigned char)(c) - '0') <= 6)
--#define ascii_isdigit5(c) ((unsigned char)((unsigned char)(c) - '0') <= 5)
--#define ascii_isdigit3(c) ((unsigned char)((unsigned char)(c) - '0') <= 3)
--#define ascii_isdigit2(c) ((unsigned char)((unsigned char)(c) - '0') <= 2)
--#define ascii_isdigit1(c) ((unsigned char)((unsigned char)(c) - '0') <= 1)
--
--static const unsigned char max_days_in_month[12] = {
--    31, // Jan
--    00, // Feb, special handling for leap years
--    31, // Mar
--    30, // Apr
--    31, // May
--    30, // Jun
--    31, // Jul
--    31, // Aug
--    30, // Sep
--    31, // Oct
--    30, // Nov
--    31  // Dec
--};
--
--static bool validate_day_month(int day, int month, int year)
--{
--    int maxDaysThisMonth;
--    if (month == 1)
--    { // Feb needs leap year testing
--        maxDaysThisMonth = 28 + (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
--    }
--    else
--    {
--        maxDaysThisMonth = max_days_in_month[month];
--    }
--
--    return day >= 1 && day <= maxDaysThisMonth;
--}
-+#ifdef _WIN32
-+    int status;
- 
--template<class CharT>
--static int atoi2(const CharT* str)
--{
--    return (static_cast<unsigned char>(str[0]) - '0') * 10 + (static_cast<unsigned char>(str[1]) - '0');
--}
-+    ULARGE_INTEGER largeInt;
-+    largeInt.QuadPart = m_interval;
- 
--static const time_t maxTimeT = sizeof(time_t) == 4 ? (time_t)INT_MAX : (time_t)LLONG_MAX;
-+    FILETIME ft;
-+    ft.dwHighDateTime = largeInt.HighPart;
-+    ft.dwLowDateTime = largeInt.LowPart;
- 
--static time_t timezone_adjust(time_t result, unsigned char chSign, int adjustHours, int adjustMinutes)
--{
--    if (adjustHours > 23)
-+    SYSTEMTIME systemTime;
-+    if (!FileTimeToSystemTime((const FILETIME*)&ft, &systemTime))
-     {
--        return (time_t)-1;
-+        throw utility::details::create_system_error(GetLastError());
-     }
- 
--    // adjustMinutes > 59 is impossible due to digit 5 check
--    const int tzAdjust = adjustMinutes * 60 + adjustHours * 60 * 60;
--    if (chSign == '-')
-+    std::wstring result;
-+    if (format == RFC_1123)
-     {
--        if (maxTimeT - result < tzAdjust)
-         {
--            return (time_t)-1;
-+            wchar_t dateStr[18] = {0};
-+#if _WIN32_WINNT < _WIN32_WINNT_VISTA
-+            status = GetDateFormatW(
-+                LOCALE_INVARIANT, 0, &systemTime, L"ddd',' dd MMM yyyy", dateStr, sizeof(dateStr) / sizeof(wchar_t));
-+#else
-+            status = GetDateFormatEx(LOCALE_NAME_INVARIANT,
-+                                     0,
-+                                     &systemTime,
-+                                     L"ddd',' dd MMM yyyy",
-+                                     dateStr,
-+                                     sizeof(dateStr) / sizeof(wchar_t),
-+                                     NULL);
-+#endif // _WIN32_WINNT < _WIN32_WINNT_VISTA
-+            if (status == 0)
-+            {
-+                throw utility::details::create_system_error(GetLastError());
-+            }
-+
-+            result += dateStr;
-+            result += L' ';
-         }
- 
--        result += tzAdjust;
--    }
--    else
--    {
--        if (tzAdjust > result)
-         {
--            return (time_t)-1;
--        }
--
--        result -= tzAdjust;
--    }
--
--    return result;
--}
--
--static time_t make_gm_time(struct tm* t)
--{
--#ifdef _MSC_VER
--    return _mkgmtime(t);
--#elif (defined(ANDROID) || defined(__ANDROID__))
--    // HACK: The (nonportable?) POSIX function timegm is not available in
--    //       bionic. As a workaround[1][2], we set the C library timezone to
--    //       UTC, call mktime, then set the timezone back. However, the C
--    //       environment is fundamentally a shared global resource and thread-
--    //       unsafe. We can protect our usage here, however any other code might
--    //       manipulate the environment at the same time.
--    //
--    // [1] http://linux.die.net/man/3/timegm
--    // [2] http://www.gnu.org/software/libc/manual/html_node/Broken_002ddown-Time.html
--    time_t time;
--    static boost::mutex env_var_lock;
--    {
--        boost::lock_guard<boost::mutex> lock(env_var_lock);
--        std::string prev_env;
--        auto prev_env_cstr = getenv("TZ");
--        if (prev_env_cstr != nullptr)
--        {
--            prev_env = prev_env_cstr;
--        }
--        setenv("TZ", "UTC", 1);
--
--        time = mktime(t);
-+            wchar_t timeStr[10] = {0};
-+#if _WIN32_WINNT < _WIN32_WINNT_VISTA
-+            status = GetTimeFormatW(LOCALE_INVARIANT,
-+                                    TIME_NOTIMEMARKER | TIME_FORCE24HOURFORMAT,
-+                                    &systemTime,
-+                                    L"HH':'mm':'ss",
-+                                    timeStr,
-+                                    sizeof(timeStr) / sizeof(wchar_t));
-+#else
-+            status = GetTimeFormatEx(LOCALE_NAME_INVARIANT,
-+                                     TIME_NOTIMEMARKER | TIME_FORCE24HOURFORMAT,
-+                                     &systemTime,
-+                                     L"HH':'mm':'ss",
-+                                     timeStr,
-+                                     sizeof(timeStr) / sizeof(wchar_t));
-+#endif // _WIN32_WINNT < _WIN32_WINNT_VISTA
-+            if (status == 0)
-+            {
-+                throw utility::details::create_system_error(GetLastError());
-+            }
- 
--        if (prev_env_cstr)
--        {
--            setenv("TZ", prev_env.c_str(), 1);
--        }
--        else
--        {
--            unsetenv("TZ");
-+            result += timeStr;
-+            result += L" GMT";
-         }
-     }
--    return time;
--#else  // ^^^ ANDROID // Other POSIX platforms vvv
--    return timegm(t);
--#endif // _MSC_VER
--}
--
--/*
--https://tools.ietf.org/html/rfc822
--https://tools.ietf.org/html/rfc1123
--
--date-time   =  [ day "," ] date time        ; dd mm yy
--                                            ;  hh:mm:ss zzz
--
--day         =  "Mon"  / "Tue" /  "Wed"  / "Thu"
--            /  "Fri"  / "Sat" /  "Sun"
--
--date        =  1*2DIGIT month 2DIGIT        ; day month year
--                                            ;  e.g. 20 Jun 82
--RFC1123 changes this to:
--date        =  1*2DIGIT month 2*4DIGIT        ; day month year
--                                              ;  e.g. 20 Jun 1982
--This implementation only accepts 4 digit years.
--
--month       =  "Jan"  /  "Feb" /  "Mar"  /  "Apr"
--            /  "May"  /  "Jun" /  "Jul"  /  "Aug"
--            /  "Sep"  /  "Oct" /  "Nov"  /  "Dec"
--
--time        =  hour zone                    ; ANSI and Military
--
--hour        =  2DIGIT ":" 2DIGIT [":" 2DIGIT]
--                                            ; 00:00:00 - 23:59:59
--
--zone        =  "UT"  / "GMT"                ; Universal Time
--                                            ; North American : UT
--            /  "EST" / "EDT"                ;  Eastern:  - 5/ - 4
--            /  "CST" / "CDT"                ;  Central:  - 6/ - 5
--            /  "MST" / "MDT"                ;  Mountain: - 7/ - 6
--            /  "PST" / "PDT"                ;  Pacific:  - 8/ - 7
--
--// military time deleted by RFC 1123
--
--            / ( ("+" / "-") 4DIGIT )        ; Local differential
--                                            ;  hours+min. (HHMM)
--*/
--
--
--datetime __cdecl datetime::from_string(const utility::string_t& dateString, date_format format)
--{
--    datetime result;
--    time_t seconds;
--    uint64_t frac_sec = 0;
--    struct tm t{};
--    auto str = dateString.c_str();
--    if (format == RFC_1123)
-+    else if (format == ISO_8601)
-     {
--        int parsedWeekday = -1;
--        for (int day = 0; day < 7; ++day)
-+        const size_t buffSize = 64;
-         {
--            if (string_starts_with(str, dayNames + day * 4) && str[3] == _XPLATSTR(',') && str[4] == _XPLATSTR(' '))
-+            wchar_t dateStr[buffSize] = {0};
-+#if _WIN32_WINNT < _WIN32_WINNT_VISTA
-+            status = GetDateFormatW(LOCALE_INVARIANT, 0, &systemTime, L"yyyy-MM-dd", dateStr, buffSize);
-+#else
-+            status = GetDateFormatEx(LOCALE_NAME_INVARIANT, 0, &systemTime, L"yyyy-MM-dd", dateStr, buffSize, NULL);
-+#endif // _WIN32_WINNT < _WIN32_WINNT_VISTA
-+            if (status == 0)
-             {
--                parsedWeekday = day;
--                str += 5; // parsed day of week
--                break;
-+                throw utility::details::create_system_error(GetLastError());
-             }
--        }
- 
--        if (ascii_isdigit3(str[0]) && ascii_isdigit(str[1]) && str[2] == _XPLATSTR(' '))
--        {
--            t.tm_mday = atoi2(str); // validity checked later
--            str += 3;               // parsed day
--        }
--        else if (ascii_isdigit(str[0]) && str[1] == _XPLATSTR(' '))
--        {
--            t.tm_mday = str[0] - _XPLATSTR('0');
--            str += 2; // parsed day
--        }
--        else
--        {
--            return result;
-+            result += dateStr;
-+            result += L'T';
-         }
- 
--        t.tm_mon = -1;
--        for (int month = 0; month < 12; ++month)
-         {
--            if (string_starts_with(str, monthNames + month * 4))
-+            wchar_t timeStr[buffSize] = {0};
-+#if _WIN32_WINNT < _WIN32_WINNT_VISTA
-+            status = GetTimeFormatW(LOCALE_INVARIANT,
-+                                    TIME_NOTIMEMARKER | TIME_FORCE24HOURFORMAT,
-+                                    &systemTime,
-+                                    L"HH':'mm':'ss",
-+                                    timeStr,
-+                                    buffSize);
-+#else
-+            status = GetTimeFormatEx(LOCALE_NAME_INVARIANT,
-+                                     TIME_NOTIMEMARKER | TIME_FORCE24HOURFORMAT,
-+                                     &systemTime,
-+                                     L"HH':'mm':'ss",
-+                                     timeStr,
-+                                     buffSize);
-+#endif // _WIN32_WINNT < _WIN32_WINNT_VISTA
-+            if (status == 0)
-             {
--                t.tm_mon = month;
--                break;
-+                throw utility::details::create_system_error(GetLastError());
-             }
--        }
- 
--        if (t.tm_mon == -1 || str[3] != _XPLATSTR(' '))
--        {
--            return result;
-+            result += timeStr;
-         }
- 
--        str += 4; // parsed month
--
--        if (!ascii_isdigit3(str[0]) || !ascii_isdigit(str[1]) || !ascii_isdigit(str[2]) || !ascii_isdigit(str[3]) ||
--            str[4] != ' ')
-+        uint64_t frac_sec = largeInt.QuadPart % _secondTicks;
-+        if (frac_sec > 0)
-         {
--            return result;
-+            // Append fractional second, which is a 7-digit value with no trailing zeros
-+            // This way, '1200' becomes '00012'
-+            wchar_t buf[9] = {0};
-+            size_t appended = swprintf_s(buf, 9, L".%07ld", static_cast<long>(frac_sec));
-+            while (buf[appended - 1] == L'0')
-+                --appended; // trim trailing zeros
-+            result.append(buf, appended);
-         }
- 
--        t.tm_year = (str[0] - _XPLATSTR('0')) * 1000 + (str[1] - _XPLATSTR('0')) * 100 +
--                    (str[2] - _XPLATSTR('0')) * 10 + (str[3] - _XPLATSTR('0'));
--        if (t.tm_year < 1970 || t.tm_year > 3000)
--        {
--            return result;
--        }
-+        result += L'Z';
-+    }
- 
--        // days in month validity check
--        if (!validate_day_month(t.tm_mday, t.tm_mon, t.tm_year))
--        {
--            return result;
--        }
-+    return result;
-+#else // LINUX
-+    uint64_t input = m_interval;
-+    uint64_t frac_sec = input % _secondTicks;
-+    input /= _secondTicks;                               // convert to seconds
-+    time_t time = (time_t)input - (time_t)11644473600LL; // diff between windows and unix epochs (seconds)
-+
-+    struct tm datetime;
-+    gmtime_r(&time, &datetime);
-+
-+    const int max_dt_length = 64;
-+    char output[max_dt_length + 1] = {0};
-+
-+    if (format != RFC_1123 && frac_sec > 0)
-+    {
-+        // Append fractional second, which is a 7-digit value with no trailing zeros
-+        // This way, '1200' becomes '00012'
-+        const int max_frac_length = 8;
-+        char buf[max_frac_length + 1] = {0};
-+        snprintf(buf, sizeof(buf), ".%07ld", (long int)frac_sec);
-+        // trim trailing zeros
-+        for (int i = max_frac_length - 1; buf[i] == '0'; i--)
-+            buf[i] = '\0';
-+        // format the datetime into a separate buffer
-+        char datetime_str[max_dt_length - max_frac_length - 1 + 1] = {0};
-+        strftime(datetime_str, sizeof(datetime_str), "%Y-%m-%dT%H:%M:%S", &datetime);
-+        // now print this buffer into the output buffer
-+        snprintf(output, sizeof(output), "%s%sZ", datetime_str, buf);
-+    }
-+    else
-+    {
-+        strftime(
-+            output, sizeof(output), format == RFC_1123 ? "%a, %d %b %Y %H:%M:%S GMT" : "%Y-%m-%dT%H:%M:%SZ", &datetime);
-+    }
- 
--        t.tm_year -= 1900;
--        str += 5; // parsed year
-+    return std::string(output);
-+#endif
-+}
- 
--        if (!ascii_isdigit2(str[0]) || !ascii_isdigit(str[1]) || str[2] != _XPLATSTR(':') || !ascii_isdigit5(str[3]) ||
--            !ascii_isdigit(str[4]))
--        {
--            return result;
--        }
-+#ifdef _WIN32
-+bool __cdecl datetime::system_type_to_datetime(void* pvsysTime, uint64_t seconds, datetime* pdt)
-+{
-+    SYSTEMTIME* psysTime = (SYSTEMTIME*)pvsysTime;
-+    FILETIME fileTime;
- 
--        t.tm_hour = atoi2(str);
--        if (t.tm_hour > 23)
--        {
--            return result;
--        }
-+    if (SystemTimeToFileTime(psysTime, &fileTime))
-+    {
-+        ULARGE_INTEGER largeInt;
-+        largeInt.LowPart = fileTime.dwLowDateTime;
-+        largeInt.HighPart = fileTime.dwHighDateTime;
- 
--        str += 3; // parsed hour
--        t.tm_min = atoi2(str);
--        str += 2; // parsed mins
-+        // Add hundredths of nanoseconds
-+        largeInt.QuadPart += seconds;
- 
--        if (str[0] == ':')
--        {
--            if (!ascii_isdigit6(str[1]) || !ascii_isdigit(str[2]) || str[3] != _XPLATSTR(' '))
--            {
--                return result;
--            }
-+        *pdt = datetime(largeInt.QuadPart);
-+        return true;
-+    }
-+    return false;
-+}
-+#endif
- 
--            t.tm_sec = atoi2(str + 1);
--            str += 4; // parsed seconds
--        }
--        else if (str[0] == _XPLATSTR(' '))
--        {
--            t.tm_sec = 0;
--            str += 1; // parsed seconds
--        }
--        else
--        {
--            return result;
-+// Take a string that represents a fractional second and return the number of ticks
-+// This is equivalent to doing atof on the string and multiplying by 10000000,
-+// but does not lose precision
-+template<typename StringIterator>
-+uint64_t timeticks_from_second(StringIterator begin, StringIterator end)
-+{
-+    int size = (int)(end - begin);
-+    _ASSERTE(begin[0] == U('.'));
-+    uint64_t ufrac_second = 0;
-+    for (int i = 1; i <= 7; ++i)
-+    {
-+        ufrac_second *= 10;
-+        int add = i < size ? begin[i] - U('0') : 0;
-+        ufrac_second += add;
-+    }
-+    return ufrac_second;
-+}
-+
-+void extract_fractional_second(const utility::string_t& dateString,
-+                               utility::string_t& resultString,
-+                               uint64_t& ufrac_second)
-+{
-+    resultString = dateString;
-+    // First, the string must be strictly longer than 2 characters, and the trailing character must be 'Z'
-+    if (resultString.size() > 2 && resultString[resultString.size() - 1] == U('Z'))
-+    {
-+        // Second, find the last non-digit by scanning the string backwards
-+        auto last_non_digit = std::find_if_not(resultString.rbegin() + 1, resultString.rend(), is_digit);
-+        if (last_non_digit < resultString.rend() - 1)
-+        {
-+            // Finally, make sure the last non-digit is a dot:
-+            auto last_dot = last_non_digit.base() - 1;
-+            if (*last_dot == U('.'))
-+            {
-+                // Got it! Now extract the fractional second
-+                auto last_before_Z = std::end(resultString) - 1;
-+                ufrac_second = timeticks_from_second(last_dot, last_before_Z);
-+                // And erase it from the string
-+                resultString.erase(last_dot, last_before_Z);
-+            }
-         }
-+    }
-+}
- 
--        if (t.tm_sec > 60)
--        { // 60 to allow leap seconds
--            return result;
--        }
-+datetime __cdecl datetime::from_string(const utility::string_t& dateString, date_format format)
-+{
-+    // avoid floating point math to preserve precision
-+    uint64_t ufrac_second = 0;
- 
--        t.tm_isdst = 0;
--        seconds = make_gm_time(&t);
--        if (seconds < 0)
--        {
--            return result;
--        }
-+#ifdef _WIN32
-+    datetime result;
-+    if (format == RFC_1123)
-+    {
-+        SYSTEMTIME sysTime = {0};
- 
--        if (parsedWeekday >= 0 && parsedWeekday != t.tm_wday)
--        {
--            return result;
--        }
-+        std::wstring month(3, L'\0');
-+        std::wstring unused(3, L'\0');
- 
--        if (!string_starts_with(str, "GMT") && !string_starts_with(str, "UT"))
--        {
--            // some timezone adjustment necessary
--            auto tzCh = _XPLATSTR('-');
--            int tzHours;
--            int tzMinutes = 0;
--            if (string_starts_with(str, "EDT"))
--            {
--                tzHours = 4;
--            }
--            else if (string_starts_with(str, "EST") || string_starts_with(str, "CDT"))
--            {
--                tzHours = 5;
--            }
--            else if (string_starts_with(str, "CST") || string_starts_with(str, "MDT"))
--            {
--                tzHours = 6;
--            }
--            else if (string_starts_with(str, "MST") || string_starts_with(str, "PDT"))
--            {
--                tzHours = 7;
--            }
--            else if (string_starts_with(str, "PST"))
--            {
--                tzHours = 8;
--            }
--            else if ((tzCh == _XPLATSTR('+') || tzCh == _XPLATSTR('-')) && ascii_isdigit2(str[1]) &&
--                     ascii_isdigit(str[2]) && ascii_isdigit5(str[3]) && ascii_isdigit(str[4]))
--            {
--                tzCh = str[0];
--                tzHours = atoi2(str + 1);
--                tzMinutes = atoi2(str + 3);
--            }
--            else
--            {
--                return result;
--            }
-+        const wchar_t* formatString = L"%3c, %2d %3c %4d %2d:%2d:%2d %3c";
-+        auto n = swscanf_s(dateString.c_str(),
-+                           formatString,
-+                           unused.data(),
-+                           unused.size(),
-+                           &sysTime.wDay,
-+                           month.data(),
-+                           month.size(),
-+                           &sysTime.wYear,
-+                           &sysTime.wHour,
-+                           &sysTime.wMinute,
-+                           &sysTime.wSecond,
-+                           unused.data(),
-+                           unused.size());
-+
-+        if (n == 8)
-+        {
-+            std::wstring monthnames[12] = {
-+                L"Jan", L"Feb", L"Mar", L"Apr", L"May", L"Jun", L"Jul", L"Aug", L"Sep", L"Oct", L"Nov", L"Dec"};
-+            auto loc =
-+                std::find_if(monthnames, monthnames + 12, [&month](const std::wstring& m) { return m == month; });
- 
--            seconds = timezone_adjust(seconds, static_cast<unsigned char>(tzCh), tzHours, tzMinutes);
--            if (seconds < 0)
-+            if (loc != monthnames + 12)
-             {
--                return result;
-+                sysTime.wMonth = (short)((loc - monthnames) + 1);
-+                if (system_type_to_datetime(&sysTime, ufrac_second, &result))
-+                {
-+                    return result;
-+                }
-             }
-         }
-     }
-     else if (format == ISO_8601)
-     {
--        // parse year
--        if (!ascii_isdigit3(str[0]) || !ascii_isdigit(str[1]) || !ascii_isdigit(str[2]) || !ascii_isdigit(str[3]))
--        {
--            return result;
--        }
-+        // Unlike FILETIME, SYSTEMTIME does not have enough precision to hold seconds in 100 nanosecond
-+        // increments. Therefore, start with seconds and milliseconds set to 0, then add them separately
- 
--        t.tm_year = (str[0] - _XPLATSTR('0')) * 1000 + (str[1] - _XPLATSTR('0')) * 100 +
--                    (str[2] - _XPLATSTR('0')) * 10 + (str[3] - _XPLATSTR('0'));
--        if (t.tm_year < 1970 || t.tm_year > 3000)
--        {
--            return result;
--        }
-+        // Try to extract the fractional second from the timestamp
-+        utility::string_t input;
-+        extract_fractional_second(dateString, input, ufrac_second);
-+        {
-+            SYSTEMTIME sysTime = {0};
-+            const wchar_t* formatString = L"%4d-%2d-%2dT%2d:%2d:%2dZ";
-+            auto n = swscanf_s(input.c_str(),
-+                               formatString,
-+                               &sysTime.wYear,
-+                               &sysTime.wMonth,
-+                               &sysTime.wDay,
-+                               &sysTime.wHour,
-+                               &sysTime.wMinute,
-+                               &sysTime.wSecond);
- 
--        str += 4;
--        if (*str == _XPLATSTR('-'))
--        {
--            ++str;
-+            if (n == 3 || n == 6)
-+            {
-+                if (system_type_to_datetime(&sysTime, ufrac_second, &result))
-+                {
-+                    return result;
-+                }
-+            }
-         }
--
--        // parse month
--        if (!ascii_isdigit1(str[0]) || !ascii_isdigit(str[1]))
-         {
--            return result;
--        }
-+            SYSTEMTIME sysTime = {0};
-+            DWORD date = 0;
- 
--        t.tm_mon = atoi2(str);
--        if (t.tm_mon < 1 || t.tm_mon > 12)
--        {
--            return result;
--        }
--
--        t.tm_mon -= 1;
--        str += 2;
-+            const wchar_t* formatString = L"%8dT%2d:%2d:%2dZ";
-+            auto n = swscanf_s(input.c_str(), formatString, &date, &sysTime.wHour, &sysTime.wMinute, &sysTime.wSecond);
- 
--        if (*str == _XPLATSTR('-'))
--        {
--            ++str;
--        }
-+            if (n == 1 || n == 4)
-+            {
-+                sysTime.wDay = date % 100;
-+                date /= 100;
-+                sysTime.wMonth = date % 100;
-+                date /= 100;
-+                sysTime.wYear = (WORD)date;
- 
--        // parse day
--        if (!ascii_isdigit3(str[0]) || !ascii_isdigit(str[1]))
--        {
--            return result;
-+                if (system_type_to_datetime(&sysTime, ufrac_second, &result))
-+                {
-+                    return result;
-+                }
-+            }
-         }
--
--        t.tm_mday = atoi2(str);
--        if (!validate_day_month(t.tm_mday, t.tm_mon, t.tm_year))
-         {
--            return result;
--        }
-+            SYSTEMTIME sysTime = {0};
-+            GetSystemTime(&sysTime); // Fill date portion with today's information
-+            sysTime.wSecond = 0;
-+            sysTime.wMilliseconds = 0;
- 
--        t.tm_year -= 1900;
--        str += 2;
-+            const wchar_t* formatString = L"%2d:%2d:%2dZ";
-+            auto n = swscanf_s(input.c_str(), formatString, &sysTime.wHour, &sysTime.wMinute, &sysTime.wSecond);
- 
--        if (str[0] != _XPLATSTR('T') && str[0] != _XPLATSTR('t'))
--        {
--            // No time
--            seconds = make_gm_time(&t);
--            if (seconds < 0)
-+            if (n == 3)
-             {
--                return result;
-+                if (system_type_to_datetime(&sysTime, ufrac_second, &result))
-+                {
-+                    return result;
-+                }
-             }
--
--            seconds += ntToUnixOffsetSeconds;
--            result.m_interval = static_cast<interval_type>(seconds) * _secondTicks;
--            return result;
-         }
-+    }
- 
--        ++str; // skip 'T'
-+    return datetime();
-+#else
-+    std::string input(dateString);
- 
--        // parse hour
--        if (!ascii_isdigit2(str[0]) || !ascii_isdigit(str[1]))
--        {
--            return result;
--        }
-+    struct tm output = tm();
- 
--        t.tm_hour = atoi2(str);
--        str += 2;
--        if (t.tm_hour > 23)
--        {
--            return result;
--        }
-+    if (format == RFC_1123)
-+    {
-+        strptime(input.data(), "%a, %d %b %Y %H:%M:%S GMT", &output);
-+    }
-+    else
-+    {
-+        // Try to extract the fractional second from the timestamp
-+        utility::string_t input;
-+        extract_fractional_second(dateString, input, ufrac_second);
- 
--        if (*str == _XPLATSTR(':'))
--        {
--            ++str;
--        }
-+        auto result = strptime(input.data(), "%Y-%m-%dT%H:%M:%SZ", &output);
- 
--        // parse minute
--        if (!ascii_isdigit5(str[0]) || !ascii_isdigit(str[1]))
-+        if (result == nullptr)
-         {
--            return result;
-+            result = strptime(input.data(), "%Y%m%dT%H:%M:%SZ", &output);
-         }
--        t.tm_min = atoi2(str);
--        // t.tm_min > 59 is impossible because we checked that the first digit is <= 5 in the basic format
--        // check above
--
--        str += 2;
--
--        if (*str == _XPLATSTR(':'))
-+        if (result == nullptr)
-         {
--            ++str;
-+            // Fill the date portion with the epoch,
-+            // strptime will do the rest
-+            memset(&output, 0, sizeof(struct tm));
-+            output.tm_year = 70;
-+            output.tm_mon = 1;
-+            output.tm_mday = 1;
-+            result = strptime(input.data(), "%H:%M:%SZ", &output);
-         }
--
--        // parse seconds
--        if (!ascii_isdigit6(str[0]) || !ascii_isdigit(str[1]))
-+        if (result == nullptr)
-         {
--            return result;
-+            result = strptime(input.data(), "%Y-%m-%d", &output);
-         }
--
--        t.tm_sec = atoi2(str);
--        // We allow 60 to account for leap seconds
--        if (t.tm_sec > 60)
-+        if (result == nullptr)
-         {
--            return result;
-+            result = strptime(input.data(), "%Y%m%d", &output);
-         }
--
--        str += 2;
--        if (str[0] == _XPLATSTR('.') && ascii_isdigit(str[1]))
-+        if (result == nullptr)
-         {
--            ++str;
--            int digits = 7;
--            for (;;)
--            {
--                frac_sec *= 10;
--                frac_sec += *str - _XPLATSTR('0');
--                --digits;
--                ++str;
--                if (digits == 0)
--                {
--                    while (ascii_isdigit(*str))
--                    {
--                        // consume remaining fractional second digits we can't use
--                        ++str;
--                    }
--
--                    break;
--                }
--
--                if (!ascii_isdigit(*str))
--                {
--                    // no more digits in the input, do the remaining multiplies we need
--                    for (; digits != 0; --digits)
--                    {
--                        frac_sec *= 10;
--                    }
--
--                    break;
--                }
--            }
-+            return datetime();
-         }
-+    }
- 
--        seconds = make_gm_time(&t);
--        if (seconds < 0)
--        {
--            return result;
--        }
-+#if (defined(ANDROID) || defined(__ANDROID__))
-+    // HACK: The (nonportable?) POSIX function timegm is not available in
-+    //       bionic. As a workaround[1][2], we set the C library timezone to
-+    //       UTC, call mktime, then set the timezone back. However, the C
-+    //       environment is fundamentally a shared global resource and thread-
-+    //       unsafe. We can protect our usage here, however any other code might
-+    //       manipulate the environment at the same time.
-+    //
-+    // [1] http://linux.die.net/man/3/timegm
-+    // [2] http://www.gnu.org/software/libc/manual/html_node/Broken_002ddown-Time.html
-+    time_t time;
- 
--        if (str[0] == _XPLATSTR('Z') || str[0] == _XPLATSTR('z'))
-+    static boost::mutex env_var_lock;
-+    {
-+        boost::lock_guard<boost::mutex> lock(env_var_lock);
-+        std::string prev_env;
-+        auto prev_env_cstr = getenv("TZ");
-+        if (prev_env_cstr != nullptr)
-         {
--            // no adjustment needed for zulu time
-+            prev_env = prev_env_cstr;
-         }
--        else if (str[0] == _XPLATSTR('+') || str[0] == _XPLATSTR('-'))
--        {
--            const unsigned char offsetDirection = static_cast<unsigned char>(str[0]);
--            if (!ascii_isdigit2(str[1]) || !ascii_isdigit(str[2]) || str[3] != _XPLATSTR(':') ||
--                !ascii_isdigit5(str[4]) || !ascii_isdigit(str[5]))
--            {
--                return result;
--            }
-+        setenv("TZ", "UTC", 1);
- 
--            seconds = timezone_adjust(seconds, offsetDirection, atoi2(str + 1), atoi2(str + 4));
--            if (seconds < 0)
--            {
--                return result;
--            }
-+        time = mktime(&output);
-+
-+        if (prev_env_cstr)
-+        {
-+            setenv("TZ", prev_env.c_str(), 1);
-         }
-         else
-         {
--            // the timezone is malformed, but cpprestsdk currently accepts this as no timezone
-+            unsetenv("TZ");
-         }
-     }
--    else
--    {
--        throw std::invalid_argument("unrecognized date format");
--    }
-+#else
-+    time_t time = timegm(&output);
-+#endif
-+
-+    struct timeval tv = timeval();
-+    tv.tv_sec = time;
-+    auto result = timeval_to_datetime(tv);
- 
--    seconds += ntToUnixOffsetSeconds;
--    result.m_interval = static_cast<interval_type>(seconds) * _secondTicks + frac_sec;
-+    // fractional seconds are already in correct format so just add them.
-+    result = result + ufrac_second;
-     return result;
-+#endif
- }
- 
- /// <summary>
-@@ -1358,32 +1181,38 @@ utility::seconds __cdecl timespan::xml_d
-     // The final S could be omitted
- 
-     int64_t numSecs = 0;
--    auto cursor = timespanString.c_str();
--    auto c = *cursor++; // skip 'P'
--    while (c)
-+
-+    utility::istringstream_t is(timespanString);
-+    is.imbue(std::locale::classic());
-+    auto eof = std::char_traits<utility::char_t>::eof();
-+
-+    std::basic_istream<utility::char_t>::int_type c;
-+    c = is.get(); // P
-+
-+    while (c != eof)
-     {
-         int val = 0;
--        c = *cursor++;
-+        c = is.get();
- 
--        while (ascii_isdigit(c))
-+        while (is_digit((utility::char_t)c))
-         {
--            val = val * 10 + (c - _XPLATSTR('0'));
--            c = *cursor++;
-+            val = val * 10 + (c - L'0');
-+            c = is.get();
- 
--            if (c == _XPLATSTR('.'))
-+            if (c == '.')
-             {
-                 // decimal point is not handled
-                 do
-                 {
--                    c = *cursor++;
--                } while (ascii_isdigit(c));
-+                    c = is.get();
-+                } while (is_digit((utility::char_t)c));
-             }
-         }
- 
--        if (c == _XPLATSTR('D')) numSecs += val * 24 * 3600; // days
--        if (c == _XPLATSTR('H')) numSecs += val * 3600;      // Hours
--        if (c == _XPLATSTR('M')) numSecs += val * 60;        // Minutes
--        if (c == _XPLATSTR('S') || c == _XPLATSTR('\0'))
-+        if (c == L'D') numSecs += val * 24 * 3600; // days
-+        if (c == L'H') numSecs += val * 3600;      // Hours
-+        if (c == L'M') numSecs += val * 60;        // Minutes
-+        if (c == L'S' || c == eof)
-         {
-             numSecs += val; // seconds
-             break;
-@@ -1393,12 +1222,12 @@ utility::seconds __cdecl timespan::xml_d
-     return utility::seconds(numSecs);
- }
- 
--static const utility::char_t c_allowed_chars[] =
--    _XPLATSTR("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
-+const utility::string_t nonce_generator::c_allowed_chars(
-+    _XPLATSTR("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"));
- 
- utility::string_t nonce_generator::generate()
- {
--    std::uniform_int_distribution<> distr(0, static_cast<int>(sizeof(c_allowed_chars) / sizeof(utility::char_t)) - 1);
-+    std::uniform_int_distribution<> distr(0, static_cast<int>(c_allowed_chars.length() - 1));
-     utility::string_t result;
-     result.reserve(length());
-     std::generate_n(std::back_inserter(result), length(), [&]() { return c_allowed_chars[distr(m_random)]; });
---- cpprest-2.10.12.orig/Release/tests/functional/utils/datetime.cpp
-+++ cpprest-2.10.12/Release/tests/functional/utils/datetime.cpp
-@@ -74,6 +74,16 @@ SUITE(datetime)
-         }
-     }
- 
-+    TEST(parsing_time_extended)
-+    {
-+        // ISO 8601
-+        {
-+            auto dt = utility::datetime::from_string(_XPLATSTR("14:30:01Z"), utility::datetime::ISO_8601);
-+
-+            VERIFY_ARE_NOT_EQUAL(0u, dt.to_interval());
-+        }
-+    }
-+
-     void TestDateTimeRoundtrip(utility::string_t str, utility::string_t strExpected)
-     {
-         auto dt = utility::datetime::from_string(str, utility::datetime::ISO_8601);
-@@ -91,8 +101,6 @@ SUITE(datetime)
- 
-     TEST(parsing_time_roundtrip_datetime2)
-     {
--        // lose the last '000'
--        TestDateTimeRoundtrip(_XPLATSTR("2013-11-19T14:30:59.1234567000Z"), _XPLATSTR("2013-11-19T14:30:59.1234567Z"));
-         // lose the last '999' without rounding up
-         TestDateTimeRoundtrip(_XPLATSTR("2013-11-19T14:30:59.1234567999Z"), _XPLATSTR("2013-11-19T14:30:59.1234567Z"));
-     }
-@@ -121,260 +129,16 @@ SUITE(datetime)
-         TestDateTimeRoundtrip(_XPLATSTR("2013-11-19T14:30:59.5Z"));
-     }
- 
--    void TestRfc1123IsTimeT(const utility::char_t* str, time_t t)
--    {
--        datetime dt = datetime::from_string(str, utility::datetime::RFC_1123);
--        uint64_t interval = dt.to_interval();
--        VERIFY_ARE_EQUAL(0, interval % 10000000);
--        interval /= 10000000;
--        interval -= 11644473600; // NT epoch adjustment
--        VERIFY_ARE_EQUAL(static_cast<uint64_t>(t), interval);
--    }
--
--    TEST(parsing_time_rfc1123_accepts_each_day)
--    {
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:00 GMT"), (time_t) 0);
--        TestRfc1123IsTimeT(_XPLATSTR("Fri, 02 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 1);
--        TestRfc1123IsTimeT(_XPLATSTR("Sat, 03 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 2);
--        TestRfc1123IsTimeT(_XPLATSTR("Sun, 04 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 3);
--        TestRfc1123IsTimeT(_XPLATSTR("Mon, 05 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 4);
--        TestRfc1123IsTimeT(_XPLATSTR("Tue, 06 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 5);
--        TestRfc1123IsTimeT(_XPLATSTR("Wed, 07 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 6);
--    }
--
--    TEST(parsing_time_rfc1123_boundary_cases)
--    {
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:00 GMT"), (time_t) 0);
--        TestRfc1123IsTimeT(_XPLATSTR("19 Jan 2038 03:14:06 GMT"), (time_t) INT_MAX - 1);
--#ifndef _USE_32BIT_TIME_T
--        TestRfc1123IsTimeT(_XPLATSTR("19 Jan 2038 03:13:07 -0001"), (time_t) INT_MAX);
--        TestRfc1123IsTimeT(_XPLATSTR("19 Jan 2038 03:14:07 -0000"), (time_t) INT_MAX);
--#endif // _USE_32BIT_TIME_T
--        TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 +0000"), (time_t) 1547507781);
--        TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 -0001"), (time_t) 1547507841);
--        TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 +0001"), (time_t) 1547507721);
--        TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 -0100"), (time_t) 1547511381);
--        TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 +0100"), (time_t) 1547504181);
--    }
--
--    TEST(parsing_time_rfc1123_uses_each_field)
--    {
--        TestRfc1123IsTimeT(_XPLATSTR("02 Jan 1970 00:00:00 GMT"), (time_t) 86400);
--        TestRfc1123IsTimeT(_XPLATSTR("12 Jan 1970 00:00:00 GMT"), (time_t) 950400);
--        TestRfc1123IsTimeT(_XPLATSTR("01 Feb 1970 00:00:00 GMT"), (time_t) 2678400);
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 2000 00:00:00 GMT"), (time_t) 946684800);
--#ifndef _USE_32BIT_TIME_T
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 2100 00:00:00 GMT"), (time_t) 4102444800);
--#endif // _USE_32BIT_TIME_T
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1990 00:00:00 GMT"), (time_t) 631152000);
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1971 00:00:00 GMT"), (time_t) 31536000);
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 10:00:00 GMT"), (time_t) 36000);
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 01:00:00 GMT"), (time_t) 3600);
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:10:00 GMT"), (time_t) 600);
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:01:00 GMT"), (time_t) 60);
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:10 GMT"), (time_t) 10);
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:01 GMT"), (time_t) 1);
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 10:00:00 GMT"), (time_t) 36000);
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 02:00:00 PST"), (time_t) 36000);
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 03:00:00 PDT"), (time_t) 36000);
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 03:00:00 MST"), (time_t) 36000);
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 04:00:00 MDT"), (time_t) 36000);
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 04:00:00 CST"), (time_t) 36000);
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 05:00:00 CDT"), (time_t) 36000);
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 05:00:00 EST"), (time_t) 36000);
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 06:00:00 EDT"), (time_t) 36000);
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 06:00:00 -0400"), (time_t) 36000);
--        TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 05:59:00 -0401"), (time_t) 36000);
--    }
--
--    TEST(parsing_time_rfc1123_max_days)
--    {
--        TestRfc1123IsTimeT(_XPLATSTR("31 Jan 1970 00:00:00 GMT"), (time_t) 2592000);
--        TestRfc1123IsTimeT(_XPLATSTR("28 Feb 2019 00:00:00 GMT"), (time_t) 1551312000); // non leap year allows feb 28
--        TestRfc1123IsTimeT(_XPLATSTR("29 Feb 2020 00:00:00 GMT"), (time_t) 1582934400); // leap year allows feb 29
--        TestRfc1123IsTimeT(_XPLATSTR("31 Mar 1970 00:00:00 GMT"), (time_t) 7689600);
--        TestRfc1123IsTimeT(_XPLATSTR("30 Apr 1970 00:00:00 GMT"), (time_t) 10281600);
--        TestRfc1123IsTimeT(_XPLATSTR("31 May 1970 00:00:00 GMT"), (time_t) 12960000);
--        TestRfc1123IsTimeT(_XPLATSTR("30 Jun 1970 00:00:00 GMT"), (time_t) 15552000);
--        TestRfc1123IsTimeT(_XPLATSTR("31 Jul 1970 00:00:00 GMT"), (time_t) 18230400);
--        TestRfc1123IsTimeT(_XPLATSTR("31 Aug 1970 00:00:00 GMT"), (time_t) 20908800);
--        TestRfc1123IsTimeT(_XPLATSTR("30 Sep 1970 00:00:00 GMT"), (time_t) 23500800);
--        TestRfc1123IsTimeT(_XPLATSTR("31 Oct 1970 00:00:00 GMT"), (time_t) 26179200);
--        TestRfc1123IsTimeT(_XPLATSTR("30 Nov 1970 00:00:00 GMT"), (time_t) 28771200);
--        TestRfc1123IsTimeT(_XPLATSTR("31 Dec 1970 00:00:00 GMT"), (time_t) 31449600);
--    }
--
--    TEST(parsing_time_rfc1123_invalid_cases)
--    {
--        const utility::string_t bad_strings[] = {
--            _XPLATSTR("Ahu, 01 Jan 1970 00:00:00 GMT"), // bad letters in each place
--            _XPLATSTR("TAu, 01 Jan 1970 00:00:00 GMT"),
--            _XPLATSTR("ThA, 01 Jan 1970 00:00:00 GMT"),
--            _XPLATSTR("ThuA 01 Jan 1970 00:00:00 GMT"),
--            _XPLATSTR("Thu,A01 Jan 1970 00:00:00 GMT"),
--            _XPLATSTR("Thu, A1 Jan 1970 00:00:00 GMT"),
--            _XPLATSTR("Thu, 0A Jan 1970 00:00:00 GMT"),
--            _XPLATSTR("Thu, 01AJan 1970 00:00:00 GMT"),
--            _XPLATSTR("Thu, 01 Aan 1970 00:00:00 GMT"),
--            _XPLATSTR("Thu, 01 JAn 1970 00:00:00 GMT"),
--            _XPLATSTR("Thu, 01 JaA 1970 00:00:00 GMT"),
--            _XPLATSTR("Thu, 01 JanA1970 00:00:00 GMT"),
--            _XPLATSTR("Thu, 01 Jan A970 00:00:00 GMT"),
--            _XPLATSTR("Thu, 01 Jan 1A70 00:00:00 GMT"),
--            _XPLATSTR("Thu, 01 Jan 19A0 00:00:00 GMT"),
--            _XPLATSTR("Thu, 01 Jan 197A 00:00:00 GMT"),
--            _XPLATSTR("Thu, 01 Jan 1970A00:00:00 GMT"),
--            _XPLATSTR("Thu, 01 Jan 1970 A0:00:00 GMT"),
--            _XPLATSTR("Thu, 01 Jan 1970 0A:00:00 GMT"),
--            _XPLATSTR("Thu, 01 Jan 1970 00A00:00 GMT"),
--            _XPLATSTR("Thu, 01 Jan 1970 00:A0:00 GMT"),
--            _XPLATSTR("Thu, 01 Jan 1970 00:0A:00 GMT"),
--            _XPLATSTR("Thu, 01 Jan 1970 00:00A00 GMT"),
--            _XPLATSTR("Thu, 01 Jan 1970 00:00:A0 GMT"),
--            _XPLATSTR("Thu, 01 Jan 1970 00:00:0A GMT"),
--            _XPLATSTR("Thu, 01 Jan 1970 00:00:00AGMT"),
--            _XPLATSTR("Thu, 01 Jan 1970 00:00:00 AMT"),
--            _XPLATSTR("Thu, 01 Jan 1970 00:00:00 GAT"),
--            _XPLATSTR("Thu, 01 Jan 1970 00:00:00 GMA"),
--            _XPLATSTR(""), // truncation
--            _XPLATSTR("T"),
--            _XPLATSTR("Th"),
--            _XPLATSTR("Thu"),
--            _XPLATSTR("Thu,"),
--            _XPLATSTR("Thu, "),
--            _XPLATSTR("Thu, 0"),
--            _XPLATSTR("Thu, 01"),
--            _XPLATSTR("Thu, 01 "),
--            _XPLATSTR("Thu, 01 J"),
--            _XPLATSTR("Thu, 01 Ja"),
--            _XPLATSTR("Thu, 01 Jan"),
--            _XPLATSTR("Thu, 01 Jan "),
--            _XPLATSTR("Thu, 01 Jan 1"),
--            _XPLATSTR("Thu, 01 Jan 19"),
--            _XPLATSTR("Thu, 01 Jan 197"),
--            _XPLATSTR("Thu, 01 Jan 1970"),
--            _XPLATSTR("Thu, 01 Jan 1970 "),
--            _XPLATSTR("Thu, 01 Jan 1970 0"),
--            _XPLATSTR("Thu, 01 Jan 1970 00"),
--            _XPLATSTR("Thu, 01 Jan 1970 00:"),
--            _XPLATSTR("Thu, 01 Jan 1970 00:0"),
--            _XPLATSTR("Thu, 01 Jan 1970 00:00"),
--            _XPLATSTR("Thu, 01 Jan 1970 00:00:"),
--            _XPLATSTR("Thu, 01 Jan 1970 00:00:0"),
--            _XPLATSTR("Thu, 01 Jan 1970 00:00:00"),
--            _XPLATSTR("Thu, 01 Jan 1970 00:00:00 "),
--            _XPLATSTR("Thu, 01 Jan 1970 00:00:00 G"),
--            _XPLATSTR("Thu, 01 Jan 1970 00:00:00 GM"),
--            _XPLATSTR("Fri, 01 Jan 1970 00:00:00 GMT"), // wrong day
--            _XPLATSTR("01 Jan 4970 00:00:00 GMT"), // year too big
--            _XPLATSTR("01 Jan 3001 00:00:00 GMT"),
--            _XPLATSTR("01 Xxx 1971 00:00:00 GMT"), // month bad
--            _XPLATSTR("00 Jan 1971 00:00:00 GMT"), // day too small
--            _XPLATSTR("32 Jan 1971 00:00:00 GMT"), // day too big
--            _XPLATSTR("30 Feb 1971 00:00:00 GMT"), // day too big for feb
--            _XPLATSTR("30 Feb 1971 00:00:00 GMT"), // day too big for feb (non-leap year)
--            _XPLATSTR("32 Mar 1971 00:00:00 GMT"), // other months
--            _XPLATSTR("31 Apr 1971 00:00:00 GMT"),
--            _XPLATSTR("32 May 1971 00:00:00 GMT"),
--            _XPLATSTR("31 Jun 1971 00:00:00 GMT"),
--            _XPLATSTR("32 Jul 1971 00:00:00 GMT"),
--            _XPLATSTR("32 Aug 1971 00:00:00 GMT"),
--            _XPLATSTR("31 Sep 1971 00:00:00 GMT"),
--            _XPLATSTR("32 Oct 1971 00:00:00 GMT"),
--            _XPLATSTR("31 Nov 1971 00:00:00 GMT"),
--            _XPLATSTR("32 Dec 1971 00:00:00 GMT"),
--            _XPLATSTR("01 Jan 1971 70:00:00 GMT"), // hour too big
--            _XPLATSTR("01 Jan 1971 24:00:00 GMT"),
--            _XPLATSTR("01 Jan 1971 00:60:00 GMT"), // minute too big
--            _XPLATSTR("01 Jan 1971 00:00:70 GMT"), // second too big
--            _XPLATSTR("01 Jan 1971 00:00:61 GMT"),
--            _XPLATSTR("01 Jan 1969 00:00:00 GMT"), // underflow
--            _XPLATSTR("01 Jan 1969 00:00:00 CEST"), // bad tz
--            _XPLATSTR("01 Jan 1970 00:00:00 +2400"), // bad tzoffsets
--            _XPLATSTR("01 Jan 1970 00:00:00 -3000"),
--            _XPLATSTR("01 Jan 1970 00:00:00 +2160"),
--            _XPLATSTR("01 Jan 1970 00:00:00 -2400"),
--            _XPLATSTR("01 Jan 1970 00:00:00 -2160"),
--        };
--
--        for (const auto& str : bad_strings)
--        {
--            auto dt = utility::datetime::from_string(str, utility::datetime::RFC_1123);
--            VERIFY_ARE_EQUAL(0, dt.to_interval());
--        }
--    }
--
--    TEST(parsing_time_iso8601_boundary_cases)
--    {
--        // boundary cases:
--        TestDateTimeRoundtrip(_XPLATSTR("1970-01-01T00:00:00Z"));                                         // epoch
--        TestDateTimeRoundtrip(_XPLATSTR("2038-01-19T03:14:06+00:00"), _XPLATSTR("2038-01-19T03:14:06Z")); // INT_MAX - 1
--#ifndef _USE_32BIT_TIME_T
--        TestDateTimeRoundtrip(_XPLATSTR("2038-01-19T03:13:07-00:01"),
--                              _XPLATSTR("2038-01-19T03:14:07Z")); // INT_MAX after subtacting 1
--        TestDateTimeRoundtrip(_XPLATSTR("2038-01-19T03:14:07-00:00"), _XPLATSTR("2038-01-19T03:14:07Z"));
--#endif // _USE_32BIT_TIME_T
--    }
--
--    TEST(parsing_time_iso8601_uses_each_timezone_digit)
--    {
--        TestDateTimeRoundtrip(_XPLATSTR("2019-01-14T23:16:21+00:00"), _XPLATSTR("2019-01-14T23:16:21Z"));
--        TestDateTimeRoundtrip(_XPLATSTR("2019-01-14T23:16:21-00:01"), _XPLATSTR("2019-01-14T23:17:21Z"));
--        TestDateTimeRoundtrip(_XPLATSTR("2019-01-14T23:16:21+00:01"), _XPLATSTR("2019-01-14T23:15:21Z"));
--        TestDateTimeRoundtrip(_XPLATSTR("2019-01-14T23:16:21-01:00"), _XPLATSTR("2019-01-15T00:16:21Z"));
--        TestDateTimeRoundtrip(_XPLATSTR("2019-01-14T23:16:21+01:00"), _XPLATSTR("2019-01-14T22:16:21Z"));
--    }
--
--    TEST(parsing_time_iso8601_uses_each_digit)
--    {
--        TestDateTimeRoundtrip(_XPLATSTR("1970-01-01T00:00:01Z"));
--        TestDateTimeRoundtrip(_XPLATSTR("1970-01-01T00:01:00Z"));
--        TestDateTimeRoundtrip(_XPLATSTR("1970-01-01T01:00:00Z"));
--        TestDateTimeRoundtrip(_XPLATSTR("1970-01-02T00:00:00Z"));
--        TestDateTimeRoundtrip(_XPLATSTR("1970-02-01T00:00:00Z"));
--        TestDateTimeRoundtrip(_XPLATSTR("1971-01-01T00:00:00Z"));
--
--        TestDateTimeRoundtrip(_XPLATSTR("1999-01-01T00:00:00Z"));
--        TestDateTimeRoundtrip(_XPLATSTR("1970-12-01T00:00:00Z"));
--        TestDateTimeRoundtrip(_XPLATSTR("1970-09-01T00:00:00Z"));
--        TestDateTimeRoundtrip(_XPLATSTR("1970-01-30T00:00:00Z"));
--        TestDateTimeRoundtrip(_XPLATSTR("1970-01-31T00:00:00Z"));
--        TestDateTimeRoundtrip(_XPLATSTR("1970-01-01T23:00:00Z"));
--        TestDateTimeRoundtrip(_XPLATSTR("1970-01-01T19:00:00Z"));
--        TestDateTimeRoundtrip(_XPLATSTR("1970-01-01T00:59:00Z"));
--        TestDateTimeRoundtrip(_XPLATSTR("1970-01-01T00:00:59Z"));
--        TestDateTimeRoundtrip(_XPLATSTR("1970-01-01T00:00:60Z"), _XPLATSTR("1970-01-01T00:01:00Z")); // leap seconds
--    }
--
--    TEST(parsing_time_iso8601_accepts_month_max_days)
--    {
--        TestDateTimeRoundtrip(_XPLATSTR("1970-01-31T00:00:00Z")); // jan
--        TestDateTimeRoundtrip(_XPLATSTR("2019-02-28T00:00:00Z")); // non leap year allows feb 28
--        TestDateTimeRoundtrip(_XPLATSTR("2020-02-29T00:00:00Z")); // leap year allows feb 29
--        TestDateTimeRoundtrip(_XPLATSTR("1970-03-31T00:00:00Z")); // mar
--        TestDateTimeRoundtrip(_XPLATSTR("1970-04-30T00:00:00Z")); // apr
--        TestDateTimeRoundtrip(_XPLATSTR("1970-05-31T00:00:00Z")); // may
--        TestDateTimeRoundtrip(_XPLATSTR("1970-06-30T00:00:00Z")); // jun
--        TestDateTimeRoundtrip(_XPLATSTR("1970-07-31T00:00:00Z")); // jul
--        TestDateTimeRoundtrip(_XPLATSTR("1970-08-31T00:00:00Z")); // aug
--        TestDateTimeRoundtrip(_XPLATSTR("1970-09-30T00:00:00Z")); // sep
--        TestDateTimeRoundtrip(_XPLATSTR("1970-10-31T00:00:00Z")); // oct
--        TestDateTimeRoundtrip(_XPLATSTR("1970-11-30T00:00:00Z")); // nov
--        TestDateTimeRoundtrip(_XPLATSTR("1970-12-31T00:00:00Z")); // dec
--    }
--
--    TEST(parsing_time_iso8601_accepts_lowercase_t_z)
--    {
--        TestDateTimeRoundtrip(_XPLATSTR("1970-01-01t00:00:00Z"), _XPLATSTR("1970-01-01T00:00:00Z"));
--        TestDateTimeRoundtrip(_XPLATSTR("1970-01-01T00:00:00z"), _XPLATSTR("1970-01-01T00:00:00Z"));
--    }
--
--    TEST(parsing_time_roundtrip_datetime_accepts_invalid_no_trailing_timezone)
-+    TEST(parsing_time_roundtrip_datetime_invalid1,
-+         "Ignore:Linux",
-+         "Codeplex issue #115",
-+         "Ignore:Apple",
-+         "Codeplex issue #115")
-     {
-         // No digits after the dot, or non-digits. This is not a valid input, but we should not choke on it,
-         // Simply ignore the bad fraction
-         const utility::string_t bad_strings[] = {_XPLATSTR("2013-11-19T14:30:59.Z"),
--                                                 _XPLATSTR("2013-11-19T14:30:59.a12Z")};
-+                                                 _XPLATSTR("2013-11-19T14:30:59.1a2Z")};
-         utility::string_t str_corrected = _XPLATSTR("2013-11-19T14:30:59Z");
- 
-         for (const auto& str : bad_strings)
-@@ -387,87 +151,12 @@ SUITE(datetime)
- 
-     TEST(parsing_time_roundtrip_datetime_invalid2)
-     {
--        // Various unsupported cases. In all cases, we have produce an empty date time
-+        // Variouls unsupported cases. In all cases, we have produce an empty date time
-         const utility::string_t bad_strings[] = {
--            _XPLATSTR(""),                     // empty
--            _XPLATSTR(".Z"),                   // too short
--            _XPLATSTR(".Zx"),                  // no trailing Z
--            _XPLATSTR("3.14Z")                 // not a valid date
--            _XPLATSTR("a971-01-01T00:00:00Z"), // any non digits or valid separators
--            _XPLATSTR("1a71-01-01T00:00:00Z"),
--            _XPLATSTR("19a1-01-01T00:00:00Z"),
--            _XPLATSTR("197a-01-01T00:00:00Z"),
--            _XPLATSTR("1971a01-01T00:00:00Z"),
--            _XPLATSTR("1971-a1-01T00:00:00Z"),
--            _XPLATSTR("1971-0a-01T00:00:00Z"),
--            _XPLATSTR("1971-01a01T00:00:00Z"),
--            _XPLATSTR("1971-01-a1T00:00:00Z"),
--            _XPLATSTR("1971-01-0aT00:00:00Z"),
--            // _XPLATSTR("1971-01-01a00:00:00Z"), parsed as complete date
--            _XPLATSTR("1971-01-01Ta0:00:00Z"),
--            _XPLATSTR("1971-01-01T0a:00:00Z"),
--            _XPLATSTR("1971-01-01T00a00:00Z"),
--            _XPLATSTR("1971-01-01T00:a0:00Z"),
--            _XPLATSTR("1971-01-01T00:0a:00Z"),
--            _XPLATSTR("1971-01-01T00:00a00Z"),
--            _XPLATSTR("1971-01-01T00:00:a0Z"),
--            _XPLATSTR("1971-01-01T00:00:0aZ"),
--            // "1971-01-01T00:00:00a", accepted as per invalid_no_trailing_timezone above
--            _XPLATSTR("1"), // truncation
--            _XPLATSTR("19"),
--            _XPLATSTR("197"),
--            _XPLATSTR("1970"),
--            _XPLATSTR("1970-"),
--            _XPLATSTR("1970-0"),
--            _XPLATSTR("1970-01"),
--            _XPLATSTR("1970-01-"),
--            _XPLATSTR("1970-01-0"),
--            // _XPLATSTR("1970-01-01"), complete date
--            _XPLATSTR("1970-01-01T"),
--            _XPLATSTR("1970-01-01T0"),
--            _XPLATSTR("1970-01-01T00"),
--            _XPLATSTR("1970-01-01T00:"),
--            _XPLATSTR("1970-01-01T00:0"),
--            _XPLATSTR("1970-01-01T00:00"),
--            _XPLATSTR("1970-01-01T00:00:"),
--            _XPLATSTR("1970-01-01T00:00:0"),
--            // _XPLATSTR("1970-01-01T00:00:00"), // accepted as invalid timezone above
--            _XPLATSTR("4970-01-01T00:00:00Z"), // year too big
--            _XPLATSTR("3001-01-01T00:00:00Z"),
--            _XPLATSTR("1971-00-01T00:00:00Z"), // month too small
--            _XPLATSTR("1971-20-01T00:00:00Z"), // month too big
--            _XPLATSTR("1971-13-01T00:00:00Z"),
--            _XPLATSTR("1971-01-00T00:00:00Z"), // day too small
--            _XPLATSTR("1971-01-32T00:00:00Z"), // day too big
--            _XPLATSTR("1971-02-30T00:00:00Z"), // day too big for feb
--            _XPLATSTR("1971-02-30T00:00:00Z"), // day too big for feb (non-leap year)
--            _XPLATSTR("1971-03-32T00:00:00Z"), // other months
--            _XPLATSTR("1971-04-31T00:00:00Z"),
--            _XPLATSTR("1971-05-32T00:00:00Z"),
--            _XPLATSTR("1971-06-31T00:00:00Z"),
--            _XPLATSTR("1971-07-32T00:00:00Z"),
--            _XPLATSTR("1971-08-32T00:00:00Z"),
--            _XPLATSTR("1971-09-31T00:00:00Z"),
--            _XPLATSTR("1971-10-32T00:00:00Z"),
--            _XPLATSTR("1971-11-31T00:00:00Z"),
--            _XPLATSTR("1971-12-32T00:00:00Z"),
--            _XPLATSTR("1971-01-01T70:00:00Z"), // hour too big
--            _XPLATSTR("1971-01-01T24:00:00Z"),
--            _XPLATSTR("1971-01-01T00:60:00Z"), // minute too big
--            _XPLATSTR("1971-01-01T00:00:70Z"), // second too big
--            _XPLATSTR("1971-01-01T00:00:61Z"),
--            _XPLATSTR("1969-01-01T00:00:00Z"), // underflow
--#ifdef _USE_32BIT_TIME_T
--            _XPLATSTR("3000-01-01T00:00:01Z"), // overflow
--#endif
--            _XPLATSTR("3001-01-01T00:00:00Z"),
--            _XPLATSTR("1970-01-01T00:00:00+00:01"), // time zone underflow
--            // _XPLATSTR("1970-01-01T00:00:00.Z"), // accepted as invalid timezone above
--            _XPLATSTR("1970-01-01T00:00:00+24:00"), // bad tzoffsets
--            _XPLATSTR("1970-01-01T00:00:00-30:00"),
--            _XPLATSTR("1970-01-01T00:00:00+21:60"),
--            _XPLATSTR("1970-01-01T00:00:00-24:00"),
--            _XPLATSTR("1970-01-01T00:00:00-21:60"),
-+            _XPLATSTR(""),     // empty
-+            _XPLATSTR(".Z"),   // too short
-+            _XPLATSTR(".Zx"),  // no trailing Z
-+            _XPLATSTR("3.14Z") // not a valid date
-         };
- 
-         for (const auto& str : bad_strings)
-@@ -477,6 +166,16 @@ SUITE(datetime)
-         }
-     }
- 
-+    TEST(parsing_time_roundtrip_time)
-+    {
-+        // time only without date
-+        utility::string_t str = _XPLATSTR("14:30:59.1234567Z");
-+        auto dt = utility::datetime::from_string(str, utility::datetime::ISO_8601);
-+        utility::string_t str2 = dt.to_string(utility::datetime::ISO_8601);
-+        // Must look for a substring now, since the date part is filled with today's date
-+        VERIFY_IS_TRUE(str2.find(str) != std::string::npos);
-+    }
-+
- } // SUITE(datetime)
- 
- } // namespace utils_tests
diff --git a/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest_2.10.12.bb b/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest_2.10.12.bb
index 92c0453..67edf56 100644
--- a/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest_2.10.12.bb
+++ b/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest_2.10.12.bb
@@ -8,9 +8,7 @@
 EXTRA_OECMAKE = "-DCPPREST_EXPORT_DIR=cmake -DCPPREST_EXCLUDE_BROTLI=OFF"
 
 SRC_URI = "git://github.com/Microsoft/cpprestsdk.git;protocol=https;branch=master \
-           file://revert-9b670e5b33dfdbd501d618cd7e7498148ffbd559.patch \
-           file://revert-f10d9f8e214516d2c19aa6ef831ee874a58c0479.patch \
-           "
+           file://1094.patch "
 
 # tag 2.10.12
 SRCREV= "d4fb1cf7f7d22c12e2e442ba5a5e98d09b0a28ab"
diff --git a/meta-openembedded/meta-oe/recipes-support/imagemagick/imagemagick_7.0.7.bb b/meta-openembedded/meta-oe/recipes-support/imagemagick/imagemagick_7.0.8.bb
similarity index 94%
rename from meta-openembedded/meta-oe/recipes-support/imagemagick/imagemagick_7.0.7.bb
rename to meta-openembedded/meta-oe/recipes-support/imagemagick/imagemagick_7.0.8.bb
index 37d5a63..52b291d 100644
--- a/meta-openembedded/meta-oe/recipes-support/imagemagick/imagemagick_7.0.7.bb
+++ b/meta-openembedded/meta-oe/recipes-support/imagemagick/imagemagick_7.0.8.bb
@@ -4,14 +4,14 @@
 DESCRIPTION = "ImageMagick is a collection of tools for displaying, converting, and \
 editing raster and vector image files. It can read and write over 200 image file formats."
 LICENSE = "ImageMagick"
-LIC_FILES_CHKSUM = "file://LICENSE;md5=dad5a98f173fd3fa6958a1a58c6131c1"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=05ff94b3ff59fe6fa7489fa26e3d9142"
 # FIXME: There are many more checked libraries. All should be added or explicitly disabled to get consistent results.
-DEPENDS = "lcms bzip2 jpeg libpng tiff zlib fftw freetype"
+DEPENDS = "lcms bzip2 jpeg libpng tiff zlib fftw freetype libtool"
 
 BASE_PV := "${PV}"
-PV .= "_7"
+PV .= "_35"
 SRC_URI = "git://github.com/ImageMagick/ImageMagick.git "
-SRCREV = "e12602b39b5e778240d286b6f9bbbc0fe3fb26c5"
+SRCREV = "224159dfcc0ae3da9a247921e3c8bfb44d39965e"
 
 S = "${WORKDIR}/git"
 
diff --git a/meta-openembedded/meta-oe/recipes-support/libfann/libfann_git.bb b/meta-openembedded/meta-oe/recipes-support/libfann/libfann_git.bb
new file mode 100644
index 0000000..c986e17
--- /dev/null
+++ b/meta-openembedded/meta-oe/recipes-support/libfann/libfann_git.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Fast Artificial Neural Network (FANN) Library"
+DESCRIPTION = "Fast Artificial Neural Network (FANN) Library is a free open source neural network library, which implements multilayer artificial neural networks in C with support for both fully connected and sparsely connected networks."
+HOMEPAGE = "https://github.com/libfann/fann"
+SECTION = "libs/devel"
+
+LICENSE = "LGPLv2.1"
+LIC_FILES_CHKSUM = "file://LICENSE.md;md5=f14599a2f089f6ff8c97e2baa4e3d575"
+
+inherit cmake
+
+SRCREV ?= "7ec1fc7e5bd734f1d3c89b095e630e83c86b9be1"
+SRC_URI = "git://github.com/libfann/fann.git;branch=master \
+          "
+
+PV = "2.2.0+git${SRCPV}"
+
+S = "${WORKDIR}/git"
diff --git a/meta-openembedded/meta-oe/recipes-support/mcelog/mcelog_161.bb b/meta-openembedded/meta-oe/recipes-support/mcelog/mcelog_162.bb
similarity index 100%
rename from meta-openembedded/meta-oe/recipes-support/mcelog/mcelog_161.bb
rename to meta-openembedded/meta-oe/recipes-support/mcelog/mcelog_162.bb
diff --git a/meta-openembedded/meta-oe/recipes-support/openldap/openldap/openldap-CVE-2015-3276.patch b/meta-openembedded/meta-oe/recipes-support/openldap/openldap/openldap-CVE-2015-3276.patch
index 25e148e..ce8b47a 100644
--- a/meta-openembedded/meta-oe/recipes-support/openldap/openldap/openldap-CVE-2015-3276.patch
+++ b/meta-openembedded/meta-oe/recipes-support/openldap/openldap/openldap-CVE-2015-3276.patch
@@ -12,6 +12,8 @@
 
 Upstream-Status: Pending
 
+CVE: CVE-2015-3276
+
 Signed-off-by: Li Wang <li.wang@windriver.com>
 ---
  libraries/libldap/tls_m.c |   27 ++++++++++++++++-----------