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