From 3e3dd1a3ac39ed10716c3ec4fd2ef91c56f07953 Mon Sep 17 00:00:00 2001
From: Janne Mareike Koschinski <janne@kuschku.de>
Date: Sun, 6 Jun 2021 20:38:52 +0200
Subject: [PATCH] Fix minor bugs

---
 .../client/session/ClientHandshakeHandler.kt  |   7 -
 .../serializers/qt/QDateTimeSerializer.kt     |  22 ++-
 .../signalproxy/HeartBeatReplySerializer.kt   |   3 +-
 .../signalproxy/InitDataSerializer.kt         |   2 +-
 .../protocol/syncables/common/BufferSyncer.kt |   1 -
 .../protocol/syncables/common/IrcUser.kt      |   6 +-
 .../libquassel/protocol/variant/QVariant.kt   |   2 -
 .../protocol/variant/QVariantMap.kt           |   9 +-
 .../signalproxy/InitDataSerializerTest.kt     | 172 ++++++++----------
 .../protocol/syncables/IrcChannelTest.kt      |   1 -
 .../testutil/matchers/TemporalMatcher.kt      |  60 ++++--
 .../protocol/testutil/mocks/EmptySession.kt   |  18 +-
 12 files changed, 156 insertions(+), 147 deletions(-)

diff --git a/libquassel-client/src/main/kotlin/de/justjanne/libquassel/client/session/ClientHandshakeHandler.kt b/libquassel-client/src/main/kotlin/de/justjanne/libquassel/client/session/ClientHandshakeHandler.kt
index c7c409a..b92936b 100644
--- a/libquassel-client/src/main/kotlin/de/justjanne/libquassel/client/session/ClientHandshakeHandler.kt
+++ b/libquassel-client/src/main/kotlin/de/justjanne/libquassel/client/session/ClientHandshakeHandler.kt
@@ -20,14 +20,7 @@ import de.justjanne.libquassel.protocol.session.MessageChannelReadThread
 import de.justjanne.libquassel.protocol.session.Session
 import de.justjanne.libquassel.protocol.util.log.trace
 import de.justjanne.libquassel.protocol.variant.QVariantMap
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.coroutineScope
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.runBlocking
-import kotlinx.coroutines.runInterruptible
-import kotlinx.coroutines.withContext
 import org.slf4j.LoggerFactory
-import sun.security.util.DisabledAlgorithmConstraints
 import java.nio.ByteBuffer
 
 class ClientHandshakeHandler(
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QDateTimeSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QDateTimeSerializer.kt
index 6ca4bb6..6c09953 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QDateTimeSerializer.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/qt/QDateTimeSerializer.kt
@@ -42,9 +42,17 @@ object QDateTimeSerializer : PrimitiveSerializer<Temporal> {
       is LocalDateTime ->
         serialize(data, TimeSpec.LocalUnknown, null)
       is OffsetDateTime ->
-        serialize(data.toLocalDateTime(), TimeSpec.OffsetFromUTC, data.offset)
+        if (data.offset === ZoneOffset.UTC) {
+          serialize(data.toLocalDateTime(), TimeSpec.UTC, null)
+        } else {
+          serialize(data.toLocalDateTime(), TimeSpec.OffsetFromUTC, data.offset)
+        }
       is ZonedDateTime ->
-        serialize(data.toLocalDateTime(), TimeSpec.OffsetFromUTC, data.offset)
+        if (data.offset === ZoneOffset.UTC) {
+          serialize(data.toLocalDateTime(), TimeSpec.UTC, null)
+        } else {
+          serialize(data.toLocalDateTime(), TimeSpec.OffsetFromUTC, data.offset)
+        }
       is Instant ->
         serialize(data.atOffset(ZoneOffset.UTC).toLocalDateTime(), TimeSpec.UTC, null)
       else ->
@@ -64,15 +72,9 @@ object QDateTimeSerializer : PrimitiveSerializer<Temporal> {
       TimeSpec.LocalDST ->
         localDateTime.atZone(ZoneId.systemDefault()).toOffsetDateTime()
       TimeSpec.OffsetFromUTC ->
-        localDateTime
-          .atOffset(
-            ZoneOffset.ofTotalSeconds(
-              IntSerializer.deserialize(buffer, featureSet)
-            )
-          )
+        localDateTime.atOffset(ZoneOffset.ofTotalSeconds(IntSerializer.deserialize(buffer, featureSet)))
       TimeSpec.UTC ->
-        localDateTime
-          .atOffset(ZoneOffset.UTC)
+        localDateTime.atOffset(ZoneOffset.UTC)
     }
   }
 }
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/HeartBeatReplySerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/HeartBeatReplySerializer.kt
index ef9f3ea..2e4c8fc 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/HeartBeatReplySerializer.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/HeartBeatReplySerializer.kt
@@ -16,6 +16,7 @@ import de.justjanne.libquassel.protocol.variant.QVariantList
 import de.justjanne.libquassel.protocol.variant.into
 import de.justjanne.libquassel.protocol.variant.qVariant
 import org.threeten.bp.Instant
+import org.threeten.bp.ZoneOffset
 
 /**
  * Serializer for [SignalProxyMessage.HeartBeatReply]
@@ -29,6 +30,6 @@ object HeartBeatReplySerializer : SignalProxySerializer<SignalProxyMessage.Heart
   )
 
   override fun deserialize(data: QVariantList) = SignalProxyMessage.HeartBeatReply(
-    data.getOrNull(1).into(Instant.EPOCH)
+    data.getOrNull(1).into(Instant.EPOCH.atOffset(ZoneOffset.UTC)).toInstant()
   )
 }
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/InitDataSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/InitDataSerializer.kt
index 3681fa9..fb030e1 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/InitDataSerializer.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/InitDataSerializer.kt
@@ -30,7 +30,7 @@ object InitDataSerializer : SignalProxySerializer<SignalProxyMessage.InitData> {
     qVariant(type, QtType.Int),
     qVariant(StringSerializerUtf8.serializeRaw(data.className), QtType.QByteArray),
     qVariant(StringSerializerUtf8.serializeRaw(data.objectName), QtType.QByteArray),
-  ) + data.initData.toVariantList()
+  ) + data.initData.toVariantList(byteBuffer = true)
 
   override fun deserialize(data: QVariantList) = SignalProxyMessage.InitData(
     StringSerializerUtf8.deserializeRaw(data.getOrNull(1).into<ByteBuffer>()),
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/common/BufferSyncer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/common/BufferSyncer.kt
index 1db9f81..d53dbf3 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/common/BufferSyncer.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/common/BufferSyncer.kt
@@ -28,7 +28,6 @@ import de.justjanne.libquassel.protocol.util.collections.pairs
 import de.justjanne.libquassel.protocol.util.update
 import de.justjanne.libquassel.protocol.variant.QVariantList
 import de.justjanne.libquassel.protocol.variant.QVariantMap
-import de.justjanne.libquassel.protocol.variant.QVariant_
 import de.justjanne.libquassel.protocol.variant.into
 import de.justjanne.libquassel.protocol.variant.qVariant
 
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/common/IrcUser.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/common/IrcUser.kt
index 7870c59..6498c54 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/common/IrcUser.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/common/IrcUser.kt
@@ -74,12 +74,12 @@ open class IrcUser(
     "account" to qVariant(account(), QtType.QString),
     "away" to qVariant(isAway(), QtType.Bool),
     "awayMessage" to qVariant(awayMessage(), QtType.QString),
-    "idleTime" to qVariant(idleTime(), QtType.QDateTime),
-    "loginTime" to qVariant(loginTime(), QtType.QDateTime),
+    "idleTime" to qVariant(idleTime().atOffset(ZoneOffset.UTC), QtType.QDateTime),
+    "loginTime" to qVariant(loginTime().atOffset(ZoneOffset.UTC), QtType.QDateTime),
     "server" to qVariant(server(), QtType.QString),
     "ircOperator" to qVariant(ircOperator(), QtType.QString),
     "lastAwayMessage" to qVariant(lastAwayMessageTime().epochSecond.toInt(), QtType.Int),
-    "lastAwayMessageTime" to qVariant(lastAwayMessageTime(), QtType.QDateTime),
+    "lastAwayMessageTime" to qVariant(lastAwayMessageTime().atOffset(ZoneOffset.UTC), QtType.QDateTime),
     "whoisServiceReply" to qVariant(whoisServiceReply(), QtType.QString),
     "suserHost" to qVariant(suserHost(), QtType.QString),
     "encrypted" to qVariant(isEncrypted(), QtType.Bool),
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariant.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariant.kt
index 5022ca6..38f03d7 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariant.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariant.kt
@@ -18,8 +18,6 @@ import de.justjanne.libquassel.protocol.serializers.PrimitiveSerializer
 import de.justjanne.libquassel.protocol.util.reflect.instanceof
 import de.justjanne.libquassel.protocol.util.reflect.subtype
 import java.nio.ByteBuffer
-import org.threeten.bp.Instant
-import org.threeten.bp.ZoneOffset
 
 /**
  * Simple alias for a generic QVariant type
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariantMap.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariantMap.kt
index 421aa70..ea5a49f 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariantMap.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/variant/QVariantMap.kt
@@ -10,6 +10,7 @@
 package de.justjanne.libquassel.protocol.variant
 
 import de.justjanne.libquassel.protocol.models.types.QtType
+import de.justjanne.libquassel.protocol.serializers.qt.StringSerializerUtf8
 
 /**
  * Simple alias for a generic QVariantMap type
@@ -19,7 +20,11 @@ typealias QVariantMap = Map<String, QVariant_>
 /**
  * Transform a QVariantMap into a QVariantList of interleaved keys and values
  */
-fun QVariantMap.toVariantList(): QVariantList =
+fun QVariantMap.toVariantList(byteBuffer: Boolean = false): QVariantList =
   flatMap { (key, value) ->
-    listOf(qVariant(key, QtType.QString), value)
+    if (byteBuffer) {
+      listOf(qVariant(StringSerializerUtf8.serializeRaw(key), QtType.QByteArray), value)
+    } else {
+      listOf(qVariant(key, QtType.QString), value)
+    }
   }
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/InitDataSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/InitDataSerializerTest.kt
index a92699c..2be3630 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/InitDataSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/signalproxy/InitDataSerializerTest.kt
@@ -67,106 +67,78 @@ class InitDataSerializerTest {
       byteBufferOf(
         0x00u, 0x00u, 0x00u, 0x45u, 0x00u, 0x00u, 0x00u, 0x02u, 0x00u, 0x00u, 0x00u, 0x00u, 0x04u, 0x00u, 0x00u, 0x00u,
         0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x07u, 0x4Eu, 0x65u, 0x74u, 0x77u, 0x6Fu, 0x72u, 0x6Bu, 0x00u, 0x00u, 0x00u,
-        0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x01u, 0x34u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x16u,
-        0x00u, 0x6Eu, 0x00u, 0x65u, 0x00u, 0x74u, 0x00u, 0x77u, 0x00u, 0x6Fu, 0x00u, 0x72u, 0x00u, 0x6Bu, 0x00u, 0x4Eu,
-        0x00u, 0x61u, 0x00u, 0x6Du, 0x00u, 0x65u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x22u, 0x00u,
-        0x3Cu, 0x00u, 0x6Eu, 0x00u, 0x6Fu, 0x00u, 0x74u, 0x00u, 0x20u, 0x00u, 0x69u, 0x00u, 0x6Eu, 0x00u, 0x69u, 0x00u,
-        0x74u, 0x00u, 0x69u, 0x00u, 0x61u, 0x00u, 0x6Cu, 0x00u, 0x69u, 0x00u, 0x7Au, 0x00u, 0x65u, 0x00u, 0x64u, 0x00u,
-        0x3Eu, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x1Au, 0x00u, 0x63u, 0x00u, 0x75u, 0x00u, 0x72u,
-        0x00u, 0x72u, 0x00u, 0x65u, 0x00u, 0x6Eu, 0x00u, 0x74u, 0x00u, 0x53u, 0x00u, 0x65u, 0x00u, 0x72u, 0x00u, 0x76u,
-        0x00u, 0x65u, 0x00u, 0x72u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
-        0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x6Du, 0x00u, 0x79u, 0x00u, 0x4Eu, 0x00u, 0x69u, 0x00u, 0x63u,
-        0x00u, 0x6Bu, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u,
-        0x00u, 0x00u, 0x00u, 0x0Eu, 0x00u, 0x6Cu, 0x00u, 0x61u, 0x00u, 0x74u, 0x00u, 0x65u, 0x00u, 0x6Eu, 0x00u, 0x63u,
-        0x00u, 0x79u, 0x00u, 0x00u, 0x00u, 0x02u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u,
-        0x00u, 0x00u, 0x00u, 0x1Cu, 0x00u, 0x63u, 0x00u, 0x6Fu, 0x00u, 0x64u, 0x00u, 0x65u, 0x00u, 0x63u, 0x00u, 0x46u,
-        0x00u, 0x6Fu, 0x00u, 0x72u, 0x00u, 0x53u, 0x00u, 0x65u, 0x00u, 0x72u, 0x00u, 0x76u, 0x00u, 0x65u, 0x00u, 0x72u,
-        0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x05u, 0x55u, 0x54u, 0x46u, 0x5Fu, 0x38u, 0x00u, 0x00u,
-        0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x20u, 0x00u, 0x63u, 0x00u, 0x6Fu, 0x00u, 0x64u, 0x00u, 0x65u, 0x00u,
-        0x63u, 0x00u, 0x46u, 0x00u, 0x6Fu, 0x00u, 0x72u, 0x00u, 0x45u, 0x00u, 0x6Eu, 0x00u, 0x63u, 0x00u, 0x6Fu, 0x00u,
-        0x64u, 0x00u, 0x69u, 0x00u, 0x6Eu, 0x00u, 0x67u, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x05u,
-        0x55u, 0x54u, 0x46u, 0x5Fu, 0x38u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x20u, 0x00u, 0x63u,
-        0x00u, 0x6Fu, 0x00u, 0x64u, 0x00u, 0x65u, 0x00u, 0x63u, 0x00u, 0x46u, 0x00u, 0x6Fu, 0x00u, 0x72u, 0x00u, 0x44u,
-        0x00u, 0x65u, 0x00u, 0x63u, 0x00u, 0x6Fu, 0x00u, 0x64u, 0x00u, 0x69u, 0x00u, 0x6Eu, 0x00u, 0x67u, 0x00u, 0x00u,
-        0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x05u, 0x55u, 0x54u, 0x46u, 0x5Fu, 0x38u, 0x00u, 0x00u, 0x00u, 0x0Au,
-        0x00u, 0x00u, 0x00u, 0x00u, 0x14u, 0x00u, 0x69u, 0x00u, 0x64u, 0x00u, 0x65u, 0x00u, 0x6Eu, 0x00u, 0x74u, 0x00u,
-        0x69u, 0x00u, 0x74u, 0x00u, 0x79u, 0x00u, 0x49u, 0x00u, 0x64u, 0x00u, 0x00u, 0x00u, 0x7Fu, 0x00u, 0x00u, 0x00u,
-        0x00u, 0x0Bu, 0x49u, 0x64u, 0x65u, 0x6Eu, 0x74u, 0x69u, 0x74u, 0x79u, 0x49u, 0x64u, 0x00u, 0xFFu, 0xFFu, 0xFFu,
-        0xFFu, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x16u, 0x00u, 0x69u, 0x00u, 0x73u, 0x00u, 0x43u,
-        0x00u, 0x6Fu, 0x00u, 0x6Eu, 0x00u, 0x6Eu, 0x00u, 0x65u, 0x00u, 0x63u, 0x00u, 0x74u, 0x00u, 0x65u, 0x00u, 0x64u,
-        0x00u, 0x00u, 0x00u, 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x1Eu, 0x00u,
-        0x63u, 0x00u, 0x6Fu, 0x00u, 0x6Eu, 0x00u, 0x6Eu, 0x00u, 0x65u, 0x00u, 0x63u, 0x00u, 0x74u, 0x00u, 0x69u, 0x00u,
-        0x6Fu, 0x00u, 0x6Eu, 0x00u, 0x53u, 0x00u, 0x74u, 0x00u, 0x61u, 0x00u, 0x74u, 0x00u, 0x65u, 0x00u, 0x00u, 0x00u,
-        0x02u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x1Eu, 0x00u,
-        0x75u, 0x00u, 0x73u, 0x00u, 0x65u, 0x00u, 0x52u, 0x00u, 0x61u, 0x00u, 0x6Eu, 0x00u, 0x64u, 0x00u, 0x6Fu, 0x00u,
-        0x6Du, 0x00u, 0x53u, 0x00u, 0x65u, 0x00u, 0x72u, 0x00u, 0x76u, 0x00u, 0x65u, 0x00u, 0x72u, 0x00u, 0x00u, 0x00u,
-        0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Eu, 0x00u, 0x70u, 0x00u, 0x65u,
-        0x00u, 0x72u, 0x00u, 0x66u, 0x00u, 0x6Fu, 0x00u, 0x72u, 0x00u, 0x6Du, 0x00u, 0x00u, 0x00u, 0x0Bu, 0x00u, 0x00u,
-        0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x1Eu, 0x00u, 0x75u, 0x00u, 0x73u,
-        0x00u, 0x65u, 0x00u, 0x41u, 0x00u, 0x75u, 0x00u, 0x74u, 0x00u, 0x6Fu, 0x00u, 0x49u, 0x00u, 0x64u, 0x00u, 0x65u,
-        0x00u, 0x6Eu, 0x00u, 0x74u, 0x00u, 0x69u, 0x00u, 0x66u, 0x00u, 0x79u, 0x00u, 0x00u, 0x00u, 0x01u, 0x00u, 0x00u,
-        0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x26u, 0x00u, 0x61u, 0x00u, 0x75u, 0x00u, 0x74u, 0x00u,
-        0x6Fu, 0x00u, 0x49u, 0x00u, 0x64u, 0x00u, 0x65u, 0x00u, 0x6Eu, 0x00u, 0x74u, 0x00u, 0x69u, 0x00u, 0x66u, 0x00u,
-        0x79u, 0x00u, 0x53u, 0x00u, 0x65u, 0x00u, 0x72u, 0x00u, 0x76u, 0x00u, 0x69u, 0x00u, 0x63u, 0x00u, 0x65u, 0x00u,
-        0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u,
-        0x28u, 0x00u, 0x61u, 0x00u, 0x75u, 0x00u, 0x74u, 0x00u, 0x6Fu, 0x00u, 0x49u, 0x00u, 0x64u, 0x00u, 0x65u, 0x00u,
-        0x6Eu, 0x00u, 0x74u, 0x00u, 0x69u, 0x00u, 0x66u, 0x00u, 0x79u, 0x00u, 0x50u, 0x00u, 0x61u, 0x00u, 0x73u, 0x00u,
-        0x73u, 0x00u, 0x77u, 0x00u, 0x6Fu, 0x00u, 0x72u, 0x00u, 0x64u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u,
-        0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Eu, 0x00u, 0x75u, 0x00u, 0x73u, 0x00u,
-        0x65u, 0x00u, 0x53u, 0x00u, 0x61u, 0x00u, 0x73u, 0x00u, 0x6Cu, 0x00u, 0x00u, 0x00u, 0x01u, 0x00u, 0x00u, 0x00u,
-        0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x16u, 0x00u, 0x73u, 0x00u, 0x61u, 0x00u, 0x73u, 0x00u, 0x6Cu,
-        0x00u, 0x41u, 0x00u, 0x63u, 0x00u, 0x63u, 0x00u, 0x6Fu, 0x00u, 0x75u, 0x00u, 0x6Eu, 0x00u, 0x74u, 0x00u, 0x00u,
-        0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x18u,
-        0x00u, 0x73u, 0x00u, 0x61u, 0x00u, 0x73u, 0x00u, 0x6Cu, 0x00u, 0x50u, 0x00u, 0x61u, 0x00u, 0x73u, 0x00u, 0x73u,
-        0x00u, 0x77u, 0x00u, 0x6Fu, 0x00u, 0x72u, 0x00u, 0x64u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u,
-        0x00u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x20u, 0x00u, 0x75u, 0x00u, 0x73u, 0x00u, 0x65u,
-        0x00u, 0x41u, 0x00u, 0x75u, 0x00u, 0x74u, 0x00u, 0x6Fu, 0x00u, 0x52u, 0x00u, 0x65u, 0x00u, 0x63u, 0x00u, 0x6Fu,
-        0x00u, 0x6Eu, 0x00u, 0x6Eu, 0x00u, 0x65u, 0x00u, 0x63u, 0x00u, 0x74u, 0x00u, 0x00u, 0x00u, 0x01u, 0x00u, 0x00u,
-        0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x2Au, 0x00u, 0x61u, 0x00u, 0x75u, 0x00u, 0x74u, 0x00u,
-        0x6Fu, 0x00u, 0x52u, 0x00u, 0x65u, 0x00u, 0x63u, 0x00u, 0x6Fu, 0x00u, 0x6Eu, 0x00u, 0x6Eu, 0x00u, 0x65u, 0x00u,
-        0x63u, 0x00u, 0x74u, 0x00u, 0x49u, 0x00u, 0x6Eu, 0x00u, 0x74u, 0x00u, 0x65u, 0x00u, 0x72u, 0x00u, 0x76u, 0x00u,
-        0x61u, 0x00u, 0x6Cu, 0x00u, 0x00u, 0x00u, 0x03u, 0x00u, 0x00u, 0x00u, 0x00u, 0x3Cu, 0x00u, 0x00u, 0x00u, 0x0Au,
-        0x00u, 0x00u, 0x00u, 0x00u, 0x28u, 0x00u, 0x61u, 0x00u, 0x75u, 0x00u, 0x74u, 0x00u, 0x6Fu, 0x00u, 0x52u, 0x00u,
-        0x65u, 0x00u, 0x63u, 0x00u, 0x6Fu, 0x00u, 0x6Eu, 0x00u, 0x6Eu, 0x00u, 0x65u, 0x00u, 0x63u, 0x00u, 0x74u, 0x00u,
-        0x52u, 0x00u, 0x65u, 0x00u, 0x74u, 0x00u, 0x72u, 0x00u, 0x69u, 0x00u, 0x65u, 0x00u, 0x73u, 0x00u, 0x00u, 0x00u,
-        0x85u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x32u, 0x00u, 0x75u, 0x00u,
-        0x6Eu, 0x00u, 0x6Cu, 0x00u, 0x69u, 0x00u, 0x6Du, 0x00u, 0x69u, 0x00u, 0x74u, 0x00u, 0x65u, 0x00u, 0x64u, 0x00u,
-        0x52u, 0x00u, 0x65u, 0x00u, 0x63u, 0x00u, 0x6Fu, 0x00u, 0x6Eu, 0x00u, 0x6Eu, 0x00u, 0x65u, 0x00u, 0x63u, 0x00u,
-        0x74u, 0x00u, 0x52u, 0x00u, 0x65u, 0x00u, 0x74u, 0x00u, 0x72u, 0x00u, 0x69u, 0x00u, 0x65u, 0x00u, 0x73u, 0x00u,
-        0x00u, 0x00u, 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x1Cu, 0x00u, 0x72u,
-        0x00u, 0x65u, 0x00u, 0x6Au, 0x00u, 0x6Fu, 0x00u, 0x69u, 0x00u, 0x6Eu, 0x00u, 0x43u, 0x00u, 0x68u, 0x00u, 0x61u,
-        0x00u, 0x6Eu, 0x00u, 0x6Eu, 0x00u, 0x65u, 0x00u, 0x6Cu, 0x00u, 0x73u, 0x00u, 0x00u, 0x00u, 0x01u, 0x00u, 0x00u,
-        0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x28u, 0x00u, 0x75u, 0x00u, 0x73u, 0x00u, 0x65u, 0x00u,
-        0x43u, 0x00u, 0x75u, 0x00u, 0x73u, 0x00u, 0x74u, 0x00u, 0x6Fu, 0x00u, 0x6Du, 0x00u, 0x4Du, 0x00u, 0x65u, 0x00u,
-        0x73u, 0x00u, 0x73u, 0x00u, 0x61u, 0x00u, 0x67u, 0x00u, 0x65u, 0x00u, 0x52u, 0x00u, 0x61u, 0x00u, 0x74u, 0x00u,
-        0x65u, 0x00u, 0x00u, 0x00u, 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x20u,
-        0x00u, 0x6Du, 0x00u, 0x73u, 0x00u, 0x67u, 0x00u, 0x52u, 0x00u, 0x61u, 0x00u, 0x74u, 0x00u, 0x65u, 0x00u, 0x42u,
-        0x00u, 0x75u, 0x00u, 0x72u, 0x00u, 0x73u, 0x00u, 0x74u, 0x00u, 0x53u, 0x00u, 0x69u, 0x00u, 0x7Au, 0x00u, 0x65u,
-        0x00u, 0x00u, 0x00u, 0x03u, 0x00u, 0x00u, 0x00u, 0x00u, 0x05u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u,
-        0x00u, 0x26u, 0x00u, 0x6Du, 0x00u, 0x73u, 0x00u, 0x67u, 0x00u, 0x52u, 0x00u, 0x61u, 0x00u, 0x74u, 0x00u, 0x65u,
-        0x00u, 0x4Du, 0x00u, 0x65u, 0x00u, 0x73u, 0x00u, 0x73u, 0x00u, 0x61u, 0x00u, 0x67u, 0x00u, 0x65u, 0x00u, 0x44u,
-        0x00u, 0x65u, 0x00u, 0x6Cu, 0x00u, 0x61u, 0x00u, 0x79u, 0x00u, 0x00u, 0x00u, 0x03u, 0x00u, 0x00u, 0x00u, 0x08u,
-        0x98u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x28u, 0x00u, 0x75u, 0x00u, 0x6Eu, 0x00u, 0x6Cu,
-        0x00u, 0x69u, 0x00u, 0x6Du, 0x00u, 0x69u, 0x00u, 0x74u, 0x00u, 0x65u, 0x00u, 0x64u, 0x00u, 0x4Du, 0x00u, 0x65u,
-        0x00u, 0x73u, 0x00u, 0x73u, 0x00u, 0x61u, 0x00u, 0x67u, 0x00u, 0x65u, 0x00u, 0x52u, 0x00u, 0x61u, 0x00u, 0x74u,
-        0x00u, 0x65u, 0x00u, 0x00u, 0x00u, 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u,
-        0x10u, 0x00u, 0x73u, 0x00u, 0x6Bu, 0x00u, 0x69u, 0x00u, 0x70u, 0x00u, 0x43u, 0x00u, 0x61u, 0x00u, 0x70u, 0x00u,
-        0x73u, 0x00u, 0x00u, 0x00u, 0x0Bu, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u,
-        0x00u, 0x00u, 0x10u, 0x00u, 0x53u, 0x00u, 0x75u, 0x00u, 0x70u, 0x00u, 0x70u, 0x00u, 0x6Fu, 0x00u, 0x72u, 0x00u,
-        0x74u, 0x00u, 0x73u, 0x00u, 0x00u, 0x00u, 0x08u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Au,
-        0x00u, 0x00u, 0x00u, 0x00u, 0x14u, 0x00u, 0x53u, 0x00u, 0x65u, 0x00u, 0x72u, 0x00u, 0x76u, 0x00u, 0x65u, 0x00u,
-        0x72u, 0x00u, 0x4Cu, 0x00u, 0x69u, 0x00u, 0x73u, 0x00u, 0x74u, 0x00u, 0x00u, 0x00u, 0x09u, 0x00u, 0x00u, 0x00u,
-        0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x08u, 0x00u, 0x43u, 0x00u, 0x61u, 0x00u,
-        0x70u, 0x00u, 0x73u, 0x00u, 0x00u, 0x00u, 0x08u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Au,
-        0x00u, 0x00u, 0x00u, 0x00u, 0x16u, 0x00u, 0x43u, 0x00u, 0x61u, 0x00u, 0x70u, 0x00u, 0x73u, 0x00u, 0x45u, 0x00u,
-        0x6Eu, 0x00u, 0x61u, 0x00u, 0x62u, 0x00u, 0x6Cu, 0x00u, 0x65u, 0x00u, 0x64u, 0x00u, 0x00u, 0x00u, 0x09u, 0x00u,
-        0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x26u, 0x00u, 0x49u, 0x00u,
-        0x72u, 0x00u, 0x63u, 0x00u, 0x55u, 0x00u, 0x73u, 0x00u, 0x65u, 0x00u, 0x72u, 0x00u, 0x73u, 0x00u, 0x41u, 0x00u,
-        0x6Eu, 0x00u, 0x64u, 0x00u, 0x43u, 0x00u, 0x68u, 0x00u, 0x61u, 0x00u, 0x6Eu, 0x00u, 0x6Eu, 0x00u, 0x65u, 0x00u,
-        0x6Cu, 0x00u, 0x73u, 0x00u, 0x00u, 0x00u, 0x08u, 0x00u, 0x00u, 0x00u, 0x00u, 0x02u, 0x00u, 0x00u, 0x00u, 0x0Au,
-        0x00u, 0x55u, 0x00u, 0x73u, 0x00u, 0x65u, 0x00u, 0x72u, 0x00u, 0x73u, 0x00u, 0x00u, 0x00u, 0x08u, 0x00u, 0x00u,
-        0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x10u, 0x00u, 0x43u, 0x00u, 0x68u, 0x00u, 0x61u, 0x00u, 0x6Eu, 0x00u,
-        0x6Eu, 0x00u, 0x65u, 0x00u, 0x6Cu, 0x00u, 0x73u, 0x00u, 0x00u, 0x00u, 0x08u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
+        0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x01u, 0x34u, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Bu,
+        0x6Eu, 0x65u, 0x74u, 0x77u, 0x6Fu, 0x72u, 0x6Bu, 0x4Eu, 0x61u, 0x6Du, 0x65u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u,
+        0x00u, 0x00u, 0x00u, 0x22u, 0x00u, 0x3Cu, 0x00u, 0x6Eu, 0x00u, 0x6Fu, 0x00u, 0x74u, 0x00u, 0x20u, 0x00u, 0x69u,
+        0x00u, 0x6Eu, 0x00u, 0x69u, 0x00u, 0x74u, 0x00u, 0x69u, 0x00u, 0x61u, 0x00u, 0x6Cu, 0x00u, 0x69u, 0x00u, 0x7Au,
+        0x00u, 0x65u, 0x00u, 0x64u, 0x00u, 0x3Eu, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Du, 0x63u,
+        0x75u, 0x72u, 0x72u, 0x65u, 0x6Eu, 0x74u, 0x53u, 0x65u, 0x72u, 0x76u, 0x65u, 0x72u, 0x00u, 0x00u, 0x00u, 0x0Au,
+        0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x06u, 0x6Du, 0x79u,
+        0x4Eu, 0x69u, 0x63u, 0x6Bu, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
+        0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x07u, 0x6Cu, 0x61u, 0x74u, 0x65u, 0x6Eu, 0x63u, 0x79u, 0x00u, 0x00u, 0x00u,
+        0x02u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Eu, 0x63u,
+        0x6Fu, 0x64u, 0x65u, 0x63u, 0x46u, 0x6Fu, 0x72u, 0x53u, 0x65u, 0x72u, 0x76u, 0x65u, 0x72u, 0x00u, 0x00u, 0x00u,
+        0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x05u, 0x55u, 0x54u, 0x46u, 0x5Fu, 0x38u, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u,
+        0x00u, 0x00u, 0x00u, 0x10u, 0x63u, 0x6Fu, 0x64u, 0x65u, 0x63u, 0x46u, 0x6Fu, 0x72u, 0x45u, 0x6Eu, 0x63u, 0x6Fu,
+        0x64u, 0x69u, 0x6Eu, 0x67u, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x05u, 0x55u, 0x54u, 0x46u,
+        0x5Fu, 0x38u, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x10u, 0x63u, 0x6Fu, 0x64u, 0x65u, 0x63u,
+        0x46u, 0x6Fu, 0x72u, 0x44u, 0x65u, 0x63u, 0x6Fu, 0x64u, 0x69u, 0x6Eu, 0x67u, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u,
+        0x00u, 0x00u, 0x00u, 0x05u, 0x55u, 0x54u, 0x46u, 0x5Fu, 0x38u, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u,
+        0x00u, 0x0Au, 0x69u, 0x64u, 0x65u, 0x6Eu, 0x74u, 0x69u, 0x74u, 0x79u, 0x49u, 0x64u, 0x00u, 0x00u, 0x00u, 0x7Fu,
+        0x00u, 0x00u, 0x00u, 0x00u, 0x0Bu, 0x49u, 0x64u, 0x65u, 0x6Eu, 0x74u, 0x69u, 0x74u, 0x79u, 0x49u, 0x64u, 0x00u,
+        0xFFu, 0xFFu, 0xFFu, 0xFFu, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Bu, 0x69u, 0x73u, 0x43u,
+        0x6Fu, 0x6Eu, 0x6Eu, 0x65u, 0x63u, 0x74u, 0x65u, 0x64u, 0x00u, 0x00u, 0x00u, 0x01u, 0x00u, 0x00u, 0x00u, 0x00u,
+        0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Fu, 0x63u, 0x6Fu, 0x6Eu, 0x6Eu, 0x65u, 0x63u, 0x74u, 0x69u, 0x6Fu,
+        0x6Eu, 0x53u, 0x74u, 0x61u, 0x74u, 0x65u, 0x00u, 0x00u, 0x00u, 0x02u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
+        0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Fu, 0x75u, 0x73u, 0x65u, 0x52u, 0x61u, 0x6Eu, 0x64u, 0x6Fu,
+        0x6Du, 0x53u, 0x65u, 0x72u, 0x76u, 0x65u, 0x72u, 0x00u, 0x00u, 0x00u, 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
+        0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x07u, 0x70u, 0x65u, 0x72u, 0x66u, 0x6Fu, 0x72u, 0x6Du, 0x00u, 0x00u, 0x00u,
+        0x0Bu, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Fu, 0x75u,
+        0x73u, 0x65u, 0x41u, 0x75u, 0x74u, 0x6Fu, 0x49u, 0x64u, 0x65u, 0x6Eu, 0x74u, 0x69u, 0x66u, 0x79u, 0x00u, 0x00u,
+        0x00u, 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x13u, 0x61u, 0x75u, 0x74u,
+        0x6Fu, 0x49u, 0x64u, 0x65u, 0x6Eu, 0x74u, 0x69u, 0x66u, 0x79u, 0x53u, 0x65u, 0x72u, 0x76u, 0x69u, 0x63u, 0x65u,
+        0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u,
+        0x00u, 0x14u, 0x61u, 0x75u, 0x74u, 0x6Fu, 0x49u, 0x64u, 0x65u, 0x6Eu, 0x74u, 0x69u, 0x66u, 0x79u, 0x50u, 0x61u,
+        0x73u, 0x73u, 0x77u, 0x6Fu, 0x72u, 0x64u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
+        0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x07u, 0x75u, 0x73u, 0x65u, 0x53u, 0x61u, 0x73u, 0x6Cu, 0x00u,
+        0x00u, 0x00u, 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Bu, 0x73u, 0x61u,
+        0x73u, 0x6Cu, 0x41u, 0x63u, 0x63u, 0x6Fu, 0x75u, 0x6Eu, 0x74u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u,
+        0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x73u, 0x61u, 0x73u, 0x6Cu, 0x50u,
+        0x61u, 0x73u, 0x73u, 0x77u, 0x6Fu, 0x72u, 0x64u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
+        0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x10u, 0x75u, 0x73u, 0x65u, 0x41u, 0x75u, 0x74u, 0x6Fu,
+        0x52u, 0x65u, 0x63u, 0x6Fu, 0x6Eu, 0x6Eu, 0x65u, 0x63u, 0x74u, 0x00u, 0x00u, 0x00u, 0x01u, 0x00u, 0x00u, 0x00u,
+        0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x15u, 0x61u, 0x75u, 0x74u, 0x6Fu, 0x52u, 0x65u, 0x63u, 0x6Fu,
+        0x6Eu, 0x6Eu, 0x65u, 0x63u, 0x74u, 0x49u, 0x6Eu, 0x74u, 0x65u, 0x72u, 0x76u, 0x61u, 0x6Cu, 0x00u, 0x00u, 0x00u,
+        0x03u, 0x00u, 0x00u, 0x00u, 0x00u, 0x3Cu, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x14u, 0x61u,
+        0x75u, 0x74u, 0x6Fu, 0x52u, 0x65u, 0x63u, 0x6Fu, 0x6Eu, 0x6Eu, 0x65u, 0x63u, 0x74u, 0x52u, 0x65u, 0x74u, 0x72u,
+        0x69u, 0x65u, 0x73u, 0x00u, 0x00u, 0x00u, 0x85u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u,
+        0x00u, 0x00u, 0x19u, 0x75u, 0x6Eu, 0x6Cu, 0x69u, 0x6Du, 0x69u, 0x74u, 0x65u, 0x64u, 0x52u, 0x65u, 0x63u, 0x6Fu,
+        0x6Eu, 0x6Eu, 0x65u, 0x63u, 0x74u, 0x52u, 0x65u, 0x74u, 0x72u, 0x69u, 0x65u, 0x73u, 0x00u, 0x00u, 0x00u, 0x01u,
+        0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Eu, 0x72u, 0x65u, 0x6Au, 0x6Fu, 0x69u,
+        0x6Eu, 0x43u, 0x68u, 0x61u, 0x6Eu, 0x6Eu, 0x65u, 0x6Cu, 0x73u, 0x00u, 0x00u, 0x00u, 0x01u, 0x00u, 0x00u, 0x00u,
+        0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x14u, 0x75u, 0x73u, 0x65u, 0x43u, 0x75u, 0x73u, 0x74u, 0x6Fu,
+        0x6Du, 0x4Du, 0x65u, 0x73u, 0x73u, 0x61u, 0x67u, 0x65u, 0x52u, 0x61u, 0x74u, 0x65u, 0x00u, 0x00u, 0x00u, 0x01u,
+        0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x10u, 0x6Du, 0x73u, 0x67u, 0x52u, 0x61u,
+        0x74u, 0x65u, 0x42u, 0x75u, 0x72u, 0x73u, 0x74u, 0x53u, 0x69u, 0x7Au, 0x65u, 0x00u, 0x00u, 0x00u, 0x03u, 0x00u,
+        0x00u, 0x00u, 0x00u, 0x05u, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x13u, 0x6Du, 0x73u, 0x67u,
+        0x52u, 0x61u, 0x74u, 0x65u, 0x4Du, 0x65u, 0x73u, 0x73u, 0x61u, 0x67u, 0x65u, 0x44u, 0x65u, 0x6Cu, 0x61u, 0x79u,
+        0x00u, 0x00u, 0x00u, 0x03u, 0x00u, 0x00u, 0x00u, 0x08u, 0x98u, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u,
+        0x00u, 0x14u, 0x75u, 0x6Eu, 0x6Cu, 0x69u, 0x6Du, 0x69u, 0x74u, 0x65u, 0x64u, 0x4Du, 0x65u, 0x73u, 0x73u, 0x61u,
+        0x67u, 0x65u, 0x52u, 0x61u, 0x74u, 0x65u, 0x00u, 0x00u, 0x00u, 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Cu,
+        0x00u, 0x00u, 0x00u, 0x00u, 0x08u, 0x73u, 0x6Bu, 0x69u, 0x70u, 0x43u, 0x61u, 0x70u, 0x73u, 0x00u, 0x00u, 0x00u,
+        0x0Bu, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x08u, 0x53u,
+        0x75u, 0x70u, 0x70u, 0x6Fu, 0x72u, 0x74u, 0x73u, 0x00u, 0x00u, 0x00u, 0x08u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
+        0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x53u, 0x65u, 0x72u, 0x76u, 0x65u, 0x72u, 0x4Cu,
+        0x69u, 0x73u, 0x74u, 0x00u, 0x00u, 0x00u, 0x09u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Cu,
+        0x00u, 0x00u, 0x00u, 0x00u, 0x04u, 0x43u, 0x61u, 0x70u, 0x73u, 0x00u, 0x00u, 0x00u, 0x08u, 0x00u, 0x00u, 0x00u,
+        0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Bu, 0x43u, 0x61u, 0x70u, 0x73u, 0x45u,
+        0x6Eu, 0x61u, 0x62u, 0x6Cu, 0x65u, 0x64u, 0x00u, 0x00u, 0x00u, 0x09u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
+        0x00u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x00u, 0x00u, 0x13u, 0x49u, 0x72u, 0x63u, 0x55u, 0x73u, 0x65u, 0x72u, 0x73u,
+        0x41u, 0x6Eu, 0x64u, 0x43u, 0x68u, 0x61u, 0x6Eu, 0x6Eu, 0x65u, 0x6Cu, 0x73u, 0x00u, 0x00u, 0x00u, 0x08u, 0x00u,
+        0x00u, 0x00u, 0x00u, 0x02u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x55u, 0x00u, 0x73u, 0x00u, 0x65u, 0x00u, 0x72u,
+        0x00u, 0x73u, 0x00u, 0x00u, 0x00u, 0x08u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x10u, 0x00u,
+        0x43u, 0x00u, 0x68u, 0x00u, 0x61u, 0x00u, 0x6Eu, 0x00u, 0x6Eu, 0x00u, 0x65u, 0x00u, 0x6Cu, 0x00u, 0x73u, 0x00u,
+        0x00u, 0x00u, 0x08u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
       )
     )
   }
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/syncables/IrcChannelTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/syncables/IrcChannelTest.kt
index 94e4d2e..a9d3050 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/syncables/IrcChannelTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/syncables/IrcChannelTest.kt
@@ -26,7 +26,6 @@ import org.junit.jupiter.api.Assertions.assertTrue
 import org.junit.jupiter.api.Nested
 import org.junit.jupiter.api.Test
 import kotlin.random.Random
-import kotlin.test.assertFalse
 
 class IrcChannelTest {
   @Test
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/matchers/TemporalMatcher.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/matchers/TemporalMatcher.kt
index 068a516..4234316 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/matchers/TemporalMatcher.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/matchers/TemporalMatcher.kt
@@ -15,6 +15,8 @@ import org.threeten.bp.LocalDate
 import org.threeten.bp.LocalDateTime
 import org.threeten.bp.LocalTime
 import org.threeten.bp.OffsetDateTime
+import org.threeten.bp.ZoneId
+import org.threeten.bp.ZoneOffset
 import org.threeten.bp.ZonedDateTime
 import org.threeten.bp.temporal.Temporal
 
@@ -25,24 +27,46 @@ class TemporalMatcher<T : Temporal>(
     description?.appendText(expected.toString())
   }
 
-  override fun matches(item: Any?): Boolean {
-    return when {
-      expected is ZonedDateTime && item is ZonedDateTime ->
-        expected == item
-      expected is ZonedDateTime && item is OffsetDateTime ->
-        expected.toOffsetDateTime() == item
-      expected is OffsetDateTime && item is OffsetDateTime ->
-        expected == item
-      expected is LocalDateTime && item is LocalDateTime ->
-        expected == item
-      expected is LocalTime && item is LocalTime ->
-        expected == item
-      expected is LocalDate && item is LocalDate ->
-        expected == item
-      expected is Instant && item is Instant ->
-        expected == item
-      else ->
-        false
+  private fun localDateTime(value: Any?): LocalDateTime? = when (value) {
+    is ZonedDateTime -> value.toLocalDateTime()
+    is OffsetDateTime -> value.toLocalDateTime()
+    is LocalDateTime -> value
+    is Instant -> value.atOffset(ZoneOffset.UTC).toLocalDateTime()
+    is LocalDate -> value.atTime(LocalTime.MIN)
+    is LocalTime -> value.atDate(LocalDate.MIN)
+    null -> null
+    else -> throw Exception("Unsupported date format: ${value::class.java.simpleName}")
+  }
+
+  private fun offset(value: Any?): ZoneOffset = when (value) {
+    is ZonedDateTime -> value.offset
+    is OffsetDateTime -> value.offset
+    is LocalDateTime -> value.atZone(ZoneId.systemDefault()).toOffsetDateTime().offset
+    is LocalDate -> value.atTime(LocalTime.MIN).atZone(ZoneId.systemDefault()).toOffsetDateTime().offset
+    is LocalTime -> value.atDate(LocalDate.MIN).atZone(ZoneId.systemDefault()).toOffsetDateTime().offset
+    else -> ZoneOffset.UTC
+  }
+
+  override fun describeMismatch(item: Any?, description: Description?) {
+    if (localDateTime(item) != localDateTime(expected)) {
+      description?.appendText("Expected local date time of ")
+      description?.appendValue(localDateTime(expected))
+      description?.appendText(" but got")
+      description?.appendValue(localDateTime(item))
+      description?.appendText(".")
     }
+    if (offset(item) != offset(expected)) {
+      description?.appendText("Expected zone offset of ")
+      description?.appendValue(offset(expected))
+      description?.appendText(" but got ")
+      description?.appendValue(offset(item))
+      description?.appendText(".")
+    }
+    super.describeMismatch(item, description)
+  }
+
+  override fun matches(item: Any?): Boolean {
+    return localDateTime(expected) == localDateTime(item) &&
+      (offset(expected) == offset(item))
   }
 }
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/mocks/EmptySession.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/mocks/EmptySession.kt
index aa52533..703e1d8 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/mocks/EmptySession.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/mocks/EmptySession.kt
@@ -14,11 +14,13 @@ import de.justjanne.libquassel.protocol.models.BufferInfo
 import de.justjanne.libquassel.protocol.models.ids.IdentityId
 import de.justjanne.libquassel.protocol.models.ids.NetworkId
 import de.justjanne.libquassel.protocol.session.Session
+import de.justjanne.libquassel.protocol.syncables.HeartBeatHandler
 import de.justjanne.libquassel.protocol.syncables.ObjectRepository
 import de.justjanne.libquassel.protocol.syncables.common.AliasManager
 import de.justjanne.libquassel.protocol.syncables.common.BacklogManager
 import de.justjanne.libquassel.protocol.syncables.common.BufferSyncer
 import de.justjanne.libquassel.protocol.syncables.common.BufferViewManager
+import de.justjanne.libquassel.protocol.syncables.common.CertManager
 import de.justjanne.libquassel.protocol.syncables.common.CoreInfo
 import de.justjanne.libquassel.protocol.syncables.common.DccConfig
 import de.justjanne.libquassel.protocol.syncables.common.HighlightRuleManager
@@ -27,21 +29,35 @@ import de.justjanne.libquassel.protocol.syncables.common.IgnoreListManager
 import de.justjanne.libquassel.protocol.syncables.common.IrcListHelper
 import de.justjanne.libquassel.protocol.syncables.common.Network
 import de.justjanne.libquassel.protocol.syncables.common.NetworkConfig
+import de.justjanne.libquassel.protocol.syncables.common.RpcHandler
 import de.justjanne.libquassel.protocol.variant.QVariantMap
 
 open class EmptySession : Session {
+  override val heartBeatHandler = HeartBeatHandler()
+  override val rpcHandler = RpcHandler(this)
   final override val side = ProtocolSide.CLIENT
   final override val objectRepository = ObjectRepository()
   override val proxy = EmptySyncProxy()
 
-  override fun init(identities: List<QVariantMap>, bufferInfos: List<BufferInfo>, networkIds: List<NetworkId>) = Unit
+  override fun init(
+    identityInfo: List<QVariantMap>,
+    bufferInfos: List<BufferInfo>,
+    networkIds: List<NetworkId>
+  ) = Unit
 
   override fun network(id: NetworkId): Network? = null
   override fun addNetwork(id: NetworkId) = Unit
   override fun removeNetwork(id: NetworkId) = Unit
+  override fun networks() = emptySet<Network>()
+
   override fun identity(id: IdentityId): Identity? = null
   override fun addIdentity(properties: QVariantMap) = Unit
   override fun removeIdentity(id: IdentityId) = Unit
+  override fun identities() = emptySet<Identity>()
+
+  override fun certManager(id: IdentityId) = null
+  override fun certManagers() = emptySet<CertManager>()
+
   override fun rename(className: String, oldName: String, newName: String) = Unit
 
   override val aliasManager = AliasManager(this)
-- 
GitLab